GCC Code Coverage Report


Directory: ./
File: src/eps/impls/davidson/dvdimprovex.c
Date: 2025-10-03 04:28:47
Exec Total Coverage
Lines: 579 613 94.5%
Functions: 23 23 100.0%
Branches: 1448 2386 60.7%

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 SLEPc eigensolver: "davidson"
12
13 Step: improve the eigenvectors X
14 */
15
16 #include "davidson.h"
17 #include <slepcblaslapack.h>
18
19 /**** JD update step (I - Kfg'/(g'Kf)) K(A - sB) (I - Kfg'/(g'Kf)) t = (I - Kfg'/(g'Kf))r ****/
20
21 typedef struct {
22 PetscInt size_X;
23 KSP ksp; /* correction equation solver */
24 Vec friends; /* reference vector for composite vectors */
25 PetscScalar theta[4],thetai[2]; /* the shifts used in the correction eq. */
26 PetscInt maxits; /* maximum number of iterations */
27 PetscInt r_s,r_e; /* the selected eigenpairs to improve */
28 PetscInt ksp_max_size; /* the ksp maximum subvectors size */
29 PetscReal tol; /* the maximum solution tolerance */
30 PetscReal lastTol; /* last tol for dynamic stopping criterion */
31 PetscReal fix; /* tolerance for using the approx. eigenvalue */
32 PetscBool dynamic; /* if the dynamic stopping criterion is applied */
33 dvdDashboard *d; /* the current dvdDashboard reference */
34 PC old_pc; /* old pc in ksp */
35 BV KZ; /* KZ vecs for the projector KZ*inv(X'*KZ)*X' */
36 BV U; /* new X vectors */
37 PetscScalar *XKZ; /* X'*KZ */
38 PetscScalar *iXKZ; /* inverse of XKZ */
39 PetscInt ldXKZ; /* leading dimension of XKZ */
40 PetscInt size_iXKZ; /* size of iXKZ */
41 PetscInt ldiXKZ; /* leading dimension of iXKZ */
42 PetscInt size_cX; /* last value of d->size_cX */
43 PetscInt old_size_X; /* last number of improved vectors */
44 PetscBLASInt *iXKZPivots; /* array of pivots */
45 } dvdImprovex_jd;
46
47 /*
48 Compute (I - KZ*iXKZ*X')*V where,
49 V, the vectors to apply the projector,
50 cV, the number of vectors in V,
51 */
52 376614 static PetscErrorCode dvd_improvex_apply_proj(dvdDashboard *d,Vec *V,PetscInt cV)
53 {
54 376614 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
55 376614 PetscInt i,ldh,k,l;
56 376614 PetscScalar *h;
57 376614 PetscBLASInt cV_,n,info,ld;
58 #if defined(PETSC_USE_COMPLEX)
59 304319 PetscInt j;
60 #endif
61
62
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
376614 PetscFunctionBegin;
63
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
376614 PetscAssert(cV<=2,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
64
65 /* h <- X'*V */
66
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
376614 PetscCall(PetscMalloc1(data->size_iXKZ*cV,&h));
67 376614 ldh = data->size_iXKZ;
68
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
376614 PetscCall(BVGetActiveColumns(data->U,&l,&k));
69
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
376614 PetscAssert(ldh==k,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
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.
376614 PetscCall(BVSetActiveColumns(data->U,0,k));
71
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
753728 for (i=0;i<cV;i++) {
72
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
377114 PetscCall(BVDotVec(data->U,V[i],&h[ldh*i]));
73 #if defined(PETSC_USE_COMPLEX)
74
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
608638 for (j=0; j<k; j++) h[ldh*i+j] = PetscConj(h[ldh*i+j]);
75 #endif
76 }
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.
376614 PetscCall(BVSetActiveColumns(data->U,l,k));
78
79 /* h <- iXKZ\h */
80
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
376614 PetscCall(PetscBLASIntCast(cV,&cV_));
81
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
376614 PetscCall(PetscBLASIntCast(data->size_iXKZ,&n));
82
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
376614 PetscCall(PetscBLASIntCast(data->ldiXKZ,&ld));
83
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
376614 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
84
10/20
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
376614 PetscCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&n,&cV_,data->iXKZ,&ld,data->iXKZPivots,h,&n,&info));
85
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
376614 PetscCall(PetscFPTrapPop());
86
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
376614 SlepcCheckLapackInfo("getrs",info);
87
88 /* V <- V - KZ*h */
89
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
376614 PetscCall(BVSetActiveColumns(data->KZ,0,k));
90
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
753728 for (i=0;i<cV;i++) PetscCall(BVMultVec(data->KZ,-1.0,1.0,V[i],&h[ldh*i]));
91
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
376614 PetscCall(BVSetActiveColumns(data->KZ,l,k));
92
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.
376614 PetscCall(PetscFree(h));
93
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.
72668 PetscFunctionReturn(PETSC_SUCCESS);
94 }
95
96 /*
97 Compute (I - X*iXKZ*KZ')*V where,
98 V, the vectors to apply the projector,
99 cV, the number of vectors in V,
100 */
101 5814 static PetscErrorCode dvd_improvex_applytrans_proj(dvdDashboard *d,Vec *V,PetscInt cV)
102 {
103 5814 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
104 5814 PetscInt i,ldh,k,l;
105 5814 PetscScalar *h;
106 5814 PetscBLASInt cV_, n, info, ld;
107 #if defined(PETSC_USE_COMPLEX)
108 5337 PetscInt j;
109 #endif
110
111
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5814 PetscFunctionBegin;
112
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5814 PetscAssert(cV<=2,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
113
114 /* h <- KZ'*V */
115
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(PetscMalloc1(data->size_iXKZ*cV,&h));
116 5814 ldh = data->size_iXKZ;
117
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(BVGetActiveColumns(data->U,&l,&k));
118
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5814 PetscAssert(ldh==k,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
119
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(BVSetActiveColumns(data->KZ,0,k));
120
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11628 for (i=0;i<cV;i++) {
121
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(BVDotVec(data->KZ,V[i],&h[ldh*i]));
122 #if defined(PETSC_USE_COMPLEX)
123
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10674 for (j=0;j<k;j++) h[ldh*i+j] = PetscConj(h[ldh*i+j]);
124 #endif
125 }
126
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(BVSetActiveColumns(data->KZ,l,k));
127
128 /* h <- iXKZ\h */
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(PetscBLASIntCast(cV,&cV_));
130
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(PetscBLASIntCast(data->size_iXKZ,&n));
131
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(PetscBLASIntCast(data->ldiXKZ,&ld));
132
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
133
10/20
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
5814 PetscCallBLAS("LAPACKgetrs",LAPACKgetrs_("C",&n,&cV_,data->iXKZ,&ld,data->iXKZPivots,h,&n,&info));
134
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(PetscFPTrapPop());
135
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5814 SlepcCheckLapackInfo("getrs",info);
136
137 /* V <- V - U*h */
138
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(BVSetActiveColumns(data->U,0,k));
139
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
11628 for (i=0;i<cV;i++) PetscCall(BVMultVec(data->U,-1.0,1.0,V[i],&h[ldh*i]));
140
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(BVSetActiveColumns(data->U,l,k));
141
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.
5814 PetscCall(PetscFree(h));
142
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.
1252 PetscFunctionReturn(PETSC_SUCCESS);
143 }
144
145 814 static PetscErrorCode dvd_improvex_jd_end(dvdDashboard *d)
146 {
147 814 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
148
149
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
814 PetscFunctionBegin;
150
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(VecDestroy(&data->friends));
151
152 /* Restore the pc of ksp */
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
814 if (data->old_pc) {
154
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(KSPSetPC(data->ksp, data->old_pc));
155
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PCDestroy(&data->old_pc));
156 }
157
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.
158 PetscFunctionReturn(PETSC_SUCCESS);
158 }
159
160 814 static PetscErrorCode dvd_improvex_jd_d(dvdDashboard *d)
161 {
162 814 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
163
164
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
814 PetscFunctionBegin;
165 /* Free local data and objects */
166
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.
814 PetscCall(PetscFree(data->XKZ));
167
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.
814 PetscCall(PetscFree(data->iXKZ));
168
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.
814 PetscCall(PetscFree(data->iXKZPivots));
169
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(BVDestroy(&data->KZ));
170
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(BVDestroy(&data->U));
171
6/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
814 PetscCall(PetscFree(data));
172
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.
158 PetscFunctionReturn(PETSC_SUCCESS);
173 }
174
175 /*
176 y <- theta[1]A*x - theta[0]*B*x
177 auxV, two auxiliary vectors
178 */
179 501620 static inline PetscErrorCode dvd_aux_matmult(dvdImprovex_jd *data,const Vec *x,const Vec *y)
180 {
181 501620 PetscInt n,i;
182 501620 const Vec *Bx;
183 501620 Vec *auxV;
184
185
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
501620 PetscFunctionBegin;
186 501620 n = data->r_e - data->r_s;
187
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
1003504 for (i=0;i<n;i++) PetscCall(MatMult(data->d->A,x[i],y[i]));
188
189
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
501620 PetscCall(SlepcVecPoolGetVecs(data->d->auxV,2,&auxV));
190
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1003240 for (i=0;i<n;i++) {
191 #if !defined(PETSC_USE_COMPLEX)
192
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
101121 if (PetscUnlikely(data->d->eigi[data->r_s+i] != 0.0)) {
193
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
264 if (data->d->B) {
194 PetscCall(MatMult(data->d->B,x[i],auxV[0]));
195 PetscCall(MatMult(data->d->B,x[i+1],auxV[1]));
196 Bx = auxV;
197 264 } else Bx = &x[i];
198
199 /* y_i <- [ t_2i+1*A*x_i - t_2i*Bx_i + ti_i*Bx_i+1;
200 y_i+1 t_2i+1*A*x_i+1 - ti_i*Bx_i - t_2i*Bx_i+1 ] */
201
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
264 PetscCall(VecAXPBYPCZ(y[i],-data->theta[2*i],data->thetai[i],data->theta[2*i+1],Bx[0],Bx[1]));
202
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
264 PetscCall(VecAXPBYPCZ(y[i+1],-data->thetai[i],-data->theta[2*i],data->theta[2*i+1],Bx[0],Bx[1]));
203 264 i++;
204 } else
205 #endif
206 {
207
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
501356 if (data->d->B) {
208
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
96166 PetscCall(MatMult(data->d->B,x[i],auxV[0]));
209 96166 Bx = auxV;
210 405190 } else Bx = &x[i];
211
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
501620 PetscCall(VecAXPBY(y[i],-data->theta[i*2],data->theta[i*2+1],Bx[0]));
212 }
213 }
214
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
501620 PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,2,&auxV));
215
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.
88438 PetscFunctionReturn(PETSC_SUCCESS);
216 }
217
218 /*
219 y <- theta[1]'*A'*x - theta[0]'*B'*x
220 */
221 5512 static inline PetscErrorCode dvd_aux_matmulttrans(dvdImprovex_jd *data,const Vec *x,const Vec *y)
222 {
223 5512 PetscInt n,i;
224 5512 const Vec *Bx;
225 5512 Vec *auxV;
226
227
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5512 PetscFunctionBegin;
228 5512 n = data->r_e - data->r_s;
229
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
11024 for (i=0;i<n;i++) PetscCall(MatMultTranspose(data->d->A,x[i],y[i]));
230
231
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5512 PetscCall(SlepcVecPoolGetVecs(data->d->auxV,2,&auxV));
232
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11024 for (i=0;i<n;i++) {
233 #if !defined(PETSC_USE_COMPLEX)
234
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
402 if (data->d->eigi[data->r_s+i] != 0.0) {
235 if (data->d->B) {
236 PetscCall(MatMultTranspose(data->d->B,x[i],auxV[0]));
237 PetscCall(MatMultTranspose(data->d->B,x[i+1],auxV[1]));
238 Bx = auxV;
239 } else Bx = &x[i];
240
241 /* y_i <- [ t_2i+1*A*x_i - t_2i*Bx_i - ti_i*Bx_i+1;
242 y_i+1 t_2i+1*A*x_i+1 + ti_i*Bx_i - t_2i*Bx_i+1 ] */
243 PetscCall(VecAXPBYPCZ(y[i],-data->theta[2*i],-data->thetai[i],data->theta[2*i+1],Bx[0],Bx[1]));
244 PetscCall(VecAXPBYPCZ(y[i+1],data->thetai[i],-data->theta[2*i],data->theta[2*i+1],Bx[0],Bx[1]));
245 i++;
246 } else
247 #endif
248 {
249
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
5512 if (data->d->B) {
250 PetscCall(MatMultTranspose(data->d->B,x[i],auxV[0]));
251 Bx = auxV;
252 5512 } else Bx = &x[i];
253
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5512 PetscCall(VecAXPBY(y[i],PetscConj(-data->theta[i*2]),PetscConj(data->theta[i*2+1]),Bx[0]));
254 }
255 }
256
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5512 PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,2,&auxV));
257
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.
1177 PetscFunctionReturn(PETSC_SUCCESS);
258 }
259
260 322040 static PetscErrorCode PCApplyBA_dvd(PC pc,PCSide side,Vec in,Vec out,Vec w)
261 {
262 322040 dvdImprovex_jd *data;
263 322040 PetscInt n,i;
264 322040 const Vec *inx,*outx,*wx;
265 322040 Vec *auxV;
266 322040 Mat A;
267
268
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
322040 PetscFunctionBegin;
269
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
322040 PetscCall(PCGetOperators(pc,&A,NULL));
270
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
322040 PetscCall(MatShellGetContext(A,&data));
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.
322040 PetscCall(VecCompGetSubVecs(in,NULL,&inx));
272
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
322040 PetscCall(VecCompGetSubVecs(out,NULL,&outx));
273
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
322040 PetscCall(VecCompGetSubVecs(w,NULL,&wx));
274 322040 n = data->r_e - data->r_s;
275
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
322040 PetscCall(SlepcVecPoolGetVecs(data->d->auxV,n,&auxV));
276
1/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
322040 switch (side) {
277 322040 case PC_LEFT:
278 /* aux <- theta[1]A*in - theta[0]*B*in */
279
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
322040 PetscCall(dvd_aux_matmult(data,inx,auxV));
280
281 /* out <- K * aux */
282
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
644344 for (i=0;i<n;i++) PetscCall(data->d->improvex_precond(data->d,data->r_s+i,auxV[i],outx[i]));
283 break;
284 case PC_RIGHT:
285 /* aux <- K * in */
286 for (i=0;i<n;i++) PetscCall(data->d->improvex_precond(data->d,data->r_s+i,inx[i],auxV[i]));
287
288 /* out <- theta[1]A*auxV - theta[0]*B*auxV */
289 PetscCall(dvd_aux_matmult(data,auxV,outx));
290 break;
291 case PC_SYMMETRIC:
292 /* aux <- K^{1/2} * in */
293 for (i=0;i<n;i++) PetscCall(PCApplySymmetricRight(data->old_pc,inx[i],auxV[i]));
294
295 /* wx <- theta[1]A*auxV - theta[0]*B*auxV */
296 PetscCall(dvd_aux_matmult(data,auxV,wx));
297
298 /* aux <- K^{1/2} * in */
299 for (i=0;i<n;i++) PetscCall(PCApplySymmetricLeft(data->old_pc,wx[i],outx[i]));
300 break;
301 default:
302 SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported KSP side");
303 }
304 /* out <- out - v*(u'*out) */
305
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
322040 PetscCall(dvd_improvex_apply_proj(data->d,(Vec*)outx,n));
306
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
322040 PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,n,&auxV));
307
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.
62100 PetscFunctionReturn(PETSC_SUCCESS);
308 }
309
310 9822 static PetscErrorCode PCApply_dvd(PC pc,Vec in,Vec out)
311 {
312 9822 dvdImprovex_jd *data;
313 9822 PetscInt n,i;
314 9822 const Vec *inx, *outx;
315 9822 Mat A;
316
317
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9822 PetscFunctionBegin;
318
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9822 PetscCall(PCGetOperators(pc,&A,NULL));
319
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9822 PetscCall(MatShellGetContext(A,&data));
320
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9822 PetscCall(VecCompGetSubVecs(in,NULL,&inx));
321
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9822 PetscCall(VecCompGetSubVecs(out,NULL,&outx));
322 9822 n = data->r_e - data->r_s;
323 /* out <- K * in */
324
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
19649 for (i=0;i<n;i++) PetscCall(data->d->improvex_precond(data->d,data->r_s+i,inx[i],outx[i]));
325 /* out <- out - v*(u'*out) */
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.
9822 PetscCall(dvd_improvex_apply_proj(data->d,(Vec*)outx,n));
327
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.
2031 PetscFunctionReturn(PETSC_SUCCESS);
328 }
329
330 5814 static PetscErrorCode PCApplyTranspose_dvd(PC pc,Vec in,Vec out)
331 {
332 5814 dvdImprovex_jd *data;
333 5814 PetscInt n,i;
334 5814 const Vec *inx, *outx;
335 5814 Vec *auxV;
336 5814 Mat A;
337
338
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5814 PetscFunctionBegin;
339
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(PCGetOperators(pc,&A,NULL));
340
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(MatShellGetContext(A,&data));
341
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(VecCompGetSubVecs(in,NULL,&inx));
342
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(VecCompGetSubVecs(out,NULL,&outx));
343 5814 n = data->r_e - data->r_s;
344
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(SlepcVecPoolGetVecs(data->d->auxV,n,&auxV));
345 /* auxV <- in */
346
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
11628 for (i=0;i<n;i++) PetscCall(VecCopy(inx[i],auxV[i]));
347 /* auxV <- auxV - u*(v'*auxV) */
348
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(dvd_improvex_applytrans_proj(data->d,auxV,n));
349 /* out <- K' * aux */
350
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
11628 for (i=0;i<n;i++) PetscCall(PCApplyTranspose(data->old_pc,auxV[i],outx[i]));
351
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5814 PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,n,&auxV));
352
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.
1252 PetscFunctionReturn(PETSC_SUCCESS);
353 }
354
355 179580 static PetscErrorCode MatMult_dvd_jd(Mat A,Vec in,Vec out)
356 {
357 179580 dvdImprovex_jd *data;
358 179580 PetscInt n;
359 179580 const Vec *inx, *outx;
360 179580 PCSide side;
361
362
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
179580 PetscFunctionBegin;
363
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
179580 PetscCall(MatShellGetContext(A,&data));
364
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
179580 PetscCall(VecCompGetSubVecs(in,NULL,&inx));
365
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
179580 PetscCall(VecCompGetSubVecs(out,NULL,&outx));
366 179580 n = data->r_e - data->r_s;
367 /* out <- theta[1]A*in - theta[0]*B*in */
368
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
179580 PetscCall(dvd_aux_matmult(data,inx,outx));
369
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
179580 PetscCall(KSPGetPCSide(data->ksp,&side));
370
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
179580 if (side == PC_RIGHT) {
371 /* out <- out - v*(u'*out) */
372 PetscCall(dvd_improvex_apply_proj(data->d,(Vec*)outx,n));
373 }
374
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.
26338 PetscFunctionReturn(PETSC_SUCCESS);
375 }
376
377 5512 static PetscErrorCode MatMultTranspose_dvd_jd(Mat A,Vec in,Vec out)
378 {
379 5512 dvdImprovex_jd *data;
380 5512 PetscInt n,i;
381 5512 const Vec *inx,*outx,*r;
382 5512 Vec *auxV;
383 5512 PCSide side;
384
385
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5512 PetscFunctionBegin;
386
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5512 PetscCall(MatShellGetContext(A,&data));
387
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5512 PetscCall(VecCompGetSubVecs(in,NULL,&inx));
388
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5512 PetscCall(VecCompGetSubVecs(out,NULL,&outx));
389 5512 n = data->r_e - data->r_s;
390
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5512 PetscCall(KSPGetPCSide(data->ksp,&side));
391
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
5512 if (side == PC_RIGHT) {
392 /* auxV <- in */
393 PetscCall(SlepcVecPoolGetVecs(data->d->auxV,n,&auxV));
394 for (i=0;i<n;i++) PetscCall(VecCopy(inx[i],auxV[i]));
395 /* auxV <- auxV - v*(u'*auxV) */
396 PetscCall(dvd_improvex_applytrans_proj(data->d,auxV,n));
397 r = auxV;
398 5512 } else r = inx;
399 /* out <- theta[1]A*r - theta[0]*B*r */
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.
5512 PetscCall(dvd_aux_matmulttrans(data,r,outx));
401
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.
5512 if (side == PC_RIGHT) PetscCall(SlepcVecPoolRestoreVecs(data->d->auxV,n,&auxV));
402
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.
1177 PetscFunctionReturn(PETSC_SUCCESS);
403 }
404
405 244 static PetscErrorCode MatCreateVecs_dvd_jd(Mat A,Vec *right,Vec *left)
406 {
407 244 Vec *r,*l;
408 244 dvdImprovex_jd *data;
409 244 PetscInt n,i;
410
411
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
244 PetscFunctionBegin;
412
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
244 PetscCall(MatShellGetContext(A,&data));
413 244 n = data->ksp_max_size;
414
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.
244 if (right) PetscCall(PetscMalloc1(n,&r));
415
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.
244 if (left) PetscCall(PetscMalloc1(n,&l));
416
9/12
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 2 times.
526 for (i=0;i<n;i++) PetscCall(MatCreateVecs(data->d->A,right?&r[i]:NULL,left?&l[i]:NULL));
417
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
244 if (right) {
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.
244 PetscCall(VecCreateCompWithVecs(r,n,data->friends,right));
419
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
526 for (i=0;i<n;i++) PetscCall(VecDestroy(&r[i]));
420 }
421
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
244 if (left) {
422 PetscCall(VecCreateCompWithVecs(l,n,data->friends,left));
423 for (i=0;i<n;i++) PetscCall(VecDestroy(&l[i]));
424 }
425
426
6/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ 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.
244 if (right) PetscCall(PetscFree(r));
427
1/10
✗ 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
244 if (left) PetscCall(PetscFree(l));
428
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.
48 PetscFunctionReturn(PETSC_SUCCESS);
429 }
430
431 814 static PetscErrorCode dvd_improvex_jd_start(dvdDashboard *d)
432 {
433 814 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
434 814 PetscInt rA, cA, rlA, clA;
435 814 Mat A;
436 814 PetscBool t;
437 814 PC pc;
438 814 Vec v0[2];
439
440
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
814 PetscFunctionBegin;
441 814 data->size_cX = data->old_size_X = 0;
442
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
814 data->lastTol = data->dynamic?0.5:0.0;
443
444 /* Setup the ksp */
445
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
814 if (data->ksp) {
446 /* Create the reference vector */
447
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(BVGetColumn(d->eps->V,0,&v0[0]));
448 327 v0[1] = v0[0];
449
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(VecCreateCompWithVecs(v0,data->ksp_max_size,NULL,&data->friends));
450
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(BVRestoreColumn(d->eps->V,0,&v0[0]));
451
452 /* Save the current pc and set a PCNONE */
453
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(KSPGetPC(data->ksp, &data->old_pc));
454
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(PetscObjectTypeCompare((PetscObject)data->old_pc,PCNONE,&t));
455 327 data->lastTol = 0.5;
456
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
327 if (t) data->old_pc = NULL;
457 else {
458
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PetscObjectReference((PetscObject)data->old_pc));
459
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PCCreate(PetscObjectComm((PetscObject)d->eps),&pc));
460
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PCSetType(pc,PCSHELL));
461
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PCSetOperators(pc,d->A,d->A));
462
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PCSetReusePreconditioner(pc,PETSC_TRUE));
463
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PCShellSetApply(pc,PCApply_dvd));
464
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PCShellSetApplyBA(pc,PCApplyBA_dvd));
465
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PCShellSetApplyTranspose(pc,PCApplyTranspose_dvd));
466
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(KSPSetPC(data->ksp,pc));
467
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PCDestroy(&pc));
468 }
469
470 /* Create the (I-v*u')*K*(A-s*B) matrix */
471
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(MatGetSize(d->A,&rA,&cA));
472
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(MatGetLocalSize(d->A,&rlA,&clA));
473
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(MatCreateShell(PetscObjectComm((PetscObject)d->A),rlA*data->ksp_max_size,clA*data->ksp_max_size,rA*data->ksp_max_size,cA*data->ksp_max_size,data,&A));
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.
327 PetscCall(MatShellSetOperation(A,MATOP_MULT,(PetscErrorCodeFn*)MatMult_dvd_jd));
475
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(MatShellSetOperation(A,MATOP_MULT_TRANSPOSE,(PetscErrorCodeFn*)MatMultTranspose_dvd_jd));
476
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(MatShellSetOperation(A,MATOP_CREATE_VECS,(PetscErrorCodeFn*)MatCreateVecs_dvd_jd));
477
478 /* Try to avoid KSPReset */
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.
327 PetscCall(KSPGetOperatorsSet(data->ksp,&t,NULL));
480
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
327 if (t) {
481 262 Mat M;
482 262 PetscInt rM;
483
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
262 PetscCall(KSPGetOperators(data->ksp,&M,NULL));
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.
262 PetscCall(MatGetSize(M,&rM,NULL));
485
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
262 if (rM != rA*data->ksp_max_size) PetscCall(KSPReset(data->ksp));
486 }
487
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(EPS_KSPSetOperators(data->ksp,A,A));
488
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(KSPSetReusePreconditioner(data->ksp,PETSC_TRUE));
489
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(KSPSetUp(data->ksp));
490
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
327 PetscCall(MatDestroy(&A));
491 } else {
492 487 data->old_pc = NULL;
493 487 data->friends = NULL;
494 }
495
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(BVSetActiveColumns(data->KZ,0,0));
496
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(BVSetActiveColumns(data->U,0,0));
497
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.
158 PetscFunctionReturn(PETSC_SUCCESS);
498 }
499
500 /*
501 Compute: u <- X, v <- K*(theta[0]*A+theta[1]*B)*X,
502 kr <- K^{-1}*(A-eig*B)*X, being X <- V*pX[i_s..i_e-1], Y <- W*pY[i_s..i_e-1]
503 where
504 pX,pY, the right and left eigenvectors of the projected system
505 ld, the leading dimension of pX and pY
506 */
507 54137 static PetscErrorCode dvd_improvex_jd_proj_cuv(dvdDashboard *d,PetscInt i_s,PetscInt i_e,Vec *kr,PetscScalar *theta,PetscScalar *thetai,PetscScalar *pX,PetscScalar *pY,PetscInt ld)
508 {
509 54137 PetscInt n=i_e-i_s,size_KZ,V_new,rm,i,lv,kv,lKZ,kKZ;
510 54137 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
511 54137 const PetscScalar *array;
512 54137 Mat M;
513 54137 Vec u[2],v[2];
514 54137 PetscBLASInt s,ldXKZ,info;
515
516
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
54137 PetscFunctionBegin;
517 /* Check consistency */
518
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(BVGetActiveColumns(d->eps->V,&lv,&kv));
519 54137 V_new = lv - data->size_cX;
520
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
54137 PetscAssert(V_new<=data->old_size_X,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
521 54137 data->old_size_X = n;
522 54137 data->size_cX = lv;
523
524 /* KZ <- KZ(rm:rm+max_cX-1) */
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.
54137 PetscCall(BVGetActiveColumns(data->KZ,&lKZ,&kKZ));
526 54137 rm = PetscMax(V_new+lKZ,0);
527
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
54137 if (rm > 0) {
528
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
1874 for (i=0;i<lKZ;i++) {
529 PetscCall(BVCopyColumn(data->KZ,i+rm,i));
530 PetscCall(BVCopyColumn(data->U,i+rm,i));
531 }
532 }
533
534 /* XKZ <- XKZ(rm:rm+max_cX-1,rm:rm+max_cX-1) */
535
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
11412 if (rm > 0) {
536
2/8
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1874 for (i=0;i<lKZ;i++) PetscCall(PetscArraycpy(&data->XKZ[i*data->ldXKZ+i],&data->XKZ[(i+rm)*data->ldXKZ+i+rm],lKZ));
537 }
538 54137 lKZ = PetscMin(0,lKZ+V_new);
539
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(BVSetActiveColumns(data->KZ,lKZ,lKZ+n));
540
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(BVSetActiveColumns(data->U,lKZ,lKZ+n));
541
542 /* Compute X, KZ and KR */
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.
54137 PetscCall(BVGetColumn(data->U,lKZ,u));
544
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
54137 if (n>1) PetscCall(BVGetColumn(data->U,lKZ+1,&u[1]));
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.
54137 PetscCall(BVGetColumn(data->KZ,lKZ,v));
546
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
54137 if (n>1) PetscCall(BVGetColumn(data->KZ,lKZ+1,&v[1]));
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.
54137 PetscCall(d->improvex_jd_proj_uv(d,i_s,i_e,u,v,kr,theta,thetai,pX,pY,ld));
548
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(BVRestoreColumn(data->U,lKZ,u));
549
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
54137 if (n>1) PetscCall(BVRestoreColumn(data->U,lKZ+1,&u[1]));
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.
54137 PetscCall(BVRestoreColumn(data->KZ,lKZ,v));
551
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
54137 if (n>1) PetscCall(BVRestoreColumn(data->KZ,lKZ+1,&v[1]));
552
553 /* XKZ <- U'*KZ */
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.
54137 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,lKZ+n,lKZ+n,NULL,&M));
555
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(BVMatProject(data->KZ,NULL,data->U,M));
556
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(MatDenseGetArrayRead(M,&array));
557
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
108520 for (i=lKZ;i<lKZ+n;i++) { /* upper part */
558
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54383 PetscCall(PetscArraycpy(&data->XKZ[data->ldXKZ*i],&array[i*(lKZ+n)],lKZ));
559 }
560
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
108520 for (i=0;i<lKZ+n;i++) { /* lower part */
561
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54383 PetscCall(PetscArraycpy(&data->XKZ[data->ldXKZ*i+lKZ],&array[i*(lKZ+n)+lKZ],n));
562 }
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.
54137 PetscCall(MatDenseRestoreArrayRead(M,&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.
54137 PetscCall(MatDestroy(&M));
565
566 /* iXKZ <- inv(XKZ) */
567 54137 size_KZ = lKZ+n;
568
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(PetscBLASIntCast(lKZ+n,&s));
569 54137 data->ldiXKZ = data->size_iXKZ = size_KZ;
570
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
108520 for (i=0;i<size_KZ;i++) PetscCall(PetscArraycpy(&data->iXKZ[data->ldiXKZ*i],&data->XKZ[data->ldXKZ*i],size_KZ));
571
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(PetscBLASIntCast(data->ldiXKZ,&ldXKZ));
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.
54137 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
573
10/20
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
54137 PetscCallBLAS("LAPACKgetrf",LAPACKgetrf_(&s,&s,data->iXKZ,&ldXKZ,data->iXKZPivots,&info));
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.
54137 PetscCall(PetscFPTrapPop());
575
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
54137 SlepcCheckLapackInfo("getrf",info);
576
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
10326 PetscFunctionReturn(PETSC_SUCCESS);
577 }
578
579 50218 static PetscErrorCode dvd_improvex_jd_gen(dvdDashboard *d,PetscInt r_s,PetscInt r_e,PetscInt *size_D)
580 {
581 50218 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
582 50218 PetscInt i,j,n,maxits,maxits0,lits,s,ld,k,max_size_D,lV,kV;
583 50218 PetscScalar *pX,*pY;
584 50218 PetscReal tol,tol0;
585 50218 Vec *kr,kr_comp,D_comp,D[2],kr0[2];
586 50218 PetscBool odd_situation = PETSC_FALSE;
587
588
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
50218 PetscFunctionBegin;
589
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
50218 PetscCall(BVGetActiveColumns(d->eps->V,&lV,&kV));
590 50218 max_size_D = d->eps->ncv-kV;
591 /* Quick exit */
592
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
50218 if ((max_size_D == 0) || r_e-r_s <= 0) {
593 *size_D = 0;
594 PetscFunctionReturn(PETSC_SUCCESS);
595 }
596
597 50218 n = PetscMin(PetscMin(data->size_X, max_size_D), r_e-r_s);
598
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
50218 PetscAssert(n>0,PETSC_COMM_SELF,PETSC_ERR_PLIB,"n == 0");
599
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
50218 PetscAssert(data->size_X>=r_e-r_s,PETSC_COMM_SELF,PETSC_ERR_PLIB,"size_X < r_e-r_s");
600
601
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
50218 PetscCall(DSGetLeadingDimension(d->eps->ds,&ld));
602
603 /* Restart lastTol if a new pair converged */
604
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
50218 if (data->dynamic && data->size_cX < lV)
605 10 data->lastTol = 0.5;
606
607
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
101667 for (i=0;i<n;i+=s) {
608 /* If the selected eigenvalue is complex, but the arithmetic is real... */
609 #if !defined(PETSC_USE_COMPLEX)
610
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
25084 if (d->eigi[r_s+i] != 0.0) {
611
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
246 if (i+2 <= max_size_D) s=2;
612 else break;
613 } else
614 #endif
615 29053 s=1;
616
617 54137 data->r_s = r_s+i;
618 54137 data->r_e = r_s+i+s;
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.
54137 PetscCall(SlepcVecPoolGetVecs(d->auxV,s,&kr));
620
621 /* Compute theta, maximum iterations and tolerance */
622 maxits = 0;
623 tol = 1;
624
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
108520 for (j=0;j<s;j++) {
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.
54383 PetscCall(d->improvex_jd_lit(d,r_s+i+j,&data->theta[2*j],&data->thetai[j],&maxits0,&tol0));
626 54383 maxits += maxits0;
627 54383 tol *= tol0;
628 }
629 54137 maxits/= s;
630
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
54137 tol = data->dynamic?data->lastTol:PetscExpReal(PetscLogReal(tol)/s);
631
632 /* Compute u, v and kr */
633 54137 k = r_s+i;
634
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(DSVectors(d->eps->ds,DS_MAT_X,&k,NULL));
635 54137 k = r_s+i;
636
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(DSVectors(d->eps->ds,DS_MAT_Y,&k,NULL));
637
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(DSGetArray(d->eps->ds,DS_MAT_X,&pX));
638
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(DSGetArray(d->eps->ds,DS_MAT_Y,&pY));
639
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(dvd_improvex_jd_proj_cuv(d,r_s+i,r_s+i+s,kr,data->theta,data->thetai,pX,pY,ld));
640
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(DSRestoreArray(d->eps->ds,DS_MAT_X,&pX));
641
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(DSRestoreArray(d->eps->ds,DS_MAT_Y,&pY));
642
643 /* Check if the first eigenpairs are converged */
644
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
54137 if (i == 0) {
645 50218 PetscInt oldnpreconv = d->npreconv;
646
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
50218 PetscCall(d->preTestConv(d,0,r_s+s,r_s+s,&d->npreconv));
647
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50218 if (d->npreconv > oldnpreconv) break;
648 }
649
650 /* Test the odd situation of solving Ax=b with A=I */
651 #if !defined(PETSC_USE_COMPLEX)
652
8/10
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 5 times.
✓ Branch 9 taken 5 times.
23765 odd_situation = (data->ksp && data->theta[0] == 1. && data->theta[1] == 0. && data->thetai[0] == 0. && d->B == NULL)? PETSC_TRUE: PETSC_FALSE;
653 #else
654
7/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 5 times.
27684 odd_situation = (data->ksp && data->theta[0] == 1. && data->theta[1] == 0. && d->B == NULL)? PETSC_TRUE: PETSC_FALSE;
655 #endif
656 /* If JD */
657
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
51449 if (data->ksp && !odd_situation) {
658 /* kr <- -kr */
659
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
13399 for (j=0;j<s;j++) PetscCall(VecScale(kr[j],-1.0));
660
661 /* Compose kr and D */
662 6697 kr0[0] = kr[0];
663
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
6697 kr0[1] = (s==2 ? kr[1] : NULL);
664
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6697 PetscCall(VecCreateCompWithVecs(kr0,data->ksp_max_size,data->friends,&kr_comp));
665
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6697 PetscCall(BVGetColumn(d->eps->V,kV+i,&D[0]));
666
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
6697 if (s==2) PetscCall(BVGetColumn(d->eps->V,kV+i+1,&D[1]));
667 6692 else D[1] = NULL;
668
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6697 PetscCall(VecCreateCompWithVecs(D,data->ksp_max_size,data->friends,&D_comp));
669
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6697 PetscCall(VecCompSetSubVecs(data->friends,s,NULL));
670
671 /* Solve the correction equation */
672
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6697 PetscCall(KSPSetTolerances(data->ksp,tol,PETSC_CURRENT,PETSC_CURRENT,maxits));
673
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6697 PetscCall(KSPSolve(data->ksp,kr_comp,D_comp));
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.
6697 PetscCall(KSPGetIterationNumber(data->ksp,&lits));
675
676 /* Destroy the composed ks and D */
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.
6697 PetscCall(VecDestroy(&kr_comp));
678
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6697 PetscCall(VecDestroy(&D_comp));
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.
6697 PetscCall(BVRestoreColumn(d->eps->V,kV+i,&D[0]));
680
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
2577 if (s==2) PetscCall(BVRestoreColumn(d->eps->V,kV+i+1,&D[1]));
681
682 /* If GD */
683 } else {
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.
44752 PetscCall(BVGetColumn(d->eps->V,kV+i,&D[0]));
685
5/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
21188 if (s==2) PetscCall(BVGetColumn(d->eps->V,kV+i+1,&D[1]));
686
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
89735 for (j=0;j<s;j++) PetscCall(d->improvex_precond(d,r_s+i+j,kr[j],D[j]));
687
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
44752 PetscCall(dvd_improvex_apply_proj(d,D,s));
688
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
44752 PetscCall(BVRestoreColumn(d->eps->V,kV+i,&D[0]));
689
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
48872 if (s==2) PetscCall(BVRestoreColumn(d->eps->V,kV+i+1,&D[1]));
690 }
691 /* Prevent that short vectors are discarded in the orthogonalization */
692
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.
51449 if (i == 0 && d->eps->errest[d->nconv+r_s] > PETSC_MACHINE_EPSILON && d->eps->errest[d->nconv+r_s] < PETSC_MAX_REAL) {
693
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
95291 for (j=0;j<s;j++) PetscCall(BVScaleColumn(d->eps->V,kV+i+j,1.0/d->eps->errest[d->nconv+r_s]));
694 }
695
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
51449 PetscCall(SlepcVecPoolRestoreVecs(d->auxV,s,&kr));
696 }
697 50218 *size_D = i;
698
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 5 times.
50746 if (data->dynamic) data->lastTol = PetscMax(data->lastTol/2.0,PETSC_MACHINE_EPSILON*10.0);
699
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.
9541 PetscFunctionReturn(PETSC_SUCCESS);
700 }
701
702 2442 PetscErrorCode dvd_improvex_jd(dvdDashboard *d,dvdBlackboard *b,KSP ksp,PetscInt max_bs,PetscBool dynamic)
703 {
704 2442 dvdImprovex_jd *data;
705 2442 PetscBool useGD;
706 2442 PC pc;
707 2442 PetscInt size_P;
708
709
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2442 PetscFunctionBegin;
710 /* Setting configuration constrains */
711
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2442 PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&useGD));
712
713 /* If the arithmetic is real and the problem is not Hermitian, then
714 the block size is incremented in one */
715 #if !defined(PETSC_USE_COMPLEX)
716
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1206 if (!DVD_IS(d->sEP,DVD_EP_HERMITIAN)) {
717 318 max_bs++;
718 318 b->max_size_P = PetscMax(b->max_size_P,2);
719 } else
720 #endif
721 {
722 2124 b->max_size_P = PetscMax(b->max_size_P,1);
723 }
724 2442 b->max_size_X = PetscMax(b->max_size_X,max_bs);
725 2442 size_P = b->max_size_P;
726
727 /* Setup the preconditioner */
728
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
2442 if (ksp) {
729
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2442 PetscCall(KSPGetPC(ksp,&pc));
730
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2442 PetscCall(dvd_static_precond_PC(d,b,pc));
731 } else PetscCall(dvd_static_precond_PC(d,b,NULL));
732
733 /* Setup the step */
734
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2442 if (b->state >= DVD_STATE_CONF) {
735
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(PetscNew(&data));
736 814 data->dynamic = dynamic;
737
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(PetscMalloc1(size_P*size_P,&data->XKZ));
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.
814 PetscCall(PetscMalloc1(size_P*size_P,&data->iXKZ));
739
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(PetscMalloc1(size_P,&data->iXKZPivots));
740 814 data->ldXKZ = size_P;
741 814 data->size_X = b->max_size_X;
742 814 d->improveX_data = data;
743
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
814 data->ksp = useGD? NULL: ksp;
744 814 data->d = d;
745 814 d->improveX = dvd_improvex_jd_gen;
746 #if !defined(PETSC_USE_COMPLEX)
747
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
402 if (!DVD_IS(d->sEP,DVD_EP_HERMITIAN)) data->ksp_max_size = 2;
748 else
749 #endif
750 708 data->ksp_max_size = 1;
751 /* Create various vector basis */
752
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(BVDuplicateResize(d->eps->V,size_P,&data->KZ));
753
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(BVSetMatrix(data->KZ,NULL,PETSC_FALSE));
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.
814 PetscCall(BVDuplicate(data->KZ,&data->U));
755
756
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(EPSDavidsonFLAdd(&d->startList,dvd_improvex_jd_start));
757
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
814 PetscCall(EPSDavidsonFLAdd(&d->endList,dvd_improvex_jd_end));
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.
814 PetscCall(EPSDavidsonFLAdd(&d->destroyList,dvd_improvex_jd_d));
759 }
760
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.
474 PetscFunctionReturn(PETSC_SUCCESS);
761 }
762
763 #if !defined(PETSC_USE_COMPLEX)
764 246 static inline PetscErrorCode dvd_complex_rayleigh_quotient(Vec ur,Vec ui,Vec Axr,Vec Axi,Vec Bxr,Vec Bxi,PetscScalar *eigr,PetscScalar *eigi)
765 {
766 246 PetscScalar rAr,iAr,rAi,iAi,rBr,iBr,rBi,iBi,b0,b2,b4,b6,b7;
767
768
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
246 PetscFunctionBegin;
769 /* eigr = [(rAr+iAi)*(rBr+iBi) + (rAi-iAr)*(rBi-iBr)]/k
770 eigi = [(rAi-iAr)*(rBr+iBi) - (rAr+iAi)*(rBi-iBr)]/k
771 k = (rBr+iBi)*(rBr+iBi) + (rBi-iBr)*(rBi-iBr) */
772
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotBegin(Axr,ur,&rAr)); /* r*A*r */
773
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotBegin(Axr,ui,&iAr)); /* i*A*r */
774
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotBegin(Axi,ur,&rAi)); /* r*A*i */
775
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotBegin(Axi,ui,&iAi)); /* i*A*i */
776
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotBegin(Bxr,ur,&rBr)); /* r*B*r */
777
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotBegin(Bxr,ui,&iBr)); /* i*B*r */
778
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotBegin(Bxi,ur,&rBi)); /* r*B*i */
779
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotBegin(Bxi,ui,&iBi)); /* i*B*i */
780
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotEnd(Axr,ur,&rAr)); /* r*A*r */
781
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotEnd(Axr,ui,&iAr)); /* i*A*r */
782
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotEnd(Axi,ur,&rAi)); /* r*A*i */
783
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotEnd(Axi,ui,&iAi)); /* i*A*i */
784
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotEnd(Bxr,ur,&rBr)); /* r*B*r */
785
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotEnd(Bxr,ui,&iBr)); /* i*B*r */
786
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotEnd(Bxi,ur,&rBi)); /* r*B*i */
787
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(VecDotEnd(Bxi,ui,&iBi)); /* i*B*i */
788 246 b0 = rAr+iAi; /* rAr+iAi */
789 246 b2 = rAi-iAr; /* rAi-iAr */
790 246 b4 = rBr+iBi; /* rBr+iBi */
791 246 b6 = rBi-iBr; /* rBi-iBr */
792 246 b7 = b4*b4 + b6*b6; /* k */
793 246 *eigr = (b0*b4 + b2*b6) / b7; /* eig_r */
794 246 *eigi = (b2*b4 - b0*b6) / b7; /* eig_i */
795
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
246 PetscFunctionReturn(PETSC_SUCCESS);
796 }
797 #endif
798
799 54137 static inline PetscErrorCode dvd_compute_n_rr(PetscInt i_s,PetscInt n,PetscScalar *eigr,PetscScalar *eigi,Vec *u,Vec *Ax,Vec *Bx)
800 {
801 54137 PetscInt i;
802 54137 PetscScalar b0,b1;
803
804
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
54137 PetscFunctionBegin;
805
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
108274 for (i=0; i<n; i++) {
806 #if !defined(PETSC_USE_COMPLEX)
807
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
25084 if (eigi[i_s+i] != 0.0) {
808 246 PetscScalar eigr0=0.0,eigi0=0.0;
809
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(dvd_complex_rayleigh_quotient(u[i],u[i+1],Ax[i],Ax[i+1],Bx[i],Bx[i+1],&eigr0,&eigi0));
810
2/10
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
246 if (PetscAbsScalar(eigr[i_s+i]-eigr0)/PetscAbsScalar(eigr[i_s+i]) > 1e-10 || PetscAbsScalar(eigi[i_s+i]-eigi0)/PetscAbsScalar(eigi[i_s+i]) > 1e-10) PetscCall(PetscInfo(u[0],"The eigenvalue %g%+gi is far from its Rayleigh quotient value %g%+gi\n",(double)eigr[i_s+i],(double)eigi[i_s+i],(double)eigr0,(double)eigi0));
811 246 i++;
812 } else
813 #endif
814 {
815
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53891 PetscCall(VecDotBegin(Ax[i],u[i],&b0));
816
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53891 PetscCall(VecDotBegin(Bx[i],u[i],&b1));
817
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53891 PetscCall(VecDotEnd(Ax[i],u[i],&b0));
818
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53891 PetscCall(VecDotEnd(Bx[i],u[i],&b1));
819 53891 b0 = b0/b1;
820
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.
54137 if (PetscAbsScalar(eigr[i_s+i]-b0)/PetscAbsScalar(eigr[i_s+i]) > 1e-10) PetscCall(PetscInfo(u[0],"The eigenvalue %g+%g is far from its Rayleigh quotient value %g+%g\n",(double)PetscRealPart(eigr[i_s+i]),(double)PetscImaginaryPart(eigr[i_s+i]),(double)PetscRealPart(b0),(double)PetscImaginaryPart(b0)));
821 }
822 }
823
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.
10326 PetscFunctionReturn(PETSC_SUCCESS);
824 }
825
826 /*
827 Compute: u <- X, v <- K*(theta[0]*A+theta[1]*B)*X,
828 kr <- K^{-1}*(A-eig*B)*X, being X <- V*pX[i_s..i_e-1], Y <- W*pY[i_s..i_e-1]
829 where
830 pX,pY, the right and left eigenvectors of the projected system
831 ld, the leading dimension of pX and pY
832 */
833 54137 static PetscErrorCode dvd_improvex_jd_proj_uv_KZX(dvdDashboard *d,PetscInt i_s,PetscInt i_e,Vec *u,Vec *v,Vec *kr,PetscScalar *theta,PetscScalar *thetai,PetscScalar *pX,PetscScalar *pY,PetscInt ld)
834 {
835 54137 PetscInt n = i_e-i_s,i;
836 54137 PetscScalar *b;
837 54137 Vec *Ax,*Bx,*r;
838 54137 Mat M;
839 54137 BV X;
840
841
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
54137 PetscFunctionBegin;
842
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(BVDuplicateResize(d->eps->V,4,&X));
843
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,4,4,NULL,&M));
844 /* u <- X(i) */
845
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(dvd_improvex_compute_X(d,i_s,i_e,u,pX,ld));
846
847 /* v <- theta[0]A*u + theta[1]*B*u */
848
849 /* Bx <- B*X(i) */
850 54137 Bx = kr;
851
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
54137 if (d->BX) {
852
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
26199 for (i=i_s; i<i_e; ++i) PetscCall(BVMultVec(d->BX,1.0,0.0,Bx[i-i_s],&pX[ld*i]));
853 } else {
854
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
82321 for (i=0;i<n;i++) {
855
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.
41168 if (d->B) PetscCall(MatMult(d->B, u[i], Bx[i]));
856
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
41168 else PetscCall(VecCopy(u[i], Bx[i]));
857 }
858 }
859
860 /* Ax <- A*X(i) */
861
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(SlepcVecPoolGetVecs(d->auxV,i_e-i_s,&r));
862 54137 Ax = r;
863
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
108520 for (i=i_s; i<i_e; ++i) PetscCall(BVMultVec(d->AX,1.0,0.0,Ax[i-i_s],&pX[ld*i]));
864
865 /* v <- Y(i) */
866
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.
108520 for (i=i_s; i<i_e; ++i) PetscCall(BVMultVec(d->W?d->W:d->eps->V,1.0,0.0,v[i-i_s],&pY[ld*i]));
867
868 /* Recompute the eigenvalue */
869
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(dvd_compute_n_rr(i_s,n,d->eigr,d->eigi,v,Ax,Bx));
870
871
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
108274 for (i=0;i<n;i++) {
872 #if !defined(PETSC_USE_COMPLEX)
873
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
25084 if (d->eigi[i_s+i] != 0.0) {
874 /* [r_i r_i+1 kr_i kr_i+1]*= [ theta_2i' 0 1 0
875 0 theta_2i' 0 1
876 theta_2i+1 -thetai_i -eigr_i -eigi_i
877 thetai_i theta_2i+1 eigi_i -eigr_i ] */
878
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(MatDenseGetArrayWrite(M,&b));
879 246 b[0] = b[5] = PetscConj(theta[2*i]);
880 246 b[2] = b[7] = -theta[2*i+1];
881 246 b[6] = -(b[3] = thetai[i]);
882 246 b[1] = b[4] = 0.0;
883 246 b[8] = b[13] = 1.0/d->nX[i_s+i];
884 246 b[10] = b[15] = -d->eigr[i_s+i]/d->nX[i_s+i];
885 246 b[14] = -(b[11] = d->eigi[i_s+i]/d->nX[i_s+i]);
886 246 b[9] = b[12] = 0.0;
887
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(MatDenseRestoreArrayWrite(M,&b));
888
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(BVInsertVec(X,0,Ax[i]));
889
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(BVInsertVec(X,1,Ax[i+1]));
890
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(BVInsertVec(X,2,Bx[i]));
891
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(BVInsertVec(X,3,Bx[i+1]));
892
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(BVSetActiveColumns(X,0,4));
893
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(BVMultInPlace(X,M,0,4));
894
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(BVCopyVec(X,0,Ax[i]));
895
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(BVCopyVec(X,1,Ax[i+1]));
896
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(BVCopyVec(X,2,Bx[i]));
897
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
246 PetscCall(BVCopyVec(X,3,Bx[i+1]));
898 246 i++;
899 } else
900 #endif
901 {
902 /* [Ax_i Bx_i]*= [ theta_2i' 1/nX_i
903 theta_2i+1 -eig_i/nX_i ] */
904
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53891 PetscCall(MatDenseGetArrayWrite(M,&b));
905 53891 b[0] = PetscConj(theta[i*2]);
906 53891 b[1] = theta[i*2+1];
907 53891 b[4] = 1.0/d->nX[i_s+i];
908 53891 b[5] = -d->eigr[i_s+i]/d->nX[i_s+i];
909
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53891 PetscCall(MatDenseRestoreArrayWrite(M,&b));
910
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53891 PetscCall(BVInsertVec(X,0,Ax[i]));
911
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53891 PetscCall(BVInsertVec(X,1,Bx[i]));
912
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53891 PetscCall(BVSetActiveColumns(X,0,2));
913
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53891 PetscCall(BVMultInPlace(X,M,0,2));
914
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
53891 PetscCall(BVCopyVec(X,0,Ax[i]));
915
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(BVCopyVec(X,1,Bx[i]));
916 }
917 }
918
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
108520 for (i=0; i<n; i++) d->nX[i_s+i] = 1.0;
919
920 /* v <- K^{-1} r = K^{-1}(theta_2i'*Ax + theta_2i+1*Bx) */
921
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
108520 for (i=0;i<n;i++) PetscCall(d->improvex_precond(d,i_s+i,r[i],v[i]));
922
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(SlepcVecPoolRestoreVecs(d->auxV,i_e-i_s,&r));
923
924 /* kr <- P*(Ax - eig_i*Bx) */
925
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(d->calcpairs_proj_res(d,i_s,i_e,kr));
926
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(BVDestroy(&X));
927
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
54137 PetscCall(MatDestroy(&M));
928
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.
10326 PetscFunctionReturn(PETSC_SUCCESS);
929 }
930
931 54383 static PetscErrorCode dvd_improvex_jd_lit_const_0(dvdDashboard *d,PetscInt i,PetscScalar* theta,PetscScalar* thetai,PetscInt *maxits,PetscReal *tol)
932 {
933 54383 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
934 54383 PetscReal a;
935
936
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
54383 PetscFunctionBegin;
937 54383 a = SlepcAbsEigenvalue(d->eigr[i],d->eigi[i]);
938
939
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
54383 if (d->nR[i] < data->fix*a) {
940 4990 theta[0] = d->eigr[i];
941 4990 theta[1] = 1.0;
942 #if !defined(PETSC_USE_COMPLEX)
943 1896 *thetai = d->eigi[i];
944 #endif
945 } else {
946 49393 theta[0] = d->target[0];
947 49393 theta[1] = d->target[1];
948 #if !defined(PETSC_USE_COMPLEX)
949 23434 *thetai = 0.0;
950 #endif
951 }
952
953 #if defined(PETSC_USE_COMPLEX)
954
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
29053 if (thetai) *thetai = 0.0;
955 #endif
956 54383 *maxits = data->maxits;
957 54383 *tol = data->tol;
958
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.
54383 PetscFunctionReturn(PETSC_SUCCESS);
959 }
960
961 2442 PetscErrorCode dvd_improvex_jd_lit_const(dvdDashboard *d,dvdBlackboard *b,PetscInt maxits,PetscReal tol,PetscReal fix)
962 {
963 2442 dvdImprovex_jd *data = (dvdImprovex_jd*)d->improveX_data;
964
965
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2442 PetscFunctionBegin;
966 /* Setup the step */
967
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2442 if (b->state >= DVD_STATE_CONF) {
968 814 data->maxits = maxits;
969 814 data->tol = tol;
970 814 data->fix = fix;
971 814 d->improvex_jd_lit = dvd_improvex_jd_lit_const_0;
972 }
973
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.
2442 PetscFunctionReturn(PETSC_SUCCESS);
974 }
975
976 2442 PetscErrorCode dvd_improvex_jd_proj_uv(dvdDashboard *d,dvdBlackboard *b)
977 {
978
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2442 PetscFunctionBegin;
979 /* Setup the step */
980
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2442 if (b->state >= DVD_STATE_CONF) {
981 814 d->improvex_jd_proj_uv = dvd_improvex_jd_proj_uv_KZX;
982 }
983
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.
2442 PetscFunctionReturn(PETSC_SUCCESS);
984 }
985
986 244071 PetscErrorCode dvd_improvex_compute_X(dvdDashboard *d,PetscInt i_s,PetscInt i_e,Vec *u_,PetscScalar *pX,PetscInt ld)
987 {
988 244071 PetscInt n = i_e - i_s,i;
989 244071 Vec *u;
990
991
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
244071 PetscFunctionBegin;
992
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
244071 if (u_) u = u_;
993
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.
25211 else if (d->correctXnorm) PetscCall(SlepcVecPoolGetVecs(d->auxV,i_e-i_s,&u));
994
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
244071 if (u_ || d->correctXnorm) {
995
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
440810 for (i=0;i<n;i++) PetscCall(BVMultVec(d->eps->V,1.0,0.0,u[i],&pX[ld*(i+i_s)]));
996 }
997 /* nX(i) <- ||X(i)|| */
998
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
244071 if (d->correctXnorm) {
999
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
25992 for (i=0;i<n;i++) PetscCall(VecNormBegin(u[i],NORM_2,&d->nX[i_s+i]));
1000
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
25992 for (i=0;i<n;i++) PetscCall(VecNormEnd(u[i],NORM_2,&d->nX[i_s+i]));
1001 #if !defined(PETSC_USE_COMPLEX)
1002
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
12896 for (i=0;i<n;i++) {
1003
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
6448 if (d->eigi[i_s+i] != 0.0) {
1004 d->nX[i_s+i] = d->nX[i_s+i+1] = PetscSqrtScalar(d->nX[i_s+i]*d->nX[i_s+i]+d->nX[i_s+i+1]*d->nX[i_s+i+1]);
1005 i++;
1006 }
1007 }
1008 #endif
1009 } else {
1010
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
462445 for (i=0;i<n;i++) d->nX[i_s+i] = 1.0;
1011 }
1012
8/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ 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.
244071 if (d->correctXnorm && !u_) PetscCall(SlepcVecPoolRestoreVecs(d->auxV,i_e-i_s,&u));
1013
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.
49452 PetscFunctionReturn(PETSC_SUCCESS);
1014 }
1015