xref: /petsc/src/mat/impls/aij/seq/matlab/aijmatlab.c (revision 41c8de11b2c11272bfdf610cc930de5c376c86d6)
1be1d678aSKris Buschelman #define PETSCMAT_DLL
2be1d678aSKris Buschelman 
33b3e256bSKris Buschelman /*
43b3e256bSKris Buschelman         Provides an interface for the Matlab engine sparse solver
53b3e256bSKris Buschelman 
63b3e256bSKris Buschelman */
77c4f633dSBarry Smith #include "../src/mat/impls/aij/seq/aij.h"
83b3e256bSKris Buschelman 
93b3e256bSKris Buschelman #include "engine.h"   /* Matlab include file */
103b3e256bSKris Buschelman #include "mex.h"      /* Matlab include file */
113b3e256bSKris Buschelman 
12a1d52234SKris Buschelman 
13a1d52234SKris Buschelman EXTERN_C_BEGIN
14a1d52234SKris Buschelman #undef __FUNCT__
15a1d52234SKris Buschelman #define __FUNCT__ "MatMatlabEnginePut_Matlab"
16be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatMatlabEnginePut_Matlab(PetscObject obj,void *mengine)
17a1d52234SKris Buschelman {
18dfbe8321SBarry Smith   PetscErrorCode ierr;
19a1d52234SKris Buschelman   Mat            B = (Mat)obj;
20a1d52234SKris Buschelman   mxArray        *mat;
21a1d52234SKris Buschelman   Mat_SeqAIJ     *aij = (Mat_SeqAIJ*)B->data;
22a1d52234SKris Buschelman 
23a1d52234SKris Buschelman   PetscFunctionBegin;
24f0523c5fSHong Zhang   mat  = mxCreateSparse(B->cmap->n,B->rmap->n,aij->nz,mxREAL);
25f0523c5fSHong Zhang   //mat  = mxCreateSparse(((PetscObject)B)->cmap.n,((PetscObject)B)->rmap.n,((Mat_SeqAIJ*)aij)->nz,mxREAL);
26a1d52234SKris Buschelman   ierr = PetscMemcpy(mxGetPr(mat),aij->a,aij->nz*sizeof(PetscScalar));CHKERRQ(ierr);
27a1d52234SKris Buschelman   /* Matlab stores by column, not row so we pass in the transpose of the matrix */
28a1d52234SKris Buschelman   ierr = PetscMemcpy(mxGetIr(mat),aij->j,aij->nz*sizeof(int));CHKERRQ(ierr);
29f0523c5fSHong Zhang   ierr = PetscMemcpy(mxGetJc(mat),aij->i,(B->rmap->n+1)*sizeof(int));CHKERRQ(ierr);
30a1d52234SKris Buschelman 
31a1d52234SKris Buschelman   /* Matlab indices start at 0 for sparse (what a surprise) */
32a1d52234SKris Buschelman 
33a1d52234SKris Buschelman   ierr = PetscObjectName(obj);CHKERRQ(ierr);
34a1d52234SKris Buschelman   engPutVariable((Engine *)mengine,obj->name,mat);
35a1d52234SKris Buschelman   PetscFunctionReturn(0);
36a1d52234SKris Buschelman }
37a1d52234SKris Buschelman EXTERN_C_END
38a1d52234SKris Buschelman 
39a1d52234SKris Buschelman EXTERN_C_BEGIN
40a1d52234SKris Buschelman #undef __FUNCT__
41a1d52234SKris Buschelman #define __FUNCT__ "MatMatlabEngineGet_Matlab"
42be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatMatlabEngineGet_Matlab(PetscObject obj,void *mengine)
43a1d52234SKris Buschelman {
44dfbe8321SBarry Smith   PetscErrorCode ierr;
45dfbe8321SBarry Smith   int            ii;
46a1d52234SKris Buschelman   Mat            mat = (Mat)obj;
47a1d52234SKris Buschelman   Mat_SeqAIJ     *aij = (Mat_SeqAIJ*)mat->data;
48a1d52234SKris Buschelman   mxArray        *mmat;
49a1d52234SKris Buschelman 
50a1d52234SKris Buschelman   PetscFunctionBegin;
511f03425eSSatish Balay   ierr = MatSeqXAIJFreeAIJ(mat,&aij->a,&aij->j,&aij->i);CHKERRQ(ierr);
52a1d52234SKris Buschelman 
53a1d52234SKris Buschelman   mmat = engGetVariable((Engine *)mengine,obj->name);
54a1d52234SKris Buschelman 
55f0523c5fSHong Zhang   aij->nz           = (mxGetJc(mmat))[mat->rmap->n];
56f0523c5fSHong Zhang   ierr  = PetscMalloc3(aij->nz,PetscScalar,&aij->a,aij->nz,PetscInt,&aij->j,mat->rmap->n+1,PetscInt,&aij->i);CHKERRQ(ierr);
57a1d52234SKris Buschelman   aij->singlemalloc = PETSC_TRUE;
58a1d52234SKris Buschelman 
59a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->a,mxGetPr(mmat),aij->nz*sizeof(PetscScalar));CHKERRQ(ierr);
60a1d52234SKris Buschelman   /* Matlab stores by column, not row so we pass in the transpose of the matrix */
61a1d52234SKris Buschelman   ierr = PetscMemcpy(aij->j,mxGetIr(mmat),aij->nz*sizeof(int));CHKERRQ(ierr);
62f0523c5fSHong Zhang   ierr = PetscMemcpy(aij->i,mxGetJc(mmat),(mat->rmap->n+1)*sizeof(int));CHKERRQ(ierr);
63a1d52234SKris Buschelman 
64f0523c5fSHong Zhang   for (ii=0; ii<mat->rmap->n; ii++) {
65a1d52234SKris Buschelman     aij->ilen[ii] = aij->imax[ii] = aij->i[ii+1] - aij->i[ii];
66a1d52234SKris Buschelman   }
67a1d52234SKris Buschelman 
68a1d52234SKris Buschelman   ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
69a1d52234SKris Buschelman   ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
70a1d52234SKris Buschelman 
71a1d52234SKris Buschelman   PetscFunctionReturn(0);
72a1d52234SKris Buschelman }
73a1d52234SKris Buschelman EXTERN_C_END
74a1d52234SKris Buschelman 
7505db81ecSKris Buschelman #undef __FUNCT__
7605db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab"
77dfbe8321SBarry Smith PetscErrorCode MatSolve_Matlab(Mat A,Vec b,Vec x)
783b3e256bSKris Buschelman {
79dfbe8321SBarry Smith   PetscErrorCode ierr;
80e060cb09SBarry Smith   const char     *_A,*_b,*_x;
813b3e256bSKris Buschelman 
823b3e256bSKris Buschelman   PetscFunctionBegin;
833b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
843b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
853b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
863b3e256bSKris Buschelman 
873b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
883b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
893b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
907adad957SLisandro Dalcin   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)b);CHKERRQ(ierr);
917adad957SLisandro Dalcin   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr);
927adad957SLisandro Dalcin   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_b);CHKERRQ(ierr);
937adad957SLisandro Dalcin   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),stdout);CHKERRQ(ierr);  */
947adad957SLisandro Dalcin   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)x);CHKERRQ(ierr);
953b3e256bSKris Buschelman   PetscFunctionReturn(0);
963b3e256bSKris Buschelman }
973b3e256bSKris Buschelman 
983b3e256bSKris Buschelman #undef __FUNCT__
9905db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab"
1000481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Matlab(Mat F,Mat A,const MatFactorInfo *info)
1013b3e256bSKris Buschelman {
102dfbe8321SBarry Smith   PetscErrorCode ierr;
103de4209c5SBarry Smith   size_t         len;
1043b3e256bSKris Buschelman   char           *_A,*name;
1053b3e256bSKris Buschelman 
1063b3e256bSKris Buschelman   PetscFunctionBegin;
1077adad957SLisandro Dalcin   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr);
108f0523c5fSHong Zhang   _A   = ((PetscObject)A)->name;
1097adad957SLisandro Dalcin   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"[l_%s,u_%s,p_%s] = lu(%s',%g);",_A,_A,_A,_A,info->dtcol);CHKERRQ(ierr);
1107adad957SLisandro Dalcin   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr);
1113b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
1123b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
1133b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
114f0523c5fSHong Zhang   ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr);
1153b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
116f0523c5fSHong Zhang   F->ops->solve              = MatSolve_Matlab;
1173b3e256bSKris Buschelman   PetscFunctionReturn(0);
1183b3e256bSKris Buschelman }
1193b3e256bSKris Buschelman 
1203b3e256bSKris Buschelman #undef __FUNCT__
12105db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab"
1220481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Matlab(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
1233b3e256bSKris Buschelman {
1243b3e256bSKris Buschelman   PetscFunctionBegin;
125f0523c5fSHong Zhang   if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
126f0523c5fSHong Zhang   F->ops->lufactornumeric    = MatLUFactorNumeric_Matlab;
1273b3e256bSKris Buschelman   PetscFunctionReturn(0);
1283b3e256bSKris Buschelman }
1293b3e256bSKris Buschelman 
13035bd34faSBarry Smith EXTERN_C_BEGIN
13135bd34faSBarry Smith #undef __FUNCT__
13235bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_seqaij_matlab"
13335bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_seqaij_matlab(Mat A,const MatSolverPackage *type)
13435bd34faSBarry Smith {
13535bd34faSBarry Smith   PetscFunctionBegin;
13635bd34faSBarry Smith   *type = MAT_SOLVER_MATLAB;
13735bd34faSBarry Smith   PetscFunctionReturn(0);
13835bd34faSBarry Smith }
13935bd34faSBarry Smith EXTERN_C_END
14035bd34faSBarry Smith 
1413b3e256bSKris Buschelman #undef __FUNCT__
142b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_matlab"
1435c9eb25fSBarry Smith PetscErrorCode MatGetFactor_seqaij_matlab(Mat A,MatFactorType ftype,Mat *F)
1443b3e256bSKris Buschelman {
145dfbe8321SBarry Smith   PetscErrorCode ierr;
1463b3e256bSKris Buschelman 
1473b3e256bSKris Buschelman   PetscFunctionBegin;
148f0523c5fSHong Zhang   if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
1497adad957SLisandro Dalcin   ierr                        = MatCreate(((PetscObject)A)->comm,F);CHKERRQ(ierr);
150f0523c5fSHong Zhang   ierr                        = MatSetSizes(*F,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1517adad957SLisandro Dalcin   ierr                        = MatSetType(*F,((PetscObject)A)->type_name);CHKERRQ(ierr);
1523b3e256bSKris Buschelman   ierr                        = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
153b24902e0SBarry Smith   (*F)->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab;
15435bd34faSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_seqaij_matlab",MatFactorGetSolverPackage_seqaij_matlab);CHKERRQ(ierr);
155f0523c5fSHong Zhang 
1565c9eb25fSBarry Smith   (*F)->factor                = MAT_FACTOR_LU;
1573b3e256bSKris Buschelman   PetscFunctionReturn(0);
1583b3e256bSKris Buschelman }
1593b3e256bSKris Buschelman 
160b24902e0SBarry Smith 
1613b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/
1623b3e256bSKris Buschelman #undef __FUNCT__
16305db81ecSKris Buschelman #define __FUNCT__ "MatILUDTFactor_Matlab"
164156180f9SHong Zhang PetscErrorCode MatILUDTFactor_Matlab(Mat A,IS isrow,IS iscol,const MatFactorInfo *info)
1653b3e256bSKris Buschelman {
166dfbe8321SBarry Smith   PetscErrorCode ierr;
167de4209c5SBarry Smith   size_t         len;
1683b3e256bSKris Buschelman   char           *_A,*name;
169156180f9SHong Zhang   PetscReal      dt,dtcol;
170156180f9SHong Zhang   Mat            F;
1713b3e256bSKris Buschelman 
1723b3e256bSKris Buschelman   PetscFunctionBegin;
173156180f9SHong Zhang   if (info->dt == PETSC_DEFAULT)      dt    = .005;
174156180f9SHong Zhang   if (info->dtcol == PETSC_DEFAULT)   dtcol = .01;
175156180f9SHong Zhang   ierr = MatGetFactor(A,MAT_SOLVER_MATLAB,MAT_FACTOR_ILU,&F);CHKERRQ(ierr);
176156180f9SHong Zhang   F->ops->solve           = MatSolve_Matlab;
177156180f9SHong Zhang   F->factor               = MAT_FACTOR_LU;
1787adad957SLisandro Dalcin   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr);
179f0523c5fSHong Zhang   _A   = ((PetscObject)A)->name;
180156180f9SHong Zhang   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,dt,dtcol);CHKERRQ(ierr);
1817adad957SLisandro Dalcin   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"[l_%s,u_%s,p_%s] = luinc(%s',info_%s);",_A,_A,_A,_A,_A);CHKERRQ(ierr);
1827adad957SLisandro Dalcin   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr);
1833b3e256bSKris Buschelman 
1843b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
1853b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
1863b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
187156180f9SHong Zhang   ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr);
1883b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
1893b3e256bSKris Buschelman   PetscFunctionReturn(0);
1903b3e256bSKris Buschelman }
1913b3e256bSKris Buschelman 
19205db81ecSKris Buschelman #undef __FUNCT__
19305db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab"
194dfbe8321SBarry Smith PetscErrorCode MatFactorInfo_Matlab(Mat A,PetscViewer viewer)
1953b3e256bSKris Buschelman {
196dfbe8321SBarry Smith   PetscErrorCode ierr;
1973b3e256bSKris Buschelman 
1983b3e256bSKris Buschelman   PetscFunctionBegin;
1993b3e256bSKris Buschelman   ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters:  -- not written yet!\n");CHKERRQ(ierr);
2003b3e256bSKris Buschelman   PetscFunctionReturn(0);
2013b3e256bSKris Buschelman }
2023b3e256bSKris Buschelman 
2033b3e256bSKris Buschelman #undef __FUNCT__
20405db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab"
205b2d3331aSBarry Smith PetscErrorCode MatView_Matlab(Mat A,PetscViewer viewer)
206b2d3331aSBarry Smith {
207dfbe8321SBarry Smith   PetscErrorCode    ierr;
20832077d6dSBarry Smith   PetscTruth        iascii;
20905db81ecSKris Buschelman   PetscViewerFormat format;
21005db81ecSKris Buschelman 
21105db81ecSKris Buschelman   PetscFunctionBegin;
212b24902e0SBarry Smith   ierr = MatView_SeqAIJ(A,viewer);CHKERRQ(ierr);
21332077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
21432077d6dSBarry Smith   if (iascii) {
21505db81ecSKris Buschelman     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
21605db81ecSKris Buschelman     if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) {
21705db81ecSKris Buschelman       ierr = MatFactorInfo_Matlab(A,viewer);
21805db81ecSKris Buschelman     }
21905db81ecSKris Buschelman   }
22005db81ecSKris Buschelman   PetscFunctionReturn(0);
22105db81ecSKris Buschelman }
222f365a357SKris Buschelman 
22305db81ecSKris Buschelman 
22405db81ecSKris Buschelman /*MC
225*41c8de11SBarry Smith   MAT_SOLVER_MATLAB - "matlab" - Providing direct solvers (LU and QR) and drop tolerance
22605db81ecSKris Buschelman   based ILU factorization (ILUDT) for sequential matrices via the external package Matlab.
22705db81ecSKris Buschelman 
22805db81ecSKris Buschelman 
229*41c8de11SBarry Smith   Works with MATSEQAIJ matrices.
23005db81ecSKris Buschelman 
23105db81ecSKris Buschelman   Options Database Keys:
232*41c8de11SBarry Smith . -pc_factor_mat_solver_type matlab - selects Matlab to do the sparse factorization
233*41c8de11SBarry Smith 
23405db81ecSKris Buschelman 
23505db81ecSKris Buschelman   Level: beginner
23605db81ecSKris Buschelman 
23705db81ecSKris Buschelman .seealso: PCLU
238*41c8de11SBarry Smith 
239*41c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage
24005db81ecSKris Buschelman M*/
24105db81ecSKris Buschelman 
242