1be1d678aSKris Buschelman #define PETSCMAT_DLL 2e8aa55a4SKris Buschelman 3e8aa55a4SKris Buschelman /* 4e8aa55a4SKris Buschelman Provides an interface to the IBM RS6000 Essl sparse solver 5e8aa55a4SKris Buschelman 6e8aa55a4SKris Buschelman */ 77c4f633dSBarry Smith #include "../src/mat/impls/aij/seq/aij.h" 8b24902e0SBarry Smith 9e8aa55a4SKris Buschelman /* #include <essl.h> This doesn't work! */ 10e8aa55a4SKris Buschelman 11d3bad8c4SBarry Smith EXTERN_C_BEGIN 12d3bad8c4SBarry Smith void dgss(int*,int*,double*,int*,int*,int*,double*,double*,int*); 13d3bad8c4SBarry Smith void dgsf(int*,int*,int*,double*,int*,int*,int*,int*,double*,double*,double*,int*); 14d3bad8c4SBarry Smith EXTERN_C_END 15d3bad8c4SBarry Smith 16e8aa55a4SKris Buschelman typedef struct { 17e8aa55a4SKris Buschelman int n,nz; 18e8aa55a4SKris Buschelman PetscScalar *a; 19e8aa55a4SKris Buschelman int *ia; 20e8aa55a4SKris Buschelman int *ja; 21e8aa55a4SKris Buschelman int lna; 22e8aa55a4SKris Buschelman int iparm[5]; 23e8aa55a4SKris Buschelman PetscReal rparm[5]; 24e8aa55a4SKris Buschelman PetscReal oparm[5]; 25e8aa55a4SKris Buschelman PetscScalar *aux; 26e8aa55a4SKris Buschelman int naux; 27e8aa55a4SKris Buschelman 282f71e704SKris Buschelman PetscTruth CleanUpESSL; 29f0c56d0fSKris Buschelman } Mat_Essl; 30f0c56d0fSKris Buschelman 31e8aa55a4SKris Buschelman #undef __FUNCT__ 32f0c56d0fSKris Buschelman #define __FUNCT__ "MatDestroy_Essl" 33dfbe8321SBarry Smith PetscErrorCode MatDestroy_Essl(Mat A) 34dfbe8321SBarry Smith { 35dfbe8321SBarry Smith PetscErrorCode ierr; 36f0c56d0fSKris Buschelman Mat_Essl *essl=(Mat_Essl*)A->spptr; 37e8aa55a4SKris Buschelman 38e8aa55a4SKris Buschelman PetscFunctionBegin; 392f71e704SKris Buschelman if (essl->CleanUpESSL) { 4023bdbc58SBarry Smith ierr = PetscFree4(essl->a,essl->aux,essl->ia,essl->ja);CHKERRQ(ierr); 41e8aa55a4SKris Buschelman } 42b24902e0SBarry Smith ierr = PetscFree(essl);CHKERRQ(ierr); 43b24902e0SBarry Smith ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); 44460c4903SKris Buschelman PetscFunctionReturn(0); 45460c4903SKris Buschelman } 46460c4903SKris Buschelman 47460c4903SKris Buschelman #undef __FUNCT__ 48f0c56d0fSKris Buschelman #define __FUNCT__ "MatSolve_Essl" 49b24902e0SBarry Smith PetscErrorCode MatSolve_Essl(Mat A,Vec b,Vec x) 50b24902e0SBarry Smith { 51f0c56d0fSKris Buschelman Mat_Essl *essl = (Mat_Essl*)A->spptr; 52e8aa55a4SKris Buschelman PetscScalar *xx; 53dfbe8321SBarry Smith PetscErrorCode ierr; 54dfbe8321SBarry Smith int m,zero = 0; 55e8aa55a4SKris Buschelman 56e8aa55a4SKris Buschelman PetscFunctionBegin; 57e8aa55a4SKris Buschelman ierr = VecGetLocalSize(b,&m);CHKERRQ(ierr); 58e8aa55a4SKris Buschelman ierr = VecCopy(b,x);CHKERRQ(ierr); 59e8aa55a4SKris Buschelman ierr = VecGetArray(x,&xx);CHKERRQ(ierr); 60d0f46423SBarry Smith dgss(&zero,&A->cmap->n,essl->a,essl->ia,essl->ja,&essl->lna,xx,essl->aux,&essl->naux); 61e8aa55a4SKris Buschelman ierr = VecRestoreArray(x,&xx);CHKERRQ(ierr); 62e8aa55a4SKris Buschelman PetscFunctionReturn(0); 63e8aa55a4SKris Buschelman } 64e8aa55a4SKris Buschelman 65e8aa55a4SKris Buschelman #undef __FUNCT__ 66f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Essl" 670481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Essl(Mat F,Mat A,const MatFactorInfo *info) 68b24902e0SBarry Smith { 69e8aa55a4SKris Buschelman Mat_SeqAIJ *aa=(Mat_SeqAIJ*)(A)->data; 70719d5645SBarry Smith Mat_Essl *essl=(Mat_Essl*)(F)->spptr; 716849ba73SBarry Smith PetscErrorCode ierr; 726849ba73SBarry Smith int i,one = 1; 73e8aa55a4SKris Buschelman 74e8aa55a4SKris Buschelman PetscFunctionBegin; 75e8aa55a4SKris Buschelman /* copy matrix data into silly ESSL data structure (1-based Frotran style) */ 76d0f46423SBarry Smith for (i=0; i<A->rmap->n+1; i++) essl->ia[i] = aa->i[i] + 1; 77e8aa55a4SKris Buschelman for (i=0; i<aa->nz; i++) essl->ja[i] = aa->j[i] + 1; 78e8aa55a4SKris Buschelman 79e8aa55a4SKris Buschelman ierr = PetscMemcpy(essl->a,aa->a,(aa->nz)*sizeof(PetscScalar));CHKERRQ(ierr); 80e8aa55a4SKris Buschelman 81e8aa55a4SKris Buschelman /* set Essl options */ 82e8aa55a4SKris Buschelman essl->iparm[0] = 1; 83e8aa55a4SKris Buschelman essl->iparm[1] = 5; 84e8aa55a4SKris Buschelman essl->iparm[2] = 1; 85e8aa55a4SKris Buschelman essl->iparm[3] = 0; 86e8aa55a4SKris Buschelman essl->rparm[0] = 1.e-12; 8762331464SKris Buschelman essl->rparm[1] = 1.0; 887adad957SLisandro Dalcin ierr = PetscOptionsGetReal(((PetscObject)A)->prefix,"-matessl_lu_threshold",&essl->rparm[1],PETSC_NULL);CHKERRQ(ierr); 89e8aa55a4SKris Buschelman 90d0f46423SBarry Smith dgsf(&one,&A->rmap->n,&essl->nz,essl->a,essl->ia,essl->ja,&essl->lna,essl->iparm,essl->rparm,essl->oparm,essl->aux,&essl->naux); 91e8aa55a4SKris Buschelman 9235bd34faSBarry Smith F->ops->solve = MatSolve_Essl; 93719d5645SBarry Smith (F)->assembled = PETSC_TRUE; 94719d5645SBarry Smith (F)->preallocated = PETSC_TRUE; 95e8aa55a4SKris Buschelman PetscFunctionReturn(0); 96e8aa55a4SKris Buschelman } 97e8aa55a4SKris Buschelman 98b24902e0SBarry Smith 99719d5645SBarry Smith 100719d5645SBarry Smith 101e8aa55a4SKris Buschelman #undef __FUNCT__ 102f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Essl" 1030481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Essl(Mat B,Mat A,IS r,IS c,const MatFactorInfo *info) 104b24902e0SBarry Smith { 105eef49c96SKris Buschelman Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 106dfbe8321SBarry Smith PetscErrorCode ierr; 107f0c56d0fSKris Buschelman Mat_Essl *essl; 108e8aa55a4SKris Buschelman PetscReal f = 1.0; 109e8aa55a4SKris Buschelman 110e8aa55a4SKris Buschelman PetscFunctionBegin; 111f0c56d0fSKris Buschelman essl = (Mat_Essl *)(B->spptr); 112e8aa55a4SKris Buschelman 113e8aa55a4SKris Buschelman /* allocate the work arrays required by ESSL */ 114e8aa55a4SKris Buschelman f = info->fill; 115e8aa55a4SKris Buschelman essl->nz = a->nz; 116e8aa55a4SKris Buschelman essl->lna = (int)a->nz*f; 117d0f46423SBarry Smith essl->naux = 100 + 10*A->rmap->n; 118e8aa55a4SKris Buschelman 119e8aa55a4SKris Buschelman /* since malloc is slow on IBM we try a single malloc */ 12023bdbc58SBarry Smith ierr = PetscMalloc4(essl->lna,PetscScalar,&essl->a,essl->naux,PetscScalar,&essl->aux,essl->lna,int,&essl->ia,essl->lna,int,&essl->ja);CHKERRQ(ierr); 1212f71e704SKris Buschelman essl->CleanUpESSL = PETSC_TRUE; 122e8aa55a4SKris Buschelman 123052f0c41SBarry Smith ierr = PetscLogObjectMemory(B,essl->lna*(2*sizeof(int)+sizeof(PetscScalar)) + essl->naux*sizeof(PetscScalar));CHKERRQ(ierr); 124db4efbfdSBarry Smith B->ops->lufactornumeric = MatLUFactorNumeric_Essl; 125e8aa55a4SKris Buschelman PetscFunctionReturn(0); 126e8aa55a4SKris Buschelman } 127e8aa55a4SKris Buschelman 12835bd34faSBarry Smith EXTERN_C_BEGIN 12935bd34faSBarry Smith #undef __FUNCT__ 13035bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_essl" 13135bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_essl(Mat A,const MatSolverPackage *type) 13235bd34faSBarry Smith { 13335bd34faSBarry Smith PetscFunctionBegin; 13435bd34faSBarry Smith *type = MAT_SOLVER_ESSL; 13535bd34faSBarry Smith PetscFunctionReturn(0); 13635bd34faSBarry Smith } 137719d5645SBarry Smith 1382f71e704SKris Buschelman /*MC 13941c8de11SBarry Smith MAT_SOLVER_ESSL - "essl" - Provides direct solvers (LU) for sequential matrices 1402f71e704SKris Buschelman via the external package ESSL. 1412f71e704SKris Buschelman 1422f71e704SKris Buschelman If ESSL is installed (see the manual for 1432f71e704SKris Buschelman instructions on how to declare the existence of external packages), 1442f71e704SKris Buschelman 14541c8de11SBarry Smith Works with MATSEQAIJ matrices 1462f71e704SKris Buschelman 1472f71e704SKris Buschelman Level: beginner 1482f71e704SKris Buschelman 14941c8de11SBarry Smith .seealso: PCLU, PCFactorSetMatSolverPackage(), MatSolverPackage 1502f71e704SKris Buschelman M*/ 1512f71e704SKris Buschelman 152e8aa55a4SKris Buschelman #undef __FUNCT__ 153b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_essl" 1545c9eb25fSBarry Smith PetscErrorCode MatGetFactor_seqaij_essl(Mat A,MatFactorType ftype,Mat *F) 155dfbe8321SBarry Smith { 156b24902e0SBarry Smith Mat B; 157dfbe8321SBarry Smith PetscErrorCode ierr; 158b24902e0SBarry Smith Mat_Essl *essl; 159e8aa55a4SKris Buschelman 160e8aa55a4SKris Buschelman PetscFunctionBegin; 161*e32f2f54SBarry Smith if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); 162b24902e0SBarry Smith ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 163d0f46423SBarry Smith ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 164b24902e0SBarry Smith ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 165b24902e0SBarry Smith ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 166b24902e0SBarry Smith 167b24902e0SBarry Smith ierr = PetscNewLog(B,Mat_Essl,&essl);CHKERRQ(ierr); 168b24902e0SBarry Smith B->spptr = essl; 169b24902e0SBarry Smith B->ops->lufactorsymbolic = MatLUFactorSymbolic_Essl; 17035bd34faSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_essl",MatFactorGetSolverPackage_essl);CHKERRQ(ierr); 171d5f3da31SBarry Smith B->factortype = MAT_FACTOR_LU; 172b24902e0SBarry Smith *F = B; 173e8aa55a4SKris Buschelman PetscFunctionReturn(0); 174e8aa55a4SKris Buschelman } 175711adf46SSatish Balay EXTERN_C_END 176