GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epssetup.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 383 387 99.0%
Functions: 18 18 100.0%
Branches: 1007 1855 54.3%

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 EPS routines related to problem setup
12 */
13
14 #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/
15
16 /*
17 Let the solver choose the ST type that should be used by default,
18 otherwise set it to SHIFT.
19 This is called at EPSSetFromOptions (before STSetFromOptions)
20 and also at EPSSetUp (in case EPSSetFromOptions was not called).
21 */
22 16359 PetscErrorCode EPSSetDefaultST(EPS eps)
23 {
24
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16359 PetscFunctionBegin;
25
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.
16359 PetscTryTypeMethod(eps,setdefaultst);
26
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.
16359 if (!((PetscObject)eps->st)->type_name) PetscCall(STSetType(eps->st,STSHIFT));
27
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.
3164 PetscFunctionReturn(PETSC_SUCCESS);
28 }
29
30 /*
31 This is done by preconditioned eigensolvers that use the PC only.
32 It sets STPRECOND with KSPPREONLY.
33 */
34 1048 PetscErrorCode EPSSetDefaultST_Precond(EPS eps)
35 {
36 1048 KSP ksp;
37
38
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1048 PetscFunctionBegin;
39
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.
1048 if (!((PetscObject)eps->st)->type_name) PetscCall(STSetType(eps->st,STPRECOND));
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.
1048 PetscCall(STGetKSP(eps->st,&ksp));
41
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.
1048 if (!((PetscObject)ksp)->type_name) PetscCall(KSPSetType(ksp,KSPPREONLY));
42
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.
208 PetscFunctionReturn(PETSC_SUCCESS);
43 }
44
45 /*
46 This is done by preconditioned eigensolvers that can also use the KSP.
47 It sets STPRECOND with the default KSP (GMRES) and maxit=5.
48 */
49 952 PetscErrorCode EPSSetDefaultST_GMRES(EPS eps)
50 {
51 952 KSP ksp;
52
53
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
952 PetscFunctionBegin;
54
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.
952 if (!((PetscObject)eps->st)->type_name) PetscCall(STSetType(eps->st,STPRECOND));
55
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.
952 PetscCall(STPrecondSetKSPHasMat(eps->st,PETSC_TRUE));
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.
952 PetscCall(STGetKSP(eps->st,&ksp));
57
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
952 if (!((PetscObject)ksp)->type_name) {
58
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.
391 PetscCall(KSPSetType(ksp,KSPGMRES));
59
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.
391 PetscCall(KSPSetTolerances(ksp,PETSC_CURRENT,PETSC_CURRENT,PETSC_CURRENT,5));
60 }
61
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);
62 }
63
64 #if defined(SLEPC_HAVE_SCALAPACK) || defined(SLEPC_HAVE_ELPA) || defined(SLEPC_HAVE_ELEMENTAL) || defined(SLEPC_HAVE_EVSL)
65 /*
66 This is for direct eigensolvers that work with A and B directly, so
67 no need to factorize B.
68 */
69 192 PetscErrorCode EPSSetDefaultST_NoFactor(EPS eps)
70 {
71 192 KSP ksp;
72 192 PC pc;
73
74
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
192 PetscFunctionBegin;
75
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
192 if (!((PetscObject)eps->st)->type_name) PetscCall(STSetType(eps->st,STSHIFT));
76
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
192 PetscCall(STGetKSP(eps->st,&ksp));
77
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
192 if (!((PetscObject)ksp)->type_name) PetscCall(KSPSetType(ksp,KSPPREONLY));
78
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
192 PetscCall(KSPGetPC(ksp,&pc));
79
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
192 if (!((PetscObject)pc)->type_name) PetscCall(PCSetType(pc,PCNONE));
80
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.
24 PetscFunctionReturn(PETSC_SUCCESS);
81 }
82 #endif
83
84 /*
85 Check that the ST selected by the user is compatible with the EPS solver and options
86 */
87 9742 static PetscErrorCode EPSCheckCompatibleST(EPS eps)
88 {
89 9742 PetscBool precond,shift,sinvert,cayley,lyapii;
90 #if defined(PETSC_USE_COMPLEX)
91 4670 PetscScalar sigma;
92 #endif
93
94
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9742 PetscFunctionBegin;
95
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9742 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STPRECOND,&precond));
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.
9742 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSHIFT,&shift));
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.
9742 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSINVERT,&sinvert));
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.
9742 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STCAYLEY,&cayley));
99
100 /* preconditioned eigensolvers */
101
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
9742 PetscCheck(eps->categ!=EPS_CATEGORY_PRECOND || precond,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver requires ST=PRECOND");
102
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
9742 PetscCheck(eps->categ==EPS_CATEGORY_PRECOND || !precond,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"STPRECOND is intended for preconditioned eigensolvers only");
103
104 /* harmonic extraction */
105
5/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
9742 PetscCheck(precond || shift || !eps->extraction || eps->extraction==EPS_RITZ,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Cannot use a spectral transformation combined with harmonic extraction");
106
107 /* real shifts in Hermitian problems */
108 #if defined(PETSC_USE_COMPLEX)
109
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4670 PetscCall(STGetShift(eps->st,&sigma));
110
3/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4670 PetscCheck(!eps->ishermitian || PetscImaginaryPart(sigma)==0.0,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Hermitian problems are not compatible with complex shifts");
111 #endif
112
113 /* Cayley with PGNHEP */
114
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
9742 PetscCheck(!cayley || eps->problem_type!=EPS_PGNHEP,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Cayley spectral transformation is not compatible with PGNHEP");
115
116 /* make sure that the user does not specify smallest magnitude with shift-and-invert */
117
6/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
9742 if ((cayley || sinvert) && (eps->categ==EPS_CATEGORY_KRYLOV || eps->categ==EPS_CATEGORY_OTHER)) {
118
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.
1292 PetscCall(PetscObjectTypeCompare((PetscObject)eps,EPSLYAPII,&lyapii));
119
10/14
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 10 times.
✓ Branch 9 taken 10 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1292 PetscCheck(lyapii || eps->which==EPS_TARGET_MAGNITUDE || eps->which==EPS_TARGET_REAL || eps->which==EPS_TARGET_IMAGINARY || eps->which==EPS_ALL || eps->which==EPS_WHICH_USER,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"Shift-and-invert requires a target 'which' (see EPSSetWhichEigenpairs), for instance -st_type sinvert -eps_target 0 -eps_target_magnitude");
120 }
121
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.
1874 PetscFunctionReturn(PETSC_SUCCESS);
122 }
123
124 /*
125 MatEstimateSpectralRange_EPS: estimate the spectral range [left,right] of a
126 symmetric/Hermitian matrix A using an auxiliary EPS object
127 */
128 146 PetscErrorCode MatEstimateSpectralRange_EPS(Mat A,PetscReal *left,PetscReal *right)
129 {
130 146 PetscInt nconv;
131 146 PetscScalar eig0;
132 146 PetscReal tol=1e-3,errest=tol;
133 146 EPS eps;
134
135
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
146 PetscFunctionBegin;
136 146 *left = 0.0; *right = 0.0;
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.
146 PetscCall(EPSCreate(PetscObjectComm((PetscObject)A),&eps));
138
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.
146 PetscCall(EPSSetOptionsPrefix(eps,"eps_filter_"));
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.
146 PetscCall(EPSSetOperators(eps,A,NULL));
140
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.
146 PetscCall(EPSSetProblemType(eps,EPS_HEP));
141
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.
146 PetscCall(EPSSetTolerances(eps,tol,50));
142
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.
146 PetscCall(EPSSetConvergenceTest(eps,EPS_CONV_ABS));
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.
146 PetscCall(EPSSetWhichEigenpairs(eps,EPS_SMALLEST_REAL));
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.
146 PetscCall(EPSSolve(eps));
145
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.
146 PetscCall(EPSGetConverged(eps,&nconv));
146
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
146 if (nconv>0) {
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.
146 PetscCall(EPSGetEigenvalue(eps,0,&eig0,NULL));
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.
146 PetscCall(EPSGetErrorEstimate(eps,0,&errest));
149 } else eig0 = eps->eigr[0];
150 146 *left = PetscRealPart(eig0)-errest;
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.
146 PetscCall(EPSSetWhichEigenpairs(eps,EPS_LARGEST_REAL));
152
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.
146 PetscCall(EPSSolve(eps));
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.
146 PetscCall(EPSGetConverged(eps,&nconv));
154
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
146 if (nconv>0) {
155
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.
146 PetscCall(EPSGetEigenvalue(eps,0,&eig0,NULL));
156
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.
146 PetscCall(EPSGetErrorEstimate(eps,0,&errest));
157 } else eig0 = eps->eigr[0];
158 146 *right = PetscRealPart(eig0)+errest;
159
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.
146 PetscCall(EPSDestroy(&eps));
160
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.
26 PetscFunctionReturn(PETSC_SUCCESS);
161 }
162
163 /*
164 EPSSetUpSort_Basic: configure the EPS sorting criterion according to 'which'
165 */
166 9137 PetscErrorCode EPSSetUpSort_Basic(EPS eps)
167 {
168
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9137 PetscFunctionBegin;
169
11/11
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
✓ Branch 8 taken 5 times.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 10 times.
9137 switch (eps->which) {
170 3760 case EPS_LARGEST_MAGNITUDE:
171 3760 eps->sc->comparison = SlepcCompareLargestMagnitude;
172 3760 eps->sc->comparisonctx = NULL;
173 3760 break;
174 322 case EPS_SMALLEST_MAGNITUDE:
175 322 eps->sc->comparison = SlepcCompareSmallestMagnitude;
176 322 eps->sc->comparisonctx = NULL;
177 322 break;
178 1185 case EPS_LARGEST_REAL:
179 1185 eps->sc->comparison = SlepcCompareLargestReal;
180 1185 eps->sc->comparisonctx = NULL;
181 1185 break;
182 1634 case EPS_SMALLEST_REAL:
183 1634 eps->sc->comparison = SlepcCompareSmallestReal;
184 1634 eps->sc->comparisonctx = NULL;
185 1634 break;
186 14 case EPS_LARGEST_IMAGINARY:
187 14 eps->sc->comparison = SlepcCompareLargestImaginary;
188 14 eps->sc->comparisonctx = NULL;
189 14 break;
190 10 case EPS_SMALLEST_IMAGINARY:
191 10 eps->sc->comparison = SlepcCompareSmallestImaginary;
192 10 eps->sc->comparisonctx = NULL;
193 10 break;
194 1257 case EPS_TARGET_MAGNITUDE:
195 1257 eps->sc->comparison = SlepcCompareTargetMagnitude;
196 1257 eps->sc->comparisonctx = &eps->target;
197 1257 break;
198 52 case EPS_TARGET_REAL:
199 52 eps->sc->comparison = SlepcCompareTargetReal;
200 52 eps->sc->comparisonctx = &eps->target;
201 52 break;
202 5 case EPS_TARGET_IMAGINARY:
203 5 eps->sc->comparison = SlepcCompareTargetImaginary;
204 5 eps->sc->comparisonctx = &eps->target;
205 5 break;
206 645 case EPS_ALL:
207 645 eps->sc->comparison = SlepcCompareSmallestReal;
208 645 eps->sc->comparisonctx = NULL;
209 645 break;
210 case EPS_WHICH_USER:
211 break;
212 }
213 9137 eps->sc->map = NULL;
214 9137 eps->sc->mapobj = NULL;
215
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.
9137 PetscFunctionReturn(PETSC_SUCCESS);
216 }
217
218 /*
219 EPSSetUpSort_Default: configure both EPS and DS sorting criterion
220 */
221 8883 PetscErrorCode EPSSetUpSort_Default(EPS eps)
222 {
223 8883 SlepcSC sc;
224 8883 PetscBool istrivial;
225
226
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8883 PetscFunctionBegin;
227 /* fill sorting criterion context */
228
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8883 PetscCall(EPSSetUpSort_Basic(eps));
229 /* fill sorting criterion for DS */
230
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8883 PetscCall(DSGetSlepcSC(eps->ds,&sc));
231
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.
8883 PetscCall(RGIsTrivial(eps->rg,&istrivial));
232
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8883 sc->rg = istrivial? NULL: eps->rg;
233 8883 sc->comparison = eps->sc->comparison;
234 8883 sc->comparisonctx = eps->sc->comparisonctx;
235 8883 sc->map = SlepcMap_ST;
236 8883 sc->mapobj = (PetscObject)eps->st;
237
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.
8883 PetscFunctionReturn(PETSC_SUCCESS);
238 }
239
240 /*@
241 EPSSetDSType - Sets the type of the internal DS object based on the current
242 settings of the eigenvalue solver.
243
244 Collective
245
246 Input Parameter:
247 . eps - eigenproblem solver context
248
249 Note:
250 This function need not be called explicitly, since it will be called at
251 both EPSSetFromOptions() and EPSSetUp().
252
253 Level: developer
254
255 .seealso: EPSSetFromOptions(), EPSSetUp()
256 @*/
257 15000 PetscErrorCode EPSSetDSType(EPS eps)
258 {
259
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
15000 PetscFunctionBegin;
260
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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 2 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.
15000 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
261
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.
15000 PetscTryTypeMethod(eps,setdstype);
262
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.
2876 PetscFunctionReturn(PETSC_SUCCESS);
263 }
264
265 /*@
266 EPSSetUp - Sets up all the internal data structures necessary for the
267 execution of the eigensolver. Then calls STSetUp() for any set-up
268 operations associated to the ST object.
269
270 Collective
271
272 Input Parameter:
273 . eps - eigenproblem solver context
274
275 Notes:
276 This function need not be called explicitly in most cases, since EPSSolve()
277 calls it. It can be useful when one wants to measure the set-up time
278 separately from the solve time.
279
280 Level: developer
281
282 .seealso: EPSCreate(), EPSSolve(), EPSDestroy(), STSetUp(), EPSSetInitialSpace()
283 @*/
284 11582 PetscErrorCode EPSSetUp(EPS eps)
285 {
286 11582 Mat A,B;
287 11582 PetscInt k,nmat;
288 11582 PetscBool flg;
289 11582 EPSStoppingCtx ctx;
290
291
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
11582 PetscFunctionBegin;
292
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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 2 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.
11582 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
293
8/14
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
11582 if (eps->state) PetscFunctionReturn(PETSC_SUCCESS);
294
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.
9742 PetscCall(PetscLogEventBegin(EPS_SetUp,eps,0,0,0));
295
296 /* reset the convergence flag from the previous solves */
297 9742 eps->reason = EPS_CONVERGED_ITERATING;
298
299 /* Set default solver type (EPSSetFromOptions was not called) */
300
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.
9742 if (!((PetscObject)eps)->type_name) PetscCall(EPSSetType(eps,EPSKRYLOVSCHUR));
301
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.
9742 if (!eps->st) PetscCall(EPSGetST(eps,&eps->st));
302
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.
9742 PetscCall(EPSSetDefaultST(eps));
303
304
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.
9742 PetscCall(STSetTransform(eps->st,PETSC_TRUE));
305
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.
9742 PetscCall(STSetStructured(eps->st,PETSC_FALSE));
306
8/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
9742 if (eps->useds && !eps->ds) PetscCall(EPSGetDS(eps,&eps->ds));
307
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.
9742 if (eps->useds) PetscCall(EPSSetDSType(eps));
308
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (eps->twosided) {
309
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.
209 PetscCheck(!eps->ishermitian || (eps->isgeneralized && !eps->ispositive),PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Two-sided methods are not intended for %s problems",SLEPC_STRING_HERMITIAN);
310 }
311
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.
9742 if (!eps->rg) PetscCall(EPSGetRG(eps,&eps->rg));
312
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.
9742 if (!((PetscObject)eps->rg)->type_name) PetscCall(RGSetType(eps->rg,RGINTERVAL));
313
314 /* Set problem dimensions */
315
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9742 PetscCall(STGetNumMatrices(eps->st,&nmat));
316
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
9742 PetscCheck(nmat,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"EPSSetOperators must be called first");
317
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9742 PetscCall(STMatGetSize(eps->st,&eps->n,NULL));
318
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.
9742 PetscCall(STMatGetLocalSize(eps->st,&eps->nloc,NULL));
319
320 /* Set default problem type */
321
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (!eps->problem_type) {
322
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 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.
433 if (nmat==1) PetscCall(EPSSetProblemType(eps,EPS_NHEP));
323
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.
41 else PetscCall(EPSSetProblemType(eps,EPS_GNHEP));
324
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 10 times.
9309 } else if (nmat==1 && eps->isgeneralized) {
325
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(PetscInfo(eps,"Eigenproblem set as generalized but no matrix B was provided; reverting to a standard eigenproblem\n"));
326 3 eps->isgeneralized = PETSC_FALSE;
327
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
6 eps->problem_type = eps->ishermitian? EPS_HEP: EPS_NHEP;
328
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
9306 } else PetscCheck(nmat==1 || eps->isgeneralized,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_INCOMP,"Inconsistent EPS state: the problem type does not match the number of matrices");
329
330
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (eps->isstructured) {
331 /* make sure the user has set the appropriate matrix */
332
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
369 PetscCall(STGetMatrix(eps->st,0,&A));
333
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 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.
369 if (eps->problem_type==EPS_BSE) PetscCall(SlepcCheckMatStruct(A,SLEPC_MAT_STRUCT_BSE,NULL));
334
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
369 if (eps->problem_type==EPS_HAMILT) PetscCall(SlepcCheckMatStruct(A,SLEPC_MAT_STRUCT_HAMILT,NULL));
335 }
336
337 /* safeguard for small problems */
338
2/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 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.
9742 if (eps->n == 0) PetscFunctionReturn(PETSC_SUCCESS);
339
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
9742 if (eps->nev > eps->n) eps->nev = eps->n;
340
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (eps->problem_type == EPS_BSE) {
341
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
334 if (2*eps->ncv > eps->n) eps->ncv = eps->n/2;
342 } else {
343
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9408 if (eps->ncv > eps->n) eps->ncv = eps->n;
344 }
345
346 /* check some combinations of eps->which */
347
7/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
9742 PetscCheck(!eps->ishermitian || (eps->isgeneralized && !eps->ispositive) || (eps->which!=EPS_LARGEST_IMAGINARY && eps->which!=EPS_SMALLEST_IMAGINARY && eps->which!=EPS_TARGET_IMAGINARY),PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Sorting the eigenvalues along the imaginary axis is not allowed when all eigenvalues are real");
348
349 /* initialization of matrix norms */
350
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (eps->conv==EPS_CONV_NORM) {
351
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
496 if (!eps->nrma) {
352
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.
496 PetscCall(STGetMatrix(eps->st,0,&A));
353
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.
496 PetscCall(MatNorm(A,NORM_INFINITY,&eps->nrma));
354 }
355
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
496 if (nmat>1 && !eps->nrmb) {
356
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.
486 PetscCall(STGetMatrix(eps->st,1,&B));
357
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.
486 PetscCall(MatNorm(B,NORM_INFINITY,&eps->nrmb));
358 }
359 }
360
361 /* call specific solver setup */
362
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
9742 PetscUseTypeMethod(eps,setup);
363
364 /* threshold stopping test */
365
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (eps->stop==EPS_STOP_THRESHOLD) {
366
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
146 PetscCheck(eps->thres!=PETSC_MIN_REAL,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"Must give a threshold value with EPSSetThreshold()");
367
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
146 PetscCheck(eps->which==EPS_LARGEST_MAGNITUDE || eps->which==EPS_SMALLEST_MAGNITUDE || eps->which==EPS_LARGEST_REAL || eps->which==EPS_SMALLEST_REAL || eps->which==EPS_TARGET_MAGNITUDE,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Threshold stopping test can only be used with largest/smallest/target magnitude or largest/smallest real selection of eigenvalues");
368
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.
146 if (eps->which==EPS_LARGEST_REAL || eps->which==EPS_SMALLEST_REAL) PetscCheck(eps->problem_type==EPS_HEP || eps->problem_type==EPS_GHEP || eps->problem_type==EPS_BSE,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Threshold stopping test with largest/smallest real can only be used in problems that have all eigenvaues real");
369
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
146 else PetscCheck(eps->thres>0.0,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"In case of largest/smallest/target magnitude the threshold value must be positive");
370
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
146 PetscCheck(eps->which==EPS_LARGEST_MAGNITUDE || eps->which==EPS_TARGET_MAGNITUDE || !eps->threlative,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"Can only use a relative threshold with largest/target magnitude selection of eigenvalues");
371
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.
146 PetscCall(PetscNew(&ctx));
372 146 ctx->thres = eps->thres;
373 146 ctx->threlative = eps->threlative;
374 146 ctx->which = eps->which;
375
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.
146 PetscCall(EPSSetStoppingTestFunction(eps,EPSStoppingThreshold,ctx,PetscCtxDestroyDefault));
376 }
377
378 /* if purification is set, check that it really makes sense */
379
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (eps->purify) {
380
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6921 if (eps->categ==EPS_CATEGORY_PRECOND || eps->categ==EPS_CATEGORY_CONTOUR) eps->purify = PETSC_FALSE;
381 else {
382
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5259 if (!eps->isgeneralized) eps->purify = PETSC_FALSE;
383
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
1490 else if (!eps->ishermitian && !eps->ispositive) eps->purify = PETSC_FALSE;
384 else {
385
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.
1164 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STCAYLEY,&flg));
386
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1164 if (flg) eps->purify = PETSC_FALSE;
387 }
388 }
389 }
390
391 /* set tolerance if not yet set */
392
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (eps->tol==(PetscReal)PETSC_DETERMINE) eps->tol = SLEPC_DEFAULT_TOL;
393
394 /* set up sorting criterion */
395
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.
9742 PetscTryTypeMethod(eps,setupsort);
396
397 /* Build balancing matrix if required */
398
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
9742 if (eps->balance!=EPS_BALANCE_USER) {
399
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.
9742 PetscCall(STSetBalanceMatrix(eps->st,NULL));
400
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
9742 if (!eps->ishermitian && (eps->balance==EPS_BALANCE_ONESIDE || eps->balance==EPS_BALANCE_TWOSIDE)) {
401
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.
130 if (!eps->D) PetscCall(BVCreateVec(eps->V,&eps->D));
402
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.
130 PetscCall(EPSBuildBalance_Krylov(eps));
403
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.
130 PetscCall(STSetBalanceMatrix(eps->st,eps->D));
404 }
405 }
406
407 /* Setup ST */
408
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.
9742 PetscCall(STSetUp(eps->st));
409
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.
9742 PetscCall(EPSCheckCompatibleST(eps));
410
411 /* process deflation and initial vectors */
412
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (eps->nds<0) {
413
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
148 PetscCheck(!eps->isstructured,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Deflation space is not supported in structured eigenproblems");
414 148 k = -eps->nds;
415
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.
148 PetscCall(BVInsertConstraints(eps->V,&k,eps->defl));
416
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.
148 PetscCall(SlepcBasisDestroy_Private(&eps->nds,&eps->defl));
417 148 eps->nds = k;
418
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.
148 PetscCall(STCheckNullSpace(eps->st,eps->V));
419 }
420
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (eps->nini<0) {
421 2553 k = -eps->nini;
422
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2553 PetscCheck(k<=eps->ncv,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The number of initial vectors is larger than ncv");
423
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.
2553 PetscCall(BVInsertVecs(eps->V,0,&k,eps->IS,PETSC_TRUE));
424
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.
2553 PetscCall(SlepcBasisDestroy_Private(&eps->nini,&eps->IS));
425 2553 eps->nini = k;
426 }
427
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
9742 if (eps->twosided && eps->ninil<0) {
428 40 k = -eps->ninil;
429
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
40 PetscCheck(k<=eps->ncv,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The number of left initial vectors is larger than ncv");
430
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(BVInsertVecs(eps->W,0,&k,eps->ISL,PETSC_TRUE));
431
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(SlepcBasisDestroy_Private(&eps->ninil,&eps->ISL));
432 40 eps->ninil = k;
433 }
434
435
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.
9742 PetscCall(PetscLogEventEnd(EPS_SetUp,eps,0,0,0));
436 9742 eps->state = EPS_STATE_SETUP;
437
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.
9742 PetscFunctionReturn(PETSC_SUCCESS);
438 }
439
440 /*@
441 EPSSetOperators - Sets the matrices associated with the eigenvalue problem.
442
443 Collective
444
445 Input Parameters:
446 + eps - the eigenproblem solver context
447 . A - the matrix associated with the eigensystem
448 - B - the second matrix in the case of generalized eigenproblems
449
450 Notes:
451 To specify a standard eigenproblem, use NULL for parameter B.
452
453 It must be called before EPSSetUp(). If it is called again after EPSSetUp() and
454 the matrix sizes have changed then the EPS object is reset.
455
456 For structured eigenproblem types such as EPS_BSE (see EPSSetProblemType()), the
457 provided matrices must have been created with the corresponding helper function,
458 i.e., MatCreateBSE().
459
460 Level: beginner
461
462 .seealso: EPSSolve(), EPSSetUp(), EPSReset(), EPSGetST(), STGetMatrix(), EPSSetProblemType()
463 @*/
464 8169 PetscErrorCode EPSSetOperators(EPS eps,Mat A,Mat B)
465 {
466 8169 PetscInt m,n,m0,mloc,nloc,mloc0,nmat;
467 8169 Mat mat[2];
468
469
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8169 PetscFunctionBegin;
470
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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 2 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.
8169 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
471
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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 2 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.
8169 PetscValidHeaderSpecific(A,MAT_CLASSID,2);
472
4/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
8169 if (B) PetscValidHeaderSpecific(B,MAT_CLASSID,3);
473
13/32
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
8169 PetscCheckSameComm(eps,1,A,2);
474
15/34
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
8169 if (B) PetscCheckSameComm(eps,1,B,3);
475
476 /* Check matrix sizes */
477
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.
8169 PetscCall(MatGetSize(A,&m,&n));
478
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.
8169 PetscCall(MatGetLocalSize(A,&mloc,&nloc));
479
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8169 PetscCheck(m==n,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"A is a non-square matrix (%" PetscInt_FMT " rows, %" PetscInt_FMT " cols)",m,n);
480
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8169 PetscCheck(mloc==nloc,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"A does not have equal row and column sizes (%" PetscInt_FMT ", %" PetscInt_FMT ")",mloc,nloc);
481
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8169 if (B) {
482
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.
2311 PetscCall(MatGetSize(B,&m0,&n));
483
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.
2311 PetscCall(MatGetLocalSize(B,&mloc0,&nloc));
484
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2311 PetscCheck(m0==n,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"B is a non-square matrix (%" PetscInt_FMT " rows, %" PetscInt_FMT " cols)",m0,n);
485
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2311 PetscCheck(mloc0==nloc,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"B does not have equal row and column local sizes (%" PetscInt_FMT ", %" PetscInt_FMT ")",mloc0,nloc);
486
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2311 PetscCheck(m==m0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_INCOMP,"Dimensions of A and B do not match (%" PetscInt_FMT ", %" PetscInt_FMT ")",m,m0);
487
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2311 PetscCheck(mloc==mloc0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_INCOMP,"Local dimensions of A and B do not match (%" PetscInt_FMT ", %" PetscInt_FMT ")",mloc,mloc0);
488 }
489
10/12
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
8169 if (eps->state && (n!=eps->n || nloc!=eps->nloc)) PetscCall(EPSReset(eps));
490 8169 eps->nrma = 0.0;
491 8169 eps->nrmb = 0.0;
492
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.
8169 if (!eps->st) PetscCall(EPSGetST(eps,&eps->st));
493 8169 mat[0] = A;
494
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8169 if (B) {
495 2311 mat[1] = B;
496 2311 nmat = 2;
497 } else nmat = 1;
498
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.
8169 PetscCall(STSetMatrices(eps->st,nmat,mat));
499 8169 eps->state = EPS_STATE_INITIAL;
500
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.
8169 PetscFunctionReturn(PETSC_SUCCESS);
501 }
502
503 /*@
504 EPSGetOperators - Gets the matrices associated with the eigensystem.
505
506 Collective
507
508 Input Parameter:
509 . eps - the EPS context
510
511 Output Parameters:
512 + A - the matrix associated with the eigensystem
513 - B - the second matrix in the case of generalized eigenproblems
514
515 Note:
516 Does not increase the reference count of the matrices, so you should not destroy them.
517
518 Level: intermediate
519
520 .seealso: EPSSolve(), EPSGetST(), STGetMatrix(), STSetMatrices()
521 @*/
522 11367 PetscErrorCode EPSGetOperators(EPS eps,Mat *A,Mat *B)
523 {
524 11367 ST st;
525 11367 PetscInt k;
526
527
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
11367 PetscFunctionBegin;
528
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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 2 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.
11367 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
529
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.
11367 PetscCall(EPSGetST(eps,&st));
530
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.
11367 PetscCall(STGetNumMatrices(st,&k));
531
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11367 if (A) {
532
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
5879 if (k<1) *A = NULL;
533
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.
5879 else PetscCall(STGetMatrix(st,0,A));
534 }
535
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11367 if (B) {
536
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7273 if (k<2) *B = NULL;
537
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.
6861 else PetscCall(STGetMatrix(st,1,B));
538 }
539
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.
2238 PetscFunctionReturn(PETSC_SUCCESS);
540 }
541
542 /*@
543 EPSSetDeflationSpace - Specify a basis of vectors that constitute the deflation
544 space.
545
546 Collective
547
548 Input Parameters:
549 + eps - the eigenproblem solver context
550 . n - number of vectors
551 - v - set of basis vectors of the deflation space
552
553 Notes:
554 When a deflation space is given, the eigensolver seeks the eigensolution
555 in the restriction of the problem to the orthogonal complement of this
556 space. This can be used for instance in the case that an invariant
557 subspace is known beforehand (such as the nullspace of the matrix).
558
559 These vectors do not persist from one EPSSolve() call to the other, so the
560 deflation space should be set every time.
561
562 The vectors do not need to be mutually orthonormal, since they are explicitly
563 orthonormalized internally.
564
565 Level: intermediate
566
567 .seealso: EPSSetInitialSpace()
568 @*/
569 161 PetscErrorCode EPSSetDeflationSpace(EPS eps,PetscInt n,Vec v[])
570 {
571
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
161 PetscFunctionBegin;
572
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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 2 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.
161 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
573
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
161 PetscValidLogicalCollectiveInt(eps,n,2);
574
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
161 PetscCheck(n>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Argument n cannot be negative");
575
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
161 if (n>0) {
576
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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.
158 PetscAssertPointer(v,3);
577
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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 2 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.
158 PetscValidHeaderSpecific(*v,VEC_CLASSID,3);
578 }
579
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.
161 PetscCall(SlepcBasisReference_Private(n,v,&eps->nds,&eps->defl));
580
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
161 if (n>0) eps->state = EPS_STATE_INITIAL;
581
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.
31 PetscFunctionReturn(PETSC_SUCCESS);
582 }
583
584 /*@
585 EPSSetInitialSpace - Specify a basis of vectors that constitute the initial
586 space, that is, the subspace from which the solver starts to iterate.
587
588 Collective
589
590 Input Parameters:
591 + eps - the eigenproblem solver context
592 . n - number of vectors
593 - is - set of basis vectors of the initial space
594
595 Notes:
596 Some solvers start to iterate on a single vector (initial vector). In that case,
597 the other vectors are ignored.
598
599 These vectors do not persist from one EPSSolve() call to the other, so the
600 initial space should be set every time.
601
602 The vectors do not need to be mutually orthonormal, since they are explicitly
603 orthonormalized internally.
604
605 Common usage of this function is when the user can provide a rough approximation
606 of the wanted eigenspace. Then, convergence may be faster.
607
608 Level: intermediate
609
610 .seealso: EPSSetLeftInitialSpace(), EPSSetDeflationSpace()
611 @*/
612 2570 PetscErrorCode EPSSetInitialSpace(EPS eps,PetscInt n,Vec is[])
613 {
614
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2570 PetscFunctionBegin;
615
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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 2 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.
2570 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
616
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
2570 PetscValidLogicalCollectiveInt(eps,n,2);
617
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2570 PetscCheck(n>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Argument n cannot be negative");
618
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
2570 if (n>0) {
619
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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.
2563 PetscAssertPointer(is,3);
620
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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 2 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.
2563 PetscValidHeaderSpecific(*is,VEC_CLASSID,3);
621 }
622
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.
2570 PetscCall(SlepcBasisReference_Private(n,is,&eps->nini,&eps->IS));
623
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
2570 if (n>0) eps->state = EPS_STATE_INITIAL;
624
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.
478 PetscFunctionReturn(PETSC_SUCCESS);
625 }
626
627 /*@
628 EPSSetLeftInitialSpace - Specify a basis of vectors that constitute the left
629 initial space, used by two-sided solvers to start the left subspace.
630
631 Collective
632
633 Input Parameters:
634 + eps - the eigenproblem solver context
635 . n - number of vectors
636 - isl - set of basis vectors of the left initial space
637
638 Notes:
639 Left initial vectors are used to initiate the left search space in two-sided
640 eigensolvers. Users should pass here an approximation of the left eigenspace,
641 if available.
642
643 The same comments in EPSSetInitialSpace() are applicable here.
644
645 Level: intermediate
646
647 .seealso: EPSSetInitialSpace(), EPSSetTwoSided()
648 @*/
649 40 PetscErrorCode EPSSetLeftInitialSpace(EPS eps,PetscInt n,Vec isl[])
650 {
651
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
40 PetscFunctionBegin;
652
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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 2 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.
40 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
653
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
40 PetscValidLogicalCollectiveInt(eps,n,2);
654
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
40 PetscCheck(n>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Argument n cannot be negative");
655
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
40 if (n>0) {
656
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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.
40 PetscAssertPointer(isl,3);
657
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 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 2 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.
40 PetscValidHeaderSpecific(*isl,VEC_CLASSID,3);
658 }
659
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(SlepcBasisReference_Private(n,isl,&eps->ninil,&eps->ISL));
660
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
40 if (n>0) eps->state = EPS_STATE_INITIAL;
661
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.
8 PetscFunctionReturn(PETSC_SUCCESS);
662 }
663
664 /*
665 EPSSetDimensions_Default - Set reasonable values for ncv, mpd if not set
666 by the user. This is called at setup.
667 */
668 6961 PetscErrorCode EPSSetDimensions_Default(EPS eps,PetscInt *nev,PetscInt *ncv,PetscInt *mpd)
669 {
670 6961 PetscBool krylov;
671
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6961 PetscInt nev2, n = eps->problem_type==EPS_BSE? eps->n/2: eps->n;
672
673
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6961 PetscFunctionBegin;
674
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
6961 if (*nev==0 && eps->stop!=EPS_STOP_THRESHOLD) *nev = 1;
675
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6961 nev2 = eps->problem_type==EPS_BSE? (*nev+1)/2: *nev;
676
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6961 if (*ncv!=PETSC_DETERMINE) { /* ncv set */
677
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.
3711 PetscCall(PetscObjectTypeCompareAny((PetscObject)eps,&krylov,EPSKRYLOVSCHUR,EPSARNOLDI,EPSLANCZOS,""));
678
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3711 if (krylov) {
679
4/8
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
3533 PetscCheck(*ncv>=nev2+1 || (*ncv==nev2 && *ncv==n),PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev+1");
680 } else {
681
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
178 PetscCheck(*ncv>=nev2,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev");
682 }
683
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3250 } else if (*mpd!=PETSC_DETERMINE) { /* mpd set */
684 60 *ncv = PetscMin(n,nev2+(*mpd));
685 } else { /* neither set: defaults depend on nev being small or large */
686
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
3190 if (nev2<500) *ncv = PetscMin(n,PetscMax(2*(nev2),nev2+15));
687 else {
688 *mpd = 500;
689 *ncv = PetscMin(n,nev2+(*mpd));
690 }
691 }
692
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6961 if (*mpd==PETSC_DETERMINE) *mpd = *ncv;
693
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.
1308 PetscFunctionReturn(PETSC_SUCCESS);
694 }
695
696 /*@
697 EPSAllocateSolution - Allocate memory storage for common variables such
698 as eigenvalues and eigenvectors.
699
700 Collective
701
702 Input Parameters:
703 + eps - eigensolver context
704 - extra - number of additional positions, used for methods that require a
705 working basis slightly larger than ncv
706
707 Developer Notes:
708 This is SLEPC_EXTERN because it may be required by user plugin EPS
709 implementations.
710
711 Level: developer
712
713 .seealso: EPSSetUp()
714 @*/
715 9742 PetscErrorCode EPSAllocateSolution(EPS eps,PetscInt extra)
716 {
717 9742 PetscInt oldsize,requested;
718 9742 PetscRandom rand;
719 9742 Vec t;
720
721
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9742 PetscFunctionBegin;
722 9742 requested = eps->ncv + extra;
723
724 /* oldsize is zero if this is the first time setup is called */
725
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.
9742 PetscCall(BVGetSizes(eps->V,NULL,NULL,&oldsize));
726
727 /* allocate space for eigenvalues and friends */
728
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
9742 if (requested != oldsize || !eps->eigr) {
729
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.
7294 PetscCall(PetscFree4(eps->eigr,eps->eigi,eps->errest,eps->perm));
730
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.
7294 PetscCall(PetscMalloc4(requested,&eps->eigr,requested,&eps->eigi,requested,&eps->errest,requested,&eps->perm));
731 }
732
733 /* workspace for the case of arbitrary selection */
734
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (eps->arbitrary) {
735
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.
82 if (eps->rr) PetscCall(PetscFree2(eps->rr,eps->ri));
736
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.
82 PetscCall(PetscMalloc2(requested,&eps->rr,requested,&eps->ri));
737 }
738
739 /* allocate V */
740
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.
9742 if (!eps->V) PetscCall(EPSGetBV(eps,&eps->V));
741
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (!oldsize) {
742
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.
7153 if (!((PetscObject)eps->V)->type_name) PetscCall(BVSetType(eps->V,BVMAT));
743
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.
7153 PetscCall(STMatCreateVecsEmpty(eps->st,&t,NULL));
744
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.
7153 PetscCall(BVSetSizesFromVec(eps->V,t,requested));
745
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.
7153 PetscCall(VecDestroy(&t));
746
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.
2589 } else PetscCall(BVResize(eps->V,requested,PETSC_FALSE));
747
748 /* allocate W */
749
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9742 if (eps->twosided) {
750
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.
209 PetscCall(BVGetRandomContext(eps->V,&rand)); /* make sure the random context is available when duplicating */
751
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.
209 PetscCall(BVDestroy(&eps->W));
752
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.
209 PetscCall(BVDuplicate(eps->V,&eps->W));
753 }
754
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.
1874 PetscFunctionReturn(PETSC_SUCCESS);
755 }
756
757 /*@
758 EPSReallocateSolution - Reallocate memory storage for common variables such
759 as the eigenvalues and the basis vectors.
760
761 Collective
762
763 Input Parameters:
764 + eps - eigensolver context
765 - newsize - new size
766
767 Developer Notes:
768 This is SLEPC_EXTERN because it may be required by user plugin EPS
769 implementations.
770
771 This is called during the iteration in case the threshold stopping test has
772 been selected.
773
774 Level: developer
775
776 .seealso: EPSAllocateSolution(), EPSSetThreshold()
777 @*/
778 73 PetscErrorCode EPSReallocateSolution(EPS eps,PetscInt newsize)
779 {
780 73 PetscInt oldsize,*nperm;
781 73 PetscReal *nerrest;
782 73 PetscScalar *neigr,*neigi;
783
784
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
73 PetscFunctionBegin;
785
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.
73 PetscCall(BVGetSizes(eps->V,NULL,NULL,&oldsize));
786
2/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 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.
73 if (oldsize>=newsize) PetscFunctionReturn(PETSC_SUCCESS);
787
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.
73 PetscCall(PetscInfo(eps,"Reallocating basis vectors to %" PetscInt_FMT " columns\n",newsize));
788
789 /* reallocate eigenvalues */
790
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.
73 PetscCall(PetscMalloc4(newsize,&neigr,newsize,&neigi,newsize,&nerrest,newsize,&nperm));
791
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.
73 PetscCall(PetscArraycpy(neigr,eps->eigr,oldsize));
792
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.
73 PetscCall(PetscArraycpy(neigi,eps->eigi,oldsize));
793
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.
73 PetscCall(PetscArraycpy(nerrest,eps->errest,oldsize));
794
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.
73 PetscCall(PetscArraycpy(nperm,eps->perm,oldsize));
795
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.
73 PetscCall(PetscFree4(eps->eigr,eps->eigi,eps->errest,eps->perm));
796 73 eps->eigr = neigr;
797 73 eps->eigi = neigi;
798 73 eps->errest = nerrest;
799 73 eps->perm = nperm;
800 /* reallocate V,W */
801
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.
73 PetscCall(BVResize(eps->V,newsize,PETSC_TRUE));
802
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.
73 if (eps->twosided) PetscCall(BVResize(eps->W,newsize,PETSC_TRUE));
803
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.
15 PetscFunctionReturn(PETSC_SUCCESS);
804 }
805