xref: /petsc/src/dm/interface/dlregisdmdm.c (revision 4d1a973fe17c9234e2cf908ebb478400f033ef22)
1 
2 #include <petsc/private/dmlabelimpl.h>
3 #include <petsc/private/dmfieldimpl.h>
4 #include <petsc/private/dmdaimpl.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   char           *className;
53   PetscBool      opt;
54   PetscErrorCode ierr;
55 
56   PetscFunctionBegin;
57   if (DMPackageInitialized) PetscFunctionReturn(0);
58   DMPackageInitialized = PETSC_TRUE;
59 
60   /* Register Classes */
61   ierr = PetscClassIdRegister("Distributed Mesh",&DM_CLASSID);CHKERRQ(ierr);
62   ierr = PetscClassIdRegister("GraphPartitioner",&PETSCPARTITIONER_CLASSID);CHKERRQ(ierr);
63 
64 #if defined(PETSC_HAVE_HYPRE)
65   ierr = MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct);CHKERRQ(ierr);
66   ierr = MatRegister(MATHYPRESSTRUCT, MatCreate_HYPRESStruct);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 
107   ierr = PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr);
108   ierr = PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr);
109   ierr = PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr);
110   ierr = PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr);
111   ierr = PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr);
112   ierr = PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr);
113   ierr = PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr);
114   ierr = PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr);
115   ierr = PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr);
116   ierr = PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr);
117 
118   /* Process info exclusions */
119   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
120   if (opt) {
121     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
122     if (className) {
123       ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
124     }
125   }
126   /* Process summary exclusions */
127   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
128   if (opt) {
129     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
130     if (className) {
131       ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
132     }
133   }
134   ierr = DMPlexGenerateRegisterAll();CHKERRQ(ierr);
135   ierr = PetscRegisterFinalize(DMPlexGenerateRegisterDestroy);CHKERRQ(ierr);
136   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
137   PetscFunctionReturn(0);
138 }
139 #include <petscfe.h>
140 
141 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
142 /*@C
143   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
144   from PetscFinalize().
145 
146   Level: developer
147 
148 .keywords: PetscFE, initialize, package
149 .seealso: PetscInitialize()
150 @*/
151 PetscErrorCode PetscFEFinalizePackage(void)
152 {
153   PetscErrorCode ierr;
154 
155   PetscFunctionBegin;
156   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
157   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
158   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
159   PetscFEPackageInitialized       = PETSC_FALSE;
160   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
161   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
162   PetscFERegisterAllCalled        = PETSC_FALSE;
163   PetscFunctionReturn(0);
164 }
165 
166 /*@C
167   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
168   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
169   when using static libraries.
170 
171   Level: developer
172 
173 .keywords: PetscFE, initialize, package
174 .seealso: PetscInitialize()
175 @*/
176 PetscErrorCode PetscFEInitializePackage(void)
177 {
178   char           logList[256];
179   char          *className;
180   PetscBool      opt;
181   PetscErrorCode ierr;
182 
183   PetscFunctionBegin;
184   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
185   PetscFEPackageInitialized = PETSC_TRUE;
186 
187   /* Register Classes */
188   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
189   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
190   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
191 
192   /* Register Constructors */
193   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
194   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
195   ierr = PetscFERegisterAll();CHKERRQ(ierr);
196   /* Register Events */
197   /* Process info exclusions */
198   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
199   if (opt) {
200     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
201     if (className) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
202   }
203   /* Process summary exclusions */
204   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
205   if (opt) {
206     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
207     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
208   }
209   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
210   PetscFunctionReturn(0);
211 }
212 #include <petscfv.h>
213 
214 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
215 /*@C
216   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
217   from PetscFinalize().
218 
219   Level: developer
220 
221 .keywords: PetscFV, initialize, package
222 .seealso: PetscInitialize()
223 @*/
224 PetscErrorCode PetscFVFinalizePackage(void)
225 {
226   PetscErrorCode ierr;
227 
228   PetscFunctionBegin;
229   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
230   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
231   PetscFVPackageInitialized     = PETSC_FALSE;
232   PetscFVRegisterAllCalled      = PETSC_FALSE;
233   PetscLimiterRegisterAllCalled = PETSC_FALSE;
234   PetscFunctionReturn(0);
235 }
236 
237 /*@C
238   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
239   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
240   when using static libraries.
241 
242   Level: developer
243 
244 .keywords: PetscFV, initialize, package
245 .seealso: PetscInitialize()
246 @*/
247 PetscErrorCode PetscFVInitializePackage(void)
248 {
249   char           logList[256];
250   char          *className;
251   PetscBool      opt;
252   PetscErrorCode ierr;
253 
254   PetscFunctionBegin;
255   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
256   PetscFVPackageInitialized = PETSC_TRUE;
257 
258   /* Register Classes */
259   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
260   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
261 
262   /* Register Constructors */
263   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
264   /* Register Events */
265   /* Process info exclusions */
266   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
267   if (opt) {
268     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
269     if (className) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
270     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
271     if (className) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
272   }
273   /* Process summary exclusions */
274   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
275   if (opt) {
276     ierr = PetscStrstr(logList, "fv", &className);CHKERRQ(ierr);
277     if (className) {ierr = PetscLogEventDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
278     ierr = PetscStrstr(logList, "limiter", &className);CHKERRQ(ierr);
279     if (className) {ierr = PetscLogEventDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
280   }
281   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
282   PetscFunctionReturn(0);
283 }
284 #include <petscds.h>
285 
286 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
287 /*@C
288   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
289   from PetscFinalize().
290 
291   Level: developer
292 
293 .keywords: PetscDS, initialize, package
294 .seealso: PetscInitialize()
295 @*/
296 PetscErrorCode PetscDSFinalizePackage(void)
297 {
298   PetscErrorCode ierr;
299 
300   PetscFunctionBegin;
301   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
302   PetscDSPackageInitialized = PETSC_FALSE;
303   PetscDSRegisterAllCalled  = PETSC_FALSE;
304   PetscFunctionReturn(0);
305 }
306 
307 /*@C
308   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
309   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
310   when using static libraries.
311 
312   Level: developer
313 
314 .keywords: PetscDS, initialize, package
315 .seealso: PetscInitialize()
316 @*/
317 PetscErrorCode PetscDSInitializePackage(void)
318 {
319   char           logList[256];
320   char          *className;
321   PetscBool      opt;
322   PetscErrorCode ierr;
323 
324   PetscFunctionBegin;
325   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
326   PetscDSPackageInitialized = PETSC_TRUE;
327 
328   /* Register Classes */
329   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
330 
331   /* Register Constructors */
332   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
333   /* Register Events */
334   /* Process info exclusions */
335   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
336   if (opt) {
337     ierr = PetscStrstr(logList, "ds", &className);CHKERRQ(ierr);
338     if (className) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
339   }
340   /* Process summary exclusions */
341   ierr = PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);CHKERRQ(ierr);
342   if (opt) {
343     ierr = PetscStrstr(logList, "ds", &className);CHKERRQ(ierr);
344     if (className) {ierr = PetscLogEventDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
345   }
346   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
347   PetscFunctionReturn(0);
348 }
349 
350 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
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   ierr = DMFieldInitializePackage();CHKERRQ(ierr);
368   PetscFunctionReturn(0);
369 }
370 
371 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
372