xref: /petsc/src/dm/interface/dlregisdmdm.c (revision feff33ee0b5b037fa8f9f294dede656a2f85cc47)
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   PetscBool      opt,pkg;
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   ierr = MatRegister(MATHYPRESSTRUCT, MatCreate_HYPRESStruct);CHKERRQ(ierr);
65 #endif
66   ierr = PetscSectionSymRegister(PETSCSECTIONSYMLABEL,PetscSectionSymCreate_Label);CHKERRQ(ierr);
67 
68   /* Register Constructors */
69   ierr = DMRegisterAll();CHKERRQ(ierr);
70   /* Register Events */
71   ierr = PetscLogEventRegister("DMConvert",              DM_CLASSID,&DM_Convert);CHKERRQ(ierr);
72   ierr = PetscLogEventRegister("DMGlobalToLocal",        DM_CLASSID,&DM_GlobalToLocal);CHKERRQ(ierr);
73   ierr = PetscLogEventRegister("DMLocalToGlobal",        DM_CLASSID,&DM_LocalToGlobal);CHKERRQ(ierr);
74   ierr = PetscLogEventRegister("DMLocatePoints",         DM_CLASSID,&DM_LocatePoints);CHKERRQ(ierr);
75   ierr = PetscLogEventRegister("DMCoarsen",              DM_CLASSID,&DM_Coarsen);CHKERRQ(ierr);
76   ierr = PetscLogEventRegister("DMCreateInterp",         DM_CLASSID,&DM_CreateInterpolation);CHKERRQ(ierr);
77   ierr = PetscLogEventRegister("DMCreateRestrict",       DM_CLASSID,&DM_CreateRestriction);CHKERRQ(ierr);
78 
79   ierr = PetscLogEventRegister("DMDALocalADFunc",        DM_CLASSID,&DMDA_LocalADFunction);CHKERRQ(ierr);
80 
81   ierr = PetscLogEventRegister("Mesh Partition",         PETSCPARTITIONER_CLASSID,&PETSCPARTITIONER_Partition);CHKERRQ(ierr);
82   ierr = PetscLogEventRegister("Mesh Migration",         DM_CLASSID,&DMPLEX_Migrate);CHKERRQ(ierr);
83   ierr = PetscLogEventRegister("DMPlexInterp",           DM_CLASSID,&DMPLEX_Interpolate);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr);
85   ierr = PetscLogEventRegister("DMPlexDistCones",        DM_CLASSID,&DMPLEX_DistributeCones);CHKERRQ(ierr);
86   ierr = PetscLogEventRegister("DMPlexDistLabels",       DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("DMPlexDistribSF",        DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
88   ierr = PetscLogEventRegister("DMPlexDistribOL",        DM_CLASSID,&DMPLEX_DistributeOverlap);CHKERRQ(ierr);
89   ierr = PetscLogEventRegister("DMPlexDistField",        DM_CLASSID,&DMPLEX_DistributeField);CHKERRQ(ierr);
90   ierr = PetscLogEventRegister("DMPlexDistData",         DM_CLASSID,&DMPLEX_DistributeData);CHKERRQ(ierr);
91   ierr = PetscLogEventRegister("DMPlexInterpSF",         DM_CLASSID,&DMPLEX_InterpolateSF);CHKERRQ(ierr);
92   ierr = PetscLogEventRegister("DMPlexGToNBegin",        DM_CLASSID,&DMPLEX_GlobalToNaturalBegin);CHKERRQ(ierr);
93   ierr = PetscLogEventRegister("DMPlexGToNEnd",          DM_CLASSID,&DMPLEX_GlobalToNaturalEnd);CHKERRQ(ierr);
94   ierr = PetscLogEventRegister("DMPlexNToGBegin",        DM_CLASSID,&DMPLEX_NaturalToGlobalBegin);CHKERRQ(ierr);
95   ierr = PetscLogEventRegister("DMPlexNToGEnd",          DM_CLASSID,&DMPLEX_NaturalToGlobalEnd);CHKERRQ(ierr);
96   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
97   ierr = PetscLogEventRegister("DMPlexPrealloc",         DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr);
98   ierr = PetscLogEventRegister("DMPlexResidualFE",       DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
99   ierr = PetscLogEventRegister("DMPlexJacobianFE",       DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
100   ierr = PetscLogEventRegister("DMPlexInterpFE",         DM_CLASSID,&DMPLEX_InterpolatorFEM);CHKERRQ(ierr);
101   ierr = PetscLogEventRegister("DMPlexInjectorFE",       DM_CLASSID,&DMPLEX_InjectorFEM);CHKERRQ(ierr);
102   ierr = PetscLogEventRegister("DMPlexIntegralFEM",      DM_CLASSID,&DMPLEX_IntegralFEM);CHKERRQ(ierr);
103   ierr = PetscLogEventRegister("DMPlexCreateGmsh",       DM_CLASSID,&DMPLEX_CreateGmsh);CHKERRQ(ierr);
104 
105   ierr = PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr);
106   ierr = PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr);
107   ierr = PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr);
108   ierr = PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr);
109   ierr = PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr);
110   ierr = PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr);
111   ierr = PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr);
112   ierr = PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr);
113   ierr = PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr);
114   ierr = PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr);
115 
116   /* Process info exclusions */
117   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
118   if (opt) {
119     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
120     if (pkg) {ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);}
121   }
122 
123   /* Process summary exclusions */
124   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
125   if (opt) {
126     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
127     if (pkg) {ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);}
128   }
129 
130   ierr = DMPlexGenerateRegisterAll();CHKERRQ(ierr);
131   ierr = PetscRegisterFinalize(DMPlexGenerateRegisterDestroy);CHKERRQ(ierr);
132   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
133   PetscFunctionReturn(0);
134 }
135 #include <petscfe.h>
136 
137 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
138 /*@C
139   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
140   from PetscFinalize().
141 
142   Level: developer
143 
144 .keywords: PetscFE, initialize, package
145 .seealso: PetscInitialize()
146 @*/
147 PetscErrorCode PetscFEFinalizePackage(void)
148 {
149   PetscErrorCode ierr;
150 
151   PetscFunctionBegin;
152   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
153   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
154   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
155   PetscFEPackageInitialized       = PETSC_FALSE;
156   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
157   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
158   PetscFERegisterAllCalled        = PETSC_FALSE;
159   PetscFunctionReturn(0);
160 }
161 
162 /*@C
163   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
164   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
165   when using static libraries.
166 
167   Level: developer
168 
169 .keywords: PetscFE, initialize, package
170 .seealso: PetscInitialize()
171 @*/
172 PetscErrorCode PetscFEInitializePackage(void)
173 {
174   char           logList[256];
175   PetscBool      opt,pkg;
176   PetscErrorCode ierr;
177 
178   PetscFunctionBegin;
179   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
180   PetscFEPackageInitialized = PETSC_TRUE;
181 
182   /* Register Classes */
183   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
184   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
185   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
186   /* Register Constructors */
187   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
188   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
189   ierr = PetscFERegisterAll();CHKERRQ(ierr);
190   /* Register Events */
191   /* Process info exclusions */
192   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
193   if (opt) {
194     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
195     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
196   }
197   /* Process summary exclusions */
198   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
199   if (opt) {
200     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
201     if (pkg) {ierr = PetscLogEventDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
202   }
203   /* Register package finalizer */
204   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
205   PetscFunctionReturn(0);
206 }
207 #include <petscfv.h>
208 
209 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
210 /*@C
211   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
212   from PetscFinalize().
213 
214   Level: developer
215 
216 .keywords: PetscFV, initialize, package
217 .seealso: PetscInitialize()
218 @*/
219 PetscErrorCode PetscFVFinalizePackage(void)
220 {
221   PetscErrorCode ierr;
222 
223   PetscFunctionBegin;
224   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
225   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
226   PetscFVPackageInitialized     = PETSC_FALSE;
227   PetscFVRegisterAllCalled      = PETSC_FALSE;
228   PetscLimiterRegisterAllCalled = PETSC_FALSE;
229   PetscFunctionReturn(0);
230 }
231 
232 /*@C
233   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
234   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
235   when using static libraries.
236 
237   Level: developer
238 
239 .keywords: PetscFV, initialize, package
240 .seealso: PetscInitialize()
241 @*/
242 PetscErrorCode PetscFVInitializePackage(void)
243 {
244   char           logList[256];
245   PetscBool      opt,pkg;
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   /* Register Constructors */
256   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
257   /* Register Events */
258   /* Process info exclusions */
259   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
260   if (opt) {
261     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
262     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
263     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
264     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
265   }
266   /* Process summary exclusions */
267   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
268   if (opt) {
269     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
270     if (pkg) {ierr = PetscLogEventDeactivateClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
271     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
272     if (pkg) {ierr = PetscLogEventDeactivateClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
273   }
274   /* Register package finalizer */
275   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
276   PetscFunctionReturn(0);
277 }
278 #include <petscds.h>
279 
280 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
281 /*@C
282   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
283   from PetscFinalize().
284 
285   Level: developer
286 
287 .keywords: PetscDS, initialize, package
288 .seealso: PetscInitialize()
289 @*/
290 PetscErrorCode PetscDSFinalizePackage(void)
291 {
292   PetscErrorCode ierr;
293 
294   PetscFunctionBegin;
295   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
296   PetscDSPackageInitialized = PETSC_FALSE;
297   PetscDSRegisterAllCalled  = PETSC_FALSE;
298   PetscFunctionReturn(0);
299 }
300 
301 /*@C
302   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
303   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
304   when using static libraries.
305 
306   Level: developer
307 
308 .keywords: PetscDS, initialize, package
309 .seealso: PetscInitialize()
310 @*/
311 PetscErrorCode PetscDSInitializePackage(void)
312 {
313   char           logList[256];
314   PetscBool      opt,pkg;
315   PetscErrorCode ierr;
316 
317   PetscFunctionBegin;
318   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
319   PetscDSPackageInitialized = PETSC_TRUE;
320 
321   /* Register Classes */
322   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
323   /* Register Constructors */
324   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
325   /* Register Events */
326   /* Process info exclusions */
327   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
328   if (opt) {
329     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
330     if (pkg) {ierr = PetscInfoDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
331   }
332   /* Process summary exclusions */
333   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
334   if (opt) {
335     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
336     if (pkg) {ierr = PetscLogEventDeactivateClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
337   }
338   /* Register package finalizer */
339   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
340   PetscFunctionReturn(0);
341 }
342 
343 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
344 /*
345   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
346 
347   This one registers all the mesh generators and partitioners that are in
348   the basic DM library.
349 
350 */
351 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
352 {
353   PetscErrorCode ierr;
354 
355   PetscFunctionBegin;
356   ierr = AOInitializePackage();CHKERRQ(ierr);
357   ierr = DMInitializePackage();CHKERRQ(ierr);
358   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
359   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
360   PetscFunctionReturn(0);
361 }
362 
363 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
364