| 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 | This file implements a wrapper to eigensolvers in EVSL. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/ | ||
| 15 | #include <evsl.h> | ||
| 16 | |||
| 17 | #define PetscCallEVSL(func, ...) do { \ | ||
| 18 | PetscStackPushExternal(PetscStringize(func)); \ | ||
| 19 | int evsl_ierr_ = func(__VA_ARGS__); \ | ||
| 20 | PetscStackPop; \ | ||
| 21 | PetscCheck(!evsl_ierr_,PETSC_COMM_SELF,PETSC_ERR_LIB,"Error calling %s: error code %d",PetscStringize(func(__VA_ARGS__)),evsl_ierr_); \ | ||
| 22 | } while (0) | ||
| 23 | |||
| 24 | typedef struct { | ||
| 25 | PetscBool initialized; | ||
| 26 | Mat A; /* problem matrix */ | ||
| 27 | Vec x,y; /* auxiliary vectors */ | ||
| 28 | PetscReal *sli; /* slice bounds */ | ||
| 29 | PetscInt nev; /* approximate number of wanted eigenvalues in each slice */ | ||
| 30 | PetscLayout map; /* used to distribute slices among MPI processes */ | ||
| 31 | PetscBool estimrange; /* the filter range was not set by the user */ | ||
| 32 | /* user parameters */ | ||
| 33 | PetscInt nslices; /* number of slices */ | ||
| 34 | PetscReal lmin,lmax; /* numerical range (min and max eigenvalue) */ | ||
| 35 | EPSEVSLDOSMethod dos; /* DOS method, either KPM or Lanczos */ | ||
| 36 | PetscInt nvec; /* number of sample vectors used for DOS */ | ||
| 37 | PetscInt deg; /* polynomial degree used for DOS (KPM only) */ | ||
| 38 | PetscInt steps; /* number of Lanczos steps used for DOS (Lanczos only) */ | ||
| 39 | PetscInt npoints; /* number of sample points used for DOS (Lanczos only) */ | ||
| 40 | PetscInt max_deg; /* maximum degree allowed for the polynomial */ | ||
| 41 | PetscReal thresh; /* threshold for accepting polynomial */ | ||
| 42 | EPSEVSLDamping damping; /* type of damping (for polynomial and for DOS-KPM) */ | ||
| 43 | } EPS_EVSL; | ||
| 44 | |||
| 45 | 1499626 | static void AMatvec_EVSL(double *xa,double *ya,void *data) | |
| 46 | { | ||
| 47 | 1499626 | EPS_EVSL *ctx = (EPS_EVSL*)data; | |
| 48 | 1499626 | Vec x = ctx->x,y = ctx->y; | |
| 49 | 1499626 | Mat A = ctx->A; | |
| 50 | |||
| 51 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1499626 | PetscFunctionBegin; |
| 52 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1499626 | PetscCallAbort(PetscObjectComm((PetscObject)A),VecPlaceArray(x,(PetscScalar*)xa)); |
| 53 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1499626 | PetscCallAbort(PetscObjectComm((PetscObject)A),VecPlaceArray(y,(PetscScalar*)ya)); |
| 54 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1499626 | PetscCallAbort(PetscObjectComm((PetscObject)A),MatMult(A,x,y)); |
| 55 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1499626 | PetscCallAbort(PetscObjectComm((PetscObject)A),VecResetArray(x)); |
| 56 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
1499626 | PetscCallAbort(PetscObjectComm((PetscObject)A),VecResetArray(y)); |
| 57 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
1499626 | PetscFunctionReturnVoid(); |
| 58 | } | ||
| 59 | |||
| 60 | 45 | static PetscErrorCode EPSSetUp_EVSL(EPS eps) | |
| 61 | { | ||
| 62 | 45 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 63 | 45 | PetscMPIInt size,rank; | |
| 64 | 45 | PetscBool isshift; | |
| 65 | 45 | PetscScalar *vinit; | |
| 66 | 45 | PetscReal *mu,ecount,xintv[4],*xdos,*ydos; | |
| 67 | 45 | Vec v0; | |
| 68 | 45 | Mat A; | |
| 69 | 45 | PetscRandom rnd; | |
| 70 | |||
| 71 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
45 | PetscFunctionBegin; |
| 72 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
45 | EPSCheckStandard(eps); |
| 73 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
45 | EPSCheckHermitian(eps); |
| 74 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
45 | EPSCheckNotStructured(eps); |
| 75 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
45 | if (eps->nev==0) eps->nev = 1; |
| 76 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSHIFT,&isshift)); |
| 77 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
45 | PetscCheck(isshift,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver does not support spectral transformations"); |
| 78 | |||
| 79 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
45 | if (ctx->initialized) EVSLFinish(); |
| 80 | 45 | EVSLStart(); | |
| 81 | 45 | ctx->initialized=PETSC_TRUE; | |
| 82 | |||
| 83 | /* get number of slices per process */ | ||
| 84 |
14/28✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
45 | PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)eps),&size)); |
| 85 |
14/28✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
45 | PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)eps),&rank)); |
| 86 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
45 | if (!ctx->nslices) ctx->nslices = size; |
| 87 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(PetscLayoutDestroy(&ctx->map)); |
| 88 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(PetscLayoutCreateFromSizes(PetscObjectComm((PetscObject)eps),PETSC_DECIDE,ctx->nslices,1,&ctx->map)); |
| 89 | |||
| 90 | /* get matrix and prepare auxiliary vectors */ | ||
| 91 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(MatDestroy(&ctx->A)); |
| 92 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(STGetMatrix(eps->st,0,&A)); |
| 93 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
45 | if (size==1) { |
| 94 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
21 | PetscCall(PetscObjectReference((PetscObject)A)); |
| 95 | 21 | ctx->A = A; | |
| 96 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
24 | } else PetscCall(MatCreateRedundantMatrix(A,0,PETSC_COMM_SELF,MAT_INITIAL_MATRIX,&ctx->A)); |
| 97 | 45 | SetAMatvec(eps->n,&AMatvec_EVSL,(void*)ctx); | |
| 98 |
6/8✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
45 | if (!ctx->x) PetscCall(MatCreateVecsEmpty(ctx->A,&ctx->x,&ctx->y)); |
| 99 |
8/18✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
45 | EPSCheckUnsupported(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_STOPPING); |
| 100 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
45 | EPSCheckIgnored(eps,EPS_FEATURE_EXTRACTION | EPS_FEATURE_CONVERGENCE); |
| 101 | |||
| 102 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
45 | if (!eps->which) eps->which=EPS_ALL; |
| 103 |
2/6✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
45 | PetscCheck(eps->which==EPS_ALL && eps->inta!=eps->intb,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver requires setting an interval with EPSSetInterval()"); |
| 104 | |||
| 105 | /* estimate numerical range */ | ||
| 106 |
5/6✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
|
45 | if (ctx->estimrange || ctx->lmin == PETSC_MIN_REAL || ctx->lmax == PETSC_MAX_REAL) { |
| 107 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
42 | PetscCall(MatCreateVecs(ctx->A,&v0,NULL)); |
| 108 |
6/8✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
42 | if (!eps->V) PetscCall(EPSGetBV(eps,&eps->V)); |
| 109 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
42 | PetscCall(BVGetRandomContext(eps->V,&rnd)); |
| 110 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
42 | PetscCall(VecSetRandom(v0,rnd)); |
| 111 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
42 | PetscCall(VecGetArray(v0,&vinit)); |
| 112 |
12/24✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
42 | PetscCallEVSL(LanTrbounds,50,200,eps->tol,vinit,1,&ctx->lmin,&ctx->lmax,NULL); |
| 113 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
42 | PetscCall(VecRestoreArray(v0,&vinit)); |
| 114 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
42 | PetscCall(VecDestroy(&v0)); |
| 115 | 42 | ctx->estimrange = PETSC_TRUE; /* estimate if called again with another matrix */ | |
| 116 | } | ||
| 117 |
2/6✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
45 | PetscCheck(ctx->lmin<=eps->inta && ctx->lmax>=eps->intb,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The requested interval [%g,%g] must be contained in the numerical range [%g,%g]",(double)eps->inta,(double)eps->intb,(double)ctx->lmin,(double)ctx->lmax); |
| 118 | 45 | xintv[0] = eps->inta; | |
| 119 | 45 | xintv[1] = eps->intb; | |
| 120 | 45 | xintv[2] = ctx->lmin; | |
| 121 | 45 | xintv[3] = ctx->lmax; | |
| 122 | |||
| 123 | /* estimate number of eigenvalues in the interval */ | ||
| 124 |
2/3✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
45 | switch (ctx->dos) { |
| 125 | 27 | case EPS_EVSL_DOS_KPM: | |
| 126 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscMalloc1(ctx->deg+1,&mu)); |
| 127 |
14/26✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
|
27 | if (!rank) PetscCallEVSL(kpmdos,ctx->deg,(int)ctx->damping,ctx->nvec,xintv,mu,&ecount); |
| 128 |
15/30✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
54 | PetscCallMPI(MPI_Bcast(mu,ctx->deg+1,MPIU_REAL,0,PetscObjectComm((PetscObject)eps))); |
| 129 | break; | ||
| 130 | 18 | case EPS_EVSL_DOS_LANCZOS: | |
| 131 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
18 | PetscCall(PetscMalloc2(ctx->npoints,&xdos,ctx->npoints,&ydos)); |
| 132 |
14/26✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
|
18 | if (!rank) PetscCallEVSL(LanDos,ctx->nvec,PetscMin(ctx->steps,eps->n/2),ctx->npoints,xdos,ydos,&ecount,xintv); |
| 133 |
15/30✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
36 | PetscCallMPI(MPI_Bcast(xdos,ctx->npoints,MPIU_REAL,0,PetscObjectComm((PetscObject)eps))); |
| 134 |
15/30✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
36 | PetscCallMPI(MPI_Bcast(ydos,ctx->npoints,MPIU_REAL,0,PetscObjectComm((PetscObject)eps))); |
| 135 | break; | ||
| 136 | ✗ | default: | |
| 137 | ✗ | SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid DOS method"); | |
| 138 | } | ||
| 139 |
15/30✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
90 | PetscCallMPI(MPI_Bcast(&ecount,1,MPIU_REAL,0,PetscObjectComm((PetscObject)eps))); |
| 140 | |||
| 141 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(PetscInfo(eps,"Estimated eigenvalue count in the interval: %g\n",ecount)); |
| 142 | 45 | eps->ncv = (PetscInt)PetscCeilReal(1.5*ecount); | |
| 143 | |||
| 144 | /* slice the spectrum */ | ||
| 145 |
5/8✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
45 | PetscCall(PetscFree(ctx->sli)); |
| 146 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(PetscMalloc1(ctx->nslices+1,&ctx->sli)); |
| 147 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
45 | if (ctx->dos == EPS_EVSL_DOS_KPM) { |
| 148 |
12/24✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
27 | PetscCallEVSL(spslicer,ctx->sli,mu,ctx->deg,xintv,ctx->nslices,10*(PetscInt)ecount); |
| 149 |
5/8✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
27 | PetscCall(PetscFree(mu)); |
| 150 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
18 | } else if (ctx->dos == EPS_EVSL_DOS_LANCZOS) { |
| 151 | 18 | spslicer2(xdos,ydos,ctx->nslices,ctx->npoints,ctx->sli); | |
| 152 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
18 | PetscCall(PetscFree2(xdos,ydos)); |
| 153 | } | ||
| 154 | |||
| 155 | /* approximate number of eigenvalues wanted in each slice */ | ||
| 156 | 45 | ctx->nev = (PetscInt)(1.0 + ecount/(PetscReal)ctx->nslices) + 2; | |
| 157 | |||
| 158 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 3 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.
|
45 | if (eps->mpd!=PETSC_DETERMINE) PetscCall(PetscInfo(eps,"Warning: parameter mpd ignored\n")); |
| 159 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
45 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = 1; |
| 160 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(EPSAllocateSolution(eps,0)); |
| 161 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
15 | PetscFunctionReturn(PETSC_SUCCESS); |
| 162 | } | ||
| 163 | |||
| 164 | 45 | static PetscErrorCode EPSSolve_EVSL(EPS eps) | |
| 165 | { | ||
| 166 | 45 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 167 | 45 | PetscInt i,j,k=0,sl,mlan,nevout,*ind,nevmax,rstart,rend,*nevloc,*disp,N; | |
| 168 | 45 | PetscReal *res,xintv[4],*errest; | |
| 169 | 45 | PetscScalar *lam,*X,*Y,*vinit,*eigr; | |
| 170 | 45 | PetscMPIInt size,rank; | |
| 171 | 45 | PetscRandom rnd; | |
| 172 | 45 | Vec v,w,v0,x; | |
| 173 | 45 | VecScatter vs; | |
| 174 | 45 | IS is; | |
| 175 | 45 | polparams pol; | |
| 176 | |||
| 177 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
45 | PetscFunctionBegin; |
| 178 |
14/28✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
45 | PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)eps),&size)); |
| 179 |
14/28✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
|
45 | PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)eps),&rank)); |
| 180 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(PetscLayoutGetRange(ctx->map,&rstart,&rend)); |
| 181 | 45 | nevmax = (rend-rstart)*ctx->nev; | |
| 182 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(MatCreateVecs(ctx->A,&v0,NULL)); |
| 183 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(BVGetRandomContext(eps->V,&rnd)); |
| 184 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(VecSetRandom(v0,rnd)); |
| 185 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(VecGetArray(v0,&vinit)); |
| 186 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(PetscMalloc5(size,&nevloc,size+1,&disp,nevmax,&eigr,nevmax,&errest,nevmax*eps->n,&X)); |
| 187 | 45 | mlan = PetscMin(PetscMax(5*ctx->nev,300),eps->n); | |
| 188 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
111 | for (sl=rstart; sl<rend; sl++) { |
| 189 | 66 | xintv[0] = ctx->sli[sl]; | |
| 190 | 66 | xintv[1] = ctx->sli[sl+1]; | |
| 191 | 66 | xintv[2] = ctx->lmin; | |
| 192 | 66 | xintv[3] = ctx->lmax; | |
| 193 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
66 | PetscCall(PetscInfo(ctx->A,"Subinterval %" PetscInt_FMT ": [%.4e, %.4e]\n",sl+1,xintv[0],xintv[1])); |
| 194 | 66 | set_pol_def(&pol); | |
| 195 | 66 | pol.max_deg = ctx->max_deg; | |
| 196 | 66 | pol.damping = (int)ctx->damping; | |
| 197 | 66 | pol.thresh_int = ctx->thresh; | |
| 198 | 66 | find_pol(xintv,&pol); | |
| 199 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
66 | PetscCall(PetscInfo(ctx->A,"Polynomial [type = %" PetscInt_FMT "], deg %" PetscInt_FMT ", bar %e gam %e\n",pol.type,pol.deg,pol.bar,pol.gam)); |
| 200 |
12/24✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
66 | PetscCallEVSL(ChebLanNr,xintv,mlan,eps->tol,vinit,&pol,&nevout,&lam,&Y,&res,NULL); |
| 201 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
66 | PetscCheck(k+nevout<=nevmax,PetscObjectComm((PetscObject)eps),PETSC_ERR_LIB,"Too low estimation of eigenvalue count, try modifying the sampling parameters"); |
| 202 | 66 | free_pol(&pol); | |
| 203 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
66 | PetscCall(PetscInfo(ctx->A,"Computed %" PetscInt_FMT " eigenvalues\n",nevout)); |
| 204 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
66 | PetscCall(PetscMalloc1(nevout,&ind)); |
| 205 | 66 | sort_double(nevout,lam,ind); | |
| 206 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
510 | for (i=0;i<nevout;i++) { |
| 207 | 378 | eigr[i+k] = lam[i]; | |
| 208 | 378 | errest[i+k] = res[ind[i]]; | |
| 209 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
378 | PetscCall(PetscArraycpy(X+(i+k)*eps->n,Y+ind[i]*eps->n,eps->n)); |
| 210 | } | ||
| 211 | 66 | k += nevout; | |
| 212 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
66 | if (lam) evsl_Free(lam); |
| 213 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
66 | if (Y) evsl_Free_device(Y); |
| 214 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
66 | if (res) evsl_Free(res); |
| 215 |
5/8✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
66 | PetscCall(PetscFree(ind)); |
| 216 | } | ||
| 217 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(VecRestoreArray(v0,&vinit)); |
| 218 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(VecDestroy(&v0)); |
| 219 | |||
| 220 | /* gather eigenvalues computed by each MPI process */ | ||
| 221 |
15/30✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
90 | PetscCallMPI(MPI_Allgather(&k,1,MPIU_INT,nevloc,1,MPIU_INT,PetscObjectComm((PetscObject)eps))); |
| 222 | 45 | eps->nev = nevloc[0]; | |
| 223 | 45 | disp[0] = 0; | |
| 224 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
69 | for (i=1;i<size;i++) { |
| 225 | 24 | eps->nev += nevloc[i]; | |
| 226 | 24 | disp[i] = disp[i-1]+nevloc[i-1]; | |
| 227 | } | ||
| 228 | 45 | disp[size] = disp[size-1]+nevloc[size-1]; | |
| 229 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
45 | PetscCheck(eps->nev<=eps->ncv,PetscObjectComm((PetscObject)eps),PETSC_ERR_LIB,"Too low estimation of eigenvalue count, try modifying the sampling parameters"); |
| 230 |
15/30✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
90 | PetscCallMPI(MPI_Allgatherv(eigr,k,MPIU_SCALAR,eps->eigr,nevloc,disp,MPIU_SCALAR,PetscObjectComm((PetscObject)eps))); |
| 231 |
15/30✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
|
90 | PetscCallMPI(MPI_Allgatherv(errest,k,MPIU_REAL,eps->errest,nevloc,disp,MPIU_REAL,PetscObjectComm((PetscObject)eps))); |
| 232 | 45 | eps->nconv = eps->nev; | |
| 233 | 45 | eps->its = 1; | |
| 234 | 45 | eps->reason = EPS_CONVERGED_TOL; | |
| 235 | |||
| 236 | /* scatter computed eigenvectors and store them in eps->V */ | ||
| 237 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(BVCreateVec(eps->V,&w)); |
| 238 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
114 | for (i=0;i<size;i++) { |
| 239 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
69 | N = (rank==i)? eps->n: 0; |
| 240 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
69 | PetscCall(VecCreateSeq(PETSC_COMM_SELF,N,&x)); |
| 241 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
69 | PetscCall(VecSetFromOptions(x)); |
| 242 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
69 | PetscCall(ISCreateStride(PETSC_COMM_SELF,N,0,1,&is)); |
| 243 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
69 | PetscCall(VecScatterCreate(x,is,w,is,&vs)); |
| 244 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
69 | PetscCall(ISDestroy(&is)); |
| 245 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
528 | for (j=disp[i];j<disp[i+1];j++) { |
| 246 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
459 | PetscCall(BVGetColumn(eps->V,j,&v)); |
| 247 |
6/8✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
459 | if (rank==i) PetscCall(VecPlaceArray(x,X+(j-disp[i])*eps->n)); |
| 248 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
459 | PetscCall(VecScatterBegin(vs,x,v,INSERT_VALUES,SCATTER_FORWARD)); |
| 249 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
459 | PetscCall(VecScatterEnd(vs,x,v,INSERT_VALUES,SCATTER_FORWARD)); |
| 250 |
6/8✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
459 | if (rank==i) PetscCall(VecResetArray(x)); |
| 251 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
459 | PetscCall(BVRestoreColumn(eps->V,j,&v)); |
| 252 | } | ||
| 253 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
69 | PetscCall(VecScatterDestroy(&vs)); |
| 254 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
69 | PetscCall(VecDestroy(&x)); |
| 255 | } | ||
| 256 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(VecDestroy(&w)); |
| 257 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
45 | PetscCall(PetscFree5(nevloc,disp,eigr,errest,X)); |
| 258 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
15 | PetscFunctionReturn(PETSC_SUCCESS); |
| 259 | } | ||
| 260 | |||
| 261 | 6 | static PetscErrorCode EPSEVSLSetSlices_EVSL(EPS eps,PetscInt nslices) | |
| 262 | { | ||
| 263 | 6 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 264 | |||
| 265 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
6 | PetscFunctionBegin; |
| 266 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
6 | if (nslices == PETSC_DECIDE || nslices == PETSC_DEFAULT) nslices = 0; |
| 267 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
6 | else PetscCheck(nslices>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Number of slices must be 1 at least"); |
| 268 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
6 | if (ctx->nslices != nslices) { |
| 269 | 6 | ctx->nslices = nslices; | |
| 270 | 6 | eps->state = EPS_STATE_INITIAL; | |
| 271 | } | ||
| 272 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
2 | PetscFunctionReturn(PETSC_SUCCESS); |
| 273 | } | ||
| 274 | |||
| 275 | /*@ | ||
| 276 | EPSEVSLSetSlices - Set the number of slices in which the interval must be | ||
| 277 | subdivided. | ||
| 278 | |||
| 279 | Logically Collective | ||
| 280 | |||
| 281 | Input Parameters: | ||
| 282 | + eps - the linear eigensolver context | ||
| 283 | - nslices - the number of slices | ||
| 284 | |||
| 285 | Options Database Key: | ||
| 286 | . -eps_evsl_slices \<nslices\> - set the number of slices | ||
| 287 | |||
| 288 | Notes: | ||
| 289 | By default, one slice per MPI process is used. Depending on the number of | ||
| 290 | eigenvalues, using more slices may be beneficial, but very narrow subintervals | ||
| 291 | imply higher polynomial degree. | ||
| 292 | |||
| 293 | See the documentation of EVSL {cite:p}`Li19` for details. | ||
| 294 | |||
| 295 | Level: advanced | ||
| 296 | |||
| 297 | .seealso: [](ch:eps), `EPSEVSL`, `EPSEVSLGetSlices()` | ||
| 298 | @*/ | ||
| 299 | 6 | PetscErrorCode EPSEVSLSetSlices(EPS eps,PetscInt nslices) | |
| 300 | { | ||
| 301 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
6 | PetscFunctionBegin; |
| 302 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
6 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 303 |
27/62✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
6 | PetscValidLogicalCollectiveInt(eps,nslices,2); |
| 304 |
8/14✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
6 | PetscTryMethod(eps,"EPSEVSLSetSlices_C",(EPS,PetscInt),(eps,nslices)); |
| 305 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
6 | PetscFunctionReturn(PETSC_SUCCESS); |
| 306 | } | ||
| 307 | |||
| 308 | 3 | static PetscErrorCode EPSEVSLGetSlices_EVSL(EPS eps,PetscInt *nslices) | |
| 309 | { | ||
| 310 | 3 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 311 | |||
| 312 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | PetscFunctionBegin; |
| 313 | 3 | *nslices = ctx->nslices; | |
| 314 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
3 | PetscFunctionReturn(PETSC_SUCCESS); |
| 315 | } | ||
| 316 | |||
| 317 | /*@ | ||
| 318 | EPSEVSLGetSlices - Gets the number of slices in which the interval must be | ||
| 319 | subdivided. | ||
| 320 | |||
| 321 | Not Collective | ||
| 322 | |||
| 323 | Input Parameter: | ||
| 324 | . eps - the linear eigensolver context | ||
| 325 | |||
| 326 | Output Parameter: | ||
| 327 | . nslices - the number of slices | ||
| 328 | |||
| 329 | Level: advanced | ||
| 330 | |||
| 331 | .seealso: [](ch:eps), `EPSEVSL`, `EPSEVSLSetSlices()` | ||
| 332 | @*/ | ||
| 333 | 3 | PetscErrorCode EPSEVSLGetSlices(EPS eps,PetscInt *nslices) | |
| 334 | { | ||
| 335 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | PetscFunctionBegin; |
| 336 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
3 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 337 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
3 | PetscAssertPointer(nslices,2); |
| 338 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
3 | PetscUseMethod(eps,"EPSEVSLGetSlices_C",(EPS,PetscInt*),(eps,nslices)); |
| 339 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
3 | PetscFunctionReturn(PETSC_SUCCESS); |
| 340 | } | ||
| 341 | |||
| 342 | 3 | static PetscErrorCode EPSEVSLSetRange_EVSL(EPS eps,PetscReal lmin,PetscReal lmax) | |
| 343 | { | ||
| 344 | 3 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 345 | |||
| 346 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | PetscFunctionBegin; |
| 347 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3 | PetscCheck(lmin<lmax,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"Badly defined interval, must be lmin<lmax"); |
| 348 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3 | if (ctx->lmin != lmin || ctx->lmax != lmax) { |
| 349 | 3 | ctx->lmin = lmin; | |
| 350 | 3 | ctx->lmax = lmax; | |
| 351 | 3 | eps->state = EPS_STATE_INITIAL; | |
| 352 | } | ||
| 353 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
1 | PetscFunctionReturn(PETSC_SUCCESS); |
| 354 | } | ||
| 355 | |||
| 356 | /*@ | ||
| 357 | EPSEVSLSetRange - Defines the numerical range (or field of values) of the problem, | ||
| 358 | that is, the interval containing all eigenvalues. | ||
| 359 | |||
| 360 | Logically Collective | ||
| 361 | |||
| 362 | Input Parameters: | ||
| 363 | + eps - the linear eigensolver context | ||
| 364 | . lmin - left end of the interval | ||
| 365 | - lmax - right end of the interval | ||
| 366 | |||
| 367 | Options Database Key: | ||
| 368 | . -eps_evsl_range <lmin,lmax> - set $[\lambda_\mathrm{min},\lambda_\mathrm{max}]$ as the numerical range | ||
| 369 | |||
| 370 | Notes: | ||
| 371 | The filter will be most effective if the numerical range is tight, that is, `lmin` | ||
| 372 | and `lmax` are good approximations to the leftmost and rightmost eigenvalues, | ||
| 373 | respectively. If not set by the user, an approximation is computed internally. | ||
| 374 | |||
| 375 | The wanted computational interval specified via `EPSSetInterval()` must be | ||
| 376 | contained in the numerical range. | ||
| 377 | |||
| 378 | See the documentation of EVSL {cite:p}`Li19` for details. | ||
| 379 | |||
| 380 | Level: advanced | ||
| 381 | |||
| 382 | .seealso: [](ch:eps), `EPSEVSL`, `EPSEVSLGetRange()`, `EPSSetInterval()` | ||
| 383 | @*/ | ||
| 384 | 3 | PetscErrorCode EPSEVSLSetRange(EPS eps,PetscReal lmin,PetscReal lmax) | |
| 385 | { | ||
| 386 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | PetscFunctionBegin; |
| 387 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
3 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 388 |
29/66✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 1 times.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 times.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
|
3 | PetscValidLogicalCollectiveReal(eps,lmin,2); |
| 389 |
29/66✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 1 times.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 times.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
|
3 | PetscValidLogicalCollectiveReal(eps,lmax,3); |
| 390 |
8/14✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
3 | PetscTryMethod(eps,"EPSEVSLSetRange_C",(EPS,PetscReal,PetscReal),(eps,lmin,lmax)); |
| 391 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
3 | PetscFunctionReturn(PETSC_SUCCESS); |
| 392 | } | ||
| 393 | |||
| 394 | 3 | static PetscErrorCode EPSEVSLGetRange_EVSL(EPS eps,PetscReal *lmin,PetscReal *lmax) | |
| 395 | { | ||
| 396 | 3 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 397 | |||
| 398 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | PetscFunctionBegin; |
| 399 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | if (lmin) *lmin = ctx->lmin; |
| 400 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | if (lmax) *lmax = ctx->lmax; |
| 401 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
3 | PetscFunctionReturn(PETSC_SUCCESS); |
| 402 | } | ||
| 403 | |||
| 404 | /*@ | ||
| 405 | EPSEVSLGetRange - Gets the interval containing all eigenvalues. | ||
| 406 | |||
| 407 | Not Collective | ||
| 408 | |||
| 409 | Input Parameter: | ||
| 410 | . eps - the linear eigensolver context | ||
| 411 | |||
| 412 | Output Parameters: | ||
| 413 | + lmin - left end of the interval | ||
| 414 | - lmax - right end of the interval | ||
| 415 | |||
| 416 | Level: advanced | ||
| 417 | |||
| 418 | .seealso: [](ch:eps), `EPSEVSL`, `EPSEVSLSetRange()` | ||
| 419 | @*/ | ||
| 420 | 3 | PetscErrorCode EPSEVSLGetRange(EPS eps,PetscReal *lmin,PetscReal *lmax) | |
| 421 | { | ||
| 422 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | PetscFunctionBegin; |
| 423 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
3 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 424 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
3 | PetscUseMethod(eps,"EPSEVSLGetRange_C",(EPS,PetscReal*,PetscReal*),(eps,lmin,lmax)); |
| 425 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
3 | PetscFunctionReturn(PETSC_SUCCESS); |
| 426 | } | ||
| 427 | |||
| 428 | 12 | static PetscErrorCode EPSEVSLSetDOSParameters_EVSL(EPS eps,EPSEVSLDOSMethod dos,PetscInt nvec,PetscInt deg,PetscInt steps,PetscInt npoints) | |
| 429 | { | ||
| 430 | 12 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 431 | |||
| 432 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
12 | PetscFunctionBegin; |
| 433 | 12 | ctx->dos = dos; | |
| 434 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
12 | if (nvec == PETSC_DETERMINE) ctx->nvec = 80; |
| 435 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
12 | else if (nvec != PETSC_CURRENT) { |
| 436 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
12 | PetscCheck(nvec>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The nvec argument must be > 0"); |
| 437 | 12 | ctx->nvec = nvec; | |
| 438 | } | ||
| 439 |
2/3✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
12 | switch (dos) { |
| 440 | 3 | case EPS_EVSL_DOS_KPM: | |
| 441 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
3 | if (deg == PETSC_DETERMINE) ctx->deg = 300; |
| 442 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | else if (deg != PETSC_CURRENT) { |
| 443 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3 | PetscCheck(deg>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The deg argument must be > 0"); |
| 444 | 3 | ctx->deg = deg; | |
| 445 | } | ||
| 446 | break; | ||
| 447 | 9 | case EPS_EVSL_DOS_LANCZOS: | |
| 448 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
9 | if (steps == PETSC_DETERMINE) ctx->steps = 40; |
| 449 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
9 | else if (steps != PETSC_CURRENT) { |
| 450 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
9 | PetscCheck(steps>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The steps argument must be > 0"); |
| 451 | 9 | ctx->steps = steps; | |
| 452 | } | ||
| 453 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
9 | if (npoints == PETSC_DETERMINE) ctx->npoints = 200; |
| 454 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
9 | else if (npoints != PETSC_CURRENT) { |
| 455 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
9 | PetscCheck(npoints>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The npoints argument must be > 0"); |
| 456 | 9 | ctx->npoints = npoints; | |
| 457 | } | ||
| 458 | break; | ||
| 459 | } | ||
| 460 | 12 | eps->state = EPS_STATE_INITIAL; | |
| 461 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
12 | PetscFunctionReturn(PETSC_SUCCESS); |
| 462 | } | ||
| 463 | |||
| 464 | /*@ | ||
| 465 | EPSEVSLSetDOSParameters - Defines the parameters used for computing the | ||
| 466 | density of states (DOS) in the EVSL solver. | ||
| 467 | |||
| 468 | Logically Collective | ||
| 469 | |||
| 470 | Input Parameters: | ||
| 471 | + eps - the linear eigensolver context | ||
| 472 | . dos - DOS method, see `EPSEVSLDOSMethod` for possible values | ||
| 473 | . nvec - number of sample vectors | ||
| 474 | . deg - polynomial degree (KPM only) | ||
| 475 | . steps - number of Lanczos steps (Lanczos only) | ||
| 476 | - npoints - number of sample points (Lanczos only) | ||
| 477 | |||
| 478 | Options Database Keys: | ||
| 479 | + -eps_evsl_dos_method \<dos\> - set the DOS method, either `kpm` or `lanczos` | ||
| 480 | . -eps_evsl_dos_nvec \<nvec\> - set the number of sample vectors | ||
| 481 | . -eps_evsl_dos_degree \<deg\> - set the polynomial degree | ||
| 482 | . -eps_evsl_dos_steps \<steps\> - set the number of Lanczos steps | ||
| 483 | - -eps_evsl_dos_npoints \<npoints\> - set the number of sample points | ||
| 484 | |||
| 485 | Notes: | ||
| 486 | The density of states (or spectral density) can be approximated with two | ||
| 487 | methods, Kernel Polynomial Method (KPM) or Lanczos. Some parameters for | ||
| 488 | these methods can be set by the user with this function, with some of | ||
| 489 | them being relevant for one of the methods only. | ||
| 490 | |||
| 491 | For the integer argumens, you can use `PETSC_CURRENT` to keep the current | ||
| 492 | value, and `PETSC_DETERMINE` to set them to a reasonable default. | ||
| 493 | |||
| 494 | See the documentation of EVSL {cite:p}`Li19` for details. | ||
| 495 | |||
| 496 | Level: advanced | ||
| 497 | |||
| 498 | .seealso: [](ch:eps), `EPSEVSL`, `EPSEVSLGetDOSParameters()`, `EPSEVSLDOSMethod` | ||
| 499 | @*/ | ||
| 500 | 12 | PetscErrorCode EPSEVSLSetDOSParameters(EPS eps,EPSEVSLDOSMethod dos,PetscInt nvec,PetscInt deg,PetscInt steps,PetscInt npoints) | |
| 501 | { | ||
| 502 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
12 | PetscFunctionBegin; |
| 503 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
12 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 504 |
27/62✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
12 | PetscValidLogicalCollectiveEnum(eps,dos,2); |
| 505 |
27/62✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
12 | PetscValidLogicalCollectiveInt(eps,nvec,3); |
| 506 |
27/62✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
12 | PetscValidLogicalCollectiveInt(eps,deg,4); |
| 507 |
27/62✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
12 | PetscValidLogicalCollectiveInt(eps,steps,5); |
| 508 |
27/62✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
12 | PetscValidLogicalCollectiveInt(eps,npoints,6); |
| 509 |
8/14✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
12 | PetscTryMethod(eps,"EPSEVSLSetDOSParameters_C",(EPS,EPSEVSLDOSMethod,PetscInt,PetscInt,PetscInt,PetscInt),(eps,dos,nvec,deg,steps,npoints)); |
| 510 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
12 | PetscFunctionReturn(PETSC_SUCCESS); |
| 511 | } | ||
| 512 | |||
| 513 | 27 | static PetscErrorCode EPSEVSLGetDOSParameters_EVSL(EPS eps,EPSEVSLDOSMethod *dos,PetscInt *nvec,PetscInt *deg,PetscInt *steps,PetscInt *npoints) | |
| 514 | { | ||
| 515 | 27 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 516 | |||
| 517 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
27 | PetscFunctionBegin; |
| 518 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
27 | if (dos) *dos = ctx->dos; |
| 519 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
27 | if (nvec) *nvec = ctx->nvec; |
| 520 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
27 | if (deg) *deg = ctx->deg; |
| 521 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
27 | if (steps) *steps = ctx->steps; |
| 522 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
27 | if (npoints) *npoints = ctx->npoints; |
| 523 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
27 | PetscFunctionReturn(PETSC_SUCCESS); |
| 524 | } | ||
| 525 | |||
| 526 | /*@ | ||
| 527 | EPSEVSLGetDOSParameters - Gets the parameters used for computing the | ||
| 528 | density of states (DOS) in the EVSL solver. | ||
| 529 | |||
| 530 | Not Collective | ||
| 531 | |||
| 532 | Input Parameter: | ||
| 533 | . eps - the linear eigensolver context | ||
| 534 | |||
| 535 | Output Parameters: | ||
| 536 | + dos - DOS method | ||
| 537 | . nvec - number of sample vectors | ||
| 538 | . deg - polynomial degree (KPM only) | ||
| 539 | . steps - number of Lanczos steps (Lanczos only) | ||
| 540 | - npoints - number of sample points (Lanczos only) | ||
| 541 | |||
| 542 | Level: advanced | ||
| 543 | |||
| 544 | .seealso: [](ch:eps), `EPSEVSL`, `EPSEVSLSetDOSParameters()` | ||
| 545 | @*/ | ||
| 546 | 27 | PetscErrorCode EPSEVSLGetDOSParameters(EPS eps,EPSEVSLDOSMethod *dos,PetscInt *nvec,PetscInt *deg,PetscInt *steps,PetscInt *npoints) | |
| 547 | { | ||
| 548 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
27 | PetscFunctionBegin; |
| 549 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
27 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 550 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
27 | PetscUseMethod(eps,"EPSEVSLGetDOSParameters_C",(EPS,EPSEVSLDOSMethod*,PetscInt*,PetscInt*,PetscInt*,PetscInt*),(eps,dos,nvec,deg,steps,npoints)); |
| 551 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
27 | PetscFunctionReturn(PETSC_SUCCESS); |
| 552 | } | ||
| 553 | |||
| 554 | 3 | static PetscErrorCode EPSEVSLSetPolParameters_EVSL(EPS eps,PetscInt max_deg,PetscReal thresh) | |
| 555 | { | ||
| 556 | 3 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 557 | |||
| 558 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | PetscFunctionBegin; |
| 559 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
3 | if (max_deg == PETSC_DETERMINE) ctx->max_deg = 10000; |
| 560 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | else if (max_deg != PETSC_CURRENT) { |
| 561 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3 | PetscCheck(max_deg>2,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The max_deg argument must be > 2"); |
| 562 | 3 | ctx->max_deg = max_deg; | |
| 563 | } | ||
| 564 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
3 | if (thresh == (PetscReal)PETSC_DETERMINE) ctx->thresh = 0.8; |
| 565 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | else if (thresh != (PetscReal)PETSC_CURRENT) { |
| 566 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
3 | PetscCheck(thresh>0.0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The thresh argument must be > 0.0"); |
| 567 | 3 | ctx->thresh = thresh; | |
| 568 | } | ||
| 569 | 3 | eps->state = EPS_STATE_INITIAL; | |
| 570 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
3 | PetscFunctionReturn(PETSC_SUCCESS); |
| 571 | } | ||
| 572 | |||
| 573 | /*@ | ||
| 574 | EPSEVSLSetPolParameters - Defines the parameters used for building the | ||
| 575 | building the polynomial in the EVSL solver. | ||
| 576 | |||
| 577 | Logically Collective | ||
| 578 | |||
| 579 | Input Parameters: | ||
| 580 | + eps - the linear eigensolver context | ||
| 581 | . max_deg - maximum degree allowed for the polynomial | ||
| 582 | - thresh - threshold for accepting a value | ||
| 583 | |||
| 584 | Options Database Keys: | ||
| 585 | + -eps_evsl_pol_max_deg \<max_deg\> - set maximum polynomial degree | ||
| 586 | - -eps_evsl_pol_thresh \<thresh\> - set the threshold | ||
| 587 | |||
| 588 | Notes: | ||
| 589 | `PETSC_CURRENT` can be used to preserve the current value of any of the | ||
| 590 | arguments, and `PETSC_DETERMINE` to set them to a default value. | ||
| 591 | |||
| 592 | See the documentation of EVSL {cite:p}`Li19` for details. | ||
| 593 | |||
| 594 | Level: advanced | ||
| 595 | |||
| 596 | .seealso: [](ch:eps), `EPSEVSL`, `EPSEVSLGetPolParameters()` | ||
| 597 | @*/ | ||
| 598 | 3 | PetscErrorCode EPSEVSLSetPolParameters(EPS eps,PetscInt max_deg,PetscReal thresh) | |
| 599 | { | ||
| 600 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | PetscFunctionBegin; |
| 601 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
3 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 602 |
27/62✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
3 | PetscValidLogicalCollectiveInt(eps,max_deg,2); |
| 603 |
29/66✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✓ Branch 26 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 1 times.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 1 times.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 times.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 1 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 1 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
|
3 | PetscValidLogicalCollectiveReal(eps,thresh,3); |
| 604 |
8/14✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
3 | PetscTryMethod(eps,"EPSEVSLSetPolParameters_C",(EPS,PetscInt,PetscReal),(eps,max_deg,thresh)); |
| 605 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
3 | PetscFunctionReturn(PETSC_SUCCESS); |
| 606 | } | ||
| 607 | |||
| 608 | 27 | static PetscErrorCode EPSEVSLGetPolParameters_EVSL(EPS eps,PetscInt *max_deg,PetscReal *thresh) | |
| 609 | { | ||
| 610 | 27 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 611 | |||
| 612 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
27 | PetscFunctionBegin; |
| 613 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
27 | if (max_deg) *max_deg = ctx->max_deg; |
| 614 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
27 | if (thresh) *thresh = ctx->thresh; |
| 615 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
27 | PetscFunctionReturn(PETSC_SUCCESS); |
| 616 | } | ||
| 617 | |||
| 618 | /*@ | ||
| 619 | EPSEVSLGetPolParameters - Gets the parameters used for building the | ||
| 620 | polynomial in the EVSL solver. | ||
| 621 | |||
| 622 | Not Collective | ||
| 623 | |||
| 624 | Input Parameter: | ||
| 625 | . eps - the linear eigensolver context | ||
| 626 | |||
| 627 | Output Parameters: | ||
| 628 | + max_deg - the maximum degree of the polynomial | ||
| 629 | - thresh - the threshold | ||
| 630 | |||
| 631 | Level: advanced | ||
| 632 | |||
| 633 | .seealso: [](ch:eps), `EPSEVSL`, `EPSEVSLSetPolParameters()` | ||
| 634 | @*/ | ||
| 635 | 27 | PetscErrorCode EPSEVSLGetPolParameters(EPS eps,PetscInt *max_deg,PetscReal *thresh) | |
| 636 | { | ||
| 637 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
27 | PetscFunctionBegin; |
| 638 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
27 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 639 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
27 | PetscUseMethod(eps,"EPSEVSLGetPolParameters_C",(EPS,PetscInt*,PetscReal*),(eps,max_deg,thresh)); |
| 640 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
27 | PetscFunctionReturn(PETSC_SUCCESS); |
| 641 | } | ||
| 642 | |||
| 643 | 6 | static PetscErrorCode EPSEVSLSetDamping_EVSL(EPS eps,EPSEVSLDamping damping) | |
| 644 | { | ||
| 645 | 6 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 646 | |||
| 647 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
6 | PetscFunctionBegin; |
| 648 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
|
6 | if (ctx->damping != damping) { |
| 649 | 3 | ctx->damping = damping; | |
| 650 | 3 | eps->state = EPS_STATE_INITIAL; | |
| 651 | } | ||
| 652 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
6 | PetscFunctionReturn(PETSC_SUCCESS); |
| 653 | } | ||
| 654 | |||
| 655 | /*@ | ||
| 656 | EPSEVSLSetDamping - Set the type of damping to be used in EVSL. | ||
| 657 | |||
| 658 | Logically Collective | ||
| 659 | |||
| 660 | Input Parameters: | ||
| 661 | + eps - the linear eigensolver context | ||
| 662 | - damping - the type of damping, see `EPSEVSLDamping` for possible values | ||
| 663 | |||
| 664 | Options Database Key: | ||
| 665 | . -eps_evsl_damping \<damping\> - set the type of damping | ||
| 666 | |||
| 667 | Notes: | ||
| 668 | Damping is applied when building the polynomial to be used when solving the | ||
| 669 | eigenproblem, and also during estimation of the DOS with the KPM method. | ||
| 670 | |||
| 671 | See the documentation of EVSL {cite:p}`Li19` for details. | ||
| 672 | |||
| 673 | Level: advanced | ||
| 674 | |||
| 675 | .seealso: [](ch:eps), `EPSEVSL`, `EPSEVSLGetDamping()`, `EPSEVSLSetDOSParameters()` | ||
| 676 | @*/ | ||
| 677 | 6 | PetscErrorCode EPSEVSLSetDamping(EPS eps,EPSEVSLDamping damping) | |
| 678 | { | ||
| 679 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
6 | PetscFunctionBegin; |
| 680 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
6 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 681 |
27/62✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✓ Branch 32 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 times.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1 times.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
|
6 | PetscValidLogicalCollectiveEnum(eps,damping,2); |
| 682 |
8/14✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
|
6 | PetscTryMethod(eps,"EPSEVSLSetDamping_C",(EPS,EPSEVSLDamping),(eps,damping)); |
| 683 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
6 | PetscFunctionReturn(PETSC_SUCCESS); |
| 684 | } | ||
| 685 | |||
| 686 | 3 | static PetscErrorCode EPSEVSLGetDamping_EVSL(EPS eps,EPSEVSLDamping *damping) | |
| 687 | { | ||
| 688 | 3 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 689 | |||
| 690 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | PetscFunctionBegin; |
| 691 | 3 | *damping = ctx->damping; | |
| 692 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
3 | PetscFunctionReturn(PETSC_SUCCESS); |
| 693 | } | ||
| 694 | |||
| 695 | /*@ | ||
| 696 | EPSEVSLGetDamping - Gets the type of damping. | ||
| 697 | |||
| 698 | Not Collective | ||
| 699 | |||
| 700 | Input Parameter: | ||
| 701 | . eps - the linear eigensolver context | ||
| 702 | |||
| 703 | Output Parameter: | ||
| 704 | . damping - the type of damping | ||
| 705 | |||
| 706 | Level: advanced | ||
| 707 | |||
| 708 | .seealso: [](ch:eps), `EPSEVSL`, `EPSEVSLSetDamping()` | ||
| 709 | @*/ | ||
| 710 | 3 | PetscErrorCode EPSEVSLGetDamping(EPS eps,EPSEVSLDamping *damping) | |
| 711 | { | ||
| 712 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | PetscFunctionBegin; |
| 713 |
3/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
3 | PetscValidHeaderSpecific(eps,EPS_CLASSID,1); |
| 714 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
3 | PetscAssertPointer(damping,2); |
| 715 |
9/16✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
|
3 | PetscUseMethod(eps,"EPSEVSLGetDamping_C",(EPS,EPSEVSLDamping*),(eps,damping)); |
| 716 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
3 | PetscFunctionReturn(PETSC_SUCCESS); |
| 717 | } | ||
| 718 | |||
| 719 | 3 | static PetscErrorCode EPSView_EVSL(EPS eps,PetscViewer viewer) | |
| 720 | { | ||
| 721 | 3 | PetscBool isascii; | |
| 722 | 3 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 723 | |||
| 724 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
3 | PetscFunctionBegin; |
| 725 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
3 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
| 726 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | if (isascii) { |
| 727 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
3 | PetscCall(PetscViewerASCIIPrintf(viewer," numerical range = [%g,%g]\n",(double)ctx->lmin,(double)ctx->lmax)); |
| 728 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
3 | PetscCall(PetscViewerASCIIPrintf(viewer," number of slices = %" PetscInt_FMT "\n",ctx->nslices)); |
| 729 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
3 | PetscCall(PetscViewerASCIIPrintf(viewer," type of damping = %s\n",EPSEVSLDampings[ctx->damping])); |
| 730 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
3 | PetscCall(PetscViewerASCIIPrintf(viewer," computing DOS with %s: nvec=%" PetscInt_FMT ", ",EPSEVSLDOSMethods[ctx->dos],ctx->nvec)); |
| 731 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
3 | PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE)); |
| 732 |
1/3✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
3 | switch (ctx->dos) { |
| 733 | 3 | case EPS_EVSL_DOS_KPM: | |
| 734 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
3 | PetscCall(PetscViewerASCIIPrintf(viewer,"degree=%" PetscInt_FMT "\n",ctx->deg)); |
| 735 | break; | ||
| 736 | ✗ | case EPS_EVSL_DOS_LANCZOS: | |
| 737 | ✗ | PetscCall(PetscViewerASCIIPrintf(viewer,"steps=%" PetscInt_FMT ", npoints=%" PetscInt_FMT "\n",ctx->steps,ctx->npoints)); | |
| 738 | break; | ||
| 739 | } | ||
| 740 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
3 | PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE)); |
| 741 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
3 | PetscCall(PetscViewerASCIIPrintf(viewer," polynomial parameters: max degree = %" PetscInt_FMT ", threshold = %g\n",ctx->max_deg,(double)ctx->thresh)); |
| 742 | } | ||
| 743 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
1 | PetscFunctionReturn(PETSC_SUCCESS); |
| 744 | } | ||
| 745 | |||
| 746 | 27 | static PetscErrorCode EPSSetFromOptions_EVSL(EPS eps,PetscOptionItems PetscOptionsObject) | |
| 747 | { | ||
| 748 | 27 | PetscReal array[2]={0,0},th; | |
| 749 | 27 | PetscInt k,i1,i2,i3,i4; | |
| 750 | 27 | PetscBool flg,flg1; | |
| 751 | 27 | EPSEVSLDOSMethod dos; | |
| 752 | 27 | EPSEVSLDamping damping; | |
| 753 | 27 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 754 | |||
| 755 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
27 | PetscFunctionBegin; |
| 756 |
1/12✗ Branch 0 not taken.
✓ Branch 1 taken 3 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
27 | PetscOptionsHeadBegin(PetscOptionsObject,"EPS EVSL Options"); |
| 757 | |||
| 758 | 27 | k = 2; | |
| 759 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscOptionsRealArray("-eps_evsl_range","Interval containing all eigenvalues (two real values separated with a comma without spaces)","EPSEVSLSetRange",array,&k,&flg)); |
| 760 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
27 | if (flg) { |
| 761 | ✗ | PetscCheck(k>1,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_SIZ,"Must pass two values in -eps_evsl_range (comma-separated without spaces)"); | |
| 762 | ✗ | PetscCall(EPSEVSLSetRange(eps,array[0],array[1])); | |
| 763 | } | ||
| 764 | |||
| 765 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscOptionsInt("-eps_evsl_slices","Number of slices","EPSEVSLSetSlices",ctx->nslices,&i1,&flg)); |
| 766 |
6/8✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
27 | if (flg) PetscCall(EPSEVSLSetSlices(eps,i1)); |
| 767 | |||
| 768 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscOptionsEnum("-eps_evsl_damping","Type of damping","EPSEVSLSetDamping",EPSEVSLDampings,(PetscEnum)ctx->damping,(PetscEnum*)&damping,&flg)); |
| 769 |
6/8✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
27 | if (flg) PetscCall(EPSEVSLSetDamping(eps,damping)); |
| 770 | |||
| 771 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(EPSEVSLGetDOSParameters(eps,&dos,&i1,&i2,&i3,&i4)); |
| 772 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscOptionsEnum("-eps_evsl_dos_method","Method to compute the DOS","EPSEVSLSetDOSParameters",EPSEVSLDOSMethods,(PetscEnum)ctx->dos,(PetscEnum*)&dos,&flg)); |
| 773 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscOptionsInt("-eps_evsl_dos_nvec","Number of sample vectors for DOS","EPSEVSLSetDOSParameters",i1,&i1,&flg1)); |
| 774 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
27 | if (flg1) flg = PETSC_TRUE; |
| 775 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscOptionsInt("-eps_evsl_dos_degree","Polynomial degree used for DOS","EPSEVSLSetDOSParameters",i2,&i2,&flg1)); |
| 776 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
27 | if (flg1) flg = PETSC_TRUE; |
| 777 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscOptionsInt("-eps_evsl_dos_steps","Number of Lanczos steps in DOS","EPSEVSLSetDOSParameters",i3,&i3,&flg1)); |
| 778 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
|
27 | if (flg1) flg = PETSC_TRUE; |
| 779 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscOptionsInt("-eps_evsl_dos_npoints","Number of sample points used for DOS","EPSEVSLSetDOSParameters",i4,&i4,&flg1)); |
| 780 |
7/10✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
|
27 | if (flg || flg1) PetscCall(EPSEVSLSetDOSParameters(eps,dos,i1,i2,i3,i4)); |
| 781 | |||
| 782 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(EPSEVSLGetPolParameters(eps,&i1,&th)); |
| 783 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscOptionsInt("-eps_evsl_pol_max_deg","Maximum degree allowed for the polynomial","EPSEVSLSetPolParameters",i1,&i1,&flg)); |
| 784 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscOptionsReal("-eps_evsl_pol_threshold","Threshold for accepting polynomial","EPSEVSLSetPolParameters",th,&th,&flg1)); |
| 785 |
2/10✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
27 | if (flg || flg1) PetscCall(EPSEVSLSetPolParameters(eps,i1,th)); |
| 786 | |||
| 787 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 1 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
27 | PetscOptionsHeadEnd(); |
| 788 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
9 | PetscFunctionReturn(PETSC_SUCCESS); |
| 789 | } | ||
| 790 | |||
| 791 | 27 | static PetscErrorCode EPSDestroy_EVSL(EPS eps) | |
| 792 | { | ||
| 793 | 27 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 794 | |||
| 795 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
27 | PetscFunctionBegin; |
| 796 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
27 | if (ctx->initialized) EVSLFinish(); |
| 797 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscLayoutDestroy(&ctx->map)); |
| 798 |
5/8✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
27 | PetscCall(PetscFree(ctx->sli)); |
| 799 |
5/8✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
|
27 | PetscCall(PetscFree(eps->data)); |
| 800 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLSetRange_C",NULL)); |
| 801 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLGetRange_C",NULL)); |
| 802 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLSetSlices_C",NULL)); |
| 803 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLGetSlices_C",NULL)); |
| 804 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLSetDOSParameters_C",NULL)); |
| 805 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLGetDOSParameters_C",NULL)); |
| 806 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLSetPolParameters_C",NULL)); |
| 807 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLGetPolParameters_C",NULL)); |
| 808 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLSetDamping_C",NULL)); |
| 809 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLGetDamping_C",NULL)); |
| 810 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
9 | PetscFunctionReturn(PETSC_SUCCESS); |
| 811 | } | ||
| 812 | |||
| 813 | 36 | static PetscErrorCode EPSReset_EVSL(EPS eps) | |
| 814 | { | ||
| 815 | 36 | EPS_EVSL *ctx = (EPS_EVSL*)eps->data; | |
| 816 | |||
| 817 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
36 | PetscFunctionBegin; |
| 818 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
36 | PetscCall(MatDestroy(&ctx->A)); |
| 819 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
36 | PetscCall(VecDestroy(&ctx->x)); |
| 820 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
36 | PetscCall(VecDestroy(&ctx->y)); |
| 821 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
12 | PetscFunctionReturn(PETSC_SUCCESS); |
| 822 | } | ||
| 823 | |||
| 824 | /*MC | ||
| 825 | EPSEVSL - EPSEVSL = "evsl" - A wrapper to EVSL {cite:p}`Li19`. | ||
| 826 | |||
| 827 | Note: | ||
| 828 | The Eigenvalues Slicing Library {EVSL} is intended for the case that | ||
| 829 | all eigenvalues inside a given interval are requested, for Hermitian | ||
| 830 | problems. It is based on polynomial filters, and has similarities with | ||
| 831 | the algorithms implemented in `STFILTER`. | ||
| 832 | |||
| 833 | Level: beginner | ||
| 834 | |||
| 835 | .seealso: [](ch:eps), `EPS`, `EPSType`, `EPSSetType()` | ||
| 836 | M*/ | ||
| 837 | 27 | SLEPC_EXTERN PetscErrorCode EPSCreate_EVSL(EPS eps) | |
| 838 | { | ||
| 839 | 27 | EPS_EVSL *ctx; | |
| 840 | |||
| 841 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
27 | PetscFunctionBegin; |
| 842 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscNew(&ctx)); |
| 843 | 27 | eps->data = (void*)ctx; | |
| 844 | |||
| 845 | 27 | ctx->nslices = 0; | |
| 846 | 27 | ctx->lmin = PETSC_MIN_REAL; | |
| 847 | 27 | ctx->lmax = PETSC_MAX_REAL; | |
| 848 | 27 | ctx->dos = EPS_EVSL_DOS_KPM; | |
| 849 | 27 | ctx->nvec = 80; | |
| 850 | 27 | ctx->deg = 300; | |
| 851 | 27 | ctx->steps = 40; | |
| 852 | 27 | ctx->npoints = 200; | |
| 853 | 27 | ctx->max_deg = 10000; | |
| 854 | 27 | ctx->thresh = 0.8; | |
| 855 | 27 | ctx->damping = EPS_EVSL_DAMPING_SIGMA; | |
| 856 | |||
| 857 | 27 | eps->categ = EPS_CATEGORY_OTHER; | |
| 858 | |||
| 859 | 27 | eps->ops->solve = EPSSolve_EVSL; | |
| 860 | 27 | eps->ops->setup = EPSSetUp_EVSL; | |
| 861 | 27 | eps->ops->setupsort = EPSSetUpSort_Basic; | |
| 862 | 27 | eps->ops->setfromoptions = EPSSetFromOptions_EVSL; | |
| 863 | 27 | eps->ops->destroy = EPSDestroy_EVSL; | |
| 864 | 27 | eps->ops->reset = EPSReset_EVSL; | |
| 865 | 27 | eps->ops->view = EPSView_EVSL; | |
| 866 | 27 | eps->ops->backtransform = EPSBackTransform_Default; | |
| 867 | 27 | eps->ops->setdefaultst = EPSSetDefaultST_NoFactor; | |
| 868 | |||
| 869 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLSetRange_C",EPSEVSLSetRange_EVSL)); |
| 870 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLGetRange_C",EPSEVSLGetRange_EVSL)); |
| 871 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLSetSlices_C",EPSEVSLSetSlices_EVSL)); |
| 872 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLGetSlices_C",EPSEVSLGetSlices_EVSL)); |
| 873 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLSetDOSParameters_C",EPSEVSLSetDOSParameters_EVSL)); |
| 874 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLGetDOSParameters_C",EPSEVSLGetDOSParameters_EVSL)); |
| 875 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLSetPolParameters_C",EPSEVSLSetPolParameters_EVSL)); |
| 876 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLGetPolParameters_C",EPSEVSLGetPolParameters_EVSL)); |
| 877 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLSetDamping_C",EPSEVSLSetDamping_EVSL)); |
| 878 |
4/6✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
|
27 | PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSEVSLGetDamping_C",EPSEVSLGetDamping_EVSL)); |
| 879 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
9 | PetscFunctionReturn(PETSC_SUCCESS); |
| 880 | } | ||
| 881 |