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