xref: /petsc/src/dm/interface/dlregisdmdm.c (revision f9426fe092dba0ba2fdf65dfec8d938c4b10a31c)
1 
2 #include <petsc-private/dmdaimpl.h>
3 #include <petsc-private/dmpleximpl.h>
4 #if defined(PETSC_HAVE_SIEVE)
5 #include <petsc-private/meshimpl.h>
6 #endif
7 
8 static PetscBool DMPackageInitialized = PETSC_FALSE;
9 #undef __FUNCT__
10 #define __FUNCT__ "DMFinalizePackage"
11 /*@C
12   DMFinalizePackage - This function finalizes everything in the DM package. It is called
13   from PetscFinalize().
14 
15   Level: developer
16 
17 .keywords: AO, initialize, package
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 #if defined(PETSC_HAVE_SIEVE)
29   ierr = DMMeshFinalize();CHKERRQ(ierr);
30 #endif
31   PetscFunctionReturn(0);
32 }
33 
34 #if defined(PETSC_HAVE_HYPRE)
35 PETSC_EXTERN PetscErrorCode MatCreate_HYPREStruct(Mat);
36 #endif
37 
38 #undef __FUNCT__
39 #define __FUNCT__ "DMInitializePackage"
40 /*@C
41   DMInitializePackage - This function initializes everything in the DM package. It is called
42   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to AOCreate()
43   or DMDACreate() when using static libraries.
44 
45   Level: developer
46 
47 .keywords: AO, initialize, package
48 .seealso: PetscInitialize()
49 @*/
50 PetscErrorCode  DMInitializePackage(void)
51 {
52   char           logList[256];
53   char           *className;
54   PetscBool      opt;
55   PetscErrorCode ierr;
56 
57   PetscFunctionBegin;
58   if (DMPackageInitialized) PetscFunctionReturn(0);
59   DMPackageInitialized = PETSC_TRUE;
60 
61   /* Register Classes */
62   ierr = PetscClassIdRegister("Distributed Mesh",&DM_CLASSID);CHKERRQ(ierr);
63 #if defined(PETSC_HAVE_SIEVE)
64   ierr = PetscClassIdRegister("SectionReal",&SECTIONREAL_CLASSID);CHKERRQ(ierr);
65   ierr = PetscClassIdRegister("SectionInt",&SECTIONINT_CLASSID);CHKERRQ(ierr);
66 #endif
67 
68 #if defined(PETSC_HAVE_HYPRE)
69   ierr = MatRegister(MATHYPRESTRUCT, MatCreate_HYPREStruct);CHKERRQ(ierr);
70 #endif
71 
72   /* Register Constructors */
73   ierr = DMRegisterAll();CHKERRQ(ierr);
74   /* Register Events */
75   ierr = PetscLogEventRegister("DMConvert",              DM_CLASSID,&DM_Convert);CHKERRQ(ierr);
76   ierr = PetscLogEventRegister("DMGlobalToLocal",        DM_CLASSID,&DM_GlobalToLocal);CHKERRQ(ierr);
77   ierr = PetscLogEventRegister("DMLocalToGlobal",        DM_CLASSID,&DM_LocalToGlobal);CHKERRQ(ierr);
78 
79   ierr = PetscLogEventRegister("DMDALocalADFunc",        DM_CLASSID,&DMDA_LocalADFunction);CHKERRQ(ierr);
80 
81   ierr = PetscLogEventRegister("DMPlexPartition",        DM_CLASSID,&DMPLEX_Partition);CHKERRQ(ierr);
82   ierr = PetscLogEventRegister("DMPlexDistribute",       DM_CLASSID,&DMPLEX_Distribute);CHKERRQ(ierr);
83   ierr = PetscLogEventRegister("DMPlexDistributeLabels", DM_CLASSID,&DMPLEX_DistributeLabels);CHKERRQ(ierr);
84   ierr = PetscLogEventRegister("DMPlexDistributeSF",     DM_CLASSID,&DMPLEX_DistributeSF);CHKERRQ(ierr);
85   ierr = PetscLogEventRegister("DMPlexStratify",         DM_CLASSID,&DMPLEX_Stratify);CHKERRQ(ierr);
86   ierr = PetscLogEventRegister("DMPlexResidualFEM",      DM_CLASSID,&DMPLEX_ResidualFEM);CHKERRQ(ierr);
87   ierr = PetscLogEventRegister("DMPlexJacobianFEM",      DM_CLASSID,&DMPLEX_JacobianFEM);CHKERRQ(ierr);
88 #if defined(PETSC_HAVE_SIEVE)
89   ierr = PetscLogEventRegister("DMMeshView",             DM_CLASSID,&DMMesh_View);CHKERRQ(ierr);
90   ierr = PetscLogEventRegister("DMMeshGetGlobalScatter", DM_CLASSID,&DMMesh_GetGlobalScatter);CHKERRQ(ierr);
91   ierr = PetscLogEventRegister("DMMeshRestrictVector",   DM_CLASSID,&DMMesh_restrictVector);CHKERRQ(ierr);
92   ierr = PetscLogEventRegister("DMMeshAssembleVector",   DM_CLASSID,&DMMesh_assembleVector);CHKERRQ(ierr);
93   ierr = PetscLogEventRegister("DMMeshAssemVecComplete", DM_CLASSID,&DMMesh_assembleVectorComplete);CHKERRQ(ierr);
94   ierr = PetscLogEventRegister("DMMeshAssembleMatrix",   DM_CLASSID,&DMMesh_assembleMatrix);CHKERRQ(ierr);
95   ierr = PetscLogEventRegister("DMMeshUpdateOperator",   DM_CLASSID,&DMMesh_updateOperator);CHKERRQ(ierr);
96   ierr = PetscLogEventRegister("SectionRealView",        SECTIONREAL_CLASSID,&SectionReal_View);CHKERRQ(ierr);
97   ierr = PetscLogEventRegister("SectionIntView",         SECTIONINT_CLASSID,&SectionInt_View);CHKERRQ(ierr);
98 #endif
99   /* Process info exclusions */
100   ierr = PetscOptionsGetString(NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
101   if (opt) {
102     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
103     if (className) {
104       ierr = PetscInfoDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
105     }
106 #if defined(PETSC_HAVE_SIEVE)
107     ierr = PetscStrstr(logList, "sectionreal", &className);CHKERRQ(ierr);
108     if (className) {
109       ierr = PetscInfoDeactivateClass(SECTIONREAL_CLASSID);CHKERRQ(ierr);
110     }
111     ierr = PetscStrstr(logList, "sectionint", &className);CHKERRQ(ierr);
112     if (className) {
113       ierr = PetscInfoDeactivateClass(SECTIONINT_CLASSID);CHKERRQ(ierr);
114     }
115 #endif
116   }
117   /* Process summary exclusions */
118   ierr = PetscOptionsGetString(NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
119   if (opt) {
120     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
121     if (className) {
122       ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
123     }
124 #if defined(PETSC_HAVE_SIEVE)
125     ierr = PetscStrstr(logList, "sectionreal", &className);CHKERRQ(ierr);
126     if (className) {
127       ierr = PetscLogEventDeactivateClass(SECTIONREAL_CLASSID);CHKERRQ(ierr);
128     }
129     ierr = PetscStrstr(logList, "sectionint", &className);CHKERRQ(ierr);
130     if (className) {
131       ierr = PetscLogEventDeactivateClass(SECTIONINT_CLASSID);CHKERRQ(ierr);
132     }
133 #endif
134   }
135   ierr = PetscRegisterFinalize(DMFinalizePackage);CHKERRQ(ierr);
136   PetscFunctionReturn(0);
137 }
138 #include <petscfe.h>
139 
140 static PetscBool PetscFEPackageInitialized = PETSC_FALSE;
141 #undef __FUNCT__
142 #define __FUNCT__ "PetscFEFinalizePackage"
143 /*@C
144   PetscFEFinalizePackage - This function finalizes everything in the PetscFE package. It is called
145   from PetscFinalize().
146 
147   Level: developer
148 
149 .keywords: PetscFE, initialize, package
150 .seealso: PetscInitialize()
151 @*/
152 PetscErrorCode PetscFEFinalizePackage(void)
153 {
154   PetscErrorCode ierr;
155 
156   PetscFunctionBegin;
157   ierr = PetscFunctionListDestroy(&PetscSpaceList);CHKERRQ(ierr);
158   ierr = PetscFunctionListDestroy(&PetscDualSpaceList);CHKERRQ(ierr);
159   ierr = PetscFunctionListDestroy(&PetscFEList);CHKERRQ(ierr);
160   PetscFEPackageInitialized       = PETSC_FALSE;
161   PetscSpaceRegisterAllCalled     = PETSC_FALSE;
162   PetscDualSpaceRegisterAllCalled = PETSC_FALSE;
163   PetscFERegisterAllCalled        = PETSC_FALSE;
164   PetscFunctionReturn(0);
165 }
166 
167 #undef __FUNCT__
168 #define __FUNCT__ "PetscFEInitializePackage"
169 /*@C
170   PetscFEInitializePackage - This function initializes everything in the FE package. It is called
171   from PetscDLLibraryRegister() when using dynamic libraries, and on the first call to PetscSpaceCreate()
172   when using static libraries.
173 
174   Level: developer
175 
176 .keywords: PetscFE, initialize, package
177 .seealso: PetscInitialize()
178 @*/
179 PetscErrorCode PetscFEInitializePackage(void)
180 {
181   char           logList[256];
182   char          *className;
183   PetscBool      opt;
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 
195   /* Register Constructors */
196   ierr = PetscSpaceRegisterAll();CHKERRQ(ierr);
197   ierr = PetscDualSpaceRegisterAll();CHKERRQ(ierr);
198   ierr = PetscFERegisterAll();CHKERRQ(ierr);
199   /* Register Events */
200   /* Process info exclusions */
201   ierr = PetscOptionsGetString(NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
202   if (opt) {
203     ierr = PetscStrstr(logList, "fe", &className);CHKERRQ(ierr);
204     if (className) {
205       ierr = PetscInfoDeactivateClass(PETSCFE_CLASSID);CHKERRQ(ierr);
206     }
207   }
208   /* Process summary exclusions */
209   ierr = PetscOptionsGetString(NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
210   if (opt) {
211     ierr = PetscStrstr(logList, "da", &className);CHKERRQ(ierr);
212     if (className) {
213       ierr = PetscLogEventDeactivateClass(DM_CLASSID);CHKERRQ(ierr);
214     }
215   }
216   ierr = PetscRegisterFinalize(PetscFEFinalizePackage);CHKERRQ(ierr);
217   PetscFunctionReturn(0);
218 }
219 
220 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
221 #undef __FUNCT__
222 #define __FUNCT__ "PetscDLLibraryRegister_petscdm"
223 /*
224   PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
225 
226   This one registers all the mesh generators and partitioners that are in
227   the basic DM library.
228 
229 */
230 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscdm(void)
231 {
232   PetscErrorCode ierr;
233 
234   PetscFunctionBegin;
235   ierr = AOInitializePackage();CHKERRQ(ierr);
236   ierr = DMInitializePackage();CHKERRQ(ierr);
237   ierr = PetscFEInitializePackage();CHKERRQ(ierr);
238   PetscFunctionReturn(0);
239 }
240 
241 #endif /* PETSC_USE_DYNAMIC_LIBRARIES */
242