function ESMF_FieldDeserialize(buffer, offset, &
attreconflag, rc)
!
! !RETURN VALUE:
type(ESMF_Field) :: ESMF_FieldDeserialize
!
! !ARGUMENTS:
character, pointer, dimension(:) :: buffer
integer, intent(inout) :: offset
type(ESMF_AttReconcileFlag), optional :: attreconflag
integer, intent(out), optional :: rc
!
! !DESCRIPTION:
! Takes a byte-stream buffer and reads the information needed to
! recreate a Field object. Recursively calls the deserialize routines
! needed to recreate the subobjects.
! Expected to be used by {\tt ESMF\_StateReconcile()} and
! by {\tt ESMF\_FieldWrite()} and {\tt ESMF\_FieldRead()}.
!
! The arguments are:
! \begin{description}
! \item [buffer]
! Data buffer which holds the serialized information.
! \item [offset]
! Current read offset in the current buffer. This will be
! updated by this routine and return pointing to the next
! unread byte in the buffer.
! \item[{[attreconflag]}]
! Flag to tell if Attribute serialization is to be done
! \item [{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!
!EOPI
integer :: localrc
type(ESMF_FieldType), pointer :: fp ! field type
integer staggerloc
type(ESMF_AttReconcileFlag) :: lattreconflag
type(ESMF_Info) :: infoh
logical :: should_serialize_geom, skipGeomObj
! Initialize
localrc = ESMF_RC_NOT_IMPL
if (present(rc)) rc = ESMF_RC_NOT_IMPL
! deal with optional attreconflag
if (present(attreconflag)) then
lattreconflag = attreconflag
else
lattreconflag = ESMF_ATTRECONCILE_OFF
endif
! In case of error, make sure this is invalid.
nullify(ESMF_FieldDeserialize%ftypep)
! Shortcut to internals
allocate(fp, stat=localrc)
if (ESMF_LogFoundAllocError(localrc, &
msg="space for new Field object", &
ESMF_CONTEXT, rcToReturn=rc)) return
! Deserialize Base
fp%base = ESMF_BaseDeserialize(buffer, offset, lattreconflag, rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_BaseSetInitCreated(fp%base, rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Deserialize other Field members
call c_ESMC_FieldDeserialize(fp%status, &
fp%iostatus, &
fp%dimCount, fp%gridToFieldMap, &
fp%ungriddedLBound, fp%ungriddedUBound, &
fp%totalLWidth, fp%totalUWidth, &
buffer, offset, localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
if (fp%status .eq. ESMF_FIELDSTATUS_GRIDSET .or. &
fp%status .eq. ESMF_FIELDSTATUS_COMPLETE) then
call ESMF_FieldGetSerializeFlag(fp, should_serialize_geom, localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
if (should_serialize_geom) then
skipGeomObj = .false.
else
skipGeomObj = .true.
end if
fp%geom=ESMF_GeomDeserialize(buffer, offset, &
lattreconflag, skipGeomObj, &
localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
endif
if (fp%status .eq. ESMF_FIELDSTATUS_COMPLETE) then
call c_ESMC_ArrayDeserialize(fp%array, buffer, offset, &
lattreconflag, localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_ArraySetInitCreated(fp%array,rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
endif
fp%is_proxy = .true.
ESMF_FieldDeserialize%ftypep => fp
! Add copy of this object into ESMF garbage collection table
call c_ESMC_VMAddFObject(ESMF_FieldDeserialize, ESMF_ID_FIELD%objectID)
ESMF_INIT_SET_CREATED(ESMF_FieldDeserialize)
if (present(rc)) rc = ESMF_SUCCESS
end function ESMF_FieldDeserialize