21 size_t num_corners, void (*fun_LLtoXYZ)(double,double,
double[])) {
65 double lon_a,
double lat_a,
double lon_b,
double lat_b,
67 double lon_c,
double lat_c,
double lon_d,
double lat_d,
68 double * intersection) {
76 double a[3], b[3], c[3], d[3],
p[4], q[3];
78 double a[3], b[3], c[3], d[3],
p[3], q[3];
89 case ((1 << 0) | (1 << 2)):
90 case ((1 << 0) | (1 << 1) | (1 << 2)):
91 case ((1 << 0) | (1 << 2) | (1 << 3)):
92 case ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3)):
93 intersection[0] =
p[0];
94 intersection[1] =
p[1];
95 intersection[2] =
p[2];
97 case ( (1 << 1) | (1 << 3)):
98 case ((1 << 0) | (1 << 1) | (1 << 3)):
99 case ( (1 << 1) | (1 << 2) | (1 << 3)):
100 intersection[0] = q[0];
101 intersection[1] = q[1];
102 intersection[2] = q[2];
111 void * ret_value =
xmalloc(size_data);
112 memcpy(ret_value,
data, size_data);
118 return (a > b) == (a < b);
123 return (a > b) != (a < b);
129 MPI_Comm_size(comm, &comm_size);
131 char * io_rank_list =
xmalloc(16 * comm_size);
132 io_rank_list[0] =
'\0';
133 for (
int i = 0; i < comm_size; i += 2) {
135 snprintf(rank,
sizeof(rank),
"%d,", i);
136 strcat(io_rank_list, rank);
138 char comm_size_str[16];
139 snprintf(comm_size_str,
sizeof(comm_size_str),
"%d", comm_size);
140 setenv(
"YAC_IO_RANK_LIST", io_rank_list, 1);
141 setenv(
"YAC_IO_MAX_NUM_RANKS_PER_NODE", comm_size_str, 1);
146 unsetenv(
"YAC_IO_RANK_LIST");
147 unsetenv(
"YAC_IO_MAX_NUM_RANKS");
148 unsetenv(
"YAC_IO_RANK_EXCLUDE_LIST");
149 unsetenv(
"YAC_IO_MAX_NUM_RANKS_PER_NODE");
153 size_t const * indices_a,
size_t const * indices_b,
size_t count) {
155 if (count == 0)
return 1;
157 if (count == 1)
return *indices_a == *indices_b;
160 for (i = 0; i < count; ++i)
if (indices_a[i] == indices_b[0])
break;
161 if (i == count)
return 0;
163 if (indices_a[(i+1)%count] == indices_b[1]) {
165 for (
size_t j = 2; j < count; ++j)
166 if (indices_a[(i+j)%count] !=indices_b[j])
169 }
else if (indices_a[(i+1)%count] == indices_b[count - 1]) {
171 for (
size_t j = 2; j < count; ++j)
172 if (indices_a[(i+j)%count] != indices_b[count - j])
182 char const * grid_name) {
184 printf(
"testing grid: %s\n", grid_name);
188 PUT_ERR(
"error in grid.num_cells or grid.num_total_cells\n")
191 PUT_ERR(
"error in grid.num_vertices or grid.num_total_vertices\n")
194 PUT_ERR(
"error in grid.num_edges or grid.num_total_edges\n")
196 for (
size_t i = 0; i < grid_a.
num_cells; ++i)
198 PUT_ERR(
"error in grid.num_vertices_per_cell\n")
202 PUT_ERR(
"error in grid.num_cells_per_vertex\n")
207 PUT_ERR(
"error in grid.coordinates_xyz\n")
210 for (
size_t i = 0, offset = 0; i < grid_a.
num_cells; ++i) {
217 PUT_ERR(
"error in grid.cell_to_vertex_offsets\n")
221 PUT_ERR(
"error in grid.cell_to_vertex\n")
226 PUT_ERR(
"error in grid.cell_to_edge_offsets\n")
230 PUT_ERR(
"error in grid.cell_to_edge\n")
232 offset += num_vertices;
235 for (
size_t i = 0, offset = 0; i < grid_a.
num_vertices; ++i) {
242 PUT_ERR(
"error in grid.vertex_to_cell_offsets\n")
246 PUT_ERR(
"error in grid.vertex_to_cell\n")
251 for (
size_t i = 0; i < grid_a.
num_edges; ++i) {
253 PUT_ERR(
"error in grid.vertex_to_cell\n")
255 PUT_ERR(
"error in grid.edge_type");
static void LLtoXYZ_deg(double lon, double lat, double p_out[])
int yac_intersect_vec(enum yac_edge_type edge_type_a, double const a[3], double const b[3], enum yac_edge_type edge_type_b, double const c[3], double const d[3], double p[3], double q[3])
static double get_vector_angle(double const a[3], double const b[3])
yac_coordinate_pointer vertex_coordinates
size_t * cell_to_edge_offsets
size_t * vertex_to_cell_offsets
yac_size_t_2_pointer edge_to_vertex
enum yac_edge_type * edge_type
size_t num_total_vertices
size_t * cell_to_vertex_offsets
int * num_vertices_per_cell
int * num_cells_per_vertex
enum yac_edge_type * edge_type
double(* coordinates_xyz)[3]
struct yac_grid_cell generate_cell_rad(double *lon, double *lat, enum yac_edge_type *edge_type, size_t num_corners)
void * to_pointer(void *data, size_t size_data)
static int check_indices(size_t const *indices_a, size_t const *indices_b, size_t count)
int double_are_unequal(double a, double b)
struct yac_grid_cell generate_cell_3d(yac_coordinate_pointer coords, enum yac_edge_type *edge_type, size_t num_corners)
struct yac_grid_cell generate_cell_deg(double *lon, double *lat, enum yac_edge_type *edge_type, size_t num_corners)
int intersect(enum yac_edge_type edge_type_a, double lon_a, double lat_a, double lon_b, double lat_b, enum yac_edge_type edge_type_b, double lon_c, double lat_c, double lon_d, double lat_d, double *intersection)
void set_even_io_rank_list(MPI_Comm comm)
static struct yac_grid_cell generate_cell_func(double *lon, double *lat, enum yac_edge_type *edge_type, size_t num_corners, void(*fun_LLtoXYZ)(double, double, double[]))
int double_are_equal(double a, double b)
void check_basic_grid_data(struct yac_basic_grid_data grid_a, struct yac_basic_grid_data grid_b, char const *grid_name)
double(* p)(double lon, double lat)
static void LLtoXYZ(double lon, double lat, double p_out[])
double(* yac_coordinate_pointer)[3]