1
2 #include <petsc/private/vecimpl.h>
3 #include <petsc/private/isimpl.h>
4 #include <petscpf.h>
5 #include <petscsf.h>
6 #include <petscsection.h>
7 #include <petscao.h>
8
9 static PetscBool ISPackageInitialized = PETSC_FALSE;
10 extern PetscFunctionList ISLocalToGlobalMappingList;
11 const char *ISInfos[] = {"SORTED", "UNIQUE", "PERMUTATION", "INTERVAL", "IDENTITY", "ISInfo", "IS_",NULL};
12
13 /*@C
14 ISFinalizePackage - This function destroys everything in the IS package. It is
15 called from PetscFinalize().
16
17 Level: developer
18
19 .seealso: PetscFinalize()
20 @*/
ISFinalizePackage(void)21 PetscErrorCode ISFinalizePackage(void)
22 {
23 PetscErrorCode ierr;
24
25 PetscFunctionBegin;
26 ierr = PetscFunctionListDestroy(&ISList);CHKERRQ(ierr);
27 ierr = PetscFunctionListDestroy(&ISLocalToGlobalMappingList);CHKERRQ(ierr);
28 ierr = PetscFunctionListDestroy(&PetscSectionSymList);CHKERRQ(ierr);
29 ISPackageInitialized = PETSC_FALSE;
30 ISRegisterAllCalled = PETSC_FALSE;
31 ISLocalToGlobalMappingRegisterAllCalled = PETSC_FALSE;
32 PetscFunctionReturn(0);
33 }
34
35 /*@C
36 ISInitializePackage - This function initializes everything in the IS package. It is called
37 from PetscDLLibraryRegister_petscvec() when using dynamic libraries, and on the first call to ISCreateXXXX()
38 when using shared or static libraries.
39
40 Level: developer
41
42 .seealso: PetscInitialize()
43 @*/
ISInitializePackage(void)44 PetscErrorCode ISInitializePackage(void)
45 {
46 char logList[256];
47 PetscBool opt,pkg;
48 PetscErrorCode ierr;
49
50 PetscFunctionBegin;
51 if (ISPackageInitialized) PetscFunctionReturn(0);
52 ISPackageInitialized = PETSC_TRUE;
53 /* Register Classes */
54 ierr = PetscClassIdRegister("Index Set",&IS_CLASSID);CHKERRQ(ierr);
55 ierr = PetscClassIdRegister("IS L to G Mapping",&IS_LTOGM_CLASSID);CHKERRQ(ierr);
56 ierr = PetscClassIdRegister("Section",&PETSC_SECTION_CLASSID);CHKERRQ(ierr);
57 ierr = PetscClassIdRegister("Section Symmetry",&PETSC_SECTION_SYM_CLASSID);CHKERRQ(ierr);
58 /* Register Constructors */
59 ierr = ISRegisterAll();CHKERRQ(ierr);
60 ierr = ISLocalToGlobalMappingRegisterAll();CHKERRQ(ierr);
61 /* Register Events */
62 ierr = PetscLogEventRegister("ISView",IS_CLASSID,&IS_View);CHKERRQ(ierr);
63 ierr = PetscLogEventRegister("ISLoad",IS_CLASSID,&IS_Load);CHKERRQ(ierr);
64 /* Process Info */
65 {
66 PetscClassId classids[4];
67
68 classids[0] = IS_CLASSID;
69 classids[1] = IS_LTOGM_CLASSID;
70 classids[2] = PETSC_SECTION_CLASSID;
71 classids[3] = PETSC_SECTION_SYM_CLASSID;
72 ierr = PetscInfoProcessClass("is", 2, classids);CHKERRQ(ierr);
73 ierr = PetscInfoProcessClass("section", 2, &classids[2]);CHKERRQ(ierr);
74 }
75 /* Process summary exclusions */
76 ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
77 if (opt) {
78 ierr = PetscStrInList("is",logList,',',&pkg);CHKERRQ(ierr);
79 if (pkg) {ierr = PetscLogEventExcludeClass(IS_CLASSID);CHKERRQ(ierr);}
80 if (pkg) {ierr = PetscLogEventExcludeClass(IS_LTOGM_CLASSID);CHKERRQ(ierr);}
81 ierr = PetscStrInList("section",logList,',',&pkg);CHKERRQ(ierr);
82 if (pkg) {ierr = PetscLogEventExcludeClass(PETSC_SECTION_CLASSID);CHKERRQ(ierr);}
83 if (pkg) {ierr = PetscLogEventExcludeClass(PETSC_SECTION_SYM_CLASSID);CHKERRQ(ierr);}
84 }
85 /* Register package finalizer */
86 ierr = PetscRegisterFinalize(ISFinalizePackage);CHKERRQ(ierr);
87 PetscFunctionReturn(0);
88 }
89
90 extern MPI_Op PetscSplitReduction_Op;
91
92 /*
93 These two functions are the MPI reduction operation used for max and min with index
94 A call to MPI_Op_create() converts the function Vec[Max,Min]_Local() to the MPI operator Vec[Max,Min]_Local_Op.
95
96 */
97 MPI_Op MPIU_MAXINDEX_OP = 0;
98 MPI_Op MPIU_MININDEX_OP = 0;
99
MPIU_MaxIndex_Local(void * in,void * out,PetscMPIInt * cnt,MPI_Datatype * datatype)100 static void MPIAPI MPIU_MaxIndex_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
101 {
102 PetscReal *xin = (PetscReal*)in,*xout = (PetscReal*)out;
103
104 PetscFunctionBegin;
105 if (*datatype != MPIU_REAL) {
106 (*PetscErrorPrintf)("Can only handle MPIU_REAL data types");
107 PETSCABORT(MPI_COMM_SELF,PETSC_ERR_ARG_WRONG);
108 }
109 if (xin[0] > xout[0]) {
110 xout[0] = xin[0];
111 xout[1] = xin[1];
112 } else if (xin[0] == xout[0]) {
113 xout[1] = PetscMin(xin[1],xout[1]);
114 }
115 PetscFunctionReturnVoid(); /* cannot return a value */
116 }
117
MPIU_MinIndex_Local(void * in,void * out,PetscMPIInt * cnt,MPI_Datatype * datatype)118 static void MPIAPI MPIU_MinIndex_Local(void *in,void *out,PetscMPIInt *cnt,MPI_Datatype *datatype)
119 {
120 PetscReal *xin = (PetscReal*)in,*xout = (PetscReal*)out;
121
122 PetscFunctionBegin;
123 if (*datatype != MPIU_REAL) {
124 (*PetscErrorPrintf)("Can only handle MPIU_REAL data types");
125 PETSCABORT(MPI_COMM_SELF,PETSC_ERR_ARG_WRONG);
126 }
127 if (xin[0] < xout[0]) {
128 xout[0] = xin[0];
129 xout[1] = xin[1];
130 } else if (xin[0] == xout[0]) {
131 xout[1] = PetscMin(xin[1],xout[1]);
132 }
133 PetscFunctionReturnVoid();
134 }
135
136 PETSC_EXTERN void MPIAPI PetscSplitReduction_Local(void*,void*,PetscMPIInt*,MPI_Datatype*);
137
138 const char *const NormTypes[] = {"1","2","FROBENIUS","INFINITY","1_AND_2","NormType","NORM_",NULL};
139 PetscInt NormIds[7]; /* map from NormType to IDs used to cache Normvalues */
140
141 static PetscBool VecPackageInitialized = PETSC_FALSE;
142
143 /*@C
144 VecInitializePackage - This function initializes everything in the Vec package. It is called
145 from PetscDLLibraryRegister_petscvec() when using dynamic libraries, and on the first call to VecCreate()
146 when using shared or static libraries.
147
148 Level: developer
149
150 .seealso: PetscInitialize()
151 @*/
VecInitializePackage(void)152 PetscErrorCode VecInitializePackage(void)
153 {
154 char logList[256];
155 PetscBool opt,pkg;
156 PetscErrorCode ierr;
157 PetscInt i;
158
159 PetscFunctionBegin;
160 if (VecPackageInitialized) PetscFunctionReturn(0);
161 VecPackageInitialized = PETSC_TRUE;
162 /* Initialize subpackage */
163 ierr = VecScatterInitializePackage();CHKERRQ(ierr);
164 /* Register Classes */
165 ierr = PetscClassIdRegister("Vector",&VEC_CLASSID);CHKERRQ(ierr);
166 /* Register Constructors */
167 ierr = VecRegisterAll();CHKERRQ(ierr);
168 /* Register Events */
169 ierr = PetscLogEventRegister("VecView", VEC_CLASSID,&VEC_View);CHKERRQ(ierr);
170 ierr = PetscLogEventRegister("VecMax", VEC_CLASSID,&VEC_Max);CHKERRQ(ierr);
171 ierr = PetscLogEventRegister("VecMin", VEC_CLASSID,&VEC_Min);CHKERRQ(ierr);
172 ierr = PetscLogEventRegister("VecDot", VEC_CLASSID,&VEC_Dot);CHKERRQ(ierr);
173 ierr = PetscLogEventRegister("VecDotNorm2", VEC_CLASSID,&VEC_DotNorm2);CHKERRQ(ierr);
174 ierr = PetscLogEventRegister("VecMDot", VEC_CLASSID,&VEC_MDot);CHKERRQ(ierr);
175 ierr = PetscLogEventRegister("VecTDot", VEC_CLASSID,&VEC_TDot);CHKERRQ(ierr);
176 ierr = PetscLogEventRegister("VecMTDot", VEC_CLASSID,&VEC_MTDot);CHKERRQ(ierr);
177 ierr = PetscLogEventRegister("VecNorm", VEC_CLASSID,&VEC_Norm);CHKERRQ(ierr);
178 ierr = PetscLogEventRegister("VecScale", VEC_CLASSID,&VEC_Scale);CHKERRQ(ierr);
179 ierr = PetscLogEventRegister("VecCopy", VEC_CLASSID,&VEC_Copy);CHKERRQ(ierr);
180 ierr = PetscLogEventRegister("VecSet", VEC_CLASSID,&VEC_Set);CHKERRQ(ierr);
181 ierr = PetscLogEventRegister("VecAXPY", VEC_CLASSID,&VEC_AXPY);CHKERRQ(ierr);
182 ierr = PetscLogEventRegister("VecAYPX", VEC_CLASSID,&VEC_AYPX);CHKERRQ(ierr);
183 ierr = PetscLogEventRegister("VecAXPBYCZ", VEC_CLASSID,&VEC_AXPBYPCZ);CHKERRQ(ierr);
184 ierr = PetscLogEventRegister("VecWAXPY", VEC_CLASSID,&VEC_WAXPY);CHKERRQ(ierr);
185 ierr = PetscLogEventRegister("VecMAXPY", VEC_CLASSID,&VEC_MAXPY);CHKERRQ(ierr);
186 ierr = PetscLogEventRegister("VecSwap", VEC_CLASSID,&VEC_Swap);CHKERRQ(ierr);
187 ierr = PetscLogEventRegister("VecOps", VEC_CLASSID,&VEC_Ops);CHKERRQ(ierr);
188 ierr = PetscLogEventRegister("VecAssemblyBegin", VEC_CLASSID,&VEC_AssemblyBegin);CHKERRQ(ierr);
189 ierr = PetscLogEventRegister("VecAssemblyEnd", VEC_CLASSID,&VEC_AssemblyEnd);CHKERRQ(ierr);
190 ierr = PetscLogEventRegister("VecPointwiseMult", VEC_CLASSID,&VEC_PointwiseMult);CHKERRQ(ierr);
191 ierr = PetscLogEventRegister("VecSetValues", VEC_CLASSID,&VEC_SetValues);CHKERRQ(ierr);
192 ierr = PetscLogEventRegister("VecLoad", VEC_CLASSID,&VEC_Load);CHKERRQ(ierr);
193 ierr = PetscLogEventRegister("VecScatterBegin", VEC_CLASSID,&VEC_ScatterBegin);CHKERRQ(ierr);
194 ierr = PetscLogEventRegister("VecScatterEnd ", VEC_CLASSID,&VEC_ScatterEnd);CHKERRQ(ierr);
195 ierr = PetscLogEventRegister("VecSetRandom", VEC_CLASSID,&VEC_SetRandom);CHKERRQ(ierr);
196 ierr = PetscLogEventRegister("VecReduceArith", VEC_CLASSID,&VEC_ReduceArithmetic);CHKERRQ(ierr);
197 ierr = PetscLogEventRegister("VecReduceComm", VEC_CLASSID,&VEC_ReduceCommunication);CHKERRQ(ierr);
198 ierr = PetscLogEventRegister("VecReduceBegin", VEC_CLASSID,&VEC_ReduceBegin);CHKERRQ(ierr);
199 ierr = PetscLogEventRegister("VecReduceEnd", VEC_CLASSID,&VEC_ReduceEnd);CHKERRQ(ierr);
200 ierr = PetscLogEventRegister("VecNormalize", VEC_CLASSID,&VEC_Normalize);CHKERRQ(ierr);
201 #if defined(PETSC_HAVE_VIENNACL)
202 ierr = PetscLogEventRegister("VecVCLCopyTo", VEC_CLASSID,&VEC_ViennaCLCopyToGPU);CHKERRQ(ierr);
203 ierr = PetscLogEventRegister("VecVCLCopyFrom", VEC_CLASSID,&VEC_ViennaCLCopyFromGPU);CHKERRQ(ierr);
204 #endif
205 #if defined(PETSC_HAVE_CUDA)
206 ierr = PetscLogEventRegister("VecCUDACopyTo", VEC_CLASSID,&VEC_CUDACopyToGPU);CHKERRQ(ierr);
207 ierr = PetscLogEventRegister("VecCUDACopyFrom", VEC_CLASSID,&VEC_CUDACopyFromGPU);CHKERRQ(ierr);
208 ierr = PetscLogEventRegister("VecCopyToSome", VEC_CLASSID,&VEC_CUDACopyToGPUSome);CHKERRQ(ierr);
209 ierr = PetscLogEventRegister("VecCopyFromSome", VEC_CLASSID,&VEC_CUDACopyFromGPUSome);CHKERRQ(ierr);
210 #endif
211
212 /* Mark non-collective events */
213 ierr = PetscLogEventSetCollective(VEC_SetValues, PETSC_FALSE);CHKERRQ(ierr);
214 #if defined(PETSC_HAVE_VIENNACL)
215 ierr = PetscLogEventSetCollective(VEC_ViennaCLCopyToGPU, PETSC_FALSE);CHKERRQ(ierr);
216 ierr = PetscLogEventSetCollective(VEC_ViennaCLCopyFromGPU, PETSC_FALSE);CHKERRQ(ierr);
217 #endif
218 #if defined(PETSC_HAVE_CUDA)
219 ierr = PetscLogEventSetCollective(VEC_CUDACopyToGPU, PETSC_FALSE);CHKERRQ(ierr);
220 ierr = PetscLogEventSetCollective(VEC_CUDACopyFromGPU, PETSC_FALSE);CHKERRQ(ierr);
221 ierr = PetscLogEventSetCollective(VEC_CUDACopyToGPUSome, PETSC_FALSE);CHKERRQ(ierr);
222 ierr = PetscLogEventSetCollective(VEC_CUDACopyFromGPUSome, PETSC_FALSE);CHKERRQ(ierr);
223 #endif
224 /* Turn off high traffic events by default */
225 ierr = PetscLogEventSetActiveAll(VEC_SetValues, PETSC_FALSE);CHKERRQ(ierr);
226 /* Process Info */
227 {
228 PetscClassId classids[1];
229
230 classids[0] = VEC_CLASSID;
231 ierr = PetscInfoProcessClass("vec", 1, classids);CHKERRQ(ierr);
232 }
233 /* Process summary exclusions */
234 ierr = PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
235 if (opt) {
236 ierr = PetscStrInList("vec",logList,',',&pkg);CHKERRQ(ierr);
237 if (pkg) {ierr = PetscLogEventExcludeClass(VEC_CLASSID);CHKERRQ(ierr);}
238 if (pkg) {ierr = PetscLogEventExcludeClass(VEC_SCATTER_CLASSID);CHKERRQ(ierr);}
239 }
240
241 /*
242 Create the special MPI reduction operation that may be used by VecNorm/DotBegin()
243 */
244 ierr = MPI_Op_create(PetscSplitReduction_Local,1,&PetscSplitReduction_Op);CHKERRQ(ierr);
245 ierr = MPI_Op_create(MPIU_MaxIndex_Local,2,&MPIU_MAXINDEX_OP);CHKERRQ(ierr);
246 ierr = MPI_Op_create(MPIU_MinIndex_Local,2,&MPIU_MININDEX_OP);CHKERRQ(ierr);
247
248 /* Register the different norm types for cached norms */
249 for (i=0; i<4; i++) {
250 ierr = PetscObjectComposedDataRegister(NormIds+i);CHKERRQ(ierr);
251 }
252
253 /* Register package finalizer */
254 ierr = PetscRegisterFinalize(VecFinalizePackage);CHKERRQ(ierr);
255 PetscFunctionReturn(0);
256 }
257
258 /*@C
259 VecFinalizePackage - This function finalizes everything in the Vec package. It is called
260 from PetscFinalize().
261
262 Level: developer
263
264 .seealso: PetscInitialize()
265 @*/
VecFinalizePackage(void)266 PetscErrorCode VecFinalizePackage(void)
267 {
268 PetscErrorCode ierr;
269
270 PetscFunctionBegin;
271 ierr = PetscFunctionListDestroy(&VecList);CHKERRQ(ierr);
272 ierr = PetscFunctionListDestroy(&VecScatterList);CHKERRQ(ierr);
273 ierr = MPI_Op_free(&PetscSplitReduction_Op);CHKERRQ(ierr);
274 ierr = MPI_Op_free(&MPIU_MAXINDEX_OP);CHKERRQ(ierr);
275 ierr = MPI_Op_free(&MPIU_MININDEX_OP);CHKERRQ(ierr);
276 if (Petsc_Reduction_keyval != MPI_KEYVAL_INVALID) {
277 ierr = MPI_Comm_free_keyval(&Petsc_Reduction_keyval);CHKERRQ(ierr);
278 }
279 VecPackageInitialized = PETSC_FALSE;
280 VecRegisterAllCalled = PETSC_FALSE;
281 PetscFunctionReturn(0);
282 }
283
284 #if defined(PETSC_HAVE_DYNAMIC_LIBRARIES)
285 /*
286 PetscDLLibraryRegister - This function is called when the dynamic library it is in is opened.
287
288 This one registers all the methods that are in the basic PETSc Vec library.
289
290 */
PetscDLLibraryRegister_petscvec(void)291 PETSC_EXTERN PetscErrorCode PetscDLLibraryRegister_petscvec(void)
292 {
293 PetscErrorCode ierr;
294
295 PetscFunctionBegin;
296 ierr = PetscSFInitializePackage();CHKERRQ(ierr);
297 ierr = ISInitializePackage();CHKERRQ(ierr);
298 ierr = AOInitializePackage();CHKERRQ(ierr);
299 ierr = VecInitializePackage();CHKERRQ(ierr);
300 ierr = PFInitializePackage();CHKERRQ(ierr);
301 PetscFunctionReturn(0);
302 }
303
304 #endif /* PETSC_HAVE_DYNAMIC_LIBRARIES */
305