13b3e256bSKris Buschelman /*$Id: aijmatlab.c,v 1.12 2001/08/06 21:15:14 bsmith Exp $*/ 23b3e256bSKris Buschelman 33b3e256bSKris Buschelman /* 43b3e256bSKris Buschelman Provides an interface for the Matlab engine sparse solver 53b3e256bSKris Buschelman 63b3e256bSKris Buschelman */ 73b3e256bSKris Buschelman #include "src/mat/impls/aij/seq/aij.h" 83b3e256bSKris Buschelman 93b3e256bSKris Buschelman #include "engine.h" /* Matlab include file */ 103b3e256bSKris Buschelman #include "mex.h" /* Matlab include file */ 113b3e256bSKris Buschelman 12*05db81ecSKris Buschelman typedef struct { 13*05db81ecSKris Buschelman int (*MatDuplicate)(Mat,MatDuplicateOption,Mat*); 14*05db81ecSKris Buschelman int (*MatView)(Mat,PetscViewer); 15*05db81ecSKris Buschelman int (*MatLUFactorSymbolic)(Mat,IS,IS,MatFactorInfo*,Mat*); 16*05db81ecSKris Buschelman int (*MatILUDTFactor)(Mat,MatFactorInfo*,IS,IS,Mat*); 17*05db81ecSKris Buschelman int (*MatDestroy)(Mat); 18*05db81ecSKris Buschelman } Mat_Matlab; 19*05db81ecSKris Buschelman 20*05db81ecSKris Buschelman EXTERN_C_BEGIN 213b3e256bSKris Buschelman #undef __FUNCT__ 22*05db81ecSKris Buschelman #define __FUNCT__ "MatConvert_Matlab_SeqAIJ" 23*05db81ecSKris Buschelman int MatConvert_Matlab_SeqAIJ(Mat A,const MatType type,Mat *newmat) { 24*05db81ecSKris Buschelman int ierr; 25*05db81ecSKris Buschelman Mat B=*newmat; 26*05db81ecSKris Buschelman Mat_Matlab *lu=(Mat_Matlab*)A->spptr; 27*05db81ecSKris Buschelman 28*05db81ecSKris Buschelman PetscFunctionBegin; 29*05db81ecSKris Buschelman if (B != A) { 30*05db81ecSKris Buschelman ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr); 31*05db81ecSKris Buschelman } 32*05db81ecSKris Buschelman A->ops->duplicate = lu->MatDuplicate; 33*05db81ecSKris Buschelman A->ops->view = lu->MatView; 34*05db81ecSKris Buschelman A->ops->lufactorsymbolic = lu->MatLUFactorSymbolic; 35*05db81ecSKris Buschelman A->ops->iludtfactor = lu->MatILUDTFactor; 36*05db81ecSKris Buschelman A->ops->destroy = lu->MatDestroy; 37*05db81ecSKris Buschelman 38*05db81ecSKris Buschelman ierr = PetscFree(lu);CHKERRQ(ierr); 39*05db81ecSKris Buschelman ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQAIJ);CHKERRQ(ierr); 40*05db81ecSKris Buschelman *newmat = B; 41*05db81ecSKris Buschelman PetscFunctionReturn(0); 42*05db81ecSKris Buschelman } 43*05db81ecSKris Buschelman EXTERN_C_END 44*05db81ecSKris Buschelman 45*05db81ecSKris Buschelman #undef __FUNCT__ 46*05db81ecSKris Buschelman #define __FUNCT__ "MatDestroy_Matlab" 47*05db81ecSKris Buschelman int MatDestroy_Matlab(Mat A) { 48*05db81ecSKris Buschelman int ierr; 49*05db81ecSKris Buschelman Mat_Matlab *lu=(Mat_Matlab*)A->spptr; 50*05db81ecSKris Buschelman 51*05db81ecSKris Buschelman PetscFunctionBegin; 52*05db81ecSKris Buschelman ierr = MatConvert_Matlab_SeqAIJ(A,MATSEQAIJ,&A);CHKERRQ(ierr); 53*05db81ecSKris Buschelman ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); 54*05db81ecSKris Buschelman PetscFunctionReturn(0); 55*05db81ecSKris Buschelman } 56*05db81ecSKris Buschelman 57*05db81ecSKris Buschelman #undef __FUNCT__ 58*05db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab" 59*05db81ecSKris Buschelman int MatSolve_Matlab(Mat A,Vec b,Vec x) 603b3e256bSKris Buschelman { 613b3e256bSKris Buschelman int ierr; 623b3e256bSKris Buschelman char *_A,*_b,*_x; 633b3e256bSKris Buschelman 643b3e256bSKris Buschelman PetscFunctionBegin; 653b3e256bSKris Buschelman /* make sure objects have names; use default if not */ 663b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr); 673b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr); 683b3e256bSKris Buschelman 693b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr); 703b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr); 713b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr); 723b3e256bSKris Buschelman ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr); 733b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr); 743b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr); 753b3e256bSKris Buschelman /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr); */ 763b3e256bSKris Buschelman ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr); 773b3e256bSKris Buschelman PetscFunctionReturn(0); 783b3e256bSKris Buschelman } 793b3e256bSKris Buschelman 803b3e256bSKris Buschelman #undef __FUNCT__ 81*05db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab" 82*05db81ecSKris Buschelman int MatLUFactorNumeric_Matlab(Mat A,Mat *F) 833b3e256bSKris Buschelman { 843b3e256bSKris Buschelman Mat_SeqAIJ *f = (Mat_SeqAIJ*)(*F)->data; 853b3e256bSKris Buschelman int ierr,len; 863b3e256bSKris Buschelman char *_A,*name; 873b3e256bSKris Buschelman 883b3e256bSKris Buschelman PetscFunctionBegin; 893b3e256bSKris Buschelman ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr); 903b3e256bSKris Buschelman _A = A->name; 913b3e256bSKris 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); 923b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr); 933b3e256bSKris Buschelman ierr = PetscStrlen(_A,&len);CHKERRQ(ierr); 943b3e256bSKris Buschelman ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr); 953b3e256bSKris Buschelman sprintf(name,"_%s",_A); 963b3e256bSKris Buschelman ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr); 973b3e256bSKris Buschelman ierr = PetscFree(name);CHKERRQ(ierr); 983b3e256bSKris Buschelman PetscFunctionReturn(0); 993b3e256bSKris Buschelman } 1003b3e256bSKris Buschelman 1013b3e256bSKris Buschelman #undef __FUNCT__ 102*05db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab" 103*05db81ecSKris Buschelman int MatLUFactorSymbolic_Matlab(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F) 1043b3e256bSKris Buschelman { 1053b3e256bSKris Buschelman int ierr; 1063b3e256bSKris Buschelman Mat_SeqAIJ *f; 1073b3e256bSKris Buschelman 1083b3e256bSKris Buschelman PetscFunctionBegin; 1093b3e256bSKris Buschelman if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square"); 1103b3e256bSKris Buschelman ierr = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr); 1113b3e256bSKris Buschelman ierr = MatSetType(*F,A->type_name);CHKERRQ(ierr); 1123b3e256bSKris Buschelman ierr = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr); 113*05db81ecSKris Buschelman (*F)->ops->solve = MatSolve_Matlab; 114*05db81ecSKris Buschelman (*F)->ops->lufactornumeric = MatLUFactorNumeric_Matlab; 1153b3e256bSKris Buschelman (*F)->factor = FACTOR_LU; 1163b3e256bSKris Buschelman f = (Mat_SeqAIJ*)(*F)->data; 1173b3e256bSKris Buschelman f->lu_dtcol = info->dtcol; 1183b3e256bSKris Buschelman PetscFunctionReturn(0); 1193b3e256bSKris Buschelman } 1203b3e256bSKris Buschelman 1213b3e256bSKris Buschelman /* ---------------------------------------------------------------------------------*/ 1223b3e256bSKris Buschelman #undef __FUNCT__ 123*05db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab_QR" 124*05db81ecSKris Buschelman int MatSolve_Matlab_QR(Mat A,Vec b,Vec x) 1253b3e256bSKris Buschelman { 1263b3e256bSKris Buschelman int ierr; 1273b3e256bSKris Buschelman char *_A,*_b,*_x; 1283b3e256bSKris Buschelman 1293b3e256bSKris Buschelman PetscFunctionBegin; 1303b3e256bSKris Buschelman /* make sure objects have names; use default if not */ 1313b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr); 1323b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr); 1333b3e256bSKris Buschelman 1343b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr); 1353b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr); 1363b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr); 1373b3e256bSKris Buschelman ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr); 1383b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = r%s\\(r%s'\\(%s*%s));",_x,_A,_A,_A+1,_b);CHKERRQ(ierr); 1393b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr); 1403b3e256bSKris Buschelman /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr); */ 1413b3e256bSKris Buschelman ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr); 1423b3e256bSKris Buschelman PetscFunctionReturn(0); 1433b3e256bSKris Buschelman } 1443b3e256bSKris Buschelman 1453b3e256bSKris Buschelman #undef __FUNCT__ 146*05db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab_QR" 147*05db81ecSKris Buschelman int MatLUFactorNumeric_Matlab_QR(Mat A,Mat *F) 1483b3e256bSKris Buschelman { 1493b3e256bSKris Buschelman int ierr,len; 1503b3e256bSKris Buschelman char *_A,*name; 1513b3e256bSKris Buschelman 1523b3e256bSKris Buschelman PetscFunctionBegin; 1533b3e256bSKris Buschelman ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr); 1543b3e256bSKris Buschelman _A = A->name; 1553b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"r_%s = qr(%s');",_A,_A);CHKERRQ(ierr); 1563b3e256bSKris Buschelman ierr = PetscStrlen(_A,&len);CHKERRQ(ierr); 1573b3e256bSKris Buschelman ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr); 1583b3e256bSKris Buschelman sprintf(name,"_%s",_A); 1593b3e256bSKris Buschelman ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr); 1603b3e256bSKris Buschelman ierr = PetscFree(name);CHKERRQ(ierr); 1613b3e256bSKris Buschelman PetscFunctionReturn(0); 1623b3e256bSKris Buschelman } 1633b3e256bSKris Buschelman 1643b3e256bSKris Buschelman #undef __FUNCT__ 165*05db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab_QR" 166*05db81ecSKris Buschelman int MatLUFactorSymbolic_Matlab_QR(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F) 1673b3e256bSKris Buschelman { 1683b3e256bSKris Buschelman int ierr; 1693b3e256bSKris Buschelman 1703b3e256bSKris Buschelman PetscFunctionBegin; 1713b3e256bSKris Buschelman if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square"); 1723b3e256bSKris Buschelman ierr = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr); 1733b3e256bSKris Buschelman ierr = MatSetType(*F,A->type_name);CHKERRQ(ierr); 1743b3e256bSKris Buschelman ierr = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr); 175*05db81ecSKris Buschelman (*F)->ops->solve = MatSolve_Matlab_QR; 176*05db81ecSKris Buschelman (*F)->ops->lufactornumeric = MatLUFactorNumeric_Matlab_QR; 1773b3e256bSKris Buschelman (*F)->factor = FACTOR_LU; 1783b3e256bSKris Buschelman (*F)->assembled = PETSC_TRUE; /* required by -ksp_view */ 1793b3e256bSKris Buschelman 1803b3e256bSKris Buschelman PetscFunctionReturn(0); 1813b3e256bSKris Buschelman } 1823b3e256bSKris Buschelman 1833b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/ 1843b3e256bSKris Buschelman #undef __FUNCT__ 185*05db81ecSKris Buschelman #define __FUNCT__ "MatILUDTFactor_Matlab" 186*05db81ecSKris Buschelman int MatILUDTFactor_Matlab(Mat A,MatFactorInfo *info,IS isrow,IS iscol,Mat *F) 1873b3e256bSKris Buschelman { 1883b3e256bSKris Buschelman int ierr,len; 1893b3e256bSKris Buschelman char *_A,*name; 1903b3e256bSKris Buschelman 1913b3e256bSKris Buschelman PetscFunctionBegin; 1923b3e256bSKris Buschelman if (info->dt == PETSC_DEFAULT) info->dt = .005; 1933b3e256bSKris Buschelman if (info->dtcol == PETSC_DEFAULT) info->dtcol = .01; 1943b3e256bSKris Buschelman if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square"); 1953b3e256bSKris Buschelman ierr = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr); 1963b3e256bSKris Buschelman ierr = MatSetType(*F,A->type_name);CHKERRQ(ierr); 1973b3e256bSKris Buschelman ierr = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr); 1983b3e256bSKris Buschelman (*F)->ops->solve = MatSolve_SeqAIJ_Matlab; 1993b3e256bSKris Buschelman (*F)->factor = FACTOR_LU; 2003b3e256bSKris Buschelman ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr); 2013b3e256bSKris Buschelman _A = A->name; 2023b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,info->dtcol);CHKERRQ(ierr); 2033b3e256bSKris 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); 2043b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr); 2053b3e256bSKris Buschelman 2063b3e256bSKris Buschelman ierr = PetscStrlen(_A,&len);CHKERRQ(ierr); 2073b3e256bSKris Buschelman ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr); 2083b3e256bSKris Buschelman sprintf(name,"_%s",_A); 2093b3e256bSKris Buschelman ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr); 2103b3e256bSKris Buschelman ierr = PetscFree(name);CHKERRQ(ierr); 2113b3e256bSKris Buschelman PetscFunctionReturn(0); 2123b3e256bSKris Buschelman } 2133b3e256bSKris Buschelman 214*05db81ecSKris Buschelman #undef __FUNCT__ 215*05db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab" 216*05db81ecSKris Buschelman int MatFactorInfo_Matlab(Mat A,PetscViewer viewer) 2173b3e256bSKris Buschelman { 2183b3e256bSKris Buschelman int ierr; 2193b3e256bSKris Buschelman 2203b3e256bSKris Buschelman PetscFunctionBegin; 2213b3e256bSKris Buschelman ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters: -- not written yet!\n");CHKERRQ(ierr); 2223b3e256bSKris Buschelman PetscFunctionReturn(0); 2233b3e256bSKris Buschelman } 2243b3e256bSKris Buschelman 2253b3e256bSKris Buschelman #undef __FUNCT__ 226*05db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab" 227*05db81ecSKris Buschelman int MatView_Matlab(Mat A,PetscViewer viewer) { 228*05db81ecSKris Buschelman int ierr; 229*05db81ecSKris Buschelman PetscTruth isascii; 230*05db81ecSKris Buschelman PetscViewerFormat format; 231*05db81ecSKris Buschelman Mat_Matlab *lu=(Mat_Matlab*)(A->spptr); 232*05db81ecSKris Buschelman 233*05db81ecSKris Buschelman PetscFunctionBegin; 234*05db81ecSKris Buschelman ierr = (*lu->MatView)(A,viewer);CHKERRQ(ierr); 235*05db81ecSKris Buschelman ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr); 236*05db81ecSKris Buschelman if (isascii) { 237*05db81ecSKris Buschelman ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 238*05db81ecSKris Buschelman if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) { 239*05db81ecSKris Buschelman ierr = MatFactorInfo_Matlab(A,viewer); 240*05db81ecSKris Buschelman } 241*05db81ecSKris Buschelman } 242*05db81ecSKris Buschelman PetscFunctionReturn(0); 243*05db81ecSKris Buschelman } 244*05db81ecSKris Buschelman 245*05db81ecSKris Buschelman #undef __FUNCT__ 246*05db81ecSKris Buschelman #define __FUNCT__ "MatConvert_SeqAIJ_Matlab" 247*05db81ecSKris Buschelman int MatConvert_SeqAIJ_Matlab(Mat A,const MatType type,Mat *newmat) { 248*05db81ecSKris Buschelman /* This routine is only called to convert to MATMATLAB */ 249*05db81ecSKris Buschelman /* from MATSEQAIJ, so we will ignore 'MatType type'. */ 250*05db81ecSKris Buschelman int ierr; 251*05db81ecSKris Buschelman Mat B=*newmat; 252*05db81ecSKris Buschelman Mat_Matlab *lu; 2533b3e256bSKris Buschelman PetscTruth qr; 254*05db81ecSKris Buschelman 255*05db81ecSKris Buschelman PetscFunctionBegin; 256*05db81ecSKris Buschelman if (B != A) { 257*05db81ecSKris Buschelman ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr); 258*05db81ecSKris Buschelman } 259*05db81ecSKris Buschelman 260*05db81ecSKris Buschelman ierr = PetscNew(Mat_Matlab,&lu);CHKERRQ(ierr); 261*05db81ecSKris Buschelman lu->MatDuplicate = A->ops->duplicate; 262*05db81ecSKris Buschelman lu->MatView = A->ops->view; 263*05db81ecSKris Buschelman lu->MatLUFactorSymbolic = A->ops->lufactorsymbolic; 264*05db81ecSKris Buschelman lu->MatILUDTFactor = A->ops->iludtfactor; 265*05db81ecSKris Buschelman lu->MatDestroy = A->ops->destroy; 266*05db81ecSKris Buschelman 267*05db81ecSKris Buschelman B->spptr = (void*)lu; 268*05db81ecSKris Buschelman B->ops->duplicate = MatDuplicate_Matlab; 269*05db81ecSKris Buschelman B->ops->view = MatView_Matlab; 270*05db81ecSKris Buschelman B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab; 271*05db81ecSKris Buschelman B->ops->iludtfactor = MatILUDTFactor_Matlab; 272*05db81ecSKris Buschelman B->ops->destroy = MatDestroy_Matlab; 273*05db81ecSKris Buschelman 274*05db81ecSKris Buschelman ierr = PetscOptionsHasName(A->prefix,"-mat_matlab_qr",&qr);CHKERRQ(ierr); 275*05db81ecSKris Buschelman if (qr) { 276*05db81ecSKris Buschelman B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab_QR; 277*05db81ecSKris Buschelman PetscLogInfo(0,"Using Matlab QR with iterative refinement for LU factorization and solves"); 278*05db81ecSKris Buschelman } else { 279*05db81ecSKris Buschelman PetscLogInfo(0,"Using Matlab for LU factorizations and solves."); 280*05db81ecSKris Buschelman } 281*05db81ecSKris Buschelman PetscLogInfo(0,"Using Matlab for ILUDT factorizations and solves."); 282*05db81ecSKris Buschelman 283*05db81ecSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_matlab_C", 284*05db81ecSKris Buschelman "MatConvert_SeqAIJ_Matlab",MatConvert_SeqAIJ_Matlab);CHKERRQ(ierr); 285*05db81ecSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_matlab_seqaij_C", 286*05db81ecSKris Buschelman "MatConvert_Matlab_SeqAIJ",MatConvert_Matlab_SeqAIJ);CHKERRQ(ierr); 287*05db81ecSKris Buschelman ierr = PetscObjectChangeTypeName((PetscObject)B,MATMATLAB);CHKERRQ(ierr); 288*05db81ecSKris Buschelman *newmat = B; 289*05db81ecSKris Buschelman PetscFunctionReturn(0); 290*05db81ecSKris Buschelman } 291*05db81ecSKris Buschelman EXTERN_C_END 292*05db81ecSKris Buschelman 293*05db81ecSKris Buschelman #undef __FUNCT__ 294*05db81ecSKris Buschelman #define __FUNCT__ "MatDuplicate_Matlab" 295*05db81ecSKris Buschelman int MatDuplicate_Matlab(Mat A, MatDuplicateOption op, Mat *M) { 296*05db81ecSKris Buschelman int ierr; 297*05db81ecSKris Buschelman Mat_Matlab *lu=(Mat_Matlab*)A->spptr; 298*05db81ecSKris Buschelman 299*05db81ecSKris Buschelman PetscFunctionBegin; 300*05db81ecSKris Buschelman ierr = (*lu->MatDuplicate)(A,op,M);CHKERRQ(ierr); 301*05db81ecSKris Buschelman ierr = PetscMemcpy((*M)->spptr,lu,sizeof(Mat_Matlab));CHKERRQ(ierr); 302*05db81ecSKris Buschelman PetscFunctionReturn(0); 303*05db81ecSKris Buschelman } 304*05db81ecSKris Buschelman 305*05db81ecSKris Buschelman /*MC 306*05db81ecSKris Buschelman MATMATLAB - MATMATLAB = "matlab" - A matrix type providing direct solvers (LU and QR) and drop tolerance 307*05db81ecSKris Buschelman based ILU factorization (ILUDT) for sequential matrices via the external package Matlab. 308*05db81ecSKris Buschelman 309*05db81ecSKris Buschelman If Matlab is instaled (see the manual for 310*05db81ecSKris Buschelman instructions on how to declare the existence of external packages), 311*05db81ecSKris Buschelman a matrix type can be constructed which invokes Matlab solvers. 312*05db81ecSKris Buschelman After calling MatCreate(...,A), simply call MatSetType(A,MATMATLAB). 313*05db81ecSKris Buschelman This matrix type is only supported for double precision real. 314*05db81ecSKris Buschelman 315*05db81ecSKris Buschelman This matrix inherits from MATSEQAIJ. As a result, MatSeqAIJSetPreallocation is 316*05db81ecSKris Buschelman supported for this matrix type. One can also call MatConvert for an inplace conversion to or from 317*05db81ecSKris Buschelman the MATSEQAIJ type without data copy. 318*05db81ecSKris Buschelman 319*05db81ecSKris Buschelman Options Database Keys: 320*05db81ecSKris Buschelman + -mat_type matlab - sets the matrix type to "matlab" during a call to MatSetFromOptions() 321*05db81ecSKris Buschelman - -mat_matlab_qr - sets the direct solver to be QR instead of LU 322*05db81ecSKris Buschelman 323*05db81ecSKris Buschelman Level: beginner 324*05db81ecSKris Buschelman 325*05db81ecSKris Buschelman .seealso: PCLU 326*05db81ecSKris Buschelman M*/ 327*05db81ecSKris Buschelman 328*05db81ecSKris Buschelman EXTERN_C_BEGIN 329*05db81ecSKris Buschelman #undef __FUNCT__ 330*05db81ecSKris Buschelman #define __FUNCT__ "MatCreate_Matlab" 331*05db81ecSKris Buschelman int MarCreate_Matlab(Mat A) { 3323b3e256bSKris Buschelman int ierr; 3333b3e256bSKris Buschelman 3343b3e256bSKris Buschelman PetscFunctionBegin; 335*05db81ecSKris Buschelman ierr = PetscObjectChangeTypeName((PetscObject)A,MATMATLAB);CHKERRQ(ierr); 336*05db81ecSKris Buschelman ierr = MatSetType(A,MATSEQAIJ);CHKERRQ(ierr); 337*05db81ecSKris Buschelman ierr = MatConvert_SeqAIJ_Matlab(A,MATMATLAB,&A);CHKERRQ(ierr); 3383b3e256bSKris Buschelman PetscFunctionReturn(0); 3393b3e256bSKris Buschelman } 340*05db81ecSKris Buschelman EXTERN_C_END 341