diff --git a/dune/stuff/function/expression.hh b/dune/stuff/function/expression.hh deleted file mode 100644 index b198a8f04efa398e162048acb09e8d59ff209b80..0000000000000000000000000000000000000000 --- a/dune/stuff/function/expression.hh +++ /dev/null @@ -1,247 +0,0 @@ -#ifndef DUNE_STUFF_FUNCTION_EXPRESSION_HH -#define DUNE_STUFF_FUNCTION_EXPRESSION_HH - -#ifdef HAVE_CMAKE_CONFIG -#include "cmake_config.h" -#else -#include "config.h" -#endif // ifdef HAVE_CMAKE_CONFIG - -#include <sstream> -#include <vector> - -#if HAVE_EIGEN -#include <Eigen/Core> -#endif // HAVE_EIGEN - -#include <dune/common/fvector.hh> -#include <dune/common/dynvector.hh> -#include <dune/common/exceptions.hh> - -#ifdef HAVE_DUNE_FEM -#include <dune/fem/function/common/function.hh> -#include <dune/fem/space/common/functionspace.hh> -#endif // HAVE_DUNE_FEM - -#include <dune/stuff/common/parameter/tree.hh> -#include <dune/stuff/common/string.hh> - -#include "expression/mathexpr.hh" -#include "interface.hh" - -namespace Dune { -namespace Stuff { -namespace Function { - -/** - \brief Provides a function which evaluates a given mathematical expression at runtime. - - Given a mathematical expression as a string, a domain \f$ K_d^{m \geq 1} \f$ and a range \f$ K_r^{n \geq 1} - \f$ this function represents the map - \f{eqnarray} - f:K_d^m \to K_r^n\\ - x = (x_1, \dots, x_m)' \mapsto (f_1(x), \dots f_n(x))', - \f} - where \f$ K_d \f$ is the DomainType and \f$ K_r \f$ is the RangeType, usually a power of \f$ \mathcal{R} \f$. - The name of the variable as well as the \f$ n \f$ expressions of \f$f_1, \dots, f_n\f$ have to be given in a - Dune::ParameterTree in the following form: -\code variable: x -expression.0: 2*x[0] -expression.1: sin(x[1])*x[0]\endcode - There have to exist at least \f$n\f$ expressions; the entries of the variable are indexed by \f$[i]\f$ for - \f$ 0 \leq i \leq m - 1 \f$. - **/ -template <class DomainFieldImp, int maxDimDomain, class RangeFieldImp, int maxDimRange> -class Expression : public Interface<DomainFieldImp, maxDimDomain, RangeFieldImp, maxDimRange> -{ -public: - typedef DomainFieldImp DomainFieldType; - - typedef RangeFieldImp RangeFieldType; - - typedef Interface<DomainFieldImp, maxDimDomain, RangeFieldImp, maxDimRange> BaseType; - - typedef Expression<DomainFieldImp, maxDimDomain, RangeFieldImp, maxDimRange> ThisType; - - Expression(const std::string _variable, const std::string _expression) - { - const std::vector<std::string> expressions(1, _expression); - setup(_variable, expressions); - } // Expression(const std::string variable, const std::string expression) - - Expression(const std::string _variable, const std::vector<std::string> _expressions) - { - setup(_variable, _expressions); - } // Expression(const std::string variable, const std::vector< std::string >& expressions) - - Expression(const ThisType& other) - { - setup(other.variable(), other.expression()); - } // Expression(const ThisType& other) - - static ThisType createFromParamTree(const Dune::ParameterTree& paramTree) - { - const Dune::Stuff::Common::ExtendedParameterTree extendedParamtree(paramTree); - // get variable - const std::string variable = extendedParamtree.get<std::string>("variable"); - // get expressions - const std::vector<std::string> expressions = extendedParamtree.getVector<std::string>("expression", 1); - // create and return - return ThisType(variable, expressions); - } // static ThisType createFromParamTree(const Stuff::Common::ExtendedParameterTree& paramTree) - - ThisType& operator=(const ThisType& other) - { - if (this != &other) { - cleanup(); - setup(other.variable(), other.expression()); - } - return this; - } // ThisType& operator=(const ThisType& other) - - ~Expression() - { - cleanup(); - } // ~Expression() - - void report(const std::string name = "stuff.function.expression", std::ostream& stream = std::cout, - const std::string& prefix = "") const - { - const std::string tmp = name + "(" + variable() + ") = "; - stream << prefix << tmp; - if (expression().size() == 1) - stream << expression()[0] << std::endl; - else { - stream << "[ " << expression()[0] << ";" << std::endl; - const std::string whitespace = Dune::Stuff::Common::whitespaceify(tmp + "[ "); - for (unsigned int i = 1; i < expression().size() - 1; ++i) - stream << prefix << whitespace << expression()[i] << ";" << std::endl; - stream << prefix << whitespace << expression()[expression().size() - 1] << " ]" << std::endl; - } - } // void report(const std::string, std::ostream&, const std::string&) const - - std::string variable() const - { - return variable_; - } - - const std::vector<std::string> expression() const - { - return expressions_; - } - - unsigned int dimRange() const - { - return std::min(int(actualDimRange_), maxDimRange); - } - - //! needed for Interface - virtual void evaluate(const Dune::FieldVector<DomainFieldImp, maxDimDomain>& arg, - Dune::FieldVector<RangeFieldImp, maxDimRange>& ret) const - { - // ensure right dimensions - assert(arg.size() <= maxDimDomain); - assert(ret.size() <= dimRange()); - // arg - for (typename Dune::FieldVector<DomainFieldImp, maxDimDomain>::size_type i = 0; i < arg.size(); ++i) { - *(arg_[i]) = arg[i]; - } - // ret - for (typename Dune::FieldVector<RangeFieldImp, maxDimRange>::size_type i = 0; i < ret.size(); ++i) { - ret[i] = op_[i]->Val(); - } - } - - template <class DomainVectorType, class RangeVectorType> - void evaluate(const Dune::DenseVector<DomainVectorType>& arg, Dune::DenseVector<RangeVectorType>& ret) const - { - // ensure right dimensions - assert(arg.size() <= maxDimDomain); - assert(ret.size() <= dimRange()); - // arg - for (typename Dune::DenseVector<DomainVectorType>::size_type i = 0; i < arg.size(); ++i) { - *(arg_[i]) = arg[i]; - } - // ret - for (typename Dune::DenseVector<RangeVectorType>::size_type i = 0; i < ret.size(); ++i) { - ret[i] = op_[i]->Val(); - } - } - -#ifdef HAVE_EIGEN - /** - * \attention ret is resized to size dimRange()! - */ - void evaluate(const Eigen::VectorXd& arg, Eigen::VectorXd& ret) const - { - // ensure right dimensions - assert(arg.size() <= maxDimDomain); - ret.resize(dimRange()); - // arg - for (int i = 0; i < arg.size(); ++i) { - *(arg_[i]) = arg(i); - } - // ret - for (int i = 0; i < ret.size(); ++i) { - ret(i) = op_[i]->Val(); - } - } // void evaluate(const Eigen::VectorXd& arg, Eigen::VectorXd& ret) const -#endif // HAVE_EIGEN - - using BaseType::evaluate; - -private: - void setup(const std::string& _variable, const std::vector<std::string>& _expressions) - { - assert(maxDimDomain > 0); - assert(maxDimRange > 0); - // set expressions - if (_expressions.size() < 1) - DUNE_THROW(Dune::InvalidStateException, "\nError: Given 'expressions'-vector is empty!"); - actualDimRange_ = std::min(int(_expressions.size()), maxDimRange); - expressions_ = _expressions; - // set variable (i.e. "x") - variable_ = _variable; - // fill variables (i.e. "x[0]", "x[1]", ...) - for (int i = 0; i < maxDimDomain; ++i) { - std::stringstream variableStream; - variableStream << variable_ << "[" << i << "]"; - variables_.push_back(variableStream.str()); - } - // create epressions - for (unsigned int i = 0; i < maxDimDomain; ++i) { - arg_[i] = new DomainFieldType(0.0); - var_arg_[i] = new RVar(variables_[i].c_str(), arg_[i]); - vararray_[i] = var_arg_[i]; - } - for (unsigned int i = 0; i < dimRange(); ++i) { - op_[i] = new ROperation(expressions_[i].c_str(), maxDimDomain, vararray_); - } - } // void setup(const std::string& variable, const std::vector< std::string >& expressions) - - void cleanup() - { - for (unsigned int i = 0; i < dimRange(); ++i) { - delete op_[i]; - } - for (unsigned int i = 0; i < maxDimDomain; ++i) { - delete var_arg_[i]; - delete arg_[i]; - } - } // void cleanup() - - std::string variable_; - std::vector<std::string> variables_; - std::vector<std::string> expressions_; - unsigned int actualDimRange_; - mutable DomainFieldType* arg_[maxDimDomain]; - RVar* var_arg_[maxDimDomain]; - RVar* vararray_[maxDimDomain]; - ROperation* op_[maxDimRange]; -}; // class Expression - -} // namespace Function -} // namespace Stuff -} // namespace Dune - -#endif // DUNE_STUFF_FUNCTION_EXPRESSION_HH diff --git a/dune/stuff/function/expression/mathexpr.cc b/dune/stuff/function/nonparametric/expression/mathexpr.cc similarity index 100% rename from dune/stuff/function/expression/mathexpr.cc rename to dune/stuff/function/nonparametric/expression/mathexpr.cc diff --git a/dune/stuff/function/expression/mathexpr.hh b/dune/stuff/function/nonparametric/expression/mathexpr.hh similarity index 95% rename from dune/stuff/function/expression/mathexpr.hh rename to dune/stuff/function/nonparametric/expression/mathexpr.hh index 2aa6c8d4caff899f353056fd52328cb9991a6ed2..415399ae7a57c7f50b348f20508adb8a9a5e017a 100644 --- a/dune/stuff/function/expression/mathexpr.hh +++ b/dune/stuff/function/nonparametric/expression/mathexpr.hh @@ -19,8 +19,8 @@ This software comes with absolutely no warranty. */ -#ifndef DUNE_STUFF_FUNCTION_EXPRESSION_EXPRESSION_HH -#define DUNE_STUFF_FUNCTION_EXPRESSION_EXPRESSION_HH +#ifndef DUNE_STUFF_FUNCTION_NONPARAMETRIC_EXPRESSION_MATHEXPRESSION_HH +#define DUNE_STUFF_FUNCTION_NONPARAMETRIC_EXPRESSION_MATHEXPRESSION_HH #include <string.h> #include <stdio.h> @@ -198,4 +198,4 @@ char* DelStr(const char* s, int n); #include "mathexpr.cc" -#endif // DUNE_STUFF_FUNCTION_EXPRESSION_EXPRESSION_HH +#endif // DUNE_STUFF_FUNCTION_NONPARAMETRIC_EXPRESSION_MATHEXPRESSION_HH