9#include "test_macros.inc"
11#define NOP(x) associate( x => x ); end associate
21 INTEGER :: global_rank, global_size
22 LOGICAL :: is_target, is_empty_source
24 CHARACTER (LEN=*),
PARAMETER :: src_comp_name =
'source_comp'
25 CHARACTER (LEN=*),
PARAMETER :: tgt_comp_name =
'target_comp'
26 CHARACTER (LEN=*),
PARAMETER :: src_grid_name =
'source_grid'
27 CHARACTER (LEN=*),
PARAMETER :: tgt_grid_name =
'target_grid'
28 CHARACTER (LEN=*),
PARAMETER :: even_mask_name =
'even_mask'
29 CHARACTER (LEN=*),
PARAMETER :: odd_mask_name =
'odd_mask'
34 INTEGER,
PARAMETER :: collection_size = 3
35 INTEGER,
PARAMETER :: num_pointsets = 1
36 INTEGER,
PARAMETER :: num_points = 9
38 INTEGER :: config_from_file, with_field_mask
39 INTEGER :: source_mask_type, target_mask_type
41 INTEGER :: instance_id
42 INTEGER :: comp_id, grid_id, point_id, field_ids(3,3,2,2)
43 INTEGER :: default_mask_id, dummy_mask_id
45 INTEGER :: interp_stack_config
46 CHARACTER(LEN=YAC_MAX_CHARLEN) :: field_name
48 CHARACTER(LEN=YAC_MAX_CHARLEN) :: tgt_mask_name
50 DOUBLE PRECISION :: send_field(num_points, num_pointsets, collection_size)
51 DOUBLE PRECISION,
TARGET :: recv_field(num_points, collection_size)
54 LOGICAL :: check_recv_field
56 INTEGER :: i, j, k, t, info, ierror
58 INTEGER,
PARAMETER :: max_opt_arg_len = 1024
59 CHARACTER(max_opt_arg_len) :: config_dir
61 TYPE(
yac_dble_ptr) :: buffer_ptr(num_pointsets, collection_size)
62 DOUBLE PRECISION,
ALLOCATABLE,
TARGET :: buffer(:)
64 DOUBLE PRECISION,
PARAMETER :: yac_rad = 0.017453292519943295769d0
68 mask_type_str(1)%string =
"even"
69 mask_type_str(2)%string =
"odd"
70 mask_type_str(3)%string =
"none"
71 with_str(1)%string =
"without"
72 with_str(2)%string =
"with"
73 from_file_str(1)%string =
"manual"
74 from_file_str(2)%string =
"yaml"
82 CALL test(command_argument_count() == 1)
83 CALL get_command_argument(1, config_dir, arg_len)
85 CALL mpi_comm_rank(mpi_comm_world, global_rank, ierror)
86 CALL mpi_comm_size(mpi_comm_world, global_size, ierror)
88 IF (global_size /= 3)
THEN
89 WRITE ( * , * )
"Wrong number of processes (should be 3)"
93 is_target = global_rank == 1
94 is_empty_source = global_rank == 2
106 instance_id, trim(config_dir) //
"coupling_test9.yaml")
117 IF (is_empty_source)
THEN
120 0, 0, 0, [
INTEGER :: ], [
REAL :: ], &
121 [
REAL :: ], [
INTEGER :: ], grid_id)
125 [real :: ], [real :: ], point_id)
130 [
INTEGER :: ], default_mask_id)
133 [
INTEGER :: ], even_mask_name, dummy_mask_id)
136 [
LOGICAL :: ], odd_mask_name, dummy_mask_id)
139 merge(tgt_grid_name, src_grid_name, is_target), &
140 (/3,3/), (/0,0/), (/0.0,1.0,2.0/) * yac_rad, &
141 (/0.0,1.0,2.0/) * yac_rad, grid_id)
145 (/0.0,1.0,2.0/) * yac_rad, (/0.0,1.0,2.0/) * yac_rad, point_id)
150 (/1,0,0, 0,0,0, 0,0,0/), default_mask_id)
153 (/0,1,0, 1,0,1, 0,1,0/), even_mask_name, dummy_mask_id)
156 (/.true.,.false.,.true., .false.,.true.,.false., .true.,.false.,.true./), &
157 odd_mask_name, dummy_mask_id)
161 DO config_from_file = 1, 2
162 DO with_field_mask = 1, 2
163 DO source_mask_type = 1, 3
164 DO target_mask_type = 1, 3
165 WRITE (field_name,
"('src2tgt_',A,'_',A,'_field_mask_',A,'_src_mask_',A,'_tgt_mask')") &
166 trim(from_file_str(config_from_file)%string), &
167 trim(with_str(with_field_mask)%string), &
168 trim(mask_type_str(source_mask_type)%string), &
169 trim(mask_type_str(target_mask_type)%string)
170 IF (with_field_mask == 1)
THEN
172 field_name, comp_id, (/point_id/), num_pointsets, &
174 field_ids(target_mask_type, source_mask_type, &
175 with_field_mask, config_from_file))
178 field_name, comp_id, (/point_id/), (/default_mask_id/), &
180 field_ids(target_mask_type, source_mask_type, &
181 with_field_mask, config_from_file))
192 DO with_field_mask = 1, 2
193 DO source_mask_type = 1, 3
194 IF (source_mask_type == 1)
THEN
195 src_mask_names(1)%string = even_mask_name
196 ELSE IF (source_mask_type == 2)
THEN
197 src_mask_names(1)%string = odd_mask_name
199 DO target_mask_type = 1, 3
200 IF (target_mask_type == 1)
THEN
201 tgt_mask_name = even_mask_name
202 ELSE IF (target_mask_type == 2)
THEN
203 tgt_mask_name = odd_mask_name
205 WRITE (field_name,
"('src2tgt_manual_',A,'_field_mask_',A,'_src_mask_',A,'_tgt_mask')") &
206 trim(with_str(with_field_mask)%string), &
207 trim(mask_type_str(source_mask_type)%string), &
208 trim(mask_type_str(target_mask_type)%string)
209 IF (source_mask_type /= 3)
THEN
210 IF (target_mask_type /= 3)
THEN
213 src_comp_name, src_grid_name, field_name, &
214 tgt_comp_name, tgt_grid_name, field_name, &
216 interp_stack_config, 0, 0, &
217 src_mask_names = src_mask_names, &
218 tgt_mask_name = tgt_mask_name )
221 src_comp_name, src_grid_name, field_name, &
222 tgt_comp_name, tgt_grid_name, field_name, &
224 interp_stack_config, 0, 0, &
225 src_mask_names = src_mask_names, &
226 tgt_mask_name = tgt_mask_name )
231 src_comp_name, src_grid_name, field_name, &
232 tgt_comp_name, tgt_grid_name, field_name, &
234 interp_stack_config, 0, 0, &
235 src_mask_names = src_mask_names)
238 src_comp_name, src_grid_name, field_name, &
239 tgt_comp_name, tgt_grid_name, field_name, &
241 interp_stack_config, 0, 0, &
242 src_mask_names = src_mask_names)
246 IF (target_mask_type /= 3)
THEN
249 src_comp_name, src_grid_name, field_name, &
250 tgt_comp_name, tgt_grid_name, field_name, &
252 interp_stack_config, 0, 0, &
253 tgt_mask_name = tgt_mask_name )
256 src_comp_name, src_grid_name, field_name, &
257 tgt_comp_name, tgt_grid_name, field_name, &
259 interp_stack_config, 0, 0, &
260 tgt_mask_name = tgt_mask_name )
265 src_comp_name, src_grid_name, field_name, &
266 tgt_comp_name, tgt_grid_name, field_name, &
268 interp_stack_config, 0, 0)
271 src_comp_name, src_grid_name, field_name, &
272 tgt_comp_name, tgt_grid_name, field_name, &
274 interp_stack_config, 0, 0)
291 (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, &
292 11,12,13,14,15,16,17,18,19, &
293 21,22,23,24,25,26,27,28,29/), &
294 (/num_points, num_pointsets, collection_size/))
296 DO j = 1, collection_size
297 recv_field_ptr(j)%p => recv_field(:,j)
302 DO j=1,collection_size
303 buffer_ptr(i,j)%p => buffer
310 IF (.NOT. is_target)
THEN
312 DO config_from_file = 1, 2
313 DO with_field_mask = 1, 2
314 DO source_mask_type = 1, 3
315 DO target_mask_type = 1, 3
316 IF(is_empty_source)
THEN
318 field_ids(target_mask_type, source_mask_type, &
319 with_field_mask, config_from_file), &
320 num_pointsets, collection_size, &
321 buffer_ptr, info, ierror)
324 field_ids(target_mask_type, source_mask_type, &
325 with_field_mask, config_from_file), &
326 num_points, num_pointsets, collection_size, &
327 send_field, info, ierror)
330 field_ids(target_mask_type, source_mask_type, &
331 with_field_mask, config_from_file))
332 CALL test(ierror == 0)
342 DO config_from_file = 1, 2
343 DO with_field_mask = 1, 2
344 DO source_mask_type = 1, 3
345 DO target_mask_type = 1, 3
350 IF (iand(t, 1) == 1)
THEN
352 field_ids(target_mask_type, source_mask_type, &
353 with_field_mask, config_from_file), &
354 num_points, collection_size, &
355 recv_field, info, ierror)
358 field_ids(target_mask_type, source_mask_type, &
359 with_field_mask, config_from_file), &
360 collection_size, recv_field_ptr, info, ierror)
362 field_ids(target_mask_type, source_mask_type, &
363 with_field_mask, config_from_file))
365 CALL test(ierror == 0)
368 DO j = 1, collection_size
372 recv_field(k,j), k, j, with_field_mask == 2, &
373 target_mask_type, source_mask_type)
374 CALL test(.NOT. check_recv_field)
392 CALL mpi_finalize(ierror)
403 USE mpi,
ONLY : mpi_abort, mpi_comm_world
408 CALL test ( .false. )
411 CALL mpi_abort ( mpi_comm_world, 999, ierror )
415 FUNCTION check_src_even_mask(value, idx, collection_idx, with_field_mask)
416 DOUBLE PRECISION,
INTENT(IN) :: value
417 INTEGER,
INTENT(IN) :: idx
418 INTEGER,
INTENT(IN) :: collection_idx
419 LOGICAL,
INTENT(IN) :: with_field_mask
420 LOGICAL :: check_src_even_mask
425 check_src_even_mask = (
value < 0.0) .OR. (iand(int(
value), 1) /= 0)
428 FUNCTION check_src_odd_mask(value, idx, collection_idx, with_field_mask)
429 DOUBLE PRECISION,
INTENT(IN) :: value
430 INTEGER,
INTENT(IN) :: idx
431 INTEGER,
INTENT(IN) :: collection_idx
432 LOGICAL,
INTENT(IN) :: with_field_mask
433 LOGICAL :: check_src_odd_mask
438 check_src_odd_mask = (
value < 0.0) .OR. (iand(int(
value), 1) /= 1)
441 FUNCTION check_src_no_mask(value, idx, collection_idx, with_field_mask)
442 DOUBLE PRECISION,
INTENT(IN) :: value
443 INTEGER,
INTENT(IN) :: idx
444 INTEGER,
INTENT(IN) :: collection_idx
445 LOGICAL,
INTENT(IN) :: with_field_mask
446 LOGICAL :: check_src_no_mask
448 check_src_no_mask = &
450 int(
value) /= 1 + 10 * (collection_idx - 1), &
451 int(
value) /= idx + 10 * (collection_idx - 1), with_field_mask)
454 FUNCTION check_tgt_even_mask( &
455 value, idx, with_field_mask, check_src)
456 DOUBLE PRECISION,
INTENT(IN) :: value
457 INTEGER,
INTENT(IN) :: idx
458 LOGICAL,
INTENT(IN) :: with_field_mask
460 LOGICAL :: check_tgt_even_mask
463 check_tgt_even_mask =
merge(check_src,
value /= -1.0d0, iand(idx, 1) == 0)
466 FUNCTION check_tgt_odd_mask( &
467 value, idx, with_field_mask, check_src)
468 DOUBLE PRECISION,
INTENT(IN) :: value
469 INTEGER,
INTENT(IN) :: idx
470 LOGICAL,
INTENT(IN) :: with_field_mask
472 LOGICAL :: check_tgt_odd_mask
475 check_tgt_odd_mask =
merge(check_src,
value /= -1.0d0, iand(idx, 1) == 1)
478 FUNCTION check_tgt_no_mask( &
479 value, idx, with_field_mask, check_src)
480 DOUBLE PRECISION,
INTENT(IN) :: value
481 INTEGER,
INTENT(IN) :: idx
482 LOGICAL,
INTENT(IN) :: with_field_mask
484 LOGICAL :: check_tgt_no_mask
486 check_tgt_no_mask = &
487 merge(
value /= -1.0d0, check_src, with_field_mask .AND. (idx /= 1))
490 FUNCTION check_src( &
491 value, idx, collection_idx, with_field_mask, source_mask_type)
492 DOUBLE PRECISION,
INTENT(IN) :: value
493 INTEGER,
INTENT(IN) :: idx
494 INTEGER,
INTENT(IN) :: collection_idx
495 LOGICAL,
INTENT(IN) :: with_field_mask
496 INTEGER :: source_mask_type
499 SELECT CASE (source_mask_type)
502 check_src_even_mask( &
503 value, idx, collection_idx, with_field_mask)
506 check_src_odd_mask( &
507 value, idx, collection_idx, with_field_mask)
511 value, idx, collection_idx, with_field_mask)
517 FUNCTION check_tgt( &
518 value, idx, collection_idx, with_field_mask, &
519 target_mask_type, source_mask_type)
520 DOUBLE PRECISION,
INTENT(IN) :: value
521 INTEGER,
INTENT(IN) :: idx
522 INTEGER,
INTENT(IN) :: collection_idx
523 LOGICAL,
INTENT(IN) :: with_field_mask
524 INTEGER :: target_mask_type
525 INTEGER :: source_mask_type
528 SELECT CASE (target_mask_type)
531 check_tgt_even_mask( &
532 value, idx, with_field_mask, &
534 value, idx, collection_idx, with_field_mask, &
538 check_tgt_odd_mask( &
539 value, idx, with_field_mask, &
541 value, idx, collection_idx, with_field_mask, &
546 value, idx, with_field_mask, &
548 value, idx, collection_idx, with_field_mask, &
Fortran interface for definition of a couple.
Fortran interface for the definition of coupling fields using explicit masks.
Fortran interface for the definition of coupling fields using default masks.
Fortran interface for the definition of grids.
Fortran interface for the definition of masks.
Fortran interface for the definition of points.
Fortran interface for invoking the end of the definition phase.
Fortran interface for the coupler termination.
Fortran interface for asynchronous receiving coupling fields.
Fortran interfaces for the definition of an interpolation stack.
Fortran interface for receiving coupling fields.
Fortran interface for sending coupling fields.
Fortran interface for the reading of configuration files.
Fortran interface for testing fields for active communicaitons.
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_action_coupling
data exchange
@ yac_proleptic_gregorian
@ yac_reduction_time_none