xref: /petsc/src/vec/is/ao/tests/ex1.c (revision 030f984af8d8bb4c203755d35bded3c05b3d83ce)
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   PetscErrorCode ierr;
11   PetscInt       i,n = 5;
12   PetscInt       getpetsc[]  = {0,3,4},getapp[]  = {2,1,9,7};
13   PetscInt       getpetsc1[] = {0,3,4},getapp1[] = {2,1,9,7};
14   PetscInt       getpetsc2[] = {0,3,4},getapp2[] = {2,1,9,7};
15   PetscInt       getpetsc3[] = {0,3,4},getapp3[] = {2,1,9,7};
16   PetscInt       getpetsc4[] = {0,3,4},getapp4[] = {2,1,9,7};
17   PetscMPIInt    rank,size;
18   IS             ispetsc,isapp;
19   AO             ao;
20   const PetscInt *app;
21 
22   ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr;
23   ierr = PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL);CHKERRQ(ierr);
24   ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
25   ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRMPI(ierr);
26 
27   /* create the index sets */
28   ierr = ISCreateStride(PETSC_COMM_WORLD,n,rank,size,&isapp);CHKERRQ(ierr);
29   ierr = ISCreateStride(PETSC_COMM_WORLD,n,n*rank,1,&ispetsc);CHKERRQ(ierr); /* natural numbering */
30 
31   /* create the application ordering */
32   ierr = AOCreateBasicIS(isapp,ispetsc,&ao);CHKERRQ(ierr);
33   ierr = AOView(ao,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
34 
35   ierr = AOPetscToApplication(ao,4,getapp);CHKERRQ(ierr);
36   ierr = AOApplicationToPetsc(ao,3,getpetsc);CHKERRQ(ierr);
37 
38   ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] 2,1,9,7 PetscToApplication %D %D %D %D\n",rank,getapp[0],getapp[1],getapp[2],getapp[3]);CHKERRQ(ierr);
39   ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] 0,3,4 ApplicationToPetsc %D %D %D\n",rank,getpetsc[0],getpetsc[1],getpetsc[2]);CHKERRQ(ierr);
40   ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT);CHKERRQ(ierr);
41   ierr = AODestroy(&ao);CHKERRQ(ierr);
42 
43   /* test MemoryScalable ao */
44   /*-------------------------*/
45   ierr = PetscPrintf(PETSC_COMM_WORLD,"\nTest AOCreateMemoryScalable: \n");CHKERRQ(ierr);
46   ierr = AOCreateMemoryScalableIS(isapp,ispetsc,&ao);CHKERRQ(ierr);
47   ierr = AOView(ao,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
48 
49   ierr = AOPetscToApplication(ao,4,getapp1);CHKERRQ(ierr);
50   ierr = AOApplicationToPetsc(ao,3,getpetsc1);CHKERRQ(ierr);
51 
52   /* Check accuracy */;
53   for (i=0; i<4; i++) {
54     if (getapp1[i] != getapp[i]) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"getapp1 %d != getapp %d",getapp1[i],getapp[i]);
55   }
56   for (i=0; i<3; i++) {
57     if (getpetsc1[i] != getpetsc[i]) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"getpetsc1 %d != getpetsc %d",getpetsc1[i],getpetsc[i]);
58   }
59 
60   ierr = AODestroy(&ao);CHKERRQ(ierr);
61 
62   /* test MemoryScalable ao: ispetsc = NULL */
63   /*-----------------------------------------------*/
64   ierr = PetscPrintf(PETSC_COMM_WORLD,"\nTest AOCreateMemoryScalable with ispetsc=NULL:\n");CHKERRQ(ierr);
65   ierr = AOCreateMemoryScalableIS(isapp,NULL,&ao);CHKERRQ(ierr);
66 
67   ierr = AOView(ao,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
68 
69   ierr = AOPetscToApplication(ao,4,getapp2);CHKERRQ(ierr);
70   ierr = AOApplicationToPetsc(ao,3,getpetsc2);CHKERRQ(ierr);
71 
72   /* Check accuracy */;
73   for (i=0; i<4; i++) {
74     if (getapp2[i] != getapp[i]) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"getapp2 %d != getapp %d",getapp2[i],getapp[i]);
75   }
76   for (i=0; i<3; i++) {
77     if (getpetsc2[i] != getpetsc[i]) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"getpetsc2 %d != getpetsc %d",getpetsc2[i],getpetsc[i]);
78   }
79   ierr = AODestroy(&ao);CHKERRQ(ierr);
80 
81   /* test AOCreateMemoryScalable() ao: */
82   ierr = ISGetIndices(isapp,&app);CHKERRQ(ierr);
83   ierr = AOCreateMemoryScalable(PETSC_COMM_WORLD,n,app,NULL,&ao);CHKERRQ(ierr);
84   ierr = ISRestoreIndices(isapp,&app);CHKERRQ(ierr);
85 
86   ierr = AOPetscToApplication(ao,4,getapp4);CHKERRQ(ierr);
87   ierr = AOApplicationToPetsc(ao,3,getpetsc4);CHKERRQ(ierr);
88 
89   /* Check accuracy */;
90   for (i=0; i<4; i++) {
91     if (getapp4[i] != getapp[i]) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"getapp4 %d != getapp %d",getapp4[i],getapp[i]);
92   }
93   for (i=0; i<3; i++) {
94     if (getpetsc4[i] != getpetsc[i]) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"getpetsc4 %d != getpetsc %d",getpetsc4[i],getpetsc[i]);
95   }
96   ierr = AODestroy(&ao);CHKERRQ(ierr);
97 
98   /* test general API */
99   /*------------------*/
100   ierr = PetscPrintf(PETSC_COMM_WORLD,"\nTest general API: \n");CHKERRQ(ierr);
101   ierr = AOCreate(PETSC_COMM_WORLD,&ao);CHKERRQ(ierr);
102   ierr = AOSetIS(ao,isapp,ispetsc);CHKERRQ(ierr);
103   ierr = AOSetType(ao,AOMEMORYSCALABLE);CHKERRQ(ierr);
104   ierr = AOSetFromOptions(ao);CHKERRQ(ierr);
105 
106   /* ispetsc and isapp are nolonger used. */
107   ierr = ISDestroy(&ispetsc);CHKERRQ(ierr);
108   ierr = ISDestroy(&isapp);CHKERRQ(ierr);
109 
110   ierr = AOPetscToApplication(ao,4,getapp3);CHKERRQ(ierr);
111   ierr = AOApplicationToPetsc(ao,3,getpetsc3);CHKERRQ(ierr);
112 
113   ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] 2,1,9,7 PetscToApplication %D %D %D %D\n",rank,getapp3[0],getapp3[1],getapp3[2],getapp3[3]);CHKERRQ(ierr);
114   ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,"[%d] 0,3,4 ApplicationToPetsc %D %D %D\n",rank,getpetsc3[0],getpetsc3[1],getpetsc3[2]);CHKERRQ(ierr);
115   ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT);CHKERRQ(ierr);
116 
117   /* Check accuracy */;
118   for (i=0; i<4; i++) {
119     if (getapp3[i] != getapp[i]) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"getapp3 %d != getapp %d",getapp3[i],getapp[i]);
120   }
121   for (i=0; i<3; i++) {
122     if (getpetsc3[i] != getpetsc[i]) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"getpetsc3 %d != getpetsc %d",getpetsc3[i],getpetsc[i]);
123   }
124 
125   ierr = AODestroy(&ao);CHKERRQ(ierr);
126   ierr = PetscFinalize();
127   return ierr;
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