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