| 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 |