ESMF_ReconcileMultiCompCase Subroutine

private subroutine ESMF_ReconcileMultiCompCase(state, vm, vmIdMap, attreconflag, siwrap, vmintids_send, rc)

Arguments

Type IntentOptional Attributes Name
type(ESMF_State), intent(inout) :: state
type(ESMF_VM), intent(in) :: vm
type(ESMF_VMId), intent(in), pointer :: vmIdMap(:)
type(ESMF_AttReconcileFlag), intent(in) :: attreconflag
type(ESMF_StateItemWrap), intent(in), pointer :: siwrap(:)
integer, intent(in), pointer :: vmintids_send(:)
integer, intent(out) :: rc

Calls

proc~~esmf_reconcilemulticompcase~~CallsGraph proc~esmf_reconcilemulticompcase ESMF_ReconcileMultiCompCase proc~esmf_logfounderror ESMF_LogFoundError proc~esmf_reconcilemulticompcase->proc~esmf_logfounderror proc~esmf_reconcilesinglecompcase ESMF_ReconcileSingleCompCase proc~esmf_reconcilemulticompcase->proc~esmf_reconcilesinglecompcase proc~esmf_traceregionenter ESMF_TraceRegionEnter proc~esmf_reconcilemulticompcase->proc~esmf_traceregionenter proc~esmf_traceregionexit ESMF_TraceRegionExit proc~esmf_reconcilemulticompcase->proc~esmf_traceregionexit proc~esmf_vmgetvmid ESMF_VMGetVMId proc~esmf_reconcilemulticompcase->proc~esmf_vmgetvmid proc~esmf_vmidcompare ESMF_VMIdCompare proc~esmf_reconcilemulticompcase->proc~esmf_vmidcompare esmf_breakpoint esmf_breakpoint proc~esmf_logfounderror->esmf_breakpoint proc~esmf_logrc2msg ESMF_LogRc2Msg proc~esmf_logfounderror->proc~esmf_logrc2msg proc~esmf_logwrite ESMF_LogWrite proc~esmf_logfounderror->proc~esmf_logwrite proc~esmf_reconcilesinglecompcase->proc~esmf_logfounderror interface~esmf_vmbroadcast ESMF_VMBroadcast proc~esmf_reconcilesinglecompcase->interface~esmf_vmbroadcast interface~esmf_vmget ESMF_VMGet proc~esmf_reconcilesinglecompcase->interface~esmf_vmget proc~esmf_logseterror ESMF_LogSetError proc~esmf_reconcilesinglecompcase->proc~esmf_logseterror proc~esmf_reconciledeserializeall ESMF_ReconcileDeserializeAll proc~esmf_reconcilesinglecompcase->proc~esmf_reconciledeserializeall proc~esmf_reconcileserializeall ESMF_ReconcileSerializeAll proc~esmf_reconcilesinglecompcase->proc~esmf_reconcileserializeall proc~esmf_vmidget ESMF_VMIdGet proc~esmf_reconcilesinglecompcase->proc~esmf_vmidget proc~esmf_traceregionenter->proc~esmf_logfounderror c_esmftrace_region_enter c_esmftrace_region_enter proc~esmf_traceregionenter->c_esmftrace_region_enter proc~esmf_traceregionexit->proc~esmf_logfounderror c_esmftrace_region_exit c_esmftrace_region_exit proc~esmf_traceregionexit->c_esmftrace_region_exit proc~esmf_vmgetvmid->proc~esmf_logfounderror c_esmc_vmgetvmid c_esmc_vmgetvmid proc~esmf_vmgetvmid->c_esmc_vmgetvmid proc~esmf_imerr ESMF_IMErr proc~esmf_vmgetvmid->proc~esmf_imerr proc~esmf_vmgetinit ESMF_VMGetInit proc~esmf_vmgetvmid->proc~esmf_vmgetinit proc~esmf_vmidcompare->proc~esmf_logfounderror c_esmc_vmidcompare c_esmc_vmidcompare proc~esmf_vmidcompare->c_esmc_vmidcompare

Called by

proc~~esmf_reconcilemulticompcase~~CalledByGraph proc~esmf_reconcilemulticompcase ESMF_ReconcileMultiCompCase proc~esmf_statereconcile_driver ESMF_StateReconcile_driver proc~esmf_statereconcile_driver->proc~esmf_reconcilemulticompcase proc~esmf_statereconcile ESMF_StateReconcile proc~esmf_statereconcile->proc~esmf_statereconcile_driver

