Skip to content

Commit

Permalink
Merge pull request #220 from andlaus/eval_specializations_v2
Browse files Browse the repository at this point in the history
Eval specializations v2
  • Loading branch information
atgeirr authored Jun 15, 2017
2 parents b2f5f97 + 055ef84 commit ec2c6cc
Show file tree
Hide file tree
Showing 17 changed files with 6,907 additions and 176 deletions.
763 changes: 763 additions & 0 deletions bin/genEvalSpecializations.py

Large diffs are not rendered by default.

226 changes: 125 additions & 101 deletions opm/material/densead/Evaluation.hpp

Large diffs are not rendered by default.

431 changes: 431 additions & 0 deletions opm/material/densead/Evaluation1.hpp

Large diffs are not rendered by default.

530 changes: 530 additions & 0 deletions opm/material/densead/Evaluation10.hpp

Large diffs are not rendered by default.

541 changes: 541 additions & 0 deletions opm/material/densead/Evaluation11.hpp

Large diffs are not rendered by default.

552 changes: 552 additions & 0 deletions opm/material/densead/Evaluation12.hpp

Large diffs are not rendered by default.

442 changes: 442 additions & 0 deletions opm/material/densead/Evaluation2.hpp

Large diffs are not rendered by default.

453 changes: 453 additions & 0 deletions opm/material/densead/Evaluation3.hpp

Large diffs are not rendered by default.

464 changes: 464 additions & 0 deletions opm/material/densead/Evaluation4.hpp

Large diffs are not rendered by default.

475 changes: 475 additions & 0 deletions opm/material/densead/Evaluation5.hpp

Large diffs are not rendered by default.

486 changes: 486 additions & 0 deletions opm/material/densead/Evaluation6.hpp

Large diffs are not rendered by default.

497 changes: 497 additions & 0 deletions opm/material/densead/Evaluation7.hpp

Large diffs are not rendered by default.

508 changes: 508 additions & 0 deletions opm/material/densead/Evaluation8.hpp

Large diffs are not rendered by default.

519 changes: 519 additions & 0 deletions opm/material/densead/Evaluation9.hpp

Large diffs are not rendered by default.

47 changes: 47 additions & 0 deletions opm/material/densead/EvaluationSpecializations.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
// vi: set et ts=4 sw=4 sts=4:
/*
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
OPM 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
Consult the COPYING file in the top-level source directory of this
module for the precise wording of the license and the list of
copyright holders.
*/
/*!
* \file
*
* \brief This file includes all specializations for the dense-AD Evaluation class.
*
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
* SCRIPT. DO NOT EDIT IT MANUALLY!
*/
#ifndef OPM_DENSEAD_EVALUATION_SPECIALIZATIONS_HPP
#define OPM_DENSEAD_EVALUATION_SPECIALIZATIONS_HPP

#include <opm/material/densead/Evaluation1.hpp>
#include <opm/material/densead/Evaluation2.hpp>
#include <opm/material/densead/Evaluation3.hpp>
#include <opm/material/densead/Evaluation4.hpp>
#include <opm/material/densead/Evaluation5.hpp>
#include <opm/material/densead/Evaluation6.hpp>
#include <opm/material/densead/Evaluation7.hpp>
#include <opm/material/densead/Evaluation8.hpp>
#include <opm/material/densead/Evaluation9.hpp>
#include <opm/material/densead/Evaluation10.hpp>
#include <opm/material/densead/Evaluation11.hpp>
#include <opm/material/densead/Evaluation12.hpp>

