xref: /petsc/src/dm/interface/dlregisdmdm.c (revision ed923d712065d5cd07973a5b5fb0ac097e7d6cf0)
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 #endif
36 
37 /*@C
38   DMInitializePackage - This function initializes everything in the DM package. It is called
39   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to AOCreate()
40   or DMDACreate() when using static libraries.
41 
42   Level: developer
43 
44 .keywords: AO, initialize, package
45 .seealso: PetscInitialize()
46 @*/
47 PetscErrorCode  DMInitializePackage(void)
48 {
49   char           logList[256];
50   char           *className;
51   PetscBool      opt;
52   PetscErrorCode ierr;
53 
54   PetscFunctionBegin;
55   if (DMPackageInitialized) PetscFunctionReturn(0);
56   DMPackageInitialized = PETSC_TRUE;
57 
58   /* Register Classes */
59   ierr = PetscClassIdRegister("Distributed Mesh",&DM_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 #endif
65   ierr = PetscSectionSymRegister(PETSCSECTIONSYMLABEL,PetscSectionSymCreate_Label);CHKERRQ(ierr);
66 
67   /* Register Constructors */
68   ierr = DMRegisterAll();CHKERRQ(ierr);
69   /* Register Events */
70   ierr = PetscLogEventRegister("DMConvert",              DM_CLASSID,&DM_Convert);CHKERRQ(ierr);
71   ierr = PetscLogEventRegister("DMGlobalToLocal",        DM_CLASSID,&DM_GlobalToLocal);CHKERRQ(ierr);
72   ierr = PetscLogEventRegister("DMLocalToGlobal",        DM_CLASSID,&DM_LocalToGlobal);CHKERRQ(ierr);
73   ierr = PetscLogEventRegister("DMLocatePoints",         DM_CLASSID,&DM_LocatePoints);CHKERRQ(ierr);
74   ierr = PetscLogEventRegister("DMCoarsen",              DM_CLASSID,&DM_Coarsen);CHKERRQ(ierr);
75   ierr = PetscLogEventRegister("DMCreateInterp",         DM_CLASSID,&DM_CreateInterpolation);CHKERRQ(ierr);
76   ierr = PetscLogEventRegister("DMCreateRestrict",       DM_CLASSID,&DM_CreateRestriction);CHKERRQ(ierr);
77 
78   ierr = PetscLogEventRegister("DMDALocalADFunc",        DM_CLASSID,&DMDA_LocalADFunction);CHKERRQ(ierr);
79 
80   ierr = PetscLogEventRegister("Mesh Partition",         PETSCPARTITIONER_CLASSID,&PETSCPARTITIONER_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("DMPlexDistribSF",        DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("DMPlexDistribOL",        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 
111   /* Process info exclusions */
112   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
113   if (opt) {
114     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
115     if (className) {
116       ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
117     }
118   }
119   /* Process summary exclusions */
120   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
121   if (opt) {
122     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
123     if (className) {
124       ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
125     }
126   }
127   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
128   PetscFunctionReturn(0);
129 }
130 #include <petscfe.h>
131 
132 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
133 /*@C
134   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
135   from PetscFinalize().
136 
137   Level: developer
138 
139 .keywords: PetscFE, initialize, package
140 .seealso: PetscInitialize()
141 @*/
142 PetscErrorCode PetscFEFinalizePackage(void)
143 {
144   PetscErrorCode ierr;
145 
146   PetscFunctionBegin;
147   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
148   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
149   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
150   PetscFEPackageInitialized       = PETSC_FALSE;
151   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
152   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
153   PetscFERegisterAllCalled        = PETSC_FALSE;
154   PetscFunctionReturn(0);
155 }
156 
157 /*@C
158   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
159   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
160   when using static libraries.
161 
162   Level: developer
163 
164 .keywords: PetscFE, initialize, package
165 .seealso: PetscInitialize()
166 @*/
167 PetscErrorCode PetscFEInitializePackage(void)
168 {
169   char           logList[256];
170   char          *className;
171   PetscBool      opt;
172   PetscErrorCode ierr;
173 
174   PetscFunctionBegin;
175   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
176   PetscFEPackageInitialized = PETSC_TRUE;
177 
178   /* Register Classes */
179   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
180   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
181   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
182 
183   /* Register Constructors */
184   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
185   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
186   ierr = PetscFERegisterAll();CHKERRQ(ierr);
187   /* Register Events */
188   /* Process info exclusions */
189   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
190   if (opt) {
191     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
192     if (className) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
193   }
194   /* Process summary exclusions */
195   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
196   if (opt) {
197     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
198     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
199   }
200   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
201   PetscFunctionReturn(0);
202 }
203 #include <petscfv.h>
204 
205 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
206 /*@C
207   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
208   from PetscFinalize().
209 
210   Level: developer
211 
212 .keywords: PetscFV, initialize, package
213 .seealso: PetscInitialize()
214 @*/
215 PetscErrorCode PetscFVFinalizePackage(void)
216 {
217   PetscErrorCode ierr;
218 
219   PetscFunctionBegin;
220   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
221   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
222   PetscFVPackageInitialized     = PETSC_FALSE;
223   PetscFVRegisterAllCalled      = PETSC_FALSE;
224   PetscLimiterRegisterAllCalled = PETSC_FALSE;
225   PetscFunctionReturn(0);
226 }
227 
228 /*@C
229   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
230   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
231   when using static libraries.
232 
233   Level: developer
234 
235 .keywords: PetscFV, initialize, package
236 .seealso: PetscInitialize()
237 @*/
238 PetscErrorCode PetscFVInitializePackage(void)
239 {
240   char           logList[256];
241   char          *className;
242   PetscBool      opt;
243   PetscErrorCode ierr;
244 
245   PetscFunctionBegin;
246   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
247   PetscFVPackageInitialized = PETSC_TRUE;
248 
249   /* Register Classes */
250   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
251   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
252 
253   /* Register Constructors */
254   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
255   /* Register Events */
256   /* Process info exclusions */
257   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
258   if (opt) {
259     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
260     if (className) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
261     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
262     if (className) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
263   }
264   /* Process summary exclusions */
265   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
266   if (opt) {
267     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
268     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
269     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
270     if (className) {ierr = PetscLogEventDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
271   }
272   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
273   PetscFunctionReturn(0);
274 }
275 #include <petscds.h>
276 
277 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
278 /*@C
279   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
280   from PetscFinalize().
281 
282   Level: developer
283 
284 .keywords: PetscDS, initialize, package
285 .seealso: PetscInitialize()
286 @*/
287 PetscErrorCode PetscDSFinalizePackage(void)
288 {
289   PetscErrorCode ierr;
290 
291   PetscFunctionBegin;
292   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
293   PetscDSPackageInitialized = PETSC_FALSE;
294   PetscDSRegisterAllCalled  = PETSC_FALSE;
295   PetscFunctionReturn(0);
296 }
297 
298 /*@C
299   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
300   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
301   when using static libraries.
302 
303   Level: developer
304 
305 .keywords: PetscDS, initialize, package
306 .seealso: PetscInitialize()
307 @*/
308 PetscErrorCode PetscDSInitializePackage(void)
309 {
310   char           logList[256];
311   char          *className;
312   PetscBool      opt;
313   PetscErrorCode ierr;
314 
315   PetscFunctionBegin;
316   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
317   PetscDSPackageInitialized = PETSC_TRUE;
318 
319   /* Register Classes */
320   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
321 
322   /* Register Constructors */
323   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
324   /* Register Events */
325   /* Process info exclusions */
326   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
327   if (opt) {
328     ierr = PetscStrstr(logList, "ds", &className);CHKERRQ(ierr);
329     if (className) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
330   }
331   /* Process summary exclusions */
332   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
333   if (opt) {
334     ierr = PetscStrstr(logList, "ds", &className);CHKERRQ(ierr);
335     if (className) {ierr = PetscLogEventDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
336   }
337   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
338   PetscFunctionReturn(0);
339 }
340 
341 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
342 /*
343   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
344 
345   This one registers all the mesh generators and partitioners that are in
346   the basic DM library.
347 
348 */
349 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
350 {
351   PetscErrorCode ierr;
352 
353   PetscFunctionBegin;
354   ierr = AOInitializePackage();CHKERRQ(ierr);
355   ierr = DMInitializePackage();CHKERRQ(ierr);
356   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
357   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
358   PetscFunctionReturn(0);
359 }
360 
361 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
362