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 */
13: int MatSolve_SeqAIJ_Matlab(Mat A,Vec b,Vec x)
14: {
15: Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data;
16: int ierr;
17: char *_A,*_b,*_x;
20: /* make sure objects have names; use default if not */
21: PetscObjectName((PetscObject)b);
22: PetscObjectName((PetscObject)x);
24: PetscObjectGetName((PetscObject)A,&_A);
25: PetscObjectGetName((PetscObject)b,&_b);
26: PetscObjectGetName((PetscObject)x,&_x);
27: PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);
28: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = u%s\(l%s\(p%s*%s));",_x,_A,_A,_A,_b);
29: /* PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout); */
30: PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);
31: return(0);
32: }
34: int MatLUFactorNumeric_SeqAIJ_Matlab(Mat A,Mat *F)
35: {
36: Mat_SeqAIJ *f = (Mat_SeqAIJ*)(*F)->data;
37: Mat_SeqAIJ *a = (Mat_SeqAIJ*)(A)->data;
38: int ierr,len;
39: char *_A,*name;
42: PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);
43: _A = A->name;
44: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"[l_%s,u_%s,p_%s] = lu(%s',%g);",_A,_A,_A,_A,f->lu_dtcol);
46: PetscStrlen(_A,&len);
47: PetscMalloc((len+2)*sizeof(char),&name);
48: sprintf(name,"_%s",_A);
49: PetscObjectSetName((PetscObject)*F,name);
50: PetscFree(name);
51: return(0);
52: }
54: int MatLUFactorSymbolic_SeqAIJ_Matlab(Mat A,IS r,IS c,MatLUInfo *info,Mat *F)
55: {
56: Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data,*f;
57: int ierr;
60: if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
61: ierr = MatCreateSeqAIJ(A->comm,A->m,A->n,0,PETSC_NULL,F);
62: (*F)->ops->solve = MatSolve_SeqAIJ_Matlab;
63: (*F)->ops->lufactornumeric = MatLUFactorNumeric_SeqAIJ_Matlab;
64: (*F)->factor = FACTOR_LU;
65: f = (Mat_SeqAIJ*)(*F)->data;
66: if (info) f->lu_dtcol = info->dtcol;
67: else f->lu_dtcol = 0.0;
68: return(0);
69: }
71: int MatILUDTFactor_SeqAIJ_Matlab(Mat A,MatILUInfo *info,IS isrow,IS iscol,Mat *F)
72: {
73: Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data,*b;
74: int ierr,len;
75: char *_A,*name;
78: if (info->dt == PETSC_DEFAULT) info->dt = .005;
79: if (info->dtcol == PETSC_DEFAULT) info->dtcol = .01;
80: if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square");
81: ierr = MatCreateSeqAIJ(A->comm,A->m,A->n,0,PETSC_NULL,F);
82: (*F)->ops->solve = MatSolve_SeqAIJ_Matlab;
83: (*F)->factor = FACTOR_LU;
84: PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);
85: _A = A->name;
86: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,info->dtcol);
87: PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"[l_%s,u_%s,p_%s] = luinc(%s',info_%s);",_A,_A,_A,_A,_A);
89: PetscStrlen(_A,&len);
90: PetscMalloc((len+2)*sizeof(char),&name);
91: sprintf(name,"_%s",_A);
92: PetscObjectSetName((PetscObject)*F,name);
93: PetscFree(name);
94: return(0);
95: }
97: int MatUseMatlab_SeqAIJ(Mat A)
98: {
100: A->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqAIJ_Matlab;
101: A->ops->iludtfactor = MatILUDTFactor_SeqAIJ_Matlab;
102: PetscLogInfo(0,"Using Matlab for SeqAIJ LU and ILUDT factorization and solves");
103: return(0);
104: }
106: #else
108: int MatUseMatlab_SeqAIJ(Mat A)
109: {
111: return(0);
112: }
114: #endif