-
Notifications
You must be signed in to change notification settings - Fork 298
/
SimVars.h
154 lines (138 loc) · 5.49 KB
/
SimVars.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#pragma once
/** @addtogroup coreSystem
*
* @{
*/
template<typename T>
/**
* An array-wrapper that will align the array along full cache lines.
*/
/*
#ifdef RUNTIME_STATIC_LINKING
class AlignedArray
#else
*/
class BOOST_EXTENSION_SIMVARS_DECL AlignedArray
/*#endif*/
{
private:
T *array;
public:
AlignedArray(int numberOfElements)
{
array = new T[numberOfElements];
}
~AlignedArray()
{
delete[] array;
}
void* operator new(size_t size)
{
//see: http://stackoverflow.com/questions/12504776/aligned-malloc-in-c
void *p1;
void **p2;
size_t alignment = 64;
int offset = alignment - 1 + sizeof(void*);
p1 = malloc(size + offset);
p2 = (void**) (((size_t) (p1) + offset) & ~(alignment - 1));
p2[-1] = p1; //line 6
if (((size_t) p2) % 64 != 0)
throw std::runtime_error("Memory was not aligned correctly!");
return p2;
}
void operator delete(void *p)
{
void* p1 = ((void**) p)[-1]; // get the pointer to the buffer we allocated
free(p1);
}
FORCE_INLINE T* get()
{
return array;
}
};
/**
* SimVars class, implements ISimVars interface
* SimVars stores all model variable in continuous block of memory
*/
/*
#ifdef RUNTIME_STATIC_LINKING
class SimVars: public ISimVars
#else*/
class BOOST_EXTENSION_SIMVARS_DECL SimVars: public ISimVars
/*#endif*/
{
public:
SimVars(size_t dim_real, size_t dim_int, size_t dim_bool, size_t dim_string, size_t dim_pre_vars, size_t dim_state_vars, size_t state_index);
SimVars(SimVars& instance);
ISimVars* clone();
virtual ~SimVars();
virtual double& initRealVar(size_t i);
virtual int& initIntVar(size_t i);
virtual bool& initBoolVar(size_t i);
virtual string& initStringVar(size_t i);
virtual double* getStateVector();
virtual double* getDerStateVector();
virtual double* getRealVarsVector() const;
virtual int* getIntVarsVector() const;
virtual bool* getBoolVarsVector() const;
virtual string* getStringVarsVector() const;
virtual void setRealVarsVector(const double* vars);
virtual void setIntVarsVector(const int* vars);
virtual void setBoolVarsVector(const bool* vars);
virtual void setStringVarsVector(const string* vars);
virtual const double& getRealVar(size_t i);
virtual const int& getIntVar(size_t i);
virtual const bool& getBoolVar(size_t i);
virtual const std::string& getStringVar(size_t i);
virtual double* initRealArrayVar(size_t size, size_t start_index);
virtual int* initIntArrayVar(size_t size, size_t start_index);
virtual bool* initBoolArrayVar(size_t size, size_t start_index);
virtual string* initStringArrayVar(size_t size, size_t start_index);
virtual void initRealAliasArray(int indices[], size_t n, double* ref_data[]);
virtual void initIntAliasArray(int indices[], size_t n, int* ref_data[]);
virtual void initBoolAliasArray(int indices[], size_t n, bool* ref_data[]);
virtual void initStringAliasArray(int indices[], size_t n, string* ref_data[]);
virtual void initRealAliasArray(std::vector<int> indices, double* ref_data[]);
virtual void initIntAliasArray(std::vector<int> indices, int* ref_data[]);
virtual void initBoolAliasArray(std::vector<int> indices, bool* ref_data[]);
virtual void initStringAliasArray(std::vector<int> indices, string* ref_data[]);
virtual void savePreVariables();
virtual void initPreVariables();
virtual double& getPreVar(const double& var);
virtual int& getPreVar(const int& var);
virtual bool& getPreVar(const bool& var);
virtual std::string& getPreVar(const std::string& var);
virtual size_t getDimString() const;
virtual size_t getDimBool() const;
virtual size_t getDimInt() const;
virtual size_t getDimPreVars() const;
virtual size_t getDimReal() const;
virtual size_t getDimStateVars() const;
virtual size_t getStateVectorIndex() const;
protected:
void create(size_t dim_real, size_t dim_int, size_t dim_bool, size_t dim_string, size_t dim_pre_vars, size_t dim_state_vars, size_t state_index);
void *alignedMalloc(size_t required_bytes, size_t alignment);
void alignedFree(void* p);
private:
double* getRealVarPtr(size_t i);
int* getIntVarPtr(size_t i);
bool* getBoolVarPtr(size_t i);
string* getStringVarPtr(size_t i);
size_t _dim_real; //number of all real variables (real algebraic vars,discrete algebraic vars, state vars, der state vars)
size_t _dim_int; // number of all integer variables (integer algebraic vars)
size_t _dim_bool; // number of all bool variables (boolean algebraic vars)
size_t _dim_string; // number of all string variables (string algebraic vars)
size_t _dim_pre_vars; //number of all pre variables (real algebraic vars,discrete algebraic vars, boolean algebraic vars, integer algebraic vars, state vars, der state vars)
size_t _dim_z; // number of all state variables
size_t _z_i; //start index of state vector in real_vars list
double *_real_vars; //array for all model real variables of size dim_real
int* _int_vars; //array for all model int variables of size dim_int
bool* _bool_vars; //array for all model bool variables of size dim_bool
string* _string_vars; //array for all model string variables of size dim_string
//Stores all variables occurred before an event
double* _pre_real_vars;
int* _pre_int_vars;
bool* _pre_bool_vars;
std::string* _pre_string_vars;
};
/** @} */ // end of coreSystem