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 | NEP routines related to problem setup | ||
12 | */ | ||
13 | |||
14 | #include <slepc/private/nepimpl.h> /*I "slepcnep.h" I*/ | ||
15 | |||
16 | /*@ | ||
17 | NEPSetDSType - Sets the type of the internal DS object based on the current | ||
18 | settings of the nonlinear eigensolver. | ||
19 | |||
20 | Collective | ||
21 | |||
22 | Input Parameter: | ||
23 | . nep - nonlinear eigensolver context | ||
24 | |||
25 | Note: | ||
26 | This function need not be called explicitly, since it will be called at | ||
27 | both NEPSetFromOptions() and NEPSetUp(). | ||
28 | |||
29 | Level: developer | ||
30 | |||
31 | .seealso: NEPSetFromOptions(), NEPSetUp() | ||
32 | @*/ | ||
33 | 2274 | PetscErrorCode NEPSetDSType(NEP nep) | |
34 | { | ||
35 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2274 | PetscFunctionBegin; |
36 |
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.
|
2274 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
37 |
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.
|
2274 | PetscTryTypeMethod(nep,setdstype); |
38 |
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.
|
428 | PetscFunctionReturn(PETSC_SUCCESS); |
39 | } | ||
40 | |||
41 | /*@ | ||
42 | NEPSetUp - Sets up all the internal data structures necessary for the | ||
43 | execution of the NEP solver. | ||
44 | |||
45 | Collective | ||
46 | |||
47 | Input Parameter: | ||
48 | . nep - solver context | ||
49 | |||
50 | Notes: | ||
51 | This function need not be called explicitly in most cases, since NEPSolve() | ||
52 | calls it. It can be useful when one wants to measure the set-up time | ||
53 | separately from the solve time. | ||
54 | |||
55 | Level: developer | ||
56 | |||
57 | .seealso: NEPCreate(), NEPSolve(), NEPDestroy() | ||
58 | @*/ | ||
59 | 1495 | PetscErrorCode NEPSetUp(NEP nep) | |
60 | { | ||
61 | 1495 | PetscInt k; | |
62 | 1495 | SlepcSC sc; | |
63 | 1495 | Mat T; | |
64 | 1495 | PetscBool flg; | |
65 | 1495 | KSP ksp; | |
66 | 1495 | PC pc; | |
67 | 1495 | PetscMPIInt size; | |
68 | 1495 | MatSolverType stype; | |
69 | |||
70 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1495 | PetscFunctionBegin; |
71 |
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.
|
1495 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
72 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1495 | NEPCheckProblem(nep,1); |
73 |
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.
|
1495 | if (nep->state) PetscFunctionReturn(PETSC_SUCCESS); |
74 |
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.
|
1495 | PetscCall(PetscLogEventBegin(NEP_SetUp,nep,0,0,0)); |
75 | |||
76 | /* reset the convergence flag from the previous solves */ | ||
77 | 1495 | nep->reason = NEP_CONVERGED_ITERATING; | |
78 | |||
79 | /* set default solver type (NEPSetFromOptions was not called) */ | ||
80 |
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.
|
1495 | if (!((PetscObject)nep)->type_name) PetscCall(NEPSetType(nep,NEPRII)); |
81 |
3/10✓ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
1495 | if (nep->useds && !nep->ds) PetscCall(NEPGetDS(nep,&nep->ds)); |
82 |
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.
|
1495 | if (nep->useds) PetscCall(NEPSetDSType(nep)); |
83 |
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.
|
1495 | if (!nep->rg) PetscCall(NEPGetRG(nep,&nep->rg)); |
84 |
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.
|
1495 | if (!((PetscObject)nep->rg)->type_name) PetscCall(RGSetType(nep->rg,RGINTERVAL)); |
85 | |||
86 | /* set problem dimensions */ | ||
87 |
2/3✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
|
1495 | switch (nep->fui) { |
88 | 453 | case NEP_USER_INTERFACE_CALLBACK: | |
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.
|
453 | PetscCall(NEPGetFunction(nep,&T,NULL,NULL,NULL)); |
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.
|
453 | PetscCall(MatGetSize(T,&nep->n,NULL)); |
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.
|
453 | PetscCall(MatGetLocalSize(T,&nep->nloc,NULL)); |
92 | break; | ||
93 | 1042 | case NEP_USER_INTERFACE_SPLIT: | |
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.
|
1042 | PetscCall(MatDuplicate(nep->A[0],MAT_DO_NOT_COPY_VALUES,&nep->function)); |
95 |
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.
|
1042 | if (nep->P) PetscCall(MatDuplicate(nep->P[0],MAT_DO_NOT_COPY_VALUES,&nep->function_pre)); |
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.
|
1042 | PetscCall(MatDuplicate(nep->A[0],MAT_DO_NOT_COPY_VALUES,&nep->jacobian)); |
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.
|
1042 | PetscCall(MatGetSize(nep->A[0],&nep->n,NULL)); |
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.
|
1042 | PetscCall(MatGetLocalSize(nep->A[0],&nep->nloc,NULL)); |
99 | break; | ||
100 | } | ||
101 | |||
102 | /* set default problem type */ | ||
103 |
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.
|
1495 | if (!nep->problem_type) PetscCall(NEPSetProblemType(nep,NEP_GENERAL)); |
104 | |||
105 | /* check consistency of refinement options */ | ||
106 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->refine) { |
107 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
136 | PetscCheck(nep->fui==NEP_USER_INTERFACE_SPLIT,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"Iterative refinement only implemented in split form"); |
108 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
136 | if (!nep->scheme) { /* set default scheme */ |
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(NEPRefineGetKSP(nep,&ksp)); |
110 |
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(KSPGetPC(ksp,&pc)); |
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.
|
10 | PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg)); |
112 |
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.
|
10 | if (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,"")); |
113 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
20 | nep->scheme = flg? NEP_REFINE_SCHEME_MBE: NEP_REFINE_SCHEME_SCHUR; |
114 | } | ||
115 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
136 | if (nep->scheme==NEP_REFINE_SCHEME_MBE) { |
116 |
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.
|
30 | PetscCall(NEPRefineGetKSP(nep,&ksp)); |
117 |
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.
|
30 | PetscCall(KSPGetPC(ksp,&pc)); |
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.
|
30 | PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg)); |
119 |
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.
|
30 | if (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,"")); |
120 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
30 | PetscCheck(flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"The MBE scheme for refinement requires a direct solver in KSP"); |
121 |
14/28✓ Branch 0 taken 2 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 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.
|
30 | PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)pc),&size)); |
122 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
30 | if (size>1) { /* currently selected PC is a factorization */ |
123 | ✗ | PetscCall(PCFactorGetMatSolverType(pc,&stype)); | |
124 | ✗ | PetscCall(PetscStrcmp(stype,MATSOLVERPETSC,&flg)); | |
125 | ✗ | PetscCheck(!flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"For Newton refinement, you chose to solve linear systems with a factorization, but in parallel runs you need to select an external package"); | |
126 | } | ||
127 | } | ||
128 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
136 | if (nep->scheme==NEP_REFINE_SCHEME_SCHUR) { |
129 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
20 | PetscCheck(nep->npart==1,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"The Schur scheme for refinement does not support subcommunicators"); |
130 | } | ||
131 | } | ||
132 | /* call specific solver setup */ | ||
133 |
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.
|
1495 | PetscUseTypeMethod(nep,setup); |
134 | |||
135 | /* set tolerance if not yet set */ | ||
136 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->tol==(PetscReal)PETSC_DETERMINE) nep->tol = SLEPC_DEFAULT_TOL; |
137 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->refine) { |
138 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
|
256 | if (nep->rtol==(PetscReal)PETSC_DETERMINE) nep->rtol = PetscMax(nep->tol/1000,PETSC_MACHINE_EPSILON); |
139 |
3/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
|
136 | if (nep->rits==(PetscReal)PETSC_DETERMINE) nep->rits = (nep->refine==NEP_REFINE_SIMPLE)? 10: 1; |
140 | } | ||
141 | |||
142 | /* fill sorting criterion context */ | ||
143 |
4/11✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 5 times.
✓ Branch 10 taken 5 times.
|
1495 | switch (nep->which) { |
144 | ✗ | case NEP_LARGEST_MAGNITUDE: | |
145 | ✗ | nep->sc->comparison = SlepcCompareLargestMagnitude; | |
146 | ✗ | nep->sc->comparisonctx = NULL; | |
147 | ✗ | break; | |
148 | ✗ | case NEP_SMALLEST_MAGNITUDE: | |
149 | ✗ | nep->sc->comparison = SlepcCompareSmallestMagnitude; | |
150 | ✗ | nep->sc->comparisonctx = NULL; | |
151 | ✗ | break; | |
152 | ✗ | case NEP_LARGEST_REAL: | |
153 | ✗ | nep->sc->comparison = SlepcCompareLargestReal; | |
154 | ✗ | nep->sc->comparisonctx = NULL; | |
155 | ✗ | break; | |
156 | ✗ | case NEP_SMALLEST_REAL: | |
157 | ✗ | nep->sc->comparison = SlepcCompareSmallestReal; | |
158 | ✗ | nep->sc->comparisonctx = NULL; | |
159 | ✗ | break; | |
160 | ✗ | case NEP_LARGEST_IMAGINARY: | |
161 | ✗ | nep->sc->comparison = SlepcCompareLargestImaginary; | |
162 | ✗ | nep->sc->comparisonctx = NULL; | |
163 | ✗ | break; | |
164 | ✗ | case NEP_SMALLEST_IMAGINARY: | |
165 | ✗ | nep->sc->comparison = SlepcCompareSmallestImaginary; | |
166 | ✗ | nep->sc->comparisonctx = NULL; | |
167 | ✗ | break; | |
168 | 1288 | case NEP_TARGET_MAGNITUDE: | |
169 | 1288 | nep->sc->comparison = SlepcCompareTargetMagnitude; | |
170 | 1288 | nep->sc->comparisonctx = &nep->target; | |
171 | 1288 | break; | |
172 | 5 | case NEP_TARGET_REAL: | |
173 | 5 | nep->sc->comparison = SlepcCompareTargetReal; | |
174 | 5 | nep->sc->comparisonctx = &nep->target; | |
175 | 5 | break; | |
176 | ✗ | case NEP_TARGET_IMAGINARY: | |
177 | ✗ | nep->sc->comparison = SlepcCompareTargetImaginary; | |
178 | ✗ | nep->sc->comparisonctx = &nep->target; | |
179 | ✗ | break; | |
180 | 197 | case NEP_ALL: | |
181 | 197 | nep->sc->comparison = SlepcCompareSmallestReal; | |
182 | 197 | nep->sc->comparisonctx = NULL; | |
183 | 197 | break; | |
184 | case NEP_WHICH_USER: | ||
185 | break; | ||
186 | } | ||
187 | |||
188 | 1495 | nep->sc->map = NULL; | |
189 | 1495 | nep->sc->mapobj = NULL; | |
190 | |||
191 | /* fill sorting criterion for DS */ | ||
192 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->useds) { |
193 |
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.
|
1215 | PetscCall(DSGetSlepcSC(nep->ds,&sc)); |
194 | 1215 | sc->comparison = nep->sc->comparison; | |
195 | 1215 | sc->comparisonctx = nep->sc->comparisonctx; | |
196 |
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.
|
1215 | PetscCall(PetscObjectTypeCompare((PetscObject)nep,NEPNLEIGS,&flg)); |
197 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1215 | if (!flg) { |
198 | 951 | sc->map = NULL; | |
199 | 951 | sc->mapobj = NULL; | |
200 | } | ||
201 | } | ||
202 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1495 | PetscCheck(nep->nev<=nep->ncv,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"nev bigger than ncv"); |
203 | |||
204 | /* process initial vectors */ | ||
205 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->nini<0) { |
206 | 48 | k = -nep->nini; | |
207 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
48 | PetscCheck(k<=nep->ncv,PetscObjectComm((PetscObject)nep),PETSC_ERR_USER_INPUT,"The number of initial vectors is larger than ncv"); |
208 |
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.
|
48 | PetscCall(BVInsertVecs(nep->V,0,&k,nep->IS,PETSC_TRUE)); |
209 |
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.
|
48 | PetscCall(SlepcBasisDestroy_Private(&nep->nini,&nep->IS)); |
210 | 48 | nep->nini = k; | |
211 | } | ||
212 |
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.
|
1495 | PetscCall(PetscLogEventEnd(NEP_SetUp,nep,0,0,0)); |
213 | 1495 | nep->state = NEP_STATE_SETUP; | |
214 |
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.
|
1495 | PetscFunctionReturn(PETSC_SUCCESS); |
215 | } | ||
216 | |||
217 | /*@ | ||
218 | NEPSetInitialSpace - Specify a basis of vectors that constitute the initial | ||
219 | space, that is, the subspace from which the solver starts to iterate. | ||
220 | |||
221 | Collective | ||
222 | |||
223 | Input Parameters: | ||
224 | + nep - the nonlinear eigensolver context | ||
225 | . n - number of vectors | ||
226 | - is - set of basis vectors of the initial space | ||
227 | |||
228 | Notes: | ||
229 | Some solvers start to iterate on a single vector (initial vector). In that case, | ||
230 | the other vectors are ignored. | ||
231 | |||
232 | These vectors do not persist from one NEPSolve() call to the other, so the | ||
233 | initial space should be set every time. | ||
234 | |||
235 | The vectors do not need to be mutually orthonormal, since they are explicitly | ||
236 | orthonormalized internally. | ||
237 | |||
238 | Common usage of this function is when the user can provide a rough approximation | ||
239 | of the wanted eigenspace. Then, convergence may be faster. | ||
240 | |||
241 | Level: intermediate | ||
242 | |||
243 | .seealso: NEPSetUp() | ||
244 | @*/ | ||
245 | 68 | PetscErrorCode NEPSetInitialSpace(NEP nep,PetscInt n,Vec is[]) | |
246 | { | ||
247 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
68 | PetscFunctionBegin; |
248 |
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.
|
68 | PetscValidHeaderSpecific(nep,NEP_CLASSID,1); |
249 |
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.
|
68 | PetscValidLogicalCollectiveInt(nep,n,2); |
250 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
68 | PetscCheck(n>=0,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"Argument n cannot be negative"); |
251 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
68 | if (n>0) { |
252 |
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.
|
68 | PetscAssertPointer(is,3); |
253 |
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.
|
68 | PetscValidHeaderSpecific(*is,VEC_CLASSID,3); |
254 | } | ||
255 |
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.
|
68 | PetscCall(SlepcBasisReference_Private(n,is,&nep->nini,&nep->IS)); |
256 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
68 | if (n>0) nep->state = NEP_STATE_INITIAL; |
257 |
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.
|
12 | PetscFunctionReturn(PETSC_SUCCESS); |
258 | } | ||
259 | |||
260 | /* | ||
261 | NEPSetDimensions_Default - Set reasonable values for ncv, mpd if not set | ||
262 | by the user. This is called at setup. | ||
263 | */ | ||
264 | 724 | PetscErrorCode NEPSetDimensions_Default(NEP nep,PetscInt nev,PetscInt *ncv,PetscInt *mpd) | |
265 | { | ||
266 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
724 | PetscFunctionBegin; |
267 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
724 | if (*ncv!=PETSC_DETERMINE) { /* ncv set */ |
268 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
165 | PetscCheck(*ncv>=nev,PetscObjectComm((PetscObject)nep),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev"); |
269 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
559 | } else if (*mpd!=PETSC_DETERMINE) { /* mpd set */ |
270 | ✗ | *ncv = PetscMin(nep->n,nev+(*mpd)); | |
271 | } else { /* neither set: defaults depend on nev being small or large */ | ||
272 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 3 times.
|
559 | if (nev<500) *ncv = PetscMin(nep->n,PetscMax(2*nev,nev+15)); |
273 | else { | ||
274 | ✗ | *mpd = 500; | |
275 | ✗ | *ncv = PetscMin(nep->n,nev+(*mpd)); | |
276 | } | ||
277 | } | ||
278 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
724 | if (*mpd==PETSC_DETERMINE) *mpd = *ncv; |
279 |
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.
|
138 | PetscFunctionReturn(PETSC_SUCCESS); |
280 | } | ||
281 | |||
282 | /*@ | ||
283 | NEPAllocateSolution - Allocate memory storage for common variables such | ||
284 | as eigenvalues and eigenvectors. | ||
285 | |||
286 | Collective | ||
287 | |||
288 | Input Parameters: | ||
289 | + nep - eigensolver context | ||
290 | - extra - number of additional positions, used for methods that require a | ||
291 | working basis slightly larger than ncv | ||
292 | |||
293 | Developer Notes: | ||
294 | This is SLEPC_EXTERN because it may be required by user plugin NEP | ||
295 | implementations. | ||
296 | |||
297 | Level: developer | ||
298 | |||
299 | .seealso: PEPSetUp() | ||
300 | @*/ | ||
301 | 1525 | PetscErrorCode NEPAllocateSolution(NEP nep,PetscInt extra) | |
302 | { | ||
303 | 1525 | PetscInt oldsize,requested; | |
304 | 1525 | PetscRandom rand; | |
305 | 1525 | Mat T; | |
306 | 1525 | Vec t; | |
307 | |||
308 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1525 | PetscFunctionBegin; |
309 | 1525 | requested = nep->ncv + extra; | |
310 | |||
311 | /* oldsize is zero if this is the first time setup is called */ | ||
312 |
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.
|
1525 | PetscCall(BVGetSizes(nep->V,NULL,NULL,&oldsize)); |
313 | |||
314 | /* allocate space for eigenvalues and friends */ | ||
315 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
1525 | if (requested != oldsize || !nep->eigr) { |
316 |
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.
|
1525 | PetscCall(PetscFree4(nep->eigr,nep->eigi,nep->errest,nep->perm)); |
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.
|
1525 | PetscCall(PetscMalloc4(requested,&nep->eigr,requested,&nep->eigi,requested,&nep->errest,requested,&nep->perm)); |
318 | } | ||
319 | |||
320 | /* allocate V */ | ||
321 |
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.
|
1525 | if (!nep->V) PetscCall(NEPGetBV(nep,&nep->V)); |
322 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1525 | if (!oldsize) { |
323 |
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.
|
1495 | if (!((PetscObject)nep->V)->type_name) PetscCall(BVSetType(nep->V,BVMAT)); |
324 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1495 | if (nep->fui==NEP_USER_INTERFACE_SPLIT) T = nep->A[0]; |
325 |
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.
|
453 | else PetscCall(NEPGetFunction(nep,&T,NULL,NULL,NULL)); |
326 |
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.
|
1495 | PetscCall(MatCreateVecsEmpty(T,&t,NULL)); |
327 |
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.
|
1495 | PetscCall(BVSetSizesFromVec(nep->V,t,requested)); |
328 |
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.
|
1495 | PetscCall(VecDestroy(&t)); |
329 |
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.
|
30 | } else PetscCall(BVResize(nep->V,requested,PETSC_FALSE)); |
330 | |||
331 | /* allocate W */ | ||
332 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1525 | if (nep->twosided) { |
333 |
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.
|
90 | PetscCall(BVGetRandomContext(nep->V,&rand)); /* make sure the random context is available when duplicating */ |
334 |
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.
|
90 | PetscCall(BVDestroy(&nep->W)); |
335 |
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.
|
90 | PetscCall(BVDuplicate(nep->V,&nep->W)); |
336 | } | ||
337 |
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.
|
291 | PetscFunctionReturn(PETSC_SUCCESS); |
338 | } | ||
339 |