/////////////////////////////////////////////////////////////////////////////
// simlib3D.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/3D extension
//
// Warning: beta version -- this is the prototype
//
#ifndef __SIMLIB3D_H
#define __SIMLIB3D_H
#ifndef __SIMLIB_H
# error "simlib3D.h: 19: you must include simlib.h first"
#endif
#if __SIMLIB__ < 0x0212
# error "simlib3D.h: 22: requires SIMLIB version 2.12 and higher"
#endif
////////////////////////////////////////////////////////////////////////////
// Value3D --- 3D vector
//
class Value3D {
double _x, _y, _z;
public:
Value3D(double x, double y, double z) : _x(x), _y(y), _z(z) {}
double x() const { return _x; }
double y() const { return _y; }
double z() const { return _z; }
// using default copy constructor, destructor, and operator =
Value3D operator + (Value3D b) { return Value3D(_x+b._x, _y+b._y, _z+b._z); }
Value3D operator - (Value3D b) { return Value3D(_x-b._x, _y-b._y, _z-b._z); }
void Print() { ::Print(" %g %g %g ", _x, _y, _z); }
// utilities:
friend double abs(const Value3D &a);
friend Value3D operator +(const Value3D& a, const Value3D &b);
friend Value3D operator -(const Value3D& a, const Value3D &b);
friend Value3D operator -(const Value3D& a);
friend Value3D operator *(const Value3D& a, const Value3D &b);
friend Value3D operator *(const Value3D& a, const double b);
friend Value3D operator *(const double a, const Value3D& b);
friend double scalar_product(const Value3D& a, const Value3D &b);
friend Value3D operator /(const Value3D& a, const double b);
};
////////////////////////////////////////////////////////////////////////////
// aContiBlock3D --- abstract 3D block with single output
//
class aContiBlock3D : public aBlock { // abstract continuous block
aContiBlock3D(const aContiBlock3D&); // disable copy ctr
void operator= (aContiBlock3D&); // disable assignment
protected:
bool isEvaluated; // flag for loop checking ###---
private:
virtual void Eval() {}; // evaluate without loop detection
public:
aContiBlock3D();
~aContiBlock3D();
virtual void _Eval(); // evaluate with loop detection
virtual Value3D Value() = 0; // output value
void Print(); // print value
};
////////////////////////////////////////////////////////////////////////////
// Constant --- vector value that can't be changed
//
class Constant3D : public aContiBlock3D {
const Value3D value;
public:
explicit Constant3D(Value3D x) : value(x) {}
explicit Constant3D(double x, double y, double z) : value(x,y,z) {}
virtual Value3D Value () { return value; } // without Eval
// virtual Value3D operator () () { return value; }
};
////////////////////////////////////////////////////////////////////////////
// Variable --- vector variable (can be changed)
//
class Variable3D : public aContiBlock3D {
protected:
Value3D value;
public:
explicit Variable3D(Value3D x=Value3D(0,0,0)) : value(x) {}
Variable3D &operator= (Value3D x) { value = x; return *this; }
virtual Value3D Value () { return value; }
};
////////////////////////////////////////////////////////////////////////////
// Parameter --- special variable (can't be changed at simulation time)
//
class Parameter3D : public Variable3D {
public:
explicit Parameter3D(Value3D x=Value3D(0,0,0)) : Variable3D(x) {}
Parameter3D &operator= (const Value3D &x);
};
////////////////////////////////////////////////////////////////////////////
// class Input3D --- continuous block connection (transparent reference)
//
class Input3D { // small objects, without virtual methods
aContiBlock3D *bp;
public:
Input3D(const Input3D &inp): bp(inp.bp) {} // copy reference
Input3D(aContiBlock3D &cb): bp(&cb) {} // reference to 3D block
Input3D(aContiBlock3D *cb): bp(cb) {} // pointer to 3D block
Input3D&operator=(const Input3D &in) { bp = in.bp; return *this; }
Input3D Set(Input3D i) { Input3D p=bp; bp=i.bp; return p; }
Value3D 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 aContiBlock3D1 : public aContiBlock3D {
Input3D input;
public:
explicit aContiBlock3D1(Input3D i);
Value3D InputValue() { return input.Value(); }
Input3D SetInput(Input3D i) { return input.Set(i); }
};
////////////////////////////////////////////////////////////////////////////
// Expression --- reference to vector block-expression
//
struct Expression3D : public aContiBlock3D1 {
explicit Expression3D(Input3D i) : aContiBlock3D1(i) {}
Value3D Value() { return InputValue(); }
};
////////////////////////////////////////////////////////////////////////////
// aContiBlock2 --- continuous blocks vith two inputs and alg. loop check
//
class aContiBlock3D2 : public aContiBlock3D {
Input3D input1;
Input3D input2;
public:
aContiBlock3D2(Input3D i1, Input3D i2);
Value3D Input1Value() { return input1.Value(); }
Value3D Input2Value() { return input2.Value(); }
};
////////////////////////////////////////////////////////////////////////////
// aContiBlock3 --- continuous blocks vith three inputs and alg. loop check
//
class aContiBlock3D3 : public aContiBlock3D2 {
Input3D input3;
public:
aContiBlock3D3(Input3D i1, Input3D i2, Input3D i3);
Value3D Input3Value() { return input3.Value(); }
};
////////////////////////////////////////////////////////////////////////////
// Adaptor3D --- 3 scalar inputs, one 3D vector output
//
class Adaptor3D : public aContiBlock3D {
Input x, y, z;
public:
Adaptor3D(Input _x, Input _y, Input _z) : x(_x), y(_y), z(_z) {}
virtual Value3D Value() {
return Value3D( x.Value(), y.Value(), z.Value() );
}
};
////////////////////////////////////////////////////////////////////////////
// Integrator3D --- vector integrator
//
class Integrator3D : public aContiBlock3D {
Integrator _x,_y,_z; // 1D standard integrators
// special_input transforms 3D values into 3 scalar values
class special_input : public aContiBlock {
Value3D a; // temporary value
Input3D in; // 3D input
int count; // # of evaluations
public:
special_input(Input3D i) : a(0,0,0), in(i), count(0) {}
double Value(); // expects 3 subsequent evaluations
friend class Integrator3D;
} in;
public:
Integrator3D(Input3D i, Value3D initial_value);
Integrator3D(Input3D i);
Integrator3D(Integrator3D &i, Value3D initial_value=Value3D(0,0,0));
Integrator3D(); // for arrays: implicit input value (0,0,0)
Input3D SetInput(Input3D i) { return in.in.Set(i); }
// ### patch from: xbatrl00@stud.fee.vutbr.cz
void Init(const Value3D &v) {_x.Init(v.x()); _y.Init(v.y()); _z.Init(v.z());}
Integrator3D &operator = (const Value3D &a);
Integrator3D &operator = (Input3D i);
virtual Value3D Value(); // 3D output
};
////////////////////////////////////////////////////////////////////////////
// Continuous block arithmetic operators
//
// binary operators:
Input3D operator + (Input3D a, Input3D b); // add vectors
Input3D operator - (Input3D a, Input3D b); // subtract vectors
Input3D operator * (Input3D a, Input3D b); // vector multiplication
Input3D operator * (Input3D a, Input b); // vector * scalar
Input3D operator * (Input a, Input3D b); // scalar * vector
Input3D operator / (Input3D a, Input b); // vector / scalar
// unary operators:
Input3D operator - (Input3D a); // unary -
// functions:
Input Abs(Input3D x); // absolute value of vector x
Input3D UnitVector(Input3D x); // unit vector (abs(output)==1)
Input ScalarProduct(Input3D x, Input3D y); // dot product (x.y)
Input Xpart(Input3D a); // get x part of vector block
Input Ypart(Input3D a); // get y part of vector block
Input Zpart(Input3D a); // get z part of vector block
////////////////////////////////////////////////////////////////////////////
// functions
//
inline void Print(Value3D a) {
a.Print();
}
#endif // __SIMLIB3D_H
syntax highlighted by Code2HTML, v. 0.9.1