SIMLIB/C++ 3.09
Loading...
Searching...
No Matches
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
26namespace simlib3 {
27
28////////////////////////////////////////////////////////////////////////////
29//! 3D vector value
30//! \ingroup simlib3D
31class 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
62class 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:
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
78class Constant3D : public aContiBlock3D {
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
89class 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
101class 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
110class 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);
130 Input3D SetInput(Input3D i) { return input.Set(i); }
131};
132
133////////////////////////////////////////////////////////////////////////////
134//! 3D vector block-expression handle
135//! \ingroup simlib3D
138 Value3D Value() override { return InputValue(); }
139};
140
141////////////////////////////////////////////////////////////////////////////
142//! continuous block vith 2 inputs and alg. loop check
143//! \ingroup simlib3D
147 public:
151};
152
153////////////////////////////////////////////////////////////////////////////
154//! continuous block with 3 inputs and alg. loop check
155//! \ingroup simlib3D
158 public:
161};
162
163
164////////////////////////////////////////////////////////////////////////////
165//! Converts 3 scalar inputs to single 3D vector output
166//! \ingroup simlib3D
167class Adaptor3D : public aContiBlock3D {
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
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
207
208 virtual Value3D Value() override; // 3D output
209};
210
211
212////////////////////////////////////////////////////////////////////////////
213// Continuous block arithmetic operators
214//
215
216// binary operators:
217Input3D operator + (Input3D a, Input3D b); // add vectors
218Input3D operator - (Input3D a, Input3D b); // subtract vectors
219Input3D operator * (Input3D a, Input3D b); // vector multiplication
220Input3D operator * (Input3D a, Input b); // vector * scalar
221Input3D operator * (Input a, Input3D b); // scalar * vector
222Input3D operator / (Input3D a, Input b); // vector / scalar
223
224// unary operators:
225Input3D operator - (Input3D a); // unary -
226
227//! absolute value of vector (1D block)
228Input Abs(Input3D x);
229
230//! make unit vector from input (Abs(output_vec)==1)
231Input3D UnitVector(Input3D x);
232
233//! dot product: xvec . yvec
234Input ScalarProduct(Input3D x, Input3D y);
235
236//! get x part of (x,y,z) vector value
237Input Xpart(Input3D a);
238//! get y part of (x,y,z) vector value
239Input Ypart(Input3D a);
240//! get z part of (x,y,z) vector value
241Input Zpart(Input3D a);
242
243////////////////////////////////////////////////////////////////////////////
244
245inline void Print(Value3D a) { a.Print(); }
246
247} // namespace
248
249#endif // __SIMLIB3D_H
Converts 3 scalar inputs to single 3D vector output.
Definition: simlib3D.h:167
Adaptor3D(Input _x, Input _y, Input _z)
Definition: simlib3D.h:170
virtual Value3D Value() override
Definition: simlib3D.h:171
3D vector value that can't be changed
Definition: simlib3D.h:78
virtual Value3D Value() override
Definition: simlib3D.h:83
Constant3D(const Value3D &x)
Definition: simlib3D.h:81
Constant3D(double x, double y, double z)
Definition: simlib3D.h:82
const Value3D value
Definition: simlib3D.h:79
Continuous block connection (transparent reference)
Definition: simlib3D.h:110
Input3D(aContiBlock3D *cb)
Definition: simlib3D.h:115
aContiBlock3D * bp
Definition: simlib3D.h:111
Input3D & operator=(const Input3D &in)
Definition: simlib3D.h:116
Input3D(const Input3D &inp)
Definition: simlib3D.h:113
Input3D Set(Input3D i)
Definition: simlib3D.h:117
Value3D Value()
Definition: simlib3D.h:118
bool operator==(void *p)
Definition: simlib3D.h:119
Input3D(aContiBlock3D &cb)
Definition: simlib3D.h:114
continuous block connection (transparent reference) wrapper for pointer to objects of aContiBlock der...
Definition: simlib.h:895
double Value() const
get target block value
Definition: simlib.h:931
double Value() override
get block output value this method should be defined in classes derived from aContiBlock
Definition: simlib3D.cc:148
3D vector integrator
Definition: simlib3D.h:180
virtual Value3D Value() override
Definition: simlib3D.cc:193
simlib3::Integrator3D::special_input in
Integrator3D & operator=(const Value3D &a)
Definition: simlib3D.cc:201
Input3D SetInput(Input3D i)
Definition: simlib3D.h:200
void Init(const Value3D &v)
Definition: simlib3D.h:203
block for numerical integration input is derivative, output is state
Definition: simlib.h:1288
void Init(double initvalue)
set initial value of integrator
Definition: intg.cc:222
Special variable (can't be changed at simulation time)
Definition: simlib3D.h:101
Parameter3D & operator=(const Value3D &x)
Definition: simlib3D.cc:123
Parameter3D(const Value3D &x=Value3D(0, 0, 0))
Definition: simlib3D.h:103
3D vector value
Definition: simlib3D.h:31
friend Value3D operator*(const Value3D &a, const Value3D &b)
Definition: simlib3D.cc:58
friend double scalar_product(const Value3D &a, const Value3D &b)
Definition: simlib3D.cc:76
double y() const
Definition: simlib3D.h:36
friend Value3D operator-(const Value3D &a, const Value3D &b)
Definition: simlib3D.cc:48
friend Value3D operator+(const Value3D &a, const Value3D &b)
Definition: simlib3D.cc:43
void Print()
Definition: simlib3D.h:43
friend Value3D operator/(const Value3D &a, const double b)
Definition: simlib3D.cc:81
Value3D(double x, double y, double z)
Definition: simlib3D.h:34
double x() const
Definition: simlib3D.h:35
double z() const
Definition: simlib3D.h:37
friend double abs(const Value3D &a)
Definition: simlib3D.cc:38
3D vector variable
Definition: simlib3D.h:89
Variable3D & operator=(const Value3D &x)
Definition: simlib3D.h:94
virtual Value3D Value() override
Definition: simlib3D.h:95
Variable3D(const Value3D &x=Value3D(0, 0, 0))
Definition: simlib3D.h:93
abstract base class for all blocksblocks/SimObject have not copy semantics (TODO: add move semantics)
Definition: simlib.h:825
continuous 3D block with single input
Definition: simlib3D.h:125
Input3D SetInput(Input3D i)
Definition: simlib3D.h:130
continuous block vith 2 inputs and alg.
Definition: simlib3D.h:144
continuous block with 3 inputs and alg.
Definition: simlib3D.h:156
Abstract 3D block with single 3D output.
Definition: simlib3D.h:62
virtual Value3D Value()=0
virtual void Eval()
Definition: simlib3D.h:66
virtual void _Eval()
Definition: simlib3D.cc:111
abstract base for continuous blocks with single output suitable for expression-tree building and eval...
Definition: simlib.h:832
Implementation of class CalendarList interface is static - using global functions in SQS namespace.
Definition: algloop.cc:32
Input operator-(Input a, Input b)
block operator -
Definition: continuous.cc:226
Input operator+(Input a, Input b)
block operator +
Definition: continuous.cc:224
Input Abs(Input x)
Definition: fun.cc:94
Input Ypart(Input2D a)
get y part of (x,y) vector value
Definition: simlib2D.cc:421
Input Xpart(Input2D a)
get x part of (x,y) vector value
Definition: simlib2D.cc:420
Input operator*(Input a, Input b)
block operator *
Definition: continuous.cc:228
Input ScalarProduct(Input2D x, Input2D y)
dot product: xvec . yvec
Definition: simlib2D.cc:389
Input Zpart(Input3D a)
get z part of (x,y,z) vector value
Definition: simlib3D.cc:442
int Print(const char *fmt,...)
for Output methods, can be redirected
Definition: print.cc:92
Input operator/(Input a, Input b)
block operator /
Definition: continuous.cc:230
Input2D UnitVector(Input2D x)
make unit vector from input (Abs(output_vec)==1)
Definition: simlib2D.cc:388
3D vector block-expression handle
Definition: simlib3D.h:136
Value3D Value() override
Definition: simlib3D.h:138
Expression3D(Input3D i)
Definition: simlib3D.h:137