GCC Code Coverage Report


Directory: ./
File: src/sys/classes/bv/interface/bvorthog.c
Date: 2026-10-22 02:08:06
Exec Total Coverage
Lines: 368 376 97.9%
Functions: 18 18 100.0%
Branches: 1106 1920 57.6%

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 193063 static inline PetscErrorCode BV_NormVecOrColumn(BV bv,PetscInt j,Vec v,PetscReal *nrm)
21 {
22
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
193063 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.
193063 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.
188006 else PetscCall(BVNormColumn(bv,j,NORM_2,nrm));
25
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
42392 PetscFunctionReturn(PETSC_SUCCESS);
26 }
27
28 /*
29 BVDotColumnInc - Same as BVDotColumn() but also including column j, which
30 is multiplied by itself
31 */
32 2944580 static inline PetscErrorCode BVDotColumnInc(BV X,PetscInt j,PetscScalar *q)
33 {
34 2944580 PetscInt ksave;
35 2944580 Vec y;
36
37
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2944580 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.
2944580 PetscCall(PetscLogEventBegin(BV_DotVec,X,0,0,0));
39 2944580 ksave = X->k;
40 2944580 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.
2944580 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.
2944580 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.
2944580 PetscCall(BVRestoreColumn(X,j,&y));
44 2944580 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.
2944580 PetscCall(PetscLogEventEnd(BV_DotVec,X,0,0,0));
46
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
570873 PetscFunctionReturn(PETSC_SUCCESS);
47 }
48
49 /*
50 BVOrthogonalizeMGS1 - Compute one step of modified Gram-Schmidt
51 */
52 195042 static PetscErrorCode BVOrthogonalizeMGS1(BV bv,PetscInt j,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onrm,PetscReal *nrm)
53 {
54 195042 PetscInt i;
55 195042 PetscScalar dot;
56 195042 PetscBool indef=bv->indef;
57 195042 Vec vi,z,w=v;
58 195042 const PetscScalar *omega;
59
60
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
195042 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.
195042 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.
195042 if (onrm) PetscCall(BVNormVec(bv,w,NORM_2,onrm));
63 195042 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.
195042 if (indef) PetscCall(VecGetArrayRead(bv->omega,&omega));
65
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2090106 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.
1895064 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.
840789 PetscCall(BVGetColumn(bv,i,&vi));
68 /* h_i = (v, v_i) */
69
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
840789 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.
840789 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.
1174607 PetscCall(BV_SetValue(bv,i,0,c,dot));
76
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
840789 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.
840789 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.
1895064 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.
195042 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.
195042 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.
272740 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.
195042 if (indef) PetscCall(VecRestoreArrayRead(bv->omega,&omega));
84
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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 3530080 static PetscErrorCode BVOrthogonalizeCGS1(BV bv,PetscInt j,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onorm,PetscReal *norm)
92 {
93 3530080 PetscReal sum,beta;
94
95
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
3530080 PetscFunctionBegin;
96 /* h = W^* v ; alpha = (v, v) */
97 3530080 bv->k = j;
98
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3530080 if (onorm || norm) {
99
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3443747 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.
2944580 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.
4084646 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.
499167 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.
499167 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.
86333 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.
3600630 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.
3530080 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.
499167 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.
3600630 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.
3530080 if (onorm) *onorm = beta;
119
120
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3530080 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.
3443747 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.
4606257 PetscCall(BV_SquareSum(bv,j,c,&sum));
125 3317919 *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.
3317919 if (PetscUnlikely(*norm <= 0.0)) PetscCall(BV_NormVecOrColumn(bv,j,v,norm));
127 3251032 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.
4890806 PetscCall(BV_AddCoefficients(bv,j,h,c));
131
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
687403 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 2600052 static PetscErrorCode BVOrthogonalizeGS(BV bv,PetscInt j,Vec v,PetscBool *which,PetscReal *norm,PetscBool *lindep)
146 {
147 2600052 PetscScalar *h,*c,*omega;
148 2600052 PetscReal onrm,nrm;
149 2600052 PetscInt k,l;
150 2600052 PetscBool mgs,dolindep,signature;
151
152
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2600052 PetscFunctionBegin;
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2600052 if (v) {
154 455177 k = bv->k;
155 455177 h = bv->h;
156 455177 c = bv->c;
157 } else {
158 k = j;
159 h = NULL;
160 c = NULL;
161 }
162
163 2600052 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.
2600052 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.
2600052 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.
2600052 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.
3607799 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.
2600052 switch (bv->orthog_ref) {
175
176 2463344 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.
4715033 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 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
3718803 while (l<3 && nrm && PetscAbsReal(nrm) < bv->orthog_eta*PetscAbsReal(onrm)) {
181 1295284 l++;
182
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1295284 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.
3884631 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 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
4082795 if (dolindep) *lindep = PetscNot(nrm && PetscAbsReal(nrm) >= bv->orthog_eta*PetscAbsReal(onrm));
187 break;
188
189 1802 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.
3284 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.
1802 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.
1802 if (dolindep) *lindep = PetscNot(nrm);
195 break;
196
197 134906 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.
219757 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.
351426 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.
138183 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.
2600052 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.
163058 PetscCall(VecGetArray(bv->omega,&omega));
206
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
163058 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.
163058 PetscCall(VecRestoreArray(bv->omega,&omega));
208 }
209
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2600052 if (norm) {
210 2444124 *norm = nrm;
211
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2444124 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.
2146771 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.
2964666 else PetscCall(BV_SetValue(bv,k,k,h,nrm));
214 }
215 }
216
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
505575 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 455177 PetscErrorCode BVOrthogonalizeVec(BV bv,Vec v,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
250 {
251 455177 PetscInt ksave,lsave;
252
253
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
455177 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.
455177 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.
455177 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.
455177 PetscValidType(bv,1);
257
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
455177 BVCheckSizes(bv,1);
258
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
455177 PetscValidType(v,2);
259
15/36
✓ 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 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ 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.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
455177 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.
455177 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
262 455177 ksave = bv->k;
263 455177 lsave = bv->l;
264 455177 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.
455177 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.
455177 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.
455177 PetscCall(BVOrthogonalizeGS(bv,0,v,NULL,norm,lindep));
268 455177 bv->k = ksave;
269 455177 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.
562913 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.
455177 PetscCall(PetscLogEventEnd(BV_OrthogonalizeVec,bv,0,0,0));
272
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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 829263 PetscErrorCode BVOrthogonalizeColumn(BV bv,PetscInt j,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
315 {
316 829263 PetscInt ksave,lsave;
317
318
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
829263 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.
829263 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
320
31/70
✓ 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 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ 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 not taken.
✓ Branch 35 taken 2 times.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✓ Branch 56 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✓ Branch 67 taken 2 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
829263 PetscValidLogicalCollectiveInt(bv,j,2);
321
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
829263 PetscValidType(bv,1);
322
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
829263 BVCheckSizes(bv,1);
323
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
829263 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.
829263 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.
829263 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
327 829263 ksave = bv->k;
328 829263 lsave = bv->l;
329 829263 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.
829263 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.
829263 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.
829263 PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,norm,lindep));
333 829263 bv->k = ksave;
334 829263 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.
992719 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.
829263 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.
829263 PetscCall(PetscObjectStateIncrease((PetscObject)bv));
338
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
829263 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 1228069 PetscErrorCode BVOrthonormalizeColumn(BV bv,PetscInt j,PetscBool replace,PetscReal *norm,PetscBool *lindep)
380 {
381 1228069 PetscScalar alpha;
382 1228069 PetscReal nrm;
383 1228069 PetscInt ksave,lsave;
384 1228069 PetscBool lndep;
385
386
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
1228069 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.
1228069 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
388
31/70
✓ 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 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ 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 not taken.
✓ Branch 35 taken 2 times.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✓ Branch 56 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✓ Branch 67 taken 2 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
1228069 PetscValidLogicalCollectiveInt(bv,j,2);
389
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1228069 PetscValidType(bv,1);
390
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1228069 BVCheckSizes(bv,1);
391
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1228069 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.
1228069 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.
1228069 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
396 1228069 ksave = bv->k;
397 1228069 lsave = bv->l;
398 1228069 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.
1228069 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.
1228069 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.
1228069 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 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
1228069 if (replace && (nrm==0.0 || lndep)) {
403
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscInfo(bv,"Vector was linearly dependent, generating a new random vector\n"));
404
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(BVSetRandomColumn(bv,j));
405
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,&nrm,&lndep));
406
2/4
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
9 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 1228069 bv->k = ksave;
412 1228069 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.
1228069 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.
1228069 if (nrm!=1.0 && nrm!=0.0) {
417 1221992 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.
1221992 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.
1221992 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.
1221992 PetscCall(PetscLogEventEnd(BV_Scale,bv,0,0,0));
421 }
422
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1228069 if (norm) *norm = nrm;
423
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1228069 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.
1228069 PetscCall(PetscObjectStateIncrease((PetscObject)bv));
425
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
1228069 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 87534 PetscErrorCode BVOrthogonalizeSomeColumn(BV bv,PetscInt j,PetscBool *which,PetscScalar H[],PetscReal *norm,PetscBool *lindep)
461 {
462 87534 PetscInt ksave,lsave;
463
464
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
87534 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.
87534 PetscValidHeaderSpecific(bv,BV_CLASSID,1);
466
31/70
✓ 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 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ 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 not taken.
✓ Branch 35 taken 2 times.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✓ Branch 56 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✓ Branch 67 taken 2 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
87534 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.
87534 PetscAssertPointer(which,3);
468
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87534 PetscValidType(bv,1);
469
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87534 BVCheckSizes(bv,1);
470
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
87534 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.
87534 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.
87534 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.
87534 PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0));
475 87534 ksave = bv->k;
476 87534 lsave = bv->l;
477 87534 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.
87534 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.
87534 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.
87534 PetscCall(BVOrthogonalizeGS(bv,j,NULL,which,norm,lindep));
481 87534 bv->k = ksave;
482 87534 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.
122481 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.
87534 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.
87534 PetscCall(PetscObjectStateIncrease((PetscObject)bv));
486
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
87534 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
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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 56644 static PetscErrorCode BVOrthogonalize_GS(BV V,Mat R)
517 {
518 56644 PetscScalar *r=NULL;
519 56644 PetscReal norm;
520 56644 PetscInt j,ldr,lsave;
521 56644 Vec v,w;
522
523
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
56644 PetscFunctionBegin;
524
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
56644 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.
56644 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.
17836 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.
17836 PetscCall(BVSetActiveColumns(V->cached,V->l,V->k));
531 }
532
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
436540 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.
379896 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.
379896 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.
326709 } 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.
379896 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.
379896 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.
113834 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.
113834 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.
113834 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.
379896 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.
56644 if (R) PetscCall(MatDenseRestoreArray(R,&r));
557
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
11064 PetscFunctionReturn(PETSC_SUCCESS);
558 }
559
560 /*
561 BV_GetBufferMat - Create auxiliary seqdense matrix that wraps the bv->buffer.
562 */
563 5273 static inline PetscErrorCode BV_GetBufferMat(BV bv)
564 {
565 5273 PetscInt ld;
566 5273 PetscScalar *array;
567
568
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
5273 PetscFunctionBegin;
569
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5273 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.
1809 if (!bv->buffer) PetscCall(BVGetBufferVec(bv,&bv->buffer));
571 1809 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.
1809 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.
1809 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.
1809 PetscCall(VecRestoreArray(bv->buffer,&array));
575 }
576
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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 1911 static inline PetscErrorCode BV_StoreCoeffsBlock_Default(BV bv,Mat R,PetscBool tri)
585 {
586 1911 const PetscScalar *bb;
587 1911 PetscScalar *rr;
588 1911 PetscInt j,ldr,ldb;
589
590
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
1911 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.
1911 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.
1911 PetscCall(MatDenseGetArray(R,&rr));
593 1911 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.
1911 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.
21339 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.
1911 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.
1911 PetscCall(MatDenseRestoreArray(R,&rr));
598
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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 2123 static PetscErrorCode BVOrthogonalize_TSQR(BV V,Mat Rin)
639 {
640 2123 PetscScalar *pv,*r=NULL;
641 2123 PetscInt ldr;
642 2123 Mat R;
643
644
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2123 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.
2123 PetscCall(BV_GetBufferMat(V));
646 2123 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.
2123 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.
2123 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.
2123 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.
2123 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.
2123 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.
2123 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.
2123 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.
2123 if (Rin) PetscCall(BV_StoreCoeffsBlock_Default(V,Rin,PETSC_TRUE));
655
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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 61917 PetscErrorCode BVOrthogonalize(BV V,Mat R)
774 {
775 61917 PetscInt m,n;
776
777
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
61917 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.
61917 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.
61917 PetscValidType(V,1);
780
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
61917 BVCheckSizes(V,1);
781
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
61917 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.
6054 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.
6054 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.
6054 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.
6054 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.
6054 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.
6054 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.
61917 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.
61917 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.
61917 switch (V->orthog_block) {
793 56644 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.
56644 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 2123 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.
2123 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.
2123 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.
61917 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.
61917 PetscCall(PetscObjectStateIncrease((PetscObject)V));
813
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
61917 PetscFunctionReturn(PETSC_SUCCESS);
814 }
815