예제 #1
0
파일: c_sci_if.c 프로젝트: maki63/c_sci
int sci_get_if(char *fname)
{
    static int l1, m1, n1;
    void *p_sci;
    static int l2, m2, n2;
    static int lr3, lc3;
    static int minrhs=2, maxrhs=2;
    static int minlhs=0, maxlhs=1;
    static int err;
    struct sci_var s_v;


    debug_3 ("[if_sci_get] ..................... \r\n");
    CheckRhs(minrhs,maxrhs);
    CheckLhs(minlhs,maxlhs);
    // example: pfir1
    m1=1;
    n1=1;
    GetRhsVar(1,"p",&m1,&n1,&l1);
    // example: SCI_TAPS
    GetRhsVar(2, "i", &m2, &n2, &l2);

    p_sci = (void *) ((unsigned long int) *stk(l1));
    s_v = sci_get_ifcpp(p_sci, *istk(l2));

    if (sci_err) {
        sciprint("\n%s:\n info:%d\n",sci_err_msg,sci_info);
        Scierror(999,"%s failed err=%d", fname, sci_err);
        return 0;
    }
    // now when m3,n3 are set - create [mxn] sci variable on stack (it=is_complex)
    if (s_v.is_double)
    {   CreateCVar(3,"d", &s_v.is_complex, &s_v.m, &s_v.n, &lr3, &lc3);
        // alocated mem on scilab stack for [mxn] of (complex) double
        s_v.p_re=stk(lr3);
        s_v.p_im=stk(lc3);
    }
    else if (s_v.is_boolean)
    {   CreateVar(3,"b", &s_v.m, &s_v.n, &lr3);
        // alocated mem on scilab stack for [mxn] boolean
        s_v.p_re=istk(lr3);
        s_v.p_im=NULL;
    }
    else
    {   lr3 = I_INT32;;
        CreateVar(3,"I", &s_v.m, &s_v.n, &lr3);
        // alocated mem on scilab stack for [mxn] of U_INT32
        s_v.p_re=istk(lr3);
        s_v.p_im=NULL;
    }
    // copy values
    sci_pop_var(&s_v);
    // remove data from heap
    sci_delete_var(&s_v);
    LhsVar(1) = 3; /* return var */
    debug_3 ("[if_sci_get] +++++++++++++++++++++ \r\n");
    return 0;
}
예제 #2
0
/*--------------------------------------------------------------------------*/
int C2F(intbdiagr)(char *fname, long unsigned int fname_len)
{
    int ix1, ix2;
    double dx1;
    int fail;
    double rMax;
    int ix, j, k, m, n;
    double t;
    int nbloc, lrMax;
    int m1, n1, la, le, lj, it;
    int lw, lx ;
    int lai, lib, lbs, lxi, lxr;

    CheckRhs(1, 2);
    CheckLhs(1, 3);

    GetRhsCVar(1, MATRIX_OF_DOUBLE_DATATYPE, &it, &m, &n, &la, &lai);
    CheckSquare(1, m, n);

    if (n == 0)
    {
        CreateVar(2, MATRIX_OF_DOUBLE_DATATYPE, &cx0, &cx0, &lx);
        CreateVar(3, MATRIX_OF_DOUBLE_DATATYPE, &cx0, &cx0, &lbs);
        LhsVar(1) = 1;
        LhsVar(2) = 2;
        LhsVar(3) = 3;
        return 0;
    }
    ix1 = (it + 1) * m * n;
    if (C2F(vfinite)(&ix1, stk(la )) == 0)
    {
        Err = 1;
        SciError(264);
        return 0;
    }
    if (Rhs == 2)
    {
        GetRhsVar(2, MATRIX_OF_DOUBLE_DATATYPE, &n1, &m1, &lrMax);
        CheckScalar(2, n1, m1);
        rMax = *stk(lrMax );
    }
    else
    {
        rMax = 1.;
        lj = la - 1;
        ix1 = n;
        for (j = 1; j <= ix1; ++j)
        {
            t = 0.;
            ix2 = n;
            for (ix = 1; ix <= ix2; ++ix)
            {
                t += (dx1 = *stk(lj + ix ), Abs(dx1));
            }
            if (t > rMax)
            {
                rMax = t;
            }
            lj += n;
        }
    }
    CreateCVar(2, MATRIX_OF_DOUBLE_DATATYPE, &it, &n, &n, &lxr, &lxi);
    ix1 = n << 1;
    CreateVar(3, MATRIX_OF_DOUBLE_DATATYPE, &cx1, &ix1, &le);
    CreateVar(4, MATRIX_OF_INTEGER_DATATYPE, &cx1, &n, &lib);
    CreateVar(5, MATRIX_OF_DOUBLE_DATATYPE, &cx1, &n, &lw);
    if (it == 0)
    {
        /*     subroutine bdiag(lda,n,a,epsshr,rMax,er,ei,bs,x,xi,scale,job,fail) */
        C2F(bdiag)(&n, &n, stk(la ), &c_b40, &rMax, stk(le ), stk(le + n ),
                   istk(lib ), stk(lxr ), stk(lxi ), stk(lw ), &cx0, &fail);
    }
    else
    {
        C2F(wbdiag)(&n, &n, stk(la ), stk(la + n * n ), &rMax, stk(le ),
                    stk(le + n ), istk(lib ), stk(lxr ), stk(lxi ), &t, &t, stk(lw ), &cx0, &fail);
    }

    if (fail)
    {
        Scierror(24, _("%s: Non convergence in QR steps.\n"), fname);
        return 0;
    }
    if (Lhs == 3)
    {
        nbloc = 0;
        for (k = 1; k <= n; ++k)
            if (*istk(lib + k - 2 + 1) >= 0)
            {
                ++nbloc;
            }
        CreateVar(6, MATRIX_OF_DOUBLE_DATATYPE, &nbloc, &cx1, &lbs);
        ix = 0;
        for (k = 1; k <= n; ++k)
        {
            if (*istk(lib + k - 2 + 1) >= 0)
            {
                *stk(lbs + ix ) = (double) * istk(lib + k - 2 + 1);
                ++ix;
            }
        }
    }
    LhsVar(1) = 1;
    LhsVar(2) = 2;
    LhsVar(3) = 6;
    return 0;
} /* intbdiagr_ */
예제 #3
0
파일: hmops.c 프로젝트: ZhanlinWang/scilab
int C2F(intehm)()
{
    /*
     *  Extraction routine for an hypermatrix of type REAL_OR_COMPLEX, BOOLEAN
     *  and INTEGER (the 6 types of scilab ints)
     *
     *    He = ehm ( v_1, v_2, ..., v_nb_iv, H )
     *
     */
    HyperMat H, He;
    int dec, i, k, l, m, n, mn, ntot, ind_max;
    int *j, ier, one = 1, zero = 0, ltot, nb_index_vectors, final_dimsize, lr, lc;
    int *P, *Pe;
    short int *siP, *siPe;
    char  *cP, *cPe;

    /*   CheckLhs(minlhs,maxlhs); */

    if ( Rhs < 2 )
    {
        Scierror(999, _("%s: Wrong number of input arguments: at least %d expected.\n"), "hmops", 2);
        return(0);
    };

    if ( ! get_hmat(Rhs, &H) )
    {
        Scierror(999, _("%s: Wrong type for input argument(s): An hypermatrix expected.\n"), "hmops");
        return 0;
    }
    else if ( H.type == NOT_REAL_or_CMPLX_or_BOOL_or_INT  || H.type == OLD_HYPERMAT )
    {
        /*  do the extraction with the macro %hm_e  */
        Fin = -Fin;
        return 0;
    }

    nb_index_vectors = Rhs - 1;
    if ( H.dimsize <  nb_index_vectors )
    {
        Scierror(999, _("%s: Wrong number of input arguments: at most %d expected.\n"), "hmops", H.dimsize);
        return 0;
    }
    else if ( H.dimsize > nb_index_vectors )  /* reshape H */
    {
        ReshapeHMat(Rhs + 1, &H, nb_index_vectors );
        dec = Rhs + 1;
    }
    else
    {
        dec = Rhs;
    }

    if ( H.size == 0 )   /* the hypermat is empty => return an empty matrix ? */
    {
        CreateVar(dec + 1, MATRIX_OF_DOUBLE_DATATYPE, &zero, &zero, &l);
        LhsVar(1) = dec + 1;
        PutLhsVar();
        return 0;
    }


    ntot = 1;   /* will be the nb of elts of the extracted hmat or mat */
    for ( i = 1 ; i <= nb_index_vectors ; i++ )
    {
        ier = create_index_vector(i, dec + i, &mn, H.dims[i - 1], &ind_max);
        if ( ier == 0  ||  ind_max > H.dims[i - 1] )
        {
            Scierror(999, _("%s: Bad index #%d in hypermatrix extraction. "), "hmops", i);
            return 0;
        }
        if ( mn == 0 )   /* the vector index is [] => we return an empty matrix */
        {
            CreateVar(dec + i + 1, MATRIX_OF_DOUBLE_DATATYPE, &zero, &zero, &l);
            LhsVar(1) = dec + i + 1;
            PutLhsVar();
            return 0;
        }
        ntot *= mn;
    }

    /*  For the Matlab compatibility : an hypermatrix of profil n1 x ... x nj x ... x nk
     *  with  nj > 1 and nj+1 = ... = nk = 1 becomes an hypermatrix of profil n1 x ... x nj
     *  Moreover, in scilab, if nj <= 2, we get in fact a matrix.
     */
    final_dimsize = nb_index_vectors;
    while (final_dimsize > 1 && get_length(dec + final_dimsize) == 1)
    {
        final_dimsize--;
    }
    if ( final_dimsize > 2 )   /* we create an hypermatrix for the extraction result */
    {
        He.dimsize = final_dimsize;
        He.size = ntot;
        He.it = H.it;
        He.type = H.type;
        CreateHMat(dec + Rhs, &He);
        for ( k = 0 ; k < final_dimsize ; k++ )
        {
            He.dims[k] = get_length(dec + k + 1);
        }
    }
    else                /* we create a matrix  for the extraction result */
    {
        m = get_length(dec + 1);
        if (final_dimsize > 1)
        {
            n = get_length(dec + 2);
        }
        else
        {
            n = 1;
        }
        switch (H.type)
        {
            case (sci_matrix):
                CreateCVar(dec + Rhs, MATRIX_OF_DOUBLE_DATATYPE, &(H.it), &m, &n, &lr, &lc);
                He.R = stk(lr);
                if ( H.it == 1 )
                {
                    He.I = stk(lc);
                }
                break;
            case (sci_boolean):
                CreateVar(dec + Rhs, MATRIX_OF_BOOLEAN_DATATYPE, &m, &n, &lr);
                He.P = (void *) istk(lr);
                break;
            case (sci_ints):
                lr = H.it;
                CreateVar(dec + Rhs, MATRIX_OF_VARIABLE_SIZE_INTEGER_DATATYPE, &m, &n, &lr);
                He.P = (void *) istk(lr);
                break;
        }
    }

    /* indices computing */
    ltot = 4;
    CreateVar(dec + Rhs + 1, MATRIX_OF_VARIABLE_SIZE_INTEGER_DATATYPE, &ntot, &one, &ltot);
    j = istk(ltot);
    compute_indices(dec, nb_index_vectors, H.dims, j);

    /*  fill the resulting hypermatrix or matrix  */
    switch ( H.type )
    {
        case (sci_matrix) :
            for ( k = 0 ; k < ntot ; k++ )
            {
                He.R[k] = H.R[j[k]];
            }
            if (H.it == 1)
                for ( k = 0 ; k < ntot ; k++ )
                {
                    He.I[k] = H.I[j[k]];
                }
            break;

        case (sci_boolean) :     /* (sci_boolean stored with 4 bytes) */
            Pe = (int *) He.P ;
            P = (int *) H.P;
            for ( k = 0 ; k < ntot ; k++ )
            {
                Pe[k] = P[j[k]];
            }
            break;

        case (sci_ints) :
            if ( H.it == I_INT32  ||  H.it == I_UINT32 )
            {
                Pe = (int *) He.P;
                P = (int *) H.P;
                for ( k = 0 ; k < ntot ; k++ )
                {
                    Pe[k] = P[j[k]];
                }
            }
            else if ( H.it == I_INT16  ||  H.it == I_UINT16 )
            {
                siPe = (short int *) He.P;
                siP = (short int *) H.P;
                for ( k = 0 ; k < ntot ; k++ )
                {
                    siPe[k] = siP[j[k]];
                }
            }
            else    /* SCI_INT8 and SCI_UINT8 : 1 Byte int */
            {
                cPe = (char *) He.P;
                cP = (char *) H.P;
                for ( k = 0 ; k < ntot ; k++ )
                {
                    cPe[k] = cP[j[k]];
                }
            }
            break;
    }

    LhsVar(1) = dec + Rhs;
    PutLhsVar();
    return 0;
}
예제 #4
0
파일: c_sci_if.c 프로젝트: maki63/c_sci
int sci_proc_if(char *fname)
{
    static int l1, m1, n1;
    void *p_sci;
    static int l2, m2, n2;
    static int lr3, lc3, it3, m3, n3;
    static int lr4, lc4;
    static int minrhs=3, maxrhs=3;
    static int minlhs=1, maxlhs=1;
    static int err=0;
    struct sci_var s_ce;
    struct sci_var s_x;
    struct sci_var s_y;

    SciIntMat M1;
    sci_types sci_var_type;

    debug_3 ("[sci_proc_if] ..................... \r\n");
    CheckRhs(minrhs,maxrhs);
    CheckLhs(minlhs,maxlhs);
    // Example:pfir1
    m1=1;
    n1=1;
    GetRhsVar(1,"p",&m1,&n1,&l1);
    // Example:ce -  boolean
    GetRhsVar(2, "b", &m2, &n2, &l2);
    s_ce.is_complex=0;
    s_ce.is_double=0;
    s_ce.is_boolean=1;
    s_ce.p_re=istk(l2);
    s_ce.p_im=NULL;
    s_ce.m=m2;
    s_ce.n=n2;
    s_ce.p_var=NULL;
    // Example:x
    sci_var_type=GetType(3);
    switch(sci_var_type)
    {
    case sci_matrix: // "1 - A matrix of doubles\n"
        GetRhsCVar(3, "d", &it3, &m3, &n3, &lr3, &lc3);
        s_x.is_complex=it3;
        s_x.is_double=1;
        s_x.is_boolean=0;
        s_x.p_re=stk(lr3);
        s_x.p_im=stk(lc3);
        s_x.m=m3;
        s_x.n=n3;
        s_x.p_var=NULL;
        break;
    case sci_boolean: // "4 - A matrix of booleans\n";
        GetRhsVar(3, "b", &m3, &n3, &lr3);
        s_x.is_complex=0;
        s_x.is_double=0;
        s_x.is_boolean=1;
        s_x.p_re=istk(lr3);
        s_x.p_im=NULL;
        s_x.m=m3;
        s_x.n=n3;
        s_x.p_var=NULL;
        break;
    case sci_ints:  // "8 - A matrix of integers\n - 32bit nothing else";
        // This is coded as in an example: modnum_422\ intmodnum_lib.c\ int intspread_c(char *fname)
        GetRhsVar(3, "I", &m3, &n3, &M1);
        // check the type of int (M1.it==I_INT32 | M1.it==I_UINT32)
        s_x.is_complex = 0;
        s_x.is_double = 0;
        s_x.is_boolean = 0;
        s_x.p_re = M1.D;
        s_x.p_im = NULL;
        s_x.m = m3;
        s_x.n = n3;
        s_x.p_var = NULL;
        break;
    default:
        Scierror(999,"Unsupported argument type %s failed err=", fname, -1);
        break;
    }
    p_sci = (void *) ((unsigned long int) *stk(l1));
    s_y = sci_proc_ifcpp(p_sci, &s_ce, &s_x );
    if (sci_err) {
        sciprint("\n%s:\n info:%d\n",sci_err_msg,sci_info);
        Scierror(999,"%s failed err=%d", fname, sci_err);
        return 0;
    }
    // now when m3,n3 are set - create [mxn] sci variable on stack (it=is_complex)
    if (s_y.is_double)
    {   CreateCVar(4,"d", &s_y.is_complex, &s_y.m, &s_y.n, &lr4, &lc4);
        // alocated mem on scilab stack for [mxn] of (complex) double
        s_y.p_re = stk(lr4);
        s_y.p_im = stk(lc4);
    }
    else if (s_y.is_boolean)
    {   CreateVar(4,"b", &s_y.m, &s_y.n, &lr4);
        // alocated mem on scilab stack for [mxn] boolean
        s_y.p_re = istk(lr4);
        s_y.p_im = NULL;
    }
    else
    {   lr4 = I_INT32;
        CreateVar(4,"I", &s_y.m, &s_y.n, &lr4);
        // alocated mem on scilab stack for [mxn] I_INT32;
        s_y.p_re = istk(lr4);
        s_y.p_im = NULL;
    }
    // copy values
    sci_pop_var(&s_y);
    // remove data from heap
    sci_delete_var(&s_y);
    LhsVar(1) = 4; /* return var */
    debug_3 ("[sci_proc_if] +++++++++++++++++++++ \r\n");
    return 0;

}