xref: /petsc/src/vec/is/ao/tests/ex1.c (revision 856bee69f0e0908e75ff837867b1777dfb1ced96)
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++) PetscCheck(getapp1[i] == getapp[i], PETSC_COMM_SELF, PETSC_ERR_USER, "getapp1 %" PetscInt_FMT " != getapp %" PetscInt_FMT, getapp1[i], getapp[i]);
54   for (i = 0; i < 3; i++) PetscCheck(getpetsc1[i] == getpetsc[i], PETSC_COMM_SELF, PETSC_ERR_USER, "getpetsc1 %" PetscInt_FMT " != getpetsc %" PetscInt_FMT, getpetsc1[i], getpetsc[i]);
55 
56   PetscCall(AODestroy(&ao));
57 
58   /* test MemoryScalable ao: ispetsc = NULL */
59   /*-----------------------------------------------*/
60   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\nTest AOCreateMemoryScalable with ispetsc=NULL:\n"));
61   PetscCall(AOCreateMemoryScalableIS(isapp, NULL, &ao));
62 
63   PetscCall(AOView(ao, PETSC_VIEWER_STDOUT_WORLD));
64 
65   PetscCall(AOPetscToApplication(ao, 4, getapp2));
66   PetscCall(AOApplicationToPetsc(ao, 3, getpetsc2));
67 
68   /* Check accuracy */;
69   for (i = 0; i < 4; i++) PetscCheck(getapp2[i] == getapp[i], PETSC_COMM_SELF, PETSC_ERR_USER, "getapp2 %" PetscInt_FMT " != getapp %" PetscInt_FMT, getapp2[i], getapp[i]);
70   for (i = 0; i < 3; i++) PetscCheck(getpetsc2[i] == getpetsc[i], PETSC_COMM_SELF, PETSC_ERR_USER, "getpetsc2 %" PetscInt_FMT " != getpetsc %" PetscInt_FMT, getpetsc2[i], getpetsc[i]);
71   PetscCall(AODestroy(&ao));
72 
73   /* test AOCreateMemoryScalable() ao: */
74   PetscCall(ISGetIndices(isapp, &app));
75   PetscCall(AOCreateMemoryScalable(PETSC_COMM_WORLD, n, app, NULL, &ao));
76   PetscCall(ISRestoreIndices(isapp, &app));
77 
78   PetscCall(AOPetscToApplication(ao, 4, getapp4));
79   PetscCall(AOApplicationToPetsc(ao, 3, getpetsc4));
80 
81   /* Check accuracy */;
82   for (i = 0; i < 4; i++) PetscCheck(getapp4[i] == getapp[i], PETSC_COMM_SELF, PETSC_ERR_USER, "getapp4 %" PetscInt_FMT " != getapp %" PetscInt_FMT, getapp4[i], getapp[i]);
83   for (i = 0; i < 3; i++) PetscCheck(getpetsc4[i] == getpetsc[i], PETSC_COMM_SELF, PETSC_ERR_USER, "getpetsc4 %" PetscInt_FMT " != getpetsc %" PetscInt_FMT, getpetsc4[i], getpetsc[i]);
84   PetscCall(AODestroy(&ao));
85 
86   /* test general API */
87   /*------------------*/
88   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\nTest general API: \n"));
89   PetscCall(AOCreate(PETSC_COMM_WORLD, &ao));
90   PetscCall(AOSetIS(ao, isapp, ispetsc));
91   PetscCall(AOSetType(ao, AOMEMORYSCALABLE));
92   PetscCall(AOSetFromOptions(ao));
93 
94   /* ispetsc and isapp are nolonger used. */
95   PetscCall(ISDestroy(&ispetsc));
96   PetscCall(ISDestroy(&isapp));
97 
98   PetscCall(AOPetscToApplication(ao, 4, getapp3));
99   PetscCall(AOApplicationToPetsc(ao, 3, getpetsc3));
100 
101   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]));
102   PetscCall(PetscSynchronizedPrintf(PETSC_COMM_WORLD, "[%d] 0,3,4 ApplicationToPetsc %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT "\n", rank, getpetsc3[0], getpetsc3[1], getpetsc3[2]));
103   PetscCall(PetscSynchronizedFlush(PETSC_COMM_WORLD, PETSC_STDOUT));
104 
105   /* Check accuracy */;
106   for (i = 0; i < 4; i++) PetscCheck(getapp3[i] == getapp[i], PETSC_COMM_SELF, PETSC_ERR_USER, "getapp3 %" PetscInt_FMT " != getapp %" PetscInt_FMT, getapp3[i], getapp[i]);
107   for (i = 0; i < 3; i++) PetscCheck(getpetsc3[i] == getpetsc[i], PETSC_COMM_SELF, PETSC_ERR_USER, "getpetsc3 %" PetscInt_FMT " != getpetsc %" PetscInt_FMT, getpetsc3[i], getpetsc[i]);
108 
109   PetscCall(AODestroy(&ao));
110   PetscCall(PetscFinalize());
111   return 0;
112 }
113 
114 /*TEST
115 
116    test:
117 
118    test:
119       suffix: 2
120       nsize: 2
121 
122    test:
123       suffix: 3
124       nsize: 3
125 
126    test:
127       suffix: 4
128       nsize: 3
129       args: -ao_type basic
130       output_file: output/ex1_3.out
131 
132 TEST*/
133