GCC Code Coverage Report


Directory: ./
File: src/eps/impls/davidson/dvdutils.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 168 179 93.9%
Functions: 13 13 100.0%
Branches: 308 519 59.3%

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 Some utils
14 */
15
16 #include "davidson.h"
17
18 typedef struct {
19 PC pc;
20 } dvdPCWrapper;
21
22 /*
23 Configure the harmonics.
24 switch (mode) {
25 DVD_HARM_RR: harmonic RR
26 DVD_HARM_RRR: relative harmonic RR
27 DVD_HARM_REIGS: rightmost eigenvalues
28 DVD_HARM_LEIGS: largest eigenvalues
29 }
30 fixedTarged, if true use the target instead of the best eigenvalue
31 target, the fixed target to be used
32 */
33 typedef struct {
34 PetscScalar Wa,Wb; /* span{W} = span{Wa*AV - Wb*BV} */
35 PetscScalar Pa,Pb; /* H=W'*(Pa*AV - Pb*BV), G=W'*(Wa*AV - Wb*BV) */
36 PetscBool withTarget;
37 HarmType_t mode;
38 } dvdHarmonic;
39
40 typedef struct {
41 Vec diagA, diagB;
42 } dvdJacobiPrecond;
43
44 980 static PetscErrorCode dvd_improvex_precond_d(dvdDashboard *d)
45 {
46 980 dvdPCWrapper *dvdpc = (dvdPCWrapper*)d->improvex_precond_data;
47
48
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
980 PetscFunctionBegin;
49 /* Free local data */
50
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(PCDestroy(&dvdpc->pc));
51
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.
980 PetscCall(PetscFree(d->improvex_precond_data));
52
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.
192 PetscFunctionReturn(PETSC_SUCCESS);
53 }
54
55 380994 static PetscErrorCode dvd_static_precond_PC_0(dvdDashboard *d,PetscInt i,Vec x,Vec Px)
56 {
57 380994 dvdPCWrapper *dvdpc = (dvdPCWrapper*)d->improvex_precond_data;
58
59
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
380994 PetscFunctionBegin;
60
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
380994 PetscCall(PCApply(dvdpc->pc,x,Px));
61
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.
73541 PetscFunctionReturn(PETSC_SUCCESS);
62 }
63
64 /*
65 Create a trivial preconditioner
66 */
67 96629 static PetscErrorCode dvd_precond_none(dvdDashboard *d,PetscInt i,Vec x,Vec Px)
68 {
69
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
96629 PetscFunctionBegin;
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.
96629 PetscCall(VecCopy(x,Px));
71
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.
18937 PetscFunctionReturn(PETSC_SUCCESS);
72 }
73
74 /*
75 Create a static preconditioner from a PC
76 */
77 2940 PetscErrorCode dvd_static_precond_PC(dvdDashboard *d,dvdBlackboard *b,PC pc)
78 {
79 2940 dvdPCWrapper *dvdpc;
80 2940 Mat P;
81 2940 PetscBool t0,t1,t2;
82
83
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2940 PetscFunctionBegin;
84 /* Setup the step */
85
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2940 if (b->state >= DVD_STATE_CONF) {
86 /* If the preconditioner is valid */
87
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
980 if (pc) {
88
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(PetscNew(&dvdpc));
89 980 dvdpc->pc = pc;
90
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(PetscObjectReference((PetscObject)pc));
91 980 d->improvex_precond_data = dvdpc;
92 980 d->improvex_precond = dvd_static_precond_PC_0;
93
94 /* PC saves the matrix associated with the linear system, and it has to
95 be initialize to a valid matrix */
96
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(PCGetOperatorsSet(pc,NULL,&t0));
97
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(PetscObjectTypeCompare((PetscObject)pc,PCNONE,&t1));
98
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(PetscObjectTypeCompare((PetscObject)pc,PCSHELL,&t2));
99
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
980 if (t0 && !t1) {
100
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
452 PetscCall(PCGetOperators(pc,NULL,&P));
101
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
452 PetscCall(PetscObjectReference((PetscObject)P));
102
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
452 PetscCall(PCSetOperators(pc,P,P));
103
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
452 PetscCall(PCSetReusePreconditioner(pc,PETSC_TRUE));
104
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
452 PetscCall(MatDestroy(&P));
105
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
528 } else if (t2) {
106 PetscCall(PCSetOperators(pc,d->A,d->A));
107 PetscCall(PCSetReusePreconditioner(pc,PETSC_TRUE));
108 } else {
109 528 d->improvex_precond = dvd_precond_none;
110 }
111
112
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(EPSDavidsonFLAdd(&d->destroyList,dvd_improvex_precond_d));
113
114 /* Else, use no preconditioner */
115 } else d->improvex_precond = dvd_precond_none;
116 }
117
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.
576 PetscFunctionReturn(PETSC_SUCCESS);
118 }
119
120 218 static PetscErrorCode dvd_harm_d(dvdDashboard *d)
121 {
122
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
218 PetscFunctionBegin;
123 /* Free local data */
124
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.
218 PetscCall(PetscFree(d->calcpairs_W_data));
125
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.
46 PetscFunctionReturn(PETSC_SUCCESS);
126 }
127
128 218 static PetscErrorCode dvd_harm_transf(dvdHarmonic *dvdh,PetscScalar t)
129 {
130
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
218 PetscFunctionBegin;
131
2/5
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
218 switch (dvdh->mode) {
132 130 case DVD_HARM_RR: /* harmonic RR */
133 130 dvdh->Wa = 1.0; dvdh->Wb = t; dvdh->Pa = 0.0; dvdh->Pb = -1.0;
134 130 break;
135 case DVD_HARM_RRR: /* relative harmonic RR */
136 dvdh->Wa = 1.0; dvdh->Wb = t; dvdh->Pa = 1.0; dvdh->Pb = 0.0;
137 break;
138 case DVD_HARM_REIGS: /* rightmost eigenvalues */
139 dvdh->Wa = 1.0; dvdh->Wb = t; dvdh->Pa = 1.0; dvdh->Pb = -PetscConj(t);
140 break;
141 88 case DVD_HARM_LEIGS: /* largest eigenvalues */
142 88 dvdh->Wa = 0.0; dvdh->Wb = 1.0; dvdh->Pa = 1.0; dvdh->Pb = 0.0;
143 88 break;
144 case DVD_HARM_NONE:
145 default:
146 SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Harmonic type not supported");
147 }
148
149 /* Check the transformation does not change the sign of the imaginary part */
150 #if !defined(PETSC_USE_COMPLEX)
151
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
109 if (dvdh->Pb*dvdh->Wa - dvdh->Wb*dvdh->Pa < 0.0) {
152 109 dvdh->Pa *= -1.0;
153 109 dvdh->Pb *= -1.0;
154 }
155 #endif
156
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.
46 PetscFunctionReturn(PETSC_SUCCESS);
157 }
158
159 10879 static PetscErrorCode dvd_harm_updateW(dvdDashboard *d)
160 {
161 10879 dvdHarmonic *data = (dvdHarmonic*)d->calcpairs_W_data;
162 10879 PetscInt l,k;
163
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10879 BV BX = d->BX?d->BX:d->eps->V;
164
165
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10879 PetscFunctionBegin;
166 /* Update the target if it is necessary */
167
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.
10879 if (!data->withTarget) PetscCall(dvd_harm_transf(data,d->eigr[0]));
168
169 /* W(i) <- Wa*AV(i) - Wb*BV(i) */
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.
10879 PetscCall(BVGetActiveColumns(d->eps->V,&l,&k));
171
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10879 PetscAssert(k==l+d->V_new_s,PETSC_COMM_SELF,PETSC_ERR_PLIB,"Consistency broken");
172
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(BVSetActiveColumns(d->W,l+d->V_new_s,l+d->V_new_e));
173
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(BVSetActiveColumns(d->AX,l+d->V_new_s,l+d->V_new_e));
174
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(BVSetActiveColumns(BX,l+d->V_new_s,l+d->V_new_e));
175
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(BVCopy(d->AX,d->W));
176
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(BVScale(d->W,data->Wa));
177
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(BVMult(d->W,-data->Wb,1.0,BX,NULL));
178
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(BVSetActiveColumns(d->W,l,k));
179
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(BVSetActiveColumns(d->AX,l,k));
180
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(BVSetActiveColumns(BX,l,k));
181
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.
2214 PetscFunctionReturn(PETSC_SUCCESS);
182 }
183
184 10879 static PetscErrorCode dvd_harm_proj(dvdDashboard *d)
185 {
186 10879 dvdHarmonic *data = (dvdHarmonic*)d->calcpairs_W_data;
187 10879 PetscInt i,j,l0,l,k,ld;
188 10879 PetscScalar h,g,*H,*G;
189
190
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10879 PetscFunctionBegin;
191
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(BVGetActiveColumns(d->eps->V,&l0,&k));
192 10879 l = l0 + d->V_new_s;
193 10879 k = l0 + d->V_new_e;
194
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(MatGetSize(d->H,&ld,NULL));
195
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(MatDenseGetArray(d->H,&H));
196
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(MatDenseGetArray(d->G,&G));
197 /* [H G] <- [Pa*H - Pb*G, Wa*H - Wb*G] */
198 /* Right part */
199
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
26539 for (i=l;i<k;i++) {
200
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
201320 for (j=l0;j<k;j++) {
201 185660 h = H[ld*i+j];
202 185660 g = G[ld*i+j];
203 185660 H[ld*i+j] = data->Pa*h - data->Pb*g;
204 185660 G[ld*i+j] = data->Wa*h - data->Wb*g;
205 }
206 }
207 /* Left part */
208
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
126494 for (i=l0;i<l;i++) {
209
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
271693 for (j=l;j<k;j++) {
210 156078 h = H[ld*i+j];
211 156078 g = G[ld*i+j];
212 156078 H[ld*i+j] = data->Pa*h - data->Pb*g;
213 156078 G[ld*i+j] = data->Wa*h - data->Wb*g;
214 }
215 }
216
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(MatDenseRestoreArray(d->H,&H));
217
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10879 PetscCall(MatDenseRestoreArray(d->G,&G));
218
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.
2214 PetscFunctionReturn(PETSC_SUCCESS);
219 }
220
221 528 PetscErrorCode dvd_harm_updateproj(dvdDashboard *d)
222 {
223 528 dvdHarmonic *data = (dvdHarmonic*)d->calcpairs_W_data;
224 528 PetscInt i,j,l,k,ld;
225 528 PetscScalar h,g,*H,*G;
226
227
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
528 PetscFunctionBegin;
228
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
528 PetscCall(BVGetActiveColumns(d->eps->V,&l,&k));
229 528 k = l + d->V_tra_s;
230
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
528 PetscCall(MatGetSize(d->H,&ld,NULL));
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.
528 PetscCall(MatDenseGetArray(d->H,&H));
232
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
528 PetscCall(MatDenseGetArray(d->G,&G));
233 /* [H G] <- [Pa*H - Pb*G, Wa*H - Wb*G] */
234 /* Right part */
235
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1066 for (i=l;i<k;i++) {
236
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1284 for (j=0;j<l;j++) {
237 746 h = H[ld*i+j];
238 746 g = G[ld*i+j];
239 746 H[ld*i+j] = data->Pa*h - data->Pb*g;
240 746 G[ld*i+j] = data->Wa*h - data->Wb*g;
241 }
242 }
243 /* Lower triangular part */
244
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1264 for (i=0;i<l;i++) {
245
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1482 for (j=l;j<k;j++) {
246 746 h = H[ld*i+j];
247 746 g = G[ld*i+j];
248 746 H[ld*i+j] = data->Pa*h - data->Pb*g;
249 746 G[ld*i+j] = data->Wa*h - data->Wb*g;
250 }
251 }
252
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
528 PetscCall(MatDenseRestoreArray(d->H,&H));
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.
528 PetscCall(MatDenseRestoreArray(d->G,&G));
254
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.
112 PetscFunctionReturn(PETSC_SUCCESS);
255 }
256
257 434611 static PetscErrorCode dvd_harm_backtrans(dvdHarmonic *data,PetscScalar *ar,PetscScalar *ai)
258 {
259 434611 PetscScalar xr;
260 #if !defined(PETSC_USE_COMPLEX)
261 177473 PetscScalar xi, k;
262 #endif
263
264
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
434611 PetscFunctionBegin;
265 434611 xr = *ar;
266 #if !defined(PETSC_USE_COMPLEX)
267 177473 xi = *ai;
268
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
177473 if (PetscUnlikely(xi != 0.0)) {
269 11852 k = (data->Pa - data->Wa*xr)*(data->Pa - data->Wa*xr) + data->Wa*data->Wa*xi*xi;
270 11852 *ar = (data->Pb*data->Pa - (data->Pb*data->Wa + data->Wb*data->Pa)*xr + data->Wb*data->Wa*(xr*xr + xi*xi))/k;
271 11852 *ai = (data->Pb*data->Wa - data->Wb*data->Pa)*xi/k;
272 } else
273 #endif
274 422759 *ar = (data->Pb - data->Wb*xr) / (data->Pa - data->Wa*xr);
275
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.
434611 PetscFunctionReturn(PETSC_SUCCESS);
276 }
277
278 289920 static PetscErrorCode dvd_harm_eig_backtrans(dvdDashboard *d,PetscScalar ar,PetscScalar ai,PetscScalar *br,PetscScalar *bi)
279 {
280 289920 dvdHarmonic *data = (dvdHarmonic*)d->calcpairs_W_data;
281
282
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
289920 PetscFunctionBegin;
283
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
289920 PetscCall(dvd_harm_backtrans(data,&ar,&ai));
284 289920 *br = ar;
285 289920 *bi = ai;
286
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.
289920 PetscFunctionReturn(PETSC_SUCCESS);
287 }
288
289 12663 static PetscErrorCode dvd_harm_eigs_trans(dvdDashboard *d)
290 {
291 12663 dvdHarmonic *data = (dvdHarmonic*)d->calcpairs_W_data;
292 12663 PetscInt i,l,k;
293
294
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
12663 PetscFunctionBegin;
295
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
12663 PetscCall(BVGetActiveColumns(d->eps->V,&l,&k));
296
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.
157354 for (i=0;i<k-l;i++) PetscCall(dvd_harm_backtrans(data,&d->eigr[i],&d->eigi[i]));
297
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.
2592 PetscFunctionReturn(PETSC_SUCCESS);
298 }
299
300 654 PetscErrorCode dvd_harm_conf(dvdDashboard *d,dvdBlackboard *b,HarmType_t mode,PetscBool fixedTarget,PetscScalar t)
301 {
302 654 dvdHarmonic *dvdh;
303
304
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
654 PetscFunctionBegin;
305 /* Set the problem to GNHEP:
306 d->G maybe is upper triangular due to biorthogonality of V and W */
307 654 d->sEP = d->sA = d->sB = 0;
308
309 /* Setup the step */
310
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
654 if (b->state >= DVD_STATE_CONF) {
311
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
218 PetscCall(PetscNew(&dvdh));
312 218 dvdh->withTarget = fixedTarget;
313 218 dvdh->mode = mode;
314
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.
218 if (fixedTarget) PetscCall(dvd_harm_transf(dvdh, t));
315 218 d->calcpairs_W_data = dvdh;
316 218 d->calcpairs_W = dvd_harm_updateW;
317 218 d->calcpairs_proj_trans = dvd_harm_proj;
318 218 d->calcpairs_eigs_trans = dvd_harm_eigs_trans;
319 218 d->calcpairs_eig_backtrans = dvd_harm_eig_backtrans;
320
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.
218 PetscCall(EPSDavidsonFLAdd(&d->destroyList,dvd_harm_d));
322 }
323
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.
138 PetscFunctionReturn(PETSC_SUCCESS);
324 }
325