xref: /petsc/src/mat/impls/aij/seq/matlab/aijmatlab.c (revision 2bd2b0e6efd31c4ff81d5cb633a913ae833c5993)
1be1d678aSKris Buschelman 
23b3e256bSKris Buschelman /*
3e3c5b3baSBarry Smith         Provides an interface for the MATLAB engine sparse solver
43b3e256bSKris Buschelman 
53b3e256bSKris Buschelman */
6c6db04a5SJed Brown #include <../src/mat/impls/aij/seq/aij.h>
73b3e256bSKris Buschelman 
8c6db04a5SJed Brown #include <engine.h>   /* MATLAB include file */
9c6db04a5SJed Brown #include <mex.h>      /* MATLAB include file */
103b3e256bSKris Buschelman 
11aeeaa5c7SBarry Smith EXTERN_C_BEGIN
12aeeaa5c7SBarry Smith #undef __FUNCT__
13aeeaa5c7SBarry Smith #define __FUNCT__ "MatSeqAIJToMatlab"
14aeeaa5c7SBarry Smith mxArray *MatSeqAIJToMatlab(Mat B)
15aeeaa5c7SBarry Smith {
16aeeaa5c7SBarry Smith   PetscErrorCode ierr;
17aeeaa5c7SBarry Smith   Mat_SeqAIJ     *aij = (Mat_SeqAIJ*)B->data;
18c088a8dcSBarry Smith   mwIndex        *ii,*jj;
19aeeaa5c7SBarry Smith   mxArray        *mat;
20c088a8dcSBarry Smith   PetscInt       i;
21aeeaa5c7SBarry Smith 
22aeeaa5c7SBarry Smith   PetscFunctionBegin;
23aeeaa5c7SBarry Smith   mat  = mxCreateSparse(B->cmap->n,B->rmap->n,aij->nz,mxREAL);
24aeeaa5c7SBarry Smith   ierr = PetscMemcpy(mxGetPr(mat),aij->a,aij->nz*sizeof(PetscScalar));
25e3c5b3baSBarry Smith   /* MATLAB stores by column, not row so we pass in the transpose of the matrix */
26aeeaa5c7SBarry Smith   jj = mxGetIr(mat);
27aeeaa5c7SBarry Smith   for (i=0; i<aij->nz; i++) jj[i] = aij->j[i];
28aeeaa5c7SBarry Smith   ii = mxGetJc(mat);
29aeeaa5c7SBarry Smith   for (i=0; i<B->rmap->n+1; i++) ii[i] = aij->i[i];
30aeeaa5c7SBarry Smith 
31aeeaa5c7SBarry Smith   PetscFunctionReturn(mat);
32aeeaa5c7SBarry Smith }
33aeeaa5c7SBarry Smith EXTERN_C_END
34aeeaa5c7SBarry Smith 
35a1d52234SKris Buschelman 
36a1d52234SKris Buschelman EXTERN_C_BEGIN
37a1d52234SKris Buschelman #undef __FUNCT__
38b3866ffcSBarry Smith #define __FUNCT__ "MatlabEnginePut_SeqAIJ"
397087cfbeSBarry Smith PetscErrorCode  MatlabEnginePut_SeqAIJ(PetscObject obj,void *mengine)
40a1d52234SKris Buschelman {
41dfbe8321SBarry Smith   PetscErrorCode ierr;
42a1d52234SKris Buschelman   mxArray        *mat;
43a1d52234SKris Buschelman 
44a1d52234SKris Buschelman   PetscFunctionBegin;
45be6adb11SBarry Smith   mat = MatSeqAIJToMatlab((Mat)obj);if (!mat) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Cannot create MATLAB matrix");
46a1d52234SKris Buschelman   ierr = PetscObjectName(obj);CHKERRQ(ierr);
47a1d52234SKris Buschelman   engPutVariable((Engine *)mengine,obj->name,mat);
48a1d52234SKris Buschelman   PetscFunctionReturn(0);
49a1d52234SKris Buschelman }
50a1d52234SKris Buschelman EXTERN_C_END
51a1d52234SKris Buschelman 
52a1d52234SKris Buschelman EXTERN_C_BEGIN
53a1d52234SKris Buschelman #undef __FUNCT__
54a7bb0f05SBarry Smith #define __FUNCT__ "MatSeqAIJFromMatlab"
5584c105d7SBarry Smith /*@C
56e3c5b3baSBarry Smith     MatSeqAIJFromMatlab - Given a MATLAB sparse matrix, fills a SeqAIJ matrix with its transpose.
57a7bb0f05SBarry Smith 
58a7bb0f05SBarry Smith    Not Collective
59a7bb0f05SBarry Smith 
60a7bb0f05SBarry Smith    Input Parameters:
61e3c5b3baSBarry Smith +     mmat - a MATLAB sparse matris
62a7bb0f05SBarry Smith -     mat - a already created MATSEQAIJ
63a7bb0f05SBarry Smith 
64*2bd2b0e6SSatish Balay   Level: intermediate
65*2bd2b0e6SSatish Balay 
66a7bb0f05SBarry Smith @*/
677087cfbeSBarry Smith PetscErrorCode  MatSeqAIJFromMatlab(mxArray *mmat,Mat mat)
68a1d52234SKris Buschelman {
69dfbe8321SBarry Smith   PetscErrorCode ierr;
70b3da158bSBarry Smith   PetscInt       nz,n,m,*i,*j,k;
71b3da158bSBarry Smith   mwIndex        nnz,nn,nm,*ii,*jj;
72a1d52234SKris Buschelman   Mat_SeqAIJ     *aij = (Mat_SeqAIJ*)mat->data;
73a1d52234SKris Buschelman 
74a1d52234SKris Buschelman   PetscFunctionBegin;
75b3da158bSBarry Smith   nn  = mxGetN(mmat);   /* rows of transpose of matrix */
76b3da158bSBarry Smith   nm  = mxGetM(mmat);
77b3da158bSBarry Smith   nnz = (mxGetJc(mmat))[nn];
78b3da158bSBarry Smith   ii  = mxGetJc(mmat);
79b3da158bSBarry Smith   jj  = mxGetIr(mmat);
80b3da158bSBarry Smith   n   = (PetscInt) nn;
81b3da158bSBarry Smith   m   = (PetscInt) nm;
82b3da158bSBarry Smith   nz  = (PetscInt) nnz;
83b3da158bSBarry Smith 
84b3da158bSBarry Smith   if (mat->rmap->n < 0 && mat->cmap->n < 0) {
85b3da158bSBarry Smith     /* matrix has not yet had its size set */
86b3da158bSBarry Smith     ierr = MatSetSizes(mat,n,m,PETSC_DETERMINE,PETSC_DETERMINE);CHKERRQ(ierr);
87b3da158bSBarry Smith     ierr = MatPreallocated(mat);CHKERRQ(ierr);
88b3da158bSBarry Smith   } else {
89b3da158bSBarry Smith     if (mat->rmap->n != n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot change size of PETSc matrix %D to %D",mat->rmap->n,n);
90b3da158bSBarry Smith     if (mat->cmap->n != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot change size of PETSc matrix %D to %D",mat->cmap->n,m);
91b3da158bSBarry Smith   }
922eff7a51SBarry Smith   if (nz != aij->nz) {
932eff7a51SBarry Smith     /* number of nonzeros in matrix has changed, so need new data structure */
941f03425eSSatish Balay     ierr = MatSeqXAIJFreeAIJ(mat,&aij->a,&aij->j,&aij->i);CHKERRQ(ierr);
95b3da158bSBarry Smith     aij->nz           = nz;
96f0523c5fSHong Zhang     ierr  = PetscMalloc3(aij->nz,PetscScalar,&aij->a,aij->nz,PetscInt,&aij->j,mat->rmap->n+1,PetscInt,&aij->i);CHKERRQ(ierr);
97a1d52234SKris Buschelman     aij->singlemalloc = PETSC_TRUE;
982eff7a51SBarry Smith   }
99a1d52234SKris Buschelman 
100a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->a,mxGetPr(mmat),aij->nz*sizeof(PetscScalar));CHKERRQ(ierr);
101e3c5b3baSBarry Smith   /* MATLAB stores by column, not row so we pass in the transpose of the matrix */
102b3da158bSBarry Smith   i = aij->i;
103b3da158bSBarry Smith   for (k=0; k<n+1; k++) {
104b3da158bSBarry Smith     i[k] = (PetscInt) ii[k];
105b3da158bSBarry Smith   }
106b3da158bSBarry Smith   j = aij->j;
107b3da158bSBarry Smith   for (k=0; k<nz; k++) {
108b3da158bSBarry Smith     j[k] = (PetscInt) jj[k];
109b3da158bSBarry Smith   }
110a1d52234SKris Buschelman 
111b3da158bSBarry Smith   for (k=0; k<mat->rmap->n; k++) {
112b3da158bSBarry Smith     aij->ilen[k] = aij->imax[k] = aij->i[k+1] - aij->i[k];
113a1d52234SKris Buschelman   }
114a1d52234SKris Buschelman 
115a1d52234SKris Buschelman   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
116a1d52234SKris Buschelman   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
117a7bb0f05SBarry Smith   PetscFunctionReturn(0);
118a7bb0f05SBarry Smith }
119a7bb0f05SBarry Smith EXTERN_C_END
120a1d52234SKris Buschelman 
121a7bb0f05SBarry Smith 
122a7bb0f05SBarry Smith EXTERN_C_BEGIN
123a7bb0f05SBarry Smith #undef __FUNCT__
124a7bb0f05SBarry Smith #define __FUNCT__ "MatlabEngineGet_SeqAIJ"
1257087cfbeSBarry Smith PetscErrorCode  MatlabEngineGet_SeqAIJ(PetscObject obj,void *mengine)
126a7bb0f05SBarry Smith {
127a7bb0f05SBarry Smith   PetscErrorCode ierr;
128a7bb0f05SBarry Smith   Mat            mat = (Mat)obj;
129a7bb0f05SBarry Smith   mxArray        *mmat;
130a7bb0f05SBarry Smith 
131a7bb0f05SBarry Smith   PetscFunctionBegin;
132a7bb0f05SBarry Smith   mmat = engGetVariable((Engine *)mengine,obj->name);
133a7bb0f05SBarry Smith   ierr = MatSeqAIJFromMatlab(mmat,mat);CHKERRQ(ierr);
134a1d52234SKris Buschelman   PetscFunctionReturn(0);
135a1d52234SKris Buschelman }
136a1d52234SKris Buschelman EXTERN_C_END
137a1d52234SKris Buschelman 
13805db81ecSKris Buschelman #undef __FUNCT__
13905db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab"
140dfbe8321SBarry Smith PetscErrorCode MatSolve_Matlab(Mat A,Vec b,Vec x)
1413b3e256bSKris Buschelman {
142dfbe8321SBarry Smith   PetscErrorCode ierr;
143e060cb09SBarry Smith   const char     *_A,*_b,*_x;
1443b3e256bSKris Buschelman 
1453b3e256bSKris Buschelman   PetscFunctionBegin;
1463b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
1473b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
1483b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
1493b3e256bSKris Buschelman 
1503b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
1513b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
1523b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
1537adad957SLisandro Dalcin   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)b);CHKERRQ(ierr);
1547adad957SLisandro Dalcin   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr);
1557adad957SLisandro Dalcin   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_b);CHKERRQ(ierr);
1567adad957SLisandro Dalcin   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),stdout);CHKERRQ(ierr);  */
1577adad957SLisandro Dalcin   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)x);CHKERRQ(ierr);
1583b3e256bSKris Buschelman   PetscFunctionReturn(0);
1593b3e256bSKris Buschelman }
1603b3e256bSKris Buschelman 
1613b3e256bSKris Buschelman #undef __FUNCT__
16205db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab"
1630481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Matlab(Mat F,Mat A,const MatFactorInfo *info)
1643b3e256bSKris Buschelman {
165dfbe8321SBarry Smith   PetscErrorCode ierr;
166de4209c5SBarry Smith   size_t         len;
1673b3e256bSKris Buschelman   char           *_A,*name;
168b3866ffcSBarry Smith   PetscReal      dtcol = info->dtcol;
1693b3e256bSKris Buschelman 
1703b3e256bSKris Buschelman   PetscFunctionBegin;
171d5f3da31SBarry Smith   if (F->factortype == MAT_FACTOR_ILU || info->dt > 0) {
172b3866ffcSBarry Smith     if (info->dtcol == PETSC_DEFAULT)  dtcol = .01;
173fe97e370SBarry Smith     F->ops->solve           = MatSolve_Matlab;
174d5f3da31SBarry Smith     F->factortype           = MAT_FACTOR_LU;
175fe97e370SBarry Smith     ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr);
176fe97e370SBarry Smith     _A   = ((PetscObject)A)->name;
177b3866ffcSBarry Smith     ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,dtcol);CHKERRQ(ierr);
178fe97e370SBarry 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);
179fe97e370SBarry Smith     ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr);
180fe97e370SBarry Smith 
181fe97e370SBarry Smith     ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
182fe97e370SBarry Smith     ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
183fe97e370SBarry Smith     sprintf(name,"_%s",_A);
184fe97e370SBarry Smith     ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr);
185fe97e370SBarry Smith     ierr = PetscFree(name);CHKERRQ(ierr);
186fe97e370SBarry Smith   } else {
1877adad957SLisandro Dalcin     ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr);
188f0523c5fSHong Zhang     _A   = ((PetscObject)A)->name;
189b3866ffcSBarry 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);
1907adad957SLisandro Dalcin     ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr);
1913b3e256bSKris Buschelman     ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
1923b3e256bSKris Buschelman     ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
1933b3e256bSKris Buschelman     sprintf(name,"_%s",_A);
194f0523c5fSHong Zhang     ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr);
1953b3e256bSKris Buschelman     ierr = PetscFree(name);CHKERRQ(ierr);
196f0523c5fSHong Zhang     F->ops->solve              = MatSolve_Matlab;
197fe97e370SBarry Smith   }
1983b3e256bSKris Buschelman   PetscFunctionReturn(0);
1993b3e256bSKris Buschelman }
2003b3e256bSKris Buschelman 
2013b3e256bSKris Buschelman #undef __FUNCT__
20205db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab"
2030481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Matlab(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
2043b3e256bSKris Buschelman {
2053b3e256bSKris Buschelman   PetscFunctionBegin;
206e32f2f54SBarry Smith   if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square");
207f0523c5fSHong Zhang   F->ops->lufactornumeric    = MatLUFactorNumeric_Matlab;
208b3866ffcSBarry Smith   F->assembled = PETSC_TRUE;
2093b3e256bSKris Buschelman   PetscFunctionReturn(0);
2103b3e256bSKris Buschelman }
2113b3e256bSKris Buschelman 
21235bd34faSBarry Smith EXTERN_C_BEGIN
21335bd34faSBarry Smith #undef __FUNCT__
21435bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_seqaij_matlab"
21535bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_seqaij_matlab(Mat A,const MatSolverPackage *type)
21635bd34faSBarry Smith {
21735bd34faSBarry Smith   PetscFunctionBegin;
2182692d6eeSBarry Smith   *type = MATSOLVERMATLAB;
21935bd34faSBarry Smith   PetscFunctionReturn(0);
22035bd34faSBarry Smith }
22135bd34faSBarry Smith EXTERN_C_END
22235bd34faSBarry Smith 
2239402dedeSSatish Balay EXTERN_C_BEGIN
2243b3e256bSKris Buschelman #undef __FUNCT__
225b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_matlab"
2265c9eb25fSBarry Smith PetscErrorCode MatGetFactor_seqaij_matlab(Mat A,MatFactorType ftype,Mat *F)
2273b3e256bSKris Buschelman {
228dfbe8321SBarry Smith   PetscErrorCode ierr;
2293b3e256bSKris Buschelman 
2303b3e256bSKris Buschelman   PetscFunctionBegin;
231e32f2f54SBarry Smith   if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square");
2327adad957SLisandro Dalcin   ierr                         = MatCreate(((PetscObject)A)->comm,F);CHKERRQ(ierr);
233f0523c5fSHong Zhang   ierr                         = MatSetSizes(*F,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
2347adad957SLisandro Dalcin   ierr                         = MatSetType(*F,((PetscObject)A)->type_name);CHKERRQ(ierr);
2353b3e256bSKris Buschelman   ierr                         = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
236b24902e0SBarry Smith   (*F)->ops->lufactorsymbolic  = MatLUFactorSymbolic_Matlab;
237b3866ffcSBarry Smith   (*F)->ops->ilufactorsymbolic = MatLUFactorSymbolic_Matlab;
238f75d6de4SMatthew Knepley   ierr = PetscObjectComposeFunctionDynamic((PetscObject)(*F),"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_seqaij_matlab",MatFactorGetSolverPackage_seqaij_matlab);CHKERRQ(ierr);
239f0523c5fSHong Zhang 
240d5f3da31SBarry Smith   (*F)->factortype             = ftype;
2413b3e256bSKris Buschelman   PetscFunctionReturn(0);
2423b3e256bSKris Buschelman }
2439402dedeSSatish Balay EXTERN_C_END
244b24902e0SBarry Smith 
2453b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/
2463b3e256bSKris Buschelman 
24705db81ecSKris Buschelman #undef __FUNCT__
24805db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab"
249dfbe8321SBarry Smith PetscErrorCode MatFactorInfo_Matlab(Mat A,PetscViewer viewer)
2503b3e256bSKris Buschelman {
251dfbe8321SBarry Smith   PetscErrorCode ierr;
2523b3e256bSKris Buschelman 
2533b3e256bSKris Buschelman   PetscFunctionBegin;
254e3c5b3baSBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"MATLAB run parameters:  -- not written yet!\n");CHKERRQ(ierr);
2553b3e256bSKris Buschelman   PetscFunctionReturn(0);
2563b3e256bSKris Buschelman }
2573b3e256bSKris Buschelman 
2583b3e256bSKris Buschelman #undef __FUNCT__
25905db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab"
260b2d3331aSBarry Smith PetscErrorCode MatView_Matlab(Mat A,PetscViewer viewer)
261b2d3331aSBarry Smith {
262dfbe8321SBarry Smith   PetscErrorCode    ierr;
263ace3abfcSBarry Smith   PetscBool         iascii;
26405db81ecSKris Buschelman   PetscViewerFormat format;
26505db81ecSKris Buschelman 
26605db81ecSKris Buschelman   PetscFunctionBegin;
267b24902e0SBarry Smith   ierr = MatView_SeqAIJ(A,viewer);CHKERRQ(ierr);
2682692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
26932077d6dSBarry Smith   if (iascii) {
27005db81ecSKris Buschelman     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
27105db81ecSKris Buschelman     if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) {
27205db81ecSKris Buschelman       ierr = MatFactorInfo_Matlab(A,viewer);
27305db81ecSKris Buschelman     }
27405db81ecSKris Buschelman   }
27505db81ecSKris Buschelman   PetscFunctionReturn(0);
27605db81ecSKris Buschelman }
277f365a357SKris Buschelman 
27805db81ecSKris Buschelman 
27905db81ecSKris Buschelman /*MC
2802692d6eeSBarry Smith   MATSOLVERMATLAB - "matlab" - Providing direct solvers (LU and QR) and drop tolerance
281e3c5b3baSBarry Smith   based ILU factorization (ILUDT) for sequential matrices via the external package MATLAB.
28205db81ecSKris Buschelman 
28305db81ecSKris Buschelman 
28441c8de11SBarry Smith   Works with MATSEQAIJ matrices.
28505db81ecSKris Buschelman 
28605db81ecSKris Buschelman   Options Database Keys:
287e3c5b3baSBarry Smith . -pc_factor_mat_solver_type matlab - selects MATLAB to do the sparse factorization
28841c8de11SBarry Smith 
28905db81ecSKris Buschelman 
29005db81ecSKris Buschelman   Level: beginner
29105db81ecSKris Buschelman 
29205db81ecSKris Buschelman .seealso: PCLU
29341c8de11SBarry Smith 
29441c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage
29505db81ecSKris Buschelman M*/
29605db81ecSKris Buschelman 
297