1 /*
2 ! @file test_unstructured.c
3 ! @author Kyle Horne <horne.kyle@gmail.com>
4 ! @version 0.2
5 !
6 ! @section LICENSE
7 ! BSD style license
8 !
9 ! @section DESCRIPTION
10 ! Test program for pcgns library
11 */
12
13 #include <stdio.h>
14 #include <stdlib.h>
15
16 #include "pcgnslib.h"
17 #include "mpi.h"
18
19 #define cgp_doError {printf("Error at %s:%u\n",__FILE__, __LINE__); return 1;}
20
main(int argc,char * argv[])21 int main(int argc, char* argv[]) {
22 int err;
23 int comm_size;
24 int comm_rank;
25 MPI_Info info;
26 int fn;
27 int B;
28 int Z;
29 int S;
30 int Cx,Cy,Cz;
31 int cell_dim = 3;
32 int phys_dim = 3;
33 cgsize_t nijk[3], min, max;
34 int k, count;
35 double *x, *y, *z;
36 int nelems;
37 cgsize_t start, end, emin, emax, *elements;
38
39 nijk[0] = 10;
40 nijk[1] = nijk[0]-1;
41 nijk[2] = 0;
42
43 err = MPI_Init(&argc,&argv);
44 if(err!=MPI_SUCCESS) cgp_doError;
45 err = MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
46 if(err!=MPI_SUCCESS) cgp_doError;
47 err = MPI_Comm_rank(MPI_COMM_WORLD, &comm_rank);
48 if(err!=MPI_SUCCESS) cgp_doError;
49 err = MPI_Info_create(&(info));
50 if(err!=MPI_SUCCESS) cgp_doError;
51
52 if (cgp_open("test_unstructured.cgns", CG_MODE_WRITE, &fn) ||
53 cg_base_write(fn, "Base 1", cell_dim, phys_dim, &B) ||
54 cg_zone_write(fn, B, "Zone 1", nijk, CGNS_ENUMV(Unstructured), &Z))
55 cgp_error_exit();
56
57 count = 10 / comm_size;
58 x = (double *)malloc(count*sizeof(double));
59 y = (double *)malloc(count*sizeof(double));
60 z = (double *)malloc(count*sizeof(double));
61
62 min = count*comm_rank+1;
63 max = count*(comm_rank+1);
64
65 for(k=0;k<count;k++) {
66 x[k] = (double) (min+k);
67 y[k] = 0.0;
68 z[k] = 0.0;
69 }
70
71 if (cgp_coord_write(fn,B,Z,CGNS_ENUMV(RealDouble),"CoordinateX",&Cx) ||
72 cgp_coord_write(fn,B,Z,CGNS_ENUMV(RealDouble),"CoordinateY",&Cy) ||
73 cgp_coord_write(fn,B,Z,CGNS_ENUMV(RealDouble),"CoordinateZ",&Cz))
74 cgp_error_exit();
75
76 if (cgp_coord_write_data(fn,B,Z,Cx,&min,&max,x) ||
77 cgp_coord_write_data(fn,B,Z,Cy,&min,&max,y) ||
78 cgp_coord_write_data(fn,B,Z,Cz,&min,&max,z))
79 cgp_error_exit();
80
81 start = 1;
82 end = 9;
83 if (cgp_section_write(fn,B,Z,"Elements",CGNS_ENUMV(BAR_2),start,end,0,&S))
84 cgp_error_exit();
85
86 nelems = (comm_rank!=comm_size-1)?9/comm_size:9-(9/comm_size)*(comm_size-1);
87 printf("%d:%d\n",comm_rank,nelems);
88 emin = (9/comm_size)*comm_rank+1;
89 emax = (comm_rank!=comm_size-1)?(9/comm_size)*(comm_rank+1):9;
90
91 elements = (cgsize_t *)malloc(nelems*2*sizeof(cgsize_t));
92 for(k=0;k<nelems;k++) {
93 elements[2*k] = k+emin;
94 elements[2*k+1] = k+emin+1;
95 }
96 printf("%d:%d %d %d\n",comm_rank,nelems,(int)emin,(int)emax);
97
98 if (cgp_elements_write_data(fn,B,Z,S,emin,emax,elements))
99 cgp_error_exit();
100
101 if (cgp_close(fn)) cgp_error_exit();
102
103 err = MPI_Finalize();
104 if(err!=MPI_SUCCESS) cgp_doError;
105 return 0;
106 }
107