#endif // OPM_DENSEAD_EVALUATION_SPECIALIZATIONS_HPP
78 changes: 39 additions & 39 deletions opm/material/densead/Math.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,45 +39,45 @@
namespace Opm {
namespace DenseAd {
// forward declaration of the Evaluation template class
template <class ValueT, unsigned numVars>
template <class ValueT, int numVars>
class Evaluation;

// provide some algebraic functions
template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> abs(const Evaluation<ValueType, numVars>& x)
{ return (x > 0.0)?x:-x; }

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> min(const Evaluation<ValueType, numVars>& x1,
const Evaluation<ValueType, numVars>& x2)
{ return (x1 < x2)?x1:x2; }

template <class Arg1ValueType, class ValueType, unsigned numVars>
template <class Arg1ValueType, class ValueType, int numVars>
Evaluation<ValueType, numVars> min(const Arg1ValueType& x1,
const Evaluation<ValueType, numVars>& x2)
{ return (x1 < x2)?x1:x2; }

template <class ValueType, unsigned numVars, class Arg2ValueType>
template <class ValueType, int numVars, class Arg2ValueType>
Evaluation<ValueType, numVars> min(const Evaluation<ValueType, numVars>& x1,
const Arg2ValueType& x2)
{ return min(x2, x1); }

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> max(const Evaluation<ValueType, numVars>& x1,
const Evaluation<ValueType, numVars>& x2)
{ return (x1 > x2)?x1:x2; }

template <class Arg1ValueType, class ValueType, unsigned numVars>
template <class Arg1ValueType, class ValueType, int numVars>
Evaluation<ValueType, numVars> max(const Arg1ValueType& x1,
const Evaluation<ValueType, numVars>& x2)
{ return (x1 > x2)?x1:x2; }

template <class ValueType, unsigned numVars, class Arg2ValueType>
template <class ValueType, int numVars, class Arg2ValueType>
Evaluation<ValueType, numVars> max(const Evaluation<ValueType, numVars>& x1,
const Arg2ValueType& x2)
{ return max(x2, x1); }

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> tan(const Evaluation<ValueType, numVars>& x)
{
typedef MathToolbox<ValueType> ValueTypeToolbox;
Expand All @@ -89,13 +89,13 @@ Evaluation<ValueType, numVars> tan(const Evaluation<ValueType, numVars>& x)

// derivatives use the chain rule
const ValueType& df_dx = 1 + tmp*tmp;
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));

return result;
}

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> atan(const Evaluation<ValueType, numVars>& x)
{
typedef MathToolbox<ValueType> ValueTypeToolbox;
Expand All @@ -106,13 +106,13 @@ Evaluation<ValueType, numVars> atan(const Evaluation<ValueType, numVars>& x)

// derivatives use the chain rule
const ValueType& df_dx = 1/(1 + x.value()*x.value());
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));

return result;
}

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> atan2(const Evaluation<ValueType, numVars>& x,
const Evaluation<ValueType, numVars>& y)
{
Expand All @@ -124,7 +124,7 @@ Evaluation<ValueType, numVars> atan2(const Evaluation<ValueType, numVars>& x,

// derivatives use the chain rule
const ValueType& alpha = 1/(1 + (x.value()*x.value())/(y.value()*y.value()));
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
result.setDerivative(curVarIdx,
alpha/(y.value()*y.value())
*(x.derivative(curVarIdx)*y.value() - x.value()*y.derivative(curVarIdx)));
Expand All @@ -133,7 +133,7 @@ Evaluation<ValueType, numVars> atan2(const Evaluation<ValueType, numVars>& x,
return result;
}

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> sin(const Evaluation<ValueType, numVars>& x)
{
typedef MathToolbox<ValueType> ValueTypeToolbox;
Expand All @@ -144,13 +144,13 @@ Evaluation<ValueType, numVars> sin(const Evaluation<ValueType, numVars>& x)

// derivatives use the chain rule
const ValueType& df_dx = ValueTypeToolbox::cos(x.value());
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));

return result;
}

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> asin(const Evaluation<ValueType, numVars>& x)
{
typedef MathToolbox<ValueType> ValueTypeToolbox;
Expand All @@ -161,13 +161,13 @@ Evaluation<ValueType, numVars> asin(const Evaluation<ValueType, numVars>& x)

// derivatives use the chain rule
const ValueType& df_dx = 1.0/ValueTypeToolbox::sqrt(1 - x.value()*x.value());
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));

return result;
}

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> cos(const Evaluation<ValueType, numVars>& x)
{
typedef MathToolbox<ValueType> ValueTypeToolbox;
Expand All @@ -178,13 +178,13 @@ Evaluation<ValueType, numVars> cos(const Evaluation<ValueType, numVars>& x)

// derivatives use the chain rule
const ValueType& df_dx = -ValueTypeToolbox::sin(x.value());
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));

return result;
}

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> acos(const Evaluation<ValueType, numVars>& x)
{
typedef MathToolbox<ValueType> ValueTypeToolbox;
Expand All @@ -195,13 +195,13 @@ Evaluation<ValueType, numVars> acos(const Evaluation<ValueType, numVars>& x)

// derivatives use the chain rule
const ValueType& df_dx = - 1.0/ValueTypeToolbox::sqrt(1 - x.value()*x.value());
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));

return result;
}

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> sqrt(const Evaluation<ValueType, numVars>& x)
{
typedef MathToolbox<ValueType> ValueTypeToolbox;
Expand All @@ -213,14 +213,14 @@ Evaluation<ValueType, numVars> sqrt(const Evaluation<ValueType, numVars>& x)

// derivatives use the chain rule
ValueType df_dx = 0.5/sqrt_x;
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
}

return result;
}

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> exp(const Evaluation<ValueType, numVars>& x)
{
typedef MathToolbox<ValueType> ValueTypeToolbox;
Expand All @@ -231,14 +231,14 @@ Evaluation<ValueType, numVars> exp(const Evaluation<ValueType, numVars>& x)

// derivatives use the chain rule
const ValueType& df_dx = exp_x;
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));

return result;
}

