xref: /petsc/src/mat/impls/aij/seq/matlab/aijmatlab.c (revision 32077d6df18512e94702c86e7d562481ed0cebd0)
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 {
1105db81ecSKris Buschelman   int (*MatDuplicate)(Mat,MatDuplicateOption,Mat*);
1205db81ecSKris Buschelman   int (*MatView)(Mat,PetscViewer);
1305db81ecSKris Buschelman   int (*MatLUFactorSymbolic)(Mat,IS,IS,MatFactorInfo*,Mat*);
1405db81ecSKris Buschelman   int (*MatILUDTFactor)(Mat,MatFactorInfo*,IS,IS,Mat*);
1505db81ecSKris Buschelman   int (*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"
22a1d52234SKris Buschelman int MatMatlabEnginePut_Matlab(PetscObject obj,void *mengine)
23a1d52234SKris Buschelman {
24a1d52234SKris Buschelman   int         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"
47a1d52234SKris Buschelman int MatMatlabEngineGet_Matlab(PetscObject obj,void *mengine)
48a1d52234SKris Buschelman {
49a1d52234SKris Buschelman   int        ierr,ii;
50a1d52234SKris Buschelman   Mat        mat = (Mat)obj;
51a1d52234SKris Buschelman   Mat_SeqAIJ *aij = (Mat_SeqAIJ*)mat->data;
52a1d52234SKris Buschelman   mxArray    *mmat;
53a1d52234SKris Buschelman 
54a1d52234SKris Buschelman   PetscFunctionBegin;
55a1d52234SKris Buschelman   ierr = PetscFree(aij->a);CHKERRQ(ierr);
56a1d52234SKris Buschelman 
57a1d52234SKris Buschelman   mmat = engGetVariable((Engine *)mengine,obj->name);
58a1d52234SKris Buschelman 
59a1d52234SKris Buschelman   aij->nz           = (mxGetJc(mmat))[mat->m];
60a1d52234SKris Buschelman   ierr              = PetscMalloc(((size_t) aij->nz)*(sizeof(int)+sizeof(PetscScalar))+(mat->m+1)*sizeof(int),&aij->a);CHKERRQ(ierr);
61a1d52234SKris Buschelman   aij->j            = (int*)(aij->a + aij->nz);
62a1d52234SKris Buschelman   aij->i            = aij->j + aij->nz;
63a1d52234SKris Buschelman   aij->singlemalloc = PETSC_TRUE;
64a1d52234SKris Buschelman   aij->freedata     = PETSC_TRUE;
65a1d52234SKris Buschelman 
66a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->a,mxGetPr(mmat),aij->nz*sizeof(PetscScalar));CHKERRQ(ierr);
67a1d52234SKris Buschelman   /* Matlab stores by column, not row so we pass in the transpose of the matrix */
68a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->j,mxGetIr(mmat),aij->nz*sizeof(int));CHKERRQ(ierr);
69a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->i,mxGetJc(mmat),(mat->m+1)*sizeof(int));CHKERRQ(ierr);
70a1d52234SKris Buschelman 
71a1d52234SKris Buschelman   for (ii=0; ii<mat->m; ii++) {
72a1d52234SKris Buschelman     aij->ilen[ii] = aij->imax[ii] = aij->i[ii+1] - aij->i[ii];
73a1d52234SKris Buschelman   }
74a1d52234SKris Buschelman 
75a1d52234SKris Buschelman   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
76a1d52234SKris Buschelman   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
77a1d52234SKris Buschelman 
78a1d52234SKris Buschelman   PetscFunctionReturn(0);
79a1d52234SKris Buschelman }
80a1d52234SKris Buschelman EXTERN_C_END
81a1d52234SKris Buschelman 
8205db81ecSKris Buschelman EXTERN_C_BEGIN
833b3e256bSKris Buschelman #undef __FUNCT__
8405db81ecSKris Buschelman #define __FUNCT__ "MatConvert_Matlab_SeqAIJ"
8505db81ecSKris Buschelman int MatConvert_Matlab_SeqAIJ(Mat A,const MatType type,Mat *newmat) {
8605db81ecSKris Buschelman   int        ierr;
8705db81ecSKris Buschelman   Mat        B=*newmat;
8805db81ecSKris Buschelman   Mat_Matlab *lu=(Mat_Matlab*)A->spptr;
8905db81ecSKris Buschelman 
9005db81ecSKris Buschelman   PetscFunctionBegin;
9105db81ecSKris Buschelman   if (B != A) {
9205db81ecSKris Buschelman     ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr);
9305db81ecSKris Buschelman   }
9405db81ecSKris Buschelman   A->ops->duplicate        = lu->MatDuplicate;
9505db81ecSKris Buschelman   A->ops->view             = lu->MatView;
9605db81ecSKris Buschelman   A->ops->lufactorsymbolic = lu->MatLUFactorSymbolic;
9705db81ecSKris Buschelman   A->ops->iludtfactor      = lu->MatILUDTFactor;
9805db81ecSKris Buschelman   A->ops->destroy          = lu->MatDestroy;
9905db81ecSKris Buschelman 
10005db81ecSKris Buschelman   ierr = PetscFree(lu);CHKERRQ(ierr);
10105db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQAIJ);CHKERRQ(ierr);
10205db81ecSKris Buschelman   *newmat = B;
10305db81ecSKris Buschelman   PetscFunctionReturn(0);
10405db81ecSKris Buschelman }
10505db81ecSKris Buschelman EXTERN_C_END
10605db81ecSKris Buschelman 
10705db81ecSKris Buschelman #undef __FUNCT__
10805db81ecSKris Buschelman #define __FUNCT__ "MatDestroy_Matlab"
10905db81ecSKris Buschelman int MatDestroy_Matlab(Mat A) {
11005db81ecSKris Buschelman   int         ierr;
11105db81ecSKris Buschelman 
11205db81ecSKris Buschelman   PetscFunctionBegin;
11305db81ecSKris Buschelman   ierr = MatConvert_Matlab_SeqAIJ(A,MATSEQAIJ,&A);CHKERRQ(ierr);
11405db81ecSKris Buschelman   ierr = (*A->ops->destroy)(A);CHKERRQ(ierr);
11505db81ecSKris Buschelman   PetscFunctionReturn(0);
11605db81ecSKris Buschelman }
11705db81ecSKris Buschelman 
11805db81ecSKris Buschelman #undef __FUNCT__
11905db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab"
12005db81ecSKris Buschelman int MatSolve_Matlab(Mat A,Vec b,Vec x)
1213b3e256bSKris Buschelman {
1223b3e256bSKris Buschelman   int             ierr;
1233b3e256bSKris Buschelman   char            *_A,*_b,*_x;
1243b3e256bSKris Buschelman 
1253b3e256bSKris Buschelman   PetscFunctionBegin;
1263b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
1273b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
1283b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
1293b3e256bSKris Buschelman 
1303b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
1313b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
1323b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
1333b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr);
1343b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr);
1353b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr);
1363b3e256bSKris Buschelman   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr);  */
1373b3e256bSKris Buschelman   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr);
1383b3e256bSKris Buschelman   PetscFunctionReturn(0);
1393b3e256bSKris Buschelman }
1403b3e256bSKris Buschelman 
1413b3e256bSKris Buschelman #undef __FUNCT__
14205db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab"
14305db81ecSKris Buschelman int MatLUFactorNumeric_Matlab(Mat A,Mat *F)
1443b3e256bSKris Buschelman {
1453b3e256bSKris Buschelman   Mat_SeqAIJ      *f = (Mat_SeqAIJ*)(*F)->data;
1463b3e256bSKris Buschelman   int             ierr,len;
1473b3e256bSKris Buschelman   char            *_A,*name;
1483b3e256bSKris Buschelman 
1493b3e256bSKris Buschelman   PetscFunctionBegin;
1503b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
1513b3e256bSKris Buschelman   _A   = A->name;
1523b3e256bSKris 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);
1533b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr);
1543b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
1553b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
1563b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
1573b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
1583b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
1593b3e256bSKris Buschelman   PetscFunctionReturn(0);
1603b3e256bSKris Buschelman }
1613b3e256bSKris Buschelman 
1623b3e256bSKris Buschelman #undef __FUNCT__
16305db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab"
16405db81ecSKris Buschelman int MatLUFactorSymbolic_Matlab(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
1653b3e256bSKris Buschelman {
1663b3e256bSKris Buschelman   int        ierr;
1673b3e256bSKris Buschelman   Mat_SeqAIJ *f;
1683b3e256bSKris Buschelman 
1693b3e256bSKris Buschelman   PetscFunctionBegin;
1703b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
1713b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
1723b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
1733b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
17405db81ecSKris Buschelman   (*F)->ops->solve           = MatSolve_Matlab;
17505db81ecSKris Buschelman   (*F)->ops->lufactornumeric = MatLUFactorNumeric_Matlab;
1763b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
1773b3e256bSKris Buschelman   f                          = (Mat_SeqAIJ*)(*F)->data;
1783b3e256bSKris Buschelman   f->lu_dtcol = info->dtcol;
1793b3e256bSKris Buschelman   PetscFunctionReturn(0);
1803b3e256bSKris Buschelman }
1813b3e256bSKris Buschelman 
1823b3e256bSKris Buschelman /* ---------------------------------------------------------------------------------*/
1833b3e256bSKris Buschelman #undef __FUNCT__
18405db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab_QR"
18505db81ecSKris Buschelman int MatSolve_Matlab_QR(Mat A,Vec b,Vec x)
1863b3e256bSKris Buschelman {
1873b3e256bSKris Buschelman   int             ierr;
1883b3e256bSKris Buschelman   char            *_A,*_b,*_x;
1893b3e256bSKris Buschelman 
1903b3e256bSKris Buschelman   PetscFunctionBegin;
1913b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
1923b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
1933b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
1943b3e256bSKris Buschelman 
1953b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
1963b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
1973b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
1983b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr);
1993b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = r%s\\(r%s'\\(%s*%s));",_x,_A,_A,_A+1,_b);CHKERRQ(ierr);
2003b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr);
2013b3e256bSKris Buschelman   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr);  */
2023b3e256bSKris Buschelman   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr);
2033b3e256bSKris Buschelman   PetscFunctionReturn(0);
2043b3e256bSKris Buschelman }
2053b3e256bSKris Buschelman 
2063b3e256bSKris Buschelman #undef __FUNCT__
20705db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab_QR"
20805db81ecSKris Buschelman int MatLUFactorNumeric_Matlab_QR(Mat A,Mat *F)
2093b3e256bSKris Buschelman {
2103b3e256bSKris Buschelman   int             ierr,len;
2113b3e256bSKris Buschelman   char            *_A,*name;
2123b3e256bSKris Buschelman 
2133b3e256bSKris Buschelman   PetscFunctionBegin;
2143b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
2153b3e256bSKris Buschelman   _A   = A->name;
2163b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"r_%s = qr(%s');",_A,_A);CHKERRQ(ierr);
2173b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
2183b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
2193b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
2203b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
2213b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
2223b3e256bSKris Buschelman   PetscFunctionReturn(0);
2233b3e256bSKris Buschelman }
2243b3e256bSKris Buschelman 
2253b3e256bSKris Buschelman #undef __FUNCT__
22605db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab_QR"
22705db81ecSKris Buschelman int MatLUFactorSymbolic_Matlab_QR(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
2283b3e256bSKris Buschelman {
2293b3e256bSKris Buschelman   int  ierr;
2303b3e256bSKris Buschelman 
2313b3e256bSKris Buschelman   PetscFunctionBegin;
2323b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
2333b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
2343b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
2353b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
23605db81ecSKris Buschelman   (*F)->ops->solve           = MatSolve_Matlab_QR;
23705db81ecSKris Buschelman   (*F)->ops->lufactornumeric = MatLUFactorNumeric_Matlab_QR;
2383b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
2393b3e256bSKris Buschelman   (*F)->assembled            = PETSC_TRUE;  /* required by -ksp_view */
2403b3e256bSKris Buschelman 
2413b3e256bSKris Buschelman   PetscFunctionReturn(0);
2423b3e256bSKris Buschelman }
2433b3e256bSKris Buschelman 
2443b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/
2453b3e256bSKris Buschelman #undef __FUNCT__
24605db81ecSKris Buschelman #define __FUNCT__ "MatILUDTFactor_Matlab"
24705db81ecSKris Buschelman int MatILUDTFactor_Matlab(Mat A,MatFactorInfo *info,IS isrow,IS iscol,Mat *F)
2483b3e256bSKris Buschelman {
2493b3e256bSKris Buschelman   int        ierr,len;
2503b3e256bSKris Buschelman   char       *_A,*name;
2513b3e256bSKris Buschelman 
2523b3e256bSKris Buschelman   PetscFunctionBegin;
2533b3e256bSKris Buschelman   if (info->dt == PETSC_DEFAULT)      info->dt      = .005;
2543b3e256bSKris Buschelman   if (info->dtcol == PETSC_DEFAULT)   info->dtcol   = .01;
2553b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
2563b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
2573b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
2583b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
259f365a357SKris Buschelman   (*F)->ops->solve           = MatSolve_Matlab;
2603b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
2613b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
2623b3e256bSKris Buschelman   _A   = A->name;
2633b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,info->dtcol);CHKERRQ(ierr);
2643b3e256bSKris 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);
2653b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr);
2663b3e256bSKris Buschelman 
2673b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
2683b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
2693b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
2703b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
2713b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
2723b3e256bSKris Buschelman   PetscFunctionReturn(0);
2733b3e256bSKris Buschelman }
2743b3e256bSKris Buschelman 
27505db81ecSKris Buschelman #undef __FUNCT__
27605db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab"
27705db81ecSKris Buschelman int MatFactorInfo_Matlab(Mat A,PetscViewer viewer)
2783b3e256bSKris Buschelman {
2793b3e256bSKris Buschelman   int ierr;
2803b3e256bSKris Buschelman 
2813b3e256bSKris Buschelman   PetscFunctionBegin;
2823b3e256bSKris Buschelman   ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters:  -- not written yet!\n");CHKERRQ(ierr);
2833b3e256bSKris Buschelman   PetscFunctionReturn(0);
2843b3e256bSKris Buschelman }
2853b3e256bSKris Buschelman 
2863b3e256bSKris Buschelman #undef __FUNCT__
28705db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab"
28805db81ecSKris Buschelman int MatView_Matlab(Mat A,PetscViewer viewer) {
28905db81ecSKris Buschelman   int               ierr;
290*32077d6dSBarry Smith   PetscTruth        iascii;
29105db81ecSKris Buschelman   PetscViewerFormat format;
29205db81ecSKris Buschelman   Mat_Matlab        *lu=(Mat_Matlab*)(A->spptr);
29305db81ecSKris Buschelman 
29405db81ecSKris Buschelman   PetscFunctionBegin;
29505db81ecSKris Buschelman   ierr = (*lu->MatView)(A,viewer);CHKERRQ(ierr);
296*32077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
297*32077d6dSBarry Smith   if (iascii) {
29805db81ecSKris Buschelman     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
29905db81ecSKris Buschelman     if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) {
30005db81ecSKris Buschelman       ierr = MatFactorInfo_Matlab(A,viewer);
30105db81ecSKris Buschelman     }
30205db81ecSKris Buschelman   }
30305db81ecSKris Buschelman   PetscFunctionReturn(0);
30405db81ecSKris Buschelman }
305f365a357SKris Buschelman 
306f365a357SKris Buschelman #undef __FUNCT__
307f365a357SKris Buschelman #define __FUNCT__ "MatDuplicate_Matlab"
308f365a357SKris Buschelman int MatDuplicate_Matlab(Mat A, MatDuplicateOption op, Mat *M) {
309f365a357SKris Buschelman   int        ierr;
310f365a357SKris Buschelman   Mat_Matlab *lu=(Mat_Matlab*)A->spptr;
311f365a357SKris Buschelman 
312f365a357SKris Buschelman   PetscFunctionBegin;
313f365a357SKris Buschelman   ierr = (*lu->MatDuplicate)(A,op,M);CHKERRQ(ierr);
314f365a357SKris Buschelman   ierr = PetscMemcpy((*M)->spptr,lu,sizeof(Mat_Matlab));CHKERRQ(ierr);
315f365a357SKris Buschelman   PetscFunctionReturn(0);
316f365a357SKris Buschelman }
317f365a357SKris Buschelman 
318f365a357SKris Buschelman EXTERN_C_BEGIN
31905db81ecSKris Buschelman #undef __FUNCT__
32005db81ecSKris Buschelman #define __FUNCT__ "MatConvert_SeqAIJ_Matlab"
32105db81ecSKris Buschelman int MatConvert_SeqAIJ_Matlab(Mat A,const MatType type,Mat *newmat) {
32205db81ecSKris Buschelman   /* This routine is only called to convert to MATMATLAB */
32305db81ecSKris Buschelman   /* from MATSEQAIJ, so we will ignore 'MatType type'. */
32405db81ecSKris Buschelman   int        ierr;
32505db81ecSKris Buschelman   Mat        B=*newmat;
32605db81ecSKris Buschelman   Mat_Matlab *lu;
3273b3e256bSKris Buschelman   PetscTruth qr;
32805db81ecSKris Buschelman 
32905db81ecSKris Buschelman   PetscFunctionBegin;
33005db81ecSKris Buschelman   if (B != A) {
33105db81ecSKris Buschelman     ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr);
33205db81ecSKris Buschelman   }
33305db81ecSKris Buschelman 
33405db81ecSKris Buschelman   ierr = PetscNew(Mat_Matlab,&lu);CHKERRQ(ierr);
33505db81ecSKris Buschelman   lu->MatDuplicate         = A->ops->duplicate;
33605db81ecSKris Buschelman   lu->MatView              = A->ops->view;
33705db81ecSKris Buschelman   lu->MatLUFactorSymbolic  = A->ops->lufactorsymbolic;
33805db81ecSKris Buschelman   lu->MatILUDTFactor       = A->ops->iludtfactor;
33905db81ecSKris Buschelman   lu->MatDestroy           = A->ops->destroy;
34005db81ecSKris Buschelman 
34105db81ecSKris Buschelman   B->spptr                 = (void*)lu;
34205db81ecSKris Buschelman   B->ops->duplicate        = MatDuplicate_Matlab;
34305db81ecSKris Buschelman   B->ops->view             = MatView_Matlab;
34405db81ecSKris Buschelman   B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab;
34505db81ecSKris Buschelman   B->ops->iludtfactor      = MatILUDTFactor_Matlab;
34605db81ecSKris Buschelman   B->ops->destroy          = MatDestroy_Matlab;
34705db81ecSKris Buschelman 
34805db81ecSKris Buschelman   ierr = PetscOptionsHasName(A->prefix,"-mat_matlab_qr",&qr);CHKERRQ(ierr);
34905db81ecSKris Buschelman   if (qr) {
35005db81ecSKris Buschelman     B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab_QR;
35105db81ecSKris Buschelman     PetscLogInfo(0,"Using Matlab QR with iterative refinement for LU factorization and solves");
35205db81ecSKris Buschelman   } else {
35305db81ecSKris Buschelman     PetscLogInfo(0,"Using Matlab for LU factorizations and solves.");
35405db81ecSKris Buschelman   }
35505db81ecSKris Buschelman   PetscLogInfo(0,"Using Matlab for ILUDT factorizations and solves.");
35605db81ecSKris Buschelman 
35705db81ecSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_matlab_C",
35805db81ecSKris Buschelman                                            "MatConvert_SeqAIJ_Matlab",MatConvert_SeqAIJ_Matlab);CHKERRQ(ierr);
35905db81ecSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_matlab_seqaij_C",
36005db81ecSKris Buschelman                                            "MatConvert_Matlab_SeqAIJ",MatConvert_Matlab_SeqAIJ);CHKERRQ(ierr);
361a1d52234SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"PetscMatlabEnginePut_C",
362a1d52234SKris Buschelman                                            "MatMatlabEnginePut_Matlab",MatMatlabEnginePut_Matlab);CHKERRQ(ierr);
363a1d52234SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"PetscMatlabEngineGet_C",
364a1d52234SKris Buschelman                                            "MatMatlabEngineGet_Matlab",MatMatlabEngineGet_Matlab);CHKERRQ(ierr);
36505db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)B,MATMATLAB);CHKERRQ(ierr);
36605db81ecSKris Buschelman   *newmat = B;
36705db81ecSKris Buschelman   PetscFunctionReturn(0);
36805db81ecSKris Buschelman }
36905db81ecSKris Buschelman EXTERN_C_END
37005db81ecSKris Buschelman 
37105db81ecSKris Buschelman /*MC
37205db81ecSKris Buschelman   MATMATLAB - MATMATLAB = "matlab" - A matrix type providing direct solvers (LU and QR) and drop tolerance
37305db81ecSKris Buschelman   based ILU factorization (ILUDT) for sequential matrices via the external package Matlab.
37405db81ecSKris Buschelman 
37505db81ecSKris Buschelman   If Matlab is instaled (see the manual for
37605db81ecSKris Buschelman   instructions on how to declare the existence of external packages),
37705db81ecSKris Buschelman   a matrix type can be constructed which invokes Matlab solvers.
37805db81ecSKris Buschelman   After calling MatCreate(...,A), simply call MatSetType(A,MATMATLAB).
37905db81ecSKris Buschelman   This matrix type is only supported for double precision real.
38005db81ecSKris Buschelman 
38105db81ecSKris Buschelman   This matrix inherits from MATSEQAIJ.  As a result, MatSeqAIJSetPreallocation is
38205db81ecSKris Buschelman   supported for this matrix type.  One can also call MatConvert for an inplace conversion to or from
38305db81ecSKris Buschelman   the MATSEQAIJ type without data copy.
38405db81ecSKris Buschelman 
38505db81ecSKris Buschelman   Options Database Keys:
38605db81ecSKris Buschelman + -mat_type matlab - sets the matrix type to "matlab" during a call to MatSetFromOptions()
38705db81ecSKris Buschelman - -mat_matlab_qr   - sets the direct solver to be QR instead of LU
38805db81ecSKris Buschelman 
38905db81ecSKris Buschelman   Level: beginner
39005db81ecSKris Buschelman 
39105db81ecSKris Buschelman .seealso: PCLU
39205db81ecSKris Buschelman M*/
39305db81ecSKris Buschelman 
39405db81ecSKris Buschelman EXTERN_C_BEGIN
39505db81ecSKris Buschelman #undef __FUNCT__
39605db81ecSKris Buschelman #define __FUNCT__ "MatCreate_Matlab"
3971d73ed98SBarry Smith int MatCreate_Matlab(Mat A) {
3983b3e256bSKris Buschelman   int ierr;
3993b3e256bSKris Buschelman 
4003b3e256bSKris Buschelman   PetscFunctionBegin;
40105db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)A,MATMATLAB);CHKERRQ(ierr);
40205db81ecSKris Buschelman   ierr = MatSetType(A,MATSEQAIJ);CHKERRQ(ierr);
40305db81ecSKris Buschelman   ierr = MatConvert_SeqAIJ_Matlab(A,MATMATLAB,&A);CHKERRQ(ierr);
4043b3e256bSKris Buschelman   PetscFunctionReturn(0);
4053b3e256bSKris Buschelman }
40605db81ecSKris Buschelman EXTERN_C_END
407