Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
- Added code generation for outerProduct


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@13955 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Nov 19, 2012
1 parent 6c5ab51 commit e8c210e
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 21 deletions.
12 changes: 10 additions & 2 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -6848,18 +6848,26 @@ template daeExpCall(Exp call, Context context, Text &preExp /*BUFP*/, Text &varD
case CALL(path=IDENT(name="cross"), expLst={v1, v2}) then
let var1 = daeExp(v1, context, &preExp /*BUFC*/, &varDecls /*BUFD*/)
let var2 = daeExp(v2, context, &preExp /*BUFC*/, &varDecls /*BUFD*/)
let arr_tp_str = '<%expTypeFromExpArray(v1)%>'
let arr_tp_str = expTypeFromExpArray(v1)
let tvar = tempDecl(arr_tp_str, &varDecls /*BUFD*/)
let &preExp += 'cross_alloc_<%arr_tp_str%>(&<%var1%>, &<%var2%>, &<%tvar%>);<%\n%>'
'<%tvar%>'

case CALL(path=IDENT(name="identity"), expLst={A}) then
let var1 = daeExp(A, context, &preExp /*BUFC*/, &varDecls /*BUFD*/)
let arr_tp_str = '<%expTypeFromExpArray(A)%>'
let arr_tp_str = expTypeFromExpArray(A)
let tvar = tempDecl(arr_tp_str, &varDecls /*BUFD*/)
let &preExp += 'identity_alloc_<%arr_tp_str%>(<%var1%>, &<%tvar%>);<%\n%>'
'<%tvar%>'

case CALL(path=IDENT(name="outerProduct"), expLst={A,B}) then
let var1 = daeExp(A, context, &preExp /*BUFC*/, &varDecls /*BUFD*/)
let var2 = daeExp(B, context, &preExp /*BUFC*/, &varDecls /*BUFD*/)
let arr_tp_str = expTypeFromExpArray(A)
let tvar = tempDecl(arr_tp_str, &varDecls /*BUFD*/)
let &preExp += 'outer_product_alloc_<%arr_tp_str%>(&<%var1%>, &<%var2%>, &<%tvar%>);<%\n%>'
'<%tvar%>'

case CALL(path=IDENT(name="rem"), expLst={e1, e2}) then
let var1 = daeExp(e1, context, &preExp, &varDecls)
let var2 = daeExp(e2, context, &preExp, &varDecls)
Expand Down
38 changes: 23 additions & 15 deletions SimulationRuntime/c/util/integer_array.c
Expand Up @@ -1344,26 +1344,34 @@ void transpose_integer_array(const integer_array_t * a, integer_array_t* dest)
}
}

void outer_product_integer_array(const integer_array_t * v1,const integer_array_t * v2,
integer_array_t* dest)
void outer_product_integer_array(const integer_array_t * v1,const integer_array_t * v2, integer_array_t* dest)
{
size_t i;
size_t j;
size_t number_of_elements_a;
size_t number_of_elements_b;
size_t i;
size_t j;
size_t number_of_elements_a;
size_t number_of_elements_b;

number_of_elements_a = base_array_nr_of_elements(v1);
number_of_elements_b = base_array_nr_of_elements(v2);
number_of_elements_a = base_array_nr_of_elements(v1);
number_of_elements_b = base_array_nr_of_elements(v2);

/* Assert a is a vector */
/* Assert b is a vector */
/* Assert a is a vector */
/* Assert b is a vector */

for (i = 0; i < number_of_elements_a; ++i) {
for (j = 0; i < number_of_elements_b; ++j) {
integer_set(dest, (i * number_of_elements_b) + j,
integer_get(v1, i)*integer_get(v2, j));
}
for (i = 0; i < number_of_elements_a; ++i) {
for (j = 0; i < number_of_elements_b; ++j) {
integer_set(dest, (i * number_of_elements_b) + j, integer_get(v1, i)*integer_get(v2, j));
}
}
}

void outer_product_alloc_integer_array(const integer_array_t* v1, const integer_array_t* v2, integer_array_t* dest)
{
size_t dim1,dim2;
assert(base_array_ok(v1));
dim1 = base_array_nr_of_elements(v1);
dim2 = base_array_nr_of_elements(v2);
alloc_integer_array(dest,dim1,dim2);
outer_product_integer_array(v1,v2,dest);
}

/* Fills an array with a value. */
Expand Down
4 changes: 2 additions & 2 deletions SimulationRuntime/c/util/integer_array.h
Expand Up @@ -237,8 +237,8 @@ extern void matrix_integer_array(const integer_array_t * a, integer_array_t* des
extern void matrix_integer_scalar(modelica_integer a,integer_array_t* dest);
extern void transpose_integer_array(const integer_array_t * a, integer_array_t* dest);
extern void transpose_alloc_integer_array(const integer_array_t * a, integer_array_t* dest);
extern void outer_product_integer_array(const integer_array_t * v1,const integer_array_t * v2,
integer_array_t* dest);
extern void outer_product_alloc_integer_array(const integer_array_t * v1,const integer_array_t * v2, integer_array_t* dest);
extern void outer_product_integer_array(const integer_array_t * v1,const integer_array_t * v2, integer_array_t* dest);
extern void fill_alloc_integer_array(integer_array_t* dest, modelica_integer value, int ndims, ...);
extern void identity_integer_array(int n, integer_array_t* dest);
extern void identity_alloc_integer_array(int n, integer_array_t* dest);
Expand Down
10 changes: 10 additions & 0 deletions SimulationRuntime/c/util/real_array.c
Expand Up @@ -1386,6 +1386,16 @@ void outer_product_real_array(const real_array_t * v1, const real_array_t * v2,
}
}

void outer_product_alloc_real_array(real_array_t* v1, real_array_t* v2, real_array_t* dest)
{
size_t dim1,dim2;
assert(base_array_ok(v1));
dim1 = base_array_nr_of_elements(v1);
dim2 = base_array_nr_of_elements(v2);
alloc_real_array(dest,dim1,dim2);
outer_product_real_array(v1,v2,dest);
}

void identity_real_array(int n, real_array_t* dest)
{
int i;
Expand Down
4 changes: 2 additions & 2 deletions SimulationRuntime/c/util/real_array.h
Expand Up @@ -212,8 +212,8 @@ extern void matrix_real_array(const real_array_t * a, real_array_t* dest);
extern void matrix_real_scalar(modelica_real a,real_array_t* dest);
extern void transpose_alloc_real_array(const real_array_t * a, real_array_t* dest);
extern void transpose_real_array(const real_array_t * a, real_array_t* dest);
extern void outer_product_real_array(const real_array_t * v1,const real_array_t * v2,
real_array_t* dest);
extern void outer_product_alloc_real_array(real_array_t* v1, real_array_t* v2, real_array_t* dest);
extern void outer_product_real_array(const real_array_t * v1,const real_array_t * v2, real_array_t* dest);
extern void identity_real_array(int n, real_array_t* dest);
extern void diagonal_real_array(const real_array_t * v,real_array_t* dest);
extern void fill_real_array(real_array_t* dest,modelica_real s);
Expand Down

0 comments on commit e8c210e

Please sign in to comment.