ESMF_MeshCreateFromScrip Function

private function ESMF_MeshCreateFromScrip(filename, convertToDual, addUSerArea, rc)

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: filename
logical, intent(in), optional :: convertToDual
logical, intent(in), optional :: addUSerArea
integer, intent(out), optional :: rc

Return Value type(ESMF_Mesh)


Calls

proc~~esmf_meshcreatefromscrip~~CallsGraph proc~esmf_meshcreatefromscrip ESMF_MeshCreateFromScrip c_convertscrip c_convertscrip proc~esmf_meshcreatefromscrip->c_convertscrip c_esmc_meshsetpoles c_esmc_meshsetpoles proc~esmf_meshcreatefromscrip->c_esmc_meshsetpoles interface~esmf_vmget ESMF_VMGet proc~esmf_meshcreatefromscrip->interface~esmf_vmget proc~esmf_logfounderror ESMF_LogFoundError proc~esmf_meshcreatefromscrip->proc~esmf_logfounderror proc~esmf_logseterror ESMF_LogSetError proc~esmf_meshcreatefromscrip->proc~esmf_logseterror proc~esmf_meshcreatefromunstruct ESMF_MeshCreateFromUnstruct proc~esmf_meshcreatefromscrip->proc~esmf_meshcreatefromunstruct proc~esmf_scripinq ESMF_ScripInq proc~esmf_meshcreatefromscrip->proc~esmf_scripinq proc~esmf_utiliounitget ESMF_UtilIOUnitGet proc~esmf_meshcreatefromscrip->proc~esmf_utiliounitget proc~esmf_vmbarrier ESMF_VMBarrier proc~esmf_meshcreatefromscrip->proc~esmf_vmbarrier proc~esmf_vmgetcurrent ESMF_VMGetCurrent proc~esmf_meshcreatefromscrip->proc~esmf_vmgetcurrent proc~esmf_vmgetdefault ESMF_VMGetDefault interface~esmf_vmget->proc~esmf_vmgetdefault proc~esmf_vmgetpetspecific ESMF_VMGetPetSpecific interface~esmf_vmget->proc~esmf_vmgetpetspecific 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_logseterror->esmf_breakpoint proc~esmf_logseterror->proc~esmf_logrc2msg proc~esmf_logseterror->proc~esmf_logwrite proc~esmf_meshcreatefromunstruct->c_esmc_meshsetpoles proc~esmf_meshcreatefromunstruct->interface~esmf_vmget proc~esmf_meshcreatefromunstruct->proc~esmf_logfounderror proc~esmf_meshcreatefromunstruct->proc~esmf_logseterror proc~esmf_meshcreatefromunstruct->proc~esmf_vmgetcurrent interface~esmf_vmallgather ESMF_VMAllGather proc~esmf_meshcreatefromunstruct->interface~esmf_vmallgather interface~esmf_vmallreduce ESMF_VMAllReduce proc~esmf_meshcreatefromunstruct->interface~esmf_vmallreduce proc~esmf_esmfgetelement ESMF_EsmfGetElement proc~esmf_meshcreatefromunstruct->proc~esmf_esmfgetelement proc~esmf_esmfgetnode ESMF_EsmfGetNode proc~esmf_meshcreatefromunstruct->proc~esmf_esmfgetnode proc~esmf_esmfinq ESMF_EsmfInq proc~esmf_meshcreatefromunstruct->proc~esmf_esmfinq proc~esmf_getmeshfromugridfile ESMF_GetMeshFromUGridFile proc~esmf_meshcreatefromunstruct->proc~esmf_getmeshfromugridfile proc~esmf_meshaddelements ESMF_MeshAddElements proc~esmf_meshcreatefromunstruct->proc~esmf_meshaddelements proc~esmf_meshaddnodes ESMF_MeshAddNodes proc~esmf_meshcreatefromunstruct->proc~esmf_meshaddnodes proc~esmf_meshcreate3part ESMF_MeshCreate3Part proc~esmf_meshcreatefromunstruct->proc~esmf_meshcreate3part proc~esmf_meshcreatedual ESMF_MeshCreateDual proc~esmf_meshcreatefromunstruct->proc~esmf_meshcreatedual proc~esmf_ugridgetvarbyname ESMF_UGridGetVarByName proc~esmf_meshcreatefromunstruct->proc~esmf_ugridgetvarbyname proc~esmf_scripinq->proc~esmf_logfounderror proc~esmf_vmbarrier->proc~esmf_logfounderror proc~esmf_vmbarrier->proc~esmf_vmgetcurrent c_esmc_vmbarrier c_esmc_vmbarrier proc~esmf_vmbarrier->c_esmc_vmbarrier proc~esmf_imerr ESMF_IMErr proc~esmf_vmbarrier->proc~esmf_imerr proc~esmf_vmgetinit ESMF_VMGetInit proc~esmf_vmbarrier->proc~esmf_vmgetinit proc~esmf_vmgetcurrent->proc~esmf_logfounderror c_esmc_vmgetcurrent c_esmc_vmgetcurrent proc~esmf_vmgetcurrent->c_esmc_vmgetcurrent

Called by

proc~~esmf_meshcreatefromscrip~~CalledByGraph proc~esmf_meshcreatefromscrip ESMF_MeshCreateFromScrip proc~esmf_meshcreatefromfileold ESMF_MeshCreateFromFileOld proc~esmf_meshcreatefromfileold->proc~esmf_meshcreatefromscrip

