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