xref: /petsc/src/dm/interface/dlregisdmdm.c (revision 4e278199b78715991f5c71ebbd945c1489263e6c)
1 
2 #include <petscao.h>
3 #include <petsc/private/dmlabelimpl.h>
4 #include <petsc/private/dmfieldimpl.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 .seealso: PetscInitialize()
19 @*/
20 PetscErrorCode  DMFinalizePackage(void)
21 {
22   PetscErrorCode ierr;
23 
24   PetscFunctionBegin;
25   ierr = PetscFunctionListDestroy(&DMList);CHKERRQ(ierr);
26   DMPackageInitialized = PETSC_FALSE;
27   DMRegisterAllCalled  = PETSC_FALSE;
28   PetscFunctionReturn(0);
29 }
30 
31 #if defined(PETSC_HAVE_HYPRE)
32 PETSC_EXTERN PetscErrorCode MatCreate_HYPREStruct(Mat);
33 PETSC_EXTERN PetscErrorCode MatCreate_HYPRESStruct(Mat);
34 #endif
35 
36 /*@C
37   DMInitializePackage - This function initializes everything in the DM package. It is called
38   from PetscDLLibraryRegister_petscdm() when using dynamic libraries, and on the first call to AOCreate()
39   or DMDACreate() when using shared or static libraries.
40 
41   Level: developer
42 
43 .seealso: PetscInitialize()
44 @*/
45 PetscErrorCode  DMInitializePackage(void)
46 {
47   char           logList[256];
48   PetscBool      opt,pkg;
49   PetscErrorCode ierr;
50 
51   PetscFunctionBegin;
52   if (DMPackageInitialized) PetscFunctionReturn(0);
53   DMPackageInitialized = PETSC_TRUE;
54 
55   /* Register Classes */
56   ierr = PetscClassIdRegister("Distributed Mesh",&DM_CLASSID);CHKERRQ(ierr);
57   ierr = PetscClassIdRegister("DM Label",&DMLABEL_CLASSID);CHKERRQ(ierr);
58   ierr = PetscClassIdRegister("Quadrature",&PETSCQUADRATURE_CLASSID);CHKERRQ(ierr);
59 
60 #if defined(PETSC_HAVE_HYPRE)
61   ierr = MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct);CHKERRQ(ierr);
62   ierr = MatRegister(MATHYPRESSTRUCT, MatCreate_HYPRESStruct);CHKERRQ(ierr);
63 #endif
64   ierr = PetscSectionSymRegister(PETSCSECTIONSYMLABEL,PetscSectionSymCreate_Label);CHKERRQ(ierr);
65 
66   /* Register Constructors */
67   ierr = DMRegisterAll();CHKERRQ(ierr);
68   /* Register Events */
69   ierr = PetscLogEventRegister("DMConvert",              DM_CLASSID,&DM_Convert);CHKERRQ(ierr);
70   ierr = PetscLogEventRegister("DMGlobalToLocal",        DM_CLASSID,&DM_GlobalToLocal);CHKERRQ(ierr);
71   ierr = PetscLogEventRegister("DMLocalToGlobal",        DM_CLASSID,&DM_LocalToGlobal);CHKERRQ(ierr);
72   ierr = PetscLogEventRegister("DMLocatePoints",         DM_CLASSID,&DM_LocatePoints);CHKERRQ(ierr);
73   ierr = PetscLogEventRegister("DMCoarsen",              DM_CLASSID,&DM_Coarsen);CHKERRQ(ierr);
74   ierr = PetscLogEventRegister("DMCreateInterp",         DM_CLASSID,&DM_CreateInterpolation);CHKERRQ(ierr);
75   ierr = PetscLogEventRegister("DMCreateRestrict",       DM_CLASSID,&DM_CreateRestriction);CHKERRQ(ierr);
76   ierr = PetscLogEventRegister("DMCreateInject",         DM_CLASSID,&DM_CreateInjection);CHKERRQ(ierr);
77   ierr = PetscLogEventRegister("DMCreateMat",            DM_CLASSID,&DM_CreateMatrix);CHKERRQ(ierr);
78   ierr = PetscLogEventRegister("DMLoad",                 DM_CLASSID,&DM_Load);CHKERRQ(ierr);
79   ierr = PetscLogEventRegister("DMAdaptInterp",          DM_CLASSID,&DM_AdaptInterpolator);CHKERRQ(ierr);
80 
81   ierr = PetscLogEventRegister("DMPlexBuFrCeLi",         DM_CLASSID,&DMPLEX_BuildFromCellList);CHKERRQ(ierr);
82   ierr = PetscLogEventRegister("DMPlexBuCoFrCeLi",       DM_CLASSID,&DMPLEX_BuildCoordinatesFromCellList);CHKERRQ(ierr);
83   ierr = PetscLogEventRegister("DMPlexCreateGmsh",       DM_CLASSID,&DMPLEX_CreateGmsh);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("DMPlexCrFromFile",       DM_CLASSID,&DMPLEX_CreateFromFile);CHKERRQ(ierr);
85   ierr = PetscLogEventRegister("Mesh Partition",         DM_CLASSID,&DMPLEX_Partition);CHKERRQ(ierr);
86   ierr = PetscLogEventRegister("Mesh Migration",         DM_CLASSID,&DMPLEX_Migrate);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("DMPlexPartSelf",         DM_CLASSID,&DMPLEX_PartSelf);CHKERRQ(ierr);
88   ierr = PetscLogEventRegister("DMPlexPartLblInv",       DM_CLASSID,&DMPLEX_PartLabelInvert);CHKERRQ(ierr);
89   ierr = PetscLogEventRegister("DMPlexPartLblSF",        DM_CLASSID,&DMPLEX_PartLabelCreateSF);CHKERRQ(ierr);
90   ierr = PetscLogEventRegister("DMPlexPartStrtSF",       DM_CLASSID,&DMPLEX_PartStratSF);CHKERRQ(ierr);
91   ierr = PetscLogEventRegister("DMPlexPointSF",          DM_CLASSID,&DMPLEX_CreatePointSF);CHKERRQ(ierr);
92   ierr = PetscLogEventRegister("DMPlexInterp",           DM_CLASSID,&DMPLEX_Interpolate);CHKERRQ(ierr);
93   ierr = PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr);
94   ierr = PetscLogEventRegister("DMPlexDistCones",        DM_CLASSID,&DMPLEX_DistributeCones);CHKERRQ(ierr);
95   ierr = PetscLogEventRegister("DMPlexDistLabels",       DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr);
96   ierr = PetscLogEventRegister("DMPlexDistSF",           DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
97   ierr = PetscLogEventRegister("DMPlexDistOvrlp",        DM_CLASSID,&DMPLEX_DistributeOverlap);CHKERRQ(ierr);
98   ierr = PetscLogEventRegister("DMPlexDistField",        DM_CLASSID,&DMPLEX_DistributeField);CHKERRQ(ierr);
99   ierr = PetscLogEventRegister("DMPlexDistData",         DM_CLASSID,&DMPLEX_DistributeData);CHKERRQ(ierr);
100   ierr = PetscLogEventRegister("DMPlexInterpSF",         DM_CLASSID,&DMPLEX_InterpolateSF);CHKERRQ(ierr);
101   ierr = PetscLogEventRegister("DMPlexGToNBegin",        DM_CLASSID,&DMPLEX_GlobalToNaturalBegin);CHKERRQ(ierr);
102   ierr = PetscLogEventRegister("DMPlexGToNEnd",          DM_CLASSID,&DMPLEX_GlobalToNaturalEnd);CHKERRQ(ierr);
103   ierr = PetscLogEventRegister("DMPlexNToGBegin",        DM_CLASSID,&DMPLEX_NaturalToGlobalBegin);CHKERRQ(ierr);
104   ierr = PetscLogEventRegister("DMPlexNToGEnd",          DM_CLASSID,&DMPLEX_NaturalToGlobalEnd);CHKERRQ(ierr);
105   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
106   ierr = PetscLogEventRegister("DMPlexSymmetrize",       DM_CLASSID,&DMPLEX_Symmetrize);CHKERRQ(ierr);
107   ierr = PetscLogEventRegister("DMPlexPrealloc",         DM_CLASSID,&DMPLEX_Preallocate);CHKERRQ(ierr);
108   ierr = PetscLogEventRegister("DMPlexResidualFE",       DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
109   ierr = PetscLogEventRegister("DMPlexJacobianFE",       DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
110   ierr = PetscLogEventRegister("DMPlexInterpFE",         DM_CLASSID,&DMPLEX_InterpolatorFEM);CHKERRQ(ierr);
111   ierr = PetscLogEventRegister("DMPlexInjectorFE",       DM_CLASSID,&DMPLEX_InjectorFEM);CHKERRQ(ierr);
112   ierr = PetscLogEventRegister("DMPlexIntegralFEM",      DM_CLASSID,&DMPLEX_IntegralFEM);CHKERRQ(ierr);
113   ierr = PetscLogEventRegister("DMPlexRebalance",        DM_CLASSID,&DMPLEX_RebalanceSharedPoints);CHKERRQ(ierr);
114   ierr = PetscLogEventRegister("DMPlexLocatePoints",     DM_CLASSID,&DMPLEX_LocatePoints);CHKERRQ(ierr);
115 
116   ierr = PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr);
117   ierr = PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr);
118   ierr = PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr);
119   ierr = PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr);
120   ierr = PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr);
121   ierr = PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr);
122   ierr = PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr);
123   ierr = PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr);
124   ierr = PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr);
125   ierr = PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr);
126   /* Process Info */
127   {
128     PetscClassId  classids[1];
129 
130     classids[0] = DM_CLASSID;
131     ierr = PetscInfoProcessClass("dm", 1, classids);CHKERRQ(ierr);
132   }
133 
134   /* Process summary exclusions */
135   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
136   if (opt) {
137     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
138     if (pkg) {ierr = PetscLogEventExcludeClass(DM_CLASSID);CHKERRQ(ierr);}
139   }
140 
141   ierr = DMPlexGenerateRegisterAll();CHKERRQ(ierr);
142   ierr = PetscRegisterFinalize(DMPlexGenerateRegisterDestroy);CHKERRQ(ierr);
143   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
144   PetscFunctionReturn(0);
145 }
146 #include <petscfe.h>
147 
148 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
149 /*@C
150   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
151   from PetscFinalize().
152 
153   Level: developer
154 
155 .seealso: PetscInitialize()
156 @*/
157 PetscErrorCode PetscFEFinalizePackage(void)
158 {
159   PetscErrorCode ierr;
160 
161   PetscFunctionBegin;
162   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
163   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
164   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
165   PetscFEPackageInitialized       = PETSC_FALSE;
166   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
167   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
168   PetscFERegisterAllCalled        = PETSC_FALSE;
169   PetscFunctionReturn(0);
170 }
171 
172 /*@C
173   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
174   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
175   when using static libraries.
176 
177   Level: developer
178 
179 .seealso: PetscInitialize()
180 @*/
181 PetscErrorCode PetscFEInitializePackage(void)
182 {
183   char           logList[256];
184   PetscBool      opt,pkg;
185   PetscErrorCode ierr;
186 
187   PetscFunctionBegin;
188   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
189   PetscFEPackageInitialized = PETSC_TRUE;
190 
191   /* Register Classes */
192   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
193   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
194   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
195   /* Register Constructors */
196   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
197   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
198   ierr = PetscFERegisterAll();CHKERRQ(ierr);
199   /* Register Events */
200   ierr = PetscLogEventRegister("DualSpaceSetUp", PETSCDUALSPACE_CLASSID, &PETSCDUALSPACE_SetUp);CHKERRQ(ierr);
201   ierr = PetscLogEventRegister("FESetUp",        PETSCFE_CLASSID,        &PETSCFE_SetUp);CHKERRQ(ierr);
202   /* Process Info */
203   {
204     PetscClassId  classids[3];
205 
206     classids[0] = PETSCFE_CLASSID;
207     classids[1] = PETSCSPACE_CLASSID;
208     classids[2] = PETSCDUALSPACE_CLASSID;
209     ierr = PetscInfoProcessClass("fe", 1, classids);CHKERRQ(ierr);
210     ierr = PetscInfoProcessClass("space", 1, &classids[1]);CHKERRQ(ierr);
211     ierr = PetscInfoProcessClass("dualspace", 1, &classids[2]);CHKERRQ(ierr);
212   }
213   /* Process summary exclusions */
214   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
215   if (opt) {
216     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
217     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
218   }
219   /* Register package finalizer */
220   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
221   PetscFunctionReturn(0);
222 }
223 #include <petscfv.h>
224 
225 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
226 /*@C
227   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
228   from PetscFinalize().
229 
230   Level: developer
231 
232 .seealso: PetscInitialize()
233 @*/
234 PetscErrorCode PetscFVFinalizePackage(void)
235 {
236   PetscErrorCode ierr;
237 
238   PetscFunctionBegin;
239   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
240   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
241   PetscFVPackageInitialized     = PETSC_FALSE;
242   PetscFVRegisterAllCalled      = PETSC_FALSE;
243   PetscLimiterRegisterAllCalled = PETSC_FALSE;
244   PetscFunctionReturn(0);
245 }
246 
247 /*@C
248   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
249   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
250   when using static libraries.
251 
252   Level: developer
253 
254 .seealso: PetscInitialize()
255 @*/
256 PetscErrorCode PetscFVInitializePackage(void)
257 {
258   char           logList[256];
259   PetscBool      opt,pkg;
260   PetscErrorCode ierr;
261 
262   PetscFunctionBegin;
263   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
264   PetscFVPackageInitialized = PETSC_TRUE;
265 
266   /* Register Classes */
267   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
268   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
269   /* Register Constructors */
270   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
271   /* Register Events */
272   /* Process Info */
273   {
274     PetscClassId  classids[2];
275 
276     classids[0] = PETSCFV_CLASSID;
277     classids[1] = PETSCLIMITER_CLASSID;
278     ierr = PetscInfoProcessClass("fv", 1, classids);CHKERRQ(ierr);
279     ierr = PetscInfoProcessClass("limiter", 1, &classids[1]);CHKERRQ(ierr);
280   }
281   /* Process summary exclusions */
282   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
283   if (opt) {
284     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
285     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
286     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
287     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
288   }
289   /* Register package finalizer */
290   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
291   PetscFunctionReturn(0);
292 }
293 #include <petscds.h>
294 
295 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
296 /*@C
297   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
298   from PetscFinalize().
299 
300   Level: developer
301 
302 .seealso: PetscInitialize()
303 @*/
304 PetscErrorCode PetscDSFinalizePackage(void)
305 {
306   PetscErrorCode ierr;
307 
308   PetscFunctionBegin;
309   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
310   PetscDSPackageInitialized = PETSC_FALSE;
311   PetscDSRegisterAllCalled  = PETSC_FALSE;
312   PetscFunctionReturn(0);
313 }
314 
315 /*@C
316   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
317   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
318   when using static libraries.
319 
320   Level: developer
321 
322 .seealso: PetscInitialize()
323 @*/
324 PetscErrorCode PetscDSInitializePackage(void)
325 {
326   char           logList[256];
327   PetscBool      opt,pkg;
328   PetscErrorCode ierr;
329 
330   PetscFunctionBegin;
331   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
332   PetscDSPackageInitialized = PETSC_TRUE;
333 
334   /* Register Classes */
335   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
336   ierr = PetscClassIdRegister("Weak Form",       &PETSCWEAKFORM_CLASSID);CHKERRQ(ierr);
337   /* Register Constructors */
338   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
339   /* Register Events */
340   /* Process Info */
341   {
342     PetscClassId  classids[1];
343 
344     classids[0] = PETSCDS_CLASSID;
345     ierr = PetscInfoProcessClass("ds", 1, classids);CHKERRQ(ierr);
346   }
347   /* Process summary exclusions */
348   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
349   if (opt) {
350     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
351     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
352   }
353   /* Register package finalizer */
354   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
355   PetscFunctionReturn(0);
356 }
357 
358 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
359 /*
360   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
361 
362   This one registers all the mesh generators and partitioners that are in
363   the basic DM library.
364 
365 */
366 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
367 {
368   PetscErrorCode ierr;
369 
370   PetscFunctionBegin;
371   ierr = AOInitializePackage();CHKERRQ(ierr);
372   ierr = PetscPartitionerInitializePackage();CHKERRQ(ierr);
373   ierr = DMInitializePackage();CHKERRQ(ierr);
374   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
375   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
376   ierr = DMFieldInitializePackage();CHKERRQ(ierr);
377   PetscFunctionReturn(0);
378 }
379 
380 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
381