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