18#define STR_USAGE "Usage: %s -g gridFilename\n"
19#define YAC_ASSERT(exp, msg) \
22 fprintf(stderr, "ERROR: %s\n" STR_USAGE, msg, argv[0]); \
28 int argc,
char ** argv,
char const ** gridFilename);
30int main (
int argc,
char *argv[]) {
38 MPI_Barrier(MPI_COMM_WORLD);
41 char const * gridFilename =
"GR30_lsm.nc";
48 char * comp_name =
"MPIOM";
56 int rank, comp_rank, comp_size;
57 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
58 MPI_Comm_rank(comp_comm,&comp_rank);
59 MPI_Comm_size(comp_comm,&comp_size);
60 MPI_Comm_free(&comp_comm);
64 int * num_vertices_per_cell;
76 int * corner_core_mask;
77 int * global_corner_id;
81 &x_vertices, &y_vertices, &x_cells,
82 &y_cells, &global_cell_id,
85 &corner_core_mask, comp_rank, comp_size);
89 sprintf(grid_name,
"%s_grid", comp_name);
92 grid_name, nbr_vertices, nbr_cells, num_vertices_per_cell,
110 double * cell_point_data = malloc(nbr_cells *
sizeof(*cell_point_data));
111 double * corner_point_data = malloc(nbr_vertices *
sizeof(*corner_point_data));
113 int cell_to_vertex_offset = 0;
115 for (
int i = 0; i < nbr_cells; ++i) {
117 double middle_point[3] = {0, 0, 0};
119 for (
int j = 0; j < num_vertices_per_cell[
i]; ++j) {
121 double curr_point[3];
127 middle_point[0] += curr_point[0];
128 middle_point[1] += curr_point[1];
129 middle_point[2] += curr_point[2];
132 double scale = 1.0 / sqrt(middle_point[0] * middle_point[0] +
133 middle_point[1] * middle_point[1] +
134 middle_point[2] * middle_point[2]);
136 middle_point[0] *= scale;
137 middle_point[1] *= scale;
138 middle_point[2] *= scale;
142 XYZtoLL(middle_point, &lon, &lat);
144 cell_to_vertex_offset += num_vertices_per_cell[
i];
149 for (
int i = 0;
i < nbr_vertices; ++
i)
150 corner_point_data[i] =
yac_test_func(x_vertices[i], y_vertices[i]);
152 MPI_Barrier(MPI_COMM_WORLD);
155 "toy_multi_common(%s): Time for initialisation %f\n",
156 comp_name, MPI_Wtime()-tic);
159 char vtk_filename[32];
160 sprintf(vtk_filename,
"%s_out_%d.vtk", comp_name, comp_rank);
163 malloc(nbr_vertices *
sizeof(*point_data));
164 for (
int i = 0;
i < nbr_vertices; ++
i)
165 LLtoXYZ(x_vertices[i], y_vertices[i], point_data[i]);
169 vtk_file, (
double *)point_data, nbr_vertices);
172 (
unsigned*)num_vertices_per_cell, nbr_cells);
174 vtk_file, corner_core_mask, nbr_vertices,
"corner_core_mask");
176 vtk_file, global_corner_id, nbr_vertices,
"global_corner_id");
180 vtk_file, global_cell_id, nbr_cells,
"global_cell_id");
185 cell_point_data, corner_point_data, vtk_file);
188 free(corner_point_data);
189 free(cell_point_data);
190 free(num_vertices_per_cell);
198 free(global_cell_id);
199 free(corner_core_mask);
200 free(global_corner_id);
206 int argc,
char ** argv,
char const ** gridFilename) {
209 while ((opt = getopt(argc, argv,
"g:")) != -1) {
210 YAC_ASSERT((opt ==
'c') || (opt ==
'g'),
"invalid command argument")
214 *gridFilename = optarg;
static void XYZtoLL(double const p_in[], double *lon, double *lat)
void yac_read_part_mpiom_grid_information(const char *filename, int *num_vertices, int *num_cells, int **num_vertices_per_cell, int **cell_to_vertex, double **x_vertices, double **y_vertices, double **x_cells, double **y_cells, int **global_cell_id, int **cell_mask, int **cell_core_mask, int **global_corner_id, int **corner_core_mask, int rank, int size)
double yac_test_func(double lon, double lat)
int run_toy_multi_common(char const *comp_name, int comp_id, int grid_id, int cell_point_id, int corner_point_id, double *cell_point_data, double *corner_point_data, YAC_VTK_FILE *vtk_file)
static void parse_arguments(int argc, char **argv, char const **gridFilename)
#define YAC_ASSERT(exp, msg)
static void LLtoXYZ(double lon, double lat, double p_out[])
void yac_vtk_write_cell_scalars_int(YAC_VTK_FILE *vtk_file, int *scalars, unsigned num_cells, char *name)
void yac_vtk_write_point_data(YAC_VTK_FILE *vtk_file, double *point_data, unsigned num_points)
void yac_vtk_write_point_scalars_int(YAC_VTK_FILE *vtk_file, int *scalars, unsigned num_points, char *name)
void yac_vtk_write_cell_data(YAC_VTK_FILE *vtk_file, unsigned *cell_corners, unsigned *num_points_per_cell, unsigned num_cells)
YAC_VTK_FILE * yac_vtk_open(const char *filename, const char *title)
void yac_cset_global_index(int const *global_index, int location, int grid_id)
void yac_cdef_datetime(const char *start_datetime, const char *end_datetime)
int const YAC_LOCATION_CELL
int const YAC_LOCATION_CORNER
void yac_cget_comp_comm(int comp_id, MPI_Comm *comp_comm)
void yac_cdef_grid_unstruct(const char *grid_name, int nbr_vertices, int nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex, int *grid_id)
void yac_cdef_points_unstruct(int const grid_id, int const nbr_points, int const located, double const *x_points, double const *y_points, int *point_id)
void yac_cdef_calendar(int calendar)
void yac_cset_core_mask(int const *is_core, int location, int grid_id)
int const YAC_PROLEPTIC_GREGORIAN
void yac_cset_mask(int const *is_valid, int points_id)
void yac_cdef_comp(char const *comp_name, int *comp_id)
double(* yac_coordinate_pointer)[3]