| 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 the LAPACK eigenvalue subroutines. | ||
| 12 | Generalized problems are transformed to standard ones only if necessary. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <slepc/private/epsimpl.h> | ||
| 16 | |||
| 17 | 270 | static PetscErrorCode EPSSetUp_LAPACK(EPS eps) | |
| 18 | { | ||
| 19 | 270 | int ierra,ierrb; | |
| 20 | 270 | PetscBool isshift,flg,denseok=PETSC_FALSE; | |
| 21 | 270 | Mat A,B,OP,shell,Ar,Br,Adense=NULL,Bdense=NULL,Ads,Bds; | |
| 22 | 270 | PetscScalar shift; | |
| 23 | 270 | PetscInt nmat; | |
| 24 | 270 | KSP ksp; | |
| 25 | 270 | PC pc; | |
| 26 | |||
| 27 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
270 | PetscFunctionBegin; |
| 28 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
270 | EPSCheckNotStructured(eps); |
| 29 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
270 | if (eps->nev==0) eps->nev = 1; |
| 30 | 270 | eps->ncv = eps->n; | |
| 31 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
270 | if (eps->mpd!=PETSC_DETERMINE) PetscCall(PetscInfo(eps,"Warning: parameter mpd ignored\n")); |
| 32 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
270 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = 1; |
| 33 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
270 | if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps)); |
| 34 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
270 | PetscCheck(eps->which!=EPS_ALL || eps->inta==eps->intb,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver does not support interval computation"); |
| 35 |
8/18✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 8 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
270 | EPSCheckUnsupported(eps,EPS_FEATURE_BALANCE | EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION); |
| 36 |
10/24✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
270 | EPSCheckIgnored(eps,EPS_FEATURE_EXTRACTION | EPS_FEATURE_CONVERGENCE | EPS_FEATURE_STOPPING); |
| 37 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(EPSAllocateSolution(eps,0)); |
| 38 | |||
| 39 | /* attempt to get dense representations of A and B separately */ | ||
| 40 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSHIFT,&isshift)); |
| 41 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
270 | if (isshift) { |
| 42 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
260 | PetscCall(STGetNumMatrices(eps->st,&nmat)); |
| 43 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
260 | PetscCall(STGetMatrix(eps->st,0,&A)); |
| 44 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
260 | PetscCall(MatHasOperation(A,MATOP_CREATE_SUBMATRICES,&flg)); |
| 45 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
260 | if (flg) { |
| 46 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
230 | PetscCall(PetscPushErrorHandler(PetscReturnErrorHandler,NULL)); |
| 47 | 230 | ierra = MatCreateRedundantMatrix(A,0,PETSC_COMM_SELF,MAT_INITIAL_MATRIX,&Ar); | |
| 48 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
230 | if (!ierra) ierra |= MatConvert(Ar,MATSEQDENSE,MAT_INITIAL_MATRIX,&Adense); |
| 49 | 230 | ierra |= MatDestroy(&Ar); | |
| 50 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
230 | PetscCall(PetscPopErrorHandler()); |
| 51 | } else ierra = 1; | ||
| 52 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
260 | if (nmat>1) { |
| 53 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(STGetMatrix(eps->st,1,&B)); |
| 54 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(MatHasOperation(B,MATOP_CREATE_SUBMATRICES,&flg)); |
| 55 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (flg) { |
| 56 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscPushErrorHandler(PetscReturnErrorHandler,NULL)); |
| 57 | 10 | ierrb = MatCreateRedundantMatrix(B,0,PETSC_COMM_SELF,MAT_INITIAL_MATRIX,&Br); | |
| 58 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (!ierrb) ierrb |= MatConvert(Br,MATSEQDENSE,MAT_INITIAL_MATRIX,&Bdense); |
| 59 | 10 | ierrb |= MatDestroy(&Br); | |
| 60 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscPopErrorHandler()); |
| 61 | } else ierrb = 1; | ||
| 62 | } else ierrb = 0; | ||
| 63 | 260 | denseok = PetscNot(ierra || ierrb); | |
| 64 | } | ||
| 65 | |||
| 66 | /* setup DS */ | ||
| 67 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
260 | if (denseok) { |
| 68 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
230 | if (eps->isgeneralized) { |
| 69 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (eps->ishermitian) { |
| 70 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
10 | if (eps->ispositive) PetscCall(DSSetType(eps->ds,DSGHEP)); |
| 71 | ✗ | else PetscCall(DSSetType(eps->ds,DSGNHEP)); /* TODO: should be DSGHIEP */ | |
| 72 | ✗ | } else PetscCall(DSSetType(eps->ds,DSGNHEP)); | |
| 73 | } else { | ||
| 74 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
220 | if (eps->ishermitian) PetscCall(DSSetType(eps->ds,DSHEP)); |
| 75 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | else PetscCall(DSSetType(eps->ds,DSNHEP)); |
| 76 | } | ||
| 77 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | } else PetscCall(DSSetType(eps->ds,DSNHEP)); |
| 78 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(DSAllocate(eps->ds,eps->ncv)); |
| 79 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(DSSetDimensions(eps->ds,eps->ncv,0,0)); |
| 80 | |||
| 81 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
270 | if (denseok) { |
| 82 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
230 | PetscCall(STGetShift(eps->st,&shift)); |
| 83 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
230 | if (shift != 0.0) { |
| 84 | ✗ | if (nmat>1) PetscCall(MatAXPY(Adense,-shift,Bdense,SAME_NONZERO_PATTERN)); | |
| 85 | ✗ | else PetscCall(MatShift(Adense,-shift)); | |
| 86 | } | ||
| 87 | /* use dummy pc and ksp to avoid problems when B is not positive definite */ | ||
| 88 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
230 | PetscCall(STGetKSP(eps->st,&ksp)); |
| 89 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
230 | PetscCall(KSPSetType(ksp,KSPPREONLY)); |
| 90 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
230 | PetscCall(KSPGetPC(ksp,&pc)); |
| 91 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
230 | PetscCall(PCSetType(pc,PCNONE)); |
| 92 | } else { | ||
| 93 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(PetscInfo(eps,"Using slow explicit operator\n")); |
| 94 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(STGetOperator(eps->st,&shell)); |
| 95 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(MatComputeOperator(shell,MATDENSE,&OP)); |
| 96 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(STRestoreOperator(eps->st,&shell)); |
| 97 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(MatDestroy(&Adense)); |
| 98 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(MatCreateRedundantMatrix(OP,0,PETSC_COMM_SELF,MAT_INITIAL_MATRIX,&Adense)); |
| 99 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
40 | PetscCall(MatDestroy(&OP)); |
| 100 | } | ||
| 101 | |||
| 102 | /* fill DS matrices */ | ||
| 103 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(DSGetMat(eps->ds,DS_MAT_A,&Ads)); |
| 104 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(MatCopy(Adense,Ads,SAME_NONZERO_PATTERN)); |
| 105 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&Ads)); |
| 106 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
270 | if (denseok && eps->isgeneralized) { |
| 107 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(DSGetMat(eps->ds,DS_MAT_B,&Bds)); |
| 108 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(MatCopy(Bdense,Bds,SAME_NONZERO_PATTERN)); |
| 109 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_B,&Bds)); |
| 110 | } | ||
| 111 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(DSSetState(eps->ds,DS_STATE_RAW)); |
| 112 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(MatDestroy(&Adense)); |
| 113 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(MatDestroy(&Bdense)); |
| 114 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
54 | PetscFunctionReturn(PETSC_SUCCESS); |
| 115 | } | ||
| 116 | |||
| 117 | 270 | static PetscErrorCode EPSSolve_LAPACK(EPS eps) | |
| 118 | { | ||
| 119 | 270 | PetscInt n=eps->n,i,low,high; | |
| 120 | 270 | PetscScalar *array,*pX,*pY; | |
| 121 | 270 | Vec v,w; | |
| 122 | |||
| 123 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
270 | PetscFunctionBegin; |
| 124 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
| 125 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
| 126 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
| 127 | |||
| 128 | /* right eigenvectors */ | ||
| 129 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL)); |
| 130 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(DSGetArray(eps->ds,DS_MAT_X,&pX)); |
| 131 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
29600 | for (i=0;i<eps->ncv;i++) { |
| 132 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
29330 | PetscCall(BVGetColumn(eps->V,i,&v)); |
| 133 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
29330 | PetscCall(VecGetOwnershipRange(v,&low,&high)); |
| 134 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
29330 | PetscCall(VecGetArray(v,&array)); |
| 135 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
29330 | PetscCall(PetscArraycpy(array,pX+i*n+low,high-low)); |
| 136 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
29330 | PetscCall(VecRestoreArray(v,&array)); |
| 137 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
29330 | PetscCall(BVRestoreColumn(eps->V,i,&v)); |
| 138 | } | ||
| 139 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
270 | PetscCall(DSRestoreArray(eps->ds,DS_MAT_X,&pX)); |
| 140 | |||
| 141 | /* left eigenvectors */ | ||
| 142 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
270 | if (eps->twosided) { |
| 143 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(DSVectors(eps->ds,DS_MAT_Y,NULL,NULL)); |
| 144 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(DSGetArray(eps->ds,DS_MAT_Y,&pY)); |
| 145 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1010 | for (i=0;i<eps->ncv;i++) { |
| 146 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1000 | PetscCall(BVGetColumn(eps->W,i,&w)); |
| 147 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1000 | PetscCall(VecGetOwnershipRange(w,&low,&high)); |
| 148 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1000 | PetscCall(VecGetArray(w,&array)); |
| 149 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1000 | PetscCall(PetscArraycpy(array,pY+i*n+low,high-low)); |
| 150 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1000 | PetscCall(VecRestoreArray(w,&array)); |
| 151 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1000 | PetscCall(BVRestoreColumn(eps->W,i,&w)); |
| 152 | } | ||
| 153 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(DSRestoreArray(eps->ds,DS_MAT_Y,&pY)); |
| 154 | } | ||
| 155 | |||
| 156 | 270 | eps->nconv = eps->ncv; | |
| 157 | 270 | eps->its = 1; | |
| 158 | 270 | eps->reason = EPS_CONVERGED_TOL; | |
| 159 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
270 | PetscFunctionReturn(PETSC_SUCCESS); |
| 160 | } | ||
| 161 | |||
| 162 | /*MC | ||
| 163 | EPSLAPACK - EPSLAPACK = "lapack" - A wrapper to LAPACK eigensolvers. | ||
| 164 | |||
| 165 | Notes: | ||
| 166 | This is not really a full-featured eigensolver but simply an interface to | ||
| 167 | some LAPACK routines {cite:p}`And99`. These routines operate sequentially | ||
| 168 | in dense mode and therefore are suitable only for small size problems. | ||
| 169 | This solver should be used only for debugging purposes. | ||
| 170 | |||
| 171 | The LAPACK routine is not called directly, instead a `DS` object of | ||
| 172 | the appropriate type is set up. | ||
| 173 | |||
| 174 | Level: beginner | ||
| 175 | |||
| 176 | .seealso: [](ch:eps), `EPS`, `EPSType`, `EPSSetType()`, `DS` | ||
| 177 | M*/ | ||
| 178 | 160 | SLEPC_EXTERN PetscErrorCode EPSCreate_LAPACK(EPS eps) | |
| 179 | { | ||
| 180 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
160 | PetscFunctionBegin; |
| 181 | 160 | eps->useds = PETSC_TRUE; | |
| 182 | 160 | eps->categ = EPS_CATEGORY_OTHER; | |
| 183 | |||
| 184 | 160 | eps->ops->solve = EPSSolve_LAPACK; | |
| 185 | 160 | eps->ops->setup = EPSSetUp_LAPACK; | |
| 186 | 160 | eps->ops->setupsort = EPSSetUpSort_Default; | |
| 187 | 160 | eps->ops->backtransform = EPSBackTransform_Default; | |
| 188 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
160 | PetscFunctionReturn(PETSC_SUCCESS); |
| 189 | } | ||
| 190 |