module restart_physics 3,17 use shr_kind_mod, only: r8 => shr_kind_r8 use spmd_utils, only: masterproc use ppgrid use phys_grid, only: read_chunk_from_field, write_field_from_chunk, & gather_chunk_to_field use co2_cycle, only: c_i, co2_transport use constituents, only: pcnst use dyn_grid, only: ptimelevels use buffer, only: pblht, tpert, qpert, initialize_buffer use radae, only: abstot_3d, absnxt_3d, emstot_3d, initialize_radbuffer, ntoplw use comsrf, only: sgh, sgh30, landm, trefmxav, trefmnav, & fsnt, flns, fsns, fsds, flnt, initialize_comsrf use ioFileMod use abortutils, only: endrun use units, only: getunit use ioFileMod use camsrfexch_types, only: surface_state use cam_control_mod, only : adiabatic, ideal_phys use cam_logfile, only: iulog use pio, only: file_desc_t, io_desc_t, var_desc_t, & pio_double, pio_noerr, & pio_seterrorhandling, pio_internal_error, pio_bcast_error, & pio_inq_dimid, pio_inq_varname, pio_inq_varid, & pio_def_var, pio_def_dim, & pio_put_att, & pio_write_darray, pio_read_darray implicit none private save ! ! Public interfaces ! public :: write_restart_physics ! Write the physics restart info out public :: read_restart_physics ! Read the physics restart info in public :: get_abs_restart_filepath ! Get the name of the restart filepath public :: init_restart_physics ! ! Private data ! integer :: nrg2 = -1 ! Abs/ems restart dataset unit number character(len=256) :: pname ! Full abs-ems restart filepath ! Filename specifier for restart abs-ems and surface data files ! (%c = caseid, $y = year, $m = month, $d = day, $s = seconds in day, %t = tape number) character(len=256) :: rafilename_spec = '%c.cam2.ra.%y-%m-%d-%s' ! abs-ems restart type(var_desc_t) :: trefmxav_desc, trefmnav_desc, flwds_desc, landm_desc, sgh_desc, & sgh30_desc, solld_desc, co2prog_desc, co2diag_desc, sols_desc, soll_desc, & solsd_desc, fsnt_desc, flns_desc, emstot_desc, absnxt_desc(4), & pblht_desc, tpert_desc, qpert_desc, flnt_desc, fsds_desc, fsns_desc type(var_desc_t) :: bcphidry_desc, bcphodry_desc, ocphidry_desc, ocphodry_desc, & dstdry1_desc, dstdry2_desc, dstdry3_desc, dstdry4_desc type(var_desc_t), pointer :: abstot_desc(:) CONTAINS subroutine init_restart_physics ( File, cam_out, hdimids) 1,19 use cam_pio_utils, only: fillvalue use phys_buffer, only: pbuf_init_restart use dyn_grid, only: get_horiz_grid_dim_d use radiation, only: radiation_do use ppgrid, only: pver, pverp use chemistry, only: chem_init_restart use prescribed_ozone, only: init_prescribed_ozone_restart use prescribed_ghg, only: init_prescribed_ghg_restart use prescribed_aero, only: init_prescribed_aero_restart use prescribed_volcaero, only: init_prescribed_volcaero_restart type(file_desc_t), intent(inout) :: file type(surface_state), intent(in) :: cam_out(begchunk:endchunk) integer,intent(in) :: hdimids(:) integer :: hdimcnt, ierr, hdim1_d, hdim2_d, i, vsize, lwrdim integer :: dimids(4), dimlens(4) integer :: ndims, pver_id, pverp_id integer, pointer :: ldof(:) hdimcnt=size(hdimids) dimids(1:hdimcnt) = hdimids call get_horiz_grid_dim_d(hdim1_d, hdim2_d) call pio_seterrorhandling(File, PIO_BCAST_ERROR) ierr = pio_inq_dimid(File, 'lev', pver_id) call pio_seterrorhandling(File, PIO_INTERNAL_ERROR) if(ierr/=PIO_NOERR) then ierr = pio_def_dim(File, 'lev', pver, pver_id) end if call pio_seterrorhandling(File, PIO_BCAST_ERROR) ierr = pio_inq_dimid(File, 'ilev', pverp_id) call pio_seterrorhandling(File, PIO_INTERNAL_ERROR) if(ierr/=PIO_NOERR) then ierr = pio_def_dim(File, 'ilev', pverp, pverp_id) end if dimlens(1)=hdim1_d dimlens(2)=hdim2_d ndims=hdimcnt ndims=hdimcnt dimlens(hdimcnt+1)=pver ndims=hdimcnt+1 dimlens(hdimcnt+1)=pverp call pbuf_init_restart(File, hdimids, hdim1_d, hdim2_d, pver_id,pverp_id) if ( .not. adiabatic .and. .not. ideal_phys )then call chem_init_restart(File) call init_prescribed_ozone_restart(File) call init_prescribed_ghg_restart(File) call init_prescribed_aero_restart(File) call init_prescribed_volcaero_restart(File) ierr = pio_def_var(File, 'PBLHT', pio_double, hdimids, pblht_desc) ierr = pio_put_att(File, pblht_desc, '_FillValue', fillvalue) ierr = pio_def_var(File, 'TPERT', pio_double, hdimids, tpert_desc) ierr = pio_put_att(File, tpert_desc, '_FillValue', fillvalue) dimlens(hdimcnt+1)=pcnst call pio_seterrorhandling(File, PIO_BCAST_ERROR) ierr = pio_inq_dimid(File, 'pcnst', dimids(hdimcnt+1)) call pio_seterrorhandling(File, PIO_INTERNAL_ERROR) if(ierr/=PIO_NOERR) then ierr = pio_def_dim(File, 'pcnst', pcnst, dimids(hdimcnt+1)) end if ierr = pio_def_var(File, 'QPERT', pio_double, dimids(1:hdimcnt+1), qpert_desc) ierr = pio_put_att(File, qpert_desc, '_FillValue', fillvalue) ierr = pio_def_var(File, 'FSNT', pio_double, hdimids, fsnt_desc) ierr = pio_def_var(File, 'FSNS', pio_double, hdimids, fsns_desc) ierr = pio_def_var(File, 'FSDS', pio_double, hdimids, fsds_desc) ierr = pio_def_var(File, 'FLNT', pio_double, hdimids, flnt_desc) ierr = pio_def_var(File, 'FLNS', pio_double, hdimids, flns_desc) ierr = pio_def_var(File, 'LANDM', pio_double, hdimids, landm_desc) ierr = pio_def_var(File, 'SGH', pio_double, hdimids, sgh_desc) ierr = pio_def_var(File, 'SGH30', pio_double, hdimids, sgh30_desc) ierr = pio_def_var(File, 'TREFMXAV', pio_double, hdimids, trefmxav_desc) ierr = pio_def_var(File, 'TREFMNAV', pio_double, hdimids, trefmnav_desc) ierr = pio_def_var(File, 'FLWDS', pio_double, hdimids, flwds_desc) ierr = pio_def_var(File, 'SOLS', pio_double, hdimids, sols_desc) ierr = pio_def_var(File, 'SOLL', pio_double, hdimids, soll_desc) ierr = pio_def_var(File, 'SOLSD', pio_double, hdimids, solsd_desc) ierr = pio_def_var(File, 'SOLLD', pio_double, hdimids, solld_desc) ierr = pio_def_var(File, 'BCPHIDRY', pio_double, hdimids, bcphidry_desc) ierr = pio_def_var(File, 'BCPHODRY', pio_double, hdimids, bcphodry_desc) ierr = pio_def_var(File, 'OCPHIDRY', pio_double, hdimids, ocphidry_desc) ierr = pio_def_var(File, 'OCPHODRY', pio_double, hdimids, ocphodry_desc) ierr = pio_def_var(File, 'DSTDRY1', pio_double, hdimids, dstdry1_desc) ierr = pio_def_var(File, 'DSTDRY2', pio_double, hdimids, dstdry2_desc) ierr = pio_def_var(File, 'DSTDRY3', pio_double, hdimids, dstdry3_desc) ierr = pio_def_var(File, 'DSTDRY4', pio_double, hdimids, dstdry4_desc) if(co2_transport()) then ierr = pio_def_var(File, 'CO2PROG', pio_double, hdimids, co2prog_desc) ierr = pio_def_var(File, 'CO2DIAG', pio_double, hdimids, co2diag_desc) end if end if if( radiation_do('aeres') ) then vsize = (pverp-ntoplw+1) if(vsize/=pverp) then ierr = pio_def_dim(File, 'lwcols', vsize, dimids(hdimcnt+1)) else dimids(hdimcnt+1) = pverp_id end if ! ! split this into vsize variables to avoid excessive memory usage in IO ! allocate(abstot_desc(ntoplw:pverp)) do i=ntoplw,pverp write(pname,'(a,i3.3)') 'NAL_absorp',i ierr = pio_def_var(File, trim(pname), pio_double, dimids(1:hdimcnt+1), abstot_desc(i)) end do dimids(hdimcnt+1) = pverp_id ierr = pio_def_var(File, 'Emissivity', pio_double, dimids(1:hdimcnt+1), emstot_desc) dimids(hdimcnt+1) = pver_id do i=1,4 write(pname,'(a,i3.3)') 'NN_absorp',i ierr = pio_def_var(File, pname, pio_double, dimids(1:hdimcnt+1), absnxt_desc(i)) end do end if end subroutine init_restart_physics subroutine write_restart_physics (File, cam_out) 1,22 !----------------------------------------------------------------------- use phys_buffer, only: pbuf_write_restart use chemistry, only: chem_write_restart use prescribed_ozone, only: write_prescribed_ozone_restart use prescribed_ghg, only: write_prescribed_ghg_restart use prescribed_aero, only: write_prescribed_aero_restart use prescribed_volcaero,only: write_prescribed_volcaero_restart use radiation, only: radiation_do use cam_pio_utils, only: get_phys_decomp, fillvalue use spmd_utils, only: iam ! ! Input arguments ! type(surface_state), intent(in) :: cam_out(begchunk:endchunk) type(file_desc_t), intent(inout) :: File ! ! Local workspace ! real(r8):: tmpfield(pcols*(endchunk-begchunk+1)) integer :: i, ii, j ! loop index integer :: n3tmp ! timestep index character(len=256) fname ! abs-ems restart filename integer :: ioerr ! I/O status integer :: ncol ! number of vertical columns integer :: size2d integer :: ierr type(io_desc_t), pointer :: iodesc !----------------------------------------------------------------------- ! Physics buffer call pbuf_write_restart(File) if ( .not. adiabatic .and. .not. ideal_phys )then ! data for chemistry call chem_write_restart(File) call write_prescribed_ozone_restart(File) call write_prescribed_ghg_restart(File) call write_prescribed_aero_restart(File) call write_prescribed_volcaero_restart(File) size2d = size(pblht) do i=begchunk,endchunk ncol = cam_out(i)%ncol if(ncol<pcols) then pblht(ncol+1:pcols,i) = fillvalue tpert(ncol+1:pcols,i) = fillvalue qpert(ncol+1:pcols,:,i) = fillvalue fsnt(ncol+1:pcols,i) = fillvalue fsns(ncol+1:pcols,i) = fillvalue fsds(ncol+1:pcols,i) = fillvalue flnt(ncol+1:pcols,i) = fillvalue flns(ncol+1:pcols,i) = fillvalue landm(ncol+1:pcols,i) = fillvalue sgh(ncol+1:pcols,i) = fillvalue sgh30(ncol+1:pcols,i) = fillvalue trefmxav(ncol+1:pcols,i) = fillvalue trefmnav(ncol+1:pcols,i) = fillvalue end if end do ! Buffer module variables call get_phys_decomp(iodesc, 1,pcnst,1,pio_double) call pio_write_darray(File, qpert_desc, iodesc, qpert,ierr) ! the transfer intrinsic function fails if we are writting a 0 sized array, but the call to pio_write_darray ! needs to be made because it is collective. call get_phys_decomp(iodesc, 1,1,1,pio_double) call pio_write_darray(File, pblht_desc, iodesc, pblht, ierr) call pio_write_darray(File, tpert_desc, iodesc, tpert, ierr) ! Comsrf module variables (can following coup_csm definitions be removed?) call pio_write_darray(File, fsnt_desc, iodesc, fsnt, ierr) call pio_write_darray(File, fsns_desc, iodesc, fsns, ierr) call pio_write_darray(File, fsds_desc, iodesc, fsds, ierr) call pio_write_darray(File, flnt_desc, iodesc, flnt, ierr) call pio_write_darray(File, flns_desc, iodesc, flns, ierr) call pio_write_darray(File, landm_desc, iodesc, landm, ierr) call pio_write_darray(File, sgh_desc, iodesc, sgh, ierr) call pio_write_darray(File, sgh30_desc, iodesc, sgh30, ierr) call pio_write_darray(File, trefmxav_desc, iodesc, trefmxav, ierr) call pio_write_darray(File, trefmnav_desc, iodesc, trefmnav, ierr) ii=0 tmpfield(:) = fillvalue do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%flwds(j) end do end do call pio_write_darray(File, flwds_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%sols(j) end do end do call pio_write_darray(File, sols_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%soll(j) end do end do call pio_write_darray(File, soll_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%solsd(j) end do end do call pio_write_darray(File, solsd_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%solld(j) end do end do call pio_write_darray(File, solld_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%bcphidry(j) end do end do call pio_write_darray(File, bcphidry_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%bcphodry(j) end do end do call pio_write_darray(File, bcphodry_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%ocphidry(j) end do end do call pio_write_darray(File, ocphidry_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%ocphodry(j) end do end do call pio_write_darray(File, ocphodry_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%dstdry1(j) end do end do call pio_write_darray(File, dstdry1_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%dstdry2(j) end do end do call pio_write_darray(File, dstdry2_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%dstdry3(j) end do end do call pio_write_darray(File, dstdry3_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%dstdry4(j) end do end do call pio_write_darray(File, dstdry4_desc, iodesc, tmpfield, ierr) if (co2_transport()) then ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%co2prog(j) end do end do call pio_write_darray(File, co2prog_desc, iodesc, tmpfield, ierr) ii=0 do i=begchunk,endchunk ncol = cam_out(i)%ncol do j=1,pcols ii=ii+1 if(j<=ncol) tmpfield(ii) = cam_out(i)%co2diag(j) end do end do call pio_write_darray(File, co2diag_desc, iodesc, tmpfield, ierr) end if end if ! !----------------------------------------------------------------------- ! Write the abs/ems restart dataset if necessary !----------------------------------------------------------------------- ! if ( radiation_do('aeres') ) then do i=begchunk,endchunk ncol = cam_out(i)%ncol if(ncol<pcols) then abstot_3d(ncol+1:pcols,:,:,i) = fillvalue absnxt_3d(ncol+1:pcols,:,:,i) = fillvalue emstot_3d(ncol+1:pcols,:,i) = fillvalue end if end do call get_phys_decomp(iodesc, 1,(pverp-ntoplw+1),1,pio_double) do i=ntoplw,pverp call pio_write_darray(File, abstot_desc(i), iodesc, abstot_3d(:,:,i,:), ierr) end do if(ntoplw/=1) then call get_phys_decomp(iodesc, 1,pverp,1,pio_double) end if call pio_write_darray(File, emstot_desc, iodesc, emstot_3d, ierr) call get_phys_decomp(iodesc, 1,pver,1,pio_double) do i=1,4 call pio_write_darray(File, absnxt_desc(i), iodesc, absnxt_3d(:,:,i,:), ierr) end do deallocate(abstot_desc) end if end subroutine write_restart_physics !####################################################################### subroutine read_restart_physics (File, cam_out) 1,25 !----------------------------------------------------------------------- use phys_buffer, only: pbuf_allocate, pbuf_read_restart use chemistry, only: chem_read_restart use cam_pio_utils, only: get_phys_decomp, fillvalue use radiation, only: radiation_do use prescribed_ozone, only: read_prescribed_ozone_restart use prescribed_ghg, only: read_prescribed_ghg_restart use prescribed_aero, only: read_prescribed_aero_restart use prescribed_volcaero,only: read_prescribed_volcaero_restart ! ! Arguments ! type(file_desc_t), intent(inout) :: File type(surface_state), pointer :: cam_out(:) ! Output from CAM to surface ! ! Local workspace ! real(r8), allocatable :: tmpfield(:) integer :: i, c, ii ! loop index integer :: n3tmp ! timestep index character*80 locfn ! Local filename integer :: ioerr ! I/O status integer :: ncol ! number of columns in a chunk type(io_desc_t), pointer :: iodesc type(var_desc_t) :: vardesc integer :: ierr, csize, vsize !----------------------------------------------------------------------- ! Allocate memory in physics buffer, buffer, comsrf, and radbuffer modules. ! (This is done in subroutine initial_conds for an initial run.) call pbuf_allocate('global') call initialize_buffer() call initialize_comsrf() call initialize_radbuffer() ! Physics buffer call pbuf_read_restart(File) csize=endchunk-begchunk+1 if ( .not. adiabatic .and. .not. ideal_phys )then ! data for chemistry call chem_read_restart(File) call read_prescribed_ozone_restart(File) call read_prescribed_ghg_restart(File) call read_prescribed_aero_restart(File) call read_prescribed_volcaero_restart(File) allocate(tmpfield(pcols*pcnst*csize)) tmpfield(:)=fillvalue ! Buffer module variables call get_phys_decomp(iodesc,1,pcnst,1,pio_double) ierr = pio_inq_varid(File, 'QPERT', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) qpert(:,:,:) = reshape(tmpfield, (/pcols, pcnst, csize/)) deallocate(tmpfield) allocate(tmpfield(pcols*csize)) tmpfield(:)=fillvalue call get_phys_decomp(iodesc,1,1,1,pio_double) ierr = pio_inq_varid(File, 'PBLHT', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) pblht(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'TPERT', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) tpert(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'FSNT', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) fsnt(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'FSNS', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) fsns(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'FSDS', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) fsds(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'FLNT', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) flnt(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'FLNS', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) flns(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'LANDM', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) landm(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'SGH', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) sgh(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'SGH30', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) sgh30(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'TREFMXAV', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) trefmxav(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'TREFMNAV', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) trefmnav(:,:) = reshape(tmpfield, (/pcols, csize/)) ierr = pio_inq_varid(File, 'FLWDS', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%flwds(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'SOLS', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%sols(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'SOLL', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%soll(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'SOLSD', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%solsd(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'SOLLD', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%solld(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'BCPHIDRY', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%bcphidry(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'BCPHODRY', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%bcphodry(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'OCPHIDRY', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%ocphidry(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'OCPHODRY', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%ocphodry(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'DSTDRY1', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%dstdry1(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'DSTDRY2', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%dstdry2(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'DSTDRY3', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%dstdry3(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'DSTDRY4', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%dstdry4(i) = tmpfield(ii) end do end do if (co2_transport()) then ierr = pio_inq_varid(File, 'CO2PROG', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%co2prog(i) = tmpfield(ii) end do end do ierr = pio_inq_varid(File, 'CO2DIAG', vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) ii=0 do c=begchunk,endchunk do i=1,pcols ii=ii+1 cam_out(c)%co2diag(i) = tmpfield(ii) end do end do end if deallocate(tmpfield) end if ! !----------------------------------------------------------------------- ! Read the abs/ems restart dataset if necessary !----------------------------------------------------------------------- ! if ( radiation_do('aeres') ) then call pio_seterrorhandling( File, PIO_BCAST_ERROR) ierr = pio_inq_varid(File, 'Emissivity', vardesc) call pio_seterrorhandling( File, PIO_INTERNAL_ERROR) if(ierr/=PIO_NOERR) then if(masterproc) write(iulog,*) 'Warning: Emissivity variable not found on restart file.' return end if call get_phys_decomp(iodesc,1,pverp,1,pio_double) allocate(tmpfield(pcols*pverp*csize)) tmpfield(:)=fillvalue call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) emstot_3d = reshape(tmpfield, (/pcols, pverp, csize/)) vsize = pverp-ntoplw+1 if(vsize/=pverp) then deallocate(tmpfield) call get_phys_decomp(iodesc,1,(pverp-ntoplw+1),1,pio_double) allocate(tmpfield(pcols*vsize*csize)) end if tmpfield(:)=fillvalue do i=ntoplw,pverp write(pname,'(a,i3.3)') 'NAL_absorp',i ierr = pio_inq_varid(File, trim(pname), vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) abstot_3d(:,:,i,:) = reshape(tmpfield, (/pcols, vsize, csize/)) end do deallocate(tmpfield) call get_phys_decomp(iodesc,1,pver,1,pio_double) allocate(tmpfield(pcols*pver*csize)) tmpfield(:)=fillvalue do i=1,4 write(pname,'(a,i3.3)') 'NN_absorp',i ierr = pio_inq_varid(File, trim(pname), vardesc) call pio_read_darray(File, vardesc, iodesc, tmpfield, ierr) absnxt_3d(:,:,i,:) = reshape(tmpfield, (/pcols, pver, csize/)) end do deallocate(tmpfield) end if end subroutine read_restart_physics character(len=256) function get_abs_restart_filepath ( ) 1 ! ! Return the full filepath to the abs-ems restart file ! get_abs_restart_filepath = pname end function get_abs_restart_filepath end module restart_physics