YAC 3.13.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_duplicate_stencils_parallel.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
11PROGRAM main
12
13 use, INTRINSIC :: iso_c_binding
14 USE utest
15 USE yac_core
16 USE yac_utils
17 USE mpi
18
19 IMPLICIT NONE
20
21 INTERFACE
22 SUBROUTINE write_dummy_scrip_grid_file_c ( &
23 grid_name, grid_filename, mask_filename, &
24 with_corner, num_lon, num_lat, lon_range, lat_range ) &
25 bind( c, name='write_dummy_scrip_grid_file' )
26 use, INTRINSIC :: iso_c_binding, only : c_char, c_int, c_size_t, c_double
27 CHARACTER(KIND=c_char), DIMENSION(*) :: grid_name
28 CHARACTER(KIND=c_char), DIMENSION(*) :: grid_filename
29 CHARACTER(KIND=c_char), DIMENSION(*) :: mask_filename
30 INTEGER(KIND=c_int), value :: with_corner
31 INTEGER(KIND=c_size_t), value :: num_lon
32 INTEGER(KIND=c_size_t), value :: num_lat
33 REAL(KIND=c_double), DIMENSION(*) :: lat_range
34 REAL(KIND=c_double), DIMENSION(*) :: lon_range
35 END SUBROUTINE write_dummy_scrip_grid_file_c
36 END INTERFACE
37
38 INTERFACE
39 SUBROUTINE c_unlink ( path ) bind ( c, name='unlink' )
40 use, INTRINSIC :: iso_c_binding, only : c_char
41 CHARACTER(KIND=c_char), DIMENSION(*) :: path
42 END SUBROUTINE c_unlink
43 END INTERFACE
44
45 INTEGER :: comm_size, comm_rank
46 INTEGER :: ierror
47
48 CHARACTER(KIND=c_char,LEN=*), PARAMETER :: src_grid_name = &
49 "source_grid" // c_null_char
50 CHARACTER(KIND=c_char,LEN=*), PARAMETER :: src_grid_filename = &
51 "test_duplicate_stencils_parallel_src_grids.nc" // c_null_char
52 CHARACTER(KIND=c_char,LEN=*), PARAMETER :: src_mask_filename = &
53 "test_duplicate_stencils_parallel_src_masks.nc" // c_null_char
54 CHARACTER(KIND=c_char,LEN=*), PARAMETER :: tgt_grid_name = &
55 "target_grid" // c_null_char
56 CHARACTER(KIND=c_char,LEN=*), PARAMETER :: tgt_grid_filename = &
57 "test_duplicate_stencils_parallel_tgt_grids.nc" // c_null_char
58 CHARACTER(KIND=c_char,LEN=*), PARAMETER :: tgt_mask_filename = &
59 "test_duplicate_stencils_parallel_tgt_masks.nc" // c_null_char
60
61 INTEGER(KIND=C_INT), PARAMETER :: with_corner = 1_c_int
62 INTEGER(KIND=C_INT), PARAMETER :: valid_mask_value = 0_c_int
63 INTEGER(KIND=C_INT), PARAMETER :: use_ll_edges = 0_c_int
64
65 INTEGER(KIND=C_SIZE_T) :: src_cell_coord_idx
66 TYPE(C_PTR) :: src_duplicated_cell_idx
67 TYPE(C_PTR) :: src_orig_cell_global_id
68 INTEGER(KIND=C_SIZE_T) :: src_nbr_duplicated_cells
69
70 INTEGER(KIND=C_SIZE_T) :: tgt_cell_coord_idx
71 TYPE(C_PTR) :: tgt_duplicated_cell_idx
72 TYPE(C_PTR) :: tgt_orig_cell_global_id
73 INTEGER(KIND=C_SIZE_T) :: tgt_nbr_duplicated_cells
74
75 TYPE(c_ptr) :: src_grid, tgt_grid
76 TYPE(c_ptr) :: dist_grid_pair
77 TYPE(c_ptr) :: interp_grid
78 TYPE(c_ptr) :: interp_stack_config
79 TYPE(c_ptr) :: interp_method_stack
80 TYPE(c_ptr) :: interp_weights
81
82 ! ===================================================================
83
84 CALL start_test('duplicate_stencils_parallel')
85
86 CALL yac_mpi_init_c()
87 CALL yac_yaxt_init_c(mpi_comm_world)
88
89 CALL mpi_comm_size(mpi_comm_world, comm_size, ierror)
90 CALL mpi_comm_rank(mpi_comm_world, comm_rank, ierror)
91
92 CALL test(comm_size == 3)
93
94 ! write source and target scrip grid files
95 IF (comm_rank == 0) THEN
96 CALL write_dummy_scrip_grid_file_c( &
97 src_grid_name, src_grid_filename, src_mask_filename, with_corner, &
98 360_c_size_t, 180_c_size_t, (/0.0_c_double, 360.0_c_double/), &
99 (/-90.0_c_double, 90.0_c_double/))
100 CALL write_dummy_scrip_grid_file_c( &
101 tgt_grid_name, tgt_grid_filename, tgt_mask_filename, with_corner, &
102 380_c_size_t, 180_c_size_t, (/0.0_c_double, 380.0_c_double/), &
103 (/-90.0_c_double, 90.0_c_double/))
104 END IF
105 CALL mpi_barrier(mpi_comm_world, ierror)
106
107 ! read in source and target grid on all processes
108 src_grid = &
110 src_grid_filename, src_mask_filename, mpi_comm_world, src_grid_name, &
111 valid_mask_value, src_grid_name, use_ll_edges, src_cell_coord_idx, &
112 src_duplicated_cell_idx, src_orig_cell_global_id, &
113 src_nbr_duplicated_cells)
114 tgt_grid = &
116 tgt_grid_filename, tgt_mask_filename, mpi_comm_world, tgt_grid_name, &
117 valid_mask_value, tgt_grid_name, use_ll_edges, tgt_cell_coord_idx, &
118 tgt_duplicated_cell_idx, tgt_orig_cell_global_id, &
119 tgt_nbr_duplicated_cells)
120
121 ! generate distributed grid pair
122 dist_grid_pair = &
123 yac_dist_grid_pair_new_c(src_grid, tgt_grid, mpi_comm_world)
124
125 ! generate interpolation grid
126 interp_grid = &
128 dist_grid_pair, trim(src_grid_name) // c_null_char, &
129 trim(tgt_grid_name) // c_null_char, int(1, c_size_t), &
130 (/int(yac_loc_cell, c_int)/), (/src_cell_coord_idx/), (/-1_c_size_t/), &
131 int(yac_loc_cell, c_int), tgt_cell_coord_idx, -1_c_size_t)
132
133 ! configure the interpolation stack
134 interp_stack_config = yac_interp_stack_config_new_c()
136 interp_stack_config, 1, 0, 1, yac_interp_conserv_destarea)
137
138 ! generate the actual interpolation stack
139 interp_method_stack = &
140 yac_interp_stack_config_generate_c(interp_stack_config)
141
142 ! execute the interpolation stack and generate the weights
143 ! YAC starts by extracting all non-masked target points, which
144 ! are then passed to the interpolation stack.
145 ! The resulting interpolation weights contains the interpolation
146 ! stencils, which are distributed across all processes.
147 ! (this operation is collective)
148 interp_weights = &
149 yac_interp_method_do_search_c(interp_method_stack, interp_grid)
150
152 interp_weights, tgt_grid, tgt_orig_cell_global_id, &
153 tgt_duplicated_cell_idx, tgt_nbr_duplicated_cells, yac_loc_cell)
154
155 ! cleanup
156 CALL yac_interp_weights_delete_c(interp_weights)
157 CALL yac_interp_method_delete_c(interp_method_stack)
158 CALL yac_free_c(interp_method_stack)
159 CALL yac_interp_stack_config_delete_c(interp_stack_config)
160 CALL yac_interp_grid_delete_c(interp_grid)
161 CALL yac_dist_grid_pair_delete_c(dist_grid_pair)
162 CALL yac_free_c(tgt_duplicated_cell_idx)
163 CALL yac_free_c(tgt_orig_cell_global_id)
164 CALL yac_basic_grid_delete_c(tgt_grid)
165 CALL yac_free_c(src_duplicated_cell_idx)
166 CALL yac_free_c(src_orig_cell_global_id)
167 CALL yac_basic_grid_delete_c(src_grid)
168
169 ! delete grid files scrip grid file
170 CALL mpi_barrier(mpi_comm_world, ierror)
171 IF (comm_rank == 0) THEN
172 CALL c_unlink(src_grid_filename)
173 CALL c_unlink(src_mask_filename)
174 CALL c_unlink(tgt_grid_filename)
175 CALL c_unlink(tgt_mask_filename)
176 END IF
177
178 CALL yac_mpi_finalize_c()
179
180 CALL stop_test
181 CALL exit_tests
182
183END PROGRAM main
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_loc_cell
Definition yac_core.F90:33
@ yac_interp_conserv_destarea
Definition yac_core.F90:72