1e8aa55a4SKris Buschelman 2e8aa55a4SKris Buschelman /* 3e8aa55a4SKris Buschelman Provides an interface to the IBM RS6000 Essl sparse solver 4e8aa55a4SKris Buschelman 5e8aa55a4SKris Buschelman */ 6c6db04a5SJed Brown #include <../src/mat/impls/aij/seq/aij.h> 7b24902e0SBarry Smith 8e8aa55a4SKris Buschelman /* #include <essl.h> This doesn't work! */ 9e8aa55a4SKris Buschelman 10d3bad8c4SBarry Smith EXTERN_C_BEGIN 11d3bad8c4SBarry Smith void dgss(int*,int*,double*,int*,int*,int*,double*,double*,int*); 12d3bad8c4SBarry Smith void dgsf(int*,int*,int*,double*,int*,int*,int*,int*,double*,double*,double*,int*); 13d3bad8c4SBarry Smith EXTERN_C_END 14d3bad8c4SBarry Smith 15e8aa55a4SKris Buschelman typedef struct { 16e8aa55a4SKris Buschelman int n,nz; 17e8aa55a4SKris Buschelman PetscScalar *a; 18e8aa55a4SKris Buschelman int *ia; 19e8aa55a4SKris Buschelman int *ja; 20e8aa55a4SKris Buschelman int lna; 21e8aa55a4SKris Buschelman int iparm[5]; 22e8aa55a4SKris Buschelman PetscReal rparm[5]; 23e8aa55a4SKris Buschelman PetscReal oparm[5]; 24e8aa55a4SKris Buschelman PetscScalar *aux; 25e8aa55a4SKris Buschelman int naux; 26e8aa55a4SKris Buschelman 27ace3abfcSBarry Smith PetscBool CleanUpESSL; 28f0c56d0fSKris Buschelman } Mat_Essl; 29f0c56d0fSKris Buschelman 30e8aa55a4SKris Buschelman #undef __FUNCT__ 31f0c56d0fSKris Buschelman #define __FUNCT__ "MatDestroy_Essl" 32dfbe8321SBarry Smith PetscErrorCode MatDestroy_Essl(Mat A) 33dfbe8321SBarry Smith { 34dfbe8321SBarry Smith PetscErrorCode ierr; 35f0c56d0fSKris Buschelman Mat_Essl *essl=(Mat_Essl*)A->spptr; 36e8aa55a4SKris Buschelman 37e8aa55a4SKris Buschelman PetscFunctionBegin; 38*bf0cc555SLisandro Dalcin if (essl && essl->CleanUpESSL) { 3923bdbc58SBarry Smith ierr = PetscFree4(essl->a,essl->aux,essl->ia,essl->ja);CHKERRQ(ierr); 40e8aa55a4SKris Buschelman } 41c31cb41cSBarry Smith ierr = PetscFree(A->spptr);CHKERRQ(ierr); 42b24902e0SBarry Smith ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); 43460c4903SKris Buschelman PetscFunctionReturn(0); 44460c4903SKris Buschelman } 45460c4903SKris Buschelman 46460c4903SKris Buschelman #undef __FUNCT__ 47f0c56d0fSKris Buschelman #define __FUNCT__ "MatSolve_Essl" 48b24902e0SBarry Smith PetscErrorCode MatSolve_Essl(Mat A,Vec b,Vec x) 49b24902e0SBarry Smith { 50f0c56d0fSKris Buschelman Mat_Essl *essl = (Mat_Essl*)A->spptr; 51e8aa55a4SKris Buschelman PetscScalar *xx; 52dfbe8321SBarry Smith PetscErrorCode ierr; 53dfbe8321SBarry Smith int m,zero = 0; 54e8aa55a4SKris Buschelman 55e8aa55a4SKris Buschelman PetscFunctionBegin; 56e8aa55a4SKris Buschelman ierr = VecGetLocalSize(b,&m);CHKERRQ(ierr); 57e8aa55a4SKris Buschelman ierr = VecCopy(b,x);CHKERRQ(ierr); 58e8aa55a4SKris Buschelman ierr = VecGetArray(x,&xx);CHKERRQ(ierr); 59d0f46423SBarry Smith dgss(&zero,&A->cmap->n,essl->a,essl->ia,essl->ja,&essl->lna,xx,essl->aux,&essl->naux); 60e8aa55a4SKris Buschelman ierr = VecRestoreArray(x,&xx);CHKERRQ(ierr); 61e8aa55a4SKris Buschelman PetscFunctionReturn(0); 62e8aa55a4SKris Buschelman } 63e8aa55a4SKris Buschelman 64e8aa55a4SKris Buschelman #undef __FUNCT__ 65f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Essl" 660481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Essl(Mat F,Mat A,const MatFactorInfo *info) 67b24902e0SBarry Smith { 68e8aa55a4SKris Buschelman Mat_SeqAIJ *aa=(Mat_SeqAIJ*)(A)->data; 69719d5645SBarry Smith Mat_Essl *essl=(Mat_Essl*)(F)->spptr; 706849ba73SBarry Smith PetscErrorCode ierr; 716849ba73SBarry Smith int i,one = 1; 72e8aa55a4SKris Buschelman 73e8aa55a4SKris Buschelman PetscFunctionBegin; 74e8aa55a4SKris Buschelman /* copy matrix data into silly ESSL data structure (1-based Frotran style) */ 75d0f46423SBarry Smith for (i=0; i<A->rmap->n+1; i++) essl->ia[i] = aa->i[i] + 1; 76e8aa55a4SKris Buschelman for (i=0; i<aa->nz; i++) essl->ja[i] = aa->j[i] + 1; 77e8aa55a4SKris Buschelman 78e8aa55a4SKris Buschelman ierr = PetscMemcpy(essl->a,aa->a,(aa->nz)*sizeof(PetscScalar));CHKERRQ(ierr); 79e8aa55a4SKris Buschelman 80e8aa55a4SKris Buschelman /* set Essl options */ 81e8aa55a4SKris Buschelman essl->iparm[0] = 1; 82e8aa55a4SKris Buschelman essl->iparm[1] = 5; 83e8aa55a4SKris Buschelman essl->iparm[2] = 1; 84e8aa55a4SKris Buschelman essl->iparm[3] = 0; 85e8aa55a4SKris Buschelman essl->rparm[0] = 1.e-12; 8662331464SKris Buschelman essl->rparm[1] = 1.0; 877adad957SLisandro Dalcin ierr = PetscOptionsGetReal(((PetscObject)A)->prefix,"-matessl_lu_threshold",&essl->rparm[1],PETSC_NULL);CHKERRQ(ierr); 88e8aa55a4SKris Buschelman 89d0f46423SBarry 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); 90e8aa55a4SKris Buschelman 9135bd34faSBarry Smith F->ops->solve = MatSolve_Essl; 92719d5645SBarry Smith (F)->assembled = PETSC_TRUE; 93719d5645SBarry Smith (F)->preallocated = PETSC_TRUE; 94e8aa55a4SKris Buschelman PetscFunctionReturn(0); 95e8aa55a4SKris Buschelman } 96e8aa55a4SKris Buschelman 97b24902e0SBarry Smith 98719d5645SBarry Smith 99719d5645SBarry Smith 100e8aa55a4SKris Buschelman #undef __FUNCT__ 101f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Essl" 1020481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Essl(Mat B,Mat A,IS r,IS c,const MatFactorInfo *info) 103b24902e0SBarry Smith { 104eef49c96SKris Buschelman Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 105dfbe8321SBarry Smith PetscErrorCode ierr; 106f0c56d0fSKris Buschelman Mat_Essl *essl; 107e8aa55a4SKris Buschelman PetscReal f = 1.0; 108e8aa55a4SKris Buschelman 109e8aa55a4SKris Buschelman PetscFunctionBegin; 110f0c56d0fSKris Buschelman essl = (Mat_Essl *)(B->spptr); 111e8aa55a4SKris Buschelman 112e8aa55a4SKris Buschelman /* allocate the work arrays required by ESSL */ 113e8aa55a4SKris Buschelman f = info->fill; 114e8aa55a4SKris Buschelman essl->nz = a->nz; 115e8aa55a4SKris Buschelman essl->lna = (int)a->nz*f; 116d0f46423SBarry Smith essl->naux = 100 + 10*A->rmap->n; 117e8aa55a4SKris Buschelman 118e8aa55a4SKris Buschelman /* since malloc is slow on IBM we try a single malloc */ 11923bdbc58SBarry 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); 1202f71e704SKris Buschelman essl->CleanUpESSL = PETSC_TRUE; 121e8aa55a4SKris Buschelman 122052f0c41SBarry Smith ierr = PetscLogObjectMemory(B,essl->lna*(2*sizeof(int)+sizeof(PetscScalar)) + essl->naux*sizeof(PetscScalar));CHKERRQ(ierr); 123db4efbfdSBarry Smith B->ops->lufactornumeric = MatLUFactorNumeric_Essl; 124e8aa55a4SKris Buschelman PetscFunctionReturn(0); 125e8aa55a4SKris Buschelman } 126e8aa55a4SKris Buschelman 12735bd34faSBarry Smith EXTERN_C_BEGIN 12835bd34faSBarry Smith #undef __FUNCT__ 12935bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_essl" 13035bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_essl(Mat A,const MatSolverPackage *type) 13135bd34faSBarry Smith { 13235bd34faSBarry Smith PetscFunctionBegin; 1332692d6eeSBarry Smith *type = MATSOLVERESSL; 13435bd34faSBarry Smith PetscFunctionReturn(0); 13535bd34faSBarry Smith } 136719d5645SBarry Smith 1372f71e704SKris Buschelman /*MC 1382692d6eeSBarry Smith MATSOLVERESSL - "essl" - Provides direct solvers (LU) for sequential matrices 1392f71e704SKris Buschelman via the external package ESSL. 1402f71e704SKris Buschelman 1412f71e704SKris Buschelman If ESSL is installed (see the manual for 1422f71e704SKris Buschelman instructions on how to declare the existence of external packages), 1432f71e704SKris Buschelman 14441c8de11SBarry Smith Works with MATSEQAIJ matrices 1452f71e704SKris Buschelman 1462f71e704SKris Buschelman Level: beginner 1472f71e704SKris Buschelman 14841c8de11SBarry Smith .seealso: PCLU, PCFactorSetMatSolverPackage(), MatSolverPackage 1492f71e704SKris Buschelman M*/ 1502f71e704SKris Buschelman 151e8aa55a4SKris Buschelman #undef __FUNCT__ 152b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_essl" 1535c9eb25fSBarry Smith PetscErrorCode MatGetFactor_seqaij_essl(Mat A,MatFactorType ftype,Mat *F) 154dfbe8321SBarry Smith { 155b24902e0SBarry Smith Mat B; 156dfbe8321SBarry Smith PetscErrorCode ierr; 157b24902e0SBarry Smith Mat_Essl *essl; 158e8aa55a4SKris Buschelman 159e8aa55a4SKris Buschelman PetscFunctionBegin; 160e32f2f54SBarry Smith if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); 161b24902e0SBarry Smith ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 162d0f46423SBarry Smith ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 163b24902e0SBarry Smith ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 164b24902e0SBarry Smith ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 165b24902e0SBarry Smith 166b24902e0SBarry Smith ierr = PetscNewLog(B,Mat_Essl,&essl);CHKERRQ(ierr); 167b24902e0SBarry Smith B->spptr = essl; 168b24902e0SBarry Smith B->ops->lufactorsymbolic = MatLUFactorSymbolic_Essl; 16935bd34faSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_essl",MatFactorGetSolverPackage_essl);CHKERRQ(ierr); 170d5f3da31SBarry Smith B->factortype = MAT_FACTOR_LU; 171b24902e0SBarry Smith *F = B; 172e8aa55a4SKris Buschelman PetscFunctionReturn(0); 173e8aa55a4SKris Buschelman } 174711adf46SSatish Balay EXTERN_C_END 175