32#ifndef OPM_MATERIAL_MATH_TOOLBOX_HPP
33#define OPM_MATERIAL_MATH_TOOLBOX_HPP
48template <
class ScalarT>
51 static_assert(std::is_floating_point<ScalarT>::value,
52 "This class expects floating point scalars! (specialization missing?)");
124 if (numDerivatives != 0)
125 throw std::logic_error(
"Plain floating point objects cannot represent any derivatives");
148 {
throw std::logic_error(
"Plain floating point objects cannot represent variables"); }
159 {
throw std::logic_error(
"Plain floating point objects cannot represent variables"); }
172 template <
class LhsEval>
175 static_assert(std::is_floating_point<LhsEval>::value,
176 "The left-hand side must be a primitive floating point type!");
187 Scalar denom = std::max<Scalar>(1.0, std::abs(a + b));
189 return std::abs(valueDiff) < tolerance || std::abs(valueDiff)/denom < tolerance;
198 {
return std::max(arg1, arg2); }
202 {
return std::min(arg1, arg2); }
206 {
return std::abs(arg); }
210 {
return std::tan(arg); }
214 {
return std::atan(arg); }
218 {
return std::atan2(arg1, arg2); }
222 {
return std::sin(arg); }
226 {
return std::asin(arg); }
230 {
return std::sinh(arg); }
234 {
return std::asinh(arg); }
238 {
return std::cos(arg); }
242 {
return std::acos(arg); }
246 {
return std::cosh(arg); }
250 {
return std::acosh(arg); }
254 {
return std::sqrt(arg); }
258 {
return std::exp(arg); }
262 {
return std::log10(arg); }
266 {
return std::log(arg); }
270 {
return std::pow(base,
exp); }
274 {
return std::isfinite(arg); }
278 {
return std::isnan(arg); }
281template <
class Eval1,
class Eval2>
284 typedef typename std::remove_const< typename std::remove_reference<Eval1>::type >::type T;
285 typedef typename std::remove_const< typename std::remove_reference<Eval2>::type >::type U;
290 typedef typename std::conditional<std::is_constructible<T, U>::value,
296template <
class Evaluation>
297Evaluation blank(
const Evaluation& x)
300template <
class Evaluation,
class Scalar>
301Evaluation constant(
const Scalar& value)
304template <
class Evaluation,
class Scalar>
305Evaluation constant(
unsigned numDeriv,
const Scalar& value)
308template <
class Evaluation,
class Scalar>
309Evaluation constant(
const Evaluation& x,
const Scalar& value)
312template <
class Evaluation,
class Scalar>
313Evaluation variable(
unsigned numDeriv,
const Scalar& value,
unsigned idx)
316template <
class Evaluation,
class Scalar>
317Evaluation variable(
const Evaluation& x,
const Scalar& value,
unsigned idx)
320template <
class Evaluation,
class Scalar>
321Evaluation variable(
const Scalar& value,
unsigned idx)
324template <
class ResultEval,
class Evaluation>
325auto decay(
const Evaluation& value)
326 ->
decltype(MathToolbox<Evaluation>::template decay<ResultEval>(value))
327{
return MathToolbox<Evaluation>::template decay<ResultEval>(value); }
329template <
class Evaluation>
330auto getValue(
const Evaluation& val)
334template <
class Evaluation>
335auto scalarValue(
const Evaluation& val)
339template <
class Evaluation1,
class Evaluation2>
340typename ReturnEval_<Evaluation1, Evaluation2>::type
341max(
const Evaluation1& arg1,
const Evaluation2& arg2)
342{
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::max(arg1, arg2); }
344template <
class Evaluation1,
class Evaluation2>
345typename ReturnEval_<Evaluation1, Evaluation2>::type
346min(
const Evaluation1& arg1,
const Evaluation2& arg2)
347{
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::min(arg1, arg2); }
349template <
class Evaluation>
350Evaluation abs(
const Evaluation& value)
353template <
class Evaluation>
354Evaluation tan(
const Evaluation& value)
357template <
class Evaluation>
358Evaluation atan(
const Evaluation& value)
361template <
class Evaluation1,
class Evaluation2>
362typename ReturnEval_<Evaluation1, Evaluation2>::type
363atan2(
const Evaluation1& value1,
const Evaluation2& value2)
364{
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::atan2(value1, value2); }
366template <
class Evaluation>
367Evaluation sin(
const Evaluation& value)
370template <
class Evaluation>
371Evaluation asin(
const Evaluation& value)
374template <
class Evaluation>
375Evaluation sinh(
const Evaluation& value)
378template <
class Evaluation>
379Evaluation asinh(
const Evaluation& value)
382template <
class Evaluation>
383Evaluation cos(
const Evaluation& value)
386template <
class Evaluation>
387Evaluation acos(
const Evaluation& value)
390template <
class Evaluation>
391Evaluation cosh(
const Evaluation& value)
394template <
class Evaluation>
395Evaluation acosh(
const Evaluation& value)
398template <
class Evaluation>
399Evaluation sqrt(
const Evaluation& value)
402template <
class Evaluation>
403Evaluation exp(
const Evaluation& value)
406template <
class Evaluation>
407Evaluation log(
const Evaluation& value)
410template <
class Evaluation>
411Evaluation log10(
const Evaluation& value)
414template <
class Evaluation1,
class Evaluation2>
415typename ReturnEval_<Evaluation1, Evaluation2>::type
416pow(
const Evaluation1& base,
const Evaluation2& exp)
417{
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::pow(base, exp); }
419template <
class Evaluation>
420bool isfinite(
const Evaluation& value)
423template <
class Evaluation>
424bool isnan(
const Evaluation& value)
This class implements a small container which holds the transmissibility mulitpliers for all the face...
Definition Exceptions.hpp:30
Definition MathToolbox.hpp:283