25#define STR_USAGE "Usage: %s -c configFilename -g gridFilename\n"
26#define YAC_ASSERT(exp, msg) \
29 fprintf(stderr, "ERROR: %s\n" STR_USAGE, msg, argv[0]); \
35 int argc,
char ** argv,
char const ** configFilename,
char const ** gridFilename);
36static inline void LLtoXYZ(
double lon,
double lat,
double p_out[]);
37static inline void XYZtoLL (
double const p_in[],
double * lon,
double * lat);
39int main (
int argc,
char *argv[]) {
43 MPI_Init (NULL, NULL);
45 char const * configFilename =
"perf_toy.yaml";
46 char const * gridFilename =
"iconR2B06-grid.nc";
49 xt_initialize(MPI_COMM_WORLD);
54 printf (
". main: calling yac_cinit\n");
57 double tic, toc, time;
59 MPI_Barrier(MPI_COMM_WORLD);
65 FILE *f = fopen(configFilename,
"rb");
66 fseek(f, 0, SEEK_END);
67 long fsize = ftell(f);
68 fseek(f, 0, SEEK_SET);
70 char *
string = malloc(fsize + 1);
71 size_t dummy = fread(
string, 1, fsize, f);
82 printf (
". main: calling yac_cdef_comp\n");
86 char * comp_name =
"ICON";
90 printf (
". main: defined %s with local comp ID %i \n",
"ICON",
comp_id );
99 MPI_Comm_rank(local_comm,&rank);
100 MPI_Comm_size(local_comm,&size);
102 MPI_Comm_free(&local_comm);
115 int * num_vertices_per_cell;
123 int * global_cell_id;
125 int * global_corner_id;
126 int * corner_core_mask;
130 &x_vertices, &y_vertices, &x_cells,
131 &y_cells, &global_cell_id,
134 &corner_core_mask, rank, size);
136 double * x_points, * y_points;
138 x_points = x_vertices;
139 y_points = y_vertices;
141 double * x_center, * y_center;
147 "icon_grid", num_vertices,
num_cells, num_vertices_per_cell,
171 printf (
"ICON: Time for initialisation %f\n", time );
176 printf (
". main: calling yac_cenddef\n");
179 MPI_Barrier(MPI_COMM_WORLD);
187 printf (
"ICON: Time for search %f\n", time );
189 double * conserv_in = malloc(
num_cells *
sizeof(*conserv_in));
190 double * avg_in = malloc(num_vertices *
sizeof(*avg_in));
194 for (
int i = 0;
i < num_vertices; ++
i) avg_in[i] = -10;
196 double * cell_out = malloc(
num_cells *
sizeof(*cell_out));
197 double * corner_out = malloc(num_vertices *
sizeof(*corner_out));
201 int cell_to_vertex_offset = 0;
205 double middle_point[3] = {0, 0, 0};
207 for (
int j = 0; j < num_vertices_per_cell[
i]; ++j) {
209 double curr_point[3];
215 middle_point[0] += curr_point[0];
216 middle_point[1] += curr_point[1];
217 middle_point[2] += curr_point[2];
220 double scale = 1.0 / sqrt(middle_point[0] * middle_point[0] +
221 middle_point[1] * middle_point[1] +
222 middle_point[2] * middle_point[2]);
224 middle_point[0] *= scale;
225 middle_point[1] *= scale;
226 middle_point[2] *= scale;
230 XYZtoLL(middle_point, &lon, &lat);
232 cell_to_vertex_offset += num_vertices_per_cell[
i];
236 for (
int i = 0;
i < num_vertices; ++
i)
239 MPI_Barrier(MPI_COMM_WORLD);
244 double *point_set_data[1];
245 double **collection_data[1] = {point_set_data};
247 point_set_data[0] = cell_out;
248 yac_cput(field_ids[0], 1, collection_data, &
info, &err);
252 double *collection_data[1] = {conserv_in};
254 yac_cget(field_ids[1], 1, collection_data, &
info, &err);
259 printf (
"ICON: Time for ping-pong %f\n", time );
266 char vtk_filename[32];
268 sprintf(vtk_filename,
"perf_toy_icon_%d.vtk", rank);
270 double point_data[num_vertices][3];
271 for (
int i = 0;
i < num_vertices; ++
i) {
272 LLtoXYZ(x_vertices[i], y_vertices[i], point_data[i]);
278 (
unsigned*)num_vertices_per_cell,
num_cells);
280 vtk_file, corner_core_mask, num_vertices,
"corner_core_mask");
282 vtk_file, global_corner_id, num_vertices,
"global_corner_id");
286 vtk_file, global_cell_id,
num_cells,
"global_cell_id");
289 vtk_file, conserv_in,
num_cells,
"conserv_in");
291 vtk_file, cell_out,
num_cells,
"cell_out");
293 vtk_file, avg_in, num_vertices,
"avg_in");
295 vtk_file, corner_out, num_vertices,
"corner_out");
307 free(num_vertices_per_cell);
314 free(global_cell_id);
316 free(global_corner_id);
317 free(corner_core_mask);
327 int argc,
char ** argv,
328 char const ** configFilename,
char const ** gridFilename) {
331 while ((opt = getopt(argc, argv,
"c:g:")) != -1) {
332 YAC_ASSERT((opt ==
'c') || (opt ==
'g'),
"invalid command argument")
336 *configFilename = optarg;
339 *gridFilename = optarg;
345static inline void LLtoXYZ(
double lon,
double lat,
double p_out[]) {
347 while (lon < -M_PI) lon += 2.0 * M_PI;
348 while (lon >= M_PI) lon -= 2.0 * M_PI;
350 double cos_lat = cos(lat);
351 p_out[0] = cos_lat * cos(lon);
352 p_out[1] = cos_lat * sin(lon);
356static inline void XYZtoLL (
double const p_in[],
double * lon,
double * lat) {
358 *lon = atan2(p_in[1] , p_in[0]);
359 *lat = M_PI_2 - acos(p_in[2]);
static void parse_arguments(int argc, char **argv, char const **configFilename, char const **gridFilename)
static void LLtoXYZ(double lon, double lat, double p_out[])
#define YAC_ASSERT(exp, msg)
static void XYZtoLL(double const p_in[], double *lon, double *lat)
void yac_read_part_icon_grid_information(const char *filename, int *nbr_vertices, int *nbr_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)
void yac_vtk_write_cell_scalars_double(YAC_VTK_FILE *vtk_file, double *scalars, unsigned num_cells, char *name)
void yac_vtk_write_cell_scalars_int(YAC_VTK_FILE *vtk_file, int *scalars, unsigned num_cells, char *name)
void yac_vtk_write_point_scalars_double(YAC_VTK_FILE *vtk_file, double *scalars, unsigned num_points, 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_close(YAC_VTK_FILE *vtk_file)
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)
int const YAC_LOCATION_CELL
void yac_cfinalize()
Finalises YAC.
int const YAC_LOCATION_CORNER
void yac_cget_comp_comm(int comp_id, MPI_Comm *comp_comm)
void yac_cget(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
int const YAC_TIME_UNIT_SECOND
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_cput(int const field_id, int const collection_size, double ***const send_field, int *info, int *ierr)
void yac_cread_config_yaml(const char *yaml_filename)
void yac_cset_core_mask(int const *is_core, int location, int grid_id)
void yac_cdef_comp(char const *comp_name, int *comp_id)
void yac_cdef_field(char const *name, int const comp_id, int const *point_ids, int const num_pointsets, int collection_size, const char *timestep, int time_unit, int *field_id)