Skip to content

Commit d1043b9

Browse files
committed
implement pre values of arrays
see Modelica.Blocks.Examples.Interaction1 git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@25880 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 62bbc24 commit d1043b9

File tree

7 files changed

+67
-42
lines changed

7 files changed

+67
-42
lines changed

Compiler/Template/CodegenCpp.tpl

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12214,9 +12214,6 @@ template daeExpCrefRhsIndexSpec(list<Subscript> subs, Context context, Text &pre
1221412214
end daeExpCrefRhsIndexSpec;
1221512215

1221612216

12217-
12218-
12219-
1222012217
template daeExpCrefRhsArrayBox(ComponentRef cr,DAE.Type ty, Context context, Text &preExp /*BUFP*/,
1222112218
Text &varDecls /*BUFP*/,SimCode simCode, Text& extraFuncs,Text& extraFuncsDecl,Text extraFuncsNamespace)
1222212219
"Helper to daeExpCrefRhs."
@@ -12232,15 +12229,29 @@ template daeExpCrefRhsArrayBox(ComponentRef cr,DAE.Type ty, Context context, Tex
1223212229
let tmpArr = '<%daeExpCrefRhsArrayBox2(statvar,ty,context,preExp,varDecls,simCode , &extraFuncs , &extraFuncsDecl, extraFuncsNamespace)%>'
1223312230
tmpArr
1223412231
else
12235-
match context
12236-
case FUNCTION_CONTEXT(__) then ''
12237-
else
12232+
match context
12233+
case FUNCTION_CONTEXT(__) then ''
12234+
else
1223812235
match ty
12239-
case t as T_ARRAY(ty=aty,dims=dims) then
12240-
let tmpArr ='<%arrayCrefCStr(cr,context)%>'
12241-
tmpArr
12236+
case t as T_ARRAY(ty=aty, dims=dims) then
12237+
match cr
12238+
case CREF_QUAL(ident = "$PRE") then
12239+
let arr = arrayCrefCStr(componentRef, context)
12240+
let ndims = listLength(dims)
12241+
let dimstr = checkDimension(dims)
12242+
let T = expTypeShort(aty)
12243+
let &preExp +=
12244+
<<
12245+
StatArrayDim<%ndims%><<%T%>, <%dimstr%>> <%arr%>_pre;
12246+
std::transform(<%arr%>.getDataRefs(),
12247+
<%arr%>.getDataRefs() + <%arr%>.getNumElems(),
12248+
<%arr%>_pre.getData(),
12249+
PreRefArray2CArray<<%T%>>(_discrete_events));
12250+
>>
12251+
'<%arr%>_pre'
12252+
else
12253+
arrayCrefCStr(cr,context)
1224212254
else ''
12243-
1224412255
end daeExpCrefRhsArrayBox;
1224512256

1224612257

SimulationRuntime/cpp/Core/System/DiscreteEvents.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,32 +63,30 @@ void DiscreteEvents::save(bool& var)
6363
/**
6464
Implementation of the Modelica pre operator
6565
*/
66-
double DiscreteEvents::pre(double& var)
66+
double DiscreteEvents::pre(const double& var)
6767
{
6868
double& pre_var = _sim_vars->getPreVar(var);
6969
return pre_var;
70-
7170
}
7271

7372
/**
7473
Implementation of the Modelica pre operator
7574
*/
76-
double DiscreteEvents::pre(int& var)
75+
int DiscreteEvents::pre(const int& var)
7776
{
7877
double& pre_var = _sim_vars->getPreVar(var);
79-
return pre_var;
80-
78+
return (int)pre_var;
8179
}
8280

8381
/**
8482
Implementation of the Modelica pre operator
8583
*/
86-
double DiscreteEvents::pre(bool& var)
84+
bool DiscreteEvents::pre(const bool& var)
8785
{
8886
double& pre_var = _sim_vars->getPreVar(var);
89-
return pre_var;
90-
87+
return (bool)pre_var;
9188
}
89+
9290
/**
9391
Implementation of the Modelica edge operator
9492
Returns true for a variable when it changes from false to true

SimulationRuntime/cpp/Core/System/SimVars.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,19 +304,19 @@ void SimVars::initPreVariables()
304304

305305
}
306306

307-
double& SimVars::getPreVar(double& var)
307+
double& SimVars::getPreVar(const double& var)
308308
{
309309
unsigned int i = _pre_real_vars_idx[&var];
310310
return _pre_vars[i];
311311
}
312312

313-
double& SimVars::getPreVar(int& var)
313+
double& SimVars::getPreVar(const int& var)
314314
{
315315
unsigned int i = _pre_int_vars_idx[&var];
316316
return _pre_vars[i];
317317
}
318318

319-
double& SimVars::getPreVar(bool& var)
319+
double& SimVars::getPreVar(const bool& var)
320320
{
321321
unsigned int i = _pre_bool_vars_idx[&var];
322322
return _pre_vars[i];

SimulationRuntime/cpp/Include/Core/Math/Array.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ struct CopyRefArray2RefArray
7070
template<typename T> class BaseArray
7171
{
7272
public:
73-
BaseArray(bool isStatic, bool isReference)
73+
BaseArray(bool isStatic, bool isRefArray)
7474
:_isStatic(isStatic)
75-
,_isReference(isReference)
75+
,_isRefArray(isRefArray)
7676
{}
7777

7878
/**
@@ -92,9 +92,9 @@ template<typename T> class BaseArray
9292
virtual const T* getData() const = 0;
9393
virtual T* getData() = 0;
9494
virtual void getDataCopy(T data[], size_t n) const = 0;
95-
virtual const T* const* getDataReferences() const
95+
virtual const T* const* getDataRefs() const
9696
{
97-
throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,"Wrong virtual Array getDataReferences call");
97+
throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION,"Wrong virtual Array getDataRefs call");
9898
}
9999

100100
virtual T& operator()(size_t i)
@@ -137,14 +137,14 @@ template<typename T> class BaseArray
137137
return _isStatic;
138138
}
139139

140-
bool isReference() const
140+
bool isRefArray() const
141141
{
142-
return _isReference;
142+
return _isRefArray;
143143
}
144144

145145
protected:
146146
bool _isStatic;
147-
bool _isReference;
147+
bool _isRefArray;
148148
};
149149

150150
/**
@@ -237,8 +237,8 @@ class RefArray : public BaseArray<T>
237237
virtual void assign(const BaseArray<T>& b)
238238
{
239239
T **refs = _ref_array.c_array();
240-
if(b.isReference())
241-
std::transform(refs, refs + nelems, b.getDataReferences(),
240+
if(b.isRefArray())
241+
std::transform(refs, refs + nelems, b.getDataRefs(),
242242
refs, CopyRefArray2RefArray<T>());
243243
else
244244
std::transform(refs, refs + nelems, b.getData(),
@@ -277,7 +277,7 @@ class RefArray : public BaseArray<T>
277277
/**
278278
* Access to data references (read-only)
279279
*/
280-
virtual const T* const* getDataReferences() const
280+
virtual const T* const* getDataRefs() const
281281
{
282282
return _ref_array.data();
283283
}

SimulationRuntime/cpp/Include/Core/System/DiscreteEvents.h

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ class BOOST_EXTENSION_EVENTHANDLING_DECL DiscreteEvents
2222

2323

2424
//Implementation of the Modelica pre operator
25-
double pre(double& var);
26-
double pre(int& var);
27-
double pre(bool& var);
25+
double pre(const double& var);
26+
int pre(const int& var);
27+
bool pre(const bool& var);
2828
//Implementation of the Modelica edge operator
2929
bool edge(double& var);
3030
bool edge(int& var);
@@ -43,3 +43,21 @@ class BOOST_EXTENSION_EVENTHANDLING_DECL DiscreteEvents
4343
private:
4444
boost::shared_ptr<ISimVars> _sim_vars;
4545
};
46+
47+
/**
48+
* Operator class to get pre values of an array
49+
*/
50+
template<typename T>
51+
class PreRefArray2CArray
52+
{
53+
DiscreteEvents *_discrete_events;
54+
55+
public:
56+
PreRefArray2CArray(boost::shared_ptr<DiscreteEvents>& discrete_events) {
57+
_discrete_events = discrete_events.get();
58+
}
59+
60+
const T operator()(const T* val) const {
61+
return _discrete_events->pre(*val);
62+
}
63+
};

SimulationRuntime/cpp/Include/Core/System/ISimVars.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,12 @@ class ISimVars
3636
virtual bool& initBoolVar(size_t i)= 0;
3737

3838
/*Methods for pre- variables*/
39-
40-
4139
virtual void savePreVariables() = 0;
4240
virtual void initPreVariables()= 0;
4341
/*access methods for pre-variable*/
44-
virtual double& getPreVar(double& var)=0;
45-
virtual double& getPreVar(int& var)=0;
46-
virtual double& getPreVar(bool& var)=0;
42+
virtual double& getPreVar(const double& var)=0;
43+
virtual double& getPreVar(const int& var)=0;
44+
virtual double& getPreVar(const bool& var)=0;
4745
virtual void setPreVar(double& var)=0;
4846
virtual void setPreVar(int& var)=0;
4947
virtual void setPreVar(bool& var)=0;

SimulationRuntime/cpp/Include/Core/System/SimVars.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ class BOOST_EXTENSION_SIMVARS_DECL SimVars: public ISimVars
7979
virtual void initBoolAliasArray(std::vector<int> indices, bool* ref_data[]);
8080
virtual void savePreVariables();
8181
virtual void initPreVariables();
82-
virtual double& getPreVar(double& var);
83-
virtual double& getPreVar(int& var);
84-
virtual double& getPreVar(bool& var);
82+
virtual double& getPreVar(const double& var);
83+
virtual double& getPreVar(const int& var);
84+
virtual double& getPreVar(const bool& var);
8585
virtual void setPreVar(double& var);
8686
virtual void setPreVar(int& var);
8787
virtual void setPreVar(bool& var);

0 commit comments

Comments
 (0)