SIMLIB/C++ 3.09
Loading...
Searching...
No Matches
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
26namespace simlib3 {
27
28////////////////////////////////////////////////////////////////////////////
29//! 2D vector value
30//! \ingroup simlib2D
31class 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
60class 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:
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
76class Constant2D : public aContiBlock2D {
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
87class 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
100class 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
109class 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);
129 Input2D SetInput(Input2D i) { return input.Set(i); }
130};
131
132////////////////////////////////////////////////////////////////////////////
133//! Reference to 2D vector block-expression
134//! \ingroup simlib2D
137 Value2D Value() override { return InputValue(); }
138};
139
140////////////////////////////////////////////////////////////////////////////
141//! continuous block vith 2 inputs and alg. loop check
142//! \ingroup simlib2D
146 public:
150};
151
152////////////////////////////////////////////////////////////////////////////
153//! continuous block with 3 inputs and alg. loop check
154//! \ingroup simlib2D
157 public:
160};
161
162
163////////////////////////////////////////////////////////////////////////////
164//! Convert 2 scalar inputs to single 2D vector output
165//! \ingroup simlib2D
166class 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
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
203
204 virtual Value2D Value() override; // 2D output
205};
206
207
208////////////////////////////////////////////////////////////////////////////
209// Continuous block arithmetic operators
210//
211
212// binary operators:
213Input2D operator + (Input2D a, Input2D b); // add vectors
214Input2D operator - (Input2D a, Input2D b); // subtract vectors
215Input2D operator * (Input2D a, Input b); // vector * scalar
216Input2D operator * (Input a, Input2D b); // scalar * vector
217Input2D operator / (Input2D a, Input b); // vector / scalar
218
219// unary operators:
220Input2D operator - (Input2D a); // unary -
221
222//! absolute value of vector (1D block)
223Input Abs(Input2D x);
224
225//! make unit vector from input (Abs(output_vec)==1)
226Input2D UnitVector(Input2D v);
227
228//! dot product: xvec . yvec
229Input ScalarProduct(Input2D x, Input2D y);
230
231//! get x part of (x,y) vector value
232Input Xpart(Input2D a);
233
234//! get y part of (x,y) vector value
235Input Ypart(Input2D a);
236
237inline 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
virtual Value2D Value() override
Definition: simlib2D.h:170
Adaptor2D(Input _x, Input _y)
Definition: simlib2D.h:169
2D vector value that can't be changed
Definition: simlib2D.h:76
const Value2D value
Definition: simlib2D.h:77
virtual Value2D Value() override
Definition: simlib2D.h:81
Constant2D(Value2D x)
Definition: simlib2D.h:79
Constant2D(double x, double y)
Definition: simlib2D.h:80
Continuous block connection (transparent reference)
Definition: simlib2D.h:109
Input2D Set(Input2D i)
Definition: simlib2D.h:116
bool operator==(void *p)
Definition: simlib2D.h:118
Input2D(aContiBlock2D *cb)
Definition: simlib2D.h:115
Input2D(aContiBlock2D &cb)
Definition: simlib2D.h:114
Input2D(const Input2D &in)
Definition: simlib2D.h:113
Value2D Value()
Definition: simlib2D.h:117
Input2D & operator=(const Input2D &x)
Definition: simlib2D.h:112
aContiBlock2D * bp
Definition: simlib2D.h:110
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: simlib2D.cc:150
2D vector integrator
Definition: simlib2D.h:179
Integrator2D & operator=(const Value2D &a)
Definition: simlib2D.cc:193
virtual Value2D Value() override
Definition: simlib2D.cc:212
simlib3::Integrator2D::special_input in
Input2D SetInput(Input2D i)
Definition: simlib2D.h:199
block for numerical integration input is derivative, output is state
Definition: simlib.h:1288
Special variable (can't be changed at simulation time)
Definition: simlib2D.h:100
Parameter2D & operator=(const Value2D &x)
Definition: simlib2D.cc:125
Parameter2D(Value2D x=Value2D(0, 0))
Definition: simlib2D.h:102
2D vector value
Definition: simlib2D.h:31
friend double abs(const Value2D &a)
Definition: simlib2D.cc:38
friend Value2D operator*(const Value2D &a, const double b)
Definition: simlib2D.cc:68
double y() const
Definition: simlib2D.h:36
Value2D(double x, double y)
Definition: simlib2D.h:34
double x() const
Definition: simlib2D.h:35
friend Value2D operator+(const Value2D &a, const Value2D &b)
Definition: simlib2D.cc:43
friend Value2D operator/(const Value2D &a, const double b)
Definition: simlib2D.cc:83
friend Value2D operator-(const Value2D &a, const Value2D &b)
Definition: simlib2D.cc:48
void Print()
Definition: simlib2D.h:42
friend double scalar_product(const Value2D &a, const Value2D &b)
Definition: simlib2D.cc:78
2D vector variable
Definition: simlib2D.h:87
virtual Value2D Value() override
Definition: simlib2D.h:94
Variable2D & operator=(Value2D x)
Definition: simlib2D.h:92
Variable2D(Value2D x=Value2D(0, 0))
Definition: simlib2D.h:91
abstract base class for all blocksblocks/SimObject have not copy semantics (TODO: add move semantics)
Definition: simlib.h:825
continuous block with single input and alg.
Definition: simlib2D.h:124
Input2D SetInput(Input2D i)
Definition: simlib2D.h:129
continuous block vith 2 inputs and alg.
Definition: simlib2D.h:143
continuous block with 3 inputs and alg.
Definition: simlib2D.h:155
Abstract 2D block with single 2D output.
Definition: simlib2D.h:60
virtual void _Eval()
Definition: simlib2D.cc:113
virtual void Eval()
Definition: simlib2D.h:64
virtual Value2D Value()=0
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
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
Reference to 2D vector block-expression.
Definition: simlib2D.h:135
Value2D Value() override
Definition: simlib2D.h:137
Expression2D(Input2D i)
Definition: simlib2D.h:136