xref: /petsc/src/vec/is/ao/tests/ex1.c (revision ebead697dbf761eb322f829370bbe90b3bd93fa3)
1 
2 static char help[] = "Demonstrates constructing an application ordering.\n\n";
3 
4 #include <petscsys.h>
5 #include <petscao.h>
6 #include <petscviewer.h>
7 
8 int main(int argc,char **argv)
9 {
10   PetscInt       i,n = 5;
11   PetscInt       getpetsc[]  = {0,3,4},getapp[]  = {2,1,9,7};
12   PetscInt       getpetsc1[] = {0,3,4},getapp1[] = {2,1,9,7};
13   PetscInt       getpetsc2[] = {0,3,4},getapp2[] = {2,1,9,7};
14   PetscInt       getpetsc3[] = {0,3,4},getapp3[] = {2,1,9,7};
15   PetscInt       getpetsc4[] = {0,3,4},getapp4[] = {2,1,9,7};
16   PetscMPIInt    rank,size;
17   IS             ispetsc,isapp;
18   AO             ao;
19   const PetscInt *app;
20 
21   PetscFunctionBeginUser;
22   PetscCall(PetscInitialize(&argc,&argv,(char*)0,help));
23   PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL));
24   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank));
25   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size));
26 
27   /* create the index sets */
28   PetscCall(ISCreateStride(PETSC_COMM_WORLD,n,rank,size,&isapp));
29   PetscCall(ISCreateStride(PETSC_COMM_WORLD,n,n*rank,1,&ispetsc)); /* natural numbering */
30 
31   /* create the application ordering */
32   PetscCall(AOCreateBasicIS(isapp,ispetsc,&ao));
33   PetscCall(AOView(ao,PETSC_VIEWER_STDOUT_WORLD));
34 
35   PetscCall(AOPetscToApplication(ao,4,getapp));
36   PetscCall(AOApplicationToPetsc(ao,3,getpetsc));
37 
38   PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] 2,1,9,7 PetscToApplication %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT "\n",rank,getapp[0],getapp[1],getapp[2],getapp[3]));
39   PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] 0,3,4 ApplicationToPetsc %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT "\n",rank,getpetsc[0],getpetsc[1],getpetsc[2]));
40   PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT));
41   PetscCall(AODestroy(&ao));
42 
43   /* test MemoryScalable ao */
44   /*-------------------------*/
45   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nTest AOCreateMemoryScalable: \n"));
46   PetscCall(AOCreateMemoryScalableIS(isapp,ispetsc,&ao));
47   PetscCall(AOView(ao,PETSC_VIEWER_STDOUT_WORLD));
48 
49   PetscCall(AOPetscToApplication(ao,4,getapp1));
50   PetscCall(AOApplicationToPetsc(ao,3,getpetsc1));
51 
52   /* Check accuracy */;
53   for (i=0; i<4; i++) {
54     PetscCheck(getapp1[i] == getapp[i],PETSC_COMM_SELF,PETSC_ERR_USER,"getapp1 %" PetscInt_FMT " != getapp %" PetscInt_FMT,getapp1[i],getapp[i]);
55   }
56   for (i=0; i<3; i++) {
57     PetscCheck(getpetsc1[i] == getpetsc[i],PETSC_COMM_SELF,PETSC_ERR_USER,"getpetsc1 %" PetscInt_FMT " != getpetsc %" PetscInt_FMT,getpetsc1[i],getpetsc[i]);
58   }
59 
60   PetscCall(AODestroy(&ao));
61 
62   /* test MemoryScalable ao: ispetsc = NULL */
63   /*-----------------------------------------------*/
64   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nTest AOCreateMemoryScalable with ispetsc=NULL:\n"));
65   PetscCall(AOCreateMemoryScalableIS(isapp,NULL,&ao));
66 
67   PetscCall(AOView(ao,PETSC_VIEWER_STDOUT_WORLD));
68 
69   PetscCall(AOPetscToApplication(ao,4,getapp2));
70   PetscCall(AOApplicationToPetsc(ao,3,getpetsc2));
71 
72   /* Check accuracy */;
73   for (i=0; i<4; i++) {
74     PetscCheck(getapp2[i] == getapp[i],PETSC_COMM_SELF,PETSC_ERR_USER,"getapp2 %" PetscInt_FMT " != getapp %" PetscInt_FMT,getapp2[i],getapp[i]);
75   }
76   for (i=0; i<3; i++) {
77     PetscCheck(getpetsc2[i] == getpetsc[i],PETSC_COMM_SELF,PETSC_ERR_USER,"getpetsc2 %" PetscInt_FMT " != getpetsc %" PetscInt_FMT,getpetsc2[i],getpetsc[i]);
78   }
79   PetscCall(AODestroy(&ao));
80 
81   /* test AOCreateMemoryScalable() ao: */
82   PetscCall(ISGetIndices(isapp,&app));
83   PetscCall(AOCreateMemoryScalable(PETSC_COMM_WORLD,n,app,NULL,&ao));
84   PetscCall(ISRestoreIndices(isapp,&app));
85 
86   PetscCall(AOPetscToApplication(ao,4,getapp4));
87   PetscCall(AOApplicationToPetsc(ao,3,getpetsc4));
88 
89   /* Check accuracy */;
90   for (i=0; i<4; i++) {
91     PetscCheck(getapp4[i] == getapp[i],PETSC_COMM_SELF,PETSC_ERR_USER,"getapp4 %" PetscInt_FMT " != getapp %" PetscInt_FMT,getapp4[i],getapp[i]);
92   }
93   for (i=0; i<3; i++) {
94     PetscCheck(getpetsc4[i] == getpetsc[i],PETSC_COMM_SELF,PETSC_ERR_USER,"getpetsc4 %" PetscInt_FMT " != getpetsc %" PetscInt_FMT,getpetsc4[i],getpetsc[i]);
95   }
96   PetscCall(AODestroy(&ao));
97 
98   /* test general API */
99   /*------------------*/
100   PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nTest general API: \n"));
101   PetscCall(AOCreate(PETSC_COMM_WORLD,&ao));
102   PetscCall(AOSetIS(ao,isapp,ispetsc));
103   PetscCall(AOSetType(ao,AOMEMORYSCALABLE));
104   PetscCall(AOSetFromOptions(ao));
105 
106   /* ispetsc and isapp are nolonger used. */
107   PetscCall(ISDestroy(&ispetsc));
108   PetscCall(ISDestroy(&isapp));
109 
110   PetscCall(AOPetscToApplication(ao,4,getapp3));
111   PetscCall(AOApplicationToPetsc(ao,3,getpetsc3));
112 
113   PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] 2,1,9,7 PetscToApplication %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT "\n",rank,getapp3[0],getapp3[1],getapp3[2],getapp3[3]));
114   PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] 0,3,4 ApplicationToPetsc %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT "\n",rank,getpetsc3[0],getpetsc3[1],getpetsc3[2]));
115   PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT));
116 
117   /* Check accuracy */;
118   for (i=0; i<4; i++) {
119     PetscCheck(getapp3[i] == getapp[i],PETSC_COMM_SELF,PETSC_ERR_USER,"getapp3 %" PetscInt_FMT " != getapp %" PetscInt_FMT,getapp3[i],getapp[i]);
120   }
121   for (i=0; i<3; i++) {
122     PetscCheck(getpetsc3[i] == getpetsc[i],PETSC_COMM_SELF,PETSC_ERR_USER,"getpetsc3 %" PetscInt_FMT " != getpetsc %" PetscInt_FMT,getpetsc3[i],getpetsc[i]);
123   }
124 
125   PetscCall(AODestroy(&ao));
126   PetscCall(PetscFinalize());
127   return 0;
128 }
129 
130 /*TEST
131 
132    test:
133 
134    test:
135       suffix: 2
136       nsize: 2
137 
138    test:
139       suffix: 3
140       nsize: 3
141 
142    test:
143       suffix: 4
144       nsize: 3
145       args: -ao_type basic
146       output_file: output/ex1_3.out
147 
148 TEST*/
149