Source Code

    function ESMF_MeshCreateFromScrip(filename, convertToDual, addUserArea, rc)
!
!
! !RETURN VALUE:
    type(ESMF_Mesh)         :: ESMF_MeshCreateFromScrip
! !ARGUMENTS:
    character(len=*), intent(in)                   :: filename
    logical, intent(in), optional                  :: convertToDual
    logical, intent(in), optional                  :: addUSerArea
    integer, intent(out), optional                 :: rc
!
! !DESCRIPTION:
!   Create a mesh from a grid file defined in SCRIP format or in ESMF Unstructured grid format.
!
!   \begin{description}
!   \item [filename]
!         The name of the grid file
!   \item[convertToDual]
!         if {\tt .true.}, the mesh will be converted to it's dual. If not specified,
!         defaults to .false.
!   \item[addUserArea]
!         if {\tt .true.}, the grid_area defined in the grid file will be added into the mesh.
!         If not specified, defaults to .false.
!   \item [{[rc]}]
!         Return code; equals {\tt ESMF\_SUCCESS} if there are no errors.
!   \end{description}
!
!EOPI
!------------------------------------------------------------------------------
    integer                 :: localrc           ! local return code
    character(len=128)      :: cmd, esmffilename
    integer                 :: PetNo, PetCnt
    integer                 :: scrip_file_len, esmf_file_len
    type(ESMF_VM)           :: vm
    integer                 :: dualflag
    integer                 :: unit
    logical                 :: notavail
    integer                 :: gridRank
    integer,pointer         :: gridDims(:)
    integer                 :: poleVal, minPoleGid, maxPoleGid,poleObjType

    ! Initialize return code; assume failure until success is certain
    localrc = ESMF_RC_NOT_IMPL
    if (present(rc)) rc = ESMF_RC_NOT_IMPL

    ! Default convert to dual
    if (present(convertToDual)) then
       if (convertToDual) then
          dualflag=1
       else
          dualflag=0
       endif
    else
      dualflag=0
    endif

    ! If convertToDual is TRUE, cannot use UserArea because the area defined
    ! in the grid file is not for the dual mesh
    if (present(addUserArea)) then
      if (addUserArea .and. dualflag==1) then
         call ESMF_LogSetError(ESMF_RC_ARG_BAD, &
              msg="- Cannot use user area when convertToDual flag is set to TRUE", &
              ESMF_CONTEXT, rcToReturn=rc)
         return
      endif
    endif

    ! get global vm information
    !
    call ESMF_VMGetCurrent(vm, rc=localrc)
    if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
            ESMF_CONTEXT, rcToReturn=rc)) return

    ! set up local pet info
    call ESMF_VMGet(vm, localPet=PetNo, petCount=PetCnt, rc=localrc)
    if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
            ESMF_CONTEXT, rcToReturn=rc)) return

    esmffilename = ".esmf.nc"

    if (PetNo == 0) then
        ! this is a serial call into C code for now
        call c_ConvertSCRIP(filename, esmffilename,  &
          dualflag, localrc )
       if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
            ESMF_CONTEXT, rcToReturn=rc)) return
    endif
    call ESMF_VMBarrier(vm)
    ESMF_MeshCreateFromScrip=ESMF_MeshCreateFromUnstruct(esmffilename,&
        addUserArea=addUserArea, rc=localrc)
    if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
            ESMF_CONTEXT, rcToReturn=rc)) return
    if (PetNo == 0) then
!      system() is not available on some of the compilers, use open/close to
!      delete the file instead
!      write(cmd, '("/bin/rm ",A)') trim(esmffilename)
!      call system(cmd)
!      First find an available unit numer

       call ESMF_UtilIOUnitGet(unit, rc=rc)
       if (rc==ESMF_SUCCESS) then
          open(unit, FILE=esmffilename,status='unknown')
          close(unit, STATUS='delete')
       endif
    endif

   ! Add pole information, if created from a 2D grid file
    allocate(gridDims(2))
    call ESMF_ScripInq(filename, grid_rank=gridRank, grid_dims=gridDims, rc=localrc)
    if (ESMF_LogFoundError(localrc, &
         ESMF_ERR_PASSTHRU, &
         ESMF_CONTEXT, rcToReturn=rc)) return

    if (gridRank==2) then
       ! Choose which object type to set based on whether this is a dual or not
       poleObjType=1 ! Set elems
       if (dualflag==1) poleObjType=0 ! Elems have been converted to nodes, so set nodes

      ! Set pole val to 4
       poleVal=4
       minPoleGid=1
       maxPoleGid=gridDims(1)
       call C_ESMC_MeshSetPoles(ESMF_MeshCreateFromScrip, poleObjType, &
            poleVal, minPoleGid, maxPoleGid, localrc)
       if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
            ESMF_CONTEXT, rcToReturn=rc)) return

      ! Set pole val to 5
       poleVal=5
       minPoleGid=gridDims(1)*gridDims(2)-gridDims(1)+1
       maxPoleGid=gridDims(1)*gridDims(2)
       call C_ESMC_MeshSetPoles(ESMF_MeshCreateFromScrip, poleObjType, &
            poleVal, minPoleGid, maxPoleGid, localrc)
       if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
            ESMF_CONTEXT, rcToReturn=rc)) return
    endif

    if (associated(gridDims)) deallocate(gridDims)

    ! Output success
    if (present(rc)) rc=ESMF_SUCCESS
    return
end function ESMF_MeshCreateFromScrip