ESMF_LocStreamAddKeyArray Subroutine

private subroutine ESMF_LocStreamAddKeyArray(locstream, keyName, keyArray, keywordEnforcer, destroyKey, keyUnits, keyLongName, rc)

Arguments

Type IntentOptional Attributes Name
type(ESMF_LocStream), intent(in) :: locstream
character(len=*), intent(in) :: keyName
type(ESMF_Array), intent(in) :: keyArray
type(ESMF_KeywordEnforcer), optional :: keywordEnforcer
logical, intent(in), optional :: destroyKey
character(len=*), intent(in), optional :: keyUnits
character(len=*), intent(in), optional :: keyLongName
integer, intent(out), optional :: rc

Calls

proc~~esmf_locstreamaddkeyarray~~CallsGraph proc~esmf_locstreamaddkeyarray ESMF_LocStreamAddKeyArray esmf_arraygetinit esmf_arraygetinit proc~esmf_locstreamaddkeyarray->esmf_arraygetinit proc~esmf_imerr ESMF_IMErr proc~esmf_locstreamaddkeyarray->proc~esmf_imerr proc~esmf_locstreamgetinit ESMF_LocStreamGetInit proc~esmf_locstreamaddkeyarray->proc~esmf_locstreamgetinit proc~esmf_logfoundallocerror ESMF_LogFoundAllocError proc~esmf_locstreamaddkeyarray->proc~esmf_logfoundallocerror proc~esmf_logfounderror ESMF_LogFoundError proc~esmf_locstreamaddkeyarray->proc~esmf_logfounderror proc~esmf_imerr->proc~esmf_logfounderror proc~esmf_initcheckdeep ESMF_InitCheckDeep proc~esmf_imerr->proc~esmf_initcheckdeep 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 c_esmc_loggeterrormsg c_esmc_loggeterrormsg proc~esmf_logrc2msg->c_esmc_loggeterrormsg c_esmc_vmwtime c_esmc_vmwtime proc~esmf_logwrite->c_esmc_vmwtime proc~esmf_logclose ESMF_LogClose proc~esmf_logwrite->proc~esmf_logclose proc~esmf_logflush ESMF_LogFlush proc~esmf_logwrite->proc~esmf_logflush proc~esmf_logopenfile ESMF_LogOpenFile proc~esmf_logwrite->proc~esmf_logopenfile proc~esmf_utiliounitflush ESMF_UtilIOUnitFlush proc~esmf_logwrite->proc~esmf_utiliounitflush proc~esmf_utilstring2array ESMF_UtilString2Array proc~esmf_logwrite->proc~esmf_utilstring2array proc~esmf_logclose->proc~esmf_logflush proc~esmf_logflush->proc~esmf_utiliounitflush proc~esmf_utilarray2string ESMF_UtilArray2String proc~esmf_logflush->proc~esmf_utilarray2string proc~esmf_logopenfile->proc~esmf_utiliounitflush proc~esmf_utiliounitget ESMF_UtilIOUnitGet proc~esmf_logopenfile->proc~esmf_utiliounitget

Called by

