xref: /petsc/src/mat/impls/aij/seq/essl/essl.c (revision ea7991952a6fb096779512325fa966c10a8685c8)
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 
28dfbe8321SBarry Smith PetscErrorCode MatDestroy_Essl(Mat A)
29dfbe8321SBarry Smith {
30dfbe8321SBarry Smith   PetscErrorCode ierr;
31ac913495SBarry Smith   Mat_Essl       *essl=(Mat_Essl*)A->data;
32e8aa55a4SKris Buschelman 
33e8aa55a4SKris Buschelman   PetscFunctionBegin;
34ac913495SBarry Smith   if (essl->CleanUpESSL) {
3523bdbc58SBarry Smith     ierr = PetscFree4(essl->a,essl->aux,essl->ia,essl->ja);CHKERRQ(ierr);
36e8aa55a4SKris Buschelman   }
37ac913495SBarry Smith   ierr = PetscFree(A->data);CHKERRQ(ierr);
38460c4903SKris Buschelman   PetscFunctionReturn(0);
39460c4903SKris Buschelman }
40460c4903SKris Buschelman 
41b24902e0SBarry Smith PetscErrorCode MatSolve_Essl(Mat A,Vec b,Vec x)
42b24902e0SBarry Smith {
43ac913495SBarry Smith   Mat_Essl       *essl = (Mat_Essl*)A->data;
44e8aa55a4SKris Buschelman   PetscScalar    *xx;
45dfbe8321SBarry Smith   PetscErrorCode ierr;
46c5c20521SJed Brown   int            nessl,zero = 0;
47e8aa55a4SKris Buschelman 
48e8aa55a4SKris Buschelman   PetscFunctionBegin;
49c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&nessl);CHKERRQ(ierr);
50e8aa55a4SKris Buschelman   ierr = VecCopy(b,x);CHKERRQ(ierr);
51e8aa55a4SKris Buschelman   ierr = VecGetArray(x,&xx);CHKERRQ(ierr);
52c5c20521SJed Brown   dgss(&zero,&nessl,essl->a,essl->ia,essl->ja,&essl->lna,xx,essl->aux,&essl->naux);
53e8aa55a4SKris Buschelman   ierr = VecRestoreArray(x,&xx);CHKERRQ(ierr);
54e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
55e8aa55a4SKris Buschelman }
56e8aa55a4SKris Buschelman 
570481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Essl(Mat F,Mat A,const MatFactorInfo *info)
58b24902e0SBarry Smith {
59e8aa55a4SKris Buschelman   Mat_SeqAIJ     *aa  =(Mat_SeqAIJ*)(A)->data;
60ac913495SBarry Smith   Mat_Essl       *essl=(Mat_Essl*)(F)->data;
616849ba73SBarry Smith   PetscErrorCode ierr;
62c5c20521SJed Brown   int            nessl,i,one = 1;
63e8aa55a4SKris Buschelman 
64e8aa55a4SKris Buschelman   PetscFunctionBegin;
65c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&nessl);CHKERRQ(ierr);
66e8aa55a4SKris Buschelman   /* copy matrix data into silly ESSL data structure (1-based Frotran style) */
67d0f46423SBarry Smith   for (i=0; i<A->rmap->n+1; i++) essl->ia[i] = aa->i[i] + 1;
68e8aa55a4SKris Buschelman   for (i=0; i<aa->nz; i++) essl->ja[i] = aa->j[i] + 1;
69e8aa55a4SKris Buschelman 
70e8aa55a4SKris Buschelman   ierr = PetscMemcpy(essl->a,aa->a,(aa->nz)*sizeof(PetscScalar));CHKERRQ(ierr);
71e8aa55a4SKris Buschelman 
72e8aa55a4SKris Buschelman   /* set Essl options */
73e8aa55a4SKris Buschelman   essl->iparm[0] = 1;
74e8aa55a4SKris Buschelman   essl->iparm[1] = 5;
75e8aa55a4SKris Buschelman   essl->iparm[2] = 1;
76e8aa55a4SKris Buschelman   essl->iparm[3] = 0;
77e8aa55a4SKris Buschelman   essl->rparm[0] = 1.e-12;
7862331464SKris Buschelman   essl->rparm[1] = 1.0;
792205254eSKarl Rupp 
8062f2f501SSatish Balay   ierr = PetscOptionsGetReal(NULL,((PetscObject)A)->prefix,"-matessl_lu_threshold",&essl->rparm[1],NULL);CHKERRQ(ierr);
81e8aa55a4SKris Buschelman 
82c5c20521SJed Brown   dgsf(&one,&nessl,&essl->nz,essl->a,essl->ia,essl->ja,&essl->lna,essl->iparm,essl->rparm,essl->oparm,essl->aux,&essl->naux);
83e8aa55a4SKris Buschelman 
8435bd34faSBarry Smith   F->ops->solve     = MatSolve_Essl;
85719d5645SBarry Smith   (F)->assembled    = PETSC_TRUE;
86719d5645SBarry Smith   (F)->preallocated = PETSC_TRUE;
87e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
88e8aa55a4SKris Buschelman }
89e8aa55a4SKris Buschelman 
90b24902e0SBarry Smith 
91719d5645SBarry Smith 
92719d5645SBarry Smith 
930481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Essl(Mat B,Mat A,IS r,IS c,const MatFactorInfo *info)
94b24902e0SBarry Smith {
95eef49c96SKris Buschelman   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)A->data;
96dfbe8321SBarry Smith   PetscErrorCode ierr;
97f0c56d0fSKris Buschelman   Mat_Essl       *essl;
98e8aa55a4SKris Buschelman   PetscReal      f = 1.0;
99e8aa55a4SKris Buschelman 
100e8aa55a4SKris Buschelman   PetscFunctionBegin;
101ac913495SBarry Smith   essl = (Mat_Essl*)(B->data);
102e8aa55a4SKris Buschelman 
103e8aa55a4SKris Buschelman   /* allocate the work arrays required by ESSL */
104e8aa55a4SKris Buschelman   f    = info->fill;
105c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->nz,&essl->nz);CHKERRQ(ierr);
106c5df96a5SBarry Smith   ierr = PetscBLASIntCast((PetscInt)(a->nz*f),&essl->lna);CHKERRQ(ierr);
107c5df96a5SBarry Smith   ierr = PetscBLASIntCast(100 + 10*A->rmap->n,&essl->naux);CHKERRQ(ierr);
108e8aa55a4SKris Buschelman 
109e8aa55a4SKris Buschelman   /* since malloc is slow on IBM we try a single malloc */
110dcca6d9dSJed Brown   ierr = PetscMalloc4(essl->lna,&essl->a,essl->naux,&essl->aux,essl->lna,&essl->ia,essl->lna,&essl->ja);CHKERRQ(ierr);
1112205254eSKarl Rupp 
1122f71e704SKris Buschelman   essl->CleanUpESSL = PETSC_TRUE;
113e8aa55a4SKris Buschelman 
1143bb1ff40SBarry Smith   ierr = PetscLogObjectMemory((PetscObject)B,essl->lna*(2*sizeof(int)+sizeof(PetscScalar)) + essl->naux*sizeof(PetscScalar));CHKERRQ(ierr);
1152205254eSKarl Rupp 
116db4efbfdSBarry Smith   B->ops->lufactornumeric = MatLUFactorNumeric_Essl;
117e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
118e8aa55a4SKris Buschelman }
119e8aa55a4SKris Buschelman 
120*ea799195SBarry Smith PetscErrorCode MatFactorGetSolverType_essl(Mat A,MatSolverType *type)
12135bd34faSBarry Smith {
12235bd34faSBarry Smith   PetscFunctionBegin;
1232692d6eeSBarry Smith   *type = MATSOLVERESSL;
12435bd34faSBarry Smith   PetscFunctionReturn(0);
12535bd34faSBarry Smith }
126719d5645SBarry Smith 
1272f71e704SKris Buschelman /*MC
1282692d6eeSBarry Smith   MATSOLVERESSL - "essl" - Provides direct solvers (LU) for sequential matrices
1292f71e704SKris Buschelman                               via the external package ESSL.
1302f71e704SKris Buschelman 
1312f71e704SKris Buschelman   If ESSL is installed (see the manual for
1322f71e704SKris Buschelman   instructions on how to declare the existence of external packages),
1332f71e704SKris Buschelman 
13441c8de11SBarry Smith   Works with MATSEQAIJ matrices
1352f71e704SKris Buschelman 
1362f71e704SKris Buschelman    Level: beginner
1372f71e704SKris Buschelman 
1383ca39a21SBarry Smith .seealso: PCLU, PCFactorSetMatSolverType(), MatSolverType
1392f71e704SKris Buschelman M*/
1402f71e704SKris Buschelman 
1418cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqaij_essl(Mat A,MatFactorType ftype,Mat *F)
142dfbe8321SBarry Smith {
143b24902e0SBarry Smith   Mat            B;
144dfbe8321SBarry Smith   PetscErrorCode ierr;
145b24902e0SBarry Smith   Mat_Essl       *essl;
146e8aa55a4SKris Buschelman 
147e8aa55a4SKris Buschelman   PetscFunctionBegin;
148e32f2f54SBarry Smith   if (A->cmap->N != A->rmap->N) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square");
149ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
150d0f46423SBarry Smith   ierr = MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
151ac913495SBarry Smith   ierr = PetscStrallocpy("essl",&((PetscObject)B)->type_name);CHKERRQ(ierr);
152ac913495SBarry Smith   ierr = MatSetUp(B);CHKERRQ(ierr);
153b24902e0SBarry Smith 
154b00a9115SJed Brown   ierr = PetscNewLog(B,&essl);CHKERRQ(ierr);
1552205254eSKarl Rupp 
156ac913495SBarry Smith   B->data                  = essl;
157b24902e0SBarry Smith   B->ops->lufactorsymbolic = MatLUFactorSymbolic_Essl;
158ac913495SBarry Smith   B->ops->destroy          = MatDestroy_Essl;
159ac913495SBarry Smith   B->ops->getinfo          = MatGetInfo_External;
1602205254eSKarl Rupp 
1613ca39a21SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverType_C",MatFactorGetSolverType_essl);CHKERRQ(ierr);
1622205254eSKarl Rupp 
163d5f3da31SBarry Smith   B->factortype = MAT_FACTOR_LU;
16400c67f3bSHong Zhang   ierr = PetscFree(B->solvertype);CHKERRQ(ierr);
16500c67f3bSHong Zhang   ierr = PetscStrallocpy(MATSOLVERESSL,&B->solvertype);CHKERRQ(ierr);
16600c67f3bSHong Zhang 
167b24902e0SBarry Smith   *F            = B;
168e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
169e8aa55a4SKris Buschelman }
17042c9c57cSBarry Smith 
1713ca39a21SBarry Smith PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Essl(void)
17242c9c57cSBarry Smith {
17342c9c57cSBarry Smith   PetscErrorCode ierr;
17442c9c57cSBarry Smith   PetscFunctionBegin;
1753ca39a21SBarry Smith   ierr = MatSolverTypeRegister(MATSOLVERESSL,MATSEQAIJ,          MAT_FACTOR_LU,MatGetFactor_seqaij_essl);CHKERRQ(ierr);
17642c9c57cSBarry Smith   PetscFunctionReturn(0);
17742c9c57cSBarry Smith }
178