Line data Source code
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 : SLEPc eigensolver: "jd"
12 :
13 : Method: Jacobi-Davidson
14 :
15 : Algorithm:
16 :
17 : Jacobi-Davidson with various subspace extraction and
18 : restart techniques.
19 :
20 : References:
21 :
22 : [1] G.L.G. Sleijpen and H.A. van der Vorst, "A Jacobi-Davidson
23 : iteration method for linear eigenvalue problems", SIAM J.
24 : Matrix Anal. Appl. 17(2):401-425, 1996.
25 :
26 : [2] E. Romero and J.E. Roman, "A parallel implementation of
27 : Davidson methods for large-scale eigenvalue problems in
28 : SLEPc", ACM Trans. Math. Software 40(2), Article 13, 2014.
29 : */
30 :
31 : #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/
32 : #include <../src/eps/impls/davidson/davidson.h>
33 :
34 21 : static PetscErrorCode EPSSetFromOptions_JD(EPS eps,PetscOptionItems *PetscOptionsObject)
35 : {
36 21 : PetscBool flg,flg2,op,orth;
37 21 : PetscInt opi,opi0;
38 21 : PetscReal opf;
39 :
40 21 : PetscFunctionBegin;
41 21 : PetscOptionsHeadBegin(PetscOptionsObject,"EPS Jacobi-Davidson (JD) Options");
42 :
43 21 : PetscCall(EPSJDGetKrylovStart(eps,&op));
44 21 : PetscCall(PetscOptionsBool("-eps_jd_krylov_start","Start the search subspace with a Krylov basis","EPSJDSetKrylovStart",op,&op,&flg));
45 21 : if (flg) PetscCall(EPSJDSetKrylovStart(eps,op));
46 :
47 21 : PetscCall(EPSJDGetBOrth(eps,&orth));
48 21 : PetscCall(PetscOptionsBool("-eps_jd_borth","Use B-orthogonalization in the search subspace","EPSJDSetBOrth",op,&op,&flg));
49 21 : if (flg) PetscCall(EPSJDSetBOrth(eps,op));
50 :
51 21 : PetscCall(EPSJDGetBlockSize(eps,&opi));
52 21 : PetscCall(PetscOptionsInt("-eps_jd_blocksize","Number of vectors to add to the search subspace","EPSJDSetBlockSize",opi,&opi,&flg));
53 21 : if (flg) PetscCall(EPSJDSetBlockSize(eps,opi));
54 :
55 21 : PetscCall(EPSJDGetRestart(eps,&opi,&opi0));
56 21 : PetscCall(PetscOptionsInt("-eps_jd_minv","Size of the search subspace after restarting","EPSJDSetRestart",opi,&opi,&flg));
57 21 : PetscCall(PetscOptionsInt("-eps_jd_plusk","Number of eigenvectors saved from the previous iteration when restarting","EPSJDSetRestart",opi0,&opi0,&flg2));
58 21 : if (flg || flg2) PetscCall(EPSJDSetRestart(eps,opi,opi0));
59 :
60 21 : PetscCall(EPSJDGetInitialSize(eps,&opi));
61 21 : PetscCall(PetscOptionsInt("-eps_jd_initial_size","Initial size of the search subspace","EPSJDSetInitialSize",opi,&opi,&flg));
62 21 : if (flg) PetscCall(EPSJDSetInitialSize(eps,opi));
63 :
64 21 : PetscCall(EPSJDGetFix(eps,&opf));
65 21 : PetscCall(PetscOptionsReal("-eps_jd_fix","Tolerance for changing the target in the correction equation","EPSJDSetFix",opf,&opf,&flg));
66 21 : if (flg) PetscCall(EPSJDSetFix(eps,opf));
67 :
68 21 : PetscCall(EPSJDGetConstCorrectionTol(eps,&op));
69 21 : PetscCall(PetscOptionsBool("-eps_jd_const_correction_tol","Disable the dynamic stopping criterion when solving the correction equation","EPSJDSetConstCorrectionTol",op,&op,&flg));
70 21 : if (flg) PetscCall(EPSJDSetConstCorrectionTol(eps,op));
71 :
72 21 : PetscOptionsHeadEnd();
73 21 : PetscFunctionReturn(PETSC_SUCCESS);
74 : }
75 :
76 53 : static PetscErrorCode EPSSetDefaultST_JD(EPS eps)
77 : {
78 53 : KSP ksp;
79 :
80 53 : PetscFunctionBegin;
81 53 : if (!((PetscObject)eps->st)->type_name) {
82 21 : PetscCall(STSetType(eps->st,STPRECOND));
83 21 : PetscCall(STPrecondSetKSPHasMat(eps->st,PETSC_TRUE));
84 : }
85 53 : PetscCall(STGetKSP(eps->st,&ksp));
86 53 : if (!((PetscObject)ksp)->type_name) {
87 22 : PetscCall(KSPSetType(ksp,KSPBCGSL));
88 22 : PetscCall(KSPSetTolerances(ksp,1e-4,PETSC_CURRENT,PETSC_CURRENT,90));
89 : }
90 53 : PetscFunctionReturn(PETSC_SUCCESS);
91 : }
92 :
93 32 : static PetscErrorCode EPSSetUp_JD(EPS eps)
94 : {
95 32 : PetscBool t;
96 32 : KSP ksp;
97 :
98 32 : PetscFunctionBegin;
99 : /* Setup common for all davidson solvers */
100 32 : PetscCall(EPSSetUp_XD(eps));
101 :
102 : /* Check some constraints */
103 32 : PetscCall(STGetKSP(eps->st,&ksp));
104 32 : PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&t));
105 32 : PetscCheck(!t,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"EPSJD does not work with KSPPREONLY");
106 32 : PetscFunctionReturn(PETSC_SUCCESS);
107 : }
108 :
109 0 : static PetscErrorCode EPSView_JD(EPS eps,PetscViewer viewer)
110 : {
111 0 : PetscBool isascii,opb;
112 0 : PetscReal opf;
113 0 : PetscInt opi,opi0;
114 :
115 0 : PetscFunctionBegin;
116 0 : PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii));
117 0 : if (isascii) {
118 0 : PetscCall(EPSXDGetBOrth_XD(eps,&opb));
119 0 : if (opb) PetscCall(PetscViewerASCIIPrintf(viewer," search subspace is B-orthogonalized\n"));
120 0 : else PetscCall(PetscViewerASCIIPrintf(viewer," search subspace is orthogonalized\n"));
121 0 : PetscCall(EPSXDGetBlockSize_XD(eps,&opi));
122 0 : PetscCall(PetscViewerASCIIPrintf(viewer," block size=%" PetscInt_FMT "\n",opi));
123 0 : PetscCall(EPSXDGetKrylovStart_XD(eps,&opb));
124 0 : if (!opb) PetscCall(PetscViewerASCIIPrintf(viewer," type of the initial subspace: non-Krylov\n"));
125 0 : else PetscCall(PetscViewerASCIIPrintf(viewer," type of the initial subspace: Krylov\n"));
126 0 : PetscCall(EPSXDGetRestart_XD(eps,&opi,&opi0));
127 0 : PetscCall(PetscViewerASCIIPrintf(viewer," size of the subspace after restarting: %" PetscInt_FMT "\n",opi));
128 0 : PetscCall(PetscViewerASCIIPrintf(viewer," number of vectors after restarting from the previous iteration: %" PetscInt_FMT "\n",opi0));
129 :
130 0 : PetscCall(EPSJDGetFix_JD(eps,&opf));
131 0 : PetscCall(PetscViewerASCIIPrintf(viewer," threshold for changing the target in the correction equation (fix): %g\n",(double)opf));
132 :
133 0 : PetscCall(EPSJDGetConstCorrectionTol_JD(eps,&opb));
134 0 : if (!opb) PetscCall(PetscViewerASCIIPrintf(viewer," using dynamic tolerance for the correction equation\n"));
135 : }
136 0 : PetscFunctionReturn(PETSC_SUCCESS);
137 : }
138 :
139 22 : static PetscErrorCode EPSDestroy_JD(EPS eps)
140 : {
141 22 : PetscFunctionBegin;
142 22 : PetscCall(PetscFree(eps->data));
143 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetKrylovStart_C",NULL));
144 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetKrylovStart_C",NULL));
145 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetBlockSize_C",NULL));
146 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetBlockSize_C",NULL));
147 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetRestart_C",NULL));
148 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetRestart_C",NULL));
149 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetInitialSize_C",NULL));
150 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetInitialSize_C",NULL));
151 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetFix_C",NULL));
152 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetFix_C",NULL));
153 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetConstCorrectionTol_C",NULL));
154 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetConstCorrectionTol_C",NULL));
155 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetBOrth_C",NULL));
156 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetBOrth_C",NULL));
157 22 : PetscFunctionReturn(PETSC_SUCCESS);
158 : }
159 :
160 : /*@
161 : EPSJDSetKrylovStart - Activates or deactivates starting the searching
162 : subspace with a Krylov basis.
163 :
164 : Logically Collective
165 :
166 : Input Parameters:
167 : + eps - the eigenproblem solver context
168 : - krylovstart - boolean flag
169 :
170 : Options Database Key:
171 : . -eps_jd_krylov_start - Activates starting the searching subspace with a
172 : Krylov basis
173 :
174 : Level: advanced
175 :
176 : .seealso: EPSJDGetKrylovStart()
177 : @*/
178 1 : PetscErrorCode EPSJDSetKrylovStart(EPS eps,PetscBool krylovstart)
179 : {
180 1 : PetscFunctionBegin;
181 1 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
182 3 : PetscValidLogicalCollectiveBool(eps,krylovstart,2);
183 1 : PetscTryMethod(eps,"EPSJDSetKrylovStart_C",(EPS,PetscBool),(eps,krylovstart));
184 1 : PetscFunctionReturn(PETSC_SUCCESS);
185 : }
186 :
187 : /*@
188 : EPSJDGetKrylovStart - Returns a flag indicating if the searching subspace is started with a
189 : Krylov basis.
190 :
191 : Not Collective
192 :
193 : Input Parameter:
194 : . eps - the eigenproblem solver context
195 :
196 : Output Parameters:
197 : . krylovstart - boolean flag indicating if the searching subspace is started
198 : with a Krylov basis
199 :
200 : Level: advanced
201 :
202 : .seealso: EPSJDSetKrylovStart()
203 : @*/
204 21 : PetscErrorCode EPSJDGetKrylovStart(EPS eps,PetscBool *krylovstart)
205 : {
206 21 : PetscFunctionBegin;
207 21 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
208 21 : PetscAssertPointer(krylovstart,2);
209 21 : PetscUseMethod(eps,"EPSJDGetKrylovStart_C",(EPS,PetscBool*),(eps,krylovstart));
210 21 : PetscFunctionReturn(PETSC_SUCCESS);
211 : }
212 :
213 : /*@
214 : EPSJDSetBlockSize - Sets the number of vectors to be added to the searching space
215 : in every iteration.
216 :
217 : Logically Collective
218 :
219 : Input Parameters:
220 : + eps - the eigenproblem solver context
221 : - blocksize - number of vectors added to the search space in every iteration
222 :
223 : Options Database Key:
224 : . -eps_jd_blocksize - number of vectors added to the searching space every iteration
225 :
226 : Level: advanced
227 :
228 : .seealso: EPSJDSetKrylovStart()
229 : @*/
230 1 : PetscErrorCode EPSJDSetBlockSize(EPS eps,PetscInt blocksize)
231 : {
232 1 : PetscFunctionBegin;
233 1 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
234 3 : PetscValidLogicalCollectiveInt(eps,blocksize,2);
235 1 : PetscTryMethod(eps,"EPSJDSetBlockSize_C",(EPS,PetscInt),(eps,blocksize));
236 1 : PetscFunctionReturn(PETSC_SUCCESS);
237 : }
238 :
239 : /*@
240 : EPSJDGetBlockSize - Returns the number of vectors to be added to the searching space
241 : in every iteration.
242 :
243 : Not Collective
244 :
245 : Input Parameter:
246 : . eps - the eigenproblem solver context
247 :
248 : Output Parameter:
249 : . blocksize - number of vectors added to the search space in every iteration
250 :
251 : Level: advanced
252 :
253 : .seealso: EPSJDSetBlockSize()
254 : @*/
255 21 : PetscErrorCode EPSJDGetBlockSize(EPS eps,PetscInt *blocksize)
256 : {
257 21 : PetscFunctionBegin;
258 21 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
259 21 : PetscAssertPointer(blocksize,2);
260 21 : PetscUseMethod(eps,"EPSJDGetBlockSize_C",(EPS,PetscInt*),(eps,blocksize));
261 21 : PetscFunctionReturn(PETSC_SUCCESS);
262 : }
263 :
264 : /*@
265 : EPSJDSetRestart - Sets the number of vectors of the searching space after
266 : restarting and the number of vectors saved from the previous iteration.
267 :
268 : Logically Collective
269 :
270 : Input Parameters:
271 : + eps - the eigenproblem solver context
272 : . minv - number of vectors of the searching subspace after restarting
273 : - plusk - number of vectors saved from the previous iteration
274 :
275 : Options Database Keys:
276 : + -eps_jd_minv - number of vectors of the searching subspace after restarting
277 : - -eps_jd_plusk - number of vectors saved from the previous iteration
278 :
279 : Note:
280 : PETSC_CURRENT can be used to preserve the current value of any of the
281 : arguments, and PETSC_DETERMINE to set them to a default value.
282 :
283 : Level: advanced
284 :
285 : .seealso: EPSJDGetRestart()
286 : @*/
287 2 : PetscErrorCode EPSJDSetRestart(EPS eps,PetscInt minv,PetscInt plusk)
288 : {
289 2 : PetscFunctionBegin;
290 2 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
291 6 : PetscValidLogicalCollectiveInt(eps,minv,2);
292 6 : PetscValidLogicalCollectiveInt(eps,plusk,3);
293 2 : PetscTryMethod(eps,"EPSJDSetRestart_C",(EPS,PetscInt,PetscInt),(eps,minv,plusk));
294 2 : PetscFunctionReturn(PETSC_SUCCESS);
295 : }
296 :
297 : /*@
298 : EPSJDGetRestart - Gets the number of vectors of the searching space after
299 : restarting and the number of vectors saved from the previous iteration.
300 :
301 : Not Collective
302 :
303 : Input Parameter:
304 : . eps - the eigenproblem solver context
305 :
306 : Output Parameters:
307 : + minv - number of vectors of the searching subspace after restarting
308 : - plusk - number of vectors saved from the previous iteration
309 :
310 : Level: advanced
311 :
312 : .seealso: EPSJDSetRestart()
313 : @*/
314 21 : PetscErrorCode EPSJDGetRestart(EPS eps,PetscInt *minv,PetscInt *plusk)
315 : {
316 21 : PetscFunctionBegin;
317 21 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
318 21 : PetscUseMethod(eps,"EPSJDGetRestart_C",(EPS,PetscInt*,PetscInt*),(eps,minv,plusk));
319 21 : PetscFunctionReturn(PETSC_SUCCESS);
320 : }
321 :
322 : /*@
323 : EPSJDSetInitialSize - Sets the initial size of the searching space.
324 :
325 : Logically Collective
326 :
327 : Input Parameters:
328 : + eps - the eigenproblem solver context
329 : - initialsize - number of vectors of the initial searching subspace
330 :
331 : Options Database Key:
332 : . -eps_jd_initial_size - number of vectors of the initial searching subspace
333 :
334 : Notes:
335 : If EPSJDGetKrylovStart() is PETSC_FALSE and the user provides vectors with
336 : EPSSetInitialSpace(), up to initialsize vectors will be used; and if the
337 : provided vectors are not enough, the solver completes the subspace with
338 : random vectors. In the case of EPSJDGetKrylovStart() being PETSC_TRUE, the solver
339 : gets the first vector provided by the user or, if not available, a random vector,
340 : and expands the Krylov basis up to initialsize vectors.
341 :
342 : Level: advanced
343 :
344 : .seealso: EPSJDGetInitialSize(), EPSJDGetKrylovStart()
345 : @*/
346 1 : PetscErrorCode EPSJDSetInitialSize(EPS eps,PetscInt initialsize)
347 : {
348 1 : PetscFunctionBegin;
349 1 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
350 3 : PetscValidLogicalCollectiveInt(eps,initialsize,2);
351 1 : PetscTryMethod(eps,"EPSJDSetInitialSize_C",(EPS,PetscInt),(eps,initialsize));
352 1 : PetscFunctionReturn(PETSC_SUCCESS);
353 : }
354 :
355 : /*@
356 : EPSJDGetInitialSize - Returns the initial size of the searching space.
357 :
358 : Not Collective
359 :
360 : Input Parameter:
361 : . eps - the eigenproblem solver context
362 :
363 : Output Parameter:
364 : . initialsize - number of vectors of the initial searching subspace
365 :
366 : Notes:
367 : If EPSJDGetKrylovStart() is PETSC_FALSE and the user provides vectors with
368 : EPSSetInitialSpace(), up to initialsize vectors will be used; and if the
369 : provided vectors are not enough, the solver completes the subspace with
370 : random vectors. In the case of EPSJDGetKrylovStart() being PETSC_TRUE, the solver
371 : gets the first vector provided by the user or, if not available, a random vector,
372 : and expands the Krylov basis up to initialsize vectors.
373 :
374 : Level: advanced
375 :
376 : .seealso: EPSJDSetInitialSize(), EPSJDGetKrylovStart()
377 : @*/
378 21 : PetscErrorCode EPSJDGetInitialSize(EPS eps,PetscInt *initialsize)
379 : {
380 21 : PetscFunctionBegin;
381 21 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
382 21 : PetscAssertPointer(initialsize,2);
383 21 : PetscUseMethod(eps,"EPSJDGetInitialSize_C",(EPS,PetscInt*),(eps,initialsize));
384 21 : PetscFunctionReturn(PETSC_SUCCESS);
385 : }
386 :
387 1 : static PetscErrorCode EPSJDSetFix_JD(EPS eps,PetscReal fix)
388 : {
389 1 : EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
390 :
391 1 : PetscFunctionBegin;
392 1 : if (fix == (PetscReal)PETSC_DEFAULT || fix == (PetscReal)PETSC_DECIDE) fix = 0.01;
393 1 : PetscCheck(fix>0.0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid fix value, must be >0");
394 1 : data->fix = fix;
395 1 : PetscFunctionReturn(PETSC_SUCCESS);
396 : }
397 :
398 : /*@
399 : EPSJDSetFix - Sets the threshold for changing the target in the correction
400 : equation.
401 :
402 : Logically Collective
403 :
404 : Input Parameters:
405 : + eps - the eigenproblem solver context
406 : - fix - threshold for changing the target
407 :
408 : Options Database Key:
409 : . -eps_jd_fix - the fix value
410 :
411 : Note:
412 : The target in the correction equation is fixed at the first iterations.
413 : When the norm of the residual vector is lower than the fix value,
414 : the target is set to the corresponding eigenvalue.
415 :
416 : Level: advanced
417 :
418 : .seealso: EPSJDGetFix()
419 : @*/
420 1 : PetscErrorCode EPSJDSetFix(EPS eps,PetscReal fix)
421 : {
422 1 : PetscFunctionBegin;
423 1 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
424 3 : PetscValidLogicalCollectiveReal(eps,fix,2);
425 1 : PetscTryMethod(eps,"EPSJDSetFix_C",(EPS,PetscReal),(eps,fix));
426 1 : PetscFunctionReturn(PETSC_SUCCESS);
427 : }
428 :
429 21 : PetscErrorCode EPSJDGetFix_JD(EPS eps,PetscReal *fix)
430 : {
431 21 : EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
432 :
433 21 : PetscFunctionBegin;
434 21 : *fix = data->fix;
435 21 : PetscFunctionReturn(PETSC_SUCCESS);
436 : }
437 :
438 : /*@
439 : EPSJDGetFix - Returns the threshold for changing the target in the correction
440 : equation.
441 :
442 : Not Collective
443 :
444 : Input Parameter:
445 : . eps - the eigenproblem solver context
446 :
447 : Output Parameter:
448 : . fix - threshold for changing the target
449 :
450 : Note:
451 : The target in the correction equation is fixed at the first iterations.
452 : When the norm of the residual vector is lower than the fix value,
453 : the target is set to the corresponding eigenvalue.
454 :
455 : Level: advanced
456 :
457 : .seealso: EPSJDSetFix()
458 : @*/
459 21 : PetscErrorCode EPSJDGetFix(EPS eps,PetscReal *fix)
460 : {
461 21 : PetscFunctionBegin;
462 21 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
463 21 : PetscAssertPointer(fix,2);
464 21 : PetscUseMethod(eps,"EPSJDGetFix_C",(EPS,PetscReal*),(eps,fix));
465 21 : PetscFunctionReturn(PETSC_SUCCESS);
466 : }
467 :
468 1 : static PetscErrorCode EPSJDSetConstCorrectionTol_JD(EPS eps,PetscBool constant)
469 : {
470 1 : EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
471 :
472 1 : PetscFunctionBegin;
473 1 : data->dynamic = PetscNot(constant);
474 1 : PetscFunctionReturn(PETSC_SUCCESS);
475 : }
476 :
477 : /*@
478 : EPSJDSetConstCorrectionTol - If true, deactivates the dynamic stopping criterion
479 : (also called Newton) that sets the KSP relative tolerance
480 : to 0.5**i, where i is the number of EPS iterations from the last converged value.
481 :
482 : Logically Collective
483 :
484 : Input Parameters:
485 : + eps - the eigenproblem solver context
486 : - constant - if false, the KSP relative tolerance is set to 0.5**i.
487 :
488 : Options Database Key:
489 : . -eps_jd_const_correction_tol - Deactivates the dynamic stopping criterion.
490 :
491 : Level: advanced
492 :
493 : .seealso: EPSJDGetConstCorrectionTol()
494 : @*/
495 1 : PetscErrorCode EPSJDSetConstCorrectionTol(EPS eps,PetscBool constant)
496 : {
497 1 : PetscFunctionBegin;
498 1 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
499 3 : PetscValidLogicalCollectiveBool(eps,constant,2);
500 1 : PetscTryMethod(eps,"EPSJDSetConstCorrectionTol_C",(EPS,PetscBool),(eps,constant));
501 1 : PetscFunctionReturn(PETSC_SUCCESS);
502 : }
503 :
504 21 : PetscErrorCode EPSJDGetConstCorrectionTol_JD(EPS eps,PetscBool *constant)
505 : {
506 21 : EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
507 :
508 21 : PetscFunctionBegin;
509 21 : *constant = PetscNot(data->dynamic);
510 21 : PetscFunctionReturn(PETSC_SUCCESS);
511 : }
512 :
513 : /*@
514 : EPSJDGetConstCorrectionTol - Returns a flag indicating if the dynamic stopping is being used for
515 : solving the correction equation.
516 :
517 : Not Collective
518 :
519 : Input Parameter:
520 : . eps - the eigenproblem solver context
521 :
522 : Output Parameter:
523 : . constant - boolean flag indicating if the dynamic stopping criterion is not being used.
524 :
525 : Notes:
526 : If the flag is false the KSP relative tolerance is set to 0.5**i, where i is the number
527 : of EPS iterations from the last converged value.
528 :
529 : Level: advanced
530 :
531 : .seealso: EPSJDSetConstCorrectionTol()
532 : @*/
533 21 : PetscErrorCode EPSJDGetConstCorrectionTol(EPS eps,PetscBool *constant)
534 : {
535 21 : PetscFunctionBegin;
536 21 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
537 21 : PetscAssertPointer(constant,2);
538 21 : PetscUseMethod(eps,"EPSJDGetConstCorrectionTol_C",(EPS,PetscBool*),(eps,constant));
539 21 : PetscFunctionReturn(PETSC_SUCCESS);
540 : }
541 :
542 : /*@
543 : EPSJDSetBOrth - Selects the orthogonalization that will be used in the search
544 : subspace in case of generalized Hermitian problems.
545 :
546 : Logically Collective
547 :
548 : Input Parameters:
549 : + eps - the eigenproblem solver context
550 : - borth - whether to B-orthogonalize the search subspace
551 :
552 : Options Database Key:
553 : . -eps_jd_borth - Set the orthogonalization used in the search subspace
554 :
555 : Level: advanced
556 :
557 : .seealso: EPSJDGetBOrth()
558 : @*/
559 1 : PetscErrorCode EPSJDSetBOrth(EPS eps,PetscBool borth)
560 : {
561 1 : PetscFunctionBegin;
562 1 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
563 3 : PetscValidLogicalCollectiveBool(eps,borth,2);
564 1 : PetscTryMethod(eps,"EPSJDSetBOrth_C",(EPS,PetscBool),(eps,borth));
565 1 : PetscFunctionReturn(PETSC_SUCCESS);
566 : }
567 :
568 : /*@
569 : EPSJDGetBOrth - Returns the orthogonalization used in the search
570 : subspace in case of generalized Hermitian problems.
571 :
572 : Not Collective
573 :
574 : Input Parameter:
575 : . eps - the eigenproblem solver context
576 :
577 : Output Parameters:
578 : . borth - whether to B-orthogonalize the search subspace
579 :
580 : Level: advanced
581 :
582 : .seealso: EPSJDSetBOrth()
583 : @*/
584 21 : PetscErrorCode EPSJDGetBOrth(EPS eps,PetscBool *borth)
585 : {
586 21 : PetscFunctionBegin;
587 21 : PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
588 21 : PetscAssertPointer(borth,2);
589 21 : PetscUseMethod(eps,"EPSJDGetBOrth_C",(EPS,PetscBool*),(eps,borth));
590 21 : PetscFunctionReturn(PETSC_SUCCESS);
591 : }
592 :
593 22 : SLEPC_EXTERN PetscErrorCode EPSCreate_JD(EPS eps)
594 : {
595 22 : EPS_DAVIDSON *data;
596 :
597 22 : PetscFunctionBegin;
598 22 : PetscCall(PetscNew(&data));
599 22 : eps->data = (void*)data;
600 :
601 22 : data->blocksize = 1;
602 22 : data->initialsize = 0;
603 22 : data->minv = 0;
604 22 : data->plusk = PETSC_DETERMINE;
605 22 : data->ipB = PETSC_TRUE;
606 22 : data->fix = 0.01;
607 22 : data->krylovstart = PETSC_FALSE;
608 22 : data->dynamic = PETSC_FALSE;
609 :
610 22 : eps->useds = PETSC_TRUE;
611 22 : eps->categ = EPS_CATEGORY_PRECOND;
612 :
613 22 : eps->ops->solve = EPSSolve_XD;
614 22 : eps->ops->setup = EPSSetUp_JD;
615 22 : eps->ops->setupsort = EPSSetUpSort_Default;
616 22 : eps->ops->setfromoptions = EPSSetFromOptions_JD;
617 22 : eps->ops->destroy = EPSDestroy_JD;
618 22 : eps->ops->reset = EPSReset_XD;
619 22 : eps->ops->view = EPSView_JD;
620 22 : eps->ops->backtransform = EPSBackTransform_Default;
621 22 : eps->ops->computevectors = EPSComputeVectors_XD;
622 22 : eps->ops->setdefaultst = EPSSetDefaultST_JD;
623 :
624 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetKrylovStart_C",EPSXDSetKrylovStart_XD));
625 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetKrylovStart_C",EPSXDGetKrylovStart_XD));
626 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetBlockSize_C",EPSXDSetBlockSize_XD));
627 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetBlockSize_C",EPSXDGetBlockSize_XD));
628 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetRestart_C",EPSXDSetRestart_XD));
629 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetRestart_C",EPSXDGetRestart_XD));
630 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetInitialSize_C",EPSXDSetInitialSize_XD));
631 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetInitialSize_C",EPSXDGetInitialSize_XD));
632 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetFix_C",EPSJDSetFix_JD));
633 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetFix_C",EPSJDGetFix_JD));
634 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetConstCorrectionTol_C",EPSJDSetConstCorrectionTol_JD));
635 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetConstCorrectionTol_C",EPSJDGetConstCorrectionTol_JD));
636 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDSetBOrth_C",EPSXDSetBOrth_XD));
637 22 : PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSJDGetBOrth_C",EPSXDGetBOrth_XD));
638 22 : PetscFunctionReturn(PETSC_SUCCESS);
639 : }
|