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