utCFIO Program

Uses

  • program~~utcfio~3~~UsesGraph program~utcfio~3 utCFIO ESMF_Mod ESMF_Mod program~utcfio~3->ESMF_Mod module~esmf_cfiomod ESMF_CFIOMod program~utcfio~3->module~esmf_cfiomod module~mapl_basemod MAPL_BaseMod program~utcfio~3->module~mapl_basemod module~mapl_cfiomod MAPL_CFIOMod program~utcfio~3->module~mapl_cfiomod module~mapl_commsmod MAPL_CommsMod program~utcfio~3->module~mapl_commsmod

Calls

program~~utcfio~3~~CallsGraph program~utcfio~3 utCFIO proc~test_main~5 test_main program~utcfio~3->proc~test_main~5 esmf_bundlecreate esmf_bundlecreate proc~test_main~5->esmf_bundlecreate esmf_calendarsetdefault esmf_calendarsetdefault proc~test_main~5->esmf_calendarsetdefault esmf_clockcreate esmf_clockcreate proc~test_main~5->esmf_clockcreate esmf_finalize esmf_finalize proc~test_main~5->esmf_finalize esmf_initialize esmf_initialize proc~test_main~5->esmf_initialize esmf_timeintervalset esmf_timeintervalset proc~test_main~5->esmf_timeintervalset esmf_timeset esmf_timeset proc~test_main~5->esmf_timeset esmf_vmgetglobal esmf_vmgetglobal proc~test_main~5->esmf_vmgetglobal interface~esmf_iocreate ESMF_ioCreate proc~test_main~5->interface~esmf_iocreate interface~esmf_iodestroy ESMF_ioDestroy proc~test_main~5->interface~esmf_iodestroy interface~esmf_ioread ESMF_ioRead proc~test_main~5->interface~esmf_ioread interface~esmf_iowrite ESMF_ioWrite proc~test_main~5->interface~esmf_iowrite interface~mapl_am_i_root MAPL_Am_I_Root proc~test_main~5->interface~mapl_am_i_root mapl_verify mapl_verify proc~test_main~5->mapl_verify proc~mygridcreate_~5 MyGridCreate_ proc~test_main~5->proc~mygridcreate_~5 proc~mapl_cfiodestroy MAPL_CFIODestroy interface~esmf_iodestroy->proc~mapl_cfiodestroy proc~mygridcreate_~5->interface~mapl_am_i_root proc~mygridcreate_~5->mapl_verify esmf_delayoutcreate esmf_delayoutcreate proc~mygridcreate_~5->esmf_delayoutcreate esmf_gridaddvertheight esmf_gridaddvertheight proc~mygridcreate_~5->esmf_gridaddvertheight esmf_gridcreatehorzlatlonuni esmf_gridcreatehorzlatlonuni proc~mygridcreate_~5->esmf_gridcreatehorzlatlonuni esmf_griddistribute esmf_griddistribute proc~mygridcreate_~5->esmf_griddistribute mapl_get_local_dims mapl_get_local_dims proc~mygridcreate_~5->mapl_get_local_dims mapl_return mapl_return proc~mygridcreate_~5->mapl_return proc~esmf_cfiodestroy ESMF_CFIODestroy proc~mapl_cfiodestroy->proc~esmf_cfiodestroy proc~esmf_cfiofileclose ESMF_CFIOFileClose proc~mapl_cfiodestroy->proc~esmf_cfiofileclose proc~mapl_return MAPL_Return proc~mapl_cfiodestroy->proc~mapl_return proc~mapl_verify MAPL_Verify proc~mapl_cfiodestroy->proc~mapl_verify

Variables

Type Attributes Name Initial
character(len=*), parameter :: Iam = 'utCFIO'
character(len=*), parameter :: dirname = '/share/dasilva/fvInput/fvchem/c/aero_clm'
character(len=*), parameter :: fFilename = dirname//'/gfedv2.aero.eta.200207clm.hdf'
character(len=255) :: fname
integer :: IM_WORLD = 288
integer :: JM_WORLD = 181
integer :: KM_WORLD = 72
integer :: i
integer :: im
integer :: j
integer :: jm
integer :: k
integer :: km
integer, pointer :: levels(:)
integer :: nbits
integer :: nhms
integer :: nymd
integer :: rc
integer, pointer :: resolution(:)
integer :: status
logical :: IamRoot
type(ESMF_Bundle) :: dBundle
type(ESMF_Bundle) :: fBundle
type(ESMF_CFIO) :: cfio
type(ESMF_Clock) :: dClock
type(ESMF_Clock) :: fClock
type(ESMF_DELayout) :: layout
type(ESMF_Grid) :: grid
type(ESMF_Time) :: dTime
type(ESMF_Time) :: fTime
type(ESMF_TimeInterval) :: dTimeStep
type(ESMF_TimeInterval) :: fTimeStep
type(ESMF_VM) :: VM

Functions

function MyGridCreate_(VM, rc) result(grid)

Arguments

