Skip to content

Commit ca69856

Browse files
committed
fix for dot and div array in cpp tempalte.Colored Jacobian in cvode of cpp runtime
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@22136 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent d9329e3 commit ca69856

File tree

7 files changed

+387
-480
lines changed

7 files changed

+387
-480
lines changed

Compiler/Template/CodegenCpp.tpl

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2956,8 +2956,8 @@ case var as VARIABLE(__) then
29562956
let assginBegin = 'boost::get<<%ix%>>('
29572957
let assginEnd = ')'
29582958
if instDims then
2959-
let &varInits += '<%assginBegin%>_<%fname%>.data<%assginEnd%>.setDims(<%instDimsInit%>);
2960-
/*<%assginBegin%>_<%fname%>.data<%assginEnd%>.reindex(1);//hierhier*/ <%\n%>'
2959+
let &varInits += '<%assginBegin%>_<%fname%>.data<%assginEnd%>.setDims(<%instDimsInit%>);//todo setDims not for stat arrays
2960+
<%\n%>'
29612961
let &varAssign += '<%assginBegin%>_<%fname%>.data<%assginEnd%>=<%contextCref(var.name,contextFunction,simCode,useFlatArrayNotation)%>;<%\n%>'
29622962
""
29632963
else
@@ -2987,7 +2987,7 @@ template varDeclForVarInit(Variable var,String varName, list<DAE.Exp> instDims,
29872987
let addRoot = match type case "modelica_metatype" then ' mmc_GC_add_root(&<%varName%>, mmc_GC_local_state, "<%varName%>");' else ''
29882988
let testinstDimsInit = (instDims |> exp => testDaeDimensionExp(exp);separator="")
29892989
let instDimsInit = (instDims |> exp => daeExp(exp, contextFunction, &varInits , &varDecls,simCode, useFlatArrayNotation);separator=",")
2990-
let arrayexpression1 = (if instDims then 'StatArrayDim<%listLength(instDims)%><<%expTypeShort(var.ty)%>,<%instDimsInit%>> <%varName%>;<%\n%>/*testassign2*/'
2990+
let arrayexpression1 = (if instDims then 'StatArrayDim<%listLength(instDims)%><<%expTypeShort(var.ty)%>,<%instDimsInit%>> <%varName%>;<%\n%>'
29912991
else '<%type%> <%varName%><%initVar%>;<%addRoot%><%\n%>')
29922992
let arrayexpression2 = (if instDims then 'DynArrayDim<%listLength(instDims)%><<%expTypeShort(var.ty)%>> <%varName%>;<%\n%>'
29932993
else '<%type%> <%varName%><%initVar%>;<%addRoot%><%\n%>')
@@ -3282,7 +3282,7 @@ case var as VARIABLE(__) then
32823282
match testinstDimsInit
32833283
case "" then
32843284
let instDimsInit = (instDims |> exp => daeDimensionExp(exp);separator=",")
3285-
if instDims then 'StatArrayDim<%listLength(instDims)%>< <%expTypeShort(var.ty)%>, <%instDimsInit%>> /*testassign3*/ ' else expTypeFlag(var.ty, 6)
3285+
if instDims then 'StatArrayDim<%listLength(instDims)%>< <%expTypeShort(var.ty)%>, <%instDimsInit%>> ' else expTypeFlag(var.ty, 6)
32863286
else
32873287
if instDims then 'DynArrayDim<%listLength(instDims)%><<%expTypeShort(var.ty)%>> ' else expTypeFlag(var.ty, 6)
32883288

@@ -5167,7 +5167,7 @@ match simVar
51675167
>>*/
51685168
//
51695169
<<
5170-
StatArrayDim<%dims%><<%variableType(type_)%>, <%arraysize%> > /*testassign4*/<%arrayName%>;
5170+
StatArrayDim<%dims%><<%variableType(type_)%>, <%arraysize%> > <%arrayName%>;
51715171
>>
51725172
case SIMVAR(numArrayElement=_::_) then
51735173
let& dims = buffer "" /*BUFD*/
@@ -5228,7 +5228,7 @@ match simVar
52285228
let typeString = variableType(type_)
52295229
let arraysize = arrayextentDims(name,v.numArrayElement)
52305230
<<
5231-
StatArrayDim<%dims%><<%typeString%>,<%arraysize%>> /*testassign5*/ <%arrayName%>;
5231+
StatArrayDim<%dims%><<%typeString%>,<%arraysize%>> <%arrayName%>;
52325232
>>
52335233
case v as SIMVAR(name=CREF_QUAL(__),arrayCref=SOME(_),numArrayElement=num) then
52345234
let &dims = buffer "" /*BUFD*/
@@ -5243,7 +5243,7 @@ match simVar
52435243
>>
52445244
*/
52455245
<<
5246-
StatArrayDim<%dims%><<%variableType(type_)%>, <%array_dimensions%>> /*testassign6*/<%arrayName%>;
5246+
StatArrayDim<%dims%><<%variableType(type_)%>, <%array_dimensions%>> <%arrayName%>;
52475247
>>
52485248
/*special case for varibales that marked as array but are not arrays */
52495249
case SIMVAR(numArrayElement=_::_) then
@@ -6892,9 +6892,9 @@ template expTypeFlag(DAE.Type ty, Integer flag)
68926892
//let dimstr = dims |> dim => '<%dimension(dim)%>' ;separator=','
68936893
let dimstr = checkDimension(dims)
68946894
match dimstr
6895-
case "" then 'DynArrayDim<%listLength(dims)%><<%expTypeShort(type)%>>/*testassign2*/'
6895+
case "" then 'DynArrayDim<%listLength(dims)%><<%expTypeShort(type)%>>'
68966896
//case
6897-
else 'StatArrayDim<%listLength(dims)%><<%expTypeShort(type)%>,<%dimstr%>>/*testassign*/'
6897+
else 'StatArrayDim<%listLength(dims)%><<%expTypeShort(type)%>,<%dimstr%>>'
68986898
end match
68996899
else expTypeFlag(ty, 2)
69006900
end match
@@ -9290,7 +9290,7 @@ template daeExpCall(Exp call, Context context, Text &preExp /*BUFP*/,
92909290
let var2 = daeExp(n, context, &preExp /*BUFC*/, &varDecls /*BUFD*/,simCode,useFlatArrayNotation)
92919291
//let temp = tempDeclAssign('const size_t*', &varDecls /*BUFD*/,'<%var1%>.shape()')
92929292
//let temp_ex = tempDecl('std::vector<size_t>', &varDecls /*BUFD*/)
9293-
let arrayType = /*expTypeArray(ty)*/expTypeFlag(ty,6) +"/*testtype*/"
9293+
let arrayType = /*expTypeArray(ty)*/expTypeFlag(ty,6)
92949294
//let dimstr = listLength(crefSubs(cr))
92959295
let tmp = tempDecl('<%arrayType%>', &varDecls /*BUFD*/)
92969296

@@ -9613,7 +9613,7 @@ template daeExpBinary(Operator it, Exp exp1, Exp exp2, Context context, Text &pr
96139613
//previous multi_array multi_array<double,<%listLength(dims)%>>
96149614
else match dimensions
96159615
case "" then 'DynArrayDim<%listLength(dims)%><double>'
9616-
else 'StatArrayDim<%listLength(dims)%><double, <%dimensions%> >/*testassign7*/'
9616+
else 'StatArrayDim<%listLength(dims)%><double, <%dimensions%> > '
96179617

96189618

96199619

@@ -9633,7 +9633,7 @@ template daeExpBinary(Operator it, Exp exp1, Exp exp2, Context context, Text &pr
96339633
case T_ARRAY(ty=T_ENUMERATION(__)) then 'multi_array<int,<%listLength(dims)%>>'
96349634
else match dimstr
96359635
case "" then 'DynArrayDim<%listLength(dims)%><double>'
9636-
else 'StatArrayDim<%listLength(dims)%><double, <%dimstr%> >/*testassign8*/'
9636+
else 'StatArrayDim<%listLength(dims)%><double, <%dimstr%> >'
96379637
let type1 = match ty case T_ARRAY(ty=T_INTEGER(__)) then "int"
96389638
case T_ARRAY(ty=T_ENUMERATION(__)) then "int"
96399639
else "double"
@@ -9650,7 +9650,7 @@ template daeExpBinary(Operator it, Exp exp1, Exp exp2, Context context, Text &pr
96509650
//previous multi_array multi_array<double,<%listLength(dims)%>>
96519651
else match dimensions
96529652
case "" then 'DynArrayDim<%listLength(dims)%><double>'
9653-
else 'StatArrayDim<%listLength(dims)%><double, <%dimensions%> >/*testassign7*/'
9653+
else 'StatArrayDim<%listLength(dims)%><double, <%dimensions%> >'
96549654

96559655

96569656

@@ -9671,7 +9671,7 @@ template daeExpBinary(Operator it, Exp exp1, Exp exp2, Context context, Text &pr
96719671
else 'double'
96729672
let var = match dimstr
96739673
case "" then tempDecl('DynArrayDim<%listLength(dims)%><<%type%>>', &varDecls /*BUFD*/)
9674-
else tempDecl('StatArrayDim<%listLength(dims)%><<%type%>, <%dimstr%> > /*testassign12*/', &varDecls /*BUFD*/)
9674+
else tempDecl('StatArrayDim<%listLength(dims)%><<%type%>, <%dimstr%> > ', &varDecls /*BUFD*/)
96759675
//let var = tempDecl1(type,e1,&varDecls /*BUFD*/)
96769676
//let &preExp += 'assign_array(<%var%>,divide_array<<%type%>,<%listLength(dims)%>>(<%e2%>, <%e1%>));<%\n%>'
96779677
'<%var%>'
@@ -9686,9 +9686,9 @@ template daeExpBinary(Operator it, Exp exp1, Exp exp2, Context context, Text &pr
96869686
else "double"
96879687
let var = match dimstr
96889688
case "" then tempDecl('DynArrayDim<%listLength(dims)%><<%type%>>', &varDecls /*BUFD*/)
9689-
else tempDecl('StatArrayDim<%listLength(dims)%><<%type%>, <%dimstr%> > /*testassign10*/', &varDecls /*BUFD*/)
9689+
else tempDecl('StatArrayDim<%listLength(dims)%><<%type%>, <%dimstr%> > ', &varDecls /*BUFD*/)
96909690
//let var = tempDecl1(type,e1,&varDecls /*BUFD*/)
9691-
let &preExp += 'add_array<<%type%>,<%listLength(dims)%>>(<%e1%>, <%e2%>,<%var%>);<%\n%>'
9691+
let &preExp += 'add_array<<%type%>>(<%e1%>, <%e2%>,<%var%>);<%\n%>'
96929692
'<%var%>'
96939693
case SUB_ARR(ty=T_ARRAY(dims=dims)) then
96949694
//let dimensions = (dims |> dim as DIM_INTEGER(integer=i) => '<%i%>';separator=",")
@@ -9698,10 +9698,10 @@ template daeExpBinary(Operator it, Exp exp1, Exp exp2, Context context, Text &pr
96989698
else "double"
96999699
let var = match dimstr
97009700
case "" then tempDecl('DynArrayDim<%listLength(dims)%><<%type%>>', &varDecls /*BUFD*/)
9701-
else tempDecl('StatArrayDim<%listLength(dims)%><<%type%>, <%dimstr%>> /*testassign13*/', &varDecls /*BUFD*/)
9701+
else tempDecl('StatArrayDim<%listLength(dims)%><<%type%>, <%dimstr%>> ', &varDecls /*BUFD*/)
97029702

97039703
//let var = tempDecl1(type,e1,&varDecls /*BUFD*/)
9704-
let &preExp += 'subtract_array<<%type%>,<%listLength(dims)%>>(<%e1%>, <%e2%>, <%var%>);<%\n%>'
9704+
let &preExp += 'subtract_array<<%type%>>(<%e1%>, <%e2%>, <%var%>);<%\n%>'
97059705
'<%var%>'
97069706
case MUL_ARR(__) then "daeExpBinary:ERR MUL_ARR not supported"
97079707
case DIV_ARR(__) then "daeExpBinary:ERR DIV_ARR not supported"
@@ -9759,7 +9759,7 @@ case UNARY(__) then
97599759
let listlength = listLength(ty.dims)
97609760
let tmp_type_str = match dimensions
97619761
case "" then 'DynArrayDim<%listlength%><double>'
9762-
else 'StatArrayDim<%listlength%><double, <%dimensions%>>/*testassign11*/'
9762+
else 'StatArrayDim<%listlength%><double, <%dimensions%>>'
97639763

97649764

97659765

SimulationRuntime/cpp/Core/Math/ArrayOperations.cpp

Lines changed: 143 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,108 @@ void transpose_array (BaseArray< T >& a, BaseArray< T >& x )
174174

175175
}
176176

177+
template < typename T>
178+
void multiply_array( BaseArray<T> & inputArray ,const T &b, BaseArray<T> & outputArray )
179+
{
180+
outputArray.setDims(inputArray.getDims());
181+
T* data = inputArray.getData();
182+
unsigned int nelems = inputArray.getNumElems();
183+
T* aim = outputArray.getData();
184+
std::transform (data, data + nelems, aim, std::bind2nd( std::multiplies< T >(), b ));
185+
};
186+
187+
188+
template < typename T>
189+
void divide_array( BaseArray<T> & inputArray ,const T &b, BaseArray<T> & outputArray )
190+
{
191+
outputArray.setDims(inputArray.getDims());
192+
T* data = inputArray.getData();
193+
unsigned int nelems = inputArray.getNumElems();
194+
T* aim = outputArray.getData();
195+
std::transform (data, data + nelems, aim, std::bind2nd( std::divides< T >(), b ));
196+
};
197+
198+
199+
template < typename T >
200+
void fill_array( BaseArray<T> & inputArray , T b)
201+
{
202+
T* data = inputArray.getData();
203+
unsigned int nelems = inputArray.getNumElems();
204+
std::fill( data, data + nelems, b);
205+
};
206+
207+
template < typename T >
208+
void subtract_array( BaseArray<T> & leftArray , BaseArray<T> & rightArray, BaseArray<T> & resultArray )
209+
{
210+
resultArray.setDims(leftArray.getDims());
211+
T* data1 = leftArray.getData();
212+
unsigned int nelems = leftArray.getNumElems();
213+
T* data2 = rightArray.getData();
214+
T* aim = resultArray.getData();
215+
216+
std::transform (data1, data1 + nelems, data2, aim, std::minus<T>());
217+
};
218+
219+
template < typename T >
220+
void add_array( BaseArray<T> & leftArray , BaseArray<T> & rightArray, BaseArray<T> & resultArray )
221+
{
222+
resultArray.setDims(leftArray.getDims());
223+
T* data1 = leftArray.getData();
224+
unsigned int nelems = leftArray.getNumElems();
225+
T* data2 = rightArray.getData();
226+
T* aim = resultArray.getData();
227+
228+
std::transform (data1, data1 + nelems, data2, aim, std::plus<T>());
229+
};
230+
231+
template < typename T >
232+
void usub_array(BaseArray<T> & a , BaseArray<T> & b)
233+
{
234+
b.setDims(a.getDims());
235+
int numEle = a.getNumElems();
236+
for ( unsigned int i = 1; i <= numEle; i++)
237+
{
238+
b(i) = -(a(i));
239+
}
240+
}
241+
242+
template < typename T>
243+
T sum_array ( BaseArray<T> & leftArray )
244+
{
245+
T val;
246+
val = std::accumulate( leftArray.getData(), leftArray.getData() + leftArray.getNumElems() ,0 );
247+
return val;
248+
}
249+
250+
251+
/**
252+
scalar product of two arrays (a,b type as template parameter)
253+
*/
254+
template < typename T >
255+
T dot_array( BaseArray<T> & a , BaseArray<T> & b )
256+
{
257+
if(a.getNumDims()!=1 || b.getNumDims()!=1)
258+
throw std::invalid_argument("error in dot array function. Wrong dimension");
259+
260+
T* data1 = a.getData();
261+
unsigned int nelems = a.getNumElems();
262+
T* data2 = b.getData();
263+
T r = std::inner_product(data1, data1 + nelems, data2, 0);
264+
};
265+
266+
/**
267+
cross product of two arrays (a,b type as template parameter)
268+
*/
269+
template < typename T >
270+
void cross_array( BaseArray<T> & a ,BaseArray<T> & b, BaseArray<T> & res )
271+
{
272+
res(1) = (a(2) * b(3)) - (a(3) * b(2));
273+
res(2) = (a(3) * b(1)) - (a(1) * b(3));
274+
res(3) = (a(1) * b(2)) - (a(2) * b(1));
275+
276+
};
277+
278+
177279
/*
178280
Explicit template instantiation for double,int,bool
179281
*/
@@ -191,4 +293,44 @@ template void promote_array(unsigned int n,BaseArray<bool>& s,BaseArray<bool>& d
191293

192294
template void create_array_from_shape(const spec_type& sp,BaseArray<double>& s,BaseArray<double>& d);
193295
template void create_array_from_shape(const spec_type& sp,BaseArray<int>& s,BaseArray<int>& d);
194-
template void create_array_from_shape(const spec_type& sp,BaseArray<bool>& s,BaseArray<bool>& d);
296+
template void create_array_from_shape(const spec_type& sp,BaseArray<bool>& s,BaseArray<bool>& d);
297+
298+
299+
300+
template void multiply_array( BaseArray<double> & inputArray ,const double &b, BaseArray<double> & outputArray );
301+
template void multiply_array( BaseArray<int> & inputArray ,const int &b, BaseArray<int> & outputArray );
302+
template void multiply_array( BaseArray<bool> & inputArray ,const bool &b, BaseArray<bool> & outputArray );
303+
304+
305+
template void divide_array( BaseArray<double> & inputArray ,const double &b, BaseArray<double> & outputArray );
306+
template void divide_array( BaseArray<int> & inputArray ,const int &b, BaseArray<int> & outputArray );
307+
template void divide_array( BaseArray<bool> & inputArray ,const bool &b, BaseArray<bool> & outputArray );
308+
309+
310+
template void fill_array( BaseArray<double> & inputArray , double b);
311+
template void fill_array( BaseArray<int> & inputArray , int b);
312+
template void fill_array( BaseArray<bool> & inputArray , bool b);
313+
314+
template void subtract_array( BaseArray<double> & leftArray , BaseArray<double> & rightArray, BaseArray<double> & resultArray );
315+
template void subtract_array( BaseArray<int> & leftArray , BaseArray<int> & rightArray, BaseArray<int> & resultArray );
316+
template void subtract_array( BaseArray<bool> & leftArray , BaseArray<bool> & rightArray, BaseArray<bool> & resultArray );
317+
318+
template void add_array( BaseArray<double> & leftArray , BaseArray<double> & rightArray, BaseArray<double> & resultArray );
319+
template void add_array( BaseArray<int> & leftArray , BaseArray<int> & rightArray, BaseArray<int> & resultArray );
320+
template void add_array( BaseArray<bool> & leftArray , BaseArray<bool> & rightArray, BaseArray<bool> & resultArray );
321+
322+
template void usub_array(BaseArray<double> & a , BaseArray<double> & b);
323+
template void usub_array(BaseArray<int> & a , BaseArray<int> & b);
324+
template void usub_array(BaseArray<bool> & a , BaseArray<bool> & b);
325+
326+
template double sum_array ( BaseArray<double> & leftArray );
327+
template int sum_array ( BaseArray<int> & leftArray );
328+
template bool sum_array ( BaseArray<bool> & leftArray );
329+
330+
template void cross_array( BaseArray<double> & a ,BaseArray<double> & b, BaseArray<double> & res );
331+
template void cross_array( BaseArray<int> & a ,BaseArray<int> & b, BaseArray<int> & res );
332+
template void cross_array( BaseArray<bool> & a ,BaseArray<bool> & b, BaseArray<bool> & res );
333+
334+
template double dot_array( BaseArray<double> & a , BaseArray<double> & b );
335+
template int dot_array( BaseArray<int> & a , BaseArray<int> & b );
336+
template bool dot_array( BaseArray<bool> & a , BaseArray<bool> & b );

0 commit comments

Comments
 (0)