| 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 | Basic LME routines | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/lmeimpl.h> /*I "slepclme.h" I*/ | ||
| 15 | |||
| 16 | /* Logging support */ | ||
| 17 | PetscClassId LME_CLASSID = 0; | ||
| 18 | PetscLogEvent LME_SetUp = 0,LME_Solve = 0,LME_ComputeError = 0; | ||
| 19 | |||
| 20 | /* List of registered LME routines */ | ||
| 21 | PetscFunctionList LMEList = NULL; | ||
| 22 | PetscBool LMERegisterAllCalled = PETSC_FALSE; | ||
| 23 | |||
| 24 | /* List of registered LME monitors */ | ||
| 25 | PetscFunctionList LMEMonitorList = NULL; | ||
| 26 | PetscFunctionList LMEMonitorCreateList = NULL; | ||
| 27 | PetscFunctionList LMEMonitorDestroyList = NULL; | ||
| 28 | PetscBool LMEMonitorRegisterAllCalled = PETSC_FALSE; | ||
| 29 | |||
| 30 | /*@ | ||
| 31 | LMEView - Prints the `LME` data structure. | ||
| 32 | |||
| 33 | Collective | ||
| 34 | |||
| 35 | Input Parameters: | ||
| 36 | + lme - the linear matrix equation solver context | ||
| 37 | - viewer - optional visualization context | ||
| 38 | |||
| 39 | Options Database Key: | ||
| 40 | . -lme_view - calls `LMEView()` at end of `LMESolve()` | ||
| 41 | |||
| 42 | Notes: | ||
| 43 | The available visualization contexts include | ||
| 44 | + `PETSC_VIEWER_STDOUT_SELF` - standard output (default) | ||
| 45 | - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard output where only the | ||
| 46 | first process opens the file; all other processes send their data to the | ||
| 47 | first one to print | ||
| 48 | |||
| 49 | The user can open an alternative visualization context with `PetscViewerASCIIOpen()` | ||
| 50 | to output to a specified file. | ||
| 51 | |||
| 52 | Level: beginner | ||
| 53 | |||
| 54 | .seealso: [](ch:lme), `LMECreate()`, `LMEViewFromOptions()` | ||
| 55 | @*/ | ||
| 56 | 20 | PetscErrorCode LMEView(LME lme,PetscViewer viewer) | |
| 57 | { | ||
| 58 | 20 | PetscBool isascii; | |
| 59 | |||
| 60 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
20 | PetscFunctionBegin; |
| 61 |
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.
|
20 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 62 |
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.
|
20 | if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lme),&viewer)); |
| 63 |
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.
|
20 | PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); |
| 64 |
13/32✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
|
20 | PetscCheckSameComm(lme,1,viewer,2); |
| 65 | |||
| 66 |
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.
|
20 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
| 67 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
20 | if (isascii) { |
| 68 |
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.
|
20 | PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)lme,viewer)); |
| 69 |
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.
|
20 | PetscCall(PetscViewerASCIIPushTab(viewer)); |
| 70 |
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.
|
20 | PetscTryTypeMethod(lme,view,viewer); |
| 71 |
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.
|
20 | PetscCall(PetscViewerASCIIPopTab(viewer)); |
| 72 |
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.
|
20 | PetscCall(PetscViewerASCIIPrintf(viewer," equation type: %s\n",LMEProblemTypes[lme->problem_type])); |
| 73 |
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.
|
20 | PetscCall(PetscViewerASCIIPrintf(viewer," number of column vectors (ncv): %" PetscInt_FMT "\n",lme->ncv)); |
| 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.
|
20 | PetscCall(PetscViewerASCIIPrintf(viewer," maximum number of iterations: %" PetscInt_FMT "\n",lme->max_it)); |
| 75 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(PetscViewerASCIIPrintf(viewer," tolerance: %g\n",(double)lme->tol)); |
| 76 | ✗ | } else PetscTryTypeMethod(lme,view,viewer); | |
| 77 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_INFO)); |
| 78 |
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.
|
20 | if (!lme->V) PetscCall(LMEGetBV(lme,&lme->V)); |
| 79 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
20 | PetscCall(BVView(lme->V,viewer)); |
| 80 |
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.
|
20 | PetscCall(PetscViewerPopFormat(viewer)); |
| 81 |
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.
|
4 | PetscFunctionReturn(PETSC_SUCCESS); |
| 82 | } | ||
| 83 | |||
| 84 | /*@ | ||
| 85 | LMEViewFromOptions - View (print) an `LME` object based on values in the options database. | ||
| 86 | |||
| 87 | Collective | ||
| 88 | |||
| 89 | Input Parameters: | ||
| 90 | + lme - the linear matrix equation solver context | ||
| 91 | . obj - optional object that provides the options prefix used to query the options database | ||
| 92 | - name - command line option | ||
| 93 | |||
| 94 | Level: intermediate | ||
| 95 | |||
| 96 | .seealso: [](ch:lme), `LMEView()`, `LMECreate()`, `PetscObjectViewFromOptions()` | ||
| 97 | @*/ | ||
| 98 | 994 | PetscErrorCode LMEViewFromOptions(LME lme,PetscObject obj,const char name[]) | |
| 99 | { | ||
| 100 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
994 | PetscFunctionBegin; |
| 101 |
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.
|
994 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 102 |
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.
|
994 | PetscCall(PetscObjectViewFromOptions((PetscObject)lme,obj,name)); |
| 103 |
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.
|
142 | PetscFunctionReturn(PETSC_SUCCESS); |
| 104 | } | ||
| 105 | /*@ | ||
| 106 | LMEConvergedReasonView - Displays the reason an `LME` solve converged or diverged. | ||
| 107 | |||
| 108 | Collective | ||
| 109 | |||
| 110 | Input Parameters: | ||
| 111 | + lme - the linear matrix equation solver context | ||
| 112 | - viewer - the viewer to display the reason | ||
| 113 | |||
| 114 | Options Database Key: | ||
| 115 | . -lme_converged_reason - print reason for convergence/divergence, and number of iterations | ||
| 116 | |||
| 117 | Notes: | ||
| 118 | Use `LMEConvergedReasonViewFromOptions()` to display the reason based on values | ||
| 119 | in the options database. | ||
| 120 | |||
| 121 | To change the format of the output call `PetscViewerPushFormat()` before this | ||
| 122 | call. Use `PETSC_VIEWER_DEFAULT` for the default, or `PETSC_VIEWER_FAILED` to only | ||
| 123 | display a reason if it fails. The latter can be set in the command line with | ||
| 124 | `-lme_converged_reason ::failed`. | ||
| 125 | |||
| 126 | Level: intermediate | ||
| 127 | |||
| 128 | .seealso: [](ch:lme), `LMESetTolerances()`, `LMEGetIterationNumber()`, `LMEConvergedReasonViewFromOptions()` | ||
| 129 | @*/ | ||
| 130 | 10 | PetscErrorCode LMEConvergedReasonView(LME lme,PetscViewer viewer) | |
| 131 | { | ||
| 132 | 10 | PetscBool isAscii; | |
| 133 | 10 | PetscViewerFormat format; | |
| 134 | |||
| 135 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
10 | PetscFunctionBegin; |
| 136 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
10 | if (!viewer) viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)lme)); |
| 137 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isAscii)); |
| 138 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10 | if (isAscii) { |
| 139 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscViewerGetFormat(viewer,&format)); |
| 140 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscViewerASCIIAddTab(viewer,((PetscObject)lme)->tablevel)); |
| 141 |
8/12✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ 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 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
10 | if (lme->reason > 0 && format != PETSC_VIEWER_FAILED) PetscCall(PetscViewerASCIIPrintf(viewer,"%s Linear matrix equation solve converged due to %s; iterations %" PetscInt_FMT "\n",((PetscObject)lme)->prefix?((PetscObject)lme)->prefix:"",LMEConvergedReasons[lme->reason],lme->its)); |
| 142 | ✗ | else if (lme->reason <= 0) PetscCall(PetscViewerASCIIPrintf(viewer,"%s Linear matrix equation solve did not converge due to %s; iterations %" PetscInt_FMT "\n",((PetscObject)lme)->prefix?((PetscObject)lme)->prefix:"",LMEConvergedReasons[lme->reason],lme->its)); | |
| 143 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
10 | PetscCall(PetscViewerASCIISubtractTab(viewer,((PetscObject)lme)->tablevel)); |
| 144 | } | ||
| 145 |
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); |
| 146 | } | ||
| 147 | |||
| 148 | /*@ | ||
| 149 | LMEConvergedReasonViewFromOptions - Processes command line options to determine if/how | ||
| 150 | the `LME` converged reason is to be viewed. | ||
| 151 | |||
| 152 | Collective | ||
| 153 | |||
| 154 | Input Parameter: | ||
| 155 | . lme - the linear matrix equation solver context | ||
| 156 | |||
| 157 | Level: intermediate | ||
| 158 | |||
| 159 | .seealso: [](ch:lme), `LMEConvergedReasonView()` | ||
| 160 | @*/ | ||
| 161 | 497 | PetscErrorCode LMEConvergedReasonViewFromOptions(LME lme) | |
| 162 | { | ||
| 163 | 497 | PetscViewer viewer; | |
| 164 | 497 | PetscBool flg; | |
| 165 | 497 | static PetscBool incall = PETSC_FALSE; | |
| 166 | 497 | PetscViewerFormat format; | |
| 167 | |||
| 168 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
497 | PetscFunctionBegin; |
| 169 |
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.
|
497 | if (incall) PetscFunctionReturn(PETSC_SUCCESS); |
| 170 | 497 | incall = PETSC_TRUE; | |
| 171 |
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.
|
497 | PetscCall(PetscOptionsCreateViewer(PetscObjectComm((PetscObject)lme),((PetscObject)lme)->options,((PetscObject)lme)->prefix,"-lme_converged_reason",&viewer,&format,&flg)); |
| 172 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
497 | if (flg) { |
| 173 |
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(PetscViewerPushFormat(viewer,format)); |
| 174 |
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(LMEConvergedReasonView(lme,viewer)); |
| 175 |
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(PetscViewerPopFormat(viewer)); |
| 176 |
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(PetscViewerDestroy(&viewer)); |
| 177 | } | ||
| 178 | 497 | incall = PETSC_FALSE; | |
| 179 |
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.
|
497 | PetscFunctionReturn(PETSC_SUCCESS); |
| 180 | } | ||
| 181 | |||
| 182 | /*@ | ||
| 183 | LMECreate - Creates the `LME` context. | ||
| 184 | |||
| 185 | Collective | ||
| 186 | |||
| 187 | Input Parameter: | ||
| 188 | . comm - MPI communicator | ||
| 189 | |||
| 190 | Output Parameter: | ||
| 191 | . outlme - location to put the `LME` context | ||
| 192 | |||
| 193 | Note: | ||
| 194 | The default `LME` type is `LMEKRYLOV`. | ||
| 195 | |||
| 196 | Level: beginner | ||
| 197 | |||
| 198 | .seealso: [](ch:lme), `LMESetUp()`, `LMESolve()`, `LMEDestroy()`, `LME` | ||
| 199 | @*/ | ||
| 200 | 200 | PetscErrorCode LMECreate(MPI_Comm comm,LME *outlme) | |
| 201 | { | ||
| 202 | 200 | LME lme; | |
| 203 | |||
| 204 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
200 | PetscFunctionBegin; |
| 205 |
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.
|
200 | PetscAssertPointer(outlme,2); |
| 206 |
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.
|
200 | PetscCall(LMEInitializePackage()); |
| 207 |
7/12✓ 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 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
200 | PetscCall(SlepcHeaderCreate(lme,LME_CLASSID,"LME","Linear Matrix Equation","LME",comm,LMEDestroy,LMEView)); |
| 208 | |||
| 209 | 200 | lme->A = NULL; | |
| 210 | 200 | lme->B = NULL; | |
| 211 | 200 | lme->D = NULL; | |
| 212 | 200 | lme->E = NULL; | |
| 213 | 200 | lme->C = NULL; | |
| 214 | 200 | lme->X = NULL; | |
| 215 | 200 | lme->problem_type = LME_LYAPUNOV; | |
| 216 | 200 | lme->max_it = PETSC_DETERMINE; | |
| 217 | 200 | lme->ncv = PETSC_DETERMINE; | |
| 218 | 200 | lme->tol = PETSC_DETERMINE; | |
| 219 | 200 | lme->errorifnotconverged = PETSC_FALSE; | |
| 220 | |||
| 221 | 200 | lme->numbermonitors = 0; | |
| 222 | |||
| 223 | 200 | lme->V = NULL; | |
| 224 | 200 | lme->nwork = 0; | |
| 225 | 200 | lme->work = NULL; | |
| 226 | 200 | lme->data = NULL; | |
| 227 | |||
| 228 | 200 | lme->its = 0; | |
| 229 | 200 | lme->errest = 0; | |
| 230 | 200 | lme->setupcalled = 0; | |
| 231 | 200 | lme->reason = LME_CONVERGED_ITERATING; | |
| 232 | |||
| 233 | 200 | *outlme = lme; | |
| 234 |
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.
|
200 | PetscFunctionReturn(PETSC_SUCCESS); |
| 235 | } | ||
| 236 | |||
| 237 | /*@ | ||
| 238 | LMESetType - Selects the particular solver to be used in the `LME` object. | ||
| 239 | |||
| 240 | Logically Collective | ||
| 241 | |||
| 242 | Input Parameters: | ||
| 243 | + lme - the linear matrix equation solver context | ||
| 244 | - type - a known method | ||
| 245 | |||
| 246 | Options Database Key: | ||
| 247 | . -lme_type \<type\> - sets the method; use -help for a list of available methods | ||
| 248 | |||
| 249 | Notes: | ||
| 250 | See `LMEType` for available methods. The default is `LMEKRYLOV`. | ||
| 251 | |||
| 252 | Normally, it is best to use the `LMESetFromOptions()` command and | ||
| 253 | then set the `LME` type from the options database rather than by using | ||
| 254 | this routine. Using the options database provides the user with | ||
| 255 | maximum flexibility in evaluating the different available methods. | ||
| 256 | The `LMESetType()` routine is provided for those situations where it | ||
| 257 | is necessary to set the iterative solver independently of the command | ||
| 258 | line or options database. | ||
| 259 | |||
| 260 | Level: intermediate | ||
| 261 | |||
| 262 | .seealso: [](ch:lme), `LMEType` | ||
| 263 | @*/ | ||
| 264 | 99 | PetscErrorCode LMESetType(LME lme,LMEType type) | |
| 265 | { | ||
| 266 | 99 | PetscErrorCode (*r)(LME); | |
| 267 | 99 | PetscBool match; | |
| 268 | |||
| 269 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
99 | PetscFunctionBegin; |
| 270 |
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); |
| 271 |
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.
|
99 | PetscAssertPointer(type,2); |
| 272 | |||
| 273 |
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(PetscObjectTypeCompare((PetscObject)lme,type,&match)); |
| 274 |
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.
|
99 | if (match) PetscFunctionReturn(PETSC_SUCCESS); |
| 275 | |||
| 276 |
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(PetscFunctionListFind(LMEList,type,&r)); |
| 277 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
99 | PetscCheck(r,PetscObjectComm((PetscObject)lme),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown LME type given: %s",type); |
| 278 | |||
| 279 |
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,destroy); |
| 280 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
99 | PetscCall(PetscMemzero(lme->ops,sizeof(struct _LMEOps))); |
| 281 | |||
| 282 | 99 | lme->setupcalled = 0; | |
| 283 |
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(PetscObjectChangeTypeName((PetscObject)lme,type)); |
| 284 |
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((*r)(lme)); |
| 285 |
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); |
| 286 | } | ||
| 287 | |||
| 288 | /*@ | ||
| 289 | LMEGetType - Gets the `LME` type as a string from the `LME` object. | ||
| 290 | |||
| 291 | Not Collective | ||
| 292 | |||
| 293 | Input Parameter: | ||
| 294 | . lme - the linear matrix equation solver context | ||
| 295 | |||
| 296 | Output Parameter: | ||
| 297 | . type - name of `LME` method | ||
| 298 | |||
| 299 | Level: intermediate | ||
| 300 | |||
| 301 | .seealso: [](ch:lme), `LMESetType()` | ||
| 302 | @*/ | ||
| 303 | 44 | PetscErrorCode LMEGetType(LME lme,LMEType *type) | |
| 304 | { | ||
| 305 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
44 | PetscFunctionBegin; |
| 306 |
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.
|
44 | PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 307 |
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.
|
44 | PetscAssertPointer(type,2); |
| 308 | 44 | *type = ((PetscObject)lme)->type_name; | |
| 309 |
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.
|
44 | PetscFunctionReturn(PETSC_SUCCESS); |
| 310 | } | ||
| 311 | |||
| 312 | /*@C | ||
| 313 | LMERegister - Adds a method to the linear matrix equation solver package. | ||
| 314 | |||
| 315 | Not Collective | ||
| 316 | |||
| 317 | Input Parameters: | ||
| 318 | + name - name of a new user-defined solver | ||
| 319 | - function - routine to create the solver context | ||
| 320 | |||
| 321 | Note: | ||
| 322 | `LMERegister()` may be called multiple times to add several user-defined solvers. | ||
| 323 | |||
| 324 | Example Usage: | ||
| 325 | .vb | ||
| 326 | LMERegister("my_solver",MySolverCreate); | ||
| 327 | .ve | ||
| 328 | |||
| 329 | Then, your solver can be chosen with the procedural interface via | ||
| 330 | .vb | ||
| 331 | LMESetType(lme,"my_solver") | ||
| 332 | .ve | ||
| 333 | or at runtime via the option `-lme_type my_solver`. | ||
| 334 | |||
| 335 | Level: advanced | ||
| 336 | |||
| 337 | .seealso: [](ch:lme), `LMERegisterAll()` | ||
| 338 | @*/ | ||
| 339 | 138 | PetscErrorCode LMERegister(const char *name,PetscErrorCode (*function)(LME)) | |
| 340 | { | ||
| 341 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
138 | PetscFunctionBegin; |
| 342 |
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.
|
138 | PetscCall(LMEInitializePackage()); |
| 343 |
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.
|
138 | PetscCall(PetscFunctionListAdd(&LMEList,name,function)); |
| 344 |
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.
|
20 | PetscFunctionReturn(PETSC_SUCCESS); |
| 345 | } | ||
| 346 | |||
| 347 | /*@C | ||
| 348 | LMEMonitorRegister - Registers an `LME` monitor routine that may be accessed with | ||
| 349 | `LMEMonitorSetFromOptions()`. | ||
| 350 | |||
| 351 | Not Collective | ||
| 352 | |||
| 353 | Input Parameters: | ||
| 354 | + name - name of a new monitor routine | ||
| 355 | . vtype - a `PetscViewerType` for the output | ||
| 356 | . format - a `PetscViewerFormat` for the output | ||
| 357 | . monitor - monitor routine, see `LMEMonitorRegisterFn` | ||
| 358 | . create - creation routine, or `NULL` | ||
| 359 | - destroy - destruction routine, or `NULL` | ||
| 360 | |||
| 361 | Notes: | ||
| 362 | `LMEMonitorRegister()` may be called multiple times to add several user-defined monitors. | ||
| 363 | |||
| 364 | The calling sequence for the given function matches the calling sequence of `LMEMonitorFn` | ||
| 365 | functions passed to `LMEMonitorSet()` with the additional requirement that its final argument | ||
| 366 | be a `PetscViewerAndFormat`. | ||
| 367 | |||
| 368 | Example Usage: | ||
| 369 | .vb | ||
| 370 | LMEMonitorRegister("my_monitor",PETSCVIEWERASCII,PETSC_VIEWER_ASCII_INFO_DETAIL,MyMonitor,NULL,NULL); | ||
| 371 | .ve | ||
| 372 | |||
| 373 | Then, your monitor can be chosen with the procedural interface via | ||
| 374 | .vb | ||
| 375 | LMEMonitorSetFromOptions(lme,"-lme_monitor_my_monitor","my_monitor",NULL); | ||
| 376 | .ve | ||
| 377 | or at runtime via the option `-lme_monitor_my_monitor`. | ||
| 378 | |||
| 379 | Level: advanced | ||
| 380 | |||
| 381 | .seealso: [](ch:lme), `LMEMonitorSet()`, `LMEMonitorRegisterAll()`, `LMEMonitorSetFromOptions()` | ||
| 382 | @*/ | ||
| 383 | 276 | PetscErrorCode LMEMonitorRegister(const char name[],PetscViewerType vtype,PetscViewerFormat format,LMEMonitorRegisterFn *monitor,LMEMonitorRegisterCreateFn *create,LMEMonitorRegisterDestroyFn *destroy) | |
| 384 | { | ||
| 385 | 276 | char key[PETSC_MAX_PATH_LEN]; | |
| 386 | |||
| 387 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
276 | PetscFunctionBegin; |
| 388 |
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.
|
276 | PetscCall(LMEInitializePackage()); |
| 389 |
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.
|
276 | PetscCall(SlepcMonitorMakeKey_Internal(name,vtype,format,key)); |
| 390 |
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.
|
276 | PetscCall(PetscFunctionListAdd(&LMEMonitorList,key,monitor)); |
| 391 |
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.
|
276 | if (create) PetscCall(PetscFunctionListAdd(&LMEMonitorCreateList,key,create)); |
| 392 |
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.
|
276 | if (destroy) PetscCall(PetscFunctionListAdd(&LMEMonitorDestroyList,key,destroy)); |
| 393 |
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.
|
40 | PetscFunctionReturn(PETSC_SUCCESS); |
| 394 | } | ||
| 395 | |||
| 396 | /*@ | ||
| 397 | LMEReset - Resets the `LME` context to the initial state (prior to setup) | ||
| 398 | and destroys any allocated `Vec`s and `Mat`s. | ||
| 399 | |||
| 400 | Collective | ||
| 401 | |||
| 402 | Input Parameter: | ||
| 403 | . lme - the linear matrix equation solver context | ||
| 404 | |||
| 405 | Level: advanced | ||
| 406 | |||
| 407 | .seealso: [](ch:lme), `LMEDestroy()` | ||
| 408 | @*/ | ||
| 409 | 200 | PetscErrorCode LMEReset(LME lme) | |
| 410 | { | ||
| 411 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
200 | PetscFunctionBegin; |
| 412 |
3/14✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
200 | if (lme) PetscValidHeaderSpecific(lme,LME_CLASSID,1); |
| 413 |
2/14✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 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.
|
190 | if (!lme) PetscFunctionReturn(PETSC_SUCCESS); |
| 414 |
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.
|
200 | PetscTryTypeMethod(lme,reset); |
| 415 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
200 | PetscCall(MatDestroy(&lme->A)); |
| 416 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
200 | PetscCall(MatDestroy(&lme->B)); |
| 417 |
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.
|
200 | PetscCall(MatDestroy(&lme->D)); |
| 418 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
200 | PetscCall(MatDestroy(&lme->E)); |
| 419 |
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.
|
200 | PetscCall(MatDestroy(&lme->C)); |
| 420 |
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.
|
200 | PetscCall(MatDestroy(&lme->X)); |
| 421 |
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.
|
200 | PetscCall(BVDestroy(&lme->V)); |
| 422 |
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.
|
200 | PetscCall(VecDestroyVecs(lme->nwork,&lme->work)); |
| 423 | 200 | lme->nwork = 0; | |
| 424 | 200 | lme->setupcalled = 0; | |
| 425 |
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.
|
200 | PetscFunctionReturn(PETSC_SUCCESS); |
| 426 | } | ||
| 427 | |||
| 428 | /*@ | ||
| 429 | LMEDestroy - Destroys the `LME` context. | ||
| 430 | |||
| 431 | Collective | ||
| 432 | |||
| 433 | Input Parameter: | ||
| 434 | . lme - the linear matrix equation solver context | ||
| 435 | |||
| 436 | Level: beginner | ||
| 437 | |||
| 438 | .seealso: [](ch:lme), `LMECreate()`, `LMESetUp()`, `LMESolve()` | ||
| 439 | @*/ | ||
| 440 | 221 | PetscErrorCode LMEDestroy(LME *lme) | |
| 441 | { | ||
| 442 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
221 | PetscFunctionBegin; |
| 443 |
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.
|
221 | if (!*lme) PetscFunctionReturn(PETSC_SUCCESS); |
| 444 |
2/12✗ 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 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
221 | PetscValidHeaderSpecific(*lme,LME_CLASSID,1); |
| 445 |
2/14✓ Branch 0 taken 2 times.
✓ 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
221 | if (--((PetscObject)*lme)->refct > 0) { *lme = NULL; PetscFunctionReturn(PETSC_SUCCESS); } |
| 446 |
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.
|
200 | PetscCall(LMEReset(*lme)); |
| 447 |
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.
|
200 | PetscTryTypeMethod(*lme,destroy); |
| 448 |
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.
|
200 | PetscCall(LMEMonitorCancel(*lme)); |
| 449 |
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.
|
200 | PetscCall(PetscHeaderDestroy(lme)); |
| 450 |
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.
|
18 | PetscFunctionReturn(PETSC_SUCCESS); |
| 451 | } | ||
| 452 | |||
| 453 | /*@ | ||
| 454 | LMESetBV - Associates a basis vectors object to the linear matrix equation solver. | ||
| 455 | |||
| 456 | Collective | ||
| 457 | |||
| 458 | Input Parameters: | ||
| 459 | + lme - the linear matrix equation solver context | ||
| 460 | - bv - the basis vectors object | ||
| 461 | |||
| 462 | Note: | ||
| 463 | Use `LMEGetBV()` to retrieve the basis vectors context (for example, | ||
| 464 | to free it at the end of the computations). | ||
| 465 | |||
| 466 | Level: advanced | ||
| 467 | |||
| 468 | .seealso: [](ch:lme), `LMEGetBV()` | ||
| 469 | @*/ | ||
| 470 | ✗ | PetscErrorCode LMESetBV(LME lme,BV bv) | |
| 471 | { | ||
| 472 | ✗ | PetscFunctionBegin; | |
| 473 | ✗ | PetscValidHeaderSpecific(lme,LME_CLASSID,1); | |
| 474 | ✗ | PetscValidHeaderSpecific(bv,BV_CLASSID,2); | |
| 475 | ✗ | PetscCheckSameComm(lme,1,bv,2); | |
| 476 | ✗ | PetscCall(PetscObjectReference((PetscObject)bv)); | |
| 477 | ✗ | PetscCall(BVDestroy(&lme->V)); | |
| 478 | ✗ | lme->V = bv; | |
| 479 | ✗ | PetscFunctionReturn(PETSC_SUCCESS); | |
| 480 | } | ||
| 481 | |||
| 482 | /*@ | ||
| 483 | LMEGetBV - Obtain the basis vectors object associated to the matrix | ||
| 484 | function solver. | ||
| 485 | |||
| 486 | Not Collective | ||
| 487 | |||
| 488 | Input Parameter: | ||
| 489 | . lme - the linear matrix equation solver context | ||
| 490 | |||
| 491 | Output Parameter: | ||
| 492 | . bv - basis vectors context | ||
| 493 | |||
| 494 | Level: advanced | ||
| 495 | |||
| 496 | .seealso: [](ch:lme), `LMESetBV()` | ||
| 497 | @*/ | ||
| 498 | 99 | PetscErrorCode LMEGetBV(LME lme,BV *bv) | |
| 499 | { | ||
| 500 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
99 | PetscFunctionBegin; |
| 501 |
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); |
| 502 |
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.
|
99 | PetscAssertPointer(bv,2); |
| 503 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
99 | if (!lme->V) { |
| 504 |
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(BVCreate(PetscObjectComm((PetscObject)lme),&lme->V)); |
| 505 |
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(PetscObjectIncrementTabLevel((PetscObject)lme->V,(PetscObject)lme,0)); |
| 506 |
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(PetscObjectSetOptions((PetscObject)lme->V,((PetscObject)lme)->options)); |
| 507 | } | ||
| 508 | 99 | *bv = lme->V; | |
| 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.
|
99 | PetscFunctionReturn(PETSC_SUCCESS); |
| 510 | } | ||
| 511 |