All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Pages
sinusoidal_function.h
1 /* Copyright (C) 2004-2014 MBSim Development Team
2  *
3  * This library is free software; you can redistribute it and/or
4  * modify it under the terms of the GNU Lesser General Public
5  * License as published by the Free Software Foundation; either
6  * version 2.1 of the License, or (at your option) any later version.
7  *
8  * This library is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  * Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public
14  * License along with this library; if not, write to the Free Software
15  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16  *
17  * Contact: martin.o.foerg@gmail.com
18  */
19 
20 #ifndef _SINUSOIDAL_FUNCTION_H_
21 #define _SINUSOIDAL_FUNCTION_H_
22 
23 #include "mbsim/functions/function.h"
24 
25 namespace MBSim {
26 
27  template<typename Sig> class SinusoidalFunction;
28 
29  template<typename Ret, typename Arg>
30  class SinusoidalFunction<Ret(Arg)> : public Function<Ret(Arg)> {
32  protected:
33  double A, f, phi0, y0;
34  public:
35  SinusoidalFunction(double A_=0, double f_=0, double phi0_=0, double y0_=0) : A(A_), f(f_), phi0(phi0_), y0(y0_) { }
36  Ret operator()(const Arg &x) {
37  return FromDouble<Ret>::cast(y0+A*sin(2.*M_PI*f*ToDouble<Arg>::cast(x)+phi0));
38  }
39  typename B::DRetDArg parDer(const Arg &x) {
40  double om = 2.*M_PI*f;
41  return FromDouble<Ret>::cast(A*om*cos(om*ToDouble<Arg>::cast(x)+phi0));
42  }
43  typename B::DRetDArg parDerDirDer(const Arg &xDir, const Arg &x) {
44  double om = 2.*M_PI*f;
45  return FromDouble<Ret>::cast(-A*om*om*sin(om*ToDouble<Arg>::cast(x)+phi0)*ToDouble<Arg>::cast(xDir));
46  }
47  Ret parDerParDer(const double &x) {
48  double om = 2.*M_PI*f;
49  return FromDouble<Ret>::cast(-A*om*om*sin(om*x+phi0));
50  }
51  void initializeUsingXML(xercesc::DOMElement *element) {
52  xercesc::DOMElement *e=MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%"amplitude");
53  A=Element::getDouble(e);
54  e=MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%"frequency");
55  f=Element::getDouble(e);
56  e=MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%"phase");
57  if(e) phi0=Element::getDouble(e);
58  e=MBXMLUtils::E(element)->getFirstElementChildNamed(MBSIM%"offset");
59  if(e) y0=Element::getDouble(e);
60  }
61  };
62 
63 }
64 
65 #endif
Definition: sinusoidal_function.h:27
Definition: utils.h:153
Definition: utils.h:197
Definition: planar_contour.h:31

Impressum / Disclaimer / Datenschutz Generated by doxygen 1.8.5 Valid HTML