32 #ifndef OPM_LOCAL_AD_MATH_HPP 33 #define OPM_LOCAL_AD_MATH_HPP 42 template <
class ValueT,
int numVars>
46 template <
class ValueType,
int numVars>
47 Evaluation<ValueType, numVars> abs(
const Evaluation<ValueType, numVars>& x)
48 {
return (x > 0.0)?x:-x; }
50 template <
class ValueType,
int numVars>
51 Evaluation<ValueType, numVars> min(
const Evaluation<ValueType, numVars>& x1,
52 const Evaluation<ValueType, numVars>& x2)
53 {
return (x1 < x2)?x1:x2; }
55 template <
class Arg1ValueType,
class ValueType,
int numVars>
56 Evaluation<ValueType, numVars> min(
const Arg1ValueType& x1,
57 const Evaluation<ValueType, numVars>& x2)
58 {
return (x1 < x2)?x1:x2; }
60 template <
class ValueType,
int numVars,
class Arg2ValueType>
61 Evaluation<ValueType, numVars> min(
const Evaluation<ValueType, numVars>& x1,
62 const Arg2ValueType& x2)
63 {
return min(x2, x1); }
65 template <
class ValueType,
int numVars>
66 Evaluation<ValueType, numVars> max(
const Evaluation<ValueType, numVars>& x1,
67 const Evaluation<ValueType, numVars>& x2)
68 {
return (x1 > x2)?x1:x2; }
70 template <
class Arg1ValueType,
class ValueType,
int numVars>
71 Evaluation<ValueType, numVars> max(
const Arg1ValueType& x1,
72 const Evaluation<ValueType, numVars>& x2)
73 {
return (x1 > x2)?x1:x2; }
75 template <
class ValueType,
int numVars,
class Arg2ValueType>
76 Evaluation<ValueType, numVars> max(
const Evaluation<ValueType, numVars>& x1,
77 const Arg2ValueType& x2)
78 {
return max(x2, x1); }
80 template <
class ValueType,
int numVars>
81 Evaluation<ValueType, numVars> tan(
const Evaluation<ValueType, numVars>& x)
83 typedef MathToolbox<ValueType> ValueTypeToolbox;
85 Evaluation<ValueType, numVars> result;
87 const ValueType& tmp = ValueTypeToolbox::tan(x.value());
91 const ValueType& df_dx = 1 + tmp*tmp;
92 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
93 result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
98 template <
class ValueType,
int numVars>
99 Evaluation<ValueType, numVars> atan(
const Evaluation<ValueType, numVars>& x)
101 typedef MathToolbox<ValueType> ValueTypeToolbox;
103 Evaluation<ValueType, numVars> result;
105 result.setValue(ValueTypeToolbox::atan(x.value()));
108 const ValueType& df_dx = 1/(1 + x.value()*x.value());
109 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
110 result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
115 template <
class ValueType,
int numVars>
116 Evaluation<ValueType, numVars> atan2(
const Evaluation<ValueType, numVars>& x,
117 const Evaluation<ValueType, numVars>& y)
119 typedef MathToolbox<ValueType> ValueTypeToolbox;
121 Evaluation<ValueType, numVars> result;
123 result.setValue(ValueTypeToolbox::atan2(x.value(), y.value()));
126 const ValueType& alpha = 1/(1 + (x.value()*x.value())/(y.value()*y.value()));
127 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
128 result.setDerivative(curVarIdx,
129 alpha/(y.value()*y.value())
130 *(x.derivative(curVarIdx)*y.value() - x.value()*y.derivative(curVarIdx)));
136 template <
class ValueType,
int numVars>
137 Evaluation<ValueType, numVars> sin(
const Evaluation<ValueType, numVars>& x)
139 typedef MathToolbox<ValueType> ValueTypeToolbox;
141 Evaluation<ValueType, numVars> result;
143 result.setValue(ValueTypeToolbox::sin(x.value()));
146 const ValueType& df_dx = ValueTypeToolbox::cos(x.value());
147 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
148 result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
153 template <
class ValueType,
int numVars>
154 Evaluation<ValueType, numVars> asin(
const Evaluation<ValueType, numVars>& x)
156 typedef MathToolbox<ValueType> ValueTypeToolbox;
158 Evaluation<ValueType, numVars> result;
160 result.setValue(ValueTypeToolbox::asin(x.value()));
163 const ValueType& df_dx = 1.0/ValueTypeToolbox::sqrt(1 - x.value()*x.value());
164 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
165 result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
170 template <
class ValueType,
int numVars>
171 Evaluation<ValueType, numVars> cos(
const Evaluation<ValueType, numVars>& x)
173 typedef MathToolbox<ValueType> ValueTypeToolbox;
175 Evaluation<ValueType, numVars> result;
177 result.setValue(ValueTypeToolbox::cos(x.value()));
180 const ValueType& df_dx = -ValueTypeToolbox::sin(x.value());
181 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
182 result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
187 template <
class ValueType,
int numVars>
188 Evaluation<ValueType, numVars> acos(
const Evaluation<ValueType, numVars>& x)
190 typedef MathToolbox<ValueType> ValueTypeToolbox;
192 Evaluation<ValueType, numVars> result;
194 result.setValue(ValueTypeToolbox::acos(x.value()));
197 const ValueType& df_dx = - 1.0/ValueTypeToolbox::sqrt(1 - x.value()*x.value());
198 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
199 result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
204 template <
class ValueType,
int numVars>
205 Evaluation<ValueType, numVars> sqrt(
const Evaluation<ValueType, numVars>& x)
207 typedef MathToolbox<ValueType> ValueTypeToolbox;
209 Evaluation<ValueType, numVars> result;
211 const ValueType& sqrt_x = ValueTypeToolbox::sqrt(x.value());
212 result.setValue(sqrt_x);
215 ValueType df_dx = 0.5/sqrt_x;
216 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
217 result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
223 template <
class ValueType,
int numVars>
224 Evaluation<ValueType, numVars> exp(
const Evaluation<ValueType, numVars>& x)
226 typedef MathToolbox<ValueType> ValueTypeToolbox;
227 Evaluation<ValueType, numVars> result;
229 const ValueType& exp_x = ValueTypeToolbox::exp(x.value());
230 result.setValue(exp_x);
233 const ValueType& df_dx = exp_x;
234 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
235 result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
241 template <
class ValueType,
int numVars,
class ExpType>
242 Evaluation<ValueType, numVars> pow(
const Evaluation<ValueType, numVars>& base,
245 typedef MathToolbox<ValueType> ValueTypeToolbox;
246 Evaluation<ValueType, numVars> result;
248 const ValueType& pow_x = ValueTypeToolbox::pow(base.value(), exp);
249 result.setValue(pow_x);
258 const ValueType& df_dx = pow_x/base.value()*exp;
259 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
260 result.setDerivative(curVarIdx, df_dx*base.derivative(curVarIdx));
267 template <
class BaseType,
class ValueType,
int numVars>
268 Evaluation<ValueType, numVars> pow(
const BaseType& base,
269 const Evaluation<ValueType, numVars>& exp)
271 typedef MathToolbox<ValueType> ValueTypeToolbox;
273 Evaluation<ValueType, numVars> result;
281 const ValueType& lnBase = ValueTypeToolbox::log(base);
282 result.setValue(ValueTypeToolbox::exp(lnBase*exp.value()));
285 const ValueType& df_dx = lnBase*result.value();
286 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
287 result.setDerivative(curVarIdx, df_dx*exp.derivative(curVarIdx));
295 template <
class ValueType,
int numVars>
296 Evaluation<ValueType, numVars> pow(
const Evaluation<ValueType, numVars>& base,
297 const Evaluation<ValueType, numVars>& exp)
299 typedef MathToolbox<ValueType> ValueTypeToolbox;
301 Evaluation<ValueType, numVars> result;
309 ValueType valuePow = ValueTypeToolbox::pow(base.value(), exp.value());
310 result.setValue(valuePow);
314 const ValueType& f = base.value();
315 const ValueType& g = exp.value();
316 const ValueType& logF = ValueTypeToolbox::log(f);
317 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
318 const ValueType& fPrime = base.derivative(curVarIdx);
319 const ValueType& gPrime = exp.derivative(curVarIdx);
320 result.setDerivative(curVarIdx, (g*fPrime/f + logF*gPrime) * valuePow);
327 template <
class ValueType,
int numVars>
328 Evaluation<ValueType, numVars> log(
const Evaluation<ValueType, numVars>& x)
330 typedef MathToolbox<ValueType> ValueTypeToolbox;
332 Evaluation<ValueType, numVars> result;
334 result.setValue(ValueTypeToolbox::log(x.value()));
337 const ValueType& df_dx = 1/x.value();
338 for (
int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
339 result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
348 template <
class ValueT,
int numVars>
359 {
return eval.value(); }
365 {
return Evaluation::createConstant(
value); }
368 {
return Evaluation::createVariable(
value, varIdx); }
370 template <
class LhsEval>
371 static typename std::enable_if<std::is_same<Evaluation, LhsEval>::value,
376 template <
class LhsEval>
377 static typename std::enable_if<std::is_same<Evaluation, LhsEval>::value,
382 template <
class LhsEval>
383 static typename std::enable_if<std::is_floating_point<LhsEval>::value,
386 {
return eval.value(); }
394 if (!ValueTypeToolbox::isSame(a.value(), b.value(), tolerance))
398 for (
int curVarIdx = 0; curVarIdx < numVars; ++curVarIdx)
399 if (!ValueTypeToolbox::isSame(a.derivative(curVarIdx), b.derivative(curVarIdx), tolerance))
406 template <
class Arg1Eval,
class Arg2Eval>
407 static Evaluation max(
const Arg1Eval& arg1,
const Arg2Eval& arg2)
408 {
return Opm::DenseAd::max(arg1, arg2); }
410 template <
class Arg1Eval,
class Arg2Eval>
411 static Evaluation min(
const Arg1Eval& arg1,
const Arg2Eval& arg2)
412 {
return Opm::DenseAd::min(arg1, arg2); }
415 {
return Opm::DenseAd::abs(arg); }
418 {
return Opm::DenseAd::tan(arg); }
421 {
return Opm::DenseAd::atan(arg); }
424 {
return Opm::DenseAd::atan2(arg1, arg2); }
427 {
return Opm::DenseAd::sin(arg); }
430 {
return Opm::DenseAd::asin(arg); }
433 {
return Opm::DenseAd::cos(arg); }
436 {
return Opm::DenseAd::acos(arg); }
439 {
return Opm::DenseAd::sqrt(arg); }
442 {
return Opm::DenseAd::exp(arg); }
445 {
return Opm::DenseAd::log(arg); }
447 template <
class RhsValueType>
449 {
return Opm::DenseAd::pow(arg1, arg2); }
451 template <
class RhsValueType>
453 {
return Opm::DenseAd::pow(arg1, arg2); }
456 {
return Opm::DenseAd::pow(arg1, arg2); }
463 for (
int i = 0; i < numVars; ++i)
475 for (
int i = 0; i < numVars; ++i)
Definition: Air_Mesitylene.hpp:33
Represents a function evaluation and its derivatives w.r.t.
Definition: Evaluation.hpp:57
Representation of an evaluation of a function and its derivatives w.r.t.