recursive subroutine ic_init(comp, importState, exportState, clock, rc)
type(ESMF_GridComp) :: comp
type(ESMF_State) :: importState, exportState
type(ESMF_Clock) :: clock
integer, intent(out) :: rc
! Local variables
integer :: userrc
character(ESMF_MAXSTR) :: prefix, pString
character(1024) :: output
type(ESMF_Clock) :: clockCopy
integer :: phase
character(NUOPC_PhaseMapStringLength) :: phaseLabel
character(ESMF_MAXSTR) :: compName
character(1024) :: jsonString
logical :: clockIsCreated
logical :: stateIsCreated
!type(ESMF_Clock) :: clockInternal
!logical :: clockIsPresent
! Initialize user return code
rc = ESMF_SUCCESS
phaseLabel = ""
call prefixString(comp, prefix=prefix, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
call ESMF_GridCompGet(comp, currentPhase=phase, name=compName, &
rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
! format phase
write(pString,*) phase
call NUOPC_CompSearchPhaseMapByIndex(comp, ESMF_METHOD_INITIALIZE, &
phaseIndex=phase, phaseLabel=phaseLabel, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
if ((phase/=0).and.(trim(phaseLabel)=="none")) then
call NUOPC_CompSearchPhaseMapByIndex(comp, ESMF_METHOD_INITIALIZE, &
phaseIndex=phase, phaseLabel=phaseLabel, &
attributeToCheck="InternalInitializePhaseMap", rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
endif
!---------------------------------------------------------------------------
! Start Compliance Checking: InitializePrologue
if (ccfDepth <= maxDepth .or. maxDepth < 0) then
if (outputJSON) then
call JSON_LogCtrlFlow("start_prologue", comp, rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, file=FILENAME)) return ! bail out
endif
write(output,*) ">START InitializePrologue for phase:", &
trim(adjustl(pString)), ": ", trim(phaseLabel)
call NUOPC_ComplianceLogWrite(trim(prefix)//trim(output), &
ESMF_LOGMSG_INFO, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
! When do we expect the importState/exportStates to be valid?
! compliance check importState
call NUOPC_CheckState(prefix, referenceName="importState", state=importState, &
rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
! compliance check exportState
call NUOPC_CheckState(prefix, referenceName="exportState", state=exportState, &
rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
! When do we expect the clock to be valid?
! compliance check clock usage
!call NUOPC_CheckClockUsageIncoming(prefix, clock=clock, clockCopy=clockCopy, rc=rc)
!if (ESMF_LogFoundError(rc, &
! line=__LINE__, &
! file=FILENAME)) &
! return ! bail out
call NUOPC_CheckComponentAttribute(prefix, comp=comp, &
attributeName="InternalInitializePhaseMap", &
convention="NUOPC", purpose="Instance", &
warnIfMissing=.false., rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
! check Component statistics
call NUOPC_CheckComponentStatistics(prefix, comp=comp, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
! check NUOPC-specific metadata attributes
call NUOPC_CheckComponentMetadata(prefix, comp=comp, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
! phase specific checks
call dispatchPhaseChecks(prefix, comp, ESMF_METHOD_INITIALIZE, &
phase, importState, exportState, clock, .true., rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
write(output,*) ">STOP InitializePrologue for phase:", &
trim(adjustl(pString)), ": ", trim(phaseLabel)
call NUOPC_ComplianceLogWrite(trim(prefix)//trim(output), &
ESMF_LOGMSG_INFO, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
if (outputJSON) then
call JSON_LogCtrlFlow("stop_prologue", comp, rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, file=FILENAME)) return ! bail out
call JSON_LogCtrlFlow("start_phase", comp, rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, file=FILENAME)) return ! bail out
endif
endif
! Stop Compliance Checking: InitializePrologue
!---------------------------------------------------------------------------
ccfDepth = ccfDepth + 1
! Call the actual Initialize routine
call ESMF_GridCompInitializeAct(comp, importState, exportState, clock, &
phase=phase, userRc=userrc, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
ccfDepth = ccfDepth - 1
!---------------------------------------------------------------------------
! Start Compliance Checking: InitializeEpilogue
if (ccfDepth <= maxDepth .or. maxDepth < 0) then
if (outputJSON) then
call JSON_LogCtrlFlow("stop_phase", comp, rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, file=FILENAME)) return ! bail out
call JSON_LogCtrlFlow("start_epilogue", comp, rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, file=FILENAME)) return ! bail out
! write out run sequence in JSON
!call JSON_DriverRunSequence(comp, jsonString, rc=rc)
!if (ESMF_LogFoundError(rc, &
! line=__LINE__, file=FILENAME)) return ! bail out
!if (len(jsonString) > 0) then
! call JSON_LogWrite(jsonString, rc=rc)
! if (ESMF_LogFoundError(rc, &
! line=__LINE__, file=FILENAME)) return ! bail out
!endif
endif
call prefixString(comp, prefix=prefix, forward=.false., rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
write(output,*) ">START InitializeEpilogue for phase:", &
trim(adjustl(pString)), ": ", trim(phaseLabel)
call NUOPC_ComplianceLogWrite(trim(prefix)//trim(output), &
ESMF_LOGMSG_INFO, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
call NUOPC_CheckComponentAttribute(prefix, comp=comp, &
attributeName="InternalInitializePhaseMap", &
convention="NUOPC", purpose="Instance", &
warnIfMissing=.false., rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
! check Component statistics
call NUOPC_CheckComponentStatistics(prefix, comp=comp, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
call NUOPC_CheckComponentMetadata(prefix, comp=comp, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
! drivers are allowed to have invalid import/export states, if they are not
! participating in the exchange of fields
stateIsCreated = ESMF_StateIsCreated(importState, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
if (stateIsCreated) then
! compliance check importState
call NUOPC_CheckState(prefix, referenceName="importState", state=importState, &
rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
endif
stateIsCreated = ESMF_StateIsCreated(exportState, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
if (stateIsCreated) then
! compliance check exportState
call NUOPC_CheckState(prefix, referenceName="exportState", state=exportState, &
rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
endif
! compliance check clock usage
!call NUOPC_CheckClockUsageOutgoing(prefix, clock=clock, clockCopy=clockCopy, rc=rc)
!if (ESMF_LogFoundError(rc, &
! line=__LINE__, &
! file=FILENAME)) &
! return ! bail out
! compliance check internal Clock
!call NUOPC_CheckInternalClock(prefix, comp=comp, clock=clock, &
! mustMatchCurr=.false., mustReachStop=.false., rc=rc)
!if (ESMF_LogFoundError(rc, &
! line=__LINE__, &
! file=FILENAME)) &
! return ! bail out
call dispatchPhaseChecks(prefix, comp, ESMF_METHOD_INITIALIZE, &
phase, importState, exportState, clock, .false., rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
write(output,*) ">STOP InitializeEpilogue for phase:", &
trim(adjustl(pString)), ": ", trim(phaseLabel)
call NUOPC_ComplianceLogWrite(trim(prefix)//trim(output), &
ESMF_LOGMSG_INFO, rc=rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, &
file=FILENAME)) &
return ! bail out
if (outputJSON) then
call JSON_LogCtrlFlow("stop_epilogue", comp, rc)
if (ESMF_LogFoundError(rc, &
line=__LINE__, file=FILENAME)) return ! bail out
endif
endif
! Stop Compliance Checking: InitializeEpilogue
!---------------------------------------------------------------------------
! if not bailed for other reasons then pass back the actual userrc
rc = userrc
end subroutine ic_init