xref: /petsc/src/ksp/pc/impls/chowiluviennacl/chowiluviennacl.cxx (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
14b3f184cSKarl Rupp 
24b3f184cSKarl Rupp /*  -------------------------------------------------------------------- */
34b3f184cSKarl Rupp 
44b3f184cSKarl Rupp /*
54b3f184cSKarl Rupp    Include files needed for the ViennaCL Chow-Patel parallel ILU preconditioner:
64b3f184cSKarl Rupp      pcimpl.h - private include file intended for use by all preconditioners
74b3f184cSKarl Rupp */
84b3f184cSKarl Rupp #define PETSC_SKIP_SPINLOCK
999acd6aaSStefano Zampini #define PETSC_SKIP_IMMINTRIN_H_CUDAWORKAROUND 1
1099acd6aaSStefano Zampini 
114b3f184cSKarl Rupp #include <petsc/private/pcimpl.h> /*I "petscpc.h" I*/
124b3f184cSKarl Rupp #include <../src/mat/impls/aij/seq/aij.h>
134b3f184cSKarl Rupp #include <../src/vec/vec/impls/dvecimpl.h>
144b3f184cSKarl Rupp #include <../src/mat/impls/aij/seq/seqviennacl/viennaclmatimpl.h>
154b3f184cSKarl Rupp #include <../src/vec/vec/impls/seq/seqviennacl/viennaclvecimpl.h>
164b3f184cSKarl Rupp #include <viennacl/linalg/detail/ilu/chow_patel_ilu.hpp>
174b3f184cSKarl Rupp 
184b3f184cSKarl Rupp /*
194b3f184cSKarl Rupp    Private context (data structure) for the CHOWILUVIENNACL preconditioner.
204b3f184cSKarl Rupp */
214b3f184cSKarl Rupp typedef struct {
224b3f184cSKarl Rupp   viennacl::linalg::chow_patel_ilu_precond<viennacl::compressed_matrix<PetscScalar>> *CHOWILUVIENNACL;
234b3f184cSKarl Rupp } PC_CHOWILUVIENNACL;
244b3f184cSKarl Rupp 
254b3f184cSKarl Rupp /* -------------------------------------------------------------------------- */
264b3f184cSKarl Rupp /*
274b3f184cSKarl Rupp    PCSetUp_CHOWILUVIENNACL - Prepares for the use of the CHOWILUVIENNACL preconditioner
284b3f184cSKarl Rupp                              by setting data structures and options.
294b3f184cSKarl Rupp 
304b3f184cSKarl Rupp    Input Parameter:
314b3f184cSKarl Rupp .  pc - the preconditioner context
324b3f184cSKarl Rupp 
334b3f184cSKarl Rupp    Application Interface Routine: PCSetUp()
344b3f184cSKarl Rupp 
354b3f184cSKarl Rupp    Notes:
364b3f184cSKarl Rupp    The interface routine PCSetUp() is not usually called directly by
374b3f184cSKarl Rupp    the user, but instead is called by PCApply() if necessary.
384b3f184cSKarl Rupp */
39*9371c9d4SSatish Balay static PetscErrorCode PCSetUp_CHOWILUVIENNACL(PC pc) {
404b3f184cSKarl Rupp   PC_CHOWILUVIENNACL *ilu = (PC_CHOWILUVIENNACL *)pc->data;
414b3f184cSKarl Rupp   PetscBool           flg = PETSC_FALSE;
424b3f184cSKarl Rupp   Mat_SeqAIJViennaCL *gpustruct;
434b3f184cSKarl Rupp 
444b3f184cSKarl Rupp   PetscFunctionBegin;
459566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)pc->pmat, MATSEQAIJVIENNACL, &flg));
4628b400f6SJacob Faibussowitsch   PetscCheck(flg, PetscObjectComm((PetscObject)pc), PETSC_ERR_SUP, "Currently only handles ViennaCL matrices");
474b3f184cSKarl Rupp   if (pc->setupcalled != 0) {
484b3f184cSKarl Rupp     try {
494b3f184cSKarl Rupp       delete ilu->CHOWILUVIENNACL;
50*9371c9d4SSatish Balay     } catch (char *ex) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_LIB, "ViennaCL error: %s", ex); }
514b3f184cSKarl Rupp   }
524b3f184cSKarl Rupp   try {
534b3f184cSKarl Rupp #if defined(PETSC_USE_COMPLEX)
544b3f184cSKarl Rupp     gpustruct = NULL;
554b3f184cSKarl Rupp     SETERRQ(PetscObjectComm((PetscObject)pc), PETSC_ERR_SUP, "No support for complex arithmetic in CHOWILUVIENNACL preconditioner");
564b3f184cSKarl Rupp #else
579566063dSJacob Faibussowitsch     PetscCall(MatViennaCLCopyToGPU(pc->pmat));
584b3f184cSKarl Rupp     gpustruct = (Mat_SeqAIJViennaCL *)(pc->pmat->spptr);
594b3f184cSKarl Rupp 
604b3f184cSKarl Rupp     viennacl::linalg::chow_patel_tag ilu_tag;
614b3f184cSKarl Rupp     ViennaCLAIJMatrix               *mat = (ViennaCLAIJMatrix *)gpustruct->mat;
624b3f184cSKarl Rupp     ilu->CHOWILUVIENNACL                 = new viennacl::linalg::chow_patel_ilu_precond<viennacl::compressed_matrix<PetscScalar>>(*mat, ilu_tag);
634b3f184cSKarl Rupp #endif
64*9371c9d4SSatish Balay   } catch (char *ex) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_LIB, "ViennaCL error: %s", ex); }
654b3f184cSKarl Rupp   PetscFunctionReturn(0);
664b3f184cSKarl Rupp }
674b3f184cSKarl Rupp 
684b3f184cSKarl Rupp /* -------------------------------------------------------------------------- */
694b3f184cSKarl Rupp /*
704b3f184cSKarl Rupp    PCApply_CHOWILUVIENNACL - Applies the CHOWILUVIENNACL preconditioner to a vector.
714b3f184cSKarl Rupp 
724b3f184cSKarl Rupp    Input Parameters:
734b3f184cSKarl Rupp .  pc - the preconditioner context
744b3f184cSKarl Rupp .  x - input vector
754b3f184cSKarl Rupp 
764b3f184cSKarl Rupp    Output Parameter:
774b3f184cSKarl Rupp .  y - output vector
784b3f184cSKarl Rupp 
794b3f184cSKarl Rupp    Application Interface Routine: PCApply()
804b3f184cSKarl Rupp  */
81*9371c9d4SSatish Balay static PetscErrorCode PCApply_CHOWILUVIENNACL(PC pc, Vec x, Vec y) {
824b3f184cSKarl Rupp   PC_CHOWILUVIENNACL                  *ilu = (PC_CHOWILUVIENNACL *)pc->data;
834b3f184cSKarl Rupp   PetscBool                            flg1, flg2;
844b3f184cSKarl Rupp   viennacl::vector<PetscScalar> const *xarray = NULL;
854b3f184cSKarl Rupp   viennacl::vector<PetscScalar>       *yarray = NULL;
864b3f184cSKarl Rupp 
874b3f184cSKarl Rupp   PetscFunctionBegin;
884b3f184cSKarl Rupp   /*how to apply a certain fixed number of iterations?*/
899566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)x, VECSEQVIENNACL, &flg1));
909566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)y, VECSEQVIENNACL, &flg2));
9108401ef6SPierre Jolivet   PetscCheck((flg1 && flg2), PetscObjectComm((PetscObject)pc), PETSC_ERR_SUP, "Currently only handles ViennaCL vectors");
92*9371c9d4SSatish Balay   if (!ilu->CHOWILUVIENNACL) { PetscCall(PCSetUp_CHOWILUVIENNACL(pc)); }
939566063dSJacob Faibussowitsch   PetscCall(VecSet(y, 0.0));
949566063dSJacob Faibussowitsch   PetscCall(VecViennaCLGetArrayRead(x, &xarray));
959566063dSJacob Faibussowitsch   PetscCall(VecViennaCLGetArrayWrite(y, &yarray));
964b3f184cSKarl Rupp   try {
974b3f184cSKarl Rupp #if defined(PETSC_USE_COMPLEX)
984b3f184cSKarl Rupp 
994b3f184cSKarl Rupp #else
1004b3f184cSKarl Rupp     *yarray                              = *xarray;
1014b3f184cSKarl Rupp     ilu->CHOWILUVIENNACL->apply(*yarray);
1024b3f184cSKarl Rupp #endif
103*9371c9d4SSatish Balay   } catch (char *ex) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_LIB, "ViennaCL error: %s", ex); }
1049566063dSJacob Faibussowitsch   PetscCall(VecViennaCLRestoreArrayRead(x, &xarray));
1059566063dSJacob Faibussowitsch   PetscCall(VecViennaCLRestoreArrayWrite(y, &yarray));
1069566063dSJacob Faibussowitsch   PetscCall(PetscObjectStateIncrease((PetscObject)y));
1074b3f184cSKarl Rupp   PetscFunctionReturn(0);
1084b3f184cSKarl Rupp }
1094b3f184cSKarl Rupp /* -------------------------------------------------------------------------- */
1104b3f184cSKarl Rupp /*
1114b3f184cSKarl Rupp    PCDestroy_CHOWILUVIENNACL - Destroys the private context for the CHOWILUVIENNACL preconditioner
1124b3f184cSKarl Rupp    that was created with PCCreate_CHOWILUVIENNACL().
1134b3f184cSKarl Rupp 
1144b3f184cSKarl Rupp    Input Parameter:
1154b3f184cSKarl Rupp .  pc - the preconditioner context
1164b3f184cSKarl Rupp 
1174b3f184cSKarl Rupp    Application Interface Routine: PCDestroy()
1184b3f184cSKarl Rupp */
119*9371c9d4SSatish Balay static PetscErrorCode PCDestroy_CHOWILUVIENNACL(PC pc) {
1204b3f184cSKarl Rupp   PC_CHOWILUVIENNACL *ilu = (PC_CHOWILUVIENNACL *)pc->data;
1214b3f184cSKarl Rupp 
1224b3f184cSKarl Rupp   PetscFunctionBegin;
1234b3f184cSKarl Rupp   if (ilu->CHOWILUVIENNACL) {
1244b3f184cSKarl Rupp     try {
1254b3f184cSKarl Rupp       delete ilu->CHOWILUVIENNACL;
126*9371c9d4SSatish Balay     } catch (char *ex) { SETERRQ(PETSC_COMM_SELF, PETSC_ERR_LIB, "ViennaCL error: %s", ex); }
1274b3f184cSKarl Rupp   }
1284b3f184cSKarl Rupp 
1294b3f184cSKarl Rupp   /*
1304b3f184cSKarl Rupp       Free the private data structure that was hanging off the PC
1314b3f184cSKarl Rupp   */
1329566063dSJacob Faibussowitsch   PetscCall(PetscFree(pc->data));
1334b3f184cSKarl Rupp   PetscFunctionReturn(0);
1344b3f184cSKarl Rupp }
1354b3f184cSKarl Rupp 
136*9371c9d4SSatish Balay static PetscErrorCode PCSetFromOptions_CHOWILUVIENNACL(PC pc, PetscOptionItems *PetscOptionsObject) {
1374b3f184cSKarl Rupp   PetscFunctionBegin;
138d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "CHOWILUVIENNACL options");
139d0609cedSBarry Smith   PetscOptionsHeadEnd();
1404b3f184cSKarl Rupp   PetscFunctionReturn(0);
1414b3f184cSKarl Rupp }
1424b3f184cSKarl Rupp 
1434b3f184cSKarl Rupp /* -------------------------------------------------------------------------- */
1444b3f184cSKarl Rupp 
1454b3f184cSKarl Rupp /*MC
1464b3f184cSKarl Rupp      PCCHOWILUViennaCL  - A smoothed agglomeration algorithm that can be used via the CUDA, OpenCL, and OpenMP backends of ViennaCL
1474b3f184cSKarl Rupp 
1484b3f184cSKarl Rupp    Level: advanced
1494b3f184cSKarl Rupp 
150db781477SPatrick Sanan .seealso: `PCCreate()`, `PCSetType()`, `PCType`, `PC`
1514b3f184cSKarl Rupp 
1524b3f184cSKarl Rupp M*/
1534b3f184cSKarl Rupp 
154*9371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PCCreate_CHOWILUVIENNACL(PC pc) {
1554b3f184cSKarl Rupp   PC_CHOWILUVIENNACL *ilu;
1564b3f184cSKarl Rupp 
1574b3f184cSKarl Rupp   PetscFunctionBegin;
1584b3f184cSKarl Rupp   /*
1594b3f184cSKarl Rupp      Creates the private data structure for this preconditioner and
1604b3f184cSKarl Rupp      attach it to the PC object.
1614b3f184cSKarl Rupp   */
1629566063dSJacob Faibussowitsch   PetscCall(PetscNewLog(pc, &ilu));
1634b3f184cSKarl Rupp   pc->data = (void *)ilu;
1644b3f184cSKarl Rupp 
1654b3f184cSKarl Rupp   /*
1664b3f184cSKarl Rupp      Initialize the pointer to zero
1674b3f184cSKarl Rupp      Initialize number of v-cycles to default (1)
1684b3f184cSKarl Rupp   */
1694b3f184cSKarl Rupp   ilu->CHOWILUVIENNACL = 0;
1704b3f184cSKarl Rupp 
1714b3f184cSKarl Rupp   /*
1724b3f184cSKarl Rupp       Set the pointers for the functions that are provided above.
1734b3f184cSKarl Rupp       Now when the user-level routines (such as PCApply(), PCDestroy(), etc.)
1744b3f184cSKarl Rupp       are called, they will automatically call these functions.  Note we
1754b3f184cSKarl Rupp       choose not to provide a couple of these functions since they are
1764b3f184cSKarl Rupp       not needed.
1774b3f184cSKarl Rupp   */
1784b3f184cSKarl Rupp   pc->ops->apply               = PCApply_CHOWILUVIENNACL;
1794b3f184cSKarl Rupp   pc->ops->applytranspose      = 0;
1804b3f184cSKarl Rupp   pc->ops->setup               = PCSetUp_CHOWILUVIENNACL;
1814b3f184cSKarl Rupp   pc->ops->destroy             = PCDestroy_CHOWILUVIENNACL;
1824b3f184cSKarl Rupp   pc->ops->setfromoptions      = PCSetFromOptions_CHOWILUVIENNACL;
1834b3f184cSKarl Rupp   pc->ops->view                = 0;
1844b3f184cSKarl Rupp   pc->ops->applyrichardson     = 0;
1854b3f184cSKarl Rupp   pc->ops->applysymmetricleft  = 0;
1864b3f184cSKarl Rupp   pc->ops->applysymmetricright = 0;
1874b3f184cSKarl Rupp   PetscFunctionReturn(0);
1884b3f184cSKarl Rupp }
189