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