File invertable_operator.hxx#
-
namespace bout
Provides access to the Hypre library, handling initialisation and finalisation.
Usage
#include <bout/hyprelib.hxx>
class MyClass { public:
private: HypreLib lib; };
This will then automatically initialise Hypre the first time an object is created, and finalise it when the last object is destroyed.
Copyright 2012 B.D.Dudson, S.Farley, M.V.Umansky, X.Q.Xu
Contact: Ben Dudson, bd512@york.ac.uk
This file is part of BOUT++.
BOUT++ is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
BOUT++ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with BOUT++. If not, see http://www.gnu.org/licenses/.
Information about the version of BOUT++
The build system will update this file on every commit, which may result in files that include it getting rebuilt. Therefore it should be included in as few places as possible
Information about the version of BOUT++
The build system will update this file at configure-time
Explicit inversion of a 3x3 matrix
a
If the matrix is singular (ill conditioned), the determinant is return. Otherwise, an empty
std::optional
is returnSNB model
-
namespace inversion#
Functions
-
template<typename T>
T identity(const T &in)# No-op function to use as a default — may wish to remove once testing phase complete.
-
template<typename T>
class InvertableOperator# - #include <invertable_operator.hxx>
Class to define an invertable operator. Provides interface to PETSc routines for solving A.x = b
Public Types
Public Functions
-
inline InvertableOperator(const function_signature &func = identity<T>, Options *optIn = nullptr, Mesh *localmeshIn = nullptr)#
Almost empty constructor — currently don’t actually use Options for anything.
-
inline ~InvertableOperator()#
Destructor just has to cleanup the PETSc owned objects.
-
inline void setOperatorFunction(const function_signature &func, bool alsoSetPreconditioner = true)#
Allow the user to override the existing function Note by default we set the preconditioner function to match this as this is the usual mode of operation. If the user doesn’t want to do this they can set alsoSetPreconditioner to false.
-
inline void setPreconditionerFunction(const function_signature &func)#
Allow the user to override the existing preconditioner function.
-
inline PetscErrorCode setup()#
Sets up the PETSc objects required for inverting the operator Currently also takes the functor that applies the operator this class represents. Not actually required by any of the setup so this should probably be moved to a separate place (maybe the constructor).
Public Static Functions
-
static inline void reportTime()#
Reports the time spent in various parts of InvertableOperator. Note that as the Timer “labels” are not unique to an instance the time reported is summed across all different instances.
Private Members
-
Mat matOperator#
-
Mat matPreconditioner#
-
Vec rhs#
-
Vec lhs#
-
KSP ksp#
-
function_signature operatorFunction = identity<T>#
The function that represents the operator that we wish to invert.
-
function_signature preconditionerFunction = identity<T>#
The function that represents the preconditioner for the operator that we wish to invert
-
bool doneSetup = false#
Private Static Functions
-
static inline PetscErrorCode functionWrapper(Mat m, Vec v1, Vec v2)#
Wrapper that gets a pointer to the parent InvertableOperator instance from the Matrix m and uses this to get the actual function to call. Copies data from v1 into a field of type T, calls the function on this and then copies the result into the v2 argument.
-
static inline PetscErrorCode preconditionerWrapper(Mat m, Vec v1, Vec v2)#
Wrapper that gets a pointer to the parent InvertableOperator instance from the Matrix m and uses this to get the actual function to call. Copies data from v1 into a field of type T, calls the function on this and then copies the result into the v2 argument.
-
inline InvertableOperator(const function_signature &func = identity<T>, Options *optIn = nullptr, Mesh *localmeshIn = nullptr)#
-
template<typename T>
-
namespace inversion#