File traits.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/.
Explicit inversion of a 3x3 matrix
aIf the matrix is singular (ill conditioned), the determinant is return. Otherwise, an empty
std::optionalis returnSNB model
-
namespace utils#
Typedefs
- template<class... Ts> EnableIfField = std::enable_if_t<(is_Field_v< Ts > and ...), std::common_type_t< Ts... > >
Enable a function if all the Ts are subclasses of
Field, and returns the common type: i.e.Field3Dif at least one argument isField3D, otherwiseField2Dif they are allField2DThis is most useful in two particular cases:
when there are multiple overloads for a function but some only make sense for fields (as opposed to
BoutReal, say) or vice-versa, and some overloads should not be used for fieldswhen a function takes multiple fields and the return type is also a field and must be “big enough”
In other cases, such as a function without overloads that only works for fields, consider using
static_assertwithis_Fieldto give a nice compile-time errorExamples
Consider the following template function:
This function only “appears” iftemplate <class T, class U, class V, class ResultType = typename bout::utils::EnableIfField<T, U, V>> auto where(const T& test, const U& gt0, const V& le0) -> ResultType { // function body }
T,UandVare all subclasses ofField.ResultTypeis the common type ofT,UandV. IfTandUare bothField2D,ResultTypeisField2DifVisField2D, andField3DifVisField3D.
- template<class... Ts> EnableIfField2D = std::enable_if_t<(is_Field2D_v< Ts > and ...), std::common_type_t< Ts... > >
Enable a function if all the Ts are subclasses of
Field2D, and returns the common type
- template<class... Ts> EnableIfField3D = std::enable_if_t<(is_Field3D_v< Ts > and ...), std::common_type_t< Ts... > >
Enable a function if all the Ts are subclasses of
Field3D, and returns the common type
- template<class... Ts> EnableIfFieldPerp = std::enable_if_t<(is_FieldPerp_v< Ts > and ...), std::common_type_t< Ts... > >
Enable a function if all the Ts are subclasses of
FieldPerp, and returns the common type
Variables
-
template<class T>
constexpr bool is_Field_v = std::is_base_of_v<Field, T># True if
Tis derived fromField, otherwise falseExamples
template <class T> void print_field(const T& field) { static_assert(bout::utils::is_Field_v<T>, "print_field only works with Field2Ds, Field3Ds or FieldPerps") // implementation }
-
template<class T>
constexpr bool is_Field2D_v = std::is_base_of_v<Field2D, T># True if
Tis derived fromField2D, otherwise false.
-
template<class T>
constexpr bool is_Field3D_v = std::is_base_of_v<Field3D, T># True if
Tis derived fromField3D, otherwise false.
-
namespace utils#