updateGeneric Subroutine

private subroutine updateGeneric(self, root_key, name, etype, base, keywordEnforcer, base_is_valid, uname, rc)

Type Bound

ESMF_InfoDescribe

Arguments

Type IntentOptional Attributes Name
class(ESMF_InfoDescribe), intent(inout) :: self
character(len=*), intent(in) :: root_key
character(len=*), intent(in) :: name
character(len=*), intent(in) :: etype
type(ESMF_Base), intent(in) :: base
type(ESMF_KeywordEnforcer), optional :: keywordEnforcer
logical, intent(in), optional :: base_is_valid
character(len=:), optional, allocatable :: uname
integer, intent(inout), optional :: rc

Calls

proc~~updategeneric~~CallsGraph proc~updategeneric ESMF_InfoDescribe%updateGeneric interface~c_infodescribe_search c_infodescribe_search proc~updategeneric->interface~c_infodescribe_search interface~esmf_infoset ESMF_InfoSet proc~updategeneric->interface~esmf_infoset proc~esmf_basegetid ESMF_BaseGetId proc~updategeneric->proc~esmf_basegetid proc~esmf_basegetvmid ESMF_BaseGetVMId proc~updategeneric->proc~esmf_basegetvmid proc~esmf_infogetfrombase ESMF_InfoGetFromBase proc~updategeneric->proc~esmf_infogetfrombase proc~esmf_infosetnull ESMF_InfoSetNULL proc~updategeneric->proc~esmf_infosetnull proc~esmf_logfounderror ESMF_LogFoundError proc~updategeneric->proc~esmf_logfounderror proc~esmf_vmidcompare ESMF_VMIdCompare proc~updategeneric->proc~esmf_vmidcompare proc~itoa itoa proc~updategeneric->proc~itoa proc~esmf_infosetarraych ESMF_InfoSetArrayCH interface~esmf_infoset->proc~esmf_infosetarraych proc~esmf_infosetarrayi4 ESMF_InfoSetArrayI4 interface~esmf_infoset->proc~esmf_infosetarrayi4 proc~esmf_infosetarrayi8 ESMF_InfoSetArrayI8 interface~esmf_infoset->proc~esmf_infosetarrayi8 proc~esmf_infosetarraylg ESMF_InfoSetArrayLG interface~esmf_infoset->proc~esmf_infosetarraylg proc~esmf_infosetarrayr4 ESMF_InfoSetArrayR4 interface~esmf_infoset->proc~esmf_infosetarrayr4 proc~esmf_infosetarrayr8 ESMF_InfoSetArrayR8 interface~esmf_infoset->proc~esmf_infosetarrayr8 proc~esmf_infosetch ESMF_InfoSetCH interface~esmf_infoset->proc~esmf_infosetch proc~esmf_infosethconfig ESMF_InfoSetHConfig interface~esmf_infoset->proc~esmf_infosethconfig proc~esmf_infoseti4 ESMF_InfoSetI4 interface~esmf_infoset->proc~esmf_infoseti4 proc~esmf_infoseti8 ESMF_InfoSetI8 interface~esmf_infoset->proc~esmf_infoseti8 proc~esmf_infosetinfo ESMF_InfoSetINFO interface~esmf_infoset->proc~esmf_infosetinfo proc~esmf_infosetlg ESMF_InfoSetLG interface~esmf_infoset->proc~esmf_infosetlg proc~esmf_infosetr4 ESMF_InfoSetR4 interface~esmf_infoset->proc~esmf_infosetr4 proc~esmf_infosetr8 ESMF_InfoSetR8 interface~esmf_infoset->proc~esmf_infosetr8 interface~c_esmc_getid c_ESMC_GetId proc~esmf_basegetid->interface~c_esmc_getid interface~c_esmc_getvmid c_ESMC_GetVMId proc~esmf_basegetvmid->interface~c_esmc_getvmid interface~c_info_base_get c_info_base_get proc~esmf_infogetfrombase->interface~c_info_base_get proc~esmf_infosetnull->proc~esmf_logfounderror interface~c_info_set_null c_info_set_NULL proc~esmf_infosetnull->interface~c_info_set_null esmf_breakpoint esmf_breakpoint proc~esmf_logfounderror->esmf_breakpoint proc~esmf_logrc2msg ESMF_LogRc2Msg proc~esmf_logfounderror->proc~esmf_logrc2msg proc~esmf_logwrite ESMF_LogWrite proc~esmf_logfounderror->proc~esmf_logwrite proc~esmf_vmidcompare->proc~esmf_logfounderror c_esmc_vmidcompare c_esmc_vmidcompare proc~esmf_vmidcompare->c_esmc_vmidcompare

