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