5#include "test_macros.inc"
12#define NOP(x) associate( x => x ); end associate
16 use,
INTRINSIC :: iso_c_binding
25 SUBROUTINE c_free ( ptr ) bind ( c, name='free' )
27 use,
INTRINSIC :: iso_c_binding, only : c_ptr
29 TYPE ( c_ptr ),
INTENT(IN),
VALUE :: ptr
37 REAL(kind=c_double),
PARAMETER :: &
38 yac_rad = 0.017453292519943295769_c_double
40 TYPE(c_ptr) :: basic_grid_empty
41 TYPE(c_ptr) :: basic_grid_reg_2d
42 TYPE(c_ptr) :: basic_grid_reg_2d_deg
43 TYPE(c_ptr) :: basic_grid_curve_2d
44 TYPE(c_ptr) :: basic_grid_curve_2d_deg
45 TYPE(c_ptr) :: basic_grid_unstruct
46 TYPE(c_ptr) :: basic_grid_unstruct_deg
47 TYPE(c_ptr) :: basic_grid_unstruct_ll
48 TYPE(c_ptr) :: basic_grid_unstruct_ll_deg
49 TYPE(c_ptr) :: basic_grid_unstruct_edge
50 TYPE(c_ptr) :: basic_grid_unstruct_edge_deg
51 TYPE(c_ptr) :: basic_grid_unstruct_edge_ll
52 TYPE(c_ptr) :: basic_grid_unstruct_edge_ll_deg
53 TYPE(c_ptr) :: basic_grid_cloud
54 TYPE(c_ptr) :: basic_grid_cloud_deg
55 TYPE(c_ptr) :: basic_grid_reg_2d_rot
56 TYPE(c_ptr) :: basic_grid_reg_2d_rot_deg
57 INTEGER(kind=c_size_t) :: num_cells
58 INTEGER(kind=c_size_t) :: num_corners
59 INTEGER(kind=c_size_t) :: num_edges
60 REAL(kind=c_double),
ALLOCATABLE :: cell_areas(:)
62 REAL(kind=c_double) :: &
63 cell_coords(3) = (/1.0_c_double, 0.0_c_double, 0.0_c_double/)
64 INTEGER(kind=c_int) :: cell_mask(1) = (/1_c_int/)
65 INTEGER(kind=c_size_t) :: cell_coord_idx, cell_coord_ll_idx
66 INTEGER(kind=c_size_t) :: cell_mask_idx, cell_mask_ll_idx
68 TYPE(c_ptr) :: grid_pair
69 TYPE(c_ptr) :: interp_grid
70 TYPE(c_ptr) :: interp_stack_config
71 TYPE(c_ptr) :: interp_stack_config_cpy
74 TYPE(c_ptr) :: scale_config
75 TYPE(c_ptr) :: spmap_config
76 TYPE(c_ptr) :: src_point_selection
77 TYPE(c_ptr) :: source_cell_area_config, target_cell_area_config
78 TYPE(c_ptr) :: overwrite_spmap_config
79 TYPE(c_ptr) :: overwrite_config
80 TYPE(c_ptr),
TARGET :: overwrite_configs(2)
82 INTEGER(kind=c_int) :: compare_value, test_value
83 LOGICAL :: ltest_value
85 INTEGER,
TARGET :: do_search_call_count
86 INTEGER,
TARGET :: constructor_call_count
88 TYPE(c_ptr) :: interp_weights
89 TYPE(c_ptr) :: collection_selection
90 TYPE(c_ptr) :: interpolation_gen_config
91 TYPE(c_ptr) :: interpolation_gen_config_copy
92 TYPE(c_ptr) :: interpolation
93 TYPE(c_ptr) :: interpolation_frac
94 TYPE(c_ptr) :: interpolation_ext
96 REAL(kind=c_double),
TARGET :: src_cell_data(1)
97 TYPE(c_ptr),
TARGET :: src_field_(1)
98 TYPE(c_ptr),
TARGET :: src_field_collection(1)
99 REAL(kind=c_double),
TARGET :: src_frac_mask(1)
100 TYPE(c_ptr),
TARGET :: src_frac_mask_(1)
101 TYPE(c_ptr),
TARGET :: src_frac_mask_collection(1)
102 REAL(kind=c_double),
TARGET :: tgt_cell_data(1)
103 TYPE(c_ptr),
TARGET :: tgt_field_collection(1)
106 SUBROUTINE c_unlink ( path ) bind ( c, name='unlink' )
107 use,
INTRINSIC :: iso_c_binding, only : c_char
108 CHARACTER(KIND=c_char),
DIMENSION(*) :: path
109 END SUBROUTINE c_unlink
127 CALL test(num_cells == 0_c_int)
130 basic_grid_reg_2d = &
132 "reg_2d_grid" // c_null_char, &
133 (/2_c_size_t, 2_c_size_t/), (/0_c_int, 0_c_int/), &
134 (/-0.1_c_double, 0.1_c_double/), (/-0.1_c_double, 0.1_c_double/))
138 CALL test(num_corners == 4_c_int)
145 cell_areas(:) = -1.0_c_double
147 CALL test(all(cell_areas(:) /= -1.0_c_double))
148 DEALLOCATE(cell_areas)
151 basic_grid_reg_2d_deg = &
153 "reg_2d_grid_deg" // c_null_char, &
154 (/2_c_size_t, 2_c_size_t/), (/0_c_int, 0_c_int/), &
155 (/-0.1_c_double, 0.1_c_double/), (/-0.1_c_double, 0.1_c_double/))
159 CALL test(num_corners == 4_c_int)
162 basic_grid_curve_2d = &
164 "curve_2d_grid" // c_null_char, &
165 (/2_c_size_t, 2_c_size_t/), (/0_c_int, 0_c_int/), &
166 (/-0.1_c_double, 0.1_c_double, -0.1_c_double, 0.1_c_double/), &
167 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/))
171 CALL test(num_edges == 4_c_int)
174 basic_grid_curve_2d_deg = &
176 "curve_2d_grid_deg" // c_null_char, &
177 (/2_c_size_t, 2_c_size_t/), (/0_c_int, 0_c_int/), &
178 (/-0.1_c_double, 0.1_c_double, -0.1_c_double, 0.1_c_double/), &
179 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/))
183 CALL test(num_edges == 4_c_int)
186 basic_grid_unstruct = &
188 "unstruct_grid" // c_null_char, &
189 4_c_size_t, 1_c_size_t, (/4_c_int/), &
190 (/-0.1_c_double, 0.1_c_double, 0.1_c_double, -0.1_c_double/), &
191 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/), &
192 (/0_c_int, 1_c_int, 2_c_int, 3_c_int/))
196 CALL test(num_edges == 4_c_int)
199 basic_grid_unstruct_deg = &
201 "unstruct_grid_deg" // c_null_char, &
202 4_c_size_t, 1_c_size_t, (/4_c_int/), &
203 (/-0.1_c_double, 0.1_c_double, 0.1_c_double, -0.1_c_double/), &
204 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/), &
205 (/0_c_int, 1_c_int, 2_c_int, 3_c_int/))
209 CALL test(num_edges == 4_c_int)
212 basic_grid_unstruct_ll = &
214 "unstruct_grid_ll" // c_null_char, &
215 4_c_size_t, 1_c_size_t, (/4_c_int/), &
216 (/-0.1_c_double, 0.1_c_double, 0.1_c_double, -0.1_c_double/), &
217 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/), &
218 (/0_c_int, 1_c_int, 2_c_int, 3_c_int/))
222 CALL test(num_edges == 4_c_int)
225 basic_grid_unstruct_ll_deg = &
227 "unstruct_grid_ll_deg" // c_null_char, &
228 4_c_size_t, 1_c_size_t, (/4_c_int/), &
229 (/-0.1_c_double, 0.1_c_double, 0.1_c_double, -0.1_c_double/), &
230 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/), &
231 (/0_c_int, 1_c_int, 2_c_int, 3_c_int/))
235 CALL test(num_edges == 4_c_int)
238 basic_grid_unstruct_edge = &
240 "unstruct_edge_grid" // c_null_char, &
241 4_c_size_t, 1_c_size_t, 4_c_size_t, (/4_c_int/), &
242 (/-0.1_c_double, 0.1_c_double, 0.1_c_double, -0.1_c_double/), &
243 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/), &
244 (/0_c_int, 1_c_int, 2_c_int, 3_c_int/), &
245 (/0_c_int, 1_c_int, 1_c_int, 2_c_int, &
246 2_c_int, 3_c_int, 3_c_int, 0_c_int/))
250 CALL test(num_edges == 4_c_int)
253 basic_grid_unstruct_edge_deg = &
255 "unstruct_grid_edge_deg" // c_null_char, &
256 4_c_size_t, 1_c_size_t, 4_c_size_t, (/4_c_int/), &
257 (/-0.1_c_double, 0.1_c_double, 0.1_c_double, -0.1_c_double/), &
258 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/), &
259 (/0_c_int, 1_c_int, 2_c_int, 3_c_int/), &
260 (/0_c_int, 1_c_int, 1_c_int, 2_c_int, &
261 2_c_int, 3_c_int, 3_c_int, 0_c_int/))
265 CALL test(num_edges == 4_c_int)
268 basic_grid_unstruct_edge_ll = &
270 "unstruct_grid_edge_ll" // c_null_char, &
271 4_c_size_t, 1_c_size_t, 4_c_size_t, (/4_c_int/), &
272 (/-0.1_c_double, 0.1_c_double, 0.1_c_double, -0.1_c_double/), &
273 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/), &
274 (/0_c_int, 1_c_int, 2_c_int, 3_c_int/), &
275 (/0_c_int, 1_c_int, 1_c_int, 2_c_int, &
276 2_c_int, 3_c_int, 3_c_int, 0_c_int/))
280 CALL test(num_edges == 4_c_int)
283 basic_grid_unstruct_edge_ll_deg = &
285 "unstruct_grid_edge_ll_deg" // c_null_char, &
286 4_c_size_t, 1_c_size_t, 4_c_size_t, (/4_c_int/), &
287 (/-0.1_c_double, 0.1_c_double, 0.1_c_double, -0.1_c_double/), &
288 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/), &
289 (/0_c_int, 1_c_int, 2_c_int, 3_c_int/), &
290 (/0_c_int, 1_c_int, 1_c_int, 2_c_int, &
291 2_c_int, 3_c_int, 3_c_int, 0_c_int/))
294 basic_grid_unstruct_edge_ll_deg, int(
yac_loc_edge, c_int))
295 CALL test(num_edges == 4_c_int)
300 "cloud_grid" // c_null_char, 4_c_size_t, &
301 (/-0.1_c_double, 0.1_c_double, 0.1_c_double, -0.1_c_double/), &
302 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/))
312 CALL test(num_cells == 0_c_int)
313 CALL test(num_corners == 4_c_int)
314 CALL test(num_edges == 0_c_int)
317 basic_grid_cloud_deg = &
319 "cloud_grid" // c_null_char, 4_c_size_t, &
320 (/-0.1_c_double, 0.1_c_double, 0.1_c_double, -0.1_c_double/), &
321 (/-0.1_c_double, -0.1_c_double, 0.1_c_double, 0.1_c_double/))
331 CALL test(num_cells == 0_c_int)
332 CALL test(num_corners == 4_c_int)
333 CALL test(num_edges == 0_c_int)
336 basic_grid_reg_2d_rot = &
338 "reg_2d_grid_deg" // c_null_char, &
339 (/2_c_size_t, 2_c_size_t/), (/0_c_int, 0_c_int/), &
340 (/-0.5_c_double, 0.5_c_double/) * yac_rad, &
341 (/-0.5_c_double, 0.5_c_double/) * yac_rad, &
342 180.0_c_double * yac_rad, 45.0_c_double * yac_rad)
346 CALL test(num_corners == 4_c_int)
349 basic_grid_reg_2d_rot_deg = &
351 "reg_2d_grid_deg" // c_null_char, &
352 (/2_c_size_t, 2_c_size_t/), (/0_c_int, 0_c_int/), &
353 (/-0.5_c_double, 0.5_c_double/), &
354 (/-0.5_c_double, 0.5_c_double/), &
355 180.0_c_double, 45.0_c_double)
359 CALL test(num_corners == 4_c_int)
364 basic_grid_unstruct,
yac_loc_cell, cell_coords, 1_c_size_t)
365 cell_coord_ll_idx = &
367 basic_grid_unstruct_ll,
yac_loc_cell, cell_coords, 1_c_size_t)
370 basic_grid_unstruct,
yac_loc_cell, cell_mask, 1_c_size_t, &
371 "cell_mask" // c_null_char)
374 basic_grid_unstruct_ll,
yac_loc_cell, cell_mask, 1_c_size_t, &
375 "cell_mask_ll" // c_null_char)
380 basic_grid_unstruct, basic_grid_unstruct_ll, mpi_comm_world)
385 grid_pair,
"unstruct_grid" // c_null_char, &
386 "unstruct_grid_ll" // c_null_char, &
387 1_c_size_t, (/
yac_loc_cell/), (/cell_coord_idx/), (/cell_mask_idx/), &
392 c_funloc(constructor_callback), c_loc(constructor_call_count), &
393 "constructor_callback" // c_null_char)
396 "do_search_callback" // c_null_char)
399 source_cell_area_config = &
402 target_cell_area_config = &
408 source_cell_area_config, target_cell_area_config)
409 src_point_selection = &
411 0.0_c_double, 0.0_c_double, 0.1_c_double)
418 overwrite_spmap_config = &
426 src_point_selection, overwrite_spmap_config)
427 overwrite_configs = (/overwrite_config, c_null_ptr/)
430 constructor_call_count = 0
431 do_search_call_count = 0
434 interp_stack_config,
"constructor_callback" // c_null_char, &
435 "do_search_callback" // c_null_char)
440 interp_stack_config_cpy = &
475 interp_stack_config, spmap_config, c_loc(overwrite_configs(1)))
478 interp_stack_config,
"test_fortran_api_weights.nc" // c_null_char, &
482 interp_stack_config, -1.0_c_double)
500 interp_stack_config, interp_stack_config_cpy)
501 CALL test(compare_value /= 0_c_int)
504 CALL test(constructor_call_count == 0)
507 CALL test(constructor_call_count == 1)
510 CALL test(do_search_call_count == 0)
514 interp_weights,
"test_fortran_api_weights.nc" // c_null_char, &
515 "unstruct_grid" // c_null_char,
"unstruct_grid_ll" // c_null_char, &
517 CALL test(do_search_call_count == 1)
524 1.0_c_double, 0.0_c_double, c_null_char, 1_c_int, 1_c_int)
525 interpolation_frac = &
528 0.0_c_double, 1.0_c_double, 0.0_c_double, c_null_char, 1_c_int, 1_c_int)
532 CALL test(ltest_value)
535 collection_selection = &
540 collection_selection = &
548 interpolation_gen_config, 1_c_size_t)
550 interpolation_gen_config, collection_selection)
552 interpolation_gen_config, 1.0_c_double)
554 interpolation_gen_config, 2.0_c_double)
556 interpolation_gen_config, 2.0_c_double)
558 interpolation_gen_config,
"" // c_null_char)
559 interpolation_gen_config_copy = &
563 interpolation_ext = &
565 interp_weights, interpolation_gen_config, 1_c_int, 1_c_int)
567 src_field_(1) = c_loc(src_cell_data(1))
568 src_field_collection(1) = c_loc(src_field_(1))
569 src_frac_mask_(1) = c_loc(src_frac_mask)
570 src_frac_mask_collection(1) = c_loc(src_frac_mask_(1))
571 tgt_field_collection(1) = c_loc(tgt_cell_data(1))
572 src_cell_data(1) = 1.0_c_double
573 src_frac_mask(1) = 0.0_c_double
575 tgt_cell_data(1) = -1.0_c_double
577 interpolation, c_loc(src_field_collection), c_loc(tgt_field_collection))
578 CALL test(tgt_cell_data(1) == src_cell_data(1))
580 tgt_cell_data(1) = -1.0_c_double
582 interpolation_frac, c_loc(src_field_collection), &
583 c_loc(src_frac_mask_collection), c_loc(tgt_field_collection))
584 CALL test(tgt_cell_data(1) == 0.0_c_double)
586 tgt_cell_data(1) = -1.0_c_double
588 CALL test(test_value == 1_c_int)
590 interpolation, c_loc(src_field_collection))
592 interpolation, c_loc(tgt_field_collection))
593 CALL test(tgt_cell_data(1) == src_cell_data(1))
595 tgt_cell_data(1) = -1.0_c_double
597 interpolation_frac, c_loc(tgt_field_collection))
599 CALL test(test_value == 0_c_int)
600 CALL mpi_barrier(mpi_comm_world, ierror)
602 interpolation_frac, c_loc(src_field_collection), &
603 c_loc(src_frac_mask_collection))
605 CALL test(tgt_cell_data(1) == 0.0_c_double)
606 tgt_cell_data(1) = -1.0_c_double
615 CALL c_unlink(
"test_fortran_api_weights.nc" // c_null_char)
650 SUBROUTINE constructor_callback(user_data)
BIND(C)
652 TYPE(c_ptr),
value :: user_data
654 INTEGER,
POINTER :: constructor_call_count
656 CALL c_f_pointer(user_data, constructor_call_count)
658 constructor_call_count = constructor_call_count + 1
660 END SUBROUTINE constructor_callback
663 global_ids, coordinates_xyz, count, user_data)
BIND(C)
665 TYPE(c_ptr),
value :: global_ids
666 TYPE(c_ptr),
value :: coordinates_xyz
667 INTEGER(kind=c_size_t),
value :: count
668 TYPE(c_ptr),
value :: user_data
670 INTEGER,
POINTER :: do_search_call_count
676 CALL c_f_pointer(user_data, do_search_call_count)
678 do_search_call_count = do_search_call_count + 1
static size_t do_search_callback(struct interp_method *method, struct yac_interp_grid *interp_grid, size_t *tgt_points, size_t count, struct yac_interp_weights *weights, int *interpolation_complete)
subroutine, public start_test(name)
subroutine, public stop_test()
subroutine, public exit_tests()
integer(kind=c_int), parameter yac_interp_ncc_partial_coverage_default_f
character(kind=c_char, len= *), parameter yac_interp_spmap_varname_default_f
type(c_ptr) function yac_collection_selection_new_c(collection_size, selection_indices)
integer(kind=c_int), parameter yac_interp_nnn_weighted_default_f
integer(kind=c_int), parameter yac_interp_avg_partial_coverage_default_f
real(kind=c_double), parameter yac_interp_nnn_max_search_distance_default_f
@ yac_weight_file_overwrite
integer(kind=c_int), parameter yac_interp_conserv_normalisation_default_f
integer(kind=c_int), parameter yac_interp_avg_weight_type_default_f
integer(kind=c_size_t), parameter yac_interp_rbf_n_default_f
integer(kind=c_int), parameter yac_interp_file_on_missing_file_default_f
real(kind=c_double), parameter yac_interp_rbf_scale_default_f
integer(kind=c_int), parameter yac_interp_spmap_min_global_id_default_f
integer(kind=c_int), parameter yac_interp_ncc_weight_type_default_f
type(c_ptr), parameter yac_interp_spmap_overwrite_default_f
integer(kind=c_int), parameter yac_interp_spmap_weighted_default_f
integer(kind=c_int), parameter yac_interp_conserv_order_default_f
character(kind=c_char, len= *), parameter yac_interp_spmap_filename_default_f
real(kind=c_double), parameter yac_interp_spmap_spread_distance_default_f
real(kind=c_double), parameter yac_interp_nnn_gauss_scale_default_f
character(kind=c_char, len= *), parameter yac_interp_check_constructor_key_default_f
integer(kind=c_int), parameter yac_interp_file_on_success_default_f
integer(kind=c_int), parameter yac_interp_conserv_partial_coverage_default_f
real(kind=c_double), parameter yac_interp_spmap_sphere_radius_default_f
integer(kind=c_int), parameter yac_interp_conserv_enforced_conserv_default_f
integer(kind=c_size_t), parameter yac_interp_nnn_n_default_f
real(kind=c_double), parameter yac_interp_rbf_max_search_distance_default_f
type(c_ptr), parameter yac_interp_spmap_config_default_f
real(kind=c_double), parameter yac_interp_spmap_max_search_distance_default_f
integer(kind=c_int), parameter yac_interp_creep_distance_default_f
character(kind=c_char, len= *), parameter yac_interp_check_do_search_key_default_f
integer(kind=c_int), parameter yac_interp_spmap_scale_type_default_f