GCC Code Coverage Report


Directory: ./
File: src/svd/tests/test1.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 54 56 96.4%
Functions: 1 1 100.0%
Branches: 166 260 63.8%

Line Branch Exec Source
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 the solution of a SVD without calling SVDSetFromOptions (based on ex8.c).\n\n"
12 "The command line options are:\n"
13 " -n <n>, where <n> = matrix dimension.\n"
14 " -type <svd_type> = svd type to test.\n\n";
15
16 #include <slepcsvd.h>
17
18 /*
19 This example computes the singular values of an nxn Grcar matrix,
20 which is a nonsymmetric Toeplitz matrix:
21
22 | 1 1 1 1 |
23 | -1 1 1 1 1 |
24 | -1 1 1 1 1 |
25 | . . . . . |
26 A = | . . . . . |
27 | -1 1 1 1 1 |
28 | -1 1 1 1 |
29 | -1 1 1 |
30 | -1 1 |
31
32 */
33
34 76 int main(int argc,char **argv)
35 {
36 76 Mat A; /* Grcar matrix */
37 76 SVD svd; /* singular value solver context */
38 76 PetscInt N=30,Istart,Iend,i,col[5],nconv1,nconv2;
39 76 PetscScalar value[] = { -1, 1, 1, 1, 1 };
40 76 PetscReal sigma_1,sigma_n;
41 76 char svdtype[30] = "cross",epstype[30] = "";
42 76 PetscBool flg;
43 76 EPS eps;
44
45
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
76 PetscFunctionBeginUser;
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
47
48
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&N,NULL));
49
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscOptionsGetString(NULL,NULL,"-type",svdtype,sizeof(svdtype),NULL));
50
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscOptionsGetString(NULL,NULL,"-epstype",epstype,sizeof(epstype),&flg));
51
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nEstimate the condition number of a Grcar matrix, n=%" PetscInt_FMT,N));
52
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n\n"));
53
54 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
55 Generate the matrix
56 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
57
58
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatCreate(PETSC_COMM_WORLD,&A));
59
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,N,N));
60
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatSetFromOptions(A));
61
62
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatGetOwnershipRange(A,&Istart,&Iend));
63
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2356 for (i=Istart;i<Iend;i++) {
64 2280 col[0]=i-1; col[1]=i; col[2]=i+1; col[3]=i+2; col[4]=i+3;
65
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
2280 if (i==0) PetscCall(MatSetValues(A,1,&i,4,col+1,value+1,INSERT_VALUES));
66
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2280 else PetscCall(MatSetValues(A,1,&i,PetscMin(5,N-i+1),col,value,INSERT_VALUES));
67 }
68
69
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY));
70
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY));
71
72 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
73 Create the singular value solver and set the solution method
74 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
75
76 /*
77 Create singular value context
78 */
79
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDCreate(PETSC_COMM_WORLD,&svd));
80
81 /*
82 Set operator
83 */
84
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDSetOperators(svd,A,NULL));
85
86 /*
87 Set solver parameters at runtime
88 */
89
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDSetType(svd,svdtype));
90
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
76 if (flg) {
91
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(PetscObjectTypeCompare((PetscObject)svd,SVDCROSS,&flg));
92
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
20 if (flg) {
93
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(SVDCrossGetEPS(svd,&eps));
94
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSSetType(eps,epstype));
95 }
96
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(PetscObjectTypeCompare((PetscObject)svd,SVDCYCLIC,&flg));
97
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
20 if (flg) {
98
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(SVDCyclicGetEPS(svd,&eps));
99
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSSetType(eps,epstype));
100 }
101 }
102
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDSetDimensions(svd,1,PETSC_DETERMINE,PETSC_DETERMINE));
103
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDSetTolerances(svd,1e-6,1000));
104
105 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
106 Compute the singular values
107 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
108
109 /*
110 First request the largest singular value
111 */
112
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDSetWhichSingularTriplets(svd,SVD_LARGEST));
113
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDSolve(svd));
114 /*
115 Get number of converged singular values
116 */
117
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDGetConverged(svd,&nconv1));
118 /*
119 Get converged singular values: largest singular value is stored in sigma_1.
120 In this example, we are not interested in the singular vectors
121 */
122
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
76 if (nconv1 > 0) PetscCall(SVDGetSingularTriplet(svd,0,&sigma_1,NULL,NULL));
123 else PetscCall(PetscPrintf(PETSC_COMM_WORLD," Unable to compute large singular value!\n\n"));
124
125 /*
126 Request the smallest singular value
127 */
128
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDSetWhichSingularTriplets(svd,SVD_SMALLEST));
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDSolve(svd));
130 /*
131 Get number of converged triplets
132 */
133
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDGetConverged(svd,&nconv2));
134 /*
135 Get converged singular values: smallest singular value is stored in sigma_n.
136 As before, we are not interested in the singular vectors
137 */
138
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
76 if (nconv2 > 0) PetscCall(SVDGetSingularTriplet(svd,0,&sigma_n,NULL,NULL));
139 else PetscCall(PetscPrintf(PETSC_COMM_WORLD," Unable to compute small singular value!\n\n"));
140
141 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
142 Display solution and clean up
143 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
144
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
76 if (nconv1 > 0 && nconv2 > 0) {
145
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Computed singular values: sigma_1=%.4f, sigma_n=%.4f\n",(double)sigma_1,(double)sigma_n));
146
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Estimated condition number: sigma_1/sigma_n=%.4f\n\n",(double)(sigma_1/sigma_n)));
147 }
148
149 /*
150 Free work space
151 */
152
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SVDDestroy(&svd));
153
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatDestroy(&A));
154
3/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
76 PetscCall(SlepcFinalize());
155 return 0;
156 }
157
158 /*TEST
159
160 test:
161 suffix: 1
162 args: -type {{lanczos trlanczos cross cyclic lapack}}
163
164 test:
165 suffix: 1_cross_gd
166 args: -type cross -epstype gd
167 output_file: output/test1_1.out
168
169 test:
170 suffix: 1_cyclic_gd
171 args: -type cyclic -epstype gd
172 output_file: output/test1_1.out
173 requires: !single
174
175 test:
176 suffix: 1_primme
177 args: -type primme
178 requires: primme
179 output_file: output/test1_1.out
180
181 TEST*/
182