23 int comm_rank, comm_size;
24 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
25 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
27 YAC_ASSERT(comm_size == 5,
"ERROR wrong number of processes (has to be 5)")
31 double x_vertices[18] = {0,20,40,60,80,
35 double y_vertices[9] = {-80,-60,-40,-20,0,20,40,60,80};
36 size_t local_start[5][2] = {{0,0},{7,0},{0,0},{0,3},{7,3}};
37 size_t local_count[5][2] = {{10,6},{10,6},{0,0},{10,6},{10,6}};
38 size_t num_vertices_a =
39 local_count[comm_rank][0] * local_count[comm_rank][1];
41 xmalloc(num_vertices_a *
sizeof(*vertices_a));
43 for (
size_t i = 0, k = 0;
i < local_count[comm_rank][1]; ++
i)
44 for (
size_t j = 0; j < local_count[comm_rank][0]; ++j, ++k)
46 x_vertices[local_start[comm_rank][0]+j],
47 y_vertices[local_start[comm_rank][1]+i],
51 size_t num_vertices[2] = {num_vertices_a, 0};
52 yac_int * global_ids_a = NULL, * global_ids_b = NULL;
53 yac_int **global_vertex_ids[2] = {&global_ids_a, &global_ids_b};
54 int * vertex_ranks_a, * vertex_ranks_b;
55 int **vertex_ranks[2] = {&vertex_ranks_a, &vertex_ranks_b};
58 vertices, num_vertices, &proc_sphere_part, global_vertex_ids,
59 vertex_ranks, MPI_COMM_WORLD);
71 double x_vertices[] = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90,
72 100,110,120,130,140,150,160,170,180,190,
73 200,210,220,230,240,250,260,270,280,290,
74 300,310,320,330,340,350};
76 {-90,-80,-70,-60,-50,-40,-30,-20,-10,0,10,20,30,40,50,60,70,80,90};
77 size_t local_start[5][2] = {{0,0},{0,5},{12,5},{24,5},{0,14}};
78 size_t local_count[5][2] = {{36,5},{12,9},{12,9},{12,9},{36,5}};
79 size_t num_vertices_a =
80 local_count[comm_rank][0] * local_count[comm_rank][1];
82 xmalloc(num_vertices_a *
sizeof(*vertices_a));
84 for (
size_t i = 0, k = 0;
i < local_count[comm_rank][1]; ++
i)
85 for (
size_t j = 0; j < local_count[comm_rank][0]; ++j, ++k)
87 x_vertices[local_start[comm_rank][0]+j],
88 y_vertices[local_start[comm_rank][1]+i],
92 size_t num_vertices[2] = {num_vertices_a, 0};
93 yac_int * global_ids_a = NULL, * global_ids_b = NULL;
94 yac_int **global_vertex_ids[2] = {&global_ids_a, &global_ids_b};
95 int * vertex_ranks_a, * vertex_ranks_b;
96 int **vertex_ranks[2] = {&vertex_ranks_a, &vertex_ranks_b};
99 vertices, num_vertices, &proc_sphere_part, global_vertex_ids,
100 vertex_ranks, MPI_COMM_WORLD);
102 free(vertex_ranks_a);
103 free(vertex_ranks_b);
108 double x_search = 45.0, y_search = 80.0;
110 LLtoXYZ_deg(x_search, y_search, bnd_circle.base_vector);
111 bnd_circle.inc_angle.sin = sin(3.13);
112 bnd_circle.inc_angle.cos = cos(3.13);
114 int search_ranks[5], rank_count;
116 proc_sphere_part, bnd_circle, search_ranks, &rank_count);
119 PUT_ERR(
"error in yac_proc_sphere_part_do_bnd_circle_search");
131 size_t num_vertices_a[5] = {2,1,1,1,1};
133 xmalloc(num_vertices_a[comm_rank] *
sizeof(*vertices_a));
135 for (
size_t i = 0;
i < num_vertices_a[comm_rank]; ++
i)
136 for (
int j = 0; j < 3; ++j)
137 vertices_a[i][j] = coords[comm_rank][i][j];
140 size_t num_vertices[2] = {num_vertices_a[comm_rank], 0};
141 yac_int * global_ids_a = NULL, * global_ids_b = NULL;
142 yac_int **global_vertex_ids[2] = {&global_ids_a, &global_ids_b};
143 int * vertex_ranks_a = NULL, * vertex_ranks_b = NULL;
144 int **vertex_ranks[2] = {&vertex_ranks_a, &vertex_ranks_b};
147 vertices, num_vertices, &proc_sphere_part, global_vertex_ids,
148 vertex_ranks, MPI_COMM_WORLD);
150 free(vertex_ranks_a);
151 free(vertex_ranks_b);
161 size_t num_vertices[2] = {0, 0};
162 yac_int * global_ids_a = NULL, * global_ids_b = NULL;
163 yac_int **global_vertex_ids[2] = {&global_ids_a, &global_ids_b};
164 int * vertex_ranks_a = NULL, * vertex_ranks_b = NULL;
165 int **vertex_ranks[2] = {&vertex_ranks_a, &vertex_ranks_b};
168 vertices, num_vertices, &proc_sphere_part, global_vertex_ids,
169 vertex_ranks, MPI_COMM_WORLD);
171 free(vertex_ranks_a);
172 free(vertex_ranks_b);
180 double x_vertices[] = { 0, 30, 60, 90, 120, 150, 180};
181 double y_vertices[] = {-90,-60,-30, 0, 30, 60, 90};
183 size_t local_start[2][5][2] = {{{0,0},{0,3},{3,3},{0,0},{0,0}},
184 {{0,0},{0,0},{0,0},{3,0},{0,3}}};
185 size_t local_count[2][5][2] = {{{7,4},{4,4},{4,4},{0,0},{0,0}},
186 {{0,0},{0,0},{4,4},{4,4},{7,4}}};
187 size_t num_vertices_[2];
190 yac_int *global_vertex_ids_in[2];
195 local_count[
grid_idx][comm_rank][0] *
196 local_count[
grid_idx][comm_rank][1];
202 num_vertices_[
grid_idx] *
sizeof(*(global_vertex_ids_in[0])));
204 for (
size_t i = 0, k = 0;
i < local_count[
grid_idx][comm_rank][1]; ++
i) {
205 for (
size_t j = 0; j < local_count[
grid_idx][comm_rank][0]; ++j, ++k) {
207 x_vertices[local_start[
grid_idx][comm_rank][0]+j],
208 y_vertices[local_start[
grid_idx][comm_rank][1]+i],
211 (local_start[
grid_idx][comm_rank][1]+
i) * 7 +
212 local_start[
grid_idx][comm_rank][0]+j;
217 int with_grid[2], with_global_ids[2];
219 for (with_grid[0] = 0; with_grid[0] < 2; ++with_grid[0]) {
221 for (with_global_ids[0] = 0; with_global_ids[0] < 2;
222 with_global_ids[0]++) {
224 for (with_grid[1] = 0; with_grid[1] < 2; ++with_grid[1]) {
226 for (with_global_ids[1] = 0; with_global_ids[1] < 2;
227 with_global_ids[1]++) {
229 int * vertex_ranks_out[2] = {NULL, NULL};
230 yac_int * global_vertex_ids_out[2] = {NULL,NULL};
232 int **vertex_ranks[2];
233 yac_int **global_vertex_ids[2];
235 size_t num_vertices[2];
253 vertices, num_vertices, &proc_sphere_part, global_vertex_ids,
254 vertex_ranks, MPI_COMM_WORLD);
264 for (
size_t i = 0;
i < num_vertices[
grid_idx]; ++
i)
265 if (search_ranks[i] != vertex_ranks_out[
grid_idx][i])
266 PUT_ERR(
"error in yac_proc_sphere_part_do_point_search");
271 int ref_num_global_ids = 37;
272 int min_global_id = INT_MAX, max_global_id = INT_MIN;
273 int global_id_count[ref_num_global_ids];
275 for (
int i = 0;
i < ref_num_global_ids; ++
i)
276 global_id_count[i] = 0;
278 for (
size_t i = 0;
i < num_vertices_[
grid_idx]; ++
i) {
279 if ((
int)(global_vertex_ids_out[
grid_idx][i]) < min_global_id)
280 min_global_id = (int)(global_vertex_ids_out[
grid_idx][i]);
281 if ((
int)(global_vertex_ids_out[
grid_idx][
i]) > max_global_id)
282 max_global_id = (int)(global_vertex_ids_out[
grid_idx][i]);
283 global_id_count[global_vertex_ids_out[
grid_idx][
i]]++;
287 MPI_IN_PLACE, &min_global_id, 1, MPI_INT, MPI_MIN,
290 MPI_IN_PLACE, &max_global_id, 1, MPI_INT, MPI_MAX,
293 MPI_IN_PLACE, global_id_count, ref_num_global_ids,
294 MPI_INT, MPI_SUM, MPI_COMM_WORLD);
296 if (min_global_id != 0)
297 PUT_ERR(
"error in yac_proc_sphere_part_new (min_global_id)");
298 if (max_global_id != ref_num_global_ids-1)
299 PUT_ERR(
"error in yac_proc_sphere_part_new (min_global_id)");
301 int ref_num_owners_per_vertex[2][5][7*4] =
306 {2,2,2,3, 1,1,1,2, 1,1,1,2, 8,8,8,8},
307 {3,2,2,2, 2,1,1,1, 2,1,1,1, 8,8,8,8},
310 {8,8,8,8, 1,1,1,2, 1,1,1,2, 2,2,2,3},
311 {8,8,8,8, 2,1,1,1, 2,1,1,1, 3,2,2,2},
316 for (
size_t i = 0;
i < num_vertices_[
grid_idx]; ++
i)
317 if (ref_num_owners_per_vertex[
grid_idx][comm_rank][i] !=
318 global_id_count[global_vertex_ids_out[
grid_idx][i]])
320 "error in yac_proc_sphere_part_new (global_id count)");
327 free(global_vertex_ids_out[
grid_idx]);
339 free(global_vertex_ids_in[
grid_idx]);
#define YAC_ASSERT(exp, msg)
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
void yac_proc_sphere_part_do_bnd_circle_search(struct proc_sphere_part_node *node, struct bounding_circle bnd_circle, int *ranks, int *rank_count)
void yac_proc_sphere_part_do_point_search(struct proc_sphere_part_node *node, yac_coordinate_pointer search_coords, size_t count, int *ranks)
void yac_proc_sphere_part_node_delete(struct proc_sphere_part_node *node)
void yac_proc_sphere_part_new(yac_coordinate_pointer vertex_coordinates[2], size_t *num_vertices, struct proc_sphere_part_node **proc_sphere_part, yac_int **global_vertex_ids_[2], int **vertex_ranks[2], MPI_Comm comm)
double(* yac_coordinate_pointer)[3]