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 10*8cc058d9SJed Brown PETSC_EXTERN void dgss(int*,int*,double*,int*,int*,int*,double*,double*,int*); 11*8cc058d9SJed Brown PETSC_EXTERN void dgsf(int*,int*,int*,double*,int*,int*,int*,int*,double*,double*,double*,int*); 12d3bad8c4SBarry Smith 13e8aa55a4SKris Buschelman typedef struct { 14e8aa55a4SKris Buschelman int n,nz; 15e8aa55a4SKris Buschelman PetscScalar *a; 16e8aa55a4SKris Buschelman int *ia; 17e8aa55a4SKris Buschelman int *ja; 18e8aa55a4SKris Buschelman int lna; 19e8aa55a4SKris Buschelman int iparm[5]; 20e8aa55a4SKris Buschelman PetscReal rparm[5]; 21e8aa55a4SKris Buschelman PetscReal oparm[5]; 22e8aa55a4SKris Buschelman PetscScalar *aux; 23e8aa55a4SKris Buschelman int naux; 24e8aa55a4SKris Buschelman 25ace3abfcSBarry Smith PetscBool CleanUpESSL; 26f0c56d0fSKris Buschelman } Mat_Essl; 27f0c56d0fSKris Buschelman 28e8aa55a4SKris Buschelman #undef __FUNCT__ 29f0c56d0fSKris Buschelman #define __FUNCT__ "MatDestroy_Essl" 30dfbe8321SBarry Smith PetscErrorCode MatDestroy_Essl(Mat A) 31dfbe8321SBarry Smith { 32dfbe8321SBarry Smith PetscErrorCode ierr; 33f0c56d0fSKris Buschelman Mat_Essl *essl=(Mat_Essl*)A->spptr; 34e8aa55a4SKris Buschelman 35e8aa55a4SKris Buschelman PetscFunctionBegin; 36bf0cc555SLisandro Dalcin if (essl && essl->CleanUpESSL) { 3723bdbc58SBarry Smith ierr = PetscFree4(essl->a,essl->aux,essl->ia,essl->ja);CHKERRQ(ierr); 38e8aa55a4SKris Buschelman } 39c31cb41cSBarry Smith ierr = PetscFree(A->spptr);CHKERRQ(ierr); 40b24902e0SBarry Smith ierr = MatDestroy_SeqAIJ(A);CHKERRQ(ierr); 41460c4903SKris Buschelman PetscFunctionReturn(0); 42460c4903SKris Buschelman } 43460c4903SKris Buschelman 44460c4903SKris Buschelman #undef __FUNCT__ 45f0c56d0fSKris Buschelman #define __FUNCT__ "MatSolve_Essl" 46b24902e0SBarry Smith PetscErrorCode MatSolve_Essl(Mat A,Vec b,Vec x) 47b24902e0SBarry Smith { 48f0c56d0fSKris Buschelman Mat_Essl *essl = (Mat_Essl*)A->spptr; 49e8aa55a4SKris Buschelman PetscScalar *xx; 50dfbe8321SBarry Smith PetscErrorCode ierr; 51c5c20521SJed Brown int nessl,zero = 0; 52e8aa55a4SKris Buschelman 53e8aa55a4SKris Buschelman PetscFunctionBegin; 54c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&nessl);CHKERRQ(ierr); 55e8aa55a4SKris Buschelman ierr = VecCopy(b,x);CHKERRQ(ierr); 56e8aa55a4SKris Buschelman ierr = VecGetArray(x,&xx);CHKERRQ(ierr); 57c5c20521SJed Brown dgss(&zero,&nessl,essl->a,essl->ia,essl->ja,&essl->lna,xx,essl->aux,&essl->naux); 58e8aa55a4SKris Buschelman ierr = VecRestoreArray(x,&xx);CHKERRQ(ierr); 59e8aa55a4SKris Buschelman PetscFunctionReturn(0); 60e8aa55a4SKris Buschelman } 61e8aa55a4SKris Buschelman 62e8aa55a4SKris Buschelman #undef __FUNCT__ 63f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Essl" 640481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Essl(Mat F,Mat A,const MatFactorInfo *info) 65b24902e0SBarry Smith { 66e8aa55a4SKris Buschelman Mat_SeqAIJ *aa =(Mat_SeqAIJ*)(A)->data; 67719d5645SBarry Smith Mat_Essl *essl=(Mat_Essl*)(F)->spptr; 686849ba73SBarry Smith PetscErrorCode ierr; 69c5c20521SJed Brown int nessl,i,one = 1; 70e8aa55a4SKris Buschelman 71e8aa55a4SKris Buschelman PetscFunctionBegin; 72c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nessl);CHKERRQ(ierr); 73e8aa55a4SKris Buschelman /* copy matrix data into silly ESSL data structure (1-based Frotran style) */ 74d0f46423SBarry Smith for (i=0; i<A->rmap->n+1; i++) essl->ia[i] = aa->i[i] + 1; 75e8aa55a4SKris Buschelman for (i=0; i<aa->nz; i++) essl->ja[i] = aa->j[i] + 1; 76e8aa55a4SKris Buschelman 77e8aa55a4SKris Buschelman ierr = PetscMemcpy(essl->a,aa->a,(aa->nz)*sizeof(PetscScalar));CHKERRQ(ierr); 78e8aa55a4SKris Buschelman 79e8aa55a4SKris Buschelman /* set Essl options */ 80e8aa55a4SKris Buschelman essl->iparm[0] = 1; 81e8aa55a4SKris Buschelman essl->iparm[1] = 5; 82e8aa55a4SKris Buschelman essl->iparm[2] = 1; 83e8aa55a4SKris Buschelman essl->iparm[3] = 0; 84e8aa55a4SKris Buschelman essl->rparm[0] = 1.e-12; 8562331464SKris Buschelman essl->rparm[1] = 1.0; 862205254eSKarl Rupp 870298fd71SBarry Smith ierr = PetscOptionsGetReal(((PetscObject)A)->prefix,"-matessl_lu_threshold",&essl->rparm[1],NULL);CHKERRQ(ierr); 88e8aa55a4SKris Buschelman 89c5c20521SJed Brown dgsf(&one,&nessl,&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; 114c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->nz,&essl->nz);CHKERRQ(ierr); 115c5df96a5SBarry Smith ierr = PetscBLASIntCast((PetscInt)(a->nz*f),&essl->lna);CHKERRQ(ierr); 116c5df96a5SBarry Smith ierr = PetscBLASIntCast(100 + 10*A->rmap->n,&essl->naux);CHKERRQ(ierr); 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); 1202205254eSKarl Rupp 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); 1242205254eSKarl Rupp 125db4efbfdSBarry Smith B->ops->lufactornumeric = MatLUFactorNumeric_Essl; 126e8aa55a4SKris Buschelman PetscFunctionReturn(0); 127e8aa55a4SKris Buschelman } 128e8aa55a4SKris Buschelman 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; 1342692d6eeSBarry Smith *type = MATSOLVERESSL; 13535bd34faSBarry Smith PetscFunctionReturn(0); 13635bd34faSBarry Smith } 137719d5645SBarry Smith 1382f71e704SKris Buschelman /*MC 1392692d6eeSBarry Smith MATSOLVERESSL - "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" 154*8cc058d9SJed Brown PETSC_EXTERN 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; 161e32f2f54SBarry Smith if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); 162ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&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); 1650298fd71SBarry Smith ierr = MatSeqAIJSetPreallocation(B,0,NULL);CHKERRQ(ierr); 166b24902e0SBarry Smith 167b24902e0SBarry Smith ierr = PetscNewLog(B,Mat_Essl,&essl);CHKERRQ(ierr); 1682205254eSKarl Rupp 169b24902e0SBarry Smith B->spptr = essl; 170b24902e0SBarry Smith B->ops->lufactorsymbolic = MatLUFactorSymbolic_Essl; 1712205254eSKarl Rupp 17200de8ff0SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_essl",MatFactorGetSolverPackage_essl);CHKERRQ(ierr); 1732205254eSKarl Rupp 174d5f3da31SBarry Smith B->factortype = MAT_FACTOR_LU; 175b24902e0SBarry Smith *F = B; 176e8aa55a4SKris Buschelman PetscFunctionReturn(0); 177e8aa55a4SKris Buschelman } 178