Opened 5 years ago
Last modified 2 years ago
#549 accepted defect
one_year variable unclear definition
Reported by: | ajornet | Owned by: | jgipsl |
---|---|---|---|
Priority: | major | Milestone: | Not scheduled yet |
Component: | Model architecture | Version: | trunc |
Keywords: | gregorian leap one_year | Cc: |
Description
The variable one_year found in time.f90 is defined as:
REAL(r_std), PUBLIC :: one_year !! Length of current year in days (d)
But regarding its given value on Orchidee in a Gregorian calendar(1988 is a leap year):
time_nextstep: Start of interval 1988-01-01 0.0000 time_nextstep: End of interval 1988-01-01 1800.0000 time_nextstep: month_len= 31 one_year= 365.242500000000
365.2425 is the average year length in the Gregorian calendar. But it's not the length in days of the current year.
In order to find out which one is the right choice. It might be a good idea to take a look to the source code:
- Example 1)
In readdim2.f90:
!- !- Number of time steps is meaningless in this case !- ! ttm_full = HUGE( ttm_full ) !MM Number (realistic) of time steps for half hour dt ttm_full = NINT(one_year * 86400. / dt_force)
For the year 1988 (leap):
ttm_full = NINT(365.2425 * 86400. / 3600.0) = INT(8765.82) = 8765 -> wrong (currently) ttm_full = NINT(366.0000 * 86400. / 3600.0) = INT(8764.00) = 8784 -> correct
Regarding the 1988 era5 forcing file:
[p529jorn@irene170 SpinUpMICT-era5v2ORC-1.3615]$ ncdump -h era5_europe_1988.nc netcdf era5_europe_1988 { dimensions: time = UNLIMITED ; // (8784 currently) lat = 173 ; lon = 305 ; variables: double time(time) ; time:axis = "T" ; time:calendar = "standard" ; time:long_name = "Time axis" ; time:standard_name = "time" ; time:units = "seconds since 1988-01-01 00:00:00" ; time:tstep_sec = 3600.f ; time:time_origin = "1988-01-01 00:00:00" ;
- Example 2)
In stomate.f90, variable nsft, It's defined as:
INTEGER(i_std),SAVE :: nsft !! Number of time steps in a year (unitless)
and calculated:
! Total number of forcing steps nsft = INT(one_year/(dt_stomate/one_day))
For the year 1988 (leap=366):
nsft = INT(365.2425/(86400/86400)) = 365 -> wrong (currently) nsft = INT(366.0000/(86400/86400)) = 366 -> correct
- Example 3)
In stomate_season.f90, regarding the calculation of ncd_max:
!! 1. Initializations !! 1.1 Calculate ::ncd_max - the maximum possible NCD (number of chilling days) as: !! \latexonly !! \input{season_ncdmax_eqn2.tex} !! \endlatexonly !! \n !! where one_year is 1 year in seconds (defined in ::constantes). ! ncd_max = ncd_max_year * one_year
one_year is wrongly used as it is defined in years (instead of seconds, check the comments). It also matters whether it is a leap year. one_year name seems to be a bit confusing.
- Example 4)
In lpj_stablish.f90:
bm_eff(:,icarbon) = MIN( npp_longterm(:,j)/one_year, bm_new(:,icarbon)-bm_non(:,icarbon) )
But it is not clear whether the average year length (365.2425) should be used intead of the current year length (365 or 366)
REAL(r_std), DIMENSION(npts,nvm), INTENT(inout) :: npp_longterm !! "Long term" mean yearly primary productivity
- Conclusion
It some cases seems to be wrong (1,2,3) but in others (4) I can't decide whether it's good or there is an issue.
Change History (2)
comment:1 Changed 3 years ago by luyssaert
- Milestone changed from ORCHIDEE 4.0 to Not scheduled yet
comment:2 Changed 2 years ago by jgipsl
- Owner changed from somebody to jgipsl
- Status changed from new to accepted