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: /* Mixed mesh : quads and triangles  (4 first quads above divided into triangles*/
 52: /* Connectivity of a 2x5 rectangular mesh of quads : */
 53: const PetscInt sConnectivityMixedTQMesh[14][4] = {
 54:   {0,  4,  6,  -1},
 55:   {4,  14, 6,  -1},
 56:   {6,  14, 7,  -1},
 57:   {14, 15, 7,  -1},
 58:   {7,  15, 8,  -1},
 59:   {15, 16, 8,  -1},
 60:   {8,  16, 9,  -1},
 61:   {16, 17, 9,  -1},
 62:   {9,  17, 5,  2 },
 63:   {4,  1,  10, 14},
 64:   {14, 10, 11, 15},
 65:   {15, 11, 12, 16},
 66:   {16, 12, 13, 17},
 67:   {17, 13, 3,  5 }
 68: };

 70: /* Partitions for the rectangular mesh of quads and triangles: */
 71: const PetscInt sInitialPartitionMixedTQMesh[2][7] = {
 72:   {0, 1, 4, 5, 8, 10, 12},
 73:   {2, 3, 6, 7, 9, 11, 13}
 74: };

 76: const PetscInt sNLoclCellsMixedTQMesh = 7;
 77: const PetscInt sNGlobVertsMixedTQMesh = 18;

 79: /* Prisms mesh */
 80: PetscReal sCoordsPrismsMesh[125][3] = {
 81:   {2.24250931694056355e-01, 0.00000000000000000e+00, 0.00000000000000000e+00},
 82:   {2.20660660151932697e-01, 2.87419338850266937e-01, 0.00000000000000000e+00},
 83:   {0.00000000000000000e+00, 0.00000000000000000e+00, 2.70243537720639027e-01},
 84:   {2.32445727460992402e-01, 0.00000000000000000e+00, 2.60591845015572310e-01},
 85:   {2.41619971105419079e-01, 2.69894910706158231e-01, 2.42844781736072490e-01},
 86:   {0.00000000000000000e+00, 2.46523339883120779e-01, 2.69072907562752262e-01},
 87:   {0.00000000000000000e+00, 0.00000000000000000e+00, 0.00000000000000000e+00},
 88:   {1.00000000000000000e+00, 2.75433417601945563e-01, 0.00000000000000000e+00},
 89:   {1.00000000000000000e+00, 0.00000000000000000e+00, 2.33748605950385602e-01},
 90:   {7.32445727460992457e-01, 0.00000000000000000e+00, 2.42344379130445597e-01},
 91:   {1.00000000000000000e+00, 2.78258478013028610e-01, 2.57379172987105553e-01},
 92:   {1.00000000000000000e+00, 0.00000000000000000e+00, 0.00000000000000000e+00},
 93:   {7.49586880891153995e-01, 1.00000000000000000e+00, 0.00000000000000000e+00},
 94:   {1.00000000000000000e+00, 1.00000000000000000e+00, 2.51949651266657582e-01},
 95:   {7.41619971105419107e-01, 7.69894910706158120e-01, 2.33697838509081768e-01},
 96:   {1.00000000000000000e+00, 7.78258478013028610e-01, 2.66479695645241543e-01},
 97:   {7.55042653233710115e-01, 1.00000000000000000e+00, 2.58019637386860512e-01},
 98:   {1.00000000000000000e+00, 1.00000000000000000e+00, 0.00000000000000000e+00},
 99:   {0.00000000000000000e+00, 7.59235710423095789e-01, 0.00000000000000000e+00},
100:   {0.00000000000000000e+00, 1.00000000000000000e+00, 2.17232187874490473e-01},
101:   {0.00000000000000000e+00, 7.46523339883120807e-01, 2.42567232639677999e-01},
102:   {2.55042653233710115e-01, 1.00000000000000000e+00, 2.40660905690776916e-01},
103:   {0.00000000000000000e+00, 1.00000000000000000e+00, 0.00000000000000000e+00},
104:   {2.38934376044866809e-01, 0.00000000000000000e+00, 1.00000000000000000e+00},
105:   {2.18954188589218168e-01, 2.26916038449581692e-01, 1.00000000000000000e+00},
106:   {2.39787449636397643e-01, 0.00000000000000000e+00, 7.60591845015572310e-01},
107:   {2.40766735324061815e-01, 2.39643260505815608e-01, 7.42844781736072490e-01},
108:   {0.00000000000000000e+00, 2.57448248192627016e-01, 7.69072907562752262e-01},
109:   {0.00000000000000000e+00, 0.00000000000000000e+00, 1.00000000000000000e+00},
110:   {1.00000000000000000e+00, 2.38666970143638080e-01, 1.00000000000000000e+00},
111:   {7.39787449636397643e-01, 0.00000000000000000e+00, 7.42344379130445597e-01},
112:   {1.00000000000000000e+00, 2.59875254283874868e-01, 7.57379172987105553e-01},
113:   {1.00000000000000000e+00, 0.00000000000000000e+00, 1.00000000000000000e+00},
114:   {7.76318984007844159e-01, 1.00000000000000000e+00, 1.00000000000000000e+00},
115:   {7.40766735324061787e-01, 7.39643260505815636e-01, 7.33697838509081768e-01},
116:   {1.00000000000000000e+00, 7.59875254283874924e-01, 7.66479695645241543e-01},
117:   {7.68408704792055142e-01, 1.00000000000000000e+00, 7.58019637386860512e-01},
118:   {1.00000000000000000e+00, 1.00000000000000000e+00, 1.00000000000000000e+00},
119:   {0.00000000000000000e+00, 7.81085527042108207e-01, 1.00000000000000000e+00},
120:   {0.00000000000000000e+00, 7.57448248192627016e-01, 7.42567232639678054e-01},
121:   {2.68408704792055197e-01, 1.00000000000000000e+00, 7.40660905690776916e-01},
122:   {0.00000000000000000e+00, 1.00000000000000000e+00, 1.00000000000000000e+00},
123:   {7.24250931694056410e-01, 0.00000000000000000e+00, 0.00000000000000000e+00},
124:   {7.24250931694056410e-01, 2.75433417601945563e-01, 0.00000000000000000e+00},
125:   {4.44911591845989052e-01, 2.87419338850266937e-01, 0.00000000000000000e+00},
126:   {4.64891454921984804e-01, 0.00000000000000000e+00, 2.50940152310505593e-01},
127:   {4.74065698566411453e-01, 2.69894910706158231e-01, 2.33193089031005774e-01},
128:   {4.48501863388112709e-01, 0.00000000000000000e+00, 0.00000000000000000e+00},
129:   {7.20660660151932753e-01, 7.87419338850266937e-01, 0.00000000000000000e+00},
130:   {7.20660660151932753e-01, 5.62852756452212555e-01, 0.00000000000000000e+00},
131:   {2.20660660151932697e-01, 5.46655049273362614e-01, 0.00000000000000000e+00},
132:   {4.83239942210838158e-01, 5.39789821412316462e-01, 2.15446025751505982e-01},
133:   {7.41619971105419107e-01, 5.48153388719186951e-01, 2.48227882887665785e-01},
134:   {2.41619971105419079e-01, 5.16418250589278927e-01, 2.41674151578185781e-01},
135:   {4.41321320303865394e-01, 5.74838677700533873e-01, 0.00000000000000000e+00},
136:   {1.00000000000000000e+00, 7.75433417601945507e-01, 0.00000000000000000e+00},
137:   {1.00000000000000000e+00, 5.56516956026057219e-01, 2.81009740023825560e-01},
138:   {7.32445727460992457e-01, 2.78258478013028610e-01, 2.65974946167165549e-01},
139:   {1.00000000000000000e+00, 5.50866835203891125e-01, 0.00000000000000000e+00},
140:   {0.00000000000000000e+00, 2.59235710423095733e-01, 0.00000000000000000e+00},
141:   {0.00000000000000000e+00, 4.93046679766241558e-01, 2.67902277404865552e-01},
142:   {2.55042653233710115e-01, 7.46523339883120807e-01, 2.65995950455964469e-01},
143:   {0.00000000000000000e+00, 5.18471420846191466e-01, 0.00000000000000000e+00},
144:   {2.49586880891154023e-01, 1.00000000000000000e+00, 0.00000000000000000e+00},
145:   {2.49586880891154023e-01, 7.59235710423095789e-01, 0.00000000000000000e+00},
146:   {4.70247541043086748e-01, 7.87419338850266937e-01, 0.00000000000000000e+00},
147:   {5.10085306467420230e-01, 1.00000000000000000e+00, 2.64089623507063387e-01},
148:   {4.96662624339129222e-01, 7.69894910706158231e-01, 2.39767824629284698e-01},
149:   {4.99173761782308045e-01, 1.00000000000000000e+00, 0.00000000000000000e+00},
150:   {0.00000000000000000e+00, 0.00000000000000000e+00, 7.70243537720639027e-01},
151:   {2.40640523227928449e-01, 0.00000000000000000e+00, 5.21183690031144620e-01},
152:   {2.62579282058905461e-01, 2.52370482562049525e-01, 4.85689563472144981e-01},
153:   {0.00000000000000000e+00, 2.33810969343145825e-01, 5.38145815125504523e-01},
154:   {0.00000000000000000e+00, 0.00000000000000000e+00, 5.40487075441278053e-01},
155:   {1.00000000000000000e+00, 0.00000000000000000e+00, 7.33748605950385602e-01},
156:   {7.40640523227928504e-01, 0.00000000000000000e+00, 4.84688758260891195e-01},
157:   {1.00000000000000000e+00, 2.81083538424111656e-01, 5.14758345974211107e-01},
158:   {1.00000000000000000e+00, 0.00000000000000000e+00, 4.67497211900771203e-01},
159:   {7.38934376044866781e-01, 0.00000000000000000e+00, 1.00000000000000000e+00},
160:   {4.79574899272795285e-01, 0.00000000000000000e+00, 7.50940152310505593e-01},
161:   {4.77868752089733617e-01, 0.00000000000000000e+00, 1.00000000000000000e+00},
162:   {1.00000000000000000e+00, 1.00000000000000000e+00, 7.51949651266657582e-01},
163:   {7.62579282058905461e-01, 7.52370482562049525e-01, 4.67395677018163536e-01},
164:   {1.00000000000000000e+00, 7.81083538424111712e-01, 5.32959391290483087e-01},
165:   {7.60498425576266124e-01, 1.00000000000000000e+00, 5.16039274773721024e-01},
166:   {1.00000000000000000e+00, 1.00000000000000000e+00, 5.03899302533315163e-01},
167:   {7.18954188589218113e-01, 7.26916038449581636e-01, 1.00000000000000000e+00},
168:   {4.81533470648123629e-01, 4.79286521011631217e-01, 7.15446025751505954e-01},
169:   {4.57888564634085005e-01, 2.26916038449581692e-01, 1.00000000000000000e+00},
170:   {4.95273172597062383e-01, 7.26916038449581636e-01, 1.00000000000000000e+00},
171:   {4.37908377178436337e-01, 4.53832076899163384e-01, 1.00000000000000000e+00},
172:   {1.00000000000000000e+00, 7.38666970143638135e-01, 1.00000000000000000e+00},
173:   {1.00000000000000000e+00, 5.19750508567749736e-01, 7.81009740023825616e-01},
174:   {7.38934376044866781e-01, 2.38666970143638080e-01, 1.00000000000000000e+00},
175:   {7.18954188589218113e-01, 4.65583008593219771e-01, 1.00000000000000000e+00},
176:   {1.00000000000000000e+00, 4.77333940287276159e-01, 1.00000000000000000e+00},
177:   {0.00000000000000000e+00, 1.00000000000000000e+00, 7.17232187874490501e-01},
178:   {0.00000000000000000e+00, 7.33810969343145825e-01, 4.85134465279355998e-01},
179:   {2.60498425576266179e-01, 1.00000000000000000e+00, 4.81321811381553832e-01},
180:   {0.00000000000000000e+00, 1.00000000000000000e+00, 4.34464375748980947e-01},
181:   {0.00000000000000000e+00, 2.81085527042108152e-01, 1.00000000000000000e+00},
182:   {0.00000000000000000e+00, 5.14896496385254032e-01, 7.67902277404865607e-01},
183:   {2.76318984007844215e-01, 7.81085527042108207e-01, 1.00000000000000000e+00},
184:   {2.18954188589218168e-01, 5.08001565491689844e-01, 1.00000000000000000e+00},
185:   {0.00000000000000000e+00, 5.62171054084216304e-01, 1.00000000000000000e+00},
186:   {2.76318984007844215e-01, 1.00000000000000000e+00, 1.00000000000000000e+00},
187:   {5.36817409584110394e-01, 1.00000000000000000e+00, 7.64089623507063331e-01},
188:   {5.52637968015688430e-01, 1.00000000000000000e+00, 1.00000000000000000e+00},
189:   {5.03219805286833965e-01, 2.52370482562049525e-01, 4.66386178062011547e-01},
190:   {4.80554184960459430e-01, 2.39643260505815608e-01, 7.33193089031005774e-01},
191:   {4.81281046455856898e-01, 0.00000000000000000e+00, 5.01880304621011186e-01},
192:   {7.62579282058905461e-01, 5.33454020986161126e-01, 4.96455765775331570e-01},
193:   {2.62579282058905461e-01, 4.86181451905195350e-01, 4.83348303156371562e-01},
194:   {7.40766735324061787e-01, 4.99518514789690449e-01, 7.48227882887665841e-01},
195:   {2.40766735324061815e-01, 4.97091508698442541e-01, 7.41674151578185725e-01},
196:   {5.25158564117810922e-01, 5.04740965124099050e-01, 4.30892051503011964e-01},
197:   {7.40640523227928504e-01, 2.81083538424111656e-01, 5.31949892334331098e-01},
198:   {7.39787449636397643e-01, 2.59875254283874868e-01, 7.65974946167165549e-01},
199:   {1.00000000000000000e+00, 5.62167076848223313e-01, 5.62019480047651121e-01},
200:   {2.60498425576266179e-01, 7.33810969343145825e-01, 5.31991900911928939e-01},
201:   {2.68408704792055197e-01, 7.57448248192627016e-01, 7.65995950455964469e-01},
202:   {0.00000000000000000e+00, 4.67621938686291649e-01, 5.35804554809731104e-01},
203:   {5.23077707635171585e-01, 7.52370482562049525e-01, 4.79535649258569396e-01},
204:   {5.09175440116116929e-01, 7.39643260505815636e-01, 7.39767824629284698e-01},
205:   {5.20996851152532359e-01, 1.00000000000000000e+00, 5.28179247014126774e-01}
206: };

