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 |