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