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