YAC 3.18.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_query_routines.F90
Go to the documentation of this file.
1! Copyright (c) 2024 The YAC Authors
2!
3! SPDX-License-Identifier: BSD-3-Clause
4
8
9#include "test_macros.inc"
10
12
13 USE utest
14 USE mpi
15 use yaxt
16 USE yac
17 IMPLICIT NONE
18
19 INTEGER :: global_rank, global_size, rank_type, ierror, i, j, rank, idx
20 INTEGER :: yac_id, comp_id, comp_id_instance, grid_id, point_id, &
21 field_id, field_id_instance, prelim_id, prelim_id_instance, mask_id
22 INTEGER :: ref_nbr_comps, ref_nbr_grids
23 INTEGER :: mask_valid(1)
24 CHARACTER (LEN=YAC_MAX_CHARLEN) :: comp_name
25 CHARACTER (LEN=YAC_MAX_CHARLEN) :: ref_comp_name, ref_grid_names(3), &
26 ref_field_names(2)
27 CHARACTER (LEN=YAC_MAX_CHARLEN) :: grid_name
28 CHARACTER (LEN=YAC_MAX_CHARLEN) :: field_name
29 TYPE(yac_string), ALLOCATABLE :: comp_names(:), comp_names_instance(:)
30 TYPE(yac_string), ALLOCATABLE :: grid_names(:), grid_names_instance(:)
31 TYPE(yac_string), ALLOCATABLE :: field_names(:), field_names_instance(:)
32 TYPE(yac_string), ALLOCATABLE :: comp_grid_names(:)
33
34 DOUBLE PRECISION, PARAMETER :: yac_rad = 0.017453292519943295769d0 ! M_PI / 180
35
36 ! this avoids some compiler warnings
37 allocate(comp_names(0), comp_names_instance(0), &
38 grid_names(0), grid_names_instance(0), &
39 field_names(0), field_names_instance(0), &
40 comp_grid_names(0))
41
42 CALL start_test("test_query_routines")
43
44 CALL mpi_init(ierror)
45 CALL xt_initialize(mpi_comm_world)
46
47 ! Test yac_fdefault_instance_defined before initialization
48 CALL test(.NOT. yac_fdefault_instance_defined())
49
51 CALL yac_finit()
52
53 ! Test yac_fdefault_instance_defined after initialization
55
56 CALL yac_finit(yac_id)
57
58 CALL mpi_comm_rank(mpi_comm_world, global_rank, ierror)
59 CALL mpi_comm_size(mpi_comm_world, global_size, ierror)
60
61
62 !--------------------------------------------------
63 ! definition of components, grid, points and fields
64 !--------------------------------------------------
65
66 rank_type = mod(global_rank, 5)
67
68 IF (rank_type == 0) THEN
69
70 ! ranks of type 0 define no data
72 CALL yac_fdef_comp_dummy(yac_id)
73
74 ELSE
75
76 ! ranks of type 1 or higher define a component
77 WRITE (comp_name , "('comp_',I0)") global_rank
78 prelim_id = yac_fget_comp_id(comp_name)
79 prelim_id_instance = yac_fget_comp_id(yac_id, comp_name)
80 CALL yac_fdef_comp(comp_name, comp_id)
81 CALL yac_fdef_comp(yac_id, comp_name, comp_id_instance)
82 CALL test(prelim_id == comp_id)
83 CALL test(prelim_id_instance == comp_id_instance)
84
85 ! ranks of type 2 or higher define a grid and attach some
86 ! meta data to their component
87 IF (rank_type > 1) THEN
88
90 comp_name, trim(comp_name) // " METADATA_C")
92 yac_id, comp_name, trim(comp_name) // " METADATA_C_instance")
93
94 WRITE (grid_name , "('grid_',I0,'_0')") global_rank
95 prelim_id = yac_fget_grid_id(grid_name)
96 CALL yac_fdef_grid( &
97 grid_name, [2, 2], [0,0], [0.,180.]*yac_rad, &
98 [-45.,45.]*yac_rad, grid_id)
99 CALL test(prelim_id == grid_id)
100
101 prelim_id = yac_fget_points_id(grid_id, yac_location_cell, "points_0")
102 CALL yac_fdef_points( &
103 grid_id, [1,1], yac_location_cell, &
104 [90.]*yac_rad, [0.]*yac_rad, "points_0", point_id)
105 CALL test(prelim_id == point_id)
106
107 prelim_id = yac_fget_mask_id(grid_id, yac_location_cell, "mask_0")
108 mask_valid(1) = 1
109 CALL yac_fdef_mask_named( &
110 grid_id, 1, yac_location_cell, mask_valid, "mask_0", mask_id)
111 CALL test(prelim_id == mask_id)
112
113 ! ranks of type 3 or higher define a second grid, attach some
114 ! meta data to it
115 IF (rank_type > 2) THEN
116
117 WRITE (grid_name , "('grid_',I0,'_1')") global_rank
118 CALL yac_fdef_grid( &
119 grid_name, [2, 2], [0,0], [0.,180.]*yac_rad, &
120 [-45.,45.]*yac_rad, grid_id)
121
122 CALL yac_fdef_points( &
123 grid_id, [1,1], yac_location_cell, &
124 [90.]*yac_rad, [0.]*yac_rad, point_id)
125
127 grid_name, trim(grid_name) // " METADATA_G")
129 yac_id, grid_name, trim(grid_name) // " METADATA_G_instance")
130
131
132 ! ranks of type 4 or higher define a third grid, attach some
133 ! meta data to it and define two fields (one with meta data
134 ! and one without)
135 IF (rank_type > 3) THEN
136
137 WRITE (grid_name , "('grid_',I0,'_2')") global_rank
138 CALL yac_fdef_grid( &
139 grid_name, [2, 2], [0,0], [0.,180.]*yac_rad, &
140 [-45.,45.]*yac_rad, grid_id)
141
142 CALL yac_fdef_points( &
143 grid_id, [1,1], yac_location_cell, &
144 [90.]*yac_rad, [0.]*yac_rad, point_id)
145
147 grid_name, trim(grid_name) // " METADATA_G")
149 yac_id, grid_name, trim(grid_name) // " METADATA_G_instance")
150
151 WRITE (field_name , "('field_',I0,'_0')") global_rank
152 CALL yac_fdef_field( &
153 field_name, comp_id, [point_id], 1, 1, "PT5M", &
154 yac_time_unit_iso_format, field_id)
155 CALL yac_fdef_field( &
156 field_name, comp_id_instance, [point_id], 1, 1, "PT5M", &
157 yac_time_unit_iso_format, field_id_instance)
158
159 WRITE (field_name , "('field_',I0,'_1')") global_rank
160 CALL yac_fdef_field( &
161 field_name, comp_id, [point_id], 1, 1, "PT5M", &
162 yac_time_unit_iso_format, field_id)
163 CALL yac_fdef_field( &
164 field_name, comp_id_instance, [point_id], 1, 1, "PT5M", &
165 yac_time_unit_iso_format, field_id_instance)
167 comp_name, grid_name, field_name, &
168 trim(field_name) // " METADATA_F")
170 yac_id, comp_name, grid_name, field_name,&
171 trim(field_name) // " METADATA_F_instance")
172
173 !----------------------------------------
174 ! test some field_id based query routines
175 !----------------------------------------
176 CALL test(yac_fget_field_is_defined(comp_name, grid_name, field_name))
177 CALL test(.NOT. yac_fget_field_is_defined(comp_name, grid_name, "undefined_field"))
178 CALL test(yac_fget_field_is_defined(yac_id, comp_name, grid_name, field_name))
179 CALL test(.NOT. yac_fget_field_is_defined(yac_id, comp_name, grid_name, "undefined_field"))
180 CALL test(field_id == yac_fget_field_id(comp_name, grid_name, field_name))
181 CALL test(field_id_instance == yac_fget_field_id(yac_id, comp_name, grid_name, field_name))
182 CALL test(comp_name == yac_fget_component_name(field_id))
183 CALL test(comp_name == yac_fget_component_name(field_id_instance))
184 CALL test(grid_name == yac_fget_grid_name(field_id))
185 CALL test(grid_name == yac_fget_grid_name(field_id_instance))
186 CALL test(field_name == yac_fget_field_name(field_id))
187 CALL test(field_name == yac_fget_field_name(field_id_instance))
188 CALL test("PT5M" == yac_fget_field_timestep(field_id))
189 CALL test("PT5M" == yac_fget_field_timestep(field_id_instance))
190 CALL test(1 == yac_fget_field_collection_size(field_id))
191 CALL test(1 == yac_fget_field_collection_size(field_id_instance))
192 CALL test(yac_exchange_type_none == yac_fget_field_role(field_id))
193 CALL test(yac_exchange_type_none == yac_fget_field_role(field_id_instance))
194 END IF
195 END IF
196 END IF
197 END IF
198
199 ! end definition phase and synchronise definitions across all processes
200 CALL yac_fsync_def()
201 CALL yac_fsync_def(yac_id)
202
203 !--------------------
204 ! test query routines
205 !--------------------
206
207 ref_nbr_comps = 4 * ((global_size - 1) / 5) + mod(global_size - 1, 5)
208 IF (ALLOCATED(comp_names)) DEALLOCATE(comp_names)
209 comp_names = yac_fget_comp_names()
210 IF (ALLOCATED(comp_names_instance)) DEALLOCATE(comp_names_instance)
211 comp_names_instance = yac_fget_comp_names(yac_id)
212 CALL test(SIZE(comp_names) == ref_nbr_comps)
213 CALL test(SIZE(comp_names_instance) == ref_nbr_comps)
214
215 ref_nbr_grids = &
216 3 * ((global_size - 1) / 5) + merge(1, 0, mod(global_size - 1, 5) > 2) + &
217 merge(2, 0, mod(global_size - 1, 5) > 3)
218
219 IF (ALLOCATED(grid_names)) DEALLOCATE(grid_names)
220 grid_names = yac_fget_grid_names()
221 IF (ALLOCATED(grid_names_instance)) DEALLOCATE(grid_names_instance)
222 grid_names_instance = yac_fget_grid_names(yac_id)
223 CALL test(SIZE(grid_names) == ref_nbr_grids)
224 CALL test(SIZE(grid_names_instance) == ref_nbr_grids)
225
226 DO rank = 0, global_size - 1
227
228 rank_type = mod(rank, 5)
229 WRITE (ref_comp_name, "('comp_',I0)") rank
230 DO i = 1, 3
231 WRITE (ref_grid_names(i), "('grid_',I0,'_',I0)") rank, i - 1
232 END DO
233 DO i = 1, 2
234 WRITE (ref_field_names(i), "('field_',I0,'_',I0)") rank, i - 1
235 END DO
236
237 IF (rank_type == 0) THEN
238
239 ! no component or grid is defined on this rank
240 idx = 0
241 DO i = 1, ref_nbr_comps
242 IF (ref_comp_name == comp_names(i)%string) idx = i
243 END DO
244 CALL test(idx == 0)
245 idx = 0
246 DO i = 1, ref_nbr_comps
247 IF (ref_comp_name == comp_names_instance(i)%string) idx = i
248 END DO
249 CALL test(idx == 0)
250 DO i = 1, 3
251 idx = 0
252 DO j = 1, ref_nbr_grids
253 IF (ref_grid_names(i) == grid_names(j)%string) idx = j
254 END DO
255 CALL test(idx == 0)
256 idx = 0
257 DO j = 1, ref_nbr_grids
258 IF (ref_grid_names(i) == grid_names_instance(j)%string) idx = j
259 END DO
260 CALL test(idx == 0)
261 END DO
262
263 ELSE
264
265 ! a component is defined on this process
266 idx = 0
267 DO i = 1, ref_nbr_comps
268 IF (ref_comp_name == comp_names(i)%string) idx = i
269 END DO
270 CALL test(idx /= 0)
271 idx = 0
272 DO i = 1, ref_nbr_comps
273 IF (ref_comp_name == comp_names_instance(i)%string) idx = i
274 END DO
275 CALL test(idx /= 0)
276
277 IF (rank_type == 1) THEN
278
279 ! the component of this rank has no meta data
280 CALL test(.NOT. yac_fcomponent_has_metadata(ref_comp_name))
281 CALL test(.NOT. yac_fcomponent_has_metadata(yac_id, ref_comp_name))
282
283 ! no grid is registered in the coupling configuration on this rank
284 DO i = 1, 3
285 idx = 0
286 DO j = 1, ref_nbr_grids
287 IF (ref_grid_names(i) == grid_names(j)%string) idx = j
288 END DO
289 CALL test(idx == 0)
290 idx = 0
291 DO j = 1, ref_nbr_grids
292 IF (ref_grid_names(i) == grid_names_instance(j)%string) idx = j
293 END DO
294 CALL test(idx == 0)
295 END DO
296
297 IF (ALLOCATED(comp_grid_names)) DEALLOCATE(comp_grid_names)
298 comp_grid_names = yac_fget_comp_grid_names(ref_comp_name)
299 CALL test(SIZE(comp_grid_names) == 0)
300 IF (ALLOCATED(comp_grid_names)) DEALLOCATE(comp_grid_names)
301 comp_grid_names = yac_fget_comp_grid_names(yac_id, ref_comp_name)
302 CALL test(SIZE(comp_grid_names) == 0)
303
304 ELSE
305
306 ! the component has meta data on this rank
307 CALL test(yac_fcomponent_has_metadata(ref_comp_name))
308 CALL test(yac_fcomponent_has_metadata(yac_id, ref_comp_name))
309 CALL test(yac_fget_component_metadata(ref_comp_name) == trim(ref_comp_name) // " METADATA_C")
310 CALL test(yac_fget_component_metadata(yac_id, ref_comp_name) == trim(ref_comp_name) // " METADATA_C_instance")
311
312 IF (rank_type == 2) THEN
313
314 ! no grid is registered in the coupling configuration on this rank
315 DO i = 1, 3
316 idx = 0
317 DO j = 1, ref_nbr_grids
318 IF (ref_grid_names(i) == grid_names(j)%string) idx = j
319 END DO
320 CALL test(idx == 0)
321 idx = 0
322 DO j = 1, ref_nbr_grids
323 IF (ref_grid_names(i) == grid_names_instance(j)%string) idx = j
324 END DO
325 CALL test(idx == 0)
326 END DO
327
328 IF (ALLOCATED(comp_grid_names)) DEALLOCATE(comp_grid_names)
329 comp_grid_names = yac_fget_comp_grid_names(ref_comp_name)
330 CALL test(SIZE(comp_grid_names) == 0)
331 IF (ALLOCATED(comp_grid_names)) DEALLOCATE(comp_grid_names)
332 comp_grid_names = yac_fget_comp_grid_names(yac_id, ref_comp_name)
333 CALL test(SIZE(comp_grid_names) == 0)
334 ELSE
335
336 ! grid_*_0 is not registered in the coupling configuration
337 idx = 0
338 DO j = 1, ref_nbr_grids
339 IF (ref_grid_names(1) == grid_names(j)%string) idx = j
340 END DO
341 CALL test(idx == 0)
342 idx = 0
343 DO j = 1, ref_nbr_grids
344 IF (ref_grid_names(1) == grid_names_instance(j)%string) idx = j
345 END DO
346 CALL test(idx == 0)
347
348 ! grid_*_1 is registered in the coupling configuration, has meta
349 ! data, but no fields
350 idx = 0
351 DO j = 1, ref_nbr_grids
352 IF (ref_grid_names(2) == grid_names(j)%string) idx = j
353 END DO
354 CALL test(idx /= 0)
355 idx = 0
356 DO j = 1, ref_nbr_grids
357 IF (ref_grid_names(2) == grid_names_instance(j)%string) idx = j
358 END DO
359 CALL test(idx /= 0)
360 CALL test(yac_fgrid_has_metadata(ref_grid_names(2)))
361 CALL test(yac_fgrid_has_metadata(yac_id, ref_grid_names(2)))
362 CALL test(yac_fget_grid_metadata(ref_grid_names(2)) == trim(ref_grid_names(2)) // " METADATA_G")
363 CALL test(yac_fget_grid_metadata(yac_id, ref_grid_names(2)) == trim(ref_grid_names(2)) // " METADATA_G_instance")
364 IF (ALLOCATED(field_names)) DEALLOCATE(field_names)
365 field_names = yac_fget_field_names(ref_comp_name, ref_grid_names(2))
366 CALL test(SIZE(field_names) == 0)
367 IF (ALLOCATED(field_names_instance)) DEALLOCATE(field_names_instance)
368 field_names_instance = &
369 yac_fget_field_names(yac_id, ref_comp_name, ref_grid_names(2))
370 CALL test(SIZE(field_names_instance) == 0)
371
372 IF (rank_type == 3) THEN
373
374 ! grid_*_2 is not defined on this rank
375 idx = 0
376 DO j = 1, ref_nbr_grids
377 IF (ref_grid_names(3) == grid_names(j)%string) idx = j
378 END DO
379 CALL test(idx == 0)
380 idx = 0
381 DO j = 1, ref_nbr_grids
382 IF (ref_grid_names(3) == grid_names_instance(j)%string) idx = j
383 END DO
384 CALL test(idx == 0)
385
386 IF (ALLOCATED(comp_grid_names)) DEALLOCATE(comp_grid_names)
387 comp_grid_names = yac_fget_comp_grid_names(ref_comp_name)
388 CALL test(SIZE(comp_grid_names) == 0)
389 IF (ALLOCATED(comp_grid_names)) DEALLOCATE(comp_grid_names)
390 comp_grid_names = yac_fget_comp_grid_names(yac_id, ref_comp_name)
391 CALL test(SIZE(comp_grid_names) == 0)
392
393 ELSE
394
395 ! grid_*_2 is registered in the coupling configuration, has
396 ! meta data, and two fields
397 idx = 0
398 DO j = 1, ref_nbr_grids
399 IF (ref_grid_names(3) == grid_names(j)%string) idx = j
400 END DO
401 CALL test(idx /= 0)
402 idx = 0
403 DO j = 1, ref_nbr_grids
404 IF (ref_grid_names(3) == grid_names_instance(j)%string) idx = j
405 END DO
406 CALL test(idx /= 0)
407 CALL test(yac_fgrid_has_metadata(ref_grid_names(3)))
408 CALL test(yac_fgrid_has_metadata(yac_id, ref_grid_names(3)))
409 CALL test(yac_fget_grid_metadata(ref_grid_names(3)) == trim(ref_grid_names(3)) // " METADATA_G")
410 CALL test(yac_fget_grid_metadata(yac_id, ref_grid_names(3)) == trim(ref_grid_names(3)) // " METADATA_G_instance")
411 IF (ALLOCATED(field_names)) DEALLOCATE(field_names)
412 field_names = &
413 yac_fget_field_names(ref_comp_name, ref_grid_names(3))
414 CALL test(SIZE(field_names) == 2)
415 IF (ALLOCATED(field_names_instance)) DEALLOCATE(field_names_instance)
416 field_names_instance = &
417 yac_fget_field_names(yac_id, ref_comp_name, ref_grid_names(3))
418 CALL test(SIZE(field_names_instance) == 2)
419 idx = 0
420 DO i = 1, 2
421 DO j = 1, 2
422 IF (ref_field_names(i) == field_names(j)%string) idx = j
423 END DO
424 CALL test(idx /= 0)
425 idx = 0
426 DO j = 1, 2
427 IF (ref_field_names(i) == field_names_instance(j)%string) idx = j
428 END DO
429 CALL test(idx /= 0)
430 END DO
431 CALL test(.NOT. yac_ffield_has_metadata(ref_comp_name, ref_grid_names(3), ref_field_names(1)))
432 CALL test(.NOT. yac_ffield_has_metadata(yac_id, ref_comp_name, ref_grid_names(3), ref_field_names(1)))
433 CALL test(yac_ffield_has_metadata(ref_comp_name, ref_grid_names(3), ref_field_names(2)))
434 CALL test(yac_ffield_has_metadata(yac_id, ref_comp_name, ref_grid_names(3), ref_field_names(2)))
435 CALL test(yac_fget_field_metadata(ref_comp_name, ref_grid_names(3), ref_field_names(2)) == trim(ref_field_names(2)) // " METADATA_F")
436 CALL test(yac_fget_field_metadata(yac_id, ref_comp_name, ref_grid_names(3), ref_field_names(2)) == trim(ref_field_names(2)) // " METADATA_F_instance")
437
438 IF (ALLOCATED(comp_grid_names)) DEALLOCATE(comp_grid_names)
439 comp_grid_names = yac_fget_comp_grid_names(ref_comp_name)
440 CALL test(SIZE(comp_grid_names) == 1)
441 CALL test(comp_grid_names(1)%string == ref_grid_names(3))
442 IF (ALLOCATED(comp_grid_names)) DEALLOCATE(comp_grid_names)
443 comp_grid_names = yac_fget_comp_grid_names(yac_id, ref_comp_name)
444 CALL test(SIZE(comp_grid_names) == 1)
445 CALL test(comp_grid_names(1)%string == ref_grid_names(3))
446
447 CALL test(yac_fget_field_role(ref_comp_name, ref_grid_names(3), ref_field_names(1)) == yac_exchange_type_none)
448 CALL test(yac_fget_field_role(yac_id, ref_comp_name, ref_grid_names(3), ref_field_names(1)) == yac_exchange_type_none)
449 CALL test(yac_fget_field_collection_size(ref_comp_name, ref_grid_names(3), ref_field_names(1)) == 1)
450 CALL test(yac_fget_field_collection_size(yac_id, ref_comp_name, ref_grid_names(3), ref_field_names(1)) == 1)
451 CALL test(yac_fget_field_timestep(ref_comp_name, ref_grid_names(3), ref_field_names(1)) == "PT5M")
452 CALL test(yac_fget_field_timestep(yac_id, ref_comp_name, ref_grid_names(3), ref_field_names(1)) == "PT5M")
453 END IF
454 END IF
455 END IF
456 END IF
457 END DO
458
459 CALL yac_ffinalize(yac_id)
460 CALL yac_ffinalize()
461 CALL xt_finalize()
462 CALL mpi_finalize(ierror)
463
464 CALL stop_test
465
466 CALL exit_tests
467
468END PROGRAM test_query_routines
Fortran interface for the definition of coupling fields using default masks.
Fortran interface for the definition of grids.
Fortran interface for the definition of points.
Fortran interface for checking if default instance is defined.
Fortran interface for the coupler termination.
Fortran interface for invoking the end of the definition phase.
static void merge(char *base_a, size_t num_a, int a_ascending, char *base_b, size_t num_b, int b_ascending, size_t size, int(*compar)(const void *, const void *), char *target)
Definition mergesort.c:56
Definition utest.F90:5
subroutine, public start_test(name)
Definition utest.F90:20
subroutine, public stop_test()
Definition utest.F90:27
subroutine, public exit_tests()
Definition utest.F90:81
@ yac_location_cell
@ yac_time_unit_iso_format
@ yac_proleptic_gregorian
@ yac_exchange_type_none
program test_query_routines