Actual source code: ex3.c
2: static char help[] = "Tests AOData.\n\n";
4: #include petscao.h
5: #include petscbt.h
9: int main(int argc,char **argv)
10: {
11: int n = 2,nglobal,bs = 2,*keys,*data,ierr,rank,size,i,start;
12: PetscReal *gd;
13: AOData aodata;
14: PetscViewer binary;
15: PetscBT ld;
17: PetscInitialize(&argc,&argv,(char*)0,help);
18: PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);
20: MPI_Comm_rank(PETSC_COMM_WORLD,&rank); n = n + rank;
21: MPI_Allreduce(&n,&nglobal,1,MPI_INT,MPI_SUM,PETSC_COMM_WORLD);
22: MPI_Comm_size(PETSC_COMM_WORLD,&size);
24: /*
25: Create a database with two sets of keys
26: */
27: AODataCreateBasic(PETSC_COMM_WORLD,&aodata);
28: AODataKeyAdd(aodata,"key1",PETSC_DECIDE,nglobal);
29: AODataKeyAdd(aodata,"key2",PETSC_DECIDE,nglobal);
31: /* allocate space for the keys each processor will provide */
32: PetscMalloc(n*sizeof(int),&keys);
34: /*
35: We assign the first set of keys (0 to 2) to processor 0, etc.
36: This computes the first local key on each processor
37: */
38: MPI_Scan(&n,&start,1,MPI_INT,MPI_SUM,PETSC_COMM_WORLD);
39: start -= n;
41: for (i=0; i<n; i++) {
42: keys[i] = start + i;
43: }
45: /*
46: Allocate data for the first key and first segment
47: */
48: PetscMalloc(bs*n*sizeof(int),&data);
49: for (i=0; i<n; i++) {
50: data[2*i] = -(start + i);
51: data[2*i+1] = -(start + i) - 10000;
52: }
53: AODataSegmentAdd(aodata,"key1","seg1",bs,n,keys,data,PETSC_INT);
54: PetscFree(data);
56: /*
57: Allocate data for first key and second segment
58: */
59: bs = 3;
60: PetscMalloc(bs*n*sizeof(PetscReal),&gd);
61: for (i=0; i<n; i++) {
62: gd[3*i] = -(start + i);
63: gd[3*i+1] = -(start + i) - 10000;
64: gd[3*i+2] = -(start + i) - 100000;
65: }
66: AODataSegmentAdd(aodata,"key1","seg2",bs,n,keys,gd,PETSC_REAL);
68: /*
69: Allocate data for first key and third segment
70: */
71: bs = 1;
72: PetscBTCreate(n,ld);
73: for (i=0; i<n; i++) {
74: if (i % 2) PetscBTSet(ld,i);
75: }
76: AODataSegmentAdd(aodata,"key1","seg3",bs,n,keys,ld,PETSC_LOGICAL);
77: PetscBTDestroy(ld);
79: /*
80: Use same data for second key and first segment
81: */
82: bs = 3;
83: AODataSegmentAdd(aodata,"key2","seg1",bs,n,keys,gd,PETSC_REAL);
84: PetscFree(gd);
85: PetscFree(keys);
87: AODataView(aodata,PETSC_VIEWER_STDOUT_WORLD);
89: /*
90: Save the database to a file
91: */
92: PetscViewerBinaryOpen(PETSC_COMM_WORLD,"dataoutput",PETSC_FILE_CREATE,&binary);
93: AODataView(aodata,binary);
94: PetscViewerDestroy(binary);
95:
96: AODataDestroy(aodata);
98: PetscFinalize();
99: return 0;
100: }
101: