xref: /petsc/src/mat/impls/aij/seq/essl/essl.c (revision ac9134951bfbda37ff11bc4c5d23bbf95229f72e)
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 
28e8aa55a4SKris Buschelman #undef __FUNCT__
29f0c56d0fSKris Buschelman #define __FUNCT__ "MatDestroy_Essl"
30dfbe8321SBarry Smith PetscErrorCode MatDestroy_Essl(Mat A)
31dfbe8321SBarry Smith {
32dfbe8321SBarry Smith   PetscErrorCode ierr;
33*ac913495SBarry Smith   Mat_Essl       *essl=(Mat_Essl*)A->data;
34e8aa55a4SKris Buschelman 
35e8aa55a4SKris Buschelman   PetscFunctionBegin;
36*ac913495SBarry Smith   if (essl->CleanUpESSL) {
3723bdbc58SBarry Smith     ierr = PetscFree4(essl->a,essl->aux,essl->ia,essl->ja);CHKERRQ(ierr);
38e8aa55a4SKris Buschelman   }
39*ac913495SBarry Smith   ierr = PetscFree(A->data);CHKERRQ(ierr);
40460c4903SKris Buschelman   PetscFunctionReturn(0);
41460c4903SKris Buschelman }
42460c4903SKris Buschelman 
43460c4903SKris Buschelman #undef __FUNCT__
44f0c56d0fSKris Buschelman #define __FUNCT__ "MatSolve_Essl"
45b24902e0SBarry Smith PetscErrorCode MatSolve_Essl(Mat A,Vec b,Vec x)
46b24902e0SBarry Smith {
47*ac913495SBarry Smith   Mat_Essl       *essl = (Mat_Essl*)A->data;
48e8aa55a4SKris Buschelman   PetscScalar    *xx;
49dfbe8321SBarry Smith   PetscErrorCode ierr;
50c5c20521SJed Brown   int            nessl,zero = 0;
51e8aa55a4SKris Buschelman 
52e8aa55a4SKris Buschelman   PetscFunctionBegin;
53c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&nessl);CHKERRQ(ierr);
54e8aa55a4SKris Buschelman   ierr = VecCopy(b,x);CHKERRQ(ierr);
55e8aa55a4SKris Buschelman   ierr = VecGetArray(x,&xx);CHKERRQ(ierr);
56c5c20521SJed Brown   dgss(&zero,&nessl,essl->a,essl->ia,essl->ja,&essl->lna,xx,essl->aux,&essl->naux);
57e8aa55a4SKris Buschelman   ierr = VecRestoreArray(x,&xx);CHKERRQ(ierr);
58e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
59e8aa55a4SKris Buschelman }
60e8aa55a4SKris Buschelman 
61e8aa55a4SKris Buschelman #undef __FUNCT__
62f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorNumeric_Essl"
630481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Essl(Mat F,Mat A,const MatFactorInfo *info)
64b24902e0SBarry Smith {
65e8aa55a4SKris Buschelman   Mat_SeqAIJ     *aa  =(Mat_SeqAIJ*)(A)->data;
66*ac913495SBarry Smith   Mat_Essl       *essl=(Mat_Essl*)(F)->data;
676849ba73SBarry Smith   PetscErrorCode ierr;
68c5c20521SJed Brown   int            nessl,i,one = 1;
69e8aa55a4SKris Buschelman 
70e8aa55a4SKris Buschelman   PetscFunctionBegin;
71c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&nessl);CHKERRQ(ierr);
72e8aa55a4SKris Buschelman   /* copy matrix data into silly ESSL data structure (1-based Frotran style) */
73d0f46423SBarry Smith   for (i=0; i<A->rmap->n+1; i++) essl->ia[i] = aa->i[i] + 1;
74e8aa55a4SKris Buschelman   for (i=0; i<aa->nz; i++) essl->ja[i] = aa->j[i] + 1;
75e8aa55a4SKris Buschelman 
76e8aa55a4SKris Buschelman   ierr = PetscMemcpy(essl->a,aa->a,(aa->nz)*sizeof(PetscScalar));CHKERRQ(ierr);
77e8aa55a4SKris Buschelman 
78e8aa55a4SKris Buschelman   /* set Essl options */
79e8aa55a4SKris Buschelman   essl->iparm[0] = 1;
80e8aa55a4SKris Buschelman   essl->iparm[1] = 5;
81e8aa55a4SKris Buschelman   essl->iparm[2] = 1;
82e8aa55a4SKris Buschelman   essl->iparm[3] = 0;
83e8aa55a4SKris Buschelman   essl->rparm[0] = 1.e-12;
8462331464SKris Buschelman   essl->rparm[1] = 1.0;
852205254eSKarl Rupp 
860298fd71SBarry Smith   ierr = PetscOptionsGetReal(((PetscObject)A)->prefix,"-matessl_lu_threshold",&essl->rparm[1],NULL);CHKERRQ(ierr);
87e8aa55a4SKris Buschelman 
88c5c20521SJed Brown   dgsf(&one,&nessl,&essl->nz,essl->a,essl->ia,essl->ja,&essl->lna,essl->iparm,essl->rparm,essl->oparm,essl->aux,&essl->naux);
89e8aa55a4SKris Buschelman 
9035bd34faSBarry Smith   F->ops->solve     = MatSolve_Essl;
91719d5645SBarry Smith   (F)->assembled    = PETSC_TRUE;
92719d5645SBarry Smith   (F)->preallocated = PETSC_TRUE;
93e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
94e8aa55a4SKris Buschelman }
95e8aa55a4SKris Buschelman 
96b24902e0SBarry Smith 
97719d5645SBarry Smith 
98719d5645SBarry Smith 
99e8aa55a4SKris Buschelman #undef __FUNCT__
100f0c56d0fSKris Buschelman #define __FUNCT__ "MatLUFactorSymbolic_Essl"
1010481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Essl(Mat B,Mat A,IS r,IS c,const MatFactorInfo *info)
102b24902e0SBarry Smith {
103eef49c96SKris Buschelman   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)A->data;
104dfbe8321SBarry Smith   PetscErrorCode ierr;
105f0c56d0fSKris Buschelman   Mat_Essl       *essl;
106e8aa55a4SKris Buschelman   PetscReal      f = 1.0;
107e8aa55a4SKris Buschelman 
108e8aa55a4SKris Buschelman   PetscFunctionBegin;
109*ac913495SBarry Smith   essl = (Mat_Essl*)(B->data);
110e8aa55a4SKris Buschelman 
111e8aa55a4SKris Buschelman   /* allocate the work arrays required by ESSL */
112e8aa55a4SKris Buschelman   f    = info->fill;
113c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->nz,&essl->nz);CHKERRQ(ierr);
114c5df96a5SBarry Smith   ierr = PetscBLASIntCast((PetscInt)(a->nz*f),&essl->lna);CHKERRQ(ierr);
115c5df96a5SBarry Smith   ierr = PetscBLASIntCast(100 + 10*A->rmap->n,&essl->naux);CHKERRQ(ierr);
116e8aa55a4SKris Buschelman 
117e8aa55a4SKris Buschelman   /* since malloc is slow on IBM we try a single malloc */
118dcca6d9dSJed Brown   ierr = PetscMalloc4(essl->lna,&essl->a,essl->naux,&essl->aux,essl->lna,&essl->ia,essl->lna,&essl->ja);CHKERRQ(ierr);
1192205254eSKarl Rupp 
1202f71e704SKris Buschelman   essl->CleanUpESSL = PETSC_TRUE;
121e8aa55a4SKris Buschelman 
1223bb1ff40SBarry Smith   ierr = PetscLogObjectMemory((PetscObject)B,essl->lna*(2*sizeof(int)+sizeof(PetscScalar)) + essl->naux*sizeof(PetscScalar));CHKERRQ(ierr);
1232205254eSKarl Rupp 
124db4efbfdSBarry Smith   B->ops->lufactornumeric = MatLUFactorNumeric_Essl;
125e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
126e8aa55a4SKris Buschelman }
127e8aa55a4SKris Buschelman 
12835bd34faSBarry Smith #undef __FUNCT__
12935bd34faSBarry Smith #define __FUNCT__ "MatFactorGetSolverPackage_essl"
13035bd34faSBarry Smith PetscErrorCode MatFactorGetSolverPackage_essl(Mat A,const MatSolverPackage *type)
13135bd34faSBarry Smith {
13235bd34faSBarry Smith   PetscFunctionBegin;
1332692d6eeSBarry Smith   *type = MATSOLVERESSL;
13435bd34faSBarry Smith   PetscFunctionReturn(0);
13535bd34faSBarry Smith }
136719d5645SBarry Smith 
1372f71e704SKris Buschelman /*MC
1382692d6eeSBarry Smith   MATSOLVERESSL - "essl" - Provides direct solvers (LU) for sequential matrices
1392f71e704SKris Buschelman                               via the external package ESSL.
1402f71e704SKris Buschelman 
1412f71e704SKris Buschelman   If ESSL is installed (see the manual for
1422f71e704SKris Buschelman   instructions on how to declare the existence of external packages),
1432f71e704SKris Buschelman 
14441c8de11SBarry Smith   Works with MATSEQAIJ matrices
1452f71e704SKris Buschelman 
1462f71e704SKris Buschelman    Level: beginner
1472f71e704SKris Buschelman 
14841c8de11SBarry Smith .seealso: PCLU, PCFactorSetMatSolverPackage(), MatSolverPackage
1492f71e704SKris Buschelman M*/
1502f71e704SKris Buschelman 
151e8aa55a4SKris Buschelman #undef __FUNCT__
152b24902e0SBarry Smith #define __FUNCT__ "MatGetFactor_seqaij_essl"
1538cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqaij_essl(Mat A,MatFactorType ftype,Mat *F)
154dfbe8321SBarry Smith {
155b24902e0SBarry Smith   Mat            B;
156dfbe8321SBarry Smith   PetscErrorCode ierr;
157b24902e0SBarry Smith   Mat_Essl       *essl;
158e8aa55a4SKris Buschelman 
159e8aa55a4SKris Buschelman   PetscFunctionBegin;
160e32f2f54SBarry Smith   if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square");
161ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
162d0f46423SBarry Smith   ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
163*ac913495SBarry Smith   ierr = PetscStrallocpy("essl",&((PetscObject)B)->type_name);CHKERRQ(ierr);
164*ac913495SBarry Smith   ierr = MatSetUp(B);CHKERRQ(ierr);
165b24902e0SBarry Smith 
166b00a9115SJed Brown   ierr = PetscNewLog(B,&essl);CHKERRQ(ierr);
1672205254eSKarl Rupp 
168*ac913495SBarry Smith   B->data                  = essl;
169b24902e0SBarry Smith   B->ops->lufactorsymbolic = MatLUFactorSymbolic_Essl;
170*ac913495SBarry Smith   B->ops->destroy          = MatDestroy_Essl;
171*ac913495SBarry Smith   B->ops->getinfo          = MatGetInfo_External;
1722205254eSKarl Rupp 
173bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverPackage_C",MatFactorGetSolverPackage_essl);CHKERRQ(ierr);
1742205254eSKarl Rupp 
175d5f3da31SBarry Smith   B->factortype = MAT_FACTOR_LU;
17600c67f3bSHong Zhang   ierr = PetscFree(B->solvertype);CHKERRQ(ierr);
17700c67f3bSHong Zhang   ierr = PetscStrallocpy(MATSOLVERESSL,&B->solvertype);CHKERRQ(ierr);
17800c67f3bSHong Zhang 
179b24902e0SBarry Smith   *F            = B;
180e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
181e8aa55a4SKris Buschelman }
18242c9c57cSBarry Smith 
18342c9c57cSBarry Smith #undef __FUNCT__
18442c9c57cSBarry Smith #define __FUNCT__ "MatSolverPackageRegister_Essl"
18529b38603SBarry Smith PETSC_EXTERN PetscErrorCode MatSolverPackageRegister_Essl(void)
18642c9c57cSBarry Smith {
18742c9c57cSBarry Smith   PetscErrorCode ierr;
18842c9c57cSBarry Smith   PetscFunctionBegin;
18942c9c57cSBarry Smith   ierr = MatSolverPackageRegister(MATSOLVERESSL,MATSEQAIJ,          MAT_FACTOR_LU,MatGetFactor_seqaij_essl);CHKERRQ(ierr);
19042c9c57cSBarry Smith   PetscFunctionReturn(0);
19142c9c57cSBarry Smith }
192