| 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 MFN routines | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <slepc/private/mfnimpl.h> /*I "slepcmfn.h" I*/ | ||
| 15 | |||
| 16 | /* Logging support */ | ||
| 17 | PetscClassId MFN_CLASSID = 0; | ||
| 18 | PetscLogEvent MFN_SetUp = 0,MFN_Solve = 0; | ||
| 19 | |||
| 20 | /* List of registered MFN routines */ | ||
| 21 | PetscFunctionList MFNList = NULL; | ||
| 22 | PetscBool MFNRegisterAllCalled = PETSC_FALSE; | ||
| 23 | |||
| 24 | /* List of registered MFN monitors */ | ||
| 25 | PetscFunctionList MFNMonitorList = NULL; | ||
| 26 | PetscFunctionList MFNMonitorCreateList = NULL; | ||
| 27 | PetscFunctionList MFNMonitorDestroyList = NULL; | ||
| 28 | PetscBool MFNMonitorRegisterAllCalled = PETSC_FALSE; | ||
| 29 | |||
| 30 | /*@ | ||
| 31 | MFNView - Prints the `MFN` data structure. | ||
| 32 | |||
| 33 | Collective | ||
| 34 | |||
| 35 | Input Parameters: | ||
| 36 | + mfn - the matrix function solver context | ||
| 37 | - viewer - optional visualization context | ||
| 38 | |||
| 39 | Options Database Key: | ||
| 40 | . -mfn_view - calls `MFNView()` at end of `MFNSolve()` | ||
| 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:mfn), `MFNCreate()`, `MFNViewFromOptions()` | ||
| 55 | @*/ | ||
| 56 | 28 | PetscErrorCode MFNView(MFN mfn,PetscViewer viewer) | |
| 57 | { | ||
| 58 | 28 | PetscBool isascii; | |
| 59 | |||
| 60 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
28 | 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.
|
28 | PetscValidHeaderSpecific(mfn,MFN_CLASSID,1); |
| 62 |
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.
|
28 | if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)mfn),&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.
|
28 | 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.
|
28 | PetscCheckSameComm(mfn,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.
|
28 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); |
| 67 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
28 | 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.
|
28 | PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)mfn,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.
|
28 | 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.
|
28 | PetscTryTypeMethod(mfn,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.
|
28 | 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.
|
28 | PetscCall(PetscViewerASCIIPrintf(viewer," number of column vectors (ncv): %" PetscInt_FMT "\n",mfn->ncv)); |
| 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.
|
28 | PetscCall(PetscViewerASCIIPrintf(viewer," maximum number of iterations: %" PetscInt_FMT "\n",mfn->max_it)); |
| 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.
|
28 | PetscCall(PetscViewerASCIIPrintf(viewer," tolerance: %g\n",(double)mfn->tol)); |
| 75 | ✗ | } else PetscTryTypeMethod(mfn,view,viewer); | |
| 76 |
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.
|
28 | PetscCall(PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_INFO)); |
| 77 |
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.
|
28 | if (!mfn->V) PetscCall(MFNGetFN(mfn,&mfn->fn)); |
| 78 |
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.
|
28 | PetscCall(FNView(mfn->fn,viewer)); |
| 79 |
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.
|
28 | if (!mfn->V) PetscCall(MFNGetBV(mfn,&mfn->V)); |
| 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.
|
28 | PetscCall(BVView(mfn->V,viewer)); |
| 81 |
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.
|
28 | PetscCall(PetscViewerPopFormat(viewer)); |
| 82 |
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.
|
5 | PetscFunctionReturn(PETSC_SUCCESS); |
| 83 | } | ||
| 84 | |||
| 85 | /*@ | ||
| 86 | MFNViewFromOptions - View (print) an `MFN` object based on values in the options database. | ||
| 87 | |||
| 88 | Collective | ||
| 89 | |||
| 90 | Input Parameters: | ||
| 91 | + mfn - the matrix function solver context | ||
| 92 | . obj - optional object that provides the options prefix used to query the options database | ||
| 93 | - name - command line option | ||
| 94 | |||
| 95 | Level: intermediate | ||
| 96 | |||
| 97 | .seealso: [](ch:mfn), `MFNView()`, `MFNCreate()`, `PetscObjectViewFromOptions()` | ||
| 98 | @*/ | ||
| 99 | 2096 | PetscErrorCode MFNViewFromOptions(MFN mfn,PetscObject obj,const char name[]) | |
| 100 | { | ||
| 101 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
2096 | PetscFunctionBegin; |
| 102 |
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.
|
2096 | PetscValidHeaderSpecific(mfn,MFN_CLASSID,1); |
| 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.
|
2096 | PetscCall(PetscObjectViewFromOptions((PetscObject)mfn,obj,name)); |
| 104 |
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.
|
410 | PetscFunctionReturn(PETSC_SUCCESS); |
| 105 | } | ||
| 106 | /*@ | ||
| 107 | MFNConvergedReasonView - Displays the reason an `MFN` solve converged or diverged. | ||
| 108 | |||
| 109 | Collective | ||
| 110 | |||
| 111 | Input Parameters: | ||
| 112 | + mfn - the matrix function solver context | ||
| 113 | - viewer - the viewer to display the reason | ||
| 114 | |||
| 115 | Options Database Key: | ||
| 116 | . -mfn_converged_reason - print reason for convergence/divergence, and number of iterations | ||
| 117 | |||
| 118 | Notes: | ||
| 119 | Use `MFNConvergedReasonViewFromOptions()` to display the reason based on values | ||
| 120 | in the options database. | ||
| 121 | |||
| 122 | To change the format of the output call `PetscViewerPushFormat()` before this | ||
| 123 | call. Use `PETSC_VIEWER_DEFAULT` for the default, or `PETSC_VIEWER_FAILED` to only | ||
| 124 | display a reason if it fails. The latter can be set in the command line with | ||
| 125 | `-mfn_converged_reason ::failed`. | ||
| 126 | |||
| 127 | Level: intermediate | ||
| 128 | |||
| 129 | .seealso: [](ch:mfn), `MFNSetTolerances()`, `MFNGetIterationNumber()`, `MFNConvergedReasonViewFromOptions()` | ||
| 130 | @*/ | ||
| 131 | 18 | PetscErrorCode MFNConvergedReasonView(MFN mfn,PetscViewer viewer) | |
| 132 | { | ||
| 133 | 18 | PetscBool isAscii; | |
| 134 | 18 | PetscViewerFormat format; | |
| 135 | |||
| 136 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
18 | PetscFunctionBegin; |
| 137 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
|
18 | if (!viewer) viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)mfn)); |
| 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.
|
18 | PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isAscii)); |
| 139 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
18 | if (isAscii) { |
| 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.
|
18 | PetscCall(PetscViewerGetFormat(viewer,&format)); |
| 141 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(PetscViewerASCIIAddTab(viewer,((PetscObject)mfn)->tablevel)); |
| 142 |
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.
|
18 | if (mfn->reason > 0 && format != PETSC_VIEWER_FAILED) PetscCall(PetscViewerASCIIPrintf(viewer,"%s Matrix function solve converged due to %s; iterations %" PetscInt_FMT "\n",((PetscObject)mfn)->prefix?((PetscObject)mfn)->prefix:"",MFNConvergedReasons[mfn->reason],mfn->its)); |
| 143 | ✗ | else if (mfn->reason <= 0) PetscCall(PetscViewerASCIIPrintf(viewer,"%s Matrix function solve did not converge due to %s; iterations %" PetscInt_FMT "\n",((PetscObject)mfn)->prefix?((PetscObject)mfn)->prefix:"",MFNConvergedReasons[mfn->reason],mfn->its)); | |
| 144 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
18 | PetscCall(PetscViewerASCIISubtractTab(viewer,((PetscObject)mfn)->tablevel)); |
| 145 | } | ||
| 146 |
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); |
| 147 | } | ||
| 148 | |||
| 149 | /*@ | ||
| 150 | MFNConvergedReasonViewFromOptions - Processes command line options to determine if/how | ||
| 151 | the `MFN` converged reason is to be viewed. | ||
| 152 | |||
| 153 | Collective | ||
| 154 | |||
| 155 | Input Parameter: | ||
| 156 | . mfn - the matrix function solver context | ||
| 157 | |||
| 158 | Level: intermediate | ||
| 159 | |||
| 160 | .seealso: [](ch:mfn), `MFNConvergedReasonView()` | ||
| 161 | @*/ | ||
| 162 | 1048 | PetscErrorCode MFNConvergedReasonViewFromOptions(MFN mfn) | |
| 163 | { | ||
| 164 | 1048 | PetscViewer viewer; | |
| 165 | 1048 | PetscBool flg; | |
| 166 | 1048 | static PetscBool incall = PETSC_FALSE; | |
| 167 | 1048 | PetscViewerFormat format; | |
| 168 | |||
| 169 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1048 | PetscFunctionBegin; |
| 170 |
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.
|
1048 | if (incall) PetscFunctionReturn(PETSC_SUCCESS); |
| 171 | 1048 | incall = PETSC_TRUE; | |
| 172 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1048 | PetscCall(PetscOptionsCreateViewer(PetscObjectComm((PetscObject)mfn),((PetscObject)mfn)->options,((PetscObject)mfn)->prefix,"-mfn_converged_reason",&viewer,&format,&flg)); |
| 173 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1048 | if (flg) { |
| 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.
|
18 | PetscCall(PetscViewerPushFormat(viewer,format)); |
| 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.
|
18 | PetscCall(MFNConvergedReasonView(mfn,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.
|
18 | PetscCall(PetscViewerPopFormat(viewer)); |
| 177 |
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)); |
| 178 | } | ||
| 179 | 1048 | incall = PETSC_FALSE; | |
| 180 |
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.
|
1048 | PetscFunctionReturn(PETSC_SUCCESS); |
| 181 | } | ||
| 182 | |||
| 183 | /*@ | ||
| 184 | MFNCreate - Creates the `MFN` context. | ||
| 185 | |||
| 186 | Collective | ||
| 187 | |||
| 188 | Input Parameter: | ||
| 189 | . comm - MPI communicator | ||
| 190 | |||
| 191 | Output Parameter: | ||
| 192 | . outmfn - location to put the `MFN` context | ||
| 193 | |||
| 194 | Note: | ||
| 195 | The default `MFN` type is `MFNKRYLOV`. | ||
| 196 | |||
| 197 | Level: beginner | ||
| 198 | |||
| 199 | .seealso: [](ch:mfn), `MFNSetUp()`, `MFNSolve()`, `MFNDestroy()`, `MFN` | ||
| 200 | @*/ | ||
| 201 | 295 | PetscErrorCode MFNCreate(MPI_Comm comm,MFN *outmfn) | |
| 202 | { | ||
| 203 | 295 | MFN mfn; | |
| 204 | |||
| 205 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
295 | PetscFunctionBegin; |
| 206 |
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.
|
295 | PetscAssertPointer(outmfn,2); |
| 207 |
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.
|
295 | PetscCall(MFNInitializePackage()); |
| 208 |
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.
|
295 | PetscCall(SlepcHeaderCreate(mfn,MFN_CLASSID,"MFN","Matrix Function","MFN",comm,MFNDestroy,MFNView)); |
| 209 | |||
| 210 | 295 | mfn->A = NULL; | |
| 211 | 295 | mfn->fn = NULL; | |
| 212 | 295 | mfn->max_it = PETSC_DETERMINE; | |
| 213 | 295 | mfn->ncv = PETSC_DETERMINE; | |
| 214 | 295 | mfn->tol = PETSC_DETERMINE; | |
| 215 | 295 | mfn->errorifnotconverged = PETSC_FALSE; | |
| 216 | |||
| 217 | 295 | mfn->numbermonitors = 0; | |
| 218 | |||
| 219 | 295 | mfn->V = NULL; | |
| 220 | 295 | mfn->nwork = 0; | |
| 221 | 295 | mfn->work = NULL; | |
| 222 | 295 | mfn->data = NULL; | |
| 223 | |||
| 224 | 295 | mfn->its = 0; | |
| 225 | 295 | mfn->nv = 0; | |
| 226 | 295 | mfn->errest = 0; | |
| 227 | 295 | mfn->setupcalled = 0; | |
| 228 | 295 | mfn->reason = MFN_CONVERGED_ITERATING; | |
| 229 | |||
| 230 | 295 | *outmfn = mfn; | |
| 231 |
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.
|
295 | PetscFunctionReturn(PETSC_SUCCESS); |
| 232 | } | ||
| 233 | |||
| 234 | /*@ | ||
| 235 | MFNSetType - Selects the particular solver to be used in the `MFN` object. | ||
| 236 | |||
| 237 | Logically Collective | ||
| 238 | |||
| 239 | Input Parameters: | ||
| 240 | + mfn - the matrix function solver context | ||
| 241 | - type - a known method | ||
| 242 | |||
| 243 | Options Database Key: | ||
| 244 | . -mfn_type \<type\> - sets the method; use `-help` for a list of available methods | ||
| 245 | |||
| 246 | Notes: | ||
| 247 | See `MFNType` for available methods. The default is `MFNKRYLOV`. | ||
| 248 | |||
| 249 | Normally, it is best to use the `MFNSetFromOptions()` command and | ||
| 250 | then set the `MFN` type from the options database rather than by using | ||
| 251 | this routine. Using the options database provides the user with | ||
| 252 | maximum flexibility in evaluating the different available methods. | ||
| 253 | The `MFNSetType()` routine is provided for those situations where it | ||
| 254 | is necessary to set the iterative solver independently of the command | ||
| 255 | line or options database. | ||
| 256 | |||
| 257 | Level: intermediate | ||
| 258 | |||
| 259 | .seealso: [](ch:mfn), `MFNType` | ||
| 260 | @*/ | ||
| 261 | 214 | PetscErrorCode MFNSetType(MFN mfn,MFNType type) | |
| 262 | { | ||
| 263 | 214 | PetscErrorCode (*r)(MFN); | |
| 264 | 214 | PetscBool match; | |
| 265 | |||
| 266 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
214 | PetscFunctionBegin; |
| 267 |
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.
|
214 | PetscValidHeaderSpecific(mfn,MFN_CLASSID,1); |
| 268 |
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.
|
214 | PetscAssertPointer(type,2); |
| 269 | |||
| 270 |
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.
|
214 | PetscCall(PetscObjectTypeCompare((PetscObject)mfn,type,&match)); |
| 271 |
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.
|
214 | if (match) PetscFunctionReturn(PETSC_SUCCESS); |
| 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.
|
214 | PetscCall(PetscFunctionListFind(MFNList,type,&r)); |
| 274 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
214 | PetscCheck(r,PetscObjectComm((PetscObject)mfn),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown MFN type given: %s",type); |
| 275 | |||
| 276 |
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.
|
214 | PetscTryTypeMethod(mfn,destroy); |
| 277 |
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.
|
214 | PetscCall(PetscMemzero(mfn->ops,sizeof(struct _MFNOps))); |
| 278 | |||
| 279 | 214 | mfn->setupcalled = 0; | |
| 280 |
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.
|
214 | PetscCall(PetscObjectChangeTypeName((PetscObject)mfn,type)); |
| 281 |
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.
|
214 | PetscCall((*r)(mfn)); |
| 282 |
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.
|
37 | PetscFunctionReturn(PETSC_SUCCESS); |
| 283 | } | ||
| 284 | |||
| 285 | /*@ | ||
| 286 | MFNGetType - Gets the `MFN` type as a string from the `MFN` object. | ||
| 287 | |||
| 288 | Not Collective | ||
| 289 | |||
| 290 | Input Parameter: | ||
| 291 | . mfn - the matrix function solver context | ||
| 292 | |||
| 293 | Output Parameter: | ||
| 294 | . type - name of `MFN` method | ||
| 295 | |||
| 296 | Level: intermediate | ||
| 297 | |||
| 298 | .seealso: [](ch:mfn), `MFNSetType()` | ||
| 299 | @*/ | ||
| 300 | 44 | PetscErrorCode MFNGetType(MFN mfn,MFNType *type) | |
| 301 | { | ||
| 302 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
44 | PetscFunctionBegin; |
| 303 |
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(mfn,MFN_CLASSID,1); |
| 304 |
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); |
| 305 | 44 | *type = ((PetscObject)mfn)->type_name; | |
| 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.
|
44 | PetscFunctionReturn(PETSC_SUCCESS); |
| 307 | } | ||
| 308 | |||
| 309 | /*@C | ||
| 310 | MFNRegister - Adds a method to the matrix function solver package. | ||
| 311 | |||
| 312 | Not Collective | ||
| 313 | |||
| 314 | Input Parameters: | ||
| 315 | + name - name of a new user-defined solver | ||
| 316 | - function - routine to create the solver context | ||
| 317 | |||
| 318 | Note: | ||
| 319 | `MFNRegister()` may be called multiple times to add several user-defined solvers. | ||
| 320 | |||
| 321 | Example Usage: | ||
| 322 | .vb | ||
| 323 | MFNRegister("my_solver",MySolverCreate); | ||
| 324 | .ve | ||
| 325 | |||
| 326 | Then, your solver can be chosen with the procedural interface via | ||
| 327 | .vb | ||
| 328 | MFNSetType(mfn,"my_solver") | ||
| 329 | .ve | ||
| 330 | or at runtime via the option `-mfn_type my_solver`. | ||
| 331 | |||
| 332 | Level: advanced | ||
| 333 | |||
| 334 | .seealso: [](ch:mfn), `MFNRegisterAll()` | ||
| 335 | @*/ | ||
| 336 | 426 | PetscErrorCode MFNRegister(const char *name,PetscErrorCode (*function)(MFN)) | |
| 337 | { | ||
| 338 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
426 | PetscFunctionBegin; |
| 339 |
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.
|
426 | PetscCall(MFNInitializePackage()); |
| 340 |
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.
|
426 | PetscCall(PetscFunctionListAdd(&MFNList,name,function)); |
| 341 |
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.
|
66 | PetscFunctionReturn(PETSC_SUCCESS); |
| 342 | } | ||
| 343 | |||
| 344 | /*@C | ||
| 345 | MFNMonitorRegister - Registers an `MFN` monitor routine that may be accessed with | ||
| 346 | `MFNMonitorSetFromOptions()`. | ||
| 347 | |||
| 348 | Not Collective | ||
| 349 | |||
| 350 | Input Parameters: | ||
| 351 | + name - name of a new monitor routine | ||
| 352 | . vtype - a `PetscViewerType` for the output | ||
| 353 | . format - a `PetscViewerFormat` for the output | ||
| 354 | . monitor - monitor routine, see `MFNMonitorRegisterFn` | ||
| 355 | . create - creation routine, or `NULL` | ||
| 356 | - destroy - destruction routine, or `NULL` | ||
| 357 | |||
| 358 | Notes: | ||
| 359 | `MFNMonitorRegister()` may be called multiple times to add several user-defined monitors. | ||
| 360 | |||
| 361 | The calling sequence for the given function matches the calling sequence of `MFNMonitorFn` | ||
| 362 | functions passed to `MFNMonitorSet()` with the additional requirement that its final argument | ||
| 363 | be a `PetscViewerAndFormat`. | ||
| 364 | |||
| 365 | Example Usage: | ||
| 366 | .vb | ||
| 367 | MFNMonitorRegister("my_monitor",PETSCVIEWERASCII,PETSC_VIEWER_ASCII_INFO_DETAIL,MyMonitor,NULL,NULL); | ||
| 368 | .ve | ||
| 369 | |||
| 370 | Then, your monitor can be chosen with the procedural interface via | ||
| 371 | .vb | ||
| 372 | MFNMonitorSetFromOptions(mfn,"-mfn_monitor_my_monitor","my_monitor",NULL); | ||
| 373 | .ve | ||
| 374 | or at runtime via the option `-mfn_monitor_my_monitor`. | ||
| 375 | |||
| 376 | Level: advanced | ||
| 377 | |||
| 378 | .seealso: [](ch:mfn), `MFNMonitorSet()`, `MFNMonitorRegisterAll()`, `MFNMonitorSetFromOptions()` | ||
| 379 | @*/ | ||
| 380 | 426 | PetscErrorCode MFNMonitorRegister(const char name[],PetscViewerType vtype,PetscViewerFormat format,MFNMonitorRegisterFn *monitor,MFNMonitorRegisterCreateFn *create,MFNMonitorRegisterDestroyFn *destroy) | |
| 381 | { | ||
| 382 | 426 | char key[PETSC_MAX_PATH_LEN]; | |
| 383 | |||
| 384 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
426 | PetscFunctionBegin; |
| 385 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
426 | PetscCall(MFNInitializePackage()); |
| 386 |
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.
|
426 | PetscCall(SlepcMonitorMakeKey_Internal(name,vtype,format,key)); |
| 387 |
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.
|
426 | PetscCall(PetscFunctionListAdd(&MFNMonitorList,key,monitor)); |
| 388 |
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.
|
426 | if (create) PetscCall(PetscFunctionListAdd(&MFNMonitorCreateList,key,create)); |
| 389 |
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.
|
426 | if (destroy) PetscCall(PetscFunctionListAdd(&MFNMonitorDestroyList,key,destroy)); |
| 390 |
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.
|
66 | PetscFunctionReturn(PETSC_SUCCESS); |
| 391 | } | ||
| 392 | |||
| 393 | /*@ | ||
| 394 | MFNReset - Resets the `MFN` context to the initial state (prior to setup) | ||
| 395 | and destroys any allocated `Vec`s and `Mat`s. | ||
| 396 | |||
| 397 | Collective | ||
| 398 | |||
| 399 | Input Parameter: | ||
| 400 | . mfn - the matrix function solver context | ||
| 401 | |||
| 402 | Level: advanced | ||
| 403 | |||
| 404 | .seealso: [](ch:mfn), `MFNDestroy()` | ||
| 405 | @*/ | ||
| 406 | 295 | PetscErrorCode MFNReset(MFN mfn) | |
| 407 | { | ||
| 408 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
295 | PetscFunctionBegin; |
| 409 |
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.
|
295 | if (mfn) PetscValidHeaderSpecific(mfn,MFN_CLASSID,1); |
| 410 |
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.
|
277 | if (!mfn) PetscFunctionReturn(PETSC_SUCCESS); |
| 411 |
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.
|
295 | PetscTryTypeMethod(mfn,reset); |
| 412 |
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.
|
295 | PetscCall(MatDestroy(&mfn->A)); |
| 413 |
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.
|
295 | PetscCall(BVDestroy(&mfn->V)); |
| 414 |
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.
|
295 | PetscCall(VecDestroyVecs(mfn->nwork,&mfn->work)); |
| 415 | 295 | mfn->nwork = 0; | |
| 416 | 295 | mfn->setupcalled = 0; | |
| 417 |
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.
|
295 | PetscFunctionReturn(PETSC_SUCCESS); |
| 418 | } | ||
| 419 | |||
| 420 | /*@ | ||
| 421 | MFNDestroy - Destroys the `MFN` context. | ||
| 422 | |||
| 423 | Collective | ||
| 424 | |||
| 425 | Input Parameter: | ||
| 426 | . mfn - the matrix function solver context | ||
| 427 | |||
| 428 | Level: beginner | ||
| 429 | |||
| 430 | .seealso: [](ch:mfn), `MFNCreate()`, `MFNSetUp()`, `MFNSolve()` | ||
| 431 | @*/ | ||
| 432 | 316 | PetscErrorCode MFNDestroy(MFN *mfn) | |
| 433 | { | ||
| 434 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
316 | PetscFunctionBegin; |
| 435 |
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.
|
316 | if (!*mfn) PetscFunctionReturn(PETSC_SUCCESS); |
| 436 |
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.
|
316 | PetscValidHeaderSpecific(*mfn,MFN_CLASSID,1); |
| 437 |
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.
|
316 | if (--((PetscObject)*mfn)->refct > 0) { *mfn = NULL; PetscFunctionReturn(PETSC_SUCCESS); } |
| 438 |
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.
|
295 | PetscCall(MFNReset(*mfn)); |
| 439 |
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.
|
295 | PetscTryTypeMethod(*mfn,destroy); |
| 440 |
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.
|
295 | PetscCall(FNDestroy(&(*mfn)->fn)); |
| 441 |
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.
|
295 | PetscCall(MatDestroy(&(*mfn)->AT)); |
| 442 |
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.
|
295 | PetscCall(MFNMonitorCancel(*mfn)); |
| 443 |
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.
|
295 | PetscCall(PetscHeaderDestroy(mfn)); |
| 444 |
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.
|
35 | PetscFunctionReturn(PETSC_SUCCESS); |
| 445 | } | ||
| 446 | |||
| 447 | /*@ | ||
| 448 | MFNSetBV - Associates a basis vectors object to the matrix function solver. | ||
| 449 | |||
| 450 | Collective | ||
| 451 | |||
| 452 | Input Parameters: | ||
| 453 | + mfn - the matrix function solver context | ||
| 454 | - bv - the basis vectors object | ||
| 455 | |||
| 456 | Note: | ||
| 457 | Use `MFNGetBV()` to retrieve the basis vectors context (for example, | ||
| 458 | to free it at the end of the computations). | ||
| 459 | |||
| 460 | Level: advanced | ||
| 461 | |||
| 462 | .seealso: [](ch:mfn), `MFNGetBV()` | ||
| 463 | @*/ | ||
| 464 | 8 | PetscErrorCode MFNSetBV(MFN mfn,BV bv) | |
| 465 | { | ||
| 466 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
8 | PetscFunctionBegin; |
| 467 |
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.
|
8 | PetscValidHeaderSpecific(mfn,MFN_CLASSID,1); |
| 468 |
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.
|
8 | PetscValidHeaderSpecific(bv,BV_CLASSID,2); |
| 469 |
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.
|
8 | PetscCheckSameComm(mfn,1,bv,2); |
| 470 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(PetscObjectReference((PetscObject)bv)); |
| 471 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
8 | PetscCall(BVDestroy(&mfn->V)); |
| 472 | 8 | mfn->V = bv; | |
| 473 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
8 | PetscFunctionReturn(PETSC_SUCCESS); |
| 474 | } | ||
| 475 | |||
| 476 | /*@ | ||
| 477 | MFNGetBV - Obtain the basis vectors object associated to the matrix | ||
| 478 | function solver. | ||
| 479 | |||
| 480 | Not Collective | ||
| 481 | |||
| 482 | Input Parameter: | ||
| 483 | . mfn - the matrix function solver context | ||
| 484 | |||
| 485 | Output Parameter: | ||
| 486 | . bv - basis vectors context | ||
| 487 | |||
| 488 | Level: advanced | ||
| 489 | |||
| 490 | .seealso: [](ch:mfn), `MFNSetBV()` | ||
| 491 | @*/ | ||
| 492 | 196 | PetscErrorCode MFNGetBV(MFN mfn,BV *bv) | |
| 493 | { | ||
| 494 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
196 | PetscFunctionBegin; |
| 495 |
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.
|
196 | PetscValidHeaderSpecific(mfn,MFN_CLASSID,1); |
| 496 |
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.
|
196 | PetscAssertPointer(bv,2); |
| 497 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
196 | if (!mfn->V) { |
| 498 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
196 | PetscCall(BVCreate(PetscObjectComm((PetscObject)mfn),&mfn->V)); |
| 499 |
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.
|
196 | PetscCall(PetscObjectIncrementTabLevel((PetscObject)mfn->V,(PetscObject)mfn,0)); |
| 500 |
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.
|
196 | PetscCall(PetscObjectSetOptions((PetscObject)mfn->V,((PetscObject)mfn)->options)); |
| 501 | } | ||
| 502 | 196 | *bv = mfn->V; | |
| 503 |
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.
|
196 | PetscFunctionReturn(PETSC_SUCCESS); |
| 504 | } | ||
| 505 | |||
| 506 | /*@ | ||
| 507 | MFNSetFN - Specifies the function to be computed. | ||
| 508 | |||
| 509 | Collective | ||
| 510 | |||
| 511 | Input Parameters: | ||
| 512 | + mfn - the matrix function solver context | ||
| 513 | - fn - the math function object | ||
| 514 | |||
| 515 | Notes: | ||
| 516 | At a later time, use `MFNGetFN()` to retrieve the math function context | ||
| 517 | (for example, to free it at the end of the computations). | ||
| 518 | |||
| 519 | This function is not called in normal usage. Instead, it is easier to | ||
| 520 | extract the internal `FN` object with `MFNGetFN()` and modify it. | ||
| 521 | |||
| 522 | Level: beginner | ||
| 523 | |||
| 524 | .seealso: [](ch:mfn), `MFNGetFN()` | ||
| 525 | @*/ | ||
| 526 | 48 | PetscErrorCode MFNSetFN(MFN mfn,FN fn) | |
| 527 | { | ||
| 528 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
48 | PetscFunctionBegin; |
| 529 |
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(mfn,MFN_CLASSID,1); |
| 530 |
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(fn,FN_CLASSID,2); |
| 531 |
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.
|
48 | PetscCheckSameComm(mfn,1,fn,2); |
| 532 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(PetscObjectReference((PetscObject)fn)); |
| 533 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
48 | PetscCall(FNDestroy(&mfn->fn)); |
| 534 | 48 | mfn->fn = fn; | |
| 535 |
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); |
| 536 | } | ||
| 537 | |||
| 538 | /*@ | ||
| 539 | MFNGetFN - Obtain the math function object associated to the `MFN` object. | ||
| 540 | |||
| 541 | Not Collective | ||
| 542 | |||
| 543 | Input Parameter: | ||
| 544 | . mfn - the matrix function solver context | ||
| 545 | |||
| 546 | Output Parameter: | ||
| 547 | . fn - math function context | ||
| 548 | |||
| 549 | Note: | ||
| 550 | This is the usual way to specify the function that needs to be applied | ||
| 551 | to a given vector in `MFNSolve()`. | ||
| 552 | |||
| 553 | Level: beginner | ||
| 554 | |||
| 555 | .seealso: [](ch:mfn), `MFNSetFN()`. `MFNSolve()` | ||
| 556 | @*/ | ||
| 557 | 6046 | PetscErrorCode MFNGetFN(MFN mfn,FN *fn) | |
| 558 | { | ||
| 559 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6046 | PetscFunctionBegin; |
| 560 |
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.
|
6046 | PetscValidHeaderSpecific(mfn,MFN_CLASSID,1); |
| 561 |
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.
|
6046 | PetscAssertPointer(fn,2); |
| 562 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
6046 | if (!mfn->fn) { |
| 563 |
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.
|
156 | PetscCall(FNCreate(PetscObjectComm((PetscObject)mfn),&mfn->fn)); |
| 564 |
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.
|
156 | PetscCall(PetscObjectIncrementTabLevel((PetscObject)mfn->fn,(PetscObject)mfn,0)); |
| 565 |
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.
|
156 | PetscCall(PetscObjectSetOptions((PetscObject)mfn->fn,((PetscObject)mfn)->options)); |
| 566 | } | ||
| 567 | 6046 | *fn = mfn->fn; | |
| 568 |
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.
|
6046 | PetscFunctionReturn(PETSC_SUCCESS); |
| 569 | } | ||
| 570 |