YAC 3.18.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_instance_parallel5.c
Go to the documentation of this file.
1// Copyright (c) 2026 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
9#include <mpi.h>
10
11#include "tests.h"
12#include "test_common.h"
13#include "instance.h"
14#include "yac.h"
15#include "yac_mpi.h"
16#include "event.h"
17
24static void utest_shared_comp_couple();
25
26int main(void) {
27
29 yac_yaxt_init(MPI_COMM_WORLD);
30
31 int size;
32 MPI_Comm_size(MPI_COMM_WORLD, &size);
33
34 enum {NUM_PROCS = 4};
35 if (size != NUM_PROCS) {
36 PUT_ERR("ERROR: wrong number of processes\n");
37 return TEST_EXIT_CODE;
38 }
39
41
42 utest_shared_comp_couple();
43
45
46 return TEST_EXIT_CODE;
47}
48
54static void utest_shared_comp_couple() {
55
56 struct yac_instance * instance =
57 yac_instance_new(MPI_COMM_WORLD);
59 instance, "2008-03-09T16:05:07", "2008-03-10T16:05:07");
60
61 char const * comp_names[] = {"comp_0", "comp_1", "comp_2"};
62 yac_instance_def_components(instance, comp_names, 3);
63
64 size_t num_vertices[2] = {2, 2};
65 int cyclic[2] = {0, 0};
66 double coordinates_x[2] = {0.0, 1.0};
67 double coordinates_y[2] = {0.0, 1.0};
68 yac_int global_cell_ids[1] = {0};
69 yac_int global_corner_ids[4] = {0, 1, 2, 3};
70 int cell_core_mask[1] = {1};
71 int corner_core_mask[4] = {1, 1, 1, 1};
72
73 char const * src_grid_name = "shared_src_grid";
74 char const * tgt_grid_name = "shared_tgt_grid";
75 struct yac_basic_grid_data src_grid_data =
78 src_grid_data.cell_ids = TO_POINTER(global_cell_ids);
79 src_grid_data.vertex_ids = TO_POINTER(global_corner_ids);
81 src_grid_data.core_vertex_mask = TO_POINTER(corner_core_mask);
82 struct yac_basic_grid_data tgt_grid_data =
85 tgt_grid_data.cell_ids = TO_POINTER(global_cell_ids);
86 tgt_grid_data.vertex_ids = TO_POINTER(global_corner_ids);
88 tgt_grid_data.core_vertex_mask = TO_POINTER(corner_core_mask);
89 struct yac_basic_grid * src_grid =
90 yac_basic_grid_new(src_grid_name, src_grid_data);
91 struct yac_basic_grid * tgt_grid =
92 yac_basic_grid_new(tgt_grid_name, tgt_grid_data);
93
94 char * timestep = strdup(yac_time_to_ISO("10", C_SECOND));
95 char const * field_name = "field_a";
96 struct yac_interp_field interp_field;
97 interp_field.location = YAC_LOC_CORNER;
98 interp_field.coordinates_idx =
100 src_grid, YAC_LOC_CORNER,
101 src_grid_data.vertex_coordinates, src_grid_data.num_vertices);
102 interp_field.masks_idx = SIZE_MAX;
104 instance, field_name, comp_names[0], src_grid,
105 &interp_field, 1, 1, timestep);
106 interp_field.coordinates_idx =
108 tgt_grid, YAC_LOC_CORNER,
109 tgt_grid_data.vertex_coordinates, tgt_grid_data.num_vertices);
111 instance, field_name, comp_names[1], tgt_grid,
112 &interp_field, 1, 1, timestep);
114 instance, field_name, comp_names[2], tgt_grid,
115 &interp_field, 1, 1, timestep);
116
119 char const * coupling_period = timestep;
120 yac_interp_stack_config_add_fixed(interp_stack, -1.0);
121
122 // Same source/grid/field, only target component differs.
124 comp_names[0], src_grid_name, field_name,
125 comp_names[1], tgt_grid_name, field_name,
126 coupling_period, YAC_REDUCTION_TIME_NONE, interp_stack, 0, 0, NULL,
127 YAC_WEIGHT_FILE_ON_EXISTING_DEFAULT_VALUE, 0, 1.0, 0.0, 0, NULL, NULL,
128 NULL, NULL, 0);
130 comp_names[0], src_grid_name, field_name,
131 comp_names[2], tgt_grid_name, field_name,
132 coupling_period, YAC_REDUCTION_TIME_NONE, interp_stack, 0, 0, NULL,
133 YAC_WEIGHT_FILE_ON_EXISTING_DEFAULT_VALUE, 0, 1.0, 0.0, 0, NULL, NULL,
134 NULL, NULL, 0);
135
136 free(timestep);
137 yac_interp_stack_config_delete(interp_stack);
138
139 struct yac_basic_grid * grids[2] = {src_grid, tgt_grid};
140 yac_instance_setup(instance, grids, 2);
141
142 yac_instance_delete(instance);
143 if (tgt_grid != NULL) yac_basic_grid_delete(tgt_grid);
144 if (src_grid != NULL) yac_basic_grid_delete(src_grid);
145}
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(struct yac_basic_grid *grid, enum yac_location location, yac_coordinate_pointer coordinates, size_t count)
Definition basic_grid.c:239
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
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
yac_coordinate_pointer vertex_coordinates
enum yac_location location
Definition basic_grid.h:16
#define TO_POINTER(a)
Definition test_common.h:14
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
void yac_cdef_calendar(int calendar)
Definition yac.c:1063
int const YAC_PROLEPTIC_GREGORIAN
Definition yac.c:72
int const YAC_REDUCTION_TIME_NONE
Definition yac.c:56
void yac_mpi_finalize()
Definition yac_mpi.c:109
void yac_yaxt_init(MPI_Comm comm)
Definition yac_mpi.c:41
void yac_mpi_init()
Definition yac_mpi.c:78
YAC_INT yac_int
Definition yac_types.h:15