SetServices Subroutine

public subroutine SetServices(xdata, rc)

Arguments

Type IntentOptional Attributes Name
type(ESMF_GridComp) :: xdata
integer, intent(out) :: rc

Calls

proc~~setservices~8~~CallsGraph proc~setservices~8 SetServices esmf_hconfigcreateat esmf_hconfigcreateat proc~setservices~8->esmf_hconfigcreateat interface~esmf_gridcompsetinternalstate ESMF_GridCompSetInternalState proc~setservices~8->interface~esmf_gridcompsetinternalstate interface~nuopc_compderive NUOPC_CompDerive proc~setservices~8->interface~nuopc_compderive interface~nuopc_compget NUOPC_CompGet proc~setservices~8->interface~nuopc_compget interface~nuopc_compspecialize NUOPC_CompSpecialize proc~setservices~8->interface~nuopc_compspecialize proc~esmf_gridcompget ESMF_GridCompGet proc~setservices~8->proc~esmf_gridcompget proc~esmf_hconfigvalidatemapkeys ESMF_HConfigValidateMapKeys proc~setservices~8->proc~esmf_hconfigvalidatemapkeys proc~esmf_logfoundallocerror ESMF_LogFoundAllocError proc~setservices~8->proc~esmf_logfoundallocerror proc~esmf_logfounderror ESMF_LogFoundError proc~setservices~8->proc~esmf_logfounderror proc~esmf_logseterror ESMF_LogSetError proc~setservices~8->proc~esmf_logseterror proc~nuopc_cplcompderive NUOPC_CplCompDerive interface~nuopc_compderive->proc~nuopc_cplcompderive proc~nuopc_gridcompderive NUOPC_GridCompDerive interface~nuopc_compderive->proc~nuopc_gridcompderive proc~nuopc_cplcompget NUOPC_CplCompGet interface~nuopc_compget->proc~nuopc_cplcompget proc~nuopc_gridcompget NUOPC_GridCompGet interface~nuopc_compget->proc~nuopc_gridcompget proc~nuopc_cplcompspecialize NUOPC_CplCompSpecialize interface~nuopc_compspecialize->proc~nuopc_cplcompspecialize proc~nuopc_gridcompspecialize NUOPC_GridCompSpecialize interface~nuopc_compspecialize->proc~nuopc_gridcompspecialize proc~esmf_gridcompget->proc~esmf_logfounderror proc~esmf_compget ESMF_CompGet proc~esmf_gridcompget->proc~esmf_compget proc~esmf_compstatusget ESMF_CompStatusGet proc~esmf_gridcompget->proc~esmf_compstatusget proc~esmf_gridcompgetinit ESMF_GridCompGetInit proc~esmf_gridcompget->proc~esmf_gridcompgetinit proc~esmf_imerr ESMF_IMErr proc~esmf_gridcompget->proc~esmf_imerr proc~esmf_hconfigvalidatemapkeys->proc~esmf_logfounderror proc~esmf_hconfigvalidatemapkeys->proc~esmf_logseterror interface~esmf_hconfigismap ESMF_HConfigIsMap proc~esmf_hconfigvalidatemapkeys->interface~esmf_hconfigismap interface~esmf_hconfigiterbegin ESMF_HConfigIterBegin proc~esmf_hconfigvalidatemapkeys->interface~esmf_hconfigiterbegin interface~esmf_hconfigiterend ESMF_HConfigIterEnd proc~esmf_hconfigvalidatemapkeys->interface~esmf_hconfigiterend proc~esmf_hconfigasstringmapkey ESMF_HConfigAsStringMapKey proc~esmf_hconfigvalidatemapkeys->proc~esmf_hconfigasstringmapkey proc~esmf_hconfigiterloop ESMF_HConfigIterLoop proc~esmf_hconfigvalidatemapkeys->proc~esmf_hconfigiterloop esmf_breakpoint esmf_breakpoint proc~esmf_logfoundallocerror->esmf_breakpoint proc~esmf_logrc2msg ESMF_LogRc2Msg proc~esmf_logfoundallocerror->proc~esmf_logrc2msg proc~esmf_logwrite ESMF_LogWrite proc~esmf_logfoundallocerror->proc~esmf_logwrite proc~esmf_logfounderror->esmf_breakpoint proc~esmf_logfounderror->proc~esmf_logrc2msg proc~esmf_logfounderror->proc~esmf_logwrite proc~esmf_logseterror->esmf_breakpoint proc~esmf_logseterror->proc~esmf_logrc2msg proc~esmf_logseterror->proc~esmf_logwrite

