ic_run Subroutine

private recursive subroutine ic_run(comp, importState, exportState, clock, rc)

Arguments

Type IntentOptional Attributes Name
type(ESMF_GridComp) :: comp
type(ESMF_State) :: importState
type(ESMF_State) :: exportState
type(ESMF_Clock) :: clock
integer, intent(out) :: rc

Calls

proc~~ic_run~2~~CallsGraph proc~ic_run~2 ic_run interface~esmf_tracephaseenter ESMF_TracePhaseEnter proc~ic_run~2->interface~esmf_tracephaseenter interface~esmf_tracephaseepilogueexit ESMF_TracePhaseEpilogueExit proc~ic_run~2->interface~esmf_tracephaseepilogueexit interface~esmf_tracephaseexit ESMF_TracePhaseExit proc~ic_run~2->interface~esmf_tracephaseexit interface~esmf_tracephaseprologueenter ESMF_TracePhasePrologueEnter proc~ic_run~2->interface~esmf_tracephaseprologueenter proc~checkcomponentstatistics checkComponentStatistics proc~ic_run~2->proc~checkcomponentstatistics proc~checkinternalclock checkInternalClock proc~ic_run~2->proc~checkinternalclock proc~checkstate checkState proc~ic_run~2->proc~checkstate proc~clockusageincoming clockUsageIncoming proc~ic_run~2->proc~clockusageincoming proc~clockusageoutgoing clockUsageOutgoing proc~ic_run~2->proc~clockusageoutgoing proc~compliance_logwrite Compliance_LogWrite proc~ic_run~2->proc~compliance_logwrite proc~esmf_clockiscreated ESMF_ClockIsCreated proc~ic_run~2->proc~esmf_clockiscreated proc~esmf_gridcompget ESMF_GridCompGet proc~ic_run~2->proc~esmf_gridcompget proc~esmf_gridcomprunact ESMF_GridCompRunAct proc~ic_run~2->proc~esmf_gridcomprunact proc~esmf_logfounderror ESMF_LogFoundError proc~ic_run~2->proc~esmf_logfounderror proc~esmf_traceclock ESMF_TraceClock proc~ic_run~2->proc~esmf_traceclock proc~esmf_tracememinfo ESMF_TraceMemInfo proc~ic_run~2->proc~esmf_tracememinfo proc~json_logctrlflow JSON_LogCtrlFlow proc~ic_run~2->proc~json_logctrlflow proc~prefixstring~2 prefixString proc~ic_run~2->proc~prefixstring~2

