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