// exponentiation of arbitrary base with a fixed constant
template <class ValueType, unsigned numVars, class ExpType>
template <class ValueType, int numVars, class ExpType>
Evaluation<ValueType, numVars> pow(const Evaluation<ValueType, numVars>& base,
const ExpType& exp)
{
Expand All @@ -256,15 +256,15 @@ Evaluation<ValueType, numVars> pow(const Evaluation<ValueType, numVars>& base,
else {
// derivatives use the chain rule
const ValueType& df_dx = pow_x/base.value()*exp;
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
result.setDerivative(curVarIdx, df_dx*base.derivative(curVarIdx));
}

return result;
}

// exponentiation of constant base with an arbitrary exponent
template <class BaseType, class ValueType, unsigned numVars>
template <class BaseType, class ValueType, int numVars>
Evaluation<ValueType, numVars> pow(const BaseType& base,
const Evaluation<ValueType, numVars>& exp)
{
Expand All @@ -283,7 +283,7 @@ Evaluation<ValueType, numVars> pow(const BaseType& base,

// derivatives use the chain rule
const ValueType& df_dx = lnBase*result.value();
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
result.setDerivative(curVarIdx, df_dx*exp.derivative(curVarIdx));
}

Expand All @@ -292,7 +292,7 @@ Evaluation<ValueType, numVars> pow(const BaseType& base,

// this is the most expensive power function. Computationally it is pretty expensive, so
// one of the above two variants above should be preferred if possible.
template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> pow(const Evaluation<ValueType, numVars>& base,
const Evaluation<ValueType, numVars>& exp)
{
Expand All @@ -314,7 +314,7 @@ Evaluation<ValueType, numVars> pow(const Evaluation<ValueType, numVars>& base,
const ValueType& f = base.value();
const ValueType& g = exp.value();
const ValueType& logF = ValueTypeToolbox::log(f);
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
const ValueType& fPrime = base.derivative(curVarIdx);
const ValueType& gPrime = exp.derivative(curVarIdx);
result.setDerivative(curVarIdx, (g*fPrime/f + logF*gPrime) * valuePow);
Expand All @@ -324,7 +324,7 @@ Evaluation<ValueType, numVars> pow(const Evaluation<ValueType, numVars>& base,
return result;
}

template <class ValueType, unsigned numVars>
template <class ValueType, int numVars>
Evaluation<ValueType, numVars> log(const Evaluation<ValueType, numVars>& x)
{
typedef MathToolbox<ValueType> ValueTypeToolbox;
Expand All @@ -335,7 +335,7 @@ Evaluation<ValueType, numVars> log(const Evaluation<ValueType, numVars>& x)

// derivatives use the chain rule
const ValueType& df_dx = 1/x.value();
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));

return result;
Expand All @@ -345,7 +345,7 @@ Evaluation<ValueType, numVars> log(const Evaluation<ValueType, numVars>& x)

// a kind of traits class for the automatic differentiation case. (The toolbox for the
// scalar case is provided by the MathToolbox.hpp header file.)
template <class ValueT, unsigned numVars>
template <class ValueT, int numVars>
struct MathToolbox<Opm::DenseAd::Evaluation<ValueT, numVars> >
{
private:
Expand All @@ -364,7 +364,7 @@ struct MathToolbox<Opm::DenseAd::Evaluation<ValueT, numVars> >
static Evaluation createConstant(ValueType value)
{ return Evaluation::createConstant(value); }

static Evaluation createVariable(ValueType value, unsigned varIdx)
static Evaluation createVariable(ValueType value, int varIdx)
{ return Evaluation::createVariable(value, varIdx); }

template <class LhsEval>
Expand Down Expand Up @@ -395,7 +395,7 @@ struct MathToolbox<Opm::DenseAd::Evaluation<ValueT, numVars> >
return false;

// make sure that the derivatives are identical
for (unsigned curVarIdx = 0; curVarIdx < numVars; ++curVarIdx)
for (int curVarIdx = 0; curVarIdx < numVars; ++curVarIdx)
if (!ValueTypeToolbox::isSame(a.derivative(curVarIdx), b.derivative(curVarIdx), tolerance))
return false;

Expand Down Expand Up @@ -460,7 +460,7 @@ struct MathToolbox<Opm::DenseAd::Evaluation<ValueT, numVars> >
if (!InnerToolbox::isfinite(arg.value()))
return false;

for (unsigned i = 0; i < numVars; ++i)
for (int i = 0; i < numVars; ++i)
if (!InnerToolbox::isfinite(arg.derivative(i)))
return false;

Expand All @@ -472,7 +472,7 @@ struct MathToolbox<Opm::DenseAd::Evaluation<ValueT, numVars> >
if (InnerToolbox::isnan(arg.value()))
return true;

for (unsigned i = 0; i < numVars; ++i)
for (int i = 0; i < numVars; ++i)
if (InnerToolbox::isnan(arg.derivative(i)))
return true;

Expand Down
Loading

0 comments on commit ec2c6cc

Please sign in to comment.