program esmftest use ESMF implicit none integer :: rc integer :: nx, ny, i, j, ubnd(2), lbnd(2) type(ESMF_Field) :: field1, field2 type(ESMF_Grid) :: grid1, grid2 type(ESMF_RouteHandle) :: routehandle real(ESMF_KIND_r8), pointer :: coordX(:,:), coordY(:,:), arrayptr(:,:) ! Initialize ESMF call ESMF_Initialize(defaultCalKind=ESMF_CALKIND_GREGORIAN, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) ! Define 2 grids (4x5 and 5x4 with coordinates) nx = 4 ny = 5 ! Create the 2 grids grid1 = ESMF_GridCreateNoPeriDim(maxIndex=(/nx,ny/), & coordSys=ESMF_COORDSYS_CART, & ! Cartesian coordinates (x,y not lat,lon) coordDep1=(/1,2/), coordDep2=(/1,2/), & ! Use coordDep1=(/1,2/),coordDep2=(/1,2/) for curvilinear grids. indexflag=ESMF_INDEX_GLOBAL, & ! Needed for using XGrid name="Grid1", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) call ESMF_GridAddCoord(grid1, & staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) ! Get the local grid coordinates for X call ESMF_GridGetCoord(grid1, coordDim=1, localDE=0, & staggerloc=ESMF_STAGGERLOC_CENTER, & computationalLBound=lbnd, computationalUBound=ubnd, & farrayPtr=coordX, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) do i=lbnd(1),ubnd(1) do j=lbnd(2),ubnd(2) coordX(i,:) = i end do end do ! Get the local grid coordinates for X call ESMF_GridGetCoord(grid1, coordDim=2, localDE=0, & staggerloc=ESMF_STAGGERLOC_CENTER, & computationalLBound=lbnd, computationalUBound=ubnd, & farrayPtr=coordY, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) do i=lbnd(1),ubnd(1) do j=lbnd(2),ubnd(2) coordY(:,j) = j end do end do nx = 5 ny = 4 ! Create the 2 grids grid2 = ESMF_GridCreateNoPeriDim(maxIndex=(/nx,ny/), & coordSys=ESMF_COORDSYS_CART, & ! Cartesian coordinates (x,y not lat,lon) coordDep1=(/1,2/), coordDep2=(/1,2/), & ! Use coordDep1=(/1,2/),coordDep2=(/1,2/) for curvilinear grids. indexflag=ESMF_INDEX_GLOBAL, & ! Needed for using XGrid name="Grid2", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) call ESMF_GridAddCoord(grid2, & staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) ! Get the local grid coordinates for X call ESMF_GridGetCoord(grid2, coordDim=1, localDE=0, & staggerloc=ESMF_STAGGERLOC_CENTER, & computationalLBound=lbnd, computationalUBound=ubnd, & farrayPtr=coordX, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) do i=lbnd(1),ubnd(1) do j=lbnd(2),ubnd(2) coordX(i,:) = i end do end do ! Get the local grid coordinates for X call ESMF_GridGetCoord(grid2, coordDim=2, localDE=0, & staggerloc=ESMF_STAGGERLOC_CENTER, & computationalLBound=lbnd, computationalUBound=ubnd, & farrayPtr=coordY, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) do i=lbnd(1),ubnd(1) do j=lbnd(2),ubnd(2) coordY(:,j) = j end do end do ! Create the 2 fields field1 = ESMF_FieldCreate(grid=grid1, & typekind=ESMF_TYPEKIND_r8, & staggerloc=ESMF_STAGGERLOC_CENTER, & indexflag=ESMF_INDEX_GLOBAL, & name="field1", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) call ESMF_FieldGet(field1, farrayPtr=arrayptr, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) ! Set all the values to 0 arrayptr = 0.0d0 field2 = ESMF_FieldCreate(grid=grid2, & typekind=ESMF_TYPEKIND_r8, & staggerloc=ESMF_STAGGERLOC_CENTER, & indexflag=ESMF_INDEX_GLOBAL, & name="field1", rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) call ESMF_FieldGet(field2, farrayPtr=arrayptr, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) ! Set all the values to 0 arrayptr = 0.0d0 call ESMF_FieldRegridStore(field1, field2, & unmappedaction=ESMF_UNMAPPEDACTION_IGNORE, & routehandle=routehandle, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) call ESMF_FieldRegrid(field1, field2, & routehandle, rc=rc) if (ESMF_LogFoundError(rcToCheck=rc, msg=ESMF_LOGERR_PASSTHRU, & line=__LINE__, & file=__FILE__)) & call ESMF_Finalize(endflag=ESMF_END_ABORT) call ESMF_Finalize() end program esmftest