208: const PetscInt sConnectivityPrismsMesh[128][6] = {
209:   /* rank 0 */
210:   {11,  7,   42,  8,   10,  9  },
211:   {47,  42,  43,  45,  9,   57 },
212:   {8,   10,  9,   77,  76,  75 },
213:   {45,  9,   57,  110, 75,  116},
214:   {17,  48,  55,  13,  14,  15 },
215:   {58,  55,  49,  56,  15,  52 },
216:   {13,  14,  15,  85,  82,  83 },
217:   {56,  15,  52,  118, 83,  111},
218:   {6,   0,   1,   2,   3,   4  },
219:   {54,  1,   44,  51,  4,   46 },
220:   {2,   3,   4,   73,  70,  71 },
221:   {51,  4,   46,  115, 71,  108},
222:   {58,  49,  43,  56,  52,  57 },
223:   {47,  43,  44,  45,  57,  46 },
224:   {56,  52,  57,  118, 111, 116},
225:   {45,  57,  46,  110, 116, 108},
226:   {77,  76,  75,  74,  31,  30 },
227:   {110, 75,  116, 79,  30,  117},
228:   {74,  31,  30,  32,  29,  78 },
229:   {79,  30,  117, 80,  78,  93 },
230:   {85,  82,  83,  81,  34,  35 },
231:   {118, 83,  111, 92,  35,  113},
232:   {81,  34,  35,  37,  86,  91 },
233:   {92,  35,  113, 95,  91,  94 },
234:   {73,  70,  71,  69,  25,  26 },
235:   {115, 71,  108, 87,  26,  109},
236:   {69,  25,  26,  28,  23,  24 },
237:   {87,  26,  109, 90,  24,  88 },
238:   {118, 111, 116, 92,  113, 117},
239:   {110, 116, 108, 79,  117, 109},
240:   {92,  113, 117, 95,  94,  93 },
241:   {79,  117, 109, 80,  93,  88 },
242:   {22,  18,  63,  19,  20,  21 },
243:   {68,  63,  64,  66,  21,  61 },
244:   {19,  20,  21,  99,  97,  98 },
245:   {66,  21,  61,  124, 98,  119},
246:   {6,   1,   59,  2,   4,   5  },
247:   {62,  59,  50,  60,  5,   53 },
248:   {2,   4,   5,   73,  71,  72 },
249:   {60,  5,   53,  121, 72,  112},
250:   {17,  12,  48,  13,  16,  14 },
251:   {54,  48,  65,  51,  14,  67 },
252:   {13,  16,  14,  85,  84,  82 },
253:   {51,  14,  67,  115, 82,  122},
254:   {62,  50,  64,  60,  53,  61 },
255:   {68,  64,  65,  66,  61,  67 },
256:   {60,  53,  61,  121, 112, 119},
257:   {66,  61,  67,  124, 119, 122},
258:   {99,  97,  98,  96,  39,  40 },
259:   {124, 98,  119, 106, 40,  120},
260:   {96,  39,  40,  41,  38,  105},
261:   {106, 40,  120, 107, 105, 102},
262:   {73,  71,  72,  69,  26,  27 },
263:   {121, 72,  112, 101, 27,  114},
264:   {69,  26,  27,  28,  24,  100},
265:   {101, 27,  114, 104, 100, 103},
266:   {85,  84,  82,  81,  36,  34 },
267:   {115, 82,  122, 87,  34,  123},
268:   {81,  36,  34,  37,  33,  86 },
269:   {87,  34,  123, 90,  86,  89 },
270:   {121, 112, 119, 101, 114, 120},
271:   {124, 119, 122, 106, 120, 123},
272:   {101, 114, 120, 104, 103, 102},
273:   {106, 120, 123, 107, 102, 89 },
274:   /* rank 1 */
275:   {58,  43,  7,   56,  57,  10 },
276:   {7,   43,  42,  10,  57,  9  },
277:   {56,  57,  10,  118, 116, 76 },
278:   {10,  57,  9,   76,  116, 75 },
279:   {54,  49,  48,  51,  52,  14 },
280:   {48,  49,  55,  14,  52,  15 },
281:   {51,  52,  14,  115, 111, 82 },
282:   {14,  52,  15,  82,  111, 83 },
283:   {47,  44,  0,   45,  46,  3  },
284:   {0,   44,  1,   3,   46,  4  },
285:   {45,  46,  3,   110, 108, 70 },
286:   {3,   46,  4,   70,  108, 71 },
287:   {54,  44,  49,  51,  46,  52 },
288:   {49,  44,  43,  52,  46,  57 },
289:   {51,  46,  52,  115, 108, 111},
290:   {52,  46,  57,  111, 108, 116},
291:   {118, 116, 76,  92,  117, 31 },
292:   {76,  116, 75,  31,  117, 30 },
293:   {92,  117, 31,  95,  93,  29 },
294:   {31,  117, 30,  29,  93,  78 },
295:   {115, 111, 82,  87,  113, 34 },
296:   {82,  111, 83,  34,  113, 35 },
297:   {87,  113, 34,  90,  94,  86 },
298:   {34,  113, 35,  86,  94,  91 },
299:   {110, 108, 70,  79,  109, 25 },
300:   {70,  108, 71,  25,  109, 26 },
301:   {79,  109, 25,  80,  88,  23 },
302:   {25,  109, 26,  23,  88,  24 },
303:   {115, 108, 111, 87,  109, 113},
304:   {111, 108, 116, 113, 109, 117},
305:   {87,  109, 113, 90,  88,  94 },
306:   {113, 109, 117, 94,  88,  93 },
307:   {62,  64,  18,  60,  61,  20 },
308:   {18,  64,  63,  20,  61,  21 },
309:   {60,  61,  20,  121, 119, 97 },
310:   {20,  61,  21,  97,  119, 98 },
311:   {54,  50,  1,   51,  53,  4  },
312:   {1,   50,  59,  4,   53,  5  },
313:   {51,  53,  4,   115, 112, 71 },
314:   {4,   53,  5,   71,  112, 72 },
315:   {68,  65,  12,  66,  67,  16 },
316:   {12,  65,  48,  16,  67,  14 },
317:   {66,  67,  16,  124, 122, 84 },
318:   {16,  67,  14,  84,  122, 82 },
319:   {54,  65,  50,  51,  67,  53 },
320:   {50,  65,  64,  53,  67,  61 },
321:   {51,  67,  53,  115, 122, 112},
322:   {53,  67,  61,  112, 122, 119},
323:   {121, 119, 97,  101, 120, 39 },
324:   {97,  119, 98,  39,  120, 40 },
325:   {101, 120, 39,  104, 102, 38 },
326:   {39,  120, 40,  38,  102, 105},
327:   {115, 112, 71,  87,  114, 26 },
328:   {71,  112, 72,  26,  114, 27 },
329:   {87,  114, 26,  90,  103, 24 },
330:   {26,  114, 27,  24,  103, 100},
331:   {124, 122, 84,  106, 123, 36 },
332:   {84,  122, 82,  36,  123, 34 },
333:   {106, 123, 36,  107, 89,  33 },
334:   {36,  123, 34,  33,  89,  86 },
335:   {115, 122, 112, 87,  123, 114},
336:   {112, 122, 119, 114, 123, 120},
337:   {87,  123, 114, 90,  89,  103},
338:   {114, 123, 120, 103, 89,  102}
339: };

