Program utDistIO
use ESMF_Mod
use GEOS_BaseMod
use GEOS_CommsMod
use m_zeit
implicit NONE
type(ESMF_Grid) :: grid
type (ESMF_VM) :: VM
type(ESMF_DELayout) :: layout
integer :: IM_WORLD = 288*4, JM_WORLD = 181*4, KM_WORLD = 72 ! globalc72
integer :: i, j, k, im, jm, km ! local
integer :: lu 10
character(len=*), parameter :: &
dirname = '/lscr1/dasilva'
real :: gArr(:,:), dArr(:,:)
integer :: status, rc, ntimes = 500
logical :: IamRoot
character(len=*), parameter :: Iam = 'utDistIO'
! -----
call test_main()
CONTAINS
subroutine test_main()
! Initialize framework
! --------------------
call ESMF_Initialize (vm=vm, rc=status)
_VERIFY(status)
IamRoot = GEOS_am_I_root()
! Get the global vm
! -----------------
call ESMF_VMGetGlobal(vm, rc=status)
_VERIFY(status)
! Create a grid
! -------------
grid = MyGridCreate_ ( vm, rc=status )
_VERIFY(status)
! Get local im, jm
! ----------------
if ( IamRoot ) print *, 'Hello, World'
! Allocate and write global array
! -------------------------------
if ( IamRoot ) then
allocate(gArr(IM_WORLD,JM_WORLD))
gArr = 1.0;
open(lu,filen=dirname//'/global.dat')
do n = 1, ntimes
write(lu) gArr
end do
close(lu)
end if
! Next, scatter array
! -------------------
call
! All done
! --------
call ESMF_Finalize ( status )
_VERIFY(STATUS)
end subroutine test_main
!........................................................................
function MyGridCreate_ ( vm, rc) result(grid)
type (ESMF_VM), intent(IN ) :: VM
integer, optional, intent(OUT) :: rc
type (ESMF_Grid) :: grid
! Local vars
integer :: status
character(len=ESMF_MAXSTR), parameter :: IAm='MyGridCreate'
integer :: LM
integer :: L
integer :: NX, NY
integer, allocatable :: IMXY(:), JMXY(:)
character(len=ESMF_MAXSTR) :: gridname
real(ESMF_KIND_R8) :: minCoord(3)
real(ESMF_KIND_R8) :: deltaX, deltaY, deltaZ
real :: LON0, LAT0
real :: pi, d2r
! grid create
lm = KM_WORLD ! no. vertical layers
nx = 2
ny = 2
pi = 4.0 * atan ( 1.0 )
d2r = pi / 180.
LON0 = -180 * d2r
LAT0 = -90.0 * d2r
! Get the IMXY vector
! -------------------
allocate( imxy(0:nx-1) )
call GEOS_GET_LOCAL_DIMS ( IM_WORLD, imxy, nx )
! Get the JMXY vector
! -------------------
allocate( jmxy(0:ny-1) )
call GEOS_GET_LOCAL_DIMS ( JM_WORLD, jmxy, ny )
deltaX = 2.0*pi/IM_WORLD
deltaY = pi/(JM_WORLD-1)
deltaZ = 1.0
if ( GEOS_Am_I_Root() ) then
print *, 'nx : imxy = ', nx, ' : ', imxy
print *, 'ny : jmxy = ', ny, ' : ', jmxy
endif
! Define South-West Corner of First Grid-Box
! ------------------------------------------
minCoord(1) = LON0 - deltaX/2
minCoord(2) = LAT0 - deltaY/2
minCoord(3) = deltaZ/2.
layout = ESMF_DELayoutCreate(vm, deCountList=(/NX, NY/), rc=status)
_VERIFY(STATUS)
grid = ESMF_GridCreateHorzLatLonUni( &
counts = (/IM_WORLD, JM_WORLD/), &
minGlobalCoordPerDim=minCoord(1:2), &
deltaPerDim=(/deltaX, deltaY /), &
horzStagger=ESMF_Grid_Horz_Stagger_A, &
periodic=(/ESMF_TRUE, ESMF_FALSE/), &
name='Beatrice', rc=status)
_VERIFY(STATUS)
call ESMF_GridAddVertHeight(grid, &
delta=(/(deltaZ, L=1,LM) /), &
rc=status)
_VERIFY(STATUS)
call ESMF_GridDistribute(grid, &
deLayout=layout, &
countsPerDEDim1=imxy, &
countsPerDEDim2=jmxy, &
rc=status)
_VERIFY(STATUS)
deallocate(imxy)
deallocate(jmxy)
_RETURN(STATUS)
end function MyGridCreate_
end Program utDistIO