Merge pull request #219 from OPM/revert-213-PR/improved-performance
Revert "[WIP] Evaluation: specialize evaluations for used numbers in Blackoil setting"
This commit is contained in:
commit
a9280edb82
@ -1,734 +0,0 @@
|
||||
#! /usr/bin/python
|
||||
#
|
||||
# This script provides "hand loop-unrolled" specializations of the
|
||||
# Evaluation class of dense automatic differentiation so that the
|
||||
# compiler can more easily emit SIMD instructions. In an ideal world,
|
||||
# C++ compilers should be smart enough to do this themselfs, but
|
||||
# contemporary compilers don't seem to exhibit enough brains.
|
||||
#
|
||||
# Usage: In the opm-material top-level source directory, run
|
||||
# `./bin/genEvalSpecializations.py [MAX_DERIVATIVES]`. The script then
|
||||
# generates specializations for Evaluations with up to MAX_DERIVATIVES
|
||||
# derivatives. The default for MAX_DERIVATIVES is 12. To run this
|
||||
# script, you need a python 2 installation where the Jinja2 module is
|
||||
# available.
|
||||
#
|
||||
import os
|
||||
import sys
|
||||
import jinja2
|
||||
|
||||
maxDerivs = 12
|
||||
if len(sys.argv) == 2:
|
||||
maxDerivs = int(sys.argv[1])
|
||||
|
||||
fileNames = []
|
||||
|
||||
specializationTemplate = \
|
||||
"""// -*- 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
|
||||
*
|
||||
{% if numDerivs < 0 %}
|
||||
* \\brief Representation of an evaluation of a function and its derivatives w.r.t. a set
|
||||
* of variables in the localized OPM automatic differentiation (AD) framework.
|
||||
{% else %}
|
||||
* \\brief This file specializes the dense-AD Evaluation class for {{ numDerivs }} derivatives.
|
||||
{% endif %}
|
||||
*
|
||||
* \\attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "{{ scriptName }}"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
{% if numDerivs < 0 %}
|
||||
#ifndef OPM_DENSEAD_EVALUATION_HPP
|
||||
#define OPM_DENSEAD_EVALUATION_HPP
|
||||
{% else %}
|
||||
#ifndef OPM_DENSEAD_EVALUATION{{numDerivs}}_HPP
|
||||
#define OPM_DENSEAD_EVALUATION{{numDerivs}}_HPP
|
||||
{% endif %}
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
{% if numDerivs < 0 %}
|
||||
/*!
|
||||
* \\brief Represents a function evaluation and its derivatives w.r.t. a fixed set of
|
||||
* variables.
|
||||
*/
|
||||
template <class ValueT, int numDerivs>
|
||||
class Evaluation\
|
||||
{% else %}
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, {{ numDerivs }}>\
|
||||
{% endif %}
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives\
|
||||
{% if numDerivs < 0 %}
|
||||
static constexpr int size = numDerivs;
|
||||
{% else %}
|
||||
static constexpr int size = {{ numDerivs }};
|
||||
{% endif %}
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{% if numDerivs < 0 %}\
|
||||
: data_(other.data_)
|
||||
{ }
|
||||
{% else %}\
|
||||
{\
|
||||
{% for i in range(0, numDerivs+1) %}
|
||||
data_[{{i}}] = other.data_[{{i}}];{% endfor %}
|
||||
}
|
||||
{% endif %}\
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{\
|
||||
{% if numDerivs < 0 %}
|
||||
for (int i = dstart_; i < dend_; ++i) {
|
||||
data_[i] = 0.0;
|
||||
}
|
||||
{% else %}\
|
||||
{% for i in range(1, numDerivs+1) %}
|
||||
data_[{{i}}] = 0.0;{% endfor %}
|
||||
{% endif %}\
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{\
|
||||
{% if numDerivs < 0 %}
|
||||
for (int i = dstart_; i < dend_; ++i) {
|
||||
data_[i] = other.data_[i];
|
||||
}
|
||||
{% else %}\
|
||||
{% for i in range(1, numDerivs+1) %}
|
||||
data_[{{i}}] = other.data_[{{i}}];{% endfor %}
|
||||
{% endif %}\
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{\
|
||||
{% if numDerivs < 0 %}
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
data_[i] += other.data_[i];
|
||||
}
|
||||
{% else %}\
|
||||
{% for i in range(0, numDerivs+1) %}
|
||||
data_[{{i}}] += other.data_[{{i}}];{% endfor %}
|
||||
{% endif %}\
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{\
|
||||
{% if numDerivs < 0 %}
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
data_[i] -= other.data_[i];
|
||||
}
|
||||
{% else %}\
|
||||
{% for i in range(0, numDerivs+1) %}
|
||||
data_[{{i}}] -= other.data_[{{i}}];{% endfor %}
|
||||
{% endif %}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives\
|
||||
{% if numDerivs < 0 %}
|
||||
for (int i = dstart_; i < dend_; ++i) {
|
||||
data_[i] = data_[i] * v + other.data_[i] * u;
|
||||
}
|
||||
{% else %}\
|
||||
{% for i in range(1, numDerivs+1) %}
|
||||
data_[{{i}}] = data_[{{i}}] * v + other.data_[{{i}}] * u;{% endfor %}
|
||||
{% endif %}\
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{\
|
||||
{% if numDerivs < 0 %}
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
data_[i] *= other;
|
||||
}
|
||||
{% else %}\
|
||||
{% for i in range(0, numDerivs+1) %}
|
||||
data_[{{i}}] *= other;{% endfor %}
|
||||
{% endif %}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives\
|
||||
{% if numDerivs < 0 %}
|
||||
for (int i = dstart_; i < dend_; ++i) {
|
||||
data_[i] = data_[i] * v_vv - other.data_[i] * u_vv;
|
||||
}
|
||||
{% else %}\
|
||||
{% for i in range(1, numDerivs+1) %}
|
||||
data_[{{i}}] = data_[{{i}}] * v_vv - other.data_[{{i}}] * u_vv;{% endfor %}
|
||||
{% endif %}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
{% if numDerivs < 0 %}
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
data_[i] *= tmp;
|
||||
}
|
||||
{% else %}\
|
||||
{% for i in range(0, numDerivs+1) %}
|
||||
data_[{{i}}] *= tmp;{% endfor %}
|
||||
{% endif %}
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
{% if numDerivs < 0 %}
|
||||
for (int i = dstart_; i < dend_; ++i) {
|
||||
result.data_[i] = df_dg * b.data_[i];
|
||||
}
|
||||
{% else %}\
|
||||
{% for i in range(1, numDerivs+1) %}
|
||||
result.data_[{{i}}] = df_dg * b.data_[{{i}}];{% endfor %}
|
||||
{% endif %}
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative\
|
||||
{% if numDerivs < 0 %}
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
result.data_[i] = - data_[i];
|
||||
}
|
||||
{% else %}\
|
||||
{% for i in range(0, numDerivs+1) %}
|
||||
result.data_[{{i}}] = - data_[{{i}}];{% endfor %}
|
||||
{% endif %}
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{\
|
||||
{% if numDerivs < 0 %}
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
data_[i] = other.data_[i];
|
||||
}
|
||||
{% else %}\
|
||||
{% for i in range(0, numDerivs+1) %}
|
||||
data_[{{i}}] = other.data_[{{i}}];{% endfor %}
|
||||
{% endif %}
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
{# the generic operators are only required for the unspecialized case #}
|
||||
{% if numDerivs < 0 %}
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
bool operator<(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{ return b > a; }
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
bool operator>(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{ return b < a; }
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
bool operator<=(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{ return b >= a; }
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
bool operator>=(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{ return b <= a; }
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
bool operator!=(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{ return a != b.value(); }
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
Evaluation<ValueType, numVars> operator+(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{
|
||||
Evaluation<ValueType, numVars> result(b);
|
||||
result += a;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
Evaluation<ValueType, numVars> operator-(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{
|
||||
Evaluation<ValueType, numVars> result(a);
|
||||
result -= b;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
Evaluation<ValueType, numVars> operator/(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{
|
||||
return Evaluation<ValueType, numVars>::divide(a, b);
|
||||
}
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
Evaluation<ValueType, numVars> operator*(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{
|
||||
Evaluation<ValueType, numVars> result(b);
|
||||
result *= a;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
std::ostream& operator<<(std::ostream& os, const Evaluation<ValueType, numVars>& eval)
|
||||
{
|
||||
os << eval.value();
|
||||
return os;
|
||||
}
|
||||
{% endif %}
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
{% if numDerivs < 0 %}
|
||||
// In Dune 2.3, the Evaluation.hpp header must be included before the fmatrix.hh
|
||||
// header. Dune 2.4+ does not suffer from this because of some c++-foo.
|
||||
//
|
||||
// for those who are wondering: in C++ function templates cannot be partially
|
||||
// specialized, and function argument overloads must be known _before_ they are used. The
|
||||
// latter is what we do for the 'Dune::fvmeta::absreal()' function.
|
||||
//
|
||||
// consider the following test program:
|
||||
//
|
||||
// double foo(double i)
|
||||
// { return i; }
|
||||
//
|
||||
// void bar()
|
||||
// { std::cout << foo(0) << "\\n"; }
|
||||
//
|
||||
// int foo(int i)
|
||||
// { return i + 1; }
|
||||
//
|
||||
// void foobar()
|
||||
// { std::cout << foo(0) << "\\n"; }
|
||||
//
|
||||
// this will print '0' for bar() and '1' for foobar()...
|
||||
#if !(DUNE_VERSION_NEWER(DUNE_COMMON, 2,4))
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
template <class ValueType, int numVars>
|
||||
Evaluation<ValueType, numVars> abs(const Evaluation<ValueType, numVars>&);
|
||||
}}
|
||||
|
||||
namespace std {
|
||||
template <class ValueType, int numVars>
|
||||
const Opm::DenseAd::Evaluation<ValueType, numVars> abs(const Opm::DenseAd::Evaluation<ValueType, numVars>& x)
|
||||
{ return Opm::DenseAd::abs(x); }
|
||||
|
||||
} // namespace std
|
||||
|
||||
#if defined DUNE_DENSEMATRIX_HH
|
||||
#warning \\
|
||||
"Due to some C++ peculiarity regarding function overloads, the 'Evaluation.hpp'" \\
|
||||
"header file must be included before Dune's 'densematrix.hh' for Dune < 2.4. " \\
|
||||
"(If Evaluations are to be used in conjunction with a dense matrix.)"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
// this makes the Dune matrix/vector classes happy...
|
||||
#include <dune/common/ftraits.hh>
|
||||
|
||||
namespace Dune {
|
||||
template <class ValueType, int numVars>
|
||||
struct FieldTraits<Opm::DenseAd::Evaluation<ValueType, numVars> >
|
||||
{
|
||||
public:
|
||||
typedef Opm::DenseAd::Evaluation<ValueType, numVars> field_type;
|
||||
// setting real_type to field_type here potentially leads to slightly worse
|
||||
// performance, but at least it makes things compile.
|
||||
typedef field_type real_type;
|
||||
};
|
||||
|
||||
} // namespace Dune
|
||||
|
||||
#include "EvaluationSpecializations.hpp"
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION_HPP
|
||||
{% else %}
|
||||
#endif // OPM_DENSEAD_EVALUATION{{numDerivs}}_HPP
|
||||
{% endif %}
|
||||
"""
|
||||
|
||||
includeSpecializationsTemplate = \
|
||||
"""// -*- 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 "{{ scriptName }}"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
#ifndef OPM_DENSEAD_EVALUATION_SPECIALIZATIONS_HPP
|
||||
#define OPM_DENSEAD_EVALUATION_SPECIALIZATIONS_HPP
|
||||
|
||||
{% for fileName in fileNames %}#include <{{ fileName }}>
|
||||
{% endfor %}
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION_SPECIALIZATIONS_HPP
|
||||
"""
|
||||
|
||||
print ("Generating generic template class")
|
||||
fileName = "opm/material/densead/Evaluation.hpp"
|
||||
template = jinja2.Template(specializationTemplate)
|
||||
fileContents = template.render(numDerivs=-1, scriptName=os.path.basename(sys.argv[0]))
|
||||
|
||||
f = open(fileName, "w")
|
||||
f.write(fileContents)
|
||||
f.close()
|
||||
|
||||
for numDerivs in range(1, maxDerivs + 1):
|
||||
print ("Generating specialization for %d derivatives"%numDerivs)
|
||||
|
||||
fileName = "opm/material/densead/Evaluation%d.hpp"%numDerivs
|
||||
fileNames.append(fileName)
|
||||
|
||||
template = jinja2.Template(specializationTemplate)
|
||||
fileContents = template.render(numDerivs=numDerivs, scriptName=os.path.basename(sys.argv[0]))
|
||||
|
||||
f = open(fileName, "w")
|
||||
f.write(fileContents)
|
||||
f.close()
|
||||
|
||||
template = jinja2.Template(includeSpecializationsTemplate)
|
||||
fileContents = template.render(fileNames=fileNames, scriptName=os.path.basename(sys.argv[0]))
|
||||
|
||||
f = open("opm/material/densead/EvaluationSpecializations.hpp", "w")
|
||||
f.write(fileContents)
|
||||
f.close()
|
@ -23,18 +23,11 @@
|
||||
/*!
|
||||
* \file
|
||||
*
|
||||
|
||||
* \brief Representation of an evaluation of a function and its derivatives w.r.t. a set
|
||||
* of variables in the localized OPM automatic differentiation (AD) framework.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION_HPP
|
||||
#define OPM_DENSEAD_EVALUATION_HPP
|
||||
|
||||
#ifndef OPM_LOCAL_AD_EVALUATION_HPP
|
||||
#define OPM_LOCAL_AD_EVALUATION_HPP
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
@ -45,48 +38,45 @@
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Represents a function evaluation and its derivatives w.r.t. a fixed set of
|
||||
* variables.
|
||||
*/
|
||||
template <class ValueT, int numDerivs>
|
||||
template <class ValueT, unsigned numVars>
|
||||
class Evaluation
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = numDerivs;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr unsigned size = numVars;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
static constexpr unsigned length_ = numVars + 1 ;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
static constexpr unsigned valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
static constexpr unsigned dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
static constexpr unsigned dend_ = length_ ;
|
||||
public:
|
||||
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
: data_(other.data_)
|
||||
{ }
|
||||
Evaluation(const Evaluation& other) : data_( other.data_ )
|
||||
{
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
@ -105,12 +95,12 @@ public:
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
Evaluation(const RhsValueType& c, unsigned varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
assert(0 <= varPos && varPos < numVars);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
@ -118,15 +108,14 @@ public:
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
for (int i = dstart_; i < dend_; ++i) {
|
||||
data_[i] = 0.0;
|
||||
}
|
||||
{
|
||||
for (unsigned i = dstart_; i < dend_; ++i)
|
||||
data_[ i ] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
static Evaluation createVariable(const RhsValueType& value, unsigned varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
@ -147,27 +136,25 @@ public:
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
for (unsigned varIdx = 0; varIdx < numVars; ++varIdx)
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
for (int i = dstart_; i < dend_; ++i) {
|
||||
data_[i] = other.data_[i];
|
||||
}
|
||||
}
|
||||
{
|
||||
for (unsigned varIdx = dstart_; varIdx < dend_; ++varIdx)
|
||||
data_[ varIdx ] = other.data_[ varIdx ];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
data_[i] += other.data_[i];
|
||||
}
|
||||
|
||||
{
|
||||
// value and derivatives are added
|
||||
for (unsigned varIdx = 0; varIdx < length_; ++ varIdx)
|
||||
data_[ varIdx ] += other.data_[ varIdx ];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
@ -182,11 +169,11 @@ public:
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
data_[i] -= other.data_[i];
|
||||
}
|
||||
|
||||
{
|
||||
// value and derivatives are subtracted
|
||||
for (unsigned idx = 0 ; idx < length_ ; ++ idx)
|
||||
data_[idx] -= other.data_[idx];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
@ -205,76 +192,58 @@ public:
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
ValueType& u = data_[ valuepos_ ];
|
||||
const ValueType& v = other.value();
|
||||
for (unsigned idx = dstart_; idx < dend_; ++idx) {
|
||||
const ValueType& uPrime = data_[idx];
|
||||
const ValueType& vPrime = other.data_[idx];
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
for (int i = dstart_; i < dend_; ++i) {
|
||||
data_[i] = data_[i] * v + other.data_[i] * u;
|
||||
data_[idx] = (v*uPrime + u*vPrime);
|
||||
}
|
||||
u *= v;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
data_[i] *= other;
|
||||
}
|
||||
|
||||
Evaluation& operator*=(RhsValueType other)
|
||||
{
|
||||
// values and derivatives are multiplied
|
||||
for (unsigned idx = 0 ; idx < length_ ; ++ idx)
|
||||
data_[idx] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u -
|
||||
// u'v)/v^2.
|
||||
ValueType& u = data_[ valuepos_ ];
|
||||
const ValueType& v = other.value();
|
||||
for (unsigned idx = dstart_; idx < dend_; ++idx) {
|
||||
const ValueType& uPrime = data_[idx];
|
||||
const ValueType& vPrime = other.data_[idx];
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
for (int i = dstart_; i < dend_; ++i) {
|
||||
data_[i] = data_[i] * v_vv - other.data_[i] * u_vv;
|
||||
data_[idx] = (v*uPrime - u*vPrime)/(v*v);
|
||||
}
|
||||
|
||||
u /= v;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
// multiply value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
data_[i] *= tmp;
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
// values and derivatives are divided
|
||||
ValueType factor = (1.0/other);
|
||||
for (unsigned idx = 0; idx < length_; ++idx)
|
||||
data_[idx] *= factor;
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
for (int i = dstart_; i < dend_; ++i) {
|
||||
result.data_[i] = df_dg * b.data_[i];
|
||||
}
|
||||
|
||||
return result;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
@ -298,7 +267,8 @@ public:
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
result -= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
@ -306,18 +276,18 @@ public:
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
result -= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
result.data_[i] = - data_[i];
|
||||
}
|
||||
|
||||
// set value and derivatives to negative
|
||||
for (unsigned idx = 0; idx < length_; ++idx)
|
||||
result.data_[idx] = - data_[idx];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -361,11 +331,8 @@ public:
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
for (int i = 0; i < length_; ++i) {
|
||||
data_[i] = other.data_[i];
|
||||
}
|
||||
|
||||
{
|
||||
data_ = other.data_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
@ -375,11 +342,10 @@ public:
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
for (unsigned idx = 0; idx < length_; ++idx)
|
||||
if (data_[idx] != other.data_[idx])
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -419,89 +385,105 @@ public:
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
void setValue(const ValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
const ValueType& derivative(unsigned varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
assert(varIdx < numVars);
|
||||
return data_[varIdx + dstart_];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
void setDerivative(unsigned varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
assert(varIdx < numVars);
|
||||
data_[varIdx + dstart_] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
protected:
|
||||
std::array<ValueType, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
template <class RhsValueType, class ValueType, unsigned numVars>
|
||||
bool operator<(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{ return b > a; }
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
template <class RhsValueType, class ValueType, unsigned numVars>
|
||||
bool operator>(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{ return b < a; }
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
template <class RhsValueType, class ValueType, unsigned numVars>
|
||||
bool operator<=(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{ return b >= a; }
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
template <class RhsValueType, class ValueType, unsigned numVars>
|
||||
bool operator>=(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{ return b <= a; }
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
template <class RhsValueType, class ValueType, unsigned numVars>
|
||||
bool operator!=(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{ return a != b.value(); }
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
template <class RhsValueType, class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> operator+(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{
|
||||
Evaluation<ValueType, numVars> result(b);
|
||||
|
||||
result += a;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
template <class RhsValueType, class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> operator-(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{
|
||||
Evaluation<ValueType, numVars> result(a);
|
||||
result -= b;
|
||||
Evaluation<ValueType, numVars> result;
|
||||
|
||||
result.setValue(a - b.value());
|
||||
for (unsigned varIdx = 0; varIdx < numVars; ++varIdx)
|
||||
result.setDerivative(varIdx, - b.derivative(varIdx));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
template <class RhsValueType, class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> operator/(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{
|
||||
return Evaluation<ValueType, numVars>::divide(a, b);
|
||||
}
|
||||
Evaluation<ValueType, numVars> result;
|
||||
|
||||
result.setValue(a/b.value());
|
||||
|
||||
// outer derivative
|
||||
const ValueType& df_dg = - a/(b.value()*b.value());
|
||||
for (unsigned varIdx = 0; varIdx < numVars; ++varIdx)
|
||||
result.setDerivative(varIdx, df_dg*b.derivative(varIdx));
|
||||
|
||||
template <class RhsValueType, class ValueType, int numVars>
|
||||
Evaluation<ValueType, numVars> operator*(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{
|
||||
Evaluation<ValueType, numVars> result(b);
|
||||
result *= a;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class RhsValueType, class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> operator*(const RhsValueType& a, const Evaluation<ValueType, numVars>& b)
|
||||
{
|
||||
Evaluation<ValueType, numVars> result;
|
||||
|
||||
result.setValue(a*b.value());
|
||||
for (unsigned varIdx = 0; varIdx < numVars; ++varIdx)
|
||||
result.setDerivative(varIdx, a*b.derivative(varIdx));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, unsigned numVars>
|
||||
std::ostream& operator<<(std::ostream& os, const Evaluation<ValueType, numVars>& eval)
|
||||
{
|
||||
os << eval.value();
|
||||
return os;
|
||||
}
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
} // namespace DenseAd
|
||||
} // namespace Opm
|
||||
|
||||
// In Dune 2.3, the Evaluation.hpp header must be included before the fmatrix.hh
|
||||
// header. Dune 2.4+ does not suffer from this because of some c++-foo.
|
||||
@ -529,12 +511,12 @@ std::ostream& operator<<(std::ostream& os, const Evaluation<ValueType, numVars>&
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> abs(const Evaluation<ValueType, numVars>&);
|
||||
}}
|
||||
|
||||
namespace std {
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
const Opm::DenseAd::Evaluation<ValueType, numVars> abs(const Opm::DenseAd::Evaluation<ValueType, numVars>& x)
|
||||
{ return Opm::DenseAd::abs(x); }
|
||||
|
||||
@ -553,7 +535,7 @@ const Opm::DenseAd::Evaluation<ValueType, numVars> abs(const Opm::DenseAd::Evalu
|
||||
#include <dune/common/ftraits.hh>
|
||||
|
||||
namespace Dune {
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
struct FieldTraits<Opm::DenseAd::Evaluation<ValueType, numVars> >
|
||||
{
|
||||
public:
|
||||
@ -565,6 +547,4 @@ public:
|
||||
|
||||
} // namespace Dune
|
||||
|
||||
#include "EvaluationSpecializations.hpp"
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION_HPP
|
||||
#endif
|
||||
|
@ -1,430 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 1 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION1_HPP
|
||||
#define OPM_DENSEAD_EVALUATION1_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 1>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 1;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION1_HPP
|
@ -1,538 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 10 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION10_HPP
|
||||
#define OPM_DENSEAD_EVALUATION10_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 10>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 10;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
data_[10] = other.data_[10];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
data_[2] = 0.0;
|
||||
data_[3] = 0.0;
|
||||
data_[4] = 0.0;
|
||||
data_[5] = 0.0;
|
||||
data_[6] = 0.0;
|
||||
data_[7] = 0.0;
|
||||
data_[8] = 0.0;
|
||||
data_[9] = 0.0;
|
||||
data_[10] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
data_[10] = other.data_[10];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
data_[2] += other.data_[2];
|
||||
data_[3] += other.data_[3];
|
||||
data_[4] += other.data_[4];
|
||||
data_[5] += other.data_[5];
|
||||
data_[6] += other.data_[6];
|
||||
data_[7] += other.data_[7];
|
||||
data_[8] += other.data_[8];
|
||||
data_[9] += other.data_[9];
|
||||
data_[10] += other.data_[10];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
data_[2] -= other.data_[2];
|
||||
data_[3] -= other.data_[3];
|
||||
data_[4] -= other.data_[4];
|
||||
data_[5] -= other.data_[5];
|
||||
data_[6] -= other.data_[6];
|
||||
data_[7] -= other.data_[7];
|
||||
data_[8] -= other.data_[8];
|
||||
data_[9] -= other.data_[9];
|
||||
data_[10] -= other.data_[10];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
data_[2] = data_[2] * v + other.data_[2] * u;
|
||||
data_[3] = data_[3] * v + other.data_[3] * u;
|
||||
data_[4] = data_[4] * v + other.data_[4] * u;
|
||||
data_[5] = data_[5] * v + other.data_[5] * u;
|
||||
data_[6] = data_[6] * v + other.data_[6] * u;
|
||||
data_[7] = data_[7] * v + other.data_[7] * u;
|
||||
data_[8] = data_[8] * v + other.data_[8] * u;
|
||||
data_[9] = data_[9] * v + other.data_[9] * u;
|
||||
data_[10] = data_[10] * v + other.data_[10] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
data_[2] *= other;
|
||||
data_[3] *= other;
|
||||
data_[4] *= other;
|
||||
data_[5] *= other;
|
||||
data_[6] *= other;
|
||||
data_[7] *= other;
|
||||
data_[8] *= other;
|
||||
data_[9] *= other;
|
||||
data_[10] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
data_[2] = data_[2] * v_vv - other.data_[2] * u_vv;
|
||||
data_[3] = data_[3] * v_vv - other.data_[3] * u_vv;
|
||||
data_[4] = data_[4] * v_vv - other.data_[4] * u_vv;
|
||||
data_[5] = data_[5] * v_vv - other.data_[5] * u_vv;
|
||||
data_[6] = data_[6] * v_vv - other.data_[6] * u_vv;
|
||||
data_[7] = data_[7] * v_vv - other.data_[7] * u_vv;
|
||||
data_[8] = data_[8] * v_vv - other.data_[8] * u_vv;
|
||||
data_[9] = data_[9] * v_vv - other.data_[9] * u_vv;
|
||||
data_[10] = data_[10] * v_vv - other.data_[10] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
data_[2] *= tmp;
|
||||
data_[3] *= tmp;
|
||||
data_[4] *= tmp;
|
||||
data_[5] *= tmp;
|
||||
data_[6] *= tmp;
|
||||
data_[7] *= tmp;
|
||||
data_[8] *= tmp;
|
||||
data_[9] *= tmp;
|
||||
data_[10] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
result.data_[2] = df_dg * b.data_[2];
|
||||
result.data_[3] = df_dg * b.data_[3];
|
||||
result.data_[4] = df_dg * b.data_[4];
|
||||
result.data_[5] = df_dg * b.data_[5];
|
||||
result.data_[6] = df_dg * b.data_[6];
|
||||
result.data_[7] = df_dg * b.data_[7];
|
||||
result.data_[8] = df_dg * b.data_[8];
|
||||
result.data_[9] = df_dg * b.data_[9];
|
||||
result.data_[10] = df_dg * b.data_[10];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
result.data_[2] = - data_[2];
|
||||
result.data_[3] = - data_[3];
|
||||
result.data_[4] = - data_[4];
|
||||
result.data_[5] = - data_[5];
|
||||
result.data_[6] = - data_[6];
|
||||
result.data_[7] = - data_[7];
|
||||
result.data_[8] = - data_[8];
|
||||
result.data_[9] = - data_[9];
|
||||
result.data_[10] = - data_[10];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
data_[10] = other.data_[10];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION10_HPP
|
@ -1,550 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 11 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION11_HPP
|
||||
#define OPM_DENSEAD_EVALUATION11_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 11>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 11;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
data_[10] = other.data_[10];
|
||||
data_[11] = other.data_[11];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
data_[2] = 0.0;
|
||||
data_[3] = 0.0;
|
||||
data_[4] = 0.0;
|
||||
data_[5] = 0.0;
|
||||
data_[6] = 0.0;
|
||||
data_[7] = 0.0;
|
||||
data_[8] = 0.0;
|
||||
data_[9] = 0.0;
|
||||
data_[10] = 0.0;
|
||||
data_[11] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
data_[10] = other.data_[10];
|
||||
data_[11] = other.data_[11];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
data_[2] += other.data_[2];
|
||||
data_[3] += other.data_[3];
|
||||
data_[4] += other.data_[4];
|
||||
data_[5] += other.data_[5];
|
||||
data_[6] += other.data_[6];
|
||||
data_[7] += other.data_[7];
|
||||
data_[8] += other.data_[8];
|
||||
data_[9] += other.data_[9];
|
||||
data_[10] += other.data_[10];
|
||||
data_[11] += other.data_[11];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
data_[2] -= other.data_[2];
|
||||
data_[3] -= other.data_[3];
|
||||
data_[4] -= other.data_[4];
|
||||
data_[5] -= other.data_[5];
|
||||
data_[6] -= other.data_[6];
|
||||
data_[7] -= other.data_[7];
|
||||
data_[8] -= other.data_[8];
|
||||
data_[9] -= other.data_[9];
|
||||
data_[10] -= other.data_[10];
|
||||
data_[11] -= other.data_[11];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
data_[2] = data_[2] * v + other.data_[2] * u;
|
||||
data_[3] = data_[3] * v + other.data_[3] * u;
|
||||
data_[4] = data_[4] * v + other.data_[4] * u;
|
||||
data_[5] = data_[5] * v + other.data_[5] * u;
|
||||
data_[6] = data_[6] * v + other.data_[6] * u;
|
||||
data_[7] = data_[7] * v + other.data_[7] * u;
|
||||
data_[8] = data_[8] * v + other.data_[8] * u;
|
||||
data_[9] = data_[9] * v + other.data_[9] * u;
|
||||
data_[10] = data_[10] * v + other.data_[10] * u;
|
||||
data_[11] = data_[11] * v + other.data_[11] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
data_[2] *= other;
|
||||
data_[3] *= other;
|
||||
data_[4] *= other;
|
||||
data_[5] *= other;
|
||||
data_[6] *= other;
|
||||
data_[7] *= other;
|
||||
data_[8] *= other;
|
||||
data_[9] *= other;
|
||||
data_[10] *= other;
|
||||
data_[11] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
data_[2] = data_[2] * v_vv - other.data_[2] * u_vv;
|
||||
data_[3] = data_[3] * v_vv - other.data_[3] * u_vv;
|
||||
data_[4] = data_[4] * v_vv - other.data_[4] * u_vv;
|
||||
data_[5] = data_[5] * v_vv - other.data_[5] * u_vv;
|
||||
data_[6] = data_[6] * v_vv - other.data_[6] * u_vv;
|
||||
data_[7] = data_[7] * v_vv - other.data_[7] * u_vv;
|
||||
data_[8] = data_[8] * v_vv - other.data_[8] * u_vv;
|
||||
data_[9] = data_[9] * v_vv - other.data_[9] * u_vv;
|
||||
data_[10] = data_[10] * v_vv - other.data_[10] * u_vv;
|
||||
data_[11] = data_[11] * v_vv - other.data_[11] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
data_[2] *= tmp;
|
||||
data_[3] *= tmp;
|
||||
data_[4] *= tmp;
|
||||
data_[5] *= tmp;
|
||||
data_[6] *= tmp;
|
||||
data_[7] *= tmp;
|
||||
data_[8] *= tmp;
|
||||
data_[9] *= tmp;
|
||||
data_[10] *= tmp;
|
||||
data_[11] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
result.data_[2] = df_dg * b.data_[2];
|
||||
result.data_[3] = df_dg * b.data_[3];
|
||||
result.data_[4] = df_dg * b.data_[4];
|
||||
result.data_[5] = df_dg * b.data_[5];
|
||||
result.data_[6] = df_dg * b.data_[6];
|
||||
result.data_[7] = df_dg * b.data_[7];
|
||||
result.data_[8] = df_dg * b.data_[8];
|
||||
result.data_[9] = df_dg * b.data_[9];
|
||||
result.data_[10] = df_dg * b.data_[10];
|
||||
result.data_[11] = df_dg * b.data_[11];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
result.data_[2] = - data_[2];
|
||||
result.data_[3] = - data_[3];
|
||||
result.data_[4] = - data_[4];
|
||||
result.data_[5] = - data_[5];
|
||||
result.data_[6] = - data_[6];
|
||||
result.data_[7] = - data_[7];
|
||||
result.data_[8] = - data_[8];
|
||||
result.data_[9] = - data_[9];
|
||||
result.data_[10] = - data_[10];
|
||||
result.data_[11] = - data_[11];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
data_[10] = other.data_[10];
|
||||
data_[11] = other.data_[11];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION11_HPP
|
@ -1,562 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 12 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION12_HPP
|
||||
#define OPM_DENSEAD_EVALUATION12_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 12>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 12;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
data_[10] = other.data_[10];
|
||||
data_[11] = other.data_[11];
|
||||
data_[12] = other.data_[12];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
data_[2] = 0.0;
|
||||
data_[3] = 0.0;
|
||||
data_[4] = 0.0;
|
||||
data_[5] = 0.0;
|
||||
data_[6] = 0.0;
|
||||
data_[7] = 0.0;
|
||||
data_[8] = 0.0;
|
||||
data_[9] = 0.0;
|
||||
data_[10] = 0.0;
|
||||
data_[11] = 0.0;
|
||||
data_[12] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
data_[10] = other.data_[10];
|
||||
data_[11] = other.data_[11];
|
||||
data_[12] = other.data_[12];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
data_[2] += other.data_[2];
|
||||
data_[3] += other.data_[3];
|
||||
data_[4] += other.data_[4];
|
||||
data_[5] += other.data_[5];
|
||||
data_[6] += other.data_[6];
|
||||
data_[7] += other.data_[7];
|
||||
data_[8] += other.data_[8];
|
||||
data_[9] += other.data_[9];
|
||||
data_[10] += other.data_[10];
|
||||
data_[11] += other.data_[11];
|
||||
data_[12] += other.data_[12];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
data_[2] -= other.data_[2];
|
||||
data_[3] -= other.data_[3];
|
||||
data_[4] -= other.data_[4];
|
||||
data_[5] -= other.data_[5];
|
||||
data_[6] -= other.data_[6];
|
||||
data_[7] -= other.data_[7];
|
||||
data_[8] -= other.data_[8];
|
||||
data_[9] -= other.data_[9];
|
||||
data_[10] -= other.data_[10];
|
||||
data_[11] -= other.data_[11];
|
||||
data_[12] -= other.data_[12];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
data_[2] = data_[2] * v + other.data_[2] * u;
|
||||
data_[3] = data_[3] * v + other.data_[3] * u;
|
||||
data_[4] = data_[4] * v + other.data_[4] * u;
|
||||
data_[5] = data_[5] * v + other.data_[5] * u;
|
||||
data_[6] = data_[6] * v + other.data_[6] * u;
|
||||
data_[7] = data_[7] * v + other.data_[7] * u;
|
||||
data_[8] = data_[8] * v + other.data_[8] * u;
|
||||
data_[9] = data_[9] * v + other.data_[9] * u;
|
||||
data_[10] = data_[10] * v + other.data_[10] * u;
|
||||
data_[11] = data_[11] * v + other.data_[11] * u;
|
||||
data_[12] = data_[12] * v + other.data_[12] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
data_[2] *= other;
|
||||
data_[3] *= other;
|
||||
data_[4] *= other;
|
||||
data_[5] *= other;
|
||||
data_[6] *= other;
|
||||
data_[7] *= other;
|
||||
data_[8] *= other;
|
||||
data_[9] *= other;
|
||||
data_[10] *= other;
|
||||
data_[11] *= other;
|
||||
data_[12] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
data_[2] = data_[2] * v_vv - other.data_[2] * u_vv;
|
||||
data_[3] = data_[3] * v_vv - other.data_[3] * u_vv;
|
||||
data_[4] = data_[4] * v_vv - other.data_[4] * u_vv;
|
||||
data_[5] = data_[5] * v_vv - other.data_[5] * u_vv;
|
||||
data_[6] = data_[6] * v_vv - other.data_[6] * u_vv;
|
||||
data_[7] = data_[7] * v_vv - other.data_[7] * u_vv;
|
||||
data_[8] = data_[8] * v_vv - other.data_[8] * u_vv;
|
||||
data_[9] = data_[9] * v_vv - other.data_[9] * u_vv;
|
||||
data_[10] = data_[10] * v_vv - other.data_[10] * u_vv;
|
||||
data_[11] = data_[11] * v_vv - other.data_[11] * u_vv;
|
||||
data_[12] = data_[12] * v_vv - other.data_[12] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
data_[2] *= tmp;
|
||||
data_[3] *= tmp;
|
||||
data_[4] *= tmp;
|
||||
data_[5] *= tmp;
|
||||
data_[6] *= tmp;
|
||||
data_[7] *= tmp;
|
||||
data_[8] *= tmp;
|
||||
data_[9] *= tmp;
|
||||
data_[10] *= tmp;
|
||||
data_[11] *= tmp;
|
||||
data_[12] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
result.data_[2] = df_dg * b.data_[2];
|
||||
result.data_[3] = df_dg * b.data_[3];
|
||||
result.data_[4] = df_dg * b.data_[4];
|
||||
result.data_[5] = df_dg * b.data_[5];
|
||||
result.data_[6] = df_dg * b.data_[6];
|
||||
result.data_[7] = df_dg * b.data_[7];
|
||||
result.data_[8] = df_dg * b.data_[8];
|
||||
result.data_[9] = df_dg * b.data_[9];
|
||||
result.data_[10] = df_dg * b.data_[10];
|
||||
result.data_[11] = df_dg * b.data_[11];
|
||||
result.data_[12] = df_dg * b.data_[12];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
result.data_[2] = - data_[2];
|
||||
result.data_[3] = - data_[3];
|
||||
result.data_[4] = - data_[4];
|
||||
result.data_[5] = - data_[5];
|
||||
result.data_[6] = - data_[6];
|
||||
result.data_[7] = - data_[7];
|
||||
result.data_[8] = - data_[8];
|
||||
result.data_[9] = - data_[9];
|
||||
result.data_[10] = - data_[10];
|
||||
result.data_[11] = - data_[11];
|
||||
result.data_[12] = - data_[12];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
data_[10] = other.data_[10];
|
||||
data_[11] = other.data_[11];
|
||||
data_[12] = other.data_[12];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION12_HPP
|
@ -1,442 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 2 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION2_HPP
|
||||
#define OPM_DENSEAD_EVALUATION2_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 2>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 2;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
data_[2] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
data_[2] += other.data_[2];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
data_[2] -= other.data_[2];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
data_[2] = data_[2] * v + other.data_[2] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
data_[2] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
data_[2] = data_[2] * v_vv - other.data_[2] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
data_[2] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
result.data_[2] = df_dg * b.data_[2];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
result.data_[2] = - data_[2];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION2_HPP
|
@ -1,454 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 3 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION3_HPP
|
||||
#define OPM_DENSEAD_EVALUATION3_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 3>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 3;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
data_[2] = 0.0;
|
||||
data_[3] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
data_[2] += other.data_[2];
|
||||
data_[3] += other.data_[3];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
data_[2] -= other.data_[2];
|
||||
data_[3] -= other.data_[3];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
data_[2] = data_[2] * v + other.data_[2] * u;
|
||||
data_[3] = data_[3] * v + other.data_[3] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
data_[2] *= other;
|
||||
data_[3] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
data_[2] = data_[2] * v_vv - other.data_[2] * u_vv;
|
||||
data_[3] = data_[3] * v_vv - other.data_[3] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
data_[2] *= tmp;
|
||||
data_[3] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
result.data_[2] = df_dg * b.data_[2];
|
||||
result.data_[3] = df_dg * b.data_[3];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
result.data_[2] = - data_[2];
|
||||
result.data_[3] = - data_[3];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION3_HPP
|
@ -1,466 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 4 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION4_HPP
|
||||
#define OPM_DENSEAD_EVALUATION4_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 4>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 4;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
data_[2] = 0.0;
|
||||
data_[3] = 0.0;
|
||||
data_[4] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
data_[2] += other.data_[2];
|
||||
data_[3] += other.data_[3];
|
||||
data_[4] += other.data_[4];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
data_[2] -= other.data_[2];
|
||||
data_[3] -= other.data_[3];
|
||||
data_[4] -= other.data_[4];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
data_[2] = data_[2] * v + other.data_[2] * u;
|
||||
data_[3] = data_[3] * v + other.data_[3] * u;
|
||||
data_[4] = data_[4] * v + other.data_[4] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
data_[2] *= other;
|
||||
data_[3] *= other;
|
||||
data_[4] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
data_[2] = data_[2] * v_vv - other.data_[2] * u_vv;
|
||||
data_[3] = data_[3] * v_vv - other.data_[3] * u_vv;
|
||||
data_[4] = data_[4] * v_vv - other.data_[4] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
data_[2] *= tmp;
|
||||
data_[3] *= tmp;
|
||||
data_[4] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
result.data_[2] = df_dg * b.data_[2];
|
||||
result.data_[3] = df_dg * b.data_[3];
|
||||
result.data_[4] = df_dg * b.data_[4];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
result.data_[2] = - data_[2];
|
||||
result.data_[3] = - data_[3];
|
||||
result.data_[4] = - data_[4];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION4_HPP
|
@ -1,478 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 5 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION5_HPP
|
||||
#define OPM_DENSEAD_EVALUATION5_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 5>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 5;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
data_[2] = 0.0;
|
||||
data_[3] = 0.0;
|
||||
data_[4] = 0.0;
|
||||
data_[5] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
data_[2] += other.data_[2];
|
||||
data_[3] += other.data_[3];
|
||||
data_[4] += other.data_[4];
|
||||
data_[5] += other.data_[5];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
data_[2] -= other.data_[2];
|
||||
data_[3] -= other.data_[3];
|
||||
data_[4] -= other.data_[4];
|
||||
data_[5] -= other.data_[5];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
data_[2] = data_[2] * v + other.data_[2] * u;
|
||||
data_[3] = data_[3] * v + other.data_[3] * u;
|
||||
data_[4] = data_[4] * v + other.data_[4] * u;
|
||||
data_[5] = data_[5] * v + other.data_[5] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
data_[2] *= other;
|
||||
data_[3] *= other;
|
||||
data_[4] *= other;
|
||||
data_[5] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
data_[2] = data_[2] * v_vv - other.data_[2] * u_vv;
|
||||
data_[3] = data_[3] * v_vv - other.data_[3] * u_vv;
|
||||
data_[4] = data_[4] * v_vv - other.data_[4] * u_vv;
|
||||
data_[5] = data_[5] * v_vv - other.data_[5] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
data_[2] *= tmp;
|
||||
data_[3] *= tmp;
|
||||
data_[4] *= tmp;
|
||||
data_[5] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
result.data_[2] = df_dg * b.data_[2];
|
||||
result.data_[3] = df_dg * b.data_[3];
|
||||
result.data_[4] = df_dg * b.data_[4];
|
||||
result.data_[5] = df_dg * b.data_[5];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
result.data_[2] = - data_[2];
|
||||
result.data_[3] = - data_[3];
|
||||
result.data_[4] = - data_[4];
|
||||
result.data_[5] = - data_[5];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION5_HPP
|
@ -1,490 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 6 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION6_HPP
|
||||
#define OPM_DENSEAD_EVALUATION6_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 6>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 6;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
data_[2] = 0.0;
|
||||
data_[3] = 0.0;
|
||||
data_[4] = 0.0;
|
||||
data_[5] = 0.0;
|
||||
data_[6] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
data_[2] += other.data_[2];
|
||||
data_[3] += other.data_[3];
|
||||
data_[4] += other.data_[4];
|
||||
data_[5] += other.data_[5];
|
||||
data_[6] += other.data_[6];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
data_[2] -= other.data_[2];
|
||||
data_[3] -= other.data_[3];
|
||||
data_[4] -= other.data_[4];
|
||||
data_[5] -= other.data_[5];
|
||||
data_[6] -= other.data_[6];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
data_[2] = data_[2] * v + other.data_[2] * u;
|
||||
data_[3] = data_[3] * v + other.data_[3] * u;
|
||||
data_[4] = data_[4] * v + other.data_[4] * u;
|
||||
data_[5] = data_[5] * v + other.data_[5] * u;
|
||||
data_[6] = data_[6] * v + other.data_[6] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
data_[2] *= other;
|
||||
data_[3] *= other;
|
||||
data_[4] *= other;
|
||||
data_[5] *= other;
|
||||
data_[6] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
data_[2] = data_[2] * v_vv - other.data_[2] * u_vv;
|
||||
data_[3] = data_[3] * v_vv - other.data_[3] * u_vv;
|
||||
data_[4] = data_[4] * v_vv - other.data_[4] * u_vv;
|
||||
data_[5] = data_[5] * v_vv - other.data_[5] * u_vv;
|
||||
data_[6] = data_[6] * v_vv - other.data_[6] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
data_[2] *= tmp;
|
||||
data_[3] *= tmp;
|
||||
data_[4] *= tmp;
|
||||
data_[5] *= tmp;
|
||||
data_[6] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
result.data_[2] = df_dg * b.data_[2];
|
||||
result.data_[3] = df_dg * b.data_[3];
|
||||
result.data_[4] = df_dg * b.data_[4];
|
||||
result.data_[5] = df_dg * b.data_[5];
|
||||
result.data_[6] = df_dg * b.data_[6];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
result.data_[2] = - data_[2];
|
||||
result.data_[3] = - data_[3];
|
||||
result.data_[4] = - data_[4];
|
||||
result.data_[5] = - data_[5];
|
||||
result.data_[6] = - data_[6];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION6_HPP
|
@ -1,502 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 7 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION7_HPP
|
||||
#define OPM_DENSEAD_EVALUATION7_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 7>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 7;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
data_[2] = 0.0;
|
||||
data_[3] = 0.0;
|
||||
data_[4] = 0.0;
|
||||
data_[5] = 0.0;
|
||||
data_[6] = 0.0;
|
||||
data_[7] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
data_[2] += other.data_[2];
|
||||
data_[3] += other.data_[3];
|
||||
data_[4] += other.data_[4];
|
||||
data_[5] += other.data_[5];
|
||||
data_[6] += other.data_[6];
|
||||
data_[7] += other.data_[7];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
data_[2] -= other.data_[2];
|
||||
data_[3] -= other.data_[3];
|
||||
data_[4] -= other.data_[4];
|
||||
data_[5] -= other.data_[5];
|
||||
data_[6] -= other.data_[6];
|
||||
data_[7] -= other.data_[7];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
data_[2] = data_[2] * v + other.data_[2] * u;
|
||||
data_[3] = data_[3] * v + other.data_[3] * u;
|
||||
data_[4] = data_[4] * v + other.data_[4] * u;
|
||||
data_[5] = data_[5] * v + other.data_[5] * u;
|
||||
data_[6] = data_[6] * v + other.data_[6] * u;
|
||||
data_[7] = data_[7] * v + other.data_[7] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
data_[2] *= other;
|
||||
data_[3] *= other;
|
||||
data_[4] *= other;
|
||||
data_[5] *= other;
|
||||
data_[6] *= other;
|
||||
data_[7] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
data_[2] = data_[2] * v_vv - other.data_[2] * u_vv;
|
||||
data_[3] = data_[3] * v_vv - other.data_[3] * u_vv;
|
||||
data_[4] = data_[4] * v_vv - other.data_[4] * u_vv;
|
||||
data_[5] = data_[5] * v_vv - other.data_[5] * u_vv;
|
||||
data_[6] = data_[6] * v_vv - other.data_[6] * u_vv;
|
||||
data_[7] = data_[7] * v_vv - other.data_[7] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
data_[2] *= tmp;
|
||||
data_[3] *= tmp;
|
||||
data_[4] *= tmp;
|
||||
data_[5] *= tmp;
|
||||
data_[6] *= tmp;
|
||||
data_[7] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
result.data_[2] = df_dg * b.data_[2];
|
||||
result.data_[3] = df_dg * b.data_[3];
|
||||
result.data_[4] = df_dg * b.data_[4];
|
||||
result.data_[5] = df_dg * b.data_[5];
|
||||
result.data_[6] = df_dg * b.data_[6];
|
||||
result.data_[7] = df_dg * b.data_[7];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
result.data_[2] = - data_[2];
|
||||
result.data_[3] = - data_[3];
|
||||
result.data_[4] = - data_[4];
|
||||
result.data_[5] = - data_[5];
|
||||
result.data_[6] = - data_[6];
|
||||
result.data_[7] = - data_[7];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION7_HPP
|
@ -1,514 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 8 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION8_HPP
|
||||
#define OPM_DENSEAD_EVALUATION8_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 8>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 8;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
data_[2] = 0.0;
|
||||
data_[3] = 0.0;
|
||||
data_[4] = 0.0;
|
||||
data_[5] = 0.0;
|
||||
data_[6] = 0.0;
|
||||
data_[7] = 0.0;
|
||||
data_[8] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
data_[2] += other.data_[2];
|
||||
data_[3] += other.data_[3];
|
||||
data_[4] += other.data_[4];
|
||||
data_[5] += other.data_[5];
|
||||
data_[6] += other.data_[6];
|
||||
data_[7] += other.data_[7];
|
||||
data_[8] += other.data_[8];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
data_[2] -= other.data_[2];
|
||||
data_[3] -= other.data_[3];
|
||||
data_[4] -= other.data_[4];
|
||||
data_[5] -= other.data_[5];
|
||||
data_[6] -= other.data_[6];
|
||||
data_[7] -= other.data_[7];
|
||||
data_[8] -= other.data_[8];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
data_[2] = data_[2] * v + other.data_[2] * u;
|
||||
data_[3] = data_[3] * v + other.data_[3] * u;
|
||||
data_[4] = data_[4] * v + other.data_[4] * u;
|
||||
data_[5] = data_[5] * v + other.data_[5] * u;
|
||||
data_[6] = data_[6] * v + other.data_[6] * u;
|
||||
data_[7] = data_[7] * v + other.data_[7] * u;
|
||||
data_[8] = data_[8] * v + other.data_[8] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
data_[2] *= other;
|
||||
data_[3] *= other;
|
||||
data_[4] *= other;
|
||||
data_[5] *= other;
|
||||
data_[6] *= other;
|
||||
data_[7] *= other;
|
||||
data_[8] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
data_[2] = data_[2] * v_vv - other.data_[2] * u_vv;
|
||||
data_[3] = data_[3] * v_vv - other.data_[3] * u_vv;
|
||||
data_[4] = data_[4] * v_vv - other.data_[4] * u_vv;
|
||||
data_[5] = data_[5] * v_vv - other.data_[5] * u_vv;
|
||||
data_[6] = data_[6] * v_vv - other.data_[6] * u_vv;
|
||||
data_[7] = data_[7] * v_vv - other.data_[7] * u_vv;
|
||||
data_[8] = data_[8] * v_vv - other.data_[8] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
data_[2] *= tmp;
|
||||
data_[3] *= tmp;
|
||||
data_[4] *= tmp;
|
||||
data_[5] *= tmp;
|
||||
data_[6] *= tmp;
|
||||
data_[7] *= tmp;
|
||||
data_[8] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
result.data_[2] = df_dg * b.data_[2];
|
||||
result.data_[3] = df_dg * b.data_[3];
|
||||
result.data_[4] = df_dg * b.data_[4];
|
||||
result.data_[5] = df_dg * b.data_[5];
|
||||
result.data_[6] = df_dg * b.data_[6];
|
||||
result.data_[7] = df_dg * b.data_[7];
|
||||
result.data_[8] = df_dg * b.data_[8];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
result.data_[2] = - data_[2];
|
||||
result.data_[3] = - data_[3];
|
||||
result.data_[4] = - data_[4];
|
||||
result.data_[5] = - data_[5];
|
||||
result.data_[6] = - data_[6];
|
||||
result.data_[7] = - data_[7];
|
||||
result.data_[8] = - data_[8];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION8_HPP
|
@ -1,526 +0,0 @@
|
||||
// -*- 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 specializes the dense-AD Evaluation class for 9 derivatives.
|
||||
|
||||
*
|
||||
* \attention THIS FILE GETS AUTOMATICALLY GENERATED BY THE "genEvalSpecializations.py"
|
||||
* SCRIPT. DO NOT EDIT IT MANUALLY!
|
||||
*/
|
||||
|
||||
#ifndef OPM_DENSEAD_EVALUATION9_HPP
|
||||
#define OPM_DENSEAD_EVALUATION9_HPP
|
||||
|
||||
|
||||
#include "Math.hpp"
|
||||
|
||||
#include <opm/common/Valgrind.hpp>
|
||||
|
||||
#include <dune/common/version.hh>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
|
||||
|
||||
template <class ValueT>
|
||||
class Evaluation<ValueT, 9>
|
||||
{
|
||||
public:
|
||||
//! field type
|
||||
typedef ValueT ValueType;
|
||||
|
||||
//! number of derivatives
|
||||
static constexpr int size = 9;
|
||||
|
||||
protected:
|
||||
//! length of internal data vector
|
||||
static constexpr int length_ = size + 1;
|
||||
|
||||
//! position index for value
|
||||
static constexpr int valuepos_ = 0;
|
||||
//! start index for derivatives
|
||||
static constexpr int dstart_ = 1;
|
||||
//! end+1 index for derivatives
|
||||
static constexpr int dend_ = length_;
|
||||
|
||||
public:
|
||||
//! default constructor
|
||||
Evaluation() : data_()
|
||||
{}
|
||||
|
||||
//! copy other function evaluation
|
||||
Evaluation(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
Valgrind::CheckDefined( data_ );
|
||||
}
|
||||
|
||||
// create an evaluation which represents a constant function
|
||||
//
|
||||
// i.e., f(x) = c. this implies an evaluation with the given value and all
|
||||
// derivatives being zero.
|
||||
template <class RhsValueType>
|
||||
Evaluation(const RhsValueType& c, int varPos)
|
||||
{
|
||||
setValue( c );
|
||||
clearDerivatives();
|
||||
// The variable position must be in represented by the given variable descriptor
|
||||
assert(0 <= varPos && varPos < size);
|
||||
|
||||
data_[varPos + dstart_] = 1.0;
|
||||
Valgrind::CheckDefined(data_);
|
||||
}
|
||||
|
||||
// set all derivatives to zero
|
||||
void clearDerivatives()
|
||||
{
|
||||
data_[1] = 0.0;
|
||||
data_[2] = 0.0;
|
||||
data_[3] = 0.0;
|
||||
data_[4] = 0.0;
|
||||
data_[5] = 0.0;
|
||||
data_[6] = 0.0;
|
||||
data_[7] = 0.0;
|
||||
data_[8] = 0.0;
|
||||
data_[9] = 0.0;
|
||||
}
|
||||
|
||||
// create a function evaluation for a "naked" depending variable (i.e., f(x) = x)
|
||||
template <class RhsValueType>
|
||||
static Evaluation createVariable(const RhsValueType& value, int varPos)
|
||||
{
|
||||
// copy function value and set all derivatives to 0, except for the variable
|
||||
// which is represented by the value (which is set to 1.0)
|
||||
return Evaluation( value, varPos );
|
||||
}
|
||||
|
||||
// "evaluate" a constant function (i.e. a function that does not depend on the set of
|
||||
// relevant variables, f(x) = c).
|
||||
template <class RhsValueType>
|
||||
static Evaluation createConstant(const RhsValueType& value)
|
||||
{
|
||||
return Evaluation( value );
|
||||
}
|
||||
|
||||
// print the value and the derivatives of the function evaluation
|
||||
void print(std::ostream& os = std::cout) const
|
||||
{
|
||||
// print value
|
||||
os << "v: " << value() << " / d:";
|
||||
// print derivatives
|
||||
for (int varIdx = 0; varIdx < size; ++varIdx) {
|
||||
os << " " << derivative(varIdx);
|
||||
}
|
||||
}
|
||||
|
||||
// copy all derivatives from other
|
||||
void copyDerivatives(const Evaluation& other)
|
||||
{
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
}
|
||||
|
||||
|
||||
// add value and derivatives from other to this values and derivatives
|
||||
Evaluation& operator+=(const Evaluation& other)
|
||||
{
|
||||
data_[0] += other.data_[0];
|
||||
data_[1] += other.data_[1];
|
||||
data_[2] += other.data_[2];
|
||||
data_[3] += other.data_[3];
|
||||
data_[4] += other.data_[4];
|
||||
data_[5] += other.data_[5];
|
||||
data_[6] += other.data_[6];
|
||||
data_[7] += other.data_[7];
|
||||
data_[8] += other.data_[8];
|
||||
data_[9] += other.data_[9];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// add value from other to this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator+=(const RhsValueType& other)
|
||||
{
|
||||
// value is added, derivatives stay the same
|
||||
data_[valuepos_] += other;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value and derivatives from this values
|
||||
Evaluation& operator-=(const Evaluation& other)
|
||||
{
|
||||
data_[0] -= other.data_[0];
|
||||
data_[1] -= other.data_[1];
|
||||
data_[2] -= other.data_[2];
|
||||
data_[3] -= other.data_[3];
|
||||
data_[4] -= other.data_[4];
|
||||
data_[5] -= other.data_[5];
|
||||
data_[6] -= other.data_[6];
|
||||
data_[7] -= other.data_[7];
|
||||
data_[8] -= other.data_[8];
|
||||
data_[9] -= other.data_[9];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// subtract other's value from this values
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator-=(const RhsValueType& other)
|
||||
{
|
||||
// for constants, values are subtracted, derivatives stay the same
|
||||
data_[ valuepos_ ] -= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// multiply values and apply chain rule to derivatives: (u*v)' = (v'u + u'v)
|
||||
Evaluation& operator*=(const Evaluation& other)
|
||||
{
|
||||
// while the values are multiplied, the derivatives follow the product rule,
|
||||
// i.e., (u*v)' = (v'u + u'v).
|
||||
const ValueType u = this->value();
|
||||
const ValueType v = other.value();
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v ;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v + other.data_[1] * u;
|
||||
data_[2] = data_[2] * v + other.data_[2] * u;
|
||||
data_[3] = data_[3] * v + other.data_[3] * u;
|
||||
data_[4] = data_[4] * v + other.data_[4] * u;
|
||||
data_[5] = data_[5] * v + other.data_[5] * u;
|
||||
data_[6] = data_[6] * v + other.data_[6] * u;
|
||||
data_[7] = data_[7] * v + other.data_[7] * u;
|
||||
data_[8] = data_[8] * v + other.data_[8] * u;
|
||||
data_[9] = data_[9] * v + other.data_[9] * u;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(c*u)' = c*u'
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator*=(const RhsValueType& other)
|
||||
{
|
||||
data_[0] *= other;
|
||||
data_[1] *= other;
|
||||
data_[2] *= other;
|
||||
data_[3] *= other;
|
||||
data_[4] *= other;
|
||||
data_[5] *= other;
|
||||
data_[6] *= other;
|
||||
data_[7] *= other;
|
||||
data_[8] *= other;
|
||||
data_[9] *= other;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// m(u*v)' = (v'u + u'v)
|
||||
Evaluation& operator/=(const Evaluation& other)
|
||||
{
|
||||
// values are divided, derivatives follow the rule for division, i.e., (u/v)' = (v'u - u'v)/v^2.
|
||||
const ValueType v_vv = 1.0 / other.value();
|
||||
const ValueType u_vv = value() * v_vv * v_vv;
|
||||
|
||||
// value
|
||||
data_[valuepos_] *= v_vv;
|
||||
|
||||
// derivatives
|
||||
data_[1] = data_[1] * v_vv - other.data_[1] * u_vv;
|
||||
data_[2] = data_[2] * v_vv - other.data_[2] * u_vv;
|
||||
data_[3] = data_[3] * v_vv - other.data_[3] * u_vv;
|
||||
data_[4] = data_[4] * v_vv - other.data_[4] * u_vv;
|
||||
data_[5] = data_[5] * v_vv - other.data_[5] * u_vv;
|
||||
data_[6] = data_[6] * v_vv - other.data_[6] * u_vv;
|
||||
data_[7] = data_[7] * v_vv - other.data_[7] * u_vv;
|
||||
data_[8] = data_[8] * v_vv - other.data_[8] * u_vv;
|
||||
data_[9] = data_[9] * v_vv - other.data_[9] * u_vv;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// divide value and derivatives by value of other
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator/=(const RhsValueType& other)
|
||||
{
|
||||
const ValueType tmp = 1.0/other;
|
||||
|
||||
data_[0] *= tmp;
|
||||
data_[1] *= tmp;
|
||||
data_[2] *= tmp;
|
||||
data_[3] *= tmp;
|
||||
data_[4] *= tmp;
|
||||
data_[5] *= tmp;
|
||||
data_[6] *= tmp;
|
||||
data_[7] *= tmp;
|
||||
data_[8] *= tmp;
|
||||
data_[9] *= tmp;
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// division of a constant by an Evaluation
|
||||
template <class RhsValueType>
|
||||
static inline Evaluation divide(const RhsValueType& a, const Evaluation& b)
|
||||
{
|
||||
Evaluation result;
|
||||
const ValueType tmp = 1.0/b.value();
|
||||
result.setValue( a*tmp );
|
||||
const ValueType df_dg = - result.value()*tmp;
|
||||
|
||||
result.data_[1] = df_dg * b.data_[1];
|
||||
result.data_[2] = df_dg * b.data_[2];
|
||||
result.data_[3] = df_dg * b.data_[3];
|
||||
result.data_[4] = df_dg * b.data_[4];
|
||||
result.data_[5] = df_dg * b.data_[5];
|
||||
result.data_[6] = df_dg * b.data_[6];
|
||||
result.data_[7] = df_dg * b.data_[7];
|
||||
result.data_[8] = df_dg * b.data_[8];
|
||||
result.data_[9] = df_dg * b.data_[9];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// add two evaluation objects
|
||||
Evaluation operator+(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// add constant to this object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator+(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result += other;
|
||||
return result;
|
||||
}
|
||||
|
||||
// subtract two evaluation objects
|
||||
Evaluation operator-(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// subtract constant from evaluation object
|
||||
template <class RhsValueType>
|
||||
Evaluation operator-(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
return (result -= other);
|
||||
}
|
||||
|
||||
// negation (unary minus) operator
|
||||
Evaluation operator-() const
|
||||
{
|
||||
Evaluation result;
|
||||
// set value and derivatives to negative
|
||||
result.data_[0] = - data_[0];
|
||||
result.data_[1] = - data_[1];
|
||||
result.data_[2] = - data_[2];
|
||||
result.data_[3] = - data_[3];
|
||||
result.data_[4] = - data_[4];
|
||||
result.data_[5] = - data_[5];
|
||||
result.data_[6] = - data_[6];
|
||||
result.data_[7] = - data_[7];
|
||||
result.data_[8] = - data_[8];
|
||||
result.data_[9] = - data_[9];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator*(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator*(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result *= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
Evaluation operator/(const Evaluation& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation operator/(const RhsValueType& other) const
|
||||
{
|
||||
Evaluation result(*this);
|
||||
result /= other;
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
Evaluation& operator=(const RhsValueType& other)
|
||||
{
|
||||
setValue( other );
|
||||
clearDerivatives();
|
||||
return *this;
|
||||
}
|
||||
|
||||
// copy assignment from evaluation
|
||||
Evaluation& operator=(const Evaluation& other)
|
||||
{
|
||||
data_[0] = other.data_[0];
|
||||
data_[1] = other.data_[1];
|
||||
data_[2] = other.data_[2];
|
||||
data_[3] = other.data_[3];
|
||||
data_[4] = other.data_[4];
|
||||
data_[5] = other.data_[5];
|
||||
data_[6] = other.data_[6];
|
||||
data_[7] = other.data_[7];
|
||||
data_[8] = other.data_[8];
|
||||
data_[9] = other.data_[9];
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator==(const RhsValueType& other) const
|
||||
{ return value() == other; }
|
||||
|
||||
bool operator==(const Evaluation& other) const
|
||||
{
|
||||
for (int idx = 0; idx < length_; ++idx) {
|
||||
if (data_[idx] != other.data_[idx]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool operator!=(const Evaluation& other) const
|
||||
{ return !operator==(other); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>(RhsValueType other) const
|
||||
{ return value() > other; }
|
||||
|
||||
bool operator>(const Evaluation& other) const
|
||||
{ return value() > other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<(RhsValueType other) const
|
||||
{ return value() < other; }
|
||||
|
||||
bool operator<(const Evaluation& other) const
|
||||
{ return value() < other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator>=(RhsValueType other) const
|
||||
{ return value() >= other; }
|
||||
|
||||
bool operator>=(const Evaluation& other) const
|
||||
{ return value() >= other.value(); }
|
||||
|
||||
template <class RhsValueType>
|
||||
bool operator<=(RhsValueType other) const
|
||||
{ return value() <= other; }
|
||||
|
||||
bool operator<=(const Evaluation& other) const
|
||||
{ return value() <= other.value(); }
|
||||
|
||||
// return value of variable
|
||||
const ValueType& value() const
|
||||
{ return data_[valuepos_]; }
|
||||
|
||||
// set value of variable
|
||||
template <class RhsValueType>
|
||||
void setValue(const RhsValueType& val)
|
||||
{ data_[valuepos_] = val; }
|
||||
|
||||
// return varIdx'th derivative
|
||||
const ValueType& derivative(int varIdx) const
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
return data_[dstart_ + varIdx];
|
||||
}
|
||||
|
||||
// set derivative at position varIdx
|
||||
void setDerivative(int varIdx, const ValueType& derVal)
|
||||
{
|
||||
assert(0 <= varIdx && varIdx < size);
|
||||
data_[dstart_ + varIdx] = derVal;
|
||||
}
|
||||
|
||||
private:
|
||||
std::array<ValueT, length_> data_;
|
||||
};
|
||||
|
||||
|
||||
|
||||
} } // namespace DenseAd, Opm
|
||||
|
||||
|
||||
#endif // OPM_DENSEAD_EVALUATION9_HPP
|
@ -1,48 +0,0 @@
|
||||
// -*- 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
|
@ -39,45 +39,45 @@
|
||||
namespace Opm {
|
||||
namespace DenseAd {
|
||||
// forward declaration of the Evaluation template class
|
||||
template <class ValueT, int numVars>
|
||||
template <class ValueT, unsigned numVars>
|
||||
class Evaluation;
|
||||
|
||||
// provide some algebraic functions
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> abs(const Evaluation<ValueType, numVars>& x)
|
||||
{ return (x > 0.0)?x:-x; }
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned 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, int numVars>
|
||||
template <class Arg1ValueType, class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> min(const Arg1ValueType& x1,
|
||||
const Evaluation<ValueType, numVars>& x2)
|
||||
{ return (x1 < x2)?x1:x2; }
|
||||
|
||||
template <class ValueType, int numVars, class Arg2ValueType>
|
||||
template <class ValueType, unsigned numVars, class Arg2ValueType>
|
||||
Evaluation<ValueType, numVars> min(const Evaluation<ValueType, numVars>& x1,
|
||||
const Arg2ValueType& x2)
|
||||
{ return min(x2, x1); }
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned 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, int numVars>
|
||||
template <class Arg1ValueType, class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> max(const Arg1ValueType& x1,
|
||||
const Evaluation<ValueType, numVars>& x2)
|
||||
{ return (x1 > x2)?x1:x2; }
|
||||
|
||||
template <class ValueType, int numVars, class Arg2ValueType>
|
||||
template <class ValueType, unsigned numVars, class Arg2ValueType>
|
||||
Evaluation<ValueType, numVars> max(const Evaluation<ValueType, numVars>& x1,
|
||||
const Arg2ValueType& x2)
|
||||
{ return max(x2, x1); }
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> tan(const Evaluation<ValueType, numVars>& x)
|
||||
{
|
||||
typedef MathToolbox<ValueType> ValueTypeToolbox;
|
||||
@ -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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> atan(const Evaluation<ValueType, numVars>& x)
|
||||
{
|
||||
typedef MathToolbox<ValueType> ValueTypeToolbox;
|
||||
@ -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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> atan2(const Evaluation<ValueType, numVars>& x,
|
||||
const Evaluation<ValueType, numVars>& y)
|
||||
{
|
||||
@ -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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
|
||||
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
|
||||
result.setDerivative(curVarIdx,
|
||||
alpha/(y.value()*y.value())
|
||||
*(x.derivative(curVarIdx)*y.value() - x.value()*y.derivative(curVarIdx)));
|
||||
@ -133,7 +133,7 @@ Evaluation<ValueType, numVars> atan2(const Evaluation<ValueType, numVars>& x,
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> sin(const Evaluation<ValueType, numVars>& x)
|
||||
{
|
||||
typedef MathToolbox<ValueType> ValueTypeToolbox;
|
||||
@ -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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> asin(const Evaluation<ValueType, numVars>& x)
|
||||
{
|
||||
typedef MathToolbox<ValueType> ValueTypeToolbox;
|
||||
@ -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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> cos(const Evaluation<ValueType, numVars>& x)
|
||||
{
|
||||
typedef MathToolbox<ValueType> ValueTypeToolbox;
|
||||
@ -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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> acos(const Evaluation<ValueType, numVars>& x)
|
||||
{
|
||||
typedef MathToolbox<ValueType> ValueTypeToolbox;
|
||||
@ -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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> sqrt(const Evaluation<ValueType, numVars>& x)
|
||||
{
|
||||
typedef MathToolbox<ValueType> ValueTypeToolbox;
|
||||
@ -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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
|
||||
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
|
||||
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> exp(const Evaluation<ValueType, numVars>& x)
|
||||
{
|
||||
typedef MathToolbox<ValueType> ValueTypeToolbox;
|
||||
@ -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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
for (unsigned 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, int numVars, class ExpType>
|
||||
template <class ValueType, unsigned numVars, class ExpType>
|
||||
Evaluation<ValueType, numVars> pow(const Evaluation<ValueType, numVars>& base,
|
||||
const ExpType& exp)
|
||||
{
|
||||
@ -256,7 +256,7 @@ 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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
result.setDerivative(curVarIdx, df_dx*base.derivative(curVarIdx));
|
||||
}
|
||||
|
||||
@ -264,7 +264,7 @@ Evaluation<ValueType, numVars> pow(const Evaluation<ValueType, numVars>& base,
|
||||
}
|
||||
|
||||
// exponentiation of constant base with an arbitrary exponent
|
||||
template <class BaseType, class ValueType, int numVars>
|
||||
template <class BaseType, class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> pow(const BaseType& base,
|
||||
const Evaluation<ValueType, numVars>& exp)
|
||||
{
|
||||
@ -283,7 +283,7 @@ Evaluation<ValueType, numVars> pow(const BaseType& base,
|
||||
|
||||
// derivatives use the chain rule
|
||||
const ValueType& df_dx = lnBase*result.value();
|
||||
for (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
result.setDerivative(curVarIdx, df_dx*exp.derivative(curVarIdx));
|
||||
}
|
||||
|
||||
@ -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, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> pow(const Evaluation<ValueType, numVars>& base,
|
||||
const Evaluation<ValueType, numVars>& exp)
|
||||
{
|
||||
@ -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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx) {
|
||||
for (unsigned 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);
|
||||
@ -324,7 +324,7 @@ Evaluation<ValueType, numVars> pow(const Evaluation<ValueType, numVars>& base,
|
||||
return result;
|
||||
}
|
||||
|
||||
template <class ValueType, int numVars>
|
||||
template <class ValueType, unsigned numVars>
|
||||
Evaluation<ValueType, numVars> log(const Evaluation<ValueType, numVars>& x)
|
||||
{
|
||||
typedef MathToolbox<ValueType> ValueTypeToolbox;
|
||||
@ -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 (int curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
for (unsigned curVarIdx = 0; curVarIdx < result.size; ++curVarIdx)
|
||||
result.setDerivative(curVarIdx, df_dx*x.derivative(curVarIdx));
|
||||
|
||||
return result;
|
||||
@ -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, int numVars>
|
||||
template <class ValueT, unsigned numVars>
|
||||
struct MathToolbox<Opm::DenseAd::Evaluation<ValueT, numVars> >
|
||||
{
|
||||
private:
|
||||
@ -364,7 +364,7 @@ public:
|
||||
static Evaluation createConstant(ValueType value)
|
||||
{ return Evaluation::createConstant(value); }
|
||||
|
||||
static Evaluation createVariable(ValueType value, int varIdx)
|
||||
static Evaluation createVariable(ValueType value, unsigned varIdx)
|
||||
{ return Evaluation::createVariable(value, varIdx); }
|
||||
|
||||
template <class LhsEval>
|
||||
@ -395,7 +395,7 @@ public:
|
||||
return false;
|
||||
|
||||
// make sure that the derivatives are identical
|
||||
for (int curVarIdx = 0; curVarIdx < numVars; ++curVarIdx)
|
||||
for (unsigned curVarIdx = 0; curVarIdx < numVars; ++curVarIdx)
|
||||
if (!ValueTypeToolbox::isSame(a.derivative(curVarIdx), b.derivative(curVarIdx), tolerance))
|
||||
return false;
|
||||
|
||||
@ -460,7 +460,7 @@ public:
|
||||
if (!InnerToolbox::isfinite(arg.value()))
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < numVars; ++i)
|
||||
for (unsigned i = 0; i < numVars; ++i)
|
||||
if (!InnerToolbox::isfinite(arg.derivative(i)))
|
||||
return false;
|
||||
|
||||
@ -472,7 +472,7 @@ public:
|
||||
if (InnerToolbox::isnan(arg.value()))
|
||||
return true;
|
||||
|
||||
for (int i = 0; i < numVars; ++i)
|
||||
for (unsigned i = 0; i < numVars; ++i)
|
||||
if (InnerToolbox::isnan(arg.derivative(i)))
|
||||
return true;
|
||||
|
||||
|
@ -50,12 +50,9 @@
|
||||
#include <cassert>
|
||||
#include <stdexcept>
|
||||
|
||||
//static const int numVars = 3;
|
||||
|
||||
template <class Scalar, int numVars>
|
||||
struct TestEnv
|
||||
{
|
||||
static const int numVars = 3;
|
||||
|
||||
template <class Scalar>
|
||||
void testOperators(const Scalar tolerance)
|
||||
{
|
||||
typedef Opm::DenseAd::Evaluation<Scalar, numVars> Eval;
|
||||
@ -259,7 +256,7 @@ void testOperators(const Scalar tolerance)
|
||||
}
|
||||
}
|
||||
|
||||
template <class AdFn, class ClassicFn>
|
||||
template <class Scalar, class AdFn, class ClassicFn>
|
||||
void test1DFunction(AdFn* adFn, ClassicFn* classicFn, Scalar xMin = 1e-6, Scalar xMax = 1000)
|
||||
{
|
||||
typedef Opm::DenseAd::Evaluation<Scalar, numVars> Eval;
|
||||
@ -292,7 +289,8 @@ void test1DFunction(AdFn* adFn, ClassicFn* classicFn, Scalar xMin = 1e-6, Scalar
|
||||
}
|
||||
}
|
||||
|
||||
template <class AdFn,
|
||||
template <class Scalar,
|
||||
class AdFn,
|
||||
class ClassicFn>
|
||||
void test2DFunction1(AdFn* adFn, ClassicFn* classicFn, Scalar xMin, Scalar xMax, Scalar y)
|
||||
{
|
||||
@ -328,7 +326,8 @@ void test2DFunction1(AdFn* adFn, ClassicFn* classicFn, Scalar xMin, Scalar xMax,
|
||||
}
|
||||
}
|
||||
|
||||
template <class AdFn,
|
||||
template <class Scalar,
|
||||
class AdFn,
|
||||
class ClassicFn>
|
||||
void test2DFunction2(AdFn* adFn, ClassicFn* classicFn, Scalar x, Scalar yMin, Scalar yMax)
|
||||
{
|
||||
@ -364,6 +363,7 @@ void test2DFunction2(AdFn* adFn, ClassicFn* classicFn, Scalar x, Scalar yMin, Sc
|
||||
}
|
||||
}
|
||||
|
||||
template <class Scalar>
|
||||
void testPowBase(Scalar baseMin = 1e-2, Scalar baseMax = 100)
|
||||
{
|
||||
typedef Opm::DenseAd::Evaluation<Scalar, numVars> Eval;
|
||||
@ -405,6 +405,7 @@ void testPowBase(Scalar baseMin = 1e-2, Scalar baseMax = 100)
|
||||
}
|
||||
}
|
||||
|
||||
template <class Scalar>
|
||||
void testPowExp(Scalar expMin = -100, Scalar expMax = 100)
|
||||
{
|
||||
typedef Opm::DenseAd::Evaluation<Scalar, numVars> Eval;
|
||||
@ -446,6 +447,7 @@ void testPowExp(Scalar expMin = -100, Scalar expMax = 100)
|
||||
}
|
||||
}
|
||||
|
||||
template <class Scalar>
|
||||
void testAtan2()
|
||||
{
|
||||
typedef Opm::DenseAd::Evaluation<Scalar, numVars> Eval;
|
||||
@ -495,12 +497,16 @@ void testAtan2()
|
||||
}
|
||||
|
||||
// prototypes
|
||||
static double myScalarMin(double a, double b)
|
||||
double myScalarMin(double a, double b);
|
||||
double myScalarMax(double a, double b);
|
||||
|
||||
double myScalarMin(double a, double b)
|
||||
{ return std::min(a, b); }
|
||||
|
||||
static double myScalarMax(double a, double b)
|
||||
double myScalarMax(double a, double b)
|
||||
{ return std::max(a, b); }
|
||||
|
||||
template <class Scalar>
|
||||
inline void testAll()
|
||||
{
|
||||
// the following is commented out because it is supposed to produce a compiler
|
||||
@ -510,82 +516,82 @@ inline void testAll()
|
||||
|
||||
std::cout << "testing operators and constructors\n";
|
||||
const Scalar eps = std::numeric_limits<Scalar>::epsilon()*1e3;
|
||||
testOperators(eps);
|
||||
testOperators<Scalar>(eps);
|
||||
|
||||
std::cout << "testing min()\n";
|
||||
test2DFunction1(Opm::DenseAd::min<Scalar, numVars>,
|
||||
test2DFunction1<Scalar>(Opm::DenseAd::min<Scalar, numVars>,
|
||||
myScalarMin,
|
||||
-1000, 1000,
|
||||
/*p=*/1.234);
|
||||
|
||||
test2DFunction2(Opm::DenseAd::min<Scalar, numVars>,
|
||||
test2DFunction2<Scalar>(Opm::DenseAd::min<Scalar, numVars>,
|
||||
myScalarMin,
|
||||
/*T=*/1.234,
|
||||
-1000, 1000);
|
||||
|
||||
std::cout << "testing max()\n";
|
||||
test2DFunction1(Opm::DenseAd::max<Scalar, numVars>,
|
||||
test2DFunction1<Scalar>(Opm::DenseAd::max<Scalar, numVars>,
|
||||
myScalarMax,
|
||||
-1000, 1000,
|
||||
/*p=*/1.234);
|
||||
|
||||
test2DFunction2(Opm::DenseAd::max<Scalar, numVars>,
|
||||
test2DFunction2<Scalar>(Opm::DenseAd::max<Scalar, numVars>,
|
||||
myScalarMax,
|
||||
/*T=*/1.234,
|
||||
-1000, 1000);
|
||||
|
||||
std::cout << "testing pow()\n";
|
||||
testPowBase();
|
||||
testPowExp();
|
||||
testPowBase<Scalar>();
|
||||
testPowExp<Scalar>();
|
||||
|
||||
std::cout << "testing abs()\n";
|
||||
test1DFunction(Opm::DenseAd::abs<Scalar, numVars>,
|
||||
test1DFunction<Scalar>(Opm::DenseAd::abs<Scalar, numVars>,
|
||||
static_cast<Scalar (*)(Scalar)>(std::abs));
|
||||
|
||||
std::cout << "testing sqrt()\n";
|
||||
test1DFunction(Opm::DenseAd::sqrt<Scalar, numVars>,
|
||||
test1DFunction<Scalar>(Opm::DenseAd::sqrt<Scalar, numVars>,
|
||||
static_cast<Scalar (*)(Scalar)>(std::sqrt));
|
||||
|
||||
std::cout << "testing sin()\n";
|
||||
test1DFunction(Opm::DenseAd::sin<Scalar, numVars>,
|
||||
test1DFunction<Scalar>(Opm::DenseAd::sin<Scalar, numVars>,
|
||||
static_cast<Scalar (*)(Scalar)>(std::sin),
|
||||
0, 2*M_PI);
|
||||
|
||||
std::cout << "testing asin()\n";
|
||||
test1DFunction(Opm::DenseAd::asin<Scalar, numVars>,
|
||||
test1DFunction<Scalar>(Opm::DenseAd::asin<Scalar, numVars>,
|
||||
static_cast<Scalar (*)(Scalar)>(std::asin),
|
||||
-1.0, 1.0);
|
||||
|
||||
std::cout << "testing cos()\n";
|
||||
test1DFunction(Opm::DenseAd::cos<Scalar, numVars>,
|
||||
test1DFunction<Scalar>(Opm::DenseAd::cos<Scalar, numVars>,
|
||||
static_cast<Scalar (*)(Scalar)>(std::cos),
|
||||
0, 2*M_PI);
|
||||
|
||||
std::cout << "testing acos()\n";
|
||||
test1DFunction(Opm::DenseAd::acos<Scalar, numVars>,
|
||||
test1DFunction<Scalar>(Opm::DenseAd::acos<Scalar, numVars>,
|
||||
static_cast<Scalar (*)(Scalar)>(std::acos),
|
||||
-1.0, 1.0);
|
||||
|
||||
std::cout << "testing tan()\n";
|
||||
test1DFunction(Opm::DenseAd::tan<Scalar, numVars>,
|
||||
test1DFunction<Scalar>(Opm::DenseAd::tan<Scalar, numVars>,
|
||||
static_cast<Scalar (*)(Scalar)>(std::tan),
|
||||
-M_PI / 2 * 0.95, M_PI / 2 * 0.95);
|
||||
|
||||
std::cout << "testing atan()\n";
|
||||
test1DFunction(Opm::DenseAd::atan<Scalar, numVars>,
|
||||
test1DFunction<Scalar>(Opm::DenseAd::atan<Scalar, numVars>,
|
||||
static_cast<Scalar (*)(Scalar)>(std::atan),
|
||||
-10*1000.0, 10*1000.0);
|
||||
|
||||
std::cout << "testing atan2()\n";
|
||||
testAtan2();
|
||||
testAtan2<Scalar>();
|
||||
|
||||
std::cout << "testing exp()\n";
|
||||
test1DFunction(Opm::DenseAd::exp<Scalar, numVars>,
|
||||
test1DFunction<Scalar>(Opm::DenseAd::exp<Scalar, numVars>,
|
||||
static_cast<Scalar (*)(Scalar)>(std::exp),
|
||||
-100, 100);
|
||||
|
||||
std::cout << "testing log()\n";
|
||||
test1DFunction(Opm::DenseAd::log<Scalar, numVars>,
|
||||
test1DFunction<Scalar>(Opm::DenseAd::log<Scalar, numVars>,
|
||||
static_cast<Scalar (*)(Scalar)>(std::log),
|
||||
1e-6, 1e9);
|
||||
|
||||
@ -645,17 +651,12 @@ inline void testAll()
|
||||
}
|
||||
}
|
||||
|
||||
};//TestEnv
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
Dune::MPIHelper::instance(argc, argv);
|
||||
|
||||
TestEnv<double, 15>().testAll();
|
||||
TestEnv<double, 2>().testAll();
|
||||
TestEnv<float, 15>().testAll();
|
||||
TestEnv<float, 2>().testAll();
|
||||
testAll<double>();
|
||||
testAll<float>();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user