Type IntentOptional Attributes Name
type(ESMF_VM), intent(in) :: VM
integer, intent(out), optional :: rc

Return Value type(ESMF_Grid)


Subroutines

subroutine test_main()

Arguments

None

Source Code

   Program utCFIO

   use ESMF_Mod

   use MAPL_BaseMod
   use MAPL_CommsMod

   use ESMF_CfioMod
   use MAPL_CfioMod

   implicit NONE

   type(ESMF_Grid)     :: grid
   type (ESMF_VM)      :: VM
   type(ESMF_DELayout) :: layout

   integer             :: nymd, nhms
   type(ESMF_Time)     :: fTime, dTime
   type(ESMF_TimeInterval)  :: fTimeStep, dTimeStep
   type(ESMF_Clock)    :: fClock, dClock

   type(ESMF_Bundle)   :: fBundle, dBundle

   type(ESMF_CFIO) :: cfio

   integer :: IM_WORLD = 288, JM_WORLD = 181, KM_WORLD = 72   ! globalc72
   integer :: i, j, k, im, jm, km                                      ! local

   character(len=*), parameter :: &
       dirname = '/share/dasilva/fvInput/fvchem/c/aero_clm',       &
     fFilename = dirname // '/gfedv2.aero.eta.200207clm.hdf'
   character(len=255) :: fname ! output file name

   integer :: status, rc, nbits
   logical :: IamRoot
   integer, pointer :: resolution(:), levels(:)

   character(len=*), parameter :: Iam = 'utCFIO'

!                             -----
    
    call test_main()

CONTAINS

    subroutine test_main()

!   Initialize framework
!   --------------------
    call ESMF_Initialize (vm=vm, rc=status)
    _VERIFY(status)

    IamRoot = MAPL_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)

!   Create empty bundles
!   --------------------
    fBundle = ESMF_BundleCreate ( name='Francesca', grid=grid, rc=status )
    _VERIFY(status)
    dBundle = ESMF_BundleCreate ( name='Denise',    grid=grid, rc=status )
    _VERIFY(status)

!   Set the time as the one on the hardwired file name
!   --------------------------------------------------
    call ESMF_CalendarSetDefault ( ESMF_CAL_GREGORIAN, rc=status )
    _VERIFY(STATUS)
    call ESMF_TimeSet( fTime, yy=2002, mm=7, dd=15, h=12, m=0, s=0, rc=status )
    _VERIFY(STATUS)
    call ESMF_TimeIntervalSet( fTimeStep, h=6, m=0, s=0, rc=status )
    _VERIFY(STATUS)
    fClock = ESMF_ClockCreate ( name="Clovis", timeStep=fTimeStep, &
                                startTime=fTime, rc=status )
    _VERIFY(STATUS)

!   Read Bundle from file on a clean slate
!   --------------------------------------
    if ( IamRoot ) print *, 'Reading ' // fFilename
    call ESMF_ioRead  ( fFilename, fTime, fBundle, rc=status, &
                        verbose=.true., force_regrid=.true.   )
    _VERIFY(status)

!   Setup data types need for write
!   -------------------------------
    allocate ( resolution(2), levels(KM_WORLD), stat=status )
    _VERIFY(status)
    resolution = (/ IM_WORLD/2, JM_WORLD/2 /)
    levels     = (/ (k, k=1,KM_WORLD) /)

!   Write the same bundle to a different file, each time with
!    different precision
!   ----------------------------------------------------------
     nbits = 32 ! full precision
     write(fname,"('test.aero.eta.',I2.2)") nbits

     call ESMF_ioCreate ( cfio, fname, fClock, fBundle, fTimeStep, &
                          resolution, levels, 'Bundle Write Test', rc=status )
     _VERIFY(status)

     call ESMF_ioWrite ( cfio, fClock, fBundle, fTimeStep, levels, rc=status, &
                         verbose = .true. ) ! omit nbits
     _VERIFY(status)

     call ESMF_ioDestroy ( cfio )

    do nbits = 16, 8, -2

     write(fname,"('test.aero.eta.',I2.2)") nbits

     call ESMF_ioCreate ( cfio, fname, fClock, fBundle, fTimeStep, &
                          resolution, levels, 'Bundle Write Test', rc=status )
     _VERIFY(status)

     call ESMF_ioWrite ( cfio, fClock, fBundle, fTimeStep, levels, rc=status, &
                         nbits = nbits, verbose = .true. )
     _VERIFY(status)

     call ESMF_ioDestroy ( cfio )

    end do ! precision loop

!   All done
!   --------
    call ESMF_Finalize ( rc=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 MAPL_GET_LOCAL_DIMS ( IM_WORLD, imxy, nx )

! Get the JMXY vector
! -------------------
    allocate( jmxy(0:ny-1) )  
    call MAPL_GET_LOCAL_DIMS ( JM_WORLD, jmxy, ny )

    deltaX = 2.0*pi/IM_WORLD
    deltaY = pi/(JM_WORLD-1)
    deltaZ = 1.0

    if ( MAPL_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 utCFIO