YAC 3.18.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_instance_parallel3.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 <unistd.h>
8
9#include <mpi.h>
10#include <yaxt.h>
11
12#include "tests.h"
13#include "test_common.h"
14#include "instance.h"
15#include "yac.h"
16#include "yac_mpi.h"
17#include "event.h"
18
25char * str_logical[2] = {"true", "false"};
26
27int main (void) {
28
29 MPI_Init(NULL, NULL);
30 xt_initialize(MPI_COMM_WORLD);
31 int rank, size;
32 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
33 MPI_Comm_size(MPI_COMM_WORLD, &size);
34
35 if (size != 9) {
36
37 PUT_ERR("ERROR: wrong number of processes\n");
38 return TEST_EXIT_CODE;
39 }
40
41 struct yac_instance * instance =
42 yac_instance_new(MPI_COMM_WORLD);
43
44 // generate coupling configuration
47 instance, "2008-03-09T16:05:07", "2008-03-10T16:05:07");
48 struct yac_interp_stack_config * interp_stack_config =
50 yac_interp_stack_config_add_fixed(interp_stack_config, -1.0);
51 char const * coupling_timestep = yac_time_to_ISO("60", C_SECOND);
52 int mapping_side[3][3] = {{-1, 0, 0},
53 { 0,-1, 1},
54 { 1, 1,-1}};
55 for (size_t src_comp_idx = 0; src_comp_idx < 3; ++src_comp_idx) {
56 char src_comp_name[8], src_grid_name[8];
57 sprintf(src_comp_name, "comp_%zu", src_comp_idx + 1);
58 sprintf(src_grid_name, "grid_%zu", src_comp_idx + 1);
59 for (size_t tgt_comp_idx = 0; tgt_comp_idx < 3; ++tgt_comp_idx) {
60 char tgt_comp_name[8], tgt_grid_name[8];
61 sprintf(tgt_comp_name, "comp_%zu", tgt_comp_idx + 1);
62 sprintf(tgt_grid_name, "grid_%zu", tgt_comp_idx + 1);
63 if (src_comp_idx == tgt_comp_idx) continue;
64 char field_name[32];
65 sprintf(field_name, "field_from_%zu_to_%zu",
66 src_comp_idx + 1, tgt_comp_idx + 1);
68 instance, src_comp_name, src_grid_name, field_name,
69 tgt_comp_name, tgt_grid_name, field_name, coupling_timestep,
70 YAC_REDUCTION_TIME_ACCUMULATE, interp_stack_config, 0, 0, NULL,
72 mapping_side[src_comp_idx][tgt_comp_idx], 1.0, 0.0, 0, NULL, NULL,
73 NULL, NULL, 0);
74 }
75 }
76 yac_interp_stack_config_delete(interp_stack_config);
77
78 char * component_names[3] = {"comp_1", "comp_2", "comp_3"};
79 char const * local_component_names[2];
80 int comp_ranks[2];
81 int comp_idx[3][2] = {{0,1},{0,2},{1,2}};
82
83 for (unsigned i = 0; i < 2; ++i)
84 local_component_names[i] = component_names[comp_idx[rank/3][i]];
85
86 yac_instance_def_components(instance, local_component_names, 2);
87
88 for (unsigned i = 0; i < 2; ++i) {
89 MPI_Comm component_comm =
91 instance, &(local_component_names[i]), 1);
92 MPI_Comm_rank(component_comm, comp_ranks + i);
93 MPI_Comm_free(&component_comm);
94 }
95
96 struct yac_basic_grid * grid[2];
97 size_t num_vertices[2] = {2,2};
98 int cyclic[2] = {0,0};
99 double coordinates_x[2][2];
100 double coordinates_y[2] = {0,1};
101 yac_int global_cell_ids[2][1];
102 yac_int global_corner_ids[2][4];
103 yac_int global_edge_ids[2][4];
104 int cell_core_mask = {1};
105 int corner_core_mask[4] = {1,1,1,1};
106 int edge_core_mask[4] = {1,1,1,1};
107 int ref_global_edge_ids[6][4] = {{0,3,13,1},{2,5,14,3},{4,7,15,5},
108 {6,9,16,7},{8,11,17,9},{10,12,18,11}};
109
110 for (unsigned i = 0; i < 2; ++i) {
111 char grid_name[1024];
112 sprintf(grid_name, "grid_%d", comp_idx[rank/3][i] + 1);
113 coordinates_x[i][0] = comp_ranks[i];
114 coordinates_x[i][1] = comp_ranks[i] + 1;
115 global_cell_ids[i][0] = comp_ranks[i];
116 global_corner_ids[i][0] = comp_ranks[i] + 0;
117 global_corner_ids[i][1] = comp_ranks[i] + 1;
118 global_corner_ids[i][2] = comp_ranks[i] + 7;
119 global_corner_ids[i][3] = comp_ranks[i] + 8;
120 global_edge_ids[i][0] = ref_global_edge_ids[comp_ranks[i]][0];
121 global_edge_ids[i][1] = ref_global_edge_ids[comp_ranks[i]][1];
122 global_edge_ids[i][2] = ref_global_edge_ids[comp_ranks[i]][2];
123 global_edge_ids[i][3] = ref_global_edge_ids[comp_ranks[i]][3];
127 grid_data.cell_ids = TO_POINTER(global_cell_ids[i]);
128 grid_data.vertex_ids = TO_POINTER(global_corner_ids[i]);
129 grid_data.edge_ids = TO_POINTER(global_edge_ids[i]);
130 grid_data.core_cell_mask = TO_POINTER(cell_core_mask);
131 grid_data.core_vertex_mask = TO_POINTER(corner_core_mask);
132 grid_data.core_edge_mask = TO_POINTER(edge_core_mask);
133 grid[i] = yac_basic_grid_new(grid_name, grid_data);
135 }
136
137 struct yac_interp_field interp_fields[2];
138
139 for (unsigned i = 0; i < 2; ++i) {
140 interp_fields[i].location = YAC_LOC_CORNER;
141 interp_fields[i].coordinates_idx = 0;
142 interp_fields[i].masks_idx = SIZE_MAX;
143 }
144
145 char field_name[2][2][2][1024];
146
147 for (unsigned i = 0; i < 2; ++i) {
148 int curr_comp_idx = comp_idx[rank/3][i];
149 for (unsigned j = 0; j < 2; ++j) {
150 int remote_comp_idx = (3 + curr_comp_idx + j + 1) % 3;
151 sprintf(field_name[i][j][0], "field_from_%d_to_%d",
152 curr_comp_idx + 1, remote_comp_idx + 1);
153 sprintf(field_name[i][j][1], "field_from_%d_to_%d",
154 remote_comp_idx + 1, curr_comp_idx + 1);
155 }
156 }
157
158 char const * timestep = yac_time_to_ISO("10", C_SECOND);
159 for (unsigned i = 0; i < 2; ++i)
160 for (unsigned j = 0; j < 2; ++j)
161 for (unsigned k = 0; k < 2; ++k)
163 instance, field_name[i][j][k], local_component_names[i],
164 grid[i], &interp_fields[i], 1, 1, timestep);
165
166 yac_instance_setup(instance, grid, sizeof(grid) / sizeof(grid[0]));
167
168 yac_instance_delete(instance);
169
170 for (unsigned i = 0; i < 2; ++i) yac_basic_grid_delete(grid[i]);
171
172 xt_finalize();
173 MPI_Finalize();
174
175 return TEST_EXIT_CODE;
176}
char const * component_names[]
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
Definition basic_grid.c:57
size_t yac_basic_grid_add_coordinates_nocpy(struct yac_basic_grid *grid, enum yac_location location, yac_coordinate_pointer coordinates)
Definition basic_grid.c:215
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:77
struct yac_basic_grid_data yac_generate_basic_grid_data_reg_2d_deg(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
Definition grid_reg2d.c:74
char const * yac_time_to_ISO(char const *time, enum yac_time_unit_type time_unit)
Definition event.c:336
@ C_SECOND
void yac_instance_delete(struct yac_instance *instance)
Definition instance.c:1483
void yac_instance_def_datetime(struct yac_instance *instance, const char *start_datetime, const char *end_datetime)
Definition instance.c:1570
void yac_instance_setup(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
Definition instance.c:1374
struct yac_instance * yac_instance_new(MPI_Comm comm)
Definition instance.c:1456
struct coupling_field * yac_instance_add_field(struct yac_instance *instance, char const *field_name, char const *comp_name, struct yac_basic_grid *grid, struct yac_interp_field *interp_fields, size_t num_interp_fields, int collection_size, char const *timestep)
Definition instance.c:1625
void yac_instance_def_components(struct yac_instance *instance, char const **comp_names, size_t num_comps)
Definition instance.c:1588
void yac_instance_def_couple(struct yac_instance *instance, char const *src_comp_name, char const *src_grid_name, char const *src_field_name, char const *tgt_comp_name, char const *tgt_grid_name, char const *tgt_field_name, char const *coupling_period, int time_reduction, struct yac_interp_stack_config *interp_stack_config, int src_lag, int tgt_lag, const char *weight_file_name, int weight_file_on_existing, int mapping_on_source, double scale_factor, double scale_summand, size_t num_src_mask_names, char const *const *src_mask_names, char const *tgt_mask_name, char const *yaxt_exchanger_name, struct yac_collection_selection const *collection_selection, int use_raw_exchange)
Definition instance.c:1692
MPI_Comm yac_instance_get_comps_comm(struct yac_instance *instance, char const **comp_names, size_t num_comp_names)
Definition instance.c:1422
void yac_interp_stack_config_add_fixed(struct yac_interp_stack_config *interp_stack_config, double value)
void yac_interp_stack_config_delete(struct yac_interp_stack_config *interp_stack_config)
Free an interpolation stack configuration object.
struct yac_interp_stack_config * yac_interp_stack_config_new()
Allocate a new empty interpolation stack configuration object.
#define YAC_WEIGHT_FILE_ON_EXISTING_DEFAULT_VALUE
@ YAC_LOC_CORNER
Definition location.h:15
enum yac_location location
Definition basic_grid.h:16
#define TO_POINTER(a)
Definition test_common.h:14
char * str_logical[2]
char const src_grid_name[]
char const tgt_grid_name[]
double coordinates_x[]
double coordinates_y[]
unsigned cyclic[2]
#define TEST_EXIT_CODE
Definition tests.h:15
#define PUT_ERR(string)
Definition tests.h:10
int * cell_core_mask
int const YAC_REDUCTION_TIME_ACCUMULATE
Definition yac.c:57
void yac_cdef_calendar(int calendar)
Definition yac.c:1063
int const YAC_PROLEPTIC_GREGORIAN
Definition yac.c:72
YAC_INT yac_int
Definition yac_types.h:15