xref: /petsc/src/mat/impls/aij/seq/matlab/aijmatlab.c (revision aeeaa5c72329ecd13e2fe06a53a5cf823b9a8636)
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 
12*aeeaa5c7SBarry Smith EXTERN_C_BEGIN
13*aeeaa5c7SBarry Smith #undef __FUNCT__
14*aeeaa5c7SBarry Smith #define __FUNCT__ "MatSeqAIJToMatlab"
15*aeeaa5c7SBarry Smith mxArray *MatSeqAIJToMatlab(Mat B)
16*aeeaa5c7SBarry Smith {
17*aeeaa5c7SBarry Smith   PetscErrorCode ierr;
18*aeeaa5c7SBarry Smith   Mat_SeqAIJ     *aij = (Mat_SeqAIJ*)B->data;
19*aeeaa5c7SBarry Smith   mwIndex        i,*ii,*jj;
20*aeeaa5c7SBarry Smith   mxArray        *mat;
21*aeeaa5c7SBarry Smith 
22*aeeaa5c7SBarry Smith   PetscFunctionBegin;
23*aeeaa5c7SBarry Smith   mat  = mxCreateSparse(B->cmap->n,B->rmap->n,aij->nz,mxREAL);
24*aeeaa5c7SBarry Smith   ierr = PetscMemcpy(mxGetPr(mat),aij->a,aij->nz*sizeof(PetscScalar));
25*aeeaa5c7SBarry Smith   /* Matlab stores by column, not row so we pass in the transpose of the matrix */
26*aeeaa5c7SBarry Smith   jj = mxGetIr(mat);
27*aeeaa5c7SBarry Smith   for (i=0; i<aij->nz; i++) jj[i] = aij->j[i];
28*aeeaa5c7SBarry Smith   ii = mxGetJc(mat);
29*aeeaa5c7SBarry Smith   for (i=0; i<B->rmap->n+1; i++) ii[i] = aij->i[i];
30*aeeaa5c7SBarry Smith 
31*aeeaa5c7SBarry Smith   PetscFunctionReturn(mat);
32*aeeaa5c7SBarry Smith }
33*aeeaa5c7SBarry Smith EXTERN_C_END
34*aeeaa5c7SBarry 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;
45*aeeaa5c7SBarry Smith   mat = MatSeqAIJToMatlab((Mat)obj);CHKERRQ(ierr);
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__
54ff800b82SBarry Smith #define __FUNCT__ "MatCreateSeqAIJFromMatlab"
5584c105d7SBarry Smith /*@C
56ff800b82SBarry Smith     MatCreateSeqAIJFromMatlab - Given a Matlab sparse matrix, fills a SeqAIJ matrix with its transpose.
57ff800b82SBarry Smith 
58ff800b82SBarry Smith    Not Collective
59ff800b82SBarry Smith 
60ff800b82SBarry Smith    Input Parameters:
61ff800b82SBarry Smith +     mmat - a Matlab sparse matris
62ff800b82SBarry Smith -     mat - a already created MATSEQAIJ
63ff800b82SBarry Smith 
64ff800b82SBarry Smith    Developer Notes: on 64 bit systems Matlab uses 64 bit integers hence mWIndex is size_t.
65ff800b82SBarry Smith 
66ff800b82SBarry Smith @*/
677087cfbeSBarry Smith PetscErrorCode  MatCreateSeqAIJFromMatlab(mxArray *mmat,Mat *mat)
68ff800b82SBarry Smith {
69ff800b82SBarry Smith   PetscErrorCode ierr;
70ff800b82SBarry Smith   int            nz,n,m,*i,*j,k;
71ff800b82SBarry Smith   mwIndex        nnz,nn,nm,*ii,*jj;
72ff800b82SBarry Smith   PetscScalar    *a;
73ff800b82SBarry Smith   Mat_SeqAIJ     *aij;
74ff800b82SBarry Smith 
75ff800b82SBarry Smith   PetscFunctionBegin;
76ff800b82SBarry Smith   nn  = mxGetN(mmat);
77ff800b82SBarry Smith   nm  = mxGetM(mmat);
78ff800b82SBarry Smith   nnz = (mxGetJc(mmat))[nn];
79ff800b82SBarry Smith   ii  = mxGetJc(mmat);
80ff800b82SBarry Smith   jj  = mxGetIr(mmat);
81ff800b82SBarry Smith   n   = (PetscInt) nn;
82ff800b82SBarry Smith   m   = (PetscInt) nm;
83ff800b82SBarry Smith   nz  = (PetscInt) nnz;
84ff800b82SBarry Smith   ierr = PetscMalloc3(nz,PetscScalar,&a,nz,PetscInt,&j,n+1,PetscInt,&i);CHKERRQ(ierr);
85ff800b82SBarry Smith 
86ff800b82SBarry Smith   for (k=0; k<n+1; k++) {
87ff800b82SBarry Smith     i[k] = (PetscInt) ii[k];
88ff800b82SBarry Smith   }
89ff800b82SBarry Smith   for (k=0; k<nz; k++) {
90ff800b82SBarry Smith     j[k] = (PetscInt) jj[k];
91ff800b82SBarry Smith   }
92ff800b82SBarry Smith   ierr = PetscMemcpy(a,mxGetPr(mmat),nz*sizeof(PetscScalar));CHKERRQ(ierr);
93ff800b82SBarry Smith   ierr = MatCreateSeqAIJWithArrays(PETSC_COMM_SELF,m,n,i,j,a,mat);CHKERRQ(ierr);
94ff800b82SBarry Smith   aij               = (Mat_SeqAIJ*)(*mat)->data;
95ff800b82SBarry Smith   aij->singlemalloc = PETSC_TRUE;
9684c105d7SBarry Smith   aij->nonew        = 0;
9784c105d7SBarry Smith   aij->free_a       = PETSC_TRUE;
9884c105d7SBarry Smith   aij->free_ij      = PETSC_TRUE;
99ff800b82SBarry Smith   PetscFunctionReturn(0);
100ff800b82SBarry Smith }
101ff800b82SBarry Smith EXTERN_C_END
102ff800b82SBarry Smith 
103ff800b82SBarry Smith EXTERN_C_BEGIN
104ff800b82SBarry Smith #undef __FUNCT__
105a7bb0f05SBarry Smith #define __FUNCT__ "MatSeqAIJFromMatlab"
10684c105d7SBarry Smith /*@C
107a7bb0f05SBarry Smith     MatSeqAIJFromMatlab - Given a Matlab sparse matrix, fills a SeqAIJ matrix with its transpose.
108a7bb0f05SBarry Smith 
109a7bb0f05SBarry Smith    Not Collective
110a7bb0f05SBarry Smith 
111a7bb0f05SBarry Smith    Input Parameters:
112a7bb0f05SBarry Smith +     mmat - a Matlab sparse matris
113a7bb0f05SBarry Smith -     mat - a already created MATSEQAIJ
114a7bb0f05SBarry Smith 
115a7bb0f05SBarry Smith @*/
1167087cfbeSBarry Smith PetscErrorCode  MatSeqAIJFromMatlab(mxArray *mmat,Mat mat)
117a1d52234SKris Buschelman {
118dfbe8321SBarry Smith   PetscErrorCode ierr;
119dfbe8321SBarry Smith   int            ii;
120a1d52234SKris Buschelman   Mat_SeqAIJ     *aij = (Mat_SeqAIJ*)mat->data;
121a1d52234SKris Buschelman 
122a1d52234SKris Buschelman   PetscFunctionBegin;
1231f03425eSSatish Balay   ierr = MatSeqXAIJFreeAIJ(mat,&aij->a,&aij->j,&aij->i);CHKERRQ(ierr);
124a1d52234SKris Buschelman 
125f0523c5fSHong Zhang   aij->nz           = (mxGetJc(mmat))[mat->rmap->n];
126f0523c5fSHong Zhang   ierr  = PetscMalloc3(aij->nz,PetscScalar,&aij->a,aij->nz,PetscInt,&aij->j,mat->rmap->n+1,PetscInt,&aij->i);CHKERRQ(ierr);
127a1d52234SKris Buschelman   aij->singlemalloc = PETSC_TRUE;
128a1d52234SKris Buschelman 
129a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->a,mxGetPr(mmat),aij->nz*sizeof(PetscScalar));CHKERRQ(ierr);
130a1d52234SKris Buschelman   /* Matlab stores by column, not row so we pass in the transpose of the matrix */
131a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->j,mxGetIr(mmat),aij->nz*sizeof(int));CHKERRQ(ierr);
132f0523c5fSHong Zhang   ierr = PetscMemcpy(aij->i,mxGetJc(mmat),(mat->rmap->n+1)*sizeof(int));CHKERRQ(ierr);
133a1d52234SKris Buschelman 
134f0523c5fSHong Zhang   for (ii=0; ii<mat->rmap->n; ii++) {
135a1d52234SKris Buschelman     aij->ilen[ii] = aij->imax[ii] = aij->i[ii+1] - aij->i[ii];
136a1d52234SKris Buschelman   }
137a1d52234SKris Buschelman 
138a1d52234SKris Buschelman   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
139a1d52234SKris Buschelman   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
140a7bb0f05SBarry Smith   PetscFunctionReturn(0);
141a7bb0f05SBarry Smith }
142a7bb0f05SBarry Smith EXTERN_C_END
143a1d52234SKris Buschelman 
144a7bb0f05SBarry Smith 
145a7bb0f05SBarry Smith EXTERN_C_BEGIN
146a7bb0f05SBarry Smith #undef __FUNCT__
147a7bb0f05SBarry Smith #define __FUNCT__ "MatlabEngineGet_SeqAIJ"
1487087cfbeSBarry Smith PetscErrorCode  MatlabEngineGet_SeqAIJ(PetscObject obj,void *mengine)
149a7bb0f05SBarry Smith {
150a7bb0f05SBarry Smith   PetscErrorCode ierr;
151a7bb0f05SBarry Smith   Mat            mat = (Mat)obj;
152a7bb0f05SBarry Smith   mxArray        *mmat;
153a7bb0f05SBarry Smith 
154a7bb0f05SBarry Smith   PetscFunctionBegin;
155a7bb0f05SBarry Smith   mmat = engGetVariable((Engine *)mengine,obj->name);
156a7bb0f05SBarry Smith   ierr = MatSeqAIJFromMatlab(mmat,mat);CHKERRQ(ierr);
157a1d52234SKris Buschelman   PetscFunctionReturn(0);
158a1d52234SKris Buschelman }
159a1d52234SKris Buschelman EXTERN_C_END
160a1d52234SKris Buschelman 
16105db81ecSKris Buschelman #undef __FUNCT__
16205db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab"
163dfbe8321SBarry Smith PetscErrorCode MatSolve_Matlab(Mat A,Vec b,Vec x)
1643b3e256bSKris Buschelman {
165dfbe8321SBarry Smith   PetscErrorCode ierr;
166e060cb09SBarry Smith   const char     *_A,*_b,*_x;
1673b3e256bSKris Buschelman 
1683b3e256bSKris Buschelman   PetscFunctionBegin;
1693b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
1703b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
1713b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
1723b3e256bSKris Buschelman 
1733b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
1743b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
1753b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
1767adad957SLisandro Dalcin   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)b);CHKERRQ(ierr);
1777adad957SLisandro Dalcin   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr);
1787adad957SLisandro Dalcin   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_b);CHKERRQ(ierr);
1797adad957SLisandro Dalcin   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),stdout);CHKERRQ(ierr);  */
1807adad957SLisandro Dalcin   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)x);CHKERRQ(ierr);
1813b3e256bSKris Buschelman   PetscFunctionReturn(0);
1823b3e256bSKris Buschelman }
1833b3e256bSKris Buschelman 
1843b3e256bSKris Buschelman #undef __FUNCT__
18505db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab"
1860481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Matlab(Mat F,Mat A,const MatFactorInfo *info)
1873b3e256bSKris Buschelman {
188dfbe8321SBarry Smith   PetscErrorCode ierr;
189de4209c5SBarry Smith   size_t         len;
1903b3e256bSKris Buschelman   char           *_A,*name;
191b3866ffcSBarry Smith   PetscReal      dtcol = info->dtcol;
1923b3e256bSKris Buschelman 
1933b3e256bSKris Buschelman   PetscFunctionBegin;
194d5f3da31SBarry Smith   if (F->factortype == MAT_FACTOR_ILU || info->dt > 0) {
195b3866ffcSBarry Smith     if (info->dtcol == PETSC_DEFAULT)  dtcol = .01;
196fe97e370SBarry Smith     F->ops->solve           = MatSolve_Matlab;
197d5f3da31SBarry Smith     F->factortype           = MAT_FACTOR_LU;
198fe97e370SBarry Smith     ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr);
199fe97e370SBarry Smith     _A   = ((PetscObject)A)->name;
200b3866ffcSBarry Smith     ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,dtcol);CHKERRQ(ierr);
201fe97e370SBarry 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);
202fe97e370SBarry Smith     ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr);
203fe97e370SBarry Smith 
204fe97e370SBarry Smith     ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
205fe97e370SBarry Smith     ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
206fe97e370SBarry Smith     sprintf(name,"_%s",_A);
207fe97e370SBarry Smith     ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr);
208fe97e370SBarry Smith     ierr = PetscFree(name);CHKERRQ(ierr);
209fe97e370SBarry Smith   } else {
2107adad957SLisandro Dalcin     ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr);
211f0523c5fSHong Zhang     _A   = ((PetscObject)A)->name;
212b3866ffcSBarry 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);
2137adad957SLisandro Dalcin     ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr);
2143b3e256bSKris Buschelman     ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
2153b3e256bSKris Buschelman     ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
2163b3e256bSKris Buschelman     sprintf(name,"_%s",_A);
217f0523c5fSHong Zhang     ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr);
2183b3e256bSKris Buschelman     ierr = PetscFree(name);CHKERRQ(ierr);
219f0523c5fSHong Zhang     F->ops->solve              = MatSolve_Matlab;
220fe97e370SBarry Smith   }
2213b3e256bSKris Buschelman   PetscFunctionReturn(0);
2223b3e256bSKris Buschelman }
2233b3e256bSKris Buschelman 
2243b3e256bSKris Buschelman #undef __FUNCT__
22505db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab"
2260481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Matlab(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
2273b3e256bSKris Buschelman {
2283b3e256bSKris Buschelman   PetscFunctionBegin;
229e32f2f54SBarry Smith   if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square");
230f0523c5fSHong Zhang   F->ops->lufactornumeric    = MatLUFactorNumeric_Matlab;
231b3866ffcSBarry Smith   F->assembled = PETSC_TRUE;
2323b3e256bSKris Buschelman   PetscFunctionReturn(0);
2333b3e256bSKris Buschelman }
2343b3e256bSKris Buschelman 
23535bd34faSBarry Smith EXTERN_C_BEGIN
23635bd34faSBarry Smith #undef __FUNCT__
23735bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_seqaij_matlab"
23835bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_seqaij_matlab(Mat A,const MatSolverPackage *type)
23935bd34faSBarry Smith {
24035bd34faSBarry Smith   PetscFunctionBegin;
2412692d6eeSBarry Smith   *type = MATSOLVERMATLAB;
24235bd34faSBarry Smith   PetscFunctionReturn(0);
24335bd34faSBarry Smith }
24435bd34faSBarry Smith EXTERN_C_END
24535bd34faSBarry Smith 
2463b3e256bSKris Buschelman #undef __FUNCT__
247b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_matlab"
2485c9eb25fSBarry Smith PetscErrorCode MatGetFactor_seqaij_matlab(Mat A,MatFactorType ftype,Mat *F)
2493b3e256bSKris Buschelman {
250dfbe8321SBarry Smith   PetscErrorCode ierr;
2513b3e256bSKris Buschelman 
2523b3e256bSKris Buschelman   PetscFunctionBegin;
253e32f2f54SBarry Smith   if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square");
2547adad957SLisandro Dalcin   ierr                         = MatCreate(((PetscObject)A)->comm,F);CHKERRQ(ierr);
255f0523c5fSHong Zhang   ierr                         = MatSetSizes(*F,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
2567adad957SLisandro Dalcin   ierr                         = MatSetType(*F,((PetscObject)A)->type_name);CHKERRQ(ierr);
2573b3e256bSKris Buschelman   ierr                         = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
258b24902e0SBarry Smith   (*F)->ops->lufactorsymbolic  = MatLUFactorSymbolic_Matlab;
259b3866ffcSBarry Smith   (*F)->ops->ilufactorsymbolic = MatLUFactorSymbolic_Matlab;
260f75d6de4SMatthew Knepley   ierr = PetscObjectComposeFunctionDynamic((PetscObject)(*F),"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_seqaij_matlab",MatFactorGetSolverPackage_seqaij_matlab);CHKERRQ(ierr);
261f0523c5fSHong Zhang 
262d5f3da31SBarry Smith   (*F)->factortype             = ftype;
2633b3e256bSKris Buschelman   PetscFunctionReturn(0);
2643b3e256bSKris Buschelman }
2653b3e256bSKris Buschelman 
266b24902e0SBarry Smith 
2673b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/
2683b3e256bSKris Buschelman 
26905db81ecSKris Buschelman #undef __FUNCT__
27005db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab"
271dfbe8321SBarry Smith PetscErrorCode MatFactorInfo_Matlab(Mat A,PetscViewer viewer)
2723b3e256bSKris Buschelman {
273dfbe8321SBarry Smith   PetscErrorCode ierr;
2743b3e256bSKris Buschelman 
2753b3e256bSKris Buschelman   PetscFunctionBegin;
2763b3e256bSKris Buschelman   ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters:  -- not written yet!\n");CHKERRQ(ierr);
2773b3e256bSKris Buschelman   PetscFunctionReturn(0);
2783b3e256bSKris Buschelman }
2793b3e256bSKris Buschelman 
2803b3e256bSKris Buschelman #undef __FUNCT__
28105db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab"
282b2d3331aSBarry Smith PetscErrorCode MatView_Matlab(Mat A,PetscViewer viewer)
283b2d3331aSBarry Smith {
284dfbe8321SBarry Smith   PetscErrorCode    ierr;
285ace3abfcSBarry Smith   PetscBool         iascii;
28605db81ecSKris Buschelman   PetscViewerFormat format;
28705db81ecSKris Buschelman 
28805db81ecSKris Buschelman   PetscFunctionBegin;
289b24902e0SBarry Smith   ierr = MatView_SeqAIJ(A,viewer);CHKERRQ(ierr);
2902692d6eeSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
29132077d6dSBarry Smith   if (iascii) {
29205db81ecSKris Buschelman     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
29305db81ecSKris Buschelman     if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) {
29405db81ecSKris Buschelman       ierr = MatFactorInfo_Matlab(A,viewer);
29505db81ecSKris Buschelman     }
29605db81ecSKris Buschelman   }
29705db81ecSKris Buschelman   PetscFunctionReturn(0);
29805db81ecSKris Buschelman }
299f365a357SKris Buschelman 
30005db81ecSKris Buschelman 
30105db81ecSKris Buschelman /*MC
3022692d6eeSBarry Smith   MATSOLVERMATLAB - "matlab" - Providing direct solvers (LU and QR) and drop tolerance
30305db81ecSKris Buschelman   based ILU factorization (ILUDT) for sequential matrices via the external package Matlab.
30405db81ecSKris Buschelman 
30505db81ecSKris Buschelman 
30641c8de11SBarry Smith   Works with MATSEQAIJ matrices.
30705db81ecSKris Buschelman 
30805db81ecSKris Buschelman   Options Database Keys:
30941c8de11SBarry Smith . -pc_factor_mat_solver_type matlab - selects Matlab to do the sparse factorization
31041c8de11SBarry Smith 
31105db81ecSKris Buschelman 
31205db81ecSKris Buschelman   Level: beginner
31305db81ecSKris Buschelman 
31405db81ecSKris Buschelman .seealso: PCLU
31541c8de11SBarry Smith 
31641c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage
31705db81ecSKris Buschelman M*/
31805db81ecSKris Buschelman 
319