GCC Code Coverage Report


Directory: ./
File: src/eps/impls/lapack/lapack.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 116 120 96.7%
Functions: 3 3 100.0%
Branches: 318 530 60.0%

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 216 static PetscErrorCode EPSSetUp_LAPACK(EPS eps)
18 {
19 216 int ierra,ierrb;
20 216 PetscBool isshift,flg,denseok=PETSC_FALSE;
21 216 Mat A,B,OP,shell,Ar,Br,Adense=NULL,Bdense=NULL,Ads,Bds;
22 216 PetscScalar shift;
23 216 PetscInt nmat;
24 216 KSP ksp;
25 216 PC pc;
26
27
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
216 PetscFunctionBegin;
28
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
216 EPSCheckNotStructured(eps);
29
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
216 if (eps->nev==0) eps->nev = 1;
30 216 eps->ncv = eps->n;
31
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 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.
216 if (eps->mpd!=PETSC_DETERMINE) PetscCall(PetscInfo(eps,"Warning: parameter mpd ignored\n"));
32
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
216 if (eps->max_it==PETSC_DETERMINE) eps->max_it = 1;
33
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
216 if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps));
34
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
216 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 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 6 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 6 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.
216 EPSCheckUnsupported(eps,EPS_FEATURE_BALANCE | EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION);
36
10/24
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 8 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.
216 EPSCheckIgnored(eps,EPS_FEATURE_EXTRACTION | EPS_FEATURE_CONVERGENCE | EPS_FEATURE_STOPPING);
37
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSHIFT,&isshift));
41
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
216 if (isshift) {
42
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
208 PetscCall(STGetNumMatrices(eps->st,&nmat));
43
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
208 PetscCall(STGetMatrix(eps->st,0,&A));
44
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
208 PetscCall(MatHasOperation(A,MATOP_CREATE_SUBMATRICES,&flg));
45
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
208 if (flg) {
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PetscPushErrorHandler(PetscReturnErrorHandler,NULL));
47 184 ierra = MatCreateRedundantMatrix(A,0,PETSC_COMM_SELF,MAT_INITIAL_MATRIX,&Ar);
48
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
184 if (!ierra) ierra |= MatConvert(Ar,MATSEQDENSE,MAT_INITIAL_MATRIX,&Adense);
49 184 ierra |= MatDestroy(&Ar);
50
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PetscPopErrorHandler());
51 } else ierra = 1;
52
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
208 if (nmat>1) {
53
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(STGetMatrix(eps->st,1,&B));
54
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(MatHasOperation(B,MATOP_CREATE_SUBMATRICES,&flg));
55
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 if (flg) {
56
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscPushErrorHandler(PetscReturnErrorHandler,NULL));
57 8 ierrb = MatCreateRedundantMatrix(B,0,PETSC_COMM_SELF,MAT_INITIAL_MATRIX,&Br);
58
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 if (!ierrb) ierrb |= MatConvert(Br,MATSEQDENSE,MAT_INITIAL_MATRIX,&Bdense);
59 8 ierrb |= MatDestroy(&Br);
60
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscPopErrorHandler());
61 } else ierrb = 1;
62 } else ierrb = 0;
63 208 denseok = PetscNot(ierra || ierrb);
64 }
65
66 /* setup DS */
67
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
208 if (denseok) {
68
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
184 if (eps->isgeneralized) {
69
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 if (eps->ishermitian) {
70
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
8 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 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
176 if (eps->ishermitian) PetscCall(DSSetType(eps->ds,DSHEP));
75
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 else PetscCall(DSSetType(eps->ds,DSNHEP));
76 }
77
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 } else PetscCall(DSSetType(eps->ds,DSNHEP));
78
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSAllocate(eps->ds,eps->ncv));
79
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSSetDimensions(eps->ds,eps->ncv,0,0));
80
81
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
216 if (denseok) {
82
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(STGetShift(eps->st,&shift));
83
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
184 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(STGetKSP(eps->st,&ksp));
89
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(KSPSetType(ksp,KSPPREONLY));
90
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(KSPGetPC(ksp,&pc));
91
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PCSetType(pc,PCNONE));
92 } else {
93
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(PetscInfo(eps,"Using slow explicit operator\n"));
94
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(STGetOperator(eps->st,&shell));
95
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(MatComputeOperator(shell,MATDENSE,&OP));
96
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(STRestoreOperator(eps->st,&shell));
97
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(MatDestroy(&Adense));
98
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(MatCreateRedundantMatrix(OP,0,PETSC_COMM_SELF,MAT_INITIAL_MATRIX,&Adense));
99
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(MatDestroy(&OP));
100 }
101
102 /* fill DS matrices */
103
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSGetMat(eps->ds,DS_MAT_A,&Ads));
104
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(MatCopy(Adense,Ads,SAME_NONZERO_PATTERN));
105
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&Ads));
106
4/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
216 if (denseok && eps->isgeneralized) {
107
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(DSGetMat(eps->ds,DS_MAT_B,&Bds));
108
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(MatCopy(Bdense,Bds,SAME_NONZERO_PATTERN));
109
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(DSRestoreMat(eps->ds,DS_MAT_B,&Bds));
110 }
111
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSSetState(eps->ds,DS_STATE_RAW));
112
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(MatDestroy(&Adense));
113
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 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 216 static PetscErrorCode EPSSolve_LAPACK(EPS eps)
118 {
119 216 PetscInt n=eps->n,i,low,high;
120 216 PetscScalar *array,*pX,*pY;
121 216 Vec v,w;
122
123
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
216 PetscFunctionBegin;
124
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
125
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
126
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
127
128 /* right eigenvectors */
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL));
130
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSGetArray(eps->ds,DS_MAT_X,&pX));
131
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
23680 for (i=0;i<eps->ncv;i++) {
132
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
23464 PetscCall(BVGetColumn(eps->V,i,&v));
133
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
23464 PetscCall(VecGetOwnershipRange(v,&low,&high));
134
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
23464 PetscCall(VecGetArray(v,&array));
135
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
23464 PetscCall(PetscArraycpy(array,pX+i*n+low,high-low));
136
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
23464 PetscCall(VecRestoreArray(v,&array));
137
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
23464 PetscCall(BVRestoreColumn(eps->V,i,&v));
138 }
139
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSRestoreArray(eps->ds,DS_MAT_X,&pX));
140
141 /* left eigenvectors */
142
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
216 if (eps->twosided) {
143
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(DSVectors(eps->ds,DS_MAT_Y,NULL,NULL));
144
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(DSGetArray(eps->ds,DS_MAT_Y,&pY));
145
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
808 for (i=0;i<eps->ncv;i++) {
146
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
800 PetscCall(BVGetColumn(eps->W,i,&w));
147
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
800 PetscCall(VecGetOwnershipRange(w,&low,&high));
148
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
800 PetscCall(VecGetArray(w,&array));
149
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
800 PetscCall(PetscArraycpy(array,pY+i*n+low,high-low));
150
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
800 PetscCall(VecRestoreArray(w,&array));
151
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
800 PetscCall(BVRestoreColumn(eps->W,i,&w));
152 }
153
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(DSRestoreArray(eps->ds,DS_MAT_Y,&pY));
154 }
155
156 216 eps->nconv = eps->ncv;
157 216 eps->its = 1;
158 216 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.
216 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 128 SLEPC_EXTERN PetscErrorCode EPSCreate_LAPACK(EPS eps)
179 {
180
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
128 PetscFunctionBegin;
181 128 eps->useds = PETSC_TRUE;
182 128 eps->categ = EPS_CATEGORY_OTHER;
183
184 128 eps->ops->solve = EPSSolve_LAPACK;
185 128 eps->ops->setup = EPSSetUp_LAPACK;
186 128 eps->ops->setupsort = EPSSetUpSort_Default;
187 128 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.
128 PetscFunctionReturn(PETSC_SUCCESS);
189 }
190