Actual source code: test3.c
slepc-3.22.1 2024-10-28
1: /*
2: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3: SLEPc - Scalable Library for Eigenvalue Problem Computations
4: Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
6: This file is part of SLEPc.
7: SLEPc is distributed under a 2-clause BSD license (see LICENSE).
8: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9: */
11: static char help[] = "Test SVD with user-provided initial vectors.\n\n"
12: "The command line options are:\n"
13: " -n <n>, where <n> = row dimension.\n"
14: " -m <m>, where <m> = column dimension.\n\n";
16: #include <slepcsvd.h>
18: /*
19: This example computes the singular values of a rectangular nxm Grcar matrix:
21: | 1 1 1 1 |
22: | -1 1 1 1 1 |
23: | -1 1 1 1 1 |
24: A = | . . . . . |
25: | . . . . . |
26: | -1 1 1 1 1 |
27: | -1 1 1 1 |
29: */
31: int main(int argc,char **argv)
32: {
33: Mat A; /* Grcar matrix */
34: SVD svd; /* singular value solver context */
35: Vec v0,w0; /* initial vectors */
36: Vec *U,*V;
37: PetscInt N=35,M=30,Istart,Iend,i,col[5],nconv;
38: PetscScalar value[] = { -1, 1, 1, 1, 1 };
39: PetscReal lev1=0.0,lev2=0.0,tol=PETSC_SMALL;
40: PetscBool skiporth=PETSC_FALSE;
42: PetscFunctionBeginUser;
43: PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
44: PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&N,NULL));
45: PetscCall(PetscOptionsGetInt(NULL,NULL,"-m",&M,NULL));
46: PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nSVD of a rectangular Grcar matrix, %" PetscInt_FMT "x%" PetscInt_FMT "\n\n",N,M));
47: PetscCall(PetscOptionsGetBool(NULL,NULL,"-skiporth",&skiporth,NULL));
49: /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
50: Generate the matrix
51: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
53: PetscCall(MatCreate(PETSC_COMM_WORLD,&A));
54: PetscCall(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,N,M));
55: PetscCall(MatSetFromOptions(A));
57: PetscCall(MatGetOwnershipRange(A,&Istart,&Iend));
58: for (i=Istart;i<Iend;i++) {
59: col[0]=i-1; col[1]=i; col[2]=i+1; col[3]=i+2; col[4]=i+3;
60: if (i==0) PetscCall(MatSetValues(A,1,&i,PetscMin(4,M-i+1),col+1,value+1,INSERT_VALUES));
61: else PetscCall(MatSetValues(A,1,&i,PetscMin(5,M-i+1),col,value,INSERT_VALUES));
62: }
63: PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY));
64: PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY));
66: /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
67: Create the SVD context and solve the problem
68: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
70: PetscCall(SVDCreate(PETSC_COMM_WORLD,&svd));
71: PetscCall(SVDSetOperators(svd,A,NULL));
72: PetscCall(SVDSetFromOptions(svd));
74: /*
75: Set the initial vectors. This is optional, if not done the initial
76: vectors are set to random values
77: */
78: PetscCall(MatCreateVecs(A,&v0,&w0));
79: PetscCall(VecSet(v0,1.0));
80: PetscCall(VecSet(w0,1.0));
81: PetscCall(SVDSetInitialSpaces(svd,1,&v0,1,&w0));
83: /*
84: Compute solution
85: */
86: PetscCall(SVDSolve(svd));
87: PetscCall(SVDErrorView(svd,SVD_ERROR_RELATIVE,NULL));
89: /*
90: Check orthonormality of computed singular vectors
91: */
92: PetscCall(SVDGetConverged(svd,&nconv));
93: if (nconv>1) {
94: PetscCall(VecDuplicateVecs(w0,nconv,&U));
95: PetscCall(VecDuplicateVecs(v0,nconv,&V));
96: for (i=0;i<nconv;i++) PetscCall(SVDGetSingularTriplet(svd,i,NULL,U[i],V[i]));
97: if (!skiporth) {
98: PetscCall(VecCheckOrthonormality(U,nconv,NULL,nconv,NULL,NULL,&lev1));
99: PetscCall(VecCheckOrthonormality(V,nconv,NULL,nconv,NULL,NULL,&lev2));
100: }
101: if (lev1+lev2<20*tol) PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Level of orthogonality below the tolerance\n"));
102: else PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Level of orthogonality: %g (U) %g (V)\n",(double)lev1,(double)lev2));
103: PetscCall(VecDestroyVecs(nconv,&U));
104: PetscCall(VecDestroyVecs(nconv,&V));
105: }
107: /*
108: Free work space
109: */
110: PetscCall(VecDestroy(&v0));
111: PetscCall(VecDestroy(&w0));
112: PetscCall(SVDDestroy(&svd));
113: PetscCall(MatDestroy(&A));
114: PetscCall(SlepcFinalize());
115: return 0;
116: }
118: /*TEST
120: testset:
121: args: -svd_nsv 4
122: output_file: output/test3_1.out
123: filter: sed -e "s/22176/22175/" | sed -e "s/21798/21797/" | sed -e "s/16826/16825/" | sed -e "s/15129/15128/" | sed -e "s/22200/22201/"
124: test:
125: suffix: 1_lanczos
126: args: -svd_type lanczos
127: test:
128: suffix: 1_lanczos_one
129: args: -svd_type lanczos -svd_lanczos_oneside
130: test:
131: suffix: 1_trlanczos
132: args: -svd_type trlanczos -svd_trlanczos_locking {{0 1}}
133: test:
134: suffix: 1_trlanczos_one
135: args: -svd_type trlanczos -svd_trlanczos_oneside
136: test:
137: suffix: 1_trlanczos_one_mgs
138: args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_type mgs
139: test:
140: suffix: 1_trlanczos_one_always
141: args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_refine always
142: test:
143: suffix: 1_cross
144: args: -svd_type cross
145: test:
146: suffix: 1_cross_exp
147: args: -svd_type cross -svd_cross_explicitmatrix
148: test:
149: suffix: 1_cyclic
150: args: -svd_type cyclic
151: requires: !__float128
152: test:
153: suffix: 1_cyclic_exp
154: args: -svd_type cyclic -svd_cyclic_explicitmatrix
155: requires: !__float128
156: test:
157: suffix: 1_lapack
158: args: -svd_type lapack
159: test:
160: suffix: 1_randomized
161: args: -svd_type randomized
162: test:
163: suffix: 1_primme
164: args: -svd_type primme
165: requires: primme
167: testset:
168: args: -svd_implicittranspose -svd_nsv 4 -svd_tol 1e-5
169: output_file: output/test3_1.out
170: filter: sed -e "s/22176/22175/" | sed -e "s/21798/21797/" | sed -e "s/16826/16825/" | sed -e "s/15129/15128/" | sed -e "s/22200/22201/"
171: test:
172: suffix: 2_lanczos
173: args: -svd_type lanczos -svd_conv_norm
174: test:
175: suffix: 2_lanczos_one
176: args: -svd_type lanczos -svd_lanczos_oneside
177: test:
178: suffix: 2_trlanczos
179: args: -svd_type trlanczos
180: test:
181: suffix: 2_trlanczos_one
182: args: -svd_type trlanczos -svd_trlanczos_oneside
183: test:
184: suffix: 2_trlanczos_one_mgs
185: args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_type mgs
186: test:
187: suffix: 2_trlanczos_one_always
188: args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_refine always
189: test:
190: suffix: 2_cross
191: args: -svd_type cross
192: test:
193: suffix: 2_cross_exp
194: args: -svd_type cross -svd_cross_explicitmatrix
195: requires: !complex
196: test:
197: suffix: 2_cyclic
198: args: -svd_type cyclic -svd_tol 1e-9
199: requires: double
200: test:
201: suffix: 2_lapack
202: args: -svd_type lapack
203: test:
204: suffix: 2_randomized
205: args: -svd_type randomized
207: testset:
208: args: -svd_nsv 4 -mat_type aijcusparse
209: requires: cuda
210: output_file: output/test3_1.out
211: filter: sed -e "s/22176/22175/" | sed -e "s/21798/21797/" | sed -e "s/16826/16825/" | sed -e "s/15129/15128/"
212: test:
213: suffix: 3_cuda_lanczos
214: args: -svd_type lanczos
215: test:
216: suffix: 3_cuda_lanczos_one
217: args: -svd_type lanczos -svd_lanczos_oneside
218: test:
219: suffix: 3_cuda_trlanczos
220: args: -svd_type trlanczos
221: test:
222: suffix: 3_cuda_trlanczos_one
223: args: -svd_type trlanczos -svd_trlanczos_oneside
224: test:
225: suffix: 3_cuda_trlanczos_one_mgs
226: args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_type mgs
227: test:
228: suffix: 3_cuda_trlanczos_one_always
229: args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_refine always
230: test:
231: suffix: 3_cuda_cross
232: args: -svd_type cross
233: test:
234: suffix: 3_cuda_cyclic
235: args: -svd_type cyclic
236: test:
237: suffix: 3_cuda_cyclic_exp
238: args: -svd_type cyclic -svd_cyclic_explicitmatrix
239: test:
240: suffix: 3_cuda_randomized
241: args: -svd_type randomized
243: test:
244: suffix: 4
245: args: -svd_type lapack -svd_nsv 4
246: output_file: output/test3_1.out
247: filter: sed -e "s/15129/15128/" | sed -e "s/21798/21797/"
248: nsize: 2
250: test:
251: suffix: 5
252: args: -svd_nsv 4 -svd_view_values draw -svd_monitor draw::draw_lg
253: requires: x
254: output_file: output/test3_1.out
256: testset:
257: args: -svd_nsv 4 -mat_type aijhipsparse
258: requires: hip
259: output_file: output/test3_1.out
260: filter: sed -e "s/22176/22175/" | sed -e "s/21798/21797/" | sed -e "s/16826/16825/" | sed -e "s/15129/15128/"
261: test:
262: suffix: 6_hip_lanczos
263: args: -svd_type lanczos
264: test:
265: suffix: 6_hip_lanczos_one
266: args: -svd_type lanczos -svd_lanczos_oneside
267: test:
268: suffix: 6_hip_trlanczos
269: args: -svd_type trlanczos
270: test:
271: suffix: 6_hip_trlanczos_one
272: args: -svd_type trlanczos -svd_trlanczos_oneside
273: test:
274: suffix: 6_hip_trlanczos_one_mgs
275: args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_type mgs
276: test:
277: suffix: 6_hip_trlanczos_one_always
278: args: -svd_type trlanczos -svd_trlanczos_oneside -bv_orthog_refine always
279: test:
280: suffix: 6_hip_cross
281: args: -svd_type cross
282: test:
283: suffix: 6_hip_cyclic
284: args: -svd_type cyclic
285: test:
286: suffix: 6_hip_cyclic_exp
287: args: -svd_type cyclic -svd_cyclic_explicitmatrix
288: test:
289: suffix: 6_hip_randomized
290: args: -svd_type randomized
292: TEST*/