1be1d678aSKris Buschelman #define PETSCMAT_DLL 2be1d678aSKris Buschelman 33b3e256bSKris Buschelman /* 43b3e256bSKris Buschelman Provides an interface for the Matlab engine sparse solver 53b3e256bSKris Buschelman 63b3e256bSKris Buschelman */ 77c4f633dSBarry Smith #include "../src/mat/impls/aij/seq/aij.h" 83b3e256bSKris Buschelman 93b3e256bSKris Buschelman #include "engine.h" /* Matlab include file */ 103b3e256bSKris Buschelman #include "mex.h" /* Matlab include file */ 113b3e256bSKris Buschelman 12a1d52234SKris Buschelman 13a1d52234SKris Buschelman EXTERN_C_BEGIN 14a1d52234SKris Buschelman #undef __FUNCT__ 15b3866ffcSBarry Smith #define __FUNCT__ "MatlabEnginePut_SeqAIJ" 16b3866ffcSBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatlabEnginePut_SeqAIJ(PetscObject obj,void *mengine) 17a1d52234SKris Buschelman { 18dfbe8321SBarry Smith PetscErrorCode ierr; 19a1d52234SKris Buschelman Mat B = (Mat)obj; 20a1d52234SKris Buschelman mxArray *mat; 21a1d52234SKris Buschelman Mat_SeqAIJ *aij = (Mat_SeqAIJ*)B->data; 22a1d52234SKris Buschelman 23a1d52234SKris Buschelman PetscFunctionBegin; 24f0523c5fSHong Zhang mat = mxCreateSparse(B->cmap->n,B->rmap->n,aij->nz,mxREAL); 25f0523c5fSHong Zhang //mat = mxCreateSparse(((PetscObject)B)->cmap.n,((PetscObject)B)->rmap.n,((Mat_SeqAIJ*)aij)->nz,mxREAL); 26a1d52234SKris Buschelman ierr = PetscMemcpy(mxGetPr(mat),aij->a,aij->nz*sizeof(PetscScalar));CHKERRQ(ierr); 27a1d52234SKris Buschelman /* Matlab stores by column, not row so we pass in the transpose of the matrix */ 28a1d52234SKris Buschelman ierr = PetscMemcpy(mxGetIr(mat),aij->j,aij->nz*sizeof(int));CHKERRQ(ierr); 29f0523c5fSHong Zhang ierr = PetscMemcpy(mxGetJc(mat),aij->i,(B->rmap->n+1)*sizeof(int));CHKERRQ(ierr); 30a1d52234SKris Buschelman 31a1d52234SKris Buschelman /* Matlab indices start at 0 for sparse (what a surprise) */ 32a1d52234SKris Buschelman 33a1d52234SKris Buschelman ierr = PetscObjectName(obj);CHKERRQ(ierr); 34a1d52234SKris Buschelman engPutVariable((Engine *)mengine,obj->name,mat); 35a1d52234SKris Buschelman PetscFunctionReturn(0); 36a1d52234SKris Buschelman } 37a1d52234SKris Buschelman EXTERN_C_END 38a1d52234SKris Buschelman 39a1d52234SKris Buschelman EXTERN_C_BEGIN 40a1d52234SKris Buschelman #undef __FUNCT__ 41*ff800b82SBarry Smith #define __FUNCT__ "MatCreateSeqAIJFromMatlab" 42*ff800b82SBarry Smith /*@ 43*ff800b82SBarry Smith MatCreateSeqAIJFromMatlab - Given a Matlab sparse matrix, fills a SeqAIJ matrix with its transpose. 44*ff800b82SBarry Smith 45*ff800b82SBarry Smith Not Collective 46*ff800b82SBarry Smith 47*ff800b82SBarry Smith Input Parameters: 48*ff800b82SBarry Smith + mmat - a Matlab sparse matris 49*ff800b82SBarry Smith - mat - a already created MATSEQAIJ 50*ff800b82SBarry Smith 51*ff800b82SBarry Smith Developer Notes: on 64 bit systems Matlab uses 64 bit integers hence mWIndex is size_t. 52*ff800b82SBarry Smith 53*ff800b82SBarry Smith @*/ 54*ff800b82SBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqAIJFromMatlab(mxArray *mmat,Mat *mat) 55*ff800b82SBarry Smith { 56*ff800b82SBarry Smith PetscErrorCode ierr; 57*ff800b82SBarry Smith int nz,n,m,*i,*j,k; 58*ff800b82SBarry Smith mwIndex nnz,nn,nm,*ii,*jj; 59*ff800b82SBarry Smith PetscScalar *a; 60*ff800b82SBarry Smith Mat_SeqAIJ *aij; 61*ff800b82SBarry Smith 62*ff800b82SBarry Smith PetscFunctionBegin; 63*ff800b82SBarry Smith nn = mxGetN(mmat); 64*ff800b82SBarry Smith nm = mxGetM(mmat); 65*ff800b82SBarry Smith nnz = (mxGetJc(mmat))[nn]; 66*ff800b82SBarry Smith ii = mxGetJc(mmat); 67*ff800b82SBarry Smith jj = mxGetIr(mmat); 68*ff800b82SBarry Smith n = (PetscInt) nn; 69*ff800b82SBarry Smith m = (PetscInt) nm; 70*ff800b82SBarry Smith nz = (PetscInt) nnz; 71*ff800b82SBarry Smith ierr = PetscMalloc3(nz,PetscScalar,&a,nz,PetscInt,&j,n+1,PetscInt,&i);CHKERRQ(ierr); 72*ff800b82SBarry Smith 73*ff800b82SBarry Smith for (k=0; k<n+1; k++) { 74*ff800b82SBarry Smith i[k] = (PetscInt) ii[k]; 75*ff800b82SBarry Smith } 76*ff800b82SBarry Smith for (k=0; k<nz; k++) { 77*ff800b82SBarry Smith j[k] = (PetscInt) jj[k]; 78*ff800b82SBarry Smith } 79*ff800b82SBarry Smith ierr = PetscMemcpy(a,mxGetPr(mmat),nz*sizeof(PetscScalar));CHKERRQ(ierr); 80*ff800b82SBarry Smith ierr = MatCreateSeqAIJWithArrays(PETSC_COMM_SELF,m,n,i,j,a,mat);CHKERRQ(ierr); 81*ff800b82SBarry Smith aij = (Mat_SeqAIJ*)(*mat)->data; 82*ff800b82SBarry Smith aij->singlemalloc = PETSC_TRUE; 83*ff800b82SBarry Smith PetscFunctionReturn(0); 84*ff800b82SBarry Smith } 85*ff800b82SBarry Smith EXTERN_C_END 86*ff800b82SBarry Smith 87*ff800b82SBarry Smith EXTERN_C_BEGIN 88*ff800b82SBarry Smith #undef __FUNCT__ 89a7bb0f05SBarry Smith #define __FUNCT__ "MatSeqAIJFromMatlab" 90a7bb0f05SBarry Smith /*@ 91a7bb0f05SBarry Smith MatSeqAIJFromMatlab - Given a Matlab sparse matrix, fills a SeqAIJ matrix with its transpose. 92a7bb0f05SBarry Smith 93a7bb0f05SBarry Smith Not Collective 94a7bb0f05SBarry Smith 95a7bb0f05SBarry Smith Input Parameters: 96a7bb0f05SBarry Smith + mmat - a Matlab sparse matris 97a7bb0f05SBarry Smith - mat - a already created MATSEQAIJ 98a7bb0f05SBarry Smith 99a7bb0f05SBarry Smith @*/ 100a7bb0f05SBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatSeqAIJFromMatlab(mxArray *mmat,Mat mat) 101a1d52234SKris Buschelman { 102dfbe8321SBarry Smith PetscErrorCode ierr; 103dfbe8321SBarry Smith int ii; 104a1d52234SKris Buschelman Mat_SeqAIJ *aij = (Mat_SeqAIJ*)mat->data; 105a1d52234SKris Buschelman 106a1d52234SKris Buschelman PetscFunctionBegin; 1071f03425eSSatish Balay ierr = MatSeqXAIJFreeAIJ(mat,&aij->a,&aij->j,&aij->i);CHKERRQ(ierr); 108a1d52234SKris Buschelman 109f0523c5fSHong Zhang aij->nz = (mxGetJc(mmat))[mat->rmap->n]; 110f0523c5fSHong Zhang ierr = PetscMalloc3(aij->nz,PetscScalar,&aij->a,aij->nz,PetscInt,&aij->j,mat->rmap->n+1,PetscInt,&aij->i);CHKERRQ(ierr); 111a1d52234SKris Buschelman aij->singlemalloc = PETSC_TRUE; 112a1d52234SKris Buschelman 113a1d52234SKris Buschelman ierr = PetscMemcpy(aij->a,mxGetPr(mmat),aij->nz*sizeof(PetscScalar));CHKERRQ(ierr); 114a1d52234SKris Buschelman /* Matlab stores by column, not row so we pass in the transpose of the matrix */ 115a1d52234SKris Buschelman ierr = PetscMemcpy(aij->j,mxGetIr(mmat),aij->nz*sizeof(int));CHKERRQ(ierr); 116f0523c5fSHong Zhang ierr = PetscMemcpy(aij->i,mxGetJc(mmat),(mat->rmap->n+1)*sizeof(int));CHKERRQ(ierr); 117a1d52234SKris Buschelman 118f0523c5fSHong Zhang for (ii=0; ii<mat->rmap->n; ii++) { 119a1d52234SKris Buschelman aij->ilen[ii] = aij->imax[ii] = aij->i[ii+1] - aij->i[ii]; 120a1d52234SKris Buschelman } 121a1d52234SKris Buschelman 122a1d52234SKris Buschelman ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 123a1d52234SKris Buschelman ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 124a7bb0f05SBarry Smith PetscFunctionReturn(0); 125a7bb0f05SBarry Smith } 126a7bb0f05SBarry Smith EXTERN_C_END 127a1d52234SKris Buschelman 128a7bb0f05SBarry Smith 129a7bb0f05SBarry Smith EXTERN_C_BEGIN 130a7bb0f05SBarry Smith #undef __FUNCT__ 131a7bb0f05SBarry Smith #define __FUNCT__ "MatlabEngineGet_SeqAIJ" 132a7bb0f05SBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatlabEngineGet_SeqAIJ(PetscObject obj,void *mengine) 133a7bb0f05SBarry Smith { 134a7bb0f05SBarry Smith PetscErrorCode ierr; 135a7bb0f05SBarry Smith Mat mat = (Mat)obj; 136a7bb0f05SBarry Smith mxArray *mmat; 137a7bb0f05SBarry Smith 138a7bb0f05SBarry Smith PetscFunctionBegin; 139a7bb0f05SBarry Smith mmat = engGetVariable((Engine *)mengine,obj->name); 140a7bb0f05SBarry Smith ierr = MatSeqAIJFromMatlab(mmat,mat);CHKERRQ(ierr); 141a1d52234SKris Buschelman PetscFunctionReturn(0); 142a1d52234SKris Buschelman } 143a1d52234SKris Buschelman EXTERN_C_END 144a1d52234SKris Buschelman 14505db81ecSKris Buschelman #undef __FUNCT__ 14605db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab" 147dfbe8321SBarry Smith PetscErrorCode MatSolve_Matlab(Mat A,Vec b,Vec x) 1483b3e256bSKris Buschelman { 149dfbe8321SBarry Smith PetscErrorCode ierr; 150e060cb09SBarry Smith const char *_A,*_b,*_x; 1513b3e256bSKris Buschelman 1523b3e256bSKris Buschelman PetscFunctionBegin; 1533b3e256bSKris Buschelman /* make sure objects have names; use default if not */ 1543b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr); 1553b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr); 1563b3e256bSKris Buschelman 1573b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr); 1583b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr); 1593b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr); 1607adad957SLisandro Dalcin ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)b);CHKERRQ(ierr); 1617adad957SLisandro Dalcin ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr); 1627adad957SLisandro Dalcin ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_b);CHKERRQ(ierr); 1637adad957SLisandro Dalcin /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),stdout);CHKERRQ(ierr); */ 1647adad957SLisandro Dalcin ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)x);CHKERRQ(ierr); 1653b3e256bSKris Buschelman PetscFunctionReturn(0); 1663b3e256bSKris Buschelman } 1673b3e256bSKris Buschelman 1683b3e256bSKris Buschelman #undef __FUNCT__ 16905db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab" 1700481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Matlab(Mat F,Mat A,const MatFactorInfo *info) 1713b3e256bSKris Buschelman { 172dfbe8321SBarry Smith PetscErrorCode ierr; 173de4209c5SBarry Smith size_t len; 1743b3e256bSKris Buschelman char *_A,*name; 175b3866ffcSBarry Smith PetscReal dtcol = info->dtcol; 1763b3e256bSKris Buschelman 1773b3e256bSKris Buschelman PetscFunctionBegin; 178d5f3da31SBarry Smith if (F->factortype == MAT_FACTOR_ILU || info->dt > 0) { 179b3866ffcSBarry Smith if (info->dtcol == PETSC_DEFAULT) dtcol = .01; 180fe97e370SBarry Smith F->ops->solve = MatSolve_Matlab; 181d5f3da31SBarry Smith F->factortype = MAT_FACTOR_LU; 182fe97e370SBarry Smith ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr); 183fe97e370SBarry Smith _A = ((PetscObject)A)->name; 184b3866ffcSBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,dtcol);CHKERRQ(ierr); 185fe97e370SBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"[l_%s,u_%s,p_%s] = luinc(%s',info_%s);",_A,_A,_A,_A,_A);CHKERRQ(ierr); 186fe97e370SBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr); 187fe97e370SBarry Smith 188fe97e370SBarry Smith ierr = PetscStrlen(_A,&len);CHKERRQ(ierr); 189fe97e370SBarry Smith ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr); 190fe97e370SBarry Smith sprintf(name,"_%s",_A); 191fe97e370SBarry Smith ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr); 192fe97e370SBarry Smith ierr = PetscFree(name);CHKERRQ(ierr); 193fe97e370SBarry Smith } else { 1947adad957SLisandro Dalcin ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr); 195f0523c5fSHong Zhang _A = ((PetscObject)A)->name; 196b3866ffcSBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"[l_%s,u_%s,p_%s] = lu(%s',%g);",_A,_A,_A,_A,dtcol);CHKERRQ(ierr); 1977adad957SLisandro Dalcin ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr); 1983b3e256bSKris Buschelman ierr = PetscStrlen(_A,&len);CHKERRQ(ierr); 1993b3e256bSKris Buschelman ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr); 2003b3e256bSKris Buschelman sprintf(name,"_%s",_A); 201f0523c5fSHong Zhang ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr); 2023b3e256bSKris Buschelman ierr = PetscFree(name);CHKERRQ(ierr); 203f0523c5fSHong Zhang F->ops->solve = MatSolve_Matlab; 204fe97e370SBarry Smith } 2053b3e256bSKris Buschelman PetscFunctionReturn(0); 2063b3e256bSKris Buschelman } 2073b3e256bSKris Buschelman 2083b3e256bSKris Buschelman #undef __FUNCT__ 20905db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab" 2100481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Matlab(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 2113b3e256bSKris Buschelman { 2123b3e256bSKris Buschelman PetscFunctionBegin; 213e32f2f54SBarry Smith if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); 214f0523c5fSHong Zhang F->ops->lufactornumeric = MatLUFactorNumeric_Matlab; 215b3866ffcSBarry Smith F->assembled = PETSC_TRUE; 2163b3e256bSKris Buschelman PetscFunctionReturn(0); 2173b3e256bSKris Buschelman } 2183b3e256bSKris Buschelman 21935bd34faSBarry Smith EXTERN_C_BEGIN 22035bd34faSBarry Smith #undef __FUNCT__ 22135bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_seqaij_matlab" 22235bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_seqaij_matlab(Mat A,const MatSolverPackage *type) 22335bd34faSBarry Smith { 22435bd34faSBarry Smith PetscFunctionBegin; 2252692d6eeSBarry Smith *type = MATSOLVERMATLAB; 22635bd34faSBarry Smith PetscFunctionReturn(0); 22735bd34faSBarry Smith } 22835bd34faSBarry Smith EXTERN_C_END 22935bd34faSBarry Smith 2303b3e256bSKris Buschelman #undef __FUNCT__ 231b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_matlab" 2325c9eb25fSBarry Smith PetscErrorCode MatGetFactor_seqaij_matlab(Mat A,MatFactorType ftype,Mat *F) 2333b3e256bSKris Buschelman { 234dfbe8321SBarry Smith PetscErrorCode ierr; 2353b3e256bSKris Buschelman 2363b3e256bSKris Buschelman PetscFunctionBegin; 237e32f2f54SBarry Smith if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); 2387adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,F);CHKERRQ(ierr); 239f0523c5fSHong Zhang ierr = MatSetSizes(*F,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 2407adad957SLisandro Dalcin ierr = MatSetType(*F,((PetscObject)A)->type_name);CHKERRQ(ierr); 2413b3e256bSKris Buschelman ierr = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr); 242b24902e0SBarry Smith (*F)->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab; 243b3866ffcSBarry Smith (*F)->ops->ilufactorsymbolic = MatLUFactorSymbolic_Matlab; 244f75d6de4SMatthew Knepley ierr = PetscObjectComposeFunctionDynamic((PetscObject)(*F),"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_seqaij_matlab",MatFactorGetSolverPackage_seqaij_matlab);CHKERRQ(ierr); 245f0523c5fSHong Zhang 246d5f3da31SBarry Smith (*F)->factortype = ftype; 2473b3e256bSKris Buschelman PetscFunctionReturn(0); 2483b3e256bSKris Buschelman } 2493b3e256bSKris Buschelman 250b24902e0SBarry Smith 2513b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/ 2523b3e256bSKris Buschelman 25305db81ecSKris Buschelman #undef __FUNCT__ 25405db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab" 255dfbe8321SBarry Smith PetscErrorCode MatFactorInfo_Matlab(Mat A,PetscViewer viewer) 2563b3e256bSKris Buschelman { 257dfbe8321SBarry Smith PetscErrorCode ierr; 2583b3e256bSKris Buschelman 2593b3e256bSKris Buschelman PetscFunctionBegin; 2603b3e256bSKris Buschelman ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters: -- not written yet!\n");CHKERRQ(ierr); 2613b3e256bSKris Buschelman PetscFunctionReturn(0); 2623b3e256bSKris Buschelman } 2633b3e256bSKris Buschelman 2643b3e256bSKris Buschelman #undef __FUNCT__ 26505db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab" 266b2d3331aSBarry Smith PetscErrorCode MatView_Matlab(Mat A,PetscViewer viewer) 267b2d3331aSBarry Smith { 268dfbe8321SBarry Smith PetscErrorCode ierr; 269ace3abfcSBarry Smith PetscBool iascii; 27005db81ecSKris Buschelman PetscViewerFormat format; 27105db81ecSKris Buschelman 27205db81ecSKris Buschelman PetscFunctionBegin; 273b24902e0SBarry Smith ierr = MatView_SeqAIJ(A,viewer);CHKERRQ(ierr); 2742692d6eeSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 27532077d6dSBarry Smith if (iascii) { 27605db81ecSKris Buschelman ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 27705db81ecSKris Buschelman if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) { 27805db81ecSKris Buschelman ierr = MatFactorInfo_Matlab(A,viewer); 27905db81ecSKris Buschelman } 28005db81ecSKris Buschelman } 28105db81ecSKris Buschelman PetscFunctionReturn(0); 28205db81ecSKris Buschelman } 283f365a357SKris Buschelman 28405db81ecSKris Buschelman 28505db81ecSKris Buschelman /*MC 2862692d6eeSBarry Smith MATSOLVERMATLAB - "matlab" - Providing direct solvers (LU and QR) and drop tolerance 28705db81ecSKris Buschelman based ILU factorization (ILUDT) for sequential matrices via the external package Matlab. 28805db81ecSKris Buschelman 28905db81ecSKris Buschelman 29041c8de11SBarry Smith Works with MATSEQAIJ matrices. 29105db81ecSKris Buschelman 29205db81ecSKris Buschelman Options Database Keys: 29341c8de11SBarry Smith . -pc_factor_mat_solver_type matlab - selects Matlab to do the sparse factorization 29441c8de11SBarry Smith 29505db81ecSKris Buschelman 29605db81ecSKris Buschelman Level: beginner 29705db81ecSKris Buschelman 29805db81ecSKris Buschelman .seealso: PCLU 29941c8de11SBarry Smith 30041c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage 30105db81ecSKris Buschelman M*/ 30205db81ecSKris Buschelman 303