diff --git a/dune/stuff/function/spe10.hh b/dune/stuff/function/spe10.hh index f2c09ea0fa9c6bfd5a4b19764d97402106687648..87ce3982e078f7104200e96d09a1015b574c461f 100644 --- a/dune/stuff/function/spe10.hh +++ b/dune/stuff/function/spe10.hh @@ -8,6 +8,7 @@ #include <dune/stuff/common/parameter/tree.hh> #include <dune/stuff/common/color.hh> +#include <dune/stuff/common/string.hh> #include "interface.hh" @@ -46,17 +47,20 @@ private: static const size_t numXelements = 100; static const size_t numYelements = 1; static const size_t numZelements = 20; + static const double minValue = 0.001; + static const double maxValue = 998.915; public: Spe10Model1(const std::string filename, const DomainType& _lowerLeft, const DomainType& _upperRight, // const std::vector< size_t >& _numElements, - const std::string _name = id(), const int _order = 0, const double _regularization = 0.0) + const std::string _name = id(), const int _order = 0, const double _minValue = minValue, + const double _maxValue = maxValue) : lowerLeft_(_lowerLeft) , upperRight_(_upperRight) // , numElements_(_numElements) , name_(_name) , order_(_order) - , regularization_(_regularization) + , minValue_(_minValue) { // sanity checks std::stringstream msg; @@ -83,11 +87,13 @@ public: // msg << "\n" << Dune::Stuff::Common::colorStringRed("ERROR:") // << " numElements[1] has to be smaller than " << numZelements << " (is " << numElements_[1] << ")!"; // } - if (regularization_ < 0.0) { + if (!(_maxValue > minValue_)) { ++throw_up; - msg << "\n" << Dune::Stuff::Common::colorStringRed("ERROR:") << " regularization must not be negative (is " - << regularization_ << ")!"; + msg << "\n" << Dune::Stuff::Common::colorStringRed("ERROR:") << " maxValue_ (is " << _maxValue + << ") has to be larger than minValue_ (is " << _minValue << ")!"; } + scale_ = (_maxValue - minValue_) / (maxValue - minValue); + shift_ = minValue_ - scale_ * minValue; // read all the data from the file std::ifstream datafile(filename); if (datafile.is_open()) { @@ -129,10 +135,11 @@ public: static Dune::ParameterTree createSampleDescription(const std::string subName = "") { Dune::ParameterTree description; - description["filename"] = "perm_case1.dat"; - description["lowerLeft"] = "[0.0; 0.0]"; - description["upperRight"] = "[762.0; 15.24]"; - description["regularization"] = "0.0"; + description["filename"] = "perm_case1.dat"; + description["lowerLeft"] = "[0.0; 0.0]"; + description["upperRight"] = "[762.0; 15.24]"; + description["minValue"] = Dune::Stuff::Common::toString(minValue); + description["maxValue"] = Dune::Stuff::Common::toString(maxValue); // description["numElements"] = "[100; 20]"; description["name"] = id(); description["order"] = "0"; @@ -153,9 +160,12 @@ public: const std::vector<DomainFieldType> upperRightIn = description.getVector<DomainFieldType>("upperRight", dimDomain); // const std::vector< size_t > numElements = description.getVector< size_t >( "numElements", // dimDomain); - double regularizationIn = 0.0; - if (description.hasKey("regularization")) - regularizationIn = description.get<double>("regularization"); + double minValueIn = minValue; + if (description.hasKey("minValue")) + minValueIn = description.get<double>("minValue"); + double maxValueIn = maxValue; + if (description.hasKey("maxValue")) + maxValueIn = description.get<double>("maxValue"); const std::string nameIn = description.get<std::string>("name", id()); const int orderIn = description.get<int>("order", 0); // convert and leave the checks to the constructor @@ -166,7 +176,7 @@ public: upperRight[dd] = upperRightIn[dd]; } // create and return - return new ThisType(filenameIn, lowerLeft, upperRight, /*numElements,*/ nameIn, orderIn, regularizationIn); + return new ThisType(filenameIn, lowerLeft, upperRight, /*numElements,*/ nameIn, orderIn, minValueIn, maxValueIn); } // static ThisType createFromParamTree(const Dune::ParameterTree paramTree) const DomainType& lowerLeft() const @@ -206,10 +216,10 @@ public: // } // if (interval[0] >= numElements_[0] || interval[1] >= numElements_[1]) { if (interval[0] >= numXelements || interval[1] >= numZelements) { - ret[0] = 0; + ret[0] = minValue_; } else { const size_t index = interval[0] + numXelements * 0 + numXelements * numYelements * interval[1]; - ret[0] = data_[index] + regularization_; + ret[0] = (scale_ * data_[index]) + shift_; } } // virtual void evaluate(const DomainType& x, RangeType& ret) const @@ -220,8 +230,10 @@ private: // const std::vector< size_t > numElements_; const std::string name_; const int order_; - const double regularization_; + const double minValue_; double* data_; + double scale_; + double shift_; }; // class Spe10Model1< DomainFieldImp, 2, RangeFieldImp, 1 >