Skip to content

Commit

Permalink
driver: icedrv_history: fix start time for NetCDF history output (#426)
Browse files Browse the repository at this point in the history
* Trial fix for netCDF start time problem

* driver: icedrv_history: fix start time for NetCDF history output

The start time for netCDF output was hardcoded to be at 00:00:00
and there was a bug in icedrv_calendar such that idate0 was fixed
at Jan. 1. Both bugs are fixed. NOTE: if dt and istep0 are set
such that the start time contains fractional seconds, they will
be rounded down in the NetCDF output to the nearest integer.

* driver: icedrv_history: fix start time for NetCDF History output

Start of netCDF time axis is fixed at Jan. 01 00:00:00 of
init_year and time value calculation is now fixed.
  • Loading branch information
davidclemenssewall authored Feb 1, 2023
1 parent 23a8faf commit 82d877f
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 10 deletions.
5 changes: 1 addition & 4 deletions configuration/driver/icedrv_calendar.F90
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ module icedrv_calendar
year_init, & ! initial year
nyr , & ! year number
idate , & ! date (yyyymmdd)
idate0 , & ! initial date (yyyymmdd)
sec , & ! elapsed seconds into date
npt , & ! total number of time steps (dt)
ndtd , & ! number of dynamics subcycles: dt_dyn=dt/ndtd
Expand Down Expand Up @@ -167,13 +166,11 @@ subroutine init_calendar
tday = (time-sec)/secday + c1 ! absolute day number

! Convert the current timestep into a calendar date
call sec2time(nyr,month,mday,basis_seconds+sec)
call sec2time(nyr,month,mday,basis_seconds+time)

yday = mday + daycal(month) ! day of the year
nyr = nyr - year_init + 1 ! year number

idate0 = (nyr+year_init-1)*10000 + month*100 + mday ! date (yyyymmdd)

end subroutine init_calendar

!=======================================================================
Expand Down
15 changes: 9 additions & 6 deletions configuration/driver/icedrv_history.F90
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ module icedrv_history

subroutine history_write()

use icedrv_calendar, only: idate0, days_per_year, use_leap_years
use icedrv_calendar, only: days_per_year, use_leap_years, year_init
use icedrv_calendar, only: time, time0, secday, istep1, idate, sec
use icedrv_state, only: aice, vice, vsno, uvel, vvel, divu, shear, strength
use icedrv_state, only: trcr, trcrn
Expand Down Expand Up @@ -68,7 +68,11 @@ subroutine history_write()
count1(1), count2(2), count3(3), count4(4), & ! cdf start/count arrays
varid, & ! cdf varid
status, & ! cdf status flag
iflag ! history file attributes
iflag, & ! history file attributes
sec0, & ! number of seconds into the day at istep0
h0, & ! start hour
m0, & ! start minute
s0 ! start second

character (len=8) :: &
cdate ! date string
Expand Down Expand Up @@ -164,9 +168,8 @@ subroutine history_write()
if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: def_var time')
status = nf90_put_att(ncid,varid,'long_name','model time')
if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: put_att time long_name')
write(cdate,'(i8.8)') idate0
write(tmpstr,'(a,a,a,a,a,a,a,a)') 'days since ', &
cdate(1:4),'-',cdate(5:6),'-',cdate(7:8),' 00:00:00'
write(tmpstr,'(a,i0,a)') 'days since ', &
year_init,'-01-01 00:00:00'
status = nf90_put_att(ncid,varid,'units',trim(tmpstr))
if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: put_att time units')
if (days_per_year == 360) then
Expand Down Expand Up @@ -282,7 +285,7 @@ subroutine history_write()

status = nf90_inq_varid(ncid,'time',varid)
if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: inq_var '//'time')
value = (time-time0)/secday
value = time/secday
status = nf90_put_var(ncid,varid,value,start=(/timcnt/))
if (status /= nf90_noerr) call icedrv_system_abort(string=subname//' ERROR: put_var '//'time')

Expand Down

0 comments on commit 82d877f

Please sign in to comment.