| 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 | Skeleton of Davidson solver. Actual solvers are GD and JD. | ||
| 12 | |||
| 13 | References: | ||
| 14 | |||
| 15 | [1] E. Romero and J.E. Roman, "A parallel implementation of Davidson | ||
| 16 | methods for large-scale eigenvalue problems in SLEPc", ACM Trans. | ||
| 17 | Math. Software 40(2):13, 2014. | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include "davidson.h" | ||
| 21 | |||
| 22 | static PetscBool cited = PETSC_FALSE; | ||
| 23 | static const char citation[] = | ||
| 24 | "@Article{slepc-davidson,\n" | ||
| 25 | " author = \"E. Romero and J. E. Roman\",\n" | ||
| 26 | " title = \"A parallel implementation of {Davidson} methods for large-scale eigenvalue problems in {SLEPc}\",\n" | ||
| 27 | " journal = \"{ACM} Trans. Math. Software\",\n" | ||
| 28 | " volume = \"40\",\n" | ||
| 29 | " number = \"2\",\n" | ||
| 30 | " pages = \"13:1--13:29\",\n" | ||
| 31 | " year = \"2014,\"\n" | ||
| 32 | " doi = \"https://doi.org/10.1145/2543696\"\n" | ||
| 33 | "}\n"; | ||
| 34 | |||
| 35 | 980 | PetscErrorCode EPSSetUp_XD(EPS eps) | |
| 36 | { | ||
| 37 | 980 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 38 | 980 | dvdDashboard *dvd = &data->ddb; | |
| 39 | 980 | dvdBlackboard b; | |
| 40 | 980 | PetscInt min_size_V,bs,initv,nmat; | |
| 41 | 980 | Mat A,B; | |
| 42 | 980 | KSP ksp; | |
| 43 | 980 | PetscBool ipB,ispositive; | |
| 44 | 980 | HarmType_t harm; | |
| 45 | 980 | InitType_t init; | |
| 46 | 980 | PetscScalar target; | |
| 47 | |||
| 48 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
980 | PetscFunctionBegin; |
| 49 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
980 | EPSCheckNotStructured(eps); |
| 50 | /* Setup EPS options and get the problem specification */ | ||
| 51 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
980 | if (eps->nev==0) eps->nev = 1; |
| 52 | 980 | bs = data->blocksize; | |
| 53 | 980 | if (bs <= 0) bs = 1; | |
| 54 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
980 | if (eps->ncv!=PETSC_DETERMINE) { |
| 55 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
426 | PetscCheck(eps->ncv>=eps->nev,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The value of ncv must be at least nev"); |
| 56 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
554 | } else if (eps->mpd!=PETSC_DETERMINE) eps->ncv = eps->mpd + eps->nev + bs; |
| 57 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
544 | else if (eps->n < 10) eps->ncv = eps->n+eps->nev+bs; |
| 58 |
2/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
544 | else if (eps->nev < 500) eps->ncv = PetscMax(eps->nev,PetscMin(eps->n-bs,PetscMax(2*eps->nev,eps->nev+15))+bs); |
| 59 | ✗ | else eps->ncv = PetscMax(eps->nev,PetscMin(eps->n-bs,eps->nev+500)+bs); | |
| 60 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
980 | if (eps->mpd==PETSC_DETERMINE) eps->mpd = PetscMin(eps->n,eps->ncv); |
| 61 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
980 | PetscCheck(eps->mpd<=eps->ncv,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The mpd parameter has to be less than or equal to ncv"); |
| 62 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
980 | PetscCheck(eps->mpd>=2,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The mpd parameter has to be greater than 2"); |
| 63 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
980 | if (eps->max_it == PETSC_DETERMINE) eps->max_it = PetscMax(100*eps->ncv,2*eps->n); |
| 64 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
980 | if (!eps->which) eps->which = EPS_LARGEST_MAGNITUDE; |
| 65 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
980 | PetscCheck(eps->nev+bs<=eps->ncv,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The value of ncv has to be greater than nev plus blocksize"); |
| 66 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
980 | PetscCheck(!eps->trueres,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"-eps_true_residual is disabled in this solver."); |
| 67 |
8/18✓ 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 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
980 | EPSCheckUnsupported(eps,EPS_FEATURE_REGION | EPS_FEATURE_TWOSIDED | EPS_FEATURE_THRESHOLD); |
| 68 | |||
| 69 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
980 | if (!data->minv) data->minv = (eps->n && eps->n<10)? 1: PetscMin(PetscMax(bs,6),eps->mpd/2); |
| 70 | 980 | min_size_V = data->minv; | |
| 71 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
980 | PetscCheck(min_size_V+bs<=eps->mpd,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The value of minv must be less than mpd minus blocksize"); |
| 72 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
980 | if (data->plusk == PETSC_DETERMINE) { |
| 73 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
642 | if (eps->problem_type == EPS_GHIEP || eps->nev+bs>eps->ncv) data->plusk = 0; |
| 74 | 622 | else data->plusk = 1; | |
| 75 | } | ||
| 76 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
1614 | if (!data->initialsize) data->initialsize = (eps->n && eps->n<10)? 1: 6; |
| 77 | 980 | initv = data->initialsize; | |
| 78 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
980 | PetscCheck(eps->mpd>=initv,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The initv parameter has to be less than or equal to mpd"); |
| 79 | |||
| 80 | /* Change the default sigma to inf if necessary */ | ||
| 81 |
7/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
980 | if (eps->which == EPS_LARGEST_MAGNITUDE || eps->which == EPS_LARGEST_REAL || eps->which == EPS_LARGEST_IMAGINARY) PetscCall(STSetDefaultShift(eps->st,PETSC_MAX_REAL)); |
| 82 | |||
| 83 | /* Set up preconditioner */ | ||
| 84 |
4/6✓ Branch 0 taken 2 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(STSetUp(eps->st)); |
| 85 | |||
| 86 | /* Setup problem specification in dvd */ | ||
| 87 |
4/6✓ Branch 0 taken 2 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(STGetNumMatrices(eps->st,&nmat)); |
| 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(STGetMatrix(eps->st,0,&A)); |
| 89 |
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.
|
980 | if (nmat>1) PetscCall(STGetMatrix(eps->st,1,&B)); |
| 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(EPSReset_XD(eps)); |
| 91 |
4/6✓ Branch 0 taken 5 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(PetscMemzero(dvd,sizeof(dvdDashboard))); |
| 92 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
980 | dvd->A = A; dvd->B = eps->isgeneralized? B: NULL; |
| 93 | 980 | ispositive = eps->ispositive; | |
| 94 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
1198 | dvd->sA = DVD_MAT_IMPLICIT | (eps->ishermitian? DVD_MAT_HERMITIAN: 0) | ((ispositive && !eps->isgeneralized) ? DVD_MAT_POS_DEF: 0); |
| 95 | /* Assume -eps_hermitian means hermitian-definite in generalized problems */ | ||
| 96 |
6/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
|
980 | if (!ispositive && !eps->isgeneralized && eps->ishermitian) ispositive = PETSC_TRUE; |
| 97 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
980 | if (!eps->isgeneralized) dvd->sB = DVD_MAT_IMPLICIT | DVD_MAT_HERMITIAN | DVD_MAT_IDENTITY | DVD_MAT_UNITARY | DVD_MAT_POS_DEF; |
| 98 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
260 | else dvd->sB = DVD_MAT_IMPLICIT | (eps->ishermitian? DVD_MAT_HERMITIAN: 0) | (ispositive? DVD_MAT_POS_DEF: 0); |
| 99 |
5/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 taken 10 times.
|
980 | ipB = (dvd->B && data->ipB && DVD_IS(dvd->sB,DVD_MAT_HERMITIAN))?PETSC_TRUE:PETSC_FALSE; |
| 100 |
9/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
|
1262 | dvd->sEP = ((!eps->isgeneralized || (eps->isgeneralized && ipB))? DVD_EP_STD: 0) | (ispositive? DVD_EP_HERMITIAN: 0) | ((eps->problem_type == EPS_GHIEP && ipB) ? DVD_EP_INDEFINITE : 0); |
| 101 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
980 | if (data->ipB && !ipB) data->ipB = PETSC_FALSE; |
| 102 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
|
980 | dvd->correctXnorm = (dvd->B && (DVD_IS(dvd->sB,DVD_MAT_HERMITIAN)||DVD_IS(dvd->sEP,DVD_EP_INDEFINITE)))?PETSC_TRUE:PETSC_FALSE; |
| 103 | 980 | dvd->nev = eps->nev; | |
| 104 | 980 | dvd->which = eps->which; | |
| 105 | 980 | dvd->withTarget = PETSC_TRUE; | |
| 106 |
4/7✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
|
980 | switch (eps->which) { |
| 107 | 188 | case EPS_TARGET_MAGNITUDE: | |
| 108 | case EPS_TARGET_IMAGINARY: | ||
| 109 | 188 | dvd->target[0] = target = eps->target; | |
| 110 | 188 | dvd->target[1] = 1.0; | |
| 111 | 188 | break; | |
| 112 | ✗ | case EPS_TARGET_REAL: | |
| 113 | ✗ | dvd->target[0] = PetscRealPart(target = eps->target); | |
| 114 | ✗ | dvd->target[1] = 1.0; | |
| 115 | ✗ | break; | |
| 116 | 444 | case EPS_LARGEST_REAL: | |
| 117 | case EPS_LARGEST_MAGNITUDE: | ||
| 118 | case EPS_LARGEST_IMAGINARY: /* TODO: think about this case */ | ||
| 119 | 444 | dvd->target[0] = 1.0; | |
| 120 | 444 | dvd->target[1] = target = 0.0; | |
| 121 | 444 | break; | |
| 122 | 308 | case EPS_SMALLEST_MAGNITUDE: | |
| 123 | case EPS_SMALLEST_REAL: | ||
| 124 | case EPS_SMALLEST_IMAGINARY: /* TODO: think about this case */ | ||
| 125 | 308 | dvd->target[0] = target = 0.0; | |
| 126 | 308 | dvd->target[1] = 1.0; | |
| 127 | 308 | break; | |
| 128 | 40 | case EPS_WHICH_USER: | |
| 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.
|
40 | PetscCall(STGetShift(eps->st,&target)); |
| 130 | 40 | dvd->target[0] = target; | |
| 131 | 40 | dvd->target[1] = 1.0; | |
| 132 | 40 | break; | |
| 133 | ✗ | case EPS_ALL: | |
| 134 | ✗ | SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver does not support computing all eigenvalues"); | |
| 135 | ✗ | default: | |
| 136 | ✗ | SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Unsupported value of option 'which'"); | |
| 137 | } | ||
| 138 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
980 | dvd->tol = SlepcDefaultTol(eps->tol); |
| 139 | 980 | dvd->eps = eps; | |
| 140 | |||
| 141 | /* Setup the extraction technique */ | ||
| 142 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
980 | if (!eps->extraction) { |
| 143 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
890 | if (ipB || ispositive) eps->extraction = EPS_RITZ; |
| 144 | else { | ||
| 145 |
3/3✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
|
158 | switch (eps->which) { |
| 146 | 60 | case EPS_TARGET_REAL: | |
| 147 | case EPS_TARGET_MAGNITUDE: | ||
| 148 | case EPS_TARGET_IMAGINARY: | ||
| 149 | case EPS_SMALLEST_MAGNITUDE: | ||
| 150 | case EPS_SMALLEST_REAL: | ||
| 151 | case EPS_SMALLEST_IMAGINARY: | ||
| 152 | 60 | eps->extraction = EPS_HARMONIC; | |
| 153 | 60 | break; | |
| 154 | 68 | case EPS_LARGEST_REAL: | |
| 155 | case EPS_LARGEST_MAGNITUDE: | ||
| 156 | case EPS_LARGEST_IMAGINARY: | ||
| 157 | 68 | eps->extraction = EPS_HARMONIC_LARGEST; | |
| 158 | 68 | break; | |
| 159 | 30 | default: | |
| 160 | 30 | eps->extraction = EPS_RITZ; | |
| 161 | } | ||
| 162 | 18 | } | |
| 163 | } | ||
| 164 |
3/6✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
|
980 | switch (eps->extraction) { |
| 165 | case EPS_RITZ: harm = DVD_HARM_NONE; break; | ||
| 166 | 130 | case EPS_HARMONIC: harm = DVD_HARM_RR; break; | |
| 167 | ✗ | case EPS_HARMONIC_RELATIVE: harm = DVD_HARM_RRR; break; | |
| 168 | ✗ | case EPS_HARMONIC_RIGHT: harm = DVD_HARM_REIGS; break; | |
| 169 | 88 | case EPS_HARMONIC_LARGEST: harm = DVD_HARM_LEIGS; break; | |
| 170 | ✗ | default: SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Unsupported extraction type"); | |
| 171 | } | ||
| 172 | |||
| 173 | /* Setup the type of starting subspace */ | ||
| 174 | 980 | init = data->krylovstart? DVD_INITV_KRYLOV: DVD_INITV_CLASSIC; | |
| 175 | |||
| 176 | /* Preconfigure dvd */ | ||
| 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.
|
980 | PetscCall(STGetKSP(eps->st,&ksp)); |
| 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.
|
980 | PetscCall(dvd_schm_basic_preconf(dvd,&b,eps->mpd,min_size_V,bs,initv,PetscAbs(eps->nini),data->plusk,harm,ksp,init,eps->trackall,data->ipB,data->doubleexp)); |
| 179 | |||
| 180 | /* Allocate memory */ | ||
| 181 |
4/6✓ Branch 0 taken 2 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(EPSAllocateSolution(eps,0)); |
| 182 | |||
| 183 | /* Setup orthogonalization */ | ||
| 184 |
4/6✓ Branch 0 taken 2 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(EPS_SetInnerProduct(eps)); |
| 185 |
7/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
|
980 | if (!(ipB && dvd->B)) PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE)); |
| 186 | |||
| 187 | /* Configure dvd for a basic GD */ | ||
| 188 |
4/6✓ Branch 0 taken 2 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(dvd_schm_basic_conf(dvd,&b,eps->mpd,min_size_V,bs,initv,PetscAbs(eps->nini),data->plusk,harm,dvd->withTarget,target,ksp,data->fix,init,eps->trackall,data->ipB,data->dynamic,data->doubleexp)); |
| 189 |
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); |
| 190 | } | ||
| 191 | |||
| 192 | 980 | PetscErrorCode EPSSolve_XD(EPS eps) | |
| 193 | { | ||
| 194 | 980 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 195 | 980 | dvdDashboard *d = &data->ddb; | |
| 196 | 980 | PetscInt l,k; | |
| 197 | |||
| 198 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
980 | PetscFunctionBegin; |
| 199 |
4/6✓ Branch 0 taken 2 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(PetscCitationsRegister(citation,&cited)); |
| 200 | /* Call the starting routines */ | ||
| 201 |
4/6✓ Branch 0 taken 2 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(EPSDavidsonFLCall(d->startList,d)); |
| 202 | |||
| 203 | 86393 | while (eps->reason == EPS_CONVERGED_ITERATING) { | |
| 204 | |||
| 205 | /* Initialize V, if it is needed */ | ||
| 206 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
86393 | PetscCall(BVGetActiveColumns(d->eps->V,&l,&k)); |
| 207 |
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.
|
86393 | if (PetscUnlikely(l == k)) PetscCall(d->initV(d)); |
| 208 | |||
| 209 | /* Find the best approximated eigenpairs in V, X */ | ||
| 210 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
86393 | PetscCall(d->calcPairs(d)); |
| 211 | |||
| 212 | /* Test for convergence */ | ||
| 213 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
86393 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx)); |
| 214 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
86393 | if (eps->reason != EPS_CONVERGED_ITERATING) break; |
| 215 | |||
| 216 | /* Expand the subspace */ | ||
| 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.
|
85413 | PetscCall(d->updateV(d)); |
| 218 | |||
| 219 | /* Monitor progress */ | ||
| 220 | 85413 | eps->nconv = d->nconv; | |
| 221 | 85413 | eps->its++; | |
| 222 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
85413 | PetscCall(BVGetActiveColumns(d->eps->V,NULL,&k)); |
| 223 |
5/8✓ 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 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
86393 | PetscCall(EPSMonitor(eps,eps->its,eps->nconv+d->npreconv,eps->eigr,eps->eigi,eps->errest,PetscMin(k,eps->nev))); |
| 224 | } | ||
| 225 | |||
| 226 | /* Call the ending routines */ | ||
| 227 |
4/6✓ Branch 0 taken 2 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(EPSDavidsonFLCall(d->endList,d)); |
| 228 |
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); |
| 229 | } | ||
| 230 | |||
| 231 | 1694 | PetscErrorCode EPSReset_XD(EPS eps) | |
| 232 | { | ||
| 233 | 1694 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 234 | 1694 | dvdDashboard *dvd = &data->ddb; | |
| 235 | |||
| 236 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1694 | PetscFunctionBegin; |
| 237 | /* Call step destructors and destroys the list */ | ||
| 238 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1694 | PetscCall(EPSDavidsonFLCall(dvd->destroyList,dvd)); |
| 239 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1694 | PetscCall(EPSDavidsonFLDestroy(&dvd->destroyList)); |
| 240 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1694 | PetscCall(EPSDavidsonFLDestroy(&dvd->startList)); |
| 241 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1694 | PetscCall(EPSDavidsonFLDestroy(&dvd->endList)); |
| 242 |
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.
|
334 | PetscFunctionReturn(PETSC_SUCCESS); |
| 243 | } | ||
| 244 | |||
| 245 | 40 | PetscErrorCode EPSXDSetKrylovStart_XD(EPS eps,PetscBool krylovstart) | |
| 246 | { | ||
| 247 | 40 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 248 | |||
| 249 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
40 | PetscFunctionBegin; |
| 250 | 40 | data->krylovstart = krylovstart; | |
| 251 |
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.
|
40 | PetscFunctionReturn(PETSC_SUCCESS); |
| 252 | } | ||
| 253 | |||
| 254 | 614 | PetscErrorCode EPSXDGetKrylovStart_XD(EPS eps,PetscBool *krylovstart) | |
| 255 | { | ||
| 256 | 614 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 257 | |||
| 258 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
614 | PetscFunctionBegin; |
| 259 | 614 | *krylovstart = data->krylovstart; | |
| 260 |
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.
|
614 | PetscFunctionReturn(PETSC_SUCCESS); |
| 261 | } | ||
| 262 | |||
| 263 | 30 | PetscErrorCode EPSXDSetBlockSize_XD(EPS eps,PetscInt blocksize) | |
| 264 | { | ||
| 265 | 30 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 266 | |||
| 267 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
30 | PetscFunctionBegin; |
| 268 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
30 | if (blocksize == PETSC_DEFAULT || blocksize == PETSC_DECIDE) blocksize = 1; |
| 269 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
30 | PetscCheck(blocksize>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid blocksize value, must be >0"); |
| 270 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
30 | if (data->blocksize != blocksize) { |
| 271 | 30 | data->blocksize = blocksize; | |
| 272 | 30 | eps->state = EPS_STATE_INITIAL; | |
| 273 | } | ||
| 274 |
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.
|
6 | PetscFunctionReturn(PETSC_SUCCESS); |
| 275 | } | ||
| 276 | |||
| 277 | 614 | PetscErrorCode EPSXDGetBlockSize_XD(EPS eps,PetscInt *blocksize) | |
| 278 | { | ||
| 279 | 614 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 280 | |||
| 281 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
614 | PetscFunctionBegin; |
| 282 | 614 | *blocksize = data->blocksize; | |
| 283 |
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.
|
614 | PetscFunctionReturn(PETSC_SUCCESS); |
| 284 | } | ||
| 285 | |||
| 286 | 22 | PetscErrorCode EPSXDSetRestart_XD(EPS eps,PetscInt minv,PetscInt plusk) | |
| 287 | { | ||
| 288 | 22 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 289 | |||
| 290 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
22 | PetscFunctionBegin; |
| 291 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
22 | if (minv == PETSC_DETERMINE) { |
| 292 | ✗ | if (data->minv != 0) eps->state = EPS_STATE_INITIAL; | |
| 293 | ✗ | data->minv = 0; | |
| 294 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
22 | } else if (minv != PETSC_CURRENT) { |
| 295 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
22 | PetscCheck(minv>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid minv value, must be >0"); |
| 296 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
22 | if (data->minv != minv) eps->state = EPS_STATE_INITIAL; |
| 297 | 22 | data->minv = minv; | |
| 298 | } | ||
| 299 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
|
22 | if (plusk == PETSC_DETERMINE) { |
| 300 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
10 | if (data->plusk != PETSC_DETERMINE) eps->state = EPS_STATE_INITIAL; |
| 301 | 10 | data->plusk = PETSC_DETERMINE; | |
| 302 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
12 | } else if (plusk != PETSC_CURRENT) { |
| 303 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
12 | PetscCheck(plusk>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid plusk value, must be >0"); |
| 304 |
1/2✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
|
12 | if (data->plusk != plusk) eps->state = EPS_STATE_INITIAL; |
| 305 | 12 | data->plusk = plusk; | |
| 306 | } | ||
| 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.
|
6 | PetscFunctionReturn(PETSC_SUCCESS); |
| 308 | } | ||
| 309 | |||
| 310 | 614 | PetscErrorCode EPSXDGetRestart_XD(EPS eps,PetscInt *minv,PetscInt *plusk) | |
| 311 | { | ||
| 312 | 614 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 313 | |||
| 314 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
614 | PetscFunctionBegin; |
| 315 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
614 | if (minv) *minv = data->minv; |
| 316 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
614 | if (plusk) *plusk = data->plusk; |
| 317 |
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.
|
614 | PetscFunctionReturn(PETSC_SUCCESS); |
| 318 | } | ||
| 319 | |||
| 320 | 604 | PetscErrorCode EPSXDGetInitialSize_XD(EPS eps,PetscInt *initialsize) | |
| 321 | { | ||
| 322 | 604 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 323 | |||
| 324 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
604 | PetscFunctionBegin; |
| 325 | 604 | *initialsize = data->initialsize; | |
| 326 |
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.
|
604 | PetscFunctionReturn(PETSC_SUCCESS); |
| 327 | } | ||
| 328 | |||
| 329 | 20 | PetscErrorCode EPSXDSetInitialSize_XD(EPS eps,PetscInt initialsize) | |
| 330 | { | ||
| 331 | 20 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 332 | |||
| 333 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
| 334 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
20 | if (initialsize == PETSC_DEFAULT || initialsize == PETSC_DECIDE) initialsize = 0; |
| 335 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
20 | else PetscCheck(initialsize>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid initial size value, must be >0"); |
| 336 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
20 | if (data->initialsize != initialsize) { |
| 337 | 20 | data->initialsize = initialsize; | |
| 338 | 20 | eps->state = EPS_STATE_INITIAL; | |
| 339 | } | ||
| 340 |
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.
|
4 | PetscFunctionReturn(PETSC_SUCCESS); |
| 341 | } | ||
| 342 | |||
| 343 | 20 | PetscErrorCode EPSXDSetBOrth_XD(EPS eps,PetscBool borth) | |
| 344 | { | ||
| 345 | 20 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 346 | |||
| 347 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
| 348 | 20 | data->ipB = borth; | |
| 349 |
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.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
| 350 | } | ||
| 351 | |||
| 352 | 614 | PetscErrorCode EPSXDGetBOrth_XD(EPS eps,PetscBool *borth) | |
| 353 | { | ||
| 354 | 614 | EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data; | |
| 355 | |||
| 356 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
614 | PetscFunctionBegin; |
| 357 | 614 | *borth = data->ipB; | |
| 358 |
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.
|
614 | PetscFunctionReturn(PETSC_SUCCESS); |
| 359 | } | ||
| 360 | |||
| 361 | /* | ||
| 362 | EPSComputeVectors_XD - Compute eigenvectors from the vectors | ||
| 363 | provided by the eigensolver. This version is intended for solvers | ||
| 364 | that provide Schur vectors from the QZ decomposition. Given the partial | ||
| 365 | Schur decomposition OP*V=V*T, the following steps are performed: | ||
| 366 | 1) compute eigenvectors of (S,T): S*Z=T*Z*D | ||
| 367 | 2) compute eigenvectors of OP: X=V*Z | ||
| 368 | */ | ||
| 369 | 940 | PetscErrorCode EPSComputeVectors_XD(EPS eps) | |
| 370 | { | ||
| 371 | 940 | Mat X; | |
| 372 | 940 | PetscBool symm; | |
| 373 | |||
| 374 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
940 | PetscFunctionBegin; |
| 375 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
940 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->ds,DSHEP,&symm)); |
| 376 |
8/14✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
|
940 | if (symm) PetscFunctionReturn(PETSC_SUCCESS); |
| 377 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
248 | PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL)); |
| 378 | |||
| 379 | /* V <- V * X */ | ||
| 380 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
248 | PetscCall(DSGetMat(eps->ds,DS_MAT_X,&X)); |
| 381 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
248 | PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv)); |
| 382 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
248 | PetscCall(BVMultInPlace(eps->V,X,0,eps->nconv)); |
| 383 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
248 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_X,&X)); |
| 384 |
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.
|
52 | PetscFunctionReturn(PETSC_SUCCESS); |
| 385 | } | ||
| 386 |