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" 16*7087cfbeSBarry Smith PetscErrorCode 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__ 41ff800b82SBarry Smith #define __FUNCT__ "MatCreateSeqAIJFromMatlab" 4284c105d7SBarry Smith /*@C 43ff800b82SBarry Smith MatCreateSeqAIJFromMatlab - Given a Matlab sparse matrix, fills a SeqAIJ matrix with its transpose. 44ff800b82SBarry Smith 45ff800b82SBarry Smith Not Collective 46ff800b82SBarry Smith 47ff800b82SBarry Smith Input Parameters: 48ff800b82SBarry Smith + mmat - a Matlab sparse matris 49ff800b82SBarry Smith - mat - a already created MATSEQAIJ 50ff800b82SBarry Smith 51ff800b82SBarry Smith Developer Notes: on 64 bit systems Matlab uses 64 bit integers hence mWIndex is size_t. 52ff800b82SBarry Smith 53ff800b82SBarry Smith @*/ 54*7087cfbeSBarry Smith PetscErrorCode MatCreateSeqAIJFromMatlab(mxArray *mmat,Mat *mat) 55ff800b82SBarry Smith { 56ff800b82SBarry Smith PetscErrorCode ierr; 57ff800b82SBarry Smith int nz,n,m,*i,*j,k; 58ff800b82SBarry Smith mwIndex nnz,nn,nm,*ii,*jj; 59ff800b82SBarry Smith PetscScalar *a; 60ff800b82SBarry Smith Mat_SeqAIJ *aij; 61ff800b82SBarry Smith 62ff800b82SBarry Smith PetscFunctionBegin; 63ff800b82SBarry Smith nn = mxGetN(mmat); 64ff800b82SBarry Smith nm = mxGetM(mmat); 65ff800b82SBarry Smith nnz = (mxGetJc(mmat))[nn]; 66ff800b82SBarry Smith ii = mxGetJc(mmat); 67ff800b82SBarry Smith jj = mxGetIr(mmat); 68ff800b82SBarry Smith n = (PetscInt) nn; 69ff800b82SBarry Smith m = (PetscInt) nm; 70ff800b82SBarry Smith nz = (PetscInt) nnz; 71ff800b82SBarry Smith ierr = PetscMalloc3(nz,PetscScalar,&a,nz,PetscInt,&j,n+1,PetscInt,&i);CHKERRQ(ierr); 72ff800b82SBarry Smith 73ff800b82SBarry Smith for (k=0; k<n+1; k++) { 74ff800b82SBarry Smith i[k] = (PetscInt) ii[k]; 75ff800b82SBarry Smith } 76ff800b82SBarry Smith for (k=0; k<nz; k++) { 77ff800b82SBarry Smith j[k] = (PetscInt) jj[k]; 78ff800b82SBarry Smith } 79ff800b82SBarry Smith ierr = PetscMemcpy(a,mxGetPr(mmat),nz*sizeof(PetscScalar));CHKERRQ(ierr); 80ff800b82SBarry Smith ierr = MatCreateSeqAIJWithArrays(PETSC_COMM_SELF,m,n,i,j,a,mat);CHKERRQ(ierr); 81ff800b82SBarry Smith aij = (Mat_SeqAIJ*)(*mat)->data; 82ff800b82SBarry Smith aij->singlemalloc = PETSC_TRUE; 8384c105d7SBarry Smith aij->nonew = 0; 8484c105d7SBarry Smith aij->free_a = PETSC_TRUE; 8584c105d7SBarry Smith aij->free_ij = PETSC_TRUE; 86ff800b82SBarry Smith PetscFunctionReturn(0); 87ff800b82SBarry Smith } 88ff800b82SBarry Smith EXTERN_C_END 89ff800b82SBarry Smith 90ff800b82SBarry Smith EXTERN_C_BEGIN 91ff800b82SBarry Smith #undef __FUNCT__ 92a7bb0f05SBarry Smith #define __FUNCT__ "MatSeqAIJFromMatlab" 9384c105d7SBarry Smith /*@C 94a7bb0f05SBarry Smith MatSeqAIJFromMatlab - Given a Matlab sparse matrix, fills a SeqAIJ matrix with its transpose. 95a7bb0f05SBarry Smith 96a7bb0f05SBarry Smith Not Collective 97a7bb0f05SBarry Smith 98a7bb0f05SBarry Smith Input Parameters: 99a7bb0f05SBarry Smith + mmat - a Matlab sparse matris 100a7bb0f05SBarry Smith - mat - a already created MATSEQAIJ 101a7bb0f05SBarry Smith 102a7bb0f05SBarry Smith @*/ 103*7087cfbeSBarry Smith PetscErrorCode MatSeqAIJFromMatlab(mxArray *mmat,Mat mat) 104a1d52234SKris Buschelman { 105dfbe8321SBarry Smith PetscErrorCode ierr; 106dfbe8321SBarry Smith int ii; 107a1d52234SKris Buschelman Mat_SeqAIJ *aij = (Mat_SeqAIJ*)mat->data; 108a1d52234SKris Buschelman 109a1d52234SKris Buschelman PetscFunctionBegin; 1101f03425eSSatish Balay ierr = MatSeqXAIJFreeAIJ(mat,&aij->a,&aij->j,&aij->i);CHKERRQ(ierr); 111a1d52234SKris Buschelman 112f0523c5fSHong Zhang aij->nz = (mxGetJc(mmat))[mat->rmap->n]; 113f0523c5fSHong Zhang ierr = PetscMalloc3(aij->nz,PetscScalar,&aij->a,aij->nz,PetscInt,&aij->j,mat->rmap->n+1,PetscInt,&aij->i);CHKERRQ(ierr); 114a1d52234SKris Buschelman aij->singlemalloc = PETSC_TRUE; 115a1d52234SKris Buschelman 116a1d52234SKris Buschelman ierr = PetscMemcpy(aij->a,mxGetPr(mmat),aij->nz*sizeof(PetscScalar));CHKERRQ(ierr); 117a1d52234SKris Buschelman /* Matlab stores by column, not row so we pass in the transpose of the matrix */ 118a1d52234SKris Buschelman ierr = PetscMemcpy(aij->j,mxGetIr(mmat),aij->nz*sizeof(int));CHKERRQ(ierr); 119f0523c5fSHong Zhang ierr = PetscMemcpy(aij->i,mxGetJc(mmat),(mat->rmap->n+1)*sizeof(int));CHKERRQ(ierr); 120a1d52234SKris Buschelman 121f0523c5fSHong Zhang for (ii=0; ii<mat->rmap->n; ii++) { 122a1d52234SKris Buschelman aij->ilen[ii] = aij->imax[ii] = aij->i[ii+1] - aij->i[ii]; 123a1d52234SKris Buschelman } 124a1d52234SKris Buschelman 125a1d52234SKris Buschelman ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 126a1d52234SKris Buschelman ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 127a7bb0f05SBarry Smith PetscFunctionReturn(0); 128a7bb0f05SBarry Smith } 129a7bb0f05SBarry Smith EXTERN_C_END 130a1d52234SKris Buschelman 131a7bb0f05SBarry Smith 132a7bb0f05SBarry Smith EXTERN_C_BEGIN 133a7bb0f05SBarry Smith #undef __FUNCT__ 134a7bb0f05SBarry Smith #define __FUNCT__ "MatlabEngineGet_SeqAIJ" 135*7087cfbeSBarry Smith PetscErrorCode MatlabEngineGet_SeqAIJ(PetscObject obj,void *mengine) 136a7bb0f05SBarry Smith { 137a7bb0f05SBarry Smith PetscErrorCode ierr; 138a7bb0f05SBarry Smith Mat mat = (Mat)obj; 139a7bb0f05SBarry Smith mxArray *mmat; 140a7bb0f05SBarry Smith 141a7bb0f05SBarry Smith PetscFunctionBegin; 142a7bb0f05SBarry Smith mmat = engGetVariable((Engine *)mengine,obj->name); 143a7bb0f05SBarry Smith ierr = MatSeqAIJFromMatlab(mmat,mat);CHKERRQ(ierr); 144a1d52234SKris Buschelman PetscFunctionReturn(0); 145a1d52234SKris Buschelman } 146a1d52234SKris Buschelman EXTERN_C_END 147a1d52234SKris Buschelman 14805db81ecSKris Buschelman #undef __FUNCT__ 14905db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab" 150dfbe8321SBarry Smith PetscErrorCode MatSolve_Matlab(Mat A,Vec b,Vec x) 1513b3e256bSKris Buschelman { 152dfbe8321SBarry Smith PetscErrorCode ierr; 153e060cb09SBarry Smith const char *_A,*_b,*_x; 1543b3e256bSKris Buschelman 1553b3e256bSKris Buschelman PetscFunctionBegin; 1563b3e256bSKris Buschelman /* make sure objects have names; use default if not */ 1573b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr); 1583b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr); 1593b3e256bSKris Buschelman 1603b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr); 1613b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr); 1623b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr); 1637adad957SLisandro Dalcin ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)b);CHKERRQ(ierr); 1647adad957SLisandro Dalcin ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr); 1657adad957SLisandro Dalcin ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_b);CHKERRQ(ierr); 1667adad957SLisandro Dalcin /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),stdout);CHKERRQ(ierr); */ 1677adad957SLisandro Dalcin ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)x);CHKERRQ(ierr); 1683b3e256bSKris Buschelman PetscFunctionReturn(0); 1693b3e256bSKris Buschelman } 1703b3e256bSKris Buschelman 1713b3e256bSKris Buschelman #undef __FUNCT__ 17205db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab" 1730481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Matlab(Mat F,Mat A,const MatFactorInfo *info) 1743b3e256bSKris Buschelman { 175dfbe8321SBarry Smith PetscErrorCode ierr; 176de4209c5SBarry Smith size_t len; 1773b3e256bSKris Buschelman char *_A,*name; 178b3866ffcSBarry Smith PetscReal dtcol = info->dtcol; 1793b3e256bSKris Buschelman 1803b3e256bSKris Buschelman PetscFunctionBegin; 181d5f3da31SBarry Smith if (F->factortype == MAT_FACTOR_ILU || info->dt > 0) { 182b3866ffcSBarry Smith if (info->dtcol == PETSC_DEFAULT) dtcol = .01; 183fe97e370SBarry Smith F->ops->solve = MatSolve_Matlab; 184d5f3da31SBarry Smith F->factortype = MAT_FACTOR_LU; 185fe97e370SBarry Smith ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr); 186fe97e370SBarry Smith _A = ((PetscObject)A)->name; 187b3866ffcSBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,dtcol);CHKERRQ(ierr); 188fe97e370SBarry 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); 189fe97e370SBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr); 190fe97e370SBarry Smith 191fe97e370SBarry Smith ierr = PetscStrlen(_A,&len);CHKERRQ(ierr); 192fe97e370SBarry Smith ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr); 193fe97e370SBarry Smith sprintf(name,"_%s",_A); 194fe97e370SBarry Smith ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr); 195fe97e370SBarry Smith ierr = PetscFree(name);CHKERRQ(ierr); 196fe97e370SBarry Smith } else { 1977adad957SLisandro Dalcin ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr); 198f0523c5fSHong Zhang _A = ((PetscObject)A)->name; 199b3866ffcSBarry 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); 2007adad957SLisandro Dalcin ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr); 2013b3e256bSKris Buschelman ierr = PetscStrlen(_A,&len);CHKERRQ(ierr); 2023b3e256bSKris Buschelman ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr); 2033b3e256bSKris Buschelman sprintf(name,"_%s",_A); 204f0523c5fSHong Zhang ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr); 2053b3e256bSKris Buschelman ierr = PetscFree(name);CHKERRQ(ierr); 206f0523c5fSHong Zhang F->ops->solve = MatSolve_Matlab; 207fe97e370SBarry Smith } 2083b3e256bSKris Buschelman PetscFunctionReturn(0); 2093b3e256bSKris Buschelman } 2103b3e256bSKris Buschelman 2113b3e256bSKris Buschelman #undef __FUNCT__ 21205db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab" 2130481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Matlab(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 2143b3e256bSKris Buschelman { 2153b3e256bSKris Buschelman PetscFunctionBegin; 216e32f2f54SBarry Smith if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); 217f0523c5fSHong Zhang F->ops->lufactornumeric = MatLUFactorNumeric_Matlab; 218b3866ffcSBarry Smith F->assembled = PETSC_TRUE; 2193b3e256bSKris Buschelman PetscFunctionReturn(0); 2203b3e256bSKris Buschelman } 2213b3e256bSKris Buschelman 22235bd34faSBarry Smith EXTERN_C_BEGIN 22335bd34faSBarry Smith #undef __FUNCT__ 22435bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_seqaij_matlab" 22535bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_seqaij_matlab(Mat A,const MatSolverPackage *type) 22635bd34faSBarry Smith { 22735bd34faSBarry Smith PetscFunctionBegin; 2282692d6eeSBarry Smith *type = MATSOLVERMATLAB; 22935bd34faSBarry Smith PetscFunctionReturn(0); 23035bd34faSBarry Smith } 23135bd34faSBarry Smith EXTERN_C_END 23235bd34faSBarry Smith 2333b3e256bSKris Buschelman #undef __FUNCT__ 234b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_matlab" 2355c9eb25fSBarry Smith PetscErrorCode MatGetFactor_seqaij_matlab(Mat A,MatFactorType ftype,Mat *F) 2363b3e256bSKris Buschelman { 237dfbe8321SBarry Smith PetscErrorCode ierr; 2383b3e256bSKris Buschelman 2393b3e256bSKris Buschelman PetscFunctionBegin; 240e32f2f54SBarry Smith if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); 2417adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,F);CHKERRQ(ierr); 242f0523c5fSHong Zhang ierr = MatSetSizes(*F,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 2437adad957SLisandro Dalcin ierr = MatSetType(*F,((PetscObject)A)->type_name);CHKERRQ(ierr); 2443b3e256bSKris Buschelman ierr = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr); 245b24902e0SBarry Smith (*F)->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab; 246b3866ffcSBarry Smith (*F)->ops->ilufactorsymbolic = MatLUFactorSymbolic_Matlab; 247f75d6de4SMatthew Knepley ierr = PetscObjectComposeFunctionDynamic((PetscObject)(*F),"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_seqaij_matlab",MatFactorGetSolverPackage_seqaij_matlab);CHKERRQ(ierr); 248f0523c5fSHong Zhang 249d5f3da31SBarry Smith (*F)->factortype = ftype; 2503b3e256bSKris Buschelman PetscFunctionReturn(0); 2513b3e256bSKris Buschelman } 2523b3e256bSKris Buschelman 253b24902e0SBarry Smith 2543b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/ 2553b3e256bSKris Buschelman 25605db81ecSKris Buschelman #undef __FUNCT__ 25705db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab" 258dfbe8321SBarry Smith PetscErrorCode MatFactorInfo_Matlab(Mat A,PetscViewer viewer) 2593b3e256bSKris Buschelman { 260dfbe8321SBarry Smith PetscErrorCode ierr; 2613b3e256bSKris Buschelman 2623b3e256bSKris Buschelman PetscFunctionBegin; 2633b3e256bSKris Buschelman ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters: -- not written yet!\n");CHKERRQ(ierr); 2643b3e256bSKris Buschelman PetscFunctionReturn(0); 2653b3e256bSKris Buschelman } 2663b3e256bSKris Buschelman 2673b3e256bSKris Buschelman #undef __FUNCT__ 26805db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab" 269b2d3331aSBarry Smith PetscErrorCode MatView_Matlab(Mat A,PetscViewer viewer) 270b2d3331aSBarry Smith { 271dfbe8321SBarry Smith PetscErrorCode ierr; 272ace3abfcSBarry Smith PetscBool iascii; 27305db81ecSKris Buschelman PetscViewerFormat format; 27405db81ecSKris Buschelman 27505db81ecSKris Buschelman PetscFunctionBegin; 276b24902e0SBarry Smith ierr = MatView_SeqAIJ(A,viewer);CHKERRQ(ierr); 2772692d6eeSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 27832077d6dSBarry Smith if (iascii) { 27905db81ecSKris Buschelman ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 28005db81ecSKris Buschelman if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) { 28105db81ecSKris Buschelman ierr = MatFactorInfo_Matlab(A,viewer); 28205db81ecSKris Buschelman } 28305db81ecSKris Buschelman } 28405db81ecSKris Buschelman PetscFunctionReturn(0); 28505db81ecSKris Buschelman } 286f365a357SKris Buschelman 28705db81ecSKris Buschelman 28805db81ecSKris Buschelman /*MC 2892692d6eeSBarry Smith MATSOLVERMATLAB - "matlab" - Providing direct solvers (LU and QR) and drop tolerance 29005db81ecSKris Buschelman based ILU factorization (ILUDT) for sequential matrices via the external package Matlab. 29105db81ecSKris Buschelman 29205db81ecSKris Buschelman 29341c8de11SBarry Smith Works with MATSEQAIJ matrices. 29405db81ecSKris Buschelman 29505db81ecSKris Buschelman Options Database Keys: 29641c8de11SBarry Smith . -pc_factor_mat_solver_type matlab - selects Matlab to do the sparse factorization 29741c8de11SBarry Smith 29805db81ecSKris Buschelman 29905db81ecSKris Buschelman Level: beginner 30005db81ecSKris Buschelman 30105db81ecSKris Buschelman .seealso: PCLU 30241c8de11SBarry Smith 30341c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage 30405db81ecSKris Buschelman M*/ 30505db81ecSKris Buschelman 306