xref: /petsc/src/mat/impls/aij/seq/matlab/aijmatlab.c (revision 3b3e256ba2415de5efe3318b4d067e5f0a2386c2)
1*3b3e256bSKris Buschelman /*$Id: aijmatlab.c,v 1.12 2001/08/06 21:15:14 bsmith Exp $*/
2*3b3e256bSKris Buschelman 
3*3b3e256bSKris Buschelman /*
4*3b3e256bSKris Buschelman         Provides an interface for the Matlab engine sparse solver
5*3b3e256bSKris Buschelman 
6*3b3e256bSKris Buschelman */
7*3b3e256bSKris Buschelman #include "src/mat/impls/aij/seq/aij.h"
8*3b3e256bSKris Buschelman 
9*3b3e256bSKris Buschelman #if defined(PETSC_HAVE_MATLAB) && !defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_SINGLE)
10*3b3e256bSKris Buschelman #include "engine.h"   /* Matlab include file */
11*3b3e256bSKris Buschelman #include "mex.h"      /* Matlab include file */
12*3b3e256bSKris Buschelman 
13*3b3e256bSKris Buschelman #undef __FUNCT__
14*3b3e256bSKris Buschelman #define __FUNCT__ "MatSolve_SeqAIJ_Matlab"
15*3b3e256bSKris Buschelman int MatSolve_SeqAIJ_Matlab(Mat A,Vec b,Vec x)
16*3b3e256bSKris Buschelman {
17*3b3e256bSKris Buschelman   int             ierr;
18*3b3e256bSKris Buschelman   char            *_A,*_b,*_x;
19*3b3e256bSKris Buschelman 
20*3b3e256bSKris Buschelman   PetscFunctionBegin;
21*3b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
22*3b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
23*3b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
24*3b3e256bSKris Buschelman 
25*3b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
26*3b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
27*3b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
28*3b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr);
29*3b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr);
30*3b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr);
31*3b3e256bSKris Buschelman   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr);  */
32*3b3e256bSKris Buschelman   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr);
33*3b3e256bSKris Buschelman   PetscFunctionReturn(0);
34*3b3e256bSKris Buschelman }
35*3b3e256bSKris Buschelman 
36*3b3e256bSKris Buschelman #undef __FUNCT__
37*3b3e256bSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_SeqAIJ_Matlab"
38*3b3e256bSKris Buschelman int MatLUFactorNumeric_SeqAIJ_Matlab(Mat A,Mat *F)
39*3b3e256bSKris Buschelman {
40*3b3e256bSKris Buschelman   Mat_SeqAIJ      *f = (Mat_SeqAIJ*)(*F)->data;
41*3b3e256bSKris Buschelman   int             ierr,len;
42*3b3e256bSKris Buschelman   char            *_A,*name;
43*3b3e256bSKris Buschelman 
44*3b3e256bSKris Buschelman   PetscFunctionBegin;
45*3b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
46*3b3e256bSKris Buschelman   _A   = A->name;
47*3b3e256bSKris 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);
48*3b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr);
49*3b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
50*3b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
51*3b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
52*3b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
53*3b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
54*3b3e256bSKris Buschelman   PetscFunctionReturn(0);
55*3b3e256bSKris Buschelman }
56*3b3e256bSKris Buschelman 
57*3b3e256bSKris Buschelman #undef __FUNCT__
58*3b3e256bSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_SeqAIJ_Matlab"
59*3b3e256bSKris Buschelman int MatLUFactorSymbolic_SeqAIJ_Matlab(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
60*3b3e256bSKris Buschelman {
61*3b3e256bSKris Buschelman   int        ierr;
62*3b3e256bSKris Buschelman   Mat_SeqAIJ *f;
63*3b3e256bSKris Buschelman 
64*3b3e256bSKris Buschelman   PetscFunctionBegin;
65*3b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
66*3b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
67*3b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
68*3b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
69*3b3e256bSKris Buschelman   (*F)->ops->solve           = MatSolve_SeqAIJ_Matlab;
70*3b3e256bSKris Buschelman   (*F)->ops->lufactornumeric = MatLUFactorNumeric_SeqAIJ_Matlab;
71*3b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
72*3b3e256bSKris Buschelman   f                          = (Mat_SeqAIJ*)(*F)->data;
73*3b3e256bSKris Buschelman   f->lu_dtcol = info->dtcol;
74*3b3e256bSKris Buschelman   PetscFunctionReturn(0);
75*3b3e256bSKris Buschelman }
76*3b3e256bSKris Buschelman 
77*3b3e256bSKris Buschelman /* ---------------------------------------------------------------------------------*/
78*3b3e256bSKris Buschelman #undef __FUNCT__
79*3b3e256bSKris Buschelman #define __FUNCT__ "MatSolve_SeqAIJ_Matlab_QR"
80*3b3e256bSKris Buschelman int MatSolve_SeqAIJ_Matlab_QR(Mat A,Vec b,Vec x)
81*3b3e256bSKris Buschelman {
82*3b3e256bSKris Buschelman   int             ierr;
83*3b3e256bSKris Buschelman   char            *_A,*_b,*_x;
84*3b3e256bSKris Buschelman 
85*3b3e256bSKris Buschelman   PetscFunctionBegin;
86*3b3e256bSKris Buschelman   /* make sure objects have names; use default if not */
87*3b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr);
88*3b3e256bSKris Buschelman   ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr);
89*3b3e256bSKris Buschelman 
90*3b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr);
91*3b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr);
92*3b3e256bSKris Buschelman   ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr);
93*3b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr);
94*3b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = r%s\\(r%s'\\(%s*%s));",_x,_A,_A,_A+1,_b);CHKERRQ(ierr);
95*3b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr);
96*3b3e256bSKris Buschelman   /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr);  */
97*3b3e256bSKris Buschelman   ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr);
98*3b3e256bSKris Buschelman   PetscFunctionReturn(0);
99*3b3e256bSKris Buschelman }
100*3b3e256bSKris Buschelman 
101*3b3e256bSKris Buschelman #undef __FUNCT__
102*3b3e256bSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_SeqAIJ_Matlab_QR"
103*3b3e256bSKris Buschelman int MatLUFactorNumeric_SeqAIJ_Matlab_QR(Mat A,Mat *F)
104*3b3e256bSKris Buschelman {
105*3b3e256bSKris Buschelman   int             ierr,len;
106*3b3e256bSKris Buschelman   char            *_A,*name;
107*3b3e256bSKris Buschelman 
108*3b3e256bSKris Buschelman   PetscFunctionBegin;
109*3b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
110*3b3e256bSKris Buschelman   _A   = A->name;
111*3b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"r_%s = qr(%s');",_A,_A);CHKERRQ(ierr);
112*3b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
113*3b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
114*3b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
115*3b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
116*3b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
117*3b3e256bSKris Buschelman   PetscFunctionReturn(0);
118*3b3e256bSKris Buschelman }
119*3b3e256bSKris Buschelman 
120*3b3e256bSKris Buschelman #undef __FUNCT__
121*3b3e256bSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_SeqAIJ_Matlab_QR"
122*3b3e256bSKris Buschelman int MatLUFactorSymbolic_SeqAIJ_Matlab_QR(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
123*3b3e256bSKris Buschelman {
124*3b3e256bSKris Buschelman   int  ierr;
125*3b3e256bSKris Buschelman 
126*3b3e256bSKris Buschelman   PetscFunctionBegin;
127*3b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
128*3b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
129*3b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
130*3b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
131*3b3e256bSKris Buschelman   (*F)->ops->solve           = MatSolve_SeqAIJ_Matlab_QR;
132*3b3e256bSKris Buschelman   (*F)->ops->lufactornumeric = MatLUFactorNumeric_SeqAIJ_Matlab_QR;
133*3b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
134*3b3e256bSKris Buschelman   (*F)->assembled            = PETSC_TRUE;  /* required by -ksp_view */
135*3b3e256bSKris Buschelman 
136*3b3e256bSKris Buschelman   PetscFunctionReturn(0);
137*3b3e256bSKris Buschelman }
138*3b3e256bSKris Buschelman 
139*3b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/
140*3b3e256bSKris Buschelman #undef __FUNCT__
141*3b3e256bSKris Buschelman #define __FUNCT__ "MatILUDTFactor_SeqAIJ_Matlab"
142*3b3e256bSKris Buschelman int MatILUDTFactor_SeqAIJ_Matlab(Mat A,MatFactorInfo *info,IS isrow,IS iscol,Mat *F)
143*3b3e256bSKris Buschelman {
144*3b3e256bSKris Buschelman   int        ierr,len;
145*3b3e256bSKris Buschelman   char       *_A,*name;
146*3b3e256bSKris Buschelman 
147*3b3e256bSKris Buschelman   PetscFunctionBegin;
148*3b3e256bSKris Buschelman   if (info->dt == PETSC_DEFAULT)      info->dt      = .005;
149*3b3e256bSKris Buschelman   if (info->dtcol == PETSC_DEFAULT)   info->dtcol   = .01;
150*3b3e256bSKris Buschelman   if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
151*3b3e256bSKris Buschelman   ierr                       = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr);
152*3b3e256bSKris Buschelman   ierr                       = MatSetType(*F,A->type_name);CHKERRQ(ierr);
153*3b3e256bSKris Buschelman   ierr                       = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr);
154*3b3e256bSKris Buschelman   (*F)->ops->solve           = MatSolve_SeqAIJ_Matlab;
155*3b3e256bSKris Buschelman   (*F)->factor               = FACTOR_LU;
156*3b3e256bSKris Buschelman   ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr);
157*3b3e256bSKris Buschelman   _A   = A->name;
158*3b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,info->dtcol);CHKERRQ(ierr);
159*3b3e256bSKris 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);
160*3b3e256bSKris Buschelman   ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr);
161*3b3e256bSKris Buschelman 
162*3b3e256bSKris Buschelman   ierr = PetscStrlen(_A,&len);CHKERRQ(ierr);
163*3b3e256bSKris Buschelman   ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr);
164*3b3e256bSKris Buschelman   sprintf(name,"_%s",_A);
165*3b3e256bSKris Buschelman   ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr);
166*3b3e256bSKris Buschelman   ierr = PetscFree(name);CHKERRQ(ierr);
167*3b3e256bSKris Buschelman   PetscFunctionReturn(0);
168*3b3e256bSKris Buschelman }
169*3b3e256bSKris Buschelman 
170*3b3e256bSKris Buschelman int MatSeqAIJFactorInfo_Matlab(Mat A,PetscViewer viewer)
171*3b3e256bSKris Buschelman {
172*3b3e256bSKris Buschelman   int ierr;
173*3b3e256bSKris Buschelman 
174*3b3e256bSKris Buschelman   PetscFunctionBegin;
175*3b3e256bSKris Buschelman   /* check if matrix is matlab type */
176*3b3e256bSKris Buschelman   if (A->ops->solve != MatSolve_SeqAIJ_Matlab) PetscFunctionReturn(0);
177*3b3e256bSKris Buschelman 
178*3b3e256bSKris Buschelman   ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters:  -- not written yet!\n");CHKERRQ(ierr);
179*3b3e256bSKris Buschelman   PetscFunctionReturn(0);
180*3b3e256bSKris Buschelman }
181*3b3e256bSKris Buschelman 
182*3b3e256bSKris Buschelman #undef __FUNCT__
183*3b3e256bSKris Buschelman #define __FUNCT__ "MatUseMatlab_SeqAIJ"
184*3b3e256bSKris Buschelman int MatUseMatlab_SeqAIJ(Mat A)
185*3b3e256bSKris Buschelman {
186*3b3e256bSKris Buschelman   PetscTruth qr;
187*3b3e256bSKris Buschelman   int        ierr;
188*3b3e256bSKris Buschelman 
189*3b3e256bSKris Buschelman   PetscFunctionBegin;
190*3b3e256bSKris Buschelman   ierr = PetscOptionsHasName(A->prefix,"-mat_aij_matlab_qr",&qr);CHKERRQ(ierr);
191*3b3e256bSKris Buschelman   if (qr) {
192*3b3e256bSKris Buschelman     A->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqAIJ_Matlab_QR;
193*3b3e256bSKris Buschelman     PetscLogInfo(0,"Using Matlab QR with iterative refinement for SeqAIJ LU factorization and solves");
194*3b3e256bSKris Buschelman   } else {
195*3b3e256bSKris Buschelman     A->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqAIJ_Matlab;
196*3b3e256bSKris Buschelman     PetscLogInfo(0,"Using Matlab for SeqAIJ LU factorization and solves");
197*3b3e256bSKris Buschelman   }
198*3b3e256bSKris Buschelman   A->ops->iludtfactor      = MatILUDTFactor_SeqAIJ_Matlab;
199*3b3e256bSKris Buschelman   PetscLogInfo(0,"Using Matlab for SeqAIJ ILUDT factorization and solves");
200*3b3e256bSKris Buschelman   PetscFunctionReturn(0);
201*3b3e256bSKris Buschelman }
202*3b3e256bSKris Buschelman 
203*3b3e256bSKris Buschelman #else
204*3b3e256bSKris Buschelman 
205*3b3e256bSKris Buschelman #undef __FUNCT__
206*3b3e256bSKris Buschelman #define __FUNCT__ "MatUseMatlab_SeqAIJ"
207*3b3e256bSKris Buschelman int MatUseMatlab_SeqAIJ(Mat A)
208*3b3e256bSKris Buschelman {
209*3b3e256bSKris Buschelman   PetscFunctionBegin;
210*3b3e256bSKris Buschelman   PetscFunctionReturn(0);
211*3b3e256bSKris Buschelman }
212*3b3e256bSKris Buschelman 
213*3b3e256bSKris Buschelman #endif
214*3b3e256bSKris Buschelman 
215*3b3e256bSKris Buschelman 
216