/////////////////////////////////////////////////////////////////////////////
// simlib2D.h
//
// SIMLIB version: 2.18
// Date: 2004-01-25
//
// Copyright (c) 1997-2004 Petr Peringer
//
// This library is licensed under GNU Library GPL. See the file COPYING.
//
//
// the SIMLIB/2D extension
//
// Warning: beta version -- this is the prototype
//
#ifndef __SIMLIB2D_H
#define __SIMLIB2D_H
#ifndef __SIMLIB_H
# error "simlib2D.h: 19: you must include simlib.h first"
#endif
#if __SIMLIB__ < 0x0212
# error "simlib2D.h: 22: requires SIMLIB version 2.12 and higher"
#endif
////////////////////////////////////////////////////////////////////////////
// Value2D --- 2D vector
//
class Value2D {
double _x, _y;
public:
Value2D(double x, double y) : _x(x), _y(y) {}
double x() const { return _x; }
double y() const { return _y; }
// using default copy constructor, destructor, and operator =
Value2D operator + (Value2D b) { return Value2D(_x+b._x, _y+b._y); }
Value2D operator - (Value2D b) { return Value2D(_x-b._x, _y-b._y); }
void Print() { ::Print(" %g %g ", _x, _y); }
// utilities:
friend double abs(const Value2D &a);
friend Value2D operator +(const Value2D& a, const Value2D &b);
friend Value2D operator -(const Value2D& a, const Value2D &b);
friend Value2D operator -(const Value2D& a);
friend Value2D operator *(const Value2D& a, const double b);
friend Value2D operator *(const double a, const Value2D& b);
friend double scalar_product(const Value2D& a, const Value2D &b);
friend Value2D operator /(const Value2D& a, const double b);
};
////////////////////////////////////////////////////////////////////////////
// aContiBlock2D --- abstract 2D block with single output
//
class aContiBlock2D : public aBlock { // abstract continuous block
aContiBlock2D(const aContiBlock2D&); // disable copy ctr
void operator= (aContiBlock2D&); // disable assignment
protected:
bool isEvaluated; // flag for loop checking ###---
private:
virtual void Eval() {}; // evaluate without loop detection
public:
aContiBlock2D();
~aContiBlock2D();
virtual void _Eval(); // evaluate with loop detection
virtual Value2D Value() = 0; // output value
void Print(); // print value
};
////////////////////////////////////////////////////////////////////////////
// Constant --- vector value that can't be changed
//
class Constant2D : public aContiBlock2D {
const Value2D value;
public:
explicit Constant2D(Value2D x) : value(x) {}
explicit Constant2D(double x, double y) : value(x,y) {}
virtual Value2D Value() { return value; } // without Eval
};
////////////////////////////////////////////////////////////////////////////
// Variable --- vector variable (can be changed)
//
class Variable2D : public aContiBlock2D {
protected:
Value2D value;
public:
explicit Variable2D(Value2D x=Value2D(0,0)) : value(x) {}
Variable2D &operator= (Value2D x) { value = x; return *this; }
// TODO: operator=
virtual Value2D Value() { return value; }
};
////////////////////////////////////////////////////////////////////////////
// Parameter --- special variable (can't be changed at simulation time)
//
class Parameter2D : public Variable2D {
public:
explicit Parameter2D(Value2D x=Value2D(0,0)) : Variable2D(x) {}
Parameter2D &operator= (const Value2D &x);
};
////////////////////////////////////////////////////////////////////////////
// class Input2D --- continuous block connection (transparent reference)
//
class Input2D { // small objects, without virtual methods
aContiBlock2D *bp;
public:
Input2D&operator=(const Input2D&x) { bp=x.bp; return *this; }
Input2D(const Input2D &in): bp(in.bp) {} // copy reference
Input2D(aContiBlock2D &cb): bp(&cb) {} // reference to 2D block
Input2D(aContiBlock2D *cb): bp(cb) {} // pointer to 2D block
Input2D Set(Input2D i) { Input2D p=bp; bp=i.bp; return p; }
Value2D Value() { return bp->Value(); } // get value
bool operator ==(void *p) { return bp==p; } // for tests only!
};
////////////////////////////////////////////////////////////////////////////
// aContiBlock1 --- continuous blocks vith single input and alg. loop check
//
class aContiBlock2D1 : public aContiBlock2D {
Input2D input;
public:
explicit aContiBlock2D1(Input2D i);
Value2D InputValue() { return input.Value(); }
Input2D SetInput(Input2D i) { return input.Set(i); }
};
////////////////////////////////////////////////////////////////////////////
// Expression --- reference to vector block-expression
//
struct Expression2D : public aContiBlock2D1 {
explicit Expression2D(Input2D i) : aContiBlock2D1(i) {}
Value2D Value() { return InputValue(); }
};
////////////////////////////////////////////////////////////////////////////
// aContiBlock2 --- continuous blocks vith two inputs and alg. loop check
//
class aContiBlock2D2 : public aContiBlock2D {
Input2D input1;
Input2D input2;
public:
aContiBlock2D2(Input2D i1, Input2D i2);
Value2D Input1Value() { return input1.Value(); }
Value2D Input2Value() { return input2.Value(); }
};
////////////////////////////////////////////////////////////////////////////
// aContiBlock3 --- continuous blocks vith three inputs and alg. loop check
//
class aContiBlock2D3 : public aContiBlock2D2 {
Input2D input3;
public:
aContiBlock2D3(Input2D i1, Input2D i2, Input2D i3);
Value2D Input3Value() { return input3.Value(); }
};
////////////////////////////////////////////////////////////////////////////
// Adaptor2D --- 3 scalar inputs, one 2D vector output
//
class Adaptor2D : public aContiBlock2D {
Input x, y;
public:
Adaptor2D(Input _x, Input _y) : x(_x), y(_y) {}
virtual Value2D Value() {
return Value2D( x.Value(), y.Value() );
}
};
////////////////////////////////////////////////////////////////////////////
// Integrator2D --- vector integrator
//
class Integrator2D : public aContiBlock2D {
Integrator _x,_y; // 1D standard integrators
// special_input transforms 2D values into 2 scalar values
class special_input : public aContiBlock {
Value2D a; // temporary value
Input2D in; // 2D input
int count; // # of evaluations
public:
special_input(Input2D i) : a(0,0), in(i), count(0) {}
double Value(); // expects 2 subsequent evaluations
friend class Integrator2D;
} in;
public:
Integrator2D(Input2D i, Value2D initial_value);
Integrator2D(Input2D i);
Integrator2D(Integrator2D &i, Value2D initial_value=Value2D(0,0));
Integrator2D(); // for arrays: implicit input value (0,0)
Input2D SetInput(Input2D i) { return in.in.Set(i); }
Integrator2D &operator = (const Value2D &a);
Integrator2D &operator = (Input2D i);
virtual Value2D Value(); // 2D output
};
////////////////////////////////////////////////////////////////////////////
// Continuous block arithmetic operators
//
// binary operators:
Input2D operator + (Input2D a, Input2D b); // add vectors
Input2D operator - (Input2D a, Input2D b); // subtract vectors
Input2D operator * (Input2D a, Input b); // vector * scalar
Input2D operator * (Input a, Input2D b); // scalar * vector
Input2D operator / (Input2D a, Input b); // vector / scalar
// unary operators:
Input2D operator - (Input2D a); // unary -
// functions:
Input Abs(Input2D x); // absolute value of vector x
Input2D UnitVector(Input2D x); // unit vector (abs(output)==1)
Input ScalarProduct(Input2D x, Input2D y); // dot product (x.y)
Input Xpart(Input2D a); // get x part of vector block
Input Ypart(Input2D a); // get y part of vector block
#endif // __SIMLIB2D_H
syntax highlighted by Code2HTML, v. 0.9.1