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