xref: /petsc/src/mat/impls/aij/seq/essl/essl.c (revision 2205254efee3a00a594e5e2a3a70f74dcb40bc03)
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;
38bf0cc555SLisandro 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;
53c5c20521SJed Brown   int            nessl,zero = 0;
54e8aa55a4SKris Buschelman 
55e8aa55a4SKris Buschelman   PetscFunctionBegin;
56c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&nessl);CHKERRQ(ierr);
57e8aa55a4SKris Buschelman   ierr = VecCopy(b,x);CHKERRQ(ierr);
58e8aa55a4SKris Buschelman   ierr = VecGetArray(x,&xx);CHKERRQ(ierr);
59c5c20521SJed Brown   dgss(&zero,&nessl,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;
71c5c20521SJed Brown   int            nessl,i,one = 1;
72e8aa55a4SKris Buschelman 
73e8aa55a4SKris Buschelman   PetscFunctionBegin;
74c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&nessl);CHKERRQ(ierr);
75e8aa55a4SKris Buschelman   /* copy matrix data into silly ESSL data structure (1-based Frotran style) */
76d0f46423SBarry 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;
88*2205254eSKarl Rupp 
897adad957SLisandro Dalcin   ierr = PetscOptionsGetReal(((PetscObject)A)->prefix,"-matessl_lu_threshold",&essl->rparm[1],PETSC_NULL);CHKERRQ(ierr);
90e8aa55a4SKris Buschelman 
91c5c20521SJed Brown   dgsf(&one,&nessl,&essl->nz,essl->a,essl->ia,essl->ja,&essl->lna,essl->iparm,essl->rparm,essl->oparm,essl->aux,&essl->naux);
92e8aa55a4SKris Buschelman 
9335bd34faSBarry Smith   F->ops->solve     = MatSolve_Essl;
94719d5645SBarry Smith   (F)->assembled    = PETSC_TRUE;
95719d5645SBarry Smith   (F)->preallocated = PETSC_TRUE;
96e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
97e8aa55a4SKris Buschelman }
98e8aa55a4SKris Buschelman 
99b24902e0SBarry Smith 
100719d5645SBarry Smith 
101719d5645SBarry Smith 
102e8aa55a4SKris Buschelman #undef __FUNCT__
103f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Essl"
1040481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Essl(Mat B,Mat A,IS r,IS c,const MatFactorInfo *info)
105b24902e0SBarry Smith {
106eef49c96SKris Buschelman   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)A->data;
107dfbe8321SBarry Smith   PetscErrorCode ierr;
108f0c56d0fSKris Buschelman   Mat_Essl       *essl;
109e8aa55a4SKris Buschelman   PetscReal      f = 1.0;
110e8aa55a4SKris Buschelman 
111e8aa55a4SKris Buschelman   PetscFunctionBegin;
112f0c56d0fSKris Buschelman   essl = (Mat_Essl*)(B->spptr);
113e8aa55a4SKris Buschelman 
114e8aa55a4SKris Buschelman   /* allocate the work arrays required by ESSL */
115e8aa55a4SKris Buschelman   f    = info->fill;
116c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->nz,&essl->nz);CHKERRQ(ierr);
117c5df96a5SBarry Smith   ierr = PetscBLASIntCast((PetscInt)(a->nz*f),&essl->lna);CHKERRQ(ierr);
118c5df96a5SBarry Smith   ierr = PetscBLASIntCast(100 + 10*A->rmap->n,&essl->naux);CHKERRQ(ierr);
119e8aa55a4SKris Buschelman 
120e8aa55a4SKris Buschelman   /* since malloc is slow on IBM we try a single malloc */
12123bdbc58SBarry 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);
122*2205254eSKarl Rupp 
1232f71e704SKris Buschelman   essl->CleanUpESSL = PETSC_TRUE;
124e8aa55a4SKris Buschelman 
125052f0c41SBarry Smith   ierr = PetscLogObjectMemory(B,essl->lna*(2*sizeof(int)+sizeof(PetscScalar)) + essl->naux*sizeof(PetscScalar));CHKERRQ(ierr);
126*2205254eSKarl Rupp 
127db4efbfdSBarry Smith   B->ops->lufactornumeric = MatLUFactorNumeric_Essl;
128e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
129e8aa55a4SKris Buschelman }
130e8aa55a4SKris Buschelman 
13135bd34faSBarry Smith EXTERN_C_BEGIN
13235bd34faSBarry Smith #undef __FUNCT__
13335bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_essl"
13435bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_essl(Mat A,const MatSolverPackage *type)
13535bd34faSBarry Smith {
13635bd34faSBarry Smith   PetscFunctionBegin;
1372692d6eeSBarry Smith   *type = MATSOLVERESSL;
13835bd34faSBarry Smith   PetscFunctionReturn(0);
13935bd34faSBarry Smith }
140719d5645SBarry Smith 
1412f71e704SKris Buschelman /*MC
1422692d6eeSBarry Smith   MATSOLVERESSL - "essl" - Provides direct solvers (LU) for sequential matrices
1432f71e704SKris Buschelman                               via the external package ESSL.
1442f71e704SKris Buschelman 
1452f71e704SKris Buschelman   If ESSL is installed (see the manual for
1462f71e704SKris Buschelman   instructions on how to declare the existence of external packages),
1472f71e704SKris Buschelman 
14841c8de11SBarry Smith   Works with MATSEQAIJ matrices
1492f71e704SKris Buschelman 
1502f71e704SKris Buschelman    Level: beginner
1512f71e704SKris Buschelman 
15241c8de11SBarry Smith .seealso: PCLU, PCFactorSetMatSolverPackage(), MatSolverPackage
1532f71e704SKris Buschelman M*/
1542f71e704SKris Buschelman 
155e8aa55a4SKris Buschelman #undef __FUNCT__
156b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_essl"
1575c9eb25fSBarry Smith PetscErrorCode MatGetFactor_seqaij_essl(Mat A,MatFactorType ftype,Mat *F)
158dfbe8321SBarry Smith {
159b24902e0SBarry Smith   Mat            B;
160dfbe8321SBarry Smith   PetscErrorCode ierr;
161b24902e0SBarry Smith   Mat_Essl       *essl;
162e8aa55a4SKris Buschelman 
163e8aa55a4SKris Buschelman   PetscFunctionBegin;
164e32f2f54SBarry Smith   if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square");
165b24902e0SBarry Smith   ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr);
166d0f46423SBarry Smith   ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
167b24902e0SBarry Smith   ierr = MatSetType(B,((PetscObject)A)->type_name);CHKERRQ(ierr);
168b24902e0SBarry Smith   ierr = MatSeqAIJSetPreallocation(B,0,PETSC_NULL);CHKERRQ(ierr);
169b24902e0SBarry Smith 
170b24902e0SBarry Smith   ierr = PetscNewLog(B,Mat_Essl,&essl);CHKERRQ(ierr);
171*2205254eSKarl Rupp 
172b24902e0SBarry Smith   B->spptr                 = essl;
173b24902e0SBarry Smith   B->ops->lufactorsymbolic = MatLUFactorSymbolic_Essl;
174*2205254eSKarl Rupp 
17535bd34faSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatFactorGetSolverPackage_C","MatFactorGetSolverPackage_essl",MatFactorGetSolverPackage_essl);CHKERRQ(ierr);
176*2205254eSKarl Rupp 
177d5f3da31SBarry Smith   B->factortype = MAT_FACTOR_LU;
178b24902e0SBarry Smith   *F            = B;
179e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
180e8aa55a4SKris Buschelman }
181711adf46SSatish Balay EXTERN_C_END
182