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