GCC Code Coverage Report


Directory: ./
File: src/sys/classes/bv/interface/bvorthog.c
Date: 2026-05-04 03:58:11
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 189033 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.
189033 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.
189033 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.
184526 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.
42286 PetscFunctionReturn(PETSC_SUCCESS);
26 }
27
28 /*
29 BVDotColumnInc - Same as BVDotColumn() but also including column j, which
30 is multiplied by itself
31 */
32 2912157 static inline PetscErrorCode BVDotColumnInc(BV X,PetscInt j,PetscScalar *q)
33 {
34 2912157 PetscInt ksave;
35 2912157 Vec y;
36
37
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2912157 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.
2912157 PetscCall(PetscLogEventBegin(BV_DotVec,X,0,0,0));
39 2912157 ksave = X->k;
40 2912157 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.
2912157 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.
2912157 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.
2912157 PetscCall(BVRestoreColumn(X,j,&y));
44 2912157 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.
2912157 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.
568828 PetscFunctionReturn(PETSC_SUCCESS);
47 }
48
49 /*
50 BVOrthogonalizeMGS1 - Compute one step of modified Gram-Schmidt
51 */
52 195135 static PetscErrorCode BVOrthogonalizeMGS1(BV bv,PetscInt j,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onrm,PetscReal *nrm)
53 {
54 195135 PetscInt i;
55 195135 PetscScalar dot;
56 195135 PetscBool indef=bv->indef;
57 195135 Vec vi,z,w=v;
58 195135 const PetscScalar *omega;
59
60
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
195135 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.
195135 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.
195135 if (onrm) PetscCall(BVNormVec(bv,w,NORM_2,onrm));
63 195135 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.
195135 if (indef) PetscCall(VecGetArrayRead(bv->omega,&omega));
65
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2092259 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.
1897124 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.
842636 PetscCall(BVGetColumn(bv,i,&vi));
68 /* h_i = (v, v_i) */
69
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
842636 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.
842636 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.
1178301 PetscCall(BV_SetValue(bv,i,0,c,dot));
76
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
842636 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.
842636 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.
1897124 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.
195135 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.
195135 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.
272926 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.
195135 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.
38894 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 3493300 static PetscErrorCode BVOrthogonalizeCGS1(BV bv,PetscInt j,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onorm,PetscReal *norm)
92 {
93 3493300 PetscReal sum,beta;
94
95
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3493300 PetscFunctionBegin;
96 /* h = W^* v ; alpha = (v, v) */
97 3493300 bv->k = j;
98
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3493300 if (onorm || norm) {
99
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3408500 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.
2912157 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.
4030930 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.
496343 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.
496343 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.
84800 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.
3561910 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.
3493300 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.
496343 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.
3561910 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.
3493300 if (onorm) *onorm = beta;
119
120
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3493300 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.
3408500 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.
4552376 PetscCall(BV_SquareSum(bv,j,c,&sum));
125 3284011 *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.
3284011 if (PetscUnlikely(*norm <= 0.0)) PetscCall(BV_NormVecOrColumn(bv,j,v,norm));
127 3219815 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.
4831721 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.
685178 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 2576562 static PetscErrorCode BVOrthogonalizeGS(BV bv,PetscInt j,Vec v,PetscBool *which,PetscReal *norm,PetscBool *lindep)
146 {
147 2576562 PetscScalar *h,*c,*omega;
148 2576562 PetscReal onrm,nrm;
149 2576562 PetscInt k,l;
150 2576562 PetscBool mgs,dolindep,signature;
151
152
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2576562 PetscFunctionBegin;
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2576562 if (v) {
154 452434 k = bv->k;
155 452434 h = bv->h;
156 452434 c = bv->c;
157 } else {
158 k = j;
159 h = NULL;
160 c = NULL;
161 }
162
163 2576562 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.
2576562 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.
2576562 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.
2576562 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.
3569593 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.
2576562 switch (bv->orthog_ref) {
175
176 2442535 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.
4673595 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.
3683716 while (l<3 && nrm && PetscAbsReal(nrm) < bv->orthog_eta*PetscAbsReal(onrm)) {
181 1281089 l++;
182
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1281089 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.
3848511 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.
4043752 if (dolindep) *lindep = PetscNot(nrm && PetscAbsReal(nrm) >= bv->orthog_eta*PetscAbsReal(onrm));
187 break;
188
189 902 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.
1484 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.
902 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.
902 if (dolindep) *lindep = PetscNot(nrm);
195 break;
196
197 133125 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.
217343 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.
347263 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.
136370 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.
2576562 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.
160831 PetscCall(VecGetArray(bv->omega,&omega));
206
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
160831 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.
160831 PetscCall(VecRestoreArray(bv->omega,&omega));
208 }
209
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2576562 if (norm) {
210 2424334 *norm = nrm;
211
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2424334 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.
2126978 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.
2930381 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.
504491 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 452434 PetscErrorCode BVOrthogonalizeVec(BV bv,Vec v,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
250 {
251 452434 PetscInt ksave,lsave;
252
253
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
452434 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.
452434 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.
452434 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.
452434 PetscValidType(bv,1);
257
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
452434 BVCheckSizes(bv,1);
258
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
452434 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.
452434 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.
452434 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
262 452434 ksave = bv->k;
263 452434 lsave = bv->l;
264 452434 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.
452434 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.
452434 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.
452434 PetscCall(BVOrthogonalizeGS(bv,0,v,NULL,norm,lindep));
268 452434 bv->k = ksave;
269 452434 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.
560170 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.
452434 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 822333 PetscErrorCode BVOrthogonalizeColumn(BV bv,PetscInt j,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
315 {
316 822333 PetscInt ksave,lsave;
317
318
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
822333 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.
822333 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.
822333 PetscValidLogicalCollectiveInt(bv,j,2);
321
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
822333 PetscValidType(bv,1);
322
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
822333 BVCheckSizes(bv,1);
323
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
822333 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.
822333 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.
822333 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
327 822333 ksave = bv->k;
328 822333 lsave = bv->l;
329 822333 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.
822333 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.
822333 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.
822333 PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,norm,lindep));
333 822333 bv->k = ksave;
334 822333 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.
982434 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.
822333 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.
822333 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.
822333 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 1214210 PetscErrorCode BVOrthonormalizeColumn(BV bv,PetscInt j,PetscBool replace,PetscReal *norm,PetscBool *lindep)
380 {
381 1214210 PetscScalar alpha;
382 1214210 PetscReal nrm;
383 1214210 PetscInt ksave,lsave;
384 1214210 PetscBool lndep;
385
386
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1214210 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.
1214210 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.
1214210 PetscValidLogicalCollectiveInt(bv,j,2);
389
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1214210 PetscValidType(bv,1);
390
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1214210 BVCheckSizes(bv,1);
391
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1214210 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.
1214210 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.
1214210 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
396 1214210 ksave = bv->k;
397 1214210 lsave = bv->l;
398 1214210 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.
1214210 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.
1214210 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.
1214210 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.
1214210 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 1214210 bv->k = ksave;
412 1214210 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.
1214210 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.
1214210 if (nrm!=1.0 && nrm!=0.0) {
417 1208454 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.
1208454 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.
1208454 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.
1208454 PetscCall(PetscLogEventEnd(BV_Scale,bv,0,0,0));
421 }
422
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1214210 if (norm) *norm = nrm;
423
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1214210 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.
1214210 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.
1214210 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 87578 PetscErrorCode BVOrthogonalizeSomeColumn(BV bv,PetscInt j,PetscBool *which,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
461 {
462 87578 PetscInt ksave,lsave;
463
464
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
87578 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.
87578 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.
87578 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.
87578 PetscAssertPointer(which,3);
468
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87578 PetscValidType(bv,1);
469
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87578 BVCheckSizes(bv,1);
470
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87578 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.
87578 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.
87578 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.
87578 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
475 87578 ksave = bv->k;
476 87578 lsave = bv->l;
477 87578 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.
87578 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.
87578 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.
87578 PetscCall(BVOrthogonalizeGS(bv,j,NULL,which,norm,lindep));
481 87578 bv->k = ksave;
482 87578 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.
122569 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.
87578 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.
87578 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.
87578 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 56861 static PetscErrorCode BVOrthogonalize_GS(BV V,Mat R)
517 {
518 56861 PetscScalar *r=NULL;
519 56861 PetscReal norm;
520 56861 PetscInt j,ldr,lsave;
521 56861 Vec v,w;
522
523
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
56861 PetscFunctionBegin;
524
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
56861 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.
56861 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.
437406 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.
380545 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.
380545 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.
327358 } 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.
380545 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.
380545 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.
113870 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.
113870 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.
113870 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.
380545 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.
56861 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.
11064 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 62112 PetscErrorCode BVOrthogonalize(BV V,Mat R)
774 {
775 62112 PetscInt m,n;
776
777
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
62112 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.
62112 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.
62112 PetscValidType(V,1);
780
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
62112 BVCheckSizes(V,1);
781
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
62112 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.
62112 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.
62112 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.
62112 switch (V->orthog_block) {
793 56861 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.
56861 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.
62112 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.
62112 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.
62112 PetscFunctionReturn(PETSC_SUCCESS);
814 }
815