Actual source code: aijmatlab.c
1: /*$Id: aijmatlab.c,v 1.12 2001/08/06 21:15:14 bsmith Exp $*/
3: /*
4: Provides an interface for the Matlab engine sparse solver
6: */
7: #include src/mat/impls/aij/seq/aij.h
9: #if defined(PETSC_HAVE_MATLAB_ENGINE) && !defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_SINGLE)
10: #include "engine.h" /* Matlab include file */
11: #include "mex.h" /* Matlab include file */
15: int MatSolve_SeqAIJ_Matlab(Mat A,Vec b,Vec x)
16: {
17: int ierr;
18: char *_A,*_b,*_x;
21: /* make sure objects have names; use default if not */
22: PetscObjectName((PetscObject)b);
23: PetscObjectName((PetscObject)x);
25: PetscObjectGetName((PetscObject)A,&_A);
26: PetscObjectGetName((PetscObject)b,&_b);
27: PetscObjectGetName((PetscObject)x,&_x);
28: PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);
29: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);
30: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);
31: /* PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout); */
32: PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);
33: return(0);
34: }
38: int MatLUFactorNumeric_SeqAIJ_Matlab(Mat A,Mat *F)
39: {
40: Mat_SeqAIJ *f = (Mat_SeqAIJ*)(*F)->data;
41: int ierr,len;
42: char *_A,*name;
45: PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);
46: _A = A->name;
47: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"[l_%s,u_%s,p_%s] = lu(%s',%g);",_A,_A,_A,_A,f->lu_dtcol);
48: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);
49: PetscStrlen(_A,&len);
50: PetscMalloc((len+2)*sizeof(char),&name);
51: sprintf(name,"_%s",_A);
52: PetscObjectSetName((PetscObject)*F,name);
53: PetscFree(name);
54: return(0);
55: }
59: int MatLUFactorSymbolic_SeqAIJ_Matlab(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
60: {
61: int ierr;
62: Mat_SeqAIJ *f;
65: if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
66: MatCreateSeqAIJ(A->comm,A->m,A->n,0,PETSC_NULL,F);
67: (*F)->ops->solve = MatSolve_SeqAIJ_Matlab;
68: (*F)->ops->lufactornumeric = MatLUFactorNumeric_SeqAIJ_Matlab;
69: (*F)->factor = FACTOR_LU;
70: f = (Mat_SeqAIJ*)(*F)->data;
71: f->lu_dtcol = info->dtcol;
72: return(0);
73: }
75: /* ---------------------------------------------------------------------------------*/
78: int MatSolve_SeqAIJ_Matlab_QR(Mat A,Vec b,Vec x)
79: {
80: int ierr;
81: char *_A,*_b,*_x;
84: /* make sure objects have names; use default if not */
85: PetscObjectName((PetscObject)b);
86: PetscObjectName((PetscObject)x);
88: PetscObjectGetName((PetscObject)A,&_A);
89: PetscObjectGetName((PetscObject)b,&_b);
90: PetscObjectGetName((PetscObject)x,&_x);
91: PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);
92: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = r%s\\(r%s'\\(%s*%s));",_x,_A,_A,_A+1,_b);
93: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);
94: /* PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout); */
95: PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);
96: return(0);
97: }
101: int MatLUFactorNumeric_SeqAIJ_Matlab_QR(Mat A,Mat *F)
102: {
103: int ierr,len;
104: char *_A,*name;
107: PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);
108: _A = A->name;
109: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"r_%s = qr(%s');",_A,_A);
110: PetscStrlen(_A,&len);
111: PetscMalloc((len+2)*sizeof(char),&name);
112: sprintf(name,"_%s",_A);
113: PetscObjectSetName((PetscObject)*F,name);
114: PetscFree(name);
115: return(0);
116: }
120: int MatLUFactorSymbolic_SeqAIJ_Matlab_QR(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F)
121: {
122: int ierr;
125: if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
126: MatCreateSeqAIJ(A->comm,A->m,A->n,0,PETSC_NULL,F);
127: (*F)->ops->solve = MatSolve_SeqAIJ_Matlab_QR;
128: (*F)->ops->lufactornumeric = MatLUFactorNumeric_SeqAIJ_Matlab_QR;
129: (*F)->factor = FACTOR_LU;
130: (*F)->assembled = PETSC_TRUE; /* required by -sles_view */
132: return(0);
133: }
135: /* --------------------------------------------------------------------------------*/
138: int MatILUDTFactor_SeqAIJ_Matlab(Mat A,MatFactorInfo *info,IS isrow,IS iscol,Mat *F)
139: {
140: int ierr,len;
141: char *_A,*name;
144: if (info->dt == PETSC_DEFAULT) info->dt = .005;
145: if (info->dtcol == PETSC_DEFAULT) info->dtcol = .01;
146: if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
147: MatCreateSeqAIJ(A->comm,A->m,A->n,0,PETSC_NULL,F);
148: (*F)->ops->solve = MatSolve_SeqAIJ_Matlab;
149: (*F)->factor = FACTOR_LU;
150: PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);
151: _A = A->name;
152: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,info->dtcol);
153: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"[l_%s,u_%s,p_%s] = luinc(%s',info_%s);",_A,_A,_A,_A,_A);
154: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);
156: PetscStrlen(_A,&len);
157: PetscMalloc((len+2)*sizeof(char),&name);
158: sprintf(name,"_%s",_A);
159: PetscObjectSetName((PetscObject)*F,name);
160: PetscFree(name);
161: return(0);
162: }
164: int MatSeqAIJFactorInfo_Matlab(Mat A,PetscViewer viewer)
165: {
167:
169: /* check if matrix is matlab type */
170: /* if (A->ops->solve != MatSolve_SeqAIJ_Matlab) return(0); */
172: PetscViewerASCIIPrintf(viewer,"Matlab run parameters: -- not written yet!\n");
173: return(0);
174: }
178: int MatUseMatlab_SeqAIJ(Mat A)
179: {
180: PetscTruth qr;
181: int ierr;
184: PetscOptionsHasName(A->prefix,"-mat_aij_matlab_qr",&qr);
185: if (qr) {
186: A->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqAIJ_Matlab_QR;
187: PetscLogInfo(0,"Using Matlab QR with iterative refinement for SeqAIJ LU factorization and solves");
188: } else {
189: A->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqAIJ_Matlab;
190: PetscLogInfo(0,"Using Matlab for SeqAIJ LU factorization and solves");
191: }
192: A->ops->iludtfactor = MatILUDTFactor_SeqAIJ_Matlab;
193: PetscLogInfo(0,"Using Matlab for SeqAIJ ILUDT factorization and solves");
194: return(0);
195: }
197: #else
201: int MatUseMatlab_SeqAIJ(Mat A)
202: {
204: return(0);
205: }
207: #endif