xref: /petsc/src/mat/impls/aij/seq/matlab/aijmatlab.c (revision a1d52234b04812957f7c4b5edd5987ff039ba722)
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 
1205db81ecSKris Buschelman typedef struct {
1305db81ecSKris Buschelman   int (*MatDuplicate)(Mat,MatDuplicateOption,Mat*);
1405db81ecSKris Buschelman   int (*MatView)(Mat,PetscViewer);
1505db81ecSKris Buschelman   int (*MatLUFactorSymbolic)(Mat,IS,IS,MatFactorInfo*,Mat*);
1605db81ecSKris Buschelman   int (*MatILUDTFactor)(Mat,MatFactorInfo*,IS,IS,Mat*);
1705db81ecSKris Buschelman   int (*MatDestroy)(Mat);
1805db81ecSKris Buschelman } Mat_Matlab;
1905db81ecSKris Buschelman 
20*a1d52234SKris Buschelman 
21*a1d52234SKris Buschelman EXTERN_C_BEGIN
22*a1d52234SKris Buschelman #undef __FUNCT__
23*a1d52234SKris Buschelman #define __FUNCT__ "MatMatlabEnginePut_Matlab"
24*a1d52234SKris Buschelman int MatMatlabEnginePut_Matlab(PetscObject obj,void *mengine)
25*a1d52234SKris Buschelman {
26*a1d52234SKris Buschelman   int         ierr;
27*a1d52234SKris Buschelman   Mat         B = (Mat)obj;
28*a1d52234SKris Buschelman   mxArray     *mat;
29*a1d52234SKris Buschelman   Mat_SeqAIJ  *aij = (Mat_SeqAIJ*)B->data;
30*a1d52234SKris Buschelman 
31*a1d52234SKris Buschelman   PetscFunctionBegin;
32*a1d52234SKris Buschelman   mat  = mxCreateSparse(B->n,B->m,aij->nz,mxREAL);
33*a1d52234SKris Buschelman   ierr = PetscMemcpy(mxGetPr(mat),aij->a,aij->nz*sizeof(PetscScalar));CHKERRQ(ierr);
34*a1d52234SKris Buschelman   /* Matlab stores by column, not row so we pass in the transpose of the matrix */
35*a1d52234SKris Buschelman   ierr = PetscMemcpy(mxGetIr(mat),aij->j,aij->nz*sizeof(int));CHKERRQ(ierr);
36*a1d52234SKris Buschelman   ierr = PetscMemcpy(mxGetJc(mat),aij->i,(B->m+1)*sizeof(int));CHKERRQ(ierr);
37*a1d52234SKris Buschelman 
38*a1d52234SKris Buschelman   /* Matlab indices start at 0 for sparse (what a surprise) */
39*a1d52234SKris Buschelman 
40*a1d52234SKris Buschelman   ierr = PetscObjectName(obj);CHKERRQ(ierr);
41*a1d52234SKris Buschelman   engPutVariable((Engine *)mengine,obj->name,mat);
42*a1d52234SKris Buschelman   PetscFunctionReturn(0);
43*a1d52234SKris Buschelman }
44*a1d52234SKris Buschelman EXTERN_C_END
45*a1d52234SKris Buschelman 
46*a1d52234SKris Buschelman EXTERN_C_BEGIN
47*a1d52234SKris Buschelman #undef __FUNCT__
48*a1d52234SKris Buschelman #define __FUNCT__ "MatMatlabEngineGet_Matlab"
49*a1d52234SKris Buschelman int MatMatlabEngineGet_Matlab(PetscObject obj,void *mengine)
50*a1d52234SKris Buschelman {
51*a1d52234SKris Buschelman   int        ierr,ii;
52*a1d52234SKris Buschelman   Mat        mat = (Mat)obj;
53*a1d52234SKris Buschelman   Mat_SeqAIJ *aij = (Mat_SeqAIJ*)mat->data;
54*a1d52234SKris Buschelman   mxArray    *mmat;
55*a1d52234SKris Buschelman 
56*a1d52234SKris Buschelman   PetscFunctionBegin;
57*a1d52234SKris Buschelman   ierr = PetscFree(aij->a);CHKERRQ(ierr);
58*a1d52234SKris Buschelman 
59*a1d52234SKris Buschelman   mmat = engGetVariable((Engine *)mengine,obj->name);
60*a1d52234SKris Buschelman 
61*a1d52234SKris Buschelman   aij->nz           = (mxGetJc(mmat))[mat->m];
62*a1d52234SKris Buschelman   ierr              = PetscMalloc(((size_t) aij->nz)*(sizeof(int)+sizeof(PetscScalar))+(mat->m+1)*sizeof(int),&aij->a);CHKERRQ(ierr);
63*a1d52234SKris Buschelman   aij->j            = (int*)(aij->a + aij->nz);
64*a1d52234SKris Buschelman   aij->i            = aij->j + aij->nz;
65*a1d52234SKris Buschelman   aij->singlemalloc = PETSC_TRUE;
66*a1d52234SKris Buschelman   aij->freedata     = PETSC_TRUE;
67*a1d52234SKris Buschelman 
68*a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->a,mxGetPr(mmat),aij->nz*sizeof(PetscScalar));CHKERRQ(ierr);
69*a1d52234SKris Buschelman   /* Matlab stores by column, not row so we pass in the transpose of the matrix */
70*a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->j,mxGetIr(mmat),aij->nz*sizeof(int));CHKERRQ(ierr);
71*a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->i,mxGetJc(mmat),(mat->m+1)*sizeof(int));CHKERRQ(ierr);
72*a1d52234SKris Buschelman 
73*a1d52234SKris Buschelman   for (ii=0; ii<mat->m; ii++) {
74*a1d52234SKris Buschelman     aij->ilen[ii] = aij->imax[ii] = aij->i[ii+1] - aij->i[ii];
75*a1d52234SKris Buschelman   }
76*a1d52234SKris Buschelman 
77*a1d52234SKris Buschelman   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
78*a1d52234SKris Buschelman   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
79*a1d52234SKris Buschelman 
80*a1d52234SKris Buschelman   PetscFunctionReturn(0);
81*a1d52234SKris Buschelman }
82*a1d52234SKris Buschelman EXTERN_C_END
83*a1d52234SKris Buschelman 
8405db81ecSKris Buschelman EXTERN_C_BEGIN
853b3e256bSKris Buschelman #undef __FUNCT__
8605db81ecSKris Buschelman #define __FUNCT__ "MatConvert_Matlab_SeqAIJ"
8705db81ecSKris Buschelman int MatConvert_Matlab_SeqAIJ(Mat A,const MatType type,Mat *newmat) {
8805db81ecSKris Buschelman   int        ierr;
8905db81ecSKris Buschelman   Mat        B=*newmat;
9005db81ecSKris Buschelman   Mat_Matlab *lu=(Mat_Matlab*)A->spptr;
9105db81ecSKris Buschelman 
9205db81ecSKris Buschelman   PetscFunctionBegin;
9305db81ecSKris Buschelman   if (B != A) {
9405db81ecSKris Buschelman     ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr);
9505db81ecSKris Buschelman   }
9605db81ecSKris Buschelman   A->ops->duplicate        = lu->MatDuplicate;
9705db81ecSKris Buschelman   A->ops->view             = lu->MatView;
9805db81ecSKris Buschelman   A->ops->lufactorsymbolic = lu->MatLUFactorSymbolic;
9905db81ecSKris Buschelman   A->ops->iludtfactor      = lu->MatILUDTFactor;
10005db81ecSKris Buschelman   A->ops->destroy          = lu->MatDestroy;
10105db81ecSKris Buschelman 
10205db81ecSKris Buschelman   ierr = PetscFree(lu);CHKERRQ(ierr);
10305db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQAIJ);CHKERRQ(ierr);
10405db81ecSKris Buschelman   *newmat = B;
10505db81ecSKris Buschelman   PetscFunctionReturn(0);
10605db81ecSKris Buschelman }
10705db81ecSKris Buschelman EXTERN_C_END
10805db81ecSKris Buschelman 
10905db81ecSKris Buschelman #undef __FUNCT__
11005db81ecSKris Buschelman #define __FUNCT__ "MatDestroy_Matlab"
11105db81ecSKris Buschelman int MatDestroy_Matlab(Mat A) {
11205db81ecSKris Buschelman   int         ierr;
11305db81ecSKris Buschelman   Mat_Matlab *lu=(Mat_Matlab*)A->spptr;
11405db81ecSKris Buschelman 
11505db81ecSKris Buschelman   PetscFunctionBegin;
11605db81ecSKris Buschelman   ierr = MatConvert_Matlab_SeqAIJ(A,MATSEQAIJ,&A);CHKERRQ(ierr);
11705db81ecSKris Buschelman   ierr = (*A->ops->destroy)(A);CHKERRQ(ierr);
11805db81ecSKris Buschelman   PetscFunctionReturn(0);
11905db81ecSKris Buschelman }
12005db81ecSKris Buschelman 
12105db81ecSKris Buschelman #undef __FUNCT__
12205db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab"
12305db81ecSKris Buschelman int MatSolve_Matlab(Mat A,Vec b,Vec x)
1243b3e256bSKris Buschelman {
1253b3e256bSKris Buschelman   int             ierr;
1263b3e256bSKris Buschelman   char            *_A,*_b,*_x;
1273b3e256bSKris Buschelman 
1283b3e256bSKris Buschelman   PetscFunctionBegin;
1293b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
1303b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
1313b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
1323b3e256bSKris Buschelman 
1333b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
1343b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
1353b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
1363b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr);
1373b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr);
1383b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr);
1393b3e256bSKris Buschelman   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr);  */
1403b3e256bSKris Buschelman   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr);
1413b3e256bSKris Buschelman   PetscFunctionReturn(0);
1423b3e256bSKris Buschelman }
1433b3e256bSKris Buschelman 
1443b3e256bSKris Buschelman #undef __FUNCT__
14505db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab"
14605db81ecSKris Buschelman int MatLUFactorNumeric_Matlab(Mat A,Mat *F)
1473b3e256bSKris Buschelman {
1483b3e256bSKris Buschelman   Mat_SeqAIJ      *f = (Mat_SeqAIJ*)(*F)->data;
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),"[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"
16705db81ecSKris Buschelman int MatLUFactorSymbolic_Matlab(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
1683b3e256bSKris Buschelman {
1693b3e256bSKris Buschelman   int        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"
18805db81ecSKris Buschelman int MatSolve_Matlab_QR(Mat A,Vec b,Vec x)
1893b3e256bSKris Buschelman {
1903b3e256bSKris Buschelman   int             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"
21105db81ecSKris Buschelman int MatLUFactorNumeric_Matlab_QR(Mat A,Mat *F)
2123b3e256bSKris Buschelman {
2133b3e256bSKris Buschelman   int             ierr,len;
2143b3e256bSKris Buschelman   char            *_A,*name;
2153b3e256bSKris Buschelman 
2163b3e256bSKris Buschelman   PetscFunctionBegin;
2173b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
2183b3e256bSKris Buschelman   _A   = A->name;
2193b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"r_%s = qr(%s');",_A,_A);CHKERRQ(ierr);
2203b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
2213b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
2223b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
2233b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
2243b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
2253b3e256bSKris Buschelman   PetscFunctionReturn(0);
2263b3e256bSKris Buschelman }
2273b3e256bSKris Buschelman 
2283b3e256bSKris Buschelman #undef __FUNCT__
22905db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab_QR"
23005db81ecSKris Buschelman int MatLUFactorSymbolic_Matlab_QR(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
2313b3e256bSKris Buschelman {
2323b3e256bSKris Buschelman   int  ierr;
2333b3e256bSKris Buschelman 
2343b3e256bSKris Buschelman   PetscFunctionBegin;
2353b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
2363b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
2373b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
2383b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
23905db81ecSKris Buschelman   (*F)->ops->solve           = MatSolve_Matlab_QR;
24005db81ecSKris Buschelman   (*F)->ops->lufactornumeric = MatLUFactorNumeric_Matlab_QR;
2413b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
2423b3e256bSKris Buschelman   (*F)->assembled            = PETSC_TRUE;  /* required by -ksp_view */
2433b3e256bSKris Buschelman 
2443b3e256bSKris Buschelman   PetscFunctionReturn(0);
2453b3e256bSKris Buschelman }
2463b3e256bSKris Buschelman 
2473b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/
2483b3e256bSKris Buschelman #undef __FUNCT__
24905db81ecSKris Buschelman #define __FUNCT__ "MatILUDTFactor_Matlab"
25005db81ecSKris Buschelman int MatILUDTFactor_Matlab(Mat A,MatFactorInfo *info,IS isrow,IS iscol,Mat *F)
2513b3e256bSKris Buschelman {
2523b3e256bSKris Buschelman   int        ierr,len;
2533b3e256bSKris Buschelman   char       *_A,*name;
2543b3e256bSKris Buschelman 
2553b3e256bSKris Buschelman   PetscFunctionBegin;
2563b3e256bSKris Buschelman   if (info->dt == PETSC_DEFAULT)      info->dt      = .005;
2573b3e256bSKris Buschelman   if (info->dtcol == PETSC_DEFAULT)   info->dtcol   = .01;
2583b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
2593b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
2603b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
2613b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
2623b3e256bSKris Buschelman   (*F)->ops->solve           = MatSolve_SeqAIJ_Matlab;
2633b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
2643b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
2653b3e256bSKris Buschelman   _A   = A->name;
2663b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,info->dtcol);CHKERRQ(ierr);
2673b3e256bSKris 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);
2683b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr);
2693b3e256bSKris Buschelman 
2703b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
2713b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
2723b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
2733b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
2743b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
2753b3e256bSKris Buschelman   PetscFunctionReturn(0);
2763b3e256bSKris Buschelman }
2773b3e256bSKris Buschelman 
27805db81ecSKris Buschelman #undef __FUNCT__
27905db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab"
28005db81ecSKris Buschelman int MatFactorInfo_Matlab(Mat A,PetscViewer viewer)
2813b3e256bSKris Buschelman {
2823b3e256bSKris Buschelman   int ierr;
2833b3e256bSKris Buschelman 
2843b3e256bSKris Buschelman   PetscFunctionBegin;
2853b3e256bSKris Buschelman   ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters:  -- not written yet!\n");CHKERRQ(ierr);
2863b3e256bSKris Buschelman   PetscFunctionReturn(0);
2873b3e256bSKris Buschelman }
2883b3e256bSKris Buschelman 
2893b3e256bSKris Buschelman #undef __FUNCT__
29005db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab"
29105db81ecSKris Buschelman int MatView_Matlab(Mat A,PetscViewer viewer) {
29205db81ecSKris Buschelman   int               ierr;
29305db81ecSKris Buschelman   PetscTruth        isascii;
29405db81ecSKris Buschelman   PetscViewerFormat format;
29505db81ecSKris Buschelman   Mat_Matlab        *lu=(Mat_Matlab*)(A->spptr);
29605db81ecSKris Buschelman 
29705db81ecSKris Buschelman   PetscFunctionBegin;
29805db81ecSKris Buschelman   ierr = (*lu->MatView)(A,viewer);CHKERRQ(ierr);
29905db81ecSKris Buschelman   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr);
30005db81ecSKris Buschelman   if (isascii) {
30105db81ecSKris Buschelman     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
30205db81ecSKris Buschelman     if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) {
30305db81ecSKris Buschelman       ierr = MatFactorInfo_Matlab(A,viewer);
30405db81ecSKris Buschelman     }
30505db81ecSKris Buschelman   }
30605db81ecSKris Buschelman   PetscFunctionReturn(0);
30705db81ecSKris Buschelman }
30805db81ecSKris Buschelman #undef __FUNCT__
30905db81ecSKris Buschelman #define __FUNCT__ "MatConvert_SeqAIJ_Matlab"
31005db81ecSKris Buschelman int MatConvert_SeqAIJ_Matlab(Mat A,const MatType type,Mat *newmat) {
31105db81ecSKris Buschelman   /* This routine is only called to convert to MATMATLAB */
31205db81ecSKris Buschelman   /* from MATSEQAIJ, so we will ignore 'MatType type'. */
31305db81ecSKris Buschelman   int        ierr;
31405db81ecSKris Buschelman   Mat        B=*newmat;
31505db81ecSKris Buschelman   Mat_Matlab *lu;
3163b3e256bSKris Buschelman   PetscTruth qr;
31705db81ecSKris Buschelman 
31805db81ecSKris Buschelman   PetscFunctionBegin;
31905db81ecSKris Buschelman   if (B != A) {
32005db81ecSKris Buschelman     ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr);
32105db81ecSKris Buschelman   }
32205db81ecSKris Buschelman 
32305db81ecSKris Buschelman   ierr = PetscNew(Mat_Matlab,&lu);CHKERRQ(ierr);
32405db81ecSKris Buschelman   lu->MatDuplicate         = A->ops->duplicate;
32505db81ecSKris Buschelman   lu->MatView              = A->ops->view;
32605db81ecSKris Buschelman   lu->MatLUFactorSymbolic  = A->ops->lufactorsymbolic;
32705db81ecSKris Buschelman   lu->MatILUDTFactor       = A->ops->iludtfactor;
32805db81ecSKris Buschelman   lu->MatDestroy           = A->ops->destroy;
32905db81ecSKris Buschelman 
33005db81ecSKris Buschelman   B->spptr                 = (void*)lu;
33105db81ecSKris Buschelman   B->ops->duplicate        = MatDuplicate_Matlab;
33205db81ecSKris Buschelman   B->ops->view             = MatView_Matlab;
33305db81ecSKris Buschelman   B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab;
33405db81ecSKris Buschelman   B->ops->iludtfactor      = MatILUDTFactor_Matlab;
33505db81ecSKris Buschelman   B->ops->destroy          = MatDestroy_Matlab;
33605db81ecSKris Buschelman 
33705db81ecSKris Buschelman   ierr = PetscOptionsHasName(A->prefix,"-mat_matlab_qr",&qr);CHKERRQ(ierr);
33805db81ecSKris Buschelman   if (qr) {
33905db81ecSKris Buschelman     B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab_QR;
34005db81ecSKris Buschelman     PetscLogInfo(0,"Using Matlab QR with iterative refinement for LU factorization and solves");
34105db81ecSKris Buschelman   } else {
34205db81ecSKris Buschelman     PetscLogInfo(0,"Using Matlab for LU factorizations and solves.");
34305db81ecSKris Buschelman   }
34405db81ecSKris Buschelman   PetscLogInfo(0,"Using Matlab for ILUDT factorizations and solves.");
34505db81ecSKris Buschelman 
34605db81ecSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_matlab_C",
34705db81ecSKris Buschelman                                            "MatConvert_SeqAIJ_Matlab",MatConvert_SeqAIJ_Matlab);CHKERRQ(ierr);
34805db81ecSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_matlab_seqaij_C",
34905db81ecSKris Buschelman                                            "MatConvert_Matlab_SeqAIJ",MatConvert_Matlab_SeqAIJ);CHKERRQ(ierr);
350*a1d52234SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"PetscMatlabEnginePut_C",
351*a1d52234SKris Buschelman                                            "MatMatlabEnginePut_Matlab",MatMatlabEnginePut_Matlab);CHKERRQ(ierr);
352*a1d52234SKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"PetscMatlabEngineGet_C",
353*a1d52234SKris Buschelman                                            "MatMatlabEngineGet_Matlab",MatMatlabEngineGet_Matlab);CHKERRQ(ierr);
35405db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)B,MATMATLAB);CHKERRQ(ierr);
35505db81ecSKris Buschelman   *newmat = B;
35605db81ecSKris Buschelman   PetscFunctionReturn(0);
35705db81ecSKris Buschelman }
35805db81ecSKris Buschelman EXTERN_C_END
35905db81ecSKris Buschelman 
36005db81ecSKris Buschelman #undef __FUNCT__
36105db81ecSKris Buschelman #define __FUNCT__ "MatDuplicate_Matlab"
36205db81ecSKris Buschelman int MatDuplicate_Matlab(Mat A, MatDuplicateOption op, Mat *M) {
36305db81ecSKris Buschelman   int        ierr;
36405db81ecSKris Buschelman   Mat_Matlab *lu=(Mat_Matlab*)A->spptr;
36505db81ecSKris Buschelman 
36605db81ecSKris Buschelman   PetscFunctionBegin;
36705db81ecSKris Buschelman   ierr = (*lu->MatDuplicate)(A,op,M);CHKERRQ(ierr);
36805db81ecSKris Buschelman   ierr = PetscMemcpy((*M)->spptr,lu,sizeof(Mat_Matlab));CHKERRQ(ierr);
36905db81ecSKris Buschelman   PetscFunctionReturn(0);
37005db81ecSKris Buschelman }
37105db81ecSKris Buschelman 
37205db81ecSKris Buschelman /*MC
37305db81ecSKris Buschelman   MATMATLAB - MATMATLAB = "matlab" - A matrix type providing direct solvers (LU and QR) and drop tolerance
37405db81ecSKris Buschelman   based ILU factorization (ILUDT) for sequential matrices via the external package Matlab.
37505db81ecSKris Buschelman 
37605db81ecSKris Buschelman   If Matlab is instaled (see the manual for
37705db81ecSKris Buschelman   instructions on how to declare the existence of external packages),
37805db81ecSKris Buschelman   a matrix type can be constructed which invokes Matlab solvers.
37905db81ecSKris Buschelman   After calling MatCreate(...,A), simply call MatSetType(A,MATMATLAB).
38005db81ecSKris Buschelman   This matrix type is only supported for double precision real.
38105db81ecSKris Buschelman 
38205db81ecSKris Buschelman   This matrix inherits from MATSEQAIJ.  As a result, MatSeqAIJSetPreallocation is
38305db81ecSKris Buschelman   supported for this matrix type.  One can also call MatConvert for an inplace conversion to or from
38405db81ecSKris Buschelman   the MATSEQAIJ type without data copy.
38505db81ecSKris Buschelman 
38605db81ecSKris Buschelman   Options Database Keys:
38705db81ecSKris Buschelman + -mat_type matlab - sets the matrix type to "matlab" during a call to MatSetFromOptions()
38805db81ecSKris Buschelman - -mat_matlab_qr   - sets the direct solver to be QR instead of LU
38905db81ecSKris Buschelman 
39005db81ecSKris Buschelman   Level: beginner
39105db81ecSKris Buschelman 
39205db81ecSKris Buschelman .seealso: PCLU
39305db81ecSKris Buschelman M*/
39405db81ecSKris Buschelman 
39505db81ecSKris Buschelman EXTERN_C_BEGIN
39605db81ecSKris Buschelman #undef __FUNCT__
39705db81ecSKris Buschelman #define __FUNCT__ "MatCreate_Matlab"
39805db81ecSKris Buschelman int MarCreate_Matlab(Mat A) {
3993b3e256bSKris Buschelman   int ierr;
4003b3e256bSKris Buschelman 
4013b3e256bSKris Buschelman   PetscFunctionBegin;
40205db81ecSKris Buschelman   ierr = PetscObjectChangeTypeName((PetscObject)A,MATMATLAB);CHKERRQ(ierr);
40305db81ecSKris Buschelman   ierr = MatSetType(A,MATSEQAIJ);CHKERRQ(ierr);
40405db81ecSKris Buschelman   ierr = MatConvert_SeqAIJ_Matlab(A,MATMATLAB,&A);CHKERRQ(ierr);
4053b3e256bSKris Buschelman   PetscFunctionReturn(0);
4063b3e256bSKris Buschelman }
40705db81ecSKris Buschelman EXTERN_C_END
408