xref: /petsc/src/dm/interface/dlregisdmdm.c (revision 0dc45c67dd8cb6796abcc61ff7db4f0ecf01d6ed)
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("DMCreateMassMat",        DM_CLASSID,&DM_CreateMassMatrix));
79   PetscCall(PetscLogEventRegister("DMLoad",                 DM_CLASSID,&DM_Load));
80   PetscCall(PetscLogEventRegister("DMAdaptInterp",          DM_CLASSID,&DM_AdaptInterpolator));
81 
82   PetscCall(PetscLogEventRegister("DMPlexBuFrCeLi",         DM_CLASSID,&DMPLEX_BuildFromCellList));
83   PetscCall(PetscLogEventRegister("DMPlexBuCoFrCeLi",       DM_CLASSID,&DMPLEX_BuildCoordinatesFromCellList));
84   PetscCall(PetscLogEventRegister("DMPlexCreateGmsh",       DM_CLASSID,&DMPLEX_CreateGmsh));
85   PetscCall(PetscLogEventRegister("DMPlexCrFromFile",       DM_CLASSID,&DMPLEX_CreateFromFile));
86   PetscCall(PetscLogEventRegister("Mesh Partition",         DM_CLASSID,&DMPLEX_Partition));
87   PetscCall(PetscLogEventRegister("Mesh Migration",         DM_CLASSID,&DMPLEX_Migrate));
88   PetscCall(PetscLogEventRegister("DMPlexPartSelf",         DM_CLASSID,&DMPLEX_PartSelf));
89   PetscCall(PetscLogEventRegister("DMPlexPartLblInv",       DM_CLASSID,&DMPLEX_PartLabelInvert));
90   PetscCall(PetscLogEventRegister("DMPlexPartLblSF",        DM_CLASSID,&DMPLEX_PartLabelCreateSF));
91   PetscCall(PetscLogEventRegister("DMPlexPartStrtSF",       DM_CLASSID,&DMPLEX_PartStratSF));
92   PetscCall(PetscLogEventRegister("DMPlexPointSF",          DM_CLASSID,&DMPLEX_CreatePointSF));
93   PetscCall(PetscLogEventRegister("DMPlexInterp",           DM_CLASSID,&DMPLEX_Interpolate));
94   PetscCall(PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute));
95   PetscCall(PetscLogEventRegister("DMPlexDistCones",        DM_CLASSID,&DMPLEX_DistributeCones));
96   PetscCall(PetscLogEventRegister("DMPlexDistLabels",       DM_CLASSID,&DMPLEX_DistributeLabels));
97   PetscCall(PetscLogEventRegister("DMPlexDistSF",           DM_CLASSID,&DMPLEX_DistributeSF));
98   PetscCall(PetscLogEventRegister("DMPlexDistOvrlp",        DM_CLASSID,&DMPLEX_DistributeOverlap));
99   PetscCall(PetscLogEventRegister("DMPlexDistField",        DM_CLASSID,&DMPLEX_DistributeField));
100   PetscCall(PetscLogEventRegister("DMPlexDistData",         DM_CLASSID,&DMPLEX_DistributeData));
101   PetscCall(PetscLogEventRegister("DMPlexInterpSF",         DM_CLASSID,&DMPLEX_InterpolateSF));
102   PetscCall(PetscLogEventRegister("DMPlexGToNBegin",        DM_CLASSID,&DMPLEX_GlobalToNaturalBegin));
103   PetscCall(PetscLogEventRegister("DMPlexGToNEnd",          DM_CLASSID,&DMPLEX_GlobalToNaturalEnd));
104   PetscCall(PetscLogEventRegister("DMPlexNToGBegin",        DM_CLASSID,&DMPLEX_NaturalToGlobalBegin));
105   PetscCall(PetscLogEventRegister("DMPlexNToGEnd",          DM_CLASSID,&DMPLEX_NaturalToGlobalEnd));
106   PetscCall(PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify));
107   PetscCall(PetscLogEventRegister("DMPlexSymmetrize",       DM_CLASSID,&DMPLEX_Symmetrize));
108   PetscCall(PetscLogEventRegister("DMPlexPrealloc",         DM_CLASSID,&DMPLEX_Preallocate));
109   PetscCall(PetscLogEventRegister("DMPlexResidualFE",       DM_CLASSID,&DMPLEX_ResidualFEM));
110   PetscCall(PetscLogEventRegister("DMPlexJacobianFE",       DM_CLASSID,&DMPLEX_JacobianFEM));
111   PetscCall(PetscLogEventRegister("DMPlexInterpFE",         DM_CLASSID,&DMPLEX_InterpolatorFEM));
112   PetscCall(PetscLogEventRegister("DMPlexInjectorFE",       DM_CLASSID,&DMPLEX_InjectorFEM));
113   PetscCall(PetscLogEventRegister("DMPlexIntegralFEM",      DM_CLASSID,&DMPLEX_IntegralFEM));
114   PetscCall(PetscLogEventRegister("DMPlexRebalance",        DM_CLASSID,&DMPLEX_RebalanceSharedPoints));
115   PetscCall(PetscLogEventRegister("DMPlexLocatePoints",     DM_CLASSID,&DMPLEX_LocatePoints));
116   PetscCall(PetscLogEventRegister("DMPlexTopologyView",     DM_CLASSID,&DMPLEX_TopologyView));
117   PetscCall(PetscLogEventRegister("DMPlexLabelsView",       DM_CLASSID,&DMPLEX_LabelsView));
118   PetscCall(PetscLogEventRegister("DMPlexCoordinatesView",  DM_CLASSID,&DMPLEX_CoordinatesView));
119   PetscCall(PetscLogEventRegister("DMPlexSectionView",      DM_CLASSID,&DMPLEX_SectionView));
120   PetscCall(PetscLogEventRegister("DMPlexGlobalVectorView", DM_CLASSID,&DMPLEX_GlobalVectorView));
121   PetscCall(PetscLogEventRegister("DMPlexLocalVectorView",  DM_CLASSID,&DMPLEX_LocalVectorView));
122   PetscCall(PetscLogEventRegister("DMPlexTopologyLoad",     DM_CLASSID,&DMPLEX_TopologyLoad));
123   PetscCall(PetscLogEventRegister("DMPlexLabelsLoad",       DM_CLASSID,&DMPLEX_LabelsLoad));
124   PetscCall(PetscLogEventRegister("DMPlexCoordinatesLoad",  DM_CLASSID,&DMPLEX_CoordinatesLoad));
125   PetscCall(PetscLogEventRegister("DMPlexSectionLoad",      DM_CLASSID,&DMPLEX_SectionLoad));
126   PetscCall(PetscLogEventRegister("DMPlexGlobalVectorLoad", DM_CLASSID,&DMPLEX_GlobalVectorLoad));
127   PetscCall(PetscLogEventRegister("DMPlexLocalVectorLoad",  DM_CLASSID,&DMPLEX_LocalVectorLoad));
128   PetscCall(PetscLogEventRegister("DMPlexMetricEnforceSPD", DM_CLASSID,&DMPLEX_MetricEnforceSPD));
129   PetscCall(PetscLogEventRegister("DMPlexMetricNormalize",  DM_CLASSID,&DMPLEX_MetricNormalize));
130   PetscCall(PetscLogEventRegister("DMPlexMetricAverage",    DM_CLASSID,&DMPLEX_MetricAverage));
131   PetscCall(PetscLogEventRegister("DMPlexMetricIntersect",  DM_CLASSID,&DMPLEX_MetricIntersection));
132 
133   PetscCall(PetscLogEventRegister("RebalBuildGraph",        DM_CLASSID,&DMPLEX_RebalBuildGraph));
134   PetscCall(PetscLogEventRegister("RebalGatherGraph",       DM_CLASSID,&DMPLEX_RebalGatherGraph));
135   PetscCall(PetscLogEventRegister("RebalPartition",         DM_CLASSID,&DMPLEX_RebalPartition));
136   PetscCall(PetscLogEventRegister("RebalScatterPart",       DM_CLASSID,&DMPLEX_RebalScatterPart));
137   PetscCall(PetscLogEventRegister("RebalRewriteSF",         DM_CLASSID,&DMPLEX_RebalRewriteSF));
138 
139   PetscCall(PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate));
140   PetscCall(PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup));
141   PetscCall(PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin));
142   PetscCall(PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd));
143   PetscCall(PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount));
144   PetscCall(PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack));
145   PetscCall(PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints));
146   PetscCall(PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints));
147   PetscCall(PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort));
148   PetscCall(PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes));
149   /* Process Info */
150   {
151     PetscClassId  classids[1];
152 
153     classids[0] = DM_CLASSID;
154     PetscCall(PetscInfoProcessClass("dm", 1, classids));
155   }
156 
157   /* Process summary exclusions */
158   PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt));
159   if (opt) {
160     PetscCall(PetscStrInList("dm",logList,',',&pkg));
161     if (pkg) PetscCall(PetscLogEventExcludeClass(DM_CLASSID));
162   }
163 
164   PetscCall(DMGenerateRegisterAll());
165   PetscCall(PetscRegisterFinalize(DMGenerateRegisterDestroy));
166   PetscCall(DMPlexTransformRegisterAll());
167   PetscCall(PetscRegisterFinalize(DMPlexTransformRegisterDestroy));
168   PetscCall(PetscRegisterFinalize(DMFinalizePackage));
169   PetscFunctionReturn(0);
170 }
171 #include <petscfe.h>
172 
173 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
174 /*@C
175   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
176   from PetscFinalize().
177 
178   Level: developer
179 
180 .seealso: `PetscInitialize()`
181 @*/
182 PetscErrorCode PetscFEFinalizePackage(void)
183 {
184   PetscFunctionBegin;
185   PetscCall(PetscFunctionListDestroy(&PetscSpaceList));
186   PetscCall(PetscFunctionListDestroy(&PetscDualSpaceList));
187   PetscCall(PetscFunctionListDestroy(&PetscFEList));
188   PetscFEPackageInitialized       = PETSC_FALSE;
189   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
190   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
191   PetscFERegisterAllCalled        = PETSC_FALSE;
192   PetscFunctionReturn(0);
193 }
194 
195 /*@C
196   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
197   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
198   when using static libraries.
199 
200   Level: developer
201 
202 .seealso: `PetscInitialize()`
203 @*/
204 PetscErrorCode PetscFEInitializePackage(void)
205 {
206   char           logList[256];
207   PetscBool      opt,pkg;
208 
209   PetscFunctionBegin;
210   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
211   PetscFEPackageInitialized = PETSC_TRUE;
212 
213   /* Register Classes */
214   PetscCall(PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID));
215   PetscCall(PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID));
216   PetscCall(PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID));
217   /* Register Constructors */
218   PetscCall(PetscSpaceRegisterAll());
219   PetscCall(PetscDualSpaceRegisterAll());
220   PetscCall(PetscFERegisterAll());
221   /* Register Events */
222   PetscCall(PetscLogEventRegister("DualSpaceSetUp", PETSCDUALSPACE_CLASSID, &PETSCDUALSPACE_SetUp));
223   PetscCall(PetscLogEventRegister("FESetUp",        PETSCFE_CLASSID,        &PETSCFE_SetUp));
224   /* Process Info */
225   {
226     PetscClassId  classids[3];
227 
228     classids[0] = PETSCFE_CLASSID;
229     classids[1] = PETSCSPACE_CLASSID;
230     classids[2] = PETSCDUALSPACE_CLASSID;
231     PetscCall(PetscInfoProcessClass("fe", 1, classids));
232     PetscCall(PetscInfoProcessClass("space", 1, &classids[1]));
233     PetscCall(PetscInfoProcessClass("dualspace", 1, &classids[2]));
234   }
235   /* Process summary exclusions */
236   PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt));
237   if (opt) {
238     PetscCall(PetscStrInList("fe",logList,',',&pkg));
239     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFE_CLASSID));
240   }
241   /* Register package finalizer */
242   PetscCall(PetscRegisterFinalize(PetscFEFinalizePackage));
243   PetscFunctionReturn(0);
244 }
245 #include <petscfv.h>
246 
247 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
248 /*@C
249   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
250   from PetscFinalize().
251 
252   Level: developer
253 
254 .seealso: `PetscInitialize()`
255 @*/
256 PetscErrorCode PetscFVFinalizePackage(void)
257 {
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 {
278   char           logList[256];
279   PetscBool      opt,pkg;
280 
281   PetscFunctionBegin;
282   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
283   PetscFVPackageInitialized = PETSC_TRUE;
284 
285   /* Register Classes */
286   PetscCall(PetscClassIdRegister("FV Space", &PETSCFV_CLASSID));
287   PetscCall(PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID));
288   /* Register Constructors */
289   PetscCall(PetscFVRegisterAll());
290   /* Register Events */
291   /* Process Info */
292   {
293     PetscClassId  classids[2];
294 
295     classids[0] = PETSCFV_CLASSID;
296     classids[1] = PETSCLIMITER_CLASSID;
297     PetscCall(PetscInfoProcessClass("fv", 1, classids));
298     PetscCall(PetscInfoProcessClass("limiter", 1, &classids[1]));
299   }
300   /* Process summary exclusions */
301   PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt));
302   if (opt) {
303     PetscCall(PetscStrInList("fv",logList,',',&pkg));
304     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCFV_CLASSID));
305     PetscCall(PetscStrInList("limiter",logList,',',&pkg));
306     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCLIMITER_CLASSID));
307   }
308   /* Register package finalizer */
309   PetscCall(PetscRegisterFinalize(PetscFVFinalizePackage));
310   PetscFunctionReturn(0);
311 }
312 #include <petscds.h>
313 
314 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
315 /*@C
316   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
317   from PetscFinalize().
318 
319   Level: developer
320 
321 .seealso: `PetscInitialize()`
322 @*/
323 PetscErrorCode PetscDSFinalizePackage(void)
324 {
325   PetscFunctionBegin;
326   PetscCall(PetscFunctionListDestroy(&PetscDSList));
327   PetscDSPackageInitialized = PETSC_FALSE;
328   PetscDSRegisterAllCalled  = PETSC_FALSE;
329   PetscFunctionReturn(0);
330 }
331 
332 /*@C
333   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
334   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
335   when using static libraries.
336 
337   Level: developer
338 
339 .seealso: `PetscInitialize()`
340 @*/
341 PetscErrorCode PetscDSInitializePackage(void)
342 {
343   char           logList[256];
344   PetscBool      opt,pkg;
345 
346   PetscFunctionBegin;
347   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
348   PetscDSPackageInitialized = PETSC_TRUE;
349 
350   /* Register Classes */
351   PetscCall(PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID));
352   PetscCall(PetscClassIdRegister("Weak Form",       &PETSCWEAKFORM_CLASSID));
353   /* Register Constructors */
354   PetscCall(PetscDSRegisterAll());
355   /* Register Events */
356   /* Process Info */
357   {
358     PetscClassId  classids[1];
359 
360     classids[0] = PETSCDS_CLASSID;
361     PetscCall(PetscInfoProcessClass("ds", 1, classids));
362   }
363   /* Process summary exclusions */
364   PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt));
365   if (opt) {
366     PetscCall(PetscStrInList("ds",logList,',',&pkg));
367     if (pkg) PetscCall(PetscLogEventExcludeClass(PETSCDS_CLASSID));
368   }
369   /* Register package finalizer */
370   PetscCall(PetscRegisterFinalize(PetscDSFinalizePackage));
371   PetscFunctionReturn(0);
372 }
373 
374 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
375 /*
376   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
377 
378   This one registers all the mesh generators and partitioners that are in
379   the basic DM library.
380 
381 */
382 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
383 {
384   PetscFunctionBegin;
385   PetscCall(AOInitializePackage());
386   PetscCall(PetscPartitionerInitializePackage());
387   PetscCall(DMInitializePackage());
388   PetscCall(PetscFEInitializePackage());
389   PetscCall(PetscFVInitializePackage());
390   PetscCall(DMFieldInitializePackage());
391   PetscFunctionReturn(0);
392 }
393 
394 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
395