subroutine ESMF_ReconcileDeserializeAll(state, vm, attreconflag, buffer, rc)
!
!TODO: This routine looks almost redundant to ESMF_StateDeserialize()!!!!!!!!!!
!
! !ARGUMENTS:
type (ESMF_State), intent(inout) :: state
type (ESMF_VM), intent(in) :: vm
type(ESMF_AttReconcileFlag),intent(in):: attreconflag
character, pointer,intent(in) :: buffer(:)
integer, intent(out) :: rc
!
! !DESCRIPTION:
!
! Builds proxy items for each of the items in the buffer.
!
! The arguments are:
! \begin{description}
! \item[state]
! {\tt ESMF\_State} to add proxy objects to.
! \item[vm]
! {\tt ESMF\_VM} to use.
! \item[attreconflag]
! Flag to indicate attribute reconciliation.
! \item[buffer]
! Buffer of serialized State objects (intent(in))
! \item[rc]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!EOPI
integer :: localrc
type(ESMF_FieldBundle) :: fieldbundle
type(ESMF_Field) :: field
type(ESMF_Array) :: array
type(ESMF_ArrayBundle) :: arraybundle
type(ESMF_State) :: substate
integer :: stateitem_type
character(ESMF_MAXSTR) :: errstring
character(ESMF_MAXSTR) :: name
integer :: item, numNewItems
integer :: itemType
integer :: sizeBuffer, posBuffer
#ifdef RECONCILE_LOG_on
call ESMF_LogWrite("ESMF_ReconcileDeserializeAll()", &
ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
#endif
! Set start position of buffer
posBuffer = 0
! Get the number of items to add
numNewItems = transfer ( &
source=buffer(posBuffer:posBuffer+ESMF_SIZEOF_DEFINT-1), &
mold = numNewItems)
posBuffer = posbuffer + ESMF_SIZEOF_DEFINT
! Loop getting new items
do item=1, numNewItems
! Get item type
itemType = transfer ( &
source=buffer(posBuffer:posBuffer+ESMF_SIZEOF_DEFINT-1), &
mold = itemType)
posBuffer = posbuffer + ESMF_SIZEOF_DEFINT
! Get items
select case (itemType)
case (ESMF_STATEITEM_FIELDBUNDLE%ot)
#ifdef RECONCILE_LOG_on
block
character(160) :: msgStr
write(msgStr,*) "deserializing FieldBundle, pos =", posBuffer
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
fieldbundle = ESMF_FieldBundleDeserialize(buffer, posBuffer, &
attreconflag=attreconflag, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
call ESMF_StateAdd(state, fieldbundle, &
addflag=.true., proxyflag=.true., &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
case (ESMF_STATEITEM_FIELD%ot)
#ifdef RECONCILE_LOG_on
block
character(160) :: msgStr
write(msgStr,*) "deserializing Field, pos =", posBuffer
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
field = ESMF_FieldDeserialize(buffer, posBuffer, &
attreconflag=attreconflag, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
call ESMF_StateAdd(state, field, &
addflag=.true., proxyflag=.true., &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
case (ESMF_STATEITEM_ARRAY%ot)
#ifdef RECONCILE_LOG_on
block
character(160) :: msgStr
write(msgStr,*) "deserializing Array, pos =", posBuffer
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
call c_ESMC_ArrayDeserialize(array, buffer, posBuffer, &
attreconflag, localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
! Set init code
call ESMF_ArraySetInitCreated(array, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
call ESMF_StateAdd(state, array, &
addflag=.true., proxyflag=.true., &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
case (ESMF_STATEITEM_ARRAYBUNDLE%ot)
#ifdef RECONCILE_LOG_on
block
character(160) :: msgStr
write(msgStr,*) "deserializing ArrayBundle, pos =", posBuffer
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
call c_ESMC_ArrayBundleDeserialize(arraybundle, buffer, posBuffer, &
attreconflag, localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
! Set init code
call ESMF_ArrayBundleSetInitCreated(arraybundle, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
call ESMF_StateAdd(state, arraybundle, &
addflag=.true., proxyflag=.true., &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
case (ESMF_STATEITEM_STATE%ot)
#ifdef RECONCILE_LOG_on
block
character(160) :: msgStr
write(msgStr,*) "deserializing State, pos =", posBuffer
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
substate = ESMF_StateDeserialize(vm, buffer, posBuffer, &
attreconflag=attreconflag, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
call ESMF_StateAdd(state, substate, &
addflag=.true., proxyflag=.true., &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
case (ESMF_STATEITEM_UNKNOWN%ot)
write (errstring, '(a,i0)') 'can''t deserialize unknown type: ', itemType
call ESMF_LogSetError(ESMF_RC_INTNRL_INCONS, msg=errstring, &
ESMF_CONTEXT, rcToReturn=rc)
return
case default
write (errstring, '(a,i0)') 'can''t deserialize unsupported type: ', itemType
call ESMF_LogSetError(ESMF_RC_INTNRL_INCONS, msg=errstring, &
ESMF_CONTEXT, rcToReturn=rc)
return
end select
enddo
! Deserialize the received State's Base itself and add to local top State
block
type(ESMF_Base) :: base_temp
type(ESMF_Info) :: base_info, base_temp_info
#ifdef RECONCILE_LOG_on
block
character(160) :: msgStr
write(msgStr,*) "deserializing top State Base itself, pos =", posBuffer
call ESMF_LogWrite(msgStr, ESMF_LOGMSG_DEBUG, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
#endif
base_temp = ESMF_BaseDeserializeWoGarbage(buffer, &
offset=posBuffer, attreconflag=attreconflag, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
call ESMF_BaseSetInitCreated(base_temp, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
call ESMF_InfoGetFromBase(base_temp, base_temp_info, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
call ESMF_InfoGetFromBase(state%statep%base, base_info, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
call ESMF_InfoUpdate(base_info, base_temp_info, recursive=.true., &
rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
call ESMF_BaseDestroyWoGarbage(base_temp, rc=localrc)
if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, &
rcToReturn=rc)) return
end block
! Return success
rc = ESMF_SUCCESS
end subroutine ESMF_ReconcileDeserializeAll