Skip to content

Commit

Permalink
Fix for #2056:
Browse files Browse the repository at this point in the history
- Use 32-bit integer arrays for external fortran functions.
- Added test case LapackInverse, and removed incomplete and broken test case
  JoinThreeVectors2.


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@15241 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
perost committed Feb 19, 2013
1 parent 595530c commit 166629b
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 3 deletions.
6 changes: 3 additions & 3 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -4740,7 +4740,7 @@ case var as VARIABLE(parallelism = NON_PARALLEL(__)) then
let var_name = if outStruct then
'<%extVarName(var.name)%>' else
'<%contextCref(var.name, contextFunction)%>'
let defaultValue1 = '<%var_name%> = <%daeExp(exp, contextFunction, &varInits /*BUFC*/, &varDecls /*BUFD*/)%>;<%\n%>'
let defaultValue1 = '<%varName%> = <%daeExp(exp, contextFunction, &varInits /*BUFC*/, &varDecls /*BUFD*/)%>;<%\n%>'
let &varInits += defaultValue1
" "
else
Expand Down Expand Up @@ -5240,7 +5240,7 @@ template extFunCallVardeclF77(SimExtArg arg, Text &varDecls)
""
else
let &varDecls += '<%expTypeArrayIf(ty)%> <%extVarName(c)%>;<%\n%>'
if not ea.hasBinding then 'convert_alloc_<%expTypeArray(ty)%>_to_f77(&out.c<%oi%>, &<%extVarName(c)%>);'
'convert_alloc_<%expTypeArray(ty)%>_to_f77(&out.c<%oi%>, &<%extVarName(c)%>);'
case SIMEXTARG(type_ = ty, cref = c) then
let &varDecls += '<%extTypeF77(ty,false)%> <%extVarName(c)%>;<%\n%>'
""
Expand Down Expand Up @@ -5347,7 +5347,7 @@ template extArgF77(SimExtArg extArg, Text &preExp, Text &varDecls)
match extArg
case SIMEXTARG(cref=c, isArray=true, type_=t) then
// Arrays are converted to fortran format that are stored in _ext-variables.
'data_of_<%expTypeShort(t)%>_array(&(<%extVarName(c)%>))'
'data_of_<%expTypeShort(t)%>_f77_array(&(<%extVarName(c)%>))'
case SIMEXTARG(cref=c, outputIndex=oi, type_=T_INTEGER(__)) then
// Always prefix fortran arguments with &.
let suffix = if oi then "_ext"
Expand Down
42 changes: 42 additions & 0 deletions SimulationRuntime/c/util/integer_array.c
Expand Up @@ -1618,6 +1618,36 @@ _index_t* integer_array_make_index_array(const integer_array_t *arr)
return arr->data;
}

/* Converts the elements of an integer_array to int and packs them. I.e. if the
* array element type is 64 bits and int is 32 bits then the data will be packed
* in the first half of the array. */
void pack_integer_array(integer_array_t *a)
{
size_t i, n;
int *int_data;

int_data = (int*)a->data;
n = integer_array_nr_of_elements(a);

for(i = 0; i < n; ++i) {
int_data[i] = (int)integer_get(a, i);
}
}

/* Unpacks an integer_array that was packed with pack_integer_array */
void unpack_integer_array(integer_array_t *a)
{
size_t n;
long i;
int *int_data;

int_data = (int*)a->data;
n = integer_array_nr_of_elements(a);

for(i = n - 1; i >= 0; --i) {
integer_set(a, i, int_data[i]);
}
}

void convert_alloc_integer_array_to_f77(const integer_array_t * a,
integer_array_t* dest)
Expand All @@ -1626,6 +1656,13 @@ void convert_alloc_integer_array_to_f77(const integer_array_t * a,
clone_reverse_integer_array_spec(a,dest);
alloc_integer_array_data(dest);
transpose_integer_array (a,dest);

/* Assume that external fortran functions use int, and pack the array if
* needed. */
if(sizeof(int) != sizeof(modelica_integer)) {
pack_integer_array(dest);
}

for(i = 0; i < dest->ndims; ++i) {
dest->dim_size[i] = a->dim_size[i];
}
Expand All @@ -1643,6 +1680,11 @@ void convert_alloc_integer_array_from_f77(const integer_array_t * a,
a->dim_size[i] = tmp;
}
transpose_integer_array (a,dest);

/* Unpack the array if needed */
if(sizeof(int) != sizeof(modelica_integer)) {
unpack_integer_array(dest);
}
}

void sizes_of_dimensions_base_array(const base_array_t *a, integer_array_t *dest)
Expand Down
4 changes: 4 additions & 0 deletions SimulationRuntime/c/util/integer_array.h
Expand Up @@ -286,4 +286,8 @@ static inline int* data_of_integer_array(const integer_array_t *a)
}
return res;
}

static inline int* data_of_integer_f77_array(const integer_array_t *a)
{ return (int *) a->data; }

#endif
2 changes: 2 additions & 0 deletions SimulationRuntime/c/util/real_array.h
Expand Up @@ -203,6 +203,8 @@ static inline int size_of_dimension_real_array(real_array_t a, int i)
{ return size_of_dimension_base_array(a, i); }
static inline modelica_real *data_of_real_array(const real_array_t *a)
{ return (modelica_real *) a->data; }
static inline modelica_real *data_of_real_f77_array(const real_array_t *a)
{ return (modelica_real *) a->data; }

extern void size_real_array(const real_array_t * a,integer_array_t* dest);
extern modelica_real scalar_real_array(const real_array_t * a);
Expand Down

0 comments on commit 166629b

Please sign in to comment.