SIMLIB/C++  3.07
simlib3D.h
Go to the documentation of this file.
1 /////////////////////////////////////////////////////////////////////////////
2 //! \file simlib3D.h 3D vector block extension
3 //! \defgroup simlib3D SIMLIB/C++ 3D 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 experimental SIMLIB/3D extension
12 //
13 // Warning: beta version -- this is the prototype
14 //
15 
16 #ifndef __SIMLIB3D_H
17 #define __SIMLIB3D_H
18 
19 #ifndef __SIMLIB__
20 # error "simlib3D.h: 19: you must include simlib.h first"
21 #endif
22 #if __SIMLIB__ < 0x0212
23 # error "simlib3D.h: 22: requires SIMLIB version 2.12 and higher"
24 #endif
25 
26 namespace simlib3 {
27 
28 ////////////////////////////////////////////////////////////////////////////
29 //! 3D vector value
30 //! \ingroup simlib3D
31 class Value3D {
32  double _x, _y, _z;
33  public:
34  Value3D(double x, double y, double z) : _x(x), _y(y), _z(z) {}
35  double x() const { return _x; }
36  double y() const { return _y; }
37  double z() const { return _z; }
38 
39  // using default copy constructor, destructor, and operator =
40 
41  Value3D operator + (Value3D b) { return Value3D(_x+b._x, _y+b._y, _z+b._z); }
42  Value3D operator - (Value3D b) { return Value3D(_x-b._x, _y-b._y, _z-b._z); }
43  void Print() { ::Print(" %g %g %g ", _x, _y, _z); }
44 
45  // utilities:
46  friend double abs(const Value3D &a);
47  friend Value3D operator +(const Value3D& a, const Value3D &b);
48  friend Value3D operator -(const Value3D& a, const Value3D &b);
49  friend Value3D operator -(const Value3D& a);
50  friend Value3D operator *(const Value3D& a, const Value3D &b);
51  friend Value3D operator *(const Value3D& a, const double b);
52  friend Value3D operator *(const double a, const Value3D& b);
53  friend double scalar_product(const Value3D& a, const Value3D &b);
54  friend Value3D operator /(const Value3D& a, const double b);
55 
56 };
57 
58 
59 ////////////////////////////////////////////////////////////////////////////
60 //! Abstract 3D block with single 3D output
61 //! \ingroup simlib3D
62 class aContiBlock3D : public aBlock { // abstract continuous block
63  protected:
64  bool isEvaluated; // flag for loop checking ###---
65  private:
66  virtual void Eval() {}; // evaluate without loop detection
67  public:
68  aContiBlock3D();
69  ~aContiBlock3D();
70  virtual void _Eval(); // evaluate with loop detection
71  virtual Value3D Value() = 0; // output value
72  void Print(); // print value
73 };
74 
75 ////////////////////////////////////////////////////////////////////////////
76 //! 3D vector value that can't be changed
77 //! \ingroup simlib3D
78 class Constant3D : public aContiBlock3D {
79  const Value3D value;
80  public:
81  explicit Constant3D(const Value3D &x) : value(x) {}
82  explicit Constant3D(double x, double y, double z) : value(x,y,z) {}
83  virtual Value3D Value() override { return value; } // without Eval
84 };
85 
86 ////////////////////////////////////////////////////////////////////////////
87 //! 3D vector variable
88 //! \ingroup simlib3D
89 class Variable3D : public aContiBlock3D {
90  protected:
92  public:
93  explicit Variable3D(const Value3D &x=Value3D(0,0,0)) : value(x) {}
94  Variable3D &operator= (const Value3D &x) { value = x; return *this; }
95  virtual Value3D Value () override { return value; }
96 };
97 
98 ////////////////////////////////////////////////////////////////////////////
99 //! Special variable (can't be changed at simulation time)
100 //! \ingroup simlib3D
101 class Parameter3D : public Variable3D {
102  public:
103  explicit Parameter3D(const Value3D &x=Value3D(0,0,0)) : Variable3D(x) {}
104  Parameter3D &operator= (const Value3D &x);
105 };
106 
107 ////////////////////////////////////////////////////////////////////////////
108 //! Continuous block connection (transparent reference)
109 //! \ingroup simlib3D
110 class Input3D { // small objects, without virtual methods
112  public:
113  Input3D(const Input3D &inp): bp(inp.bp) {} // copy reference
114  Input3D(aContiBlock3D &cb): bp(&cb) {} // reference to 3D block
115  Input3D(aContiBlock3D *cb): bp(cb) {} // pointer to 3D block
116  Input3D&operator=(const Input3D &in) { bp = in.bp; return *this; }
117  Input3D Set(Input3D i) { Input3D p=bp; bp=i.bp; return p; }
118  Value3D Value() { return bp->Value(); } // get value
119  bool operator==(void *p) { return bp==p; } // for tests only!
120 };
121 
122 ////////////////////////////////////////////////////////////////////////////
123 //! continuous 3D block with single input
124 //! \ingroup simlib3D
127  public:
128  explicit aContiBlock3D1(Input3D i);
129  Value3D InputValue() { return input.Value(); }
130  Input3D SetInput(Input3D i) { return input.Set(i); }
131 };
132 
133 ////////////////////////////////////////////////////////////////////////////
134 //! 3D vector block-expression handle
135 //! \ingroup simlib3D
136 struct Expression3D : public aContiBlock3D1 {
137  explicit Expression3D(Input3D i) : aContiBlock3D1(i) {}
138  Value3D Value() override { return InputValue(); }
139 };
140 
141 ////////////////////////////////////////////////////////////////////////////
142 //! continuous block vith 2 inputs and alg. loop check
143 //! \ingroup simlib3D
147  public:
149  Value3D Input1Value() { return input1.Value(); }
150  Value3D Input2Value() { return input2.Value(); }
151 };
152 
153 ////////////////////////////////////////////////////////////////////////////
154 //! continuous block with 3 inputs and alg. loop check
155 //! \ingroup simlib3D
158  public:
160  Value3D Input3Value() { return input3.Value(); }
161 };
162 
163 
164 ////////////////////////////////////////////////////////////////////////////
165 //! Converts 3 scalar inputs to single 3D vector output
166 //! \ingroup simlib3D
167 class Adaptor3D : public aContiBlock3D {
168  Input x, y, z;
169  public:
170  Adaptor3D(Input _x, Input _y, Input _z) : x(_x), y(_y), z(_z) {}
171  virtual Value3D Value() override {
172  return Value3D( x.Value(), y.Value(), z.Value() );
173  }
174 };
175 
176 
177 ////////////////////////////////////////////////////////////////////////////
178 //! 3D vector integrator
179 //! \ingroup simlib3D
180 class Integrator3D : public aContiBlock3D {
181  Integrator _x,_y,_z; // 1D standard integrators
182 
183  // special_input transforms 3D values into 3 scalar values
184  class special_input : public aContiBlock {
185  Value3D a; // temporary value
186  Input3D in; // 3D input
187  int count; // # of evaluations
188  public:
189  special_input(Input3D i) : a(0,0,0), in(i), count(0) {}
190  double Value() override; // expects 3 subsequent evaluations
191  friend class Integrator3D;
192  } in;
193 
194  public:
195  Integrator3D(Input3D i, const Value3D &initial_value);
197  Integrator3D(Integrator3D &i, const Value3D &initial_value=Value3D(0,0,0));
198  Integrator3D(); // for arrays: implicit input value (0,0,0)
199 
200  Input3D SetInput(Input3D i) { return in.in.Set(i); }
201 
202  // ### patch from: xbatrl00@stud.fee.vutbr.cz
203  void Init(const Value3D &v) {_x.Init(v.x()); _y.Init(v.y()); _z.Init(v.z());}
204 
205  Integrator3D &operator = (const Value3D &a);
206  Integrator3D &operator = (Input3D i);
207 
208  virtual Value3D Value() override; // 3D output
209 };
210 
211 
212 ////////////////////////////////////////////////////////////////////////////
213 // Continuous block arithmetic operators
214 //
215 
216 // binary operators:
217 Input3D operator + (Input3D a, Input3D b); // add vectors
218 Input3D operator - (Input3D a, Input3D b); // subtract vectors
219 Input3D operator * (Input3D a, Input3D b); // vector multiplication
220 Input3D operator * (Input3D a, Input b); // vector * scalar
221 Input3D operator * (Input a, Input3D b); // scalar * vector
222 Input3D operator / (Input3D a, Input b); // vector / scalar
223 
224 // unary operators:
225 Input3D operator - (Input3D a); // unary -
226 
227 //! absolute value of vector (1D block)
228 Input Abs(Input3D x);
229 
230 //! make unit vector from input (Abs(output_vec)==1)
232 
233 //! dot product: xvec . yvec
235 
236 //! get x part of (x,y,z) vector value
237 Input Xpart(Input3D a);
238 //! get y part of (x,y,z) vector value
239 Input Ypart(Input3D a);
240 //! get z part of (x,y,z) vector value
241 Input Zpart(Input3D a);
242 
243 ////////////////////////////////////////////////////////////////////////////
244 
245 inline void Print(Value3D a) { a.Print(); }
246 
247 } // namespace
248 
249 #endif // __SIMLIB3D_H
friend Value3D operator/(const Value3D &a, const double b)
Definition: simlib3D.cc:81
void Init(double initvalue)
set initial value of integrator
Definition: intg.cc:222
Input3D(aContiBlock3D &cb)
Definition: simlib3D.h:114
bool operator==(void *p)
Definition: simlib3D.h:119
Special variable (can&#39;t be changed at simulation time)
Definition: simlib3D.h:101
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
Value3D Value()
Definition: simlib3D.h:118
continuous block connection (transparent reference) wrapper for pointer to objects of aContiBlock der...
Definition: simlib.h:895
Input3D SetInput(Input3D i)
Definition: simlib3D.h:130
virtual Value3D Value() override
Definition: simlib3D.h:171
3D vector variable
Definition: simlib3D.h:89
virtual Value3D Value()=0
continuous 3D block with single input
Definition: simlib3D.h:125
3D vector block-expression handle
Definition: simlib3D.h:136
Constant3D(const Value3D &x)
Definition: simlib3D.h:81
double Value() const
get target block value
Definition: simlib.h:931
Continuous block connection (transparent reference)
Definition: simlib3D.h:110
3D vector value
Definition: simlib3D.h:31
Constant3D(double x, double y, double z)
Definition: simlib3D.h:82
Implementation of class CalendarList interface is static - using global functions in SQS namespace...
Definition: algloop.cc:32
virtual Value3D Value() override
Definition: simlib3D.h:95
void Print()
Definition: simlib3D.h:43
double x() const
Definition: simlib3D.h:35
continuous block vith 2 inputs and alg.
Definition: simlib3D.h:144
const Value3D value
Definition: simlib3D.h:79
Input3D & operator=(const Input3D &in)
Definition: simlib3D.h:116
Input Xpart(Input2D a)
get x part of (x,y) vector value
Definition: simlib2D.cc:420
Variable3D(const Value3D &x=Value3D(0, 0, 0))
Definition: simlib3D.h:93
abstract base for continuous blocks with single output suitable for expression-tree building and eval...
Definition: simlib.h:832
Converts 3 scalar inputs to single 3D vector output.
Definition: simlib3D.h:167
Input Abs(Input x)
Definition: fun.cc:94
double y() const
Definition: simlib3D.h:36
void Init(const Value3D &v)
Definition: simlib3D.h:203
Input3D Set(Input3D i)
Definition: simlib3D.h:117
Abstract 3D block with single 3D output.
Definition: simlib3D.h:62
Expression3D(Input3D i)
Definition: simlib3D.h:137
3D vector integrator
Definition: simlib3D.h:180
Input Ypart(Input2D a)
get y part of (x,y) vector value
Definition: simlib2D.cc:421
Input3D(const Input3D &inp)
Definition: simlib3D.h:113
friend double abs(const Value3D &a)
Definition: simlib3D.cc:38
friend double scalar_product(const Value3D &a, const Value3D &b)
Definition: simlib3D.cc:76
virtual void Eval()
Definition: simlib3D.h:66
Input3D SetInput(Input3D i)
Definition: simlib3D.h:200
3D vector value that can&#39;t be changed
Definition: simlib3D.h:78
Input3D(aContiBlock3D *cb)
Definition: simlib3D.h:115
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: simlib3D.h:156
Parameter3D(const Value3D &x=Value3D(0, 0, 0))
Definition: simlib3D.h:103
friend Value3D operator*(const Value3D &a, const Value3D &b)
Definition: simlib3D.cc:58
Input Zpart(Input3D a)
get z part of (x,y,z) vector value
Definition: simlib3D.cc:442
Adaptor3D(Input _x, Input _y, Input _z)
Definition: simlib3D.h:170
aContiBlock3D * bp
Definition: simlib3D.h:111
block for numerical integration input is derivative, output is state
Definition: simlib.h:1288
Value3D(double x, double y, double z)
Definition: simlib3D.h:34
virtual Value3D Value() override
Definition: simlib3D.h:83
double z() const
Definition: simlib3D.h:37
Value3D Value() override
Definition: simlib3D.h:138
Value3D operator+(Value3D b)
Definition: simlib3D.h:41
Value3D operator-(Value3D b)
Definition: simlib3D.h:42