proc~~esmf_locstreamaddkeyarray~~CalledByGraph proc~esmf_locstreamaddkeyarray ESMF_LocStreamAddKeyArray interface~esmf_locstreamaddkey ESMF_LocStreamAddKey interface~esmf_locstreamaddkey->proc~esmf_locstreamaddkeyarray proc~esmf_locstreamaddkeyalloc ESMF_LocStreamAddKeyAlloc interface~esmf_locstreamaddkey->proc~esmf_locstreamaddkeyalloc proc~esmf_locstreamaddkeyi4 ESMF_LocStreamAddKeyI4 interface~esmf_locstreamaddkey->proc~esmf_locstreamaddkeyi4 proc~esmf_locstreamaddkeyr4 ESMF_LocStreamAddKeyR4 interface~esmf_locstreamaddkey->proc~esmf_locstreamaddkeyr4 proc~esmf_locstreamaddkeyr8 ESMF_LocStreamAddKeyR8 interface~esmf_locstreamaddkey->proc~esmf_locstreamaddkeyr8 proc~esmf_locstreamaddkeyalloc->proc~esmf_locstreamaddkeyarray proc~esmf_locstreamaddkeyi4->proc~esmf_locstreamaddkeyarray proc~esmf_locstreamaddkeyr4->proc~esmf_locstreamaddkeyarray proc~esmf_locstreamaddkeyr8->proc~esmf_locstreamaddkeyarray proc~esmf_locstreamcreatefromnewdg ESMF_LocStreamCreateFromNewDG proc~esmf_locstreamcreatefromnewdg->interface~esmf_locstreamaddkey proc~f_esmf_locstreamaddkeyalloc f_esmf_locstreamaddkeyalloc proc~f_esmf_locstreamaddkeyalloc->interface~esmf_locstreamaddkey proc~test_locstreambkg test_locstreambkg proc~test_locstreambkg->interface~esmf_locstreamaddkey proc~test_locstreambkgnda test_locstreambkgnda proc~test_locstreambkgnda->interface~esmf_locstreamaddkey proc~test_locstreambkgsph test_locstreambkgsph proc~test_locstreambkgsph->interface~esmf_locstreamaddkey proc~test_nearest2dcartlstols test_Nearest2DCartLSToLS proc~test_nearest2dcartlstols->interface~esmf_locstreamaddkey proc~test_nearest3dcartlstols test_Nearest3DCartLSToLS proc~test_nearest3dcartlstols->interface~esmf_locstreamaddkey proc~test_patchmeshtolocstreammask test_PatchMeshToLocStreamMask proc~test_patchmeshtolocstreammask->interface~esmf_locstreamaddkey proc~test_pointlist_from_locstream_nomask test_pointlist_from_locStream_nomask proc~test_pointlist_from_locstream_nomask->interface~esmf_locstreamaddkey proc~test_pointlist_from_locstream_wmask test_pointlist_from_locStream_wmask proc~test_pointlist_from_locstream_wmask->interface~esmf_locstreamaddkey proc~test_regridgridtogml test_regridGridToGML proc~test_regridgridtogml->interface~esmf_locstreamaddkey proc~test_regridgridtolocstream3d test_regridGridToLocStream3d proc~test_regridgridtolocstream3d->interface~esmf_locstreamaddkey proc~test_regridgridtolocstreamloccnt test_regridGridToLocStreamLocCnt proc~test_regridgridtolocstreamloccnt->interface~esmf_locstreamaddkey proc~test_regridgridtolocstreamregdist test_regridGridToLocStreamRegDist proc~test_regridgridtolocstreamregdist->interface~esmf_locstreamaddkey proc~test_regridmeshtolocstreammask test_regridMeshToLocStreamMask proc~test_regridmeshtolocstreammask->interface~esmf_locstreamaddkey proc~test_regridnearestlocstream_wclustertomesh test_regridNearestLocStream_wClusterToMesh proc~test_regridnearestlocstream_wclustertomesh->interface~esmf_locstreamaddkey proc~test_regridnearestlocstreamtogrid test_regridNearestLocStreamToGrid proc~test_regridnearestlocstreamtogrid->interface~esmf_locstreamaddkey proc~test_regridnearestlocstreamtolocstream test_regridNearestLocStreamToLocStream proc~test_regridnearestlocstreamtolocstream->interface~esmf_locstreamaddkey proc~user_init~23 user_init proc~user_init~23->interface~esmf_locstreamaddkey program~esmf_locstreamcreateutest ESMF_LocStreamCreateUTest program~esmf_locstreamcreateutest->interface~esmf_locstreamaddkey program~esmf_locstreamcreateutest->proc~test_locstreambkg program~esmf_locstreamcreateutest->proc~test_locstreambkgnda program~esmf_locstreamcreateutest->proc~test_locstreambkgsph program~esmf_locstreamex ESMF_LocStreamEx program~esmf_locstreamex->interface~esmf_locstreamaddkey interface~esmf_locstreamcreate ESMF_LocStreamCreate interface~esmf_locstreamcreate->proc~esmf_locstreamcreatefromnewdg proc~esmf_locstreamcreatepetlist ESMF_LocStreamCreatePetList proc~esmf_locstreamcreatepetlist->proc~esmf_locstreamcreatefromnewdg program~esmf_pointlistutest ESMF_PointListUTest program~esmf_pointlistutest->proc~test_pointlist_from_locstream_nomask program~esmf_pointlistutest->proc~test_pointlist_from_locstream_wmask

Source Code

  subroutine ESMF_LocStreamAddKeyArray(locstream, keyName, keyArray, &
               keywordEnforcer, destroyKey, keyUnits, keyLongName, rc)
!
! !ARGUMENTS:
    type(ESMF_Locstream), intent(in)             :: locstream
    character (len=*),    intent(in)             :: keyName
    type(ESMF_Array),     intent(in)             :: keyArray
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
    logical,              intent(in),  optional  :: destroyKey
    character (len=*),    intent(in),  optional  :: keyUnits 
    character (len=*),    intent(in),  optional  :: keyLongName 
    integer,              intent(out), optional  :: rc
