GCC Code Coverage Report


Directory: ./
File: src/sys/classes/bv/interface/bvorthog.c
Date: 2025-11-19 04:19:03
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 185740 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.
185740 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.
185740 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.
181228 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.
37432 PetscFunctionReturn(PETSC_SUCCESS);
26 }
27
28 /*
29 BVDotColumnInc - Same as BVDotColumn() but also including column j, which
30 is multiplied by itself
31 */
32 2889162 static inline PetscErrorCode BVDotColumnInc(BV X,PetscInt j,PetscScalar *q)
33 {
34 2889162 PetscInt ksave;
35 2889162 Vec y;
36
37
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2889162 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.
2889162 PetscCall(PetscLogEventBegin(BV_DotVec,X,0,0,0));
39 2889162 ksave = X->k;
40 2889162 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.
2889162 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.
2889162 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.
2889162 PetscCall(BVRestoreColumn(X,j,&y));
44 2889162 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.
2889162 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.
552245 PetscFunctionReturn(PETSC_SUCCESS);
47 }
48
49 /*
50 BVOrthogonalizeMGS1 - Compute one step of Modified Gram-Schmidt
51 */
52 195549 static PetscErrorCode BVOrthogonalizeMGS1(BV bv,PetscInt j,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onrm,PetscReal *nrm)
53 {
54 195549 PetscInt i;
55 195549 PetscScalar dot;
56 195549 PetscBool indef=bv->indef;
57 195549 Vec vi,z,w=v;
58 195549 const PetscScalar *omega;
59
60
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
195549 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.
195549 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.
195549 if (onrm) PetscCall(BVNormVec(bv,w,NORM_2,onrm));
63 195549 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.
195549 if (indef) PetscCall(VecGetArrayRead(bv->omega,&omega));
65
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2094179 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.
1898630 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.
844757 PetscCall(BVGetColumn(bv,i,&vi));
68 /* h_i = (v, v_i) */
69
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
844757 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.
844757 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.
1181137 PetscCall(BV_SetValue(bv,i,0,c,dot));
76
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
844757 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.
844757 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.
1898630 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.
195549 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.
195549 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.
273511 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.
195549 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.
38995 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 3469746 static PetscErrorCode BVOrthogonalizeCGS1(BV bv,PetscInt j,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onorm,PetscReal *norm)
92 {
93 3469746 PetscReal sum,beta;
94
95
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3469746 PetscFunctionBegin;
96 /* h = W^* v ; alpha = (v, v) */
97 3469746 bv->k = j;
98
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3469746 if (onorm || norm) {
99
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3385757 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.
2889162 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.
4003025 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.
496595 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.
496595 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.
83989 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.
3538618 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.
3469746 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.
496595 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.
3538618 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.
3469746 if (onorm) *onorm = beta;
119
120
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3469746 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.
3385757 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.
4526888 PetscCall(BV_SquareSum(bv,j,c,&sum));
125 3263695 *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.
3263695 if (PetscUnlikely(*norm <= 0.0)) PetscCall(BV_NormVecOrColumn(bv,j,v,norm));
127 3200365 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.
4803257 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.
667929 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 2554007 static PetscErrorCode BVOrthogonalizeGS(BV bv,PetscInt j,Vec v,PetscBool *which,PetscReal *norm,PetscBool *lindep)
146 {
147 2554007 PetscScalar *h,*c,*omega;
148 2554007 PetscReal onrm,nrm;
149 2554007 PetscInt k,l;
150 2554007 PetscBool mgs,dolindep,signature;
151
152
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2554007 PetscFunctionBegin;
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2554007 if (v) {
154 452582 k = bv->k;
155 452582 h = bv->h;
156 452582 c = bv->c;
157 } else {
158 k = j;
159 h = NULL;
160 c = NULL;
161 }
162
163 2554007 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.
2554007 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.
2554007 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.
2554007 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.
3539097 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.
2554007 switch (bv->orthog_ref) {
175
176 2424905 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.
4641299 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 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
3656153 while (l<3 && nrm && PetscAbsReal(nrm) < bv->orthog_eta*PetscAbsReal(onrm)) {
181 1271413 l++;
182
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1271413 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.
3928617 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 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
4014545 if (dolindep) *lindep = PetscNot(nrm && PetscAbsReal(nrm) >= bv->orthog_eta*PetscAbsReal(onrm));
187 break;
188
189 896 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.
1472 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.
896 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.
896 if (dolindep) *lindep = PetscNot(nrm);
195 break;
196
197 128206 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.
211619 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.
336648 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.
131423 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.
2554007 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.
155015 PetscCall(VecGetArray(bv->omega,&omega));
206
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
155015 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.
155015 PetscCall(VecRestoreArray(bv->omega,&omega));
208 }
209
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2554007 if (norm) {
210 2401977 *norm = nrm;
211
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2401977 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.
2104289 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.
2899626 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.
491936 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 452582 PetscErrorCode BVOrthogonalizeVec(BV bv,Vec v,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
250 {
251 452582 PetscInt ksave,lsave;
252
253
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
452582 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.
452582 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.
452582 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.
452582 PetscValidType(bv,1);
257
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
452582 BVCheckSizes(bv,1);
258
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
452582 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.
452582 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.
452582 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
262 452582 ksave = bv->k;
263 452582 lsave = bv->l;
264 452582 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.
452582 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.
452582 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.
452582 PetscCall(BVOrthogonalizeGS(bv,0,v,NULL,norm,lindep));
268 452582 bv->k = ksave;
269 452582 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.
560318 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.
452582 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.
89150 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 801487 PetscErrorCode BVOrthogonalizeColumn(BV bv,PetscInt j,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
315 {
316 801487 PetscInt ksave,lsave;
317
318
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
801487 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.
801487 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.
801487 PetscValidLogicalCollectiveInt(bv,j,2);
321
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
801487 PetscValidType(bv,1);
322
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
801487 BVCheckSizes(bv,1);
323
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
801487 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.
801487 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.
801487 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
327 801487 ksave = bv->k;
328 801487 lsave = bv->l;
329 801487 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.
801487 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.
801487 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.
801487 PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,norm,lindep));
333 801487 bv->k = ksave;
334 801487 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.
950988 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.
801487 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.
801487 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.
801487 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 1212154 PetscErrorCode BVOrthonormalizeColumn(BV bv,PetscInt j,PetscBool replace,PetscReal *norm,PetscBool *lindep)
380 {
381 1212154 PetscScalar alpha;
382 1212154 PetscReal nrm;
383 1212154 PetscInt ksave,lsave;
384 1212154 PetscBool lndep;
385
386
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1212154 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.
1212154 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.
1212154 PetscValidLogicalCollectiveInt(bv,j,2);
389
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1212154 PetscValidType(bv,1);
390
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1212154 BVCheckSizes(bv,1);
391
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1212154 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.
1212154 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.
1212154 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
396 1212154 ksave = bv->k;
397 1212154 lsave = bv->l;
398 1212154 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.
1212154 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.
1212154 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.
1212154 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 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
1212154 if (replace && (nrm==0.0 || lndep)) {
403
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
6 PetscCall(PetscInfo(bv,"Vector was linearly dependent, generating a new random vector\n"));
404
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
6 PetscCall(BVSetRandomColumn(bv,j));
405
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
6 PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,&nrm,&lndep));
406
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
6 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 1212154 bv->k = ksave;
412 1212154 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.
1212154 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.
1212154 if (nrm!=1.0 && nrm!=0.0) {
417 1206555 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.
1206555 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.
1206555 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.
1206555 PetscCall(PetscLogEventEnd(BV_Scale,bv,0,0,0));
421 }
422
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1212154 if (norm) *norm = nrm;
423
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1212154 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.
1212154 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.
1212154 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 87778 PetscErrorCode BVOrthogonalizeSomeColumn(BV bv,PetscInt j,PetscBool *which,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
461 {
462 87778 PetscInt ksave,lsave;
463
464
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
87778 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.
87778 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.
87778 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.
87778 PetscAssertPointer(which,3);
468
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87778 PetscValidType(bv,1);
469
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87778 BVCheckSizes(bv,1);
470
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87778 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.
87778 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.
87778 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.
87778 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
475 87778 ksave = bv->k;
476 87778 lsave = bv->l;
477 87778 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.
87778 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.
87778 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.
87778 PetscCall(BVOrthogonalizeGS(bv,j,NULL,which,norm,lindep));
481 87778 bv->k = ksave;
482 87778 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.
122850 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.
87778 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.
87778 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.
87778 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 56436 static PetscErrorCode BVOrthogonalize_GS(BV V,Mat R)
517 {
518 56436 PetscScalar *r=NULL;
519 56436 PetscReal norm;
520 56436 PetscInt j,ldr,lsave;
521 56436 Vec v,w;
522
523
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
56436 PetscFunctionBegin;
524
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
56436 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.
4135 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.
4135 PetscCall(MatDenseGetArray(R,&r));
527 }
528
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
56436 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.
17896 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.
17896 PetscCall(BVSetActiveColumns(V->cached,V->l,V->k));
531 }
532
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
431952 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.
375516 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.
375516 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.
53123 PetscCall(BVOrthogonalizeColumn(V,j,NULL,&norm,NULL));
542 53123 lsave = V->l;
543 53123 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.
73437 PetscCall(BV_StoreCoefficients(V,j,NULL,r+j*ldr));
545 53123 V->l = lsave;
546 53123 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.
322393 } 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.
375516 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.
375516 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.
113958 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.
113958 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.
113958 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.
375516 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.
56436 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.
11209 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 61687 PetscErrorCode BVOrthogonalize(BV V,Mat R)
774 {
775 61687 PetscInt m,n;
776
777
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
61687 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.
61687 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.
61687 PetscValidType(V,1);
780
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
61687 BVCheckSizes(V,1);
781
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
61687 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.
6024 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.
6024 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.
6024 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.
6024 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.
6024 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.
6024 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.
61687 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.
61687 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.
61687 switch (V->orthog_block) {
793 56436 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.
56436 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.
61687 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.
61687 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.
61687 PetscFunctionReturn(PETSC_SUCCESS);
814 }
815