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