xref: /petsc/src/dm/interface/dlregisdmdm.c (revision bfcb38ea38335faa6e7f8d97f6bc6ce9aa2a1dd1)
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 
79   ierr = PetscLogEventRegister("Mesh Partition",         DM_CLASSID,&DMPLEX_Partition);CHKERRQ(ierr);
80   ierr = PetscLogEventRegister("Mesh Migration",         DM_CLASSID,&DMPLEX_Migrate);CHKERRQ(ierr);
81   ierr = PetscLogEventRegister("DMPlexPartSelf",         DM_CLASSID,&DMPLEX_PartSelf);CHKERRQ(ierr);
82   ierr = PetscLogEventRegister("DMPlexPartLblInv",       DM_CLASSID,&DMPLEX_PartLabelInvert);CHKERRQ(ierr);
83   ierr = PetscLogEventRegister("DMPlexPartLblSF",        DM_CLASSID,&DMPLEX_PartLabelCreateSF);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("DMPlexPartStrtSF",       DM_CLASSID,&DMPLEX_PartStratSF);CHKERRQ(ierr);
85   ierr = PetscLogEventRegister("DMPlexPointSF",          DM_CLASSID,&DMPLEX_CreatePointSF);CHKERRQ(ierr);
86   ierr = PetscLogEventRegister("DMPlexInterp",           DM_CLASSID,&DMPLEX_Interpolate);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr);
88   ierr = PetscLogEventRegister("DMPlexDistCones",        DM_CLASSID,&DMPLEX_DistributeCones);CHKERRQ(ierr);
89   ierr = PetscLogEventRegister("DMPlexDistLabels",       DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr);
90   ierr = PetscLogEventRegister("DMPlexDistSF",           DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
91   ierr = PetscLogEventRegister("DMPlexDistOvrlp",        DM_CLASSID,&DMPLEX_DistributeOverlap);CHKERRQ(ierr);
92   ierr = PetscLogEventRegister("DMPlexDistField",        DM_CLASSID,&DMPLEX_DistributeField);CHKERRQ(ierr);
93   ierr = PetscLogEventRegister("DMPlexDistData",         DM_CLASSID,&DMPLEX_DistributeData);CHKERRQ(ierr);
94   ierr = PetscLogEventRegister("DMPlexInterpSF",         DM_CLASSID,&DMPLEX_InterpolateSF);CHKERRQ(ierr);
95   ierr = PetscLogEventRegister("DMPlexGToNBegin",        DM_CLASSID,&DMPLEX_GlobalToNaturalBegin);CHKERRQ(ierr);
96   ierr = PetscLogEventRegister("DMPlexGToNEnd",          DM_CLASSID,&DMPLEX_GlobalToNaturalEnd);CHKERRQ(ierr);
97   ierr = PetscLogEventRegister("DMPlexNToGBegin",        DM_CLASSID,&DMPLEX_NaturalToGlobalBegin);CHKERRQ(ierr);
98   ierr = PetscLogEventRegister("DMPlexNToGEnd",          DM_CLASSID,&DMPLEX_NaturalToGlobalEnd);CHKERRQ(ierr);
99   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
100   ierr = PetscLogEventRegister("DMPlexSymmetrize",       DM_CLASSID,&DMPLEX_Symmetrize);CHKERRQ(ierr);
101   ierr = PetscLogEventRegister("DMPlexPrealloc",         DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr);
102   ierr = PetscLogEventRegister("DMPlexResidualFE",       DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
103   ierr = PetscLogEventRegister("DMPlexJacobianFE",       DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
104   ierr = PetscLogEventRegister("DMPlexInterpFE",         DM_CLASSID,&DMPLEX_InterpolatorFEM);CHKERRQ(ierr);
105   ierr = PetscLogEventRegister("DMPlexInjectorFE",       DM_CLASSID,&DMPLEX_InjectorFEM);CHKERRQ(ierr);
106   ierr = PetscLogEventRegister("DMPlexIntegralFEM",      DM_CLASSID,&DMPLEX_IntegralFEM);CHKERRQ(ierr);
107   ierr = PetscLogEventRegister("DMPlexCreateGmsh",       DM_CLASSID,&DMPLEX_CreateGmsh);CHKERRQ(ierr);
108   ierr = PetscLogEventRegister("DMPlexRebalance",        DM_CLASSID,&DMPLEX_RebalanceSharedPoints);CHKERRQ(ierr);
109 
110   ierr = PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr);
111   ierr = PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr);
112   ierr = PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr);
113   ierr = PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr);
114   ierr = PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr);
115   ierr = PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr);
116   ierr = PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr);
117   ierr = PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr);
118   ierr = PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr);
119   ierr = PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr);
120 
121   /* Process info exclusions */
122   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
123   if (opt) {
124     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
125     if (pkg) {ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);}
126   }
127 
128   /* Process summary exclusions */
129   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
130   if (opt) {
131     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
132     if (pkg) {ierr = PetscLogEventExcludeClass(DM_CLASSID);CHKERRQ(ierr);}
133   }
134 
135   ierr = DMPlexGenerateRegisterAll();CHKERRQ(ierr);
136   ierr = PetscRegisterFinalize(DMPlexGenerateRegisterDestroy);CHKERRQ(ierr);
137   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
138   PetscFunctionReturn(0);
139 }
140 #include <petscfe.h>
141 
142 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
143 /*@C
144   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
145   from PetscFinalize().
146 
147   Level: developer
148 
149 .seealso: PetscInitialize()
150 @*/
151 PetscErrorCode PetscFEFinalizePackage(void)
152 {
153   PetscErrorCode ierr;
154 
155   PetscFunctionBegin;
156   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
157   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
158   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
159   PetscFEPackageInitialized       = PETSC_FALSE;
160   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
161   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
162   PetscFERegisterAllCalled        = PETSC_FALSE;
163   PetscFunctionReturn(0);
164 }
165 
166 /*@C
167   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
168   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
169   when using static libraries.
170 
171   Level: developer
172 
173 .seealso: PetscInitialize()
174 @*/
175 PetscErrorCode PetscFEInitializePackage(void)
176 {
177   char           logList[256];
178   PetscBool      opt,pkg;
179   PetscErrorCode ierr;
180 
181   PetscFunctionBegin;
182   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
183   PetscFEPackageInitialized = PETSC_TRUE;
184 
185   /* Register Classes */
186   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
187   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
188   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
189   /* Register Constructors */
190   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
191   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
192   ierr = PetscFERegisterAll();CHKERRQ(ierr);
193   /* Register Events */
194   /* Process info exclusions */
195   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
196   if (opt) {
197     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
198     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
199   }
200   /* Process summary exclusions */
201   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
202   if (opt) {
203     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
204     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
205   }
206   /* Register package finalizer */
207   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
208   PetscFunctionReturn(0);
209 }
210 #include <petscfv.h>
211 
212 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
213 /*@C
214   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
215   from PetscFinalize().
216 
217   Level: developer
218 
219 .seealso: PetscInitialize()
220 @*/
221 PetscErrorCode PetscFVFinalizePackage(void)
222 {
223   PetscErrorCode ierr;
224 
225   PetscFunctionBegin;
226   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
227   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
228   PetscFVPackageInitialized     = PETSC_FALSE;
229   PetscFVRegisterAllCalled      = PETSC_FALSE;
230   PetscLimiterRegisterAllCalled = PETSC_FALSE;
231   PetscFunctionReturn(0);
232 }
233 
234 /*@C
235   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
236   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
237   when using static libraries.
238 
239   Level: developer
240 
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 .seealso: PetscInitialize()
289 @*/
290 PetscErrorCode PetscDSFinalizePackage(void)
291 {
292   PetscErrorCode ierr;
293 
294   PetscFunctionBegin;
295   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
296   PetscDSPackageInitialized = PETSC_FALSE;
297   PetscDSRegisterAllCalled  = PETSC_FALSE;
298   PetscFunctionReturn(0);
299 }
300 
301 /*@C
302   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
303   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
304   when using static libraries.
305 
306   Level: developer
307 
308 .seealso: PetscInitialize()
309 @*/
310 PetscErrorCode PetscDSInitializePackage(void)
311 {
312   char           logList[256];
313   PetscBool      opt,pkg;
314   PetscErrorCode ierr;
315 
316   PetscFunctionBegin;
317   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
318   PetscDSPackageInitialized = PETSC_TRUE;
319 
320   /* Register Classes */
321   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
322   /* Register Constructors */
323   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
324   /* Register Events */
325   /* Process info exclusions */
326   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
327   if (opt) {
328     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
329     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
330   }
331   /* Process summary exclusions */
332   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
333   if (opt) {
334     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
335     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
336   }
337   /* Register package finalizer */
338   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
339   PetscFunctionReturn(0);
340 }
341 
342 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
343 /*
344   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
345 
346   This one registers all the mesh generators and partitioners that are in
347   the basic DM library.
348 
349 */
350 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
351 {
352   PetscErrorCode ierr;
353 
354   PetscFunctionBegin;
355   ierr = AOInitializePackage();CHKERRQ(ierr);
356   ierr = DMInitializePackage();CHKERRQ(ierr);
357   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
358   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
359   ierr = DMFieldInitializePackage();CHKERRQ(ierr);
360   PetscFunctionReturn(0);
361 }
362 
363 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
364