Source Code

  recursive subroutine ic_run(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
    character(ESMF_MAXSTR)  :: output
    type(ESMF_Clock)        :: clockCopy
    integer                 :: phase
    character(1024)         :: jsonString
    character(2)            :: phaseString
    character(ESMF_MAXSTR)  :: compName
    type(ESMF_Clock)        :: clockInternal
    logical                 :: clockIsPresent
    
    ! Initialize user return code
    rc = ESMF_SUCCESS

    call prefixString(comp, prefix=prefix, rc=rc)
    if (ESMF_LogFoundError(rc, &
      line=__LINE__, &
      file=FILENAME)) &
      return  ! bail out
    
    call ESMF_GridCompGet(comp, currentPhase=phase, &
        clockIsPresent=clockIsPresent, name=compName, rc=rc)
    if (ESMF_LogFoundError(rc, &
      line=__LINE__, &
      file=FILENAME)) &
      return  ! bail out

    !---------------------------------------------------------------------------
    ! Start Compliance Checking: RunPrologue
    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
    !if (outputTrace) then
    !   call ESMF_TracePhasePrologueEnter(comp, rc=rc)
    !   if (ESMF_LogFoundError(rc, &
    !        line=__LINE__, file=FILENAME)) return  ! bail out
    !endif

    write(output,*) ">START RunPrologue for phase=", phase
    call Compliance_LogWrite(trim(prefix)//trim(output), &
      ESMF_LOGMSG_INFO, rc=rc)
    if (ESMF_LogFoundError(rc, &
      line=__LINE__, &
      file=FILENAME)) &
      return  ! bail out
    
    if (outputText) then
       
       ! compliance check importState
       call checkState(prefix, referenceName="importState", state=importState, &
            rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, &
            file=FILENAME)) &
            return  ! bail out
       
       ! compliance check exportState
       call checkState(prefix, referenceName="exportState", state=exportState, &
            rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, &
            file=FILENAME)) &
            return  ! bail out
       
       ! compliance check clock usage
       call clockUsageIncoming(prefix, clock=clock, clockCopy=clockCopy, rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, &
            file=FILENAME)) &
            return  ! bail out
       
       ! compliance check internal Clock
       call checkInternalClock(prefix, comp=comp, clock=clock, &
            mustMatchCurr=.true., mustReachStop=.false., rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, &
            file=FILENAME)) &
            return  ! bail out
       
       ! check Component statistics
       call checkComponentStatistics(prefix, comp=comp, rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, &
            file=FILENAME)) &
            return  ! bail out
       
    end if

    write(output,*) ">STOP RunPrologue for phase=", phase
    call Compliance_LogWrite(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
    if (outputTrace) then
       call ESMF_TracePhasePrologueEnter(comp, rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, file=FILENAME)) return               
       call ESMF_TraceMemInfo(rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, file=FILENAME)) return                              
       if (ESMF_ClockIsCreated(clock)) then
          call ESMF_TraceClock(clock, rc=rc)
          if (ESMF_LogFoundError(rc, &
               line=__LINE__, file=FILENAME)) return                              
       endif
       !call ESMF_TraceComponentInfo(comp, rc=rc)
       !if (ESMF_LogFoundError(rc, &
       !     line=__LINE__, file=FILENAME)) return                              
       call ESMF_TracePhaseEnter(comp, rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, file=FILENAME)) return                              
    endif    
    endif
 
    ! Stop Compliance Checking: RunPrologue
    !---------------------------------------------------------------------------
    ccfDepth = ccfDepth + 1

    ! Call the actual Run routine
    call ESMF_GridCompRunAct(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: RunEpilogue
    if (ccfDepth <= maxDepth .or. maxDepth < 0) then

        if (outputTrace) then
           call ESMF_TracePhaseExit(comp, rc=rc)
           if (ESMF_LogFoundError(rc, &
                line=__LINE__, file=FILENAME)) return                              
           if (ESMF_ClockIsCreated(clock)) then
              call ESMF_TraceClock(clock, rc=rc)
              if (ESMF_LogFoundError(rc, &
                   line=__LINE__, file=FILENAME)) return                              
           endif
           call ESMF_TraceMemInfo(rc=rc)
           if (ESMF_LogFoundError(rc, &
                line=__LINE__, file=FILENAME)) return
           call ESMF_TracePhaseEpilogueExit(comp, rc=rc)
           if (ESMF_LogFoundError(rc, &
                line=__LINE__, file=FILENAME)) return                              
        endif
           
    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
    endif


    call prefixString(comp, prefix=prefix, forward=.false., rc=rc)
    if (ESMF_LogFoundError(rc, &
      line=__LINE__, &
      file=FILENAME)) &
      return  ! bail out
    
    write(output,*) ">START RunEpilogue for phase=", phase
    call Compliance_LogWrite(trim(prefix)//trim(output), &
      ESMF_LOGMSG_INFO, rc=rc)
    if (ESMF_LogFoundError(rc, &
      line=__LINE__, &
      file=FILENAME)) &
      return  ! bail out
    
    if (outputText) then
       
       ! check Component statistics
       call checkComponentStatistics(prefix, comp=comp, rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, &
            file=FILENAME)) &
            return  ! bail out
       
       ! compliance check importState
       call checkState(prefix, referenceName="importState", state=importState, &
            rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, &
            file=FILENAME)) &
            return  ! bail out
       
       ! compliance check exportState
       call checkState(prefix, referenceName="exportState", state=exportState, &
            rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, &
            file=FILENAME)) &
            return  ! bail out
       
       ! compliance check clock usage
       call clockUsageOutgoing(prefix, clock=clock, clockCopy=clockCopy, rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, &
            file=FILENAME)) &
            return  ! bail out
       
       ! compliance check internal Clock
       call checkInternalClock(prefix, comp=comp, clock=clock, &
            mustMatchCurr=.false., mustReachStop=.true., rc=rc)
       if (ESMF_LogFoundError(rc, &
            line=__LINE__, &
            file=FILENAME)) &
            return  ! bail out
       
    end if
    
    write(output,*) ">STOP RunEpilogue for phase=", phase
    call Compliance_LogWrite(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
    !if (outputTrace) then
    !   call ESMF_TracePhaseEpilogueExit(comp, rc=rc)
    !   if (ESMF_LogFoundError(rc, &
    !        line=__LINE__, file=FILENAME)) return  ! bail out
    !endif

    endif
    ! Stop Compliance Checking: RunEpilogue
    !---------------------------------------------------------------------------

    ! if not bailed for other reasons then pass back the actual userrc
    rc = userrc

  end subroutine ic_run