| 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: "subspace" | ||
| 12 | |||
| 13 | Method: Subspace Iteration | ||
| 14 | |||
| 15 | Algorithm: | ||
| 16 | |||
| 17 | Subspace iteration with Rayleigh-Ritz projection and locking, | ||
| 18 | based on the SRRIT implementation. | ||
| 19 | |||
| 20 | References: | ||
| 21 | |||
| 22 | [1] "Subspace Iteration in SLEPc", SLEPc Technical Report STR-3, | ||
| 23 | available at https://slepc.upv.es. | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <slepc/private/epsimpl.h> | ||
| 27 | |||
| 28 | typedef struct { | ||
| 29 | PetscBool estimatedrange; /* the filter range was not set by the user */ | ||
| 30 | } EPS_SUBSPACE; | ||
| 31 | |||
| 32 | 28 | static PetscErrorCode EPSSetUp_Subspace_Filter(EPS eps) | |
| 33 | { | ||
| 34 | 28 | EPS_SUBSPACE *ctx = (EPS_SUBSPACE*)eps->data; | |
| 35 | 28 | PetscBool estimaterange=PETSC_TRUE; | |
| 36 | 28 | PetscReal rleft,rright; | |
| 37 | 28 | Mat A; | |
| 38 | |||
| 39 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
28 | PetscFunctionBegin; |
| 40 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | EPSCheckHermitianCondition(eps,PETSC_TRUE," with polynomial filter"); |
| 41 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | EPSCheckStandardCondition(eps,PETSC_TRUE," with polynomial filter"); |
| 42 |
1/6✗ 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.
|
28 | PetscCheck(eps->intb<PETSC_MAX_REAL || eps->inta>PETSC_MIN_REAL,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"The defined computational interval should have at least one of their sides bounded"); |
| 43 |
8/18✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ 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.
|
28 | EPSCheckUnsupportedCondition(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION,PETSC_TRUE," with polynomial filter"); |
| 44 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(STFilterSetInterval(eps->st,eps->inta,eps->intb)); |
| 45 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
28 | if (!ctx->estimatedrange) { |
| 46 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(STFilterGetRange(eps->st,&rleft,&rright)); |
| 47 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 1 times.
|
28 | estimaterange = (!rleft && !rright)? PETSC_TRUE: PETSC_FALSE; |
| 48 | } | ||
| 49 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
2 | if (estimaterange) { /* user did not set a range */ |
| 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.
|
28 | PetscCall(STGetMatrix(eps->st,0,&A)); |
| 51 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(MatEstimateSpectralRange_EPS(A,&rleft,&rright)); |
| 52 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(PetscInfo(eps,"Setting eigenvalue range to [%g,%g]\n",(double)rleft,(double)rright)); |
| 53 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(STFilterSetRange(eps->st,rleft,rright)); |
| 54 | 28 | ctx->estimatedrange = PETSC_TRUE; | |
| 55 | } | ||
| 56 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(EPSSetStoppingTest(eps,EPS_STOP_THRESHOLD)); |
| 57 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd)); |
| 58 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | PetscCheck(eps->ncv<=eps->nev+eps->mpd,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must not be larger than nev+mpd"); |
| 59 |
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); |
| 60 | } | ||
| 61 | |||
| 62 | 222 | static PetscErrorCode EPSSetUp_Subspace(EPS eps) | |
| 63 | { | ||
| 64 | 222 | PetscBool isfilt; | |
| 65 | |||
| 66 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
222 | PetscFunctionBegin; |
| 67 |
4/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
222 | EPSCheckDefinite(eps); |
| 68 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
222 | EPSCheckNotStructured(eps); |
| 69 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
222 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv); |
| 70 |
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.
|
222 | if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps)); |
| 71 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
222 | if (eps->which==EPS_ALL) { |
| 72 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilt)); |
| 73 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | PetscCheck(isfilt,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Spectrum slicing not supported in this solver"); |
| 74 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(EPSSetUp_Subspace_Filter(eps)); |
| 75 | } else { | ||
| 76 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
194 | PetscCheck(eps->which==EPS_LARGEST_MAGNITUDE || eps->which==EPS_TARGET_MAGNITUDE,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver supports only largest magnitude or target magnitude eigenvalues"); |
| 77 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
194 | PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd)); |
| 78 | } | ||
| 79 |
3/12✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
222 | EPSCheckUnsupported(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_EXTRACTION | EPS_FEATURE_TWOSIDED); |
| 80 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
222 | PetscCheck(eps->converged==EPSConvergedRelative,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver only supports relative convergence test"); |
| 81 | |||
| 82 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(EPSAllocateSolution(eps,0)); |
| 83 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(EPS_SetInnerProduct(eps)); |
| 84 |
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.
|
222 | if (eps->ishermitian) PetscCall(DSSetType(eps->ds,DSHEP)); |
| 85 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
61 | else PetscCall(DSSetType(eps->ds,DSNHEP)); |
| 86 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(DSAllocate(eps->ds,eps->ncv)); |
| 87 |
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.
|
42 | PetscFunctionReturn(PETSC_SUCCESS); |
| 88 | } | ||
| 89 | |||
| 90 | 222 | static PetscErrorCode EPSSetUpSort_Subspace(EPS eps) | |
| 91 | { | ||
| 92 | 222 | SlepcSC sc; | |
| 93 | |||
| 94 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
222 | PetscFunctionBegin; |
| 95 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(EPSSetUpSort_Default(eps)); |
| 96 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
222 | if (eps->which==EPS_ALL) { |
| 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.
|
28 | PetscCall(DSGetSlepcSC(eps->ds,&sc)); |
| 98 | 28 | sc->rg = NULL; | |
| 99 | 28 | sc->comparison = SlepcCompareLargestReal; | |
| 100 | 28 | sc->comparisonctx = NULL; | |
| 101 | 28 | sc->map = NULL; | |
| 102 | 28 | sc->mapobj = NULL; | |
| 103 | } | ||
| 104 |
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.
|
42 | PetscFunctionReturn(PETSC_SUCCESS); |
| 105 | } | ||
| 106 | |||
| 107 | /* | ||
| 108 | EPSSubspaceFindGroup - Find a group of nearly equimodular eigenvalues, provided | ||
| 109 | in arrays wr and wi, according to the tolerance grptol. Also the 2-norms | ||
| 110 | of the residuals must be passed in (rsd). Arrays are processed from index | ||
| 111 | l to index m only. The output information is: | ||
| 112 | |||
| 113 | ngrp - number of entries of the group | ||
| 114 | ctr - (w(l)+w(l+ngrp-1))/2 | ||
| 115 | ae - average of wr(l),...,wr(l+ngrp-1) | ||
| 116 | arsd - average of rsd(l),...,rsd(l+ngrp-1) | ||
| 117 | */ | ||
| 118 | 6926 | static PetscErrorCode EPSSubspaceFindGroup(PetscInt l,PetscInt m,PetscScalar *wr,PetscScalar *wi,PetscReal *rsd,PetscReal grptol,PetscInt *ngrp,PetscReal *ctr,PetscReal *ae,PetscReal *arsd) | |
| 119 | { | ||
| 120 | 6926 | PetscInt i; | |
| 121 | 6926 | PetscReal rmod,rmod1; | |
| 122 | |||
| 123 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6926 | PetscFunctionBegin; |
| 124 | 6926 | *ngrp = 0; | |
| 125 | 6926 | *ctr = 0; | |
| 126 | 6926 | rmod = SlepcAbsEigenvalue(wr[l],wi[l]); | |
| 127 | |||
| 128 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
20938 | for (i=l;i<m;) { |
| 129 | 17320 | rmod1 = SlepcAbsEigenvalue(wr[i],wi[i]); | |
| 130 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
17320 | if (PetscAbsReal(rmod-rmod1) > grptol*(rmod+rmod1)) break; |
| 131 | 10628 | *ctr = (rmod+rmod1)/2.0; | |
| 132 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10628 | if (wi[i] == 0.0) { |
| 133 | 10628 | (*ngrp)++; | |
| 134 | 10628 | i++; | |
| 135 | } else { | ||
| 136 | ✗ | (*ngrp)+=2; | |
| 137 | ✗ | i+=2; | |
| 138 | } | ||
| 139 | } | ||
| 140 | |||
| 141 | 6926 | *ae = 0; | |
| 142 | 6926 | *arsd = 0; | |
| 143 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
6926 | if (*ngrp) { |
| 144 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
17554 | for (i=l;i<l+*ngrp;i++) { |
| 145 | 10628 | (*ae) += PetscRealPart(wr[i]); | |
| 146 | 10628 | (*arsd) += rsd[i]*rsd[i]; | |
| 147 | } | ||
| 148 | 6926 | *ae = *ae / *ngrp; | |
| 149 | 6926 | *arsd = PetscSqrtReal(*arsd / *ngrp); | |
| 150 | } | ||
| 151 |
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.
|
6926 | PetscFunctionReturn(PETSC_SUCCESS); |
| 152 | } | ||
| 153 | |||
| 154 | /* | ||
| 155 | EPSSubspaceResidualNorms - Computes the column norms of residual vectors | ||
| 156 | OP*V(1:n,l:m) - V*T(1:m,l:m), where, on entry, OP*V has been computed and | ||
| 157 | stored in R. On exit, rsd(l) to rsd(m) contain the computed norms. | ||
| 158 | */ | ||
| 159 | 2044 | static PetscErrorCode EPSSubspaceResidualNorms(BV R,BV V,Mat T,PetscInt l,PetscInt m,PetscScalar *eigi,PetscReal *rsd) | |
| 160 | { | ||
| 161 | 2044 | PetscInt i; | |
| 162 | |||
| 163 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2044 | PetscFunctionBegin; |
| 164 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(BVMult(R,-1.0,1.0,V,T)); |
| 165 |
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.
|
35729 | for (i=l;i<m;i++) PetscCall(BVNormColumnBegin(R,i,NORM_2,rsd+i)); |
| 166 |
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.
|
35729 | for (i=l;i<m;i++) PetscCall(BVNormColumnEnd(R,i,NORM_2,rsd+i)); |
| 167 | #if !defined(PETSC_USE_COMPLEX) | ||
| 168 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
16362 | for (i=l;i<m-1;i++) { |
| 169 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
15364 | if (eigi[i]!=0.0) { |
| 170 | ✗ | rsd[i] = SlepcAbs(rsd[i],rsd[i+1]); | |
| 171 | ✗ | rsd[i+1] = rsd[i]; | |
| 172 | ✗ | i++; | |
| 173 | } | ||
| 174 | } | ||
| 175 | #endif | ||
| 176 |
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.
|
378 | PetscFunctionReturn(PETSC_SUCCESS); |
| 177 | } | ||
| 178 | |||
| 179 | 222 | static PetscErrorCode EPSSolve_Subspace(EPS eps) | |
| 180 | { | ||
| 181 | 222 | Mat H,Q,S,T,B; | |
| 182 | 222 | BV AV,R; | |
| 183 | 222 | PetscBool indef; | |
| 184 | 222 | PetscInt i,k,ngrp,nogrp,*itrsd,*itrsdold; | |
| 185 | 222 | PetscInt nxtsrr,idsrr,idort,nxtort,nv,its; | |
| 186 | 222 | PetscReal arsd,oarsd,ctr,octr,ae,oae,*rsd,*orsd,tcond=1.0; | |
| 187 | 222 | PetscScalar *oeigr,*oeigi; | |
| 188 | /* Parameters */ | ||
| 189 | 222 | PetscInt init = 5; /* Number of initial iterations */ | |
| 190 | 222 | PetscReal stpfac = 1.5; /* Max num of iter before next SRR step */ | |
| 191 | 222 | PetscReal alpha = 1.0; /* Used to predict convergence of next residual */ | |
| 192 | 222 | PetscReal beta = 1.1; /* Used to predict convergence of next residual */ | |
| 193 | 222 | PetscReal grptol = SLEPC_DEFAULT_TOL; /* Tolerance for EPSSubspaceFindGroup */ | |
| 194 | 222 | PetscReal cnvtol = 1e-6; /* Convergence criterion for cnv */ | |
| 195 | 222 | PetscInt orttol = 2; /* Number of decimal digits whose loss | |
| 196 | can be tolerated in orthogonalization */ | ||
| 197 | |||
| 198 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
222 | PetscFunctionBegin; |
| 199 | 222 | its = 0; | |
| 200 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(PetscMalloc6(eps->ncv,&rsd,eps->ncv,&orsd,eps->ncv,&oeigr,eps->ncv,&oeigi,eps->ncv,&itrsd,eps->ncv,&itrsdold)); |
| 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.
|
222 | PetscCall(BVDuplicate(eps->V,&AV)); |
| 202 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(BVDuplicate(eps->V,&R)); |
| 203 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(STGetOperator(eps->st,&S)); |
| 204 | |||
| 205 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4206 | for (i=0;i<eps->ncv;i++) { |
| 206 | 3984 | rsd[i] = 0.0; | |
| 207 | 3984 | itrsd[i] = -1; | |
| 208 | } | ||
| 209 | |||
| 210 | /* Complete the initial basis with random vectors and orthonormalize them */ | ||
| 211 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
4176 | for (k=eps->nini;k<eps->ncv;k++) { |
| 212 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3954 | PetscCall(BVSetRandomColumn(eps->V,k)); |
| 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.
|
3954 | PetscCall(BVOrthonormalizeColumn(eps->V,k,PETSC_TRUE,NULL,NULL)); |
| 214 | } | ||
| 215 | |||
| 216 | 2044 | while (eps->reason == EPS_CONVERGED_ITERATING) { | |
| 217 | 2044 | eps->its++; | |
| 218 | 2044 | nv = PetscMin(eps->nconv+eps->mpd,eps->ncv); | |
| 219 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,0)); |
| 220 | |||
| 221 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
35729 | for (i=eps->nconv;i<nv;i++) { |
| 222 | 33685 | oeigr[i] = eps->eigr[i]; | |
| 223 | 33685 | oeigi[i] = eps->eigi[i]; | |
| 224 | 33685 | orsd[i] = rsd[i]; | |
| 225 | } | ||
| 226 | |||
| 227 | /* AV(:,idx) = OP * V(:,idx) */ | ||
| 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.
|
2044 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
| 229 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(BVSetActiveColumns(AV,eps->nconv,nv)); |
| 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.
|
2044 | PetscCall(BVMatMult(eps->V,S,AV)); |
| 231 | |||
| 232 | /* T(:,idx) = V' * AV(:,idx) */ | ||
| 233 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(BVSetActiveColumns(eps->V,0,nv)); |
| 234 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(DSGetMat(eps->ds,DS_MAT_A,&H)); |
| 235 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(BVDot(AV,eps->V,H)); |
| 236 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&H)); |
| 237 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(DSSetState(eps->ds,DS_STATE_RAW)); |
| 238 | |||
| 239 | /* Solve projected problem */ | ||
| 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.
|
2044 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
| 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.
|
2044 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
| 242 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
| 243 | |||
| 244 | /* Update vectors V(:,idx) = V * U(:,idx) */ | ||
| 245 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q)); |
| 246 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(BVSetActiveColumns(AV,0,nv)); |
| 247 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(BVSetActiveColumns(R,0,nv)); |
| 248 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(BVMultInPlace(eps->V,Q,eps->nconv,nv)); |
| 249 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(BVMultInPlace(AV,Q,eps->nconv,nv)); |
| 250 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q)); |
| 251 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(BVCopy(AV,R)); |
| 252 | |||
| 253 | /* Convergence check */ | ||
| 254 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(DSGetMat(eps->ds,DS_MAT_A,&T)); |
| 255 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(EPSSubspaceResidualNorms(R,eps->V,T,eps->nconv,nv,eps->eigi,rsd)); |
| 256 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&T)); |
| 257 | |||
| 258 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
35729 | for (i=eps->nconv;i<nv;i++) { |
| 259 | 33685 | itrsdold[i] = itrsd[i]; | |
| 260 | 33685 | itrsd[i] = its; | |
| 261 | 33685 | eps->errest[i] = rsd[i]; | |
| 262 | } | ||
| 263 | |||
| 264 | 3463 | for (;;) { | |
| 265 | /* Find clusters of computed eigenvalues */ | ||
| 266 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3463 | PetscCall(EPSSubspaceFindGroup(eps->nconv,nv,eps->eigr,eps->eigi,eps->errest,grptol,&ngrp,&ctr,&ae,&arsd)); |
| 267 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3463 | PetscCall(EPSSubspaceFindGroup(eps->nconv,nv,oeigr,oeigi,orsd,grptol,&nogrp,&octr,&oae,&oarsd)); |
| 268 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3463 | if (ngrp!=nogrp) break; |
| 269 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
3241 | if (ngrp==0) break; |
| 270 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3241 | if (PetscAbsReal(ae-oae)>ctr*cnvtol*(itrsd[eps->nconv]-itrsdold[eps->nconv])) break; |
| 271 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2424 | if (arsd>ctr*eps->tol) break; |
| 272 | 1425 | eps->nconv = eps->nconv + ngrp; | |
| 273 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
|
1425 | if (eps->nconv>=nv) break; |
| 274 | } | ||
| 275 | |||
| 276 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall(EPSMonitor(eps,eps->its,eps->nconv,eps->eigr,eps->eigi,eps->errest,nv)); |
| 277 |
20/26✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
|
2044 | EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,eps->errest,eps->nconv,nv); |
| 278 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
2044 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx)); |
| 279 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2044 | if (eps->reason != EPS_CONVERGED_ITERATING) break; |
| 280 | |||
| 281 | /* Compute nxtsrr (iteration of next projection step) */ | ||
| 282 | 1822 | nxtsrr = PetscMax((PetscInt)PetscFloorReal(stpfac*its),init); | |
| 283 | |||
| 284 |
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.
|
1822 | if (ngrp!=nogrp || ngrp==0 || arsd>=oarsd) { |
| 285 | 252 | idsrr = nxtsrr - its; | |
| 286 | } else { | ||
| 287 | 1570 | idsrr = (PetscInt)PetscFloorReal(alpha+beta*(itrsdold[eps->nconv]-itrsd[eps->nconv])*PetscLogReal(arsd/eps->tol)/PetscLogReal(arsd/oarsd)); | |
| 288 | 1570 | idsrr = PetscMax(1,idsrr); | |
| 289 | } | ||
| 290 | 1822 | nxtsrr = PetscMin(nxtsrr,its+idsrr); | |
| 291 | |||
| 292 | /* Compute nxtort (iteration of next orthogonalization step) */ | ||
| 293 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1822 | PetscCall(DSCond(eps->ds,&tcond)); |
| 294 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
|
1822 | idort = PetscMax(1,(PetscInt)PetscFloorReal(orttol/PetscMax(1,PetscLog10Real(tcond)))); |
| 295 | 1822 | nxtort = PetscMin(its+idort,nxtsrr); | |
| 296 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1822 | PetscCall(PetscInfo(eps,"Updated iteration counts: nxtort=%" PetscInt_FMT ", nxtsrr=%" PetscInt_FMT "\n",nxtort,nxtsrr)); |
| 297 | |||
| 298 | /* V(:,idx) = AV(:,idx) */ | ||
| 299 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1822 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
| 300 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1822 | PetscCall(BVSetActiveColumns(AV,eps->nconv,nv)); |
| 301 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1822 | PetscCall(BVCopy(AV,eps->V)); |
| 302 | 1822 | its++; | |
| 303 | |||
| 304 | /* Orthogonalization loop */ | ||
| 305 | 19472 | do { | |
| 306 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
19472 | PetscCall(BVGetMatrix(eps->V,&B,&indef)); |
| 307 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
19472 | PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE)); |
| 308 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
54181 | while (its<nxtort) { |
| 309 | /* A(:,idx) = OP*V(:,idx) with normalization */ | ||
| 310 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
34709 | PetscCall(BVMatMult(eps->V,S,AV)); |
| 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.
|
34709 | PetscCall(BVCopy(AV,eps->V)); |
| 312 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
34709 | PetscCall(BVNormalize(eps->V,NULL)); |
| 313 | 34709 | its++; | |
| 314 | } | ||
| 315 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
19472 | PetscCall(BVSetMatrix(eps->V,B,indef)); |
| 316 | /* Orthonormalize vectors */ | ||
| 317 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
19472 | PetscCall(BVOrthogonalize(eps->V,NULL)); |
| 318 | 19472 | nxtort = PetscMin(its+idort,nxtsrr); | |
| 319 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
19472 | } while (its<nxtsrr); |
| 320 | |||
| 321 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
1822 | if (eps->stop==EPS_STOP_THRESHOLD && nv/(PetscReal)eps->nconv<1.3) { /* reallocate */ |
| 322 | ✗ | eps->ncv = 1.3*eps->nconv; | |
| 323 | ✗ | PetscCall(EPSReallocateSolution(eps,eps->ncv)); | |
| 324 | ✗ | PetscCall(BVResize(AV,eps->ncv,PETSC_TRUE)); | |
| 325 | ✗ | PetscCall(BVResize(R,eps->ncv,PETSC_TRUE)); | |
| 326 | ✗ | for (i=nv;i<eps->ncv;i++) eps->perm[i] = i; | |
| 327 |
2/8✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
|
2044 | PetscCall(DSReallocate(eps->ds,eps->ncv)); |
| 328 | } | ||
| 329 | |||
| 330 | } | ||
| 331 | |||
| 332 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(PetscFree6(rsd,orsd,oeigr,oeigi,itrsd,itrsdold)); |
| 333 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(BVDestroy(&AV)); |
| 334 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(BVDestroy(&R)); |
| 335 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(STRestoreOperator(eps->st,&S)); |
| 336 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
222 | PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE)); |
| 337 |
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.
|
42 | PetscFunctionReturn(PETSC_SUCCESS); |
| 338 | } | ||
| 339 | |||
| 340 | 202 | static PetscErrorCode EPSDestroy_Subspace(EPS eps) | |
| 341 | { | ||
| 342 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
202 | PetscFunctionBegin; |
| 343 |
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.
|
202 | PetscCall(PetscFree(eps->data)); |
| 344 |
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.
|
38 | PetscFunctionReturn(PETSC_SUCCESS); |
| 345 | } | ||
| 346 | |||
| 347 | /*MC | ||
| 348 | EPSSUBSPACE - EPSSUBSPACE = "subspace" - The simple subspace iteration method. | ||
| 349 | |||
| 350 | Notes: | ||
| 351 | This solver is very basic and is not recommended in general, since it | ||
| 352 | will not be competitive with respect to other solvers. | ||
| 353 | |||
| 354 | The implemented method is subspace iteration with Rayleigh-Ritz projection and | ||
| 355 | locking, based on the SRRIT code {cite:p}`Bai97`. | ||
| 356 | |||
| 357 | Level: beginner | ||
| 358 | |||
| 359 | .seealso: [](ch:eps), `EPS`, `EPSType`, `EPSSetType()` | ||
| 360 | M*/ | ||
| 361 | 202 | SLEPC_EXTERN PetscErrorCode EPSCreate_Subspace(EPS eps) | |
| 362 | { | ||
| 363 | 202 | EPS_SUBSPACE *ctx; | |
| 364 | |||
| 365 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
202 | PetscFunctionBegin; |
| 366 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
202 | PetscCall(PetscNew(&ctx)); |
| 367 | 202 | eps->data = (void*)ctx; | |
| 368 | |||
| 369 | 202 | eps->useds = PETSC_TRUE; | |
| 370 | 202 | eps->categ = EPS_CATEGORY_OTHER; | |
| 371 | |||
| 372 | 202 | eps->ops->solve = EPSSolve_Subspace; | |
| 373 | 202 | eps->ops->setup = EPSSetUp_Subspace; | |
| 374 | 202 | eps->ops->setupsort = EPSSetUpSort_Subspace; | |
| 375 | 202 | eps->ops->destroy = EPSDestroy_Subspace; | |
| 376 | 202 | eps->ops->backtransform = EPSBackTransform_Default; | |
| 377 | 202 | eps->ops->computevectors = EPSComputeVectors_Schur; | |
| 378 |
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.
|
202 | PetscFunctionReturn(PETSC_SUCCESS); |
| 379 | } | ||
| 380 |