xref: /petsc/src/dm/interface/dlregisdmdm.c (revision cd1c4666a9c7786acffe2dfe971f76ff95fb06a8)
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("DMPlexCrFrCeLi",         DM_CLASSID,&DMPLEX_CreateFromCellList);CHKERRQ(ierr);
81   ierr = PetscLogEventRegister("DMPlexCrFrCeLiCo",       DM_CLASSID,&DMPLEX_CreateFromCellList_Coordinates);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 
114   ierr = PetscLogEventRegister("DMSwarmMigrate",         DM_CLASSID,&DMSWARM_Migrate);CHKERRQ(ierr);
115   ierr = PetscLogEventRegister("DMSwarmDETSetup",        DM_CLASSID,&DMSWARM_DataExchangerTopologySetup);CHKERRQ(ierr);
116   ierr = PetscLogEventRegister("DMSwarmDExBegin",        DM_CLASSID,&DMSWARM_DataExchangerBegin);CHKERRQ(ierr);
117   ierr = PetscLogEventRegister("DMSwarmDExEnd",          DM_CLASSID,&DMSWARM_DataExchangerEnd);CHKERRQ(ierr);
118   ierr = PetscLogEventRegister("DMSwarmDESendCnt",       DM_CLASSID,&DMSWARM_DataExchangerSendCount);CHKERRQ(ierr);
119   ierr = PetscLogEventRegister("DMSwarmDEPack",          DM_CLASSID,&DMSWARM_DataExchangerPack);CHKERRQ(ierr);
120   ierr = PetscLogEventRegister("DMSwarmAddPnts",         DM_CLASSID,&DMSWARM_AddPoints);CHKERRQ(ierr);
121   ierr = PetscLogEventRegister("DMSwarmRmvPnts",         DM_CLASSID,&DMSWARM_RemovePoints);CHKERRQ(ierr);
122   ierr = PetscLogEventRegister("DMSwarmSort",            DM_CLASSID,&DMSWARM_Sort);CHKERRQ(ierr);
123   ierr = PetscLogEventRegister("DMSwarmSetSizes",        DM_CLASSID,&DMSWARM_SetSizes);CHKERRQ(ierr);
124   /* Process Info */
125   {
126     PetscClassId  classids[1];
127 
128     classids[0] = DM_CLASSID;
129     ierr = PetscInfoProcessClass("dm", 1, classids);CHKERRQ(ierr);
130   }
131 
132   /* Process summary exclusions */
133   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
134   if (opt) {
135     ierr = PetscStrInList("dm",logList,',',&pkg);CHKERRQ(ierr);
136     if (pkg) {ierr = PetscLogEventExcludeClass(DM_CLASSID);CHKERRQ(ierr);}
137   }
138 
139   ierr = DMPlexGenerateRegisterAll();CHKERRQ(ierr);
140   ierr = PetscRegisterFinalize(DMPlexGenerateRegisterDestroy);CHKERRQ(ierr);
141   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
142   PetscFunctionReturn(0);
143 }
144 #include <petscfe.h>
145 
146 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
147 /*@C
148   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
149   from PetscFinalize().
150 
151   Level: developer
152 
153 .seealso: PetscInitialize()
154 @*/
155 PetscErrorCode PetscFEFinalizePackage(void)
156 {
157   PetscErrorCode ierr;
158 
159   PetscFunctionBegin;
160   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
161   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
162   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
163   PetscFEPackageInitialized       = PETSC_FALSE;
164   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
165   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
166   PetscFERegisterAllCalled        = PETSC_FALSE;
167   PetscFunctionReturn(0);
168 }
169 
170 /*@C
171   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
172   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
173   when using static libraries.
174 
175   Level: developer
176 
177 .seealso: PetscInitialize()
178 @*/
179 PetscErrorCode PetscFEInitializePackage(void)
180 {
181   char           logList[256];
182   PetscBool      opt,pkg;
183   PetscErrorCode ierr;
184 
185   PetscFunctionBegin;
186   if (PetscFEPackageInitialized) PetscFunctionReturn(0);
187   PetscFEPackageInitialized = PETSC_TRUE;
188 
189   /* Register Classes */
190   ierr = PetscClassIdRegister("Linear Space", &PETSCSPACE_CLASSID);CHKERRQ(ierr);
191   ierr = PetscClassIdRegister("Dual Space",   &PETSCDUALSPACE_CLASSID);CHKERRQ(ierr);
192   ierr = PetscClassIdRegister("FE Space",     &PETSCFE_CLASSID);CHKERRQ(ierr);
193   /* Register Constructors */
194   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
195   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
196   ierr = PetscFERegisterAll();CHKERRQ(ierr);
197   /* Register Events */
198   ierr = PetscLogEventRegister("DualSpaceSetUp", PETSCDUALSPACE_CLASSID, &PETSCDUALSPACE_SetUp);CHKERRQ(ierr);
199   ierr = PetscLogEventRegister("FESetUp",        PETSCFE_CLASSID,        &PETSCFE_SetUp);CHKERRQ(ierr);
200   /* Process Info */
201   {
202     PetscClassId  classids[3];
203 
204     classids[0] = PETSCFE_CLASSID;
205     classids[1] = PETSCSPACE_CLASSID;
206     classids[2] = PETSCDUALSPACE_CLASSID;
207     ierr = PetscInfoProcessClass("fe", 1, classids);CHKERRQ(ierr);
208     ierr = PetscInfoProcessClass("space", 1, &classids[1]);CHKERRQ(ierr);
209     ierr = PetscInfoProcessClass("dualspace", 1, &classids[2]);CHKERRQ(ierr);
210   }
211   /* Process summary exclusions */
212   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
213   if (opt) {
214     ierr = PetscStrInList("fe",logList,',',&pkg);CHKERRQ(ierr);
215     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFE_CLASSID);CHKERRQ(ierr);}
216   }
217   /* Register package finalizer */
218   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
219   PetscFunctionReturn(0);
220 }
221 #include <petscfv.h>
222 
223 static PetscBool PetscFVPackageInitialized = PETSC_FALSE;
224 /*@C
225   PetscFVFinalizePackage - This function finalizes everything in the PetscFV package. It is called
226   from PetscFinalize().
227 
228   Level: developer
229 
230 .seealso: PetscInitialize()
231 @*/
232 PetscErrorCode PetscFVFinalizePackage(void)
233 {
234   PetscErrorCode ierr;
235 
236   PetscFunctionBegin;
237   ierr = PetscFunctionListDestroy(&PetscLimiterList);CHKERRQ(ierr);
238   ierr = PetscFunctionListDestroy(&PetscFVList);CHKERRQ(ierr);
239   PetscFVPackageInitialized     = PETSC_FALSE;
240   PetscFVRegisterAllCalled      = PETSC_FALSE;
241   PetscLimiterRegisterAllCalled = PETSC_FALSE;
242   PetscFunctionReturn(0);
243 }
244 
245 /*@C
246   PetscFVInitializePackage - This function initializes everything in the FV package. It is called
247   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscFVCreate()
248   when using static libraries.
249 
250   Level: developer
251 
252 .seealso: PetscInitialize()
253 @*/
254 PetscErrorCode PetscFVInitializePackage(void)
255 {
256   char           logList[256];
257   PetscBool      opt,pkg;
258   PetscErrorCode ierr;
259 
260   PetscFunctionBegin;
261   if (PetscFVPackageInitialized) PetscFunctionReturn(0);
262   PetscFVPackageInitialized = PETSC_TRUE;
263 
264   /* Register Classes */
265   ierr = PetscClassIdRegister("FV Space", &PETSCFV_CLASSID);CHKERRQ(ierr);
266   ierr = PetscClassIdRegister("Limiter",  &PETSCLIMITER_CLASSID);CHKERRQ(ierr);
267   /* Register Constructors */
268   ierr = PetscFVRegisterAll();CHKERRQ(ierr);
269   /* Register Events */
270   /* Process Info */
271   {
272     PetscClassId  classids[2];
273 
274     classids[0] = PETSCFV_CLASSID;
275     classids[1] = PETSCLIMITER_CLASSID;
276     ierr = PetscInfoProcessClass("fv", 1, classids);CHKERRQ(ierr);
277     ierr = PetscInfoProcessClass("limiter", 1, &classids[1]);CHKERRQ(ierr);
278   }
279   /* Process summary exclusions */
280   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
281   if (opt) {
282     ierr = PetscStrInList("fv",logList,',',&pkg);CHKERRQ(ierr);
283     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCFV_CLASSID);CHKERRQ(ierr);}
284     ierr = PetscStrInList("limiter",logList,',',&pkg);CHKERRQ(ierr);
285     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCLIMITER_CLASSID);CHKERRQ(ierr);}
286   }
287   /* Register package finalizer */
288   ierr = PetscRegisterFinalize(PetscFVFinalizePackage);CHKERRQ(ierr);
289   PetscFunctionReturn(0);
290 }
291 #include <petscds.h>
292 
293 static PetscBool PetscDSPackageInitialized = PETSC_FALSE;
294 /*@C
295   PetscDSFinalizePackage - This function finalizes everything in the PetscDS package. It is called
296   from PetscFinalize().
297 
298   Level: developer
299 
300 .seealso: PetscInitialize()
301 @*/
302 PetscErrorCode PetscDSFinalizePackage(void)
303 {
304   PetscErrorCode ierr;
305 
306   PetscFunctionBegin;
307   ierr = PetscFunctionListDestroy(&PetscDSList);CHKERRQ(ierr);
308   PetscDSPackageInitialized = PETSC_FALSE;
309   PetscDSRegisterAllCalled  = PETSC_FALSE;
310   PetscFunctionReturn(0);
311 }
312 
313 /*@C
314   PetscDSInitializePackage - This function initializes everything in the DS package. It is called
315   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscDSCreate()
316   when using static libraries.
317 
318   Level: developer
319 
320 .seealso: PetscInitialize()
321 @*/
322 PetscErrorCode PetscDSInitializePackage(void)
323 {
324   char           logList[256];
325   PetscBool      opt,pkg;
326   PetscErrorCode ierr;
327 
328   PetscFunctionBegin;
329   if (PetscDSPackageInitialized) PetscFunctionReturn(0);
330   PetscDSPackageInitialized = PETSC_TRUE;
331 
332   /* Register Classes */
333   ierr = PetscClassIdRegister("Discrete System", &PETSCDS_CLASSID);CHKERRQ(ierr);
334   /* Register Constructors */
335   ierr = PetscDSRegisterAll();CHKERRQ(ierr);
336   /* Register Events */
337   /* Process Info */
338   {
339     PetscClassId  classids[1];
340 
341     classids[0] = PETSCDS_CLASSID;
342     ierr = PetscInfoProcessClass("ds", 1, classids);CHKERRQ(ierr);
343   }
344   /* Process summary exclusions */
345   ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
346   if (opt) {
347     ierr = PetscStrInList("ds",logList,',',&pkg);CHKERRQ(ierr);
348     if (pkg) {ierr = PetscLogEventExcludeClass(PETSCDS_CLASSID);CHKERRQ(ierr);}
349   }
350   /* Register package finalizer */
351   ierr = PetscRegisterFinalize(PetscDSFinalizePackage);CHKERRQ(ierr);
352   PetscFunctionReturn(0);
353 }
354 
355 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
356 /*
357   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
358 
359   This one registers all the mesh generators and partitioners that are in
360   the basic DM library.
361 
362 */
363 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
364 {
365   PetscErrorCode ierr;
366 
367   PetscFunctionBegin;
368   ierr = AOInitializePackage();CHKERRQ(ierr);
369   ierr = PetscPartitionerInitializePackage();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