xref: /petsc/src/dm/interface/dlregisdmdm.c (revision 9e436492a5f3dfdbfdb4be14586e1a8ebf1e4e34)
1 
2 #include <petsc/private/dmlabelimpl.h>
3 #include <petsc/private/dmdaimpl.h>
4 #include <petsc/private/dmpleximpl.h>
5 #include <petsc/private/petscdsimpl.h>
6 #include <petsc/private/petscfeimpl.h>
7 #include <petsc/private/petscfvimpl.h>
8 #include <petsc/private/dmswarmimpl.h>
9 
10 static PetscBool DMPackageInitialized = PETSC_FALSE;
11 /*@C
12   DMFinalizePackage - This function finalizes everything in the DM package. It is called
13   from PetscFinalize().
14 
15   Level: developer
16 
17 .keywords: AO, initialize, package
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() when using dynamic libraries, and on the first call to AOCreate()
41   or DMDACreate() when using static libraries.
42 
43   Level: developer
44 
45 .keywords: AO, initialize, package
46 .seealso: PetscInitialize()
47 @*/
48 PetscErrorCode  DMInitializePackage(void)
49 {
50   char           logList[256];
51   char           *className;
52   PetscBool      opt;
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("DMDALocalADFunc",        DM_CLASSID,&DMDA_LocalADFunction);CHKERRQ(ierr);
81 
82   ierr = PetscLogEventRegister("Mesh Partition",         PETSCPARTITIONER_CLASSID,&PETSCPARTITIONER_Partition);CHKERRQ(ierr);
83   ierr = PetscLogEventRegister("Mesh Migration",         DM_CLASSID,&DMPLEX_Migrate);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("DMPlexInterp",           DM_CLASSID,&DMPLEX_Interpolate);CHKERRQ(ierr);
85   ierr = PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr);
86   ierr = PetscLogEventRegister("DMPlexDistCones",        DM_CLASSID,&DMPLEX_DistributeCones);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("DMPlexDistLabels",       DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr);
88   ierr = PetscLogEventRegister("DMPlexDistribSF",        DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
89   ierr = PetscLogEventRegister("DMPlexDistribOL",        DM_CLASSID,&DMPLEX_DistributeOverlap);CHKERRQ(ierr);
90   ierr = PetscLogEventRegister("DMPlexDistField",        DM_CLASSID,&DMPLEX_DistributeField);CHKERRQ(ierr);
91   ierr = PetscLogEventRegister("DMPlexDistData",         DM_CLASSID,&DMPLEX_DistributeData);CHKERRQ(ierr);
92   ierr = PetscLogEventRegister("DMPlexInterpSF",         DM_CLASSID,&DMPLEX_InterpolateSF);CHKERRQ(ierr);
93   ierr = PetscLogEventRegister("DMPlexGToNBegin",        DM_CLASSID,&DMPLEX_GlobalToNaturalBegin);CHKERRQ(ierr);
94   ierr = PetscLogEventRegister("DMPlexGToNEnd",          DM_CLASSID,&DMPLEX_GlobalToNaturalEnd);CHKERRQ(ierr);
95   ierr = PetscLogEventRegister("DMPlexNToGBegin",        DM_CLASSID,&DMPLEX_NaturalToGlobalBegin);CHKERRQ(ierr);
96   ierr = PetscLogEventRegister("DMPlexNToGEnd",          DM_CLASSID,&DMPLEX_NaturalToGlobalEnd);CHKERRQ(ierr);
97   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
98   ierr = PetscLogEventRegister("DMPlexPrealloc",         DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr);
99   ierr = PetscLogEventRegister("DMPlexResidualFE",       DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
100   ierr = PetscLogEventRegister("DMPlexJacobianFE",       DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
101   ierr = PetscLogEventRegister("DMPlexInterpFE",         DM_CLASSID,&DMPLEX_InterpolatorFEM);CHKERRQ(ierr);
102   ierr = PetscLogEventRegister("DMPlexInjectorFE",       DM_CLASSID,&DMPLEX_InjectorFEM);CHKERRQ(ierr);
103   ierr = PetscLogEventRegister("DMPlexIntegralFEM",      DM_CLASSID,&DMPLEX_IntegralFEM);CHKERRQ(ierr);
104   ierr = PetscLogEventRegister("DMPlexCreateGmsh",       DM_CLASSID,&DMPLEX_CreateGmsh);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, 256, &opt);CHKERRQ(ierr);
119   if (opt) {
120     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
121     if (className) {
122       ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
123     }
124   }
125   /* Process summary exclusions */
126   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
127   if (opt) {
128     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
129     if (className) {
130       ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
131     }
132   }
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   char          *className;
177   PetscBool      opt;
178   PetscErrorCode ierr;
179 
180   PetscFunctionBegin;
181   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
182   PetscFEPackageInitialized = PETSC_TRUE;
183 
184   /* Register Classes */
185   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
186   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
187   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
188 
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, 256, &opt);CHKERRQ(ierr);
196   if (opt) {
197     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
198     if (className) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
199   }
200   /* Process summary exclusions */
201   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
202   if (opt) {
203     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
204     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
205   }
206   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
207   PetscFunctionReturn(0);
208 }
209 #include <petscfv.h>
210 
211 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
212 /*@C
213   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
214   from PetscFinalize().
215 
216   Level: developer
217 
218 .keywords: PetscFV, initialize, package
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 .keywords: PetscFV, initialize, package
242 .seealso: PetscInitialize()
243 @*/
244 PetscErrorCode PetscFVInitializePackage(void)
245 {
246   char           logList[256];
247   char          *className;
248   PetscBool      opt;
249   PetscErrorCode ierr;
250 
251   PetscFunctionBegin;
252   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
253   PetscFVPackageInitialized = PETSC_TRUE;
254 
255   /* Register Classes */
256   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
257   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
258 
259   /* Register Constructors */
260   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
261   /* Register Events */
262   /* Process info exclusions */
263   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
264   if (opt) {
265     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
266     if (className) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
267     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
268     if (className) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
269   }
270   /* Process summary exclusions */
271   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
272   if (opt) {
273     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
274     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
275     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
276     if (className) {ierr = PetscLogEventDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
277   }
278   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
279   PetscFunctionReturn(0);
280 }
281 #include <petscds.h>
282 
283 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
284 /*@C
285   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
286   from PetscFinalize().
287 
288   Level: developer
289 
290 .keywords: PetscDS, initialize, package
291 .seealso: PetscInitialize()
292 @*/
293 PetscErrorCode PetscDSFinalizePackage(void)
294 {
295   PetscErrorCode ierr;
296 
297   PetscFunctionBegin;
298   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
299   PetscDSPackageInitialized = PETSC_FALSE;
300   PetscDSRegisterAllCalled  = PETSC_FALSE;
301   PetscFunctionReturn(0);
302 }
303 
304 /*@C
305   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
306   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
307   when using static libraries.
308 
309   Level: developer
310 
311 .keywords: PetscDS, initialize, package
312 .seealso: PetscInitialize()
313 @*/
314 PetscErrorCode PetscDSInitializePackage(void)
315 {
316   char           logList[256];
317   char          *className;
318   PetscBool      opt;
319   PetscErrorCode ierr;
320 
321   PetscFunctionBegin;
322   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
323   PetscDSPackageInitialized = PETSC_TRUE;
324 
325   /* Register Classes */
326   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
327 
328   /* Register Constructors */
329   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
330   /* Register Events */
331   /* Process info exclusions */
332   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
333   if (opt) {
334     ierr = PetscStrstr(logList, "ds", &className);CHKERRQ(ierr);
335     if (className) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
336   }
337   /* Process summary exclusions */
338   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
339   if (opt) {
340     ierr = PetscStrstr(logList, "ds", &className);CHKERRQ(ierr);
341     if (className) {ierr = PetscLogEventDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
342   }
343   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
344   PetscFunctionReturn(0);
345 }
346 
347 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
348 /*
349   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
350 
351   This one registers all the mesh generators and partitioners that are in
352   the basic DM library.
353 
354 */
355 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
356 {
357   PetscErrorCode ierr;
358 
359   PetscFunctionBegin;
360   ierr = AOInitializePackage();CHKERRQ(ierr);
361   ierr = DMInitializePackage();CHKERRQ(ierr);
362   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
363   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
364   PetscFunctionReturn(0);
365 }
366 
367 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
368