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