function ESMF_LocStreamDeserialize(buffer, offset, rc)
!
! !RETURN VALUE:
type(ESMF_LocStream) :: ESMF_LocStreamDeserialize
!
! !ARGUMENTS:
character, pointer, dimension(:) :: buffer
integer, intent(inout) :: offset
integer, intent(out), optional :: rc
!
! !DESCRIPTION:
! Takes a byte-stream buffer and reads the information needed to
! recreate a LocStream object. Recursively calls the deserialize routines
! needed to recreate the subobjects.
! Expected to be used by {\tt ESMF\_StateReconcile()}.
!
! 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 [{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!
!EOPI
integer :: localrc
type(ESMF_LocStreamType),pointer :: lstypep
integer :: i
type(ESMF_AttReconcileFlag) :: attreconflag
! Initialize
localrc = ESMF_RC_NOT_IMPL
if (present(rc)) rc = ESMF_RC_NOT_IMPL
! allocate LocStream type
allocate(lstypep, stat=localrc)
if (ESMF_LogFoundAllocError(localrc, msg="Allocating LocStream type object", &
ESMF_CONTEXT, rcToReturn=rc)) return
! Deserialize Base
attreconflag = ESMF_ATTRECONCILE_OFF
call c_ESMC_BaseDeserialize(lstypep%base, buffer, offset, &
attreconflag, localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_BaseSetInitCreated(lstypep%base, rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Deserialize Distgrid
call c_ESMC_DistGridDeserialize(lstypep%distgrid, buffer, offset, localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_DistGridSetInitCreated(lstypep%distgrid, rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Deserialize other locstream items
call c_ESMC_LocStreamDeserialize(lstypep%indexflag, &
lstypep%keyCount, &
lstypep%coordSys, &
buffer, offset, localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Initialize key member variables
nullify(lstypep%keyNames)
nullify(lstypep%keyUnits)
nullify(lstypep%keyLongNames)
nullify(lstypep%keys)
nullify(lstypep%destroyKeys)
! Allocate arrays for names, etc.
if (lstypep%keyCount .gt. 0) then
allocate (lstypep%keyNames(lstypep%keyCount), stat=localrc )
if (ESMF_LogFoundAllocError(localrc, msg=" Allocating KeyNames", &
ESMF_CONTEXT, rcToReturn=rc)) return
allocate (lstypep%keyUnits(lstypep%keyCount), stat=localrc )
if (ESMF_LogFoundAllocError(localrc, msg=" Allocating units", &
ESMF_CONTEXT, rcToReturn=rc)) return
allocate (lstypep%keyLongNames(lstypep%keyCount), stat=localrc )
if (ESMF_LogFoundAllocError(localrc, msg=" Allocating longNames", &
ESMF_CONTEXT, rcToReturn=rc)) return
allocate( lstypep%keys(lstypep%keyCount), stat=localrc ) ! Array of keys
if (ESMF_LogFoundAllocError(localrc, msg=" Allocating keys", &
ESMF_CONTEXT, rcToReturn=rc)) return
allocate( lstypep%destroyKeys(lstypep%keyCount), stat=localrc ) ! Array of keys
if (ESMF_LogFoundAllocError(localrc, msg=" Allocating keys", &
ESMF_CONTEXT, rcToReturn=rc)) return
endif
! Serialize locstream key info
do i=1,lstypep%keyCount
! Deserialize key info
call c_ESMC_LocStreamKeyDeserialize(&
lstypep%keyNames(i), &
lstypep%keyUnits(i), &
lstypep%keyLongNames(i), &
buffer, offset, localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Deserialize key Array
call c_ESMC_ArrayDeserialize(lstypep%keys(i), buffer, offset, &
attreconflag, localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
call ESMF_ArraySetInitCreated(lstypep%keys(i), rc=localrc)
if (ESMF_LogFoundError(localrc, &
ESMF_ERR_PASSTHRU, &
ESMF_CONTEXT, rcToReturn=rc)) return
! Set to destroy proxy objects
lstypep%destroyKeys(i)=.true.
enddo
! Set to destroy proxy objects
lstypep%destroyDistgrid=.true.
! Set pointer to locstream
ESMF_LocStreamDeserialize%lstypep=>lstypep
! Add reference to this object into ESMF garbage collection table
! Only call this in those Create() methods that do not call other LSCreate()
call c_ESMC_VMAddFObject(ESMF_LocStreamDeserialize, &
ESMF_ID_LOCSTREAM%objectID)
! Set init status
ESMF_INIT_SET_CREATED(ESMF_LocStreamDeserialize)
if (present(rc)) rc = ESMF_SUCCESS
end function ESMF_LocStreamDeserialize