Skip to content

Commit

Permalink
Merge pull request #500 from jedwards4b/add_timestamp_rpointer
Browse files Browse the repository at this point in the history
Add timestamp rpointer
  • Loading branch information
jedwards4b authored Dec 4, 2024
2 parents 959e9a0 + 4883961 commit 6d47c50
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 65 deletions.
3 changes: 2 additions & 1 deletion .github/workflows/srt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,11 +81,12 @@ jobs:
git config --global user.name "${GITHUB_ACTOR}"
git config --global user.email "${GITHUB_ACTOR_ID}+${GITHUB_ACTOR}@users.noreply.github.com"
pushd cesm
./bin/git-fleximod update ccs_config cdeps share mct parallelio cime
./bin/git-fleximod update cime ccs_config cdeps share mct parallelio
cd ccs_config
git checkout main
cd ../cime
git checkout master
git status
if [[ ! -e "${PWD}/.gitmodules.bak" ]]
then
echo "Converting git@github.com to https://github.com urls in ${PWD}/.gitmodules"
Expand Down
30 changes: 14 additions & 16 deletions cesm/driver/esm_time_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ module esm_time_mod
implicit none
private ! default private

public :: esm_time_clockInit ! initialize driver clock (assumes default calendar)
public :: esm_time_clockinit ! initialize driver clock (assumes default calendar)

private :: esm_time_date2ymd

Expand Down Expand Up @@ -52,7 +52,7 @@ module esm_time_mod
contains
!===============================================================================

