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 . , ?