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

ctsm5.3.018: Change history time to be equal to the middle of the time bounds #2838

Merged
merged 15 commits into from
Jan 11, 2025
Merged
Show file tree
Hide file tree
Changes from 5 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
4 changes: 2 additions & 2 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,15 @@ fxDONOTUSEurl = https://github.com/ESCOMP/CISM-wrapper
[submodule "rtm"]
path = components/rtm
url = https://github.com/ESCOMP/RTM
fxtag = rtm1_0_80
fxtag = rtm1_0_82
fxrequired = ToplevelRequired
# Standard Fork to compare to with "git fleximod test" to ensure personal forks aren't committed
fxDONOTUSEurl = https://github.com/ESCOMP/RTM

[submodule "mosart"]
path = components/mosart
url = https://github.com/ESCOMP/MOSART
fxtag = mosart1.1.02
fxtag = mosart1.1.04
fxrequired = ToplevelRequired
# Standard Fork to compare to with "git fleximod test" to ensure personal forks aren't committed
fxDONOTUSEurl = https://github.com/ESCOMP/MOSART
Expand Down
2 changes: 1 addition & 1 deletion components/rtm
61 changes: 47 additions & 14 deletions src/main/histFileMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1172,6 +1172,7 @@ subroutine htape_addfld (t, f, avgflag)
integer :: beg1d,end1d ! beginning and ending indices for this field (assume already set)
integer :: num1d_out ! history output 1d size
type(bounds_type) :: bounds
character(len=avgflag_strlen) :: avgflag_temp ! local copy of hist_avgflag_pertape(t)
character(len=*),parameter :: subname = 'htape_addfld'
!-----------------------------------------------------------------------

Expand Down Expand Up @@ -1302,6 +1303,19 @@ subroutine htape_addfld (t, f, avgflag)
tape(t)%hlist(n)%avgflag = avgflag
end if

! Override this tape's avgflag if nhtfrq == 1
if (tape(t)%nhtfrq == 1) then ! output is instantaneous
hist_avgflag_pertape(t) = 'I'
end if
! Override this field's avgflag if the namelist or the previous line
! has set this tape to
! - instantaneous (I) or
! - local time (L)
avgflag_temp = hist_avgflag_pertape(t)
if (avgflag_temp == 'I' .or. avgflag_temp(1:1) == 'L') then
tape(t)%hlist(n)%avgflag = avgflag_temp
end if

end subroutine htape_addfld

!-----------------------------------------------------------------------
Expand Down Expand Up @@ -3098,6 +3112,7 @@ subroutine htape_timeconst(t, mode)
integer :: mcdate ! current date
integer :: yr,mon,day,nbsec ! year,month,day,seconds components of a date
integer :: hours,minutes,secs ! hours,minutes,seconds of hh:mm:ss
character(len= 12) :: step_or_bounds ! string used in long_name of several time variables
character(len= 10) :: basedate ! base date (yyyymmdd)
character(len= 8) :: basesec ! base seconds
character(len= 8) :: cdate ! system date
Expand Down Expand Up @@ -3357,20 +3372,30 @@ subroutine htape_timeconst(t, mode)

dim1id(1) = time_dimid
str = 'days since ' // basedate // " " // basesec
call ncd_defvar(nfid(t), 'time', tape(t)%ncprec, 1, dim1id, varid, &
long_name='time',units=str)
if (tape(t)%hlist(1)%avgflag /= 'I') then ! NOT instantaneous fields tape
step_or_bounds = 'time_bounds'
long_name = 'time at exact middle of ' // step_or_bounds
call ncd_defvar(nfid(t), 'time', tape(t)%ncprec, 1, dim1id, varid, &
long_name=long_name, units=str)
call ncd_putatt(nfid(t), varid, 'bounds', 'time_bounds')
else ! instantaneous fields tape
step_or_bounds = 'time step'
long_name = 'time at end of ' // step_or_bounds
call ncd_defvar(nfid(t), 'time', tape(t)%ncprec, 1, dim1id, varid, &
long_name=long_name, units=str)
end if
cal = get_calendar()
if ( trim(cal) == NO_LEAP_C )then
caldesc = "noleap"
else if ( trim(cal) == GREGORIAN_C )then
caldesc = "gregorian"
end if
call ncd_putatt(nfid(t), varid, 'calendar', caldesc)
call ncd_putatt(nfid(t), varid, 'bounds', 'time_bounds')