Source Code

  subroutine SetServices(xdata, rc)
    ! arguments
    type(ESMF_GridComp)  :: xdata
    integer, intent(out) :: rc
    ! local variables
    integer                    :: stat
    type(xstate_wrap)          :: is
    type(xdata_state), pointer :: xstate
    character(len=64)          :: value
    type(ESMF_HConfig)         :: hconfig, hconfigNode
    character(80)              :: compLabel
    character(:), allocatable  :: badKey
    logical                    :: isFlag

    rc = ESMF_SUCCESS

    ! derive generic model phases
    call NUOPC_CompDerive(xdata, modelSS, rc=rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, file=__FILE__)) return

    ! allocate memory for this internal state and set it in the component
    allocate(is%ptr, stat=stat)
    if (ESMF_LogFoundAllocError(statusToCheck=stat, &
      msg='XDATA: Memory allocation failed.', &
      line=__LINE__, &
      file=__FILE__, &
      rcToReturn=rc)) return
    call ESMF_GridCompSetInternalState(xdata, is, rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, file=__FILE__)) return
    xstate => is%ptr
    if (.not. associated(xstate)) then
      call ESMF_LogSetError(ESMF_RC_PTR_NOTALLOC, &
        msg='XDATA: xstate has not been associated', &
        line=__LINE__, file=__FILE__, rcToReturn=rc)
      return
    endif

    ! query component for information
    call NUOPC_CompGet(xdata, name=xstate%cname, &
      verbosity=xstate%verbosity, diagnostic=xstate%diagnostic, rc=rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, file=__FILE__)) return

    ! specialize model
    call NUOPC_CompSpecialize(xdata, specLabel=label_Advertise, &
      specRoutine=Advertise, rc=rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, file=__FILE__)) return
    call NUOPC_CompSpecialize(xdata, specLabel=label_RealizeProvided, &
      specRoutine=Realize, rc=rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, file=__FILE__)) return
    call NUOPC_CompSpecialize(xdata, specLabel=label_DataInitialize, &
      specRoutine=DataInitialize, rc=rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, file=__FILE__)) return
    call NUOPC_CompSpecialize(xdata, specLabel=label_CheckImport, &
       specRoutine=CheckImport, rc=rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, file=__FILE__)) return
    call NUOPC_CompSpecialize(xdata, specLabel=label_Advance, &
      specRoutine=ModelAdvance, rc=rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, file=__FILE__)) return
    call NUOPC_CompSpecialize(xdata, specLabel=label_Finalize, &
      specRoutine=ModelFinalize, rc=rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, file=__FILE__)) return

    ! query component for vm and local pet
    call ESMF_GridCompGet(xdata, vm=xstate%vm, &
      localPet=xstate%myid, rc=rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, file=__FILE__)) return

    ! validate config
    call ESMF_GridCompGet(xdata, name=compLabel, configIsPresent=isFlag, rc=rc)
    if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
      line=__LINE__, file=__FILE__)) return  ! bail out
    if (isFlag) then
      ! Config present, assert it is in the ESMX YAML format
      call ESMF_GridCompGet(xdata, hconfig=hconfig, rc=rc)
      if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
        line=__LINE__,    file=__FILE__)) return  ! bail out
      hconfigNode = ESMF_HConfigCreateAt(hconfig, keyString=compLabel, rc=rc)
      if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
        line=__LINE__, file=__FILE__)) return  ! bail out
      ! component responsibility to validate ESMX handled options here, and
      ! potentially locally handled options
      isFlag = ESMF_HConfigValidateMapKeys(hconfigNode, &
        vocabulary=["model        ", &  ! ESMX_Driver handled option
                    "petList      ", &  ! ESMX_Driver handled option
                    "ompNumThreads", &  ! ESMX_Driver handled option
                    "stdout       ", &  ! ESMX_Driver handled option
                    "stderr       ", &  ! ESMX_Driver handled option
                    "attributes   ", &  ! ESMX_Driver handled option
                    "output       ", &  ! ESMX_Data handled option
                    "geom         ", &  ! ESMX_Data handled option
                    "importFields ", &  ! ESMX_Data handled option
                    "exportFields "  &  ! ESMX_Data handled option
                   ], badKey=badKey, rc=rc)
      if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, &
        line=__LINE__, file=__FILE__)) return  ! bail out
      if (.not.isFlag) then
        call ESMF_LogSetError(ESMF_RC_ARG_WRONG, &
          msg="An invalid key was found in config under "//trim(compLabel)// &
            " (maybe a typo?): "//badKey, &
          line=__LINE__, file=__FILE__, rcToReturn=rc)
        return
      endif
    endif

  endsubroutine SetServices