⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mexlusolve.c

📁 SuperLU is a general purpose library for the direct solution of large, sparse, nonsymmetric systems
💻 C
字号:
/* * -- SuperLU routine (version 3.0) -- * Univ. of California Berkeley, Xerox Palo Alto Research Center, * and Lawrence Berkeley National Lab. * October 15, 2003 * */#include <stdio.h>#include "mex.h"#include "slu_ddefs.h"#ifdef V5#define  MatlabMatrix mxArray#else    /* V4 */#define  MatlabMatrix Matrix#endif/* Aliases for input and output arguments */#define A_in		prhs[0]#define b_in    	prhs[1]#define Pc_in		prhs[2]#define x_out		plhs[0]#define verbose (SPUMONI>0)#define babble  (SPUMONI>1)#define burble  (SPUMONI>2)void mexFunction(    int          nlhs,           /* number of expected outputs */    MatlabMatrix *plhs[],        /* matrix pointer array returning outputs */    int          nrhs,           /* number of inputs */#ifdef V5    const MatlabMatrix *prhs[]   /* matrix pointer array for inputs. */#else /* V4 */    MatlabMatrix *prhs[]         /* matrix pointer array for inputs */#endif    ){    int SPUMONI;             /* ... as should the sparse monitor flag */#ifdef V5    double FlopsInSuperLU;   /* ... as should the flop counter. */#else /* V4 */    Real FlopsInSuperLU;     /* ... as should the flop counter */#endif    extern flops_t LUFactFlops(SuperLUStat_t*);    extern flops_t LUSolveFlops(SuperLUStat_t*);        /* Arguments to dgssv(). */    SuperMatrix A;    SuperMatrix B;    SuperMatrix L, U;    int	   	m, n, nnz;    int         numrhs;    double 	*vb, *x;    double      *val;    int       	*rowind;    int		*colptr;    int    	*perm_r, *perm_c;    int		info;    MatlabMatrix *X, *Y;            /* args to calls back to Matlab */    int         i, mexerr;    superlu_options_t options;    SuperLUStat_t stat;    /* Check number of arguments passed from Matlab. */    if (nrhs != 3) {	mexErrMsgTxt("LUSOLVE requires 3 input arguments.");    } else if (nlhs != 1) {      	mexErrMsgTxt("LUSOLVE requires 1 output argument.");    }       /* Read the Sparse Monitor Flag */    X = mxCreateString("spumoni");    mexerr = mexCallMATLAB(1, &Y, 1, &X, "sparsfun");    SPUMONI = mxGetScalar(Y);#ifdef V5    mxDestroyArray(Y);    mxDestroyArray(X);#else    mxFreeMatrix(Y);    mxFreeMatrix(X);#endif    m = mxGetM(A_in);    n = mxGetN(A_in);    numrhs = mxGetN(b_in);    if ( babble ) printf("m=%d, n=%d, numrhs=%d\n", m, n, numrhs);    vb = mxGetPr(b_in);#ifdef V5    x_out = mxCreateDoubleMatrix(m, numrhs, mxREAL);#else    x_out = mxCreateFull(m, numrhs, REAL);#endif    x = mxGetPr(x_out);    perm_r = (int *) mxCalloc(m, sizeof(int));    perm_c = mxGetIr(Pc_in);     val = mxGetPr(A_in);    rowind = mxGetIr(A_in);    colptr = mxGetJc(A_in);    nnz = colptr[n];    dCreate_CompCol_Matrix(&A, m, n, nnz, val, rowind, colptr,			   SLU_NC, SLU_D, SLU_GE);    dCopy_Dense_Matrix(m, numrhs, vb, m, x, m);    dCreate_Dense_Matrix(&B, m, numrhs, x, m, SLU_DN, SLU_D, SLU_GE);    FlopsInSuperLU = 0;    set_default_options(&options);    options.ColPerm = MY_PERMC;    StatInit(&stat);    /* Call simple driver */    if ( verbose )      mexPrintf("Call LUSOLVE, use SUPERLU to factor first ...\n");    dgssv(&options, &A, perm_c, perm_r, &L, &U, &B, &stat, &info);#if 0 /* FLOPS is not available in the new Matlab. */    /* Tell Matlab how many flops we did. */    FlopsInSuperLU += LUFactFlops(&stat) + LUSolveFlops(&stat);    if ( verbose ) mexPrintf("LUSOLVE flops: %.f\n", FlopsInSuperLU);    mexerr = mexCallMATLAB(1, &X, 0, NULL, "flops");    *(mxGetPr(X)) += FlopsInSuperLU;    mexerr = mexCallMATLAB(1, &Y, 1, &X, "flops");#ifdef V5    mxDestroyArray(Y);    mxDestroyArray(X);#else    mxFreeMatrix(Y);    mxFreeMatrix(X);#endif#endif    /* Construct Matlab solution matrix. */    if ( !info ) {        Destroy_SuperNode_Matrix(&L);        Destroy_CompCol_Matrix(&U);        if ( babble ) printf("Destroy L & U from SuperLU...\n");    } else {	mexErrMsgTxt("Error returned from C dgssv().");    }    mxFree(perm_r);    StatFree(&stat);    return; }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -