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 */ 7e8aa55a4SKris Buschelman #include "src/mat/impls/aij/seq/aij.h" 8*b24902e0SBarry 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) { 402f71e704SKris Buschelman ierr = PetscFree(essl->a);CHKERRQ(ierr); 41e8aa55a4SKris Buschelman } 42*b24902e0SBarry Smith ierr = PetscFree(essl);CHKERRQ(ierr); 43*b24902e0SBarry 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" 49*b24902e0SBarry Smith PetscErrorCode MatSolve_Essl(Mat A,Vec b,Vec x) 50*b24902e0SBarry 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); 602a4c71feSBarry 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" 67*b24902e0SBarry Smith PetscErrorCode MatLUFactorNumeric_Essl(Mat A,MatFactorInfo *info,Mat *F) 68*b24902e0SBarry Smith { 69e8aa55a4SKris Buschelman Mat_SeqAIJ *aa=(Mat_SeqAIJ*)(A)->data; 70f0c56d0fSKris Buschelman 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) */ 762a4c71feSBarry 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 90*b24902e0SBarry 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 92d3bad8c4SBarry Smith (*F)->assembled = PETSC_TRUE; 93e8aa55a4SKris Buschelman PetscFunctionReturn(0); 94e8aa55a4SKris Buschelman } 95e8aa55a4SKris Buschelman 96*b24902e0SBarry Smith 97e8aa55a4SKris Buschelman #undef __FUNCT__ 98f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Essl" 99*b24902e0SBarry Smith PetscErrorCode MatLUFactorSymbolic_Essl(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F) 100*b24902e0SBarry Smith { 101e8aa55a4SKris Buschelman Mat B; 102eef49c96SKris Buschelman Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 103dfbe8321SBarry Smith PetscErrorCode ierr; 104dfbe8321SBarry Smith int len; 105f0c56d0fSKris Buschelman Mat_Essl *essl; 106e8aa55a4SKris Buschelman PetscReal f = 1.0; 107e8aa55a4SKris Buschelman 108e8aa55a4SKris Buschelman PetscFunctionBegin; 1092a4c71feSBarry Smith if (A->cmap.N != A->rmap.N) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square"); 1107adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 1112a4c71feSBarry Smith ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,A->rmap.n,A->cmap.n);CHKERRQ(ierr); 1127adad957SLisandro Dalcin ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 113e8aa55a4SKris Buschelman ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 114e8aa55a4SKris Buschelman 115f0c56d0fSKris Buschelman B->ops->solve = MatSolve_Essl; 116f0c56d0fSKris Buschelman B->ops->lufactornumeric = MatLUFactorNumeric_Essl; 117e8aa55a4SKris Buschelman B->factor = FACTOR_LU; 118e8aa55a4SKris Buschelman 119f0c56d0fSKris Buschelman essl = (Mat_Essl *)(B->spptr); 120e8aa55a4SKris Buschelman 121e8aa55a4SKris Buschelman /* allocate the work arrays required by ESSL */ 122e8aa55a4SKris Buschelman f = info->fill; 123e8aa55a4SKris Buschelman essl->nz = a->nz; 124e8aa55a4SKris Buschelman essl->lna = (int)a->nz*f; 1252a4c71feSBarry Smith essl->naux = 100 + 10*A->rmap.n; 126e8aa55a4SKris Buschelman 127e8aa55a4SKris Buschelman /* since malloc is slow on IBM we try a single malloc */ 128e8aa55a4SKris Buschelman len = essl->lna*(2*sizeof(int)+sizeof(PetscScalar)) + essl->naux*sizeof(PetscScalar); 129e8aa55a4SKris Buschelman ierr = PetscMalloc(len,&essl->a);CHKERRQ(ierr); 130e8aa55a4SKris Buschelman essl->aux = essl->a + essl->lna; 131e8aa55a4SKris Buschelman essl->ia = (int*)(essl->aux + essl->naux); 132e8aa55a4SKris Buschelman essl->ja = essl->ia + essl->lna; 1332f71e704SKris Buschelman essl->CleanUpESSL = PETSC_TRUE; 134e8aa55a4SKris Buschelman 13538f2d2fdSLisandro Dalcin ierr = PetscLogObjectMemory(B,len);CHKERRQ(ierr); 136e8aa55a4SKris Buschelman *F = B; 137e8aa55a4SKris Buschelman PetscFunctionReturn(0); 138e8aa55a4SKris Buschelman } 139e8aa55a4SKris Buschelman 1402f71e704SKris Buschelman /*MC 141fafad747SKris Buschelman MATESSL - MATESSL = "essl" - A matrix type providing direct solvers (LU) for sequential matrices 1422f71e704SKris Buschelman via the external package ESSL. 1432f71e704SKris Buschelman 1442f71e704SKris Buschelman If ESSL is installed (see the manual for 1452f71e704SKris Buschelman instructions on how to declare the existence of external packages), 1462f71e704SKris Buschelman a matrix type can be constructed which invokes ESSL solvers. 1472f71e704SKris Buschelman After calling MatCreate(...,A), simply call MatSetType(A,MATESSL). 1482f71e704SKris Buschelman This matrix type is only supported for double precision real. 1492f71e704SKris Buschelman 1502f71e704SKris Buschelman This matrix inherits from MATSEQAIJ. As a result, MatSeqAIJSetPreallocation is 15128b08bd3SKris Buschelman supported for this matrix type. One can also call MatConvert for an inplace conversion to or from 15228b08bd3SKris Buschelman the MATSEQAIJ type without data copy. 1532f71e704SKris Buschelman 1542f71e704SKris Buschelman Options Database Keys: 1550bad9183SKris Buschelman . -mat_type essl - sets the matrix type to "essl" during a call to MatSetFromOptions() 1562f71e704SKris Buschelman 1572f71e704SKris Buschelman Level: beginner 1582f71e704SKris Buschelman 1592f71e704SKris Buschelman .seealso: PCLU 1602f71e704SKris Buschelman M*/ 1612f71e704SKris Buschelman 162e8aa55a4SKris Buschelman #undef __FUNCT__ 163*b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_essl" 164*b24902e0SBarry Smith PetscErrorCode MatGetFactor_seqaij_essl(Mat A,Mat *F) 165dfbe8321SBarry Smith { 166*b24902e0SBarry Smith Mat B; 167*b24902e0SBarry Smith Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 168dfbe8321SBarry Smith PetscErrorCode ierr; 169*b24902e0SBarry Smith Mat_Essl *essl; 170e8aa55a4SKris Buschelman 171e8aa55a4SKris Buschelman PetscFunctionBegin; 172*b24902e0SBarry Smith if (A->cmap.N != A->rmap.N) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square"); 173*b24902e0SBarry Smith ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 174*b24902e0SBarry Smith ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,A->rmap.n,A->cmap.n);CHKERRQ(ierr); 175*b24902e0SBarry Smith ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr); 176*b24902e0SBarry Smith ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 177*b24902e0SBarry Smith 178*b24902e0SBarry Smith ierr = PetscNewLog(B,Mat_Essl,&essl);CHKERRQ(ierr); 179*b24902e0SBarry Smith B->spptr = essl; 180*b24902e0SBarry Smith B->ops->solve = MatSolve_Essl; 181*b24902e0SBarry Smith B->ops->lufactornumeric = MatLUFactorNumeric_Essl; 182*b24902e0SBarry Smith B->ops->lufactorsymbolic = MatLUFactorSymbolic_Essl; 183*b24902e0SBarry Smith B->factor = FACTOR_LU; 184*b24902e0SBarry Smith *F = B; 185e8aa55a4SKris Buschelman PetscFunctionReturn(0); 186e8aa55a4SKris Buschelman } 187