GCC Code Coverage Report


Directory: ./
File: src/eps/impls/lapack/lapack.c
Date: 2025-11-19 04:19:03
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 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