YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_read_icon_parallel_c.c
Go to the documentation of this file.
1// Copyright (c) 2024 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include <stdlib.h>
6#include <stdio.h>
7#include <string.h>
8#include <math.h>
9#include <unistd.h>
10
11#include "tests.h"
12#include "test_common.h"
13#include "read_icon_grid.h"
14#include "geometry.h"
15#include "grid2vtk.h"
16#include "io_utils.h"
18
19#include <mpi.h>
20
26int main(void) {
27
28 MPI_Init(NULL, NULL);
29
30 int comm_size, comm_rank;
31
32 MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
33 MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
34
35 if ((comm_size != 4) && (comm_rank == 0)) {
36 fputs("wrong number of processes (has to be four)\n", stderr);
37 exit(EXIT_FAILURE);
38 }
39
40 char const filename[] = "test_read_icon_parallel_grid_c.nc";
41
42
43
44 int ref_nbr_cells[4] = {11, 9, 14, 9};
45 int ref_nbr_vertices[4] = {11, 10, 13, 10};
46 int ref_cell_to_vertex[14][3];
47 int ref_global_cell_ids[4][14] = {{0,1,2,3,4,5,7,8,9,10,11},
48 {4,5,6,7,2,3,8,9,15},
49 {8,9,10,11,0,1,2,3,4,5,7,12,14,15},
50 {12,13,14,15,7,8,9,10,11}};
51 int ref_cell_owner[14];
52 int ref_global_vertex_ids[4][13] = {{0,1,2,5,6,7,9,10,11,12,13},
53 {5,6,7,8,9,10,11,12,13,14},
54 {0,1,2,3,5,6,7,8,9,10,11,12,13},
55 {1,2,3,4,6,7,8,10,11,13}};
56 int ref_vertex_owner[13];
57
58 {
59 int all_cell_to_vertex[16][3] =
60 {{0,1,5}, {1,5,6}, {5,6,9}, {6,9,10}, {9,10,12}, {10,12,13}, {12,13,14},
61 {10,11,13}, {7,10,11}, {6,7,10}, {2,6,7}, {1,2,6}, {2,3,7}, {3,4,8},
62 {3,7,8}, {7,8,11}};
63 for (int i = 0; i < ref_nbr_cells[comm_rank]; ++i) {
64 for (int j = 0; j < 3; ++j) {
65 for (int k = 0; k < ref_nbr_vertices[comm_rank]; ++k) {
66 if (all_cell_to_vertex[ref_global_cell_ids[comm_rank][i]][j] ==
67 ref_global_vertex_ids[comm_rank][k]) {
68 ref_cell_to_vertex[i][j] = k;
69 break;
70 }
71 }
72 }
73 }
74 int global_cell_owner[16] = {0,0,0,0, 1,1,1,1, 2,2,2,2, 3,3,3,3};
75 for (int i = 0; i < ref_nbr_cells[comm_rank]; ++i) {
76 ref_cell_owner[i] =
77 global_cell_owner[ref_global_cell_ids[comm_rank][i]];
78 if (ref_cell_owner[i] == comm_rank) ref_cell_owner[i] = -1;
79 }
80 int global_vertex_owner[15] = {0,2,3,3,3,0,2,3,3,1,2,3,1,1,1};
81 for (int i = 0; i < ref_nbr_vertices[comm_rank]; ++i) {
82 ref_vertex_owner[i] =
83 global_vertex_owner[ref_global_vertex_ids[comm_rank][i]];
84 if (ref_vertex_owner[i] == comm_rank) ref_vertex_owner[i] = -1;
85 }
86 }
87
88 enum coord_units coord_unit[] = {RAD, DEG};
89 enum {NUM_COORD_UNIT = sizeof(coord_unit) / sizeof(coord_unit[0])};
90
91 for (int coord_unit_idx = 0; coord_unit_idx < NUM_COORD_UNIT;
92 ++coord_unit_idx) {
93
94 if (comm_rank == 0)
95 utest_write_test_grid_file(filename, coord_unit[coord_unit_idx]);
96
97 // ensure that the grid file exists
98 MPI_Barrier(MPI_COMM_WORLD);
99
100 { // test yac_read_icon_grid_information_parallel (incl. halos)
101 int nbr_vertices, nbr_cells;
102 int * num_vertices_per_cell;
103 int * cell_to_vertex;
104 int * global_cell_ids;
105 int * cell_owner;
106 int * global_vertex_ids;
107 int * vertex_owner;
108 double * x_vertices, * y_vertices;
109 double * x_cells, * y_cells;
110 int * cell_mask;
111
113 filename, MPI_COMM_WORLD, &nbr_vertices, &nbr_cells, &num_vertices_per_cell,
114 &cell_to_vertex, &global_cell_ids, &cell_owner, &global_vertex_ids,
115 &vertex_owner, &x_vertices, &y_vertices, &x_cells, &y_cells, &cell_mask);
116
117 if (nbr_cells != ref_nbr_cells[comm_rank])
118 PUT_ERR("wrong number of vertices\n");
119 if (nbr_vertices != ref_nbr_vertices[comm_rank])
120 PUT_ERR("wrong number of vertices\n");
121 for (int i = 0; i < nbr_cells; ++i)
122 if (num_vertices_per_cell[i] != 3)
123 PUT_ERR("wrong number of vertices per cell\n");
124 for (int i = 0; i < nbr_cells; ++i) {
125 for (int j = 0; j < 3; ++j)
126 if (cell_to_vertex[3 * i + j] != ref_cell_to_vertex[i][j])
127 PUT_ERR("error in cell_to_vertex\n");
128 if (global_cell_ids[i] != ref_global_cell_ids[comm_rank][i])
129 PUT_ERR("wrong global cell id\n");
130 if (cell_owner[i] != ref_cell_owner[i])
131 PUT_ERR("wrong cell owner\n");
132 if (utest_double_are_unequal(
133 x_cells[i], clon[ref_global_cell_ids[comm_rank][i]] * YAC_RAD))
134 PUT_ERR("wrong cell longitude\n");
135 if (utest_double_are_unequal(
136 y_cells[i], clat[ref_global_cell_ids[comm_rank][i]] * YAC_RAD))
137 PUT_ERR("wrong cell latitude\n");
138 if (cell_mask[i] != mask[ref_global_cell_ids[comm_rank][i]])
139 PUT_ERR("wrong cell mask\n");
140 }
141 for (int i = 0; i < nbr_vertices; ++i) {
142 if (global_vertex_ids[i] != ref_global_vertex_ids[comm_rank][i])
143 PUT_ERR("wrong global vertex id\n");
144 if (vertex_owner[i] != ref_vertex_owner[i]) PUT_ERR("wrong vertex owner\n");
145 if (utest_double_are_unequal(
146 x_vertices[i], vlon[ref_global_vertex_ids[comm_rank][i]] * YAC_RAD))
147 PUT_ERR("wrong vertex longitude\n");
148 if (utest_double_are_unequal(
149 y_vertices[i], vlat[ref_global_vertex_ids[comm_rank][i]] * YAC_RAD))
150 PUT_ERR("wrong vertex latitude\n");
151
152 }
153 free(num_vertices_per_cell);
154 free(cell_to_vertex);
155 free(cell_owner);
156 free(vertex_owner);
157 free(global_cell_ids);
158 free(global_vertex_ids);
159 free(x_vertices);
160 free(y_vertices);
161 free(x_cells);
162 free(y_cells);
163 free(cell_mask);
164 }
165
166 {
167 utest_set_even_io_rank_list(MPI_COMM_WORLD);
169 yac_read_icon_basic_grid_data_parallel(filename, MPI_COMM_WORLD);
170 if (grid_data.num_cells != 4)
171 PUT_ERR("error in yac_read_icon_basic_grid_data_parallel");
172 if (grid_data.num_vertices != 6)
173 PUT_ERR("error in yac_read_icon_basic_grid_data_parallel");
175 utest_clear_yac_io_env();
176 }
177
178 {
179 struct yac_basic_grid * icon_grid =
181 filename, "icon_grid", MPI_COMM_WORLD);
182 if (yac_basic_grid_get_data_size(icon_grid, YAC_LOC_CELL) != 4)
183 PUT_ERR("error in yac_read_icon_basic_grid_parallel");
184 if (yac_basic_grid_get_data_size(icon_grid, YAC_LOC_CORNER) != 6)
185 PUT_ERR("error in yac_read_icon_basic_grid_parallel");
186 yac_basic_grid_delete(icon_grid);
187 }
188
189 {
190 struct yac_basic_grid * icon_grid;
191 size_t cell_coordinates_idx;
192 int * cell_mask;
194 filename, "icon_grid", MPI_COMM_WORLD, &icon_grid,
195 &cell_coordinates_idx, &cell_mask);
196 if (yac_basic_grid_get_data_size(icon_grid, YAC_LOC_CELL) != 4)
197 PUT_ERR("error in yac_read_icon_basic_grid_parallel_2");
198 if (yac_basic_grid_get_data_size(icon_grid, YAC_LOC_CORNER) != 6)
199 PUT_ERR("error in yac_read_icon_basic_grid_parallel_2");
200 if (cell_coordinates_idx != 0)
201 PUT_ERR("error in yac_read_icon_basic_grid_parallel_2");
202 yac_basic_grid_delete(icon_grid);
203 free(cell_mask);
204 }
205
206 // ensure that all processes finished reading the file
207 MPI_Barrier(MPI_COMM_WORLD);
208 if (comm_rank == 0) unlink(filename);
209 }
210
211 MPI_Finalize();
212
213 return TEST_EXIT_CODE;
214}
size_t yac_basic_grid_get_data_size(struct yac_basic_grid *grid, enum yac_location location)
Definition basic_grid.c:145
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:77
void yac_basic_grid_data_free(struct yac_basic_grid_data grid)
#define YAC_RAD
@ YAC_LOC_CORNER
Definition location.h:15
@ YAC_LOC_CELL
Definition location.h:14
struct yac_basic_grid_data yac_read_icon_basic_grid_data_parallel(const char *filename, MPI_Comm comm)
void yac_read_icon_grid_information_parallel(const char *filename, MPI_Comm comm, int *nbr_vertices, int *nbr_cells, int **num_vertices_per_cell, int **cell_to_vertex, int **global_cell_ids, int **cell_owner, int **global_vertex_ids, int **vertex_owner, double **x_vertices, double **y_vertices, double **x_cells, double **y_cells, int **cell_msk)
void yac_read_icon_basic_grid_parallel_2(char const *filename, char const *gridname, MPI_Comm comm, struct yac_basic_grid **basic_grid, size_t *cell_coordinate_idx, int **cell_mask)
struct yac_basic_grid * yac_read_icon_basic_grid_parallel(char const *filename, char const *gridname, MPI_Comm comm)
int * cell_to_vertex
int * cell_mask
#define RAD
static int mask[16]
static double vlon[15]
static double clon[16]
static double vlat[15]
static double clat[16]
#define TEST_EXIT_CODE
Definition tests.h:15
#define PUT_ERR(string)
Definition tests.h:10