GCC Code Coverage Report


Directory: ./
File: src/sys/classes/bv/interface/bvorthog.c
Date: 2026-01-12 03:57:26
Exec Total Coverage
Lines: 368 376 97.9%
Functions: 18 18 100.0%
Branches: 1056 1820 58.0%

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 BV orthogonalization routines
12 */
13
14 #include <slepc/private/bvimpl.h> /*I "slepcbv.h" I*/
15
16 /*
17 BV_NormVecOrColumn - Compute the 2-norm of the working vector, irrespective of
18 whether it is in a column or not
19 */
20 190854 static inline PetscErrorCode BV_NormVecOrColumn(BV bv,PetscInt j,Vec v,PetscReal *nrm)
21 {
22
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
190854 PetscFunctionBegin;
23
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.
190854 if (v) PetscCall(BVNormVec(bv,v,NORM_2,nrm));
24
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.
186355 else PetscCall(BVNormColumn(bv,j,NORM_2,nrm));
25
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
42437 PetscFunctionReturn(PETSC_SUCCESS);
26 }
27
28 /*
29 BVDotColumnInc - Same as BVDotColumn() but also including column j, which
30 is multiplied by itself
31 */
32 2917762 static inline PetscErrorCode BVDotColumnInc(BV X,PetscInt j,PetscScalar *q)
33 {
34 2917762 PetscInt ksave;
35 2917762 Vec y;
36
37
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2917762 PetscFunctionBegin;
38
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.
2917762 PetscCall(PetscLogEventBegin(BV_DotVec,X,0,0,0));
39 2917762 ksave = X->k;
40 2917762 X->k = j+1;
41
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.
2917762 PetscCall(BVGetColumn(X,j,&y));
42
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
2917762 PetscUseTypeMethod(X,dotvec,y,q);
43
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.
2917762 PetscCall(BVRestoreColumn(X,j,&y));
44 2917762 X->k = ksave;
45
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.
2917762 PetscCall(PetscLogEventEnd(BV_DotVec,X,0,0,0));
46
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
573335 PetscFunctionReturn(PETSC_SUCCESS);
47 }
48
49 /*
50 BVOrthogonalizeMGS1 - Compute one step of modified Gram-Schmidt
51 */
52 195483 static PetscErrorCode BVOrthogonalizeMGS1(BV bv,PetscInt j,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onrm,PetscReal *nrm)
53 {
54 195483 PetscInt i;
55 195483 PetscScalar dot;
56 195483 PetscBool indef=bv->indef;
57 195483 Vec vi,z,w=v;
58 195483 const PetscScalar *omega;
59
60
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
195483 PetscFunctionBegin;
61
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.
195483 if (!v) PetscCall(BVGetColumn(bv,j,&w));
62
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.
195483 if (onrm) PetscCall(BVNormVec(bv,w,NORM_2,onrm));
63 195483 z = w;
64
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.
195483 if (indef) PetscCall(VecGetArrayRead(bv->omega,&omega));
65
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2093022 for (i=-bv->nc;i<j;i++) {
66
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1897539 if (which && i>=0 && !which[i]) continue;
67
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.
844001 PetscCall(BVGetColumn(bv,i,&vi));
68 /* h_i = (v, v_i) */
69
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
844001 if (bv->matrix) {
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.
1760 PetscCall(BV_IPMatMult(bv,w));
71 1760 z = bv->Bx;
72 }
73
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.
844001 PetscCall(VecDot(z,vi,&dot));
74 /* v <- v - h_i v_i */
75
5/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1180381 PetscCall(BV_SetValue(bv,i,0,c,dot));
76
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
844001 if (indef) dot /= PetscRealPart(omega[bv->nc+i]);
77
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.
844001 PetscCall(VecAXPY(w,-dot,vi));
78
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.
1897539 PetscCall(BVRestoreColumn(bv,i,&vi));
79 }
80
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.
195483 if (nrm) PetscCall(BVNormVec(bv,w,NORM_2,nrm));
81
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.
195483 if (!v) PetscCall(BVRestoreColumn(bv,j,&w));
82
5/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
273445 PetscCall(BV_AddCoefficients(bv,j,h,c));
83
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.
195483 if (indef) PetscCall(VecRestoreArrayRead(bv->omega,&omega));
84
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
38929 PetscFunctionReturn(PETSC_SUCCESS);
85 }
86
87 /*
88 BVOrthogonalizeCGS1 - Compute |v'| (estimated), |v| and one step of CGS with
89 only one global synchronization
90 */
91 3499099 static PetscErrorCode BVOrthogonalizeCGS1(BV bv,PetscInt j,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onorm,PetscReal *norm)
92 {
93 3499099 PetscReal sum,beta;
94
95
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3499099 PetscFunctionBegin;
96 /* h = W^* v ; alpha = (v, v) */
97 3499099 bv->k = j;
98
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3499099 if (onorm || norm) {
99
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3414302 if (!v) {
100
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.
2917762 PetscCall(BVDotColumnInc(bv,j,c));
101
5/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4034407 PetscCall(BV_SquareRoot(bv,j,c,&beta));
102 } else {
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.
496540 PetscCall(BVDotVec(bv,v,c));
104
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.
496540 PetscCall(BVNormVec(bv,v,NORM_2,&beta));
105 }
106 } else {
107
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.
84797 if (!v) PetscCall(BVDotColumn(bv,j,c));
108 else PetscCall(BVDotVec(bv,v,c));
109 }
110
111 /* q = v - V h */
112
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
3567971 if (PetscUnlikely(bv->indef)) PetscCall(BV_ApplySignature(bv,j,c,PETSC_TRUE));
113
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.
3499099 if (!v) PetscCall(BVMultColumn(bv,-1.0,1.0,j,c));
114
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.
496540 else PetscCall(BVMultVec(bv,-1.0,1.0,v,c));
115
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
3567971 if (PetscUnlikely(bv->indef)) PetscCall(BV_ApplySignature(bv,j,c,PETSC_FALSE));
116
117 /* compute |v| */
118
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3499099 if (onorm) *onorm = beta;
119
120
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3499099 if (norm) {
121
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.
3414302 if (PetscUnlikely(bv->indef)) PetscCall(BV_NormVecOrColumn(bv,j,v,norm));
122 else {
123 /* estimate |v'| from |v| */
124
5/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4555124 PetscCall(BV_SquareSum(bv,j,c,&sum));
125 3289149 *norm = beta*beta-sum;
126
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.
3289149 if (PetscUnlikely(*norm <= 0.0)) PetscCall(BV_NormVecOrColumn(bv,j,v,norm));
127 3223796 else *norm = PetscSqrtReal(*norm);
128 }
129 }
130
5/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4835392 PetscCall(BV_AddCoefficients(bv,j,h,c));
131
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
689685 PetscFunctionReturn(PETSC_SUCCESS);
132 }
133
134 #define BVOrthogonalizeGS1(a,b,c,d,e,f,g,h) (bv->ops->gramschmidt?(*bv->ops->gramschmidt):(mgs?BVOrthogonalizeMGS1:BVOrthogonalizeCGS1))(a,b,c,d,e,f,g,h)
135
136 /*
137 BVOrthogonalizeGS - Orthogonalize with (classical or modified) Gram-Schmidt
138
139 j - the index of the column to orthogonalize (cannot use both j and v)
140 v - the vector to orthogonalize (cannot use both j and v)
141 which - logical array indicating selected columns (only used in MGS)
142 norm - (optional) norm of the vector after being orthogonalized
143 lindep - (optional) flag indicating possible linear dependence
144 */
145 2575777 static PetscErrorCode BVOrthogonalizeGS(BV bv,PetscInt j,Vec v,PetscBool *which,PetscReal *norm,PetscBool *lindep)
146 {
147 2575777 PetscScalar *h,*c,*omega;
148 2575777 PetscReal onrm,nrm;
149 2575777 PetscInt k,l;
150 2575777 PetscBool mgs,dolindep,signature;
151
152
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2575777 PetscFunctionBegin;
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2575777 if (v) {
154 452569 k = bv->k;
155 452569 h = bv->h;
156 452569 c = bv->c;
157 } else {
158 k = j;
159 h = NULL;
160 c = NULL;
161 }
162
163 2575777 mgs = (bv->orthog_type==BV_ORTHOG_MGS)? PETSC_TRUE: PETSC_FALSE;
164
165 /* if indefinite inner product, skip the computation of lindep */
166
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
2575777 if (bv->indef && lindep) *lindep = PETSC_FALSE;
167
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
2575777 dolindep = (!bv->indef && lindep)? PETSC_TRUE: PETSC_FALSE;
168
169 /* if indefinite and we are orthogonalizing a column, the norm must always be computed */
170
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
2575777 signature = (bv->indef && !v)? PETSC_TRUE: PETSC_FALSE;
171
172
5/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3563528 PetscCall(BV_CleanCoefficients(bv,k,h));
173
174
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
2575777 switch (bv->orthog_ref) {
175
176 2445867 case BV_ORTHOG_REFINE_IFNEEDED:
177
9/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
4679615 PetscCall(BVOrthogonalizeGS1(bv,k,v,which,h,c,&onrm,&nrm));
178 /* repeat if ||q|| < eta ||h|| */
179 l = 1;
180
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
3690762 while (l<3 && nrm && PetscAbsReal(nrm) < bv->orthog_eta*PetscAbsReal(onrm)) {
181 1284833 l++;
182
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1284833 if (mgs||bv->indef) onrm = nrm;
183
15/16
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 10 times.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
3854906 PetscCall(BVOrthogonalizeGS1(bv,k,v,which,h,c,(mgs||bv->indef)?NULL:&onrm,&nrm));
184 }
185 /* linear dependence check: criterion not satisfied in the last iteration */
186
6/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
4054859 if (dolindep) *lindep = PetscNot(nrm && PetscAbsReal(nrm) >= bv->orthog_eta*PetscAbsReal(onrm));
187 break;
188
189 899 case BV_ORTHOG_REFINE_NEVER:
190
8/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
1478 PetscCall(BVOrthogonalizeGS1(bv,k,v,which,h,c,NULL,NULL));
191 /* compute ||v|| */
192
7/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
899 if (norm || dolindep || signature) PetscCall(BV_NormVecOrColumn(bv,k,v,&nrm));
193 /* linear dependence check: just test for exactly zero norm */
194
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
899 if (dolindep) *lindep = PetscNot(nrm);
195 break;
196
197 129011 case BV_ORTHOG_REFINE_ALWAYS:
198
9/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
213229 PetscCall(BVOrthogonalizeGS1(bv,k,v,which,h,c,NULL,NULL));
199
15/16
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 10 times.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
339035 PetscCall(BVOrthogonalizeGS1(bv,k,v,which,h,c,dolindep?&onrm:NULL,(norm||dolindep||signature)?&nrm:NULL));
200 /* linear dependence check: criterion not satisfied in the second iteration */
201
4/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
132256 if (dolindep) *lindep = PetscNot(nrm && PetscAbsReal(nrm) >= bv->orthog_eta*PetscAbsReal(onrm));
202 break;
203 }
204
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2575777 if (signature) {
205
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.
157386 PetscCall(VecGetArray(bv->omega,&omega));
206
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
157386 omega[bv->nc+k] = (nrm<0.0)? -1.0: 1.0;
207
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.
157386 PetscCall(VecRestoreArray(bv->omega,&omega));
208 }
209
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2575777 if (norm) {
210 2423552 *norm = nrm;
211
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2423552 if (!v) { /* store norm value next to the orthogonalization coefficients */
212
9/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
2126069 if (dolindep && *lindep) PetscCall(BV_SetValue(bv,k,k,h,0.0));
213
5/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2924187 else PetscCall(BV_SetValue(bv,k,k,h,nrm));
214 }
215 }
216
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
506959 PetscFunctionReturn(PETSC_SUCCESS);
217 }
218
219 /*@
220 BVOrthogonalizeVec - Orthogonalize a given vector with respect to all
221 active columns.
222
223 Collective
224
225 Input Parameters:
226 + bv - the basis vectors context
227 - v - the vector
228
229 Output Parameters:
230 + H - (optional) coefficients computed during orthogonalization
231 . norm - (optional) norm of the vector after being orthogonalized
232 - lindep - (optional) flag indicating that refinement did not improve the quality
233 of orthogonalization
234
235 Notes:
236 This function is equivalent to `BVOrthogonalizeColumn()` but orthogonalizes
237 a vector as an argument rather than taking one of the `BV` columns. The
238 vector is orthogonalized against all active columns (`k`) and the constraints.
239 If `H` is given, it must have enough space to store `k-l` coefficients, where `l`
240 is the number of leading columns.
241
242 In the case of an indefinite inner product, the `lindep` parameter is not
243 computed (set to false).
244
245 Level: advanced
246
247 .seealso: [](sec:bv), `BVOrthogonalizeColumn()`, `BVSetOrthogonalization()`, `BVSetActiveColumns()`, `BVGetNumConstraints()`
248 @*/
249 452569 PetscErrorCode BVOrthogonalizeVec(BV bv,Vec v,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
250 {
251 452569 PetscInt ksave,lsave;
252
253
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
452569 PetscFunctionBegin;
254
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
452569 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
255
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
452569 PetscValidHeaderSpecific(v,VEC_CLASSID,2);
256
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
452569 PetscValidType(bv,1);
257
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
452569 BVCheckSizes(bv,1);
258
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
452569 PetscValidType(v,2);
259
13/32
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
452569 PetscCheckSameComm(bv,1,v,2);
260
261
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.
452569 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
262 452569 ksave = bv->k;
263 452569 lsave = bv->l;
264 452569 bv->l = -bv->nc; /* must also orthogonalize against constraints and leading columns */
265
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.
452569 PetscCall(BV_AllocateCoeffs(bv));
266
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.
452569 PetscCall(BV_AllocateSignature(bv));
267
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.
452569 PetscCall(BVOrthogonalizeGS(bv,0,v,NULL,norm,lindep));
268 452569 bv->k = ksave;
269 452569 bv->l = lsave;
270
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
560305 if (H) PetscCall(BV_StoreCoefficients(bv,bv->k,bv->h,H));
271
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.
452569 PetscCall(PetscLogEventEnd(BV_OrthogonalizeVec,bv,0,0,0));
272
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
89137 PetscFunctionReturn(PETSC_SUCCESS);
273 }
274
275 /*@
276 BVOrthogonalizeColumn - Orthogonalize one of the column vectors with respect to
277 the previous ones.
278
279 Collective
280
281 Input Parameters:
282 + bv - the basis vectors context
283 - j - index of column to be orthogonalized
284
285 Output Parameters:
286 + H - (optional) coefficients computed during orthogonalization
287 . norm - (optional) norm of the vector after being orthogonalized
288 - lindep - (optional) flag indicating that refinement did not improve the quality
289 of orthogonalization
290
291 Notes:
292 This function applies an orthogonal projector to project vector $v_j$ onto
293 the orthogonal complement of the span of the columns $v_{0:j-1}$.
294 The columns $v_{0:j-1}$ are assumed to be mutually orthonormal.
295
296 Leading columns $v_{0:\ell-1}$ also participate in the orthogonalization, as well
297 as the constraints. If `H` is given, it must have enough space to store
298 $j-\ell+1$ coefficients (the last coefficient will contain the value `norm`, unless
299 the `norm` argument is `NULL`).
300
301 If a non-standard inner product has been specified with `BVSetMatrix()`,
302 then the vector is B-orthogonalized, using the non-standard inner product
303 defined by matrix $B$. The output vector satisfies $v_j^*Bv_{0:j-1} = 0$.
304
305 This routine does not normalize the resulting vector, see `BVOrthonormalizeColumn()`.
306
307 In the case of an indefinite inner product, the `lindep` parameter is not
308 computed (set to false).
309
310 Level: advanced
311
312 .seealso: [](sec:bv), `BVSetOrthogonalization()`, `BVSetMatrix()`, `BVSetActiveColumns()`, `BVOrthogonalize()`, `BVOrthogonalizeVec()`, `BVGetNumConstraints()`, `BVOrthonormalizeColumn()`
313 @*/
314 810181 PetscErrorCode BVOrthogonalizeColumn(BV bv,PetscInt j,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
315 {
316 810181 PetscInt ksave,lsave;
317
318
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
810181 PetscFunctionBegin;
319
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
810181 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
320
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
810181 PetscValidLogicalCollectiveInt(bv,j,2);
321
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
810181 PetscValidType(bv,1);
322
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
810181 BVCheckSizes(bv,1);
323
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
810181 PetscCheck(j>=0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Index j must be non-negative");
324
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
810181 PetscCheck(j<bv->m,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Index j=%" PetscInt_FMT " but BV only has %" PetscInt_FMT " columns",j,bv->m);
325
326
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.
810181 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
327 810181 ksave = bv->k;
328 810181 lsave = bv->l;
329 810181 bv->l = -bv->nc; /* must also orthogonalize against constraints and leading columns */
330
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.
810181 if (!bv->buffer) PetscCall(BVGetBufferVec(bv,&bv->buffer));
331
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.
810181 PetscCall(BV_AllocateSignature(bv));
332
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.
810181 PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,norm,lindep));
333 810181 bv->k = ksave;
334 810181 bv->l = lsave;
335
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
962186 if (H) PetscCall(BV_StoreCoefficients(bv,j,NULL,H));
336
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.
810181 PetscCall(PetscLogEventEnd(BV_OrthogonalizeVec,bv,0,0,0));
337
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
810181 PetscCall(PetscObjectStateIncrease((PetscObject)bv));
338
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
810181 PetscFunctionReturn(PETSC_SUCCESS);
339 }
340
341 /*@
342 BVOrthonormalizeColumn - Orthonormalize one of the column vectors with respect to
343 the previous ones.
344
345 Collective
346
347 Input Parameters:
348 + bv - the basis vectors context
349 . j - index of column to be orthonormalized
350 - replace - whether it is allowed to set the vector randomly
351
352 Output Parameters:
353 + norm - (optional) norm of the vector after orthogonalization and before normalization
354 - lindep - (optional) flag indicating that linear dependence was determined during
355 orthogonalization
356
357 Notes:
358 This is equivalent to a call to `BVOrthogonalizeColumn()` followed by a
359 call to `BVScaleColumn()` with the reciprocal of the norm.
360
361 This function first orthogonalizes vector $v_j$ with respect to $v_{0:j-1}$.
362 A byproduct of this computation is `norm`, the norm of the vector after
363 orthogonalization. Secondly, it scales the vector with `1/norm`, so that the
364 resulting vector has unit norm.
365
366 If after orthogonalization the vector $v_j$ is exactly zero, it cannot be normalized
367 because `norm=0`. In that case, it could be left as zero or replaced by a random
368 vector that is then orthonormalized. The latter is achieved by setting the
369 argument `replace` to `PETSC_TRUE`. The vector will be replaced by a random vector also
370 if `lindep` was set to `PETSC_TRUE`, even if the norm is not exactly zero.
371
372 If the vector has been replaced by a random vector, the output arguments `norm` and
373 `lindep` will be set according to the orthogonalization of this new vector.
374
375 Level: advanced
376
377 .seealso: [](sec:bv), `BVOrthogonalizeColumn()`, `BVScaleColumn()`
378 @*/
379 1225278 PetscErrorCode BVOrthonormalizeColumn(BV bv,PetscInt j,PetscBool replace,PetscReal *norm,PetscBool *lindep)
380 {
381 1225278 PetscScalar alpha;
382 1225278 PetscReal nrm;
383 1225278 PetscInt ksave,lsave;
384 1225278 PetscBool lndep;
385
386
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1225278 PetscFunctionBegin;
387
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
1225278 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
388
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
1225278 PetscValidLogicalCollectiveInt(bv,j,2);
389
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1225278 PetscValidType(bv,1);
390
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1225278 BVCheckSizes(bv,1);
391
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1225278 PetscCheck(j>=0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Index j must be non-negative");
392
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1225278 PetscCheck(j<bv->m,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Index j=%" PetscInt_FMT " but BV only has %" PetscInt_FMT " columns",j,bv->m);
393
394 /* orthogonalize */
395
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.
1225278 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
396 1225278 ksave = bv->k;
397 1225278 lsave = bv->l;
398 1225278 bv->l = -bv->nc; /* must also orthogonalize against constraints and leading columns */
399
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.
1225278 if (!bv->buffer) PetscCall(BVGetBufferVec(bv,&bv->buffer));
400
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.
1225278 PetscCall(BV_AllocateSignature(bv));
401
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.
1225278 PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,&nrm,&lndep));
402
5/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
1225278 if (replace && (nrm==0.0 || lndep)) {
403
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7 PetscCall(PetscInfo(bv,"Vector was linearly dependent, generating a new random vector\n"));
404
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7 PetscCall(BVSetRandomColumn(bv,j));
405
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7 PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,&nrm,&lndep));
406
2/4
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
7 if (nrm==0.0 || lndep) { /* yet another attempt */
407 PetscCall(BVSetRandomColumn(bv,j));
408 PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,&nrm,&lndep));
409 }
410 }
411 1225278 bv->k = ksave;
412 1225278 bv->l = lsave;
413
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.
1225278 PetscCall(PetscLogEventEnd(BV_OrthogonalizeVec,bv,0,0,0));
414
415 /* scale */
416
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
1225278 if (nrm!=1.0 && nrm!=0.0) {
417 1219483 alpha = 1.0/nrm;
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.
1219483 PetscCall(PetscLogEventBegin(BV_Scale,bv,0,0,0));
419
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
1219483 PetscUseTypeMethod(bv,scale,j,alpha);
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.
1219483 PetscCall(PetscLogEventEnd(BV_Scale,bv,0,0,0));
421 }
422
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1225278 if (norm) *norm = nrm;
423
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1225278 if (lindep) *lindep = lndep;
424
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
1225278 PetscCall(PetscObjectStateIncrease((PetscObject)bv));
425
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
1225278 PetscFunctionReturn(PETSC_SUCCESS);
426 }
427
428 /*@
429 BVOrthogonalizeSomeColumn - Orthogonalize one of the column vectors with
430 respect to some of the previous ones.
431
432 Collective
433
434 Input Parameters:
435 + bv - the basis vectors context
436 . j - index of column to be orthogonalized
437 - which - logical array indicating selected columns
438
439 Output Parameters:
440 + H - (optional) coefficients computed during orthogonalization
441 . norm - (optional) norm of the vector after being orthogonalized
442 - lindep - (optional) flag indicating that refinement did not improve the quality
443 of orthogonalization
444
445 Notes:
446 This function is similar to `BVOrthogonalizeColumn()`, but $v_j$ is
447 orthogonalized only against columns $v_i$ having `which[i]=PETSC_TRUE`.
448 The length of array `which` must be `j` at least.
449
450 The use of this operation is restricted to MGS orthogonalization type,
451 `BV_ORTHOG_MGS`.
452
453 In the case of an indefinite inner product, the `lindep` parameter is not
454 computed (set to false).
455
456 Level: advanced
457
458 .seealso: [](sec:bv), `BVOrthogonalizeColumn()`, `BVSetOrthogonalization()`
459 @*/
460 87742 PetscErrorCode BVOrthogonalizeSomeColumn(BV bv,PetscInt j,PetscBool *which,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
461 {
462 87742 PetscInt ksave,lsave;
463
464
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
87742 PetscFunctionBegin;
465
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
87742 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
466
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
87742 PetscValidLogicalCollectiveInt(bv,j,2);
467
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
87742 PetscAssertPointer(which,3);
468
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87742 PetscValidType(bv,1);
469
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87742 BVCheckSizes(bv,1);
470
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87742 PetscCheck(j>=0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Index j must be non-negative");
471
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87742 PetscCheck(j<bv->m,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Index j=%" PetscInt_FMT " but BV only has %" PetscInt_FMT " columns",j,bv->m);
472
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87742 PetscCheck(bv->orthog_type==BV_ORTHOG_MGS,PetscObjectComm((PetscObject)bv),PETSC_ERR_SUP,"Operation only available for MGS orthogonalization");
473
474
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.
87742 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
475 87742 ksave = bv->k;
476 87742 lsave = bv->l;
477 87742 bv->l = -bv->nc; /* must also orthogonalize against constraints and leading columns */
478
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.
87742 if (!bv->buffer) PetscCall(BVGetBufferVec(bv,&bv->buffer));
479
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.
87742 PetscCall(BV_AllocateSignature(bv));
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.
87742 PetscCall(BVOrthogonalizeGS(bv,j,NULL,which,norm,lindep));
481 87742 bv->k = ksave;
482 87742 bv->l = lsave;
483
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
122814 if (H) PetscCall(BV_StoreCoefficients(bv,j,NULL,H));
484
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.
87742 PetscCall(PetscLogEventEnd(BV_OrthogonalizeVec,bv,0,0,0));
485
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
87742 PetscCall(PetscObjectStateIncrease((PetscObject)bv));
486
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
87742 PetscFunctionReturn(PETSC_SUCCESS);
487 }
488
489 /*
490 Block Gram-Schmidt: V2 = V2 - V1*R12, where R12 = V1'*V2
491 */
492 1432 static PetscErrorCode BVOrthogonalize_BlockGS(BV V,Mat R)
493 {
494 1432 BV V1;
495
496
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1432 PetscFunctionBegin;
497
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.
1432 PetscCall(BVGetSplit(V,&V1,NULL));
498
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.
1432 PetscCall(BVDot(V,V1,R));
499
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.
1432 PetscCall(BVMult(V,-1.0,1.0,V1,R));
500
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.
1432 PetscCall(BVRestoreSplit(V,&V1,NULL));
501
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
248 PetscFunctionReturn(PETSC_SUCCESS);
502 }
503
504 /*MC
505 BV_ORTHOG_BLOCK_GS - Orthogonalize a set of vectors with Gram-Schmidt, column by column.
506
507 Note:
508 In this case, the block orthogonalization is done in the same way as the
509 orthogonalization of individual vectors, e.g., `BVOrthogonalizeColumn`, and
510 hence the settings provided via `BVSetOrthogonalization()` apply.
511
512 Level: advanced
513
514 .seealso: [](sec:bv), `BVOrthogBlockType`, `BVSetOrthogonalization()`, `BVOrthogonalize()`, `BV_ORTHOG_BLOCK_CHOL`, `BV_ORTHOG_BLOCK_TSQR`, `BV_ORTHOG_BLOCK_TSQRCHOL`, `BV_ORTHOG_BLOCK_SVQB`
515 M*/
516 56235 static PetscErrorCode BVOrthogonalize_GS(BV V,Mat R)
517 {
518 56235 PetscScalar *r=NULL;
519 56235 PetscReal norm;
520 56235 PetscInt j,ldr,lsave;
521 56235 Vec v,w;
522
523
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
56235 PetscFunctionBegin;
524
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
56235 if (R) {
525
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.
4143 PetscCall(MatDenseGetLDA(R,&ldr));
526
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.
4143 PetscCall(MatDenseGetArray(R,&r));
527 }
528
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
56235 if (V->matrix) {
529
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.
17854 PetscCall(BVGetCachedBV(V,&V->cached));
530
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.
17854 PetscCall(BVSetActiveColumns(V->cached,V->l,V->k));
531 }
532
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
431695 for (j=V->l;j<V->k;j++) {
533
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
375460 if (V->matrix && V->orthog_type==BV_ORTHOG_MGS) { /* fill cached BV */
534 PetscCall(BVGetColumn(V->cached,j,&v));
535 PetscCall(BVGetColumn(V,j,&w));
536 PetscCall(MatMult(V->matrix,w,v));
537 PetscCall(BVRestoreColumn(V,j,&w));
538 PetscCall(BVRestoreColumn(V->cached,j,&v));
539 }
540
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
375460 if (R) {
541
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.
53187 PetscCall(BVOrthogonalizeColumn(V,j,NULL,&norm,NULL));
542 53187 lsave = V->l;
543 53187 V->l = -V->nc;
544
5/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
73501 PetscCall(BV_StoreCoefficients(V,j,NULL,r+j*ldr));
545 53187 V->l = lsave;
546 53187 r[j+j*ldr] = norm;
547
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.
322273 } else PetscCall(BVOrthogonalizeColumn(V,j,NULL,&norm,NULL));
548
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
375460 PetscCheck(norm,PetscObjectComm((PetscObject)V),PETSC_ERR_CONV_FAILED,"Breakdown in BVOrthogonalize due to a linearly dependent column");
549
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
375460 if (V->matrix && V->orthog_type==BV_ORTHOG_CGS) { /* fill cached BV */
550
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.
113878 PetscCall(BVGetColumn(V->cached,j,&v));
551
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.
113878 PetscCall(VecCopy(V->Bx,v));
552
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.
113878 PetscCall(BVRestoreColumn(V->cached,j,&v));
553 }
554
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.
375460 PetscCall(BVScaleColumn(V,j,1.0/norm));
555 }
556
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.
56235 if (R) PetscCall(MatDenseRestoreArray(R,&r));
557
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
10980 PetscFunctionReturn(PETSC_SUCCESS);
558 }
559
560 /*
561 BV_GetBufferMat - Create auxiliary seqdense matrix that wraps the bv->buffer.
562 */
563 5251 static inline PetscErrorCode BV_GetBufferMat(BV bv)
564 {
565 5251 PetscInt ld;
566 5251 PetscScalar *array;
567
568
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5251 PetscFunctionBegin;
569
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5251 if (!bv->Abuffer) {
570
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.
1807 if (!bv->buffer) PetscCall(BVGetBufferVec(bv,&bv->buffer));
571 1807 ld = bv->m+bv->nc;
572
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.
1807 PetscCall(VecGetArray(bv->buffer,&array));
573
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.
1807 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,ld,bv->m,array,&bv->Abuffer));
574
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.
1807 PetscCall(VecRestoreArray(bv->buffer,&array));
575 }
576
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
946 PetscFunctionReturn(PETSC_SUCCESS);
577 }
578
579 /*
580 BV_StoreCoeffsBlock_Default - Copy the contents of the BV buffer to a dense Mat
581 provided by the caller. Only columns l:k-1 are copied, restricting to the upper
582 triangular part if tri=PETSC_TRUE.
583 */
584 1889 static inline PetscErrorCode BV_StoreCoeffsBlock_Default(BV bv,Mat R,PetscBool tri)
585 {
586 1889 const PetscScalar *bb;
587 1889 PetscScalar *rr;
588 1889 PetscInt j,ldr,ldb;
589
590
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1889 PetscFunctionBegin;
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.
1889 PetscCall(MatDenseGetLDA(R,&ldr));
592
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.
1889 PetscCall(MatDenseGetArray(R,&rr));
593 1889 ldb = bv->m+bv->nc;
594
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.
1889 PetscCall(VecGetArrayRead(bv->buffer,&bb));
595
9/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
20657 for (j=bv->l;j<bv->k;j++) PetscCall(PetscArraycpy(rr+j*ldr,bb+j*ldb,(tri?(j+1):bv->k)+bv->nc));
596
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.
1889 PetscCall(VecRestoreArrayRead(bv->buffer,&bb));
597
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.
1889 PetscCall(MatDenseRestoreArray(R,&rr));
598
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
312 PetscFunctionReturn(PETSC_SUCCESS);
599 }
600
601 /*MC
602 BV_ORTHOG_BLOCK_CHOL - Orthogonalize a set of vectors $V$ with the Cholesky QR
603 method, that is, compute $R=\mathrm{chol}(V^*V)$, then obtain the
604 orthogonalized vectors as $Q=V R^{-1}$.
605
606 Developer Note:
607 This is plain Cholesky QR, which may fail in case of ill-conditioned $V$.
608 An iterated version such as CholeskyQR2 should be preferred {cite:p}`Yam15`.
609
610 Level: advanced
611
612 .seealso: [](sec:bv), `BVOrthogBlockType`, `BVSetOrthogonalization()`, `BVOrthogonalize()`, `BV_ORTHOG_BLOCK_GS`, `BV_ORTHOG_BLOCK_TSQR`, `BV_ORTHOG_BLOCK_TSQRCHOL`, `BV_ORTHOG_BLOCK_SVQB`
613 M*/
614 1178 static PetscErrorCode BVOrthogonalize_Chol(BV V,Mat Rin)
615 {
616 1178 Mat R,S;
617
618
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1178 PetscFunctionBegin;
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.
1178 PetscCall(BV_GetBufferMat(V));
620 1178 R = V->Abuffer;
621
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1178 if (Rin) S = Rin; /* use Rin as a workspace for S */
622 794 else S = R;
623
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.
1178 if (V->l) PetscCall(BVOrthogonalize_BlockGS(V,R));
624
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.
1178 PetscCall(BVDot(V,V,R));
625
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.
1178 PetscCall(BVMatCholInv_LAPACK_Private(V,R,S));
626
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.
1178 PetscCall(BVMultInPlace(V,S,V->l,V->k));
627
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.
1178 if (Rin) PetscCall(BV_StoreCoeffsBlock_Default(V,Rin,PETSC_TRUE));
628
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
210 PetscFunctionReturn(PETSC_SUCCESS);
629 }
630
631 /*MC
632 BV_ORTHOG_BLOCK_TSQR - Orthogonalize a set of vectors with the Tall-Skinny QR method {cite:p}`Dem12`.
633
634 Level: advanced
635
636 .seealso: [](sec:bv), `BVOrthogBlockType`, `BVSetOrthogonalization()`, `BVOrthogonalize()`, `BV_ORTHOG_BLOCK_GS`, `BV_ORTHOG_BLOCK_CHOL`, `BV_ORTHOG_BLOCK_TSQRCHOL`, `BV_ORTHOG_BLOCK_SVQB`
637 M*/
638 2101 static PetscErrorCode BVOrthogonalize_TSQR(BV V,Mat Rin)
639 {
640 2101 PetscScalar *pv,*r=NULL;
641 2101 PetscInt ldr;
642 2101 Mat R;
643
644
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2101 PetscFunctionBegin;
645
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.
2101 PetscCall(BV_GetBufferMat(V));
646 2101 R = V->Abuffer;
647
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.
2101 if (V->l) PetscCall(BVOrthogonalize_BlockGS(V,R));
648
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.
2101 PetscCall(MatDenseGetLDA(R,&ldr));
649
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.
2101 PetscCall(MatDenseGetArray(R,&r));
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.
2101 PetscCall(BVGetArray(V,&pv));
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.
2101 PetscCall(BVOrthogonalize_LAPACK_TSQR(V,V->n,V->k-V->l,pv+(V->nc+V->l)*V->ld,V->ld,r+V->l*ldr+V->l,ldr));
652
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.
2101 PetscCall(BVRestoreArray(V,&pv));
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.
2101 PetscCall(MatDenseRestoreArray(R,&r));
654
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.
2101 if (Rin) PetscCall(BV_StoreCoeffsBlock_Default(V,Rin,PETSC_TRUE));
655
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
380 PetscFunctionReturn(PETSC_SUCCESS);
656 }
657
658 /*MC
659 BV_ORTHOG_BLOCK_TSQRCHOL - Orthogonalize a set of vectors $V$ with the TSQR
660 method, but computing the triangular factor $R$ only, then retrieving the
661 orthogonalized vectors as $Q=V R^{-1}$.
662
663 Level: advanced
664
665 .seealso: [](sec:bv), `BVOrthogBlockType`, `BVSetOrthogonalization()`, `BVOrthogonalize()`, `BV_ORTHOG_BLOCK_GS`, `BV_ORTHOG_BLOCK_CHOL`, `BV_ORTHOG_BLOCK_TSQR`, `BV_ORTHOG_BLOCK_SVQB`
666 M*/
667 794 static PetscErrorCode BVOrthogonalize_TSQRCHOL(BV V,Mat Rin)
668 {
669 794 PetscScalar *pv,*r=NULL;
670 794 PetscInt ldr;
671 794 Mat R,S;
672
673
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
794 PetscFunctionBegin;
674
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.
794 PetscCall(BV_GetBufferMat(V));
675 794 R = V->Abuffer;
676
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
794 if (Rin) S = Rin; /* use Rin as a workspace for S */
677 602 else S = R;
678
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.
794 if (V->l) PetscCall(BVOrthogonalize_BlockGS(V,R));
679
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.
794 PetscCall(MatDenseGetLDA(R,&ldr));
680
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.
794 PetscCall(MatDenseGetArray(R,&r));
681
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.
794 PetscCall(BVGetArray(V,&pv));
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.
794 PetscCall(BVOrthogonalize_LAPACK_TSQR_OnlyR(V,V->n,V->k-V->l,pv+(V->nc+V->l)*V->ld,V->ld,r+V->l*ldr+V->l,ldr));
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.
794 PetscCall(BVRestoreArray(V,&pv));
684
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.
794 PetscCall(MatDenseRestoreArray(R,&r));
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.
794 PetscCall(BVMatTriInv_LAPACK_Private(V,R,S));
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.
794 PetscCall(BVMultInPlace(V,S,V->l,V->k));
687
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.
794 if (Rin) PetscCall(BV_StoreCoeffsBlock_Default(V,Rin,PETSC_TRUE));
688
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
146 PetscFunctionReturn(PETSC_SUCCESS);
689 }
690
691 /*MC
692 BV_ORTHOG_BLOCK_SVQB - Orthogonalize a set of vectors with the SVQB method {cite:p}`Sta02`.
693
694 Note:
695 As opposed to other block orthogonalization methods, SVQB does not compute a
696 QR decomposition but a QB decomposition, i.e., the second factor is not
697 triangular.
698
699 Level: advanced
700
701 .seealso: [](sec:bv), `BVOrthogBlockType`, `BVSetOrthogonalization()`, `BVOrthogonalize()`, `BV_ORTHOG_BLOCK_GS`, `BV_ORTHOG_BLOCK_CHOL`, `BV_ORTHOG_BLOCK_TSQR`, `BV_ORTHOG_BLOCK_TSQRCHOL`
702 M*/
703 1178 static PetscErrorCode BVOrthogonalize_SVQB(BV V,Mat Rin)
704 {
705 1178 Mat R,S;
706
707
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1178 PetscFunctionBegin;
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.
1178 PetscCall(BV_GetBufferMat(V));
709 1178 R = V->Abuffer;
710
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1178 if (Rin) S = Rin; /* use Rin as a workspace for S */
711 794 else S = R;
712
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.
1178 if (V->l) PetscCall(BVOrthogonalize_BlockGS(V,R));
713
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.
1178 PetscCall(BVDot(V,V,R));
714
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.
1178 PetscCall(BVMatSVQB_LAPACK_Private(V,R,S));
715
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.
1178 PetscCall(BVMultInPlace(V,S,V->l,V->k));
716
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.
1178 if (Rin) PetscCall(BV_StoreCoeffsBlock_Default(V,Rin,PETSC_FALSE));
717
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
210 PetscFunctionReturn(PETSC_SUCCESS);
718 }
719
720 /*@
721 BVOrthogonalize - Orthogonalize all columns (starting from the leading ones),
722 that is, compute the QR decomposition.
723
724 Collective
725
726 Input Parameters:
727 + V - basis vectors to be orthogonalized (or $B$-orthogonalized), modified on output
728 - R - a sequential dense matrix (or `NULL`), on output the triangular factor of
729 the QR decomposition
730
731 Notes:
732 On input, matrix `R` must be a square sequential dense `Mat`, with at least as many
733 rows and columns as the number of active columns of `V`. The output satisfies
734 $V = \tilde V R$ (where $\tilde V$ represents `V` on exit) and $\tilde V^*\tilde V = I$
735 (or $\tilde V^*B\tilde V = I$ if an inner product matrix $B$ has been specified with
736 `BVSetMatrix()`).
737
738 If `V` has leading columns, then they are not modified (are assumed to be already
739 orthonormal) and the leading columns of `R` are not referenced. Let the
740 decomposition be
741 $$
742 \begin{bmatrix}
743 V_1 & V_2
744 \end{bmatrix}=
745 \begin{bmatrix}
746 \tilde V_1 & \tilde V_2
747 \end{bmatrix}
748 \begin{bmatrix}
749 R_{11} & R_{12} \\
750 0 & R_{22}
751 \end{bmatrix}
752 $$
753 then $\tilde V_1$ is left unchanged (equal to $V_1$) as well as $R_{11}$ (they should
754 satisfy $V_1 = \tilde V_1 R_{11}$).
755
756 Can pass `NULL` if `R` is not required.
757
758 The method to be used for block orthogonalization can be set with
759 `BVSetOrthogonalization()`. If set to `BV_ORTHOG_BLOCK_GS`, the computation is done
760 column by column with successive calls to `BVOrthogonalizeColumn()`. Note that in the
761 `BV_ORTHOG_BLOCK_SVQB` method the `R` factor is not upper triangular.
762
763 If `V` is rank-deficient or very ill-conditioned, that is, one or more columns are
764 (almost) linearly dependent with respect to the rest, then the algorithm may
765 break down or result in larger numerical error. Linearly dependent columns are
766 essentially replaced by random directions, and the corresponding diagonal entry
767 in `R` is set to (nearly) zero.
768
769 Level: intermediate
770
771 .seealso: [](sec:bv), `BVOrthogonalizeColumn()`, `BVOrthogonalizeVec()`, `BVSetMatrix()`, `BVSetActiveColumns()`, `BVSetOrthogonalization()`, `BVOrthogBlockType`
772 @*/
773 61486 PetscErrorCode BVOrthogonalize(BV V,Mat R)
774 {
775 61486 PetscInt m,n;
776
777
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
61486 PetscFunctionBegin;
778
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
61486 PetscValidHeaderSpecific(V,BV_CLASSID,1);
779
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
61486 PetscValidType(V,1);
780
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
61486 BVCheckSizes(V,1);
781
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
61486 if (R) {
782
2/12
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
6032 PetscValidHeaderSpecific(R,MAT_CLASSID,2);
783
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6032 PetscValidType(R,2);
784
4/10
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
6032 PetscCheckTypeName(R,MATSEQDENSE);
785
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.
6032 PetscCall(MatGetSize(R,&m,&n));
786
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6032 PetscCheck(m==n,PetscObjectComm((PetscObject)V),PETSC_ERR_ARG_SIZ,"Mat argument is not square, it has %" PetscInt_FMT " rows and %" PetscInt_FMT " columns",m,n);
787
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6032 PetscCheck(n>=V->k,PetscObjectComm((PetscObject)V),PETSC_ERR_ARG_SIZ,"Mat size %" PetscInt_FMT " is smaller than the number of BV active columns %" PetscInt_FMT,n,V->k);
788 }
789
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
61486 PetscCheck(!V->nc,PetscObjectComm((PetscObject)V),PETSC_ERR_SUP,"Not implemented for BV with constraints, use BVOrthogonalizeColumn() instead");
790
791
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.
61486 PetscCall(PetscLogEventBegin(BV_Orthogonalize,V,R,0,0));
792
5/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
61486 switch (V->orthog_block) {
793 56235 case BV_ORTHOG_BLOCK_GS: /* proceed column by column with Gram-Schmidt */
794
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.
56235 PetscCall(BVOrthogonalize_GS(V,R));
795 break;
796 1178 case BV_ORTHOG_BLOCK_CHOL:
797
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.
1178 PetscCall(BVOrthogonalize_Chol(V,R));
798 break;
799 2101 case BV_ORTHOG_BLOCK_TSQR:
800
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2101 PetscCheck(!V->matrix,PetscObjectComm((PetscObject)V),PETSC_ERR_SUP,"Orthogonalization method not available for non-standard inner product");
801
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.
2101 PetscCall(BVOrthogonalize_TSQR(V,R));
802 break;
803 794 case BV_ORTHOG_BLOCK_TSQRCHOL:
804
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
794 PetscCheck(!V->matrix,PetscObjectComm((PetscObject)V),PETSC_ERR_SUP,"Orthogonalization method not available for non-standard inner product");
805
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.
794 PetscCall(BVOrthogonalize_TSQRCHOL(V,R));
806 break;
807 1178 case BV_ORTHOG_BLOCK_SVQB:
808
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.
1178 PetscCall(BVOrthogonalize_SVQB(V,R));
809 break;
810 }
811
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.
61486 PetscCall(PetscLogEventEnd(BV_Orthogonalize,V,R,0,0));
812
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
61486 PetscCall(PetscObjectStateIncrease((PetscObject)V));
813
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
61486 PetscFunctionReturn(PETSC_SUCCESS);
814 }
815