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 1205db81ecSKris Buschelman typedef struct { 1305db81ecSKris Buschelman int (*MatDuplicate)(Mat,MatDuplicateOption,Mat*); 1405db81ecSKris Buschelman int (*MatView)(Mat,PetscViewer); 1505db81ecSKris Buschelman int (*MatLUFactorSymbolic)(Mat,IS,IS,MatFactorInfo*,Mat*); 1605db81ecSKris Buschelman int (*MatILUDTFactor)(Mat,MatFactorInfo*,IS,IS,Mat*); 1705db81ecSKris Buschelman int (*MatDestroy)(Mat); 1805db81ecSKris Buschelman } Mat_Matlab; 1905db81ecSKris Buschelman 20a1d52234SKris Buschelman 21a1d52234SKris Buschelman EXTERN_C_BEGIN 22a1d52234SKris Buschelman #undef __FUNCT__ 23a1d52234SKris Buschelman #define __FUNCT__ "MatMatlabEnginePut_Matlab" 24a1d52234SKris Buschelman int MatMatlabEnginePut_Matlab(PetscObject obj,void *mengine) 25a1d52234SKris Buschelman { 26a1d52234SKris Buschelman int ierr; 27a1d52234SKris Buschelman Mat B = (Mat)obj; 28a1d52234SKris Buschelman mxArray *mat; 29a1d52234SKris Buschelman Mat_SeqAIJ *aij = (Mat_SeqAIJ*)B->data; 30a1d52234SKris Buschelman 31a1d52234SKris Buschelman PetscFunctionBegin; 32a1d52234SKris Buschelman mat = mxCreateSparse(B->n,B->m,aij->nz,mxREAL); 33a1d52234SKris Buschelman ierr = PetscMemcpy(mxGetPr(mat),aij->a,aij->nz*sizeof(PetscScalar));CHKERRQ(ierr); 34a1d52234SKris Buschelman /* Matlab stores by column, not row so we pass in the transpose of the matrix */ 35a1d52234SKris Buschelman ierr = PetscMemcpy(mxGetIr(mat),aij->j,aij->nz*sizeof(int));CHKERRQ(ierr); 36a1d52234SKris Buschelman ierr = PetscMemcpy(mxGetJc(mat),aij->i,(B->m+1)*sizeof(int));CHKERRQ(ierr); 37a1d52234SKris Buschelman 38a1d52234SKris Buschelman /* Matlab indices start at 0 for sparse (what a surprise) */ 39a1d52234SKris Buschelman 40a1d52234SKris Buschelman ierr = PetscObjectName(obj);CHKERRQ(ierr); 41a1d52234SKris Buschelman engPutVariable((Engine *)mengine,obj->name,mat); 42a1d52234SKris Buschelman PetscFunctionReturn(0); 43a1d52234SKris Buschelman } 44a1d52234SKris Buschelman EXTERN_C_END 45a1d52234SKris Buschelman 46a1d52234SKris Buschelman EXTERN_C_BEGIN 47a1d52234SKris Buschelman #undef __FUNCT__ 48a1d52234SKris Buschelman #define __FUNCT__ "MatMatlabEngineGet_Matlab" 49a1d52234SKris Buschelman int MatMatlabEngineGet_Matlab(PetscObject obj,void *mengine) 50a1d52234SKris Buschelman { 51a1d52234SKris Buschelman int ierr,ii; 52a1d52234SKris Buschelman Mat mat = (Mat)obj; 53a1d52234SKris Buschelman Mat_SeqAIJ *aij = (Mat_SeqAIJ*)mat->data; 54a1d52234SKris Buschelman mxArray *mmat; 55a1d52234SKris Buschelman 56a1d52234SKris Buschelman PetscFunctionBegin; 57a1d52234SKris Buschelman ierr = PetscFree(aij->a);CHKERRQ(ierr); 58a1d52234SKris Buschelman 59a1d52234SKris Buschelman mmat = engGetVariable((Engine *)mengine,obj->name); 60a1d52234SKris Buschelman 61a1d52234SKris Buschelman aij->nz = (mxGetJc(mmat))[mat->m]; 62a1d52234SKris Buschelman ierr = PetscMalloc(((size_t) aij->nz)*(sizeof(int)+sizeof(PetscScalar))+(mat->m+1)*sizeof(int),&aij->a);CHKERRQ(ierr); 63a1d52234SKris Buschelman aij->j = (int*)(aij->a + aij->nz); 64a1d52234SKris Buschelman aij->i = aij->j + aij->nz; 65a1d52234SKris Buschelman aij->singlemalloc = PETSC_TRUE; 66a1d52234SKris Buschelman aij->freedata = PETSC_TRUE; 67a1d52234SKris Buschelman 68a1d52234SKris Buschelman ierr = PetscMemcpy(aij->a,mxGetPr(mmat),aij->nz*sizeof(PetscScalar));CHKERRQ(ierr); 69a1d52234SKris Buschelman /* Matlab stores by column, not row so we pass in the transpose of the matrix */ 70a1d52234SKris Buschelman ierr = PetscMemcpy(aij->j,mxGetIr(mmat),aij->nz*sizeof(int));CHKERRQ(ierr); 71a1d52234SKris Buschelman ierr = PetscMemcpy(aij->i,mxGetJc(mmat),(mat->m+1)*sizeof(int));CHKERRQ(ierr); 72a1d52234SKris Buschelman 73a1d52234SKris Buschelman for (ii=0; ii<mat->m; ii++) { 74a1d52234SKris Buschelman aij->ilen[ii] = aij->imax[ii] = aij->i[ii+1] - aij->i[ii]; 75a1d52234SKris Buschelman } 76a1d52234SKris Buschelman 77a1d52234SKris Buschelman ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 78a1d52234SKris Buschelman ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 79a1d52234SKris Buschelman 80a1d52234SKris Buschelman PetscFunctionReturn(0); 81a1d52234SKris Buschelman } 82a1d52234SKris Buschelman EXTERN_C_END 83a1d52234SKris Buschelman 8405db81ecSKris Buschelman EXTERN_C_BEGIN 853b3e256bSKris Buschelman #undef __FUNCT__ 8605db81ecSKris Buschelman #define __FUNCT__ "MatConvert_Matlab_SeqAIJ" 8705db81ecSKris Buschelman int MatConvert_Matlab_SeqAIJ(Mat A,const MatType type,Mat *newmat) { 8805db81ecSKris Buschelman int ierr; 8905db81ecSKris Buschelman Mat B=*newmat; 9005db81ecSKris Buschelman Mat_Matlab *lu=(Mat_Matlab*)A->spptr; 9105db81ecSKris Buschelman 9205db81ecSKris Buschelman PetscFunctionBegin; 9305db81ecSKris Buschelman if (B != A) { 9405db81ecSKris Buschelman ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr); 9505db81ecSKris Buschelman } 9605db81ecSKris Buschelman A->ops->duplicate = lu->MatDuplicate; 9705db81ecSKris Buschelman A->ops->view = lu->MatView; 9805db81ecSKris Buschelman A->ops->lufactorsymbolic = lu->MatLUFactorSymbolic; 9905db81ecSKris Buschelman A->ops->iludtfactor = lu->MatILUDTFactor; 10005db81ecSKris Buschelman A->ops->destroy = lu->MatDestroy; 10105db81ecSKris Buschelman 10205db81ecSKris Buschelman ierr = PetscFree(lu);CHKERRQ(ierr); 10305db81ecSKris Buschelman ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQAIJ);CHKERRQ(ierr); 10405db81ecSKris Buschelman *newmat = B; 10505db81ecSKris Buschelman PetscFunctionReturn(0); 10605db81ecSKris Buschelman } 10705db81ecSKris Buschelman EXTERN_C_END 10805db81ecSKris Buschelman 10905db81ecSKris Buschelman #undef __FUNCT__ 11005db81ecSKris Buschelman #define __FUNCT__ "MatDestroy_Matlab" 11105db81ecSKris Buschelman int MatDestroy_Matlab(Mat A) { 11205db81ecSKris Buschelman int ierr; 11305db81ecSKris Buschelman 11405db81ecSKris Buschelman PetscFunctionBegin; 11505db81ecSKris Buschelman ierr = MatConvert_Matlab_SeqAIJ(A,MATSEQAIJ,&A);CHKERRQ(ierr); 11605db81ecSKris Buschelman ierr = (*A->ops->destroy)(A);CHKERRQ(ierr); 11705db81ecSKris Buschelman PetscFunctionReturn(0); 11805db81ecSKris Buschelman } 11905db81ecSKris Buschelman 12005db81ecSKris Buschelman #undef __FUNCT__ 12105db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab" 12205db81ecSKris Buschelman int MatSolve_Matlab(Mat A,Vec b,Vec x) 1233b3e256bSKris Buschelman { 1243b3e256bSKris Buschelman int ierr; 1253b3e256bSKris Buschelman char *_A,*_b,*_x; 1263b3e256bSKris Buschelman 1273b3e256bSKris Buschelman PetscFunctionBegin; 1283b3e256bSKris Buschelman /* make sure objects have names; use default if not */ 1293b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr); 1303b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr); 1313b3e256bSKris Buschelman 1323b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr); 1333b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr); 1343b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr); 1353b3e256bSKris Buschelman ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr); 1363b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr); 1373b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr); 1383b3e256bSKris Buschelman /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr); */ 1393b3e256bSKris Buschelman ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr); 1403b3e256bSKris Buschelman PetscFunctionReturn(0); 1413b3e256bSKris Buschelman } 1423b3e256bSKris Buschelman 1433b3e256bSKris Buschelman #undef __FUNCT__ 14405db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab" 14505db81ecSKris Buschelman int MatLUFactorNumeric_Matlab(Mat A,Mat *F) 1463b3e256bSKris Buschelman { 1473b3e256bSKris Buschelman Mat_SeqAIJ *f = (Mat_SeqAIJ*)(*F)->data; 1483b3e256bSKris Buschelman int ierr,len; 1493b3e256bSKris Buschelman char *_A,*name; 1503b3e256bSKris Buschelman 1513b3e256bSKris Buschelman PetscFunctionBegin; 1523b3e256bSKris Buschelman ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr); 1533b3e256bSKris Buschelman _A = A->name; 1543b3e256bSKris 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); 1553b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_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__ 16505db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab" 16605db81ecSKris Buschelman int MatLUFactorSymbolic_Matlab(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F) 1673b3e256bSKris Buschelman { 1683b3e256bSKris Buschelman int ierr; 1693b3e256bSKris Buschelman Mat_SeqAIJ *f; 1703b3e256bSKris Buschelman 1713b3e256bSKris Buschelman PetscFunctionBegin; 1723b3e256bSKris Buschelman if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square"); 1733b3e256bSKris Buschelman ierr = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr); 1743b3e256bSKris Buschelman ierr = MatSetType(*F,A->type_name);CHKERRQ(ierr); 1753b3e256bSKris Buschelman ierr = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr); 17605db81ecSKris Buschelman (*F)->ops->solve = MatSolve_Matlab; 17705db81ecSKris Buschelman (*F)->ops->lufactornumeric = MatLUFactorNumeric_Matlab; 1783b3e256bSKris Buschelman (*F)->factor = FACTOR_LU; 1793b3e256bSKris Buschelman f = (Mat_SeqAIJ*)(*F)->data; 1803b3e256bSKris Buschelman f->lu_dtcol = info->dtcol; 1813b3e256bSKris Buschelman PetscFunctionReturn(0); 1823b3e256bSKris Buschelman } 1833b3e256bSKris Buschelman 1843b3e256bSKris Buschelman /* ---------------------------------------------------------------------------------*/ 1853b3e256bSKris Buschelman #undef __FUNCT__ 18605db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab_QR" 18705db81ecSKris Buschelman int MatSolve_Matlab_QR(Mat A,Vec b,Vec x) 1883b3e256bSKris Buschelman { 1893b3e256bSKris Buschelman int ierr; 1903b3e256bSKris Buschelman char *_A,*_b,*_x; 1913b3e256bSKris Buschelman 1923b3e256bSKris Buschelman PetscFunctionBegin; 1933b3e256bSKris Buschelman /* make sure objects have names; use default if not */ 1943b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)b);CHKERRQ(ierr); 1953b3e256bSKris Buschelman ierr = PetscObjectName((PetscObject)x);CHKERRQ(ierr); 1963b3e256bSKris Buschelman 1973b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr); 1983b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)b,&_b);CHKERRQ(ierr); 1993b3e256bSKris Buschelman ierr = PetscObjectGetName((PetscObject)x,&_x);CHKERRQ(ierr); 2003b3e256bSKris Buschelman ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)b);CHKERRQ(ierr); 2013b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = r%s\\(r%s'\\(%s*%s));",_x,_A,_A,_A+1,_b);CHKERRQ(ierr); 2023b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_b);CHKERRQ(ierr); 2033b3e256bSKris Buschelman /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(A->comm),stdout);CHKERRQ(ierr); */ 2043b3e256bSKris Buschelman ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)x);CHKERRQ(ierr); 2053b3e256bSKris Buschelman PetscFunctionReturn(0); 2063b3e256bSKris Buschelman } 2073b3e256bSKris Buschelman 2083b3e256bSKris Buschelman #undef __FUNCT__ 20905db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab_QR" 21005db81ecSKris Buschelman int MatLUFactorNumeric_Matlab_QR(Mat A,Mat *F) 2113b3e256bSKris Buschelman { 2123b3e256bSKris Buschelman int ierr,len; 2133b3e256bSKris Buschelman char *_A,*name; 2143b3e256bSKris Buschelman 2153b3e256bSKris Buschelman PetscFunctionBegin; 2163b3e256bSKris Buschelman ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr); 2173b3e256bSKris Buschelman _A = A->name; 2183b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"r_%s = qr(%s');",_A,_A);CHKERRQ(ierr); 2193b3e256bSKris Buschelman ierr = PetscStrlen(_A,&len);CHKERRQ(ierr); 2203b3e256bSKris Buschelman ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr); 2213b3e256bSKris Buschelman sprintf(name,"_%s",_A); 2223b3e256bSKris Buschelman ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr); 2233b3e256bSKris Buschelman ierr = PetscFree(name);CHKERRQ(ierr); 2243b3e256bSKris Buschelman PetscFunctionReturn(0); 2253b3e256bSKris Buschelman } 2263b3e256bSKris Buschelman 2273b3e256bSKris Buschelman #undef __FUNCT__ 22805db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab_QR" 22905db81ecSKris Buschelman int MatLUFactorSymbolic_Matlab_QR(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F) 2303b3e256bSKris Buschelman { 2313b3e256bSKris Buschelman int ierr; 2323b3e256bSKris Buschelman 2333b3e256bSKris Buschelman PetscFunctionBegin; 2343b3e256bSKris Buschelman if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square"); 2353b3e256bSKris Buschelman ierr = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr); 2363b3e256bSKris Buschelman ierr = MatSetType(*F,A->type_name);CHKERRQ(ierr); 2373b3e256bSKris Buschelman ierr = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr); 23805db81ecSKris Buschelman (*F)->ops->solve = MatSolve_Matlab_QR; 23905db81ecSKris Buschelman (*F)->ops->lufactornumeric = MatLUFactorNumeric_Matlab_QR; 2403b3e256bSKris Buschelman (*F)->factor = FACTOR_LU; 2413b3e256bSKris Buschelman (*F)->assembled = PETSC_TRUE; /* required by -ksp_view */ 2423b3e256bSKris Buschelman 2433b3e256bSKris Buschelman PetscFunctionReturn(0); 2443b3e256bSKris Buschelman } 2453b3e256bSKris Buschelman 2463b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/ 2473b3e256bSKris Buschelman #undef __FUNCT__ 24805db81ecSKris Buschelman #define __FUNCT__ "MatILUDTFactor_Matlab" 24905db81ecSKris Buschelman int MatILUDTFactor_Matlab(Mat A,MatFactorInfo *info,IS isrow,IS iscol,Mat *F) 2503b3e256bSKris Buschelman { 2513b3e256bSKris Buschelman int ierr,len; 2523b3e256bSKris Buschelman char *_A,*name; 2533b3e256bSKris Buschelman 2543b3e256bSKris Buschelman PetscFunctionBegin; 2553b3e256bSKris Buschelman if (info->dt == PETSC_DEFAULT) info->dt = .005; 2563b3e256bSKris Buschelman if (info->dtcol == PETSC_DEFAULT) info->dtcol = .01; 2573b3e256bSKris Buschelman if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square"); 2583b3e256bSKris Buschelman ierr = MatCreate(A->comm,A->m,A->n,A->m,A->n,F);CHKERRQ(ierr); 2593b3e256bSKris Buschelman ierr = MatSetType(*F,A->type_name);CHKERRQ(ierr); 2603b3e256bSKris Buschelman ierr = MatSeqAIJSetPreallocation(*F,0,PETSC_NULL);CHKERRQ(ierr); 261*f365a357SKris Buschelman (*F)->ops->solve = MatSolve_Matlab; 2623b3e256bSKris Buschelman (*F)->factor = FACTOR_LU; 2633b3e256bSKris Buschelman ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(A->comm),(PetscObject)A);CHKERRQ(ierr); 2643b3e256bSKris Buschelman _A = A->name; 2653b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,info->dtcol);CHKERRQ(ierr); 2663b3e256bSKris 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); 2673b3e256bSKris Buschelman ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(A->comm),"%s = 0;",_A);CHKERRQ(ierr); 2683b3e256bSKris Buschelman 2693b3e256bSKris Buschelman ierr = PetscStrlen(_A,&len);CHKERRQ(ierr); 2703b3e256bSKris Buschelman ierr = PetscMalloc((len+2)*sizeof(char),&name);CHKERRQ(ierr); 2713b3e256bSKris Buschelman sprintf(name,"_%s",_A); 2723b3e256bSKris Buschelman ierr = PetscObjectSetName((PetscObject)*F,name);CHKERRQ(ierr); 2733b3e256bSKris Buschelman ierr = PetscFree(name);CHKERRQ(ierr); 2743b3e256bSKris Buschelman PetscFunctionReturn(0); 2753b3e256bSKris Buschelman } 2763b3e256bSKris Buschelman 27705db81ecSKris Buschelman #undef __FUNCT__ 27805db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab" 27905db81ecSKris Buschelman int MatFactorInfo_Matlab(Mat A,PetscViewer viewer) 2803b3e256bSKris Buschelman { 2813b3e256bSKris Buschelman int ierr; 2823b3e256bSKris Buschelman 2833b3e256bSKris Buschelman PetscFunctionBegin; 2843b3e256bSKris Buschelman ierr = PetscViewerASCIIPrintf(viewer,"Matlab run parameters: -- not written yet!\n");CHKERRQ(ierr); 2853b3e256bSKris Buschelman PetscFunctionReturn(0); 2863b3e256bSKris Buschelman } 2873b3e256bSKris Buschelman 2883b3e256bSKris Buschelman #undef __FUNCT__ 28905db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab" 29005db81ecSKris Buschelman int MatView_Matlab(Mat A,PetscViewer viewer) { 29105db81ecSKris Buschelman int ierr; 29205db81ecSKris Buschelman PetscTruth isascii; 29305db81ecSKris Buschelman PetscViewerFormat format; 29405db81ecSKris Buschelman Mat_Matlab *lu=(Mat_Matlab*)(A->spptr); 29505db81ecSKris Buschelman 29605db81ecSKris Buschelman PetscFunctionBegin; 29705db81ecSKris Buschelman ierr = (*lu->MatView)(A,viewer);CHKERRQ(ierr); 29805db81ecSKris Buschelman ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr); 29905db81ecSKris Buschelman if (isascii) { 30005db81ecSKris Buschelman ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 30105db81ecSKris Buschelman if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) { 30205db81ecSKris Buschelman ierr = MatFactorInfo_Matlab(A,viewer); 30305db81ecSKris Buschelman } 30405db81ecSKris Buschelman } 30505db81ecSKris Buschelman PetscFunctionReturn(0); 30605db81ecSKris Buschelman } 307*f365a357SKris Buschelman 308*f365a357SKris Buschelman #undef __FUNCT__ 309*f365a357SKris Buschelman #define __FUNCT__ "MatDuplicate_Matlab" 310*f365a357SKris Buschelman int MatDuplicate_Matlab(Mat A, MatDuplicateOption op, Mat *M) { 311*f365a357SKris Buschelman int ierr; 312*f365a357SKris Buschelman Mat_Matlab *lu=(Mat_Matlab*)A->spptr; 313*f365a357SKris Buschelman 314*f365a357SKris Buschelman PetscFunctionBegin; 315*f365a357SKris Buschelman ierr = (*lu->MatDuplicate)(A,op,M);CHKERRQ(ierr); 316*f365a357SKris Buschelman ierr = PetscMemcpy((*M)->spptr,lu,sizeof(Mat_Matlab));CHKERRQ(ierr); 317*f365a357SKris Buschelman PetscFunctionReturn(0); 318*f365a357SKris Buschelman } 319*f365a357SKris Buschelman 320*f365a357SKris Buschelman EXTERN_C_BEGIN 32105db81ecSKris Buschelman #undef __FUNCT__ 32205db81ecSKris Buschelman #define __FUNCT__ "MatConvert_SeqAIJ_Matlab" 32305db81ecSKris Buschelman int MatConvert_SeqAIJ_Matlab(Mat A,const MatType type,Mat *newmat) { 32405db81ecSKris Buschelman /* This routine is only called to convert to MATMATLAB */ 32505db81ecSKris Buschelman /* from MATSEQAIJ, so we will ignore 'MatType type'. */ 32605db81ecSKris Buschelman int ierr; 32705db81ecSKris Buschelman Mat B=*newmat; 32805db81ecSKris Buschelman Mat_Matlab *lu; 3293b3e256bSKris Buschelman PetscTruth qr; 33005db81ecSKris Buschelman 33105db81ecSKris Buschelman PetscFunctionBegin; 33205db81ecSKris Buschelman if (B != A) { 33305db81ecSKris Buschelman ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr); 33405db81ecSKris Buschelman } 33505db81ecSKris Buschelman 33605db81ecSKris Buschelman ierr = PetscNew(Mat_Matlab,&lu);CHKERRQ(ierr); 33705db81ecSKris Buschelman lu->MatDuplicate = A->ops->duplicate; 33805db81ecSKris Buschelman lu->MatView = A->ops->view; 33905db81ecSKris Buschelman lu->MatLUFactorSymbolic = A->ops->lufactorsymbolic; 34005db81ecSKris Buschelman lu->MatILUDTFactor = A->ops->iludtfactor; 34105db81ecSKris Buschelman lu->MatDestroy = A->ops->destroy; 34205db81ecSKris Buschelman 34305db81ecSKris Buschelman B->spptr = (void*)lu; 34405db81ecSKris Buschelman B->ops->duplicate = MatDuplicate_Matlab; 34505db81ecSKris Buschelman B->ops->view = MatView_Matlab; 34605db81ecSKris Buschelman B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab; 34705db81ecSKris Buschelman B->ops->iludtfactor = MatILUDTFactor_Matlab; 34805db81ecSKris Buschelman B->ops->destroy = MatDestroy_Matlab; 34905db81ecSKris Buschelman 35005db81ecSKris Buschelman ierr = PetscOptionsHasName(A->prefix,"-mat_matlab_qr",&qr);CHKERRQ(ierr); 35105db81ecSKris Buschelman if (qr) { 35205db81ecSKris Buschelman B->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab_QR; 35305db81ecSKris Buschelman PetscLogInfo(0,"Using Matlab QR with iterative refinement for LU factorization and solves"); 35405db81ecSKris Buschelman } else { 35505db81ecSKris Buschelman PetscLogInfo(0,"Using Matlab for LU factorizations and solves."); 35605db81ecSKris Buschelman } 35705db81ecSKris Buschelman PetscLogInfo(0,"Using Matlab for ILUDT factorizations and solves."); 35805db81ecSKris Buschelman 35905db81ecSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_matlab_C", 36005db81ecSKris Buschelman "MatConvert_SeqAIJ_Matlab",MatConvert_SeqAIJ_Matlab);CHKERRQ(ierr); 36105db81ecSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_matlab_seqaij_C", 36205db81ecSKris Buschelman "MatConvert_Matlab_SeqAIJ",MatConvert_Matlab_SeqAIJ);CHKERRQ(ierr); 363a1d52234SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"PetscMatlabEnginePut_C", 364a1d52234SKris Buschelman "MatMatlabEnginePut_Matlab",MatMatlabEnginePut_Matlab);CHKERRQ(ierr); 365a1d52234SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"PetscMatlabEngineGet_C", 366a1d52234SKris Buschelman "MatMatlabEngineGet_Matlab",MatMatlabEngineGet_Matlab);CHKERRQ(ierr); 36705db81ecSKris Buschelman ierr = PetscObjectChangeTypeName((PetscObject)B,MATMATLAB);CHKERRQ(ierr); 36805db81ecSKris Buschelman *newmat = B; 36905db81ecSKris Buschelman PetscFunctionReturn(0); 37005db81ecSKris Buschelman } 37105db81ecSKris Buschelman EXTERN_C_END 37205db81ecSKris Buschelman 37305db81ecSKris Buschelman /*MC 37405db81ecSKris Buschelman MATMATLAB - MATMATLAB = "matlab" - A matrix type providing direct solvers (LU and QR) and drop tolerance 37505db81ecSKris Buschelman based ILU factorization (ILUDT) for sequential matrices via the external package Matlab. 37605db81ecSKris Buschelman 37705db81ecSKris Buschelman If Matlab is instaled (see the manual for 37805db81ecSKris Buschelman instructions on how to declare the existence of external packages), 37905db81ecSKris Buschelman a matrix type can be constructed which invokes Matlab solvers. 38005db81ecSKris Buschelman After calling MatCreate(...,A), simply call MatSetType(A,MATMATLAB). 38105db81ecSKris Buschelman This matrix type is only supported for double precision real. 38205db81ecSKris Buschelman 38305db81ecSKris Buschelman This matrix inherits from MATSEQAIJ. As a result, MatSeqAIJSetPreallocation is 38405db81ecSKris Buschelman supported for this matrix type. One can also call MatConvert for an inplace conversion to or from 38505db81ecSKris Buschelman the MATSEQAIJ type without data copy. 38605db81ecSKris Buschelman 38705db81ecSKris Buschelman Options Database Keys: 38805db81ecSKris Buschelman + -mat_type matlab - sets the matrix type to "matlab" during a call to MatSetFromOptions() 38905db81ecSKris Buschelman - -mat_matlab_qr - sets the direct solver to be QR instead of LU 39005db81ecSKris Buschelman 39105db81ecSKris Buschelman Level: beginner 39205db81ecSKris Buschelman 39305db81ecSKris Buschelman .seealso: PCLU 39405db81ecSKris Buschelman M*/ 39505db81ecSKris Buschelman 39605db81ecSKris Buschelman EXTERN_C_BEGIN 39705db81ecSKris Buschelman #undef __FUNCT__ 39805db81ecSKris Buschelman #define __FUNCT__ "MatCreate_Matlab" 39905db81ecSKris Buschelman int MarCreate_Matlab(Mat A) { 4003b3e256bSKris Buschelman int ierr; 4013b3e256bSKris Buschelman 4023b3e256bSKris Buschelman PetscFunctionBegin; 40305db81ecSKris Buschelman ierr = PetscObjectChangeTypeName((PetscObject)A,MATMATLAB);CHKERRQ(ierr); 40405db81ecSKris Buschelman ierr = MatSetType(A,MATSEQAIJ);CHKERRQ(ierr); 40505db81ecSKris Buschelman ierr = MatConvert_SeqAIJ_Matlab(A,MATMATLAB,&A);CHKERRQ(ierr); 4063b3e256bSKris Buschelman PetscFunctionReturn(0); 4073b3e256bSKris Buschelman } 40805db81ecSKris Buschelman EXTERN_C_END 409