!
! !DESCRIPTION:
! Add a key to a locstream with a required keyName and a required 
! {\tt ESMF\_Array}.  The user is responsible for the creation of the 
! {\tt ESMF\_Array} that will hold the key values.
!
! The arguments are:
! \begin{description}
! \item [locstream]
! The {\tt ESMF\_LocStream} object to add key to.
! \item [keyName]
! The name of the key to add. 
! \item [keyArray]
! An ESMF Array which contains the key data
! \item [{[destroyKey]}]
! if .true. destroy this key array when the locstream is destroyed.
! Defaults to .false.
! \item [{[keyUnits]}]
! The units of the key data. 
! If not specified, then the item remains blank.  
! \item [{[keyLongName]}]
! The long name of the key data. 
! If not specified, then the item remains blank.  
! \item [{[rc]}]
! Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
! \end{description}
!EOP
!------------------------------------------------------------------------------
    type(ESMF_LocStreamType), pointer :: lstypep
    integer :: i,keyIndex
    integer :: localrc
    logical :: localDestroyKey
    character(len=ESMF_MAXSTR), pointer  :: tmpKeyNames(:) 
    character(len=ESMF_MAXSTR), pointer  :: tmpKeyUnits(:) 
    character(len=ESMF_MAXSTR), pointer  :: tmpKeyLongNames(:) 
    logical, pointer                     :: tmpDestroyKeys(:)
    type (ESMF_Array), pointer           :: tmpKeys(:) 
    integer                              :: keyCount


    ! Initialize
    localrc = ESMF_RC_NOT_IMPL
    if (present(rc)) rc = ESMF_RC_NOT_IMPL

    ! check variables
    ESMF_INIT_CHECK_DEEP(ESMF_LocStreamGetInit,locstream,rc)
    ESMF_INIT_CHECK_DEEP(ESMF_ArrayGetInit,keyArray,rc)

    ! Set default
    if (present(destroyKey)) then
       localDestroyKey=destroyKey
    else
       localDestroyKey=.false.
    endif
    
    ! get the pointer to the locstream
    lstypep => locstream%lstypep

    ! Get keyCount
    keyCount=lstypep%keyCount

    ! Make sure key name doesn't already exist
    keyIndex=0
    do i=1,keyCount
       if (trim(keyName) .eq. trim(lstypep%keyNames(i))) then
          keyIndex=i
          exit 
       endif
    enddo

   ! If something found return error
   if (keyIndex .ne. 0) then
      if (ESMF_LogFoundError(ESMF_RC_ARG_WRONG, &
            msg=" - keyName already exists in this LocStream", &
            ESMF_CONTEXT, rcToReturn=rc)) return
   endif


   ! Make more space 
   ! (Should we eventually make this a linked list???)   
   !! hold old data
   if (keyCount .gt. 0) then
       tmpKeyNames=>lstypep%keyNames
      tmpKeyUnits =>lstypep%keyUnits 
      tmpKeyLongNames=>lstypep%keyLongNames
      tmpDestroyKeys=>lstypep%destroyKeys
      tmpKeys=>lstypep%keys
   endif

   !! Allocate new space for keys (note +1 to increase space for new key)
   allocate (lstypep%keyNames(keyCount+1), stat=localrc )
   if (ESMF_LogFoundAllocError(localrc, msg=" Allocating KeyNames", &
                                     ESMF_CONTEXT, rcToReturn=rc)) return
   allocate (lstypep%keyUnits(keyCount+1), stat=localrc )
   if (ESMF_LogFoundAllocError(localrc, msg=" Allocating units", &
                                     ESMF_CONTEXT, rcToReturn=rc)) return
   allocate (lstypep%keyLongNames(keyCount+1), stat=localrc )
   if (ESMF_LogFoundAllocError(localrc, msg=" Allocating longNames", &
                                     ESMF_CONTEXT, rcToReturn=rc)) return
   allocate( lstypep%keys(keyCount+1), stat=localrc )  ! Array of keys
   if (ESMF_LogFoundAllocError(localrc, msg=" Allocating keys", &
                                     ESMF_CONTEXT, rcToReturn=rc)) return
   allocate( lstypep%destroyKeys(keyCount+1), stat=localrc )  ! Array of keys
   if (ESMF_LogFoundAllocError(localrc, msg=" Allocating keys", &
                                     ESMF_CONTEXT, rcToReturn=rc)) return

   !! Copy and deallocate old arrays
   if (keyCount .gt. 0) then
      lstypep%keyNames(1:keyCount)=tmpKeyNames(1:keyCount)
      lstypep%keyUnits(1:keyCount)=tmpKeyUnits(1:keyCount)
      lstypep%keyLongNames(1:keyCount)=tmpKeyLongNames(1:keyCount)
      lstypep%destroyKeys(1:keyCount)=tmpDestroyKeys(1:keyCount)
      lstypep%keys(1:keyCount)=tmpKeys(1:keyCount)
     
      deallocate(tmpKeyNames)
      deallocate(tmpKeyUnits)
      deallocate(tmpKeyLongNames)
      deallocate(tmpDestroyKeys)
      deallocate(tmpKeys)
   endif

   ! Put new key info into locstream structure
   lstypep%keyNames(keyCount+1)=keyName
   if (present(keyUnits)) lstypep%keyUnits(keyCount+1)=keyUnits
   if (present(keyLongName)) lstypep%keyLongNames(keyCount+1)=keyLongName
   lstypep%destroyKeys(keyCount+1)=localDestroyKey 
   lstypep%keys(keyCount+1)=keyArray


   ! Increment keyCount to take into account new key
   lstypep%keyCount=keyCount+1

   ! return success
   if (present(rc)) rc = ESMF_SUCCESS

  end subroutine ESMF_LocStreamAddKeyArray