1 #include <petscao.h>
2 #include <petsc/private/dmlabelimpl.h>
3 #include <petsc/private/dmfieldimpl.h>
4 #include <petsc/private/dmpleximpl.h>
5 #include <petsc/private/dmplextransformimpl.h>
6 #include <petsc/private/petscdsimpl.h>
7 #include <petsc/private/petscfeimpl.h>
8 #include <petsc/private/petscfvimpl.h>
9 #include <petsc/private/dmswarmimpl.h>
10 #include <petsc/private/dmnetworkimpl.h>
11
12 static PetscBool DMPackageInitialized = PETSC_FALSE;
13 /*@C
14 DMFinalizePackage - This function finalizes everything in the `DM` package. It is called
15 from `PetscFinalize()`.
16
17 Level: developer
18
19 .seealso: `PetscInitialize()`
20 @*/
DMFinalizePackage(void)21 PetscErrorCode DMFinalizePackage(void)
22 {
23 PetscFunctionBegin;
24 PetscCall(PetscFunctionListDestroy(&DMList));
25 DMPackageInitialized = PETSC_FALSE;
26 DMRegisterAllCalled = PETSC_FALSE;
27 PetscFunctionReturn(PETSC_SUCCESS);
28 }
29
30 #if defined(PETSC_HAVE_HYPRE)
31 PETSC_EXTERN PetscErrorCode MatCreate_HYPREStruct(Mat);
32 PETSC_EXTERN PetscErrorCode MatCreate_HYPRESStruct(Mat);
33 #endif
34
35 /*@C
36 DMInitializePackage - This function initializes everything in the `DM` package. It is called
37 from `PetscDLLibraryRegister_petscdm()` when using dynamic libraries, and on the first call to `DMCreate()`
38 or similar routines when using shared or static libraries.
39
40 Level: developer
41
42 Note:
43 This function never needs to be called by PETSc users.
44
45 .seealso: `PetscInitialize()`
46 @*/
DMInitializePackage(void)47 PetscErrorCode DMInitializePackage(void)
48 {
49 char logList[256];
50 PetscBool opt, pkg;
51
52 PetscFunctionBegin;
53 if (DMPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
54 DMPackageInitialized = PETSC_TRUE;
55
56 /* Register Classes */
57 PetscCall(PetscClassIdRegister("Distributed Mesh", &DM_CLASSID));
58 PetscCall(PetscClassIdRegister("DM Label", &DMLABEL_CLASSID));
59 PetscCall(PetscClassIdRegister("Quadrature", &PETSCQUADRATURE_CLASSID));
60 PetscCall(PetscClassIdRegister("Mesh Transform", &DMPLEXTRANSFORM_CLASSID));
61 PetscCall(PetscClassIdRegister("Swarm Cell DM", &DMSWARMCELLDM_CLASSID));
62
63 #if defined(PETSC_HAVE_HYPRE)
64 PetscCall(MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct));
65 PetscCall(MatRegister(MATHYPRESSTRUCT, MatCreate_HYPRESStruct));
66 #endif
67 PetscCall(PetscSectionSymRegister(PETSCSECTIONSYMLABEL, PetscSectionSymCreate_Label));
68
69 /* Register Constructors */
70 PetscCall(DMRegisterAll());
71 /* Register Events */
72 PetscCall(PetscLogEventRegister("DMConvert", DM_CLASSID, &DM_Convert));
73 PetscCall(PetscLogEventRegister("DMGlobalToLocal", DM_CLASSID, &DM_GlobalToLocal));
74 PetscCall(PetscLogEventRegister("DMLocalToGlobal", DM_CLASSID, &DM_LocalToGlobal));
75 PetscCall(PetscLogEventRegister("DMLocatePoints", DM_CLASSID, &DM_LocatePoints));
76 PetscCall(PetscLogEventRegister("DMCoarsen", DM_CLASSID, &DM_Coarsen));
77 PetscCall(PetscLogEventRegister("DMRefine", DM_CLASSID, &DM_Refine));
78 PetscCall(PetscLogEventRegister("DMCreateInterp", DM_CLASSID, &DM_CreateInterpolation));
79 PetscCall(PetscLogEventRegister("DMCreateRestrict", DM_CLASSID, &DM_CreateRestriction));
80 PetscCall(PetscLogEventRegister("DMCreateInject", DM_CLASSID, &DM_CreateInjection));
81 PetscCall(PetscLogEventRegister("DMCreateMat", DM_CLASSID, &DM_CreateMatrix));
82 PetscCall(PetscLogEventRegister("DMCreateMassMat", DM_CLASSID, &DM_CreateMassMatrix));
83 PetscCall(PetscLogEventRegister("DMLoad", DM_CLASSID, &DM_Load));
84 PetscCall(PetscLogEventRegister("DMView", DM_CLASSID, &DM_View));
85 PetscCall(PetscLogEventRegister("DMAdaptInterp", DM_CLASSID, &DM_AdaptInterpolator));
86 PetscCall(PetscLogEventRegister("DMProjectFunc", DM_CLASSID, &DM_ProjectFunction));
87
88 PetscCall(PetscLogEventRegister("DMPlexBuFrCeLi", DM_CLASSID, &DMPLEX_BuildFromCellList));
89 PetscCall(PetscLogEventRegister("DMPlexBuCoFrCeLi", DM_CLASSID, &DMPLEX_BuildCoordinatesFromCellList));
90 PetscCall(PetscLogEventRegister("DMPlexCreateGmsh", DM_CLASSID, &DMPLEX_CreateGmsh));
91 PetscCall(PetscLogEventRegister("DMPlexCrBoxSFC", DM_CLASSID, &DMPLEX_CreateBoxSFC));
92 PetscCall(PetscLogEventRegister("DMPlexCrFromFile", DM_CLASSID, &DMPLEX_CreateFromFile));
93 PetscCall(PetscLogEventRegister("DMPlexCrFromOpts", DM_CLASSID, &DMPLEX_CreateFromOptions));
94 PetscCall(PetscLogEventRegister("Mesh Partition", DM_CLASSID, &DMPLEX_Partition));
95 PetscCall(PetscLogEventRegister("Mesh Migration", DM_CLASSID, &DMPLEX_Migrate));
96 PetscCall(PetscLogEventRegister("DMPlexPartSelf", DM_CLASSID, &DMPLEX_PartSelf));
97 PetscCall(PetscLogEventRegister("DMPlexPartLblInv", DM_CLASSID, &DMPLEX_PartLabelInvert));
98 PetscCall(PetscLogEventRegister("DMPlexPartLblSF", DM_CLASSID, &DMPLEX_PartLabelCreateSF));
99 PetscCall(PetscLogEventRegister("DMPlexPartStrtSF", DM_CLASSID, &DMPLEX_PartStratSF));
100 PetscCall(PetscLogEventRegister("DMPlexPointSF", DM_CLASSID, &DMPLEX_CreatePointSF));
101 PetscCall(PetscLogEventRegister("DMPlexInterp", DM_CLASSID, &DMPLEX_Interpolate));
102 PetscCall(PetscLogEventRegister("DMPlexDistribute", DM_CLASSID, &DMPLEX_Distribute));
103 PetscCall(PetscLogEventRegister("DMPlexDistMS", DM_CLASSID, &DMPLEX_DistributeMultistage));
104 PetscCall(PetscLogEventRegister("DMPlexDistCones", DM_CLASSID, &DMPLEX_DistributeCones));
105 PetscCall(PetscLogEventRegister("DMPlexDistLabels", DM_CLASSID, &DMPLEX_DistributeLabels));
106 PetscCall(PetscLogEventRegister("DMPlexDistSF", DM_CLASSID, &DMPLEX_DistributeSF));
107 PetscCall(PetscLogEventRegister("DMPlexDistOvrlp", DM_CLASSID, &DMPLEX_DistributeOverlap));
108 PetscCall(PetscLogEventRegister("DMPlexDistField", DM_CLASSID, &DMPLEX_DistributeField));
109 PetscCall(PetscLogEventRegister("DMPlexDistData", DM_CLASSID, &DMPLEX_DistributeData));
110 PetscCall(PetscLogEventRegister("DMPlexInterpSF", DM_CLASSID, &DMPLEX_InterpolateSF));
111 PetscCall(PetscLogEventRegister("DMPlexGToNBegin", DM_CLASSID, &DMPLEX_GlobalToNaturalBegin));
112 PetscCall(PetscLogEventRegister("DMPlexGToNEnd", DM_CLASSID, &DMPLEX_GlobalToNaturalEnd));
113 PetscCall(PetscLogEventRegister("DMPlexNToGBegin", DM_CLASSID, &DMPLEX_NaturalToGlobalBegin));
114 PetscCall(PetscLogEventRegister("DMPlexNToGEnd", DM_CLASSID, &DMPLEX_NaturalToGlobalEnd));
115 PetscCall(PetscLogEventRegister("DMPlexStratify", DM_CLASSID, &DMPLEX_Stratify));
116 PetscCall(PetscLogEventRegister("DMPlexSymmetrize", DM_CLASSID, &DMPLEX_Symmetrize));
117 PetscCall(PetscLogEventRegister("DMPlexPrealloc", DM_CLASSID, &DMPLEX_Preallocate));
118 PetscCall(PetscLogEventRegister("DMPlexResidualFE", DM_CLASSID, &DMPLEX_ResidualFEM));
119 PetscCall(PetscLogEventRegister("DMPlexJacobianFE", DM_CLASSID, &DMPLEX_JacobianFEM));
120 PetscCall(PetscLogEventRegister("DMPlexInterpFE", DM_CLASSID, &DMPLEX_InterpolatorFEM));
121 PetscCall(PetscLogEventRegister("DMPlexInjectorFE", DM_CLASSID, &DMPLEX_InjectorFEM));
122 PetscCall(PetscLogEventRegister("DMPlexIntegralFE", DM_CLASSID, &DMPLEX_IntegralFEM));
123 PetscCall(PetscLogEventRegister("DMPlexRebalance", DM_CLASSID, &DMPLEX_RebalanceSharedPoints));
124 PetscCall(PetscLogEventRegister("DMPlexLocatePoints", DM_CLASSID, &DMPLEX_LocatePoints));
125 PetscCall(PetscLogEventRegister("DMPlexTopologyView", DM_CLASSID, &DMPLEX_TopologyView));
126 PetscCall(PetscLogEventRegister("DMPlexLabelsView", DM_CLASSID, &DMPLEX_LabelsView));
127 PetscCall(PetscLogEventRegister("DMPlexCoordinatesView", DM_CLASSID, &DMPLEX_CoordinatesView));
128 PetscCall(PetscLogEventRegister("DMPlexSectionView", DM_CLASSID, &DMPLEX_SectionView));
129 PetscCall(PetscLogEventRegister("DMPlexGlobalVectorView", DM_CLASSID, &DMPLEX_GlobalVectorView));
130 PetscCall(PetscLogEventRegister("DMPlexLocalVectorView", DM_CLASSID, &DMPLEX_LocalVectorView));
131 PetscCall(PetscLogEventRegister("DMPlexTopologyLoad", DM_CLASSID, &DMPLEX_TopologyLoad));
132 #if defined(PETSC_HAVE_HDF5)
133 PetscCall(PetscLogEventRegister("DMPlexDistributionView", DM_CLASSID, &DMPLEX_DistributionView));
134 PetscCall(PetscLogEventRegister("DMPlexDistributionLoad", DM_CLASSID, &DMPLEX_DistributionLoad));
135 #endif
136 PetscCall(PetscLogEventRegister("DMPlexLabelsLoad", DM_CLASSID, &DMPLEX_LabelsLoad));
137 PetscCall(PetscLogEventRegister("DMPlexCoordinatesLoad", DM_CLASSID, &DMPLEX_CoordinatesLoad));
138 PetscCall(PetscLogEventRegister("DMPlexSectionLoad", DM_CLASSID, &DMPLEX_SectionLoad));
139 PetscCall(PetscLogEventRegister("DMPlexGlobalVectorLoad", DM_CLASSID, &DMPLEX_GlobalVectorLoad));
140 PetscCall(PetscLogEventRegister("DMPlexLocalVectorLoad", DM_CLASSID, &DMPLEX_LocalVectorLoad));
141 PetscCall(PetscLogEventRegister("DMPlexMetricEnforceSPD", DM_CLASSID, &DMPLEX_MetricEnforceSPD));
142 PetscCall(PetscLogEventRegister("DMPlexMetricNormalize", DM_CLASSID, &DMPLEX_MetricNormalize));
143 PetscCall(PetscLogEventRegister("DMPlexMetricAverage", DM_CLASSID, &DMPLEX_MetricAverage));
144 PetscCall(PetscLogEventRegister("DMPlexMetricIntersect", DM_CLASSID, &DMPLEX_MetricIntersection));
145 PetscCall(PetscLogEventRegister("DMPlexGenerate", DM_CLASSID, &DMPLEX_Generate));
146 PetscCall(PetscLogEventRegister("DMPlexGetLocOff", DM_CLASSID, &DMPLEX_GetLocalOffsets));
147
148 PetscCall(PetscLogEventRegister("RebalBuildGraph", DM_CLASSID, &DMPLEX_RebalBuildGraph));
149 PetscCall(PetscLogEventRegister("RebalGatherGraph", DM_CLASSID, &DMPLEX_RebalGatherGraph));
150 PetscCall(PetscLogEventRegister("RebalPartition", DM_CLASSID, &DMPLEX_RebalPartition));
151 PetscCall(PetscLogEventRegister("RebalScatterPart", DM_CLASSID, &DMPLEX_RebalScatterPart));
152 PetscCall(PetscLogEventRegister("RebalRewriteSF", DM_CLASSID, &DMPLEX_RebalRewriteSF));
153 PetscCall(PetscLogEventRegister("DMPlexUninterp", DM_CLASSID, &DMPLEX_Uninterpolate));
154
155 PetscCall(PetscLogEventRegister("DMPlexTrSetUp", DM_CLASSID, &DMPLEXTRANSFORM_SetUp));
156 PetscCall(PetscLogEventRegister("DMPlexTrApply", DM_CLASSID, &DMPLEXTRANSFORM_Apply));
157 PetscCall(PetscLogEventRegister("DMPlexTrSizes", DM_CLASSID, &DMPLEXTRANSFORM_SetConeSizes));
158 PetscCall(PetscLogEventRegister("DMPlexTrCones", DM_CLASSID, &DMPLEXTRANSFORM_SetCones));
159 PetscCall(PetscLogEventRegister("DMPlexTrSF", DM_CLASSID, &DMPLEXTRANSFORM_CreateSF));
160 PetscCall(PetscLogEventRegister("DMPlexTrLabels", DM_CLASSID, &DMPLEXTRANSFORM_CreateLabels));
161 PetscCall(PetscLogEventRegister("DMPlexTrCoords", DM_CLASSID, &DMPLEXTRANSFORM_SetCoordinates));
162
163 PetscCall(PetscLogEventRegister("DMSwarmMigrate", DM_CLASSID, &DMSWARM_Migrate));
164 PetscCall(PetscLogEventRegister("DMSwarmDETSetup", DM_CLASSID, &DMSWARM_DataExchangerTopologySetup));
165 PetscCall(PetscLogEventRegister("DMSwarmDExBegin", DM_CLASSID, &DMSWARM_DataExchangerBegin));
166 PetscCall(PetscLogEventRegister("DMSwarmDExEnd", DM_CLASSID, &DMSWARM_DataExchangerEnd));
167 PetscCall(PetscLogEventRegister("DMSwarmDESendCnt", DM_CLASSID, &DMSWARM_DataExchangerSendCount));
168 PetscCall(PetscLogEventRegister("DMSwarmDEPack", DM_CLASSID, &DMSWARM_DataExchangerPack));
169 PetscCall(PetscLogEventRegister("DMSwarmAddPnts", DM_CLASSID, &DMSWARM_AddPoints));
170 PetscCall(PetscLogEventRegister("DMSwarmRmvPnts", DM_CLASSID, &DMSWARM_RemovePoints));
171 PetscCall(PetscLogEventRegister("DMSwarmSort", DM_CLASSID, &DMSWARM_Sort));
172 PetscCall(PetscLogEventRegister("DMSwarmSetSizes", DM_CLASSID, &DMSWARM_SetSizes));
173
174 PetscCall(PetscLogEventRegister("DMNtLayoutSetUp", DM_CLASSID, &DMNetwork_LayoutSetUp));
175 PetscCall(PetscLogEventRegister("DMNtSetUp", DM_CLASSID, &DMNetwork_SetUpNetwork));
176 PetscCall(PetscLogEventRegister("DMNtDistribute", DM_CLASSID, &DMNetwork_Distribute));
177 /* Process Info */
178 {
179 PetscClassId classids[1];
180
181 classids[0] = DM_CLASSID;
182 PetscCall(PetscInfoProcessClass("dm", 1, classids));
183 }
184
185 /* Process summary exclusions */
186 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
187 if (opt) {
188 PetscCall(PetscStrInList("dm", logList, ',', &pkg));
189 if (pkg) PetscCall(PetscLogEventExcludeClass(DM_CLASSID));
190 }
191
192 PetscCall(DMGenerateRegisterAll());
193 PetscCall(PetscRegisterFinalize(DMGenerateRegisterDestroy));
194 PetscCall(DMGeomModelRegisterAll());
195 PetscCall(PetscRegisterFinalize(DMGeomModelRegisterDestroy));
196 PetscCall(DMPlexTransformRegisterAll());
197 PetscCall(PetscRegisterFinalize(DMPlexTransformRegisterDestroy));
198 PetscCall(DMLabelRegisterAll());
199 PetscCall(PetscRegisterFinalize(DMLabelRegisterDestroy));
200 PetscCall(PetscRegisterFinalize(DMFinalizePackage));
201 PetscFunctionReturn(PETSC_SUCCESS);
202 }
203 #include <petscfe.h>
204
205 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
206
207 /*@C
208 PetscFEFinalizePackage - This function finalizes everything in the `PetscFE` package. It is called
209 from `PetscFinalize()`.
210
211 Level: developer
212
213 .seealso: `PetscInitialize()`
214 @*/
PetscFEFinalizePackage(void)215 PetscErrorCode PetscFEFinalizePackage(void)
216 {
217 PetscFunctionBegin;
218 PetscCall(PetscFunctionListDestroy(&PetscSpaceList));
219 PetscCall(PetscFunctionListDestroy(&PetscDualSpaceList));
220 PetscCall(PetscFunctionListDestroy(&PetscFEList));
221 PetscFEPackageInitialized = PETSC_FALSE;
222 PetscSpaceRegisterAllCalled = PETSC_FALSE;
223 PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
224 PetscFERegisterAllCalled = PETSC_FALSE;
225 PetscFunctionReturn(PETSC_SUCCESS);
226 }
227
228 /*@C
229 PetscFEInitializePackage - This function initializes everything in the `PetscFE` package. It is called
230 from `PetscDLLibraryRegister()` when using dynamic libraries, and on the first call to `PetscSpaceCreate()`
231 when using static libraries.
232
233 Level: developer
234
235 .seealso: `PetscInitialize()`
236 @*/
PetscFEInitializePackage(void)237 PetscErrorCode PetscFEInitializePackage(void)
238 {
239 char logList[256];
240 PetscBool opt, pkg;
241
242 PetscFunctionBegin;
243 if (PetscFEPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
244 PetscFEPackageInitialized = PETSC_TRUE;
245
246 /* Register Classes */
247 PetscCall(PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID));
248 PetscCall(PetscClassIdRegister("Dual Space", &PETSCDUALSPACE_CLASSID));
249 PetscCall(PetscClassIdRegister("FE Space", &PETSCFE_CLASSID));
250 /* Register Constructors */
251 PetscCall(PetscSpaceRegisterAll());
252 PetscCall(PetscDualSpaceRegisterAll());
253 PetscCall(PetscFERegisterAll());
254 /* Register Events */
255 PetscCall(PetscLogEventRegister("DualSpaceSetUp", PETSCDUALSPACE_CLASSID, &PETSCDUALSPACE_SetUp));
256 PetscCall(PetscLogEventRegister("FESetUp", PETSCFE_CLASSID, &PETSCFE_SetUp));
257 /* Process Info */
258 {
259 PetscClassId classids[3];
260
261 classids[0] = PETSCFE_CLASSID;
262 classids[1] = PETSCSPACE_CLASSID;
263 classids[2] = PETSCDUALSPACE_CLASSID;
264 PetscCall(PetscInfoProcessClass("fe", 1, classids));
265 PetscCall(PetscInfoProcessClass("space", 1, &classids[1]));
266 PetscCall(PetscInfoProcessClass("dualspace", 1, &classids[2]));
267 }
268 /* Process summary exclusions */
269 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
270 if (opt) {
271 PetscCall(PetscStrInList("fe", logList, ',', &pkg));
272 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFE_CLASSID));
273 }
274 /* Register package finalizer */
275 PetscCall(PetscRegisterFinalize(PetscFEFinalizePackage));
276 PetscFunctionReturn(PETSC_SUCCESS);
277 }
278 #include <petscfv.h>
279
280 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
281
282 /*@C
283 PetscFVFinalizePackage - This function finalizes everything in the `PetscFV` package. It is called
284 from `PetscFinalize()`.
285
286 Level: developer
287
288 .seealso: `PetscInitialize()`
289 @*/
PetscFVFinalizePackage(void)290 PetscErrorCode PetscFVFinalizePackage(void)
291 {
292 PetscFunctionBegin;
293 PetscCall(PetscFunctionListDestroy(&PetscLimiterList));
294 PetscCall(PetscFunctionListDestroy(&PetscFVList));
295 PetscFVPackageInitialized = PETSC_FALSE;
296 PetscFVRegisterAllCalled = PETSC_FALSE;
297 PetscLimiterRegisterAllCalled = PETSC_FALSE;
298 PetscFunctionReturn(PETSC_SUCCESS);
299 }
300
301 /*@C
302 PetscFVInitializePackage - This function initializes everything in the `PetscFV` package. It is called
303 from `PetscDLLibraryRegister()` when using dynamic libraries, and on the first call to `PetscFVCreate()`
304 when using static libraries.
305
306 Level: developer
307
308 .seealso: `PetscInitialize()`
309 @*/
PetscFVInitializePackage(void)310 PetscErrorCode PetscFVInitializePackage(void)
311 {
312 char logList[256];
313 PetscBool opt, pkg;
314
315 PetscFunctionBegin;
316 if (PetscFVPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
317 PetscFVPackageInitialized = PETSC_TRUE;
318
319 /* Register Classes */
320 PetscCall(PetscClassIdRegister("FV Space", &PETSCFV_CLASSID));
321 PetscCall(PetscClassIdRegister("Limiter", &PETSCLIMITER_CLASSID));
322 /* Register Constructors */
323 PetscCall(PetscFVRegisterAll());
324 /* Register Events */
325 /* Process Info */
326 {
327 PetscClassId classids[2];
328
329 classids[0] = PETSCFV_CLASSID;
330 classids[1] = PETSCLIMITER_CLASSID;
331 PetscCall(PetscInfoProcessClass("fv", 1, classids));
332 PetscCall(PetscInfoProcessClass("limiter", 1, &classids[1]));
333 }
334 /* Process summary exclusions */
335 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
336 if (opt) {
337 PetscCall(PetscStrInList("fv", logList, ',', &pkg));
338 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFV_CLASSID));
339 PetscCall(PetscStrInList("limiter", logList, ',', &pkg));
340 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCLIMITER_CLASSID));
341 }
342 /* Register package finalizer */
343 PetscCall(PetscRegisterFinalize(PetscFVFinalizePackage));
344 PetscFunctionReturn(PETSC_SUCCESS);
345 }
346 #include <petscds.h>
347
348 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
349
350 /*@C
351 PetscDSFinalizePackage - This function finalizes everything in the `PetscDS` package. It is called
352 from `PetscFinalize()`.
353
354 Level: developer
355
356 .seealso: `PetscInitialize()`
357 @*/
PetscDSFinalizePackage(void)358 PetscErrorCode PetscDSFinalizePackage(void)
359 {
360 PetscFunctionBegin;
361 PetscCall(PetscFunctionListDestroy(&PetscDSList));
362 PetscDSPackageInitialized = PETSC_FALSE;
363 PetscDSRegisterAllCalled = PETSC_FALSE;
364 PetscFunctionReturn(PETSC_SUCCESS);
365 }
366
367 /*@C
368 PetscDSInitializePackage - This function initializes everything in the `PetscDS` package. It is called
369 from `PetscDLLibraryRegister()` when using dynamic libraries, and on the first call to `PetscDSCreate()`
370 when using static libraries.
371
372 Level: developer
373
374 .seealso: `PetscInitialize()`
375 @*/
PetscDSInitializePackage(void)376 PetscErrorCode PetscDSInitializePackage(void)
377 {
378 char logList[256];
379 PetscBool opt, pkg;
380
381 PetscFunctionBegin;
382 if (PetscDSPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
383 PetscDSPackageInitialized = PETSC_TRUE;
384
385 /* Register Classes */
386 PetscCall(PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID));
387 PetscCall(PetscClassIdRegister("Weak Form", &PETSCWEAKFORM_CLASSID));
388 /* Register Constructors */
389 PetscCall(PetscDSRegisterAll());
390 /* Register Events */
391 /* Process Info */
392 {
393 PetscClassId classids[1];
394
395 classids[0] = PETSCDS_CLASSID;
396 PetscCall(PetscInfoProcessClass("ds", 1, classids));
397 }
398 /* Process summary exclusions */
399 PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt));
400 if (opt) {
401 PetscCall(PetscStrInList("ds", logList, ',', &pkg));
402 if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCDS_CLASSID));
403 }
404 /* Register package finalizer */
405 PetscCall(PetscRegisterFinalize(PetscDSFinalizePackage));
406 PetscFunctionReturn(PETSC_SUCCESS);
407 }
408
409 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
410 /*
411 PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
412
413 This one registers all the mesh generators and partitioners that are in
414 the basic DM library.
415
416 */
PetscDLLibraryRegister_petscdm(void)417 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
418 {
419 PetscFunctionBegin;
420 PetscCall(AOInitializePackage());
421 PetscCall(PetscPartitionerInitializePackage());
422 PetscCall(DMInitializePackage());
423 PetscCall(PetscFEInitializePackage());
424 PetscCall(PetscFVInitializePackage());
425 PetscCall(DMFieldInitializePackage());
426 PetscCall(PetscDSInitializePackage());
427 PetscFunctionReturn(PETSC_SUCCESS);
428 }
429
430 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
431