diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b14fbc..64ac6f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,13 +110,11 @@ include_directories( src/sys ) -link_directories(/usr/lib/chaiscript) - # Add the code subdirectory add_subdirectory(src) add_subdirectory(testing) add_executable(tasmet src/main.cpp src/gui/tasmet_resources.qrc) add_executable(tasmet_solvemodel src/tasmet_solvemodel.cpp) -target_link_libraries(tasmet tasmet_gui tasmet_src messages Qt5::Widgets chaiscript_stdlib-5.7.0 openblas) -target_link_libraries(tasmet_solvemodel tasmet_src messages openblas chaiscript_stdlib-5.7.0) +target_link_libraries(tasmet tasmet_gui tasmet_src messages Qt5::Widgets muparser openblas) +target_link_libraries(tasmet_solvemodel tasmet_src messages openblas muparser) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f0b4a7b..0906a5c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,7 +27,6 @@ include_directories( ) add_library(tasmet_src - chaiscript.cpp tasmet_tracer.cpp tasmet_exception.cpp diff --git a/src/chaiscript.cpp b/src/chaiscript.cpp deleted file mode 100644 index 4ab5873..0000000 --- a/src/chaiscript.cpp +++ /dev/null @@ -1,28 +0,0 @@ -// chaiscript.cpp -// -// last-edit-by: J.A. de Jong -// -// Description: -// -////////////////////////////////////////////////////////////////////// - -#include "chaiscript.h" -#include -#include -#include "chaiscript/math.hpp" -#include "tasmet_types.h" - -using chaiscript::ChaiScript; - -std::unique_ptr getChaiScriptInstance() { - - auto mathlib = chaiscript::extras::math::bootstrap(); - - std::unique_ptr chai(new ChaiScript()); - // std::unique_ptr chai(new ChaiScript(chaiscript::Std_Lib::library())); - - chai->add(mathlib); - chai->add_global(chaiscript::var(number_pi),"pi"); - return chai; -} -////////////////////////////////////////////////////////////////////// diff --git a/src/chaiscript.h b/src/chaiscript.h deleted file mode 100644 index 80877c7..0000000 --- a/src/chaiscript.h +++ /dev/null @@ -1,20 +0,0 @@ -// chaiscript.h -// -// Author: J.A. de Jong -// -// Description: -// Slow compiling chaiscript therefore we provide this wrapper -////////////////////////////////////////////////////////////////////// -#pragma once -#ifndef CHAISCRIPT_H -#define CHAISCRIPT_H -namespace chaiscript { - class ChaiScript; -} -#include - -std::unique_ptr getChaiScriptInstance(); - -#endif // CHAISCRIPT_H -////////////////////////////////////////////////////////////////////// - diff --git a/src/chaiscript/math.hpp b/src/chaiscript/math.hpp deleted file mode 100644 index 9d5b2a3..0000000 --- a/src/chaiscript/math.hpp +++ /dev/null @@ -1,809 +0,0 @@ -#include -#include - -#include - -namespace chaiscript { - namespace extras { - namespace math { - // TRIG FUNCTIONS - template - ModulePtr cos(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::cos)), "cos"); - return m; - } - - template - ModulePtr sin(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::sin)), "sin"); - return m; - } - - template - ModulePtr tan(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::tan)), "tan"); - return m; - } - - template - ModulePtr acos(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::acos)), "acos"); - return m; - } - - template - ModulePtr asin(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::asin)), "asin"); - return m; - } - - template - ModulePtr atan(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::atan)), "atan"); - return m; - } - - template - ModulePtr atan2(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::atan2)), "atan2"); - return m; - } - - // HYPERBOLIC FUNCTIONS - template - ModulePtr cosh(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::cosh)), "cosh"); - return m; - } - - template - ModulePtr sinh(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::sinh)), "sinh"); - return m; - } - - template - ModulePtr tanh(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::tanh)), "tanh"); - return m; - } - - template - ModulePtr acosh(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::acosh)), "acosh"); - return m; - } - - template - ModulePtr asinh(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::asinh)), "asinh"); - return m; - } - - template - ModulePtr atanh(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::atanh)), "atanh"); - return m; - } - - // EXPONENTIAL AND LOGARITHMIC FUNCTIONS - template - ModulePtr exp(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::exp)), "exp"); - return m; - } - - template - ModulePtr frexp(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::frexp)), "frexp"); - return m; - } - - template - ModulePtr ldexp(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::ldexp)), "ldexp"); - return m; - } - - template - ModulePtr log(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::log)), "log"); - return m; - } - - template - ModulePtr log10(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::log10)), "log10"); - return m; - } - - template - ModulePtr modf(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::modf)), "modf"); - return m; - } - template - ModulePtr exp2(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::exp2)), "exp2"); - return m; - } - - template - ModulePtr expm1(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::expm1)), "expm1"); - return m; - } - - template - ModulePtr ilogb(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::ilogb)), "ilogb"); - return m; - } - - template - ModulePtr log1p(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::log1p)), "log1p"); - return m; - } - - template - ModulePtr log2(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::log2)), "log2"); - return m; - } - - template - ModulePtr logb(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::logb)), "logb"); - return m; - } - - template - ModulePtr scalbn(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::scalbn)), "scalbn"); - return m; - } - - template - ModulePtr scalbln(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::scalbln)), "scalbln"); - return m; - } - - // POWER FUNCTIONS - template - ModulePtr pow(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::pow)), "pow"); - return m; - } - - template - ModulePtr sqrt(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::sqrt)), "sqrt"); - return m; - } - - template - ModulePtr cbrt(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::cbrt)), "cbrt"); - return m; - } - - template - ModulePtr hypot(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::hypot)), "hypot"); - return m; - } - - // ERROR AND GAMMA FUNCTIONS - template - ModulePtr erf(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::erf)), "erf"); - return m; - } - - template - ModulePtr erfc(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::erfc)), "erfc"); - return m; - } - - template - ModulePtr tgamma(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::tgamma)), "tgamma"); - return m; - } - - template - ModulePtr lgamma(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::lgamma)), "lgamma"); - return m; - } - - // ROUNDING AND REMAINDER FUNCTIONS - template - ModulePtr ceil(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::ceil)), "ceil"); - return m; - } - - template - ModulePtr floor(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::floor)), "floor"); - return m; - } - - template - ModulePtr fmod(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::fmod)), "fmod"); - return m; - } - - template - ModulePtr trunc(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::trunc)), "trunc"); - return m; - } - - template - ModulePtr round(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::round)), "round"); - return m; - } - - template - ModulePtr lround(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::lround)), "lround"); - return m; - } - - // long long ints do not work - template - ModulePtr llround(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::llround)), "llround"); - return m; - } - - template - ModulePtr rint(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::rint)), "rint"); - return m; - } - - template - ModulePtr lrint(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::lrint)), "lrint"); - return m; - } - - // long long ints do not work - template - ModulePtr llrint(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::llrint)), "llrint"); - return m; - } - - template - ModulePtr nearbyint(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::nearbyint)), "nearbyint"); - return m; - } - - template - ModulePtr remainder(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::remainder)), "remainder"); - return m; - } - - template - ModulePtr remquo(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::remquo)), "remquo"); - return m; - } - - // FLOATING-POINT MANIPULATION FUNCTIONS - template - ModulePtr copysign(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::copysign)), "copysign"); - return m; - } - - template - ModulePtr nan(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::nan)), "nan"); - return m; - } - - template - ModulePtr nextafter(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::nextafter)), "nextafter"); - return m; - } - - template - ModulePtr nexttoward(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::nexttoward)), "nexttoward"); - return m; - } - - // MINIMUM, MAXIMUM, DIFFERENCE FUNCTIONS - template - ModulePtr fdim(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::fdim)), "fdim"); - return m; - } - - template - ModulePtr fmax(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::fmax)), "fmax"); - return m; - } - - template - ModulePtr fmin(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::fmin)), "fmin"); - return m; - } - - // OTHER FUNCTIONS - template - ModulePtr fabs(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::fabs)), "fabs"); - return m; - } - - template - ModulePtr abs(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::abs)), "abs"); - return m; - } - - template - ModulePtr fma(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::fma)), "fma"); - return m; - } - - // CLASSIFICATION FUNCTIONS - template - ModulePtr fpclassify(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::fpclassify)), "fpclassify"); - return m; - } - - template - ModulePtr isfinite(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::isfinite)), "isfinite"); - return m; - } - - template - ModulePtr isinf(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::isinf)), "isinf"); - return m; - } - - template - ModulePtr isnan(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::isnan)), "isnan"); - return m; - } - - template - ModulePtr isnormal(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::isnormal)), "isnormal"); - return m; - } - - template - ModulePtr signbit(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::signbit)), "signbit"); - return m; - } - - - // COMPARISON FUNCTIONS - template - ModulePtr isgreater(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::isgreater)), "isgreater"); - return m; - } - - template - ModulePtr isgreaterequal(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::isgreaterequal)), "isgreaterequal"); - return m; - } - - template - ModulePtr isless(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::isless)), "isless"); - return m; - } - - template - ModulePtr islessequal(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::islessequal)), "islessequal"); - return m; - } - - template - ModulePtr islessgreater(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::islessgreater)), "islessgreater"); - return m; - } - - template - ModulePtr isunordered(ModulePtr m = std::make_shared()) - { - m->add(chaiscript::fun(static_cast(&std::isunordered)), "isunordered"); - return m; - } - - ModulePtr bootstrap(ModulePtr m = std::make_shared()) - { - // TRIG FUNCTIONS - cos(m); - cos(m); - cos(m); - - sin(m); - sin(m); - sin(m); - - tan(m); - tan(m); - tan(m); - - acos(m); - acos(m); - acos(m); - - asin(m); - asin(m); - asin(m); - - atan(m); - atan(m); - atan(m); - - atan2(m); - atan2(m); - atan2(m); - - // HYPERBOLIC FUNCTIONS - cosh(m); - cosh(m); - cosh(m); - - sinh(m); - sinh(m); - sinh(m); - - tanh(m); - tanh(m); - tanh(m); - - acosh(m); - acosh(m); - acosh(m); - - asinh(m); - asinh(m); - asinh(m); - - atanh(m); - atanh(m); - atanh(m); - - // EXPONENTIAL AND LOGARITHMIC FUNCTIONS - exp(m); - exp(m); - exp(m); - - frexp(m); - frexp(m); - frexp(m); - - ldexp(m); - ldexp(m); - ldexp(m); - - log(m); - log(m); - log(m); - - log10(m); - log10(m); - log10(m); - - modf(m); - modf(m); - modf(m); - - exp2(m); - exp2(m); - exp2(m); - - expm1(m); - expm1(m); - expm1(m); - - ilogb(m); - ilogb(m); - ilogb(m); - - log1p(m); - log1p(m); - log1p(m); - - log2(m); - log2(m); - log2(m); - - logb(m); - logb(m); - logb(m); - - scalbn(m); - scalbn(m); - scalbn(m); - - scalbln(m); - scalbln(m); - scalbln(m); - - // POWER FUNCTIONS - pow(m); - pow(m); - pow(m); - - sqrt(m); - sqrt(m); - sqrt(m); - - cbrt(m); - cbrt(m); - cbrt(m); - - hypot(m); - hypot(m); - hypot(m); - - // ERROR AND GAMMA FUNCTIONS - erf(m); - erf(m); - erf(m); - - erfc(m); - erfc(m); - erfc(m); - - tgamma(m); - tgamma(m); - tgamma(m); - - lgamma(m); - lgamma(m); - lgamma(m); - - // ROUNDING AND REMAINDER FUNCTIONS - ceil(m); - ceil(m); - ceil(m); - - floor(m); - floor(m); - floor(m); - - fmod(m); - fmod(m); - fmod(m); - - trunc(m); - trunc(m); - trunc(m); - - round(m); - round(m); - round(m); - - lround(m); - lround(m); - lround(m); - - // long long ints do not work - llround(m); - llround(m); - llround(m); - - rint(m); - rint(m); - rint(m); - - lrint(m); - lrint(m); - lrint(m); - - // long long ints do not work - llrint(m); - llrint(m); - llrint(m); - - nearbyint(m); - nearbyint(m); - nearbyint(m); - - remainder(m); - remainder(m); - remainder(m); - - remquo(m); - remquo(m); - remquo(m); - - // FLOATING-POINT MANIPULATION FUNCTIONS - copysign(m); - copysign(m); - copysign(m); - - nan(m); - - nextafter(m); - nextafter(m); - nextafter(m); - - nexttoward(m); - nexttoward(m); - nexttoward(m); - - // MINIMUM, MAXIMUM, DIFFERENCE FUNCTIONS - fdim(m); - fdim(m); - fdim(m); - - fmax(m); - fmax(m); - fmax(m); - - fmin(m); - fmin(m); - fmin(m); - - // OTHER FUNCTIONS - fabs(m); - fabs(m); - fabs(m); - - abs(m); - abs(m); - abs(m); - - fma(m); - fma(m); - fma(m); - - // CLASSIFICATION FUNCTIONS - fpclassify(m); - fpclassify(m); - fpclassify(m); - - isfinite(m); - isfinite(m); - isfinite(m); - - isinf(m); - isinf(m); - isinf(m); - - isnan(m); - isnan(m); - isnan(m); - - isnormal(m); - isnormal(m); - isnormal(m); - - signbit(m); - signbit(m); - signbit(m); - - // COMPARISON FUNCTIONS - isgreater(m); - isgreater(m); - isgreater(m); - - isgreaterequal(m); - isgreaterequal(m); - isgreaterequal(m); - - isless(m); - isless(m); - isless(m); - - islessequal(m); - islessequal(m); - islessequal(m); - - islessgreater(m); - islessgreater(m); - islessgreater(m); - - isunordered(m); - isunordered(m); - isunordered(m); - - return m; - } - } - } -} diff --git a/src/duct/duct.cpp b/src/duct/duct.cpp index fc39f21..da0f6f2 100644 --- a/src/duct/duct.cpp +++ b/src/duct/duct.cpp @@ -346,7 +346,7 @@ void Duct::exportHDF5(const hid_t group_id) const { PosData S; S.name = "Cross-sectional area"; - S.unit = "m^2"; + S.unit = "m$^2$"; S.symbol = "S"; S.x = this->S; S.exportHDF5(group_id); diff --git a/src/tasmet_constants.h b/src/tasmet_constants.h index d136e52..1c71748 100644 --- a/src/tasmet_constants.h +++ b/src/tasmet_constants.h @@ -14,25 +14,25 @@ // Unfortunately to let the code compile with Swig v 2.0, strongly // typed enums are not supported. Therefore this is a normal // enumerated type and not an enum class. -DECLARE_ENUM(Varnr, - none, // None - rho, // Density - m, // Mass flow (rho*U) - T, // Temperature - p, // Pressure - Ts, // Temperature of the solid - Tw, // Temperature of the solid wall - mH, // Enthalpy flow (Watts) - U, // Volume flow (m^3/s) - u, // Velocity (U/Sf) - mu, // Momentum flux - Q, // Heat flow - Qs, // Solid heat Flow - F, // A mechanical domain force [N] - x, // A mechanical displacement [m] - Z, // A mechanical impedance [N/m] - mEkin // Kinetic energy flow (Watts) - ); +// DECLARE_ENUM(Varnr, +// none, // None +// rho, // Density +// m, // Mass flow (rho*U) +// T, // Temperature +// p, // Pressure +// Ts, // Temperature of the solid +// Tw, // Temperature of the solid wall +// mH, // Enthalpy flow (Watts) +// U, // Volume flow (m^3/s) +// u, // Velocity (U/Sf) +// mu, // Momentum flux +// Q, // Heat flow +// Qs, // Solid heat Flow +// F, // A mechanical domain force [N] +// x, // A mechanical displacement [m] +// Z, // A mechanical impedance [N/m] +// mEkin // Kinetic energy flow (Watts) +// ); DECLARE_ENUM(Pos,posleft,posright); diff --git a/src/tasmet_evalscript.cpp b/src/tasmet_evalscript.cpp index 494f1d2..ff2aae8 100644 --- a/src/tasmet_evalscript.cpp +++ b/src/tasmet_evalscript.cpp @@ -5,85 +5,85 @@ // Description: // ////////////////////////////////////////////////////////////////////// - +// #define TRACERPLUS 16 #include "tasmet_evalscript.h" -#include -#include "chaiscript.h" #include "tasmet_exception.h" #include "tasmet_tracer.h" #include -using chaiscript::ChaiScript; -using std::stringstream; +#include -template -inline T wrap_eval(ChaiScript* chai,const string& script) { - try { - return chai->eval(script); - } - catch(chaiscript::exception::eval_error &e) { - TRACE(15,script); - throw TaSMETError(e.what()); - } - catch(std::bad_cast &e) { - TRACE(15,script); - throw TaSMETError("Cannot get return value from script"); - } - -} -template<> -inline void wrap_eval(ChaiScript* chai,const string& script) { - try { - chai->eval(script); - } - catch(std::runtime_error &e) { - TRACE(15,script); - throw TaSMETError(e.what()); - } - catch(std::bad_cast &e) { - TRACE(15,script); - throw TaSMETError("Cannot get return value from script"); - } - -} +const int vector_prealloc = 30; EvaluateFun::EvaluateFun(const string& fun_return, const string& err_msg, - const string& vars): + const string& var): _err_msg(err_msg), _fun_return(fun_return) { - TRACE(15,"EvaluateFun::EvaluateFun()"); - _chai = getChaiScriptInstance(); - if(!_chai) throw TaSMETBadAlloc(); - string script = string("def myfun(") + vars + ") {\n"; - script += "return " + fun_return + "; }\n"; - - wrap_eval(_chai.get(),script); + TRACE(15,"EvaluateFun::EvaluateFun()"); + + _parser = new mu::Parser(); + if(!_parser) throw TaSMETBadAlloc(); + + /** + * It is imperative to put a reserve operation here, which + * preallocates enough space in the vector. Otherwise a + * reallocation may invalidate the pointers which the parser + * points to. + * + */ + _values.reserve(vector_prealloc); + + _values.push_back(0); // This is the (x), or (t) + + // Add pi, as it unfortunately does not exist + _values.push_back(number_pi); + try { + _parser->DefineVar(var,&_values[0]); + _parser->DefineVar("pi",&_values[1]); + _parser->SetExpr(fun_return); + } + catch(mu::Parser::exception_type& e) { + TRACE(15,e.GetMsg()); + throw TaSMETError(_err_msg); + } } void EvaluateFun::addGlobalDef(const string& name,const d value) { TRACE(15,"EvaluateFun::addGlobalDef()"); - - _chai->add_global(chaiscript::var(value),name); + if(_values.size() == vector_prealloc -1) + throw TaSMETError("Too many definitions"); + + _values.push_back(value); + try { + _parser->DefineVar(name,&_values[_values.size()-1]); + } + catch(mu::Parser::exception_type& e) { + TRACE(15,e.GetMsg()); + throw TaSMETError(_err_msg); + } } vd EvaluateFun::operator()(const vd& x) { TRACE(15,"EvaluateFun::operator(vd)"); vd y(x.size()); for(us i=0;i(_chai.get(),value.str()); - + _values[0] = x[i]; + VARTRACE(15,_values[0]); + try { + y(i) = _parser->Eval(); + } + catch(mu::Parser::exception_type& e) { + TRACE(15,e.GetMsg()); + throw TaSMETError(_err_msg); + } } return y; } EvaluateFun::~EvaluateFun() { - + delete _parser; } diff --git a/src/tasmet_evalscript.h b/src/tasmet_evalscript.h index da26eaf..b668969 100644 --- a/src/tasmet_evalscript.h +++ b/src/tasmet_evalscript.h @@ -13,24 +13,50 @@ #include "tasmet_types.h" #include -namespace chaiscript { - class ChaiScript; +namespace mu { + class Parser; } - // Helper class to evaluate simple 1D math function evaluations in Python class EvaluateFun { - std::unique_ptr _chai; string _err_msg; string _fun_return; + mu::Parser* _parser = nullptr; + std::vector _values; public: - EvaluateFun(const string& fun_return,const string& err_msg = "Script error",const string& vars = "x"); + /** + * Construct a new function evaluator + * + * @param fun_return what the function should return + * (e.g. sin(x)). + * + * @param err_msg The exception message that + * should be thrown in case something goes wrong. + * + * @param var The variable on which the function depends (e.g. x, + * or t) + */ + EvaluateFun(const string& fun_return, + const string& err_msg = "Script error", + const string& var = "x"); - // Add a global definition to the namespace + /** + * Add a global parameter to the namespace. + * + * @param name + * @param value + */ void addGlobalDef(const string& name, const d value); - // Evaluate a single function at multiple points and return - // the result for each point + /** + * Evaluate the function at multiple points and return + * the result for each point + * + * @param points: the x-values, or t-values where to evaluate the + * function. + * + * @return the results of the function evalated at the points + */ vd operator()(const vd& points); // Used to cleanup the python namespace