20#ifndef _FOURIER_FUNCTION_H_
21#define _FOURIER_FUNCTION_H_
23#include "mbsim/functions/function.h"
24#include "mbsim/utils/utils.h"
30 template<
typename Ret,
typename Arg>
32 using B = fmatvec::Function<Ret(Arg)>;
36 FourierFunction(
double f_,
const fmatvec::VecV &a_,
const fmatvec::VecV &b_,
double a0_=0,
bool amplitudePhaseAngleForm_=
false) : f(f_), a0(a0_), a(a_), b(b_), amplitudePhaseAngleForm(amplitudePhaseAngleForm_) { }
37 void setFrequency(
double f_) { f = f_; }
38 void seta0(
double a0_) { a0 = a0_; }
39 void seta(
const fmatvec::VecV &a_) { a <<= a_; }
40 void setb(
const fmatvec::VecV &b_) { b <<= b_; }
41 void setab(
const fmatvec::MatV &ab) {
42 assert(ab.cols() == 2);
46 void setAmplitudePhaseAngleForm(
bool amplitudePhaseAngleForm_) { amplitudePhaseAngleForm = amplitudePhaseAngleForm_; }
47 int getArgSize()
const override {
return 1; }
48 std::pair<int, int> getRetSize()
const override {
return std::make_pair(1,1); }
49 Ret operator()(
const Arg& t_)
override {
52 double Om = 2.*M_PI*f;
53 for(
int i=0; i<a.size(); i++) {
56 y += a(i)*cos(phi)+b(i)*sin(phi);
60 typename B::DRetDArg parDer(
const Arg &t_)
override {
63 double Om = 2.*M_PI*f;
64 for(
int i=0; i<a.size(); i++) {
67 yd += k*Om*(b(i)*cos(phi)-a(i)*sin(phi));
71 void initializeUsingXML(xercesc::DOMElement * element)
override {
72 xercesc::DOMElement *e=MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"frequency");
73 f=MBXMLUtils::E(e)->getText<
double>();
74 e=MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"a0");
75 if(e) a0=MBXMLUtils::E(e)->getText<
double>();
76 e = MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"a");
78 seta(MBXMLUtils::E(e)->getText<fmatvec::Vec>());
79 e = MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"b");
80 setb(MBXMLUtils::E(e)->getText<fmatvec::Vec>());
82 e = MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"ab");
83 if(e) setab(MBXMLUtils::E(e)->getText<fmatvec::Mat>());
84 e = MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%
"amplitudePhaseForm");
85 if(e) amplitudePhaseAngleForm = MBXMLUtils::E(e)->getText<
bool>();
88 Function<Ret(Arg)>::init(stage, config);
90 if(amplitudePhaseAngleForm) {
91 for(
int i=0; i<a.size(); i++) {
103 bool amplitudePhaseAngleForm;
InitStage
The stages of the initialization.
Definition: element.h:62
@ preInit
Definition: element.h:64
void init(Element::InitStage stage, const InitConfigSet &config) override
plots time series header
Definition: fourier_function.h:87
Definition: fourier_function.h:28
Definition: function.h:53
namespace MBSim
Definition: bilateral_constraint.cc:30