Called by

proc~~updategeneric~~CalledByGraph proc~updategeneric ESMF_InfoDescribe%updateGeneric proc~updatewitharray ESMF_InfoDescribe%updateWithArray proc~updatewitharray->proc~updategeneric proc~updatewitharraybundle ESMF_InfoDescribe%updateWithArrayBundle proc~updatewitharraybundle->proc~updategeneric proc~updatewithcplcomp ESMF_InfoDescribe%updateWithCplComp proc~updatewithcplcomp->proc~updategeneric proc~updatewithdistgrid ESMF_InfoDescribe%updateWithDistGrid proc~updatewithdistgrid->proc~updategeneric proc~updatewithfield ESMF_InfoDescribe%updateWithField proc~updatewithfield->proc~updategeneric proc~updatewithfieldbundle ESMF_InfoDescribe%updateWithFieldBundle proc~updatewithfieldbundle->proc~updategeneric proc~updatewithgrid ESMF_InfoDescribe%updateWithGrid proc~updatewithgrid->proc~updategeneric proc~updatewithgridcomp ESMF_InfoDescribe%updateWithGridComp proc~updatewithgridcomp->proc~updategeneric proc~updatewithlocstream ESMF_InfoDescribe%updateWithLocStream proc~updatewithlocstream->proc~updategeneric proc~updatewithmesh ESMF_InfoDescribe%updateWithMesh proc~updatewithmesh->proc~updategeneric proc~updatewithroutehandle ESMF_InfoDescribe%updateWithRouteHandle proc~updatewithroutehandle->proc~updategeneric proc~updatewithscicomp ESMF_InfoDescribe%updateWithSciComp proc~updatewithscicomp->proc~updategeneric proc~updatewithstate ESMF_InfoDescribe%updateWithState proc~updatewithstate->proc~updategeneric proc~updatewithxgrid ESMF_InfoDescribe%updateWithXGrid proc~updatewithxgrid->proc~updategeneric none~update ESMF_InfoDescribe%Update none~update->proc~updatewitharray none~update->proc~updatewitharraybundle none~update->proc~updatewithcplcomp none~update->proc~updatewithdistgrid none~update->proc~updatewithfield none~update->proc~updatewithfieldbundle none~update->proc~updatewithgrid none~update->proc~updatewithgridcomp none~update->proc~updatewithlocstream none~update->proc~updatewithmesh none~update->proc~updatewithroutehandle none~update->proc~updatewithscicomp none~update->proc~updatewithstate none~update->proc~updatewithxgrid

Source Code

subroutine updateGeneric(self, root_key, name, etype, base, keywordEnforcer, base_is_valid, uname, rc)
  class(ESMF_InfoDescribe), intent(inout) :: self
  character(*), intent(in) :: root_key
  character(*), intent(in) :: name
  character(*), intent(in) :: etype
  type(ESMF_Base), intent(in) :: base
