32 #ifndef OPM_MATERIAL_MATH_TOOLBOX_HPP
33 #define OPM_MATERIAL_MATH_TOOLBOX_HPP
37 #include <type_traits>
48 template <
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); }
281 template <
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,
296 template <
class Evaluation>
297 Evaluation blank(
const Evaluation& x)
300 template <
class Evaluation,
class Scalar>
301 Evaluation constant(
const Scalar& value)
304 template <
class Evaluation,
class Scalar>
305 Evaluation constant(
unsigned numDeriv,
const Scalar& value)
308 template <
class Evaluation,
class Scalar>
309 Evaluation constant(
const Evaluation& x,
const Scalar& value)
312 template <
class Evaluation,
class Scalar>
313 Evaluation variable(
unsigned numDeriv,
const Scalar& value,
unsigned idx)
316 template <
class Evaluation,
class Scalar>
317 Evaluation variable(
const Evaluation& x,
const Scalar& value,
unsigned idx)
320 template <
class Evaluation,
class Scalar>
321 Evaluation variable(
const Scalar& value,
unsigned idx)
324 template <
class ResultEval,
class Evaluation>
325 auto decay(
const Evaluation& value)
326 -> decltype(MathToolbox<Evaluation>::template decay<ResultEval>(value))
327 {
return MathToolbox<Evaluation>::template decay<ResultEval>(value); }
329 template <
class Evaluation>
330 auto getValue(
const Evaluation& val)
334 template <
class Evaluation>
335 auto scalarValue(
const Evaluation& val)
339 template <
class Evaluation1,
class Evaluation2>
340 typename ReturnEval_<Evaluation1, Evaluation2>::type
341 max(
const Evaluation1& arg1,
const Evaluation2& arg2)
342 {
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::max(arg1, arg2); }
344 template <
class Evaluation1,
class Evaluation2>
345 typename ReturnEval_<Evaluation1, Evaluation2>::type
346 min(
const Evaluation1& arg1,
const Evaluation2& arg2)
347 {
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::min(arg1, arg2); }
349 template <
class Evaluation>
350 Evaluation abs(
const Evaluation& value)
353 template <
class Evaluation>
354 Evaluation tan(
const Evaluation& value)
357 template <
class Evaluation>
358 Evaluation atan(
const Evaluation& value)
361 template <
class Evaluation1,
class Evaluation2>
362 typename ReturnEval_<Evaluation1, Evaluation2>::type
363 atan2(
const Evaluation1& value1,
const Evaluation2& value2)
364 {
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::atan2(value1, value2); }
366 template <
class Evaluation>
367 Evaluation sin(
const Evaluation& value)
370 template <
class Evaluation>
371 Evaluation asin(
const Evaluation& value)
374 template <
class Evaluation>
375 Evaluation sinh(
const Evaluation& value)
378 template <
class Evaluation>
379 Evaluation asinh(
const Evaluation& value)
382 template <
class Evaluation>
383 Evaluation cos(
const Evaluation& value)
386 template <
class Evaluation>
387 Evaluation acos(
const Evaluation& value)
390 template <
class Evaluation>
391 Evaluation cosh(
const Evaluation& value)
394 template <
class Evaluation>
395 Evaluation acosh(
const Evaluation& value)
398 template <
class Evaluation>
399 Evaluation sqrt(
const Evaluation& value)
402 template <
class Evaluation>
403 Evaluation exp(
const Evaluation& value)
406 template <
class Evaluation>
407 Evaluation log(
const Evaluation& value)
410 template <
class Evaluation>
411 Evaluation log10(
const Evaluation& value)
414 template <
class Evaluation1,
class Evaluation2>
415 typename ReturnEval_<Evaluation1, Evaluation2>::type
416 pow(
const Evaluation1& base,
const Evaluation2& exp)
417 {
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::pow(base, exp); }
419 template <
class Evaluation>
420 bool isfinite(
const Evaluation& value)
423 template <
class Evaluation>
424 bool isnan(
const Evaluation& value)
Definition: MathToolbox.hpp:283