Skip to content

Commit

Permalink
Find forcing files using file templates and dates. COSIMA/access-om2#242
Browse files Browse the repository at this point in the history
  • Loading branch information
nichannah committed Sep 13, 2021
1 parent fc4f4e0 commit 14e246e
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 23 deletions.
13 changes: 4 additions & 9 deletions libforcing/src/forcing_field.F90
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ module forcing_field_mod
integer, parameter, public :: FORCING_FIELD_DOMAIN_NONE = 0
integer, parameter, public :: FORCING_FIELD_DOMAIN_ATMOSPHERE = 10
integer, parameter, public :: FORCING_FIELD_DOMAIN_LAND = 20
integer, parameter, private :: DAYS_IN_MONTH = (/ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /)

type, public :: forcing_field
character(len=64), dimension(:), allocatable :: names
Expand Down Expand Up @@ -61,7 +60,7 @@ subroutine forcing_field_init(self, name_list, filename_template_list, cname, do
character(len=9), intent(out) :: calendar

character(len=1024) :: filename
integer :: num_file_inputs, i, end_day
integer :: num_file_inputs, i

num_file_inputs = size(name_list)

Expand All @@ -83,10 +82,8 @@ subroutine forcing_field_init(self, name_list, filename_template_list, cname, do
self%product_name = trim(product_name)
self%logger => loggerin

end_day = DAYS_IN_MONTH(start_date%getMonth)

do i=1, num_file_inputs
filename = find_filename_for_date(self%filename_templates(i),
filename = filename_for_date(self%filename_templates(i), &
start_date)
call self%ncvars(i)%init(self%names(i), filename)
enddo
Expand Down Expand Up @@ -128,10 +125,8 @@ subroutine forcing_field_update(self, forcing_date, experiment_date)
num_file_inputs = size(self%ncvars)

do i=1, num_file_inputs
filename = filename_for_date(self%filename_templates(i),
forcing_date%getYear(),
forcing_date%getMonth(),
start_day, end_day)
filename = filename_for_date(self%filename_templates(i), &
forcing_date)
call assert(trim(filename) /= '', "File not found: "//filename)
if (trim(filename) /= trim(self%ncvars(i)%filename)) then
call self%ncvars(i)%refresh(filename)
Expand Down
5 changes: 2 additions & 3 deletions libforcing/src/forcing_perturbation.F90
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module forcing_perturbation_mod
use error_handler, only : assert
use ncvar_mod, only : ncvar_type => ncvar
use datetime_module, only : datetime
use util_mod, only : filename_for_year
use util_mod, only : filename_for_date

implicit none
private
Expand Down Expand Up @@ -75,8 +75,8 @@ subroutine forcing_perturbation_load(self, forcing_date, experiment_date, &
date = forcing_date
endif

filename = filename_for_date(self%filename_template, date)
if (.not. self%initialised) then
filename = filename_for_year(self%filename_template, date%getYear())

if (self%dimension_type == FORCING_PERTURBATION_DIMENSION_SPATIAL) then
call self%ncvar%init(self%name, filename, &
Expand All @@ -96,7 +96,6 @@ subroutine forcing_perturbation_load(self, forcing_date, experiment_date, &
return
endif

filename = filename_for_year(self%filename_template, date%getYear())
call assert(trim(filename) /= '', "File not found: "//filename)
if (trim(filename) /= trim(self%ncvar%filename)) then
call self%ncvar%refresh(filename)
Expand Down
51 changes: 40 additions & 11 deletions libforcing/src/util.F90
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
module util_mod

use netcdf
use datetime_module, only : datetime
use error_handler, only : assert
use, intrinsic :: iso_fortran_env, only : stderr=>error_unit

implicit none

integer, parameter, private :: DAYS_IN_MONTH = (/ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /)
integer, dimension(12), parameter, private :: DAYS_IN_MONTH = (/ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 /)

contains

Expand Down Expand Up @@ -171,24 +172,52 @@ subroutine get_var_dims(ncid, varid, ndims, nx, ny, time)
! substrings. This is very specifically designed to handle the kinds
! of filenames used for JRA55 and ERA5 atmospheric forcings.

function find_filename_for_year_month(filename_template, year, month)
function filename_for_date(filename_template, date)
character(len=*), intent(in) :: filename_template
integer, intent(in) :: year, month
type(datetime), intent(in) :: date

integer :: start_day, end_day
integer :: year, month, start_day, end_day
character(len=1024) :: filename_for_date
character(len=4) :: year_str, yearp1_str
character(len=2) :: month_str, start_day_str, end_day_str

year = date%getYear()
month = date%getMonth()

write(year_str, "(I4)") year
write(yearp1_str, "(I4)") year+1

filename_for_year = replace_text(filename, "{{ year }}", year_str)
filename_for_year = replace_text(filename_for_year, "{{year}}", year_str)
filename_for_year = replace_text(filename_for_year, "{{ year+1 }}", yearp1_str)
filename_for_year = replace_text(filename_for_year, "{{year+1}}", yearp1_str)

endfunction find_filename_for_year_month
write(month_str, "(I2)") month

start_day = 1
end_day = DAYS_IN_MONTH(month)
write(start_day_str, "(I2)") start_day
write(end_day_str, "(I2)") end_day

filename_for_date = replace_text(filename_template, &
"{{ year }}", year_str)
filename_for_date = replace_text(filename_for_date, &
"{{year}}", year_str)
filename_for_date = replace_text(filename_for_date, &
"{{ year+1 }}", yearp1_str)
filename_for_date = replace_text(filename_for_date, &
"{{year+1}}", yearp1_str)

filename_for_date = replace_text(filename_for_date, &
"{{ month }}", month_str)
filename_for_date = replace_text(filename_for_date, &
"{{month}}", month_str)

filename_for_date = replace_text(filename_for_date, &
"{{ start_day }}", start_day_str)
filename_for_date = replace_text(filename_for_date, &
"{{start_day}}", start_day_str)

filename_for_date = replace_text(filename_for_date, &
"{{ end_day }}", end_day_str)
filename_for_date = replace_text(filename_for_date, &
"{{end_day}}", end_day_str)

endfunction filename_for_date


end module util_mod

0 comments on commit 14e246e

Please sign in to comment.