xref: /petsc/src/dm/interface/dlregisdmdm.c (revision e51df6f4c9ea09392f98b7232eead1ff02269759)
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("DMPlexInterpSF",         DM_CLASSID,&DMPLEX_InterpolateSF);CHKERRQ(ierr);
94   ierr = PetscLogEventRegister("DMPlexGToNBegin",        DM_CLASSID,&DMPLEX_GlobalToNaturalBegin);CHKERRQ(ierr);
95   ierr = PetscLogEventRegister("DMPlexGToNEnd",          DM_CLASSID,&DMPLEX_GlobalToNaturalEnd);CHKERRQ(ierr);
96   ierr = PetscLogEventRegister("DMPlexNToGBegin",        DM_CLASSID,&DMPLEX_NaturalToGlobalBegin);CHKERRQ(ierr);
97   ierr = PetscLogEventRegister("DMPlexNToGEnd",          DM_CLASSID,&DMPLEX_NaturalToGlobalEnd);CHKERRQ(ierr);
98   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
99   ierr = PetscLogEventRegister("DMPlexPrealloc",         DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr);
100   ierr = PetscLogEventRegister("DMPlexResidualFE",       DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
101   ierr = PetscLogEventRegister("DMPlexJacobianFE",       DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
102   ierr = PetscLogEventRegister("DMPlexInterpFE",         DM_CLASSID,&DMPLEX_InterpolatorFEM);CHKERRQ(ierr);
103   ierr = PetscLogEventRegister("DMPlexInjectorFE",       DM_CLASSID,&DMPLEX_InjectorFEM);CHKERRQ(ierr);
104   ierr = PetscLogEventRegister("DMPlexIntegralFEM",      DM_CLASSID,&DMPLEX_IntegralFEM);CHKERRQ(ierr);
105   ierr = PetscLogEventRegister("DMPlexCreateGmsh",       DM_CLASSID,&DMPLEX_CreateGmsh);CHKERRQ(ierr);
106   /* Process info exclusions */
107   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
108   if (opt) {
109     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
110     if (className) {
111       ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
112     }
113   }
114   /* Process summary exclusions */
115   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
116   if (opt) {
117     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
118     if (className) {
119       ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
120     }
121   }
122   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
123   PetscFunctionReturn(0);
124 }
125 #include <petscfe.h>
126 
127 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
128 #undef __FUNCT__
129 #define __FUNCT__ "PetscFEFinalizePackage"
130 /*@C
131   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
132   from PetscFinalize().
133 
134   Level: developer
135 
136 .keywords: PetscFE, initialize, package
137 .seealso: PetscInitialize()
138 @*/
139 PetscErrorCode PetscFEFinalizePackage(void)
140 {
141   PetscErrorCode ierr;
142 
143   PetscFunctionBegin;
144   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
145   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
146   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
147   PetscFEPackageInitialized       = PETSC_FALSE;
148   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
149   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
150   PetscFERegisterAllCalled        = PETSC_FALSE;
151   PetscFunctionReturn(0);
152 }
153 
154 #undef __FUNCT__
155 #define __FUNCT__ "PetscFEInitializePackage"
156 /*@C
157   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
158   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
159   when using static libraries.
160 
161   Level: developer
162 
163 .keywords: PetscFE, initialize, package
164 .seealso: PetscInitialize()
165 @*/
166 PetscErrorCode PetscFEInitializePackage(void)
167 {
168   char           logList[256];
169   char          *className;
170   PetscBool      opt;
171   PetscErrorCode ierr;
172 
173   PetscFunctionBegin;
174   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
175   PetscFEPackageInitialized = PETSC_TRUE;
176 
177   /* Register Classes */
178   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
179   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
180   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
181 
182   /* Register Constructors */
183   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
184   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
185   ierr = PetscFERegisterAll();CHKERRQ(ierr);
186   /* Register Events */
187   /* Process info exclusions */
188   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
189   if (opt) {
190     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
191     if (className) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
192   }
193   /* Process summary exclusions */
194   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
195   if (opt) {
196     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
197     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
198   }
199   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
200   PetscFunctionReturn(0);
201 }
202 #include <petscfv.h>
203 
204 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
205 #undef __FUNCT__
206 #define __FUNCT__ "PetscFVFinalizePackage"
207 /*@C
208   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
209   from PetscFinalize().
210 
211   Level: developer
212 
213 .keywords: PetscFV, initialize, package
214 .seealso: PetscInitialize()
215 @*/
216 PetscErrorCode PetscFVFinalizePackage(void)
217 {
218   PetscErrorCode ierr;
219 
220   PetscFunctionBegin;
221   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
222   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
223   PetscFVPackageInitialized     = PETSC_FALSE;
224   PetscFVRegisterAllCalled      = PETSC_FALSE;
225   PetscLimiterRegisterAllCalled = PETSC_FALSE;
226   PetscFunctionReturn(0);
227 }
228 
229 #undef __FUNCT__
230 #define __FUNCT__ "PetscFVInitializePackage"
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   char          *className;
245   PetscBool      opt;
246   PetscErrorCode ierr;
247 
248   PetscFunctionBegin;
249   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
250   PetscFVPackageInitialized = PETSC_TRUE;
251 
252   /* Register Classes */
253   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
254   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
255 
256   /* Register Constructors */
257   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
258   /* Register Events */
259   /* Process info exclusions */
260   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
261   if (opt) {
262     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
263     if (className) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
264     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
265     if (className) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
266   }
267   /* Process summary exclusions */
268   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
269   if (opt) {
270     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
271     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
272     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
273     if (className) {ierr = PetscLogEventDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
274   }
275   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
276   PetscFunctionReturn(0);
277 }
278 #include <petscds.h>
279 
280 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
281 #undef __FUNCT__
282 #define __FUNCT__ "PetscDSFinalizePackage"
283 /*@C
284   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
285   from PetscFinalize().
286 
287   Level: developer
288 
289 .keywords: PetscDS, initialize, package
290 .seealso: PetscInitialize()
291 @*/
292 PetscErrorCode PetscDSFinalizePackage(void)
293 {
294   PetscErrorCode ierr;
295 
296   PetscFunctionBegin;
297   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
298   PetscDSPackageInitialized = PETSC_FALSE;
299   PetscDSRegisterAllCalled  = PETSC_FALSE;
300   PetscFunctionReturn(0);
301 }
302 
303 #undef __FUNCT__
304 #define __FUNCT__ "PetscDSInitializePackage"
305 /*@C
306   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
307   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
308   when using static libraries.
309 
310   Level: developer
311 
312 .keywords: PetscDS, initialize, package
313 .seealso: PetscInitialize()
314 @*/
315 PetscErrorCode PetscDSInitializePackage(void)
316 {
317   char           logList[256];
318   char          *className;
319   PetscBool      opt;
320   PetscErrorCode ierr;
321 
322   PetscFunctionBegin;
323   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
324   PetscDSPackageInitialized = PETSC_TRUE;
325 
326   /* Register Classes */
327   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
328 
329   /* Register Constructors */
330   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
331   /* Register Events */
332   /* Process info exclusions */
333   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
334   if (opt) {
335     ierr = PetscStrstr(logList, "ds", &className);CHKERRQ(ierr);
336     if (className) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
337   }
338   /* Process summary exclusions */
339   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
340   if (opt) {
341     ierr = PetscStrstr(logList, "ds", &className);CHKERRQ(ierr);
342     if (className) {ierr = PetscLogEventDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
343   }
344   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
345   PetscFunctionReturn(0);
346 }
347 
348 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
349 #undef __FUNCT__
350 #define __FUNCT__ "PetscDLLibraryRegister_petscdm"
351 /*
352   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
353 
354   This one registers all the mesh generators and partitioners that are in
355   the basic DM library.
356 
357 */
358 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
359 {
360   PetscErrorCode ierr;
361 
362   PetscFunctionBegin;
363   ierr = AOInitializePackage();CHKERRQ(ierr);
364   ierr = DMInitializePackage();CHKERRQ(ierr);
365   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
366   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
367   PetscFunctionReturn(0);
368 }
369 
370 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
371