Skip to content

Commit

Permalink
do time math in r8
Browse files Browse the repository at this point in the history
  • Loading branch information
mlee03 authored and mlee03 committed Oct 3, 2023
1 parent accf108 commit 8b1fd31
Showing 1 changed file with 22 additions and 20 deletions.
42 changes: 22 additions & 20 deletions interpolator/include/interpolator.inc
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ integer :: model_calendar
integer :: yr, mo, dy, hr, mn, sc
integer :: n
type(time_type) :: Julian_time, Noleap_time
real(FMS_INTP_KIND_), allocatable :: time_in(:)
real(r8_kind), allocatable :: time_in(:)
real(FMS_INTP_KIND_), allocatable, save :: agrid_mod(:,:,:)
integer :: nx, ny
type(FmsNetcdfFile_t) :: fileobj
Expand All @@ -159,7 +159,7 @@ integer :: num_years !< number of years
integer :: base_year, base_month, base_day, base_hour, base_minute, base_second
integer :: nn
logical :: no_leap_in_calendar
real(FMS_INTP_KIND_) :: num_days, frac_year !< variables for yearly=.true.
real(r8_kind) :: num_days, frac_year !< variables for yearly=.true.
type(time_type) :: n_time !< temporary time

clim_type%separate_time_vary_calc = .false.
Expand Down Expand Up @@ -454,7 +454,7 @@ if(dimension_exists(fileobj, "time")) then
if (ntime > 0) then
allocate(time_in(ntime), clim_type%time_slice(ntime))
allocate(clim_type%clim_times(12,(ntime+11)/12))
time_in = 0.0_lkind
time_in = 0.0_r8_kind
clim_type%time_slice = set_time(0,0) + base_time
clim_type%clim_times = set_time(0,0) + base_time
call fms2_io_read_data(fileobj, "time", time_in)
Expand All @@ -465,17 +465,17 @@ if(dimension_exists(fileobj, "time")) then
if(.not.no_leap_in_calendar) then
! Julian calendar
num_years = int(time_in(n))
frac_year = time_in(n) - real(num_years, FMS_INTP_KIND_)
frac_year = time_in(n) - real(num_years, r8_kind)
call get_date_julian(base_time, base_year, base_month, base_day, base_hour, base_minute, base_second)
num_days = 0.0_lkind
num_days = 0.0_r8_kind
do nn=1, num_years
if( mod(base_year+nn-1,4)==0) num_days = num_days + 366._lkind
if( mod(base_year+nn-1,4)/=0) num_days = num_days + 365._lkind
if( mod(base_year+nn-1,4)==0) num_days = num_days + 366._r8_kind
if( mod(base_year+nn-1,4)/=0) num_days = num_days + 365._r8_kind
end do
if( mod(base_year+num_years,4)==0) num_days = num_days + 366._lkind*frac_year
if( mod(base_year+num_years,4)/=0) num_days = num_days + 365._lkind*frac_year
if( mod(base_year+num_years,4)==0) num_days = num_days + 366._r8_kind*frac_year
if( mod(base_year+num_years,4)/=0) num_days = num_days + 365._r8_kind*frac_year
else
num_days = time_in(n)*365._lkind
num_days = time_in(n)*365._r8_kind
end if
time_in(n)=num_days
end do
Expand All @@ -485,7 +485,7 @@ if(dimension_exists(fileobj, "time")) then
non_monthly = .false.
do n = 1, ntime-1
! Assume that the times in the data file correspond to days only.
if (time_in(n+1) > (time_in(n) + 32._lkind)) then
if (time_in(n+1) > (time_in(n) + 32._r8_kind)) then
non_monthly = .true.
exit
endif
Expand All @@ -508,9 +508,8 @@ if(dimension_exists(fileobj, "time")) then
!! time_interp_list with the optional argument modtime=YEAR, so that
!! the time that is needed in time_slice is the displacement into the
!! year, not the displacement from a base_time.
clim_type%time_slice(n) = &
set_time( INT( (time_in(n)-real(INT(time_in(n)),FMS_INTP_KIND_)) &
*real(SECONDS_PER_DAY,FMS_INTP_KIND_)), INT(time_in(n)))
clim_type%time_slice(n) = set_time( INT( (time_in(n)-real(INT(time_in(n)),r8_kind))*SECONDS_PER_DAY), &
INT(time_in(n)))
else
!--------------------------------------------------------------------
Expand All @@ -529,15 +528,16 @@ if(dimension_exists(fileobj, "time")) then
! no calendar conversion needed.
!---------------------------------------------------------------------
clim_type%time_slice(n) = &
set_time( INT( (time_in(n)-real(INT(time_in(n)),FMS_INTP_KIND_)) &
*real(SECONDS_PER_DAY,FMS_INTP_KIND_)), INT(time_in(n))) &
+ base_time
set_time( INT( (time_in(n)-real(INT(time_in(n)),r8_kind))*SECONDS_PER_DAY), &
INT(time_in(n))) + base_time
!---------------------------------------------------------------------
! convert file times from noleap to julian.
!---------------------------------------------------------------------
else if ( (model_calendar == JULIAN .and. trim(adjustl(lowercase(file_calendar))) == 'noleap')) then
Noleap_time = set_time (0, INT(time_in(n))) + base_time
Noleap_time = set_time( INT((time_in(n)-real(INT(time_in(n)),r8_kind))*SECONDS_PER_DAY), &
INT(time_in(n))) + base_time
!Noleap_time = set_time (0, INT(time_in(n))) + base_time
call get_date_no_leap (Noleap_time, yr, mo, dy, hr, mn, sc)
clim_type%time_slice(n) = set_date_julian (yr, mo, dy, hr, mn, sc)
if (n == 1) then
Expand All @@ -554,7 +554,9 @@ if(dimension_exists(fileobj, "time")) then
! convert file times from julian to noleap.
!---------------------------------------------------------------------
else if ( (model_calendar == NOLEAP .and. trim(adjustl(lowercase(file_calendar))) == 'julian')) then
Julian_time = set_time (0, INT(time_in(n))) + base_time
Julian_time = set_time( INT( (time_in(n)-real(INT(time_in(n)),r8_kind))*SECONDS_PER_DAY), &
INT(time_in(n))) + base_time
!Julian_time = set_time (0, INT(time_in(n))) + base_time
call get_date_julian (Julian_time, yr, mo, dy, hr, mn, sc)
clim_type%time_slice(n) = set_date_no_leap (yr, mo, dy,hr, mn, sc)
if (n == 1) then
Expand All @@ -579,7 +581,7 @@ if(dimension_exists(fileobj, "time")) then
else
allocate(time_in(1), clim_type%time_slice(1))
allocate(clim_type%clim_times(1,1))
time_in = 0.0_lkind
time_in = 0.0_r8_kind
clim_type%time_slice = set_time(0,0) + base_time
clim_type%clim_times(1,1) = set_time(0,0) + base_time
endif
Expand Down

0 comments on commit 8b1fd31

Please sign in to comment.