xref: /petsc/src/dm/interface/dlregisdmdm.c (revision daa037dfd3c3bec8dc8659548d2b20b07c1dc6de)
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 
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(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 {
46   char           logList[256];
47   PetscBool      opt,pkg;
48 
49   PetscFunctionBegin;
50   if (DMPackageInitialized) PetscFunctionReturn(0);
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("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("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate));
133   PetscCall(PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup));
134   PetscCall(PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin));
135   PetscCall(PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd));
136   PetscCall(PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount));
137   PetscCall(PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack));
138   PetscCall(PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints));
139   PetscCall(PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints));
140   PetscCall(PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort));
141   PetscCall(PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes));
142   /* Process Info */
143   {
144     PetscClassId  classids[1];
145 
146     classids[0] = DM_CLASSID;
147     PetscCall(PetscInfoProcessClass("dm", 1, classids));
148   }
149 
150   /* Process summary exclusions */
151   PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt));
152   if (opt) {
153     PetscCall(PetscStrInList("dm",logList,',',&pkg));
154     if (pkg) PetscCall(PetscLogEventExcludeClass(DM_CLASSID));
155   }
156 
157   PetscCall(DMGenerateRegisterAll());
158   PetscCall(PetscRegisterFinalize(DMGenerateRegisterDestroy));
159   PetscCall(DMPlexTransformRegisterAll());
160   PetscCall(PetscRegisterFinalize(DMPlexTransformRegisterDestroy));
161   PetscCall(PetscRegisterFinalize(DMFinalizePackage));
162   PetscFunctionReturn(0);
163 }
164 #include <petscfe.h>
165 
166 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
167 /*@C
168   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
169   from PetscFinalize().
170 
171   Level: developer
172 
173 .seealso: PetscInitialize()
174 @*/
175 PetscErrorCode PetscFEFinalizePackage(void)
176 {
177   PetscFunctionBegin;
178   PetscCall(PetscFunctionListDestroy(&PetscSpaceList));
179   PetscCall(PetscFunctionListDestroy(&PetscDualSpaceList));
180   PetscCall(PetscFunctionListDestroy(&PetscFEList));
181   PetscFEPackageInitialized       = PETSC_FALSE;
182   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
183   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
184   PetscFERegisterAllCalled        = PETSC_FALSE;
185   PetscFunctionReturn(0);
186 }
187 
188 /*@C
189   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
190   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
191   when using static libraries.
192 
193   Level: developer
194 
195 .seealso: PetscInitialize()
196 @*/
197 PetscErrorCode PetscFEInitializePackage(void)
198 {
199   char           logList[256];
200   PetscBool      opt,pkg;
201 
202   PetscFunctionBegin;
203   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
204   PetscFEPackageInitialized = PETSC_TRUE;
205 
206   /* Register Classes */
207   PetscCall(PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID));
208   PetscCall(PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID));
209   PetscCall(PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID));
210   /* Register Constructors */
211   PetscCall(PetscSpaceRegisterAll());
212   PetscCall(PetscDualSpaceRegisterAll());
213   PetscCall(PetscFERegisterAll());
214   /* Register Events */
215   PetscCall(PetscLogEventRegister("DualSpaceSetUp", PETSCDUALSPACE_CLASSID, &PETSCDUALSPACE_SetUp));
216   PetscCall(PetscLogEventRegister("FESetUp",        PETSCFE_CLASSID,        &PETSCFE_SetUp));
217   /* Process Info */
218   {
219     PetscClassId  classids[3];
220 
221     classids[0] = PETSCFE_CLASSID;
222     classids[1] = PETSCSPACE_CLASSID;
223     classids[2] = PETSCDUALSPACE_CLASSID;
224     PetscCall(PetscInfoProcessClass("fe", 1, classids));
225     PetscCall(PetscInfoProcessClass("space", 1, &classids[1]));
226     PetscCall(PetscInfoProcessClass("dualspace", 1, &classids[2]));
227   }
228   /* Process summary exclusions */
229   PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt));
230   if (opt) {
231     PetscCall(PetscStrInList("fe",logList,',',&pkg));
232     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFE_CLASSID));
233   }
234   /* Register package finalizer */
235   PetscCall(PetscRegisterFinalize(PetscFEFinalizePackage));
236   PetscFunctionReturn(0);
237 }
238 #include <petscfv.h>
239 
240 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
241 /*@C
242   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
243   from PetscFinalize().
244 
245   Level: developer
246 
247 .seealso: PetscInitialize()
248 @*/
249 PetscErrorCode PetscFVFinalizePackage(void)
250 {
251   PetscFunctionBegin;
252   PetscCall(PetscFunctionListDestroy(&PetscLimiterList));
253   PetscCall(PetscFunctionListDestroy(&PetscFVList));
254   PetscFVPackageInitialized     = PETSC_FALSE;
255   PetscFVRegisterAllCalled      = PETSC_FALSE;
256   PetscLimiterRegisterAllCalled = PETSC_FALSE;
257   PetscFunctionReturn(0);
258 }
259 
260 /*@C
261   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
262   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
263   when using static libraries.
264 
265   Level: developer
266 
267 .seealso: PetscInitialize()
268 @*/
269 PetscErrorCode PetscFVInitializePackage(void)
270 {
271   char           logList[256];
272   PetscBool      opt,pkg;
273 
274   PetscFunctionBegin;
275   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
276   PetscFVPackageInitialized = PETSC_TRUE;
277 
278   /* Register Classes */
279   PetscCall(PetscClassIdRegister("FV Space", &PETSCFV_CLASSID));
280   PetscCall(PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID));
281   /* Register Constructors */
282   PetscCall(PetscFVRegisterAll());
283   /* Register Events */
284   /* Process Info */
285   {
286     PetscClassId  classids[2];
287 
288     classids[0] = PETSCFV_CLASSID;
289     classids[1] = PETSCLIMITER_CLASSID;
290     PetscCall(PetscInfoProcessClass("fv", 1, classids));
291     PetscCall(PetscInfoProcessClass("limiter", 1, &classids[1]));
292   }
293   /* Process summary exclusions */
294   PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt));
295   if (opt) {
296     PetscCall(PetscStrInList("fv",logList,',',&pkg));
297     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFV_CLASSID));
298     PetscCall(PetscStrInList("limiter",logList,',',&pkg));
299     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCLIMITER_CLASSID));
300   }
301   /* Register package finalizer */
302   PetscCall(PetscRegisterFinalize(PetscFVFinalizePackage));
303   PetscFunctionReturn(0);
304 }
305 #include <petscds.h>
306 
307 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
308 /*@C
309   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
310   from PetscFinalize().
311 
312   Level: developer
313 
314 .seealso: PetscInitialize()
315 @*/
316 PetscErrorCode PetscDSFinalizePackage(void)
317 {
318   PetscFunctionBegin;
319   PetscCall(PetscFunctionListDestroy(&PetscDSList));
320   PetscDSPackageInitialized = PETSC_FALSE;
321   PetscDSRegisterAllCalled  = PETSC_FALSE;
322   PetscFunctionReturn(0);
323 }
324 
325 /*@C
326   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
327   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
328   when using static libraries.
329 
330   Level: developer
331 
332 .seealso: PetscInitialize()
333 @*/
334 PetscErrorCode PetscDSInitializePackage(void)
335 {
336   char           logList[256];
337   PetscBool      opt,pkg;
338 
339   PetscFunctionBegin;
340   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
341   PetscDSPackageInitialized = PETSC_TRUE;
342 
343   /* Register Classes */
344   PetscCall(PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID));
345   PetscCall(PetscClassIdRegister("Weak Form",       &PETSCWEAKFORM_CLASSID));
346   /* Register Constructors */
347   PetscCall(PetscDSRegisterAll());
348   /* Register Events */
349   /* Process Info */
350   {
351     PetscClassId  classids[1];
352 
353     classids[0] = PETSCDS_CLASSID;
354     PetscCall(PetscInfoProcessClass("ds", 1, classids));
355   }
356   /* Process summary exclusions */
357   PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt));
358   if (opt) {
359     PetscCall(PetscStrInList("ds",logList,',',&pkg));
360     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCDS_CLASSID));
361   }
362   /* Register package finalizer */
363   PetscCall(PetscRegisterFinalize(PetscDSFinalizePackage));
364   PetscFunctionReturn(0);
365 }
366 
367 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
368 /*
369   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
370 
371   This one registers all the mesh generators and partitioners that are in
372   the basic DM library.
373 
374 */
375 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
376 {
377   PetscFunctionBegin;
378   PetscCall(AOInitializePackage());
379   PetscCall(PetscPartitionerInitializePackage());
380   PetscCall(DMInitializePackage());
381   PetscCall(PetscFEInitializePackage());
382   PetscCall(PetscFVInitializePackage());
383   PetscCall(DMFieldInitializePackage());
384   PetscFunctionReturn(0);
385 }
386 
387 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
388