341: /* Partitions of prisms mesh : */
342: const PetscInt sInitialPartitionPrismsMesh[2][64] = {
343:   {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 },
344:   {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,
345:    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}
346: };

348: const PetscInt sNLoclCellsPrismsMesh = 64;
349: const PetscInt sNGlobVertsPrismsMesh = 125;

351: int main(int argc, char **argv)
352: {
353:   PetscInt         Nc = 0;
354:   const PetscInt  *InitPartForRank[2];
355:   DM               dm, idm, ddm;
356:   PetscSF          sfVert, sfMig, sfPart;
357:   PetscPartitioner part;
358:   PetscSection     s;
359:   PetscInt        *cells, c;
360:   PetscMPIInt      size, rank;
361:   PetscBool        box = PETSC_FALSE, field = PETSC_FALSE, quadsmesh = PETSC_FALSE, trisquadsmesh = PETSC_FALSE, prismsmesh = PETSC_FALSE;

363:   PetscFunctionBeginUser;
364:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
365:   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
366:   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
367:   PetscCheck(size == 2, PETSC_COMM_WORLD, PETSC_ERR_SUP, "This is a 2 processors example only");
368:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-field", &field, NULL));
369:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-box", &box, NULL));
370:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-quadsmesh", &quadsmesh, NULL));
371:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-trisquadsmesh", &trisquadsmesh, NULL));
372:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-prismsmesh", &prismsmesh, NULL));
373:   PetscCheck(1 == (box ? 1 : 0) + (quadsmesh ? 1 : 0) + (trisquadsmesh ? 1 : 0) + (prismsmesh ? 1 : 0), PETSC_COMM_WORLD, PETSC_ERR_SUP, "Specify one and only one of -box, -quadsmesh or -prismsmesh");

375:   PetscCall(DMPlexCreate(PETSC_COMM_WORLD, &dm));
376:   if (box) {
377:     PetscCall(DMSetType(dm, DMPLEX));
378:     PetscCall(DMSetFromOptions(dm));
379:   } else {
380:     if (quadsmesh) {
381:       Nc                       = sNLoclCells2x5Mesh; //Same on each rank for this example...
382:       PetscInt Nv              = sNGlobVerts2x5Mesh;
383:       InitPartForRank[0]       = &sInitialPartition2x5Mesh[0][0];
384:       InitPartForRank[1]       = &sInitialPartition2x5Mesh[1][0];
385:       const PetscInt(*Conn)[4] = sConnectivity2x5Mesh;

387:       const PetscInt Ncor = 4;
388:       const PetscInt dim  = 2;

390:       PetscCall(PetscMalloc1(Nc * Ncor, &cells));
391:       for (c = 0; c < Nc; ++c) {
392:         PetscInt cell = (InitPartForRank[rank])[c], cor;

394:         for (cor = 0; cor < Ncor; ++cor) cells[c * Ncor + cor] = Conn[cell][cor];
395:       }
396:       PetscCall(DMSetDimension(dm, dim));
397:       PetscCall(DMPlexBuildFromCellListParallel(dm, Nc, PETSC_DECIDE, Nv, Ncor, cells, &sfVert, NULL));
398:     } else if (trisquadsmesh) {
399:       Nc                       = sNLoclCellsMixedTQMesh; //Same on each rank for this example...
400:       PetscInt Nv              = sNGlobVertsMixedTQMesh;
401:       InitPartForRank[0]       = &sInitialPartitionMixedTQMesh[0][0];
402:       InitPartForRank[1]       = &sInitialPartitionMixedTQMesh[1][0];
403:       const PetscInt(*Conn)[4] = sConnectivityMixedTQMesh;

405:       const PetscInt NcorMax = 4;
406:       const PetscInt dim     = 2;

408:       /* Create a PetscSection and taking care to exclude nodes with "-1" into element connectivity: */
409:       PetscSection s;
410:       PetscInt     vStart = 0, vEnd = Nc;
411:       PetscCall(PetscSectionCreate(PETSC_COMM_WORLD, &s));
412:       PetscCall(PetscSectionSetNumFields(s, 1));
413:       PetscCall(PetscSectionSetFieldComponents(s, 0, 1));
414:       PetscCall(PetscSectionSetChart(s, vStart, vEnd));

416:       PetscCall(PetscMalloc1(Nc * NcorMax, &cells));
417:       PetscInt count = 0;
418:       for (c = 0; c < Nc; ++c) {
419:         PetscInt cell         = (InitPartForRank[rank])[c], cor;
420:         PetscInt nbElemVertex = ((-1 == Conn[cell][NcorMax - 1]) ? 3 : 4);
421:         for (cor = 0; cor < nbElemVertex; ++cor) {
422:           cells[count] = Conn[cell][cor];
423:           ++count;
424:         }
425:         PetscCall(PetscSectionSetDof(s, c, nbElemVertex));
426:         PetscCall(PetscSectionSetFieldDof(s, c, 0, nbElemVertex));
427:       }
428:       PetscCall(PetscSectionSetUp(s));
429:       PetscCall(DMSetDimension(dm, dim));
430:       PetscCall(DMPlexBuildFromCellSectionParallel(dm, Nc, PETSC_DECIDE, Nv, s, cells, &sfVert, NULL));
431:       PetscCall(PetscSectionDestroy(&s));
432:     } else if (prismsmesh) {
433:       Nc                       = sNLoclCellsPrismsMesh; //Same on each rank for this example...
434:       PetscInt Nv              = sNGlobVertsPrismsMesh;
435:       InitPartForRank[0]       = &sInitialPartitionPrismsMesh[0][0];
436:       InitPartForRank[1]       = &sInitialPartitionPrismsMesh[1][0];
437:       const PetscInt(*Conn)[6] = sConnectivityPrismsMesh;

439:       const PetscInt Ncor = 6;
440:       const PetscInt dim  = 3;

442:       PetscCall(PetscMalloc1(Nc * Ncor, &cells));
443:       for (c = 0; c < Nc; ++c) {
444:         PetscInt cell = (InitPartForRank[rank])[c], cor;

446:         for (cor = 0; cor < Ncor; ++cor) cells[c * Ncor + cor] = Conn[cell][cor];
447:       }
448:       PetscCall(DMSetDimension(dm, dim));
449:       PetscCall(DMPlexBuildFromCellListParallel(dm, Nc, PETSC_DECIDE, Nv, Ncor, cells, &sfVert, NULL));
450:     }
451:     PetscCall(PetscSFDestroy(&sfVert));
452:     PetscCall(PetscFree(cells));
453:     PetscCall(DMPlexInterpolate(dm, &idm));
454:     PetscCall(DMDestroy(&dm));
455:     dm = idm;
456:   }
457:   PetscCall(DMSetUseNatural(dm, PETSC_TRUE));
458:   PetscCall(DMViewFromOptions(dm, NULL, "-dm_view"));

460:   if (field) {
461:     const PetscInt Nf         = 1;
462:     const PetscInt numBC      = 0;
463:     const PetscInt numComp[1] = {1};
464:     PetscInt       numDof[4]  = {0, 0, 0, 0};
465:     PetscInt       dim;

467:     PetscCall(DMGetDimension(dm, &dim));
468:     numDof[dim] = 1;

470:     PetscCall(DMSetNumFields(dm, Nf));
471:     PetscCall(DMPlexCreateSection(dm, NULL, numComp, numDof, numBC, NULL, NULL, NULL, NULL, &s));
472:     PetscCall(DMSetLocalSection(dm, s));
473:     PetscCall(PetscSectionView(s, PETSC_VIEWER_STDOUT_WORLD));
474:     PetscCall(PetscSectionDestroy(&s));
475:   }

477:   PetscCall(DMPlexGetPartitioner(dm, &part));
478:   PetscCall(PetscPartitionerSetFromOptions(part));

480:   PetscCall(DMPlexDistribute(dm, 0, &sfMig, &ddm));
481:   PetscCall(PetscSFView(sfMig, PETSC_VIEWER_STDOUT_WORLD));
482:   PetscCall(PetscSFCreateInverseSF(sfMig, &sfPart));
483:   PetscCall(PetscObjectSetName((PetscObject)sfPart, "Inverse Migration SF"));
484:   PetscCall(PetscSFView(sfPart, PETSC_VIEWER_STDOUT_WORLD));

486:   Vec          lGlobalVec, lNatVec;
487:   PetscScalar *lNatVecArray;

489:   {
490:     PetscSection s;

492:     PetscCall(DMGetGlobalSection(dm, &s));
493:     PetscCall(PetscSectionView(s, PETSC_VIEWER_STDOUT_WORLD));
494:   }
495:   PetscCall(DMGetGlobalVector(dm, &lNatVec));
496:   PetscCall(PetscObjectSetName((PetscObject)lNatVec, "Natural Vector (initial partition)"));

498:   //Copying the initial partition into the "natural" vector:
499:   PetscCall(VecZeroEntries(lNatVec));
500:   PetscCall(VecGetArray(lNatVec, &lNatVecArray));
501:   for (c = 0; c < Nc; ++c) lNatVecArray[c] = (InitPartForRank[rank])[c];
502:   PetscCall(VecRestoreArray(lNatVec, &lNatVecArray));

504:   PetscCall(DMGetGlobalVector(ddm, &lGlobalVec));
505:   PetscCall(PetscObjectSetName((PetscObject)lGlobalVec, "Global Vector (reordered element numbers in the petsc distributed order)"));
506:   PetscCall(VecZeroEntries(lGlobalVec));

508:   // The call to DMPlexNaturalToGlobalBegin/End does not produce our expected result...
509:   // In lGlobalVec, we expect to have:
510:   /*
511:    * Process [0]
512:    * 2.
513:    * 4.
514:    * 8.
515:    * 3.
516:    * 9.
517:    * Process [1]
518:    * 1.
519:    * 5.
520:    * 7.
521:    * 0.
522:    * 6.
523:    *
524:    * but we obtained:
525:    *
526:    * Process [0]
527:    * 2.
528:    * 4.
529:    * 8.
530:    * 0.
531:    * 0.
532:    * Process [1]
533:    * 0.
534:    * 0.
535:    * 0.
536:    * 0.
537:    * 0.
538:    */

540:   {
541:     PetscSF nsf;

543:     PetscCall(DMPlexGetGlobalToNaturalSF(ddm, &nsf));
544:     PetscCall(PetscSFView(nsf, NULL));
545:   }
546:   PetscCall(DMPlexNaturalToGlobalBegin(ddm, lNatVec, lGlobalVec));
547:   PetscCall(DMPlexNaturalToGlobalEnd(ddm, lNatVec, lGlobalVec));

549:   PetscCall(VecView(lNatVec, PETSC_VIEWER_STDOUT_WORLD));
550:   PetscCall(VecView(lGlobalVec, PETSC_VIEWER_STDOUT_WORLD));

552:   PetscCall(DMRestoreGlobalVector(dm, &lNatVec));
553:   PetscCall(DMRestoreGlobalVector(ddm, &lGlobalVec));

555:   const PetscBool lUseCone    = PETSC_FALSE;
556:   const PetscBool lUseClosure = PETSC_TRUE;
557:   PetscCall(DMSetBasicAdjacency(ddm, lUseCone, lUseClosure));
558:   const PetscInt lNbCellsInOverlap = 1;
559:   PetscSF        lSFMigrationOvl;
560:   DM             ddm_with_overlap;

562:   PetscCall(DMPlexDistributeOverlap(ddm, lNbCellsInOverlap, &lSFMigrationOvl, &ddm_with_overlap));

564:   IS lISCellWithOvl = 0;
565:   /* This is the buggy call with prisms since commit 5ae96e2b862 */
566:   PetscCall(DMPlexCreateCellNumbering(ddm_with_overlap, PETSC_TRUE, &lISCellWithOvl));
567:   /* Here, we can see the elements in the overlap within the IS: they are the ones with negative indices */
568:   PetscCall(ISView(lISCellWithOvl, PETSC_VIEWER_STDOUT_WORLD));
569:   PetscCall(ISDestroy(&lISCellWithOvl));

571:   PetscCall(PetscSFDestroy(&lSFMigrationOvl));
572:   PetscCall(DMDestroy(&ddm_with_overlap));
573:   PetscCall(PetscSFDestroy(&sfMig));
574:   PetscCall(PetscSFDestroy(&sfPart));
575:   PetscCall(DMDestroy(&dm));
576:   PetscCall(DMDestroy(&ddm));
577:   PetscCall(PetscFinalize());
578:   return 0;
579: }

581: /*TEST

583:   testset:
584:     args: -field -petscpartitioner_type simple
585:     nsize: 2

587:     test:
588:       suffix: 0
589:       args: -quadsmesh
590:       output_file: output/ex47_0.out

592:     test:
593:       suffix: 1
594:       args: -box -dm_plex_simplex 0 -dm_plex_box_faces 2,5 -dm_distribute
595:       output_file: output/ex47_1.out

597:     test:
598:       suffix: 2
599:       args: -prismsmesh
600:       output_file: output/ex47_2.out

602:     test:
603:       suffix: 3
604:       args: -trisquadsmesh
605:       output_file: output/ex47_3.out

607: TEST*/