dim1id(1) = time_dimid
long_name = 'current date (YYYYMMDD) at end of ' // step_or_bounds
call ncd_defvar(nfid(t) , 'mcdate', ncd_int, 1, dim1id , varid, &
long_name = 'current date (YYYYMMDD)')
long_name = long_name)
!
! add global attribute time_period_freq
!
Expand All @@ -3397,18 +3422,23 @@ subroutine htape_timeconst(t, mode)
call ncd_putatt(nfid(t), ncd_global, 'time_period_freq', &
trim(time_period_freq))

long_name = 'current seconds of current date at end of ' // step_or_bounds
call ncd_defvar(nfid(t) , 'mcsec' , ncd_int, 1, dim1id , varid, &
long_name = 'current seconds of current date', units='s')
long_name = long_name, units='s')
long_name = 'current day (from base day) at end of ' // step_or_bounds
call ncd_defvar(nfid(t) , 'mdcur' , ncd_int, 1, dim1id , varid, &
long_name = 'current day (from base day)')
long_name = long_name)
long_name = 'current seconds of current day at end of ' // step_or_bounds
call ncd_defvar(nfid(t) , 'mscur' , ncd_int, 1, dim1id , varid, &
long_name = 'current seconds of current day')
long_name = long_name)
call ncd_defvar(nfid(t) , 'nstep' , ncd_int, 1, dim1id , varid, &
long_name = 'time step')

dim2id(1) = hist_interval_dimid; dim2id(2) = time_dimid
call ncd_defvar(nfid(t), 'time_bounds', ncd_double, 2, dim2id, varid, &
long_name = 'history time interval endpoints')
if (tape(t)%hlist(1)%avgflag /= 'I') then ! NOT instantaneous fields tape
slevis-lmwg marked this conversation as resolved.
Show resolved Hide resolved
call ncd_defvar(nfid(t), 'time_bounds', ncd_double, 2, dim2id, varid, &
long_name = 'history time interval endpoints')
end if

dim2id(1) = strlen_dimid; dim2id(2) = time_dimid
call ncd_defvar(nfid(t), 'date_written', ncd_char, 2, dim2id, varid)
Expand Down Expand Up @@ -3436,13 +3466,16 @@ subroutine htape_timeconst(t, mode)
call ncd_io('mscur' , mscur , 'write', nfid(t), nt=tape(t)%ntimes)
call ncd_io('nstep' , nstep , 'write', nfid(t), nt=tape(t)%ntimes)

time = mdcur + mscur/secspday
timedata(1) = tape(t)%begtime ! beginning time
timedata(2) = mdcur + mscur/secspday ! end time
if (tape(t)%hlist(1)%avgflag /= 'I') then ! NOT instantaneous fields tape
time = (timedata(1) + timedata(2)) * 0.5_r8
call ncd_io('time_bounds', timedata, 'write', nfid(t), nt=tape(t)%ntimes)
else
time = timedata(2)
end if
call ncd_io('time' , time , 'write', nfid(t), nt=tape(t)%ntimes)

timedata(1) = tape(t)%begtime
timedata(2) = time
call ncd_io('time_bounds', timedata, 'write', nfid(t), nt=tape(t)%ntimes)

call getdatetime (cdate, ctime)
call ncd_io('date_written', cdate, 'write', nfid(t), nt=tape(t)%ntimes)

Expand Down
Loading