Fortran: (incorrect) dynamic type mapping

I copy a variable of a particular class to another from the same class. The compiler is happy to compile this, but I am concerned that dynamic types may differ at run time. Do I need to check that two objects have the same dynamic type to prevent the rectangle from being squared, or can I trust the compiler? What happens if a rectangle is copied to a square randomly?

I am trying to do the following:

type :: simVars
        class(stateVars), dimension(:), allocatable :: svars
        integer                                     :: count_
    contains
        procedure :: init    => init_simVars
        procedure :: destroy => dest_simVars
        procedure :: add     => add_to_simVars              ! adds an observation to the time series
end type simVars

subroutine init_simVars(this,n)
!--> VERSION 1
    class(simVars), intent(inout) :: this
    integer,        intent(in)    :: n

    allocate( this%svars(n) )

    this%count_ = 0
end subroutine init_simVars

subroutine init_simVars(this,n,sVarsIni)
!--> VERSION 2
    class(simVars), intent(inout) :: this
    integer,        intent(in)    :: n
    class(stateVars), intent(in)  :: sVarsIni

    allocate( this%svars(n),source=sVarsIni )

    this%count_ = 0
end subroutine init_simVars

subroutine add_to_simvars(this,svars)
    class(simVars),   intent(inout) :: this
    class(stateVars), intent(in)    :: svars

    this%count_ = this%count_+1

    this%svars(this%count_) = svars
end subroutine add_to_simvars

subroutine doSimulation(simHist,sVarsIni)
    class(simVars),   intent(out) :: simHist
    class(stateVars), intent(in)  :: sVarsIni
         !--> dynamic type 'stateVars1'

    class(stateVars), allocatable :: sVars   ! will be source allocated from 'iniState'

    ! initialize the state of the economy
    allocate( sVars, source=sVarsIni )    ! "copies" 'sVarsIni' in 'sVars'

    ! initialize 'simHist'
    !--> VERSION 1:
    call simHist%init(nYears)
    !--> VERSION 2:
    call simHist%init(nYears,iniState)

    ! save today variables
    call simHist%add(sVars)
    ...
end subroutine doSimulation

(ifort 14) , , VERSION 1 . init_simVars this%svars stateVars, add_to_simvars sVars stateVars1, this%svars ( stateVars). , , sVars add_to_simvars. , ?

2 , , , ASSERT, this%svars sVars (ASSERT(SAME_TYPE_AS(this%sVars, sVars) ))? ?

, , allocate( this%svars(n),source=sVarsIni ). this%svars n sVarsIni. sVarsIni . , ?

+4
1

allocate( this%svars(n) )

.

allocate( this%svars(n),source=sVarsIni )

this%svars - class(svars) allocatable array, svarsIni - class(stateVars).

.

, svars, , stateVars.

1, add_to_simvars, .

, . , - .

+2

All Articles