xref: /petsc/src/mat/impls/aij/seq/matlab/aijmatlab.c (revision 7087cfbefd1a42b179f217f9994fb6cb0d0c1824)
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