xref: /petsc/src/mat/impls/aij/seq/essl/essl.c (revision 8cc058d9cd56c1ccb3be12a47760ddfc446aaffc)
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