xref: /petsc/src/vec/is/is/tests/ex9.c (revision 609caa7c8c030312b00807b4f015fd827bb80932)
1 static char help[] = "Test ISLocalToGlobalMappingCreateSF(), PetscSFSetGraphLayout(), PetscSFGetGraphLayout().\n\n";
2 
3 #include <petscis.h>
4 #include <petscsf.h>
5 #include <petscviewer.h>
6 
main(int argc,char ** argv)7 int main(int argc, char **argv)
8 {
9   MPI_Comm               comm;
10   PetscViewer            viewer;
11   PetscViewerFormat      format;
12   PetscMPIInt            rank, size;
13   PetscInt               i, nLocal = 3, nGlobal;
14   PetscInt              *indices;
15   PetscBool              flg, auto_offset = PETSC_FALSE;
16   ISLocalToGlobalMapping l2g0, l2g1;
17 
18   PetscFunctionBeginUser;
19   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
20   comm = PETSC_COMM_WORLD;
21   PetscCallMPI(MPI_Comm_rank(comm, &rank));
22   PetscCallMPI(MPI_Comm_size(comm, &size));
23   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &nLocal, NULL));
24   PetscCall(PetscOptionsGetBool(NULL, NULL, "-auto_offset", &auto_offset, NULL));
25   PetscCall(PetscOptionsCreateViewer(comm, NULL, NULL, "-viewer", &viewer, &format, NULL));
26   PetscCall(PetscMalloc1(nLocal, &indices));
27   for (i = 0; i < nLocal; i++) indices[i] = i + rank;
28   nGlobal = size - 1 + nLocal;
29   if (viewer) {
30     PetscCall(PetscViewerPushFormat(viewer, format));
31     PetscCall(PetscViewerASCIIPrintf(viewer, "nGlobal: %" PetscInt_FMT "\n", nGlobal));
32   }
33 
34   /* Create a local-to-global mapping using ISLocalToGlobalMappingCreate() */
35   {
36     PetscCall(ISLocalToGlobalMappingCreate(comm, 1, nLocal, indices, PETSC_USE_POINTER, &l2g0));
37     PetscCall(ISLocalToGlobalMappingSetFromOptions(l2g0));
38     if (viewer) {
39       PetscCall(PetscObjectSetName((PetscObject)l2g0, "l2g0"));
40       PetscCall(ISLocalToGlobalMappingView(l2g0, viewer));
41     }
42   }
43 
44   /* Create the same local-to-global mapping using ISLocalToGlobalMappingCreateSF() */
45   {
46     PetscSF     sf;
47     PetscLayout rootLayout;
48 
49     PetscCall(PetscSFCreate(comm, &sf));
50     PetscCall(PetscLayoutCreateFromSizes(comm, PETSC_DECIDE, nGlobal, 1, &rootLayout));
51     PetscCall(PetscSFSetGraphLayout(sf, rootLayout, nLocal, NULL, PETSC_USE_POINTER, indices));
52     PetscCall(PetscSFSetFromOptions(sf));
53     PetscCall(ISLocalToGlobalMappingCreateSF(sf, auto_offset ? PETSC_DECIDE : rootLayout->rstart, &l2g1));
54     if (viewer) {
55       PetscCall(PetscObjectSetName((PetscObject)sf, "sf1"));
56       PetscCall(PetscObjectSetName((PetscObject)l2g1, "l2g1"));
57       PetscCall(PetscSFView(sf, viewer));
58       PetscCall(ISLocalToGlobalMappingView(l2g1, viewer));
59     }
60     /* Test PetscSFSetGraphLayout() / PetscSFGetGraphLayout() */
61     {
62       PetscLayout lt;
63       PetscInt   *ind;
64       PetscInt    nl;
65 
66       PetscCall(PetscSFGetGraphLayout(sf, &lt, &nl, NULL, &ind));
67       PetscCall(PetscLayoutCompare(lt, rootLayout, &flg));
68       PetscCheck(flg, comm, PETSC_ERR_PLIB, "PetscSFGetGraphLayout() gives different layout than the one passed to PetscSFSetGraphLayout()");
69       for (i = 0; i < nl; i++)
70         PetscCheck(ind[i] == indices[i], PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscSFSetGraphLayout() gives global_roots[%" PetscInt_FMT "] = %" PetscInt_FMT " != %" PetscInt_FMT " = global_roots[%" PetscInt_FMT "] passed to PetscSFSetGraphLayout()", i, ind[i], indices[i], i);
71       PetscCall(PetscLayoutDestroy(&lt));
72       PetscCall(PetscFree(ind));
73     }
74     PetscCall(PetscLayoutDestroy(&rootLayout));
75     PetscCall(PetscSFDestroy(&sf));
76   }
77 
78   /* Compare the two local-to-global mappings by comparing results of apply for the same input */
79   {
80     IS input, output0, output1;
81 
82     PetscCall(ISCreateStride(comm, nLocal, 0, 1, &input));
83     PetscCall(ISLocalToGlobalMappingApplyIS(l2g0, input, &output0));
84     PetscCall(ISLocalToGlobalMappingApplyIS(l2g1, input, &output1));
85     if (viewer) {
86       PetscCall(PetscObjectSetName((PetscObject)input, "input"));
87       PetscCall(PetscObjectSetName((PetscObject)output0, "output0"));
88       PetscCall(PetscObjectSetName((PetscObject)output1, "output1"));
89       PetscCall(ISView(input, viewer));
90       PetscCall(ISView(output0, viewer));
91       PetscCall(ISView(output1, viewer));
92     }
93     PetscCall(ISEqual(output0, output1, &flg));
94     PetscCheck(flg, comm, PETSC_ERR_PLIB, "output0 != output1");
95     PetscCall(ISDestroy(&input));
96     PetscCall(ISDestroy(&output0));
97     PetscCall(ISDestroy(&output1));
98   }
99 
100   if (viewer) {
101     PetscCall(PetscViewerPopFormat(viewer));
102     PetscCall(PetscViewerDestroy(&viewer));
103   }
104   PetscCall(ISLocalToGlobalMappingDestroy(&l2g0));
105   PetscCall(ISLocalToGlobalMappingDestroy(&l2g1));
106   PetscCall(PetscFree(indices));
107   PetscCall(PetscFinalize());
108   return 0;
109 }
110 
111 /*TEST
112 
113    test:
114       suffix: 1
115       nsize: {{1 2 3}separate output}
116       args: -auto_offset {{true false}} -viewer
117 
118    test:
119       suffix: 2
120       nsize: {{1 2 3}}
121       args: -n 33 -auto_offset {{true false}}
122       output_file: output/empty.out
123 
124 TEST*/
125