xref: /petsc/src/dm/interface/dlregisdmdm.c (revision 285fb4e2b69b3de46a0633bd0adc6a7f684caa1e)
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() when using dynamic libraries, and on the first call to AOCreate()
42   or DMDACreate() when using 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("GraphPartitioner",&PETSCPARTITIONER_CLASSID);CHKERRQ(ierr);
62 
63 #if defined(PETSC_HAVE_HYPRE)
64   ierr = MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct);CHKERRQ(ierr);
65   ierr = MatRegister(MATHYPRESSTRUCT, MatCreate_HYPRESStruct);CHKERRQ(ierr);
66 #endif
67   ierr = PetscSectionSymRegister(PETSCSECTIONSYMLABEL,PetscSectionSymCreate_Label);CHKERRQ(ierr);
68 
69   /* Register Constructors */
70   ierr = DMRegisterAll();CHKERRQ(ierr);
71   /* Register Events */
72   ierr = PetscLogEventRegister("DMConvert",              DM_CLASSID,&DM_Convert);CHKERRQ(ierr);
73   ierr = PetscLogEventRegister("DMGlobalToLocal",        DM_CLASSID,&DM_GlobalToLocal);CHKERRQ(ierr);
74   ierr = PetscLogEventRegister("DMLocalToGlobal",        DM_CLASSID,&DM_LocalToGlobal);CHKERRQ(ierr);
75   ierr = PetscLogEventRegister("DMLocatePoints",         DM_CLASSID,&DM_LocatePoints);CHKERRQ(ierr);
76   ierr = PetscLogEventRegister("DMCoarsen",              DM_CLASSID,&DM_Coarsen);CHKERRQ(ierr);
77   ierr = PetscLogEventRegister("DMCreateInterp",         DM_CLASSID,&DM_CreateInterpolation);CHKERRQ(ierr);
78   ierr = PetscLogEventRegister("DMCreateRestrict",       DM_CLASSID,&DM_CreateRestriction);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("DMPlexInterp",           DM_CLASSID,&DMPLEX_Interpolate);CHKERRQ(ierr);
83   ierr = PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("DMPlexDistCones",        DM_CLASSID,&DMPLEX_DistributeCones);CHKERRQ(ierr);
85   ierr = PetscLogEventRegister("DMPlexDistLabels",       DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr);
86   ierr = PetscLogEventRegister("DMPlexDistSF",           DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("DMPlexDistOvrlp",        DM_CLASSID,&DMPLEX_DistributeOverlap);CHKERRQ(ierr);
88   ierr = PetscLogEventRegister("DMPlexDistField",        DM_CLASSID,&DMPLEX_DistributeField);CHKERRQ(ierr);
89   ierr = PetscLogEventRegister("DMPlexDistData",         DM_CLASSID,&DMPLEX_DistributeData);CHKERRQ(ierr);
90   ierr = PetscLogEventRegister("DMPlexInterpSF",         DM_CLASSID,&DMPLEX_InterpolateSF);CHKERRQ(ierr);
91   ierr = PetscLogEventRegister("DMPlexGToNBegin",        DM_CLASSID,&DMPLEX_GlobalToNaturalBegin);CHKERRQ(ierr);
92   ierr = PetscLogEventRegister("DMPlexGToNEnd",          DM_CLASSID,&DMPLEX_GlobalToNaturalEnd);CHKERRQ(ierr);
93   ierr = PetscLogEventRegister("DMPlexNToGBegin",        DM_CLASSID,&DMPLEX_NaturalToGlobalBegin);CHKERRQ(ierr);
94   ierr = PetscLogEventRegister("DMPlexNToGEnd",          DM_CLASSID,&DMPLEX_NaturalToGlobalEnd);CHKERRQ(ierr);
95   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
96   ierr = PetscLogEventRegister("DMPlexPrealloc",         DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr);
97   ierr = PetscLogEventRegister("DMPlexResidualFE",       DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
98   ierr = PetscLogEventRegister("DMPlexJacobianFE",       DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
99   ierr = PetscLogEventRegister("DMPlexInterpFE",         DM_CLASSID,&DMPLEX_InterpolatorFEM);CHKERRQ(ierr);
100   ierr = PetscLogEventRegister("DMPlexInjectorFE",       DM_CLASSID,&DMPLEX_InjectorFEM);CHKERRQ(ierr);
101   ierr = PetscLogEventRegister("DMPlexIntegralFEM",      DM_CLASSID,&DMPLEX_IntegralFEM);CHKERRQ(ierr);
102   ierr = PetscLogEventRegister("DMPlexCreateGmsh",       DM_CLASSID,&DMPLEX_CreateGmsh);CHKERRQ(ierr);
103 
104   ierr = PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr);
105   ierr = PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr);
106   ierr = PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr);
107   ierr = PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr);
108   ierr = PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr);
109   ierr = PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr);
110   ierr = PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr);
111   ierr = PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr);
112   ierr = PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr);
113   ierr = PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr);
114 
115   /* Process info exclusions */
116   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
117   if (opt) {
118     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
119     if (pkg) {ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);}
120   }
121 
122   /* Process summary exclusions */
123   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
124   if (opt) {
125     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
126     if (pkg) {ierr = PetscLogEventExcludeClass(DM_CLASSID);CHKERRQ(ierr);}
127   }
128 
129   ierr = DMPlexGenerateRegisterAll();CHKERRQ(ierr);
130   ierr = PetscRegisterFinalize(DMPlexGenerateRegisterDestroy);CHKERRQ(ierr);
131   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
132   PetscFunctionReturn(0);
133 }
134 #include <petscfe.h>
135 
136 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
137 /*@C
138   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
139   from PetscFinalize().
140 
141   Level: developer
142 
143 .keywords: PetscFE, initialize, package
144 .seealso: PetscInitialize()
145 @*/
146 PetscErrorCode PetscFEFinalizePackage(void)
147 {
148   PetscErrorCode ierr;
149 
150   PetscFunctionBegin;
151   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
152   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
153   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
154   PetscFEPackageInitialized       = PETSC_FALSE;
155   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
156   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
157   PetscFERegisterAllCalled        = PETSC_FALSE;
158   PetscFunctionReturn(0);
159 }
160 
161 /*@C
162   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
163   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
164   when using static libraries.
165 
166   Level: developer
167 
168 .keywords: PetscFE, initialize, package
169 .seealso: PetscInitialize()
170 @*/
171 PetscErrorCode PetscFEInitializePackage(void)
172 {
173   char           logList[256];
174   PetscBool      opt,pkg;
175   PetscErrorCode ierr;
176 
177   PetscFunctionBegin;
178   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
179   PetscFEPackageInitialized = PETSC_TRUE;
180 
181   /* Register Classes */
182   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
183   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
184   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
185   /* Register Constructors */
186   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
187   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
188   ierr = PetscFERegisterAll();CHKERRQ(ierr);
189   /* Register Events */
190   /* Process info exclusions */
191   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
192   if (opt) {
193     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
194     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
195   }
196   /* Process summary exclusions */
197   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
198   if (opt) {
199     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
200     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
201   }
202   /* Register package finalizer */
203   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
204   PetscFunctionReturn(0);
205 }
206 #include <petscfv.h>
207 
208 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
209 /*@C
210   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
211   from PetscFinalize().
212 
213   Level: developer
214 
215 .keywords: PetscFV, initialize, package
216 .seealso: PetscInitialize()
217 @*/
218 PetscErrorCode PetscFVFinalizePackage(void)
219 {
220   PetscErrorCode ierr;
221 
222   PetscFunctionBegin;
223   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
224   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
225   PetscFVPackageInitialized     = PETSC_FALSE;
226   PetscFVRegisterAllCalled      = PETSC_FALSE;
227   PetscLimiterRegisterAllCalled = PETSC_FALSE;
228   PetscFunctionReturn(0);
229 }
230 
231 /*@C
232   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
233   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
234   when using static libraries.
235 
236   Level: developer
237 
238 .keywords: PetscFV, initialize, package
239 .seealso: PetscInitialize()
240 @*/
241 PetscErrorCode PetscFVInitializePackage(void)
242 {
243   char           logList[256];
244   PetscBool      opt,pkg;
245   PetscErrorCode ierr;
246 
247   PetscFunctionBegin;
248   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
249   PetscFVPackageInitialized = PETSC_TRUE;
250 
251   /* Register Classes */
252   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
253   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
254   /* Register Constructors */
255   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
256   /* Register Events */
257   /* Process info exclusions */
258   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
259   if (opt) {
260     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
261     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
262     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
263     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
264   }
265   /* Process summary exclusions */
266   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
267   if (opt) {
268     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
269     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
270     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
271     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
272   }
273   /* Register package finalizer */
274   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
275   PetscFunctionReturn(0);
276 }
277 #include <petscds.h>
278 
279 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
280 /*@C
281   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
282   from PetscFinalize().
283 
284   Level: developer
285 
286 .keywords: PetscDS, initialize, package
287 .seealso: PetscInitialize()
288 @*/
289 PetscErrorCode PetscDSFinalizePackage(void)
290 {
291   PetscErrorCode ierr;
292 
293   PetscFunctionBegin;
294   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
295   PetscDSPackageInitialized = PETSC_FALSE;
296   PetscDSRegisterAllCalled  = PETSC_FALSE;
297   PetscFunctionReturn(0);
298 }
299 
300 /*@C
301   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
302   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
303   when using static libraries.
304 
305   Level: developer
306 
307 .keywords: PetscDS, initialize, package
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