ESMF_ReconcileSerializeAll Subroutine

private subroutine ESMF_ReconcileSerializeAll(state, itemList, itemCount, attreconflag, siwrap, buffer, rc)

Arguments

Type IntentOptional Attributes Name
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(len=1), intent(out), pointer :: buffer(:)
integer, intent(out) :: rc

Calls

proc~~esmf_reconcileserializeall~~CallsGraph proc~esmf_reconcileserializeall ESMF_ReconcileSerializeAll c_esmc_arraybundleserialize c_esmc_arraybundleserialize proc~esmf_reconcileserializeall->c_esmc_arraybundleserialize c_esmc_arrayserialize c_esmc_arrayserialize proc~esmf_reconcileserializeall->c_esmc_arrayserialize esmf_fieldbundleserialize esmf_fieldbundleserialize proc~esmf_reconcileserializeall->esmf_fieldbundleserialize esmf_stateserialize esmf_stateserialize proc~esmf_reconcileserializeall->esmf_stateserialize proc~esmf_baseserialize ESMF_BaseSerialize proc~esmf_reconcileserializeall->proc~esmf_baseserialize proc~esmf_fieldserialize ESMF_FieldSerialize proc~esmf_reconcileserializeall->proc~esmf_fieldserialize proc~esmf_logfoundallocerror ESMF_LogFoundAllocError proc~esmf_reconcileserializeall->proc~esmf_logfoundallocerror proc~esmf_logfounderror ESMF_LogFoundError proc~esmf_reconcileserializeall->proc~esmf_logfounderror proc~esmf_logseterror ESMF_LogSetError proc~esmf_reconcileserializeall->proc~esmf_logseterror proc~esmf_baseserialize->proc~esmf_logfounderror c_esmc_baseserialize c_esmc_baseserialize proc~esmf_baseserialize->c_esmc_baseserialize proc~esmf_fieldserialize->c_esmc_arrayserialize proc~esmf_fieldserialize->proc~esmf_baseserialize proc~esmf_fieldserialize->proc~esmf_logfounderror c_esmc_fieldserialize c_esmc_fieldserialize proc~esmf_fieldserialize->c_esmc_fieldserialize proc~esmf_fieldgetinit ESMF_FieldGetInit proc~esmf_fieldserialize->proc~esmf_fieldgetinit proc~esmf_fieldgetserializeflag ESMF_FieldGetSerializeFlag proc~esmf_fieldserialize->proc~esmf_fieldgetserializeflag proc~esmf_geomserialize ESMF_GeomSerialize proc~esmf_fieldserialize->proc~esmf_geomserialize proc~esmf_imerr ESMF_IMErr proc~esmf_fieldserialize->proc~esmf_imerr esmf_breakpoint esmf_breakpoint proc~esmf_logfoundallocerror->esmf_breakpoint proc~esmf_logrc2msg ESMF_LogRc2Msg proc~esmf_logfoundallocerror->proc~esmf_logrc2msg proc~esmf_logwrite ESMF_LogWrite proc~esmf_logfoundallocerror->proc~esmf_logwrite proc~esmf_logfounderror->esmf_breakpoint proc~esmf_logfounderror->proc~esmf_logrc2msg proc~esmf_logfounderror->proc~esmf_logwrite proc~esmf_logseterror->esmf_breakpoint proc~esmf_logseterror->proc~esmf_logrc2msg proc~esmf_logseterror->proc~esmf_logwrite

Called by

proc~~esmf_reconcileserializeall~~CalledByGraph proc~esmf_reconcileserializeall ESMF_ReconcileSerializeAll proc~esmf_reconcilesinglecompcase ESMF_ReconcileSingleCompCase proc~esmf_reconcilesinglecompcase->proc~esmf_reconcileserializeall proc~esmf_reconcilemulticompcase ESMF_ReconcileMultiCompCase proc~esmf_reconcilemulticompcase->proc~esmf_reconcilesinglecompcase proc~esmf_statereconcile_driver ESMF_StateReconcile_driver proc~esmf_statereconcile_driver->proc~esmf_reconcilemulticompcase proc~esmf_statereconcile ESMF_StateReconcile proc~esmf_statereconcile->proc~esmf_statereconcile_driver

Source Code

  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