Skip to content

Commit

Permalink
- fix for array add in cpp template
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@12806 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
niklwors committed Sep 6, 2012
1 parent 0cf71a6 commit 1e5c4d2
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 60 deletions.
50 changes: 43 additions & 7 deletions Compiler/Template/CodegenCpp.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -603,7 +603,14 @@ end functionHeaderRecordConstruct;
template functionHeaderExternFunction(Function fn,SimCode simCode)
::=
match fn
case EXTERNAL_FUNCTION(__) then
case EXTERNAL_FUNCTION(outVars={var}) then
let fname = underscorePath(name)
<<
typedef <%funReturnDefinition1(var,simCode)%> <%fname%>RetType;
>>
case EXTERNAL_FUNCTION(outVars=_::_) then
let fname = underscorePath(name)
<<
typedef boost::tuple< <%outVars |> var => funReturnDefinition1(var,simCode) ;separator=", "%> > <%fname%>RetType;
Expand Down Expand Up @@ -974,14 +981,29 @@ case EXTERNAL_FUNCTION(__) then
<%match extReturn case SIMEXTARG(__) then extFunCallVardecl(extReturn, &varDecls /*BUFD*/)%>
<%dynamicCheck%>
<%returnAssign%><%extName%>(<%args%>);
<%extArgs |> arg => extFunCallVarcopy(arg,fname) ;separator="\n"%>
<%match extReturn case SIMEXTARG(__) then extFunCallVarcopy(extReturn,fname)%>
<%extArgs |> arg => extFunCallVarcopy(arg,fname) ;separator="\n"%>
<%match extReturn case SIMEXTARG(__) then extFunCallVarcopy(extReturn,fname)%>
>>
end extFunCallC;
template extFunCallVarcopy(SimExtArg arg, String fnName)
"Helper to extFunCall."
::=
match arg
case SIMEXTARG(outputIndex=oi, isArray=false, type_=ty, cref=c) then
match oi case 0 then
""
else
let cr = '<%extVarName2(c)%>'
<<
_<%fnName%> = <%cr%>;
>>
end extFunCallVarcopy;
template extFunCallVarcopy(SimExtArg arg, String fnName)
template extFunCallVarcopyTuple(SimExtArg arg, String fnName)
"Helper to extFunCall."
::=
match arg
Expand All @@ -996,7 +1018,7 @@ case SIMEXTARG(outputIndex=oi, isArray=false, type_=ty, cref=c) then
<<
<%assginBegin%>_<%fnName%><%assginEnd%> = <%cr%>;
>>
end extFunCallVarcopy;
end extFunCallVarcopyTuple;
template expTypeModelica(DAE.Type ty)
"Generate type helper."
Expand Down Expand Up @@ -5031,8 +5053,22 @@ template daeExpBinary(Operator it, Exp exp1, Exp exp2, Context context, Text &pr
case UMINUS(__) then "daeExpBinary:ERR UMINUS not supported"
case UMINUS_ARR(__) then "daeExpBinary:ERR UMINUS_ARR not supported"

case ADD_ARR(__) then "daeExpBinary:ERR ADD_ARR not supported"
case SUB_ARR(__) then "daeExpBinary:ERR SUB_ARR not supported"
case ADD_ARR(ty=T_ARRAY(dims=dims)) then
let type = match ty case T_ARRAY(ty=T_INTEGER(__)) then "int"
case T_ARRAY(ty=T_ENUMERATION(__)) then "int"
else "double"
let var = tempDecl('multi_array<<%type%>,<%listLength(dims)%>>', &varDecls /*BUFD*/)
//let var = tempDecl1(type,e1,&varDecls /*BUFD*/)
let &preExp += 'assign_array(<%var%>,add_array<<%type%>,<%listLength(dims)%>>(<%e1%>, <%e2%>));<%\n%>'
'<%var%>'
case SUB_ARR(ty=T_ARRAY(dims=dims)) then
let type = match ty case T_ARRAY(ty=T_INTEGER(__)) then "int"
case T_ARRAY(ty=T_ENUMERATION(__)) then "int"
else "double"
let var = tempDecl('multi_array<<%type%>,<%listLength(dims)%>>', &varDecls /*BUFD*/)
//let var = tempDecl1(type,e1,&varDecls /*BUFD*/)
let &preExp += 'assign_array(<%var%>,subtract_array<<%type%>,<%listLength(dims)%>>(<%e1%>, <%e2%>));<%\n%>'
'<%var%>'
case MUL_ARR(__) then "daeExpBinary:ERR MUL_ARR not supported"
case DIV_ARR(__) then "daeExpBinary:ERR DIV_ARR not supported"
case ADD_ARRAY_SCALAR(__) then "daeExpBinary:ERR ADD_ARRAY_SCALAR not supported"
Expand Down
83 changes: 30 additions & 53 deletions SimulationRuntime/cpp/Source/Math/Implementation/ArrayOperations.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,15 +165,11 @@ void usub_array(boost::multi_array_ref< T, dims > &a)
Applies array operation F (*,/) on array
*/

template<
typename T1, typename T2, size_t dims, class F,
template< typename, size_t > class Array1,
template< typename, size_t > class Array2
>
boost::multi_array_ref< T1, dims > array_operation( Array1< T1, dims > a, const Array2< T2, dims >& b, F& op )
template< typename T1, typename T2, size_t dims, class F >
boost::multi_array_ref< T1, dims > array_operation( boost::multi_array< T1, dims > a, const boost::multi_array_ref< T2, dims > b, F& op )
{
typename Array2< T2, dims >::const_iterator j = b.begin();
for ( typename Array1< T1, dims >::iterator i = a.begin();
typename boost::multi_array_ref< T2, dims >::const_iterator j = b.begin();
for ( typename boost::multi_array< T1, dims >::iterator i = a.begin();
i != a.end(); i++, j++ )
array_operation( *i, *j, op );
return a;
Expand All @@ -198,13 +194,11 @@ boost::multi_array_ref< T1, 1 > array_operation( boost::multi_array< T1, 1 > a,
/**
Applies array operation F (*,/) on sub array a[i]
*/
template<
typename T1, typename T2, size_t NumDims, class F,
template< typename, size_t > class Array2
>
boost::detail::multi_array::sub_array< T1, NumDims > array_operation( boost::detail::multi_array::sub_array< T1, NumDims > a, const Array2< T2, NumDims > &b, F op )
template<typename T1, typename T2, size_t NumDims, class F >

boost::detail::multi_array::sub_array< T1, NumDims > array_operation( boost::detail::multi_array::sub_array< T1, NumDims > a, const boost::multi_array_ref< T2, NumDims > &b, F op )
{
typename Array2< T2, NumDims >::const_iterator j = b.begin();
typename boost::multi_array_ref< T2, NumDims >::const_iterator j = b.begin();
for ( typename boost::detail::multi_array::sub_array< T1, NumDims >::iterator i = a.begin();
i != a.end(); i++, j++ )
array_operation( *i, *j, op );
Expand All @@ -214,13 +208,10 @@ boost::detail::multi_array::sub_array< T1, NumDims > array_operation( boost::det
/**
Applies array operation F (*,/) on one dimensial sub array a[i]
*/
template<
typename T1, typename T2, class F,
template< typename, size_t > class Array2
>
boost::detail::multi_array::sub_array< T1, 1 > array_operation( boost::detail::multi_array::sub_array< T1, 1 > a, const Array2< T2, 1 > &b, F op )
template< typename T1, typename T2, class F >
boost::detail::multi_array::sub_array< T1, 1 > array_operation( boost::detail::multi_array::sub_array< T1, 1 > a, boost::multi_array_ref< T2, 1 > &b, F op )
{
typename Array2< T2, 1 >::const_iterator j = b.begin();
typename boost::multi_array_ref< T2, 1 >::const_iterator j = b.begin();
for ( typename boost::detail::multi_array::sub_array< T1, 1 >::iterator i = a.begin();
i != a.end(); i++, j++ )
op( *i, *j );
Expand All @@ -233,14 +224,11 @@ Applies array operation F (+,-) on on dimensional subarray
*/

template<
typename T1, typename T2, typename T3, class F,
template< typename, size_t > class Array2,
template< typename, size_t > class Array3
>
boost::detail::multi_array::sub_array< T1, 1 > array_operation( boost::detail::multi_array::sub_array< T1, 1 > a, const Array2< T2, 1 > &b, const Array3< T3, 1 > &c, F op )
typename T1, typename T2, typename T3, class F >
boost::detail::multi_array::sub_array< T1, 1 > array_operation( boost::detail::multi_array::sub_array< T1, 1 > a, boost::multi_array_ref< T2, 1 > &b, boost::multi_array_ref< T3, 1 > &c, F op )
{
typename Array2< T2, 1 >::const_iterator j = b.begin();
typename Array3< T3, 1 >::const_iterator k = c.begin();
typename boost::multi_array_ref< T2, 1 >::const_iterator j = b.begin();
typename boost::multi_array_ref< T3, 1 >::const_iterator k = c.begin();
for ( typename boost::detail::multi_array::sub_array< T1, 1 >::iterator i = a.begin();
i != a.end(); i++, j++, k++ )
op( *i, *j, *k );
Expand All @@ -249,20 +237,16 @@ boost::detail::multi_array::sub_array< T1, 1 > array_operation( boost::detail::m


/**
Applies array operation F (+,-) on on dimensional array
Applies array operation F (+,-) on array
*/

template<
typename T1, typename T2, typename T3, class F,
template< typename, size_t > class Array1,
template< typename, size_t > class Array2,
template< typename, size_t > class Array3
>
Array1< T1, 1 > &array_operation( Array1< T1, 1 > &a, const Array2< T2, 1 > &b, const Array3< T3, 1 > &c, F op )
typename T1, typename T2, typename T3, class F >
boost::multi_array< T1, 1 > &array_operation( boost::multi_array< T1, 1 > &a, boost::multi_array_ref< T2, 1 > &b, boost::multi_array_ref< T3, 1 > &c, F op )
{
typename Array2< T2, 1 >::const_iterator j = b.begin();
typename Array3< T3, 1 >::const_iterator k = c.begin();
for ( typename Array1< T1, 1 >::iterator i = a.begin();
typename boost::multi_array_ref< T2, 1 >::const_iterator j = b.begin();
typename boost::multi_array_ref< T3, 1 >::const_iterator k = c.begin();
for ( typename boost::multi_array< T1, 1 >::iterator i = a.begin();
i != a.end(); i++, j++, k++ )
op( *i, *j, *k );
return a;
Expand All @@ -273,14 +257,11 @@ Applies array operation F (+,-) on subarray
*/

template<
typename T1, typename T2, typename T3, size_t dims, class F,
template< typename, size_t > class Array2,
template< typename, size_t > class Array3
>
boost::detail::multi_array::sub_array< T1, dims > array_operation( boost::detail::multi_array::sub_array< T1, dims > a, const Array2< T2, dims > &b, const Array3< T3, dims > &c, F op )
typename T1, typename T2, typename T3, size_t dims, class F >
boost::detail::multi_array::sub_array< T1, dims > array_operation( boost::detail::multi_array::sub_array< T1, dims > a, boost::multi_array_ref< T2, dims > &b, boost::multi_array_ref< T3, dims > &c, F op )
{
typename Array2< T2, dims >::const_iterator j = b.begin();
typename Array3< T3, dims >::const_iterator k = c.begin();
typename boost::multi_array_ref< T2, dims >::const_iterator j = b.begin();
typename boost::multi_array_ref< T3, dims >::const_iterator k = c.begin();
for ( typename boost::detail::multi_array::sub_array< T1, dims >::iterator i = a.begin();
i != a.end(); i++, j++, k++ ) array_operation( *i, *j, *k, op );
return a;
Expand All @@ -290,16 +271,12 @@ Applies array operation F (+,-) on array
*/

template<
typename T1, typename T2, typename T3, size_t dims, class F,
template< typename, size_t > class Array1,
template< typename, size_t > class Array2,
template< typename, size_t > class Array3
>
Array1< T1, dims > &array_operation( Array1< T1, dims > &a, const Array2< T2, dims > &b, const Array3< T3, dims > &c, F op )
typename T1, typename T2, typename T3, size_t dims, class F >
boost::multi_array< T1, dims > &array_operation( boost::multi_array< T1, dims > &a, boost::multi_array_ref< T2, dims > b, boost::multi_array_ref< T3, dims > c, F op )
{
typename Array2< T2, dims >::const_iterator j = b.begin();
typename Array3< T3, dims >::const_iterator k = c.begin();
for ( typename Array1< T1, dims >::iterator i = a.begin();
typename boost::multi_array_ref< T2, dims >::const_iterator j = b.begin();
typename boost::multi_array_ref< T3, dims >::const_iterator k = c.begin();
for (typename boost::multi_array< T1, dims >::iterator i = a.begin();
i != a.end(); i++, j++, k++ )
array_operation( *i, *j, *k, op );
return a;
Expand Down

0 comments on commit 1e5c4d2

Please sign in to comment.