1e8aa55a4SKris Buschelman /*$Id: essl.c,v 1.49 2001/08/07 03:02:47 balay Exp $*/ 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" 8e8aa55a4SKris Buschelman /* #include <essl.h> This doesn't work! */ 9e8aa55a4SKris Buschelman 10e8aa55a4SKris Buschelman typedef struct { 11e8aa55a4SKris Buschelman int n,nz; 12e8aa55a4SKris Buschelman PetscScalar *a; 13e8aa55a4SKris Buschelman int *ia; 14e8aa55a4SKris Buschelman int *ja; 15e8aa55a4SKris Buschelman int lna; 16e8aa55a4SKris Buschelman int iparm[5]; 17e8aa55a4SKris Buschelman PetscReal rparm[5]; 18e8aa55a4SKris Buschelman PetscReal oparm[5]; 19e8aa55a4SKris Buschelman PetscScalar *aux; 20e8aa55a4SKris Buschelman int naux; 21e8aa55a4SKris Buschelman 22460c4903SKris Buschelman int (*MatAssemblyEnd)(Mat,MatAssemblyType); 23460c4903SKris Buschelman int (*MatLUFactorSymbolic)(Mat,IS,IS,MatFactorInfo*,Mat*); 24e8aa55a4SKris Buschelman int (*MatDestroy)(Mat); 25e8aa55a4SKris Buschelman } Mat_SeqAIJ_Essl; 26e8aa55a4SKris Buschelman 27460c4903SKris Buschelman EXTERN int MatLUFactorSymbolic_SeqAIJ_Essl(Mat,IS,IS,MatFactorInfo*,Mat*); 28460c4903SKris Buschelman 29460c4903SKris Buschelman EXTERN_C_BEGIN 30460c4903SKris Buschelman #undef __FUNCT__ 31460c4903SKris Buschelman #define __FUNCT__ "MatConvert_Essl_SeqAIJ" 32460c4903SKris Buschelman int MatConvert_Essl_SeqAIJ(Mat A,MatType type,Mat *newmat) { 33460c4903SKris Buschelman int ierr; 34460c4903SKris Buschelman Mat B=*newmat; 35460c4903SKris Buschelman Mat_SeqAIJ_Essl *essl = (Mat_SeqAIJ_Essl*)A->spptr; 36460c4903SKris Buschelman 37460c4903SKris Buschelman PetscFunctionBegin; 38460c4903SKris Buschelman if (B != A) { 39460c4903SKris Buschelman ierr = MatDuplicate(A,MAT_COPY_VALUES,&B); 40460c4903SKris Buschelman } else { 41460c4903SKris Buschelman /* free the Essl datastructures */ 42460c4903SKris Buschelman ierr = PetscFree(essl->a);CHKERRQ(ierr); 43460c4903SKris Buschelman ierr = PetscFree(essl);CHKERRQ(ierr); 44460c4903SKris Buschelman ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQAIJ);CHKERRQ(ierr); 45460c4903SKris Buschelman } 46460c4903SKris Buschelman *newmat = B; 47460c4903SKris Buschelman PetscFunctionReturn(0); 48460c4903SKris Buschelman } 49460c4903SKris Buschelman EXTERN_C_END 50460c4903SKris Buschelman 51e8aa55a4SKris Buschelman #undef __FUNCT__ 52e8aa55a4SKris Buschelman #define __FUNCT__ "MatDestroy_SeqAIJ_Essl" 53e8aa55a4SKris Buschelman int MatDestroy_SeqAIJ_Essl(Mat A) 54e8aa55a4SKris Buschelman { 55460c4903SKris Buschelman int ierr; 56e8aa55a4SKris Buschelman Mat_SeqAIJ_Essl *essl = (Mat_SeqAIJ_Essl*)A->spptr; 57460c4903SKris Buschelman int (*destroy)(Mat)=essl->MatDestroy; 58e8aa55a4SKris Buschelman 59e8aa55a4SKris Buschelman PetscFunctionBegin; 60460c4903SKris Buschelman ierr = MatConvert_Essl_SeqAIJ(A,MATSEQAIJ,&A); 61e8aa55a4SKris Buschelman ierr = (*destroy)(A);CHKERRQ(ierr); 62e8aa55a4SKris Buschelman PetscFunctionReturn(0); 63e8aa55a4SKris Buschelman } 64e8aa55a4SKris Buschelman 65e8aa55a4SKris Buschelman #undef __FUNCT__ 66460c4903SKris Buschelman #define __FUNCT__ "MatAssemblyEnd_SeqAIJ_Essl" 67460c4903SKris Buschelman int MatAssemblyEnd_SeqAIJ_Essl(Mat A,MatAssemblyType mode) { 68460c4903SKris Buschelman int ierr; 69460c4903SKris Buschelman Mat_SeqAIJ_Essl *essl=(Mat_SeqAIJ_Essl*)(A->spptr); 70460c4903SKris Buschelman 71460c4903SKris Buschelman PetscFunctionBegin; 72460c4903SKris Buschelman ierr = (*essl->MatAssemblyEnd)(A,mode);CHKERRQ(ierr); 73460c4903SKris Buschelman 74460c4903SKris Buschelman essl->MatLUFactorSymbolic = A->ops->lufactorsymbolic; 75460c4903SKris Buschelman A->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqAIJ_Essl; 76460c4903SKris Buschelman PetscLogInfo(0,"Using ESSL for SeqAIJ LU factorization and solves"); 77460c4903SKris Buschelman PetscFunctionReturn(0); 78460c4903SKris Buschelman } 79460c4903SKris Buschelman 80460c4903SKris Buschelman #undef __FUNCT__ 81e8aa55a4SKris Buschelman #define __FUNCT__ "MatSolve_SeqAIJ_Essl" 82e8aa55a4SKris Buschelman int MatSolve_SeqAIJ_Essl(Mat A,Vec b,Vec x) 83e8aa55a4SKris Buschelman { 84e8aa55a4SKris Buschelman Mat_SeqAIJ_Essl *essl = (Mat_SeqAIJ_Essl*)A->spptr; 85e8aa55a4SKris Buschelman PetscScalar *xx; 86e8aa55a4SKris Buschelman int ierr,m,zero = 0; 87e8aa55a4SKris Buschelman 88e8aa55a4SKris Buschelman PetscFunctionBegin; 89e8aa55a4SKris Buschelman ierr = VecGetLocalSize(b,&m);CHKERRQ(ierr); 90e8aa55a4SKris Buschelman ierr = VecCopy(b,x);CHKERRQ(ierr); 91e8aa55a4SKris Buschelman ierr = VecGetArray(x,&xx);CHKERRQ(ierr); 92e8aa55a4SKris Buschelman dgss(&zero,&A->n,essl->a,essl->ia,essl->ja,&essl->lna,xx,essl->aux,&essl->naux); 93e8aa55a4SKris Buschelman ierr = VecRestoreArray(x,&xx);CHKERRQ(ierr); 94e8aa55a4SKris Buschelman PetscFunctionReturn(0); 95e8aa55a4SKris Buschelman } 96e8aa55a4SKris Buschelman 97e8aa55a4SKris Buschelman #undef __FUNCT__ 98e8aa55a4SKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_SeqAIJ_Essl" 99e8aa55a4SKris Buschelman int MatLUFactorNumeric_SeqAIJ_Essl(Mat A,Mat *F) 100e8aa55a4SKris Buschelman { 101e8aa55a4SKris Buschelman Mat_SeqAIJ *aa = (Mat_SeqAIJ*)(A)->data; 102e8aa55a4SKris Buschelman Mat_SeqAIJ_Essl *essl = (Mat_SeqAIJ_Essl*)(*F)->spptr; 103e8aa55a4SKris Buschelman int i,ierr,one = 1; 104e8aa55a4SKris Buschelman 105e8aa55a4SKris Buschelman PetscFunctionBegin; 106e8aa55a4SKris Buschelman /* copy matrix data into silly ESSL data structure (1-based Frotran style) */ 107e8aa55a4SKris Buschelman for (i=0; i<A->m+1; i++) essl->ia[i] = aa->i[i] + 1; 108e8aa55a4SKris Buschelman for (i=0; i<aa->nz; i++) essl->ja[i] = aa->j[i] + 1; 109e8aa55a4SKris Buschelman 110e8aa55a4SKris Buschelman ierr = PetscMemcpy(essl->a,aa->a,(aa->nz)*sizeof(PetscScalar));CHKERRQ(ierr); 111e8aa55a4SKris Buschelman 112e8aa55a4SKris Buschelman /* set Essl options */ 113e8aa55a4SKris Buschelman essl->iparm[0] = 1; 114e8aa55a4SKris Buschelman essl->iparm[1] = 5; 115e8aa55a4SKris Buschelman essl->iparm[2] = 1; 116e8aa55a4SKris Buschelman essl->iparm[3] = 0; 117e8aa55a4SKris Buschelman essl->rparm[0] = 1.e-12; 118e8aa55a4SKris Buschelman essl->rparm[1] = A->lupivotthreshold; 119e8aa55a4SKris Buschelman 120e8aa55a4SKris Buschelman dgsf(&one,&A->m,&essl->nz,essl->a,essl->ia,essl->ja,&essl->lna,essl->iparm, 121e8aa55a4SKris Buschelman essl->rparm,essl->oparm,essl->aux,&essl->naux); 122e8aa55a4SKris Buschelman 123e8aa55a4SKris Buschelman PetscFunctionReturn(0); 124e8aa55a4SKris Buschelman } 125e8aa55a4SKris Buschelman 126e8aa55a4SKris Buschelman #undef __FUNCT__ 127e8aa55a4SKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_SeqAIJ_Essl" 128e8aa55a4SKris Buschelman int MatLUFactorSymbolic_SeqAIJ_Essl(Mat A,IS r,IS c,MatFactorInfo *info,Mat *F) 129e8aa55a4SKris Buschelman { 130e8aa55a4SKris Buschelman Mat B; 131*eef49c96SKris Buschelman Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 132*eef49c96SKris Buschelman int ierr,len; 133e8aa55a4SKris Buschelman Mat_SeqAIJ_Essl *essl; 134e8aa55a4SKris Buschelman PetscReal f = 1.0; 135e8aa55a4SKris Buschelman 136e8aa55a4SKris Buschelman PetscFunctionBegin; 137e8aa55a4SKris Buschelman if (A->N != A->M) SETERRQ(PETSC_ERR_ARG_SIZ,"matrix must be square"); 138e8aa55a4SKris Buschelman ierr = MatCreate(A->comm,PETSC_DECIDE,PETSC_DECIDE,A->m,A->n,&B);CHKERRQ(ierr); 139e8aa55a4SKris Buschelman ierr = MatSetType(B,MATESSL);CHKERRQ(ierr); 140e8aa55a4SKris Buschelman ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr); 141e8aa55a4SKris Buschelman 142e8aa55a4SKris Buschelman B->ops->solve = MatSolve_SeqAIJ_Essl; 143e8aa55a4SKris Buschelman B->ops->lufactornumeric = MatLUFactorNumeric_SeqAIJ_Essl; 144e8aa55a4SKris Buschelman B->factor = FACTOR_LU; 145e8aa55a4SKris Buschelman 146e8aa55a4SKris Buschelman essl = (Mat_SeqAIJ_Essl *)(B->spptr); 147e8aa55a4SKris Buschelman 148e8aa55a4SKris Buschelman /* allocate the work arrays required by ESSL */ 149e8aa55a4SKris Buschelman f = info->fill; 150e8aa55a4SKris Buschelman essl->nz = a->nz; 151e8aa55a4SKris Buschelman essl->lna = (int)a->nz*f; 152e8aa55a4SKris Buschelman essl->naux = 100 + 10*A->m; 153e8aa55a4SKris Buschelman 154e8aa55a4SKris Buschelman /* since malloc is slow on IBM we try a single malloc */ 155e8aa55a4SKris Buschelman len = essl->lna*(2*sizeof(int)+sizeof(PetscScalar)) + essl->naux*sizeof(PetscScalar); 156e8aa55a4SKris Buschelman ierr = PetscMalloc(len,&essl->a);CHKERRQ(ierr); 157e8aa55a4SKris Buschelman essl->aux = essl->a + essl->lna; 158e8aa55a4SKris Buschelman essl->ia = (int*)(essl->aux + essl->naux); 159e8aa55a4SKris Buschelman essl->ja = essl->ia + essl->lna; 160e8aa55a4SKris Buschelman 161e8aa55a4SKris Buschelman PetscLogObjectMemory(B,len+sizeof(Mat_SeqAIJ_Essl)); 162e8aa55a4SKris Buschelman *F = B; 163e8aa55a4SKris Buschelman PetscFunctionReturn(0); 164e8aa55a4SKris Buschelman } 165e8aa55a4SKris Buschelman 166460c4903SKris Buschelman EXTERN_C_BEGIN 167e8aa55a4SKris Buschelman #undef __FUNCT__ 168460c4903SKris Buschelman #define __FUNCT__ "MatConvert_SeqAIJ_Essl" 169460c4903SKris Buschelman int MatConvert_SeqAIJ_Essl(Mat A,MatType type,Mat *newmat) { 170460c4903SKris Buschelman Mat B=*newmat; 171460c4903SKris Buschelman int ierr; 172460c4903SKris Buschelman Mat_SeqAIJ_Essl *essl; 173460c4903SKris Buschelman 174e8aa55a4SKris Buschelman PetscFunctionBegin; 175460c4903SKris Buschelman 176460c4903SKris Buschelman if (B != A) { 177460c4903SKris Buschelman ierr = MatDuplicate(A,MAT_COPY_VALUES,&B);CHKERRQ(ierr); 178460c4903SKris Buschelman } 179460c4903SKris Buschelman 180460c4903SKris Buschelman ierr = PetscNew(Mat_SeqAIJ_Essl,&essl);CHKERRQ(ierr); 181460c4903SKris Buschelman essl->MatAssemblyEnd = A->ops->assemblyend; 182460c4903SKris Buschelman essl->MatLUFactorSymbolic = A->ops->lufactorsymbolic; 183460c4903SKris Buschelman essl->MatDestroy = A->ops->destroy; 184460c4903SKris Buschelman B->spptr = (void *)essl; 185460c4903SKris Buschelman 186460c4903SKris Buschelman B->ops->assemblyend = MatAssemblyEnd_SeqAIJ_Essl; 187460c4903SKris Buschelman B->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqAIJ_Essl; 188460c4903SKris Buschelman B->ops->destroy = MatDestroy_SeqAIJ_Essl; 189460c4903SKris Buschelman 190460c4903SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqaij_essl_C", 191460c4903SKris Buschelman "MatConvert_SeqAIJ_Essl",MatConvert_SeqAIJ_Essl);CHKERRQ(ierr); 192460c4903SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_essl_seqaij_C", 193460c4903SKris Buschelman "MatConvert_Essl_SeqAIJ",MatConvert_Essl_SeqAIJ);CHKERRQ(ierr); 194460c4903SKris Buschelman ierr = PetscObjectChangeTypeName((PetscObject)B,type);CHKERRQ(ierr); 195460c4903SKris Buschelman *newmat = B; 196e8aa55a4SKris Buschelman PetscFunctionReturn(0); 197e8aa55a4SKris Buschelman } 198460c4903SKris Buschelman EXTERN_C_END 199e8aa55a4SKris Buschelman 200e8aa55a4SKris Buschelman EXTERN_C_BEGIN 201e8aa55a4SKris Buschelman #undef __FUNCT__ 202e8aa55a4SKris Buschelman #define __FUNCT__ "MatCreate_SeqAIJ_Essl" 203e8aa55a4SKris Buschelman int MatCreate_SeqAIJ_Essl(Mat A) { 204e8aa55a4SKris Buschelman int ierr; 205e8aa55a4SKris Buschelman 206e8aa55a4SKris Buschelman PetscFunctionBegin; 207e8aa55a4SKris Buschelman ierr = MatSetType(A,MATSEQAIJ); 208460c4903SKris Buschelman ierr = MatConvert_SeqAIJ_Essl(A,MATESSL,&A);CHKERRQ(ierr); 209e8aa55a4SKris Buschelman PetscFunctionReturn(0); 210e8aa55a4SKris Buschelman } 2114eb8e494SKris Buschelman EXTERN_C_END 212