20#ifndef _TABULAR_FUNCTION_H_
21#define _TABULAR_FUNCTION_H_
23#include "mbsim/functions/function.h"
24#include "mbsim/utils/utils.h"
30 template<
typename Ret,
typename Arg>
35 TabularFunction(
const fmatvec::VecV &x_,
const fmatvec::MatV &y_) : x(x_), y(y_), xIndexOld(0) { }
36 int getArgSize()
const override {
return 1; }
37 std::pair<int, int> getRetSize()
const override {
return std::make_pair(y.cols(),1); }
38 Ret operator()(
const Arg& xVal_)
override {
45 else if (xVal >= x(x.size() - 1)) {
46 xIndexOld = x.size() - 1;
49 else if (xVal <= x(i)) {
60 return FromVecV<Ret>::cast(trans(y.row(i) + (xVal - x(i)) * (y.row(i + 1) - y.row(i)) / (x(i + 1) - x(i))));
62 void initializeUsingXML(xercesc::DOMElement * element)
override {
63 xercesc::DOMElement *e = MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"x");
65 setx(MBXMLUtils::E(e)->getText<fmatvec::Vec>());
66 e = MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"y");
67 sety(MBXMLUtils::E(e)->getText<fmatvec::Mat>(x.size(), 0));
69 e = MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"xy");
70 if (e) setxy(MBXMLUtils::E(e)->getText<fmatvec::Mat>());
72 void setx(
const fmatvec::VecV &x_) { x <<= x_; }
73 void sety(
const fmatvec::MatV &y_) { y <<= y_; }
74 void setxy(
const fmatvec::MatV &xy) {
76 this->throwError(
"Dimension missmatch in size of xy");
78 y <<= xy(fmatvec::RangeV(0, xy.rows() - 1), fmatvec::RangeV(1, xy.cols() - 1));
81 Function<Ret(Arg)>::init(stage, config);
83 for(
int i=1; i<x.size(); i++)
85 this->throwError(
"Values of x must be strictly monotonic increasing!");
86 if(y.rows() != x.size())
87 this->throwError(
"Dimension missmatch in size of x");
InitStage
The stages of the initialization.
Definition: element.h:62
@ preInit
Definition: element.h:64
Definition: function.h:53
void init(Element::InitStage stage, const InitConfigSet &config) override
plots time series header
Definition: tabular_function.h:80
Definition: tabular_function.h:28
namespace MBSim
Definition: bilateral_constraint.cc:30