xref: /petsc/src/dm/interface/dlregisdmdm.c (revision a80ff896a4e4b460fab449f7ca5556e439248e75)
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(&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_petscdm() when using dynamic libraries, and on the first call to AOCreate()
41   or DMDACreate() when using shared or static libraries.
42 
43   Level: developer
44 
45 .seealso: PetscInitialize()
46 @*/
47 PetscErrorCode  DMInitializePackage(void)
48 {
49   char           logList[256];
50   PetscBool      opt,pkg;
51   PetscErrorCode ierr;
52 
53   PetscFunctionBegin;
54   if (DMPackageInitialized) PetscFunctionReturn(0);
55   DMPackageInitialized = PETSC_TRUE;
56 
57   /* Register Classes */
58   ierr = PetscClassIdRegister("Distributed Mesh",&DM_CLASSID);CHKERRQ(ierr);
59   ierr = PetscClassIdRegister("DM Label",&DMLABEL_CLASSID);CHKERRQ(ierr);
60   ierr = PetscClassIdRegister("GraphPartitioner",&PETSCPARTITIONER_CLASSID);CHKERRQ(ierr);
61   ierr = PetscClassIdRegister("Quadrature",&PETSCQUADRATURE_CLASSID);CHKERRQ(ierr);
62 
63 #if defined(PETSC_HAVE_HYPRE)
64   ierr = MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct);CHKERRQ(ierr);
65   ierr = MatRegister(MATHYPRESSTRUCT, MatCreate_HYPRESStruct);CHKERRQ(ierr);
66 #endif
67   ierr = PetscSectionSymRegister(PETSCSECTIONSYMLABEL,PetscSectionSymCreate_Label);CHKERRQ(ierr);
68 
69   /* Register Constructors */
70   ierr = DMRegisterAll();CHKERRQ(ierr);
71   /* Register Events */
72   ierr = PetscLogEventRegister("DMConvert",              DM_CLASSID,&DM_Convert);CHKERRQ(ierr);
73   ierr = PetscLogEventRegister("DMGlobalToLocal",        DM_CLASSID,&DM_GlobalToLocal);CHKERRQ(ierr);
74   ierr = PetscLogEventRegister("DMLocalToGlobal",        DM_CLASSID,&DM_LocalToGlobal);CHKERRQ(ierr);
75   ierr = PetscLogEventRegister("DMLocatePoints",         DM_CLASSID,&DM_LocatePoints);CHKERRQ(ierr);
76   ierr = PetscLogEventRegister("DMCoarsen",              DM_CLASSID,&DM_Coarsen);CHKERRQ(ierr);
77   ierr = PetscLogEventRegister("DMCreateInterp",         DM_CLASSID,&DM_CreateInterpolation);CHKERRQ(ierr);
78   ierr = PetscLogEventRegister("DMCreateRestrict",       DM_CLASSID,&DM_CreateRestriction);CHKERRQ(ierr);
79   ierr = PetscLogEventRegister("DMCreateInject",         DM_CLASSID,&DM_CreateInjection);CHKERRQ(ierr);
80   ierr = PetscLogEventRegister("DMCreateMat",            DM_CLASSID,&DM_CreateMatrix);CHKERRQ(ierr);
81   ierr = PetscLogEventRegister("DMLoad",                 DM_CLASSID,&DM_Load);CHKERRQ(ierr);
82 
83   ierr = PetscLogEventRegister("DMPlexCrFrCeLi",         DM_CLASSID,&DMPLEX_CreateFromCellList);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("DMPlexCrFrCeLiCo",       DM_CLASSID,&DMPLEX_CreateFromCellList_Coordinates);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 
117   ierr = PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr);
118   ierr = PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr);
119   ierr = PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr);
120   ierr = PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr);
121   ierr = PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr);
122   ierr = PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr);
123   ierr = PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr);
124   ierr = PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr);
125   ierr = PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr);
126   ierr = PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr);
127   /* Process Info */
128   {
129     PetscClassId  classids[1];
130 
131     classids[0] = DM_CLASSID;
132     ierr = PetscInfoProcessClass("dm", 1, classids);CHKERRQ(ierr);
133   }
134 
135   /* Process summary exclusions */
136   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
137   if (opt) {
138     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
139     if (pkg) {ierr = PetscLogEventExcludeClass(DM_CLASSID);CHKERRQ(ierr);}
140   }
141 
142   ierr = DMPlexGenerateRegisterAll();CHKERRQ(ierr);
143   ierr = PetscRegisterFinalize(DMPlexGenerateRegisterDestroy);CHKERRQ(ierr);
144   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
145   PetscFunctionReturn(0);
146 }
147 #include <petscfe.h>
148 
149 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
150 /*@C
151   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
152   from PetscFinalize().
153 
154   Level: developer
155 
156 .seealso: PetscInitialize()
157 @*/
158 PetscErrorCode PetscFEFinalizePackage(void)
159 {
160   PetscErrorCode ierr;
161 
162   PetscFunctionBegin;
163   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
164   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
165   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
166   PetscFEPackageInitialized       = PETSC_FALSE;
167   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
168   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
169   PetscFERegisterAllCalled        = PETSC_FALSE;
170   PetscFunctionReturn(0);
171 }
172 
173 /*@C
174   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
175   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
176   when using static libraries.
177 
178   Level: developer
179 
180 .seealso: PetscInitialize()
181 @*/
182 PetscErrorCode PetscFEInitializePackage(void)
183 {
184   char           logList[256];
185   PetscBool      opt,pkg;
186   PetscErrorCode ierr;
187 
188   PetscFunctionBegin;
189   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
190   PetscFEPackageInitialized = PETSC_TRUE;
191 
192   /* Register Classes */
193   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
194   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
195   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
196   /* Register Constructors */
197   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
198   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
199   ierr = PetscFERegisterAll();CHKERRQ(ierr);
200   /* Register Events */
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 = DMInitializePackage();CHKERRQ(ierr);
371   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
372   ierr = PetscFVInitializePackage();CHKERRQ(ierr);
373   ierr = DMFieldInitializePackage();CHKERRQ(ierr);
374   PetscFunctionReturn(0);
375 }
376 
377 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
378