9#include "test_macros.inc"
16 use,
INTRINSIC :: iso_c_binding
23 FUNCTION yac_generate_basic_grid_reg2d_c( &
24 name, coordinates_x, coordinates_y, num_cells, &
25 local_start, local_count, with_halo) &
26 bind( c, name=
'yac_generate_basic_grid_reg2d' )
28 use,
INTRINSIC :: iso_c_binding
30 CHARACTER(KIND=c_char) :: name(*)
31 REAL(kind=c_double) :: coordinates_x(*)
32 REAL(kind=c_double) :: coordinates_y(*)
33 INTEGER(kind=c_size_t) :: num_cells(2)
34 INTEGER(kind=c_size_t) :: local_start(2)
35 INTEGER(kind=c_size_t) :: local_count(2)
36 INTEGER(kind=c_int),
value :: with_halo
38 TYPE(c_ptr) :: yac_generate_basic_grid_reg2d_c
39 END FUNCTION yac_generate_basic_grid_reg2d_c
42 CHARACTER(LEN=*),
PARAMETER :: grid_name_src =
"src_grid"
43 CHARACTER(LEN=*),
PARAMETER :: grid_name_tgt =
"tgt_grid"
44 INTEGER(kind=c_size_t),
PARAMETER :: collection_size = 10
46 INTEGER,
PARAMETER :: max_opt_arg_len = 1024
47 CHARACTER(max_opt_arg_len) :: reorder_type_arg
48 INTEGER(KIND=c_int) :: reorder_type
51 INTEGER :: comm_rank, comm_size, ierror
57 REAL(KIND=c_double),
PARAMETER :: &
58 yac_rad = 0.01745329251994329576923690768489_c_double
65 CALL test(command_argument_count() == 1)
66 CALL get_command_argument(1, reorder_type_arg, arg_len)
67 CALL test((reorder_type_arg ==
"src") .OR. (reorder_type_arg ==
"tgt"))
71 CALL mpi_comm_rank(mpi_comm_world, comm_rank, ierror)
72 CALL mpi_comm_size(mpi_comm_world, comm_size, ierror)
73 CALL test(comm_size == 4)
74 CALL mpi_barrier(mpi_comm_world, ierror)
78 tgt_flag = comm_rank < 2
80 CALL mpi_comm_split( &
81 mpi_comm_world,
merge(1,0,tgt_flag), 0, split_comm, ierror)
84 CALL target_main(mpi_comm_world, split_comm, reorder_type)
86 CALL source_main(mpi_comm_world, split_comm, reorder_type)
89 CALL mpi_comm_free(split_comm, ierror)
121 SUBROUTINE source_main(global_comm, source_comm, reorder_type)
123 INTEGER,
INTENT(IN) :: global_comm
124 INTEGER,
INTENT(IN) :: source_comm
125 INTEGER(KIND=c_int) :: reorder_type
127 INTEGER :: my_source_rank, ierror
128 INTEGER(KIND=c_size_t) :: i
130 REAL(KIND=c_double),
PARAMETER :: &
131 coordinates_x(6) = (/0.0_c_double, 1.0_c_double, 2.0_c_double, &
132 3.0_c_double, 4.0_c_double, 5.0_c_double/) * yac_rad
133 REAL(KIND=c_double),
PARAMETER :: &
134 coordinates_y(5) = (/0.0_c_double, 1.0_c_double, 2.0_c_double, &
135 3.0_c_double, 4.0_c_double/) * yac_rad
136 INTEGER(KIND=c_size_t),
PARAMETER :: num_cells(2) = (/5,4/)
137 INTEGER(KIND=c_size_t),
PARAMETER :: &
138 local_start(2,2) = reshape((/0,0,3,0/),(/2,2/))
139 INTEGER(KIND=c_size_t),
PARAMETER :: &
140 local_count(2,2) = reshape((/3,4,2,4/),(/2,2/))
141 INTEGER(KIND=c_int),
PARAMETER :: with_halo = 1
143 INTEGER,
PARAMETER :: &
144 src_data_int(25,2) = &
156 -1,-1,-1,-1,-1/), (/25,2/))
157 REAL(KIND=c_double),
ALLOCATABLE,
TARGET :: src_data(:,:)
158 INTEGER(KIND=c_size_t) :: data_size
159 TYPE(c_ptr),
TARGET :: src_field_(collection_size)
160 TYPE(c_ptr),
TARGET :: src_field_collection(collection_size)
161 TYPE(c_ptr) :: src_field
163 TYPE(c_ptr) :: src_grid, tgt_grid
164 TYPE(c_ptr) :: grid_pair
165 TYPE(c_ptr) :: interp_grid
166 TYPE(c_ptr) :: interp_stack_config
167 TYPE(c_ptr) :: interp_method_stack
168 TYPE(c_ptr) :: interp_weights
169 TYPE(c_ptr) :: interpolation
171 CALL mpi_comm_rank(source_comm, my_source_rank, ierror)
174 yac_generate_basic_grid_reg2d_c( &
175 trim(grid_name_src) // c_null_char, &
176 coordinates_x, coordinates_y, num_cells, &
177 local_start(:, my_source_rank + 1), &
178 local_count(:, my_source_rank + 1), with_halo)
186 grid_pair, trim(grid_name_src) // c_null_char, &
187 trim(grid_name_tgt) // c_null_char, 1_c_size_t, &
195 interp_stack_config, 1337.0_c_double)
197 interp_method_stack = &
205 interp_weights, reorder_type, collection_size, &
207 1.0_c_double, 0.0_c_double, c_null_char, 1_c_int, 1_c_int)
217 ALLOCATE(src_data(data_size, collection_size))
218 DO i = 1, collection_size
219 src_data(1:data_size,i) = &
221 src_data_int(1:data_size,my_source_rank+1) + INT(i * 30), c_double)
222 src_field_(i) = c_loc(src_data(:,i))
223 src_field_collection(i) = c_loc(src_field_(i))
225 src_field = c_loc(src_field_collection)
260 SUBROUTINE target_main(global_comm, target_comm, reorder_type)
263 INTEGER,
INTENT(IN) :: global_comm
264 INTEGER,
INTENT(IN) :: target_comm
265 INTEGER(KIND=c_int) :: reorder_type
267 INTEGER :: my_target_rank, ierror
268 INTEGER(KIND=c_size_t) :: i, j
270 REAL(KIND=c_double),
PARAMETER :: &
271 coordinates_x(7) = (/0.5_c_double, 1.5_c_double, 2.5_c_double, &
272 3.5_c_double, 4.5_c_double, 5.5_c_double, &
273 6.5_c_double/) * yac_rad
274 REAL(KIND=c_double),
PARAMETER :: &
275 coordinates_y(4) = (/0.5_c_double, 1.5_c_double, &
276 2.5_c_double, 3.5_c_double/) * yac_rad
277 INTEGER(KIND=c_size_t),
PARAMETER :: num_cells(2) = (/6,3/)
278 INTEGER(KIND=c_size_t),
PARAMETER :: &
279 local_start(2,2) = reshape((/0,0,3,0/),(/2,2/))
280 INTEGER(KIND=c_size_t),
PARAMETER :: &
281 local_count(2,2) = reshape((/3,3,3,3/),(/2,2/))
282 INTEGER(KIND=c_int),
PARAMETER :: with_halo = 0
284 REAL(KIND=c_double),
TARGET :: tgt_data(16, collection_size)
285 REAL(KIND=c_double),
PARAMETER :: &
286 ref_tgt_data(16, 2) = &
288 (/3.5_c_double,4.5_c_double,5.5_c_double,6.5_c_double, &
289 9.5_c_double,10.5_c_double,11.5_c_double,12.5_c_double, &
290 15.5_c_double,16.5_c_double,17.5_c_double,18.5_c_double, &
291 21.5_c_double,22.5_c_double,23.5_c_double,24.5_c_double, &
292 6.5_c_double,7.5_c_double,1337.0_c_double,1337.0_c_double, &
293 12.5_c_double,13.5_c_double,1337.0_c_double,1337.0_c_double, &
294 18.5_c_double,19.5_c_double,1337.0_c_double,1337.0_c_double, &
295 24.5_c_double,25.5_c_double,1337.0_c_double,1337.0_c_double/), &
297 TYPE(c_ptr),
TARGET :: tgt_field_collection(collection_size)
298 TYPE(c_ptr) :: tgt_field
299 REAL(kind=c_double) :: ref_tgt_value
301 TYPE(c_ptr) :: src_grid, tgt_grid
302 TYPE(c_ptr) :: grid_pair
303 TYPE(c_ptr) :: interp_grid
304 TYPE(c_ptr) :: interp_stack_config
305 TYPE(c_ptr) :: interp_method_stack
306 TYPE(c_ptr) :: interp_weights
307 TYPE(c_ptr) :: interpolation
309 CALL mpi_comm_rank(target_comm, my_target_rank, ierror)
312 yac_generate_basic_grid_reg2d_c( &
313 trim(grid_name_tgt) // c_null_char, &
314 coordinates_x, coordinates_y, num_cells, &
315 local_start(:, my_target_rank + 1), &
316 local_count(:, my_target_rank + 1), with_halo)
324 grid_pair, trim(grid_name_src) // c_null_char, &
325 trim(grid_name_tgt) // c_null_char, 1_c_size_t, &
333 interp_stack_config, 1337.0_c_double)
335 interp_method_stack = &
343 interp_weights, reorder_type, collection_size, &
345 1.0_c_double, 0.0_c_double, c_null_char, 1_c_int, 1_c_int)
347 tgt_data = -1.0_c_double
348 DO i = 1, collection_size
349 tgt_field_collection(i) = c_loc(tgt_data(:,i))
351 tgt_field = c_loc(tgt_field_collection)
355 DO i = 1, collection_size
356 DO j = 1, 16_c_size_t
357 IF (ref_tgt_data(j, my_target_rank+1) == 1337.0_c_double)
THEN
358 ref_tgt_value = 1337.0_c_double
361 ref_tgt_data(j, my_target_rank+1) + &
362 REAL(i * 30_c_size_t, c_double)
364 CALL test(tgt_data(j,i) == ref_tgt_value)
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)
subroutine, public start_test(name)
subroutine, public stop_test()
subroutine, public exit_tests()
@ yac_interp_avg_arithmetic