xref: /petsc/src/mat/impls/aij/seq/matlab/aijmatlab.c (revision e32f2f54e699d0aa6e733466c00da7e34666fe5e)
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__
15b3866ffcSBarry Smith #define __FUNCT__ "MatlabEnginePut_SeqAIJ"
16b3866ffcSBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatlabEnginePut_SeqAIJ(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__
41b3866ffcSBarry Smith #define __FUNCT__ "MatlabEngineGet_SeqAIJ"
42b3866ffcSBarry Smith PetscErrorCode PETSCMAT_DLLEXPORT MatlabEngineGet_SeqAIJ(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;
105b3866ffcSBarry Smith   PetscReal      dtcol = info->dtcol;
1063b3e256bSKris Buschelman 
1073b3e256bSKris Buschelman   PetscFunctionBegin;
108d5f3da31SBarry Smith   if (F->factortype == MAT_FACTOR_ILU || info->dt > 0) {
109b3866ffcSBarry Smith     if (info->dtcol == PETSC_DEFAULT)  dtcol = .01;
110fe97e370SBarry Smith     F->ops->solve           = MatSolve_Matlab;
111d5f3da31SBarry Smith     F->factortype           = MAT_FACTOR_LU;
112fe97e370SBarry Smith     ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr);
113fe97e370SBarry Smith     _A   = ((PetscObject)A)->name;
114b3866ffcSBarry Smith     ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,dtcol);CHKERRQ(ierr);
115fe97e370SBarry Smith     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);
116fe97e370SBarry Smith     ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr);
117fe97e370SBarry Smith 
118fe97e370SBarry Smith     ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
119fe97e370SBarry Smith     ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
120fe97e370SBarry Smith     sprintf(name,"_%s",_A);
121fe97e370SBarry Smith     ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr);
122fe97e370SBarry Smith     ierr = PetscFree(name);CHKERRQ(ierr);
123fe97e370SBarry Smith   } else {
1247adad957SLisandro Dalcin     ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),(PetscObject)A);CHKERRQ(ierr);
125f0523c5fSHong Zhang     _A   = ((PetscObject)A)->name;
126b3866ffcSBarry Smith     ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"[l_%s,u_%s,p_%s] = lu(%s',%g);",_A,_A,_A,_A,dtcol);CHKERRQ(ierr);
1277adad957SLisandro Dalcin     ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(((PetscObject)A)->comm),"%s = 0;",_A);CHKERRQ(ierr);
1283b3e256bSKris Buschelman     ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
1293b3e256bSKris Buschelman     ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
1303b3e256bSKris Buschelman     sprintf(name,"_%s",_A);
131f0523c5fSHong Zhang     ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr);
1323b3e256bSKris Buschelman     ierr = PetscFree(name);CHKERRQ(ierr);
133f0523c5fSHong Zhang     F->ops->solve              = MatSolve_Matlab;
134fe97e370SBarry Smith   }
1353b3e256bSKris Buschelman   PetscFunctionReturn(0);
1363b3e256bSKris Buschelman }
1373b3e256bSKris Buschelman 
1383b3e256bSKris Buschelman #undef __FUNCT__
13905db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab"
1400481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Matlab(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info)
1413b3e256bSKris Buschelman {
1423b3e256bSKris Buschelman   PetscFunctionBegin;
143*e32f2f54SBarry Smith   if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square");
144f0523c5fSHong Zhang   F->ops->lufactornumeric    = MatLUFactorNumeric_Matlab;
145b3866ffcSBarry Smith   F->assembled = PETSC_TRUE;
1463b3e256bSKris Buschelman   PetscFunctionReturn(0);
1473b3e256bSKris Buschelman }
1483b3e256bSKris Buschelman 
14935bd34faSBarry Smith EXTERN_C_BEGIN
15035bd34faSBarry Smith #undef __FUNCT__
15135bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_seqaij_matlab"
15235bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_seqaij_matlab(Mat A,const MatSolverPackage *type)
15335bd34faSBarry Smith {
15435bd34faSBarry Smith   PetscFunctionBegin;
15535bd34faSBarry Smith   *type = MAT_SOLVER_MATLAB;
15635bd34faSBarry Smith   PetscFunctionReturn(0);
15735bd34faSBarry Smith }
15835bd34faSBarry Smith EXTERN_C_END
15935bd34faSBarry Smith 
1603b3e256bSKris Buschelman #undef __FUNCT__
161b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_matlab"
1625c9eb25fSBarry Smith PetscErrorCode MatGetFactor_seqaij_matlab(Mat A,MatFactorType ftype,Mat *F)
1633b3e256bSKris Buschelman {
164dfbe8321SBarry Smith   PetscErrorCode ierr;
1653b3e256bSKris Buschelman 
1663b3e256bSKris Buschelman   PetscFunctionBegin;
167*e32f2f54SBarry Smith   if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square");
1687adad957SLisandro Dalcin   ierr                         = MatCreate(((PetscObject)A)->comm,F);CHKERRQ(ierr);
169f0523c5fSHong Zhang   ierr                         = MatSetSizes(*F,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1707adad957SLisandro Dalcin   ierr                         = MatSetType(*F,((PetscObject)A)->type_name);CHKERRQ(ierr);
1713b3e256bSKris Buschelman   ierr                         = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
172b24902e0SBarry Smith   (*F)->ops->lufactorsymbolic  = MatLUFactorSymbolic_Matlab;
173b3866ffcSBarry Smith   (*F)->ops->ilufactorsymbolic = MatLUFactorSymbolic_Matlab;
174f75d6de4SMatthew Knepley   ierr = PetscObjectComposeFunctionDynamic((PetscObject)(*F),"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_seqaij_matlab",MatFactorGetSolverPackage_seqaij_matlab);CHKERRQ(ierr);
175f0523c5fSHong Zhang 
176d5f3da31SBarry Smith   (*F)->factortype             = ftype;
1773b3e256bSKris Buschelman   PetscFunctionReturn(0);
1783b3e256bSKris Buschelman }
1793b3e256bSKris Buschelman 
180b24902e0SBarry Smith 
1813b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/
1823b3e256bSKris Buschelman 
18305db81ecSKris Buschelman #undef __FUNCT__
18405db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab"
185dfbe8321SBarry Smith PetscErrorCode MatFactorInfo_Matlab(Mat A,PetscViewer viewer)
1863b3e256bSKris Buschelman {
187dfbe8321SBarry Smith   PetscErrorCode ierr;
1883b3e256bSKris Buschelman 
1893b3e256bSKris Buschelman   PetscFunctionBegin;
1903b3e256bSKris Buschelman   ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters:  -- not written yet!\n");CHKERRQ(ierr);
1913b3e256bSKris Buschelman   PetscFunctionReturn(0);
1923b3e256bSKris Buschelman }
1933b3e256bSKris Buschelman 
1943b3e256bSKris Buschelman #undef __FUNCT__
19505db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab"
196b2d3331aSBarry Smith PetscErrorCode MatView_Matlab(Mat A,PetscViewer viewer)
197b2d3331aSBarry Smith {
198dfbe8321SBarry Smith   PetscErrorCode    ierr;
19932077d6dSBarry Smith   PetscTruth        iascii;
20005db81ecSKris Buschelman   PetscViewerFormat format;
20105db81ecSKris Buschelman 
20205db81ecSKris Buschelman   PetscFunctionBegin;
203b24902e0SBarry Smith   ierr = MatView_SeqAIJ(A,viewer);CHKERRQ(ierr);
20432077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
20532077d6dSBarry Smith   if (iascii) {
20605db81ecSKris Buschelman     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
20705db81ecSKris Buschelman     if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) {
20805db81ecSKris Buschelman       ierr = MatFactorInfo_Matlab(A,viewer);
20905db81ecSKris Buschelman     }
21005db81ecSKris Buschelman   }
21105db81ecSKris Buschelman   PetscFunctionReturn(0);
21205db81ecSKris Buschelman }
213f365a357SKris Buschelman 
21405db81ecSKris Buschelman 
21505db81ecSKris Buschelman /*MC
21641c8de11SBarry Smith   MAT_SOLVER_MATLAB - "matlab" - Providing direct solvers (LU and QR) and drop tolerance
21705db81ecSKris Buschelman   based ILU factorization (ILUDT) for sequential matrices via the external package Matlab.
21805db81ecSKris Buschelman 
21905db81ecSKris Buschelman 
22041c8de11SBarry Smith   Works with MATSEQAIJ matrices.
22105db81ecSKris Buschelman 
22205db81ecSKris Buschelman   Options Database Keys:
22341c8de11SBarry Smith . -pc_factor_mat_solver_type matlab - selects Matlab to do the sparse factorization
22441c8de11SBarry Smith 
22505db81ecSKris Buschelman 
22605db81ecSKris Buschelman   Level: beginner
22705db81ecSKris Buschelman 
22805db81ecSKris Buschelman .seealso: PCLU
22941c8de11SBarry Smith 
23041c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage
23105db81ecSKris Buschelman M*/
23205db81ecSKris Buschelman 
233