1be1d678aSKris Buschelman 23b3e256bSKris Buschelman /* 3e3c5b3baSBarry Smith Provides an interface for the MATLAB engine sparse solver 43b3e256bSKris Buschelman 53b3e256bSKris Buschelman */ 6c6db04a5SJed Brown #include <../src/mat/impls/aij/seq/aij.h> 782c86c8fSBarry Smith #include <petscmatlab.h> 8c6db04a5SJed Brown #include <engine.h> /* MATLAB include file */ 9c6db04a5SJed Brown #include <mex.h> /* MATLAB include file */ 103b3e256bSKris Buschelman 11aeeaa5c7SBarry Smith #undef __FUNCT__ 12aeeaa5c7SBarry Smith #define __FUNCT__ "MatSeqAIJToMatlab" 138cc058d9SJed Brown PETSC_EXTERN mxArray *MatSeqAIJToMatlab(Mat B) 14aeeaa5c7SBarry Smith { 15aeeaa5c7SBarry Smith PetscErrorCode ierr; 16aeeaa5c7SBarry Smith Mat_SeqAIJ *aij = (Mat_SeqAIJ*)B->data; 17c088a8dcSBarry Smith mwIndex *ii,*jj; 18aeeaa5c7SBarry Smith mxArray *mat; 19c088a8dcSBarry Smith PetscInt i; 20aeeaa5c7SBarry Smith 21aeeaa5c7SBarry Smith PetscFunctionBegin; 22aeeaa5c7SBarry Smith mat = mxCreateSparse(B->cmap->n,B->rmap->n,aij->nz,mxREAL); 237afc1a8bSJed Brown ierr = PetscMemcpy(mxGetPr(mat),aij->a,aij->nz*sizeof(PetscScalar));if (ierr) return NULL; 24e3c5b3baSBarry Smith /* MATLAB stores by column, not row so we pass in the transpose of the matrix */ 25aeeaa5c7SBarry Smith jj = mxGetIr(mat); 26aeeaa5c7SBarry Smith for (i=0; i<aij->nz; i++) jj[i] = aij->j[i]; 27aeeaa5c7SBarry Smith ii = mxGetJc(mat); 28aeeaa5c7SBarry Smith for (i=0; i<B->rmap->n+1; i++) ii[i] = aij->i[i]; 29aeeaa5c7SBarry Smith PetscFunctionReturn(mat); 30aeeaa5c7SBarry Smith } 31aeeaa5c7SBarry Smith 32a1d52234SKris Buschelman #undef __FUNCT__ 33b3866ffcSBarry Smith #define __FUNCT__ "MatlabEnginePut_SeqAIJ" 348cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatlabEnginePut_SeqAIJ(PetscObject obj,void *mengine) 35a1d52234SKris Buschelman { 36dfbe8321SBarry Smith PetscErrorCode ierr; 37a1d52234SKris Buschelman mxArray *mat; 38a1d52234SKris Buschelman 39a1d52234SKris Buschelman PetscFunctionBegin; 40be6adb11SBarry Smith mat = MatSeqAIJToMatlab((Mat)obj);if (!mat) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Cannot create MATLAB matrix"); 41a1d52234SKris Buschelman ierr = PetscObjectName(obj);CHKERRQ(ierr); 42a1d52234SKris Buschelman engPutVariable((Engine*)mengine,obj->name,mat); 43a1d52234SKris Buschelman PetscFunctionReturn(0); 44a1d52234SKris Buschelman } 45a1d52234SKris Buschelman 46a1d52234SKris Buschelman #undef __FUNCT__ 47a7bb0f05SBarry Smith #define __FUNCT__ "MatSeqAIJFromMatlab" 4884c105d7SBarry Smith /*@C 49e3c5b3baSBarry Smith MatSeqAIJFromMatlab - Given a MATLAB sparse matrix, fills a SeqAIJ matrix with its transpose. 50a7bb0f05SBarry Smith 51a7bb0f05SBarry Smith Not Collective 52a7bb0f05SBarry Smith 53a7bb0f05SBarry Smith Input Parameters: 54e3c5b3baSBarry Smith + mmat - a MATLAB sparse matris 55579dbff0SBarry Smith - mat - an already created MATSEQAIJ 56a7bb0f05SBarry Smith 572bd2b0e6SSatish Balay Level: intermediate 582bd2b0e6SSatish Balay 59a7bb0f05SBarry Smith @*/ 608cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatSeqAIJFromMatlab(mxArray *mmat,Mat mat) 61a1d52234SKris Buschelman { 62dfbe8321SBarry Smith PetscErrorCode ierr; 63b3da158bSBarry Smith PetscInt nz,n,m,*i,*j,k; 64b3da158bSBarry Smith mwIndex nnz,nn,nm,*ii,*jj; 65a1d52234SKris Buschelman Mat_SeqAIJ *aij = (Mat_SeqAIJ*)mat->data; 66a1d52234SKris Buschelman 67a1d52234SKris Buschelman PetscFunctionBegin; 68b3da158bSBarry Smith nn = mxGetN(mmat); /* rows of transpose of matrix */ 69b3da158bSBarry Smith nm = mxGetM(mmat); 70b3da158bSBarry Smith nnz = (mxGetJc(mmat))[nn]; 71b3da158bSBarry Smith ii = mxGetJc(mmat); 72b3da158bSBarry Smith jj = mxGetIr(mmat); 73b3da158bSBarry Smith n = (PetscInt) nn; 74b3da158bSBarry Smith m = (PetscInt) nm; 75b3da158bSBarry Smith nz = (PetscInt) nnz; 76b3da158bSBarry Smith 77b3da158bSBarry Smith if (mat->rmap->n < 0 && mat->cmap->n < 0) { 78b3da158bSBarry Smith /* matrix has not yet had its size set */ 79b3da158bSBarry Smith ierr = MatSetSizes(mat,n,m,PETSC_DETERMINE,PETSC_DETERMINE);CHKERRQ(ierr); 804994cf47SJed Brown ierr = MatSetUp(mat);CHKERRQ(ierr); 81b3da158bSBarry Smith } else { 82b3da158bSBarry Smith if (mat->rmap->n != n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot change size of PETSc matrix %D to %D",mat->rmap->n,n); 83b3da158bSBarry Smith if (mat->cmap->n != m) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot change size of PETSc matrix %D to %D",mat->cmap->n,m); 84b3da158bSBarry Smith } 852eff7a51SBarry Smith if (nz != aij->nz) { 862eff7a51SBarry Smith /* number of nonzeros in matrix has changed, so need new data structure */ 871f03425eSSatish Balay ierr = MatSeqXAIJFreeAIJ(mat,&aij->a,&aij->j,&aij->i);CHKERRQ(ierr); 88b3da158bSBarry Smith aij->nz = nz; 89dcca6d9dSJed Brown ierr = PetscMalloc3(aij->nz,&aij->a,aij->nz,&aij->j,mat->rmap->n+1,&aij->i);CHKERRQ(ierr); 902205254eSKarl Rupp 91a1d52234SKris Buschelman aij->singlemalloc = PETSC_TRUE; 922eff7a51SBarry Smith } 93a1d52234SKris Buschelman 94a1d52234SKris Buschelman ierr = PetscMemcpy(aij->a,mxGetPr(mmat),aij->nz*sizeof(PetscScalar));CHKERRQ(ierr); 95e3c5b3baSBarry Smith /* MATLAB stores by column, not row so we pass in the transpose of the matrix */ 96b3da158bSBarry Smith i = aij->i; 972205254eSKarl Rupp for (k=0; k<n+1; k++) i[k] = (PetscInt) ii[k]; 98b3da158bSBarry Smith j = aij->j; 992205254eSKarl Rupp for (k=0; k<nz; k++) j[k] = (PetscInt) jj[k]; 100a1d52234SKris Buschelman 1012205254eSKarl Rupp for (k=0; k<mat->rmap->n; k++) aij->ilen[k] = aij->imax[k] = aij->i[k+1] - aij->i[k]; 102a1d52234SKris Buschelman 103a1d52234SKris Buschelman ierr = MatAssemblyBegin(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 104a1d52234SKris Buschelman ierr = MatAssemblyEnd(mat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 105a7bb0f05SBarry Smith PetscFunctionReturn(0); 106a7bb0f05SBarry Smith } 107a1d52234SKris Buschelman 108a7bb0f05SBarry Smith #undef __FUNCT__ 109a7bb0f05SBarry Smith #define __FUNCT__ "MatlabEngineGet_SeqAIJ" 11029b38603SBarry Smith PETSC_EXTERN PetscErrorCode MatlabEngineGet_SeqAIJ(PetscObject obj,void *mengine) 111a7bb0f05SBarry Smith { 112a7bb0f05SBarry Smith PetscErrorCode ierr; 113a7bb0f05SBarry Smith Mat mat = (Mat)obj; 114a7bb0f05SBarry Smith mxArray *mmat; 115a7bb0f05SBarry Smith 116a7bb0f05SBarry Smith PetscFunctionBegin; 117a7bb0f05SBarry Smith mmat = engGetVariable((Engine*)mengine,obj->name); 118a7bb0f05SBarry Smith ierr = MatSeqAIJFromMatlab(mmat,mat);CHKERRQ(ierr); 119a1d52234SKris Buschelman PetscFunctionReturn(0); 120a1d52234SKris Buschelman } 121a1d52234SKris Buschelman 12205db81ecSKris Buschelman #undef __FUNCT__ 12305db81ecSKris Buschelman #define __FUNCT__ "MatSolve_Matlab" 124dfbe8321SBarry Smith PetscErrorCode MatSolve_Matlab(Mat A,Vec b,Vec x) 1253b3e256bSKris Buschelman { 126dfbe8321SBarry Smith PetscErrorCode ierr; 127e060cb09SBarry Smith const 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); 137ce94432eSBarry Smith ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),(PetscObject)b);CHKERRQ(ierr); 138ce94432eSBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),"%s = u%s\\(l%s\\(p%s*%s));",_x,_A,_A,_A,_b);CHKERRQ(ierr); 139ce94432eSBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),"%s = 0;",_b);CHKERRQ(ierr); 140ce94432eSBarry Smith /* ierr = PetscMatlabEnginePrintOutput(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),stdout);CHKERRQ(ierr); */ 141ce94432eSBarry Smith ierr = PetscMatlabEngineGet(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),(PetscObject)x);CHKERRQ(ierr); 1423b3e256bSKris Buschelman PetscFunctionReturn(0); 1433b3e256bSKris Buschelman } 1443b3e256bSKris Buschelman 1453b3e256bSKris Buschelman #undef __FUNCT__ 14605db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Matlab" 1470481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Matlab(Mat F,Mat A,const MatFactorInfo *info) 1483b3e256bSKris Buschelman { 149dfbe8321SBarry Smith PetscErrorCode ierr; 150de4209c5SBarry Smith size_t len; 1513b3e256bSKris Buschelman char *_A,*name; 152b3866ffcSBarry Smith PetscReal dtcol = info->dtcol; 1533b3e256bSKris Buschelman 1543b3e256bSKris Buschelman PetscFunctionBegin; 155d5f3da31SBarry Smith if (F->factortype == MAT_FACTOR_ILU || info->dt > 0) { 156*9a5db2c3SBarry Smith /* the ILU form is not currently registered */ 157b3866ffcSBarry Smith if (info->dtcol == PETSC_DEFAULT) dtcol = .01; 158fe97e370SBarry Smith F->ops->solve = MatSolve_Matlab; 159d5f3da31SBarry Smith F->factortype = MAT_FACTOR_LU; 1602205254eSKarl Rupp 161ce94432eSBarry Smith ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),(PetscObject)A);CHKERRQ(ierr); 162fe97e370SBarry Smith _A = ((PetscObject)A)->name; 163ce94432eSBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),"info_%s = struct('droptol',%g,'thresh',%g);",_A,info->dt,dtcol);CHKERRQ(ierr); 164ce94432eSBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),"[l_%s,u_%s,p_%s] = luinc(%s',info_%s);",_A,_A,_A,_A,_A);CHKERRQ(ierr); 165ce94432eSBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),"%s = 0;",_A);CHKERRQ(ierr); 166fe97e370SBarry Smith 167fe97e370SBarry Smith ierr = PetscStrlen(_A,&len);CHKERRQ(ierr); 168854ce69bSBarry Smith ierr = PetscMalloc1(len+2,&name);CHKERRQ(ierr); 169fe97e370SBarry Smith sprintf(name,"_%s",_A); 170fe97e370SBarry Smith ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr); 171fe97e370SBarry Smith ierr = PetscFree(name);CHKERRQ(ierr); 172fe97e370SBarry Smith } else { 173ce94432eSBarry Smith ierr = PetscMatlabEnginePut(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),(PetscObject)A);CHKERRQ(ierr); 174f0523c5fSHong Zhang _A = ((PetscObject)A)->name; 175ce94432eSBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),"[l_%s,u_%s,p_%s] = lu(%s',%g);",_A,_A,_A,_A,dtcol);CHKERRQ(ierr); 176ce94432eSBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),"%s = 0;",_A);CHKERRQ(ierr); 1773b3e256bSKris Buschelman ierr = PetscStrlen(_A,&len);CHKERRQ(ierr); 178854ce69bSBarry Smith ierr = PetscMalloc1(len+2,&name);CHKERRQ(ierr); 1793b3e256bSKris Buschelman sprintf(name,"_%s",_A); 180f0523c5fSHong Zhang ierr = PetscObjectSetName((PetscObject)F,name);CHKERRQ(ierr); 1813b3e256bSKris Buschelman ierr = PetscFree(name);CHKERRQ(ierr); 1822205254eSKarl Rupp 183f0523c5fSHong Zhang F->ops->solve = MatSolve_Matlab; 184fe97e370SBarry Smith } 1853b3e256bSKris Buschelman PetscFunctionReturn(0); 1863b3e256bSKris Buschelman } 1873b3e256bSKris Buschelman 1883b3e256bSKris Buschelman #undef __FUNCT__ 18905db81ecSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Matlab" 1900481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Matlab(Mat F,Mat A,IS r,IS c,const MatFactorInfo *info) 1913b3e256bSKris Buschelman { 1923b3e256bSKris Buschelman PetscFunctionBegin; 193e32f2f54SBarry Smith if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); 194f0523c5fSHong Zhang F->ops->lufactornumeric = MatLUFactorNumeric_Matlab; 195b3866ffcSBarry Smith F->assembled = PETSC_TRUE; 1963b3e256bSKris Buschelman PetscFunctionReturn(0); 1973b3e256bSKris Buschelman } 1983b3e256bSKris Buschelman 19935bd34faSBarry Smith #undef __FUNCT__ 20035bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_seqaij_matlab" 20135bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_seqaij_matlab(Mat A,const MatSolverPackage *type) 20235bd34faSBarry Smith { 20335bd34faSBarry Smith PetscFunctionBegin; 2042692d6eeSBarry Smith *type = MATSOLVERMATLAB; 20535bd34faSBarry Smith PetscFunctionReturn(0); 20635bd34faSBarry Smith } 20735bd34faSBarry Smith 2083b3e256bSKris Buschelman #undef __FUNCT__ 209*9a5db2c3SBarry Smith #define __FUNCT__ "MatDestroy_matlab" 210*9a5db2c3SBarry Smith PetscErrorCode MatDestroy_matlab(Mat A) 211*9a5db2c3SBarry Smith { 212*9a5db2c3SBarry Smith PetscErrorCode ierr; 213*9a5db2c3SBarry Smith const char *_A; 214*9a5db2c3SBarry Smith 215*9a5db2c3SBarry Smith PetscFunctionBegin; 216*9a5db2c3SBarry Smith ierr = PetscObjectGetName((PetscObject)A,&_A);CHKERRQ(ierr); 217*9a5db2c3SBarry Smith ierr = PetscMatlabEngineEvaluate(PETSC_MATLAB_ENGINE_(PetscObjectComm((PetscObject)A)),"delete %s l_%s u_%s;",_A,_A,_A);CHKERRQ(ierr); 218*9a5db2c3SBarry Smith PetscFunctionReturn(0); 219*9a5db2c3SBarry Smith } 220*9a5db2c3SBarry Smith 221*9a5db2c3SBarry Smith #undef __FUNCT__ 222b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_matlab" 2238cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqaij_matlab(Mat A,MatFactorType ftype,Mat *F) 2243b3e256bSKris Buschelman { 225dfbe8321SBarry Smith PetscErrorCode ierr; 2263b3e256bSKris Buschelman 2273b3e256bSKris Buschelman PetscFunctionBegin; 228e32f2f54SBarry Smith if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); 229ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),F);CHKERRQ(ierr); 230f0523c5fSHong Zhang ierr = MatSetSizes(*F,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 231*9a5db2c3SBarry Smith ierr = PetscStrallocpy("matlab",&((PetscObject)*F)->type_name);CHKERRQ(ierr); 232*9a5db2c3SBarry Smith ierr = MatSetUp(*F);CHKERRQ(ierr); 233*9a5db2c3SBarry Smith 234*9a5db2c3SBarry Smith (*F)->ops->destroy = MatDestroy_matlab; 235*9a5db2c3SBarry Smith (*F)->ops->getinfo = MatGetInfo_External; 236b24902e0SBarry Smith (*F)->ops->lufactorsymbolic = MatLUFactorSymbolic_Matlab; 237b3866ffcSBarry Smith (*F)->ops->ilufactorsymbolic = MatLUFactorSymbolic_Matlab; 2382205254eSKarl Rupp 239bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)(*F),"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_seqaij_matlab);CHKERRQ(ierr); 240f0523c5fSHong Zhang 241d5f3da31SBarry Smith (*F)->factortype = ftype; 24200c67f3bSHong Zhang ierr = PetscFree((*F)->solvertype);CHKERRQ(ierr); 24300c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERMATLAB,&(*F)->solvertype);CHKERRQ(ierr); 2443b3e256bSKris Buschelman PetscFunctionReturn(0); 2453b3e256bSKris Buschelman } 246b24902e0SBarry Smith 24742c9c57cSBarry Smith 24842c9c57cSBarry Smith #undef __FUNCT__ 24942c9c57cSBarry Smith #define __FUNCT__ "MatSolverPackageRegister_Matlab" 25029b38603SBarry Smith PETSC_EXTERN PetscErrorCode MatSolverPackageRegister_Matlab(void) 25142c9c57cSBarry Smith { 25242c9c57cSBarry Smith PetscErrorCode ierr; 25342c9c57cSBarry Smith 25442c9c57cSBarry Smith PetscFunctionBegin; 25542c9c57cSBarry Smith ierr = MatSolverPackageRegister(MATSOLVERMATLAB,MATSEQAIJ, MAT_FACTOR_LU,MatGetFactor_seqaij_matlab);CHKERRQ(ierr); 25642c9c57cSBarry Smith PetscFunctionReturn(0); 25742c9c57cSBarry Smith } 25842c9c57cSBarry Smith 2593b3e256bSKris Buschelman /* --------------------------------------------------------------------------------*/ 2603b3e256bSKris Buschelman 26105db81ecSKris Buschelman #undef __FUNCT__ 26205db81ecSKris Buschelman #define __FUNCT__ "MatFactorInfo_Matlab" 263dfbe8321SBarry Smith PetscErrorCode MatFactorInfo_Matlab(Mat A,PetscViewer viewer) 2643b3e256bSKris Buschelman { 265dfbe8321SBarry Smith PetscErrorCode ierr; 2663b3e256bSKris Buschelman 2673b3e256bSKris Buschelman PetscFunctionBegin; 268e3c5b3baSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"MATLAB run parameters: -- not written yet!\n");CHKERRQ(ierr); 2693b3e256bSKris Buschelman PetscFunctionReturn(0); 2703b3e256bSKris Buschelman } 2713b3e256bSKris Buschelman 2723b3e256bSKris Buschelman #undef __FUNCT__ 27305db81ecSKris Buschelman #define __FUNCT__ "MatView_Matlab" 274b2d3331aSBarry Smith PetscErrorCode MatView_Matlab(Mat A,PetscViewer viewer) 275b2d3331aSBarry Smith { 276dfbe8321SBarry Smith PetscErrorCode ierr; 277ace3abfcSBarry Smith PetscBool iascii; 27805db81ecSKris Buschelman PetscViewerFormat format; 27905db81ecSKris Buschelman 28005db81ecSKris Buschelman PetscFunctionBegin; 281b24902e0SBarry Smith ierr = MatView_SeqAIJ(A,viewer);CHKERRQ(ierr); 282251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 28332077d6dSBarry Smith if (iascii) { 28405db81ecSKris Buschelman ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 28505db81ecSKris Buschelman if (format == PETSC_VIEWER_ASCII_FACTOR_INFO) { 28605db81ecSKris Buschelman ierr = MatFactorInfo_Matlab(A,viewer); 28705db81ecSKris Buschelman } 28805db81ecSKris Buschelman } 28905db81ecSKris Buschelman PetscFunctionReturn(0); 29005db81ecSKris Buschelman } 291f365a357SKris Buschelman 29205db81ecSKris Buschelman 29305db81ecSKris Buschelman /*MC 294*9a5db2c3SBarry Smith MATSOLVERMATLAB - "matlab" - Providing direct solver LU for sequential aij matrix via the external package MATLAB. 29505db81ecSKris Buschelman 29605db81ecSKris Buschelman 29741c8de11SBarry Smith Works with MATSEQAIJ matrices. 29805db81ecSKris Buschelman 29905db81ecSKris Buschelman Options Database Keys: 300c7918f76SSatish Balay . -pc_factor_mat_solver_package matlab - selects MATLAB to do the sparse factorization 30141c8de11SBarry Smith 302*9a5db2c3SBarry Smith Notes: You must ./configure with the options --with-matlab --with-matlab-engine 30305db81ecSKris Buschelman 30405db81ecSKris Buschelman Level: beginner 30505db81ecSKris Buschelman 30605db81ecSKris Buschelman .seealso: PCLU 30741c8de11SBarry Smith 30841c8de11SBarry Smith .seealso: PCFactorSetMatSolverPackage(), MatSolverPackage 30905db81ecSKris Buschelman M*/ 31005db81ecSKris Buschelman 311