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

time now equals the middle of the time_bounds #106

Merged
merged 4 commits into from
Nov 11, 2024
Merged
Changes from all 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
60 changes: 45 additions & 15 deletions src/riverroute/mosart_histfile.F90
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,7 @@ subroutine htape_addfld (t, f, avgflag)
integer :: n ! field index on defined tape
integer :: begr ! per-proc beginning land runoff index
integer :: endr ! per-proc ending land runoff index
character(len=1) :: avgflag_temp ! local copy of avgflag_pertape(t)
character(len=*),parameter :: subname = 'htape_addfld'
!-------------------------------------------------------

Expand Down Expand Up @@ -479,6 +480,17 @@ subroutine htape_addfld (t, f, avgflag)
call shr_sys_abort()
end select

! Override this tape's avgflag if nhtfrq == 1
if (tape(t)%nhtfrq == 1) then ! output is instantaneous
avgflag_pertape(t) = 'I'
end if
! Override this field's avgflag if the namelist has set this tape to
! - instantaneous
avgflag_temp = avgflag_pertape(t)
if (avgflag_temp == 'I') then
tape(t)%hlist(n)%avgflag = avgflag_temp
end if

end subroutine htape_addfld

!-----------------------------------------------------------------------
Expand Down Expand Up @@ -593,7 +605,6 @@ subroutine htape_create (t, histrest)
character(len=CL) :: name ! name of attribute
character(len=CL) :: units ! units of attribute
character(len=CL) :: str ! global attribute string
character(len= 1) :: avgflag ! time averaging flag
character(len=*),parameter :: subname = 'htape_create'
!-----------------------------------------------------

Expand Down Expand Up @@ -719,6 +730,7 @@ subroutine htape_timeconst(t, mode)
integer :: dtime ! timestep size
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 @@ -754,32 +766,47 @@ 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)
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
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 @@ -811,13 +838,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 ncd_getdatetime (cdate, ctime)
call ncd_io('date_written', cdate, 'write', nfid(t), nt=tape(t)%ntimes)

Expand Down