Line data Source code
1 : /*
2 : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3 : SLEPc - Scalable Library for Eigenvalue Problem Computations
4 : Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
5 :
6 : This file is part of SLEPc.
7 : SLEPc is distributed under a 2-clause BSD license (see LICENSE).
8 : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9 : */
10 :
11 : static char help[] = "Test VecComp.\n\n";
12 :
13 : #include <slepcsys.h>
14 :
15 3 : int main(int argc,char **argv)
16 : {
17 3 : Vec v,w,x,y,vc,wc,xc,yc,vparent,vchild[2],vecs[2];
18 3 : const Vec *varray;
19 3 : PetscMPIInt size,rank;
20 3 : PetscInt i,n,k,Nx[2];
21 3 : PetscReal norm,normc,norm12[2],norm12c[2],vmax,vmin;
22 3 : PetscScalar dot[2],dotc[2];
23 :
24 3 : PetscFunctionBeginUser;
25 3 : PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
26 3 : PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size));
27 3 : PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank));
28 3 : PetscCheck(size<=2,PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"This test needs one or two processes");
29 3 : PetscCall(PetscPrintf(PETSC_COMM_WORLD,"VecComp test\n"));
30 :
31 : /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
32 : Create standard vectors
33 : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
34 :
35 3 : PetscCall(VecCreate(PETSC_COMM_WORLD,&v));
36 3 : PetscCall(VecSetSizes(v,8/size,8));
37 3 : PetscCall(VecSetFromOptions(v));
38 :
39 3 : if (!rank) {
40 2 : PetscCall(VecSetValue(v,0,2.0,INSERT_VALUES));
41 2 : PetscCall(VecSetValue(v,1,-1.0,INSERT_VALUES));
42 2 : PetscCall(VecSetValue(v,2,3.0,INSERT_VALUES));
43 2 : PetscCall(VecSetValue(v,3,3.5,INSERT_VALUES));
44 : }
45 3 : if ((!rank && size==1) || (rank && size==2)) {
46 2 : PetscCall(VecSetValue(v,4,1.2,INSERT_VALUES));
47 2 : PetscCall(VecSetValue(v,5,1.8,INSERT_VALUES));
48 2 : PetscCall(VecSetValue(v,6,-2.2,INSERT_VALUES));
49 2 : PetscCall(VecSetValue(v,7,2.0,INSERT_VALUES));
50 : }
51 3 : PetscCall(VecAssemblyBegin(v));
52 3 : PetscCall(VecAssemblyEnd(v));
53 3 : PetscCall(VecDuplicate(v,&w));
54 3 : PetscCall(VecSet(w,1.0));
55 3 : PetscCall(VecDuplicate(v,&x));
56 3 : PetscCall(VecDuplicate(v,&y));
57 3 : if (!rank) PetscCall(VecSetValue(y,0,1.0,INSERT_VALUES));
58 3 : PetscCall(VecAssemblyBegin(y));
59 3 : PetscCall(VecAssemblyEnd(y));
60 :
61 : /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
62 : Create veccomp vectors
63 : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
64 :
65 3 : PetscCall(VecCreate(PETSC_COMM_WORLD,&vparent));
66 3 : PetscCall(VecSetSizes(vparent,4/size,4));
67 3 : PetscCall(VecSetFromOptions(vparent));
68 :
69 : /* create a veccomp vector with two subvectors */
70 3 : PetscCall(VecDuplicate(vparent,&vchild[0]));
71 3 : PetscCall(VecDuplicate(vparent,&vchild[1]));
72 3 : if (!rank) {
73 2 : PetscCall(VecSetValue(vchild[0],0,2.0,INSERT_VALUES));
74 2 : PetscCall(VecSetValue(vchild[0],1,-1.0,INSERT_VALUES));
75 2 : PetscCall(VecSetValue(vchild[1],0,1.2,INSERT_VALUES));
76 2 : PetscCall(VecSetValue(vchild[1],1,1.8,INSERT_VALUES));
77 : }
78 3 : if ((!rank && size==1) || (rank && size==2)) {
79 2 : PetscCall(VecSetValue(vchild[0],2,3.0,INSERT_VALUES));
80 2 : PetscCall(VecSetValue(vchild[0],3,3.5,INSERT_VALUES));
81 2 : PetscCall(VecSetValue(vchild[1],2,-2.2,INSERT_VALUES));
82 2 : PetscCall(VecSetValue(vchild[1],3,2.0,INSERT_VALUES));
83 : }
84 3 : PetscCall(VecAssemblyBegin(vchild[0]));
85 3 : PetscCall(VecAssemblyBegin(vchild[1]));
86 3 : PetscCall(VecAssemblyEnd(vchild[0]));
87 3 : PetscCall(VecAssemblyEnd(vchild[1]));
88 3 : PetscCall(VecCreateCompWithVecs(vchild,2,vparent,&vc));
89 3 : PetscCall(VecDestroy(&vchild[0]));
90 3 : PetscCall(VecDestroy(&vchild[1]));
91 3 : PetscCall(VecView(vc,NULL));
92 :
93 3 : PetscCall(VecGetSize(vc,&k));
94 3 : PetscCheck(k==8,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Vector global length should be 8");
95 :
96 : /* create an empty veccomp vector with two subvectors */
97 3 : Nx[0] = 4;
98 3 : Nx[1] = 4;
99 3 : PetscCall(VecCreateComp(PETSC_COMM_WORLD,Nx,2,VECSTANDARD,vparent,&wc));
100 3 : PetscCall(VecCompGetSubVecs(wc,&n,&varray));
101 3 : PetscCheck(n==2,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"n should be 2");
102 9 : for (i=0;i<2;i++) PetscCall(VecSet(varray[i],1.0));
103 :
104 3 : PetscCall(VecGetSize(wc,&k));
105 3 : PetscCheck(k==8,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Vector global length should be 8");
106 :
107 : /* duplicate a veccomp */
108 3 : PetscCall(VecDuplicate(vc,&xc));
109 :
110 : /* create a veccomp via VecSetType */
111 3 : PetscCall(VecCreate(PETSC_COMM_WORLD,&yc));
112 3 : PetscCall(VecSetType(yc,VECCOMP));
113 3 : PetscCall(VecSetSizes(yc,8/size,8));
114 3 : PetscCall(VecCompSetSubVecs(yc,2,NULL));
115 :
116 3 : PetscCall(VecCompGetSubVecs(yc,&n,&varray));
117 3 : PetscCheck(n==2,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"n should be 2");
118 3 : if (!rank) PetscCall(VecSetValue(varray[0],0,1.0,INSERT_VALUES));
119 3 : PetscCall(VecAssemblyBegin(varray[0]));
120 3 : PetscCall(VecAssemblyEnd(varray[0]));
121 :
122 : /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
123 : Operate with vectors
124 : - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
125 :
126 3 : PetscCall(VecCopy(w,x));
127 3 : PetscCall(VecAXPBY(x,1.0,-2.0,v));
128 3 : PetscCall(VecNorm(x,NORM_2,&norm));
129 3 : PetscCall(VecCopy(wc,xc));
130 3 : PetscCall(VecAXPBY(xc,1.0,-2.0,vc));
131 3 : PetscCall(VecNorm(xc,NORM_2,&normc));
132 3 : PetscCheck(PetscAbsReal(norm-normc)<10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Norms are different");
133 :
134 3 : PetscCall(VecCopy(w,x));
135 3 : PetscCall(VecWAXPY(x,-2.0,w,v));
136 3 : PetscCall(VecNorm(x,NORM_2,&norm));
137 3 : PetscCall(VecCopy(wc,xc));
138 3 : PetscCall(VecWAXPY(xc,-2.0,wc,vc));
139 3 : PetscCall(VecNorm(xc,NORM_2,&normc));
140 3 : PetscCheck(PetscAbsReal(norm-normc)<10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Norms are different");
141 :
142 3 : PetscCall(VecAXPBYPCZ(y,3.0,-1.0,1.0,w,v));
143 3 : PetscCall(VecNorm(y,NORM_2,&norm));
144 3 : PetscCall(VecAXPBYPCZ(yc,3.0,-1.0,1.0,wc,vc));
145 3 : PetscCall(VecNorm(yc,NORM_2,&normc));
146 3 : PetscCheck(PetscAbsReal(norm-normc)<10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Norms are different");
147 :
148 3 : PetscCall(VecMax(xc,NULL,&vmax));
149 3 : PetscCall(VecMin(xc,NULL,&vmin));
150 3 : PetscCall(PetscPrintf(PETSC_COMM_WORLD,"xc has max value %g min value %g\n",(double)vmax,(double)vmin));
151 :
152 3 : PetscCall(VecMaxPointwiseDivide(wc,xc,&vmax));
153 3 : PetscCall(PetscPrintf(PETSC_COMM_WORLD,"wc/xc has max value %g\n",(double)vmax));
154 :
155 3 : PetscCall(VecDot(x,y,&dot[0]));
156 3 : PetscCall(VecDot(xc,yc,&dotc[0]));
157 3 : PetscCheck(PetscAbsScalar(dot[0]-dotc[0])<10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Dots are different");
158 3 : PetscCall(VecTDot(x,y,&dot[0]));
159 3 : PetscCall(VecTDot(xc,yc,&dotc[0]));
160 3 : PetscCheck(PetscAbsScalar(dot[0]-dotc[0])<10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Dots are different");
161 :
162 3 : vecs[0] = w; vecs[1] = y;
163 3 : PetscCall(VecMDot(x,2,vecs,dot));
164 3 : vecs[0] = wc; vecs[1] = yc;
165 3 : PetscCall(VecMDot(xc,2,vecs,dotc));
166 3 : PetscCheck(PetscAbsScalar(dot[0]-dotc[0])<10*PETSC_MACHINE_EPSILON || PetscAbsScalar(dot[1]-dotc[1])>10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Dots are different");
167 3 : vecs[0] = w; vecs[1] = y;
168 3 : PetscCall(VecMTDot(x,2,vecs,dot));
169 3 : vecs[0] = wc; vecs[1] = yc;
170 3 : PetscCall(VecMTDot(xc,2,vecs,dotc));
171 3 : PetscCheck(PetscAbsScalar(dot[0]-dotc[0])<10*PETSC_MACHINE_EPSILON || PetscAbsScalar(dot[1]-dotc[1])>10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Dots are different");
172 :
173 3 : PetscCall(VecDotNorm2(x,y,&dot[0],&norm));
174 3 : PetscCall(VecDotNorm2(xc,yc,&dotc[0],&normc));
175 3 : PetscCheck(PetscAbsScalar(dot[0]-dotc[0])<10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Dots are different");
176 3 : PetscCheck(PetscAbsReal(norm-normc)<100*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Norms are different");
177 :
178 3 : PetscCall(VecAbs(w));
179 3 : PetscCall(VecAbs(wc));
180 3 : PetscCall(VecConjugate(x));
181 3 : PetscCall(VecConjugate(xc));
182 3 : PetscCall(VecShift(y,0.5));
183 3 : PetscCall(VecShift(yc,0.5));
184 3 : PetscCall(VecReciprocal(y));
185 3 : PetscCall(VecReciprocal(yc));
186 3 : PetscCall(VecExp(y));
187 3 : PetscCall(VecExp(yc));
188 3 : PetscCall(VecLog(y));
189 3 : PetscCall(VecLog(yc));
190 3 : PetscCall(VecNorm(y,NORM_1,&norm));
191 3 : PetscCall(VecNorm(yc,NORM_1,&normc));
192 3 : PetscCheck(PetscAbsReal(norm-normc)<10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Norms are different");
193 :
194 3 : PetscCall(VecPointwiseMult(w,x,y));
195 3 : PetscCall(VecPointwiseMult(wc,xc,yc));
196 3 : PetscCall(VecNorm(w,NORM_INFINITY,&norm));
197 3 : PetscCall(VecNorm(wc,NORM_INFINITY,&normc));
198 3 : PetscCheck(PetscAbsReal(norm-normc)<10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Norms are different");
199 :
200 3 : PetscCall(VecPointwiseMax(w,x,y));
201 3 : PetscCall(VecPointwiseMax(wc,xc,yc));
202 3 : PetscCall(VecNorm(w,NORM_INFINITY,&norm));
203 3 : PetscCall(VecNorm(wc,NORM_INFINITY,&normc));
204 3 : PetscCheck(PetscAbsReal(norm-normc)<10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Norms are different");
205 :
206 3 : PetscCall(VecSwap(x,y));
207 3 : PetscCall(VecSwap(xc,yc));
208 3 : PetscCall(VecPointwiseDivide(w,x,y));
209 3 : PetscCall(VecPointwiseDivide(wc,xc,yc));
210 3 : PetscCall(VecScale(w,0.3));
211 3 : PetscCall(VecScale(wc,0.3));
212 3 : PetscCall(VecSqrtAbs(w));
213 3 : PetscCall(VecSqrtAbs(wc));
214 3 : PetscCall(VecNorm(w,NORM_1_AND_2,norm12));
215 3 : PetscCall(VecNorm(wc,NORM_1_AND_2,norm12c));
216 3 : PetscCheck(PetscAbsReal(norm12[0]-norm12c[0])<10*PETSC_MACHINE_EPSILON || PetscAbsReal(norm12[1]-norm12c[1])>10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Norms are different");
217 :
218 3 : PetscCall(VecPointwiseMin(w,x,y));
219 3 : PetscCall(VecPointwiseMin(wc,xc,yc));
220 3 : PetscCall(VecPointwiseMaxAbs(x,y,w));
221 3 : PetscCall(VecPointwiseMaxAbs(xc,yc,wc));
222 3 : PetscCall(VecNorm(x,NORM_INFINITY,&norm));
223 3 : PetscCall(VecNorm(xc,NORM_INFINITY,&normc));
224 3 : PetscCheck(PetscAbsReal(norm-normc)<10*PETSC_MACHINE_EPSILON,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Norms are different");
225 :
226 3 : PetscCall(VecSetRandom(wc,NULL));
227 :
228 3 : PetscCall(VecDestroy(&v));
229 3 : PetscCall(VecDestroy(&w));
230 3 : PetscCall(VecDestroy(&x));
231 3 : PetscCall(VecDestroy(&y));
232 3 : PetscCall(VecDestroy(&vparent));
233 3 : PetscCall(VecDestroy(&vc));
234 3 : PetscCall(VecDestroy(&wc));
235 3 : PetscCall(VecDestroy(&xc));
236 3 : PetscCall(VecDestroy(&yc));
237 3 : PetscCall(SlepcFinalize());
238 : return 0;
239 : }
240 :
241 : /*TEST
242 :
243 : test:
244 : suffix: 1
245 :
246 : test:
247 : suffix: 2
248 : nsize: 2
249 :
250 : TEST*/
|