| 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 | LME routines related to options that can be set via the command-line | ||
| 12 | or procedurally | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <slepc/private/lmeimpl.h> /*I "slepclme.h" I*/ | ||
| 16 | #include <petscdraw.h> | ||
| 17 | |||
| 18 | /*@C | ||
| 19 | LMEMonitorSetFromOptions - Sets a monitor function and viewer appropriate for the type | ||
| 20 | indicated by the user. | ||
| 21 | |||
| 22 | Collective | ||
| 23 | |||
| 24 | Input Parameters: | ||
| 25 | + lme - the linear matrix equation solver context | ||
| 26 | . opt - the command line option for this monitor | ||
| 27 | . name - the monitor type one is seeking | ||
| 28 | - ctx - an optional user context for the monitor, or `NULL` | ||
| 29 | |||
| 30 | Level: developer | ||
| 31 | |||
| 32 | .seealso: [](ch:lme), `LMEMonitorSet()` | ||
| 33 | @*/ | ||
| 34 | 99 | PetscErrorCode LMEMonitorSetFromOptions(LME lme,const char opt[],const char name[],void *ctx) | |
| 35 | { | ||
| 36 | 99 | PetscErrorCode (*mfunc)(LME,PetscInt,PetscReal,void*); | |
| 37 | 99 | PetscErrorCode (*cfunc)(PetscViewer,PetscViewerFormat,void*,PetscViewerAndFormat**); | |
| 38 | 99 | PetscErrorCode (*dfunc)(PetscViewerAndFormat**); | |
| 39 | 99 | PetscViewerAndFormat *vf; | |
| 40 | 99 | PetscViewer viewer; | |
| 41 | 99 | PetscViewerFormat format; | |
| 42 | 99 | PetscViewerType vtype; | |
| 43 | 99 | char key[PETSC_MAX_PATH_LEN]; | |
| 44 | 99 | PetscBool flg; | |
| 45 | |||
| 46 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
99 | PetscFunctionBegin; |
| 47 |
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.
|
99 | PetscCall(PetscOptionsCreateViewer(PetscObjectComm((PetscObject)lme),((PetscObject)lme)->options,((PetscObject)lme)->prefix,opt,&viewer,&format,&flg)); |
| 48 |
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.
|
99 | if (!flg) PetscFunctionReturn(PETSC_SUCCESS); |
| 49 | |||
| 50 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(PetscViewerGetType(viewer,&vtype)); |
| 51 |
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.
|
18 | PetscCall(SlepcMonitorMakeKey_Internal(name,vtype,format,key)); |
| 52 |
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.
|
18 | PetscCall(PetscFunctionListFind(LMEMonitorList,key,&mfunc)); |
| 53 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
18 | PetscCheck(mfunc,PetscObjectComm((PetscObject)lme),PETSC_ERR_SUP,"Specified viewer and format not supported"); |
| 54 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(PetscFunctionListFind(LMEMonitorCreateList,key,&cfunc)); |
| 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.
|
18 | PetscCall(PetscFunctionListFind(LMEMonitorDestroyList,key,&dfunc)); |
| 56 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
|
18 | if (!cfunc) cfunc = PetscViewerAndFormatCreate_Internal; |
| 57 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
18 | if (!dfunc) dfunc = PetscViewerAndFormatDestroy; |
| 58 | |||
| 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.
|
18 | PetscCall((*cfunc)(viewer,format,ctx,&vf)); |
| 60 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(PetscViewerDestroy(&viewer)); |
| 61 |
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.
|
18 | PetscCall(LMEMonitorSet(lme,mfunc,vf,(PetscErrorCode(*)(void **))dfunc)); |
| 62 |
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.
|
3 | PetscFunctionReturn(PETSC_SUCCESS); |
| 63 | } | ||
| 64 | |||
| 65 | /*@ | ||
| 66 | LMESetFromOptions - Sets `LME` options from the options database. | ||
| 67 | This routine must be called before `LMESetUp()` if the user is to be | ||
| 68 | allowed to configure the solver. | ||
| 69 | |||
| 70 | Collective | ||
| 71 | |||
| 72 | Input Parameter: | ||
| 73 | . lme - the linear matrix equation solver context | ||
| 74 | |||
| 75 | Note: | ||
| 76 | To see all options, run your program with the `-help` option. | ||
| 77 | |||
| 78 | Level: beginner | ||
| 79 | |||
| 80 | .seealso: [](ch:lme), `LMESetOptionsPrefix()` | ||
| 81 | @*/ | ||
| 82 | 99 | PetscErrorCode LMESetFromOptions(LME lme) | |
| 83 | { | ||
| 84 | 99 | char type[256]; | |
| 85 | 99 | PetscBool set,flg,flg1,flg2; | |
| 86 | 99 | PetscReal r; | |
| 87 | 99 | PetscInt i; | |
| 88 | |||
| 89 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
99 | PetscFunctionBegin; |
| 90 |
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.
|
99 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 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.
|
99 | PetscCall(LMERegisterAll()); |
| 92 |
8/10✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
|
297 | PetscObjectOptionsBegin((PetscObject)lme); |
| 93 |
6/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
99 | PetscCall(PetscOptionsFList("-lme_type","Linear matrix equation","LMESetType",LMEList,(char*)(((PetscObject)lme)->type_name?((PetscObject)lme)->type_name:LMEKRYLOV),type,sizeof(type),&flg)); |
| 94 |
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.
|
99 | if (flg) PetscCall(LMESetType(lme,type)); |
| 95 |
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.
|
99 | else if (!((PetscObject)lme)->type_name) PetscCall(LMESetType(lme,LMEKRYLOV)); |
| 96 | |||
| 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.
|
99 | PetscCall(PetscOptionsBoolGroupBegin("-lme_lyapunov","Continuous-time Lyapunov equation","LMESetProblemType",&flg)); |
| 98 |
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.
|
99 | if (flg) PetscCall(LMESetProblemType(lme,LME_LYAPUNOV)); |
| 99 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
99 | PetscCall(PetscOptionsBoolGroup("-lme_sylvester","Continuous-time Sylvester equation","LMESetProblemType",&flg)); |
| 100 |
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.
|
99 | if (flg) PetscCall(LMESetProblemType(lme,LME_SYLVESTER)); |
| 101 |
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.
|
99 | PetscCall(PetscOptionsBoolGroup("-lme_gen_lyapunov","Generalized Lyapunov equation","LMESetProblemType",&flg)); |
| 102 |
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.
|
99 | if (flg) PetscCall(LMESetProblemType(lme,LME_GEN_LYAPUNOV)); |
| 103 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
99 | PetscCall(PetscOptionsBoolGroup("-lme_gen_sylvester","Generalized Sylvester equation","LMESetProblemType",&flg)); |
| 104 |
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.
|
99 | if (flg) PetscCall(LMESetProblemType(lme,LME_GEN_SYLVESTER)); |
| 105 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
99 | PetscCall(PetscOptionsBoolGroup("-lme_dt_lyapunov","Discrete-time Lyapunov equation","LMESetProblemType",&flg)); |
| 106 |
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.
|
99 | if (flg) PetscCall(LMESetProblemType(lme,LME_DT_LYAPUNOV)); |
| 107 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
99 | PetscCall(PetscOptionsBoolGroupEnd("-lme_stein","Stein equation","LMESetProblemType",&flg)); |
| 108 |
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.
|
99 | if (flg) PetscCall(LMESetProblemType(lme,LME_STEIN)); |
| 109 | |||
| 110 | 99 | i = lme->max_it; | |
| 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.
|
99 | PetscCall(PetscOptionsInt("-lme_max_it","Maximum number of iterations","LMESetTolerances",lme->max_it,&i,&flg1)); |
| 112 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
99 | if (!flg1) i = PETSC_DETERMINE; |
| 113 | 99 | r = lme->tol; | |
| 114 |
7/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 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
176 | PetscCall(PetscOptionsReal("-lme_tol","Tolerance","LMESetTolerances",SlepcDefaultTol(lme->tol),&r,&flg2)); |
| 115 |
2/10✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ 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.
|
99 | if (flg1 || flg2) PetscCall(LMESetTolerances(lme,r,i)); |
| 116 | |||
| 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.
|
99 | PetscCall(PetscOptionsInt("-lme_ncv","Number of basis vectors","LMESetDimensions",lme->ncv,&i,&flg)); |
| 118 |
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.
|
99 | if (flg) PetscCall(LMESetDimensions(lme,i)); |
| 119 | |||
| 120 |
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.
|
99 | PetscCall(PetscOptionsBool("-lme_error_if_not_converged","Generate error if solver does not converge","LMESetErrorIfNotConverged",lme->errorifnotconverged,&lme->errorifnotconverged,NULL)); |
| 121 | |||
| 122 | /* -----------------------------------------------------------------------*/ | ||
| 123 | /* | ||
| 124 | Cancels all monitors hardwired into code before call to LMESetFromOptions() | ||
| 125 | */ | ||
| 126 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
99 | PetscCall(PetscOptionsBool("-lme_monitor_cancel","Remove any hardwired monitor routines","LMEMonitorCancel",PETSC_FALSE,&flg,&set)); |
| 127 |
7/10✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ 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.
|
99 | if (set && flg) PetscCall(LMEMonitorCancel(lme)); |
| 128 |
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.
|
99 | PetscCall(LMEMonitorSetFromOptions(lme,"-lme_monitor","error_estimate",NULL)); |
| 129 | |||
| 130 | /* -----------------------------------------------------------------------*/ | ||
| 131 |
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.
|
99 | PetscCall(PetscOptionsName("-lme_view","Print detailed information on solver used","LMEView",&set)); |
| 132 | |||
| 133 |
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.
|
99 | PetscTryTypeMethod(lme,setfromoptions,PetscOptionsObject); |
| 134 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
99 | PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)lme,PetscOptionsObject)); |
| 135 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
99 | PetscOptionsEnd(); |
| 136 | |||
| 137 |
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.
|
99 | if (!lme->V) PetscCall(LMEGetBV(lme,&lme->V)); |
| 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.
|
99 | PetscCall(BVSetFromOptions(lme->V)); |
| 139 |
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.
|
16 | PetscFunctionReturn(PETSC_SUCCESS); |
| 140 | } | ||
| 141 | |||
| 142 | /*@ | ||
| 143 | LMESetProblemType - Specifies the type of matrix equation to be solved. | ||
| 144 | |||
| 145 | Logically Collective | ||
| 146 | |||
| 147 | Input Parameters: | ||
| 148 | + lme - the linear matrix equation solver context | ||
| 149 | - type - a known type of matrix equation | ||
| 150 | |||
| 151 | Options Database Keys: | ||
| 152 | + -lme_lyapunov - continuous-time Lyapunov equation | ||
| 153 | . -lme_sylvester - Sylvester equation | ||
| 154 | . -lme_gen_lyapunov - generalized Lyapunov equation | ||
| 155 | . -lme_gen_sylvester - generalized Sylvester equation | ||
| 156 | . -lme_dt_lyapunov - discrete-time Lyapunov equation | ||
| 157 | - -lme_stein - Stein equation | ||
| 158 | |||
| 159 | Notes: | ||
| 160 | The coefficient matrices $A$, $B$, $D$, $E$ must be provided via `LMESetCoefficients()`, | ||
| 161 | but some of them are optional depending on the matrix equation. | ||
| 162 | |||
| 163 | Problem Type | Equation |`LMEProblemType` | $A$ | $B$ | $D$ | $E$ | ||
| 164 | -------------------------|------------------|-------------------|-----|-----|-----|----- | ||
| 165 | Continuous-Time Lyapunov | $AX+XA^*=-C$ |`LME_LYAPUNOV` | yes |$A^*$| - | - | ||
| 166 | Sylvester | $AX+XB=C$ |`LME_SYLVESTER` | yes | yes | - | - | ||
| 167 | Generalized Lyapunov | $AXD^*+DXA^*=-C$ |`LME_GEN_LYAPUNOV` | yes |$A^*$| yes |$D^*$ | ||
| 168 | Generalized Sylvester | $AXE+DXB=C$ |`LME_GEN_SYLVESTER`| yes | yes | yes | yes | ||
| 169 | Discrete-Time Lyapunov | $AXA^*-X=-C$ |`LME_DT_LYAPUNOV` | yes | - | - |$A^*$ | ||
| 170 | Stein | $AXE-X=-C$ |`LME_STEIN` | yes | - | - | yes | ||
| 171 | |||
| 172 | In the above table, the notation $A^*$ means that this matrix need | ||
| 173 | not be passed, but the user may choose to pass an explicit transpose | ||
| 174 | of matrix $A$ (for improved efficiency). | ||
| 175 | |||
| 176 | Also note that some of the equation types impose restrictions on the | ||
| 177 | properties of the coefficient matrices and possibly on the right-hand | ||
| 178 | side $C$. | ||
| 179 | |||
| 180 | Level: beginner | ||
| 181 | |||
| 182 | .seealso: [](ch:lme), `LMESetCoefficients()`, `LMESetType()`, `LMEGetProblemType()`, `LMEProblemType` | ||
| 183 | @*/ | ||
| 184 | 113 | PetscErrorCode LMESetProblemType(LME lme,LMEProblemType type) | |
| 185 | { | ||
| 186 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
113 | PetscFunctionBegin; |
| 187 |
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.
|
113 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 188 |
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.
|
113 | PetscValidLogicalCollectiveEnum(lme,type,2); |
| 189 |
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.
|
113 | if (type == lme->problem_type) PetscFunctionReturn(PETSC_SUCCESS); |
| 190 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
56 | switch (type) { |
| 191 | case LME_LYAPUNOV: | ||
| 192 | case LME_SYLVESTER: | ||
| 193 | case LME_GEN_LYAPUNOV: | ||
| 194 | case LME_GEN_SYLVESTER: | ||
| 195 | case LME_DT_LYAPUNOV: | ||
| 196 | case LME_STEIN: | ||
| 197 | 56 | break; | |
| 198 | ✗ | default: | |
| 199 | ✗ | SETERRQ(PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_WRONG,"Unknown matrix equation type"); | |
| 200 | } | ||
| 201 | 56 | lme->problem_type = type; | |
| 202 | 56 | lme->setupcalled = PETSC_FALSE; | |
| 203 |
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.
|
56 | PetscFunctionReturn(PETSC_SUCCESS); |
| 204 | } | ||
| 205 | |||
| 206 | /*@ | ||
| 207 | LMEGetProblemType - Gets the matrix equation type from the `LME` object. | ||
| 208 | |||
| 209 | Not Collective | ||
| 210 | |||
| 211 | Input Parameter: | ||
| 212 | . lme - the linear matrix equation solver context | ||
| 213 | |||
| 214 | Output Parameter: | ||
| 215 | . type - the problem type | ||
| 216 | |||
| 217 | Level: beginner | ||
| 218 | |||
| 219 | .seealso: [](ch:lme), `LMESetProblemType()`, `LMEProblemType` | ||
| 220 | @*/ | ||
| 221 | 56 | PetscErrorCode LMEGetProblemType(LME lme,LMEProblemType *type) | |
| 222 | { | ||
| 223 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
56 | PetscFunctionBegin; |
| 224 |
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.
|
56 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 225 |
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.
|
56 | PetscAssertPointer(type,2); |
| 226 | 56 | *type = lme->problem_type; | |
| 227 |
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.
|
56 | PetscFunctionReturn(PETSC_SUCCESS); |
| 228 | } | ||
| 229 | |||
| 230 | /*@ | ||
| 231 | LMEGetTolerances - Gets the tolerance and maximum iteration count used | ||
| 232 | by the `LME` convergence tests. | ||
| 233 | |||
| 234 | Not Collective | ||
| 235 | |||
| 236 | Input Parameter: | ||
| 237 | . lme - the linear matrix equation solver context | ||
| 238 | |||
| 239 | Output Parameters: | ||
| 240 | + tol - the convergence tolerance | ||
| 241 | - maxits - maximum number of iterations | ||
| 242 | |||
| 243 | Note: | ||
| 244 | The user can specify `NULL` for any parameter that is not needed. | ||
| 245 | |||
| 246 | Level: intermediate | ||
| 247 | |||
| 248 | .seealso: [](ch:lme), `LMESetTolerances()` | ||
| 249 | @*/ | ||
| 250 | 50 | PetscErrorCode LMEGetTolerances(LME lme,PetscReal *tol,PetscInt *maxits) | |
| 251 | { | ||
| 252 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
50 | PetscFunctionBegin; |
| 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.
|
50 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 254 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
50 | if (tol) *tol = lme->tol; |
| 255 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
50 | if (maxits) *maxits = lme->max_it; |
| 256 |
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.
|
50 | PetscFunctionReturn(PETSC_SUCCESS); |
| 257 | } | ||
| 258 | |||
| 259 | /*@ | ||
| 260 | LMESetTolerances - Sets the tolerance and maximum iteration count used | ||
| 261 | by the `LME` convergence tests. | ||
| 262 | |||
| 263 | Logically Collective | ||
| 264 | |||
| 265 | Input Parameters: | ||
| 266 | + lme - the linear matrix equation solver context | ||
| 267 | . tol - the convergence tolerance | ||
| 268 | - maxits - maximum number of iterations to use | ||
| 269 | |||
| 270 | Options Database Keys: | ||
| 271 | + -lme_tol \<tol\> - sets the convergence tolerance | ||
| 272 | - -lme_max_it \<maxits\> - sets the maximum number of iterations allowed | ||
| 273 | |||
| 274 | Notes: | ||
| 275 | Use `PETSC_CURRENT` to retain the current value of any of the parameters. | ||
| 276 | Use `PETSC_DETERMINE` for either argument to assign a default value computed | ||
| 277 | internally (may be different in each solver). | ||
| 278 | For `maxits` use `PETSC_UNLIMITED` to indicate there is no upper bound on this value. | ||
| 279 | |||
| 280 | Level: intermediate | ||
| 281 | |||
| 282 | .seealso: [](ch:lme), `LMEGetTolerances()` | ||
| 283 | @*/ | ||
| 284 | 50 | PetscErrorCode LMESetTolerances(LME lme,PetscReal tol,PetscInt maxits) | |
| 285 | { | ||
| 286 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
50 | PetscFunctionBegin; |
| 287 |
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.
|
50 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 288 |
29/66✗ Branch 0 not taken.
✓ 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 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
|
50 | PetscValidLogicalCollectiveReal(lme,tol,2); |
| 289 |
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.
|
50 | PetscValidLogicalCollectiveInt(lme,maxits,3); |
| 290 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
50 | if (tol == (PetscReal)PETSC_DETERMINE) { |
| 291 | ✗ | lme->tol = PETSC_DETERMINE; | |
| 292 | ✗ | lme->setupcalled = 0; | |
| 293 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50 | } else if (tol != (PetscReal)PETSC_CURRENT) { |
| 294 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
22 | PetscCheck(tol>0.0,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of tol. Must be > 0"); |
| 295 | 22 | lme->tol = tol; | |
| 296 | } | ||
| 297 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
50 | if (maxits == PETSC_DETERMINE) { |
| 298 | ✗ | lme->max_it = PETSC_DETERMINE; | |
| 299 | ✗ | lme->setupcalled = 0; | |
| 300 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
50 | } else if (maxits == PETSC_UNLIMITED) { |
| 301 | ✗ | lme->max_it = PETSC_INT_MAX; | |
| 302 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
50 | } else if (maxits != PETSC_CURRENT) { |
| 303 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | PetscCheck(maxits>0,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of maxits. Must be > 0"); |
| 304 | 28 | lme->max_it = maxits; | |
| 305 | } | ||
| 306 |
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.
|
9 | PetscFunctionReturn(PETSC_SUCCESS); |
| 307 | } | ||
| 308 | |||
| 309 | /*@ | ||
| 310 | LMEGetDimensions - Gets the dimension of the subspace used by the solver. | ||
| 311 | |||
| 312 | Not Collective | ||
| 313 | |||
| 314 | Input Parameter: | ||
| 315 | . lme - the linear matrix equation solver context | ||
| 316 | |||
| 317 | Output Parameter: | ||
| 318 | . ncv - the maximum dimension of the subspace to be used by the solver | ||
| 319 | |||
| 320 | Level: intermediate | ||
| 321 | |||
| 322 | .seealso: [](ch:lme), `LMESetDimensions()` | ||
| 323 | @*/ | ||
| 324 | 48 | PetscErrorCode LMEGetDimensions(LME lme,PetscInt *ncv) | |
| 325 | { | ||
| 326 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
48 | PetscFunctionBegin; |
| 327 |
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.
|
48 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 328 |
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.
|
48 | PetscAssertPointer(ncv,2); |
| 329 | 48 | *ncv = lme->ncv; | |
| 330 |
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.
|
48 | PetscFunctionReturn(PETSC_SUCCESS); |
| 331 | } | ||
| 332 | |||
| 333 | /*@ | ||
| 334 | LMESetDimensions - Sets the dimension of the subspace to be used by the solver. | ||
| 335 | |||
| 336 | Logically Collective | ||
| 337 | |||
| 338 | Input Parameters: | ||
| 339 | + lme - the linear matrix equation solver context | ||
| 340 | - ncv - the maximum dimension of the subspace to be used by the solver | ||
| 341 | |||
| 342 | Options Database Key: | ||
| 343 | . -lme_ncv \<ncv\> - sets the dimension of the subspace | ||
| 344 | |||
| 345 | Notes: | ||
| 346 | Use `PETSC_DETERMINE` for `ncv` to assign a reasonably good value, which is | ||
| 347 | dependent on the solution method. | ||
| 348 | |||
| 349 | Level: intermediate | ||
| 350 | |||
| 351 | .seealso: [](ch:lme), `LMEGetDimensions()` | ||
| 352 | @*/ | ||
| 353 | 28 | PetscErrorCode LMESetDimensions(LME lme,PetscInt ncv) | |
| 354 | { | ||
| 355 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
28 | PetscFunctionBegin; |
| 356 |
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.
|
28 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 357 |
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.
|
28 | PetscValidLogicalCollectiveInt(lme,ncv,2); |
| 358 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
28 | if (ncv == PETSC_DECIDE || ncv == PETSC_DEFAULT) { |
| 359 | ✗ | lme->ncv = PETSC_DETERMINE; | |
| 360 | } else { | ||
| 361 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | PetscCheck(ncv>0,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of ncv. Must be > 0"); |
| 362 | 28 | lme->ncv = ncv; | |
| 363 | } | ||
| 364 | 28 | lme->setupcalled = 0; | |
| 365 |
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.
|
28 | PetscFunctionReturn(PETSC_SUCCESS); |
| 366 | } | ||
| 367 | |||
| 368 | /*@ | ||
| 369 | LMESetErrorIfNotConverged - Causes `LMESolve()` to generate an error if the | ||
| 370 | solver has not converged. | ||
| 371 | |||
| 372 | Logically Collective | ||
| 373 | |||
| 374 | Input Parameters: | ||
| 375 | + lme - the linear matrix equation solver context | ||
| 376 | - flg - `PETSC_TRUE` indicates you want the error generated | ||
| 377 | |||
| 378 | Options Database Key: | ||
| 379 | . -lme_error_if_not_converged - generate an error and stop the program | ||
| 380 | |||
| 381 | Note: | ||
| 382 | Normally SLEPc continues if the solver fails to converge, you can call | ||
| 383 | `LMEGetConvergedReason()` after a `LMESolve()` to determine if it has converged. | ||
| 384 | |||
| 385 | Level: intermediate | ||
| 386 | |||
| 387 | .seealso: [](ch:lme), `LMEGetErrorIfNotConverged()` | ||
| 388 | @*/ | ||
| 389 | 63 | PetscErrorCode LMESetErrorIfNotConverged(LME lme,PetscBool flg) | |
| 390 | { | ||
| 391 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
63 | PetscFunctionBegin; |
| 392 |
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.
|
63 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 393 |
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.
|
63 | PetscValidLogicalCollectiveBool(lme,flg,2); |
| 394 | 63 | lme->errorifnotconverged = flg; | |
| 395 |
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.
|
63 | PetscFunctionReturn(PETSC_SUCCESS); |
| 396 | } | ||
| 397 | |||
| 398 | /*@ | ||
| 399 | LMEGetErrorIfNotConverged - Return a flag indicating whether `LMESolve()` will | ||
| 400 | generate an error if the solver does not converge. | ||
| 401 | |||
| 402 | Not Collective | ||
| 403 | |||
| 404 | Input Parameter: | ||
| 405 | . lme - the linear matrix equation solver context | ||
| 406 | |||
| 407 | Output Parameter: | ||
| 408 | . flag - `PETSC_TRUE` if it will generate an error, else `PETSC_FALSE` | ||
| 409 | |||
| 410 | Level: intermediate | ||
| 411 | |||
| 412 | .seealso: [](ch:lme), `LMESetErrorIfNotConverged()` | ||
| 413 | @*/ | ||
| 414 | 28 | PetscErrorCode LMEGetErrorIfNotConverged(LME lme,PetscBool *flag) | |
| 415 | { | ||
| 416 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
28 | PetscFunctionBegin; |
| 417 |
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.
|
28 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 418 |
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.
|
28 | PetscAssertPointer(flag,2); |
| 419 | 28 | *flag = lme->errorifnotconverged; | |
| 420 |
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.
|
28 | PetscFunctionReturn(PETSC_SUCCESS); |
| 421 | } | ||
| 422 | |||
| 423 | /*@ | ||
| 424 | LMESetOptionsPrefix - Sets the prefix used for searching for all | ||
| 425 | `LME` options in the database. | ||
| 426 | |||
| 427 | Logically Collective | ||
| 428 | |||
| 429 | Input Parameters: | ||
| 430 | + lme - the linear matrix equation solver context | ||
| 431 | - prefix - the prefix string to prepend to all `LME` option requests | ||
| 432 | |||
| 433 | Notes: | ||
| 434 | A hyphen (-) must NOT be given at the beginning of the prefix name. | ||
| 435 | The first character of all runtime options is AUTOMATICALLY the | ||
| 436 | hyphen. | ||
| 437 | |||
| 438 | For example, to distinguish between the runtime options for two | ||
| 439 | different `LME` contexts, one could call | ||
| 440 | .vb | ||
| 441 | LMESetOptionsPrefix(lme1,"fun1_") | ||
| 442 | LMESetOptionsPrefix(lme2,"fun2_") | ||
| 443 | .ve | ||
| 444 | |||
| 445 | Level: advanced | ||
| 446 | |||
| 447 | .seealso: [](ch:lme), `LMEAppendOptionsPrefix()`, `LMEGetOptionsPrefix()` | ||
| 448 | @*/ | ||
| 449 | 59 | PetscErrorCode LMESetOptionsPrefix(LME lme,const char prefix[]) | |
| 450 | { | ||
| 451 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
59 | PetscFunctionBegin; |
| 452 |
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.
|
59 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 453 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2 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.
|
59 | if (!lme->V) PetscCall(LMEGetBV(lme,&lme->V)); |
| 454 |
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.
|
59 | PetscCall(BVSetOptionsPrefix(lme->V,prefix)); |
| 455 |
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.
|
59 | PetscCall(PetscObjectSetOptionsPrefix((PetscObject)lme,prefix)); |
| 456 |
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.
|
9 | PetscFunctionReturn(PETSC_SUCCESS); |
| 457 | } | ||
| 458 | |||
| 459 | /*@ | ||
| 460 | LMEAppendOptionsPrefix - Appends to the prefix used for searching for all | ||
| 461 | `LME` options in the database. | ||
| 462 | |||
| 463 | Logically Collective | ||
| 464 | |||
| 465 | Input Parameters: | ||
| 466 | + lme - the linear matrix equation solver context | ||
| 467 | - prefix - the prefix string to prepend to all `LME` option requests | ||
| 468 | |||
| 469 | Notes: | ||
| 470 | A hyphen (-) must NOT be given at the beginning of the prefix name. | ||
| 471 | The first character of all runtime options is AUTOMATICALLY the hyphen. | ||
| 472 | |||
| 473 | Level: advanced | ||
| 474 | |||
| 475 | .seealso: [](ch:lme), `LMESetOptionsPrefix()`, `LMEGetOptionsPrefix()` | ||
| 476 | @*/ | ||
| 477 | 45 | PetscErrorCode LMEAppendOptionsPrefix(LME lme,const char prefix[]) | |
| 478 | { | ||
| 479 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
45 | PetscFunctionBegin; |
| 480 |
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.
|
45 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 481 |
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.
|
45 | if (!lme->V) PetscCall(LMEGetBV(lme,&lme->V)); |
| 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.
|
45 | PetscCall(BVAppendOptionsPrefix(lme->V,prefix)); |
| 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.
|
45 | PetscCall(PetscObjectAppendOptionsPrefix((PetscObject)lme,prefix)); |
| 484 |
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.
|
9 | PetscFunctionReturn(PETSC_SUCCESS); |
| 485 | } | ||
| 486 | |||
| 487 | /*@ | ||
| 488 | LMEGetOptionsPrefix - Gets the prefix used for searching for all | ||
| 489 | `LME` options in the database. | ||
| 490 | |||
| 491 | Not Collective | ||
| 492 | |||
| 493 | Input Parameter: | ||
| 494 | . lme - the linear matrix equation solver context | ||
| 495 | |||
| 496 | Output Parameter: | ||
| 497 | . prefix - pointer to the prefix string used is returned | ||
| 498 | |||
| 499 | Level: advanced | ||
| 500 | |||
| 501 | .seealso: [](ch:lme), `LMESetOptionsPrefix()`, `LMEAppendOptionsPrefix()` | ||
| 502 | @*/ | ||
| 503 | 31 | PetscErrorCode LMEGetOptionsPrefix(LME lme,const char *prefix[]) | |
| 504 | { | ||
| 505 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
31 | PetscFunctionBegin; |
| 506 |
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.
|
31 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 507 |
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.
|
31 | PetscAssertPointer(prefix,2); |
| 508 |
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.
|
31 | PetscCall(PetscObjectGetOptionsPrefix((PetscObject)lme,prefix)); |
| 509 |
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.
|
2 | PetscFunctionReturn(PETSC_SUCCESS); |
| 510 | } | ||
| 511 |