GCC Code Coverage Report


Directory: ./
File: src/sys/classes/bv/interface/bvorthog.c
Date: 2026-04-06 03:57:41
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 189055 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.
189055 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.
189055 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.
184548 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.
42292 PetscFunctionReturn(PETSC_SUCCESS);
26 }
27
28 /*
29 BVDotColumnInc - Same as BVDotColumn() but also including column j, which
30 is multiplied by itself
31 */
32 2924523 static inline PetscErrorCode BVDotColumnInc(BV X,PetscInt j,PetscScalar *q)
33 {
34 2924523 PetscInt ksave;
35 2924523 Vec y;
36
37
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2924523 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.
2924523 PetscCall(PetscLogEventBegin(BV_DotVec,X,0,0,0));
39 2924523 ksave = X->k;
40 2924523 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.
2924523 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.
2924523 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.
2924523 PetscCall(BVRestoreColumn(X,j,&y));
44 2924523 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.
2924523 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.
571264 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 3505666 static PetscErrorCode BVOrthogonalizeCGS1(BV bv,PetscInt j,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onorm,PetscReal *norm)
92 {
93 3505666 PetscReal sum,beta;
94
95
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3505666 PetscFunctionBegin;
96 /* h = W^* v ; alpha = (v, v) */
97 3505666 bv->k = j;
98
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3505666 if (onorm || norm) {
99
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3420866 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.
2924523 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.
4046109 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.
3574276 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.
3505666 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.
3574276 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.
3505666 if (onorm) *onorm = beta;
119
120
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3505666 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.
3420866 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.
4567555 PetscCall(BV_SquareSum(bv,j,c,&sum));
125 3296377 *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.
3296377 if (PetscUnlikely(*norm <= 0.0)) PetscCall(BV_NormVecOrColumn(bv,j,v,norm));
127 3232159 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.
4846900 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.
687614 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 2583878 static PetscErrorCode BVOrthogonalizeGS(BV bv,PetscInt j,Vec v,PetscBool *which,PetscReal *norm,PetscBool *lindep)
146 {
147 2583878 PetscScalar *h,*c,*omega;
148 2583878 PetscReal onrm,nrm;
149 2583878 PetscInt k,l;
150 2583878 PetscBool mgs,dolindep,signature;
151
152
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2583878 PetscFunctionBegin;
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2583878 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 2583878 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.
2583878 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.
2583878 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.
2583878 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.
3578373 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.
2583878 switch (bv->orthog_ref) {
175
176 2449851 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.
4688227 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.
3696082 while (l<3 && nrm && PetscAbsReal(nrm) < bv->orthog_eta*PetscAbsReal(onrm)) {
181 1286139 l++;
182
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1286139 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.
3861187 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.
4059961 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.
2583878 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.
2583878 if (norm) {
210 2431650 *norm = nrm;
211
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2431650 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.
2134294 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.
2939161 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.
505938 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 821314 PetscErrorCode BVOrthogonalizeColumn(BV bv,PetscInt j,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
315 {
316 821314 PetscInt ksave,lsave;
317
318
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
821314 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.
821314 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.
821314 PetscValidLogicalCollectiveInt(bv,j,2);
321
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
821314 PetscValidType(bv,1);
322
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
821314 BVCheckSizes(bv,1);
323
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
821314 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.
821314 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.
821314 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
327 821314 ksave = bv->k;
328 821314 lsave = bv->l;
329 821314 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.
821314 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.
821314 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.
821314 PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,norm,lindep));
333 821314 bv->k = ksave;
334 821314 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.
981415 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.
821314 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.
821314 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.
821314 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 1222545 PetscErrorCode BVOrthonormalizeColumn(BV bv,PetscInt j,PetscBool replace,PetscReal *norm,PetscBool *lindep)
380 {
381 1222545 PetscScalar alpha;
382 1222545 PetscReal nrm;
383 1222545 PetscInt ksave,lsave;
384 1222545 PetscBool lndep;
385
386
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1222545 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.
1222545 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.
1222545 PetscValidLogicalCollectiveInt(bv,j,2);
389
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1222545 PetscValidType(bv,1);
390
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1222545 BVCheckSizes(bv,1);
391
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1222545 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.
1222545 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.
1222545 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
396 1222545 ksave = bv->k;
397 1222545 lsave = bv->l;
398 1222545 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.
1222545 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.
1222545 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.
1222545 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.
1222545 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 1222545 bv->k = ksave;
412 1222545 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.
1222545 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.
1222545 if (nrm!=1.0 && nrm!=0.0) {
417 1216789 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.
1216789 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.
1216789 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.
1216789 PetscCall(PetscLogEventEnd(BV_Scale,bv,0,0,0));
421 }
422
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1222545 if (norm) *norm = nrm;
423
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1222545 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.
1222545 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.
1222545 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 56661 static PetscErrorCode BVOrthogonalize_GS(BV V,Mat R)
517 {
518 56661 PetscScalar *r=NULL;
519 56661 PetscReal norm;
520 56661 PetscInt j,ldr,lsave;
521 56661 Vec v,w;
522
523
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
56661 PetscFunctionBegin;
524
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
56661 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.
56661 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.
435629 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.
378968 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.
378968 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.
325781 } 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.
378968 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.
378968 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.
378968 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.
56661 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.
11024 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 61912 PetscErrorCode BVOrthogonalize(BV V,Mat R)
774 {
775 61912 PetscInt m,n;
776
777
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
61912 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.
61912 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.
61912 PetscValidType(V,1);
780
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
61912 BVCheckSizes(V,1);
781
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
61912 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.
61912 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.
61912 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.
61912 switch (V->orthog_block) {
793 56661 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.
56661 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.
61912 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.
61912 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.
61912 PetscFunctionReturn(PETSC_SUCCESS);
814 }
815