subroutine esm_time_clockInit(ensemble_driver, instance_driver, logunit, maintask, rc)
subroutine esm_time_clockinit(ensemble_driver, instance_driver, logunit, maintask, rc)
use nuopc_shr_methods, only : get_minimum_timestep, dtime_drv
! input/output variables
type(ESMF_GridComp) :: ensemble_driver, instance_driver
Expand Down Expand Up @@ -95,6 +95,7 @@ subroutine esm_time_clockInit(ensemble_driver, instance_driver, logunit, maintas
logical :: isPresent
logical :: inDriver
logical, save :: firsttime=.true.
logical :: exists
character(len=*), parameter :: subname = '('//__FILE__//':esm_time_clockInit) '
!-------------------------------------------------------------------------------

Expand Down Expand Up @@ -130,23 +131,20 @@ subroutine esm_time_clockInit(ensemble_driver, instance_driver, logunit, maintas

if (read_restart) then

call NUOPC_CompAttributeGet(instance_driver, name='drv_restart_pointer', value=restart_file, rc=rc)
call NUOPC_CompAttributeGet(instance_driver, name='drv_restart_pointer', value=restart_pfile, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return

if (trim(restart_file) /= 'none') then

call NUOPC_CompAttributeGet(instance_driver, name="inst_suffix", isPresent=isPresent, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if(isPresent) then
call NUOPC_CompAttributeGet(instance_driver, name="inst_suffix", value=inst_suffix, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
inst_suffix = ""
endif

restart_pfile = trim(restart_file)//inst_suffix
if (trim(restart_pfile) /= 'none') then

if (maintask) then
write(logunit,*) " read rpointer file = "//trim(restart_pfile)
inquire( file=trim(restart_pfile), exist=exists)
if (.not. exists) then
rc = ESMF_FAILURE
call ESMF_LogWrite(trim(subname)//' ERROR rpointer file '//trim(restart_pfile)//' not found', &
ESMF_LOGMSG_ERROR, line=__LINE__, file=__FILE__)
return
endif
call ESMF_LogWrite(trim(subname)//" read rpointer file = "//trim(restart_pfile), &
ESMF_LOGMSG_INFO)
open(newunit=unitn, file=restart_pfile, form='FORMATTED', status='old',iostat=ierr)
Expand Down Expand Up @@ -323,7 +321,7 @@ subroutine esm_time_clockInit(ensemble_driver, instance_driver, logunit, maintas
if (ChkErr(rc,__LINE__,u_FILE_u)) return
firsttime = .false.
endif
end subroutine esm_time_clockInit
end subroutine esm_time_clockinit

!===============================================================================

Expand Down
2 changes: 0 additions & 2 deletions cime_config/buildnml
Original file line number Diff line number Diff line change
Expand Up @@ -392,8 +392,6 @@ def _create_drv_namelists(case, infile, confdir, nmlgen, files):
nmlgen.set_value(
"component_list", value=valid_comps_string.replace("CPL", "MED")
)
# the driver restart pointer will look like a mediator is present even if it is not
nmlgen.set_value("drv_restart_pointer", value="rpointer.cpl")

logger.info("Writing nuopc_runconfig for components {}".format(valid_comps))
nuopc_config_file = os.path.join(confdir, "nuopc.runconfig")
Expand Down
11 changes: 11 additions & 0 deletions cime_config/config_component.xml
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,17 @@
</desc>
</entry>

<entry id="DRV_RESTART_POINTER">
<type>char</type>
<default_value>rpointer.cpl</default_value>
<group>run_begin_stop_restart</group>
<file>env_run.xml</file>
<desc>
Name of the restart pointer file, this can be used to restart from an
intermediate restart by appending the restart date and time in format YYYY-MM-DD-SSSSS
</desc>
</entry>

<entry id="PAUSE_OPTION">
<type>char</type>
<valid_values>none,never,nsteps,nseconds,nminutes,nhours,ndays,nmonths,nyears</valid_values>
Expand Down
22 changes: 6 additions & 16 deletions cime_config/namelist_definition_drv.xml
Original file line number Diff line number Diff line change
Expand Up @@ -162,15 +162,15 @@
</values>
</entry>

<entry id="drv_restart_pointer">
<entry id="drv_restart_pointer" modify_via_xml="DRV_RESTART_POINTER">
<type>char</type>
<category>expdef</category>
<group>DRIVER_attributes</group>
<desc>
Driver restart pointer file to initialize time info
</desc>
<values>
<value>rpointer.cpl</value>
<value>$DRV_RESTART_POINTER</value>
</values>
</entry>

Expand Down Expand Up @@ -233,18 +233,6 @@
</values>
</entry>

<!-- not yet fully implemented, set to false -->
<entry id="write_restart_at_endofrun">
<type>logical</type>
<category>nuopc</category>
<group>ALLCOMP_attributes</group>
<values>
<value>.false.</value>
<value rest_option='none'>.false.</value>
<value rest_option='never'>.false.</value>
</values>
</entry>

<entry id="Profiling" modify_via_xml="ESMF_PROFILING_LEVEL">
<type>char</type>
<category>nuopc</category>
Expand Down Expand Up @@ -2865,7 +2853,7 @@
</values>
</entry>

<entry id="end_restart">
<entry id="write_restart_at_endofrun">
<type>logical</type>
<category>time</category>
<group>CLOCK_attributes</group>
Expand All @@ -2877,7 +2865,9 @@
default: false
</desc>
<values>
<value>.false.</value>
<value>.true.</value>
<value rest_option='none'>.false.</value>
<value rest_option='never'>.false.</value>
</values>
</entry>

Expand Down
2 changes: 0 additions & 2 deletions mediator/med_diag_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -2116,8 +2116,6 @@ subroutine med_phases_diag_print(gcomp, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if (ESMF_AlarmIsRinging(stop_alarm, rc=rc)) then
output_level = max(output_level, budget_print_ltend)
call ESMF_AlarmRingerOff( stop_alarm, rc=rc )
if (ChkErr(rc,__LINE__,u_FILE_u)) return
endif
endif

Expand Down
51 changes: 23 additions & 28 deletions mediator/med_phases_restart_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ subroutine med_phases_restart_write(gcomp, rc)
use med_io_mod , only : med_io_close, med_io_date2yyyymmdd, med_io_sec2hms
use med_phases_history_mod, only : auxcomp
use med_constants_mod , only : SecPerDay => med_constants_SecPerDay

use nuopc_shr_methods , only : shr_get_rpointer_name
! Input/output variables
type(ESMF_GridComp) :: gcomp
integer, intent(out) :: rc
Expand Down Expand Up @@ -172,9 +172,9 @@ subroutine med_phases_restart_write(gcomp, rc)
character(ESMF_MAXSTR) :: case_name ! case name
character(ESMF_MAXSTR) :: restart_file ! Local path to restart filename
character(ESMF_MAXSTR) :: restart_pfile ! Local path to restart pointer filename
character(ESMF_MAXSTR) :: cpl_inst_tag ! instance tag
character(ESMF_MAXSTR) :: restart_dir ! Optional restart directory name
character(ESMF_MAXSTR) :: cvalue ! attribute string
character(ESMF_MAXSTR) :: cpl_inst_tag ! instance tag
logical :: alarmIsOn ! generic alarm flag
real(R8) :: tbnds(2) ! CF1.0 time bounds
logical :: isPresent
Expand All @@ -197,14 +197,6 @@ subroutine med_phases_restart_write(gcomp, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call NUOPC_CompAttributeGet(gcomp, name='case_name', value=case_name, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call NUOPC_CompAttributeGet(gcomp, name='inst_suffix', isPresent=isPresent, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if(isPresent) then
call NUOPC_CompAttributeGet(gcomp, name='inst_suffix', value=cpl_inst_tag, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
cpl_inst_tag = ""
endif
call NUOPC_CompAttributeGet(gcomp, name='restart_dir', isPresent=isPresent, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if(isPresent) then
Expand Down Expand Up @@ -296,12 +288,20 @@ subroutine med_phases_restart_write(gcomp, rc)
! Use nexttimestr rather than currtimestr here since that is the time at the end of
! the timestep and is preferred for restart file names
!---------------------------------------
call NUOPC_CompAttributeGet(gcomp, name='inst_suffix', isPresent=isPresent, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if (isPresent) then
call NUOPC_CompAttributeGet(gcomp, name='inst_suffix', value=cpl_inst_tag, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
cpl_inst_tag = ""
endif

write(restart_file,"(6a)") trim(restart_dir)//trim(case_name),'.cpl', trim(cpl_inst_tag),'.r.',&
trim(nexttimestr),'.nc'

if (maintask) then
restart_pfile = "rpointer.cpl"//trim(cpl_inst_tag)
call shr_get_rpointer_name(gcomp, 'cpl', next_ymd, next_tod, restart_pfile, 'write', rc)
call ESMF_LogWrite(trim(subname)//" write rpointer file = "//trim(restart_pfile), ESMF_LOGMSG_INFO)
open(newunit=unitn, file=restart_pfile, form='FORMATTED')
write(unitn,'(a)') trim(restart_file)
Expand Down Expand Up @@ -480,13 +480,14 @@ subroutine med_phases_restart_read(gcomp, rc)

! Read mediator restart

use ESMF , only : ESMF_GridComp, ESMF_VM, ESMF_Clock, ESMF_Time, ESMF_MAXSTR
use ESMF , only : ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS, ESMF_FAILURE
use ESMF , only : ESMF_LOGMSG_ERROR, ESMF_VMBroadCast
use ESMF , only : ESMF_GridCompGet, ESMF_ClockGet, ESMF_ClockPrint
use ESMF , only : ESMF_FieldBundleIsCreated, ESMF_TimeGet
use NUOPC , only : NUOPC_CompAttributeGet
use med_io_mod , only : med_io_read
use ESMF , only : ESMF_GridComp, ESMF_VM, ESMF_Clock, ESMF_Time, ESMF_MAXSTR
use ESMF , only : ESMF_LogWrite, ESMF_LOGMSG_INFO, ESMF_SUCCESS, ESMF_FAILURE
use ESMF , only : ESMF_LOGMSG_ERROR, ESMF_VMBroadCast
use ESMF , only : ESMF_GridCompGet, ESMF_ClockGet, ESMF_ClockPrint
use ESMF , only : ESMF_FieldBundleIsCreated, ESMF_TimeGet
use NUOPC , only : NUOPC_CompAttributeGet
use med_io_mod , only : med_io_read
use nuopc_shr_methods, only : shr_get_rpointer_name

! Input/output variables
type(ESMF_GridComp) :: gcomp
Expand All @@ -501,10 +502,10 @@ subroutine med_phases_restart_read(gcomp, rc)
integer :: n
integer :: ierr, unitn
integer :: yr,mon,day,sec ! time units
integer :: curr_ymd
character(ESMF_MAXSTR) :: case_name ! case name
character(ESMF_MAXSTR) :: restart_file ! Local path to restart filename
character(ESMF_MAXSTR) :: restart_pfile ! Local path to restart pointer filename
character(ESMF_MAXSTR) :: cpl_inst_tag ! instance tag
logical :: isPresent
character(len=*), parameter :: subname='(med_phases_restart_read)'
!---------------------------------------
Expand All @@ -520,14 +521,6 @@ subroutine med_phases_restart_read(gcomp, rc)
! Get case name and inst suffix
call NUOPC_CompAttributeGet(gcomp, name='case_name', value=case_name, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call NUOPC_CompAttributeGet(gcomp, name='inst_suffix', isPresent=isPresent, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if (isPresent) then
call NUOPC_CompAttributeGet(gcomp, name='inst_suffix', value=cpl_inst_tag, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
cpl_inst_tag = ""
endif

! Get the clock info
call ESMF_GridCompGet(gcomp, clock=clock)
Expand All @@ -536,6 +529,8 @@ subroutine med_phases_restart_read(gcomp, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call ESMF_TimeGet(currtime,yy=yr, mm=mon, dd=day, s=sec, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call ymd2date(yr,mon,day,curr_ymd)

write(currtimestr,'(i4.4,a,i2.2,a,i2.2,a,i5.5)') yr,'-',mon,'-',day,'-',sec
if (dbug_flag > 1) then
call ESMF_LogWrite(trim(subname)//": currtime = "//trim(currtimestr), ESMF_LOGMSG_INFO)
Expand All @@ -546,8 +541,8 @@ subroutine med_phases_restart_read(gcomp, rc)
endif

! Get the restart file name from the pointer file
restart_pfile = "rpointer.cpl"//trim(cpl_inst_tag)
if (maintask) then
call shr_get_rpointer_name(gcomp, 'cpl', curr_ymd, sec, restart_pfile, 'read', rc)
call ESMF_LogWrite(trim(subname)//" read rpointer file = "//trim(restart_pfile), ESMF_LOGMSG_INFO)
open(newunit=unitn, file=restart_pfile, form='FORMATTED', status='old', iostat=ierr)
read (unitn,'(a)', iostat=ierr) restart_file
Expand Down

0 comments on commit 6d47c50

Please sign in to comment.