#define _FILE 'control/readinitial.F90 '
module readinitial 1
public :: read_initial
contains
subroutine read_initial(ncid) 1,18
!-----------------------------------------------------------------------
!
! Purpose: Ensure that requisite netcdf variables are on the initial dataset.
! Set base day and date info using the "current" values from it.
!
! Method: Issue proper netcdf wrapper calls. Broadcast to slaves if SPMD
!
! Author: CCM Core Group
!
!-----------------------------------------------------------------------
use shr_kind_mod
, only: r8 => shr_kind_r8
use spmd_utils
, only: masterproc
use pmgrid
, only: plev, plat, plon, plevp
use pspect
use rgrid
use abortutils
, only: endrun
use hycoef
, only: read_restart_hycoef
use error_messages
, only: handle_ncerr
use scamMod
, only: single_column
use cam_logfile
, only: iulog
use pio, only : pio_inq_dimlen, pio_inq_varid, pio_inq_dimid, &
var_desc_t, pio_internal_error, pio_noerr, pio_bcast_error, &
pio_seterrorhandling, file_desc_t
use dycore
, only : dycore_is
#if ( defined SPMD )
use mpishorthand
#endif
!-----------------------------------------------------------------------
implicit none
!------------------------------Parameters-------------------------------
!
! Arguments
!
type(file_desc_t), intent(inout) :: ncid ! History file unit
!
! Local variables
!
integer :: j
integer :: lonid !------------------------------------------------------
integer :: levid !
integer :: latid !
type(var_desc_t) :: ntrkid !
type(var_desc_t) :: ntrmid !
type(var_desc_t) :: ntrnid !
type(var_desc_t) :: ncdateid ! PIO variable and dimension ids for variable of that
type(var_desc_t) :: ncsecid ! name with "id" tacked on to the end
type(var_desc_t) :: hyaiid !
type(var_desc_t) :: hybiid !
type(var_desc_t) :: hyamid !
type(var_desc_t) :: hybmid !
integer :: ilev !
integer :: ilevid !
integer :: rlonid !
type(var_desc_t) :: nlonid !
type(var_desc_t) :: wnummaxid !------------------------------------------------------
integer :: mlon ! longitude dimension length from dataset
integer :: mlev ! level dimension length from dataset
integer :: morec ! latitude dimension length from dataset
integer :: slonid ! staggered longitude dimension length from dataset
integer :: slatid ! staggered latitude dimension length from dataset
integer :: ncollen
integer :: ierr
logical :: isncol
!
!-----------------------------------------------------------------------
!
isncol = .false.
! Tells pio to communicate any error to all tasks so that it can be handled locally
! otherwise and by default pio error are handled internally.
call pio_seterrorhandling( ncid, PIO_BCAST_ERROR)
ierr = PIO_inq_dimid( ncid, 'ncol', lonid)
call pio_seterrorhandling( ncid, PIO_INTERNAL_ERROR)
if(ierr==PIO_NOERR) then
isncol=.true.
ierr = PIO_inq_dimlen (ncid, lonid , ncollen)
else
!
! Get and check dimension/date info
!
ierr = PIO_inq_dimid (ncid, 'lon' , lonid)
ierr = PIO_inq_dimid (ncid, 'lat' , latid)
if(dycore_is
('LR')) then
ierr = PIO_inq_dimid (ncid, 'slon' , slonid)
ierr = PIO_inq_dimid (ncid, 'slat' , slatid)
end if
ierr = PIO_inq_dimlen (ncid, lonid , mlon)
ierr = PIO_inq_dimlen (ncid, latid , morec)
endif
ierr = PIO_inq_dimid (ncid, 'lev' , levid)
ierr = PIO_inq_dimid (ncid, 'ilev', ilevid)
!
ierr = PIO_inq_dimlen (ncid, levid , mlev)
ierr = PIO_inq_dimlen (ncid, ilevid, ilev)
!
ierr = PIO_inq_varid (ncid, 'ntrk' , ntrkid)
ierr = pio_inq_varid (ncid, 'ntrm' , ntrmid)
ierr = pio_inq_varid (ncid, 'ntrn' , ntrnid)
ierr = pio_inq_varid (ncid, 'date' , ncdateid)
ierr = pio_inq_varid (ncid, 'datesec', ncsecid)
!
! Reduced grid is not supported
!
wnummax(:) = ptrm
nlon (:) = plon
if(isncol) then
if(mlev /= plev ) then
write(iulog,*)'READINITIAL: model parameters do not match initial dataset parameters'
write(iulog,*)'Model Parameters: plev = ',plev
write(iulog,*)'Dataset Parameters: dlev = ',mlev
call endrun
(_FILE)
end if
else if (single_column) then
if (mlev /= plev) then
write(iulog,*)'READINITIAL: model parameters for single column run do not match initial dataset parameters'
write(iulog,*)'Model Parameters: plev = ',plev,' plon = ',plon,' plat = ',plat
write(iulog,*)'Dataset Parameters: dlev = ',mlev,' dlon = ',mlon,' dlat = ',morec
call endrun
(_FILE)
endif
else if (mlev /= plev.or.mlon /= plon.or.morec /= plat) then
write(iulog,*)'READINITIAL: model parameters do not match initial dataset parameters'
write(iulog,*)'Model Parameters: plev = ',plev,' plon = ',plon,' plat = ',plat
write(iulog,*)'Dataset Parameters: dlev = ',mlev,' dlon = ',mlon,' dlat = ',morec
call endrun
(_FILE)
end if
call read_restart_hycoef
(ncid)
#if ( defined SPMD )
!
! Initialize SPMD decompositions
!
call decompinit
()
#endif
return
end subroutine read_initial
end module readinitial