SIMLIB/C++  3.07
simlib2D.h
Go to the documentation of this file.
1 /////////////////////////////////////////////////////////////////////////////
2 //! \file simlib2D.h 2D vector block extension
3 //! \defgroup simlib2D SIMLIB/C++ 2D extension
4 //
5 // Copyright (c) 1997-2004 Petr Peringer
6 //
7 // This library is licensed under GNU Library GPL. See the file COPYING.
8 //
9 
10 //
11 // the SIMLIB/2D extension
12 //
13 // Warning: beta version -- this is the prototype
14 //
15 
16 #ifndef __SIMLIB2D_H
17 #define __SIMLIB2D_H
18 
19 #ifndef __SIMLIB__
20 # error "simlib2D.h: 20: you must include simlib.h first"
21 #endif
22 #if __SIMLIB__ < 0x0212
23 # error "simlib2D.h: 23: requires SIMLIB version 2.12 and higher"
24 #endif
25 
26 namespace simlib3 {
27 
28 ////////////////////////////////////////////////////////////////////////////
29 //! 2D vector value
30 //! \ingroup simlib2D
31 class Value2D {
32  double _x, _y;
33  public:
34  Value2D(double x, double y) : _x(x), _y(y) {}
35  double x() const { return _x; }
36  double y() const { return _y; }
37 
38  // using default copy constructor, destructor, and operator =
39 
40  Value2D operator + (Value2D b) { return Value2D(_x+b._x, _y+b._y); }
41  Value2D operator - (Value2D b) { return Value2D(_x-b._x, _y-b._y); }
42  void Print() { ::Print(" %g %g ", _x, _y); }
43 
44  // utilities:
45  friend double abs(const Value2D &a);
46  friend Value2D operator +(const Value2D& a, const Value2D &b);
47  friend Value2D operator -(const Value2D& a, const Value2D &b);
48  friend Value2D operator -(const Value2D& a);
49  friend Value2D operator *(const Value2D& a, const double b);
50  friend Value2D operator *(const double a, const Value2D& b);
51  friend double scalar_product(const Value2D& a, const Value2D &b);
52  friend Value2D operator /(const Value2D& a, const double b);
53 
54 };
55 
56 
57 ////////////////////////////////////////////////////////////////////////////
58 //! Abstract 2D block with single 2D output
59 //! \ingroup simlib2D
60 class aContiBlock2D : public aBlock { // abstract continuous block
61  protected:
62  bool isEvaluated; // flag for loop checking ###---
63  private:
64  virtual void Eval() {}; // evaluate without loop detection
65  public:
66  aContiBlock2D();
67  ~aContiBlock2D();
68  virtual void _Eval(); // evaluate with loop detection
69  virtual Value2D Value() = 0; // output value
70  void Print(); // print value
71 };
72 
73 ////////////////////////////////////////////////////////////////////////////
74 //! 2D vector value that can't be changed
75 //! \ingroup simlib2D
76 class Constant2D : public aContiBlock2D {
77  const Value2D value;
78  public:
79  explicit Constant2D(Value2D x) : value(x) {}
80  explicit Constant2D(double x, double y) : value(x,y) {}
81  virtual Value2D Value() override { return value; } // without Eval
82 };
83 
84 ////////////////////////////////////////////////////////////////////////////
85 //! 2D vector variable
86 //! \ingroup simlib2D
87 class Variable2D : public aContiBlock2D {
88  protected:
90  public:
91  explicit Variable2D(Value2D x=Value2D(0,0)) : value(x) {}
92  Variable2D &operator= (Value2D x) { value = x; return *this; }
93  // TODO: operator=
94  virtual Value2D Value() override { return value; }
95 };
96 
97 ////////////////////////////////////////////////////////////////////////////
98 //! Special variable (can't be changed at simulation time)
99 //! \ingroup simlib2D
100 class Parameter2D : public Variable2D {
101  public:
102  explicit Parameter2D(Value2D x=Value2D(0,0)) : Variable2D(x) {}
103  Parameter2D &operator= (const Value2D &x);
104 };
105 
106 ////////////////////////////////////////////////////////////////////////////
107 //! Continuous block connection (transparent reference)
108 //! \ingroup simlib2D
109 class Input2D { // small objects, without virtual methods
111  public:
112  Input2D&operator=(const Input2D&x) { bp=x.bp; return *this; }
113  Input2D(const Input2D &in): bp(in.bp) {} // copy reference
114  Input2D(aContiBlock2D &cb): bp(&cb) {} // reference to 2D block
115  Input2D(aContiBlock2D *cb): bp(cb) {} // pointer to 2D block
116  Input2D Set(Input2D i) { Input2D p=bp; bp=i.bp; return p; }
117  Value2D Value() { return bp->Value(); } // get value
118  bool operator ==(void *p) { return bp==p; } // for tests only!
119 };
120 
121 ////////////////////////////////////////////////////////////////////////////
122 //! continuous block with single input and alg. loop check
123 //! \ingroup simlib2D
126  public:
127  explicit aContiBlock2D1(Input2D i);
128  Value2D InputValue() { return input.Value(); }
129  Input2D SetInput(Input2D i) { return input.Set(i); }
130 };
131 
132 ////////////////////////////////////////////////////////////////////////////
133 //! Reference to 2D vector block-expression
134 //! \ingroup simlib2D
135 struct Expression2D : public aContiBlock2D1 {
136  explicit Expression2D(Input2D i) : aContiBlock2D1(i) {}
137  Value2D Value() override { return InputValue(); }
138 };
139 
140 ////////////////////////////////////////////////////////////////////////////
141 //! continuous block vith 2 inputs and alg. loop check
142 //! \ingroup simlib2D
146  public:
148  Value2D Input1Value() { return input1.Value(); }
149  Value2D Input2Value() { return input2.Value(); }
150 };
151 
152 ////////////////////////////////////////////////////////////////////////////
153 //! continuous block with 3 inputs and alg. loop check
154 //! \ingroup simlib2D
157  public:
159  Value2D Input3Value() { return input3.Value(); }
160 };
161 
162 
163 ////////////////////////////////////////////////////////////////////////////
164 //! Convert 2 scalar inputs to single 2D vector output
165 //! \ingroup simlib2D
166 class Adaptor2D : public aContiBlock2D {
168  public:
169  Adaptor2D(Input _x, Input _y) : x(_x), y(_y) {}
170  virtual Value2D Value() override {
171  return Value2D( x.Value(), y.Value() );
172  }
173 };
174 
175 
176 ////////////////////////////////////////////////////////////////////////////
177 //! 2D vector integrator
178 //! \ingroup simlib2D
179 class Integrator2D : public aContiBlock2D {
180  Integrator _x,_y; // 1D standard integrators
181 
182  // special_input transforms 2D values into 2 scalar values
183  class special_input : public aContiBlock {
184  Value2D a; // temporary value
185  Input2D in; // 2D input
186  int count; // # of evaluations
187  public:
188  special_input(Input2D i) : a(0,0), in(i), count(0) {}
189  double Value() override; // expects 2 subsequent evaluations
190  friend class Integrator2D;
191  } in;
192 
193  public:
194  Integrator2D(Input2D i, Value2D initial_value);
196  Integrator2D(Integrator2D &i, Value2D initial_value=Value2D(0,0));
197  Integrator2D(); // for arrays: implicit input value (0,0)
198 
199  Input2D SetInput(Input2D i) { return in.in.Set(i); }
200 
201  Integrator2D &operator = (const Value2D &a);
202  Integrator2D &operator = (Input2D i);
203 
204  virtual Value2D Value() override; // 2D output
205 };
206 
207 
208 ////////////////////////////////////////////////////////////////////////////
209 // Continuous block arithmetic operators
210 //
211 
212 // binary operators:
213 Input2D operator + (Input2D a, Input2D b); // add vectors
214 Input2D operator - (Input2D a, Input2D b); // subtract vectors
215 Input2D operator * (Input2D a, Input b); // vector * scalar
216 Input2D operator * (Input a, Input2D b); // scalar * vector
217 Input2D operator / (Input2D a, Input b); // vector / scalar
218 
219 // unary operators:
220 Input2D operator - (Input2D a); // unary -
221 
222 //! absolute value of vector (1D block)
223 Input Abs(Input2D x);
224 
225 //! make unit vector from input (Abs(output_vec)==1)
227 
228 //! dot product: xvec . yvec
230 
231 //! get x part of (x,y) vector value
232 Input Xpart(Input2D a);
233 
234 //! get y part of (x,y) vector value
235 Input Ypart(Input2D a);
236 
237 inline void Print(Value2D a) { a.Print(); }
238 
239 } // namespace
240 
241 #endif // __SIMLIB2D_H
Convert 2 scalar inputs to single 2D vector output.
Definition: simlib2D.h:166
Input2D SetInput(Input2D i)
Definition: simlib2D.h:129
virtual Value2D Value()=0
2D vector integrator
Definition: simlib2D.h:179
void Print()
Definition: simlib2D.h:42
Abstract 2D block with single 2D output.
Definition: simlib2D.h:60
Input ScalarProduct(Input2D x, Input2D y)
dot product: xvec . yvec
Definition: simlib2D.cc:389
Input2D UnitVector(Input2D x)
make unit vector from input (Abs(output_vec)==1)
Definition: simlib2D.cc:388
continuous block connection (transparent reference) wrapper for pointer to objects of aContiBlock der...
Definition: simlib.h:895
friend double abs(const Value2D &a)
Definition: simlib2D.cc:38
Value2D(double x, double y)
Definition: simlib2D.h:34
continuous block with single input and alg.
Definition: simlib2D.h:124
friend double scalar_product(const Value2D &a, const Value2D &b)
Definition: simlib2D.cc:78
Input2D & operator=(const Input2D &x)
Definition: simlib2D.h:112
double Value() const
get target block value
Definition: simlib.h:931
2D vector value that can&#39;t be changed
Definition: simlib2D.h:76
virtual Value2D Value() override
Definition: simlib2D.h:170
Variable2D(Value2D x=Value2D(0, 0))
Definition: simlib2D.h:91
virtual void Eval()
Definition: simlib2D.h:64
Implementation of class CalendarList interface is static - using global functions in SQS namespace...
Definition: algloop.cc:32
continuous block vith 2 inputs and alg.
Definition: simlib2D.h:143
Input2D(aContiBlock2D &cb)
Definition: simlib2D.h:114
virtual Value2D Value() override
Definition: simlib2D.h:81
Adaptor2D(Input _x, Input _y)
Definition: simlib2D.h:169
const Value2D value
Definition: simlib2D.h:77
Expression2D(Input2D i)
Definition: simlib2D.h:136
Input Xpart(Input2D a)
get x part of (x,y) vector value
Definition: simlib2D.cc:420
Value2D operator-(Value2D b)
Definition: simlib2D.h:41
double x() const
Definition: simlib2D.h:35
bool operator==(const ParameterVector &p1, const ParameterVector &p2)
Definition: opt-param.cc:86
Constant2D(Value2D x)
Definition: simlib2D.h:79
abstract base for continuous blocks with single output suitable for expression-tree building and eval...
Definition: simlib.h:832
Value2D Value()
Definition: simlib2D.h:117
aContiBlock2D * bp
Definition: simlib2D.h:110
Input Abs(Input x)
Definition: fun.cc:94
Input2D(const Input2D &in)
Definition: simlib2D.h:113
Value2D operator+(Value2D b)
Definition: simlib2D.h:40
2D vector variable
Definition: simlib2D.h:87
Input Ypart(Input2D a)
get y part of (x,y) vector value
Definition: simlib2D.cc:421
virtual Value2D Value() override
Definition: simlib2D.h:94
Special variable (can&#39;t be changed at simulation time)
Definition: simlib2D.h:100
Input2D(aContiBlock2D *cb)
Definition: simlib2D.h:115
double y() const
Definition: simlib2D.h:36
Continuous block connection (transparent reference)
Definition: simlib2D.h:109
abstract base class for all blocksblocks/SimObject have not copy semantics (TODO: add move semantics)...
Definition: simlib.h:825
continuous block with 3 inputs and alg.
Definition: simlib2D.h:155
Reference to 2D vector block-expression.
Definition: simlib2D.h:135
Input2D Set(Input2D i)
Definition: simlib2D.h:116
friend Value2D operator*(const Value2D &a, const double b)
Definition: simlib2D.cc:68
Constant2D(double x, double y)
Definition: simlib2D.h:80
block for numerical integration input is derivative, output is state
Definition: simlib.h:1288
2D vector value
Definition: simlib2D.h:31
friend Value2D operator/(const Value2D &a, const double b)
Definition: simlib2D.cc:83
Input2D SetInput(Input2D i)
Definition: simlib2D.h:199
Parameter2D(Value2D x=Value2D(0, 0))
Definition: simlib2D.h:102
Value2D Value() override
Definition: simlib2D.h:137