xref: /petsc/src/dm/impls/network/tests/ex1.c (revision 4e8208cbcbc709572b8abe32f33c78b69c819375)
1daad07d3SAidan Hamilton static char help[] = "Check if DMClone for DMNetwork Correctly Shallow Clones Topology Only \n\n";
2daad07d3SAidan Hamilton 
3daad07d3SAidan Hamilton #include <petscdmnetwork.h>
4daad07d3SAidan Hamilton 
5daad07d3SAidan Hamilton /*
6daad07d3SAidan Hamilton CreateStarGraphEdgeList - Create a k-Star Graph Edgelist on current processor
7daad07d3SAidan Hamilton   Not Collective
8daad07d3SAidan Hamilton 
9daad07d3SAidan Hamilton   Input Parameters:
10daad07d3SAidan Hamilton . k    - order of the star graph (number of edges)
11daad07d3SAidan Hamilton . directin - if true direction of edges is towards the center vertex, otherwise they are directed out of the center vertex.
12daad07d3SAidan Hamilton 
13daad07d3SAidan Hamilton   Output Parameters:
14daad07d3SAidan Hamilton .  ne - number of edges of this star graph
15daad07d3SAidan Hamilton .  edgelist - list of edges for this star graph, this is a one dimensional array with pairs of entries being the two vertices (in global numbering of the vertices) of each edge,
16daad07d3SAidan Hamilton               [first vertex of first edge, second vertex of first edge, first vertex of second edge, second vertex of second edge, etc].
17daad07d3SAidan Hamilton 
18daad07d3SAidan Hamilton               User is responsible for deallocating this memory.
19daad07d3SAidan Hamilton */
CreateStarGraphEdgeList(PetscInt k,PetscBool directin,PetscInt * ne,PetscInt * edgelist[])20d71ae5a4SJacob Faibussowitsch PetscErrorCode CreateStarGraphEdgeList(PetscInt k, PetscBool directin, PetscInt *ne, PetscInt *edgelist[])
21d71ae5a4SJacob Faibussowitsch {
22daad07d3SAidan Hamilton   PetscInt i;
23daad07d3SAidan Hamilton 
24daad07d3SAidan Hamilton   PetscFunctionBegin;
25daad07d3SAidan Hamilton   *ne = k;
26daad07d3SAidan Hamilton   PetscCall(PetscCalloc1(2 * k, edgelist));
27daad07d3SAidan Hamilton 
28daad07d3SAidan Hamilton   if (directin) {
29daad07d3SAidan Hamilton     for (i = 0; i < k; i++) {
30daad07d3SAidan Hamilton       (*edgelist)[2 * i]     = i + 1;
31daad07d3SAidan Hamilton       (*edgelist)[2 * i + 1] = 0;
32daad07d3SAidan Hamilton     }
33daad07d3SAidan Hamilton   } else {
34daad07d3SAidan Hamilton     for (i = 0; i < k; i++) {
35daad07d3SAidan Hamilton       (*edgelist)[2 * i]     = 0;
36daad07d3SAidan Hamilton       (*edgelist)[2 * i + 1] = i + 1;
37daad07d3SAidan Hamilton     }
38daad07d3SAidan Hamilton   }
393ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
40daad07d3SAidan Hamilton }
41daad07d3SAidan Hamilton 
42daad07d3SAidan Hamilton /*
43daad07d3SAidan Hamilton CreateSimpleStarGraph - Create a Distributed k-Star Graph DMNetwork with a single PetscInt component on
44daad07d3SAidan Hamilton all edges and vertices, aselectable number of dofs on vertices and edges. Intended mostly to be used for testing purposes.
45daad07d3SAidan Hamilton 
46daad07d3SAidan Hamilton   Input Parameters:
47daad07d3SAidan Hamilton . comm       - the communicator of the dm
48daad07d3SAidan Hamilton . numdofvert - number of degrees of freedom (dofs) on vertices
49daad07d3SAidan Hamilton . numdofedge - number of degrees of freedom (dofs) on edges
50daad07d3SAidan Hamilton . k          - order of the star graph (number of edges)
51daad07d3SAidan Hamilton . directin   - if true direction of edges is towards the center vertex, otherwise they are directed out of the center vertex
52daad07d3SAidan Hamilton 
532fe279fdSBarry Smith   Output Parameter:
54daad07d3SAidan Hamilton . newdm       - The created and distributed simple Star Graph
55daad07d3SAidan Hamilton */
CreateSimpleStarGraph(MPI_Comm comm,PetscInt numdofvert,PetscInt numdofedge,PetscInt k,PetscBool directin,DM * newdm)56d71ae5a4SJacob Faibussowitsch PetscErrorCode CreateSimpleStarGraph(MPI_Comm comm, PetscInt numdofvert, PetscInt numdofedge, PetscInt k, PetscBool directin, DM *newdm)
57d71ae5a4SJacob Faibussowitsch {
58daad07d3SAidan Hamilton   DM          dm;
59daad07d3SAidan Hamilton   PetscMPIInt rank;
60daad07d3SAidan Hamilton   PetscInt    ne       = 0, compkey, eStart, eEnd, vStart, vEnd, e, v;
61daad07d3SAidan Hamilton   PetscInt   *edgelist = NULL, *compedge, *compvert;
62daad07d3SAidan Hamilton 
63daad07d3SAidan Hamilton   PetscFunctionBegin;
64daad07d3SAidan Hamilton   PetscCall(DMNetworkCreate(comm, &dm));
65daad07d3SAidan Hamilton   PetscCall(DMNetworkSetNumSubNetworks(dm, PETSC_DECIDE, 1));
66daad07d3SAidan Hamilton   PetscCallMPI(MPI_Comm_rank(comm, &rank));
6748a46eb9SPierre Jolivet   if (rank == 0) PetscCall(CreateStarGraphEdgeList(k, directin, &ne, &edgelist));
68daad07d3SAidan Hamilton   PetscCall(DMNetworkAddSubnetwork(dm, "Main", ne, edgelist, NULL));
69*2a8381b2SBarry Smith   PetscCall(DMNetworkRegisterComponent(dm, "unused", sizeof(PetscInt), &compkey));
70daad07d3SAidan Hamilton   PetscCall(DMNetworkLayoutSetUp(dm));
71daad07d3SAidan Hamilton   PetscCall(PetscFree(edgelist));
72daad07d3SAidan Hamilton   PetscCall(DMNetworkGetEdgeRange(dm, &eStart, &eEnd));
73daad07d3SAidan Hamilton   PetscCall(DMNetworkGetVertexRange(dm, &vStart, &vEnd));
74daad07d3SAidan Hamilton   PetscCall(PetscMalloc2(eEnd - eStart, &compedge, vEnd - vStart, &compvert));
75daad07d3SAidan Hamilton   for (e = eStart; e < eEnd; e++) {
76daad07d3SAidan Hamilton     compedge[e - eStart] = e;
77daad07d3SAidan Hamilton     PetscCall(DMNetworkAddComponent(dm, e, compkey, &compedge[e - eStart], numdofedge));
78daad07d3SAidan Hamilton   }
79daad07d3SAidan Hamilton   for (v = vStart; v < vEnd; v++) {
80daad07d3SAidan Hamilton     compvert[v - vStart] = v;
81daad07d3SAidan Hamilton     PetscCall(DMNetworkAddComponent(dm, v, compkey, &compvert[v - vStart], numdofvert));
82daad07d3SAidan Hamilton   }
83daad07d3SAidan Hamilton   PetscCall(DMSetFromOptions(dm));
84daad07d3SAidan Hamilton   PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
85daad07d3SAidan Hamilton   PetscCall(DMSetUp(dm));
86daad07d3SAidan Hamilton   PetscCall(PetscFree2(compedge, compvert));
87daad07d3SAidan Hamilton   PetscCall(DMNetworkDistribute(&dm, 0));
88daad07d3SAidan Hamilton   *newdm = dm;
893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
90daad07d3SAidan Hamilton }
91daad07d3SAidan Hamilton 
main(int argc,char ** argv)92d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
93d71ae5a4SJacob Faibussowitsch {
94daad07d3SAidan Hamilton   DM           dm, dmclone, plex;
95daad07d3SAidan Hamilton   PetscInt     e, eStart, eEnd, ndofs, ndofsprev;
96daad07d3SAidan Hamilton   PetscInt    *compprev, *comp, compkey;
97daad07d3SAidan Hamilton   PetscInt     dofv = 1, dofe = 1, ne = 1;
98daad07d3SAidan Hamilton   PetscSection sec;
99daad07d3SAidan Hamilton   Vec          vec;
100daad07d3SAidan Hamilton 
101327415f7SBarry Smith   PetscFunctionBeginUser;
102daad07d3SAidan Hamilton   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
103daad07d3SAidan Hamilton   /* create a distributed k-Star graph DMNetwork */
104daad07d3SAidan Hamilton   PetscCall(PetscOptionsGetInt(NULL, NULL, "-dofv", &dofv, NULL));
105daad07d3SAidan Hamilton   PetscCall(PetscOptionsGetInt(NULL, NULL, "-dofe", &dofe, NULL));
106daad07d3SAidan Hamilton   PetscCall(PetscOptionsGetInt(NULL, NULL, "-ne", &ne, NULL));
107daad07d3SAidan Hamilton   PetscCall(CreateSimpleStarGraph(PETSC_COMM_WORLD, dofv, dofe, ne, PETSC_TRUE, &dm));
108daad07d3SAidan Hamilton   PetscCall(DMNetworkGetEdgeRange(dm, &eStart, &eEnd));
109daad07d3SAidan Hamilton 
110da81f932SPierre Jolivet   /* check if cloning changed any component */
11148a46eb9SPierre Jolivet   if (eStart < eEnd) PetscCall(DMNetworkGetComponent(dm, eStart, 0, NULL, (void **)&compprev, &ndofsprev));
112daad07d3SAidan Hamilton   PetscCall(DMClone(dm, &dmclone));
113daad07d3SAidan Hamilton   if (eStart < eEnd) {
114daad07d3SAidan Hamilton     PetscCall(DMNetworkGetComponent(dm, eStart, 0, NULL, (void **)&comp, &ndofs));
115daad07d3SAidan Hamilton     PetscCheck(*comp == *compprev, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Cloning changed the Original, comp (previous) : %" PetscInt_FMT " comp (now) : %" PetscInt_FMT, *compprev, *comp);
116daad07d3SAidan Hamilton     PetscCheck(ndofsprev == ndofs, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Cloning changed the Original, ndofs (previous) : %" PetscInt_FMT " ndofs (now) : %" PetscInt_FMT, ndofsprev, ndofs);
117daad07d3SAidan Hamilton   }
118daad07d3SAidan Hamilton 
119*2a8381b2SBarry Smith   /* register new components to the clone and add a unused component to every point */
120*2a8381b2SBarry Smith   PetscCall(DMNetworkRegisterComponent(dmclone, "unusedclone", sizeof(PetscInt), &compkey));
121daad07d3SAidan Hamilton   PetscCall(DMNetworkGetEdgeRange(dmclone, &eStart, &eEnd));
122daad07d3SAidan Hamilton   PetscCall(PetscMalloc1(eEnd - eStart, &comp));
123daad07d3SAidan Hamilton   for (e = eStart; e < eEnd; e++) {
124daad07d3SAidan Hamilton     comp[e - eStart] = e;
125daad07d3SAidan Hamilton     PetscCall(DMNetworkAddComponent(dmclone, e, compkey, &comp[e - eStart], 2));
126daad07d3SAidan Hamilton   }
127daad07d3SAidan Hamilton   PetscCall(DMNetworkFinalizeComponents(dmclone));
128daad07d3SAidan Hamilton   PetscCall(PetscFree(comp));
129daad07d3SAidan Hamilton 
130daad07d3SAidan Hamilton   PetscCall(PetscPrintf(PETSC_COMM_WORLD, " dm: \n"));
131daad07d3SAidan Hamilton   PetscCall(DMView(dm, PETSC_VIEWER_STDOUT_WORLD));
132daad07d3SAidan Hamilton   PetscCall(DMNetworkGetPlex(dm, &plex));
133daad07d3SAidan Hamilton   PetscCall(DMGetLocalSection(plex, &sec));
134daad07d3SAidan Hamilton   PetscCall(PetscSectionView(sec, PETSC_VIEWER_STDOUT_WORLD));
135daad07d3SAidan Hamilton 
136daad07d3SAidan Hamilton   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n dmclone: \n"));
137daad07d3SAidan Hamilton   PetscCall(DMView(dmclone, PETSC_VIEWER_STDOUT_WORLD));
138daad07d3SAidan Hamilton   PetscCall(DMNetworkGetPlex(dmclone, &plex));
139daad07d3SAidan Hamilton   PetscCall(DMGetLocalSection(plex, &sec));
140daad07d3SAidan Hamilton   PetscCall(PetscSectionView(sec, PETSC_VIEWER_STDOUT_WORLD));
141daad07d3SAidan Hamilton 
142daad07d3SAidan Hamilton   /* create Vectors */
143daad07d3SAidan Hamilton   PetscCall(DMCreateGlobalVector(dm, &vec));
144daad07d3SAidan Hamilton   PetscCall(VecSet(vec, 1.0));
145daad07d3SAidan Hamilton   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n dm vec:\n"));
146daad07d3SAidan Hamilton   PetscCall(VecView(vec, PETSC_VIEWER_STDOUT_WORLD));
147daad07d3SAidan Hamilton   PetscCall(VecDestroy(&vec));
148daad07d3SAidan Hamilton 
149daad07d3SAidan Hamilton   PetscCall(DMCreateGlobalVector(dmclone, &vec));
150daad07d3SAidan Hamilton   PetscCall(VecSet(vec, 2.0));
151daad07d3SAidan Hamilton   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "\n dmclone vec:\n"));
152daad07d3SAidan Hamilton   PetscCall(VecView(vec, PETSC_VIEWER_STDOUT_WORLD));
153daad07d3SAidan Hamilton   PetscCall(VecDestroy(&vec));
154daad07d3SAidan Hamilton 
155daad07d3SAidan Hamilton   PetscCall(DMDestroy(&dm));
156daad07d3SAidan Hamilton   PetscCall(DMDestroy(&dmclone));
157daad07d3SAidan Hamilton   PetscCall(PetscFinalize());
158daad07d3SAidan Hamilton }
159daad07d3SAidan Hamilton 
160daad07d3SAidan Hamilton /*TEST
161daad07d3SAidan Hamilton 
162daad07d3SAidan Hamilton   test:
163daad07d3SAidan Hamilton     suffix: 0
164daad07d3SAidan Hamilton     args:
165daad07d3SAidan Hamilton 
166daad07d3SAidan Hamilton   test:
167daad07d3SAidan Hamilton     suffix: 1
168daad07d3SAidan Hamilton     nsize: 2
169daad07d3SAidan Hamilton     args: -dofv 2 -dofe 2 -ne 2
170daad07d3SAidan Hamilton 
171daad07d3SAidan Hamilton  TEST*/
172