type(ESMF_KeywordEnforcer), optional:: keywordEnforcer ! must use keywords below
  logical, intent(in), optional :: base_is_valid
  character(:), allocatable, optional :: uname
  integer, intent(inout), optional :: rc

  integer :: id_base, localrc, vmid_int, ii
  character(:), allocatable :: c_id_base, l_uname, c_vmid, local_root_key
  logical :: l_base_is_valid
  type(ESMF_Info) :: object_info
  character(len=9), dimension(4), parameter :: geom_etypes = (/"Grid     ", "Mesh     ", "LocStream", "XGrid    "/)
  integer(C_INT) :: found_as_int
  type(ESMF_VMId) :: curr_vmid
  logical :: vmids_are_equal, should_search_for_vmid
  character(len=ESMF_MAXSTR) :: logmsg

  localrc = ESMF_FAILURE
  if (.not. self%is_initialized) then
    if (ESMF_LogFoundError(ESMF_RC_OBJ_NOT_CREATED, msg="ESMF_InfoDescribe is not initialized", &
     ESMF_CONTEXT, rcToReturn=rc)) return
  endif

  if (present(rc)) rc = ESMF_RC_NOT_IMPL
  if (present(base_is_valid)) then
    l_base_is_valid = base_is_valid
  else
    l_base_is_valid = .true.
  end if
  self%curr_base_is_valid = l_base_is_valid
  self%curr_base = base

  self%curr_base_is_geom = .false.
  do ii=1,SIZE(geom_etypes)
    if (trim(etype) == trim(geom_etypes(ii))) then
      self%curr_base_is_geom = .true.
      exit
    end if
  end do

  if (self%createInfo) then
    ! If a VM identifier map is provided and the current Base object is valid,
    ! search the map for its integer identifier.
    should_search_for_vmid = associated(self%vmIdMap)
    if (.not. l_base_is_valid) then
      should_search_for_vmid = .false.
    end if
    if (should_search_for_vmid) then
      call ESMF_BaseGetVMId(base, curr_vmid, rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return

      do vmid_int=1,size(self%vmIdMap)
        vmids_are_equal = ESMF_VMIdCompare(curr_vmid, self%vmIdMap(vmid_int), rc=localrc)
        if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return

        if (vmids_are_equal) exit
      end do

    else
      vmids_are_equal = .false.
    end if

    if (l_base_is_valid) then
      call ESMF_BaseGetId(base, id_base, rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return

      call itoa(id_base, c_id_base)

      if (vmids_are_equal) then
        call itoa(vmid_int, c_vmid)
        l_uname = trim(c_vmid)//"-"//trim(c_id_base)//"-"//trim(name)
      else
        l_uname = trim(c_id_base)//"-"//trim(name)
      end if
    else
      l_uname = trim(name)
    end if

    allocate(character(len(trim(root_key))+len(l_uname)+1)::local_root_key)
    local_root_key = trim(root_key)//"/"//l_uname

    if (should_search_for_vmid) then
      call ESMF_InfoSet(self%info, local_root_key//"/vmid_int", vmid_int, rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
    else
      call ESMF_InfoSetNULL(self%info, local_root_key//"/vmid_int", rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
    end if

    call ESMF_InfoSet(self%info, local_root_key//"/base_name", trim(name), force=.false., rc=localrc)
    if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return

    call ESMF_InfoSet(self%info, local_root_key//"/esmf_type", etype, force=.false., rc=localrc)
    if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return

    call ESMF_InfoSet(self%info, local_root_key//"/base_is_valid", l_base_is_valid, force=.false., rc=localrc)
    if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return

    call ESMF_InfoSetNULL(self%info, local_root_key//"/members", force=.false., rc=localrc)
    if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return

    if (self%addBaseAddress) then
      call ESMF_InfoSet(self%info, local_root_key//"/base_address", base%this%ptr, force=.false., rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
    end if

    if (l_base_is_valid) then
      call ESMF_InfoSet(self%info, local_root_key//"/base_id", id_base, force=.false., rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
    else
      call ESMF_InfoSetNULL(self%info, local_root_key//"/base_id", force=.false., rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
    end if

    call ESMF_InfoSet(self%info, local_root_key//"/is_geom", self%curr_base_is_geom, force=.false., rc=localrc)
    if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return

    if (self%addObjectInfo) then
      if (l_base_is_valid) then
        call ESMF_InfoGetFromBase(base, object_info, rc=localrc)
        if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
        call ESMF_InfoSet(self%info, local_root_key//"/info", object_info, force=.false., rc=localrc)
        if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
      else
        call ESMF_InfoSetNULL(self%info, local_root_key//"/info", force=.false., rc=localrc)
        if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return
      end if
    end if

    if (present(uname)) then
      allocate(character(len(l_uname))::uname)
      uname = l_uname
    end if

    if (associated(self%searchCriteria)) then
      found_as_int = 0  !false
      localrc = c_infodescribe_search(self%info%ptr, trim(local_root_key)//C_NULL_CHAR, &
        self%searchCriteria%ptr, found_as_int)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, ESMF_CONTEXT, rcToReturn=rc)) return

      self%found = .false.
      if (found_as_int == 1) self%found = .true.
    end if

    deallocate(local_root_key, l_uname)
  endif

  if (present(rc)) rc = ESMF_SUCCESS
end subroutine updateGeneric