32 #ifndef OPM_MATERIAL_MATH_TOOLBOX_HPP
33 #define OPM_MATERIAL_MATH_TOOLBOX_HPP
39 #include <type_traits>
50 template <
class ScalarT>
53 static_assert(std::is_floating_point<ScalarT>::value,
54 "This class expects floating point scalars! (specialization missing?)");
126 if (numDerivatives != 0)
127 throw std::logic_error(
"Plain floating point objects cannot represent any derivatives");
150 {
throw std::logic_error(
"Plain floating point objects cannot represent variables"); }
161 {
throw std::logic_error(
"Plain floating point objects cannot represent variables"); }
174 template <
class LhsEval>
177 static_assert(std::is_floating_point<LhsEval>::value,
178 "The left-hand side must be a primitive floating point type!");
189 Scalar denom = std::max<Scalar>(1.0, std::abs(a + b));
191 return std::abs(valueDiff) < tolerance || std::abs(valueDiff)/denom < tolerance;
200 {
return std::max(arg1, arg2); }
204 {
return std::min(arg1, arg2); }
208 {
return std::abs(arg); }
212 {
return std::tan(arg); }
216 {
return std::atan(arg); }
220 {
return std::atan2(arg1, arg2); }
224 {
return std::sin(arg); }
228 {
return std::asin(arg); }
232 {
return std::cos(arg); }
236 {
return std::acos(arg); }
240 {
return std::sqrt(arg); }
244 {
return std::exp(arg); }
248 {
return std::log10(arg); }
252 {
return std::log(arg); }
256 {
return std::pow(base,
exp); }
260 {
return std::isfinite(arg); }
264 {
return std::isnan(arg); }
267 template <
class Eval1,
class Eval2>
270 typedef typename std::remove_const< typename std::remove_reference<Eval1>::type >::type T;
271 typedef typename std::remove_const< typename std::remove_reference<Eval2>::type >::type U;
276 typedef typename std::conditional<std::is_constructible<T, U>::value,
282 template <
class Evaluation>
283 Evaluation blank(
const Evaluation& x)
286 template <
class Evaluation,
class Scalar>
287 Evaluation constant(
const Scalar& value)
290 template <
class Evaluation,
class Scalar>
291 Evaluation constant(
unsigned numDeriv,
const Scalar& value)
294 template <
class Evaluation,
class Scalar>
295 Evaluation constant(
const Evaluation& x,
const Scalar& value)
298 template <
class Evaluation,
class Scalar>
299 Evaluation variable(
unsigned numDeriv,
const Scalar& value,
unsigned idx)
302 template <
class Evaluation,
class Scalar>
303 Evaluation variable(
const Evaluation& x,
const Scalar& value,
unsigned idx)
306 template <
class Evaluation,
class Scalar>
307 Evaluation variable(
const Scalar& value,
unsigned idx)
310 template <
class ResultEval,
class Evaluation>
311 auto decay(
const Evaluation& value)
312 -> decltype(MathToolbox<Evaluation>::template decay<ResultEval>(value))
313 {
return MathToolbox<Evaluation>::template decay<ResultEval>(value); }
315 template <
class Evaluation>
316 auto getValue(
const Evaluation& val)
320 template <
class Evaluation>
321 auto scalarValue(
const Evaluation& val)
325 template <
class Evaluation1,
class Evaluation2>
326 typename ReturnEval_<Evaluation1, Evaluation2>::type
327 max(
const Evaluation1& arg1,
const Evaluation2& arg2)
328 {
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::max(arg1, arg2); }
330 template <
class Evaluation1,
class Evaluation2>
331 typename ReturnEval_<Evaluation1, Evaluation2>::type
332 min(
const Evaluation1& arg1,
const Evaluation2& arg2)
333 {
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::min(arg1, arg2); }
335 template <
class Evaluation>
336 Evaluation abs(
const Evaluation& value)
339 template <
class Evaluation>
340 Evaluation tan(
const Evaluation& value)
343 template <
class Evaluation>
344 Evaluation atan(
const Evaluation& value)
347 template <
class Evaluation1,
class Evaluation2>
348 typename ReturnEval_<Evaluation1, Evaluation2>::type
349 atan2(
const Evaluation1& value1,
const Evaluation2& value2)
350 {
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::atan2(value1, value2); }
352 template <
class Evaluation>
353 Evaluation sin(
const Evaluation& value)
356 template <
class Evaluation>
357 Evaluation asin(
const Evaluation& value)
360 template <
class Evaluation>
361 Evaluation cos(
const Evaluation& value)
364 template <
class Evaluation>
365 Evaluation acos(
const Evaluation& value)
368 template <
class Evaluation>
369 Evaluation sqrt(
const Evaluation& value)
372 template <
class Evaluation>
373 Evaluation exp(
const Evaluation& value)
376 template <
class Evaluation>
377 Evaluation log(
const Evaluation& value)
380 template <
class Evaluation>
381 Evaluation log10(
const Evaluation& value)
384 template <
class Evaluation1,
class Evaluation2>
385 typename ReturnEval_<Evaluation1, Evaluation2>::type
386 pow(
const Evaluation1& base,
const Evaluation2& exp)
387 {
return MathToolbox<typename ReturnEval_<Evaluation1, Evaluation2>::type>::pow(base, exp); }
389 template <
class Evaluation>
390 bool isfinite(
const Evaluation& value)
393 template <
class Evaluation>
394 bool isnan(
const Evaluation& value)
Provides the OPM_UNUSED macro.
Definition: MathToolbox.hpp:269