getMeshOnCornersWFieldOnCenter Subroutine

private subroutine getMeshOnCornersWFieldOnCenter(field, maskValues, createdTmpMesh, mesh, turnedOnMeshElemMask, rc)

Arguments

Type IntentOptional Attributes Name
type(ESMF_Field), intent(in) :: field
integer(kind=ESMF_KIND_I4), intent(in), optional :: maskValues(:)
logical, intent(out) :: createdTmpMesh
type(ESMF_Mesh), intent(out) :: mesh
logical, intent(out) :: turnedOnMeshElemMask
integer, intent(out), optional :: rc

Calls

proc~~getmeshoncornerswfieldoncenter~~CallsGraph proc~getmeshoncornerswfieldoncenter getMeshOnCornersWFieldOnCenter esmf_fieldget esmf_fieldget proc~getmeshoncornerswfieldoncenter->esmf_fieldget interface~esmf_xgridget ESMF_XGridGet proc~getmeshoncornerswfieldoncenter->interface~esmf_xgridget proc~conserve_gridtomesh conserve_GridToMesh proc~getmeshoncornerswfieldoncenter->proc~conserve_gridtomesh proc~esmf_logfounderror ESMF_LogFoundError proc~getmeshoncornerswfieldoncenter->proc~esmf_logfounderror proc~esmf_logseterror ESMF_LogSetError proc~getmeshoncornerswfieldoncenter->proc~esmf_logseterror proc~esmf_meshturnoncellmask ESMF_MeshTurnOnCellMask proc~getmeshoncornerswfieldoncenter->proc~esmf_meshturnoncellmask proc~esmf_xgridgetdefault ESMF_XGridGetDefault interface~esmf_xgridget->proc~esmf_xgridgetdefault proc~esmf_xgridgetdg ESMF_XGridGetDG interface~esmf_xgridget->proc~esmf_xgridgetdg proc~esmf_xgridgetele ESMF_XGridGetEle interface~esmf_xgridget->proc~esmf_xgridgetele proc~esmf_xgridgetgb ESMF_XGridGetGB interface~esmf_xgridget->proc~esmf_xgridgetgb proc~esmf_xgridgetgeomobj ESMF_XGridGetGeomObj interface~esmf_xgridget->proc~esmf_xgridgetgeomobj proc~esmf_xgridgetsmmspecfrac ESMF_XGridGetSMMSpecFrac interface~esmf_xgridget->proc~esmf_xgridgetsmmspecfrac proc~conserve_gridtomesh->proc~esmf_logfounderror proc~conserve_gridtomesh->proc~esmf_logseterror proc~conserve_gridtomesh->proc~esmf_meshturnoncellmask interface~esmf_gridget ESMF_GridGet proc~conserve_gridtomesh->interface~esmf_gridget interface~esmf_meshcreate ESMF_MeshCreate proc~conserve_gridtomesh->interface~esmf_meshcreate proc~checkgrid checkGrid proc~conserve_gridtomesh->proc~checkgrid proc~esmf_gridtomesh ESMF_GridToMesh proc~conserve_gridtomesh->proc~esmf_gridtomesh proc~esmf_gridtomeshcell ESMF_GridToMeshCell proc~conserve_gridtomesh->proc~esmf_gridtomeshcell proc~esmf_meshgetmoab ESMF_MeshGetMOAB proc~conserve_gridtomesh->proc~esmf_meshgetmoab 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_meshturnoncellmask->proc~esmf_logfounderror c_esmc_meshturnoncellmask c_esmc_meshturnoncellmask proc~esmf_meshturnoncellmask->c_esmc_meshturnoncellmask interface~esmf_interarraycreate ESMF_InterArrayCreate proc~esmf_meshturnoncellmask->interface~esmf_interarraycreate proc~esmf_interarraydestroy ESMF_InterArrayDestroy proc~esmf_meshturnoncellmask->proc~esmf_interarraydestroy

Called by

proc~~getmeshoncornerswfieldoncenter~~CalledByGraph proc~getmeshoncornerswfieldoncenter getMeshOnCornersWFieldOnCenter proc~esmf_fieldregridstorenx ESMF_FieldRegridStoreNX proc~esmf_fieldregridstorenx->proc~getmeshoncornerswfieldoncenter interface~esmf_fieldregridstore ESMF_FieldRegridStore interface~esmf_fieldregridstore->proc~esmf_fieldregridstorenx

