void exp_real_array(const real_array_t * a, modelica_integer n, real_array_t* dest) { modelica_integer i; /* Assert n>=0 */ /* Assert a matrix */ /* Assert square matrix */ if (n==0) { identity_real_array(a->dim_size[0],dest); } else { if (n==1) { clone_real_array_spec(a,dest); copy_real_array_data(a,dest); } else { real_array_t* tmp = 0; clone_real_array_spec(a,tmp); copy_real_array_data(a,tmp); for (i = 1; i < n; ++i) { mul_real_matrix_product(a,tmp,dest); copy_real_array_data(dest,tmp); } } } }
/* function: transpose_real_array * * Implementation of transpose(A) for matrix A. */ void transpose_real_array(const real_array_t * a, real_array_t* dest) { size_t i; size_t j; /* size_t k;*/ size_t n,m; if (a->ndims == 1) { copy_real_array_data(a,dest); return; } assert(a->ndims==2 && dest->ndims==2); n = a->dim_size[0]; m = a->dim_size[1]; assert(dest->dim_size[0] == m && dest->dim_size[1] == n); for (i = 0; i < n; ++i) { for (j = 0; j < m; ++j) { real_set(dest, (j * n) + i, real_get(a, (i * m) + j)); } } }
void exp_real_array(const real_array_t * a, modelica_integer n, real_array_t* dest) { /* Assert n>=0 */ omc_assert_macro(n >= 0); /* Assert that a is a two dimensional square array */ omc_assert_macro((a->ndims == 2) && (a->dim_size[0] == a->dim_size[1])); /* Assert that dest is a two dimensional square array with the same size as a */ omc_assert_macro((dest->ndims == 2) && (dest->dim_size[0] == dest->dim_size[1]) && (a->dim_size[0] == dest->dim_size[0])); if(n==0) { identity_real_array(a->dim_size[0],dest); } else { if(n==1) { clone_real_array_spec(a,dest); copy_real_array_data(*a,dest); } else if (n==2) { clone_real_array_spec(a,dest); mul_real_matrix_product(a,a,dest); } else { modelica_integer i; real_array_t tmp; real_array_t * b; real_array_t * c; /* prepare temporary array */ clone_real_array_spec(a,&tmp); clone_real_array_spec(a,dest); if ((n&1) != 0) { b = &tmp; c = dest; } else { b = dest; c = &tmp; } mul_real_matrix_product(a,a,b); for( i = 2; i < n; ++i) { real_array_t * x; mul_real_matrix_product(a,b,c); /* exchange b and c */ x = b; b = c; c = x; } /* result is already in dest */ } } }
void copy_real_array(const real_array_t *source, real_array_t *dest) { clone_base_array_spec(source, dest); alloc_real_array_data(dest); copy_real_array_data(source,dest); }