Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
3 | SLEPc - Scalable Library for Eigenvalue Problem Computations | ||
4 | Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain | ||
5 | |||
6 | This file is part of SLEPc. | ||
7 | SLEPc is distributed under a 2-clause BSD license (see LICENSE). | ||
8 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
9 | */ | ||
10 | /* | ||
11 | BV orthogonalization routines | ||
12 | */ | ||
13 | |||
14 | #include <slepc/private/bvimpl.h> /*I "slepcbv.h" I*/ | ||
15 | |||
16 | /* | ||
17 | BV_NormVecOrColumn - Compute the 2-norm of the working vector, irrespective of | ||
18 | whether it is in a column or not | ||
19 | */ | ||
20 | 185740 | static inline PetscErrorCode BV_NormVecOrColumn(BV bv,PetscInt j,Vec v,PetscReal *nrm) | |
21 | { | ||
22 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
185740 | PetscFunctionBegin; |
23 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
185740 | if (v) PetscCall(BVNormVec(bv,v,NORM_2,nrm)); |
24 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
181228 | else PetscCall(BVNormColumn(bv,j,NORM_2,nrm)); |
25 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
37432 | PetscFunctionReturn(PETSC_SUCCESS); |
26 | } | ||
27 | |||
28 | /* | ||
29 | BVDotColumnInc - Same as BVDotColumn() but also including column j, which | ||
30 | is multiplied by itself | ||
31 | */ | ||
32 | 2891505 | static inline PetscErrorCode BVDotColumnInc(BV X,PetscInt j,PetscScalar *q) | |
33 | { | ||
34 | 2891505 | PetscInt ksave; | |
35 | 2891505 | Vec y; | |
36 | |||
37 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2891505 | 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.
|
2891505 | PetscCall(PetscLogEventBegin(BV_DotVec,X,0,0,0)); |
39 | 2891505 | ksave = X->k; | |
40 | 2891505 | 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.
|
2891505 | 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.
|
2891505 | 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.
|
2891505 | PetscCall(BVRestoreColumn(X,j,&y)); |
44 | 2891505 | 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.
|
2891505 | 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.
|
551277 | PetscFunctionReturn(PETSC_SUCCESS); |
47 | } | ||
48 | |||
49 | /* | ||
50 | BVOrthogonalizeMGS1 - Compute one step of Modified Gram-Schmidt | ||
51 | */ | ||
52 | 195549 | static PetscErrorCode BVOrthogonalizeMGS1(BV bv,PetscInt j,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onrm,PetscReal *nrm) | |
53 | { | ||
54 | 195549 | PetscInt i; | |
55 | 195549 | PetscScalar dot; | |
56 | 195549 | PetscBool indef=bv->indef; | |
57 | 195549 | Vec vi,z,w=v; | |
58 | 195549 | const PetscScalar *omega; | |
59 | |||
60 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
195549 | PetscFunctionBegin; |
61 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
195549 | if (!v) PetscCall(BVGetColumn(bv,j,&w)); |
62 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
195549 | if (onrm) PetscCall(BVNormVec(bv,w,NORM_2,onrm)); |
63 | 195549 | z = w; | |
64 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
195549 | if (indef) PetscCall(VecGetArrayRead(bv->omega,&omega)); |
65 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2094179 | for (i=-bv->nc;i<j;i++) { |
66 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
1898630 | if (which && i>=0 && !which[i]) continue; |
67 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
844757 | PetscCall(BVGetColumn(bv,i,&vi)); |
68 | /* h_i = (v, v_i) */ | ||
69 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
844757 | if (bv->matrix) { |
70 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1760 | PetscCall(BV_IPMatMult(bv,w)); |
71 | 1760 | z = bv->Bx; | |
72 | } | ||
73 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
844757 | PetscCall(VecDot(z,vi,&dot)); |
74 | /* v <- v - h_i v_i */ | ||
75 |
5/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1181137 | PetscCall(BV_SetValue(bv,i,0,c,dot)); |
76 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
844757 | if (indef) dot /= PetscRealPart(omega[bv->nc+i]); |
77 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
844757 | PetscCall(VecAXPY(w,-dot,vi)); |
78 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1898630 | PetscCall(BVRestoreColumn(bv,i,&vi)); |
79 | } | ||
80 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
195549 | if (nrm) PetscCall(BVNormVec(bv,w,NORM_2,nrm)); |
81 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
195549 | if (!v) PetscCall(BVRestoreColumn(bv,j,&w)); |
82 |
5/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
273511 | PetscCall(BV_AddCoefficients(bv,j,h,c)); |
83 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
195549 | if (indef) PetscCall(VecRestoreArrayRead(bv->omega,&omega)); |
84 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
38995 | PetscFunctionReturn(PETSC_SUCCESS); |
85 | } | ||
86 | |||
87 | /* | ||
88 | BVOrthogonalizeCGS1 - Compute |v'| (estimated), |v| and one step of CGS with | ||
89 | only one global synchronization | ||
90 | */ | ||
91 | 3472089 | static PetscErrorCode BVOrthogonalizeCGS1(BV bv,PetscInt j,Vec v,PetscBool *which,PetscScalar *h,PetscScalar *c,PetscReal *onorm,PetscReal *norm) | |
92 | { | ||
93 | 3472089 | PetscReal sum,beta; | |
94 | |||
95 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
3472089 | PetscFunctionBegin; |
96 | /* h = W^* v ; alpha = (v, v) */ | ||
97 | 3472089 | bv->k = j; | |
98 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3472089 | if (onorm || norm) { |
99 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3388100 | 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.
|
2891505 | 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.
|
4005362 | PetscCall(BV_SquareRoot(bv,j,c,&beta)); |
102 | } else { | ||
103 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
496595 | PetscCall(BVDotVec(bv,v,c)); |
104 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
496595 | PetscCall(BVNormVec(bv,v,NORM_2,&beta)); |
105 | } | ||
106 | } else { | ||
107 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
83989 | if (!v) PetscCall(BVDotColumn(bv,j,c)); |
108 | ✗ | else PetscCall(BVDotVec(bv,v,c)); | |
109 | } | ||
110 | |||
111 | /* q = v - V h */ | ||
112 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
3540961 | 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.
|
3472089 | if (!v) PetscCall(BVMultColumn(bv,-1.0,1.0,j,c)); |
114 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
496595 | else PetscCall(BVMultVec(bv,-1.0,1.0,v,c)); |
115 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
3540961 | 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.
|
3472089 | if (onorm) *onorm = beta; |
119 | |||
120 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3472089 | 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.
|
3388100 | 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.
|
4529225 | PetscCall(BV_SquareSum(bv,j,c,&sum)); |
125 | 3266038 | *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.
|
3266038 | if (PetscUnlikely(*norm <= 0.0)) PetscCall(BV_NormVecOrColumn(bv,j,v,norm)); |
127 | 3202708 | 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.
|
4805594 | 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.
|
666961 | 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 | 2555550 | static PetscErrorCode BVOrthogonalizeGS(BV bv,PetscInt j,Vec v,PetscBool *which,PetscReal *norm,PetscBool *lindep) | |
146 | { | ||
147 | 2555550 | PetscScalar *h,*c,*omega; | |
148 | 2555550 | PetscReal onrm,nrm; | |
149 | 2555550 | PetscInt k,l; | |
150 | 2555550 | PetscBool mgs,dolindep,signature; | |
151 | |||
152 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2555550 | PetscFunctionBegin; |
153 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2555550 | if (v) { |
154 | 452582 | k = bv->k; | |
155 | 452582 | h = bv->h; | |
156 | 452582 | c = bv->c; | |
157 | } else { | ||
158 | k = j; | ||
159 | h = NULL; | ||
160 | c = NULL; | ||
161 | } | ||
162 | |||
163 | 2555550 | 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.
|
2555550 | 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.
|
2555550 | 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.
|
2555550 | 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.
|
3540604 | 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.
|
2555550 | switch (bv->orthog_ref) { |
175 | |||
176 | 2426448 | 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.
|
4644385 | PetscCall(BVOrthogonalizeGS1(bv,k,v,which,h,c,&onrm,&nrm)); |
178 | /* repeat if ||q|| < eta ||h|| */ | ||
179 | l = 1; | ||
180 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
3658496 | while (l<3 && nrm && PetscAbsReal(nrm) < bv->orthog_eta*PetscAbsReal(onrm)) { |
181 | 1272213 | l++; | |
182 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
1272213 | 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.
|
3930900 | PetscCall(BVOrthogonalizeGS1(bv,k,v,which,h,c,(mgs||bv->indef)?NULL:&onrm,&nrm)); |
184 | } | ||
185 | /* linear dependence check: criterion not satisfied in the last iteration */ | ||
186 |
6/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
|
4017631 | if (dolindep) *lindep = PetscNot(nrm && PetscAbsReal(nrm) >= bv->orthog_eta*PetscAbsReal(onrm)); |
187 | break; | ||
188 | |||
189 | 896 | case BV_ORTHOG_REFINE_NEVER: | |
190 |
8/10✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
1472 | PetscCall(BVOrthogonalizeGS1(bv,k,v,which,h,c,NULL,NULL)); |
191 | /* compute ||v|| */ | ||
192 |
7/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
896 | if (norm || dolindep || signature) PetscCall(BV_NormVecOrColumn(bv,k,v,&nrm)); |
193 | /* linear dependence check: just test for exactly zero norm */ | ||
194 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
896 | if (dolindep) *lindep = PetscNot(nrm); |
195 | break; | ||
196 | |||
197 | 128206 | case BV_ORTHOG_REFINE_ALWAYS: | |
198 |
9/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
211619 | PetscCall(BVOrthogonalizeGS1(bv,k,v,which,h,c,NULL,NULL)); |
199 |
15/16✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 10 times.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
|
336648 | PetscCall(BVOrthogonalizeGS1(bv,k,v,which,h,c,dolindep?&onrm:NULL,(norm||dolindep||signature)?&nrm:NULL)); |
200 | /* linear dependence check: criterion not satisfied in the second iteration */ | ||
201 |
4/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
131423 | if (dolindep) *lindep = PetscNot(nrm && PetscAbsReal(nrm) >= bv->orthog_eta*PetscAbsReal(onrm)); |
202 | break; | ||
203 | } | ||
204 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2555550 | if (signature) { |
205 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
155015 | PetscCall(VecGetArray(bv->omega,&omega)); |
206 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
155015 | omega[bv->nc+k] = (nrm<0.0)? -1.0: 1.0; |
207 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
155015 | PetscCall(VecRestoreArray(bv->omega,&omega)); |
208 | } | ||
209 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2555550 | if (norm) { |
210 | 2403520 | *norm = nrm; | |
211 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2403520 | 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.
|
2105832 | 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.
|
2901133 | 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.
|
491288 | 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: BVOrthogonalizeColumn(), BVSetOrthogonalization(), BVSetActiveColumns(), BVGetNumConstraints() | ||
248 | @*/ | ||
249 | 452582 | PetscErrorCode BVOrthogonalizeVec(BV bv,Vec v,PetscScalar *H,PetscReal *norm,PetscBool *lindep) | |
250 | { | ||
251 | 452582 | PetscInt ksave,lsave; | |
252 | |||
253 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
452582 | PetscFunctionBegin; |
254 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
452582 | PetscValidHeaderSpecific(bv,BV_CLASSID,1); |
255 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
452582 | PetscValidHeaderSpecific(v,VEC_CLASSID,2); |
256 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
452582 | PetscValidType(bv,1); |
257 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
452582 | BVCheckSizes(bv,1); |
258 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
452582 | PetscValidType(v,2); |
259 |
13/32✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
|
452582 | PetscCheckSameComm(bv,1,v,2); |
260 | |||
261 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
452582 | PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0)); |
262 | 452582 | ksave = bv->k; | |
263 | 452582 | lsave = bv->l; | |
264 | 452582 | bv->l = -bv->nc; /* must also orthogonalize against constraints and leading columns */ | |
265 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
452582 | PetscCall(BV_AllocateCoeffs(bv)); |
266 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
452582 | PetscCall(BV_AllocateSignature(bv)); |
267 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
452582 | PetscCall(BVOrthogonalizeGS(bv,0,v,NULL,norm,lindep)); |
268 | 452582 | bv->k = ksave; | |
269 | 452582 | bv->l = lsave; | |
270 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
560318 | if (H) PetscCall(BV_StoreCoefficients(bv,bv->k,bv->h,H)); |
271 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
452582 | PetscCall(PetscLogEventEnd(BV_OrthogonalizeVec,bv,0,0,0)); |
272 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
89150 | PetscFunctionReturn(PETSC_SUCCESS); |
273 | } | ||
274 | |||
275 | /*@ | ||
276 | BVOrthogonalizeColumn - Orthogonalize one of the column vectors with respect to | ||
277 | the previous ones. | ||
278 | |||
279 | Collective | ||
280 | |||
281 | Input Parameters: | ||
282 | + bv - the basis vectors context | ||
283 | - j - index of column to be orthogonalized | ||
284 | |||
285 | Output Parameters: | ||
286 | + H - (optional) coefficients computed during orthogonalization | ||
287 | . norm - (optional) norm of the vector after being orthogonalized | ||
288 | - lindep - (optional) flag indicating that refinement did not improve the quality | ||
289 | of orthogonalization | ||
290 | |||
291 | Notes: | ||
292 | This function applies an orthogonal projector to project vector V[j] onto | ||
293 | the orthogonal complement of the span of the columns V[0..j-1], | ||
294 | where V[.] are the vectors of BV. The columns V[0..j-1] are assumed to be | ||
295 | mutually orthonormal. | ||
296 | |||
297 | Leading columns V[0..l-1] also participate in the orthogonalization, as well | ||
298 | as the constraints. If H is given, it must have enough space to store | ||
299 | j-l+1 coefficients (the last coefficient will contain the value norm, unless | ||
300 | the norm argument is NULL). | ||
301 | |||
302 | If a non-standard inner product has been specified with BVSetMatrix(), | ||
303 | then the vector is B-orthogonalized, using the non-standard inner product | ||
304 | defined by matrix B. The output vector satisfies V[j]'*B*V[0..j-1] = 0. | ||
305 | |||
306 | This routine does not normalize the resulting vector, see BVOrthonormalizeColumn(). | ||
307 | |||
308 | In the case of an indefinite inner product, the lindep parameter is not | ||
309 | computed (set to false). | ||
310 | |||
311 | Level: advanced | ||
312 | |||
313 | .seealso: BVSetOrthogonalization(), BVSetMatrix(), BVSetActiveColumns(), BVOrthogonalize(), BVOrthogonalizeVec(), BVGetNumConstraints(), BVOrthonormalizeColumn() | ||
314 | @*/ | ||
315 | 801647 | PetscErrorCode BVOrthogonalizeColumn(BV bv,PetscInt j,PetscScalar *H,PetscReal *norm,PetscBool *lindep) | |
316 | { | ||
317 | 801647 | PetscInt ksave,lsave; | |
318 | |||
319 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
801647 | PetscFunctionBegin; |
320 |
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.
|
801647 | PetscValidHeaderSpecific(bv,BV_CLASSID,1); |
321 |
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.
|
801647 | PetscValidLogicalCollectiveInt(bv,j,2); |
322 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
801647 | PetscValidType(bv,1); |
323 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
801647 | BVCheckSizes(bv,1); |
324 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
801647 | PetscCheck(j>=0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Index j must be non-negative"); |
325 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
801647 | 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); |
326 | |||
327 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
801647 | PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0)); |
328 | 801647 | ksave = bv->k; | |
329 | 801647 | lsave = bv->l; | |
330 | 801647 | bv->l = -bv->nc; /* must also orthogonalize against constraints and leading columns */ | |
331 |
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.
|
801647 | if (!bv->buffer) PetscCall(BVGetBufferVec(bv,&bv->buffer)); |
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.
|
801647 | PetscCall(BV_AllocateSignature(bv)); |
333 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
801647 | PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,norm,lindep)); |
334 | 801647 | bv->k = ksave; | |
335 | 801647 | bv->l = lsave; | |
336 |
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.
|
951148 | if (H) PetscCall(BV_StoreCoefficients(bv,j,NULL,H)); |
337 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
801647 | PetscCall(PetscLogEventEnd(BV_OrthogonalizeVec,bv,0,0,0)); |
338 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
801647 | PetscCall(PetscObjectStateIncrease((PetscObject)bv)); |
339 |
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.
|
801647 | PetscFunctionReturn(PETSC_SUCCESS); |
340 | } | ||
341 | |||
342 | /*@ | ||
343 | BVOrthonormalizeColumn - Orthonormalize one of the column vectors with respect to | ||
344 | the previous ones. | ||
345 | |||
346 | Collective | ||
347 | |||
348 | Input Parameters: | ||
349 | + bv - the basis vectors context | ||
350 | . j - index of column to be orthonormalized | ||
351 | - replace - whether it is allowed to set the vector randomly | ||
352 | |||
353 | Output Parameters: | ||
354 | + norm - (optional) norm of the vector after orthogonalization and before normalization | ||
355 | - lindep - (optional) flag indicating that linear dependence was determined during | ||
356 | orthogonalization | ||
357 | |||
358 | Notes: | ||
359 | This is equivalent to a call to BVOrthogonalizeColumn() followed by a | ||
360 | call to BVScaleColumn() with the reciprocal of the norm. | ||
361 | |||
362 | This function first orthogonalizes vector V[j] with respect to V[0..j-1], | ||
363 | where V[.] are the vectors of BV. A byproduct of this computation is norm, | ||
364 | the norm of the vector after orthogonalization. Secondly, it scales the | ||
365 | vector with 1/norm, so that the resulting vector has unit norm. | ||
366 | |||
367 | If after orthogonalization the vector V[j] is exactly zero, it cannot be normalized | ||
368 | because norm=0. In that case, it could be left as zero or replaced by a random | ||
369 | vector that is then orthonormalized. The latter is achieved by setting the | ||
370 | argument replace to TRUE. The vector will be replaced by a random vector also | ||
371 | if lindep was set to TRUE, even if the norm is not exactly zero. | ||
372 | |||
373 | If the vector has been replaced by a random vector, the output arguments norm and | ||
374 | lindep will be set according to the orthogonalization of this new vector. | ||
375 | |||
376 | Level: advanced | ||
377 | |||
378 | .seealso: BVOrthogonalizeColumn(), BVScaleColumn() | ||
379 | @*/ | ||
380 | 1213537 | PetscErrorCode BVOrthonormalizeColumn(BV bv,PetscInt j,PetscBool replace,PetscReal *norm,PetscBool *lindep) | |
381 | { | ||
382 | 1213537 | PetscScalar alpha; | |
383 | 1213537 | PetscReal nrm; | |
384 | 1213537 | PetscInt ksave,lsave; | |
385 | 1213537 | PetscBool lndep; | |
386 | |||
387 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1213537 | PetscFunctionBegin; |
388 |
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.
|
1213537 | PetscValidHeaderSpecific(bv,BV_CLASSID,1); |
389 |
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.
|
1213537 | PetscValidLogicalCollectiveInt(bv,j,2); |
390 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1213537 | PetscValidType(bv,1); |
391 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1213537 | BVCheckSizes(bv,1); |
392 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1213537 | PetscCheck(j>=0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Index j must be non-negative"); |
393 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1213537 | 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); |
394 | |||
395 | /* orthogonalize */ | ||
396 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1213537 | PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0)); |
397 | 1213537 | ksave = bv->k; | |
398 | 1213537 | lsave = bv->l; | |
399 | 1213537 | bv->l = -bv->nc; /* must also orthogonalize against constraints and leading columns */ | |
400 |
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.
|
1213537 | if (!bv->buffer) PetscCall(BVGetBufferVec(bv,&bv->buffer)); |
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.
|
1213537 | PetscCall(BV_AllocateSignature(bv)); |
402 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1213537 | PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,&nrm,&lndep)); |
403 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
|
1213537 | if (replace && (nrm==0.0 || lndep)) { |
404 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
6 | PetscCall(PetscInfo(bv,"Vector was linearly dependent, generating a new random vector\n")); |
405 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
6 | PetscCall(BVSetRandomColumn(bv,j)); |
406 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
6 | PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,&nrm,&lndep)); |
407 |
2/4✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
|
6 | if (nrm==0.0 || lndep) { /* yet another attempt */ |
408 | ✗ | PetscCall(BVSetRandomColumn(bv,j)); | |
409 | ✗ | PetscCall(BVOrthogonalizeGS(bv,j,NULL,NULL,&nrm,&lndep)); | |
410 | } | ||
411 | } | ||
412 | 1213537 | bv->k = ksave; | |
413 | 1213537 | bv->l = lsave; | |
414 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1213537 | PetscCall(PetscLogEventEnd(BV_OrthogonalizeVec,bv,0,0,0)); |
415 | |||
416 | /* scale */ | ||
417 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
1213537 | if (nrm!=1.0 && nrm!=0.0) { |
418 | 1207938 | alpha = 1.0/nrm; | |
419 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1207938 | PetscCall(PetscLogEventBegin(BV_Scale,bv,0,0,0)); |
420 |
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.
|
1207938 | PetscUseTypeMethod(bv,scale,j,alpha); |
421 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1207938 | PetscCall(PetscLogEventEnd(BV_Scale,bv,0,0,0)); |
422 | } | ||
423 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1213537 | if (norm) *norm = nrm; |
424 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1213537 | if (lindep) *lindep = lndep; |
425 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
1213537 | PetscCall(PetscObjectStateIncrease((PetscObject)bv)); |
426 |
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.
|
1213537 | PetscFunctionReturn(PETSC_SUCCESS); |
427 | } | ||
428 | |||
429 | /*@ | ||
430 | BVOrthogonalizeSomeColumn - Orthogonalize one of the column vectors with | ||
431 | respect to some of the previous ones. | ||
432 | |||
433 | Collective | ||
434 | |||
435 | Input Parameters: | ||
436 | + bv - the basis vectors context | ||
437 | . j - index of column to be orthogonalized | ||
438 | - which - logical array indicating selected columns | ||
439 | |||
440 | Output Parameters: | ||
441 | + H - (optional) coefficients computed during orthogonalization | ||
442 | . norm - (optional) norm of the vector after being orthogonalized | ||
443 | - lindep - (optional) flag indicating that refinement did not improve the quality | ||
444 | of orthogonalization | ||
445 | |||
446 | Notes: | ||
447 | This function is similar to BVOrthogonalizeColumn(), but V[j] is | ||
448 | orthogonalized only against columns V[i] having which[i]=PETSC_TRUE. | ||
449 | The length of array which must be j at least. | ||
450 | |||
451 | The use of this operation is restricted to MGS orthogonalization type. | ||
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: BVOrthogonalizeColumn(), BVSetOrthogonalization() | ||
459 | @*/ | ||
460 | 87778 | PetscErrorCode BVOrthogonalizeSomeColumn(BV bv,PetscInt j,PetscBool *which,PetscScalar *H,PetscReal *norm,PetscBool *lindep) | |
461 | { | ||
462 | 87778 | PetscInt ksave,lsave; | |
463 | |||
464 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
87778 | PetscFunctionBegin; |
465 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
87778 | PetscValidHeaderSpecific(bv,BV_CLASSID,1); |
466 |
27/62✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
87778 | PetscValidLogicalCollectiveInt(bv,j,2); |
467 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
87778 | PetscAssertPointer(which,3); |
468 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
87778 | PetscValidType(bv,1); |
469 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
87778 | BVCheckSizes(bv,1); |
470 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
87778 | PetscCheck(j>=0,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Index j must be non-negative"); |
471 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
87778 | PetscCheck(j<bv->m,PetscObjectComm((PetscObject)bv),PETSC_ERR_ARG_OUTOFRANGE,"Index j=%" PetscInt_FMT " but BV only has %" PetscInt_FMT " columns",j,bv->m); |
472 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
87778 | PetscCheck(bv->orthog_type==BV_ORTHOG_MGS,PetscObjectComm((PetscObject)bv),PETSC_ERR_SUP,"Operation only available for MGS orthogonalization"); |
473 | |||
474 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
87778 | PetscCall(PetscLogEventBegin(BV_OrthogonalizeVec,bv,0,0,0)); |
475 | 87778 | ksave = bv->k; | |
476 | 87778 | lsave = bv->l; | |
477 | 87778 | bv->l = -bv->nc; /* must also orthogonalize against constraints and leading columns */ | |
478 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
87778 | if (!bv->buffer) PetscCall(BVGetBufferVec(bv,&bv->buffer)); |
479 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
87778 | PetscCall(BV_AllocateSignature(bv)); |
480 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
87778 | PetscCall(BVOrthogonalizeGS(bv,j,NULL,which,norm,lindep)); |
481 | 87778 | bv->k = ksave; | |
482 | 87778 | bv->l = lsave; | |
483 |
7/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
122850 | if (H) PetscCall(BV_StoreCoefficients(bv,j,NULL,H)); |
484 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
87778 | PetscCall(PetscLogEventEnd(BV_OrthogonalizeVec,bv,0,0,0)); |
485 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
87778 | PetscCall(PetscObjectStateIncrease((PetscObject)bv)); |
486 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
87778 | PetscFunctionReturn(PETSC_SUCCESS); |
487 | } | ||
488 | |||
489 | /* | ||
490 | Block Gram-Schmidt: V2 = V2 - V1*R12, where R12 = V1'*V2 | ||
491 | */ | ||
492 | 1432 | static PetscErrorCode BVOrthogonalize_BlockGS(BV V,Mat R) | |
493 | { | ||
494 | 1432 | BV V1; | |
495 | |||
496 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1432 | PetscFunctionBegin; |
497 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1432 | PetscCall(BVGetSplit(V,&V1,NULL)); |
498 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1432 | PetscCall(BVDot(V,V1,R)); |
499 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1432 | PetscCall(BVMult(V,-1.0,1.0,V1,R)); |
500 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1432 | PetscCall(BVRestoreSplit(V,&V1,NULL)); |
501 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
248 | PetscFunctionReturn(PETSC_SUCCESS); |
502 | } | ||
503 | |||
504 | /* | ||
505 | Orthogonalize a set of vectors with Gram-Schmidt, column by column. | ||
506 | */ | ||
507 | 56436 | static PetscErrorCode BVOrthogonalize_GS(BV V,Mat R) | |
508 | { | ||
509 | 56436 | PetscScalar *r=NULL; | |
510 | 56436 | PetscReal norm; | |
511 | 56436 | PetscInt j,ldr,lsave; | |
512 | 56436 | Vec v,w; | |
513 | |||
514 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
56436 | PetscFunctionBegin; |
515 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
56436 | if (R) { |
516 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4135 | PetscCall(MatDenseGetLDA(R,&ldr)); |
517 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
4135 | PetscCall(MatDenseGetArray(R,&r)); |
518 | } | ||
519 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
56436 | if (V->matrix) { |
520 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
17896 | PetscCall(BVGetCachedBV(V,&V->cached)); |
521 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
17896 | PetscCall(BVSetActiveColumns(V->cached,V->l,V->k)); |
522 | } | ||
523 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
431952 | for (j=V->l;j<V->k;j++) { |
524 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
375516 | if (V->matrix && V->orthog_type==BV_ORTHOG_MGS) { /* fill cached BV */ |
525 | ✗ | PetscCall(BVGetColumn(V->cached,j,&v)); | |
526 | ✗ | PetscCall(BVGetColumn(V,j,&w)); | |
527 | ✗ | PetscCall(MatMult(V->matrix,w,v)); | |
528 | ✗ | PetscCall(BVRestoreColumn(V,j,&w)); | |
529 | ✗ | PetscCall(BVRestoreColumn(V->cached,j,&v)); | |
530 | } | ||
531 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
375516 | if (R) { |
532 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
53123 | PetscCall(BVOrthogonalizeColumn(V,j,NULL,&norm,NULL)); |
533 | 53123 | lsave = V->l; | |
534 | 53123 | V->l = -V->nc; | |
535 |
5/6✓ Branch 0 taken 6 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
73437 | PetscCall(BV_StoreCoefficients(V,j,NULL,r+j*ldr)); |
536 | 53123 | V->l = lsave; | |
537 | 53123 | r[j+j*ldr] = norm; | |
538 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
322393 | } else PetscCall(BVOrthogonalizeColumn(V,j,NULL,&norm,NULL)); |
539 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
375516 | PetscCheck(norm,PetscObjectComm((PetscObject)V),PETSC_ERR_CONV_FAILED,"Breakdown in BVOrthogonalize due to a linearly dependent column"); |
540 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
375516 | if (V->matrix && V->orthog_type==BV_ORTHOG_CGS) { /* fill cached BV */ |
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.
|
113958 | PetscCall(BVGetColumn(V->cached,j,&v)); |
542 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113958 | PetscCall(VecCopy(V->Bx,v)); |
543 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
113958 | PetscCall(BVRestoreColumn(V->cached,j,&v)); |
544 | } | ||
545 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
375516 | PetscCall(BVScaleColumn(V,j,1.0/norm)); |
546 | } | ||
547 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
56436 | if (R) PetscCall(MatDenseRestoreArray(R,&r)); |
548 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
11209 | PetscFunctionReturn(PETSC_SUCCESS); |
549 | } | ||
550 | |||
551 | /* | ||
552 | BV_GetBufferMat - Create auxiliary seqdense matrix that wraps the bv->buffer. | ||
553 | */ | ||
554 | 5251 | static inline PetscErrorCode BV_GetBufferMat(BV bv) | |
555 | { | ||
556 | 5251 | PetscInt ld; | |
557 | 5251 | PetscScalar *array; | |
558 | |||
559 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
5251 | PetscFunctionBegin; |
560 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
5251 | if (!bv->Abuffer) { |
561 |
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)); |
562 | 1807 | ld = bv->m+bv->nc; | |
563 |
4/6✓ Branch 0 taken 2 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)); |
564 |
4/6✓ Branch 0 taken 2 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)); |
565 |
4/6✓ Branch 0 taken 2 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)); |
566 | } | ||
567 |
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); |
568 | } | ||
569 | |||
570 | /* | ||
571 | BV_StoreCoeffsBlock_Default - Copy the contents of the BV buffer to a dense Mat | ||
572 | provided by the caller. Only columns l:k-1 are copied, restricting to the upper | ||
573 | triangular part if tri=PETSC_TRUE. | ||
574 | */ | ||
575 | 1889 | static inline PetscErrorCode BV_StoreCoeffsBlock_Default(BV bv,Mat R,PetscBool tri) | |
576 | { | ||
577 | 1889 | const PetscScalar *bb; | |
578 | 1889 | PetscScalar *rr; | |
579 | 1889 | PetscInt j,ldr,ldb; | |
580 | |||
581 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1889 | PetscFunctionBegin; |
582 |
4/6✓ Branch 0 taken 2 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)); |
583 |
4/6✓ Branch 0 taken 2 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)); |
584 | 1889 | ldb = bv->m+bv->nc; | |
585 |
4/6✓ Branch 0 taken 2 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)); |
586 |
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)); |
587 |
4/6✓ Branch 0 taken 2 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)); |
588 |
4/6✓ Branch 0 taken 2 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)); |
589 |
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); |
590 | } | ||
591 | |||
592 | /* | ||
593 | Orthogonalize a set of vectors with Cholesky: R=chol(V'*V), Q=V*inv(R) | ||
594 | */ | ||
595 | 1178 | static PetscErrorCode BVOrthogonalize_Chol(BV V,Mat Rin) | |
596 | { | ||
597 | 1178 | Mat R,S; | |
598 | |||
599 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1178 | PetscFunctionBegin; |
600 |
4/6✓ Branch 0 taken 2 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)); |
601 | 1178 | R = V->Abuffer; | |
602 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1178 | if (Rin) S = Rin; /* use Rin as a workspace for S */ |
603 | 794 | else S = R; | |
604 |
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)); |
605 |
4/6✓ Branch 0 taken 2 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)); |
606 |
4/6✓ Branch 0 taken 2 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)); |
607 |
4/6✓ Branch 0 taken 2 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)); |
608 |
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)); |
609 |
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); |
610 | } | ||
611 | |||
612 | /* | ||
613 | Orthogonalize a set of vectors with the Tall-Skinny QR method | ||
614 | */ | ||
615 | 2101 | static PetscErrorCode BVOrthogonalize_TSQR(BV V,Mat Rin) | |
616 | { | ||
617 | 2101 | PetscScalar *pv,*r=NULL; | |
618 | 2101 | PetscInt ldr; | |
619 | 2101 | Mat R; | |
620 | |||
621 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2101 | PetscFunctionBegin; |
622 |
4/6✓ Branch 0 taken 2 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)); |
623 | 2101 | R = V->Abuffer; | |
624 |
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)); |
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.
|
2101 | PetscCall(MatDenseGetLDA(R,&ldr)); |
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.
|
2101 | PetscCall(MatDenseGetArray(R,&r)); |
627 |
4/6✓ Branch 0 taken 2 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)); |
628 |
4/6✓ Branch 0 taken 2 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)); |
629 |
4/6✓ Branch 0 taken 2 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)); |
630 |
4/6✓ Branch 0 taken 2 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)); |
631 |
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)); |
632 |
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); |
633 | } | ||
634 | |||
635 | /* | ||
636 | Orthogonalize a set of vectors with TSQR, but computing R only, then doing Q=V*inv(R) | ||
637 | */ | ||
638 | 794 | static PetscErrorCode BVOrthogonalize_TSQRCHOL(BV V,Mat Rin) | |
639 | { | ||
640 | 794 | PetscScalar *pv,*r=NULL; | |
641 | 794 | PetscInt ldr; | |
642 | 794 | Mat R,S; | |
643 | |||
644 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
794 | 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.
|
794 | PetscCall(BV_GetBufferMat(V)); |
646 | 794 | R = V->Abuffer; | |
647 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
794 | if (Rin) S = Rin; /* use Rin as a workspace for S */ |
648 | 602 | else S = R; | |
649 |
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)); |
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.
|
794 | PetscCall(MatDenseGetLDA(R,&ldr)); |
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.
|
794 | PetscCall(MatDenseGetArray(R,&r)); |
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.
|
794 | PetscCall(BVGetArray(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.
|
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)); |
654 |
4/6✓ Branch 0 taken 2 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)); |
655 |
4/6✓ Branch 0 taken 2 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)); |
656 |
4/6✓ Branch 0 taken 2 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)); |
657 |
4/6✓ Branch 0 taken 2 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)); |
658 |
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)); |
659 |
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); |
660 | } | ||
661 | |||
662 | /* | ||
663 | Orthogonalize a set of vectors with SVQB | ||
664 | */ | ||
665 | 1178 | static PetscErrorCode BVOrthogonalize_SVQB(BV V,Mat Rin) | |
666 | { | ||
667 | 1178 | Mat R,S; | |
668 | |||
669 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1178 | PetscFunctionBegin; |
670 |
4/6✓ Branch 0 taken 2 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)); |
671 | 1178 | R = V->Abuffer; | |
672 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1178 | if (Rin) S = Rin; /* use Rin as a workspace for S */ |
673 | 794 | else S = R; | |
674 |
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)); |
675 |
4/6✓ Branch 0 taken 2 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)); |
676 |
4/6✓ Branch 0 taken 2 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)); |
677 |
4/6✓ Branch 0 taken 2 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)); |
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.
|
1178 | if (Rin) PetscCall(BV_StoreCoeffsBlock_Default(V,Rin,PETSC_FALSE)); |
679 |
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); |
680 | } | ||
681 | |||
682 | /*@ | ||
683 | BVOrthogonalize - Orthogonalize all columns (starting from the leading ones), | ||
684 | that is, compute the QR decomposition. | ||
685 | |||
686 | Collective | ||
687 | |||
688 | Input Parameters: | ||
689 | + V - basis vectors to be orthogonalized (or B-orthogonalized), modified on output | ||
690 | - R - a sequential dense matrix (or NULL), on output the triangular factor of | ||
691 | the QR decomposition | ||
692 | |||
693 | Notes: | ||
694 | On input, matrix R must be a square sequential dense Mat, with at least as many | ||
695 | rows and columns as the number of active columns of V. The output satisfies | ||
696 | V0 = V*R (where V0 represent the input V) and V'*V = I (or V'*B*V = I if an | ||
697 | inner product matrix B has been specified with BVSetMatrix()). | ||
698 | |||
699 | If V has leading columns, then they are not modified (are assumed to be already | ||
700 | orthonormal) and the leading columns of R are not referenced. Let the | ||
701 | decomposition be | ||
702 | .vb | ||
703 | [ V01 V02 ] = [ V1 V2 ] [ R11 R12 ] | ||
704 | [ 0 R22 ] | ||
705 | .ve | ||
706 | then V1 is left unchanged (equal to V01) as well as R11 (it should satisfy | ||
707 | V01 = V1*R11). | ||
708 | |||
709 | Can pass NULL if R is not required. | ||
710 | |||
711 | The method to be used for block orthogonalization can be set with | ||
712 | BVSetOrthogonalization(). If set to GS, the computation is done column by | ||
713 | column with successive calls to BVOrthogonalizeColumn(). Note that in the | ||
714 | SVQB method the R factor is not upper triangular. | ||
715 | |||
716 | If V is rank-deficient or very ill-conditioned, that is, one or more columns are | ||
717 | (almost) linearly dependent with respect to the rest, then the algorithm may | ||
718 | break down or result in larger numerical error. Linearly dependent columns are | ||
719 | essentially replaced by random directions, and the corresponding diagonal entry | ||
720 | in R is set to (nearly) zero. | ||
721 | |||
722 | Level: intermediate | ||
723 | |||
724 | .seealso: BVOrthogonalizeColumn(), BVOrthogonalizeVec(), BVSetMatrix(), BVSetActiveColumns(), BVSetOrthogonalization(), BVOrthogBlockType | ||
725 | @*/ | ||
726 | 61687 | PetscErrorCode BVOrthogonalize(BV V,Mat R) | |
727 | { | ||
728 | 61687 | PetscInt m,n; | |
729 | |||
730 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
61687 | PetscFunctionBegin; |
731 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
61687 | PetscValidHeaderSpecific(V,BV_CLASSID,1); |
732 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
61687 | PetscValidType(V,1); |
733 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
61687 | BVCheckSizes(V,1); |
734 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
61687 | if (R) { |
735 |
2/12✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
6024 | PetscValidHeaderSpecific(R,MAT_CLASSID,2); |
736 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6024 | PetscValidType(R,2); |
737 |
4/10✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
6024 | PetscCheckTypeName(R,MATSEQDENSE); |
738 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
6024 | PetscCall(MatGetSize(R,&m,&n)); |
739 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6024 | PetscCheck(m==n,PetscObjectComm((PetscObject)V),PETSC_ERR_ARG_SIZ,"Mat argument is not square, it has %" PetscInt_FMT " rows and %" PetscInt_FMT " columns",m,n); |
740 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6024 | PetscCheck(n>=V->k,PetscObjectComm((PetscObject)V),PETSC_ERR_ARG_SIZ,"Mat size %" PetscInt_FMT " is smaller than the number of BV active columns %" PetscInt_FMT,n,V->k); |
741 | } | ||
742 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
61687 | PetscCheck(!V->nc,PetscObjectComm((PetscObject)V),PETSC_ERR_SUP,"Not implemented for BV with constraints, use BVOrthogonalizeColumn() instead"); |
743 | |||
744 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
61687 | PetscCall(PetscLogEventBegin(BV_Orthogonalize,V,R,0,0)); |
745 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
61687 | switch (V->orthog_block) { |
746 | 56436 | case BV_ORTHOG_BLOCK_GS: /* proceed column by column with Gram-Schmidt */ | |
747 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
56436 | PetscCall(BVOrthogonalize_GS(V,R)); |
748 | break; | ||
749 | 1178 | case BV_ORTHOG_BLOCK_CHOL: | |
750 |
4/6✓ Branch 0 taken 2 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)); |
751 | break; | ||
752 | 2101 | case BV_ORTHOG_BLOCK_TSQR: | |
753 |
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"); |
754 |
4/6✓ Branch 0 taken 2 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)); |
755 | break; | ||
756 | 794 | case BV_ORTHOG_BLOCK_TSQRCHOL: | |
757 |
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"); |
758 |
4/6✓ Branch 0 taken 2 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)); |
759 | break; | ||
760 | 1178 | case BV_ORTHOG_BLOCK_SVQB: | |
761 |
4/6✓ Branch 0 taken 2 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)); |
762 | break; | ||
763 | } | ||
764 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
61687 | PetscCall(PetscLogEventEnd(BV_Orthogonalize,V,R,0,0)); |
765 |
2/4✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
61687 | PetscCall(PetscObjectStateIncrease((PetscObject)V)); |
766 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
61687 | PetscFunctionReturn(PETSC_SUCCESS); |
767 | } | ||
768 |