LCOV - code coverage report
Current view: | top level - control - cam_restart.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 46 | 49 | 93.9 %
Date: | 2025-01-13 21:54:50 |  | Functions: | 3 | 3 | 100.0 %

              Line data    Source code
           1             : module cam_restart
           2             :
           3             : ! Coordinate reading and writing of restart files.
           4             :
           5             : use shr_kind_mod,     only: cl=>shr_kind_cl
           6             : use spmd_utils,       only: masterproc
           7             : use cam_control_mod,  only: restart_run, caseid
           8             : use ioFileMod,        only: opnfil
           9             : use camsrfexch,       only: cam_in_t, cam_out_t
          10             : use dyn_comp,         only: dyn_import_t, dyn_export_t
          11             : use physics_buffer,   only: physics_buffer_desc
          12             : use units,            only: getunit, freeunit
          13             : use pio,              only: file_desc_t, pio_global, pio_enddef, &
          14             :                             pio_put_att, pio_closefile
          15             :
          16             : use cam_logfile,      only: iulog
          17             : use cam_abortutils,   only: endrun
          18             : use ionosphere_interface, only: ionosphere_init_restart, ionosphere_write_restart, ionosphere_read_restart
          19             :
          20             : implicit none
          21             : private
          22             : save
          23             :
          24             : public :: &
          25             :    cam_write_restart,  &  ! Driver for writing restart files
          26             :    cam_read_restart       ! Driver for reading restart files
          27             :
          28             : !=========================================================================================
          29             : contains
          30             : !=========================================================================================
          31             :
          32        2304 : subroutine cam_read_restart(cam_in, cam_out, dyn_in, dyn_out, pbuf2d, &
          33             :                             stop_ymd, stop_tod)
          34             :
          35             :    use cam_initfiles,    only: initial_file_get_id
          36             :    use restart_dynamics, only: read_restart_dynamics
          37             :    use restart_physics,  only: read_restart_physics
          38             :    use camsrfexch,       only: atm2hub_alloc, hub2atm_alloc
          39             :    use cam_history,      only: read_restart_history
          40             :    use cam_pio_utils,    only: clean_iodesc_list
          41             :
          42             :    ! Arguments
          43             :    type(cam_in_t),            pointer       :: cam_in(:)
          44             :    type(cam_out_t),           pointer       :: cam_out(:)
          45             :    type(dyn_import_t),        intent(inout) :: dyn_in
          46             :    type(dyn_export_t),        intent(inout) :: dyn_out
          47             :    type(physics_buffer_desc), pointer       :: pbuf2d(:,:)
          48             :    integer,                   intent(in)    :: stop_ymd       ! Stop date (YYYYMMDD)
          49             :    integer,                   intent(in)    :: stop_tod       ! Stop time of day (sec)
          50             :
          51             :    ! Local workspace
          52             :    type(file_desc_t), pointer :: fh_ini
          53             :
          54             :    character(len=*), parameter :: sub = 'cam_read_restart'
          55             :    !---------------------------------------------------------------------------
          56             :
          57             :    ! get filehandle pointer to primary restart file
          58         768 :    fh_ini => initial_file_get_id()
          59             :
          60         768 :    call read_restart_dynamics(fh_ini, dyn_in, dyn_out)
          61         768 :    call ionosphere_read_restart(fh_ini)
          62             :
          63         768 :    call hub2atm_alloc(cam_in)
          64         768 :    call atm2hub_alloc(cam_out)
          65             :
          66         768 :    call read_restart_physics(fh_ini, cam_in, cam_out, pbuf2d)
          67             :
          68         768 :    if (restart_run) then
          69         768 :       call read_restart_history (fh_ini)
          70             :    end if
          71             :
          72         768 :    call clean_iodesc_list()
          73             :
          74         768 : end subroutine cam_read_restart
          75             :
          76             : !=========================================================================================
          77             :
          78        1536 : subroutine cam_write_restart(cam_in, cam_out, dyn_out, pbuf2d, &
          79             :                              yr_spec, mon_spec, day_spec, sec_spec )
          80             :
          81         768 :    use filenames,        only: interpret_filename_spec
          82             :    use cam_pio_utils,    only: cam_pio_createfile, cam_pio_set_fill
          83             :    use restart_dynamics, only: write_restart_dynamics, init_restart_dynamics
          84             :    use restart_physics,  only: write_restart_physics, init_restart_physics
          85             :    use cam_history,      only: write_restart_history, init_restart_history
          86             :    use cam_instance,     only: inst_suffix
          87             :
          88             :    ! Arguments
          89             :    type(cam_in_t),          intent(in) :: cam_in(:)
          90             :    type(cam_out_t),         intent(in) :: cam_out(:)
          91             :    type(dyn_export_t),      intent(in) :: dyn_out
          92             :    type(physics_buffer_desc), pointer  :: pbuf2d(:,:)
          93             :    integer,       optional, intent(in) :: yr_spec         ! Simulation year
          94             :    integer,       optional, intent(in) :: mon_spec        ! Simulation month
          95             :    integer,       optional, intent(in) :: day_spec        ! Simulation day
          96             :    integer,       optional, intent(in) :: sec_spec        ! Seconds into current simulation day
          97             :
          98             :    ! Local workspace
          99             :    character(len=cl) :: rfilename_spec ! filename specifier for primary restart file
         100             :    character(len=cl) :: fname  ! Restart filename
         101             :    type(file_desc_t) :: fh
         102             :    integer           :: ierr
         103             :    !-----------------------------------------------------------------------
         104             :
         105             :    ! Set template for primary restart filename based on instance suffix
         106             :    ! (%c = caseid, $y = year, $m = month, $d = day, $s = seconds in day, %t = number)
         107        1536 :    rfilename_spec = '%c.cam' // trim(inst_suffix) //'.r.%y-%m-%d-%s.nc'
         108             :
         109        1536 :    if (present(yr_spec).and.present(mon_spec).and.present(day_spec).and.present(sec_spec)) then
         110             :       fname = interpret_filename_spec( rfilename_spec, &
         111        1536 :               yr_spec=yr_spec, mon_spec=mon_spec, day_spec=day_spec, sec_spec= sec_spec )
         112             :    else
         113           0 :       fname = interpret_filename_spec( rfilename_spec )
         114             :    end if
         115             :
         116        1536 :    call cam_pio_createfile(fh, trim(fname), 0)
         117        1536 :    ierr = cam_pio_set_fill(fh)
         118        1536 :    call init_restart_dynamics(fh, dyn_out)
         119        1536 :    call ionosphere_init_restart(fh)
         120        1536 :    call init_restart_physics(fh, pbuf2d)
         121        1536 :    call init_restart_history(fh)
         122             :
         123        1536 :    ierr = pio_put_att(fh, pio_global, 'caseid', caseid)
         124             :
         125        1536 :    ierr = pio_enddef(fh)
         126             :
         127             :    !-----------------------------------------------------------------------
         128             :    ! Dynamics, physics, History
         129             :    !-----------------------------------------------------------------------
         130             :
         131        1536 :    call write_restart_dynamics(fh, dyn_out)
         132        1536 :    call ionosphere_write_restart(fh)
         133        1536 :    call write_restart_physics(fh, cam_in, cam_out, pbuf2d)
         134             :
         135             :    if (present(yr_spec).and.present(mon_spec).and.&
         136        1536 :       present(day_spec).and.present(sec_spec)) then
         137             :       call write_restart_history(fh, yr_spec=yr_spec, mon_spec=mon_spec, &
         138        1536 :                                  day_spec=day_spec, sec_spec= sec_spec )
         139             :    else
         140           0 :       call write_restart_history(fh)
         141             :    end if
         142             :
         143             :    ! Close the primary restart file
         144        1536 :    call pio_closefile(fh)
         145             :
         146             :    ! Update the restart pointer file
         147        1536 :    call write_rest_pfile(fname)
         148             :
         149        3072 : end subroutine cam_write_restart
         150             :
         151             : !========================================================================================
         152             :
         153        1536 : subroutine write_rest_pfile(restart_file)
         154             :
         155             :    ! Write the restart pointer file
         156             :
         157        1536 :    use cam_initfiles, only: rest_pfile
         158             :
         159             :    character(len=*), intent(in) :: restart_file
         160             :
         161             :    integer :: nsds, ierr
         162             :    character(len=*), parameter :: sub='write_rest_pfile'
         163             :    !---------------------------------------------------------------------------
         164             :
         165        1536 :    if (masterproc) then
         166             :
         167           2 :       nsds = getunit()
         168           2 :       call opnfil(rest_pfile, nsds, 'f')
         169           2 :       rewind nsds
         170           2 :       write(nsds, '(a)', iostat=ierr) trim(restart_file)
         171           2 :       if (ierr /= 0) then
         172           0 :          call endrun(sub//': ERROR: writing rpointer file')
         173             :       end if
         174           2 :       close(nsds)
         175           2 :       call freeunit(nsds)
         176             :
         177           2 :       write(iulog,*)'(WRITE_REST_PFILE): successfully wrote local restart pointer file ',&
         178           4 :          trim(rest_pfile)
         179           2 :       write(iulog,'("---------------------------------------")')
         180             :    end if
         181             :
         182        1536 : end subroutine write_rest_pfile
         183             :
         184             : !========================================================================================
         185             :
         186             : end module cam_restart

Generated by: LCOV version 1.14