xref: /petsc/src/dm/interface/dlregisdmdm.c (revision c688d0420b4e513ff34944d1e1ad7d4e50aafa8d)
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 
9 static PetscBool DMPackageInitialized = PETSC_FALSE;
10 #undef __FUNCT__
11 #define __FUNCT__ "DMFinalizePackage"
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 #endif
37 
38 #undef __FUNCT__
39 #define __FUNCT__ "DMInitializePackage"
40 /*@C
41   DMInitializePackage - This function initializes everything in the DM package. It is called
42   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to AOCreate()
43   or DMDACreate() when using static libraries.
44 
45   Level: developer
46 
47 .keywords: AO, initialize, package
48 .seealso: PetscInitialize()
49 @*/
50 PetscErrorCode  DMInitializePackage(void)
51 {
52   char           logList[256];
53   char           *className;
54   PetscBool      opt;
55   PetscErrorCode ierr;
56 
57   PetscFunctionBegin;
58   if (DMPackageInitialized) PetscFunctionReturn(0);
59   DMPackageInitialized = PETSC_TRUE;
60 
61   /* Register Classes */
62   ierr = PetscClassIdRegister("Distributed Mesh",&DM_CLASSID);CHKERRQ(ierr);
63   ierr = PetscClassIdRegister("GraphPartitioner",&PETSCPARTITIONER_CLASSID);CHKERRQ(ierr);
64 
65 #if defined(PETSC_HAVE_HYPRE)
66   ierr = MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct);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("DMDALocalADFunc",        DM_CLASSID,&DMDA_LocalADFunction);CHKERRQ(ierr);
82 
83   ierr = PetscLogEventRegister("Mesh Partition",         PETSCPARTITIONER_CLASSID,&PETSCPARTITIONER_Partition);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("Mesh Migration",         DM_CLASSID,&DMPLEX_Migrate);CHKERRQ(ierr);
85   ierr = PetscLogEventRegister("DMPlexInterp",           DM_CLASSID,&DMPLEX_Interpolate);CHKERRQ(ierr);
86   ierr = PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("DMPlexDistCones",        DM_CLASSID,&DMPLEX_DistributeCones);CHKERRQ(ierr);
88   ierr = PetscLogEventRegister("DMPlexDistLabels",       DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr);
89   ierr = PetscLogEventRegister("DMPlexDistribSF",        DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
90   ierr = PetscLogEventRegister("DMPlexDistribOL",        DM_CLASSID,&DMPLEX_DistributeOverlap);CHKERRQ(ierr);
91   ierr = PetscLogEventRegister("DMPlexDistField",        DM_CLASSID,&DMPLEX_DistributeField);CHKERRQ(ierr);
92   ierr = PetscLogEventRegister("DMPlexDistData",         DM_CLASSID,&DMPLEX_DistributeData);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   /* Process info exclusions */
106   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
107   if (opt) {
108     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
109     if (className) {
110       ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
111     }
112   }
113   /* Process summary exclusions */
114   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
115   if (opt) {
116     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
117     if (className) {
118       ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
119     }
120   }
121   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
122   PetscFunctionReturn(0);
123 }
124 #include <petscfe.h>
125 
126 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
127 #undef __FUNCT__
128 #define __FUNCT__ "PetscFEFinalizePackage"
129 /*@C
130   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
131   from PetscFinalize().
132 
133   Level: developer
134 
135 .keywords: PetscFE, initialize, package
136 .seealso: PetscInitialize()
137 @*/
138 PetscErrorCode PetscFEFinalizePackage(void)
139 {
140   PetscErrorCode ierr;
141 
142   PetscFunctionBegin;
143   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
144   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
145   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
146   PetscFEPackageInitialized       = PETSC_FALSE;
147   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
148   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
149   PetscFERegisterAllCalled        = PETSC_FALSE;
150   PetscFunctionReturn(0);
151 }
152 
153 #undef __FUNCT__
154 #define __FUNCT__ "PetscFEInitializePackage"
155 /*@C
156   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
157   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
158   when using static libraries.
159 
160   Level: developer
161 
162 .keywords: PetscFE, initialize, package
163 .seealso: PetscInitialize()
164 @*/
165 PetscErrorCode PetscFEInitializePackage(void)
166 {
167   char           logList[256];
168   char          *className;
169   PetscBool      opt;
170   PetscErrorCode ierr;
171 
172   PetscFunctionBegin;
173   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
174   PetscFEPackageInitialized = PETSC_TRUE;
175 
176   /* Register Classes */
177   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
178   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
179   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
180 
181   /* Register Constructors */
182   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
183   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
184   ierr = PetscFERegisterAll();CHKERRQ(ierr);
185   /* Register Events */
186   /* Process info exclusions */
187   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
188   if (opt) {
189     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
190     if (className) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
191   }
192   /* Process summary exclusions */
193   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
194   if (opt) {
195     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
196     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
197   }
198   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
199   PetscFunctionReturn(0);
200 }
201 #include <petscfv.h>
202 
203 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
204 #undef __FUNCT__
205 #define __FUNCT__ "PetscFVFinalizePackage"
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 #undef __FUNCT__
229 #define __FUNCT__ "PetscFVInitializePackage"
230 /*@C
231   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
232   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
233   when using static libraries.
234 
235   Level: developer
236 
237 .keywords: PetscFV, initialize, package
238 .seealso: PetscInitialize()
239 @*/
240 PetscErrorCode PetscFVInitializePackage(void)
241 {
242   char           logList[256];
243   char          *className;
244   PetscBool      opt;
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 
255   /* Register Constructors */
256   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
257   /* Register Events */
258   /* Process info exclusions */
259   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
260   if (opt) {
261     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
262     if (className) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
263     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
264     if (className) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
265   }
266   /* Process summary exclusions */
267   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
268   if (opt) {
269     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
270     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
271     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
272     if (className) {ierr = PetscLogEventDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
273   }
274   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
275   PetscFunctionReturn(0);
276 }
277 #include <petscds.h>
278 
279 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
280 #undef __FUNCT__
281 #define __FUNCT__ "PetscDSFinalizePackage"
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 #undef __FUNCT__
303 #define __FUNCT__ "PetscDSInitializePackage"
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 #undef __FUNCT__
349 #define __FUNCT__ "PetscDLLibraryRegister_petscdm"
350 /*
351   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
352 
353   This one registers all the mesh generators and partitioners that are in
354   the basic DM library.
355 
356 */
357 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
358 {
359   PetscErrorCode ierr;
360 
361   PetscFunctionBegin;
362   ierr = AOInitializePackage();CHKERRQ(ierr);
363   ierr = DMInitializePackage();CHKERRQ(ierr);
364   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
365   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
366   PetscFunctionReturn(0);
367 }
368 
369 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
370