Source Code

  subroutine ESMF_ReconcileMultiCompCase(state, vm, vmIdMap, attreconflag, &
    siwrap, vmintids_send, rc)
!
! !ARGUMENTS:
    type(ESMF_State),                     intent(inout) :: state
    type(ESMF_VM),                        intent(in)    :: vm
    type(ESMF_VMId),             pointer, intent(in)    :: vmIdMap(:)
    type(ESMF_AttReconcileFlag),          intent(in)    :: attreconflag
    type(ESMF_StateItemWrap),    pointer, intent(in)    :: siwrap(:)
    integer,                     pointer, intent(in)    :: vmintids_send(:)
    integer,                              intent(out)   :: rc
!
! !DESCRIPTION:
!
!   Handle the multi component reconciliation case. This is the general case
!   supported by ESMF, where multiple components interact with the same State.
!
!   The arguments are:
!   \begin{description}
!   \item[state]
!     The {\tt ESMF\_State} to reconcile.
!   \item[vm]
!     The {\tt ESMF\_VM} object across which to reconcile {\tt state}.
!   \item[vmIdMap]
!     List of {\tt ESMF\_VMId} objects present in {\tt state}.
!   \item[attreconflag]
!     Flag indicating whether attributes need to be reconciled.
!   \item[siwrap]
!     List of local state items.
!   \item[vmintids_send]
!     The integer VMId for each local state item.
!   \item[rc]
!     Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
!   \end{description}
!EOPI

    integer                   :: localrc, i
    logical                   :: isFlag
    type(ESMF_VMId)           :: vmId
    type(ESMF_VMId),  pointer :: vmIdSingleComp

    logical, parameter    :: profile = .false.

    rc = ESMF_SUCCESS

#ifdef RECONCILE_LOG_on
    block
      character(ESMF_MAXSTR)  :: stateName
      call ESMF_StateGet(state, name=stateName, rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
        rcToReturn=rc)) return
      call ESMF_LogWrite("ESMF_ReconcileMultiCompCase() for State: "//trim(stateName), &
        ESMF_LOGMSG_DEBUG, rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
        rcToReturn=rc)) return
    end block
#endif

    call ESMF_VMGetVMId(vm, vmId=vmId, rc=localrc)  ! vmId of current VM context
    if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
      rcToReturn=rc)) return

#ifdef RECONCILE_LOG_on
    call ESMF_VMIdLog(vmId, prefix="ESMF_ReconcileMultiCompCase() context: ", &
      logMsgFlag=ESMF_LOGMSG_DEBUG, rc=localrc)  ! vmId of current VM context
    if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
      rcToReturn=rc)) return
#endif

    do i=1, size(vmidMap)
      ! see if vmIdMap(i) vmKey is a superset of the current context vmKey
      isFlag = ESMF_VMIdCompare(vmIdMap(i), vmId, keyOnly=.true., &
        keySuper=.true., rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
        rcToReturn=rc)) return
#ifdef RECONCILE_LOG_on
      block
        character(160)  :: msgStr
        write(msgStr,*) "ESMF_ReconcileMultiCompCase vmIdMap(", i, "): "
        call ESMF_VMIdLog(vmIdMap(i), prefix=trim(msgStr), &
          logMsgFlag=ESMF_LOGMSG_DEBUG, rc=localrc)
        if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
          rcToReturn=rc)) return
        write(msgStr,*) "ESMF_ReconcileMultiCompCase vmIdMap(", i, "): "// &
          " is superset: ", isFlag
        call ESMF_LogWrite(trim(msgStr), ESMF_LOGMSG_DEBUG, rc=localrc)
        if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
          rcToReturn=rc)) return
      end block
#endif
      if (.not.isFlag) then
        ! objects with vmIdMap(i) are not defined on all PETs of the
        ! reconciling context -> need to reconcile
        vmIdSingleComp => vmIdMap(i)
        if (profile) then
          call ESMF_TraceRegionEnter("ESMF_ReconcileSingleCompCase", rc=localrc)
          if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
            rcToReturn=rc)) return
        endif
        call ESMF_ReconcileSingleCompCase(state, vm=vm, vmId=vmIdSingleComp, &
          vmIntId=i, attreconflag=attreconflag, siwrap=siwrap, &
          vmintids_send=vmintids_send, rc=localrc)
        if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
          rcToReturn=rc)) return
        if (profile) then
          call ESMF_TraceRegionExit("ESMF_ReconcileSingleCompCase", rc=localrc)
          if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
            rcToReturn=rc)) return
        endif
      endif
    enddo

  end subroutine ESMF_ReconcileMultiCompCase