#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