Source Code

    subroutine getMeshOnCornersWFieldOnCenter(field, maskValues, &
         createdTmpMesh, mesh, turnedOnMeshElemMask, rc)
      type(ESMF_Field), intent(in)  :: field
      integer(ESMF_KIND_I4), intent(in),  optional :: maskValues(:)
      logical,          intent(out) :: createdTmpMesh
      type(ESMF_Mesh),  intent(out) :: mesh
      logical,          intent(out) :: turnedOnMeshElemMask
      integer,          intent(out),   optional :: rc 
      
      integer :: localrc
      type(ESMF_GeomType_Flag)  :: geomtype
      type(ESMF_Grid)      :: grid
      type(ESMF_Mesh)      :: tmpMesh
      type(ESMF_MeshLoc)   :: meshloc
      type(ESMF_StaggerLoc) :: staggerLoc
      type(ESMF_XGrid)      :: xgrid

      ! Init variables
      createdTmpMesh=.false.
      turnedOnMeshElemMask=.false.

      ! Get information from field that we need to create the mesh
      call ESMF_FieldGet(field, geomtype=geomtype, rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
           ESMF_CONTEXT, rcToReturn=rc)) return
                
      ! Get the mesh based on the geomtype
      if (geomtype .eq. ESMF_GEOMTYPE_GRID) then

         ! Get information about Grid from Field
         call ESMF_FieldGet(field, grid=grid, &
              staggerloc=staggerloc, rc=localrc)
         if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
              ESMF_CONTEXT, rcToReturn=rc)) return
         
         ! Field needs to be on center
         if (staggerloc .ne. ESMF_STAGGERLOC_CENTER) then
            call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_BAD, & 
                 msg=" conservative regrid methods only supported on Fields built on staggerloc=ESMF_STAGGERLOC_CENTER.", & 
                 ESMF_CONTEXT, rcToReturn=rc) 
            return
         endif

         ! Create Mesh from Grid
         mesh=conserve_GridToMesh(grid, maskValues, &
              turnedOnMeshElemMask, rc=localrc)
         if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
              ESMF_CONTEXT, rcToReturn=rc)) return                            

         ! Record that we created the mesh
         createdTmpMesh=.true.

      else if (geomtype .eq. ESMF_GEOMTYPE_MESH) then

         ! Get mesh and other info from Field
          call ESMF_FieldGet(field, mesh=mesh, meshloc=meshloc, rc=localrc)
          if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
            ESMF_CONTEXT, rcToReturn=rc)) return
               
          ! Error if mesh not built on elemenent location
          if (meshloc .ne. ESMF_MESHLOC_ELEMENT) then
             call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_BAD, & 
                  msg=" conservative regrid methods only supported on Fields built on meshloc=ESMF_MESHLOC_ELEMENT.", & 
                  ESMF_CONTEXT, rcToReturn=rc) 
            return
          endif

          ! Mark that we didn't create it
          createdTmpMesh=.false.

          ! Turn on masking
          if (present(maskValues)) then
             call ESMF_MeshTurnOnCellMask(mesh, maskValues=maskValues, rc=localrc);
             if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
                  ESMF_CONTEXT, rcToReturn=rc)) return
          endif

       else if (geomtype .eq. ESMF_GEOMTYPE_XGRID) then

          ! Get information about XGrid from field
          call ESMF_FieldGet(field, xgrid=xgrid, rc=localrc)
          if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
               ESMF_CONTEXT, rcToReturn=rc)) return
          
          ! Get XGrid Mesh
          call ESMF_XGridGet(xgrid, mesh=mesh, rc=localrc)
          if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
               ESMF_CONTEXT, rcToReturn=rc)) return

          ! Record that we didn't create it
          createdTmpMesh=.false.

       else if (geomtype .eq. ESMF_GEOMTYPE_LOCSTREAM) then
          call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_BAD, & 
               msg=" This regrid method not supported for an ESMF_Field built on an ESMF_LocStream.", & 
               ESMF_CONTEXT, rcToReturn=rc) 
          return              
       else
          call ESMF_LogSetError(rcToCheck=ESMF_RC_ARG_BAD, &
               msg=" Unrecognized geometry type in ESMF Field", &
               ESMF_CONTEXT, rcToReturn=rc)
          return
        endif


    end subroutine getMeshOnCornersWFieldOnCenter