[BACK]Return to numerical.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

Annotation of OpenXM_contrib2/asir2000/builtin/numerical.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/builtin/numerical.c,v 1.1.1.1 1999/11/10 08:12:25 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "parse.h"
        !             4:
        !             5: #if LAPACK
        !             6: #include <f2c.h>
        !             7:
        !             8: void Pflinsolve();
        !             9:
        !            10: struct ftab numerical_tab[] = {
        !            11:        {"flinsolve",Pflinsolve,2},
        !            12:        {0,0,0},
        !            13: };
        !            14:
        !            15: void Pflinsolve(arg,rp)
        !            16: NODE arg;
        !            17: VECT *rp;
        !            18: {
        !            19:        MAT mat;
        !            20:        VECT b,r;
        !            21:        int i,j;
        !            22:        integer n,nrhs,lda,ldb,info;
        !            23:        integer *ipiv;
        !            24:        doublereal *m_array,*b_array;
        !            25:        Num **mb;
        !            26:        Num *vb;
        !            27:        Real *rb;
        !            28:        char trans;
        !            29:
        !            30:        mat=(MAT)ARG0(arg); b=(VECT)ARG1(arg);
        !            31:        n=mat->row;
        !            32:        if ( n != mat->col )
        !            33:                error("flinsolve : non-square matrix");
        !            34:        if ( n != b->len )
        !            35:                error("flinsolve : inconsistent rhs");
        !            36:        m_array = (doublereal *)MALLOC_ATOMIC(n*n*sizeof(double));
        !            37:        b_array = (doublereal *)MALLOC_ATOMIC(n*sizeof(double));
        !            38:        ipiv = (integer *)MALLOC_ATOMIC(n*sizeof(integer));
        !            39:        for ( i = 0, mb = (Num **)mat->body; i < n; i++ )
        !            40:                for ( j = 0; j < n; j++ )
        !            41:                        m_array[i*n+j] = ToReal(mb[j][i]);
        !            42:        for ( i = 0, vb = (Num *)b->body; i < n; i++ )
        !            43:                        b_array[i] = ToReal(vb[i]);
        !            44:        trans = 'N';
        !            45:        nrhs = 1;
        !            46:        lda = n;
        !            47:        ldb = n;
        !            48:        dgetrf_(&n,&n,m_array,&lda,ipiv,&info);
        !            49:        if ( info )
        !            50:                error("flinsolve : LU factorization failed");
        !            51:        dgetrs_(&trans,&n,&nrhs,m_array,&lda,ipiv,b_array,&ldb,&info);
        !            52:        if ( info )
        !            53:                error("flinsolve : solving failed");
        !            54:        MKVECT(r,n);
        !            55:        for ( i = 0, rb = (Real *)r->body; i < n; i++ )
        !            56:                MKReal(b_array[i],rb[i]);
        !            57:        *rp = r;
        !            58: }
        !            59: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>