Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stop running 0th time step #2084

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/biogeochem/CNPhenologyMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,11 @@ subroutine CNPhenology (bounds, num_soilc, filter_soilc, num_soilp, &
! all restart files having been generated with
! https://github.com/ESCOMP/CTSM/issues/1623 resolved, or we stop having a time
! step 0 (https://github.com/ESCOMP/CTSM/issues/925).
if (num_pcropp > 0 .and. .not. is_first_step()) then
!KO if (num_pcropp > 0 .and. .not. is_first_step()) then
!KO
! Unknown if all restart files have been generated with 1623 resolved but we no longer have a time step 0
if (num_pcropp > 0) then
Copy link
Member

@billsacks billsacks Aug 3, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Great, thanks for this change. I agree with this and we can remove the above BACKWARDS_COMPATIBILITY comment.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, yes, I had a comment in #925 noting that I checked for those things:
"Reviewed the code for instances of nstep == 0, nstep == 1, nstep /= 0, nstep > 0, etc (with and without spaces), and is_first_step, and made changes as required."
There could be some combination I didn't think of, if you or anyone has one I'll re-check.
I've removed the BACKWARDS_COMPATIBILITY comment in my latest commit.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, sorry, I missed that in my skim back through that issue. Thank you!

!KO
call CropPhenology(num_pcropp, filter_pcropp, &
waterdiagnosticbulk_inst, temperature_inst, crop_inst, canopystate_inst, cnveg_state_inst, &
cnveg_carbonstate_inst, cnveg_nitrogenstate_inst, cnveg_carbonflux_inst, cnveg_nitrogenflux_inst, &
Expand Down
12 changes: 10 additions & 2 deletions src/biogeochem/CNVegetationFacade.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1229,7 +1229,11 @@ subroutine EndOfTimeStepVegDynamics(this, bounds, num_natvegp, filter_natvegp, &
! Call dv (dynamic vegetation) at last time step of year

call t_startf('d2dgvm')
if (is_end_curr_year() .and. .not. is_first_step()) then
!KO if (is_end_curr_year() .and. .not. is_first_step()) then
!KO
! is_first_step check no longer necessary since there is no nstep=0
if (is_end_curr_year()) then
!KO

! Get date info. kyr is used in lpj(). At end of first year, kyr = 2.
call get_curr_date(yr, mon, day, sec)
Expand Down Expand Up @@ -1281,7 +1285,11 @@ subroutine WriteHistory(this, bounds)

! Write to CNDV history buffer if appropriate
if (use_cndv) then
if (is_end_curr_year() .and. .not. is_first_step()) then
!KO if (is_end_curr_year() .and. .not. is_first_step()) then
!KO
! is_first_step check no longer necessary since there is no nstep=0
if (is_end_curr_year()) then
!KO
call t_startf('clm_drv_io_hdgvm')
call CNDVHist( bounds, this%dgvs_inst )
if (masterproc) write(iulog,*) 'Annual CNDV calculations are complete'
Expand Down
6 changes: 5 additions & 1 deletion src/biogeochem/CropType.F90
Original file line number Diff line number Diff line change
Expand Up @@ -763,7 +763,11 @@ subroutine CropIncrementYear (this, num_pcropp, filter_pcropp)
! Update nyrs when it's the end of the year (unless it's the very start of the
! run). This assumes that, if this patch is active at the end of the year, then it was
! active for the whole year.
if ((kmo == 1 .and. kda == 1 .and. mcsec == 0) .and. .not. is_first_step()) then
!KO if ((kmo == 1 .and. kda == 1 .and. mcsec == 0) .and. .not. is_first_step()) then
!KO
! is_first_step check no longer necessary since there is no nstep=0
if ((kmo == 1 .and. kda == 1 .and. mcsec == 0)) then
!KO
do fp = 1, num_pcropp
p = filter_pcropp(fp)

Expand Down
6 changes: 5 additions & 1 deletion src/biogeochem/dynCNDVMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,11 @@ subroutine dynCNDV_interp( bounds, dgvs_inst)
patch%wtcol(p) = dgvs_inst%fpcgrid_patch(p) + &
wt1 * (dgvs_inst%fpcgridold_patch(p) - dgvs_inst%fpcgrid_patch(p))

if (mon==1 .and. day==1 .and. sec==dtime .and. nstep>0) then
!KO ! I don't think this is necessary since there no longer an nstep=0
!KO if (mon==1 .and. day==1 .and. sec==dtime .and. nstep>0) then
!KO
if (mon==1 .and. day==1 .and. sec==dtime) then
!KO
dgvs_inst%fpcgridold_patch(p) = dgvs_inst%fpcgrid_patch(p)
end if
end if
Expand Down
1 change: 1 addition & 0 deletions src/biogeophys/WaterStateType.F90
Original file line number Diff line number Diff line change
Expand Up @@ -652,6 +652,7 @@ subroutine Restart(this, bounds, ncid, flag, &

! If initial run -- ensure that water is properly bounded (read only)
if (flag == 'read' ) then
!KO ! I think leaving this in here is still necessary even though is_first_step is now based on nstep=1
if ( is_first_step() .and. bound_h2osoi) then
do c = bounds%begc, bounds%endc
l = col%landunit(c)
Expand Down
242 changes: 113 additions & 129 deletions src/cpl/lilac/lnd_comp_esmf.F90
Original file line number Diff line number Diff line change
Expand Up @@ -554,7 +554,6 @@ subroutine lnd_run(gcomp, import_state, export_state, clock, rc)
integer :: nstep ! time step index
logical :: rstwr ! .true. ==> write restart file before returning
logical :: nlend ! .true. ==> last time-step
logical :: dosend ! true => send data back to driver
logical :: doalb ! .true. ==> do albedo calculation on this time step
real(r8) :: nextsw_cday ! calday from clock of next radiation computation
real(r8) :: caldayp1 ! ctsm calday plus dtime offset
Expand Down Expand Up @@ -621,161 +620,146 @@ subroutine lnd_run(gcomp, import_state, export_state, clock, rc)
!--------------------------------

dtime = get_step_size()
dosend = .false.
do while(.not. dosend)

! We assume that the land model time step matches the coupling interval. However,
! we still need this while loop to handle the initial time step (time 0). We may
! want to get rid of this time step 0 in the lilac coupling, at which point we
! should be able to remove this while loop and dosend variable.
!
! See also https://github.com/ESCOMP/CTSM/issues/925
nstep = get_nstep()
if (nstep > 0) then
dosend = .true.
end if

!--------------------------------
! Determine calendar day info
!--------------------------------
! We assume that the land model time step matches the coupling interval.
nstep = get_nstep()

calday = get_curr_calday(reuse_day_365_for_day_366=.true.)
caldayp1 = get_curr_calday(offset=dtime, reuse_day_365_for_day_366=.true.)
!--------------------------------
! Determine calendar day info
!--------------------------------

!--------------------------------
! Get time of next atmospheric shortwave calculation
!--------------------------------
calday = get_curr_calday(reuse_day_365_for_day_366=.true.)
caldayp1 = get_curr_calday(offset=dtime, reuse_day_365_for_day_366=.true.)

! TODO(NS): nextsw_cday should come directly from atmosphere!
! For now I am setting nextsw_cday to be the same caldayp1
!
! See also https://github.com/ESCOMP/CTSM/issues/860
!--------------------------------
! Get time of next atmospheric shortwave calculation
!--------------------------------

nextsw_cday = calday
if (masterproc) then
write(iulog,*) trim(subname) // '... nextsw_cday is : ', nextsw_cday
end if
! TODO(NS): nextsw_cday should come directly from atmosphere!
! For now I am setting nextsw_cday to be the same caldayp1
!
! See also https://github.com/ESCOMP/CTSM/issues/860

!--------------------------------
! Obtain orbital values
!--------------------------------

call shr_orb_decl( calday , eccen, mvelpp, lambm0, obliqr, declin , eccf )
call shr_orb_decl( nextsw_cday, eccen, mvelpp, lambm0, obliqr, declinp1, eccf )

if (masterproc) then
write(iulog,*) '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
write(iulog,F02) 'nextsw_cday is : ', nextsw_cday
write(iulog,F02) 'calday is : ', calday
write(iulog,F02) 'eccen is : ', eccen
write(iulog,F02) 'mvelpp is : ', mvelpp
write(iulog,F02) 'lambm0 is : ', lambm0
write(iulog,F02) 'obliqr is : ', obliqr
write(iulog,F02) 'declin is : ', declin
write(iulog,F02) 'declinp1 is : ', declinp1
write(iulog,* ) '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
end if
nextsw_cday = calday
if (masterproc) then
write(iulog,*) trim(subname) // '... nextsw_cday is : ', nextsw_cday
end if

!--------------------------------
! Determine doalb based on nextsw_cday sent from atm model
!--------------------------------

if (nstep == 0) then
doalb = .false.
nextsw_cday = caldayp1
else if (nstep == 1) then
!doalb = (abs(nextsw_cday- caldayp1) < 1.e-10_r8)
doalb = .false.
else
doalb = (nextsw_cday >= -0.5_r8)
end if
!--------------------------------
! Obtain orbital values
!--------------------------------

if (masterproc) then
write(iulog,*) '------------ LILAC ----------------'
write(iulog,*) 'nstep : ', nstep
write(iulog,*) 'calday : ', calday
write(iulog,*) 'caldayp1 : ', caldayp1
write(iulog,*) 'nextsw_cday : ', nextsw_cday
write(iulog,*) 'doalb : ', doalb
write(iulog,*) '-------------------------------------'
end if
call shr_orb_decl( calday , eccen, mvelpp, lambm0, obliqr, declin , eccf )
call shr_orb_decl( nextsw_cday, eccen, mvelpp, lambm0, obliqr, declinp1, eccf )

call update_rad_dtime(doalb)
if (masterproc) then
write(iulog,*) '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
write(iulog,F02) 'nextsw_cday is : ', nextsw_cday
write(iulog,F02) 'calday is : ', calday
write(iulog,F02) 'eccen is : ', eccen
write(iulog,F02) 'mvelpp is : ', mvelpp
write(iulog,F02) 'lambm0 is : ', lambm0
write(iulog,F02) 'obliqr is : ', obliqr
write(iulog,F02) 'declin is : ', declin
write(iulog,F02) 'declinp1 is : ', declinp1
write(iulog,* ) '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
end if

!--------------------------------
! Determine if time to write restart
!--------------------------------
!--------------------------------
! Determine doalb based on nextsw_cday sent from atm model
!--------------------------------

call ESMF_ClockGetAlarm(clock, alarmname='lilac_restart_alarm', alarm=alarm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
if (nstep == 1) then
!doalb = (abs(nextsw_cday- caldayp1) < 1.e-10_r8)
doalb = .false.
else
doalb = (nextsw_cday >= -0.5_r8)
end if

if (ESMF_AlarmIsRinging(alarm, rc=rc)) then
if (ChkErr(rc,__LINE__,u_FILE_u)) return
rstwr = .true.
call ESMF_AlarmRingerOff( alarm, rc=rc )
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
rstwr = .false.
endif
if (masterproc) then
write(iulog,*)' restart alarm is ',rstwr
end if
if (masterproc) then
write(iulog,*) '------------ LILAC ----------------'
write(iulog,*) 'nstep : ', nstep
write(iulog,*) 'calday : ', calday
write(iulog,*) 'caldayp1 : ', caldayp1
write(iulog,*) 'nextsw_cday : ', nextsw_cday
write(iulog,*) 'doalb : ', doalb
write(iulog,*) '-------------------------------------'
end if

!--------------------------------
! Determine if time to stop
!--------------------------------
call update_rad_dtime(doalb)

call ESMF_ClockGetAlarm(clock, alarmname='lilac_stop_alarm', alarm=alarm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
!--------------------------------
! Determine if time to write restart
!--------------------------------

if (ESMF_AlarmIsRinging(alarm, rc=rc)) then
if (ChkErr(rc,__LINE__,u_FILE_u)) return
nlend = .true.
call ESMF_AlarmRingerOff( alarm, rc=rc )
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
nlend = .false.
endif
if (masterproc) then
write(iulog,*)' stop alarm is ',nlend
end if
call ESMF_ClockGetAlarm(clock, alarmname='lilac_restart_alarm', alarm=alarm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return

!--------------------------------
! Run CTSM
!--------------------------------
if (ESMF_AlarmIsRinging(alarm, rc=rc)) then
if (ChkErr(rc,__LINE__,u_FILE_u)) return
rstwr = .true.
call ESMF_AlarmRingerOff( alarm, rc=rc )
if (ChkErr(rc,__LINE__,u_FILE_u)) return
else
rstwr = .false.
endif
if (masterproc) then
write(iulog,*)' restart alarm is ',rstwr
end if

call t_barrierf('sync_ctsm_run1', mpicom)
!--------------------------------
! Determine if time to stop
!--------------------------------

! Restart File - use nexttimestr rather than currtimestr here since that is the time at the end of
! the timestep and is preferred for restart file names
! TODO: is this correct for lilac?
call ESMF_ClockGetAlarm(clock, alarmname='lilac_stop_alarm', alarm=alarm, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return

call ESMF_ClockGetNextTime(clock, nextTime=nextTime, rc=rc)
if (ESMF_AlarmIsRinging(alarm, rc=rc)) then
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call ESMF_TimeGet(nexttime, yy=yr_lilac, mm=mon_lilac, dd=day_lilac, s=tod_lilac, rc=rc)
nlend = .true.
call ESMF_AlarmRingerOff( alarm, rc=rc )
if (ChkErr(rc,__LINE__,u_FILE_u)) return
write(rdate,'(i4.4,"-",i2.2,"-",i2.2,"-",i5.5)') yr_lilac, mon_lilac, day_lilac, tod_lilac
else
nlend = .false.
endif
if (masterproc) then
write(iulog,*)' stop alarm is ',nlend
end if

call t_startf ('ctsm_run')
call clm_drv(doalb, nextsw_cday, declinp1, declin, rstwr, nlend, rdate, rof_prognostic=.false.)
call t_stopf ('ctsm_run')
!--------------------------------
! Run CTSM
!--------------------------------

!--------------------------------
! Pack export state
!--------------------------------
call t_barrierf('sync_ctsm_run1', mpicom)

call t_startf ('lc_lnd_export')
call export_fields(export_state, bounds, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call t_stopf ('lc_lnd_export')
! Restart File - use nexttimestr rather than currtimestr here since that is the time at the end of
! the timestep and is preferred for restart file names
! TODO: is this correct for lilac?

!--------------------------------
! Advance ctsm time step
!--------------------------------
call ESMF_ClockGetNextTime(clock, nextTime=nextTime, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call ESMF_TimeGet(nexttime, yy=yr_lilac, mm=mon_lilac, dd=day_lilac, s=tod_lilac, rc=rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
write(rdate,'(i4.4,"-",i2.2,"-",i2.2,"-",i5.5)') yr_lilac, mon_lilac, day_lilac, tod_lilac

call advance_timestep()
call t_startf ('ctsm_run')
call clm_drv(doalb, nextsw_cday, declinp1, declin, rstwr, nlend, rdate, rof_prognostic=.false.)
call t_stopf ('ctsm_run')

end do
!--------------------------------
! Pack export state
!--------------------------------

call t_startf ('lc_lnd_export')
call export_fields(export_state, bounds, rc)
if (ChkErr(rc,__LINE__,u_FILE_u)) return
call t_stopf ('lc_lnd_export')

!--------------------------------
! Advance ctsm time step
!--------------------------------

call advance_timestep()

!--------------------------------
! Check that internal clock is in sync with lilac driver clock
Expand Down
Loading
Loading