Ejemplo n.º 1
0
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 */
        }
    }
}
Ejemplo n.º 2
0
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);
            }
        }
    }
}
Ejemplo n.º 3
0
void mul_alloc_real_matrix_product_smart(const real_array_t * a, const real_array_t * b, real_array_t* dest)
{
    if ((a->ndims == 1) && (b->ndims == 2)) {
        simple_alloc_1d_real_array(dest,b->dim_size[1]);
        mul_real_vector_matrix(a,b,dest);
    } else if ((a->ndims == 2) && (b->ndims == 1)) {
        simple_alloc_1d_real_array(dest,a->dim_size[0]);
        mul_real_matrix_vector(a,b,dest);
    } else if ((a->ndims == 2) && (b->ndims == 2)) {
        simple_alloc_2d_real_array(dest,a->dim_size[0],b->dim_size[1]);
        mul_real_matrix_product(a,b,dest);
    } else {
        printf("Invalid size of matrix\n");
    }
}
Ejemplo n.º 4
0
real_array_t mul_alloc_real_matrix_product_smart(const real_array_t a, const real_array_t b)
{
    real_array_t dest;
    if((a.ndims == 1) && (b.ndims == 2)) {
        simple_alloc_1d_real_array(&dest,b.dim_size[1]);
        mul_real_vector_matrix(&a,&b,&dest);
    } else if((a.ndims == 2) && (b.ndims == 1)) {
        simple_alloc_1d_real_array(&dest,a.dim_size[0]);
        mul_real_matrix_vector(&a,&b,&dest);
    } else if((a.ndims == 2) && (b.ndims == 2)) {
        simple_alloc_2d_real_array(&dest,a.dim_size[0],b.dim_size[1]);
        mul_real_matrix_product(&a,&b,&dest);
    } else {
        omc_assert_macro(0 == "Invalid size of matrix");
    }
    return dest;
}