subroutine ESMF_ReconcileSerializeAll(state, itemList, itemCount, &
attreconflag, siwrap, buffer, rc)
!
! !ARGUMENTS:
type(ESMF_State), intent(in) :: state
integer, intent(in) :: itemList(:)
integer, intent(in) :: itemCount
type(ESMF_AttReconcileFlag),intent(in) :: attreconflag
type(ESMF_StateItemWrap), intent(in) :: siwrap(:)
character, pointer, intent(out) :: buffer(:)
integer, intent(out) :: rc
!
! !DESCRIPTION:
!
! The arguments are:
! \begin{description}
! \item[state]
! The {\tt ESMF\_State} to collect information from.
! \item[itemList]
! List of indices into siwrap(:) for items that need to be serialized.
! \item[itemCount]
! Number of items in itemList. The incoming allocation might be larger.
! \item[attreconflag]
! Flag to indicate attribute reconciliation.
! \item[siwrap]
! List of local state items.
! \item[buffer]
! Buffer
! \item[rc]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!EOPI
integer :: localrc, i
integer :: memstat
type(ESMF_StateItem), pointer :: stateItem
type(ESMF_State) :: wrapper
integer :: itemType
integer :: itemSize
integer :: sizeBuffer, posBuffer
character, pointer :: fakeBuffer(:) ! when inquiring sizes
integer :: sizeFakeBuffer
type(ESMF_InquireFlag) :: inqflag
! Init to not implemented
localrc = ESMF_RC_NOT_IMPL
#ifdef RECONCILE_LOG_on
call ESMF_LogWrite("ESMF_ReconcileSerializeAll()", &
ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
#endif
!!!!! Calculate buffer size !!!!!
! Start with number of items
sizeBuffer=ESMF_SIZEOF_DEFINT
! Allocate a fake buffer for passing in when asking for size
allocate(fakeBuffer(0:ESMF_SIZEOF_DEFINT-1))
! Fake buffer size
sizeFakeBuffer=size(fakeBuffer)
! Set flag to only check size
inqflag = ESMF_INQUIREONLY
! Loop over items in itemList and determine buffer size needed
do i=1, itemCount
! Get one State Item
stateItem => siwrap(itemList(i))%si
! Get item type
itemType = stateitem%otype%ot
! Init itemSize to 0, so when we ask for the offset,
! we are also getting the size
itemSize=0
! Get size of item to serialize
select case (itemType)
case (ESMF_STATEITEM_FIELDBUNDLE%ot)
call ESMF_FieldBundleSerialize(stateItem%datap%fbp, &
fakeBuffer, sizeFakeBuffer, itemSize, &
attreconflag=attreconflag, inquireflag=inqflag, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
#ifdef RECONCILE_LOG_on
block
character(ESMF_MAXSTR) :: itemName
character(160) :: msgStr
call ESMF_FieldBundleGet(stateItem%datap%fbp, name=itemName, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
write(msgStr,*) "Serialize FieldBundle '"//trim(itemName)//"' "//&
" size=", itemSize
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
case (ESMF_STATEITEM_FIELD%ot)
call ESMF_FieldSerialize(stateItem%datap%fp, &
fakeBuffer, sizeFakeBuffer, itemSize, &
attreconflag=attreconflag, inquireflag=inqflag, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
#ifdef RECONCILE_LOG_on
block
character(ESMF_MAXSTR) :: itemName
character(160) :: msgStr
call ESMF_FieldGet(stateItem%datap%fp, name=itemName, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
write(msgStr,*) "Serialize Field '"//trim(itemName)//"' "//&
" size=", itemSize
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
case (ESMF_STATEITEM_ARRAY%ot)
call c_ESMC_ArraySerialize(stateitem%datap%ap, &
fakeBuffer, sizeFakeBuffer, itemSize, &
attreconflag, inqflag, &
localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
#ifdef RECONCILE_LOG_on
block
character(ESMF_MAXSTR) :: itemName
character(160) :: msgStr
call ESMF_ArrayGet(stateItem%datap%ap, name=itemName, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
write(msgStr,*) "Serialize Array '"//trim(itemName)//"' "//&
" size=", itemSize
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
case (ESMF_STATEITEM_ARRAYBUNDLE%ot)
call c_ESMC_ArrayBundleSerialize(stateitem%datap%abp, &
fakeBuffer, sizeFakeBuffer, itemSize, &
attreconflag, inqflag, &
localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
#ifdef RECONCILE_LOG_on
block
character(ESMF_MAXSTR) :: itemName
character(160) :: msgStr
call ESMF_ArrayBundleGet(stateItem%datap%abp, name=itemName, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
write(msgStr,*) "Serialize ArrayBundle '"//trim(itemName)//"' "//&
" size=", itemSize
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
case (ESMF_STATEITEM_STATE%ot)
wrapper%statep => stateitem%datap%spp
ESMF_INIT_SET_CREATED(wrapper)
call ESMF_StateSerialize(wrapper, &
fakeBuffer, sizeFakeBuffer, itemSize, &
attreconflag=attreconflag, inquireflag=inqflag, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
#ifdef RECONCILE_LOG_on
block
character(ESMF_MAXSTR) :: itemName
character(160) :: msgStr
call ESMF_StateGet(wrapper, name=itemName, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
write(msgStr,*) "Serialize State '"//trim(itemName)//"' "//&
" size=", itemSize
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
case (ESMF_STATEITEM_ROUTEHANDLE%ot)
! Do nothing for RouteHandles. There is no need to reconcile them.
case default
call ESMF_LogSetError(ESMF_RC_INTNRL_INCONS, &
msg="Unrecognized item type.", &
ESMF_CONTEXT, &
rcToReturn=rc)
return
end select
! Add item type's size
sizeBuffer = sizeBuffer + ESMF_SIZEOF_DEFINT
! Update buffer size by itemSize
sizeBuffer = sizeBuffer + itemSize
enddo
! Size of the State's Base itself
call ESMF_BaseSerialize(state%statep%base, fakeBuffer, itemSize, &
attreconflag=attreconflag, inquireflag=inqflag, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
#ifdef RECONCILE_LOG_on
block
character(160) :: msgStr
write(msgStr,*) "Serialize top State Base itself, size=", itemSize
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
! Update buffer size by itemSize
sizeBuffer = sizeBuffer + itemSize
! Get rid of fakeBuffer
deallocate(fakeBuffer)
!!!!! Allocate buffer to serialize into !!!!!
allocate(buffer(0:sizeBuffer-1), stat=memstat)
if (ESMF_LogFoundAllocError(memstat, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
!!!!! Serialize information into buffer !!!!!
! Start position of buffer
posBuffer = 0
! Put item count in buffer
buffer(posBuffer:posBuffer+ESMF_SIZEOF_DEFINT-1) = transfer ( &
source=itemCount, &
mold=buffer(0:ESMF_SIZEOF_DEFINT-1))
posBuffer = posbuffer + ESMF_SIZEOF_DEFINT
! Set flag to actually serialize
inqflag = ESMF_NOINQUIRE
! Loop over items in itemList and add to buffer
do i=1, itemCount
! Get one State Item
stateItem => siwrap(itemList(i))%si
! Get item type
itemType = stateitem%otype%ot
! Add item type to buffer
buffer(posBuffer:posBuffer+ESMF_SIZEOF_DEFINT-1) = transfer (&
source=itemType, &
mold =buffer(0:ESMF_SIZEOF_DEFINT-1))
posBuffer = posbuffer + ESMF_SIZEOF_DEFINT
! Add serialized items
select case (itemType)
case (ESMF_STATEITEM_FIELDBUNDLE%ot)
call ESMF_FieldBundleSerialize(stateItem%datap%fbp, &
buffer, sizeBuffer, posBuffer, &
attreconflag=attreconflag, inquireflag=inqflag, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
case (ESMF_STATEITEM_FIELD%ot)
call ESMF_FieldSerialize(stateItem%datap%fp, &
buffer, sizeBuffer, posBuffer, &
attreconflag=attreconflag, inquireflag=inqflag, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
case (ESMF_STATEITEM_ARRAY%ot)
call c_ESMC_ArraySerialize(stateitem%datap%ap, &
buffer, sizeBuffer, posBuffer, &
attreconflag, inqflag, &
localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
case (ESMF_STATEITEM_ARRAYBUNDLE%ot)
call c_ESMC_ArrayBundleSerialize(stateitem%datap%abp, &
buffer, sizeBuffer, posBuffer, &
attreconflag, inqflag, &
localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
case (ESMF_STATEITEM_STATE%ot)
wrapper%statep => stateitem%datap%spp
ESMF_INIT_SET_CREATED(wrapper)
call ESMF_StateSerialize(wrapper, &
buffer, sizeBuffer, posBuffer, &
attreconflag=attreconflag, inquireflag=inqflag, &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
case (ESMF_STATEITEM_ROUTEHANDLE%ot)
! Do nothing for RouteHandles. There is no need to reconcile them.
case default
call ESMF_LogSetError(ESMF_RC_INTNRL_INCONS, &
msg="Unrecognized item type.", &
ESMF_CONTEXT, &
rcToReturn=rc)
return
end select
enddo
! Serialize of the State's Base itself
call ESMF_BaseSerialize(state%statep%base, buffer, posBuffer, &
attreconflag=attreconflag, inquireflag=inqflag, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
! Return success
rc = ESMF_SUCCESS
end subroutine ESMF_ReconcileSerializeAll