xref: /petsc/src/mat/impls/aij/seq/essl/essl.c (revision 08401ef684002a709c6d3db98a0c9f54a8bcf1ec)
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 {
30ac913495SBarry Smith   Mat_Essl       *essl=(Mat_Essl*)A->data;
31e8aa55a4SKris Buschelman 
32e8aa55a4SKris Buschelman   PetscFunctionBegin;
33ac913495SBarry Smith   if (essl->CleanUpESSL) {
349566063dSJacob Faibussowitsch     PetscCall(PetscFree4(essl->a,essl->aux,essl->ia,essl->ja));
35e8aa55a4SKris Buschelman   }
369566063dSJacob Faibussowitsch   PetscCall(PetscFree(A->data));
37460c4903SKris Buschelman   PetscFunctionReturn(0);
38460c4903SKris Buschelman }
39460c4903SKris Buschelman 
40b24902e0SBarry Smith PetscErrorCode MatSolve_Essl(Mat A,Vec b,Vec x)
41b24902e0SBarry Smith {
42ac913495SBarry Smith   Mat_Essl       *essl = (Mat_Essl*)A->data;
43e8aa55a4SKris Buschelman   PetscScalar    *xx;
44c5c20521SJed Brown   int            nessl,zero = 0;
45e8aa55a4SKris Buschelman 
46e8aa55a4SKris Buschelman   PetscFunctionBegin;
479566063dSJacob Faibussowitsch   PetscCall(PetscBLASIntCast(A->cmap->n,&nessl));
489566063dSJacob Faibussowitsch   PetscCall(VecCopy(b,x));
499566063dSJacob Faibussowitsch   PetscCall(VecGetArray(x,&xx));
50c5c20521SJed Brown   dgss(&zero,&nessl,essl->a,essl->ia,essl->ja,&essl->lna,xx,essl->aux,&essl->naux);
519566063dSJacob Faibussowitsch   PetscCall(VecRestoreArray(x,&xx));
52e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
53e8aa55a4SKris Buschelman }
54e8aa55a4SKris Buschelman 
550481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_Essl(Mat F,Mat A,const MatFactorInfo *info)
56b24902e0SBarry Smith {
57e8aa55a4SKris Buschelman   Mat_SeqAIJ     *aa  =(Mat_SeqAIJ*)(A)->data;
58ac913495SBarry Smith   Mat_Essl       *essl=(Mat_Essl*)(F)->data;
59c5c20521SJed Brown   int            nessl,i,one = 1;
60e8aa55a4SKris Buschelman 
61e8aa55a4SKris Buschelman   PetscFunctionBegin;
629566063dSJacob Faibussowitsch   PetscCall(PetscBLASIntCast(A->rmap->n,&nessl));
63e8aa55a4SKris Buschelman   /* copy matrix data into silly ESSL data structure (1-based Frotran style) */
64d0f46423SBarry Smith   for (i=0; i<A->rmap->n+1; i++) essl->ia[i] = aa->i[i] + 1;
65e8aa55a4SKris Buschelman   for (i=0; i<aa->nz; i++) essl->ja[i] = aa->j[i] + 1;
66e8aa55a4SKris Buschelman 
679566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(essl->a,aa->a,aa->nz));
68e8aa55a4SKris Buschelman 
69e8aa55a4SKris Buschelman   /* set Essl options */
70e8aa55a4SKris Buschelman   essl->iparm[0] = 1;
71e8aa55a4SKris Buschelman   essl->iparm[1] = 5;
72e8aa55a4SKris Buschelman   essl->iparm[2] = 1;
73e8aa55a4SKris Buschelman   essl->iparm[3] = 0;
74e8aa55a4SKris Buschelman   essl->rparm[0] = 1.e-12;
7562331464SKris Buschelman   essl->rparm[1] = 1.0;
762205254eSKarl Rupp 
779566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetReal(NULL,((PetscObject)A)->prefix,"-matessl_lu_threshold",&essl->rparm[1],NULL));
78e8aa55a4SKris Buschelman 
79c5c20521SJed Brown   dgsf(&one,&nessl,&essl->nz,essl->a,essl->ia,essl->ja,&essl->lna,essl->iparm,essl->rparm,essl->oparm,essl->aux,&essl->naux);
80e8aa55a4SKris Buschelman 
8135bd34faSBarry Smith   F->ops->solve     = MatSolve_Essl;
82719d5645SBarry Smith   (F)->assembled    = PETSC_TRUE;
83719d5645SBarry Smith   (F)->preallocated = PETSC_TRUE;
84e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
85e8aa55a4SKris Buschelman }
86e8aa55a4SKris Buschelman 
870481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_Essl(Mat B,Mat A,IS r,IS c,const MatFactorInfo *info)
88b24902e0SBarry Smith {
89eef49c96SKris Buschelman   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)A->data;
90f0c56d0fSKris Buschelman   Mat_Essl       *essl;
91e8aa55a4SKris Buschelman   PetscReal      f = 1.0;
92e8aa55a4SKris Buschelman 
93e8aa55a4SKris Buschelman   PetscFunctionBegin;
94ac913495SBarry Smith   essl = (Mat_Essl*)(B->data);
95e8aa55a4SKris Buschelman 
96e8aa55a4SKris Buschelman   /* allocate the work arrays required by ESSL */
97e8aa55a4SKris Buschelman   f    = info->fill;
989566063dSJacob Faibussowitsch   PetscCall(PetscBLASIntCast(a->nz,&essl->nz));
999566063dSJacob Faibussowitsch   PetscCall(PetscBLASIntCast((PetscInt)(a->nz*f),&essl->lna));
1009566063dSJacob Faibussowitsch   PetscCall(PetscBLASIntCast(100 + 10*A->rmap->n,&essl->naux));
101e8aa55a4SKris Buschelman 
102e8aa55a4SKris Buschelman   /* since malloc is slow on IBM we try a single malloc */
1039566063dSJacob Faibussowitsch   PetscCall(PetscMalloc4(essl->lna,&essl->a,essl->naux,&essl->aux,essl->lna,&essl->ia,essl->lna,&essl->ja));
1042205254eSKarl Rupp 
1052f71e704SKris Buschelman   essl->CleanUpESSL = PETSC_TRUE;
106e8aa55a4SKris Buschelman 
1079566063dSJacob Faibussowitsch   PetscCall(PetscLogObjectMemory((PetscObject)B,essl->lna*(2*sizeof(int)+sizeof(PetscScalar)) + essl->naux*sizeof(PetscScalar)));
1082205254eSKarl Rupp 
109db4efbfdSBarry Smith   B->ops->lufactornumeric = MatLUFactorNumeric_Essl;
110e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
111e8aa55a4SKris Buschelman }
112e8aa55a4SKris Buschelman 
113ea799195SBarry Smith PetscErrorCode MatFactorGetSolverType_essl(Mat A,MatSolverType *type)
11435bd34faSBarry Smith {
11535bd34faSBarry Smith   PetscFunctionBegin;
1162692d6eeSBarry Smith   *type = MATSOLVERESSL;
11735bd34faSBarry Smith   PetscFunctionReturn(0);
11835bd34faSBarry Smith }
119719d5645SBarry Smith 
1202f71e704SKris Buschelman /*MC
1212692d6eeSBarry Smith   MATSOLVERESSL - "essl" - Provides direct solvers (LU) for sequential matrices
1222f71e704SKris Buschelman                               via the external package ESSL.
1232f71e704SKris Buschelman 
1242f71e704SKris Buschelman   If ESSL is installed (see the manual for
1252f71e704SKris Buschelman   instructions on how to declare the existence of external packages),
1262f71e704SKris Buschelman 
12741c8de11SBarry Smith   Works with MATSEQAIJ matrices
1282f71e704SKris Buschelman 
1292f71e704SKris Buschelman    Level: beginner
1302f71e704SKris Buschelman 
1313ca39a21SBarry Smith .seealso: PCLU, PCFactorSetMatSolverType(), MatSolverType
1322f71e704SKris Buschelman M*/
1332f71e704SKris Buschelman 
1348cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqaij_essl(Mat A,MatFactorType ftype,Mat *F)
135dfbe8321SBarry Smith {
136b24902e0SBarry Smith   Mat            B;
137b24902e0SBarry Smith   Mat_Essl       *essl;
138e8aa55a4SKris Buschelman 
139e8aa55a4SKris Buschelman   PetscFunctionBegin;
140*08401ef6SPierre Jolivet   PetscCheck(A->cmap->N == A->rmap->N,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"matrix must be square");
1419566063dSJacob Faibussowitsch   PetscCall(MatCreate(PetscObjectComm((PetscObject)A),&B));
1429566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(B,PETSC_DECIDE,PETSC_DECIDE,A->rmap->n,A->cmap->n));
1439566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy("essl",&((PetscObject)B)->type_name));
1449566063dSJacob Faibussowitsch   PetscCall(MatSetUp(B));
145b24902e0SBarry Smith 
1469566063dSJacob Faibussowitsch   PetscCall(PetscNewLog(B,&essl));
1472205254eSKarl Rupp 
148ac913495SBarry Smith   B->data                  = essl;
149b24902e0SBarry Smith   B->ops->lufactorsymbolic = MatLUFactorSymbolic_Essl;
150ac913495SBarry Smith   B->ops->destroy          = MatDestroy_Essl;
151ac913495SBarry Smith   B->ops->getinfo          = MatGetInfo_External;
1522205254eSKarl Rupp 
1539566063dSJacob Faibussowitsch   PetscCall(PetscObjectComposeFunction((PetscObject)B,"MatFactorGetSolverType_C",MatFactorGetSolverType_essl));
1542205254eSKarl Rupp 
155d5f3da31SBarry Smith   B->factortype = MAT_FACTOR_LU;
1569566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(MATORDERINGEXTERNAL,(char**)&B->preferredordering[MAT_FACTOR_LU]));
1579566063dSJacob Faibussowitsch   PetscCall(PetscFree(B->solvertype));
1589566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(MATSOLVERESSL,&B->solvertype));
15900c67f3bSHong Zhang 
160b24902e0SBarry Smith   *F            = B;
161e8aa55a4SKris Buschelman   PetscFunctionReturn(0);
162e8aa55a4SKris Buschelman }
16342c9c57cSBarry Smith 
1643ca39a21SBarry Smith PETSC_EXTERN PetscErrorCode MatSolverTypeRegister_Essl(void)
16542c9c57cSBarry Smith {
16642c9c57cSBarry Smith   PetscFunctionBegin;
1679566063dSJacob Faibussowitsch   PetscCall(MatSolverTypeRegister(MATSOLVERESSL,MATSEQAIJ,          MAT_FACTOR_LU,MatGetFactor_seqaij_essl));
16842c9c57cSBarry Smith   PetscFunctionReturn(0);
16942c9c57cSBarry Smith }
170