GCC Code Coverage Report


Directory: ./
File: src/svd/tutorials/ex53.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 441 451 97.8%
Functions: 21 21 100.0%
Branches: 867 1458 59.5%

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[] = "Partial hyperbolic singular value decomposition (HSVD) of matrix generated by plane rotations.\n\n"
12 "The command line options are:\n"
13 " -p <p>, number of rows in upper part of matrix A.\n"
14 " -q <q>, number of rows in lower part of matrix A.\n"
15 " -n <n>, number of columns of matrix A.\n"
16 " -k <k>, condition number.\n"
17 " -d <d>, density.\n"
18 " -prog, show progress of matrix generation\n";
19
20 #include <slepcsvd.h>
21 #include <slepcblaslapack.h>
22
23 /* The problem matrix is the (p+q)-by-n matrix
24
25 A = | Q1 * D1 * U |
26 | 1/2*Q2 * D2 * U |
27
28 with p>=n, where Q1 (p-by-p), Q2 (q-by-q) and U (n-by-n) are orthonormal
29 matrices, D1 is a diagonal p-by-n matrix with elements
30 D1(i,i) = sqrt(5/4)*d(i), if i<=q
31 = d(i), if i>q
32 D2 is a diagonal q-by-n matrix with elements D2(i,i)= d(i),
33 and d is an n-element vector with elements distributed exponentially
34 from 1/k to 1.
35
36 The signature matrix is Omega = diag(I_p,-I_q)
37
38 The hyperbolic singular values of A are equal to the elements of vector d.
39
40 A is generated by random plane rotations applied to the diagonal matrices
41 D1 and D2
42
43 This test case is based on the paper:
44
45 [1] A. Bojanczyk, N.J. Higham, and H. Patel, "Solving the Indefinite Least
46 Squares Problem by Hyperbolic QR Factorization", SIAM J. Matrix Anal.
47 Appl. 24(4):914-931 2003
48 */
49
50 /* Timing */
51 #ifdef TIMING
52 static PetscReal tt_rotr,tt_rotc,tt_assmr=0.0,tt_assmc=0.0,tt_getr=0.0,tt_getc=0.0,tt_setvalr=0.0,tt_setvalc=0.0;
53 #define time_now(t) t=MPI_Wtime();
54 #define time_diff(tacum,t0,t,t1) {t=MPI_Wtime(); tacum += t-t0; t1=t;}
55 #else
56 #define time_diff(tacum,t0,t,t1)
57 #define time_now(t)
58 #endif
59
60 struct _p_XMat {
61 MPI_Comm comm;
62 PetscInt M,N; /* global number of rows and columns */
63 PetscInt Istart,Iend; /* Index of 1st row and last local rows */
64 PetscInt *nzr; /* number of non-zeros in each row */
65 PetscInt **rcol; /* row columns */
66 PetscInt *ranges; /* proc row ranges */
67 PetscScalar **rval; /* row values */
68 };
69
70 typedef struct _p_XMat *XMat;
71
72 /* Iterator over non-zero rows of 2 columns */
73 struct _p_ColsNzIter {
74 XMat A;
75 PetscInt j1,j2; /* Columns considered */
76 PetscInt iloc; /* current local row */
77 };
78
79 typedef struct _p_ColsNzIter *ColsNzIter;
80
81 120 static PetscErrorCode XMatCreate(MPI_Comm comm,XMat *A,PetscInt Istart,PetscInt Iend,PetscInt M,PetscInt N)
82 {
83 120 PetscInt i;
84 120 PetscMPIInt np;
85
86
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
120 PetscFunctionBeginUser;
87
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.
120 PetscCall(PetscNew(A));
88 120 (*A)->M = M;
89 120 (*A)->N = N;
90 120 (*A)->Istart = Istart;
91 120 (*A)->Iend = Iend;
92 120 (*A)->comm = comm;
93
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
120 PetscCallMPI(MPI_Comm_size(comm,&np));
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.
120 PetscCall(PetscMalloc4(Iend-Istart,&(*A)->nzr,Iend-Istart,&(*A)->rcol,Iend-Istart,&(*A)->rval,np+1,&(*A)->ranges));
95
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
15320 for (i=0; i<Iend-Istart; i++) {
96 15200 (*A)->nzr[i] = 0;
97 15200 (*A)->rcol[i] = NULL;
98 15200 (*A)->rval[i] = NULL;
99 }
100
15/30
✓ 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 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
240 PetscCallMPI(MPI_Allgather(&Istart,1,MPIU_INT,(*A)->ranges,1,MPIU_INT,comm));
101 120 (*A)->ranges[np]=M;
102
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
120 PetscFunctionReturn(PETSC_SUCCESS);
103 }
104
105 120 static PetscErrorCode XMatDestroy(XMat *A)
106 {
107 120 PetscInt m,i;
108
109
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
120 PetscFunctionBeginUser;
110 120 m = (*A)->Iend-(*A)->Istart;
111
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
15320 for (i=0; i<m; i++) {
112
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
15200 if ((*A)->nzr[i]>0) {
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.
15200 PetscCall(PetscFree2((*A)->rcol[i],(*A)->rval[i]));
114 }
115 }
116
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.
120 PetscCall(PetscFree4((*A)->nzr,(*A)->rcol,(*A)->rval,(*A)->ranges));
117
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.
120 PetscCall(PetscFree(*A));
118 120 *A = NULL;
119
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
120 PetscFunctionReturn(PETSC_SUCCESS);
120 }
121
122 12640 static PetscErrorCode XMatGetSize(XMat A,PetscInt *M,PetscInt *N)
123 {
124
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
12640 PetscFunctionBeginUser;
125 12640 *M = A->M;
126 12640 *N = A->N;
127
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
12640 PetscFunctionReturn(PETSC_SUCCESS);
128 }
129
130 17760 static PetscErrorCode XMatGetOwnershipRange(XMat A,PetscInt *Istart,PetscInt *Iend)
131 {
132
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
17760 PetscFunctionBeginUser;
133 17760 *Istart = A->Istart;
134 17760 *Iend = A->Iend;
135
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
17760 PetscFunctionReturn(PETSC_SUCCESS);
136 }
137
138 1600 static PetscErrorCode XMatGetOwnershipRanges(XMat A,PetscInt **ranges)
139 {
140
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1600 PetscFunctionBeginUser;
141 1600 *ranges = A->ranges;
142
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
1600 PetscFunctionReturn(PETSC_SUCCESS);
143 }
144
145 23680 static PetscErrorCode XMatGetRow(XMat A,PetscInt i,PetscInt *nc,PetscInt **vj,PetscScalar **va)
146 {
147 23680 PetscInt iloc=i-A->Istart;
148
149
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
23680 PetscFunctionBeginUser;
150 23680 *nc = A->nzr[iloc];
151 23680 *vj = A->rcol[iloc];
152 23680 *va = A->rval[iloc];
153
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
23680 PetscFunctionReturn(PETSC_SUCCESS);
154 }
155
156 23680 static PetscErrorCode XMatRestoreRow(XMat A,PetscInt i,PetscInt *nc,PetscInt **vj,PetscScalar **va)
157 {
158
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
23680 PetscFunctionBeginUser;
159 23680 *nc = 0;
160 23680 *vj = NULL;
161 23680 *va = NULL;
162
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
23680 PetscFunctionReturn(PETSC_SUCCESS);
163 }
164
165 121600 static PetscErrorCode XMatChangeRow(XMat A,PetscInt i,PetscInt nc,PetscInt vj[],PetscScalar va[])
166 {
167 121600 PetscInt iloc = i-A->Istart;
168
169
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
121600 PetscFunctionBeginUser;
170
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
121600 if (A->nzr[iloc]>0) {
171
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.
120880 PetscCall(PetscFree2(A->rcol[iloc],A->rval[iloc]));
172 }
173 121600 A->nzr[iloc] = nc;
174 121600 A->rcol[iloc] = vj;
175 121600 A->rval[iloc] = va;
176
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
121600 PetscFunctionReturn(PETSC_SUCCESS);
177 }
178
179 /* Given a row with non-zero elements in columns indicated by rcol, get the
180 position where the non-zero element of column j is, or where it should be inserted.
181 Returns true if there is a non-zero element for the column, false otherwise */
182 2264000 static PetscBool getcolpos(const PetscInt rcol[],PetscInt nz,PetscInt j,PetscInt *k)
183 {
184 2264000 PetscInt ka,kb;
185
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2264000 if (nz==0) {
186 239520 *k = 0;
187 239520 return PETSC_FALSE;
188 }
189
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2024480 if (j<=rcol[0]) {
190 675040 *k = 0;
191 675040 return (rcol[0]==j)? PETSC_TRUE: PETSC_FALSE;
192 }
193
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1349440 if (rcol[nz-1]<=j) {
194 456800 *k = nz-(rcol[nz-1]==j);
195 456800 return (rcol[nz-1]==j)? PETSC_TRUE: PETSC_FALSE;
196 }
197 /* Bisection: rcol[ka] < j < rcol[kb] */
198 892640 ka = 0; kb = nz-1;
199
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2770480 while (ka+1<kb) {
200 1950480 *k = (ka+kb)/2;
201
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1950480 if (rcol[*k]<=j) {
202
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980320 if (rcol[*k]==j) return PETSC_TRUE;
203 else ka = *k;
204 } else kb = *k;
205 }
206 820000 *k = kb;
207 820000 return PETSC_FALSE;
208 }
209
210 /* Only local elements can be set */
211 14400 static PetscErrorCode XMatSetValue(XMat A,PetscInt i,PetscInt j,PetscScalar x,InsertMode dummy)
212 {
213 14400 PetscInt nz,iloc,k,kx,*col1,*col2;
214 14400 PetscScalar *val1,*val2;
215
216
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
14400 PetscFunctionBeginUser;
217
4/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
14400 PetscCheck(i>=A->Istart && i<A->Iend && j>=0 && j<A->N,A->comm,PETSC_ERR_ARG_OUTOFRANGE,"Incorrect index of row/column");
218 14400 iloc = i-A->Istart;
219 14400 nz = A->nzr[iloc];
220 14400 col1 = A->rcol[iloc];
221 14400 val1 = A->rval[iloc];
222
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
14400 if (!getcolpos(col1,nz,j,&k)) {
223 14400 A->nzr[iloc]++;
224 /* Replace row */
225
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.
14400 PetscCall(PetscMalloc2(nz+1,&col2,nz+1,&val2));
226 14400 A->rcol[iloc] = col2;
227 14400 A->rval[iloc] = val2;
228
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
14400 for (kx=0; kx<k; kx++) {
229 col2[kx] = col1[kx];
230 val2[kx] = val1[kx];
231 }
232
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
14400 for (; kx<nz; kx++) {
233 col2[kx+1] = col1[kx];
234 val2[kx+1] = val1[kx];
235 }
236
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
14400 if (nz>0) {
237 PetscCall(PetscFree2(col1,val1));
238 }
239 14400 col1 = col2;
240 14400 val1 = val2;
241 }
242 14400 col1[k] = j;
243 14400 val1[k] = x;
244
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
14400 PetscFunctionReturn(PETSC_SUCCESS);
245 }
246
247 /* Convert to PETSc Mat */
248 120 static PetscErrorCode XMatConvert(XMat XA,Mat A)
249 {
250 120 PetscInt i,iloc;
251
252
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
120 PetscFunctionBeginUser;
253
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
15320 for (i=XA->Istart; i<XA->Iend; i++) {
254 15200 iloc = i-XA->Istart;
255
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.
15200 PetscCall(MatSetValues(A,1,&i,XA->nzr[iloc],XA->rcol[iloc],XA->rval[iloc],INSERT_VALUES));
256 }
257
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.
120 PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY));
258
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.
120 PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY));
259
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
24 PetscFunctionReturn(PETSC_SUCCESS);
260 }
261
262 /* gets the number of nonzeros in the matrix on this MPI rank */
263 120 static PetscErrorCode XMatGetNumberNonzeros(XMat A,PetscInt *nz)
264 {
265 120 PetscInt i;
266
267
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
120 PetscFunctionBeginUser;
268 120 *nz = 0;
269
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
15320 for (i=0; i<A->Iend-A->Istart; i++) *nz += A->nzr[i];
270
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
120 PetscFunctionReturn(PETSC_SUCCESS);
271 }
272
273 8880 static PetscErrorCode XMatCreateColsNzIter(XMat A,PetscInt j1,PetscInt j2,ColsNzIter *iter)
274 {
275
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8880 PetscFunctionBeginUser;
276
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.
8880 PetscCall(PetscNew(iter));
277 8880 (*iter)->A = A;
278 8880 (*iter)->j1 = j1;
279 8880 (*iter)->j2 = j2;
280 8880 (*iter)->iloc = 0;
281
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
8880 PetscFunctionReturn(PETSC_SUCCESS);
282 }
283
284 8880 static PetscErrorCode ColitDestroy(ColsNzIter *iter)
285 {
286
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8880 PetscFunctionBeginUser;
287
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.
8880 PetscCall(PetscFree(*iter));
288
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
1776 PetscFunctionReturn(PETSC_SUCCESS);
289 }
290
291 115600 static PetscErrorCode ColitNextRow(ColsNzIter iter,PetscInt *i,PetscScalar **paij1,PetscScalar **paij2)
292 {
293 115600 PetscInt iloc = iter->iloc,*rcol,nz,k,k1,k2,kx,jx,*rcol2;
294 115600 PetscScalar *rval,*rval2;
295 115600 PetscBool found1, found2;
296 115600 XMat A=iter->A;
297
298
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
115600 PetscFunctionBeginUser;
299 115600 *i = -1;
300 115600 *paij1 = *paij2 = NULL;
301
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
115600 if (iloc>=0) {
302 114880 rcol = A->rcol[iloc];
303 114880 nz = A->nzr[iloc];
304 2134720 while (PETSC_TRUE) {
305 1124800 found1 = getcolpos(rcol,nz,iter->j1,&k1);
306
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1124800 found2 = getcolpos(PetscSafePointerPlusOffset(rcol,k1+found1),nz-k1-found1,iter->j2,&k2);
307
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1124800 if (found1 || found2) break;
308 1018080 iloc++;
309
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1018080 if (iloc>=A->Iend-A->Istart) {
310 iloc = -1;
311 break;
312 }
313 1009920 rcol = A->rcol[iloc];
314 1009920 nz = A->nzr[iloc];
315 }
316
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
114880 if (iloc>=0) {
317 106720 k2 += k1 + 1;
318 106720 rval = A->rval[iloc];
319 106720 *i = A->Istart+iloc;
320
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
106720 if (!found1 || !found2) {
321 /* Copy row to a new one */
322 98080 rcol2 = rcol;
323 98080 rval2 = rval;
324
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.
98080 PetscCall(PetscMalloc2(nz+1,&rcol,nz+1,&rval));
325
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
98080 if (found1) {
326 54720 kx = k2;
327 54720 jx = iter->j2;
328 } else {
329 43360 kx = k1;
330 43360 jx = iter->j1;
331 }
332
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
639760 for (k=0; k<kx; k++) {
333 541680 rcol[k] = rcol2[k];
334 541680 rval[k] = rval2[k];
335 }
336 98080 rcol[kx] = jx;
337 98080 rval[kx] = 0.0;
338
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
727840 for (k=kx+1; k<nz+1; k++) {
339 629760 rcol[k] = rcol2[k-1];
340 629760 rval[k] = rval2[k-1];
341 }
342
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.
98080 PetscCall(XMatChangeRow(A,*i,nz+1,rcol,rval));
343 }
344 106720 *paij1 = &rval[k1];
345 106720 *paij2 = &rval[k2];
346 106720 iloc++;
347
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
106720 if (iloc>=A->Iend-A->Istart) iloc = -1;
348 }
349 114880 iter->iloc = iloc;
350 }
351
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
23120 PetscFunctionReturn(PETSC_SUCCESS);
352 }
353
354 1600 static PetscErrorCode SendrecvRow(XMat A,PetscInt nc1,const PetscInt vj1[],const PetscScalar va1[],PetscInt i2,PetscInt *nc2,PetscInt vj2[],PetscScalar va2[])
355 {
356 1600 PetscInt *ranges,N=A->N;
357 1600 PetscMPIInt rank,naux,len1,len2;
358 1600 MPI_Status st;
359
360
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1600 PetscFunctionBeginUser;
361
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.
1600 PetscCall(XMatGetOwnershipRanges(A,&ranges));
362
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
320 PetscAssertAbort(i2>=0 && i2<A->M,A->comm,PETSC_ERR_ARG_OUTOFRANGE,"Incorrect index of row");
363 /* Find owner of row i2 */
364 320 rank=0;
365
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2400 while (ranges[rank+1]<=i2) rank++;
366 /* Send row i1, receive row i2 */
367
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.
1600 PetscCall(PetscMPIIntCast(nc1,&len1));
368
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.
1600 PetscCall(PetscMPIIntCast(N,&len2));
369
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
1600 PetscCallMPI(MPI_Sendrecv(vj1,len1,MPIU_INT,rank,0,vj2,len2,MPIU_INT,rank,0,A->comm,&st));
370
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
1600 PetscCallMPI(MPI_Sendrecv(va1,len1,MPIU_SCALAR,rank,0,va2,len2,MPIU_SCALAR,rank,0,A->comm,MPI_STATUS_IGNORE));
371
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
1600 PetscCallMPI(MPI_Get_count(&st,MPIU_INT,&naux));
372 1600 *nc2 = (PetscInt)naux;
373
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
1600 PetscFunctionReturn(PETSC_SUCCESS);
374 }
375
376 12640 static PetscErrorCode PadRows(PetscInt nc1,const PetscInt vj1[],const PetscScalar va1[],PetscInt nc2,const PetscInt vj2[],const PetscScalar va2[],PetscInt *nc,PetscInt **vjj1,PetscScalar **vaa1,PetscInt **vjj2,PetscScalar **vaa2,PetscInt *iwork,PetscScalar *swork)
377 {
378 12640 PetscInt k1,k2,k,n1=nc1+nc2,*vjjaux=iwork;
379 12640 PetscScalar *vaa1aux=swork,*vaa2aux=swork+n1;
380
381
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
12640 PetscFunctionBeginUser;
382 12640 *nc=0;
383
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
105600 for (k1=k2=k=0; k1<nc1 && k2<nc2; ) {
384
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
92960 if (vj1[k1]<vj2[k2]) {
385 /* Take next element from first row */
386 43240 vaa1aux[k] = va1[k1];
387 43240 vaa2aux[k] = 0.0;
388 43240 vjjaux[k++] = vj1[k1++];
389
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
49720 } else if (vj1[k1]>vj2[k2]) {
390 /* Take next element from second row */
391 43120 vaa1aux[k] = 0.0;
392 43120 vaa2aux[k] = va2[k2];
393 43120 vjjaux[k++] = vj2[k2++];
394 } else {
395 /* Take next element from both rows */
396 6600 vaa1aux[k] = va1[k1];
397 6600 vaa2aux[k] = va2[k2++];
398 6600 vjjaux[k++] = vj1[k1++];
399 }
400 }
401
402 /* We reached the end of one of the rows. Continue with the other one */
403
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
25560 while (k1<nc1) {
404 /* Take next element from first row */
405 12920 vaa1aux[k] = va1[k1];
406 12920 vaa2aux[k] = 0.0;
407 12920 vjjaux[k++] = vj1[k1++];
408 }
409
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
25800 while (k2<nc2) {
410 /* Take next element from second row */
411 13160 vaa1aux[k] = 0.0;
412 13160 vaa2aux[k] = va2[k2];
413 13160 vjjaux[k++] = vj2[k2++];
414 }
415 12640 *nc=k;
416
417 /* Copy rows (each row must be allocated separately)*/
418
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.
12640 PetscCall(PetscMalloc2(k,vjj1,k,vaa1));
419
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.
12640 PetscCall(PetscMalloc2(k,vjj2,k,vaa2));
420
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.
12640 PetscCall(PetscArraycpy(*vjj1,vjjaux,k));
421
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.
12640 PetscCall(PetscArraycpy(*vjj2,vjjaux,k));
422
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.
12640 PetscCall(PetscArraycpy(*vaa1,vaa1aux,k));
423
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.
12640 PetscCall(PetscArraycpy(*vaa2,vaa2aux,k));
424
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2528 PetscFunctionReturn(PETSC_SUCCESS);
425 }
426
427 1600 static inline void MyAxpby(PetscInt n,PetscScalar a,PetscScalar x[],PetscScalar b,const PetscScalar y[])
428 {
429 1600 PetscInt i;
430
431
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
12800 for (i=0; i<n; i++) x[i] = a*x[i]+b*y[i];
432 }
433
434 /* Apply plane rotation on rows i1, i2 of A */
435 17760 static PetscErrorCode RotateRows(XMat A,PetscInt i1,PetscInt i2,PetscReal c,PetscReal s,PetscInt *nzloc,PetscInt *iwork,PetscScalar *swork)
436 {
437 17760 PetscInt M,N,Istart,Iend,nc,nc1,nc2,*vj1=NULL,*vj2=NULL,*vjj1=NULL,*vjj2=NULL,*iworkx=iwork;
438 17760 PetscBLASInt nc_,one=1;
439 17760 PetscScalar *va1=NULL,*va2=NULL,*vaa1=NULL,*vaa2=NULL,*sworkx=swork;
440 17760 PetscBool i1mine, i2mine;
441 #ifdef TIMING
442 PetscReal t,t0;
443 #endif
444
445
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
17760 PetscFunctionBeginUser;
446
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.
17760 PetscCall(XMatGetOwnershipRange(A,&Istart,&Iend));
447
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
17760 i1mine = (Istart<=i1 && i1<Iend)? PETSC_TRUE: PETSC_FALSE;
448
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
17760 i2mine = (Istart<=i2 && i2<Iend)? PETSC_TRUE: PETSC_FALSE;
449
450
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17760 if (i1mine || i2mine) {
451
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.
12640 PetscCall(XMatGetSize(A,&M,&N));
452
453 /* Get local row(s) (at least 1, possibly 2) */
454 12640 time_now(t0);
455
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.
12640 if (i1mine) PetscCall(XMatGetRow(A,i1,&nc1,&vj1,&va1));
456
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.
12640 if (i2mine) PetscCall(XMatGetRow(A,i2,&nc2,&vj2,&va2));
457 12640 time_diff(tt_getr,t0,t,t0);
458 /* Get remote row (at most 1, possibly none) */
459
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
12640 if (!i2mine) {
460 800 vj2 = iworkx;
461 800 iworkx += N;
462 800 va2 = sworkx;
463 800 sworkx += N;
464
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.
800 PetscCall(SendrecvRow(A,nc1,vj1,va1,i2,&nc2,vj2,va2));
465
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11840 } else if (!i1mine) {
466 800 vj1 = iworkx;
467 800 iworkx += N;
468 800 va1 = sworkx;
469 800 sworkx += N;
470
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.
800 PetscCall(SendrecvRow(A,nc2,vj2,va2,i1,&nc1,vj1,va1));
471 }
472
473
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.
12640 PetscCall(PadRows(nc1,vj1,va1,nc2,vj2,va2,&nc,&vjj1,&vaa1,&vjj2,&vaa2,iworkx,sworkx));
474
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
12640 if (i1mine) {
475 11840 *nzloc += nc-nc1;
476
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.
11840 PetscCall(XMatRestoreRow(A,i1,&nc1,&vj1,&va1));
477 }
478
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
12640 if (i2mine) {
479 11840 *nzloc += nc-nc2;
480
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.
11840 PetscCall(XMatRestoreRow(A,i2,&nc2,&vj2,&va2));
481 }
482
483 /* Compute rotation and update matrix */
484
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
12640 if (nc) {
485
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.
12560 PetscCall(PetscBLASIntCast(nc,&nc_));
486
12/22
✓ 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 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
12560 if (i1mine && i2mine) PetscCallBLAS("BLASrot",BLASMIXEDrot_(&nc_,vaa1,&one,vaa2,&one,&c,&s));
487
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1600 else if (i1mine) {
488 800 MyAxpby(nc,c,vaa1,s,vaa2);
489
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.
800 PetscCall(PetscFree2(vjj2,vaa2));
490 } else {
491 800 MyAxpby(nc,c,vaa2,-s,vaa1);
492
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.
800 PetscCall(PetscFree2(vjj1,vaa1));
493 }
494 12560 time_now(t0);
495
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.
12560 if (i1mine) PetscCall(XMatChangeRow(A,i1,nc,vjj1,vaa1));
496
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.
12560 if (i2mine) PetscCall(XMatChangeRow(A,i2,nc,vjj2,vaa2));
497 3552 time_diff(tt_setvalr,t0,t,t0);
498 }
499 }
500
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
3552 PetscFunctionReturn(PETSC_SUCCESS);
501 }
502
503 /* Apply plane rotation on columns j1, j2 of A */
504 8880 static PetscErrorCode RotateCols(XMat A,PetscInt j1,PetscInt j2,PetscReal c,PetscReal s,PetscInt *nzloc)
505 {
506 8880 PetscInt i;
507 8880 PetscScalar aux1,aux2,*paij1,*paij2;
508 8880 ColsNzIter iter;
509
510
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8880 PetscFunctionBeginUser;
511
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.
8880 PetscCall(XMatCreateColsNzIter(A,j1,j2,&iter));
512 222320 while (PETSC_TRUE) {
513
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.
115600 PetscCall(ColitNextRow(iter,&i,&paij1,&paij2));
514
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
115600 if (i<0) break;
515
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
106720 if (*paij1**paij2==0.0) (*nzloc)++;
516 106720 aux1 = *paij1*c+*paij2*s;
517 106720 aux2 = -*paij1*s+*paij2*c;
518 106720 *paij1 = aux1;
519 106720 *paij2 = aux2;
520 }
521
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.
8880 PetscCall(ColitDestroy(&iter));
522
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
1776 PetscFunctionReturn(PETSC_SUCCESS);
523 }
524
525 /* Generate a pair of indices i1, i2, where 0 <= i1 < i2 < n */
526 26640 static PetscErrorCode GetIndexPair(PetscRandom rand,PetscInt n,PetscInt *i1,PetscInt *i2)
527 {
528 26640 PetscInt aux;
529 26640 PetscReal x;
530
531
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
26640 PetscFunctionBeginUser;
532
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.
26640 PetscCall(PetscRandomGetValueReal(rand,&x));
533 26640 *i1 = (PetscInt)(x*n);
534
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.
26640 PetscCall(PetscRandomGetValueReal(rand,&x));
535 26640 *i2 = (PetscInt)(x*(n-1));
536
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
26640 if (*i2>=*i1) (*i2)++;
537
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
26640 if (*i1>*i2) {
538 13320 aux = *i1;
539 13320 *i1 = *i2;
540 13320 *i2 = aux;
541 }
542
5/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
5328 PetscFunctionReturn(PETSC_SUCCESS);
543 }
544
545 120 int main(int argc,char **argv)
546 {
547 120 Mat A,Omega; /* operator matrix, signature matrix */
548 120 XMat XA;
549 120 SVD svd; /* singular value problem solver context */
550 120 Vec u,v,vomega,*U,*V;
551 120 MatType Atype;
552 120 PetscReal tol,lev1=0.0,lev2=0.0,k=1e3,dens=0.1,log0,loginc,sq,x,angle,c,s;
553 120 PetscScalar *swork;
554 120 PetscInt P=110,Q=80,N=100,i,j,Istart,Iend,nconv,nsv,i1,i2,nroth,nrotv,*iwork,nnzwanted,nz,nzloc;
555 120 PetscBool flg,flgp,flgq,flgn,terse,skiporth=PETSC_FALSE,progress=PETSC_FALSE;
556 120 PetscRandom rand;
557 120 MatInfo Ainfo;
558 #ifdef TIMING
559 PetscReal t,t0;
560 #endif
561
562
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
120 PetscFunctionBeginUser;
563
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.
120 PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
564
565
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.
120 PetscCall(PetscOptionsGetInt(NULL,NULL,"-p",&P,&flgp));
566
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.
120 PetscCall(PetscOptionsGetInt(NULL,NULL,"-q",&Q,&flgq));
567
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.
120 PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&N,&flgn));
568
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.
120 PetscCall(PetscOptionsGetReal(NULL,NULL,"-k",&k,&flg));
569
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.
120 PetscCall(PetscOptionsGetReal(NULL,NULL,"-d",&dens,&flg));
570
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.
120 PetscCall(PetscOptionsGetBool(NULL,NULL,"-prog",&progress,&flg));
571
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
120 if (!flgp && flgn) P=N;
572
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
120 if (!flgq && flgn) Q=N;
573
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
120 PetscCheck(P>=N,PETSC_COMM_WORLD,PETSC_ERR_USER_INPUT,"Parameter p must be >= n");
574
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
120 PetscCheck(k>=1.0,PETSC_COMM_WORLD,PETSC_ERR_USER_INPUT,"Parameter k must be >= 1.0");
575
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
120 PetscCheck(dens<=1.0,PETSC_COMM_WORLD,PETSC_ERR_USER_INPUT,"Parameter d must be <= 1.0");
576
577 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
578 Build matrix that defines the hyperbolic singular value problem
579 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
580
581
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.
120 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nHyperbolic singular value problem.\n\n"));
582
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.
120 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n Matrix dimensions: (%" PetscInt_FMT "+%" PetscInt_FMT ")x%" PetscInt_FMT,P,Q,N));
583
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.
120 PetscCall(PetscPrintf(PETSC_COMM_WORLD,", using signature Omega=blkdiag(I_%" PetscInt_FMT ",-I_%" PetscInt_FMT ")\n\n",P,Q));
584
585
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.
120 PetscCall(MatCreate(PETSC_COMM_WORLD,&A));
586
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.
120 PetscCall(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,P+Q,N));
587
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.
120 PetscCall(MatSetFromOptions(A));
588
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.
120 PetscCall(MatSetOption(A,MAT_IGNORE_OFF_PROC_ENTRIES,PETSC_TRUE));
589
590 /* Set diagonals */
591
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.
120 PetscCall(MatGetOwnershipRange(A,&Istart,&Iend));
592
593
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.
120 PetscCall(XMatCreate(MPI_COMM_WORLD,&XA,Istart,Iend,P+Q,N));
594 120 log0 = PetscLogReal(1/k);
595 120 loginc = -log0/(N-1);
596 120 sq = PetscSqrtReal(5.0/4.0);
597
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
15320 for (i=Istart;i<Iend;i++) {
598
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
15200 if (i<P && i<N) {
599
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8000 if (i<Q) x = sq*PetscExpReal(log0+i*loginc);
600 1600 else x = PetscExpReal(log0+i*loginc);
601
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.
8000 PetscCall(XMatSetValue(XA,i,i,x,INSERT_VALUES));
602
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
7200 } else if (i>=P && i-P<N) {
603 6400 j = i-P;
604
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.
15200 PetscCall(XMatSetValue(XA,i,j,PetscExpReal(log0+j*loginc),INSERT_VALUES));
605 }
606 }
607
608 /* Apply plane rotations */
609 120 nnzwanted = dens*(P+Q)*N;
610
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.
120 PetscCall(XMatGetNumberNonzeros(XA,&nzloc));
611
15/30
✓ 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 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
240 PetscCallMPI(MPI_Allreduce(&nzloc,&nz,1,MPIU_INT,MPI_SUM,MPI_COMM_WORLD));
612
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.
120 PetscCall(PetscRandomCreate(PETSC_COMM_SELF,&rand));
613
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.
120 PetscCall(PetscRandomSetFromOptions(rand));
614 120 nroth = nrotv = 0;
615
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.
120 PetscCall(PetscMalloc2(2*N,&iwork,3*N,&swork));
616 time_now(t0);
617 9000 while (nz<0.95*nnzwanted) {
618 /* Plane rotation on 2 of the top P rows*/
619
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.
8880 PetscCall(PetscRandomGetValueReal(rand,&angle));
620 8880 c=PetscCosReal(angle);
621 8880 s=PetscSinReal(angle);
622
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.
8880 PetscCall(GetIndexPair(rand,P,&i1,&i2));
623
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.
8880 PetscCall(RotateRows(XA,i1,i2,c,s,&nzloc,iwork,swork));
624 8880 time_diff(tt_rotr,t0,t,t0);
625 8880 nroth++;
626 /* Plane rotation on 2 of the bottom Q rows*/
627
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
8880 if (Q>1) {
628
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.
8880 PetscCall(PetscRandomGetValueReal(rand,&angle));
629 8880 c=PetscCosReal(angle);
630 8880 s=PetscSinReal(angle);
631
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.
8880 PetscCall(GetIndexPair(rand,Q,&i1,&i2));
632
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.
8880 PetscCall(RotateRows(XA,P+i1,P+i2,c,s,&nzloc,iwork,swork));
633 8880 time_diff(tt_rotr,t0,t,t0);
634 8880 nroth++;
635 }
636 /* Plane rotation on 2 columns */
637
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.
8880 PetscCall(PetscRandomGetValueReal(rand,&angle));
638 8880 c=PetscCosReal(angle);
639 8880 s=PetscSinReal(angle);
640
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.
8880 PetscCall(GetIndexPair(rand,N,&i1,&i2));
641
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.
8880 PetscCall(RotateCols(XA,i1,i2,c,s,&nzloc));
642 8880 time_diff(tt_rotc,t0,t,t0);
643 8880 nrotv++;
644 /* Update total number of non-zeros */
645
15/30
✓ 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 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
17760 PetscCallMPI(MPI_Allreduce(&nzloc,&nz,1,MPIU_INT,MPI_SUM,MPI_COMM_WORLD));
646
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
17880 if (progress) PetscCall(PetscFPrintf(MPI_COMM_WORLD,stderr,"\rProgress: %.2f%%",(double)nz/nnzwanted*100));
647 }
648
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
120 if (progress) PetscCall(PetscFPrintf(MPI_COMM_WORLD,stderr,"\r"));
649
650
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.
120 PetscCall(PetscFree2(iwork,swork));
651
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.
120 PetscCall(PetscRandomDestroy(&rand));
652
653
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.
120 PetscCall(XMatConvert(XA,A));
654
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.
120 PetscCall(XMatDestroy(&XA));
655
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.
120 PetscCall(MatGetInfo(A,MAT_GLOBAL_SUM,&Ainfo));
656
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.
120 PetscCall(PetscPrintf(MPI_COMM_WORLD," Matrix created. %" PetscInt_FMT " rotations applied. nnz=%.0f. Density: %.4g\n\n",nroth+nrotv,Ainfo.nz_used,(double)Ainfo.nz_used/(1.0*(P+Q)*N)));
657
658 #ifdef TIMING
659 PetscCall(PetscPrintf(MPI_COMM_WORLD,"#T rot-rows: %6.3f get-rows: %6.3f setval-rows: %6.3f assm-rows: %.3f\n",tt_rotr,tt_getr,tt_setvalr,tt_assmr));
660 PetscCall(PetscPrintf(MPI_COMM_WORLD,"#T rot cols: %6.3f get-cols: %6.3f setval-cols: %6.3f assm-cols: %.3f\n",tt_rotc,tt_getc,tt_setvalc,tt_assmc));
661 #endif
662
663 /* scale by 0.5 the lower Q rows of A */
664
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.
120 PetscCall(MatCreateVecs(A,NULL,&vomega));
665
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.
120 PetscCall(VecSet(vomega,1.0));
666
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6520 for (i=PetscMax(P,Istart);i<Iend;i++) {
667
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.
6400 PetscCall(VecSetValue(vomega,i,0.5,INSERT_VALUES));
668 }
669
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.
120 PetscCall(VecAssemblyBegin(vomega));
670
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.
120 PetscCall(VecAssemblyEnd(vomega));
671
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.
120 PetscCall(MatDiagonalScale(A,vomega,NULL));
672
673 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
674 Create the signature
675 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
676
677
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.
120 PetscCall(VecSet(vomega,1.0));
678
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.
120 PetscCall(VecGetOwnershipRange(vomega,&Istart,&Iend));
679
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
15320 for (i=Istart;i<Iend;i++) {
680
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.
15200 if (i>=P) PetscCall(VecSetValue(vomega,i,-1.0,INSERT_VALUES));
681 }
682
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.
120 PetscCall(VecAssemblyBegin(vomega));
683
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.
120 PetscCall(VecAssemblyEnd(vomega));
684
685
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.
120 PetscCall(MatGetType(A,&Atype));
686
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.
120 PetscCall(MatCreate(PETSC_COMM_WORLD,&Omega));
687
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.
120 PetscCall(MatSetSizes(Omega,PETSC_DECIDE,PETSC_DECIDE,P+Q,P+Q));
688
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.
120 PetscCall(MatSetType(Omega,Atype));
689
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.
120 PetscCall(MatDiagonalSet(Omega,vomega,INSERT_VALUES));
690
691 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
692 Create the singular value solver and set various options
693 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
694
695
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.
120 PetscCall(SVDCreate(PETSC_COMM_WORLD,&svd));
696
697
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.
120 PetscCall(SVDSetOperators(svd,A,NULL));
698
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.
120 PetscCall(SVDSetSignature(svd,vomega));
699
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.
120 PetscCall(SVDSetProblemType(svd,SVD_HYPERBOLIC));
700
701
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.
120 PetscCall(SVDSetFromOptions(svd));
702
703 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
704 Solve the problem, display solution
705 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
706
707
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.
120 PetscCall(MatCreateVecs(A,&v,&u));
708
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.
120 PetscCall(SVDSolve(svd));
709
710 /* show detailed info unless -terse option is given by user */
711
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.
120 PetscCall(PetscOptionsHasName(NULL,NULL,"-terse",&terse));
712
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.
120 if (terse) PetscCall(SVDErrorView(svd,SVD_ERROR_NORM,NULL));
713 else {
714 PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO_DETAIL));
715 PetscCall(SVDConvergedReasonView(svd,PETSC_VIEWER_STDOUT_WORLD));
716 PetscCall(SVDErrorView(svd,SVD_ERROR_NORM,PETSC_VIEWER_STDOUT_WORLD));
717 PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD));
718 }
719
720 /* check orthogonality */
721
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.
120 PetscCall(PetscOptionsGetBool(NULL,NULL,"-skiporth",&skiporth,NULL));
722
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.
120 PetscCall(SVDGetConverged(svd,&nconv));
723
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.
120 PetscCall(SVDGetDimensions(svd,&nsv,NULL,NULL));
724 120 nconv = PetscMin(nconv,nsv);
725
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
120 if (nconv>0 && !skiporth) {
726
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.
120 PetscCall(SVDGetTolerances(svd,&tol,NULL));
727
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.
120 PetscCall(VecDuplicateVecs(u,nconv,&U));
728
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.
120 PetscCall(VecDuplicateVecs(v,nconv,&V));
729
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
720 for (i=0;i<nconv;i++) PetscCall(SVDGetSingularTriplet(svd,i,NULL,U[i],V[i]));
730
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.
120 PetscCall(VecCheckOrthonormality(U,nconv,NULL,nconv,Omega,NULL,&lev1));
731
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.
120 PetscCall(VecCheckOrthonormality(V,nconv,NULL,nconv,NULL,NULL,&lev2));
732
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.
120 if (lev1+lev2<20*tol) PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Level of orthogonality below the tolerance\n"));
733 else PetscCall(PetscPrintf(PETSC_COMM_WORLD,"Level of orthogonality: %g (U) %g (V)\n",(double)lev1,(double)lev2));
734
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.
120 PetscCall(VecDestroyVecs(nconv,&U));
735
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.
120 PetscCall(VecDestroyVecs(nconv,&V));
736 }
737
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.
120 PetscCall(VecDestroy(&u));
738
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.
120 PetscCall(VecDestroy(&v));
739
740 /* free work space */
741
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.
120 PetscCall(SVDDestroy(&svd));
742
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.
120 PetscCall(MatDestroy(&Omega));
743
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.
120 PetscCall(MatDestroy(&A));
744
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.
120 PetscCall(VecDestroy(&vomega));
745
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.
120 PetscCall(SlepcFinalize());
746 return 0;
747 }
748
749 /*TEST
750
751 testset:
752 args: -svd_nsv 5 -d .15 -terse
753 output_file: output/ex53_1.out
754 nsize: {{1 2}}
755 test:
756 args: -svd_type trlanczos -ds_parallel {{redundant synchronized}}
757 suffix: 1_trlanczos
758 test:
759 args: -svd_type cross
760 suffix: 1_cross
761 test:
762 args: -svd_type cyclic
763 requires: !single
764 suffix: 1_cyclic
765
766 TEST*/
767