YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
toy_coupling.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#define EXACT
6
7#include <mpi.h>
8
9#include <stdlib.h>
10#include <stdio.h>
11#include <unistd.h>
12#include <string.h>
13#include <math.h>
14
15#include "yac.h"
16#include "yac_core.h"
17#include "yac_utils.h"
18
19#define YAC_RAD (0.01745329251994329576923690768489) // M_PI / 180
20
21const char * fieldName[] = { "AtoB",
22 "BtoA"};
23
24const int no_of_fields = 2;
25
28int comp_ids[1];
29
31
33
35
36double * recv_buffer;
37double * send_buffer;
38
39double * buffer = NULL;
40
43
45
46static void dummy_compA (char const * configFilename, char const * gridPath);
47static void dummy_compB (char const * configFilename);
48
49#define STR_USAGE "Usage: %s -c configFilename -g gridPath\n"
50#define YAC_ASSERT_ARGS(exp, msg) \
51 { \
52 if(!((exp))) { \
53 fprintf(stderr, "ERROR: %s\n" STR_USAGE, msg, argv[0]); \
54 exit(EXIT_FAILURE); \
55 } \
56 }
57
58static void parse_arguments(
59 int argc, char ** argv, char const ** configFilenamem, char const ** gridPath);
60static inline void LLtoXYZ(double lon, double lat, double p_out[]);
61
62/* -------------------------------------------------------------------- */
63
64int main (int argc, char *argv[]) {
65 int size, rank;
66
67 MPI_Init (0, NULL);
68
69 MPI_Comm_rank ( MPI_COMM_WORLD, &rank );
70 MPI_Comm_size ( MPI_COMM_WORLD, &size );
71
72 YAC_ASSERT(size == 2, "Too many processes have been launched")
73
74 char const * configFilename = "toy_coupling.yaml"; // default configuration file
75 char const * gridPath = ".";
76 parse_arguments(argc, argv, &configFilename, &gridPath);
77
78 if (rank == 0) dummy_compA(configFilename, gridPath);
79 else dummy_compB(configFilename);
80
81 MPI_Finalize ();
82
83 return EXIT_SUCCESS;
84}
85
86/* -------------------------------------------------------------------- */
87
89
90 struct {
91 double lon, lat;
92 } p;
93 int i;
94};
95
96static int compare_point_with_index(const void * a,const void * b) {
97
98 const struct point_with_index * a_ = (struct point_with_index*)a;
99 const struct point_with_index * b_ = (struct point_with_index*)b;
100
101 int lon_diff = fabs(a_->p.lon - b_->p.lon) > 1e-9;
102 int lat_diff = fabs(a_->p.lat - b_->p.lat) > 1e-9;
103
104 if (lon_diff) {
105
106 if (a_->p.lon > b_->p.lon) return -1;
107 else return 1;
108
109 } else if (lat_diff) {
110
111 if (a_->p.lat > b_->p.lat) return -1;
112 else return 1;
113 } else
114 return 0;
115}
116
117static void remove_duplicated_vertices(double * temp_vertex_lon,
118 double * temp_vertex_lat,
119 int * temp_nbr_vertices,
120 int * old_to_new_id) {
121
122 struct point_with_index * sort_array =
123 malloc(*temp_nbr_vertices * sizeof(*sort_array));
124
125 for (int i = 0; i < *temp_nbr_vertices; ++i) {
126
127 double curr_lon, curr_lat;
128
129 curr_lon = temp_vertex_lon[i];
130 curr_lat = temp_vertex_lat[i];
131
132 while (curr_lon < 0.0) curr_lon += 2.0 * M_PI;
133 while (curr_lon >= 2.0 * M_PI) curr_lon -= 2.0 * M_PI;
134
135 sort_array[i].p.lon = curr_lon;
136 sort_array[i].p.lat = curr_lat;
137
138 sort_array[i].i = i;
139 }
140
141 qsort(sort_array, *temp_nbr_vertices, sizeof(*sort_array),
143
144 old_to_new_id[sort_array[0].i] = 1;
145
146 int last_unique_idx = sort_array[0].i;
147
148 for (int i = 1; i < *temp_nbr_vertices; ++i) {
149
150 if (compare_point_with_index(sort_array + i - 1, sort_array + i)) {
151
152 old_to_new_id[sort_array[i].i] = 1;
153 last_unique_idx = sort_array[i].i;
154
155 } else {
156
157 old_to_new_id[sort_array[i].i] = -last_unique_idx;
158 }
159 }
160
161 free(sort_array);
162
163 size_t new_nbr_vertices = 0;
164
165 for (int i = 0; i < *temp_nbr_vertices; ++i) {
166
167 if (old_to_new_id[i] == 1) {
168
169 temp_vertex_lon[new_nbr_vertices] = temp_vertex_lon[i];
170 temp_vertex_lat[new_nbr_vertices] = temp_vertex_lat[i];
171
172 old_to_new_id[i] = new_nbr_vertices;
173
174 new_nbr_vertices++;
175 }
176 }
177
178 for (int i = 0; i < *temp_nbr_vertices; ++i)
179 if (old_to_new_id[i] <= 0)
180 old_to_new_id[i] = old_to_new_id[-old_to_new_id[i]];
181
182 *temp_nbr_vertices = new_nbr_vertices;
183}
184
185static void read_compA_grid_data(char const * gridPath,
186 int * nbr_vertices, int * nbr_cells,
187 int ** num_vertices_per_cell, int ** cell_to_vertex,
188 double ** buffer_lonv, double ** buffer_latv,
189 double ** buffer_lon, double ** buffer_lat) {
190
191 *nbr_cells = 20;
192#ifdef EXACT
193 int nbr_vertices_per_cell = 12;
194#else
195 int nbr_vertices_per_cell = 7;
196#endif
197
198 // Read in grid data
199
200 char * gridFilename =
201#ifdef EXACT
202 "mesh_compA_exact.txt";
203#else
204 "mesh_compA_convex.txt";
205#endif
206
207 char * full_gridFilename = yac_file_path_join(gridPath, gridFilename, NULL);
208
209 char* inFormat0 = "%s %*s %*s";
210 char* inFormat1 = "%*10c %lf";
211#ifdef EXACT
212 char* inFormat2 = "%*10c %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf";
213 enum {num_entries_in_inFormat2 = 12};
214#else
215 char* inFormat2 = "%*10c %lf %lf %lf %lf %lf %lf %lf";
216 enum {num_entries_in_inFormat2 = 7};
217#endif
218
219 FILE *inData = fopen(full_gridFilename, "r");
221 inData, "Cannot open file \"%s\"", full_gridFilename);
222 free(full_gridFilename);
223
224 char dummy_string[32];
225
226 //skip first three lines
227
228 for ( int i = 0; i < 3; ++i )
229 YAC_ASSERT(1 == fscanf (inData, inFormat0, dummy_string),
230 "fscanf failed reading data");
231
232 *nbr_vertices = nbr_vertices_per_cell * (*nbr_cells);
233
234 *buffer_lon = malloc ( *nbr_cells * sizeof(*buffer_lon) );
235 *buffer_lat = malloc ( *nbr_cells * sizeof(*buffer_lat) );
236 *buffer_lonv = malloc ( (*nbr_vertices) * sizeof(*buffer_lonv) );
237 *buffer_latv = malloc ( (*nbr_vertices) * sizeof(*buffer_latv) );
238
239 for ( int i = 0; i < *nbr_cells; ++i ) {
240 YAC_ASSERT(1 == fscanf ( inData, inFormat1, &((*buffer_lon)[i]) ),
241 "fscanf failed reading data")
242 printf ("point buffer_lat %i : %lf \n", i, (*buffer_lon)[i]);
243 }
244
245 for ( int i = 0; i < *nbr_cells; ++i ) {
247 num_entries_in_inFormat2 ==
248 fscanf ( inData, inFormat2,
249 (*buffer_lonv) + i*nbr_vertices_per_cell + 0,
250 (*buffer_lonv) + i*nbr_vertices_per_cell + 1,
251 (*buffer_lonv) + i*nbr_vertices_per_cell + 2,
252 (*buffer_lonv) + i*nbr_vertices_per_cell + 3,
253 (*buffer_lonv) + i*nbr_vertices_per_cell + 4,
254 (*buffer_lonv) + i*nbr_vertices_per_cell + 5,
255 (*buffer_lonv) + i*nbr_vertices_per_cell + 6,
256 (*buffer_lonv) + i*nbr_vertices_per_cell + 7,
257 (*buffer_lonv) + i*nbr_vertices_per_cell + 8,
258 (*buffer_lonv) + i*nbr_vertices_per_cell + 9,
259 (*buffer_lonv) + i*nbr_vertices_per_cell + 10,
260 (*buffer_lonv) + i*nbr_vertices_per_cell + 11),
261 "fscanf failed reading data")
262 }
263
264 for ( int i = 0; i < *nbr_cells; ++i ) {
265 YAC_ASSERT (1 == fscanf ( inData, inFormat1, &((*buffer_lat)[i]) ),
266 "fscanf failed reading data")
267 printf ("point buffer_lat %i : %lf \n", i, (*buffer_lat)[i]);
268 }
269
270 for ( int i = 0; i < *nbr_cells; ++i ) {
272 num_entries_in_inFormat2 ==
273 fscanf ( inData, inFormat2,
274 (*buffer_latv) + i*nbr_vertices_per_cell + 0,
275 (*buffer_latv) + i*nbr_vertices_per_cell + 1,
276 (*buffer_latv) + i*nbr_vertices_per_cell + 2,
277 (*buffer_latv) + i*nbr_vertices_per_cell + 3,
278 (*buffer_latv) + i*nbr_vertices_per_cell + 4,
279 (*buffer_latv) + i*nbr_vertices_per_cell + 5,
280 (*buffer_latv) + i*nbr_vertices_per_cell + 6,
281 (*buffer_latv) + i*nbr_vertices_per_cell + 7,
282 (*buffer_latv) + i*nbr_vertices_per_cell + 8,
283 (*buffer_latv) + i*nbr_vertices_per_cell + 9,
284 (*buffer_latv) + i*nbr_vertices_per_cell + 10,
285 (*buffer_latv) + i*nbr_vertices_per_cell + 11),
286 "fscanf failed reading data")
287 }
288
289 for ( int i = 0; i < *nbr_vertices; ++i )
290 printf ("%i vertex buffer_lonv : %lf buffer_latv : %lf \n", i,
291 (*buffer_lonv)[i], (*buffer_latv)[i]);
292
293 for ( int i = 0; i < *nbr_cells; ++i ) {
294 (*buffer_lon)[i] *= YAC_RAD;
295 (*buffer_lat)[i] *= YAC_RAD;
296 }
297
298 for ( int i = 0; i < *nbr_vertices; ++i ) {
299 (*buffer_lonv)[i] *= YAC_RAD;
300 (*buffer_latv)[i] *= YAC_RAD;
301 }
302
303 // Connectivity
304
305 (*cell_to_vertex) = malloc ( (*nbr_cells) * nbr_vertices_per_cell *
306 sizeof(**cell_to_vertex) );
307 (*num_vertices_per_cell) = malloc ( *nbr_cells * sizeof(**num_vertices_per_cell) );
308
309 int * old_to_new_id = malloc((*nbr_vertices) * sizeof(*old_to_new_id));
310 remove_duplicated_vertices(*buffer_lonv, *buffer_latv, nbr_vertices,
311 old_to_new_id);
312
313 int count = 0;
314
315 for (int i = 0; i < *nbr_cells; ++i) {
316
317 (*cell_to_vertex)[count++] = old_to_new_id[i * nbr_vertices_per_cell];
318 (*num_vertices_per_cell)[i] = 1;
319
320 for (int j = 1; j < nbr_vertices_per_cell; ++j) {
321
322 if (old_to_new_id[i * nbr_vertices_per_cell + j - 1] !=
323 old_to_new_id[i * nbr_vertices_per_cell + j]) {
324
325 (*cell_to_vertex)[count++] = old_to_new_id[i * nbr_vertices_per_cell + j];
326 (*num_vertices_per_cell)[i]++;
327 }
328 }
329 }
330
331 fclose (inData);
332
333 free(old_to_new_id);
334}
335
336static void dummy_compA (char const * configFilename, char const * gridPath) {
337
338 int size, rank;
339
340 MPI_Comm local_comm;
341
342 char * comp_name = "dummy_compA";
343 char * grid_name = "dummy_compA_grid";
344
345 // Initialise the coupler
346 yac_cinit();
348 yac_cread_config_yaml(configFilename);
349
350 // Inform the coupler about what we are
351 yac_cdef_comp ( comp_name, &comp_id );
352 comp_ids[0] = comp_id;
353
354 yac_cget_comp_comm ( comp_id, &local_comm );
355
356 MPI_Comm_rank ( local_comm, &rank );
357 MPI_Comm_size ( local_comm, &size );
358
359 int nbr_vertices, nbr_cells, * num_vertices_per_cell, * cell_to_vertex;
360 double * buffer_lonv, * buffer_latv, * buffer_lon, * buffer_lat;
361
362
363 read_compA_grid_data(gridPath, &nbr_vertices, &nbr_cells, &num_vertices_per_cell,
364 &cell_to_vertex, &buffer_lonv, &buffer_latv,
366
367 // Define of unstructured grid
368
370 grid_name, nbr_vertices, nbr_cells, num_vertices_per_cell,
371 buffer_lonv, buffer_latv, cell_to_vertex, &grid_id);
372
373 // Decomposition information
374
375 global_index = malloc ( nbr_cells * sizeof(*global_index) ) ;
376 cell_core_mask = malloc ( nbr_cells * sizeof(*cell_core_mask) );
377
378 for ( int i = 0; i < nbr_cells; ++i ) {
379 global_index[i] = i;
380 cell_core_mask[i] = 1;
381 }
382
385
386 // Center points in cells
387
389 nbr_cells,
393 &cell_point_id );
394
395 // Define fields
396
397 field_id = malloc ( no_of_fields * sizeof(*field_id));
398
399 for ( int i = 0; i < no_of_fields; ++i )
401 comp_id,
403 1,1,"600",YAC_TIME_UNIT_SECOND,
404 &field_id[i] );
405
406 // Invoke the search
407
408 yac_cenddef ( );
409
410 // Data exchange
411
412 recv_buffer = malloc (nbr_cells * sizeof (*recv_buffer) );
413 send_buffer = malloc (nbr_cells * sizeof (*send_buffer) );
414
415 for ( int i = 0; i < nbr_cells; ++i ) recv_buffer[i] = 20.0;
416 for ( int i = 0; i < nbr_cells; ++i ) send_buffer[i] = (double) i;
417
418 // Send fields to compB
419 // --------------------
420
421 {
422 double *point_set_data[1];
423 double **collection_data[1];
424
425 point_set_data[0] = send_buffer;
426 collection_data[0] = &(point_set_data[0]);
427
428 // AtoB
429
430 yac_cput ( field_id[0], 1, collection_data, &info, &ierror );
431
432 }
433
434/*
435 //
436 // Receive fields from compB
437 // -------------------------
438
439 {
440 double *collection_data[1];
441
442 collection_data[0] = recv_buffer;
443
444 // BtoA
445
446 yac_cget ( field_id[1], 1, collection_data, &info, &ierror );
447
448 }
449*/
450
451 //----------------------------------------------------------
452 // write field to vtk output file
453 //----------------------------------------------------------
454
455 char vtk_filename[32];
456
457 sprintf(vtk_filename, "compA_out_%d.vtk", rank);
458
459 double point_data[nbr_vertices][3];
460 for (int i = 0; i < nbr_vertices; ++i)
461 LLtoXYZ(buffer_lonv[i], buffer_latv[i], point_data[i]);
462
463 YAC_VTK_FILE *vtk_file = yac_vtk_open(vtk_filename, "compA_out");
464
465 yac_vtk_write_point_data(vtk_file, (double *)point_data, nbr_vertices);
466
467 yac_vtk_write_cell_data(vtk_file, (unsigned *)cell_to_vertex,
468 (unsigned*)num_vertices_per_cell, nbr_cells);
469
471 vtk_file, global_index, nbr_cells, "global_cell_id");
472
474 vtk_file, recv_buffer, nbr_cells, "cell_in");
475
476 yac_vtk_close(vtk_file);
477
478 /* Free memory and finalise */
479
480 free (cell_to_vertex);
481 free (num_vertices_per_cell);
482
483 free ( buffer );
484
485 free ( buffer_lon );
486 free ( buffer_lat );
487
488 free ( buffer_lonv );
489 free ( buffer_latv );
490
491 free( global_index );
492 free( cell_core_mask );
493
494 free (recv_buffer);
495 free (send_buffer);
496
497 free (field_id);
498
499 yac_cfinalize ();
500
501}
502
503/* -------------------------------------------------------------------- */
504
505static void dummy_compB (char const * configFilename) {
506
507 int size, rank;
508
509 MPI_Comm local_comm;
510
511 char * comp_name = "dummy_compB";
512 char * grid_name = "dummy_compB_grid";
513
514 // Initialise the coupler
515 yac_cinit();
517 yac_cread_config_yaml(configFilename);
518
519 // Inform the coupler about what we are
520 yac_cdef_comp ( comp_name, &comp_id );
521 comp_ids[0] = comp_id;
522
523 yac_cget_comp_comm ( comp_id, &local_comm );
524
525 MPI_Comm_rank ( local_comm, &rank );
526 MPI_Comm_size ( local_comm, &size );
527
528 /* Define compB grid */
529
530 int nbr_vertices[2];
531 int nbr_cells[2] = {200, 320};
532 int cyclic[2] = {0,0};
533
534 double dx = 0.01 * YAC_RAD;
535
536 nbr_vertices[0] = nbr_cells[0] + 1;
537 nbr_vertices[1] = nbr_cells[1] + 1;
538
539 double * buffer_lonv = malloc ( nbr_vertices[0] * sizeof(*buffer_lonv) );
540 double * buffer_latv = malloc ( nbr_vertices[1] * sizeof(*buffer_latv) );
541
542 // Description of reg2d elements
543
544 buffer_lonv[0] = 265.6 * YAC_RAD - 0.5 * dx;
545 buffer_latv[0] = 58.5 * YAC_RAD - 0.5 * dx;
546
547 for ( int i = 1; i < nbr_vertices[0]; ++i )
548 buffer_lonv[i] = buffer_lonv[i-1] + dx;
549
550 for ( int i = 1; i < nbr_vertices[1]; ++i )
551 buffer_latv[i] = buffer_latv[i-1] + dx;
552
553 yac_cdef_grid_reg2d ( grid_name,
554 nbr_vertices,
555 cyclic,
556 buffer_lonv,
557 buffer_latv,
558 &grid_id );
559
560 // Decomposition information
561
562 int total_nbr_cells = nbr_cells[0] * nbr_cells[1];
563
564 global_index = malloc ( total_nbr_cells * sizeof(*global_index) ) ;
565 cell_core_mask = malloc ( total_nbr_cells * sizeof(*cell_core_mask) );
566
567 for ( int j = 0; j < nbr_cells[1]; ++j ) {
568 for ( int i = 0; i < nbr_cells[0]; ++i ) {
569 global_index[j*nbr_cells[0]+i] = j*nbr_cells[0]+i;
570 cell_core_mask[j*nbr_cells[0]+i] = 1;
571 }
572 }
573
576
577 // Center points in cells
578
579 double * buffer_lon = malloc ( nbr_cells[0] * sizeof(*buffer_lon) );
580 double * buffer_lat = malloc ( nbr_cells[1] * sizeof(*buffer_lat) );
581
582 buffer_lon[0] = 265.6 * YAC_RAD;
583 buffer_lat[0] = 58.5 * YAC_RAD;
584
585 for ( int i = 1; i < nbr_cells[0]; ++i )
586 buffer_lon[i] = buffer_lonv[i-1] + dx;
587
588 for ( int i = 1; i < nbr_cells[1]; ++i )
589 buffer_lat[i] = buffer_latv[i-1] + dx;
590
592 nbr_cells,
596 &cell_point_id );
597
598 // Define fields
599
600 field_id = malloc ( no_of_fields * sizeof(*field_id));
601
602 for ( int i = 0; i < 2; ++i )
604 comp_id,
606 1,1,"3600",YAC_TIME_UNIT_SECOND,
607 &field_id[i] );
608
609 // Invoke the search
610
611 yac_cenddef ( );
612
613 // Data exchange
614
615 recv_buffer = malloc ( total_nbr_cells * sizeof (*recv_buffer) );
616 send_buffer = malloc ( total_nbr_cells * sizeof (*send_buffer) );
617
618 for ( int j = 0; j < nbr_cells[1]; ++j ) {
619 for ( int i = 0; i < nbr_cells[0]; ++i ) {
620 send_buffer[j*nbr_cells[0]+i] = (float) j;
621 }
622 }
623
624 for ( int i = 0; i < total_nbr_cells; ++i ) recv_buffer[i] = 20;
625
626/*
627 // Send fields from compB to compA
628 // ------------------------------------
629
630 {
631 double *point_set_data[1];
632 double **collection_data[1];
633
634 point_set_data[0] = send_buffer;
635 collection_data[0] = &(point_set_data[0]);
636
637 // BtoA
638
639 yac_cput ( field_id[1], 1, collection_data, &info, &ierror );
640
641 }
642*/
643
644 // Receive fields from compA
645 // ------------------------------
646
647 {
648 double *collection_data[1];
649
650 collection_data[0] = recv_buffer;
651
652 // AtoB
653
654 yac_cget ( field_id[0], 1, collection_data, &info, &ierror );
655
656 }
657
658 //----------------------------------------------------------
659 // write field to vtk output file
660 //----------------------------------------------------------
661
662 double * point_data = malloc(nbr_vertices[0] * nbr_vertices[1] * 3 * sizeof(*point_data));
663 for (int i = 0; i < nbr_vertices[1]; ++i)
664 for (int j = 0; j < nbr_vertices[0]; ++j)
665 LLtoXYZ(buffer_lonv[j], buffer_latv[i],
666 &point_data[3*(i * nbr_vertices[0] + j)]);
667
668 unsigned * cell_corners = malloc(total_nbr_cells * 4 * sizeof(*cell_corners));
669 unsigned * num_points_per_cell = malloc(total_nbr_cells * sizeof(*num_points_per_cell));
670
671 for (int i = 0; i < total_nbr_cells; ++i) {
672
673 unsigned x_index, y_index;
674
675 y_index = i / nbr_cells[0];
676 x_index = i - y_index * nbr_cells[0];
677
678 cell_corners[i*4+0] = y_index * (nbr_cells[0] + 1) + x_index;
679 cell_corners[i*4+1] = y_index * (nbr_cells[0] + 1) + x_index + 1;
680 cell_corners[i*4+2] = (y_index + 1) * (nbr_cells[0] + 1) + x_index + 1;
681 cell_corners[i*4+3] = (y_index + 1) * (nbr_cells[0] + 1) + x_index;
682
683 num_points_per_cell[i] = 4;
684 }
685
686 char vtk_filename[32];
687
688 sprintf(vtk_filename, "compB_out_%d.vtk", rank);
689
690 YAC_VTK_FILE *vtk_file = yac_vtk_open(vtk_filename, "compB_out");
691
693 vtk_file, point_data, nbr_vertices[0]*nbr_vertices[1]);
694
696 vtk_file, cell_corners, num_points_per_cell, total_nbr_cells);
697
699 vtk_file, global_index, total_nbr_cells, "global_cell_id");
700
702 vtk_file, recv_buffer, total_nbr_cells, "cell_in");
703
704 yac_vtk_close(vtk_file);
705
706 /* Free memory */
707
708 free( global_index );
709 free( cell_core_mask );
710
711 free(num_points_per_cell);
712 free(cell_corners);
713 free(point_data);
714
715 free ( buffer );
716
717 free ( buffer_lon );
718 free ( buffer_lat );
719
720 free ( buffer_lonv );
721 free ( buffer_latv );
722
723 free (send_buffer);
724 free (recv_buffer);
725 free (field_id);
726
727 yac_cfinalize ();
728
729}
730
731/* -------------------------------------------------------------------- */
732
733
734
735static void parse_arguments(
736 int argc, char ** argv,
737 char const ** configFilename, char const ** gridPath) {
738
739 int opt;
740 while ((opt = getopt(argc, argv, "c:g:")) != -1) {
741 YAC_ASSERT_ARGS((opt == 'c') || (opt == 'g'), "invalid command argument")
742 switch (opt) {
743 default:
744 case 'c':
745 *configFilename = optarg;
746 break;
747 case 'g':
748 *gridPath = optarg;
749 break;
750 }
751 }
752}
753
754static inline void LLtoXYZ(double lon, double lat, double p_out[]) {
755
756 while (lon < -M_PI) lon += 2.0 * M_PI;
757 while (lon >= M_PI) lon -= 2.0 * M_PI;
758
759 double cos_lat = cos(lat);
760 p_out[0] = cos_lat * cos(lon);
761 p_out[1] = cos_lat * sin(lon);
762 p_out[2] = sin(lat);
763}
#define YAC_ASSERT(exp, msg)
char * yac_file_path_join(char const *path_prefix, char const *path_suffix, char const *extension)
Join two path components with a '/' and optional extension.
Definition io_utils.c:426
struct point_with_index::@5 p
int nbr_vertices_per_cell[NBR_CELLS]
int * cell_to_vertex
double * buffer_lat
double * buffer_lon
unsigned cyclic[2]
int info
static int compare_point_with_index(const void *a, const void *b)
int comp_ids[1]
static void dummy_compA(char const *configFilename, char const *gridPath)
const int no_of_fields
int * cell_core_mask
int grid_id
#define YAC_ASSERT_ARGS(exp, msg)
int cell_point_id
static void remove_duplicated_vertices(double *temp_vertex_lon, double *temp_vertex_lat, int *temp_nbr_vertices, int *old_to_new_id)
double * buffer
int nbr_fields
static void read_compA_grid_data(char const *gridPath, int *nbr_vertices, int *nbr_cells, int **num_vertices_per_cell, int **cell_to_vertex, double **buffer_lonv, double **buffer_latv, double **buffer_lon, double **buffer_lat)
int ierror
int * global_index
#define YAC_RAD
static void parse_arguments(int argc, char **argv, char const **configFilenamem, char const **gridPath)
double * send_buffer
int * field_id
double * recv_buffer
static void LLtoXYZ(double lon, double lat, double p_out[])
const char * fieldName[]
static void dummy_compB(char const *configFilename)
int comp_id
double(* p)(double lon, double lat)
Definition toy_scrip.c:119
void yac_vtk_write_cell_scalars_double(YAC_VTK_FILE *vtk_file, double *scalars, unsigned num_cells, char *name)
Definition vtk_output.c:262
void yac_vtk_write_cell_scalars_int(YAC_VTK_FILE *vtk_file, int *scalars, unsigned num_cells, char *name)
Definition vtk_output.c:248
void yac_vtk_write_point_data(YAC_VTK_FILE *vtk_file, double *point_data, unsigned num_points)
Definition vtk_output.c:69
void yac_vtk_close(YAC_VTK_FILE *vtk_file)
Definition vtk_output.c:401
void yac_vtk_write_cell_data(YAC_VTK_FILE *vtk_file, unsigned *cell_corners, unsigned *num_points_per_cell, unsigned num_cells)
Definition vtk_output.c:88
YAC_VTK_FILE * yac_vtk_open(const char *filename, const char *title)
Definition vtk_output.c:45
void yac_cenddef(void)
Definition yac.c:5006
void yac_cset_global_index(int const *global_index, int location, int grid_id)
Definition yac.c:5726
int const YAC_LOCATION_CELL
Definition yac.c:38
void yac_cinit(void)
Definition yac.c:737
void yac_cfinalize()
Finalises YAC.
Definition yac.c:1007
void yac_cget_comp_comm(int comp_id, MPI_Comm *comp_comm)
Definition yac.c:1132
void yac_cget(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
Definition yac.c:3298
void yac_cdef_grid_reg2d(const char *grid_name, int nbr_vertices[2], int cyclic[2], double *x_vertices, double *y_vertices, int *grid_id)
Definition yac.c:5511
void yac_cdef_points_reg2d(int const grid_id, int const *nbr_points, int const located, double const *x_points, double const *y_points, int *point_id)
Definition yac.c:1540
int const YAC_TIME_UNIT_SECOND
Definition yac.c:64
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)
Definition yac.c:5547
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)
Definition yac.c:1639
void yac_cput(int const field_id, int const collection_size, double ***const send_field, int *info, int *ierr)
Definition yac.c:4271
void yac_cread_config_yaml(const char *yaml_filename)
Definition yac.c:817
void yac_cdef_calendar(int calendar)
Definition yac.c:1036
void yac_cset_core_mask(int const *is_core, int location, int grid_id)
Definition yac.c:5742
int const YAC_PROLEPTIC_GREGORIAN
Definition yac.c:73
void yac_cdef_comp(char const *comp_name, int *comp_id)
Definition yac.c:1345
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)
Definition yac.c:1929
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:39