Skip to content

Commit 467e3e2

Browse files
committed
New forcing.json format to support multitple file inputs each with multiple permutations.
1 parent c5a82a1 commit 467e3e2

File tree

9 files changed

+434174
-41
lines changed

9 files changed

+434174
-41
lines changed

libforcing/src/forcing_config.F90

+43-41
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ subroutine forcing_config_parse(self, fields, start_date, &
8080
integer, intent(out) :: min_dt, num_land_fields
8181
character(len=9), intent(out) :: calendar
8282

83-
type(json_value), pointer :: field_jv_ptr
83+
type(json_value), pointer :: input_jv_ptr
8484
integer :: i, dt
8585
character(len=9) :: calendar_str
8686
character(kind=CK, len=:), allocatable :: product_name
@@ -102,9 +102,9 @@ subroutine forcing_config_parse(self, fields, start_date, &
102102
calendar = ''
103103
num_land_fields = 0
104104
do i=1, self%num_inputs
105-
call self%core%get_child(inputs, i, field_jv_ptr, found)
105+
call self%core%get_child(inputs, i, input_jv_ptr, found)
106106
call assert(found, "No inputs found in forcing config.")
107-
call self%parse_field(field_jv_ptr, fields(i), start_date, &
107+
call self%parse_input(input_jv_ptr, fields(i), start_date, &
108108
product_name, dt, calendar_str, is_land_field)
109109
if (dt < min_dt) then
110110
min_dt = dt
@@ -123,12 +123,12 @@ subroutine forcing_config_parse(self, fields, start_date, &
123123
endsubroutine forcing_config_parse
124124

125125

126-
subroutine forcing_config_parse_field(self, field_jv_ptr, field_ptr, &
126+
subroutine forcing_config_parse_input(self, input_jv_ptr, field_ptr, &
127127
start_date, product_name, dt, forcing_calendar, &
128128
is_land_field)
129129

130130
class(forcing_config), intent(inout) :: self
131-
type(json_value), pointer :: field_jv_ptr
131+
type(json_value), pointer :: input_jv_ptr
132132
type(forcing_field) :: field_ptr
133133
type(datetime), intent(in) :: start_date
134134
character(len=*), intent(in) :: product_name
@@ -151,59 +151,60 @@ subroutine forcing_config_parse_field(self, field_jv_ptr, field_ptr, &
151151
integer :: num_perturbations, num_fields
152152
integer :: i, j
153153

154+
type(json_value), pointer :: input_field_jv_list,
154155
type(json_value), pointer :: fieldname_jv_list, filename_jv_list
155156
type(json_value), pointer :: fieldname_jv_ptr, filename_jv_ptr
156157
type(json_value), pointer :: perturbation_jv_ptr
157158
type(json_value), pointer :: dimension_jv_ptr, value_jv_ptr
158159
type(json_value), pointer :: perturbation_list, dimension_list
159160
type(json_value), pointer :: value_list
160161

161-
! Allow there to be multiple
162-
call self%core%get_child(field_jv_ptr, "fieldnames", fieldname_jv_list, found)
163-
call assert(found, "Entry 'fieldnames' not found in forcing config.")
164-
num_fieldnames = self%core%count(fieldname_jv_list)
162+
call self%core%get(input_jv_ptr, "coupling_field_name", cname, found)
163+
call assert(found, "Entry 'coupling_field_name' not found in forcing config.")
165164

166-
call self%core%get_child(field_jv_ptr, "filenames", filename_jv_list, found)
167-
call assert(found, "Entry 'filenames' not found in forcing config.")
168-
num_filenames = self%core%count(filename_jv_list)
165+
call self%core%get(input_jv_ptr, "realm", realm_str, realm_found)
166+
if (realm_found) then
167+
call assert(realm_str == "land" .or. realm_str == "atmosphere", &
168+
"forcing_parse_field: invalid domain value.")
169+
else
170+
realm_str = "atmosphere"
171+
endif
172+
173+
is_land_field = .false.
174+
if (realm_str == "land") then
175+
is_land_field = .true.
176+
endif
169177

170-
call assert(num_fieldnames == num_filenames, &
171-
'Number of fieldnames does not match number of filenames')
172-
allocate(fieldname_list(num_fieldnames))
173-
allocate(filename_list(num_filenames))
178+
! Each coupling field can have multiple input fields associated with it.
179+
call self%core%get_child(input_jv_ptr, "input_fields", &
180+
input_field_jv_list, found)
181+
num_input_fields = self%core%count(input_field_jv_list)
182+
do i=1, num_input_fields
183+
call self%core%get_child(input_field_jv_list, i, &
184+
input_field_jv_ptr, found)
174185

175-
do i=1, num_filenames
176-
call self%core%get_child(fieldname_jv_list, i, &
177-
fieldname_jv_ptr, found)
186+
call self%core%get(input_field_jv_ptr, "filename", filename, found)
187+
call assert(found, "Expected to find filename entry.")
188+
filedame_list(i) = trim(filename)
189+
190+
call self%core%get(input_field_jv_ptr, "fieldname", fieldname, found)
178191
call assert(found, "Expected to find fieldname entry.")
179-
call self%core%get(fieldname_jv_ptr, value=fieldname)
180192
fieldname_list(i) = trim(fieldname)
181193

182-
call self%core%get_child(filename_jv_list, i, &
183-
filename_jv_ptr, found)
184-
call assert(found, "Expected to find filename entry.")
185-
call self%core%get(filename_jv_ptr, value=filename)
186-
filename_list(i) = trim(filename)
194+
self%parse_permutations()
195+
187196
enddo
188197

189-
call self%core%get(field_jv_ptr, "cname", cname, found)
190-
call assert(found, "Entry 'cname' not found in forcing config.")
198+
call field_ptr%init(fieldname_list, filename_list, cname, realm_str, start_date, &
199+
product_name, self%logger, dt, forcing_calendar)
191200

192-
call self%core%get(field_jv_ptr, "domain", domain_str, domain_found)
193-
if (domain_found) then
194-
call assert(domain_str == "land" .or. domain_str == "atmosphere", &
195-
"forcing_parse_field: invalid domain value.")
196-
else
197-
domain_str = "atmosphere"
198-
endif
199201

200-
is_land_field = .false.
201-
if (domain_str == "land") then
202-
is_land_field = .true.
203-
endif
204202

205-
call field_ptr%init(fieldname_list, filename_list, cname, domain_str, start_date, &
206-
product_name, self%logger, dt, forcing_calendar)
203+
end subroutine forcing_config_parse_field
204+
205+
206+
subroutine forcing_config_parse_permutations(self)
207+
207208

208209
call self%core%get_child(field_jv_ptr, "perturbations", perturbation_list, found)
209210
if (.not. found) then
@@ -370,7 +371,8 @@ subroutine forcing_config_parse_field(self, field_jv_ptr, field_ptr, &
370371
endif
371372
enddo
372373

373-
end subroutine forcing_config_parse_field
374+
375+
end subroutine forcing_config_parse_permutations(self)
374376

375377

376378
subroutine forcing_config_deinit(self)

0 commit comments

Comments
 (0)