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