xref: /petsc/src/mat/impls/aij/seq/matlab/aijmatlab.c (revision 6849ba73f22fecb8f92ef896a42e4e8bd4cd6965)
13b3e256bSKris Buschelman /*
23b3e256bSKris Buschelman         Provides an interface for the Matlab engine sparse solver
33b3e256bSKris Buschelman 
43b3e256bSKris Buschelman */
53b3e256bSKris Buschelman #include "src/mat/impls/aij/seq/aij.h"
63b3e256bSKris Buschelman 
73b3e256bSKris Buschelman #include "engine.h"   /* Matlab include file */
83b3e256bSKris Buschelman #include "mex.h"      /* Matlab include file */
93b3e256bSKris Buschelman 
1005db81ecSKris Buschelman typedef struct {
11*6849ba73SBarry Smith   PetscErrorCode (*MatDuplicate)(Mat,MatDuplicateOption,Mat*);
12*6849ba73SBarry Smith   PetscErrorCode (*MatView)(Mat,PetscViewer);
13*6849ba73SBarry Smith   PetscErrorCode (*MatLUFactorSymbolic)(Mat,IS,IS,MatFactorInfo*,Mat*);
14*6849ba73SBarry Smith   PetscErrorCode (*MatILUDTFactor)(Mat,MatFactorInfo*,IS,IS,Mat*);
15*6849ba73SBarry Smith   PetscErrorCode (*MatDestroy)(Mat);
1605db81ecSKris Buschelman } Mat_Matlab;
1705db81ecSKris Buschelman 
18a1d52234SKris Buschelman 
19a1d52234SKris Buschelman EXTERN_C_BEGIN
20a1d52234SKris Buschelman #undef __FUNCT__
21a1d52234SKris Buschelman #define __FUNCT__ "MatMatlabEnginePut_Matlab"
22dfbe8321SBarry Smith PetscErrorCode MatMatlabEnginePut_Matlab(PetscObject obj,void *mengine)
23a1d52234SKris Buschelman {
24dfbe8321SBarry Smith   PetscErrorCode ierr;
25a1d52234SKris Buschelman   Mat         B = (Mat)obj;
26a1d52234SKris Buschelman   mxArray     *mat;
27a1d52234SKris Buschelman   Mat_SeqAIJ  *aij = (Mat_SeqAIJ*)B->data;
28a1d52234SKris Buschelman 
29a1d52234SKris Buschelman   PetscFunctionBegin;
30a1d52234SKris Buschelman   mat  = mxCreateSparse(B->n,B->m,aij->nz,mxREAL);
31a1d52234SKris Buschelman   ierr = PetscMemcpy(mxGetPr(mat),aij->a,aij->nz*sizeof(PetscScalar));CHKERRQ(ierr);
32a1d52234SKris Buschelman   /* Matlab stores by column, not row so we pass in the transpose of the matrix */
33a1d52234SKris Buschelman   ierr = PetscMemcpy(mxGetIr(mat),aij->j,aij->nz*sizeof(int));CHKERRQ(ierr);
34a1d52234SKris Buschelman   ierr = PetscMemcpy(mxGetJc(mat),aij->i,(B->m+1)*sizeof(int));CHKERRQ(ierr);
35a1d52234SKris Buschelman 
36a1d52234SKris Buschelman   /* Matlab indices start at 0 for sparse (what a surprise) */
37a1d52234SKris Buschelman 
38a1d52234SKris Buschelman   ierr = PetscObjectName(obj);CHKERRQ(ierr);
39a1d52234SKris Buschelman   engPutVariable((Engine *)mengine,obj->name,mat);
40a1d52234SKris Buschelman   PetscFunctionReturn(0);
41a1d52234SKris Buschelman }
42a1d52234SKris Buschelman EXTERN_C_END
43a1d52234SKris Buschelman 
44a1d52234SKris Buschelman EXTERN_C_BEGIN
45a1d52234SKris Buschelman #undef __FUNCT__
46a1d52234SKris Buschelman #define __FUNCT__ "MatMatlabEngineGet_Matlab"
47dfbe8321SBarry Smith PetscErrorCode MatMatlabEngineGet_Matlab(PetscObject obj,void *mengine)
48a1d52234SKris Buschelman {
49dfbe8321SBarry Smith   PetscErrorCode ierr;
50dfbe8321SBarry Smith   int        ii;
51a1d52234SKris Buschelman   Mat        mat = (Mat)obj;
52a1d52234SKris Buschelman   Mat_SeqAIJ *aij = (Mat_SeqAIJ*)mat->data;
53a1d52234SKris Buschelman   mxArray    *mmat;
54a1d52234SKris Buschelman 
55a1d52234SKris Buschelman   PetscFunctionBegin;
56a1d52234SKris Buschelman   ierr = PetscFree(aij->a);CHKERRQ(ierr);
57a1d52234SKris Buschelman 
58a1d52234SKris Buschelman   mmat = engGetVariable((Engine *)mengine,obj->name);
59a1d52234SKris Buschelman 
60a1d52234SKris Buschelman   aij->nz           = (mxGetJc(mmat))[mat->m];
61a1d52234SKris Buschelman   ierr              = PetscMalloc(((size_t) aij->nz)*(sizeof(int)+sizeof(PetscScalar))+(mat->m+1)*sizeof(int),&aij->a);CHKERRQ(ierr);
62a1d52234SKris Buschelman   aij->j            = (int*)(aij->a + aij->nz);
63a1d52234SKris Buschelman   aij->i            = aij->j + aij->nz;
64a1d52234SKris Buschelman   aij->singlemalloc = PETSC_TRUE;
65a1d52234SKris Buschelman   aij->freedata     = PETSC_TRUE;
66a1d52234SKris Buschelman 
67a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->a,mxGetPr(mmat),aij->nz*sizeof(PetscScalar));CHKERRQ(ierr);
68a1d52234SKris Buschelman   /* Matlab stores by column, not row so we pass in the transpose of the matrix */
69a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->j,mxGetIr(mmat),aij->nz*sizeof(int));CHKERRQ(ierr);
70a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->i,mxGetJc(mmat),(mat->m+1)*sizeof(int));CHKERRQ(ierr);
71a1d52234SKris Buschelman 
72a1d52234SKris Buschelman   for (ii=0; ii<mat->m; ii++) {
73a1d52234SKris Buschelman     aij->ilen[ii] = aij->imax[ii] = aij->i[ii+1] - aij->i[ii];
74a1d52234SKris Buschelman   }
75a1d52234SKris Buschelman 
76a1d52234SKris Buschelman   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
77a1d52234SKris Buschelman   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
78a1d52234SKris Buschelman 
79a1d52234SKris Buschelman   PetscFunctionReturn(0);
80a1d52234SKris Buschelman }
81a1d52234SKris Buschelman EXTERN_C_END
82a1d52234SKris Buschelman 
8305db81ecSKris Buschelman EXTERN_C_BEGIN
843b3e256bSKris Buschelman #undef __FUNCT__
8505db81ecSKris Buschelman #define __FUNCT__ "MatConvert_Matlab_SeqAIJ"
86dfbe8321SBarry Smith PetscErrorCode MatConvert_Matlab_SeqAIJ(Mat A,const MatType type,Mat *newmat) {
87dfbe8321SBarry Smith   PetscErrorCode ierr;
8805db81ecSKris Buschelman   Mat        B=*newmat;
8905db81ecSKris Buschelman   Mat_Matlab *lu=(Mat_Matlab*)A->spptr;
9005db81ecSKris Buschelman 
9105db81ecSKris Buschelman   PetscFunctionBegin;
9205db81ecSKris Buschelman   if (B != A) {
9305db81ecSKris Buschelman     ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr);
9405db81ecSKris Buschelman   }
9505db81ecSKris Buschelman   A->ops->duplicate        = lu->MatDuplicate;
9605db81ecSKris Buschelman   A->ops->view             = lu->MatView;
9705db81ecSKris Buschelman   A->ops->lufactorsymbolic = lu->MatLUFactorSymbolic;
9805db81ecSKris Buschelman   A->ops->iludtfactor      = lu->MatILUDTFactor;
9905db81ecSKris Buschelman   A->ops->destroy          = lu->MatDestroy;
10005db81ecSKris Buschelman 
10105db81ecSKris Buschelman   ierr = PetscFree(lu);CHKERRQ(ierr);
10205db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQAIJ);CHKERRQ(ierr);
10305db81ecSKris Buschelman   *newmat = B;
10405db81ecSKris Buschelman   PetscFunctionReturn(0);
10505db81ecSKris Buschelman }
10605db81ecSKris Buschelman EXTERN_C_END
10705db81ecSKris Buschelman 
10805db81ecSKris Buschelman #undef __FUNCT__
10905db81ecSKris Buschelman #define __FUNCT__ "MatDestroy_Matlab"
110dfbe8321SBarry Smith PetscErrorCode MatDestroy_Matlab(Mat A)
111dfbe8321SBarry Smith {
112dfbe8321SBarry Smith   PetscErrorCode ierr;
11305db81ecSKris Buschelman 
11405db81ecSKris Buschelman   PetscFunctionBegin;
11505db81ecSKris Buschelman   ierr = MatConvert_Matlab_SeqAIJ(A,MATSEQAIJ,&A);CHKERRQ(ierr);
11605db81ecSKris Buschelman   ierr = (*A->ops->destroy)(A);CHKERRQ(ierr);
11705db81ecSKris Buschelman   PetscFunctionReturn(0);
11805db81ecSKris Buschelman }
11905db81ecSKris Buschelman 
12005db81ecSKris Buschelman #undef __FUNCT__
12105db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab"
122dfbe8321SBarry Smith PetscErrorCode MatSolve_Matlab(Mat A,Vec b,Vec x)
1233b3e256bSKris Buschelman {
124dfbe8321SBarry Smith   PetscErrorCode ierr;
1253b3e256bSKris Buschelman   char            *_A,*_b,*_x;
1263b3e256bSKris Buschelman 
1273b3e256bSKris Buschelman   PetscFunctionBegin;
1283b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
1293b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
1303b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
1313b3e256bSKris Buschelman 
1323b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
1333b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
1343b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
1353b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr);
1363b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr);
1373b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr);
1383b3e256bSKris Buschelman   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr);  */
1393b3e256bSKris Buschelman   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr);
1403b3e256bSKris Buschelman   PetscFunctionReturn(0);
1413b3e256bSKris Buschelman }
1423b3e256bSKris Buschelman 
1433b3e256bSKris Buschelman #undef __FUNCT__
14405db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab"
145dfbe8321SBarry Smith PetscErrorCode MatLUFactorNumeric_Matlab(Mat A,Mat *F)
1463b3e256bSKris Buschelman {
1473b3e256bSKris Buschelman   Mat_SeqAIJ      *f = (Mat_SeqAIJ*)(*F)->data;
148dfbe8321SBarry Smith   PetscErrorCode ierr;
149de4209c5SBarry Smith   size_t          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),"[l_%s,u_%s,p_%s] = lu(%s',%g);",_A,_A,_A,_A,f->lu_dtcol);CHKERRQ(ierr);
1563b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr);
1573b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
1583b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
1593b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
1603b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
1613b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
1623b3e256bSKris Buschelman   PetscFunctionReturn(0);
1633b3e256bSKris Buschelman }
1643b3e256bSKris Buschelman 
1653b3e256bSKris Buschelman #undef __FUNCT__
16605db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab"
167dfbe8321SBarry Smith PetscErrorCode MatLUFactorSymbolic_Matlab(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
1683b3e256bSKris Buschelman {
169dfbe8321SBarry Smith   PetscErrorCode ierr;
1703b3e256bSKris Buschelman   Mat_SeqAIJ *f;
1713b3e256bSKris Buschelman 
1723b3e256bSKris Buschelman   PetscFunctionBegin;
1733b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
1743b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
1753b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
1763b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
17705db81ecSKris Buschelman   (*F)->ops->solve           = MatSolve_Matlab;
17805db81ecSKris Buschelman   (*F)->ops->lufactornumeric = MatLUFactorNumeric_Matlab;
1793b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
1803b3e256bSKris Buschelman   f                          = (Mat_SeqAIJ*)(*F)->data;
1813b3e256bSKris Buschelman   f->lu_dtcol = info->dtcol;
1823b3e256bSKris Buschelman   PetscFunctionReturn(0);
1833b3e256bSKris Buschelman }
1843b3e256bSKris Buschelman 
1853b3e256bSKris Buschelman /* ---------------------------------------------------------------------------------*/
1863b3e256bSKris Buschelman #undef __FUNCT__
18705db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab_QR"
188dfbe8321SBarry Smith PetscErrorCode MatSolve_Matlab_QR(Mat A,Vec b,Vec x)
1893b3e256bSKris Buschelman {
190dfbe8321SBarry Smith   PetscErrorCode ierr;
1913b3e256bSKris Buschelman   char            *_A,*_b,*_x;
1923b3e256bSKris Buschelman 
1933b3e256bSKris Buschelman   PetscFunctionBegin;
1943b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
1953b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
1963b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
1973b3e256bSKris Buschelman 
1983b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
1993b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
2003b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
2013b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr);
2023b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = r%s\\(r%s'\\(%s*%s));",_x,_A,_A,_A+1,_b);CHKERRQ(ierr);
2033b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr);
2043b3e256bSKris Buschelman   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr);  */
2053b3e256bSKris Buschelman   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr);
2063b3e256bSKris Buschelman   PetscFunctionReturn(0);
2073b3e256bSKris Buschelman }
2083b3e256bSKris Buschelman 
2093b3e256bSKris Buschelman #undef __FUNCT__
21005db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab_QR"
211dfbe8321SBarry Smith PetscErrorCode MatLUFactorNumeric_Matlab_QR(Mat A,Mat *F)
2123b3e256bSKris Buschelman {
213dfbe8321SBarry Smith   PetscErrorCode ierr;
214de4209c5SBarry Smith   size_t          len;
2153b3e256bSKris Buschelman   char            *_A,*name;
2163b3e256bSKris Buschelman 
2173b3e256bSKris Buschelman   PetscFunctionBegin;
2183b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
2193b3e256bSKris Buschelman   _A   = A->name;
2203b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"r_%s = qr(%s');",_A,_A);CHKERRQ(ierr);
2213b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
2223b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
2233b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
2243b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
2253b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
2263b3e256bSKris Buschelman   PetscFunctionReturn(0);
2273b3e256bSKris Buschelman }
2283b3e256bSKris Buschelman 
2293b3e256bSKris Buschelman #undef __FUNCT__
23005db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab_QR"
231dfbe8321SBarry Smith PetscErrorCode MatLUFactorSymbolic_Matlab_QR(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
2323b3e256bSKris Buschelman {
233dfbe8321SBarry Smith   PetscErrorCode ierr;
2343b3e256bSKris Buschelman 
2353b3e256bSKris Buschelman   PetscFunctionBegin;
2363b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
2373b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
2383b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
2393b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
24005db81ecSKris Buschelman   (*F)->ops->solve           = MatSolve_Matlab_QR;
24105db81ecSKris Buschelman   (*F)->ops->lufactornumeric = MatLUFactorNumeric_Matlab_QR;
2423b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
2433b3e256bSKris Buschelman   (*F)->assembled            = PETSC_TRUE;  /* required by -ksp_view */
2443b3e256bSKris Buschelman 
2453b3e256bSKris Buschelman   PetscFunctionReturn(0);
2463b3e256bSKris Buschelman }
2473b3e256bSKris Buschelman 
2483b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/
2493b3e256bSKris Buschelman #undef __FUNCT__
25005db81ecSKris Buschelman #define __FUNCT__ "MatILUDTFactor_Matlab"
251dfbe8321SBarry Smith PetscErrorCode MatILUDTFactor_Matlab(Mat A,MatFactorInfo *info,IS isrow,IS iscol,Mat *F)
2523b3e256bSKris Buschelman {
253dfbe8321SBarry Smith   PetscErrorCode ierr;
254de4209c5SBarry Smith   size_t     len;
2553b3e256bSKris Buschelman   char       *_A,*name;
2563b3e256bSKris Buschelman 
2573b3e256bSKris Buschelman   PetscFunctionBegin;
2583b3e256bSKris Buschelman   if (info->dt == PETSC_DEFAULT)      info->dt      = .005;
2593b3e256bSKris Buschelman   if (info->dtcol == PETSC_DEFAULT)   info->dtcol   = .01;
2603b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
2613b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
2623b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
2633b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
264f365a357SKris Buschelman   (*F)->ops->solve           = MatSolve_Matlab;
2653b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
2663b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
2673b3e256bSKris Buschelman   _A   = A->name;
2683b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,info->dtcol);CHKERRQ(ierr);
2693b3e256bSKris 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);
2703b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr);
2713b3e256bSKris Buschelman 
2723b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
2733b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
2743b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
2753b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
2763b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
2773b3e256bSKris Buschelman   PetscFunctionReturn(0);
2783b3e256bSKris Buschelman }
2793b3e256bSKris Buschelman 
28005db81ecSKris Buschelman #undef __FUNCT__
28105db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab"
282dfbe8321SBarry Smith PetscErrorCode MatFactorInfo_Matlab(Mat A,PetscViewer viewer)
2833b3e256bSKris Buschelman {
284dfbe8321SBarry Smith   PetscErrorCode ierr;
2853b3e256bSKris Buschelman 
2863b3e256bSKris Buschelman   PetscFunctionBegin;
2873b3e256bSKris Buschelman   ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters:  -- not written yet!\n");CHKERRQ(ierr);
2883b3e256bSKris Buschelman   PetscFunctionReturn(0);
2893b3e256bSKris Buschelman }
2903b3e256bSKris Buschelman 
2913b3e256bSKris Buschelman #undef __FUNCT__
29205db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab"
293dfbe8321SBarry Smith PetscErrorCode MatView_Matlab(Mat A,PetscViewer viewer) {
294dfbe8321SBarry Smith   PetscErrorCode ierr;
29532077d6dSBarry Smith   PetscTruth        iascii;
29605db81ecSKris Buschelman   PetscViewerFormat format;
29705db81ecSKris Buschelman   Mat_Matlab        *lu=(Mat_Matlab*)(A->spptr);
29805db81ecSKris Buschelman 
29905db81ecSKris Buschelman   PetscFunctionBegin;
30005db81ecSKris Buschelman   ierr = (*lu->MatView)(A,viewer);CHKERRQ(ierr);
30132077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
30232077d6dSBarry Smith   if (iascii) {
30305db81ecSKris Buschelman     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
30405db81ecSKris Buschelman     if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) {
30505db81ecSKris Buschelman       ierr = MatFactorInfo_Matlab(A,viewer);
30605db81ecSKris Buschelman     }
30705db81ecSKris Buschelman   }
30805db81ecSKris Buschelman   PetscFunctionReturn(0);
30905db81ecSKris Buschelman }
310f365a357SKris Buschelman 
311f365a357SKris Buschelman #undef __FUNCT__
312f365a357SKris Buschelman #define __FUNCT__ "MatDuplicate_Matlab"
313dfbe8321SBarry Smith PetscErrorCode MatDuplicate_Matlab(Mat A, MatDuplicateOption op, Mat *M) {
314dfbe8321SBarry Smith   PetscErrorCode ierr;
315f365a357SKris Buschelman   Mat_Matlab *lu=(Mat_Matlab*)A->spptr;
316f365a357SKris Buschelman 
317f365a357SKris Buschelman   PetscFunctionBegin;
318f365a357SKris Buschelman   ierr = (*lu->MatDuplicate)(A,op,M);CHKERRQ(ierr);
319f365a357SKris Buschelman   ierr = PetscMemcpy((*M)->spptr,lu,sizeof(Mat_Matlab));CHKERRQ(ierr);
320f365a357SKris Buschelman   PetscFunctionReturn(0);
321f365a357SKris Buschelman }
322f365a357SKris Buschelman 
323f365a357SKris Buschelman EXTERN_C_BEGIN
32405db81ecSKris Buschelman #undef __FUNCT__
32505db81ecSKris Buschelman #define __FUNCT__ "MatConvert_SeqAIJ_Matlab"
326dfbe8321SBarry Smith PetscErrorCode MatConvert_SeqAIJ_Matlab(Mat A,const MatType type,Mat *newmat) {
32705db81ecSKris Buschelman   /* This routine is only called to convert to MATMATLAB */
32805db81ecSKris Buschelman   /* from MATSEQAIJ, so we will ignore 'MatType type'. */
329dfbe8321SBarry Smith   PetscErrorCode ierr;
33005db81ecSKris Buschelman   Mat        B=*newmat;
33105db81ecSKris Buschelman   Mat_Matlab *lu;
3323b3e256bSKris Buschelman   PetscTruth qr;
33305db81ecSKris Buschelman 
33405db81ecSKris Buschelman   PetscFunctionBegin;
33505db81ecSKris Buschelman   if (B != A) {
33605db81ecSKris Buschelman     ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr);
33705db81ecSKris Buschelman   }
33805db81ecSKris Buschelman 
33905db81ecSKris Buschelman   ierr = PetscNew(Mat_Matlab,&lu);CHKERRQ(ierr);
34005db81ecSKris Buschelman   lu->MatDuplicate         = A->ops->duplicate;
34105db81ecSKris Buschelman   lu->MatView              = A->ops->view;
34205db81ecSKris Buschelman   lu->MatLUFactorSymbolic  = A->ops->lufactorsymbolic;
34305db81ecSKris Buschelman   lu->MatILUDTFactor       = A->ops->iludtfactor;
34405db81ecSKris Buschelman   lu->MatDestroy           = A->ops->destroy;
34505db81ecSKris Buschelman 
34605db81ecSKris Buschelman   B->spptr                 = (void*)lu;
34705db81ecSKris Buschelman   B->ops->duplicate        = MatDuplicate_Matlab;
34805db81ecSKris Buschelman   B->ops->view             = MatView_Matlab;
34905db81ecSKris Buschelman   B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab;
35005db81ecSKris Buschelman   B->ops->iludtfactor      = MatILUDTFactor_Matlab;
35105db81ecSKris Buschelman   B->ops->destroy          = MatDestroy_Matlab;
35205db81ecSKris Buschelman 
35305db81ecSKris Buschelman   ierr = PetscOptionsHasName(A->prefix,"-mat_matlab_qr",&qr);CHKERRQ(ierr);
35405db81ecSKris Buschelman   if (qr) {
35505db81ecSKris Buschelman     B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab_QR;
35605db81ecSKris Buschelman     PetscLogInfo(0,"Using Matlab QR with iterative refinement for LU factorization and solves");
35705db81ecSKris Buschelman   } else {
35805db81ecSKris Buschelman     PetscLogInfo(0,"Using Matlab for LU factorizations and solves.");
35905db81ecSKris Buschelman   }
36005db81ecSKris Buschelman   PetscLogInfo(0,"Using Matlab for ILUDT factorizations and solves.");
36105db81ecSKris Buschelman 
36205db81ecSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_matlab_C",
36305db81ecSKris Buschelman                                            "MatConvert_SeqAIJ_Matlab",MatConvert_SeqAIJ_Matlab);CHKERRQ(ierr);
36405db81ecSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_matlab_seqaij_C",
36505db81ecSKris Buschelman                                            "MatConvert_Matlab_SeqAIJ",MatConvert_Matlab_SeqAIJ);CHKERRQ(ierr);
366a1d52234SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"PetscMatlabEnginePut_C",
367a1d52234SKris Buschelman                                            "MatMatlabEnginePut_Matlab",MatMatlabEnginePut_Matlab);CHKERRQ(ierr);
368a1d52234SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"PetscMatlabEngineGet_C",
369a1d52234SKris Buschelman                                            "MatMatlabEngineGet_Matlab",MatMatlabEngineGet_Matlab);CHKERRQ(ierr);
37005db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)B,MATMATLAB);CHKERRQ(ierr);
37105db81ecSKris Buschelman   *newmat = B;
37205db81ecSKris Buschelman   PetscFunctionReturn(0);
37305db81ecSKris Buschelman }
37405db81ecSKris Buschelman EXTERN_C_END
37505db81ecSKris Buschelman 
37605db81ecSKris Buschelman /*MC
37705db81ecSKris Buschelman   MATMATLAB - MATMATLAB = "matlab" - A matrix type providing direct solvers (LU and QR) and drop tolerance
37805db81ecSKris Buschelman   based ILU factorization (ILUDT) for sequential matrices via the external package Matlab.
37905db81ecSKris Buschelman 
38005db81ecSKris Buschelman   If Matlab is instaled (see the manual for
38105db81ecSKris Buschelman   instructions on how to declare the existence of external packages),
38205db81ecSKris Buschelman   a matrix type can be constructed which invokes Matlab solvers.
38305db81ecSKris Buschelman   After calling MatCreate(...,A), simply call MatSetType(A,MATMATLAB).
38405db81ecSKris Buschelman   This matrix type is only supported for double precision real.
38505db81ecSKris Buschelman 
38605db81ecSKris Buschelman   This matrix inherits from MATSEQAIJ.  As a result, MatSeqAIJSetPreallocation is
38705db81ecSKris Buschelman   supported for this matrix type.  One can also call MatConvert for an inplace conversion to or from
38805db81ecSKris Buschelman   the MATSEQAIJ type without data copy.
38905db81ecSKris Buschelman 
39005db81ecSKris Buschelman   Options Database Keys:
39105db81ecSKris Buschelman + -mat_type matlab - sets the matrix type to "matlab" during a call to MatSetFromOptions()
39205db81ecSKris Buschelman - -mat_matlab_qr   - sets the direct solver to be QR instead of LU
39305db81ecSKris Buschelman 
39405db81ecSKris Buschelman   Level: beginner
39505db81ecSKris Buschelman 
39605db81ecSKris Buschelman .seealso: PCLU
39705db81ecSKris Buschelman M*/
39805db81ecSKris Buschelman 
39905db81ecSKris Buschelman EXTERN_C_BEGIN
40005db81ecSKris Buschelman #undef __FUNCT__
40105db81ecSKris Buschelman #define __FUNCT__ "MatCreate_Matlab"
402dfbe8321SBarry Smith PetscErrorCode MatCreate_Matlab(Mat A)
403dfbe8321SBarry Smith {
404dfbe8321SBarry Smith   PetscErrorCode ierr;
4053b3e256bSKris Buschelman 
4063b3e256bSKris Buschelman   PetscFunctionBegin;
40705db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)A,MATMATLAB);CHKERRQ(ierr);
40805db81ecSKris Buschelman   ierr = MatSetType(A,MATSEQAIJ);CHKERRQ(ierr);
40905db81ecSKris Buschelman   ierr = MatConvert_SeqAIJ_Matlab(A,MATMATLAB,&A);CHKERRQ(ierr);
4103b3e256bSKris Buschelman   PetscFunctionReturn(0);
4113b3e256bSKris Buschelman }
41205db81ecSKris Buschelman EXTERN_C_END
413