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 108cc058d9SJed Brown PETSC_EXTERN void dgss(int*,int*,double*,int*,int*,int*,double*,double*,int*); 118cc058d9SJed 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 28dfbe8321SBarry Smith PetscErrorCode MatDestroy_Essl(Mat A) 29dfbe8321SBarry Smith { 30dfbe8321SBarry Smith PetscErrorCode ierr; 31ac913495SBarry Smith Mat_Essl *essl=(Mat_Essl*)A->data; 32e8aa55a4SKris Buschelman 33e8aa55a4SKris Buschelman PetscFunctionBegin; 34ac913495SBarry Smith if (essl->CleanUpESSL) { 3523bdbc58SBarry Smith ierr = PetscFree4(essl->a,essl->aux,essl->ia,essl->ja);CHKERRQ(ierr); 36e8aa55a4SKris Buschelman } 37ac913495SBarry Smith ierr = PetscFree(A->data);CHKERRQ(ierr); 38460c4903SKris Buschelman PetscFunctionReturn(0); 39460c4903SKris Buschelman } 40460c4903SKris Buschelman 41b24902e0SBarry Smith PetscErrorCode MatSolve_Essl(Mat A,Vec b,Vec x) 42b24902e0SBarry Smith { 43ac913495SBarry Smith Mat_Essl *essl = (Mat_Essl*)A->data; 44e8aa55a4SKris Buschelman PetscScalar *xx; 45dfbe8321SBarry Smith PetscErrorCode ierr; 46c5c20521SJed Brown int nessl,zero = 0; 47e8aa55a4SKris Buschelman 48e8aa55a4SKris Buschelman PetscFunctionBegin; 49c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&nessl);CHKERRQ(ierr); 50e8aa55a4SKris Buschelman ierr = VecCopy(b,x);CHKERRQ(ierr); 51e8aa55a4SKris Buschelman ierr = VecGetArray(x,&xx);CHKERRQ(ierr); 52c5c20521SJed Brown dgss(&zero,&nessl,essl->a,essl->ia,essl->ja,&essl->lna,xx,essl->aux,&essl->naux); 53e8aa55a4SKris Buschelman ierr = VecRestoreArray(x,&xx);CHKERRQ(ierr); 54e8aa55a4SKris Buschelman PetscFunctionReturn(0); 55e8aa55a4SKris Buschelman } 56e8aa55a4SKris Buschelman 570481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Essl(Mat F,Mat A,const MatFactorInfo *info) 58b24902e0SBarry Smith { 59e8aa55a4SKris Buschelman Mat_SeqAIJ *aa =(Mat_SeqAIJ*)(A)->data; 60ac913495SBarry Smith Mat_Essl *essl=(Mat_Essl*)(F)->data; 616849ba73SBarry Smith PetscErrorCode ierr; 62c5c20521SJed Brown int nessl,i,one = 1; 63e8aa55a4SKris Buschelman 64e8aa55a4SKris Buschelman PetscFunctionBegin; 65c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nessl);CHKERRQ(ierr); 66e8aa55a4SKris Buschelman /* copy matrix data into silly ESSL data structure (1-based Frotran style) */ 67d0f46423SBarry Smith for (i=0; i<A->rmap->n+1; i++) essl->ia[i] = aa->i[i] + 1; 68e8aa55a4SKris Buschelman for (i=0; i<aa->nz; i++) essl->ja[i] = aa->j[i] + 1; 69e8aa55a4SKris Buschelman 70e8aa55a4SKris Buschelman ierr = PetscMemcpy(essl->a,aa->a,(aa->nz)*sizeof(PetscScalar));CHKERRQ(ierr); 71e8aa55a4SKris Buschelman 72e8aa55a4SKris Buschelman /* set Essl options */ 73e8aa55a4SKris Buschelman essl->iparm[0] = 1; 74e8aa55a4SKris Buschelman essl->iparm[1] = 5; 75e8aa55a4SKris Buschelman essl->iparm[2] = 1; 76e8aa55a4SKris Buschelman essl->iparm[3] = 0; 77e8aa55a4SKris Buschelman essl->rparm[0] = 1.e-12; 7862331464SKris Buschelman essl->rparm[1] = 1.0; 792205254eSKarl Rupp 8062f2f501SSatish Balay ierr = PetscOptionsGetReal(NULL,((PetscObject)A)->prefix,"-matessl_lu_threshold",&essl->rparm[1],NULL);CHKERRQ(ierr); 81e8aa55a4SKris Buschelman 82c5c20521SJed Brown dgsf(&one,&nessl,&essl->nz,essl->a,essl->ia,essl->ja,&essl->lna,essl->iparm,essl->rparm,essl->oparm,essl->aux,&essl->naux); 83e8aa55a4SKris Buschelman 8435bd34faSBarry Smith F->ops->solve = MatSolve_Essl; 85719d5645SBarry Smith (F)->assembled = PETSC_TRUE; 86719d5645SBarry Smith (F)->preallocated = PETSC_TRUE; 87e8aa55a4SKris Buschelman PetscFunctionReturn(0); 88e8aa55a4SKris Buschelman } 89e8aa55a4SKris Buschelman 90b24902e0SBarry Smith 91719d5645SBarry Smith 92719d5645SBarry Smith 930481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Essl(Mat B,Mat A,IS r,IS c,const MatFactorInfo *info) 94b24902e0SBarry Smith { 95eef49c96SKris Buschelman Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 96dfbe8321SBarry Smith PetscErrorCode ierr; 97f0c56d0fSKris Buschelman Mat_Essl *essl; 98e8aa55a4SKris Buschelman PetscReal f = 1.0; 99e8aa55a4SKris Buschelman 100e8aa55a4SKris Buschelman PetscFunctionBegin; 101ac913495SBarry Smith essl = (Mat_Essl*)(B->data); 102e8aa55a4SKris Buschelman 103e8aa55a4SKris Buschelman /* allocate the work arrays required by ESSL */ 104e8aa55a4SKris Buschelman f = info->fill; 105c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->nz,&essl->nz);CHKERRQ(ierr); 106c5df96a5SBarry Smith ierr = PetscBLASIntCast((PetscInt)(a->nz*f),&essl->lna);CHKERRQ(ierr); 107c5df96a5SBarry Smith ierr = PetscBLASIntCast(100 + 10*A->rmap->n,&essl->naux);CHKERRQ(ierr); 108e8aa55a4SKris Buschelman 109e8aa55a4SKris Buschelman /* since malloc is slow on IBM we try a single malloc */ 110dcca6d9dSJed Brown ierr = PetscMalloc4(essl->lna,&essl->a,essl->naux,&essl->aux,essl->lna,&essl->ia,essl->lna,&essl->ja);CHKERRQ(ierr); 1112205254eSKarl Rupp 1122f71e704SKris Buschelman essl->CleanUpESSL = PETSC_TRUE; 113e8aa55a4SKris Buschelman 1143bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,essl->lna*(2*sizeof(int)+sizeof(PetscScalar)) + essl->naux*sizeof(PetscScalar));CHKERRQ(ierr); 1152205254eSKarl Rupp 116db4efbfdSBarry Smith B->ops->lufactornumeric = MatLUFactorNumeric_Essl; 117e8aa55a4SKris Buschelman PetscFunctionReturn(0); 118e8aa55a4SKris Buschelman } 119e8aa55a4SKris Buschelman 120*3ca39a21SBarry Smith PetscErrorCode MatFactorGetSolverType_essl(Mat A,const MatSolverType *type) 12135bd34faSBarry Smith { 12235bd34faSBarry Smith PetscFunctionBegin; 1232692d6eeSBarry Smith *type = MATSOLVERESSL; 12435bd34faSBarry Smith PetscFunctionReturn(0); 12535bd34faSBarry Smith } 126719d5645SBarry Smith 1272f71e704SKris Buschelman /*MC 1282692d6eeSBarry Smith MATSOLVERESSL - "essl" - Provides direct solvers (LU) for sequential matrices 1292f71e704SKris Buschelman via the external package ESSL. 1302f71e704SKris Buschelman 1312f71e704SKris Buschelman If ESSL is installed (see the manual for 1322f71e704SKris Buschelman instructions on how to declare the existence of external packages), 1332f71e704SKris Buschelman 13441c8de11SBarry Smith Works with MATSEQAIJ matrices 1352f71e704SKris Buschelman 1362f71e704SKris Buschelman Level: beginner 1372f71e704SKris Buschelman 138*3ca39a21SBarry Smith .seealso: PCLU, PCFactorSetMatSolverType(), MatSolverType 1392f71e704SKris Buschelman M*/ 1402f71e704SKris Buschelman 1418cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqaij_essl(Mat A,MatFactorType ftype,Mat *F) 142dfbe8321SBarry Smith { 143b24902e0SBarry Smith Mat B; 144dfbe8321SBarry Smith PetscErrorCode ierr; 145b24902e0SBarry Smith Mat_Essl *essl; 146e8aa55a4SKris Buschelman 147e8aa55a4SKris Buschelman PetscFunctionBegin; 148e32f2f54SBarry Smith if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square"); 149ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 150d0f46423SBarry Smith ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 151ac913495SBarry Smith ierr = PetscStrallocpy("essl",&((PetscObject)B)->type_name);CHKERRQ(ierr); 152ac913495SBarry Smith ierr = MatSetUp(B);CHKERRQ(ierr); 153b24902e0SBarry Smith 154b00a9115SJed Brown ierr = PetscNewLog(B,&essl);CHKERRQ(ierr); 1552205254eSKarl Rupp 156ac913495SBarry Smith B->data = essl; 157b24902e0SBarry Smith B->ops->lufactorsymbolic = MatLUFactorSymbolic_Essl; 158ac913495SBarry Smith B->ops->destroy = MatDestroy_Essl; 159ac913495SBarry Smith B->ops->getinfo = MatGetInfo_External; 1602205254eSKarl Rupp 161*3ca39a21SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverType_C",MatFactorGetSolverType_essl);CHKERRQ(ierr); 1622205254eSKarl Rupp 163d5f3da31SBarry Smith B->factortype = MAT_FACTOR_LU; 16400c67f3bSHong Zhang ierr = PetscFree(B->solvertype);CHKERRQ(ierr); 16500c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERESSL,&B->solvertype);CHKERRQ(ierr); 16600c67f3bSHong Zhang 167b24902e0SBarry Smith *F = B; 168e8aa55a4SKris Buschelman PetscFunctionReturn(0); 169e8aa55a4SKris Buschelman } 17042c9c57cSBarry Smith 171*3ca39a21SBarry Smith PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Essl(void) 17242c9c57cSBarry Smith { 17342c9c57cSBarry Smith PetscErrorCode ierr; 17442c9c57cSBarry Smith PetscFunctionBegin; 175*3ca39a21SBarry Smith ierr = MatSolverTypeRegister(MATSOLVERESSL,MATSEQAIJ, MAT_FACTOR_LU,MatGetFactor_seqaij_essl);CHKERRQ(ierr); 17642c9c57cSBarry Smith PetscFunctionReturn(0); 17742c9c57cSBarry Smith } 178