Actual source code: ex47.c
1: static char help[] = "The main goal of this code is to retrieve the original element numbers as found in the "
2: "initial partitions (sInitialPartition)... but after the call to DMPlexDistribute";
4: #include <petsc.h>
6: /* Coordinates of a 2x5 rectangular mesh of quads : */
7: PetscReal sCoords2x5Mesh[18][2] = {
8: {0.00000000000000000e+00, 0.00000000000000000e+00},
9: {2.00000000000000000e+00, 0.00000000000000000e+00},
10: {0.00000000000000000e+00, 1.00000000000000000e+00},
11: {2.00000000000000000e+00, 1.00000000000000000e+00},
12: {9.99999999997387978e-01, 0.00000000000000000e+00},
13: {9.99999999997387978e-01, 1.00000000000000000e+00},
14: {0.00000000000000000e+00, 2.00000000000000011e-01},
15: {0.00000000000000000e+00, 4.00000000000000022e-01},
16: {0.00000000000000000e+00, 5.99999999999999978e-01},
17: {0.00000000000000000e+00, 8.00000000000000044e-01},
18: {2.00000000000000000e+00, 2.00000000000000011e-01},
19: {2.00000000000000000e+00, 4.00000000000000022e-01},
20: {2.00000000000000000e+00, 5.99999999999999978e-01},
21: {2.00000000000000000e+00, 8.00000000000000044e-01},
22: {9.99999999997387756e-01, 2.00000000000000011e-01},
23: {9.99999999997387978e-01, 4.00000000000000022e-01},
24: {9.99999999997387978e-01, 6.00000000000000089e-01},
25: {9.99999999997388089e-01, 8.00000000000000044e-01}
26: };
28: /* Connectivity of a 2x5 rectangular mesh of quads : */
29: const PetscInt sConnectivity2x5Mesh[10][4] = {
30: {0, 4, 14, 6 },
31: {6, 14, 15, 7 },
32: {7, 15, 16, 8 },
33: {8, 16, 17, 9 },
34: {9, 17, 5, 2 },
35: {4, 1, 10, 14},
36: {14, 10, 11, 15},
37: {15, 11, 12, 16},
38: {16, 12, 13, 17},
39: {17, 13, 3, 5 }
40: };
42: /* Partitions of a 2x5 rectangular mesh of quads : */
43: const PetscInt sInitialPartition2x5Mesh[2][5] = {
44: {0, 2, 4, 6, 8},
45: {1, 3, 5, 7, 9}
46: };
48: const PetscInt sNLoclCells2x5Mesh = 5;
49: const PetscInt sNGlobVerts2x5Mesh = 18;
51: /* Prisms mesh */
52: PetscReal sCoordsPrismsMesh[125][3] = {
53: {2.24250931694056355e-01, 0.00000000000000000e+00, 0.00000000000000000e+00},
54: {2.20660660151932697e-01, 2.87419338850266937e-01, 0.00000000000000000e+00},
55: {0.00000000000000000e+00, 0.00000000000000000e+00, 2.70243537720639027e-01},
56: {2.32445727460992402e-01, 0.00000000000000000e+00, 2.60591845015572310e-01},
57: {2.41619971105419079e-01, 2.69894910706158231e-01, 2.42844781736072490e-01},
58: {0.00000000000000000e+00, 2.46523339883120779e-01, 2.69072907562752262e-01},
59: {0.00000000000000000e+00, 0.00000000000000000e+00, 0.00000000000000000e+00},
60: {1.00000000000000000e+00, 2.75433417601945563e-01, 0.00000000000000000e+00},
61: {1.00000000000000000e+00, 0.00000000000000000e+00, 2.33748605950385602e-01},
62: {7.32445727460992457e-01, 0.00000000000000000e+00, 2.42344379130445597e-01},
63: {1.00000000000000000e+00, 2.78258478013028610e-01, 2.57379172987105553e-01},
64: {1.00000000000000000e+00, 0.00000000000000000e+00, 0.00000000000000000e+00},
65: {7.49586880891153995e-01, 1.00000000000000000e+00, 0.00000000000000000e+00},
66: {1.00000000000000000e+00, 1.00000000000000000e+00, 2.51949651266657582e-01},
67: {7.41619971105419107e-01, 7.69894910706158120e-01, 2.33697838509081768e-01},
68: {1.00000000000000000e+00, 7.78258478013028610e-01, 2.66479695645241543e-01},
69: {7.55042653233710115e-01, 1.00000000000000000e+00, 2.58019637386860512e-01},
70: {1.00000000000000000e+00, 1.00000000000000000e+00, 0.00000000000000000e+00},
71: {0.00000000000000000e+00, 7.59235710423095789e-01, 0.00000000000000000e+00},
72: {0.00000000000000000e+00, 1.00000000000000000e+00, 2.17232187874490473e-01},
73: {0.00000000000000000e+00, 7.46523339883120807e-01, 2.42567232639677999e-01},
74: {2.55042653233710115e-01, 1.00000000000000000e+00, 2.40660905690776916e-01},
75: {0.00000000000000000e+00, 1.00000000000000000e+00, 0.00000000000000000e+00},
76: {2.38934376044866809e-01, 0.00000000000000000e+00, 1.00000000000000000e+00},
77: {2.18954188589218168e-01, 2.26916038449581692e-01, 1.00000000000000000e+00},
78: {2.39787449636397643e-01, 0.00000000000000000e+00, 7.60591845015572310e-01},
79: {2.40766735324061815e-01, 2.39643260505815608e-01, 7.42844781736072490e-01},
80: {0.00000000000000000e+00, 2.57448248192627016e-01, 7.69072907562752262e-01},
81: {0.00000000000000000e+00, 0.00000000000000000e+00, 1.00000000000000000e+00},
82: {1.00000000000000000e+00, 2.38666970143638080e-01, 1.00000000000000000e+00},
83: {7.39787449636397643e-01, 0.00000000000000000e+00, 7.42344379130445597e-01},
84: {1.00000000000000000e+00, 2.59875254283874868e-01, 7.57379172987105553e-01},
85: {1.00000000000000000e+00, 0.00000000000000000e+00, 1.00000000000000000e+00},
86: {7.76318984007844159e-01, 1.00000000000000000e+00, 1.00000000000000000e+00},
87: {7.40766735324061787e-01, 7.39643260505815636e-01, 7.33697838509081768e-01},
88: {1.00000000000000000e+00, 7.59875254283874924e-01, 7.66479695645241543e-01},
89: {7.68408704792055142e-01, 1.00000000000000000e+00, 7.58019637386860512e-01},
90: {1.00000000000000000e+00, 1.00000000000000000e+00, 1.00000000000000000e+00},
91: {0.00000000000000000e+00, 7.81085527042108207e-01, 1.00000000000000000e+00},
92: {0.00000000000000000e+00, 7.57448248192627016e-01, 7.42567232639678054e-01},
93: {2.68408704792055197e-01, 1.00000000000000000e+00, 7.40660905690776916e-01},
94: {0.00000000000000000e+00, 1.00000000000000000e+00, 1.00000000000000000e+00},
95: {7.24250931694056410e-01, 0.00000000000000000e+00, 0.00000000000000000e+00},
96: {7.24250931694056410e-01, 2.75433417601945563e-01, 0.00000000000000000e+00},
97: {4.44911591845989052e-01, 2.87419338850266937e-01, 0.00000000000000000e+00},
98: {4.64891454921984804e-01, 0.00000000000000000e+00, 2.50940152310505593e-01},
99: {4.74065698566411453e-01, 2.69894910706158231e-01, 2.33193089031005774e-01},
100: {4.48501863388112709e-01, 0.00000000000000000e+00, 0.00000000000000000e+00},
101: {7.20660660151932753e-01, 7.87419338850266937e-01, 0.00000000000000000e+00},
102: {7.20660660151932753e-01, 5.62852756452212555e-01, 0.00000000000000000e+00},
103: {2.20660660151932697e-01, 5.46655049273362614e-01, 0.00000000000000000e+00},
104: {4.83239942210838158e-01, 5.39789821412316462e-01, 2.15446025751505982e-01},
105: {7.41619971105419107e-01, 5.48153388719186951e-01, 2.48227882887665785e-01},
106: {2.41619971105419079e-01, 5.16418250589278927e-01, 2.41674151578185781e-01},
107: {4.41321320303865394e-01, 5.74838677700533873e-01, 0.00000000000000000e+00},
108: {1.00000000000000000e+00, 7.75433417601945507e-01, 0.00000000000000000e+00},
109: {1.00000000000000000e+00, 5.56516956026057219e-01, 2.81009740023825560e-01},
110: {7.32445727460992457e-01, 2.78258478013028610e-01, 2.65974946167165549e-01},
111: {1.00000000000000000e+00, 5.50866835203891125e-01, 0.00000000000000000e+00},
112: {0.00000000000000000e+00, 2.59235710423095733e-01, 0.00000000000000000e+00},
113: {0.00000000000000000e+00, 4.93046679766241558e-01, 2.67902277404865552e-01},
114: {2.55042653233710115e-01, 7.46523339883120807e-01, 2.65995950455964469e-01},
115: {0.00000000000000000e+00, 5.18471420846191466e-01, 0.00000000000000000e+00},
116: {2.49586880891154023e-01, 1.00000000000000000e+00, 0.00000000000000000e+00},
117: {2.49586880891154023e-01, 7.59235710423095789e-01, 0.00000000000000000e+00},
118: {4.70247541043086748e-01, 7.87419338850266937e-01, 0.00000000000000000e+00},
119: {5.10085306467420230e-01, 1.00000000000000000e+00, 2.64089623507063387e-01},
120: {4.96662624339129222e-01, 7.69894910706158231e-01, 2.39767824629284698e-01},
121: {4.99173761782308045e-01, 1.00000000000000000e+00, 0.00000000000000000e+00},
122: {0.00000000000000000e+00, 0.00000000000000000e+00, 7.70243537720639027e-01},
123: {2.40640523227928449e-01, 0.00000000000000000e+00, 5.21183690031144620e-01},
124: {2.62579282058905461e-01, 2.52370482562049525e-01, 4.85689563472144981e-01},
125: {0.00000000000000000e+00, 2.33810969343145825e-01, 5.38145815125504523e-01},
126: {0.00000000000000000e+00, 0.00000000000000000e+00, 5.40487075441278053e-01},
127: {1.00000000000000000e+00, 0.00000000000000000e+00, 7.33748605950385602e-01},
128: {7.40640523227928504e-01, 0.00000000000000000e+00, 4.84688758260891195e-01},
129: {1.00000000000000000e+00, 2.81083538424111656e-01, 5.14758345974211107e-01},
130: {1.00000000000000000e+00, 0.00000000000000000e+00, 4.67497211900771203e-01},
131: {7.38934376044866781e-01, 0.00000000000000000e+00, 1.00000000000000000e+00},
132: {4.79574899272795285e-01, 0.00000000000000000e+00, 7.50940152310505593e-01},
133: {4.77868752089733617e-01, 0.00000000000000000e+00, 1.00000000000000000e+00},
134: {1.00000000000000000e+00, 1.00000000000000000e+00, 7.51949651266657582e-01},
135: {7.62579282058905461e-01, 7.52370482562049525e-01, 4.67395677018163536e-01},
136: {1.00000000000000000e+00, 7.81083538424111712e-01, 5.32959391290483087e-01},
137: {7.60498425576266124e-01, 1.00000000000000000e+00, 5.16039274773721024e-01},
138: {1.00000000000000000e+00, 1.00000000000000000e+00, 5.03899302533315163e-01},
139: {7.18954188589218113e-01, 7.26916038449581636e-01, 1.00000000000000000e+00},
140: {4.81533470648123629e-01, 4.79286521011631217e-01, 7.15446025751505954e-01},
141: {4.57888564634085005e-01, 2.26916038449581692e-01, 1.00000000000000000e+00},
142: {4.95273172597062383e-01, 7.26916038449581636e-01, 1.00000000000000000e+00},
143: {4.37908377178436337e-01, 4.53832076899163384e-01, 1.00000000000000000e+00},
144: {1.00000000000000000e+00, 7.38666970143638135e-01, 1.00000000000000000e+00},
145: {1.00000000000000000e+00, 5.19750508567749736e-01, 7.81009740023825616e-01},
146: {7.38934376044866781e-01, 2.38666970143638080e-01, 1.00000000000000000e+00},
147: {7.18954188589218113e-01, 4.65583008593219771e-01, 1.00000000000000000e+00},
148: {1.00000000000000000e+00, 4.77333940287276159e-01, 1.00000000000000000e+00},
149: {0.00000000000000000e+00, 1.00000000000000000e+00, 7.17232187874490501e-01},
150: {0.00000000000000000e+00, 7.33810969343145825e-01, 4.85134465279355998e-01},
151: {2.60498425576266179e-01, 1.00000000000000000e+00, 4.81321811381553832e-01},
152: {0.00000000000000000e+00, 1.00000000000000000e+00, 4.34464375748980947e-01},
153: {0.00000000000000000e+00, 2.81085527042108152e-01, 1.00000000000000000e+00},
154: {0.00000000000000000e+00, 5.14896496385254032e-01, 7.67902277404865607e-01},
155: {2.76318984007844215e-01, 7.81085527042108207e-01, 1.00000000000000000e+00},
156: {2.18954188589218168e-01, 5.08001565491689844e-01, 1.00000000000000000e+00},
157: {0.00000000000000000e+00, 5.62171054084216304e-01, 1.00000000000000000e+00},
158: {2.76318984007844215e-01, 1.00000000000000000e+00, 1.00000000000000000e+00},
159: {5.36817409584110394e-01, 1.00000000000000000e+00, 7.64089623507063331e-01},
160: {5.52637968015688430e-01, 1.00000000000000000e+00, 1.00000000000000000e+00},
161: {5.03219805286833965e-01, 2.52370482562049525e-01, 4.66386178062011547e-01},
162: {4.80554184960459430e-01, 2.39643260505815608e-01, 7.33193089031005774e-01},
163: {4.81281046455856898e-01, 0.00000000000000000e+00, 5.01880304621011186e-01},
164: {7.62579282058905461e-01, 5.33454020986161126e-01, 4.96455765775331570e-01},
165: {2.62579282058905461e-01, 4.86181451905195350e-01, 4.83348303156371562e-01},
166: {7.40766735324061787e-01, 4.99518514789690449e-01, 7.48227882887665841e-01},
167: {2.40766735324061815e-01, 4.97091508698442541e-01, 7.41674151578185725e-01},
168: {5.25158564117810922e-01, 5.04740965124099050e-01, 4.30892051503011964e-01},
169: {7.40640523227928504e-01, 2.81083538424111656e-01, 5.31949892334331098e-01},
170: {7.39787449636397643e-01, 2.59875254283874868e-01, 7.65974946167165549e-01},
171: {1.00000000000000000e+00, 5.62167076848223313e-01, 5.62019480047651121e-01},
172: {2.60498425576266179e-01, 7.33810969343145825e-01, 5.31991900911928939e-01},
173: {2.68408704792055197e-01, 7.57448248192627016e-01, 7.65995950455964469e-01},
174: {0.00000000000000000e+00, 4.67621938686291649e-01, 5.35804554809731104e-01},
175: {5.23077707635171585e-01, 7.52370482562049525e-01, 4.79535649258569396e-01},
176: {5.09175440116116929e-01, 7.39643260505815636e-01, 7.39767824629284698e-01},
177: {5.20996851152532359e-01, 1.00000000000000000e+00, 5.28179247014126774e-01}
178: };
180: const PetscInt sConnectivityPrismsMesh[128][6] = {
181: /* rank 0 */
182: {11, 7, 42, 8, 10, 9 },
183: {47, 42, 43, 45, 9, 57 },
184: {8, 10, 9, 77, 76, 75 },
185: {45, 9, 57, 110, 75, 116},
186: {17, 48, 55, 13, 14, 15 },
187: {58, 55, 49, 56, 15, 52 },
188: {13, 14, 15, 85, 82, 83 },
189: {56, 15, 52, 118, 83, 111},
190: {6, 0, 1, 2, 3, 4 },
191: {54, 1, 44, 51, 4, 46 },
192: {2, 3, 4, 73, 70, 71 },
193: {51, 4, 46, 115, 71, 108},
194: {58, 49, 43, 56, 52, 57 },
195: {47, 43, 44, 45, 57, 46 },
196: {56, 52, 57, 118, 111, 116},
197: {45, 57, 46, 110, 116, 108},
198: {77, 76, 75, 74, 31, 30 },
199: {110, 75, 116, 79, 30, 117},
200: {74, 31, 30, 32, 29, 78 },
201: {79, 30, 117, 80, 78, 93 },
202: {85, 82, 83, 81, 34, 35 },
203: {118, 83, 111, 92, 35, 113},
204: {81, 34, 35, 37, 86, 91 },
205: {92, 35, 113, 95, 91, 94 },
206: {73, 70, 71, 69, 25, 26 },
207: {115, 71, 108, 87, 26, 109},
208: {69, 25, 26, 28, 23, 24 },
209: {87, 26, 109, 90, 24, 88 },
210: {118, 111, 116, 92, 113, 117},
211: {110, 116, 108, 79, 117, 109},
212: {92, 113, 117, 95, 94, 93 },
213: {79, 117, 109, 80, 93, 88 },
214: {22, 18, 63, 19, 20, 21 },
215: {68, 63, 64, 66, 21, 61 },
216: {19, 20, 21, 99, 97, 98 },
217: {66, 21, 61, 124, 98, 119},
218: {6, 1, 59, 2, 4, 5 },
219: {62, 59, 50, 60, 5, 53 },
220: {2, 4, 5, 73, 71, 72 },
221: {60, 5, 53, 121, 72, 112},
222: {17, 12, 48, 13, 16, 14 },
223: {54, 48, 65, 51, 14, 67 },
224: {13, 16, 14, 85, 84, 82 },
225: {51, 14, 67, 115, 82, 122},
226: {62, 50, 64, 60, 53, 61 },
227: {68, 64, 65, 66, 61, 67 },
228: {60, 53, 61, 121, 112, 119},
229: {66, 61, 67, 124, 119, 122},
230: {99, 97, 98, 96, 39, 40 },
231: {124, 98, 119, 106, 40, 120},
232: {96, 39, 40, 41, 38, 105},
233: {106, 40, 120, 107, 105, 102},
234: {73, 71, 72, 69, 26, 27 },
235: {121, 72, 112, 101, 27, 114},
236: {69, 26, 27, 28, 24, 100},
237: {101, 27, 114, 104, 100, 103},
238: {85, 84, 82, 81, 36, 34 },
239: {115, 82, 122, 87, 34, 123},
240: {81, 36, 34, 37, 33, 86 },
241: {87, 34, 123, 90, 86, 89 },
242: {121, 112, 119, 101, 114, 120},
243: {124, 119, 122, 106, 120, 123},
244: {101, 114, 120, 104, 103, 102},
245: {106, 120, 123, 107, 102, 89 },
246: /* rank 1 */
247: {58, 43, 7, 56, 57, 10 },
248: {7, 43, 42, 10, 57, 9 },
249: {56, 57, 10, 118, 116, 76 },
250: {10, 57, 9, 76, 116, 75 },
251: {54, 49, 48, 51, 52, 14 },
252: {48, 49, 55, 14, 52, 15 },
253: {51, 52, 14, 115, 111, 82 },
254: {14, 52, 15, 82, 111, 83 },
255: {47, 44, 0, 45, 46, 3 },
256: {0, 44, 1, 3, 46, 4 },
257: {45, 46, 3, 110, 108, 70 },
258: {3, 46, 4, 70, 108, 71 },
259: {54, 44, 49, 51, 46, 52 },
260: {49, 44, 43, 52, 46, 57 },
261: {51, 46, 52, 115, 108, 111},
262: {52, 46, 57, 111, 108, 116},
263: {118, 116, 76, 92, 117, 31 },
264: {76, 116, 75, 31, 117, 30 },
265: {92, 117, 31, 95, 93, 29 },
266: {31, 117, 30, 29, 93, 78 },
267: {115, 111, 82, 87, 113, 34 },
268: {82, 111, 83, 34, 113, 35 },
269: {87, 113, 34, 90, 94, 86 },
270: {34, 113, 35, 86, 94, 91 },
271: {110, 108, 70, 79, 109, 25 },
272: {70, 108, 71, 25, 109, 26 },
273: {79, 109, 25, 80, 88, 23 },
274: {25, 109, 26, 23, 88, 24 },
275: {115, 108, 111, 87, 109, 113},
276: {111, 108, 116, 113, 109, 117},
277: {87, 109, 113, 90, 88, 94 },
278: {113, 109, 117, 94, 88, 93 },
279: {62, 64, 18, 60, 61, 20 },
280: {18, 64, 63, 20, 61, 21 },
281: {60, 61, 20, 121, 119, 97 },
282: {20, 61, 21, 97, 119, 98 },
283: {54, 50, 1, 51, 53, 4 },
284: {1, 50, 59, 4, 53, 5 },
285: {51, 53, 4, 115, 112, 71 },
286: {4, 53, 5, 71, 112, 72 },
287: {68, 65, 12, 66, 67, 16 },
288: {12, 65, 48, 16, 67, 14 },
289: {66, 67, 16, 124, 122, 84 },
290: {16, 67, 14, 84, 122, 82 },
291: {54, 65, 50, 51, 67, 53 },
292: {50, 65, 64, 53, 67, 61 },
293: {51, 67, 53, 115, 122, 112},
294: {53, 67, 61, 112, 122, 119},
295: {121, 119, 97, 101, 120, 39 },
296: {97, 119, 98, 39, 120, 40 },
297: {101, 120, 39, 104, 102, 38 },
298: {39, 120, 40, 38, 102, 105},
299: {115, 112, 71, 87, 114, 26 },
300: {71, 112, 72, 26, 114, 27 },
301: {87, 114, 26, 90, 103, 24 },
302: {26, 114, 27, 24, 103, 100},
303: {124, 122, 84, 106, 123, 36 },
304: {84, 122, 82, 36, 123, 34 },
305: {106, 123, 36, 107, 89, 33 },
306: {36, 123, 34, 33, 89, 86 },
307: {115, 122, 112, 87, 123, 114},
308: {112, 122, 119, 114, 123, 120},
309: {87, 123, 114, 90, 89, 103},
310: {114, 123, 120, 103, 89, 102}
311: };
313: /* Partitions of prisms mesh : */
314: const PetscInt sInitialPartitionPrismsMesh[2][64] = {
315: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 },
316: {64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
317: 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127}
318: };
320: const PetscInt sNLoclCellsPrismsMesh = 64;
321: const PetscInt sNGlobVertsPrismsMesh = 125;
323: int main(int argc, char **argv)
324: {
325: PetscInt Nc = 0;
326: const PetscInt *InitPartForRank[2];
327: DM dm, idm, ddm;
328: PetscSF sfVert, sfMig, sfPart;
329: PetscPartitioner part;
330: PetscSection s;
331: PetscInt *cells, c;
332: PetscMPIInt size, rank;
333: PetscBool box = PETSC_FALSE, field = PETSC_FALSE, quadsmesh = PETSC_FALSE, prismsmesh = PETSC_FALSE;
335: PetscFunctionBeginUser;
336: PetscCall(PetscInitialize(&argc, &argv, NULL, help));
337: PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
338: PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
339: PetscCheck(size == 2, PETSC_COMM_WORLD, PETSC_ERR_SUP, "This is a 2 processors example only");
340: PetscCall(PetscOptionsGetBool(NULL, NULL, "-field", &field, NULL));
341: PetscCall(PetscOptionsGetBool(NULL, NULL, "-box", &box, NULL));
342: PetscCall(PetscOptionsGetBool(NULL, NULL, "-quadsmesh", &quadsmesh, NULL));
343: PetscCall(PetscOptionsGetBool(NULL, NULL, "-prismsmesh", &prismsmesh, NULL));
344: PetscCheck(1 == (box ? 1 : 0) + (quadsmesh ? 1 : 0) + (prismsmesh ? 1 : 0), PETSC_COMM_WORLD, PETSC_ERR_SUP, "Specify one and only one of -box, -quadsmesh or -prismsmesh");
346: PetscCall(DMPlexCreate(PETSC_COMM_WORLD, &dm));
347: if (box) {
348: PetscCall(DMSetType(dm, DMPLEX));
349: PetscCall(DMSetFromOptions(dm));
350: } else {
351: if (quadsmesh) {
352: Nc = sNLoclCells2x5Mesh; //Same on each rank for this example...
353: PetscInt Nv = sNGlobVerts2x5Mesh;
354: InitPartForRank[0] = &sInitialPartition2x5Mesh[0][0];
355: InitPartForRank[1] = &sInitialPartition2x5Mesh[1][0];
356: const PetscInt(*Conn)[4] = sConnectivity2x5Mesh;
358: const PetscInt Ncor = 4;
359: const PetscInt dim = 2;
361: PetscCall(PetscMalloc1(Nc * Ncor, &cells));
362: for (c = 0; c < Nc; ++c) {
363: PetscInt cell = (InitPartForRank[rank])[c], cor;
365: for (cor = 0; cor < Ncor; ++cor) cells[c * Ncor + cor] = Conn[cell][cor];
366: }
367: PetscCall(DMSetDimension(dm, dim));
368: PetscCall(DMPlexBuildFromCellListParallel(dm, Nc, PETSC_DECIDE, Nv, Ncor, cells, &sfVert, NULL));
369: } else if (prismsmesh) {
370: Nc = sNLoclCellsPrismsMesh; //Same on each rank for this example...
371: PetscInt Nv = sNGlobVertsPrismsMesh;
372: InitPartForRank[0] = &sInitialPartitionPrismsMesh[0][0];
373: InitPartForRank[1] = &sInitialPartitionPrismsMesh[1][0];
374: const PetscInt(*Conn)[6] = sConnectivityPrismsMesh;
376: const PetscInt Ncor = 6;
377: const PetscInt dim = 3;
379: PetscCall(PetscMalloc1(Nc * Ncor, &cells));
380: for (c = 0; c < Nc; ++c) {
381: PetscInt cell = (InitPartForRank[rank])[c], cor;
383: for (cor = 0; cor < Ncor; ++cor) cells[c * Ncor + cor] = Conn[cell][cor];
384: }
385: PetscCall(DMSetDimension(dm, dim));
386: PetscCall(DMPlexBuildFromCellListParallel(dm, Nc, PETSC_DECIDE, Nv, Ncor, cells, &sfVert, NULL));
387: }
388: PetscCall(PetscSFDestroy(&sfVert));
389: PetscCall(PetscFree(cells));
390: PetscCall(DMPlexInterpolate(dm, &idm));
391: PetscCall(DMDestroy(&dm));
392: dm = idm;
393: }
394: PetscCall(DMSetUseNatural(dm, PETSC_TRUE));
395: PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));
397: if (field) {
398: const PetscInt Nf = 1;
399: const PetscInt numBC = 0;
400: const PetscInt numComp[1] = {1};
401: PetscInt numDof[4] = {0, 0, 0, 0};
402: PetscInt dim;
404: PetscCall(DMGetDimension(dm, &dim));
405: numDof[dim] = 1;
407: PetscCall(DMSetNumFields(dm, Nf));
408: PetscCall(DMPlexCreateSection(dm, NULL, numComp, numDof, numBC, NULL, NULL, NULL, NULL, &s));
409: PetscCall(DMSetLocalSection(dm, s));
410: PetscCall(PetscSectionView(s, PETSC_VIEWER_STDOUT_WORLD));
411: PetscCall(PetscSectionDestroy(&s));
412: }
414: PetscCall(DMPlexGetPartitioner(dm, &part));
415: PetscCall(PetscPartitionerSetFromOptions(part));
417: PetscCall(DMPlexDistribute(dm, 0, &sfMig, &ddm));
418: PetscCall(PetscSFView(sfMig, PETSC_VIEWER_STDOUT_WORLD));
419: PetscCall(PetscSFCreateInverseSF(sfMig, &sfPart));
420: PetscCall(PetscObjectSetName((PetscObject)sfPart, "Inverse Migration SF"));
421: PetscCall(PetscSFView(sfPart, PETSC_VIEWER_STDOUT_WORLD));
423: Vec lGlobalVec, lNatVec;
424: PetscScalar *lNatVecArray;
426: {
427: PetscSection s;
429: PetscCall(DMGetGlobalSection(dm, &s));
430: PetscCall(PetscSectionView(s, PETSC_VIEWER_STDOUT_WORLD));
431: }
432: PetscCall(DMGetGlobalVector(dm, &lNatVec));
433: PetscCall(PetscObjectSetName((PetscObject)lNatVec, "Natural Vector (initial partition)"));
435: //Copying the initial partition into the "natural" vector:
436: PetscCall(VecZeroEntries(lNatVec));
437: PetscCall(VecGetArray(lNatVec, &lNatVecArray));
438: for (c = 0; c < Nc; ++c) lNatVecArray[c] = (InitPartForRank[rank])[c];
439: PetscCall(VecRestoreArray(lNatVec, &lNatVecArray));
441: PetscCall(DMGetGlobalVector(ddm, &lGlobalVec));
442: PetscCall(PetscObjectSetName((PetscObject)lGlobalVec, "Global Vector (reordered element numbers in the petsc distributed order)"));
443: PetscCall(VecZeroEntries(lGlobalVec));
445: // The call to DMPlexNaturalToGlobalBegin/End does not produce our expected result...
446: // In lGlobalVec, we expect to have:
447: /*
448: * Process [0]
449: * 2.
450: * 4.
451: * 8.
452: * 3.
453: * 9.
454: * Process [1]
455: * 1.
456: * 5.
457: * 7.
458: * 0.
459: * 6.
460: *
461: * but we obtained:
462: *
463: * Process [0]
464: * 2.
465: * 4.
466: * 8.
467: * 0.
468: * 0.
469: * Process [1]
470: * 0.
471: * 0.
472: * 0.
473: * 0.
474: * 0.
475: */
477: {
478: PetscSF nsf;
480: PetscCall(DMPlexGetGlobalToNaturalSF(ddm, &nsf));
481: PetscCall(PetscSFView(nsf, NULL));
482: }
483: PetscCall(DMPlexNaturalToGlobalBegin(ddm, lNatVec, lGlobalVec));
484: PetscCall(DMPlexNaturalToGlobalEnd(ddm, lNatVec, lGlobalVec));
486: PetscCall(VecView(lNatVec, PETSC_VIEWER_STDOUT_WORLD));
487: PetscCall(VecView(lGlobalVec, PETSC_VIEWER_STDOUT_WORLD));
489: PetscCall(DMRestoreGlobalVector(dm, &lNatVec));
490: PetscCall(DMRestoreGlobalVector(ddm, &lGlobalVec));
492: const PetscBool lUseCone = PETSC_FALSE;
493: const PetscBool lUseClosure = PETSC_TRUE;
494: PetscCall(DMSetBasicAdjacency(ddm, lUseCone, lUseClosure));
495: const PetscInt lNbCellsInOverlap = 1;
496: PetscSF lSFMigrationOvl;
497: DM ddm_with_overlap;
499: PetscCall(DMPlexDistributeOverlap(ddm, lNbCellsInOverlap, &lSFMigrationOvl, &ddm_with_overlap));
501: IS lISCellWithOvl = 0;
502: /* This is the buggy call with prisms since commit 5ae96e2b862 */
503: PetscCall(DMPlexCreateCellNumbering(ddm_with_overlap, PETSC_TRUE, &lISCellWithOvl));
504: /* Here, we can see the elements in the overlap within the IS: they are the ones with negative indices */
505: PetscCall(ISView(lISCellWithOvl, PETSC_VIEWER_STDOUT_WORLD));
506: PetscCall(ISDestroy(&lISCellWithOvl));
508: PetscCall(PetscSFDestroy(&lSFMigrationOvl));
509: PetscCall(DMDestroy(&ddm_with_overlap));
510: PetscCall(PetscSFDestroy(&sfMig));
511: PetscCall(PetscSFDestroy(&sfPart));
512: PetscCall(DMDestroy(&dm));
513: PetscCall(DMDestroy(&ddm));
514: PetscCall(PetscFinalize());
515: return 0;
516: }
518: /*TEST
520: testset:
521: args: -field -petscpartitioner_type simple
522: nsize: 2
524: test:
525: suffix: 0
526: args: -quadsmesh
527: output_file: output/ex47_0.out
529: test:
530: suffix: 1
531: args: -box -dm_plex_simplex 0 -dm_plex_box_faces 2,5 -dm_distribute
532: output_file: output/ex47_1.out
534: test:
535: suffix: 2
536: args: -prismsmesh
537: output_file: output/ex47_2.out
539: TEST*/