xref: /petsc/src/mat/impls/aij/seq/matlab/aijmatlab.c (revision 05db81eca8a12931890b79147fd88a0dc7b1d01d)
13b3e256bSKris Buschelman /*$Id: aijmatlab.c,v 1.12 2001/08/06 21:15:14 bsmith Exp $*/
23b3e256bSKris Buschelman 
33b3e256bSKris Buschelman /*
43b3e256bSKris Buschelman         Provides an interface for the Matlab engine sparse solver
53b3e256bSKris Buschelman 
63b3e256bSKris Buschelman */
73b3e256bSKris Buschelman #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*05db81ecSKris Buschelman typedef struct {
13*05db81ecSKris Buschelman   int (*MatDuplicate)(Mat,MatDuplicateOption,Mat*);
14*05db81ecSKris Buschelman   int (*MatView)(Mat,PetscViewer);
15*05db81ecSKris Buschelman   int (*MatLUFactorSymbolic)(Mat,IS,IS,MatFactorInfo*,Mat*);
16*05db81ecSKris Buschelman   int (*MatILUDTFactor)(Mat,MatFactorInfo*,IS,IS,Mat*);
17*05db81ecSKris Buschelman   int (*MatDestroy)(Mat);
18*05db81ecSKris Buschelman } Mat_Matlab;
19*05db81ecSKris Buschelman 
20*05db81ecSKris Buschelman EXTERN_C_BEGIN
213b3e256bSKris Buschelman #undef __FUNCT__
22*05db81ecSKris Buschelman #define __FUNCT__ "MatConvert_Matlab_SeqAIJ"
23*05db81ecSKris Buschelman int MatConvert_Matlab_SeqAIJ(Mat A,const MatType type,Mat *newmat) {
24*05db81ecSKris Buschelman   int        ierr;
25*05db81ecSKris Buschelman   Mat        B=*newmat;
26*05db81ecSKris Buschelman   Mat_Matlab *lu=(Mat_Matlab*)A->spptr;
27*05db81ecSKris Buschelman 
28*05db81ecSKris Buschelman   PetscFunctionBegin;
29*05db81ecSKris Buschelman   if (B != A) {
30*05db81ecSKris Buschelman     ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr);
31*05db81ecSKris Buschelman   }
32*05db81ecSKris Buschelman   A->ops->duplicate        = lu->MatDuplicate;
33*05db81ecSKris Buschelman   A->ops->view             = lu->MatView;
34*05db81ecSKris Buschelman   A->ops->lufactorsymbolic = lu->MatLUFactorSymbolic;
35*05db81ecSKris Buschelman   A->ops->iludtfactor      = lu->MatILUDTFactor;
36*05db81ecSKris Buschelman   A->ops->destroy          = lu->MatDestroy;
37*05db81ecSKris Buschelman 
38*05db81ecSKris Buschelman   ierr = PetscFree(lu);CHKERRQ(ierr);
39*05db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQAIJ);CHKERRQ(ierr);
40*05db81ecSKris Buschelman   *newmat = B;
41*05db81ecSKris Buschelman   PetscFunctionReturn(0);
42*05db81ecSKris Buschelman }
43*05db81ecSKris Buschelman EXTERN_C_END
44*05db81ecSKris Buschelman 
45*05db81ecSKris Buschelman #undef __FUNCT__
46*05db81ecSKris Buschelman #define __FUNCT__ "MatDestroy_Matlab"
47*05db81ecSKris Buschelman int MatDestroy_Matlab(Mat A) {
48*05db81ecSKris Buschelman   int         ierr;
49*05db81ecSKris Buschelman   Mat_Matlab *lu=(Mat_Matlab*)A->spptr;
50*05db81ecSKris Buschelman 
51*05db81ecSKris Buschelman   PetscFunctionBegin;
52*05db81ecSKris Buschelman   ierr = MatConvert_Matlab_SeqAIJ(A,MATSEQAIJ,&A);CHKERRQ(ierr);
53*05db81ecSKris Buschelman   ierr = (*A->ops->destroy)(A);CHKERRQ(ierr);
54*05db81ecSKris Buschelman   PetscFunctionReturn(0);
55*05db81ecSKris Buschelman }
56*05db81ecSKris Buschelman 
57*05db81ecSKris Buschelman #undef __FUNCT__
58*05db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab"
59*05db81ecSKris Buschelman int MatSolve_Matlab(Mat A,Vec b,Vec x)
603b3e256bSKris Buschelman {
613b3e256bSKris Buschelman   int             ierr;
623b3e256bSKris Buschelman   char            *_A,*_b,*_x;
633b3e256bSKris Buschelman 
643b3e256bSKris Buschelman   PetscFunctionBegin;
653b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
663b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
673b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
683b3e256bSKris Buschelman 
693b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
703b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
713b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
723b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr);
733b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr);
743b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr);
753b3e256bSKris Buschelman   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr);  */
763b3e256bSKris Buschelman   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr);
773b3e256bSKris Buschelman   PetscFunctionReturn(0);
783b3e256bSKris Buschelman }
793b3e256bSKris Buschelman 
803b3e256bSKris Buschelman #undef __FUNCT__
81*05db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab"
82*05db81ecSKris Buschelman int MatLUFactorNumeric_Matlab(Mat A,Mat *F)
833b3e256bSKris Buschelman {
843b3e256bSKris Buschelman   Mat_SeqAIJ      *f = (Mat_SeqAIJ*)(*F)->data;
853b3e256bSKris Buschelman   int             ierr,len;
863b3e256bSKris Buschelman   char            *_A,*name;
873b3e256bSKris Buschelman 
883b3e256bSKris Buschelman   PetscFunctionBegin;
893b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
903b3e256bSKris Buschelman   _A   = A->name;
913b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"[l_%s,u_%s,p_%s] = lu(%s',%g);",_A,_A,_A,_A,f->lu_dtcol);CHKERRQ(ierr);
923b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr);
933b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
943b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
953b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
963b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
973b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
983b3e256bSKris Buschelman   PetscFunctionReturn(0);
993b3e256bSKris Buschelman }
1003b3e256bSKris Buschelman 
1013b3e256bSKris Buschelman #undef __FUNCT__
102*05db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab"
103*05db81ecSKris Buschelman int MatLUFactorSymbolic_Matlab(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
1043b3e256bSKris Buschelman {
1053b3e256bSKris Buschelman   int        ierr;
1063b3e256bSKris Buschelman   Mat_SeqAIJ *f;
1073b3e256bSKris Buschelman 
1083b3e256bSKris Buschelman   PetscFunctionBegin;
1093b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
1103b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
1113b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
1123b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
113*05db81ecSKris Buschelman   (*F)->ops->solve           = MatSolve_Matlab;
114*05db81ecSKris Buschelman   (*F)->ops->lufactornumeric = MatLUFactorNumeric_Matlab;
1153b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
1163b3e256bSKris Buschelman   f                          = (Mat_SeqAIJ*)(*F)->data;
1173b3e256bSKris Buschelman   f->lu_dtcol = info->dtcol;
1183b3e256bSKris Buschelman   PetscFunctionReturn(0);
1193b3e256bSKris Buschelman }
1203b3e256bSKris Buschelman 
1213b3e256bSKris Buschelman /* ---------------------------------------------------------------------------------*/
1223b3e256bSKris Buschelman #undef __FUNCT__
123*05db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab_QR"
124*05db81ecSKris Buschelman int MatSolve_Matlab_QR(Mat A,Vec b,Vec x)
1253b3e256bSKris Buschelman {
1263b3e256bSKris Buschelman   int             ierr;
1273b3e256bSKris Buschelman   char            *_A,*_b,*_x;
1283b3e256bSKris Buschelman 
1293b3e256bSKris Buschelman   PetscFunctionBegin;
1303b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
1313b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
1323b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
1333b3e256bSKris Buschelman 
1343b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
1353b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
1363b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
1373b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr);
1383b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = r%s\\(r%s'\\(%s*%s));",_x,_A,_A,_A+1,_b);CHKERRQ(ierr);
1393b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr);
1403b3e256bSKris Buschelman   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr);  */
1413b3e256bSKris Buschelman   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr);
1423b3e256bSKris Buschelman   PetscFunctionReturn(0);
1433b3e256bSKris Buschelman }
1443b3e256bSKris Buschelman 
1453b3e256bSKris Buschelman #undef __FUNCT__
146*05db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab_QR"
147*05db81ecSKris Buschelman int MatLUFactorNumeric_Matlab_QR(Mat A,Mat *F)
1483b3e256bSKris Buschelman {
1493b3e256bSKris Buschelman   int             ierr,len;
1503b3e256bSKris Buschelman   char            *_A,*name;
1513b3e256bSKris Buschelman 
1523b3e256bSKris Buschelman   PetscFunctionBegin;
1533b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
1543b3e256bSKris Buschelman   _A   = A->name;
1553b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"r_%s = qr(%s');",_A,_A);CHKERRQ(ierr);
1563b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
1573b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
1583b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
1593b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
1603b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
1613b3e256bSKris Buschelman   PetscFunctionReturn(0);
1623b3e256bSKris Buschelman }
1633b3e256bSKris Buschelman 
1643b3e256bSKris Buschelman #undef __FUNCT__
165*05db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab_QR"
166*05db81ecSKris Buschelman int MatLUFactorSymbolic_Matlab_QR(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
1673b3e256bSKris Buschelman {
1683b3e256bSKris Buschelman   int  ierr;
1693b3e256bSKris Buschelman 
1703b3e256bSKris Buschelman   PetscFunctionBegin;
1713b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
1723b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
1733b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
1743b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
175*05db81ecSKris Buschelman   (*F)->ops->solve           = MatSolve_Matlab_QR;
176*05db81ecSKris Buschelman   (*F)->ops->lufactornumeric = MatLUFactorNumeric_Matlab_QR;
1773b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
1783b3e256bSKris Buschelman   (*F)->assembled            = PETSC_TRUE;  /* required by -ksp_view */
1793b3e256bSKris Buschelman 
1803b3e256bSKris Buschelman   PetscFunctionReturn(0);
1813b3e256bSKris Buschelman }
1823b3e256bSKris Buschelman 
1833b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/
1843b3e256bSKris Buschelman #undef __FUNCT__
185*05db81ecSKris Buschelman #define __FUNCT__ "MatILUDTFactor_Matlab"
186*05db81ecSKris Buschelman int MatILUDTFactor_Matlab(Mat A,MatFactorInfo *info,IS isrow,IS iscol,Mat *F)
1873b3e256bSKris Buschelman {
1883b3e256bSKris Buschelman   int        ierr,len;
1893b3e256bSKris Buschelman   char       *_A,*name;
1903b3e256bSKris Buschelman 
1913b3e256bSKris Buschelman   PetscFunctionBegin;
1923b3e256bSKris Buschelman   if (info->dt == PETSC_DEFAULT)      info->dt      = .005;
1933b3e256bSKris Buschelman   if (info->dtcol == PETSC_DEFAULT)   info->dtcol   = .01;
1943b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
1953b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
1963b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
1973b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
1983b3e256bSKris Buschelman   (*F)->ops->solve           = MatSolve_SeqAIJ_Matlab;
1993b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
2003b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
2013b3e256bSKris Buschelman   _A   = A->name;
2023b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,info->dtcol);CHKERRQ(ierr);
2033b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"[l_%s,u_%s,p_%s] = luinc(%s',info_%s);",_A,_A,_A,_A,_A);CHKERRQ(ierr);
2043b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr);
2053b3e256bSKris Buschelman 
2063b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
2073b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
2083b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
2093b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
2103b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
2113b3e256bSKris Buschelman   PetscFunctionReturn(0);
2123b3e256bSKris Buschelman }
2133b3e256bSKris Buschelman 
214*05db81ecSKris Buschelman #undef __FUNCT__
215*05db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab"
216*05db81ecSKris Buschelman int MatFactorInfo_Matlab(Mat A,PetscViewer viewer)
2173b3e256bSKris Buschelman {
2183b3e256bSKris Buschelman   int ierr;
2193b3e256bSKris Buschelman 
2203b3e256bSKris Buschelman   PetscFunctionBegin;
2213b3e256bSKris Buschelman   ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters:  -- not written yet!\n");CHKERRQ(ierr);
2223b3e256bSKris Buschelman   PetscFunctionReturn(0);
2233b3e256bSKris Buschelman }
2243b3e256bSKris Buschelman 
2253b3e256bSKris Buschelman #undef __FUNCT__
226*05db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab"
227*05db81ecSKris Buschelman int MatView_Matlab(Mat A,PetscViewer viewer) {
228*05db81ecSKris Buschelman   int               ierr;
229*05db81ecSKris Buschelman   PetscTruth        isascii;
230*05db81ecSKris Buschelman   PetscViewerFormat format;
231*05db81ecSKris Buschelman   Mat_Matlab        *lu=(Mat_Matlab*)(A->spptr);
232*05db81ecSKris Buschelman 
233*05db81ecSKris Buschelman   PetscFunctionBegin;
234*05db81ecSKris Buschelman   ierr = (*lu->MatView)(A,viewer);CHKERRQ(ierr);
235*05db81ecSKris Buschelman   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr);
236*05db81ecSKris Buschelman   if (isascii) {
237*05db81ecSKris Buschelman     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
238*05db81ecSKris Buschelman     if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) {
239*05db81ecSKris Buschelman       ierr = MatFactorInfo_Matlab(A,viewer);
240*05db81ecSKris Buschelman     }
241*05db81ecSKris Buschelman   }
242*05db81ecSKris Buschelman   PetscFunctionReturn(0);
243*05db81ecSKris Buschelman }
244*05db81ecSKris Buschelman 
245*05db81ecSKris Buschelman #undef __FUNCT__
246*05db81ecSKris Buschelman #define __FUNCT__ "MatConvert_SeqAIJ_Matlab"
247*05db81ecSKris Buschelman int MatConvert_SeqAIJ_Matlab(Mat A,const MatType type,Mat *newmat) {
248*05db81ecSKris Buschelman   /* This routine is only called to convert to MATMATLAB */
249*05db81ecSKris Buschelman   /* from MATSEQAIJ, so we will ignore 'MatType type'. */
250*05db81ecSKris Buschelman   int        ierr;
251*05db81ecSKris Buschelman   Mat        B=*newmat;
252*05db81ecSKris Buschelman   Mat_Matlab *lu;
2533b3e256bSKris Buschelman   PetscTruth qr;
254*05db81ecSKris Buschelman 
255*05db81ecSKris Buschelman   PetscFunctionBegin;
256*05db81ecSKris Buschelman   if (B != A) {
257*05db81ecSKris Buschelman     ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr);
258*05db81ecSKris Buschelman   }
259*05db81ecSKris Buschelman 
260*05db81ecSKris Buschelman   ierr = PetscNew(Mat_Matlab,&lu);CHKERRQ(ierr);
261*05db81ecSKris Buschelman   lu->MatDuplicate         = A->ops->duplicate;
262*05db81ecSKris Buschelman   lu->MatView              = A->ops->view;
263*05db81ecSKris Buschelman   lu->MatLUFactorSymbolic  = A->ops->lufactorsymbolic;
264*05db81ecSKris Buschelman   lu->MatILUDTFactor       = A->ops->iludtfactor;
265*05db81ecSKris Buschelman   lu->MatDestroy           = A->ops->destroy;
266*05db81ecSKris Buschelman 
267*05db81ecSKris Buschelman   B->spptr                 = (void*)lu;
268*05db81ecSKris Buschelman   B->ops->duplicate        = MatDuplicate_Matlab;
269*05db81ecSKris Buschelman   B->ops->view             = MatView_Matlab;
270*05db81ecSKris Buschelman   B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab;
271*05db81ecSKris Buschelman   B->ops->iludtfactor      = MatILUDTFactor_Matlab;
272*05db81ecSKris Buschelman   B->ops->destroy          = MatDestroy_Matlab;
273*05db81ecSKris Buschelman 
274*05db81ecSKris Buschelman   ierr = PetscOptionsHasName(A->prefix,"-mat_matlab_qr",&qr);CHKERRQ(ierr);
275*05db81ecSKris Buschelman   if (qr) {
276*05db81ecSKris Buschelman     B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab_QR;
277*05db81ecSKris Buschelman     PetscLogInfo(0,"Using Matlab QR with iterative refinement for LU factorization and solves");
278*05db81ecSKris Buschelman   } else {
279*05db81ecSKris Buschelman     PetscLogInfo(0,"Using Matlab for LU factorizations and solves.");
280*05db81ecSKris Buschelman   }
281*05db81ecSKris Buschelman   PetscLogInfo(0,"Using Matlab for ILUDT factorizations and solves.");
282*05db81ecSKris Buschelman 
283*05db81ecSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_matlab_C",
284*05db81ecSKris Buschelman                                            "MatConvert_SeqAIJ_Matlab",MatConvert_SeqAIJ_Matlab);CHKERRQ(ierr);
285*05db81ecSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_matlab_seqaij_C",
286*05db81ecSKris Buschelman                                            "MatConvert_Matlab_SeqAIJ",MatConvert_Matlab_SeqAIJ);CHKERRQ(ierr);
287*05db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)B,MATMATLAB);CHKERRQ(ierr);
288*05db81ecSKris Buschelman   *newmat = B;
289*05db81ecSKris Buschelman   PetscFunctionReturn(0);
290*05db81ecSKris Buschelman }
291*05db81ecSKris Buschelman EXTERN_C_END
292*05db81ecSKris Buschelman 
293*05db81ecSKris Buschelman #undef __FUNCT__
294*05db81ecSKris Buschelman #define __FUNCT__ "MatDuplicate_Matlab"
295*05db81ecSKris Buschelman int MatDuplicate_Matlab(Mat A, MatDuplicateOption op, Mat *M) {
296*05db81ecSKris Buschelman   int        ierr;
297*05db81ecSKris Buschelman   Mat_Matlab *lu=(Mat_Matlab*)A->spptr;
298*05db81ecSKris Buschelman 
299*05db81ecSKris Buschelman   PetscFunctionBegin;
300*05db81ecSKris Buschelman   ierr = (*lu->MatDuplicate)(A,op,M);CHKERRQ(ierr);
301*05db81ecSKris Buschelman   ierr = PetscMemcpy((*M)->spptr,lu,sizeof(Mat_Matlab));CHKERRQ(ierr);
302*05db81ecSKris Buschelman   PetscFunctionReturn(0);
303*05db81ecSKris Buschelman }
304*05db81ecSKris Buschelman 
305*05db81ecSKris Buschelman /*MC
306*05db81ecSKris Buschelman   MATMATLAB - MATMATLAB = "matlab" - A matrix type providing direct solvers (LU and QR) and drop tolerance
307*05db81ecSKris Buschelman   based ILU factorization (ILUDT) for sequential matrices via the external package Matlab.
308*05db81ecSKris Buschelman 
309*05db81ecSKris Buschelman   If Matlab is instaled (see the manual for
310*05db81ecSKris Buschelman   instructions on how to declare the existence of external packages),
311*05db81ecSKris Buschelman   a matrix type can be constructed which invokes Matlab solvers.
312*05db81ecSKris Buschelman   After calling MatCreate(...,A), simply call MatSetType(A,MATMATLAB).
313*05db81ecSKris Buschelman   This matrix type is only supported for double precision real.
314*05db81ecSKris Buschelman 
315*05db81ecSKris Buschelman   This matrix inherits from MATSEQAIJ.  As a result, MatSeqAIJSetPreallocation is
316*05db81ecSKris Buschelman   supported for this matrix type.  One can also call MatConvert for an inplace conversion to or from
317*05db81ecSKris Buschelman   the MATSEQAIJ type without data copy.
318*05db81ecSKris Buschelman 
319*05db81ecSKris Buschelman   Options Database Keys:
320*05db81ecSKris Buschelman + -mat_type matlab - sets the matrix type to "matlab" during a call to MatSetFromOptions()
321*05db81ecSKris Buschelman - -mat_matlab_qr   - sets the direct solver to be QR instead of LU
322*05db81ecSKris Buschelman 
323*05db81ecSKris Buschelman   Level: beginner
324*05db81ecSKris Buschelman 
325*05db81ecSKris Buschelman .seealso: PCLU
326*05db81ecSKris Buschelman M*/
327*05db81ecSKris Buschelman 
328*05db81ecSKris Buschelman EXTERN_C_BEGIN
329*05db81ecSKris Buschelman #undef __FUNCT__
330*05db81ecSKris Buschelman #define __FUNCT__ "MatCreate_Matlab"
331*05db81ecSKris Buschelman int MarCreate_Matlab(Mat A) {
3323b3e256bSKris Buschelman   int ierr;
3333b3e256bSKris Buschelman 
3343b3e256bSKris Buschelman   PetscFunctionBegin;
335*05db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)A,MATMATLAB);CHKERRQ(ierr);
336*05db81ecSKris Buschelman   ierr = MatSetType(A,MATSEQAIJ);CHKERRQ(ierr);
337*05db81ecSKris Buschelman   ierr = MatConvert_SeqAIJ_Matlab(A,MATMATLAB,&A);CHKERRQ(ierr);
3383b3e256bSKris Buschelman   PetscFunctionReturn(0);
3393b3e256bSKris Buschelman }
340*05db81ecSKris Buschelman EXTERN_C_END
341