116d9e3a6SLisandro Dalcin /* 216d9e3a6SLisandro Dalcin Provides an interface to the LLNL package hypre 316d9e3a6SLisandro Dalcin */ 40f1074feSSatish Balay 5589dcaf0SStefano Zampini #include <petscpkg_version.h> 6af0996ceSBarry Smith #include <petsc/private/pcimpl.h> /*I "petscpc.h" I*/ 749a781f5SStefano Zampini /* this include is needed ONLY to allow access to the private data inside the Mat object specific to hypre */ 849a781f5SStefano Zampini #include <petsc/private/matimpl.h> 96ea7df73SStefano Zampini #include <petsc/private/vecimpl.h> 1058968eb6SStefano Zampini #include <../src/vec/vec/impls/hypre/vhyp.h> 1149a781f5SStefano Zampini #include <../src/mat/impls/hypre/mhypre.h> 12c6db04a5SJed Brown #include <../src/dm/impls/da/hypre/mhyp.h> 134cb006feSStefano Zampini #include <_hypre_parcsr_ls.h> 148a2c336bSFande Kong #include <petscmathypre.h> 1516d9e3a6SLisandro Dalcin 16dff31646SBarry Smith static PetscBool cite = PETSC_FALSE; 17a8d69d7bSBarry Smith static const char hypreCitation[] = "@manual{hypre-web-page,\n title = {{\\sl hypre}: High Performance Preconditioners},\n organization = {Lawrence Livermore National Laboratory},\n note = {\\url{https://computation.llnl.gov/projects/hypre-scalable-linear-solvers-multigrid-methods}}\n}\n"; 181f817a21SBarry Smith 1916d9e3a6SLisandro Dalcin /* 2016d9e3a6SLisandro Dalcin Private context (data structure) for the preconditioner. 2116d9e3a6SLisandro Dalcin */ 2216d9e3a6SLisandro Dalcin typedef struct { 2316d9e3a6SLisandro Dalcin HYPRE_Solver hsolver; 2449a781f5SStefano Zampini Mat hpmat; /* MatHYPRE */ 2516d9e3a6SLisandro Dalcin 264ddd07fcSJed Brown HYPRE_Int (*destroy)(HYPRE_Solver); 274ddd07fcSJed Brown HYPRE_Int (*solve)(HYPRE_Solver,HYPRE_ParCSRMatrix,HYPRE_ParVector,HYPRE_ParVector); 284ddd07fcSJed Brown HYPRE_Int (*setup)(HYPRE_Solver,HYPRE_ParCSRMatrix,HYPRE_ParVector,HYPRE_ParVector); 2916d9e3a6SLisandro Dalcin 3016d9e3a6SLisandro Dalcin MPI_Comm comm_hypre; 3116d9e3a6SLisandro Dalcin char *hypre_type; 3216d9e3a6SLisandro Dalcin 3316d9e3a6SLisandro Dalcin /* options for Pilut and BoomerAMG*/ 344ddd07fcSJed Brown PetscInt maxiter; 3539accc25SStefano Zampini PetscReal tol; 3616d9e3a6SLisandro Dalcin 3716d9e3a6SLisandro Dalcin /* options for Pilut */ 384ddd07fcSJed Brown PetscInt factorrowsize; 3916d9e3a6SLisandro Dalcin 4016d9e3a6SLisandro Dalcin /* options for ParaSails */ 414ddd07fcSJed Brown PetscInt nlevels; 428966356dSPierre Jolivet PetscReal threshold; 4339accc25SStefano Zampini PetscReal filter; 4439accc25SStefano Zampini PetscReal loadbal; 454ddd07fcSJed Brown PetscInt logging; 464ddd07fcSJed Brown PetscInt ruse; 474ddd07fcSJed Brown PetscInt symt; 4816d9e3a6SLisandro Dalcin 4922b6d1caSBarry Smith /* options for BoomerAMG */ 50ace3abfcSBarry Smith PetscBool printstatistics; 5116d9e3a6SLisandro Dalcin 5216d9e3a6SLisandro Dalcin /* options for BoomerAMG */ 534ddd07fcSJed Brown PetscInt cycletype; 544ddd07fcSJed Brown PetscInt maxlevels; 5539accc25SStefano Zampini PetscReal strongthreshold; 5639accc25SStefano Zampini PetscReal maxrowsum; 574ddd07fcSJed Brown PetscInt gridsweeps[3]; 584ddd07fcSJed Brown PetscInt coarsentype; 594ddd07fcSJed Brown PetscInt measuretype; 606a251517SEike Mueller PetscInt smoothtype; 618131ecf7SEike Mueller PetscInt smoothnumlevels; 62ec64516dSEike Mueller PetscInt eu_level; /* Number of levels for ILU(k) in Euclid */ 6339accc25SStefano Zampini PetscReal eu_droptolerance; /* Drop tolerance for ILU(k) in Euclid */ 64ec64516dSEike Mueller PetscInt eu_bj; /* Defines use of Block Jacobi ILU in Euclid */ 654ddd07fcSJed Brown PetscInt relaxtype[3]; 6639accc25SStefano Zampini PetscReal relaxweight; 6739accc25SStefano Zampini PetscReal outerrelaxweight; 684ddd07fcSJed Brown PetscInt relaxorder; 6939accc25SStefano Zampini PetscReal truncfactor; 70ace3abfcSBarry Smith PetscBool applyrichardson; 714ddd07fcSJed Brown PetscInt pmax; 724ddd07fcSJed Brown PetscInt interptype; 73589dcaf0SStefano Zampini PetscInt maxc; 74589dcaf0SStefano Zampini PetscInt minc; 75589dcaf0SStefano Zampini 766ea7df73SStefano Zampini /* GPU */ 776ea7df73SStefano Zampini PetscBool keeptranspose; 786ea7df73SStefano Zampini PetscInt rap2; 796ea7df73SStefano Zampini PetscInt mod_rap2; 806ea7df73SStefano Zampini 81589dcaf0SStefano Zampini /* AIR */ 82589dcaf0SStefano Zampini PetscInt Rtype; 83589dcaf0SStefano Zampini PetscReal Rstrongthreshold; 84589dcaf0SStefano Zampini PetscReal Rfilterthreshold; 85589dcaf0SStefano Zampini PetscInt Adroptype; 86589dcaf0SStefano Zampini PetscReal Adroptol; 87589dcaf0SStefano Zampini 884ddd07fcSJed Brown PetscInt agg_nl; 896ea7df73SStefano Zampini PetscInt agg_interptype; 904ddd07fcSJed Brown PetscInt agg_num_paths; 91ace3abfcSBarry Smith PetscBool nodal_relax; 924ddd07fcSJed Brown PetscInt nodal_relax_levels; 934cb006feSStefano Zampini 945272c319SBarry Smith PetscInt nodal_coarsening; 9522e51d31SStefano Zampini PetscInt nodal_coarsening_diag; 965272c319SBarry Smith PetscInt vec_interp_variant; 9722e51d31SStefano Zampini PetscInt vec_interp_qmax; 9822e51d31SStefano Zampini PetscBool vec_interp_smooth; 9922e51d31SStefano Zampini PetscInt interp_refine; 10022e51d31SStefano Zampini 1016ea7df73SStefano Zampini /* NearNullSpace support */ 1026ea7df73SStefano Zampini VecHYPRE_IJVector *hmnull; 1036ea7df73SStefano Zampini HYPRE_ParVector *phmnull; 1045272c319SBarry Smith PetscInt n_hmnull; 1055272c319SBarry Smith Vec hmnull_constant; 1065272c319SBarry Smith 107863406b8SStefano Zampini /* options for AS (Auxiliary Space preconditioners) */ 108863406b8SStefano Zampini PetscInt as_print; 109863406b8SStefano Zampini PetscInt as_max_iter; 110863406b8SStefano Zampini PetscReal as_tol; 111863406b8SStefano Zampini PetscInt as_relax_type; 112863406b8SStefano Zampini PetscInt as_relax_times; 113863406b8SStefano Zampini PetscReal as_relax_weight; 114863406b8SStefano Zampini PetscReal as_omega; 115863406b8SStefano Zampini PetscInt as_amg_alpha_opts[5]; /* AMG coarsen type, agg_levels, relax_type, interp_type, Pmax for vector Poisson (AMS) or Curl problem (ADS) */ 116863406b8SStefano Zampini PetscReal as_amg_alpha_theta; /* AMG strength for vector Poisson (AMS) or Curl problem (ADS) */ 117863406b8SStefano Zampini PetscInt as_amg_beta_opts[5]; /* AMG coarsen type, agg_levels, relax_type, interp_type, Pmax for scalar Poisson (AMS) or vector Poisson (ADS) */ 118863406b8SStefano Zampini PetscReal as_amg_beta_theta; /* AMG strength for scalar Poisson (AMS) or vector Poisson (ADS) */ 1194cb006feSStefano Zampini PetscInt ams_cycle_type; 120863406b8SStefano Zampini PetscInt ads_cycle_type; 1214cb006feSStefano Zampini 1224cb006feSStefano Zampini /* additional data */ 1235ac14e1cSStefano Zampini Mat G; /* MatHYPRE */ 1245ac14e1cSStefano Zampini Mat C; /* MatHYPRE */ 1255ac14e1cSStefano Zampini Mat alpha_Poisson; /* MatHYPRE */ 1265ac14e1cSStefano Zampini Mat beta_Poisson; /* MatHYPRE */ 1275ac14e1cSStefano Zampini 1285ac14e1cSStefano Zampini /* extra information for AMS */ 1295ac14e1cSStefano Zampini PetscInt dim; /* geometrical dimension */ 1306ea7df73SStefano Zampini VecHYPRE_IJVector coords[3]; 1316ea7df73SStefano Zampini VecHYPRE_IJVector constants[3]; 1326bf688a0SCe Qin Mat RT_PiFull, RT_Pi[3]; 1336bf688a0SCe Qin Mat ND_PiFull, ND_Pi[3]; 1344cb006feSStefano Zampini PetscBool ams_beta_is_zero; 13523df4f25SStefano Zampini PetscBool ams_beta_is_zero_part; 13623df4f25SStefano Zampini PetscInt ams_proj_freq; 13716d9e3a6SLisandro Dalcin } PC_HYPRE; 13816d9e3a6SLisandro Dalcin 139d2128fa2SBarry Smith PetscErrorCode PCHYPREGetSolver(PC pc,HYPRE_Solver *hsolver) 140d2128fa2SBarry Smith { 141d2128fa2SBarry Smith PC_HYPRE *jac = (PC_HYPRE*)pc->data; 142d2128fa2SBarry Smith 143d2128fa2SBarry Smith PetscFunctionBegin; 144d2128fa2SBarry Smith *hsolver = jac->hsolver; 145d2128fa2SBarry Smith PetscFunctionReturn(0); 146d2128fa2SBarry Smith } 14716d9e3a6SLisandro Dalcin 148fd2dd295SFande Kong /* 1498a2c336bSFande Kong Matrices with AIJ format are created IN PLACE with using (I,J,data) from BoomerAMG. Since the data format in hypre_ParCSRMatrix 1508a2c336bSFande Kong is different from that used in PETSc, the original hypre_ParCSRMatrix can not be used any more after call this routine. 1518a2c336bSFande Kong It is used in PCHMG. Other users should avoid using this function. 152fd2dd295SFande Kong */ 153fd2dd295SFande Kong static PetscErrorCode PCGetCoarseOperators_BoomerAMG(PC pc,PetscInt *nlevels,Mat *operators[]) 1548a2c336bSFande Kong { 1558a2c336bSFande Kong PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1568a2c336bSFande Kong PetscBool same = PETSC_FALSE; 1578a2c336bSFande Kong PetscErrorCode ierr; 1588a2c336bSFande Kong PetscInt num_levels,l; 1598a2c336bSFande Kong Mat *mattmp; 1608a2c336bSFande Kong hypre_ParCSRMatrix **A_array; 1618a2c336bSFande Kong 1628a2c336bSFande Kong PetscFunctionBegin; 1638a2c336bSFande Kong ierr = PetscStrcmp(jac->hypre_type,"boomeramg",&same);CHKERRQ(ierr); 1648a2c336bSFande Kong if (!same) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_NOTSAMETYPE,"Hypre type is not BoomerAMG \n"); 1658a2c336bSFande Kong num_levels = hypre_ParAMGDataNumLevels((hypre_ParAMGData*) (jac->hsolver)); 1668a2c336bSFande Kong ierr = PetscMalloc1(num_levels,&mattmp);CHKERRQ(ierr); 1678a2c336bSFande Kong A_array = hypre_ParAMGDataAArray((hypre_ParAMGData*) (jac->hsolver)); 1688a2c336bSFande Kong for (l=1; l<num_levels; l++) { 1698a2c336bSFande Kong ierr = MatCreateFromParCSR(A_array[l],MATAIJ,PETSC_OWN_POINTER, &(mattmp[num_levels-1-l]));CHKERRQ(ierr); 1708a2c336bSFande Kong /* We want to own the data, and HYPRE can not touch this matrix any more */ 1718a2c336bSFande Kong A_array[l] = NULL; 1728a2c336bSFande Kong } 1738a2c336bSFande Kong *nlevels = num_levels; 1748a2c336bSFande Kong *operators = mattmp; 1758a2c336bSFande Kong PetscFunctionReturn(0); 1768a2c336bSFande Kong } 1778a2c336bSFande Kong 178fd2dd295SFande Kong /* 1798a2c336bSFande Kong Matrices with AIJ format are created IN PLACE with using (I,J,data) from BoomerAMG. Since the data format in hypre_ParCSRMatrix 1808a2c336bSFande Kong is different from that used in PETSc, the original hypre_ParCSRMatrix can not be used any more after call this routine. 1818a2c336bSFande Kong It is used in PCHMG. Other users should avoid using this function. 182fd2dd295SFande Kong */ 183fd2dd295SFande Kong static PetscErrorCode PCGetInterpolations_BoomerAMG(PC pc,PetscInt *nlevels,Mat *interpolations[]) 1848a2c336bSFande Kong { 1858a2c336bSFande Kong PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1868a2c336bSFande Kong PetscBool same = PETSC_FALSE; 1878a2c336bSFande Kong PetscErrorCode ierr; 1888a2c336bSFande Kong PetscInt num_levels,l; 1898a2c336bSFande Kong Mat *mattmp; 1908a2c336bSFande Kong hypre_ParCSRMatrix **P_array; 1918a2c336bSFande Kong 1928a2c336bSFande Kong PetscFunctionBegin; 1938a2c336bSFande Kong ierr = PetscStrcmp(jac->hypre_type,"boomeramg",&same);CHKERRQ(ierr); 1948a2c336bSFande Kong if (!same) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_NOTSAMETYPE,"Hypre type is not BoomerAMG \n"); 1958a2c336bSFande Kong num_levels = hypre_ParAMGDataNumLevels((hypre_ParAMGData*) (jac->hsolver)); 1968a2c336bSFande Kong ierr = PetscMalloc1(num_levels,&mattmp);CHKERRQ(ierr); 1978a2c336bSFande Kong P_array = hypre_ParAMGDataPArray((hypre_ParAMGData*) (jac->hsolver)); 1988a2c336bSFande Kong for (l=1; l<num_levels; l++) { 1998a2c336bSFande Kong ierr = MatCreateFromParCSR(P_array[num_levels-1-l],MATAIJ,PETSC_OWN_POINTER, &(mattmp[l-1]));CHKERRQ(ierr); 2008a2c336bSFande Kong /* We want to own the data, and HYPRE can not touch this matrix any more */ 2018a2c336bSFande Kong P_array[num_levels-1-l] = NULL; 2028a2c336bSFande Kong } 2038a2c336bSFande Kong *nlevels = num_levels; 2048a2c336bSFande Kong *interpolations = mattmp; 2058a2c336bSFande Kong PetscFunctionReturn(0); 2068a2c336bSFande Kong } 2078a2c336bSFande Kong 208ce6a8a0dSJed Brown /* Resets (frees) Hypre's representation of the near null space */ 209ce6a8a0dSJed Brown static PetscErrorCode PCHYPREResetNearNullSpace_Private(PC pc) 210ce6a8a0dSJed Brown { 211ce6a8a0dSJed Brown PC_HYPRE *jac = (PC_HYPRE*)pc->data; 212ce6a8a0dSJed Brown PetscInt i; 2139d678128SJed Brown PetscErrorCode ierr; 214ce6a8a0dSJed Brown 2159d678128SJed Brown PetscFunctionBegin; 216ce6a8a0dSJed Brown for (i=0; i<jac->n_hmnull; i++) { 2176ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->hmnull[i]);CHKERRQ(ierr); 218ce6a8a0dSJed Brown } 219ce6a8a0dSJed Brown ierr = PetscFree(jac->hmnull);CHKERRQ(ierr); 220ce6a8a0dSJed Brown ierr = PetscFree(jac->phmnull);CHKERRQ(ierr); 221ce6a8a0dSJed Brown ierr = VecDestroy(&jac->hmnull_constant);CHKERRQ(ierr); 2229d678128SJed Brown jac->n_hmnull = 0; 223ce6a8a0dSJed Brown PetscFunctionReturn(0); 224ce6a8a0dSJed Brown } 225ce6a8a0dSJed Brown 22616d9e3a6SLisandro Dalcin static PetscErrorCode PCSetUp_HYPRE(PC pc) 22716d9e3a6SLisandro Dalcin { 22816d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 22949a781f5SStefano Zampini Mat_HYPRE *hjac; 23016d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 23116d9e3a6SLisandro Dalcin HYPRE_ParVector bv,xv; 23249a781f5SStefano Zampini PetscBool ishypre; 23349a781f5SStefano Zampini PetscErrorCode ierr; 23416d9e3a6SLisandro Dalcin 23516d9e3a6SLisandro Dalcin PetscFunctionBegin; 23616d9e3a6SLisandro Dalcin if (!jac->hypre_type) { 23702a17cd4SBarry Smith ierr = PCHYPRESetType(pc,"boomeramg");CHKERRQ(ierr); 23816d9e3a6SLisandro Dalcin } 2395f5c5b43SBarry Smith 24049a781f5SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRE,&ishypre);CHKERRQ(ierr); 24149a781f5SStefano Zampini if (!ishypre) { 2426bf688a0SCe Qin ierr = MatDestroy(&jac->hpmat);CHKERRQ(ierr); 2436bf688a0SCe Qin ierr = MatConvert(pc->pmat,MATHYPRE,MAT_INITIAL_MATRIX,&jac->hpmat);CHKERRQ(ierr); 244589dcaf0SStefano Zampini ierr = PetscLogObjectParent((PetscObject)pc,(PetscObject)jac->hpmat);CHKERRQ(ierr); 24549a781f5SStefano Zampini } else { 24649a781f5SStefano Zampini ierr = PetscObjectReference((PetscObject)pc->pmat);CHKERRQ(ierr); 24749a781f5SStefano Zampini ierr = MatDestroy(&jac->hpmat);CHKERRQ(ierr); 24849a781f5SStefano Zampini jac->hpmat = pc->pmat; 24916d9e3a6SLisandro Dalcin } 2506ea7df73SStefano Zampini /* allow debug */ 2516ea7df73SStefano Zampini ierr = MatViewFromOptions(jac->hpmat,NULL,"-pc_hypre_mat_view");CHKERRQ(ierr); 25249a781f5SStefano Zampini hjac = (Mat_HYPRE*)(jac->hpmat->data); 2535f5c5b43SBarry Smith 25416d9e3a6SLisandro Dalcin /* special case for BoomerAMG */ 25516d9e3a6SLisandro Dalcin if (jac->setup == HYPRE_BoomerAMGSetup) { 2565272c319SBarry Smith MatNullSpace mnull; 2575272c319SBarry Smith PetscBool has_const; 25849a781f5SStefano Zampini PetscInt bs,nvec,i; 2595272c319SBarry Smith const Vec *vecs; 2605272c319SBarry Smith 26116d9e3a6SLisandro Dalcin ierr = MatGetBlockSize(pc->pmat,&bs);CHKERRQ(ierr); 2622fa5cd67SKarl Rupp if (bs > 1) PetscStackCallStandard(HYPRE_BoomerAMGSetNumFunctions,(jac->hsolver,bs)); 2635272c319SBarry Smith ierr = MatGetNearNullSpace(pc->mat, &mnull);CHKERRQ(ierr); 2645272c319SBarry Smith if (mnull) { 265ce6a8a0dSJed Brown ierr = PCHYPREResetNearNullSpace_Private(pc);CHKERRQ(ierr); 2665272c319SBarry Smith ierr = MatNullSpaceGetVecs(mnull, &has_const, &nvec, &vecs);CHKERRQ(ierr); 2675272c319SBarry Smith ierr = PetscMalloc1(nvec+1,&jac->hmnull);CHKERRQ(ierr); 2685272c319SBarry Smith ierr = PetscMalloc1(nvec+1,&jac->phmnull);CHKERRQ(ierr); 2695272c319SBarry Smith for (i=0; i<nvec; i++) { 2706ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorCreate(vecs[i]->map,&jac->hmnull[i]);CHKERRQ(ierr); 2716ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorCopy(vecs[i],jac->hmnull[i]);CHKERRQ(ierr); 2726ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->hmnull[i]->ij,(void**)&jac->phmnull[i])); 2735272c319SBarry Smith } 2745272c319SBarry Smith if (has_const) { 2755272c319SBarry Smith ierr = MatCreateVecs(pc->pmat,&jac->hmnull_constant,NULL);CHKERRQ(ierr); 276589dcaf0SStefano Zampini ierr = PetscLogObjectParent((PetscObject)pc,(PetscObject)jac->hmnull_constant);CHKERRQ(ierr); 2775272c319SBarry Smith ierr = VecSet(jac->hmnull_constant,1);CHKERRQ(ierr); 2781e1ea65dSPierre Jolivet ierr = VecNormalize(jac->hmnull_constant,NULL);CHKERRQ(ierr); 2796ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorCreate(jac->hmnull_constant->map,&jac->hmnull[nvec]);CHKERRQ(ierr); 2806ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorCopy(jac->hmnull_constant,jac->hmnull[nvec]);CHKERRQ(ierr); 2816ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->hmnull[nvec]->ij,(void**)&jac->phmnull[nvec])); 2825272c319SBarry Smith nvec++; 2835272c319SBarry Smith } 2845272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpVectors,(jac->hsolver,nvec,jac->phmnull)); 2855272c319SBarry Smith jac->n_hmnull = nvec; 2865272c319SBarry Smith } 2874cb006feSStefano Zampini } 288863406b8SStefano Zampini 2894cb006feSStefano Zampini /* special case for AMS */ 2904cb006feSStefano Zampini if (jac->setup == HYPRE_AMSSetup) { 2915ac14e1cSStefano Zampini Mat_HYPRE *hm; 2925ac14e1cSStefano Zampini HYPRE_ParCSRMatrix parcsr; 2936bf688a0SCe Qin if (!jac->coords[0] && !jac->constants[0] && !(jac->ND_PiFull || (jac->ND_Pi[0] && jac->ND_Pi[1]))) { 2946bf688a0SCe Qin SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE AMS preconditioner needs either the coordinate vectors via PCSetCoordinates() or the edge constant vectors via PCHYPRESetEdgeConstantVectors() or the interpolation matrix via PCHYPRESetInterpolations"); 2956bf688a0SCe Qin } 2965ac14e1cSStefano Zampini if (jac->dim) { 2975ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetDimension,(jac->hsolver,jac->dim)); 2985ac14e1cSStefano Zampini } 2995ac14e1cSStefano Zampini if (jac->constants[0]) { 3005ac14e1cSStefano Zampini HYPRE_ParVector ozz,zoz,zzo = NULL; 3016ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[0]->ij,(void**)(&ozz))); 3026ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[1]->ij,(void**)(&zoz))); 3035ac14e1cSStefano Zampini if (jac->constants[2]) { 3046ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[2]->ij,(void**)(&zzo))); 3055ac14e1cSStefano Zampini } 3065ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetEdgeConstantVectors,(jac->hsolver,ozz,zoz,zzo)); 3075ac14e1cSStefano Zampini } 3085ac14e1cSStefano Zampini if (jac->coords[0]) { 3095ac14e1cSStefano Zampini HYPRE_ParVector coords[3]; 3105ac14e1cSStefano Zampini coords[0] = NULL; 3115ac14e1cSStefano Zampini coords[1] = NULL; 3125ac14e1cSStefano Zampini coords[2] = NULL; 3136ea7df73SStefano Zampini if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[0]->ij,(void**)(&coords[0]))); 3146ea7df73SStefano Zampini if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[1]->ij,(void**)(&coords[1]))); 3156ea7df73SStefano Zampini if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[2]->ij,(void**)(&coords[2]))); 3165ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetCoordinateVectors,(jac->hsolver,coords[0],coords[1],coords[2])); 3175ac14e1cSStefano Zampini } 31849a781f5SStefano Zampini if (!jac->G) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE AMS preconditioner needs the discrete gradient operator via PCHYPRESetDiscreteGradient"); 3195ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->G->data); 3205ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3215ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetDiscreteGradient,(jac->hsolver,parcsr)); 3225ac14e1cSStefano Zampini if (jac->alpha_Poisson) { 3235ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->alpha_Poisson->data); 3245ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3255ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaPoissonMatrix,(jac->hsolver,parcsr)); 3265ac14e1cSStefano Zampini } 3275ac14e1cSStefano Zampini if (jac->ams_beta_is_zero) { 3285ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaPoissonMatrix,(jac->hsolver,NULL)); 3295ac14e1cSStefano Zampini } else if (jac->beta_Poisson) { 3305ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->beta_Poisson->data); 3315ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3325ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaPoissonMatrix,(jac->hsolver,parcsr)); 3335ac14e1cSStefano Zampini } 3346bf688a0SCe Qin if (jac->ND_PiFull || (jac->ND_Pi[0] && jac->ND_Pi[1])) { 3356bf688a0SCe Qin PetscInt i; 3366bf688a0SCe Qin HYPRE_ParCSRMatrix nd_parcsrfull, nd_parcsr[3]; 3376bf688a0SCe Qin if (jac->ND_PiFull) { 3386bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_PiFull->data); 3396bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsrfull))); 3406bf688a0SCe Qin } else { 3416bf688a0SCe Qin nd_parcsrfull = NULL; 3426bf688a0SCe Qin } 3436bf688a0SCe Qin for (i=0;i<3;++i) { 3446bf688a0SCe Qin if (jac->ND_Pi[i]) { 3456bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_Pi[i]->data); 3466bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsr[i]))); 3476bf688a0SCe Qin } else { 3486bf688a0SCe Qin nd_parcsr[i] = NULL; 3496bf688a0SCe Qin } 3506bf688a0SCe Qin } 3516bf688a0SCe Qin PetscStackCallStandard(HYPRE_AMSSetInterpolations,(jac->hsolver,nd_parcsrfull,nd_parcsr[0],nd_parcsr[1],nd_parcsr[2])); 3526bf688a0SCe Qin } 3534cb006feSStefano Zampini } 354863406b8SStefano Zampini /* special case for ADS */ 355863406b8SStefano Zampini if (jac->setup == HYPRE_ADSSetup) { 3565ac14e1cSStefano Zampini Mat_HYPRE *hm; 3575ac14e1cSStefano Zampini HYPRE_ParCSRMatrix parcsr; 3586bf688a0SCe Qin if (!jac->coords[0] && !((jac->RT_PiFull || (jac->RT_Pi[0] && jac->RT_Pi[1])) && (jac->ND_PiFull || (jac->ND_Pi[0] && jac->ND_Pi[1])))) { 3596bf688a0SCe Qin SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs either the coordinate vectors via PCSetCoordinates() or the interpolation matrices via PCHYPRESetInterpolations"); 3606bf688a0SCe Qin } 36137096e45SBarry Smith else if (!jac->coords[1] || !jac->coords[2]) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner has been designed for three dimensional problems! For two dimensional problems, use HYPRE AMS instead"); 36249a781f5SStefano Zampini if (!jac->G) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs the discrete gradient operator via PCHYPRESetDiscreteGradient"); 36349a781f5SStefano Zampini if (!jac->C) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs the discrete curl operator via PCHYPRESetDiscreteGradient"); 3645ac14e1cSStefano Zampini if (jac->coords[0]) { 3655ac14e1cSStefano Zampini HYPRE_ParVector coords[3]; 3665ac14e1cSStefano Zampini coords[0] = NULL; 3675ac14e1cSStefano Zampini coords[1] = NULL; 3685ac14e1cSStefano Zampini coords[2] = NULL; 3696ea7df73SStefano Zampini if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[0]->ij,(void**)(&coords[0]))); 3706ea7df73SStefano Zampini if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[1]->ij,(void**)(&coords[1]))); 3716ea7df73SStefano Zampini if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[2]->ij,(void**)(&coords[2]))); 3725ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetCoordinateVectors,(jac->hsolver,coords[0],coords[1],coords[2])); 3735ac14e1cSStefano Zampini } 3745ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->G->data); 3755ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3765ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetDiscreteGradient,(jac->hsolver,parcsr)); 3775ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->C->data); 3785ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3795ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetDiscreteCurl,(jac->hsolver,parcsr)); 3806bf688a0SCe Qin if ((jac->RT_PiFull || (jac->RT_Pi[0] && jac->RT_Pi[1])) && (jac->ND_PiFull || (jac->ND_Pi[0] && jac->ND_Pi[1]))) { 3816bf688a0SCe Qin PetscInt i; 3826bf688a0SCe Qin HYPRE_ParCSRMatrix rt_parcsrfull, rt_parcsr[3]; 3836bf688a0SCe Qin HYPRE_ParCSRMatrix nd_parcsrfull, nd_parcsr[3]; 3846bf688a0SCe Qin if (jac->RT_PiFull) { 3856bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->RT_PiFull->data); 3866bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&rt_parcsrfull))); 3876bf688a0SCe Qin } else { 3886bf688a0SCe Qin rt_parcsrfull = NULL; 3896bf688a0SCe Qin } 3906bf688a0SCe Qin for (i=0;i<3;++i) { 3916bf688a0SCe Qin if (jac->RT_Pi[i]) { 3926bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->RT_Pi[i]->data); 3936bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&rt_parcsr[i]))); 3946bf688a0SCe Qin } else { 3956bf688a0SCe Qin rt_parcsr[i] = NULL; 3966bf688a0SCe Qin } 3976bf688a0SCe Qin } 3986bf688a0SCe Qin if (jac->ND_PiFull) { 3996bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_PiFull->data); 4006bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsrfull))); 4016bf688a0SCe Qin } else { 4026bf688a0SCe Qin nd_parcsrfull = NULL; 4036bf688a0SCe Qin } 4046bf688a0SCe Qin for (i=0;i<3;++i) { 4056bf688a0SCe Qin if (jac->ND_Pi[i]) { 4066bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_Pi[i]->data); 4076bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsr[i]))); 4086bf688a0SCe Qin } else { 4096bf688a0SCe Qin nd_parcsr[i] = NULL; 4106bf688a0SCe Qin } 4116bf688a0SCe Qin } 4126bf688a0SCe Qin PetscStackCallStandard(HYPRE_ADSSetInterpolations,(jac->hsolver,rt_parcsrfull,rt_parcsr[0],rt_parcsr[1],rt_parcsr[2],nd_parcsrfull,nd_parcsr[0],nd_parcsr[1],nd_parcsr[2])); 4136bf688a0SCe Qin } 414863406b8SStefano Zampini } 41549a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 4166ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b->ij,(void**)&bv)); 4176ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x->ij,(void**)&xv)); 41822e51d31SStefano Zampini PetscStackCallStandard(jac->setup,(jac->hsolver,hmat,bv,xv)); 41916d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 42016d9e3a6SLisandro Dalcin } 42116d9e3a6SLisandro Dalcin 42216d9e3a6SLisandro Dalcin static PetscErrorCode PCApply_HYPRE(PC pc,Vec b,Vec x) 42316d9e3a6SLisandro Dalcin { 42416d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 42549a781f5SStefano Zampini Mat_HYPRE *hjac = (Mat_HYPRE*)(jac->hpmat->data); 42616d9e3a6SLisandro Dalcin PetscErrorCode ierr; 42716d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 42816d9e3a6SLisandro Dalcin HYPRE_ParVector jbv,jxv; 4294ddd07fcSJed Brown PetscInt hierr; 43016d9e3a6SLisandro Dalcin 43116d9e3a6SLisandro Dalcin PetscFunctionBegin; 432dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 43316d9e3a6SLisandro Dalcin if (!jac->applyrichardson) {ierr = VecSet(x,0.0);CHKERRQ(ierr);} 4346ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorPushVecRead(hjac->b,b);CHKERRQ(ierr); 4356ea7df73SStefano Zampini if (jac->applyrichardson) { ierr = VecHYPRE_IJVectorPushVec(hjac->x,x);CHKERRQ(ierr); } 4366ea7df73SStefano Zampini else { ierr = VecHYPRE_IJVectorPushVecWrite(hjac->x,x);CHKERRQ(ierr); } 43749a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 4386ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b->ij,(void**)&jbv)); 4396ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x->ij,(void**)&jxv)); 440fd3f9acdSBarry Smith PetscStackCall("Hypre solve",hierr = (*jac->solve)(jac->hsolver,hmat,jbv,jxv); 44165e19b50SBarry Smith if (hierr && hierr != HYPRE_ERROR_CONV) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in HYPRE solver, error code %d",hierr); 442fd3f9acdSBarry Smith if (hierr) hypre__global_error = 0;); 44316d9e3a6SLisandro Dalcin 44423df4f25SStefano Zampini if (jac->setup == HYPRE_AMSSetup && jac->ams_beta_is_zero_part) { 4455ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSProjectOutGradients,(jac->hsolver,jxv)); 44621df291bSStefano Zampini } 4476ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorPopVec(hjac->x);CHKERRQ(ierr); 4486ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorPopVec(hjac->b);CHKERRQ(ierr); 44916d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 45016d9e3a6SLisandro Dalcin } 45116d9e3a6SLisandro Dalcin 4528695de01SBarry Smith static PetscErrorCode PCReset_HYPRE(PC pc) 4538695de01SBarry Smith { 4548695de01SBarry Smith PC_HYPRE *jac = (PC_HYPRE*)pc->data; 4558695de01SBarry Smith PetscErrorCode ierr; 4568695de01SBarry Smith 4578695de01SBarry Smith PetscFunctionBegin; 45849a781f5SStefano Zampini ierr = MatDestroy(&jac->hpmat);CHKERRQ(ierr); 4595ac14e1cSStefano Zampini ierr = MatDestroy(&jac->G);CHKERRQ(ierr); 4605ac14e1cSStefano Zampini ierr = MatDestroy(&jac->C);CHKERRQ(ierr); 4615ac14e1cSStefano Zampini ierr = MatDestroy(&jac->alpha_Poisson);CHKERRQ(ierr); 4625ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 4636bf688a0SCe Qin ierr = MatDestroy(&jac->RT_PiFull);CHKERRQ(ierr); 4646bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[0]);CHKERRQ(ierr); 4656bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[1]);CHKERRQ(ierr); 4666bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[2]);CHKERRQ(ierr); 4676bf688a0SCe Qin ierr = MatDestroy(&jac->ND_PiFull);CHKERRQ(ierr); 4686bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[0]);CHKERRQ(ierr); 4696bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[1]);CHKERRQ(ierr); 4706bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[2]);CHKERRQ(ierr); 4716ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->coords[0]);CHKERRQ(ierr); 4726ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->coords[1]);CHKERRQ(ierr); 4736ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->coords[2]);CHKERRQ(ierr); 4746ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->constants[0]);CHKERRQ(ierr); 4756ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->constants[1]);CHKERRQ(ierr); 4766ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->constants[2]);CHKERRQ(ierr); 477ce6a8a0dSJed Brown ierr = PCHYPREResetNearNullSpace_Private(pc);CHKERRQ(ierr); 4785ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_FALSE; 4795ac14e1cSStefano Zampini jac->dim = 0; 4808695de01SBarry Smith PetscFunctionReturn(0); 4818695de01SBarry Smith } 4828695de01SBarry Smith 48316d9e3a6SLisandro Dalcin static PetscErrorCode PCDestroy_HYPRE(PC pc) 48416d9e3a6SLisandro Dalcin { 48516d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 48616d9e3a6SLisandro Dalcin PetscErrorCode ierr; 48716d9e3a6SLisandro Dalcin 48816d9e3a6SLisandro Dalcin PetscFunctionBegin; 4898695de01SBarry Smith ierr = PCReset_HYPRE(pc);CHKERRQ(ierr); 49022e51d31SStefano Zampini if (jac->destroy) PetscStackCallStandard(jac->destroy,(jac->hsolver)); 491503cfb0cSBarry Smith ierr = PetscFree(jac->hypre_type);CHKERRQ(ierr); 492ffc4695bSBarry Smith if (jac->comm_hypre != MPI_COMM_NULL) {ierr = MPI_Comm_free(&(jac->comm_hypre));CHKERRMPI(ierr);} 493c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 49416d9e3a6SLisandro Dalcin 49516d9e3a6SLisandro Dalcin ierr = PetscObjectChangeTypeName((PetscObject)pc,0);CHKERRQ(ierr); 496bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetType_C",NULL);CHKERRQ(ierr); 497bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPREGetType_C",NULL);CHKERRQ(ierr); 4984cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetCoordinates_C",NULL);CHKERRQ(ierr); 4994cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteGradient_C",NULL);CHKERRQ(ierr); 500863406b8SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteCurl_C",NULL);CHKERRQ(ierr); 5016bf688a0SCe Qin ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetInterpolations_C",NULL);CHKERRQ(ierr); 5024cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetConstantEdgeVectors_C",NULL);CHKERRQ(ierr); 5035ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetPoissonMatrix_C",NULL);CHKERRQ(ierr); 504fd2dd295SFande Kong ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetInterpolations_C",NULL);CHKERRQ(ierr); 505fd2dd295SFande Kong ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetCoarseOperators_C",NULL);CHKERRQ(ierr); 50616d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 50716d9e3a6SLisandro Dalcin } 50816d9e3a6SLisandro Dalcin 50916d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 5104416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_Pilut(PetscOptionItems *PetscOptionsObject,PC pc) 51116d9e3a6SLisandro Dalcin { 51216d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 51316d9e3a6SLisandro Dalcin PetscErrorCode ierr; 514ace3abfcSBarry Smith PetscBool flag; 51516d9e3a6SLisandro Dalcin 51616d9e3a6SLisandro Dalcin PetscFunctionBegin; 517e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE Pilut Options");CHKERRQ(ierr); 51816d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_pilut_maxiter","Number of iterations","None",jac->maxiter,&jac->maxiter,&flag);CHKERRQ(ierr); 519fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetMaxIter,(jac->hsolver,jac->maxiter)); 52016d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_pilut_tol","Drop tolerance","None",jac->tol,&jac->tol,&flag);CHKERRQ(ierr); 521fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetDropTolerance,(jac->hsolver,jac->tol)); 52216d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_pilut_factorrowsize","FactorRowSize","None",jac->factorrowsize,&jac->factorrowsize,&flag);CHKERRQ(ierr); 523fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetFactorRowSize,(jac->hsolver,jac->factorrowsize)); 52416d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 52516d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 52616d9e3a6SLisandro Dalcin } 52716d9e3a6SLisandro Dalcin 52816d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_Pilut(PC pc,PetscViewer viewer) 52916d9e3a6SLisandro Dalcin { 53016d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 53116d9e3a6SLisandro Dalcin PetscErrorCode ierr; 532ace3abfcSBarry Smith PetscBool iascii; 53316d9e3a6SLisandro Dalcin 53416d9e3a6SLisandro Dalcin PetscFunctionBegin; 535251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 53616d9e3a6SLisandro Dalcin if (iascii) { 53716d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE Pilut preconditioning\n");CHKERRQ(ierr); 53816d9e3a6SLisandro Dalcin if (jac->maxiter != PETSC_DEFAULT) { 539efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," maximum number of iterations %d\n",jac->maxiter);CHKERRQ(ierr); 54016d9e3a6SLisandro Dalcin } else { 541efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," default maximum number of iterations \n");CHKERRQ(ierr); 54216d9e3a6SLisandro Dalcin } 54316d9e3a6SLisandro Dalcin if (jac->tol != PETSC_DEFAULT) { 544efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," drop tolerance %g\n",(double)jac->tol);CHKERRQ(ierr); 54516d9e3a6SLisandro Dalcin } else { 546efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," default drop tolerance \n");CHKERRQ(ierr); 54716d9e3a6SLisandro Dalcin } 54816d9e3a6SLisandro Dalcin if (jac->factorrowsize != PETSC_DEFAULT) { 549efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," factor row size %d\n",jac->factorrowsize);CHKERRQ(ierr); 55016d9e3a6SLisandro Dalcin } else { 551efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," default factor row size \n");CHKERRQ(ierr); 55216d9e3a6SLisandro Dalcin } 55316d9e3a6SLisandro Dalcin } 55416d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 55516d9e3a6SLisandro Dalcin } 55616d9e3a6SLisandro Dalcin 55716d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 558db966c6cSHong Zhang static PetscErrorCode PCSetFromOptions_HYPRE_Euclid(PetscOptionItems *PetscOptionsObject,PC pc) 559db966c6cSHong Zhang { 560db966c6cSHong Zhang PC_HYPRE *jac = (PC_HYPRE*)pc->data; 561db966c6cSHong Zhang PetscErrorCode ierr; 5628bf83915SBarry Smith PetscBool flag,eu_bj = jac->eu_bj ? PETSC_TRUE : PETSC_FALSE; 563db966c6cSHong Zhang 564db966c6cSHong Zhang PetscFunctionBegin; 565db966c6cSHong Zhang ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE Euclid Options");CHKERRQ(ierr); 566db966c6cSHong Zhang ierr = PetscOptionsInt("-pc_hypre_euclid_level","Factorization levels","None",jac->eu_level,&jac->eu_level,&flag);CHKERRQ(ierr); 567db966c6cSHong Zhang if (flag) PetscStackCallStandard(HYPRE_EuclidSetLevel,(jac->hsolver,jac->eu_level)); 5688bf83915SBarry Smith 5698bf83915SBarry Smith ierr = PetscOptionsReal("-pc_hypre_euclid_droptolerance","Drop tolerance for ILU(k) in Euclid","None",jac->eu_droptolerance,&jac->eu_droptolerance,&flag);CHKERRQ(ierr); 5708bf83915SBarry Smith if (flag) { 5718bf83915SBarry Smith PetscMPIInt size; 5728bf83915SBarry Smith 57355b25c41SPierre Jolivet ierr = MPI_Comm_size(PetscObjectComm((PetscObject)pc),&size);CHKERRMPI(ierr); 5748bf83915SBarry Smith if (size > 1) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"hypre's Euclid does not support a parallel drop tolerance"); 5758bf83915SBarry Smith PetscStackCallStandard(HYPRE_EuclidSetILUT,(jac->hsolver,jac->eu_droptolerance)); 5768bf83915SBarry Smith } 5778bf83915SBarry Smith 5788bf83915SBarry Smith ierr = PetscOptionsBool("-pc_hypre_euclid_bj", "Use Block Jacobi for ILU in Euclid", "None", eu_bj,&eu_bj,&flag);CHKERRQ(ierr); 5798bf83915SBarry Smith if (flag) { 5808bf83915SBarry Smith jac->eu_bj = eu_bj ? 1 : 0; 5818bf83915SBarry Smith PetscStackCallStandard(HYPRE_EuclidSetBJ,(jac->hsolver,jac->eu_bj)); 5828bf83915SBarry Smith } 583db966c6cSHong Zhang ierr = PetscOptionsTail();CHKERRQ(ierr); 584db966c6cSHong Zhang PetscFunctionReturn(0); 585db966c6cSHong Zhang } 586db966c6cSHong Zhang 587db966c6cSHong Zhang static PetscErrorCode PCView_HYPRE_Euclid(PC pc,PetscViewer viewer) 588db966c6cSHong Zhang { 589db966c6cSHong Zhang PC_HYPRE *jac = (PC_HYPRE*)pc->data; 590db966c6cSHong Zhang PetscErrorCode ierr; 591db966c6cSHong Zhang PetscBool iascii; 592db966c6cSHong Zhang 593db966c6cSHong Zhang PetscFunctionBegin; 594db966c6cSHong Zhang ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 595db966c6cSHong Zhang if (iascii) { 596db966c6cSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," HYPRE Euclid preconditioning\n");CHKERRQ(ierr); 597db966c6cSHong Zhang if (jac->eu_level != PETSC_DEFAULT) { 598db966c6cSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," factorization levels %d\n",jac->eu_level);CHKERRQ(ierr); 599db966c6cSHong Zhang } else { 600db966c6cSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," default factorization levels \n");CHKERRQ(ierr); 601db966c6cSHong Zhang } 6028bf83915SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," drop tolerance %g\n",(double)jac->eu_droptolerance);CHKERRQ(ierr); 6038bf83915SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," use Block-Jacobi? %D\n",jac->eu_bj);CHKERRQ(ierr); 604db966c6cSHong Zhang } 605db966c6cSHong Zhang PetscFunctionReturn(0); 606db966c6cSHong Zhang } 607db966c6cSHong Zhang 608db966c6cSHong Zhang /* --------------------------------------------------------------------------------------------*/ 60916d9e3a6SLisandro Dalcin 61016d9e3a6SLisandro Dalcin static PetscErrorCode PCApplyTranspose_HYPRE_BoomerAMG(PC pc,Vec b,Vec x) 61116d9e3a6SLisandro Dalcin { 61216d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 61349a781f5SStefano Zampini Mat_HYPRE *hjac = (Mat_HYPRE*)(jac->hpmat->data); 61416d9e3a6SLisandro Dalcin PetscErrorCode ierr; 61516d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 61616d9e3a6SLisandro Dalcin HYPRE_ParVector jbv,jxv; 6174ddd07fcSJed Brown PetscInt hierr; 61816d9e3a6SLisandro Dalcin 61916d9e3a6SLisandro Dalcin PetscFunctionBegin; 620dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 62116d9e3a6SLisandro Dalcin ierr = VecSet(x,0.0);CHKERRQ(ierr); 6226ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorPushVecRead(hjac->x,b);CHKERRQ(ierr); 6236ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorPushVecWrite(hjac->b,x);CHKERRQ(ierr); 62416d9e3a6SLisandro Dalcin 62549a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 6266ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b->ij,(void**)&jbv)); 6276ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x->ij,(void**)&jxv)); 62816d9e3a6SLisandro Dalcin 6296ea7df73SStefano Zampini hierr = HYPRE_BoomerAMGSolveT(jac->hsolver,hmat,jxv,jbv); 63016d9e3a6SLisandro Dalcin /* error code of 1 in BoomerAMG merely means convergence not achieved */ 631e32f2f54SBarry Smith if (hierr && (hierr != 1)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in HYPRE solver, error code %d",hierr); 63216d9e3a6SLisandro Dalcin if (hierr) hypre__global_error = 0; 63316d9e3a6SLisandro Dalcin 6346ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorPopVec(hjac->x);CHKERRQ(ierr); 6356ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorPopVec(hjac->b);CHKERRQ(ierr); 63616d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 63716d9e3a6SLisandro Dalcin } 63816d9e3a6SLisandro Dalcin 639a669f990SJed Brown /* static array length */ 640a669f990SJed Brown #define ALEN(a) (sizeof(a)/sizeof((a)[0])) 641a669f990SJed Brown 64216d9e3a6SLisandro Dalcin static const char *HYPREBoomerAMGCycleType[] = {"","V","W"}; 6430f1074feSSatish Balay static const char *HYPREBoomerAMGCoarsenType[] = {"CLJP","Ruge-Stueben","","modifiedRuge-Stueben","","","Falgout", "", "PMIS", "", "HMIS"}; 64416d9e3a6SLisandro Dalcin static const char *HYPREBoomerAMGMeasureType[] = {"local","global"}; 64565de4495SJed Brown /* The following corresponds to HYPRE_BoomerAMGSetRelaxType which has many missing numbers in the enum */ 6466a251517SEike Mueller static const char *HYPREBoomerAMGSmoothType[] = {"Schwarz-smoothers","Pilut","ParaSails","Euclid"}; 64765de4495SJed Brown static const char *HYPREBoomerAMGRelaxType[] = {"Jacobi","sequential-Gauss-Seidel","seqboundary-Gauss-Seidel","SOR/Jacobi","backward-SOR/Jacobi", 64865de4495SJed Brown "" /* [5] hybrid chaotic Gauss-Seidel (works only with OpenMP) */,"symmetric-SOR/Jacobi", 64965de4495SJed Brown "" /* 7 */,"l1scaled-SOR/Jacobi","Gaussian-elimination", 6507b7fa87dSPierre Jolivet "" /* 10 */, "" /* 11 */, "" /* 12 */, "l1-Gauss-Seidel" /* nonsymmetric */, "backward-l1-Gauss-Seidel" /* nonsymmetric */, 65165de4495SJed Brown "CG" /* non-stationary */,"Chebyshev","FCF-Jacobi","l1scaled-Jacobi"}; 6520f1074feSSatish Balay static const char *HYPREBoomerAMGInterpType[] = {"classical", "", "", "direct", "multipass", "multipass-wts", "ext+i", 653589dcaf0SStefano Zampini "ext+i-cc", "standard", "standard-wts", "block", "block-wtd", "FF", "FF1", 654589dcaf0SStefano Zampini "ext", "ad-wts", "ext-mm", "ext+i-mm", "ext+e-mm"}; 6554416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_BoomerAMG(PetscOptionItems *PetscOptionsObject,PC pc) 65616d9e3a6SLisandro Dalcin { 65716d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 65816d9e3a6SLisandro Dalcin PetscErrorCode ierr; 65922e51d31SStefano Zampini PetscInt bs,n,indx,level; 660ace3abfcSBarry Smith PetscBool flg, tmp_truth; 66116d9e3a6SLisandro Dalcin double tmpdbl, twodbl[2]; 662589dcaf0SStefano Zampini const char *symtlist[] = {"nonsymmetric","SPD","nonsymmetric,SPD"}; 66316d9e3a6SLisandro Dalcin 66416d9e3a6SLisandro Dalcin PetscFunctionBegin; 665e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE BoomerAMG Options");CHKERRQ(ierr); 6664336a9eeSBarry Smith ierr = PetscOptionsEList("-pc_hypre_boomeramg_cycle_type","Cycle type","None",HYPREBoomerAMGCycleType+1,2,HYPREBoomerAMGCycleType[jac->cycletype],&indx,&flg);CHKERRQ(ierr); 66716d9e3a6SLisandro Dalcin if (flg) { 6684336a9eeSBarry Smith jac->cycletype = indx+1; 669fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleType,(jac->hsolver,jac->cycletype)); 67016d9e3a6SLisandro Dalcin } 67116d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_max_levels","Number of levels (of grids) allowed","None",jac->maxlevels,&jac->maxlevels,&flg);CHKERRQ(ierr); 67216d9e3a6SLisandro Dalcin if (flg) { 673ce94432eSBarry Smith if (jac->maxlevels < 2) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Number of levels %d must be at least two",jac->maxlevels); 674fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxLevels,(jac->hsolver,jac->maxlevels)); 67516d9e3a6SLisandro Dalcin } 67616d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_max_iter","Maximum iterations used PER hypre call","None",jac->maxiter,&jac->maxiter,&flg);CHKERRQ(ierr); 67716d9e3a6SLisandro Dalcin if (flg) { 678ce94432eSBarry Smith if (jac->maxiter < 1) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Number of iterations %d must be at least one",jac->maxiter); 679fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 68016d9e3a6SLisandro Dalcin } 68139accc25SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_tol","Convergence tolerance PER hypre call (0.0 = use a fixed number of iterations)","None",jac->tol,&jac->tol,&flg);CHKERRQ(ierr); 68216d9e3a6SLisandro Dalcin if (flg) { 68357622a8eSBarry Smith if (jac->tol < 0.0) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Tolerance %g must be greater than or equal to zero",(double)jac->tol); 684fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 68516d9e3a6SLisandro Dalcin } 68622e51d31SStefano Zampini bs = 1; 68722e51d31SStefano Zampini if (pc->pmat) { 68822e51d31SStefano Zampini ierr = MatGetBlockSize(pc->pmat,&bs);CHKERRQ(ierr); 68922e51d31SStefano Zampini } 69022e51d31SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_numfunctions","Number of functions","HYPRE_BoomerAMGSetNumFunctions",bs,&bs,&flg);CHKERRQ(ierr); 69122e51d31SStefano Zampini if (flg) { 69222e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetNumFunctions,(jac->hsolver,bs)); 69322e51d31SStefano Zampini } 69416d9e3a6SLisandro Dalcin 69539accc25SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_truncfactor","Truncation factor for interpolation (0=no truncation)","None",jac->truncfactor,&jac->truncfactor,&flg);CHKERRQ(ierr); 69616d9e3a6SLisandro Dalcin if (flg) { 69757622a8eSBarry Smith if (jac->truncfactor < 0.0) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Truncation factor %g must be great than or equal zero",(double)jac->truncfactor); 698fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTruncFactor,(jac->hsolver,jac->truncfactor)); 69916d9e3a6SLisandro Dalcin } 70016d9e3a6SLisandro Dalcin 7010f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_P_max","Max elements per row for interpolation operator (0=unlimited)","None",jac->pmax,&jac->pmax,&flg);CHKERRQ(ierr); 7020f1074feSSatish Balay if (flg) { 703f8add624SPierre Jolivet if (jac->pmax < 0) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"P_max %D must be greater than or equal to zero",jac->pmax); 704fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetPMaxElmts,(jac->hsolver,jac->pmax)); 7050f1074feSSatish Balay } 7060f1074feSSatish Balay 707f8add624SPierre Jolivet ierr = PetscOptionsRangeInt("-pc_hypre_boomeramg_agg_nl","Number of levels of aggressive coarsening","None",jac->agg_nl,&jac->agg_nl,&flg,0,jac->maxlevels);CHKERRQ(ierr); 708f8add624SPierre Jolivet if (flg) PetscStackCallStandard(HYPRE_BoomerAMGSetAggNumLevels,(jac->hsolver,jac->agg_nl)); 7090f1074feSSatish Balay 7100f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_agg_num_paths","Number of paths for aggressive coarsening","None",jac->agg_num_paths,&jac->agg_num_paths,&flg);CHKERRQ(ierr); 7110f1074feSSatish Balay if (flg) { 712f8add624SPierre Jolivet if (jac->agg_num_paths < 1) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Number of paths %D must be greater than or equal to 1",jac->agg_num_paths); 713fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumPaths,(jac->hsolver,jac->agg_num_paths)); 7140f1074feSSatish Balay } 7150f1074feSSatish Balay 71639accc25SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_strong_threshold","Threshold for being strongly connected","None",jac->strongthreshold,&jac->strongthreshold,&flg);CHKERRQ(ierr); 71716d9e3a6SLisandro Dalcin if (flg) { 71857622a8eSBarry Smith if (jac->strongthreshold < 0.0) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Strong threshold %g must be great than or equal zero",(double)jac->strongthreshold); 719fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThreshold,(jac->hsolver,jac->strongthreshold)); 72016d9e3a6SLisandro Dalcin } 72139accc25SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_max_row_sum","Maximum row sum","None",jac->maxrowsum,&jac->maxrowsum,&flg);CHKERRQ(ierr); 72216d9e3a6SLisandro Dalcin if (flg) { 72357622a8eSBarry Smith if (jac->maxrowsum < 0.0) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Maximum row sum %g must be greater than zero",(double)jac->maxrowsum); 72457622a8eSBarry Smith if (jac->maxrowsum > 1.0) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Maximum row sum %g must be less than or equal one",(double)jac->maxrowsum); 725fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxRowSum,(jac->hsolver,jac->maxrowsum)); 72616d9e3a6SLisandro Dalcin } 72716d9e3a6SLisandro Dalcin 72816d9e3a6SLisandro Dalcin /* Grid sweeps */ 7290f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_all","Number of sweeps for the up and down grid levels","None",jac->gridsweeps[0],&indx,&flg);CHKERRQ(ierr); 73016d9e3a6SLisandro Dalcin if (flg) { 731fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumSweeps,(jac->hsolver,indx)); 73216d9e3a6SLisandro Dalcin /* modify the jac structure so we can view the updated options with PC_View */ 73316d9e3a6SLisandro Dalcin jac->gridsweeps[0] = indx; 7340f1074feSSatish Balay jac->gridsweeps[1] = indx; 7350f1074feSSatish Balay /*defaults coarse to 1 */ 7360f1074feSSatish Balay jac->gridsweeps[2] = 1; 73716d9e3a6SLisandro Dalcin } 7385272c319SBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_nodal_coarsen","Use a nodal based coarsening 1-6","HYPRE_BoomerAMGSetNodal",jac->nodal_coarsening,&jac->nodal_coarsening,&flg);CHKERRQ(ierr); 7395272c319SBarry Smith if (flg) { 7405272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNodal,(jac->hsolver,jac->nodal_coarsening)); 7415272c319SBarry Smith } 74222e51d31SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_nodal_coarsen_diag","Diagonal in strength matrix for nodal based coarsening 0-2","HYPRE_BoomerAMGSetNodalDiag",jac->nodal_coarsening_diag,&jac->nodal_coarsening_diag,&flg);CHKERRQ(ierr); 74322e51d31SStefano Zampini if (flg) { 74422e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetNodalDiag,(jac->hsolver,jac->nodal_coarsening_diag)); 74522e51d31SStefano Zampini } 746cbc39033SBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_vec_interp_variant","Variant of algorithm 1-3","HYPRE_BoomerAMGSetInterpVecVariant",jac->vec_interp_variant, &jac->vec_interp_variant,&flg);CHKERRQ(ierr); 7475272c319SBarry Smith if (flg) { 7485272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpVecVariant,(jac->hsolver,jac->vec_interp_variant)); 7495272c319SBarry Smith } 75022e51d31SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_vec_interp_qmax","Max elements per row for each Q","HYPRE_BoomerAMGSetInterpVecQMax",jac->vec_interp_qmax, &jac->vec_interp_qmax,&flg);CHKERRQ(ierr); 75122e51d31SStefano Zampini if (flg) { 75222e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetInterpVecQMax,(jac->hsolver,jac->vec_interp_qmax)); 75322e51d31SStefano Zampini } 75422e51d31SStefano Zampini ierr = PetscOptionsBool("-pc_hypre_boomeramg_vec_interp_smooth","Whether to smooth the interpolation vectors","HYPRE_BoomerAMGSetSmoothInterpVectors",jac->vec_interp_smooth, &jac->vec_interp_smooth,&flg);CHKERRQ(ierr); 75522e51d31SStefano Zampini if (flg) { 75622e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothInterpVectors,(jac->hsolver,jac->vec_interp_smooth)); 75722e51d31SStefano Zampini } 75822e51d31SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_interp_refine","Preprocess the interpolation matrix through iterative weight refinement","HYPRE_BoomerAMGSetInterpRefine",jac->interp_refine, &jac->interp_refine,&flg);CHKERRQ(ierr); 75922e51d31SStefano Zampini if (flg) { 76022e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetInterpRefine,(jac->hsolver,jac->interp_refine)); 76122e51d31SStefano Zampini } 7620f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_down","Number of sweeps for the down cycles","None",jac->gridsweeps[0], &indx,&flg);CHKERRQ(ierr); 76316d9e3a6SLisandro Dalcin if (flg) { 764fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 1)); 7650f1074feSSatish Balay jac->gridsweeps[0] = indx; 76616d9e3a6SLisandro Dalcin } 76716d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_up","Number of sweeps for the up cycles","None",jac->gridsweeps[1],&indx,&flg);CHKERRQ(ierr); 76816d9e3a6SLisandro Dalcin if (flg) { 769fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 2)); 7700f1074feSSatish Balay jac->gridsweeps[1] = indx; 77116d9e3a6SLisandro Dalcin } 7720f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_coarse","Number of sweeps for the coarse level","None",jac->gridsweeps[2],&indx,&flg);CHKERRQ(ierr); 77316d9e3a6SLisandro Dalcin if (flg) { 774fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 3)); 7750f1074feSSatish Balay jac->gridsweeps[2] = indx; 77616d9e3a6SLisandro Dalcin } 77716d9e3a6SLisandro Dalcin 7786a251517SEike Mueller /* Smooth type */ 7791e1ea65dSPierre Jolivet ierr = PetscOptionsEList("-pc_hypre_boomeramg_smooth_type","Enable more complex smoothers","None",HYPREBoomerAMGSmoothType,ALEN(HYPREBoomerAMGSmoothType),HYPREBoomerAMGSmoothType[0],&indx,&flg);CHKERRQ(ierr); 7806a251517SEike Mueller if (flg) { 7816a251517SEike Mueller jac->smoothtype = indx; 7826a251517SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothType,(jac->hsolver,indx+6)); 7838131ecf7SEike Mueller jac->smoothnumlevels = 25; 7848131ecf7SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,25)); 7858131ecf7SEike Mueller } 7868131ecf7SEike Mueller 7878131ecf7SEike Mueller /* Number of smoothing levels */ 7888131ecf7SEike Mueller ierr = PetscOptionsInt("-pc_hypre_boomeramg_smooth_num_levels","Number of levels on which more complex smoothers are used","None",25,&indx,&flg);CHKERRQ(ierr); 7898131ecf7SEike Mueller if (flg && (jac->smoothtype != -1)) { 7908131ecf7SEike Mueller jac->smoothnumlevels = indx; 7918131ecf7SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,indx)); 7926a251517SEike Mueller } 7936a251517SEike Mueller 7941810e44eSEike Mueller /* Number of levels for ILU(k) for Euclid */ 7951810e44eSEike Mueller ierr = PetscOptionsInt("-pc_hypre_boomeramg_eu_level","Number of levels for ILU(k) in Euclid smoother","None",0,&indx,&flg);CHKERRQ(ierr); 7961810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 7971810e44eSEike Mueller jac->eu_level = indx; 7981810e44eSEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuLevel,(jac->hsolver,indx)); 7991810e44eSEike Mueller } 8001810e44eSEike Mueller 8011810e44eSEike Mueller /* Filter for ILU(k) for Euclid */ 8021810e44eSEike Mueller double droptolerance; 80339accc25SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_eu_droptolerance","Drop tolerance for ILU(k) in Euclid smoother","None",0,&droptolerance,&flg);CHKERRQ(ierr); 8041810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 8051810e44eSEike Mueller jac->eu_droptolerance = droptolerance; 8061810e44eSEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuLevel,(jac->hsolver,droptolerance)); 8071810e44eSEike Mueller } 8081810e44eSEike Mueller 8091810e44eSEike Mueller /* Use Block Jacobi ILUT for Euclid */ 8101810e44eSEike Mueller ierr = PetscOptionsBool("-pc_hypre_boomeramg_eu_bj", "Use Block Jacobi for ILU in Euclid smoother?", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 8111810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 8121810e44eSEike Mueller jac->eu_bj = tmp_truth; 813493fc9d9SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuBJ,(jac->hsolver,jac->eu_bj)); 8141810e44eSEike Mueller } 8151810e44eSEike Mueller 81616d9e3a6SLisandro Dalcin /* Relax type */ 817a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_relax_type_all","Relax type for the up and down cycles","None",HYPREBoomerAMGRelaxType,ALEN(HYPREBoomerAMGRelaxType),HYPREBoomerAMGRelaxType[6],&indx,&flg);CHKERRQ(ierr); 81816d9e3a6SLisandro Dalcin if (flg) { 8190f1074feSSatish Balay jac->relaxtype[0] = jac->relaxtype[1] = indx; 820fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxType,(jac->hsolver, indx)); 8210f1074feSSatish Balay /* by default, coarse type set to 9 */ 8220f1074feSSatish Balay jac->relaxtype[2] = 9; 823ddbeb582SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, 9, 3)); 82416d9e3a6SLisandro Dalcin } 825a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_relax_type_down","Relax type for the down cycles","None",HYPREBoomerAMGRelaxType,ALEN(HYPREBoomerAMGRelaxType),HYPREBoomerAMGRelaxType[6],&indx,&flg);CHKERRQ(ierr); 82616d9e3a6SLisandro Dalcin if (flg) { 82716d9e3a6SLisandro Dalcin jac->relaxtype[0] = indx; 828fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 1)); 82916d9e3a6SLisandro Dalcin } 830a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_relax_type_up","Relax type for the up cycles","None",HYPREBoomerAMGRelaxType,ALEN(HYPREBoomerAMGRelaxType),HYPREBoomerAMGRelaxType[6],&indx,&flg);CHKERRQ(ierr); 83116d9e3a6SLisandro Dalcin if (flg) { 8320f1074feSSatish Balay jac->relaxtype[1] = indx; 833fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 2)); 83416d9e3a6SLisandro Dalcin } 835a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_relax_type_coarse","Relax type on coarse grid","None",HYPREBoomerAMGRelaxType,ALEN(HYPREBoomerAMGRelaxType),HYPREBoomerAMGRelaxType[9],&indx,&flg);CHKERRQ(ierr); 83616d9e3a6SLisandro Dalcin if (flg) { 8370f1074feSSatish Balay jac->relaxtype[2] = indx; 838fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 3)); 83916d9e3a6SLisandro Dalcin } 84016d9e3a6SLisandro Dalcin 84116d9e3a6SLisandro Dalcin /* Relaxation Weight */ 84216d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_boomeramg_relax_weight_all","Relaxation weight for all levels (0 = hypre estimates, -k = determined with k CG steps)","None",jac->relaxweight, &tmpdbl,&flg);CHKERRQ(ierr); 84316d9e3a6SLisandro Dalcin if (flg) { 844fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxWt,(jac->hsolver,tmpdbl)); 84516d9e3a6SLisandro Dalcin jac->relaxweight = tmpdbl; 84616d9e3a6SLisandro Dalcin } 84716d9e3a6SLisandro Dalcin 84816d9e3a6SLisandro Dalcin n = 2; 84916d9e3a6SLisandro Dalcin twodbl[0] = twodbl[1] = 1.0; 85016d9e3a6SLisandro Dalcin ierr = PetscOptionsRealArray("-pc_hypre_boomeramg_relax_weight_level","Set the relaxation weight for a particular level (weight,level)","None",twodbl, &n, &flg);CHKERRQ(ierr); 85116d9e3a6SLisandro Dalcin if (flg) { 85216d9e3a6SLisandro Dalcin if (n == 2) { 85316d9e3a6SLisandro Dalcin indx = (int)PetscAbsReal(twodbl[1]); 854fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetLevelRelaxWt,(jac->hsolver,twodbl[0],indx)); 855ce94432eSBarry Smith } else SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Relax weight level: you must provide 2 values separated by a comma (and no space), you provided %d",n); 85616d9e3a6SLisandro Dalcin } 85716d9e3a6SLisandro Dalcin 85816d9e3a6SLisandro Dalcin /* Outer relaxation Weight */ 85916d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_boomeramg_outer_relax_weight_all","Outer relaxation weight for all levels (-k = determined with k CG steps)","None",jac->outerrelaxweight, &tmpdbl,&flg);CHKERRQ(ierr); 86016d9e3a6SLisandro Dalcin if (flg) { 861fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetOuterWt,(jac->hsolver, tmpdbl)); 86216d9e3a6SLisandro Dalcin jac->outerrelaxweight = tmpdbl; 86316d9e3a6SLisandro Dalcin } 86416d9e3a6SLisandro Dalcin 86516d9e3a6SLisandro Dalcin n = 2; 86616d9e3a6SLisandro Dalcin twodbl[0] = twodbl[1] = 1.0; 86716d9e3a6SLisandro Dalcin ierr = PetscOptionsRealArray("-pc_hypre_boomeramg_outer_relax_weight_level","Set the outer relaxation weight for a particular level (weight,level)","None",twodbl, &n, &flg);CHKERRQ(ierr); 86816d9e3a6SLisandro Dalcin if (flg) { 86916d9e3a6SLisandro Dalcin if (n == 2) { 87016d9e3a6SLisandro Dalcin indx = (int)PetscAbsReal(twodbl[1]); 871fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetLevelOuterWt,(jac->hsolver, twodbl[0], indx)); 872ce94432eSBarry Smith } else SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Relax weight outer level: You must provide 2 values separated by a comma (and no space), you provided %d",n); 87316d9e3a6SLisandro Dalcin } 87416d9e3a6SLisandro Dalcin 87516d9e3a6SLisandro Dalcin /* the Relax Order */ 876acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_boomeramg_no_CF", "Do not use CF-relaxation", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 87716d9e3a6SLisandro Dalcin 8788afaa268SBarry Smith if (flg && tmp_truth) { 87916d9e3a6SLisandro Dalcin jac->relaxorder = 0; 880fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxOrder,(jac->hsolver, jac->relaxorder)); 88116d9e3a6SLisandro Dalcin } 882a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_measure_type","Measure type","None",HYPREBoomerAMGMeasureType,ALEN(HYPREBoomerAMGMeasureType),HYPREBoomerAMGMeasureType[0],&indx,&flg);CHKERRQ(ierr); 88316d9e3a6SLisandro Dalcin if (flg) { 88416d9e3a6SLisandro Dalcin jac->measuretype = indx; 885fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMeasureType,(jac->hsolver,jac->measuretype)); 88616d9e3a6SLisandro Dalcin } 8870f1074feSSatish Balay /* update list length 3/07 */ 888a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_coarsen_type","Coarsen type","None",HYPREBoomerAMGCoarsenType,ALEN(HYPREBoomerAMGCoarsenType),HYPREBoomerAMGCoarsenType[6],&indx,&flg);CHKERRQ(ierr); 88916d9e3a6SLisandro Dalcin if (flg) { 89016d9e3a6SLisandro Dalcin jac->coarsentype = indx; 891fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCoarsenType,(jac->hsolver,jac->coarsentype)); 89216d9e3a6SLisandro Dalcin } 8930f1074feSSatish Balay 894589dcaf0SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_max_coarse_size", "Maximum size of coarsest grid", "None", jac->maxc, &jac->maxc, &flg);CHKERRQ(ierr); 895589dcaf0SStefano Zampini if (flg) { 896589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetMaxCoarseSize,(jac->hsolver, jac->maxc)); 897589dcaf0SStefano Zampini } 898589dcaf0SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_min_coarse_size", "Minimum size of coarsest grid", "None", jac->minc, &jac->minc, &flg);CHKERRQ(ierr); 899589dcaf0SStefano Zampini if (flg) { 900589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetMinCoarseSize,(jac->hsolver, jac->minc)); 901589dcaf0SStefano Zampini } 902589dcaf0SStefano Zampini 903589dcaf0SStefano Zampini /* AIR */ 904589dcaf0SStefano Zampini #if PETSC_PKG_HYPRE_VERSION_GE(2,18,0) 905589dcaf0SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_restriction_type", "Type of AIR method (distance 1 or 2, 0 means no AIR)", "None", jac->Rtype, &jac->Rtype, NULL);CHKERRQ(ierr); 906589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetRestriction,(jac->hsolver,jac->Rtype)); 907589dcaf0SStefano Zampini if (jac->Rtype) { 908589dcaf0SStefano Zampini jac->interptype = 100; /* no way we can pass this with strings... Set it as default as in MFEM, then users can still customize it back to a different one */ 909589dcaf0SStefano Zampini 910589dcaf0SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_strongthresholdR","Threshold for R","None",jac->Rstrongthreshold,&jac->Rstrongthreshold,NULL);CHKERRQ(ierr); 911589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThresholdR,(jac->hsolver,jac->Rstrongthreshold)); 912589dcaf0SStefano Zampini 913589dcaf0SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_filterthresholdR","Filter threshold for R","None",jac->Rfilterthreshold,&jac->Rfilterthreshold,NULL);CHKERRQ(ierr); 914589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetFilterThresholdR,(jac->hsolver,jac->Rfilterthreshold)); 915589dcaf0SStefano Zampini 916589dcaf0SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_Adroptol","Defines the drop tolerance for the A-matrices from the 2nd level of AMG","None",jac->Adroptol,&jac->Adroptol,NULL);CHKERRQ(ierr); 917589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetADropTol,(jac->hsolver,jac->Adroptol)); 918589dcaf0SStefano Zampini 919589dcaf0SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_Adroptype","Drops the entries that are not on the diagonal and smaller than its row norm: type 1: 1-norm, 2: 2-norm, -1: infinity norm","None",jac->Adroptype,&jac->Adroptype,NULL);CHKERRQ(ierr); 920589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetADropType,(jac->hsolver,jac->Adroptype)); 921589dcaf0SStefano Zampini } 922589dcaf0SStefano Zampini #endif 923589dcaf0SStefano Zampini 924*ecae95adSPierre Jolivet #if PETSC_PKG_HYPRE_VERSION_LE(9,9,9) 925*ecae95adSPierre Jolivet if (jac->Rtype && jac->agg_nl) SETERRQ2(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_INCOMP,"-pc_hypre_boomeramg_restriction_type (%D) and -pc_hypre_boomeramg_agg_nl (%D)",jac->Rtype,jac->agg_nl); 926*ecae95adSPierre Jolivet #endif 927*ecae95adSPierre Jolivet 9280f1074feSSatish Balay /* new 3/07 */ 929a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_interp_type","Interpolation type","None",HYPREBoomerAMGInterpType,ALEN(HYPREBoomerAMGInterpType),HYPREBoomerAMGInterpType[0],&indx,&flg);CHKERRQ(ierr); 930589dcaf0SStefano Zampini if (flg || jac->Rtype) { 931589dcaf0SStefano Zampini if (flg) jac->interptype = indx; 932fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpType,(jac->hsolver,jac->interptype)); 9330f1074feSSatish Balay } 9340f1074feSSatish Balay 935b96a4a96SBarry Smith ierr = PetscOptionsName("-pc_hypre_boomeramg_print_statistics","Print statistics","None",&flg);CHKERRQ(ierr); 93616d9e3a6SLisandro Dalcin if (flg) { 937b96a4a96SBarry Smith level = 3; 9380298fd71SBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_print_statistics","Print statistics","None",level,&level,NULL);CHKERRQ(ierr); 9392fa5cd67SKarl Rupp 940b96a4a96SBarry Smith jac->printstatistics = PETSC_TRUE; 941fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetPrintLevel,(jac->hsolver,level)); 9422ae77aedSBarry Smith } 9432ae77aedSBarry Smith 944b96a4a96SBarry Smith ierr = PetscOptionsName("-pc_hypre_boomeramg_print_debug","Print debug information","None",&flg);CHKERRQ(ierr); 9452ae77aedSBarry Smith if (flg) { 946b96a4a96SBarry Smith level = 3; 9470298fd71SBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_print_debug","Print debug information","None",level,&level,NULL);CHKERRQ(ierr); 9482fa5cd67SKarl Rupp 949b96a4a96SBarry Smith jac->printstatistics = PETSC_TRUE; 950fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetDebugFlag,(jac->hsolver,level)); 95116d9e3a6SLisandro Dalcin } 9528f87f92bSBarry Smith 953acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_boomeramg_nodal_relaxation", "Nodal relaxation via Schwarz", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 9548f87f92bSBarry Smith if (flg && tmp_truth) { 9558f87f92bSBarry Smith PetscInt tmp_int; 9568f87f92bSBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_nodal_relaxation", "Nodal relaxation via Schwarz", "None",jac->nodal_relax_levels,&tmp_int,&flg);CHKERRQ(ierr); 9578f87f92bSBarry Smith if (flg) jac->nodal_relax_levels = tmp_int; 958fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothType,(jac->hsolver,6)); 959fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetDomainType,(jac->hsolver,1)); 960fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetOverlap,(jac->hsolver,0)); 961fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,jac->nodal_relax_levels)); 9628f87f92bSBarry Smith } 9638f87f92bSBarry Smith 964589dcaf0SStefano Zampini ierr = PetscOptionsBool("-pc_hypre_boomeramg_keeptranspose", "Avoid transpose matvecs in preconditioner application", "None", jac->keeptranspose, &jac->keeptranspose, NULL);CHKERRQ(ierr); 965589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetKeepTranspose,(jac->hsolver,jac->keeptranspose ? 1 : 0)); 966589dcaf0SStefano Zampini 967589dcaf0SStefano Zampini /* options for ParaSails solvers */ 968589dcaf0SStefano Zampini ierr = PetscOptionsEList("-pc_hypre_boomeramg_parasails_sym","Symmetry of matrix and preconditioner","None",symtlist,ALEN(symtlist),symtlist[0],&indx,&flg);CHKERRQ(ierr); 969589dcaf0SStefano Zampini if (flg) { 970589dcaf0SStefano Zampini jac->symt = indx; 971589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetSym,(jac->hsolver,jac->symt)); 972589dcaf0SStefano Zampini } 973589dcaf0SStefano Zampini 97416d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 97516d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 97616d9e3a6SLisandro Dalcin } 97716d9e3a6SLisandro Dalcin 978ace3abfcSBarry Smith static PetscErrorCode PCApplyRichardson_HYPRE_BoomerAMG(PC pc,Vec b,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt its,PetscBool guesszero,PetscInt *outits,PCRichardsonConvergedReason *reason) 97916d9e3a6SLisandro Dalcin { 98016d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 98116d9e3a6SLisandro Dalcin PetscErrorCode ierr; 9822cf14000SStefano Zampini HYPRE_Int oits; 98316d9e3a6SLisandro Dalcin 98416d9e3a6SLisandro Dalcin PetscFunctionBegin; 985dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 986fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,its*jac->maxiter)); 987fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,rtol)); 98816d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_TRUE; 98916d9e3a6SLisandro Dalcin ierr = PCApply_HYPRE(pc,b,y);CHKERRQ(ierr); 99016d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_FALSE; 9912cf14000SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGGetNumIterations,(jac->hsolver,&oits)); 9924d0a8057SBarry Smith *outits = oits; 9934d0a8057SBarry Smith if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 9944d0a8057SBarry Smith else *reason = PCRICHARDSON_CONVERGED_RTOL; 995fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 996fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 99716d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 99816d9e3a6SLisandro Dalcin } 99916d9e3a6SLisandro Dalcin 100016d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_BoomerAMG(PC pc,PetscViewer viewer) 100116d9e3a6SLisandro Dalcin { 100216d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 100316d9e3a6SLisandro Dalcin PetscErrorCode ierr; 1004ace3abfcSBarry Smith PetscBool iascii; 100516d9e3a6SLisandro Dalcin 100616d9e3a6SLisandro Dalcin PetscFunctionBegin; 1007251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 100816d9e3a6SLisandro Dalcin if (iascii) { 100916d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG preconditioning\n");CHKERRQ(ierr); 1010efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Cycle type %s\n",HYPREBoomerAMGCycleType[jac->cycletype]);CHKERRQ(ierr); 101122e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Maximum number of levels %D\n",jac->maxlevels);CHKERRQ(ierr); 101222e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Maximum number of iterations PER hypre call %D\n",jac->maxiter);CHKERRQ(ierr); 1013efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Convergence tolerance PER hypre call %g\n",(double)jac->tol);CHKERRQ(ierr); 1014efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Threshold for strong coupling %g\n",(double)jac->strongthreshold);CHKERRQ(ierr); 1015efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Interpolation truncation factor %g\n",(double)jac->truncfactor);CHKERRQ(ierr); 101622e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Interpolation: max elements per row %D\n",jac->pmax);CHKERRQ(ierr); 101722e51d31SStefano Zampini if (jac->interp_refine) { 101822e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Interpolation: number of steps of weighted refinement %D\n",jac->interp_refine);CHKERRQ(ierr); 101922e51d31SStefano Zampini } 102022e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Number of levels of aggressive coarsening %D\n",jac->agg_nl);CHKERRQ(ierr); 102122e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Number of paths for aggressive coarsening %D\n",jac->agg_num_paths);CHKERRQ(ierr); 10220f1074feSSatish Balay 1023efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Maximum row sums %g\n",(double)jac->maxrowsum);CHKERRQ(ierr); 102416d9e3a6SLisandro Dalcin 102522e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Sweeps down %D\n",jac->gridsweeps[0]);CHKERRQ(ierr); 102622e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Sweeps up %D\n",jac->gridsweeps[1]);CHKERRQ(ierr); 102722e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Sweeps on coarse %D\n",jac->gridsweeps[2]);CHKERRQ(ierr); 102816d9e3a6SLisandro Dalcin 1029efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax down %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[0]]);CHKERRQ(ierr); 1030efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax up %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[1]]);CHKERRQ(ierr); 1031efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax on coarse %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[2]]);CHKERRQ(ierr); 103216d9e3a6SLisandro Dalcin 1033efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax weight (all) %g\n",(double)jac->relaxweight);CHKERRQ(ierr); 1034efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Outer relax weight (all) %g\n",(double)jac->outerrelaxweight);CHKERRQ(ierr); 103516d9e3a6SLisandro Dalcin 103616d9e3a6SLisandro Dalcin if (jac->relaxorder) { 1037efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Using CF-relaxation\n");CHKERRQ(ierr); 103816d9e3a6SLisandro Dalcin } else { 1039efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Not using CF-relaxation\n");CHKERRQ(ierr); 104016d9e3a6SLisandro Dalcin } 10416a251517SEike Mueller if (jac->smoothtype!=-1) { 1042efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Smooth type %s\n",HYPREBoomerAMGSmoothType[jac->smoothtype]);CHKERRQ(ierr); 104322e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Smooth num levels %D\n",jac->smoothnumlevels);CHKERRQ(ierr); 10447e352d70SEike Mueller } else { 1045efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Not using more complex smoothers.\n");CHKERRQ(ierr); 10461810e44eSEike Mueller } 10471810e44eSEike Mueller if (jac->smoothtype==3) { 104822e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Euclid ILU(k) levels %D\n",jac->eu_level);CHKERRQ(ierr); 104922e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Euclid ILU(k) drop tolerance %g\n",(double)jac->eu_droptolerance);CHKERRQ(ierr); 105022e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Euclid ILU use Block-Jacobi? %D\n",jac->eu_bj);CHKERRQ(ierr); 10516a251517SEike Mueller } 1052efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Measure type %s\n",HYPREBoomerAMGMeasureType[jac->measuretype]);CHKERRQ(ierr); 1053efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Coarsen type %s\n",HYPREBoomerAMGCoarsenType[jac->coarsentype]);CHKERRQ(ierr); 1054589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Interpolation type %s\n",jac->interptype != 100 ? HYPREBoomerAMGInterpType[jac->interptype] : "1pt");CHKERRQ(ierr); 10555272c319SBarry Smith if (jac->nodal_coarsening) { 105684c7a2fdSPierre Jolivet ierr = PetscViewerASCIIPrintf(viewer," Using nodal coarsening with HYPRE_BOOMERAMGSetNodal() %D\n",jac->nodal_coarsening);CHKERRQ(ierr); 10575272c319SBarry Smith } 10585272c319SBarry Smith if (jac->vec_interp_variant) { 1059efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE_BoomerAMGSetInterpVecVariant() %D\n",jac->vec_interp_variant);CHKERRQ(ierr); 106022e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE_BoomerAMGSetInterpVecQMax() %D\n",jac->vec_interp_qmax);CHKERRQ(ierr); 106122e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE_BoomerAMGSetSmoothInterpVectors() %d\n",jac->vec_interp_smooth);CHKERRQ(ierr); 10628f87f92bSBarry Smith } 10638f87f92bSBarry Smith if (jac->nodal_relax) { 106422e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Using nodal relaxation via Schwarz smoothing on levels %D\n",jac->nodal_relax_levels);CHKERRQ(ierr); 10658f87f92bSBarry Smith } 1066589dcaf0SStefano Zampini 1067589dcaf0SStefano Zampini /* AIR */ 1068589dcaf0SStefano Zampini if (jac->Rtype) { 1069589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Using approximate ideal restriction type %D\n",jac->Rtype);CHKERRQ(ierr); 1070589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Threshold for R %g\n",(double)jac->Rstrongthreshold);CHKERRQ(ierr); 1071589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Filter for R %g\n",(double)jac->Rfilterthreshold);CHKERRQ(ierr); 1072589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," A drop tolerance %g\n",(double)jac->Adroptol);CHKERRQ(ierr); 1073589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," A drop type %D\n",jac->Adroptype);CHKERRQ(ierr); 1074589dcaf0SStefano Zampini } 107516d9e3a6SLisandro Dalcin } 107616d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 107716d9e3a6SLisandro Dalcin } 107816d9e3a6SLisandro Dalcin 107916d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 10804416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_ParaSails(PetscOptionItems *PetscOptionsObject,PC pc) 108116d9e3a6SLisandro Dalcin { 108216d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 108316d9e3a6SLisandro Dalcin PetscErrorCode ierr; 10844ddd07fcSJed Brown PetscInt indx; 1085ace3abfcSBarry Smith PetscBool flag; 108616d9e3a6SLisandro Dalcin const char *symtlist[] = {"nonsymmetric","SPD","nonsymmetric,SPD"}; 108716d9e3a6SLisandro Dalcin 108816d9e3a6SLisandro Dalcin PetscFunctionBegin; 1089e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE ParaSails Options");CHKERRQ(ierr); 109016d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_parasails_nlevels","Number of number of levels","None",jac->nlevels,&jac->nlevels,0);CHKERRQ(ierr); 10918966356dSPierre Jolivet ierr = PetscOptionsReal("-pc_hypre_parasails_thresh","Threshold","None",jac->threshold,&jac->threshold,&flag);CHKERRQ(ierr); 10928966356dSPierre Jolivet if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetParams,(jac->hsolver,jac->threshold,jac->nlevels)); 109316d9e3a6SLisandro Dalcin 109416d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_parasails_filter","filter","None",jac->filter,&jac->filter,&flag);CHKERRQ(ierr); 10952fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetFilter,(jac->hsolver,jac->filter)); 109616d9e3a6SLisandro Dalcin 109716d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_parasails_loadbal","Load balance","None",jac->loadbal,&jac->loadbal,&flag);CHKERRQ(ierr); 10982fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetLoadbal,(jac->hsolver,jac->loadbal)); 109916d9e3a6SLisandro Dalcin 1100acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_parasails_logging","Print info to screen","None",(PetscBool)jac->logging,(PetscBool*)&jac->logging,&flag);CHKERRQ(ierr); 11012fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetLogging,(jac->hsolver,jac->logging)); 110216d9e3a6SLisandro Dalcin 1103acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_parasails_reuse","Reuse nonzero pattern in preconditioner","None",(PetscBool)jac->ruse,(PetscBool*)&jac->ruse,&flag);CHKERRQ(ierr); 11042fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetReuse,(jac->hsolver,jac->ruse)); 110516d9e3a6SLisandro Dalcin 1106a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_parasails_sym","Symmetry of matrix and preconditioner","None",symtlist,ALEN(symtlist),symtlist[0],&indx,&flag);CHKERRQ(ierr); 110716d9e3a6SLisandro Dalcin if (flag) { 110816d9e3a6SLisandro Dalcin jac->symt = indx; 1109fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetSym,(jac->hsolver,jac->symt)); 111016d9e3a6SLisandro Dalcin } 111116d9e3a6SLisandro Dalcin 111216d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 111316d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 111416d9e3a6SLisandro Dalcin } 111516d9e3a6SLisandro Dalcin 111616d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_ParaSails(PC pc,PetscViewer viewer) 111716d9e3a6SLisandro Dalcin { 111816d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 111916d9e3a6SLisandro Dalcin PetscErrorCode ierr; 1120ace3abfcSBarry Smith PetscBool iascii; 1121feb237baSPierre Jolivet const char *symt = 0; 112216d9e3a6SLisandro Dalcin 112316d9e3a6SLisandro Dalcin PetscFunctionBegin; 1124251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 112516d9e3a6SLisandro Dalcin if (iascii) { 112616d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE ParaSails preconditioning\n");CHKERRQ(ierr); 1127efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," nlevels %d\n",jac->nlevels);CHKERRQ(ierr); 11288966356dSPierre Jolivet ierr = PetscViewerASCIIPrintf(viewer," threshold %g\n",(double)jac->threshold);CHKERRQ(ierr); 1129efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," filter %g\n",(double)jac->filter);CHKERRQ(ierr); 1130efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," load balance %g\n",(double)jac->loadbal);CHKERRQ(ierr); 1131efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," reuse nonzero structure %s\n",PetscBools[jac->ruse]);CHKERRQ(ierr); 1132efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," print info to screen %s\n",PetscBools[jac->logging]);CHKERRQ(ierr); 11332fa5cd67SKarl Rupp if (!jac->symt) symt = "nonsymmetric matrix and preconditioner"; 11342fa5cd67SKarl Rupp else if (jac->symt == 1) symt = "SPD matrix and preconditioner"; 11352fa5cd67SKarl Rupp else if (jac->symt == 2) symt = "nonsymmetric matrix but SPD preconditioner"; 1136ce94432eSBarry Smith else SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONG,"Unknown HYPRE ParaSails symmetric option %d",jac->symt); 1137efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," %s\n",symt);CHKERRQ(ierr); 113816d9e3a6SLisandro Dalcin } 113916d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 114016d9e3a6SLisandro Dalcin } 11414cb006feSStefano Zampini /* --------------------------------------------------------------------------------------------*/ 11424416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_AMS(PetscOptionItems *PetscOptionsObject,PC pc) 11434cb006feSStefano Zampini { 11444cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 11454cb006feSStefano Zampini PetscErrorCode ierr; 11464cb006feSStefano Zampini PetscInt n; 11474cb006feSStefano Zampini PetscBool flag,flag2,flag3,flag4; 11484cb006feSStefano Zampini 11494cb006feSStefano Zampini PetscFunctionBegin; 11509fa463a7SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE AMS Options");CHKERRQ(ierr); 1151863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ams_print_level","Debugging output level for AMS","None",jac->as_print,&jac->as_print,&flag);CHKERRQ(ierr); 1152863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetPrintLevel,(jac->hsolver,jac->as_print)); 1153863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ams_max_iter","Maximum number of AMS multigrid iterations within PCApply","None",jac->as_max_iter,&jac->as_max_iter,&flag);CHKERRQ(ierr); 1154863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 11554cb006feSStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ams_cycle_type","Cycle type for AMS multigrid","None",jac->ams_cycle_type,&jac->ams_cycle_type,&flag);CHKERRQ(ierr); 11564cb006feSStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 1157863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ams_tol","Error tolerance for AMS multigrid","None",jac->as_tol,&jac->as_tol,&flag);CHKERRQ(ierr); 1158863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetTol,(jac->hsolver,jac->as_tol)); 1159863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ams_relax_type","Relaxation type for AMS smoother","None",jac->as_relax_type,&jac->as_relax_type,&flag);CHKERRQ(ierr); 1160863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ams_relax_times","Number of relaxation steps for AMS smoother","None",jac->as_relax_times,&jac->as_relax_times,&flag2);CHKERRQ(ierr); 1161863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ams_relax_weight","Relaxation weight for AMS smoother","None",jac->as_relax_weight,&jac->as_relax_weight,&flag3);CHKERRQ(ierr); 1162863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ams_omega","SSOR coefficient for AMS smoother","None",jac->as_omega,&jac->as_omega,&flag4);CHKERRQ(ierr); 11634cb006feSStefano Zampini if (flag || flag2 || flag3 || flag4) { 1164863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1165863406b8SStefano Zampini jac->as_relax_times, 1166863406b8SStefano Zampini jac->as_relax_weight, 1167863406b8SStefano Zampini jac->as_omega)); 11684cb006feSStefano Zampini } 1169863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ams_amg_alpha_theta","Threshold for strong coupling of vector Poisson AMG solver","None",jac->as_amg_alpha_theta,&jac->as_amg_alpha_theta,&flag);CHKERRQ(ierr); 11704cb006feSStefano Zampini n = 5; 1171863406b8SStefano Zampini ierr = PetscOptionsIntArray("-pc_hypre_ams_amg_alpha_options","AMG options for vector Poisson","None",jac->as_amg_alpha_opts,&n,&flag2);CHKERRQ(ierr); 11724cb006feSStefano Zampini if (flag || flag2) { 1173863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaAMGOptions,(jac->hsolver,jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1174863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1175863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1176863406b8SStefano Zampini jac->as_amg_alpha_theta, 1177863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1178863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 11794cb006feSStefano Zampini } 1180863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ams_amg_beta_theta","Threshold for strong coupling of scalar Poisson AMG solver","None",jac->as_amg_beta_theta,&jac->as_amg_beta_theta,&flag);CHKERRQ(ierr); 11814cb006feSStefano Zampini n = 5; 1182863406b8SStefano Zampini ierr = PetscOptionsIntArray("-pc_hypre_ams_amg_beta_options","AMG options for scalar Poisson solver","None",jac->as_amg_beta_opts,&n,&flag2);CHKERRQ(ierr); 11834cb006feSStefano Zampini if (flag || flag2) { 1184863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1185863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1186863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1187863406b8SStefano Zampini jac->as_amg_beta_theta, 1188863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1189863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 11904cb006feSStefano Zampini } 119123df4f25SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ams_projection_frequency","Frequency at which a projection onto the compatible subspace for problems with zero conductivity regions is performed","None",jac->ams_proj_freq,&jac->ams_proj_freq,&flag);CHKERRQ(ierr); 119223df4f25SStefano Zampini if (flag) { /* override HYPRE's default only if the options is used */ 119323df4f25SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetProjectionFrequency,(jac->hsolver,jac->ams_proj_freq)); 119423df4f25SStefano Zampini } 11954cb006feSStefano Zampini ierr = PetscOptionsTail();CHKERRQ(ierr); 11964cb006feSStefano Zampini PetscFunctionReturn(0); 11974cb006feSStefano Zampini } 11984cb006feSStefano Zampini 11994cb006feSStefano Zampini static PetscErrorCode PCView_HYPRE_AMS(PC pc,PetscViewer viewer) 12004cb006feSStefano Zampini { 12014cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 12024cb006feSStefano Zampini PetscErrorCode ierr; 12034cb006feSStefano Zampini PetscBool iascii; 12044cb006feSStefano Zampini 12054cb006feSStefano Zampini PetscFunctionBegin; 12064cb006feSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 12074cb006feSStefano Zampini if (iascii) { 12084cb006feSStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS preconditioning\n");CHKERRQ(ierr); 1209efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iterations per application %d\n",jac->as_max_iter);CHKERRQ(ierr); 1210efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace cycle type %d\n",jac->ams_cycle_type);CHKERRQ(ierr); 1211efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iteration tolerance %g\n",jac->as_tol);CHKERRQ(ierr); 1212efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother type %d\n",jac->as_relax_type);CHKERRQ(ierr); 1213efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number of smoothing steps %d\n",jac->as_relax_times);CHKERRQ(ierr); 1214efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother weight %g\n",jac->as_relax_weight);CHKERRQ(ierr); 1215efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother omega %g\n",jac->as_omega);CHKERRQ(ierr); 12164cb006feSStefano Zampini if (jac->alpha_Poisson) { 1217efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," vector Poisson solver (passed in by user)\n");CHKERRQ(ierr); 12184cb006feSStefano Zampini } else { 1219efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," vector Poisson solver (computed) \n");CHKERRQ(ierr); 12204cb006feSStefano Zampini } 1221efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG coarsening type %d\n",jac->as_amg_alpha_opts[0]);CHKERRQ(ierr); 1222efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG levels of aggressive coarsening %d\n",jac->as_amg_alpha_opts[1]);CHKERRQ(ierr); 1223efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG relaxation type %d\n",jac->as_amg_alpha_opts[2]);CHKERRQ(ierr); 1224efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG interpolation type %d\n",jac->as_amg_alpha_opts[3]);CHKERRQ(ierr); 1225efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG max nonzero elements in interpolation rows %d\n",jac->as_amg_alpha_opts[4]);CHKERRQ(ierr); 1226efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG strength threshold %g\n",jac->as_amg_alpha_theta);CHKERRQ(ierr); 12274cb006feSStefano Zampini if (!jac->ams_beta_is_zero) { 12284cb006feSStefano Zampini if (jac->beta_Poisson) { 1229efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," scalar Poisson solver (passed in by user)\n");CHKERRQ(ierr); 12304cb006feSStefano Zampini } else { 1231efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," scalar Poisson solver (computed) \n");CHKERRQ(ierr); 12324cb006feSStefano Zampini } 1233efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG coarsening type %d\n",jac->as_amg_beta_opts[0]);CHKERRQ(ierr); 1234efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG levels of aggressive coarsening %d\n",jac->as_amg_beta_opts[1]);CHKERRQ(ierr); 1235efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG relaxation type %d\n",jac->as_amg_beta_opts[2]);CHKERRQ(ierr); 1236efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG interpolation type %d\n",jac->as_amg_beta_opts[3]);CHKERRQ(ierr); 1237efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG max nonzero elements in interpolation rows %d\n",jac->as_amg_beta_opts[4]);CHKERRQ(ierr); 1238efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG strength threshold %g\n",jac->as_amg_beta_theta);CHKERRQ(ierr); 123923df4f25SStefano Zampini if (jac->ams_beta_is_zero_part) { 1240efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," compatible subspace projection frequency %d (-1 HYPRE uses default)\n",jac->ams_proj_freq);CHKERRQ(ierr); 124123df4f25SStefano Zampini } 124223df4f25SStefano Zampini } else { 1243efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," scalar Poisson solver not used (zero-conductivity everywhere) \n");CHKERRQ(ierr); 12444cb006feSStefano Zampini } 12454cb006feSStefano Zampini } 12464cb006feSStefano Zampini PetscFunctionReturn(0); 12474cb006feSStefano Zampini } 12484cb006feSStefano Zampini 12494416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_ADS(PetscOptionItems *PetscOptionsObject,PC pc) 1250863406b8SStefano Zampini { 1251863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1252863406b8SStefano Zampini PetscErrorCode ierr; 1253863406b8SStefano Zampini PetscInt n; 1254863406b8SStefano Zampini PetscBool flag,flag2,flag3,flag4; 1255863406b8SStefano Zampini 1256863406b8SStefano Zampini PetscFunctionBegin; 1257863406b8SStefano Zampini ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE ADS Options");CHKERRQ(ierr); 1258863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ads_print_level","Debugging output level for ADS","None",jac->as_print,&jac->as_print,&flag);CHKERRQ(ierr); 1259863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetPrintLevel,(jac->hsolver,jac->as_print)); 1260863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ads_max_iter","Maximum number of ADS multigrid iterations within PCApply","None",jac->as_max_iter,&jac->as_max_iter,&flag);CHKERRQ(ierr); 1261863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 1262863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ads_cycle_type","Cycle type for ADS multigrid","None",jac->ads_cycle_type,&jac->ads_cycle_type,&flag);CHKERRQ(ierr); 1263863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetCycleType,(jac->hsolver,jac->ads_cycle_type)); 1264863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ads_tol","Error tolerance for ADS multigrid","None",jac->as_tol,&jac->as_tol,&flag);CHKERRQ(ierr); 1265863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetTol,(jac->hsolver,jac->as_tol)); 1266863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ads_relax_type","Relaxation type for ADS smoother","None",jac->as_relax_type,&jac->as_relax_type,&flag);CHKERRQ(ierr); 1267863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ads_relax_times","Number of relaxation steps for ADS smoother","None",jac->as_relax_times,&jac->as_relax_times,&flag2);CHKERRQ(ierr); 1268863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ads_relax_weight","Relaxation weight for ADS smoother","None",jac->as_relax_weight,&jac->as_relax_weight,&flag3);CHKERRQ(ierr); 1269863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ads_omega","SSOR coefficient for ADS smoother","None",jac->as_omega,&jac->as_omega,&flag4);CHKERRQ(ierr); 1270863406b8SStefano Zampini if (flag || flag2 || flag3 || flag4) { 1271863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1272863406b8SStefano Zampini jac->as_relax_times, 1273863406b8SStefano Zampini jac->as_relax_weight, 1274863406b8SStefano Zampini jac->as_omega)); 1275863406b8SStefano Zampini } 1276863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ads_ams_theta","Threshold for strong coupling of AMS solver inside ADS","None",jac->as_amg_alpha_theta,&jac->as_amg_alpha_theta,&flag);CHKERRQ(ierr); 1277863406b8SStefano Zampini n = 5; 1278863406b8SStefano Zampini ierr = PetscOptionsIntArray("-pc_hypre_ads_ams_options","AMG options for AMS solver inside ADS","None",jac->as_amg_alpha_opts,&n,&flag2);CHKERRQ(ierr); 1279863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ads_ams_cycle_type","Cycle type for AMS solver inside ADS","None",jac->ams_cycle_type,&jac->ams_cycle_type,&flag3);CHKERRQ(ierr); 1280863406b8SStefano Zampini if (flag || flag2 || flag3) { 1281863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMSOptions,(jac->hsolver,jac->ams_cycle_type, /* AMS cycle type */ 1282863406b8SStefano Zampini jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1283863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1284863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1285863406b8SStefano Zampini jac->as_amg_alpha_theta, 1286863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1287863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 1288863406b8SStefano Zampini } 1289863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ads_amg_theta","Threshold for strong coupling of vector AMG solver inside ADS","None",jac->as_amg_beta_theta,&jac->as_amg_beta_theta,&flag);CHKERRQ(ierr); 1290863406b8SStefano Zampini n = 5; 1291863406b8SStefano Zampini ierr = PetscOptionsIntArray("-pc_hypre_ads_amg_options","AMG options for vector AMG solver inside ADS","None",jac->as_amg_beta_opts,&n,&flag2);CHKERRQ(ierr); 1292863406b8SStefano Zampini if (flag || flag2) { 1293863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1294863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1295863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1296863406b8SStefano Zampini jac->as_amg_beta_theta, 1297863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1298863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 1299863406b8SStefano Zampini } 1300863406b8SStefano Zampini ierr = PetscOptionsTail();CHKERRQ(ierr); 1301863406b8SStefano Zampini PetscFunctionReturn(0); 1302863406b8SStefano Zampini } 1303863406b8SStefano Zampini 1304863406b8SStefano Zampini static PetscErrorCode PCView_HYPRE_ADS(PC pc,PetscViewer viewer) 1305863406b8SStefano Zampini { 1306863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1307863406b8SStefano Zampini PetscErrorCode ierr; 1308863406b8SStefano Zampini PetscBool iascii; 1309863406b8SStefano Zampini 1310863406b8SStefano Zampini PetscFunctionBegin; 1311863406b8SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1312863406b8SStefano Zampini if (iascii) { 1313863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS preconditioning\n");CHKERRQ(ierr); 1314efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iterations per application %d\n",jac->as_max_iter);CHKERRQ(ierr); 1315efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace cycle type %d\n",jac->ads_cycle_type);CHKERRQ(ierr); 1316efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iteration tolerance %g\n",jac->as_tol);CHKERRQ(ierr); 1317efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother type %d\n",jac->as_relax_type);CHKERRQ(ierr); 1318efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number of smoothing steps %d\n",jac->as_relax_times);CHKERRQ(ierr); 1319efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother weight %g\n",jac->as_relax_weight);CHKERRQ(ierr); 1320efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother omega %g\n",jac->as_omega);CHKERRQ(ierr); 1321efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," AMS solver using boomerAMG\n");CHKERRQ(ierr); 1322efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace cycle type %d\n",jac->ams_cycle_type);CHKERRQ(ierr); 1323efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," coarsening type %d\n",jac->as_amg_alpha_opts[0]);CHKERRQ(ierr); 1324efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," levels of aggressive coarsening %d\n",jac->as_amg_alpha_opts[1]);CHKERRQ(ierr); 1325efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relaxation type %d\n",jac->as_amg_alpha_opts[2]);CHKERRQ(ierr); 1326efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," interpolation type %d\n",jac->as_amg_alpha_opts[3]);CHKERRQ(ierr); 1327efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max nonzero elements in interpolation rows %d\n",jac->as_amg_alpha_opts[4]);CHKERRQ(ierr); 1328efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," strength threshold %g\n",jac->as_amg_alpha_theta);CHKERRQ(ierr); 1329efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," vector Poisson solver using boomerAMG\n");CHKERRQ(ierr); 1330efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," coarsening type %d\n",jac->as_amg_beta_opts[0]);CHKERRQ(ierr); 1331efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," levels of aggressive coarsening %d\n",jac->as_amg_beta_opts[1]);CHKERRQ(ierr); 1332efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relaxation type %d\n",jac->as_amg_beta_opts[2]);CHKERRQ(ierr); 1333efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," interpolation type %d\n",jac->as_amg_beta_opts[3]);CHKERRQ(ierr); 1334efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max nonzero elements in interpolation rows %d\n",jac->as_amg_beta_opts[4]);CHKERRQ(ierr); 1335efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," strength threshold %g\n",jac->as_amg_beta_theta);CHKERRQ(ierr); 1336863406b8SStefano Zampini } 1337863406b8SStefano Zampini PetscFunctionReturn(0); 1338863406b8SStefano Zampini } 1339863406b8SStefano Zampini 1340863406b8SStefano Zampini static PetscErrorCode PCHYPRESetDiscreteGradient_HYPRE(PC pc, Mat G) 13414cb006feSStefano Zampini { 13424cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 13435ac14e1cSStefano Zampini PetscBool ishypre; 13444cb006feSStefano Zampini PetscErrorCode ierr; 13454cb006feSStefano Zampini 13464cb006feSStefano Zampini PetscFunctionBegin; 13475ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)G,MATHYPRE,&ishypre);CHKERRQ(ierr); 13485ac14e1cSStefano Zampini if (ishypre) { 13495ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)G);CHKERRQ(ierr); 13505ac14e1cSStefano Zampini ierr = MatDestroy(&jac->G);CHKERRQ(ierr); 13515ac14e1cSStefano Zampini jac->G = G; 13525ac14e1cSStefano Zampini } else { 13536bf688a0SCe Qin ierr = MatDestroy(&jac->G);CHKERRQ(ierr); 13546bf688a0SCe Qin ierr = MatConvert(G,MATHYPRE,MAT_INITIAL_MATRIX,&jac->G);CHKERRQ(ierr); 13555ac14e1cSStefano Zampini } 13564cb006feSStefano Zampini PetscFunctionReturn(0); 13574cb006feSStefano Zampini } 13584cb006feSStefano Zampini 13594cb006feSStefano Zampini /*@ 13604cb006feSStefano Zampini PCHYPRESetDiscreteGradient - Set discrete gradient matrix 13614cb006feSStefano Zampini 13624cb006feSStefano Zampini Collective on PC 13634cb006feSStefano Zampini 13644cb006feSStefano Zampini Input Parameters: 13654cb006feSStefano Zampini + pc - the preconditioning context 13664cb006feSStefano Zampini - G - the discrete gradient 13674cb006feSStefano Zampini 13684cb006feSStefano Zampini Level: intermediate 13694cb006feSStefano Zampini 137095452b02SPatrick Sanan Notes: 137195452b02SPatrick Sanan G should have as many rows as the number of edges and as many columns as the number of vertices in the mesh 1372863406b8SStefano Zampini Each row of G has 2 nonzeros, with column indexes being the global indexes of edge's endpoints: matrix entries are +1 and -1 depending on edge orientation 13734cb006feSStefano Zampini 13744cb006feSStefano Zampini .seealso: 13754cb006feSStefano Zampini @*/ 13764cb006feSStefano Zampini PetscErrorCode PCHYPRESetDiscreteGradient(PC pc, Mat G) 13774cb006feSStefano Zampini { 13784cb006feSStefano Zampini PetscErrorCode ierr; 13794cb006feSStefano Zampini 13804cb006feSStefano Zampini PetscFunctionBegin; 13814cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 13824cb006feSStefano Zampini PetscValidHeaderSpecific(G,MAT_CLASSID,2); 13834cb006feSStefano Zampini PetscCheckSameComm(pc,1,G,2); 13844cb006feSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetDiscreteGradient_C",(PC,Mat),(pc,G));CHKERRQ(ierr); 13854cb006feSStefano Zampini PetscFunctionReturn(0); 13864cb006feSStefano Zampini } 13874cb006feSStefano Zampini 1388863406b8SStefano Zampini static PetscErrorCode PCHYPRESetDiscreteCurl_HYPRE(PC pc, Mat C) 1389863406b8SStefano Zampini { 1390863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 13915ac14e1cSStefano Zampini PetscBool ishypre; 1392863406b8SStefano Zampini PetscErrorCode ierr; 1393863406b8SStefano Zampini 1394863406b8SStefano Zampini PetscFunctionBegin; 13955ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)C,MATHYPRE,&ishypre);CHKERRQ(ierr); 13965ac14e1cSStefano Zampini if (ishypre) { 13975ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)C);CHKERRQ(ierr); 13985ac14e1cSStefano Zampini ierr = MatDestroy(&jac->C);CHKERRQ(ierr); 13995ac14e1cSStefano Zampini jac->C = C; 14005ac14e1cSStefano Zampini } else { 14016bf688a0SCe Qin ierr = MatDestroy(&jac->C);CHKERRQ(ierr); 14026bf688a0SCe Qin ierr = MatConvert(C,MATHYPRE,MAT_INITIAL_MATRIX,&jac->C);CHKERRQ(ierr); 14035ac14e1cSStefano Zampini } 1404863406b8SStefano Zampini PetscFunctionReturn(0); 1405863406b8SStefano Zampini } 1406863406b8SStefano Zampini 1407863406b8SStefano Zampini /*@ 1408863406b8SStefano Zampini PCHYPRESetDiscreteCurl - Set discrete curl matrix 1409863406b8SStefano Zampini 1410863406b8SStefano Zampini Collective on PC 1411863406b8SStefano Zampini 1412863406b8SStefano Zampini Input Parameters: 1413863406b8SStefano Zampini + pc - the preconditioning context 1414863406b8SStefano Zampini - C - the discrete curl 1415863406b8SStefano Zampini 1416863406b8SStefano Zampini Level: intermediate 1417863406b8SStefano Zampini 141895452b02SPatrick Sanan Notes: 141995452b02SPatrick Sanan C should have as many rows as the number of faces and as many columns as the number of edges in the mesh 1420863406b8SStefano Zampini Each row of G has as many nonzeros as the number of edges of a face, with column indexes being the global indexes of the corresponding edge: matrix entries are +1 and -1 depending on edge orientation with respect to the face orientation 1421863406b8SStefano Zampini 1422863406b8SStefano Zampini .seealso: 1423863406b8SStefano Zampini @*/ 1424863406b8SStefano Zampini PetscErrorCode PCHYPRESetDiscreteCurl(PC pc, Mat C) 1425863406b8SStefano Zampini { 1426863406b8SStefano Zampini PetscErrorCode ierr; 1427863406b8SStefano Zampini 1428863406b8SStefano Zampini PetscFunctionBegin; 1429863406b8SStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 1430863406b8SStefano Zampini PetscValidHeaderSpecific(C,MAT_CLASSID,2); 1431863406b8SStefano Zampini PetscCheckSameComm(pc,1,C,2); 1432863406b8SStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetDiscreteCurl_C",(PC,Mat),(pc,C));CHKERRQ(ierr); 1433863406b8SStefano Zampini PetscFunctionReturn(0); 1434863406b8SStefano Zampini } 1435863406b8SStefano Zampini 14366bf688a0SCe Qin static PetscErrorCode PCHYPRESetInterpolations_HYPRE(PC pc, PetscInt dim, Mat RT_PiFull, Mat RT_Pi[], Mat ND_PiFull, Mat ND_Pi[]) 14376bf688a0SCe Qin { 14386bf688a0SCe Qin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 14396bf688a0SCe Qin PetscBool ishypre; 14406bf688a0SCe Qin PetscErrorCode ierr; 14416bf688a0SCe Qin PetscInt i; 14426bf688a0SCe Qin PetscFunctionBegin; 14436bf688a0SCe Qin 14446bf688a0SCe Qin ierr = MatDestroy(&jac->RT_PiFull);CHKERRQ(ierr); 14456bf688a0SCe Qin ierr = MatDestroy(&jac->ND_PiFull);CHKERRQ(ierr); 14466bf688a0SCe Qin for (i=0;i<3;++i) { 14476bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[i]);CHKERRQ(ierr); 14486bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[i]);CHKERRQ(ierr); 14496bf688a0SCe Qin } 14506bf688a0SCe Qin 14516bf688a0SCe Qin jac->dim = dim; 14526bf688a0SCe Qin if (RT_PiFull) { 14536bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)RT_PiFull,MATHYPRE,&ishypre);CHKERRQ(ierr); 14546bf688a0SCe Qin if (ishypre) { 14556bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)RT_PiFull);CHKERRQ(ierr); 14566bf688a0SCe Qin jac->RT_PiFull = RT_PiFull; 14576bf688a0SCe Qin } else { 14586bf688a0SCe Qin ierr = MatConvert(RT_PiFull,MATHYPRE,MAT_INITIAL_MATRIX,&jac->RT_PiFull);CHKERRQ(ierr); 14596bf688a0SCe Qin } 14606bf688a0SCe Qin } 14616bf688a0SCe Qin if (RT_Pi) { 14626bf688a0SCe Qin for (i=0;i<dim;++i) { 14636bf688a0SCe Qin if (RT_Pi[i]) { 14646bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)RT_Pi[i],MATHYPRE,&ishypre);CHKERRQ(ierr); 14656bf688a0SCe Qin if (ishypre) { 14666bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)RT_Pi[i]);CHKERRQ(ierr); 14676bf688a0SCe Qin jac->RT_Pi[i] = RT_Pi[i]; 14686bf688a0SCe Qin } else { 14696bf688a0SCe Qin ierr = MatConvert(RT_Pi[i],MATHYPRE,MAT_INITIAL_MATRIX,&jac->RT_Pi[i]);CHKERRQ(ierr); 14706bf688a0SCe Qin } 14716bf688a0SCe Qin } 14726bf688a0SCe Qin } 14736bf688a0SCe Qin } 14746bf688a0SCe Qin if (ND_PiFull) { 14756bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)ND_PiFull,MATHYPRE,&ishypre);CHKERRQ(ierr); 14766bf688a0SCe Qin if (ishypre) { 14776bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)ND_PiFull);CHKERRQ(ierr); 14786bf688a0SCe Qin jac->ND_PiFull = ND_PiFull; 14796bf688a0SCe Qin } else { 14806bf688a0SCe Qin ierr = MatConvert(ND_PiFull,MATHYPRE,MAT_INITIAL_MATRIX,&jac->ND_PiFull);CHKERRQ(ierr); 14816bf688a0SCe Qin } 14826bf688a0SCe Qin } 14836bf688a0SCe Qin if (ND_Pi) { 14846bf688a0SCe Qin for (i=0;i<dim;++i) { 14856bf688a0SCe Qin if (ND_Pi[i]) { 14866bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)ND_Pi[i],MATHYPRE,&ishypre);CHKERRQ(ierr); 14876bf688a0SCe Qin if (ishypre) { 14886bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)ND_Pi[i]);CHKERRQ(ierr); 14896bf688a0SCe Qin jac->ND_Pi[i] = ND_Pi[i]; 14906bf688a0SCe Qin } else { 14916bf688a0SCe Qin ierr = MatConvert(ND_Pi[i],MATHYPRE,MAT_INITIAL_MATRIX,&jac->ND_Pi[i]);CHKERRQ(ierr); 14926bf688a0SCe Qin } 14936bf688a0SCe Qin } 14946bf688a0SCe Qin } 14956bf688a0SCe Qin } 14966bf688a0SCe Qin 14976bf688a0SCe Qin PetscFunctionReturn(0); 14986bf688a0SCe Qin } 14996bf688a0SCe Qin 15006bf688a0SCe Qin /*@ 15016bf688a0SCe Qin PCHYPRESetInterpolations - Set interpolation matrices for AMS/ADS preconditioner 15026bf688a0SCe Qin 15036bf688a0SCe Qin Collective on PC 15046bf688a0SCe Qin 15056bf688a0SCe Qin Input Parameters: 15066bf688a0SCe Qin + pc - the preconditioning context 15076bf688a0SCe Qin - dim - the dimension of the problem, only used in AMS 15086bf688a0SCe Qin - RT_PiFull - Raviart-Thomas interpolation matrix 15096bf688a0SCe Qin - RT_Pi - x/y/z component of Raviart-Thomas interpolation matrix 15106bf688a0SCe Qin - ND_PiFull - Nedelec interpolation matrix 15116bf688a0SCe Qin - ND_Pi - x/y/z component of Nedelec interpolation matrix 15126bf688a0SCe Qin 151395452b02SPatrick Sanan Notes: 151495452b02SPatrick Sanan For AMS, only Nedelec interpolation matrices are needed, the Raviart-Thomas interpolation matrices can be set to NULL. 15156bf688a0SCe Qin For ADS, both type of interpolation matrices are needed. 15166bf688a0SCe Qin Level: intermediate 15176bf688a0SCe Qin 15186bf688a0SCe Qin .seealso: 15196bf688a0SCe Qin @*/ 15206bf688a0SCe Qin PetscErrorCode PCHYPRESetInterpolations(PC pc, PetscInt dim, Mat RT_PiFull, Mat RT_Pi[], Mat ND_PiFull, Mat ND_Pi[]) 15216bf688a0SCe Qin { 15226bf688a0SCe Qin PetscErrorCode ierr; 15236bf688a0SCe Qin PetscInt i; 15246bf688a0SCe Qin 15256bf688a0SCe Qin PetscFunctionBegin; 15266bf688a0SCe Qin PetscValidHeaderSpecific(pc,PC_CLASSID,1); 15276bf688a0SCe Qin if (RT_PiFull) { 15286bf688a0SCe Qin PetscValidHeaderSpecific(RT_PiFull,MAT_CLASSID,3); 15296bf688a0SCe Qin PetscCheckSameComm(pc,1,RT_PiFull,3); 15306bf688a0SCe Qin } 15316bf688a0SCe Qin if (RT_Pi) { 15326bf688a0SCe Qin PetscValidPointer(RT_Pi,4); 15336bf688a0SCe Qin for (i=0;i<dim;++i) { 15346bf688a0SCe Qin if (RT_Pi[i]) { 15356bf688a0SCe Qin PetscValidHeaderSpecific(RT_Pi[i],MAT_CLASSID,4); 15366bf688a0SCe Qin PetscCheckSameComm(pc,1,RT_Pi[i],4); 15376bf688a0SCe Qin } 15386bf688a0SCe Qin } 15396bf688a0SCe Qin } 15406bf688a0SCe Qin if (ND_PiFull) { 15416bf688a0SCe Qin PetscValidHeaderSpecific(ND_PiFull,MAT_CLASSID,5); 15426bf688a0SCe Qin PetscCheckSameComm(pc,1,ND_PiFull,5); 15436bf688a0SCe Qin } 15446bf688a0SCe Qin if (ND_Pi) { 15456bf688a0SCe Qin PetscValidPointer(ND_Pi,6); 15466bf688a0SCe Qin for (i=0;i<dim;++i) { 15476bf688a0SCe Qin if (ND_Pi[i]) { 15486bf688a0SCe Qin PetscValidHeaderSpecific(ND_Pi[i],MAT_CLASSID,6); 15496bf688a0SCe Qin PetscCheckSameComm(pc,1,ND_Pi[i],6); 15506bf688a0SCe Qin } 15516bf688a0SCe Qin } 15526bf688a0SCe Qin } 15536bf688a0SCe Qin ierr = PetscTryMethod(pc,"PCHYPRESetInterpolations_C",(PC,PetscInt,Mat,Mat[],Mat,Mat[]),(pc,dim,RT_PiFull,RT_Pi,ND_PiFull,ND_Pi));CHKERRQ(ierr); 15546bf688a0SCe Qin PetscFunctionReturn(0); 15556bf688a0SCe Qin } 15566bf688a0SCe Qin 15575ac14e1cSStefano Zampini static PetscErrorCode PCHYPRESetPoissonMatrix_HYPRE(PC pc, Mat A, PetscBool isalpha) 15584cb006feSStefano Zampini { 15594cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 15605ac14e1cSStefano Zampini PetscBool ishypre; 15614cb006feSStefano Zampini PetscErrorCode ierr; 15624cb006feSStefano Zampini 15634cb006feSStefano Zampini PetscFunctionBegin; 15645ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)A,MATHYPRE,&ishypre);CHKERRQ(ierr); 15655ac14e1cSStefano Zampini if (ishypre) { 15665ac14e1cSStefano Zampini if (isalpha) { 15675ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 15685ac14e1cSStefano Zampini ierr = MatDestroy(&jac->alpha_Poisson);CHKERRQ(ierr); 15695ac14e1cSStefano Zampini jac->alpha_Poisson = A; 15705ac14e1cSStefano Zampini } else { 15715ac14e1cSStefano Zampini if (A) { 15725ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 15735ac14e1cSStefano Zampini } else { 15745ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_TRUE; 15755ac14e1cSStefano Zampini } 15765ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 15775ac14e1cSStefano Zampini jac->beta_Poisson = A; 15785ac14e1cSStefano Zampini } 15795ac14e1cSStefano Zampini } else { 15805ac14e1cSStefano Zampini if (isalpha) { 15816bf688a0SCe Qin ierr = MatDestroy(&jac->alpha_Poisson);CHKERRQ(ierr); 15826bf688a0SCe Qin ierr = MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&jac->alpha_Poisson);CHKERRQ(ierr); 15835ac14e1cSStefano Zampini } else { 15845ac14e1cSStefano Zampini if (A) { 15856bf688a0SCe Qin ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 15866bf688a0SCe Qin ierr = MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&jac->beta_Poisson);CHKERRQ(ierr); 15875ac14e1cSStefano Zampini } else { 15885ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 15895ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_TRUE; 15905ac14e1cSStefano Zampini } 15915ac14e1cSStefano Zampini } 15925ac14e1cSStefano Zampini } 15934cb006feSStefano Zampini PetscFunctionReturn(0); 15944cb006feSStefano Zampini } 15954cb006feSStefano Zampini 15964cb006feSStefano Zampini /*@ 15974cb006feSStefano Zampini PCHYPRESetAlphaPoissonMatrix - Set vector Poisson matrix 15984cb006feSStefano Zampini 15994cb006feSStefano Zampini Collective on PC 16004cb006feSStefano Zampini 16014cb006feSStefano Zampini Input Parameters: 16024cb006feSStefano Zampini + pc - the preconditioning context 16034cb006feSStefano Zampini - A - the matrix 16044cb006feSStefano Zampini 16054cb006feSStefano Zampini Level: intermediate 16064cb006feSStefano Zampini 160795452b02SPatrick Sanan Notes: 160895452b02SPatrick Sanan A should be obtained by discretizing the vector valued Poisson problem with linear finite elements 16094cb006feSStefano Zampini 16104cb006feSStefano Zampini .seealso: 16114cb006feSStefano Zampini @*/ 16124cb006feSStefano Zampini PetscErrorCode PCHYPRESetAlphaPoissonMatrix(PC pc, Mat A) 16134cb006feSStefano Zampini { 16144cb006feSStefano Zampini PetscErrorCode ierr; 16154cb006feSStefano Zampini 16164cb006feSStefano Zampini PetscFunctionBegin; 16174cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 16184cb006feSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,2); 16194cb006feSStefano Zampini PetscCheckSameComm(pc,1,A,2); 16205ac14e1cSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetPoissonMatrix_C",(PC,Mat,PetscBool),(pc,A,PETSC_TRUE));CHKERRQ(ierr); 16214cb006feSStefano Zampini PetscFunctionReturn(0); 16224cb006feSStefano Zampini } 16234cb006feSStefano Zampini 16244cb006feSStefano Zampini /*@ 16254cb006feSStefano Zampini PCHYPRESetBetaPoissonMatrix - Set Poisson matrix 16264cb006feSStefano Zampini 16274cb006feSStefano Zampini Collective on PC 16284cb006feSStefano Zampini 16294cb006feSStefano Zampini Input Parameters: 16304cb006feSStefano Zampini + pc - the preconditioning context 16314cb006feSStefano Zampini - A - the matrix 16324cb006feSStefano Zampini 16334cb006feSStefano Zampini Level: intermediate 16344cb006feSStefano Zampini 163595452b02SPatrick Sanan Notes: 163695452b02SPatrick Sanan A should be obtained by discretizing the Poisson problem with linear finite elements. 16374cb006feSStefano Zampini Following HYPRE convention, the scalar Poisson solver of AMS can be turned off by passing NULL. 16384cb006feSStefano Zampini 16394cb006feSStefano Zampini .seealso: 16404cb006feSStefano Zampini @*/ 16414cb006feSStefano Zampini PetscErrorCode PCHYPRESetBetaPoissonMatrix(PC pc, Mat A) 16424cb006feSStefano Zampini { 16434cb006feSStefano Zampini PetscErrorCode ierr; 16444cb006feSStefano Zampini 16454cb006feSStefano Zampini PetscFunctionBegin; 16464cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 16474cb006feSStefano Zampini if (A) { 16484cb006feSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,2); 16494cb006feSStefano Zampini PetscCheckSameComm(pc,1,A,2); 16504cb006feSStefano Zampini } 16515ac14e1cSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetPoissonMatrix_C",(PC,Mat,PetscBool),(pc,A,PETSC_FALSE));CHKERRQ(ierr); 16524cb006feSStefano Zampini PetscFunctionReturn(0); 16534cb006feSStefano Zampini } 16544cb006feSStefano Zampini 16555ac14e1cSStefano Zampini static PetscErrorCode PCHYPRESetEdgeConstantVectors_HYPRE(PC pc,Vec ozz, Vec zoz, Vec zzo) 16564cb006feSStefano Zampini { 16574cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 16584cb006feSStefano Zampini PetscErrorCode ierr; 16594cb006feSStefano Zampini 16604cb006feSStefano Zampini PetscFunctionBegin; 16614cb006feSStefano Zampini /* throw away any vector if already set */ 16626ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->constants[0]);CHKERRQ(ierr); 16636ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->constants[1]);CHKERRQ(ierr); 16646ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->constants[2]);CHKERRQ(ierr); 16656ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorCreate(ozz->map,&jac->constants[0]);CHKERRQ(ierr); 16664cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(ozz,jac->constants[0]);CHKERRQ(ierr); 16676ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorCreate(zoz->map,&jac->constants[1]);CHKERRQ(ierr); 16684cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(zoz,jac->constants[1]);CHKERRQ(ierr); 16695ac14e1cSStefano Zampini jac->dim = 2; 16704cb006feSStefano Zampini if (zzo) { 16716ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorCreate(zzo->map,&jac->constants[2]);CHKERRQ(ierr); 16724cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(zzo,jac->constants[2]);CHKERRQ(ierr); 16735ac14e1cSStefano Zampini jac->dim++; 16744cb006feSStefano Zampini } 16754cb006feSStefano Zampini PetscFunctionReturn(0); 16764cb006feSStefano Zampini } 16774cb006feSStefano Zampini 16784cb006feSStefano Zampini /*@ 16794cb006feSStefano Zampini PCHYPRESetEdgeConstantVectors - Set the representation of the constant vector fields in edge element basis 16804cb006feSStefano Zampini 16814cb006feSStefano Zampini Collective on PC 16824cb006feSStefano Zampini 16834cb006feSStefano Zampini Input Parameters: 16844cb006feSStefano Zampini + pc - the preconditioning context 16854cb006feSStefano Zampini - ozz - vector representing (1,0,0) (or (1,0) in 2D) 16864cb006feSStefano Zampini - zoz - vector representing (0,1,0) (or (0,1) in 2D) 16874cb006feSStefano Zampini - zzo - vector representing (0,0,1) (use NULL in 2D) 16884cb006feSStefano Zampini 16894cb006feSStefano Zampini Level: intermediate 16904cb006feSStefano Zampini 16914cb006feSStefano Zampini Notes: 16924cb006feSStefano Zampini 16934cb006feSStefano Zampini .seealso: 16944cb006feSStefano Zampini @*/ 16954cb006feSStefano Zampini PetscErrorCode PCHYPRESetEdgeConstantVectors(PC pc, Vec ozz, Vec zoz, Vec zzo) 16964cb006feSStefano Zampini { 16974cb006feSStefano Zampini PetscErrorCode ierr; 16984cb006feSStefano Zampini 16994cb006feSStefano Zampini PetscFunctionBegin; 17004cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 17014cb006feSStefano Zampini PetscValidHeaderSpecific(ozz,VEC_CLASSID,2); 17024cb006feSStefano Zampini PetscValidHeaderSpecific(zoz,VEC_CLASSID,3); 17034cb006feSStefano Zampini if (zzo) PetscValidHeaderSpecific(zzo,VEC_CLASSID,4); 17044cb006feSStefano Zampini PetscCheckSameComm(pc,1,ozz,2); 17054cb006feSStefano Zampini PetscCheckSameComm(pc,1,zoz,3); 17064cb006feSStefano Zampini if (zzo) PetscCheckSameComm(pc,1,zzo,4); 17074cb006feSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetEdgeConstantVectors_C",(PC,Vec,Vec,Vec),(pc,ozz,zoz,zzo));CHKERRQ(ierr); 17084cb006feSStefano Zampini PetscFunctionReturn(0); 17094cb006feSStefano Zampini } 17104cb006feSStefano Zampini 1711863406b8SStefano Zampini static PetscErrorCode PCSetCoordinates_HYPRE(PC pc, PetscInt dim, PetscInt nloc, PetscReal *coords) 17124cb006feSStefano Zampini { 17134cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 17144cb006feSStefano Zampini Vec tv; 17154cb006feSStefano Zampini PetscInt i; 17164cb006feSStefano Zampini PetscErrorCode ierr; 17174cb006feSStefano Zampini 17184cb006feSStefano Zampini PetscFunctionBegin; 17194cb006feSStefano Zampini /* throw away any coordinate vector if already set */ 17206ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->coords[0]);CHKERRQ(ierr); 17216ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->coords[1]);CHKERRQ(ierr); 17226ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorDestroy(&jac->coords[2]);CHKERRQ(ierr); 17235ac14e1cSStefano Zampini jac->dim = dim; 17245ac14e1cSStefano Zampini 17254cb006feSStefano Zampini /* compute IJ vector for coordinates */ 17264cb006feSStefano Zampini ierr = VecCreate(PetscObjectComm((PetscObject)pc),&tv);CHKERRQ(ierr); 17274cb006feSStefano Zampini ierr = VecSetType(tv,VECSTANDARD);CHKERRQ(ierr); 17284cb006feSStefano Zampini ierr = VecSetSizes(tv,nloc,PETSC_DECIDE);CHKERRQ(ierr); 17294cb006feSStefano Zampini for (i=0;i<dim;i++) { 17304cb006feSStefano Zampini PetscScalar *array; 17314cb006feSStefano Zampini PetscInt j; 17324cb006feSStefano Zampini 17336ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorCreate(tv->map,&jac->coords[i]);CHKERRQ(ierr); 1734589dcaf0SStefano Zampini ierr = VecGetArrayWrite(tv,&array);CHKERRQ(ierr); 17356ea7df73SStefano Zampini for (j=0;j<nloc;j++) array[j] = coords[j*dim+i]; 1736589dcaf0SStefano Zampini ierr = VecRestoreArrayWrite(tv,&array);CHKERRQ(ierr); 17376ea7df73SStefano Zampini ierr = VecHYPRE_IJVectorCopy(tv,jac->coords[i]);CHKERRQ(ierr); 17384cb006feSStefano Zampini } 17394cb006feSStefano Zampini ierr = VecDestroy(&tv);CHKERRQ(ierr); 17404cb006feSStefano Zampini PetscFunctionReturn(0); 17414cb006feSStefano Zampini } 17424cb006feSStefano Zampini 174316d9e3a6SLisandro Dalcin /* ---------------------------------------------------------------------------------*/ 174416d9e3a6SLisandro Dalcin 1745f7a08781SBarry Smith static PetscErrorCode PCHYPREGetType_HYPRE(PC pc,const char *name[]) 174616d9e3a6SLisandro Dalcin { 174716d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 174816d9e3a6SLisandro Dalcin 174916d9e3a6SLisandro Dalcin PetscFunctionBegin; 175016d9e3a6SLisandro Dalcin *name = jac->hypre_type; 175116d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 175216d9e3a6SLisandro Dalcin } 175316d9e3a6SLisandro Dalcin 1754f7a08781SBarry Smith static PetscErrorCode PCHYPRESetType_HYPRE(PC pc,const char name[]) 175516d9e3a6SLisandro Dalcin { 175616d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 175716d9e3a6SLisandro Dalcin PetscErrorCode ierr; 1758ace3abfcSBarry Smith PetscBool flag; 175916d9e3a6SLisandro Dalcin 176016d9e3a6SLisandro Dalcin PetscFunctionBegin; 176116d9e3a6SLisandro Dalcin if (jac->hypre_type) { 176216d9e3a6SLisandro Dalcin ierr = PetscStrcmp(jac->hypre_type,name,&flag);CHKERRQ(ierr); 1763ce94432eSBarry Smith if (!flag) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ORDER,"Cannot reset the HYPRE preconditioner type once it has been set"); 176416d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 176516d9e3a6SLisandro Dalcin } else { 176616d9e3a6SLisandro Dalcin ierr = PetscStrallocpy(name, &jac->hypre_type);CHKERRQ(ierr); 176716d9e3a6SLisandro Dalcin } 176816d9e3a6SLisandro Dalcin 176916d9e3a6SLisandro Dalcin jac->maxiter = PETSC_DEFAULT; 177016d9e3a6SLisandro Dalcin jac->tol = PETSC_DEFAULT; 177116d9e3a6SLisandro Dalcin jac->printstatistics = PetscLogPrintInfo; 177216d9e3a6SLisandro Dalcin 177316d9e3a6SLisandro Dalcin ierr = PetscStrcmp("pilut",jac->hypre_type,&flag);CHKERRQ(ierr); 177416d9e3a6SLisandro Dalcin if (flag) { 1775ffc4695bSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(jac->comm_hypre));CHKERRMPI(ierr); 1776fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParCSRPilutCreate,(jac->comm_hypre,&jac->hsolver)); 177716d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_Pilut; 177816d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_Pilut; 177916d9e3a6SLisandro Dalcin jac->destroy = HYPRE_ParCSRPilutDestroy; 178016d9e3a6SLisandro Dalcin jac->setup = HYPRE_ParCSRPilutSetup; 178116d9e3a6SLisandro Dalcin jac->solve = HYPRE_ParCSRPilutSolve; 178216d9e3a6SLisandro Dalcin jac->factorrowsize = PETSC_DEFAULT; 178316d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 178416d9e3a6SLisandro Dalcin } 1785db966c6cSHong Zhang ierr = PetscStrcmp("euclid",jac->hypre_type,&flag);CHKERRQ(ierr); 1786db966c6cSHong Zhang if (flag) { 17878bf83915SBarry Smith #if defined(PETSC_HAVE_64BIT_INDICES) 17888bf83915SBarry Smith SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"Hypre Euclid not support with 64 bit indices"); 17898bf83915SBarry Smith #endif 1790ffc4695bSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(jac->comm_hypre));CHKERRMPI(ierr); 1791db966c6cSHong Zhang PetscStackCallStandard(HYPRE_EuclidCreate,(jac->comm_hypre,&jac->hsolver)); 1792db966c6cSHong Zhang pc->ops->setfromoptions = PCSetFromOptions_HYPRE_Euclid; 1793db966c6cSHong Zhang pc->ops->view = PCView_HYPRE_Euclid; 1794db966c6cSHong Zhang jac->destroy = HYPRE_EuclidDestroy; 1795db966c6cSHong Zhang jac->setup = HYPRE_EuclidSetup; 1796db966c6cSHong Zhang jac->solve = HYPRE_EuclidSolve; 1797db966c6cSHong Zhang jac->factorrowsize = PETSC_DEFAULT; 1798db966c6cSHong Zhang jac->eu_level = PETSC_DEFAULT; /* default */ 1799db966c6cSHong Zhang PetscFunctionReturn(0); 1800db966c6cSHong Zhang } 180116d9e3a6SLisandro Dalcin ierr = PetscStrcmp("parasails",jac->hypre_type,&flag);CHKERRQ(ierr); 180216d9e3a6SLisandro Dalcin if (flag) { 1803ffc4695bSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(jac->comm_hypre));CHKERRMPI(ierr); 1804fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsCreate,(jac->comm_hypre,&jac->hsolver)); 180516d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_ParaSails; 180616d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_ParaSails; 180716d9e3a6SLisandro Dalcin jac->destroy = HYPRE_ParaSailsDestroy; 180816d9e3a6SLisandro Dalcin jac->setup = HYPRE_ParaSailsSetup; 180916d9e3a6SLisandro Dalcin jac->solve = HYPRE_ParaSailsSolve; 181016d9e3a6SLisandro Dalcin /* initialize */ 181116d9e3a6SLisandro Dalcin jac->nlevels = 1; 18128966356dSPierre Jolivet jac->threshold = .1; 181316d9e3a6SLisandro Dalcin jac->filter = .1; 181416d9e3a6SLisandro Dalcin jac->loadbal = 0; 18152fa5cd67SKarl Rupp if (PetscLogPrintInfo) jac->logging = (int) PETSC_TRUE; 18162fa5cd67SKarl Rupp else jac->logging = (int) PETSC_FALSE; 18172fa5cd67SKarl Rupp 181816d9e3a6SLisandro Dalcin jac->ruse = (int) PETSC_FALSE; 181916d9e3a6SLisandro Dalcin jac->symt = 0; 18208966356dSPierre Jolivet PetscStackCallStandard(HYPRE_ParaSailsSetParams,(jac->hsolver,jac->threshold,jac->nlevels)); 1821fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetFilter,(jac->hsolver,jac->filter)); 1822fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetLoadbal,(jac->hsolver,jac->loadbal)); 1823fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetLogging,(jac->hsolver,jac->logging)); 1824fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetReuse,(jac->hsolver,jac->ruse)); 1825fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetSym,(jac->hsolver,jac->symt)); 182616d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 182716d9e3a6SLisandro Dalcin } 182816d9e3a6SLisandro Dalcin ierr = PetscStrcmp("boomeramg",jac->hypre_type,&flag);CHKERRQ(ierr); 182916d9e3a6SLisandro Dalcin if (flag) { 183016d9e3a6SLisandro Dalcin ierr = HYPRE_BoomerAMGCreate(&jac->hsolver); 183116d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_BoomerAMG; 183216d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_BoomerAMG; 183316d9e3a6SLisandro Dalcin pc->ops->applytranspose = PCApplyTranspose_HYPRE_BoomerAMG; 183416d9e3a6SLisandro Dalcin pc->ops->applyrichardson = PCApplyRichardson_HYPRE_BoomerAMG; 1835fd2dd295SFande Kong ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetInterpolations_C",PCGetInterpolations_BoomerAMG);CHKERRQ(ierr); 1836fd2dd295SFande Kong ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetCoarseOperators_C",PCGetCoarseOperators_BoomerAMG);CHKERRQ(ierr); 183716d9e3a6SLisandro Dalcin jac->destroy = HYPRE_BoomerAMGDestroy; 183816d9e3a6SLisandro Dalcin jac->setup = HYPRE_BoomerAMGSetup; 183916d9e3a6SLisandro Dalcin jac->solve = HYPRE_BoomerAMGSolve; 184016d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_FALSE; 184116d9e3a6SLisandro Dalcin /* these defaults match the hypre defaults */ 184216d9e3a6SLisandro Dalcin jac->cycletype = 1; 184316d9e3a6SLisandro Dalcin jac->maxlevels = 25; 184416d9e3a6SLisandro Dalcin jac->maxiter = 1; 18458f87f92bSBarry Smith jac->tol = 0.0; /* tolerance of zero indicates use as preconditioner (suppresses convergence errors) */ 184616d9e3a6SLisandro Dalcin jac->truncfactor = 0.0; 184716d9e3a6SLisandro Dalcin jac->strongthreshold = .25; 184816d9e3a6SLisandro Dalcin jac->maxrowsum = .9; 184916d9e3a6SLisandro Dalcin jac->coarsentype = 6; 185016d9e3a6SLisandro Dalcin jac->measuretype = 0; 18510f1074feSSatish Balay jac->gridsweeps[0] = jac->gridsweeps[1] = jac->gridsweeps[2] = 1; 18526a251517SEike Mueller jac->smoothtype = -1; /* Not set by default */ 1853b9eb5777SEike Mueller jac->smoothnumlevels = 25; 18541810e44eSEike Mueller jac->eu_level = 0; 18551810e44eSEike Mueller jac->eu_droptolerance = 0; 18561810e44eSEike Mueller jac->eu_bj = 0; 1857589dcaf0SStefano Zampini jac->relaxtype[0] = jac->relaxtype[1] = 6; /* Defaults to SYMMETRIC since in PETSc we are using a PC - most likely with CG */ 18580f1074feSSatish Balay jac->relaxtype[2] = 9; /*G.E. */ 185916d9e3a6SLisandro Dalcin jac->relaxweight = 1.0; 186016d9e3a6SLisandro Dalcin jac->outerrelaxweight = 1.0; 186116d9e3a6SLisandro Dalcin jac->relaxorder = 1; 18620f1074feSSatish Balay jac->interptype = 0; 1863589dcaf0SStefano Zampini jac->Rtype = 0; 1864589dcaf0SStefano Zampini jac->Rstrongthreshold = 0.25; 1865589dcaf0SStefano Zampini jac->Rfilterthreshold = 0.0; 1866589dcaf0SStefano Zampini jac->Adroptype = -1; 1867589dcaf0SStefano Zampini jac->Adroptol = 0.0; 18680f1074feSSatish Balay jac->agg_nl = 0; 18696ea7df73SStefano Zampini jac->agg_interptype = 4; 18700f1074feSSatish Balay jac->pmax = 0; 18710f1074feSSatish Balay jac->truncfactor = 0.0; 18720f1074feSSatish Balay jac->agg_num_paths = 1; 1873589dcaf0SStefano Zampini jac->maxc = 9; 1874589dcaf0SStefano Zampini jac->minc = 1; 18758f87f92bSBarry Smith 187622e51d31SStefano Zampini jac->nodal_coarsening = 0; 187722e51d31SStefano Zampini jac->nodal_coarsening_diag = 0; 187822e51d31SStefano Zampini jac->vec_interp_variant = 0; 187922e51d31SStefano Zampini jac->vec_interp_qmax = 0; 188022e51d31SStefano Zampini jac->vec_interp_smooth = PETSC_FALSE; 188122e51d31SStefano Zampini jac->interp_refine = 0; 18828f87f92bSBarry Smith jac->nodal_relax = PETSC_FALSE; 18838f87f92bSBarry Smith jac->nodal_relax_levels = 1; 18846ea7df73SStefano Zampini jac->rap2 = 0; 18856ea7df73SStefano Zampini 18866ea7df73SStefano Zampini /* GPU defaults 18876ea7df73SStefano Zampini from https://hypre.readthedocs.io/en/latest/solvers-boomeramg.html#gpu-supported-options 18886ea7df73SStefano Zampini and /src/parcsr_ls/par_amg.c */ 18896ea7df73SStefano Zampini #if defined(PETSC_HAVE_HYPRE_DEVICE) 18906ea7df73SStefano Zampini jac->keeptranspose = PETSC_TRUE; 18916ea7df73SStefano Zampini jac->mod_rap2 = 1; 18926ea7df73SStefano Zampini jac->coarsentype = 8; 18936ea7df73SStefano Zampini jac->relaxorder = 0; 18946ea7df73SStefano Zampini jac->interptype = 6; 18956ea7df73SStefano Zampini jac->relaxtype[0] = 18; 18966ea7df73SStefano Zampini jac->relaxtype[1] = 18; 18976ea7df73SStefano Zampini jac->agg_interptype = 7; 18986ea7df73SStefano Zampini #else 18996ea7df73SStefano Zampini jac->keeptranspose = PETSC_FALSE; 19006ea7df73SStefano Zampini jac->mod_rap2 = 0; 19016ea7df73SStefano Zampini #endif 1902fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleType,(jac->hsolver,jac->cycletype)); 1903fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxLevels,(jac->hsolver,jac->maxlevels)); 1904fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 1905fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 1906fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTruncFactor,(jac->hsolver,jac->truncfactor)); 1907fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThreshold,(jac->hsolver,jac->strongthreshold)); 1908fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxRowSum,(jac->hsolver,jac->maxrowsum)); 1909fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCoarsenType,(jac->hsolver,jac->coarsentype)); 1910fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMeasureType,(jac->hsolver,jac->measuretype)); 1911fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxOrder,(jac->hsolver, jac->relaxorder)); 1912fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpType,(jac->hsolver,jac->interptype)); 1913fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetAggNumLevels,(jac->hsolver,jac->agg_nl)); 19146ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetAggInterpType,(jac->hsolver,jac->agg_interptype)); 1915fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetPMaxElmts,(jac->hsolver,jac->pmax)); 1916fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumPaths,(jac->hsolver,jac->agg_num_paths)); 1917fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxType,(jac->hsolver, jac->relaxtype[0])); /* defaults coarse to 9 */ 1918fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumSweeps,(jac->hsolver, jac->gridsweeps[0])); /* defaults coarse to 1 */ 1919589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetMaxCoarseSize,(jac->hsolver, jac->maxc)); 1920589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetMinCoarseSize,(jac->hsolver, jac->minc)); 1921589dcaf0SStefano Zampini 19226ea7df73SStefano Zampini /* GPU */ 19236ea7df73SStefano Zampini #if PETSC_PKG_HYPRE_VERSION_GE(2,18,0) 19246ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetKeepTranspose,(jac->hsolver,jac->keeptranspose ? 1 : 0)); 19256ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetRAP2,(jac->hsolver, jac->rap2)); 19266ea7df73SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetModuleRAP2,(jac->hsolver, jac->mod_rap2)); 19276ea7df73SStefano Zampini #endif 19286ea7df73SStefano Zampini 1929589dcaf0SStefano Zampini /* AIR */ 19306ea7df73SStefano Zampini #if PETSC_PKG_HYPRE_VERSION_GE(2,18,0) 1931589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetRestriction,(jac->hsolver,jac->Rtype)); 1932589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThresholdR,(jac->hsolver,jac->Rstrongthreshold)); 1933589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetFilterThresholdR,(jac->hsolver,jac->Rfilterthreshold)); 1934589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetADropTol,(jac->hsolver,jac->Adroptol)); 1935589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetADropType,(jac->hsolver,jac->Adroptype)); 19366ea7df73SStefano Zampini #endif 193716d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 193816d9e3a6SLisandro Dalcin } 19394cb006feSStefano Zampini ierr = PetscStrcmp("ams",jac->hypre_type,&flag);CHKERRQ(ierr); 19404cb006feSStefano Zampini if (flag) { 19414cb006feSStefano Zampini ierr = HYPRE_AMSCreate(&jac->hsolver); 19424cb006feSStefano Zampini pc->ops->setfromoptions = PCSetFromOptions_HYPRE_AMS; 19434cb006feSStefano Zampini pc->ops->view = PCView_HYPRE_AMS; 19444cb006feSStefano Zampini jac->destroy = HYPRE_AMSDestroy; 19454cb006feSStefano Zampini jac->setup = HYPRE_AMSSetup; 19464cb006feSStefano Zampini jac->solve = HYPRE_AMSSolve; 19474cb006feSStefano Zampini jac->coords[0] = NULL; 19484cb006feSStefano Zampini jac->coords[1] = NULL; 19494cb006feSStefano Zampini jac->coords[2] = NULL; 19504cb006feSStefano Zampini /* solver parameters: these are borrowed from mfem package, and they are not the default values from HYPRE AMS */ 1951863406b8SStefano Zampini jac->as_print = 0; 1952863406b8SStefano Zampini jac->as_max_iter = 1; /* used as a preconditioner */ 1953863406b8SStefano Zampini jac->as_tol = 0.; /* used as a preconditioner */ 19544cb006feSStefano Zampini jac->ams_cycle_type = 13; 19554cb006feSStefano Zampini /* Smoothing options */ 1956863406b8SStefano Zampini jac->as_relax_type = 2; 1957863406b8SStefano Zampini jac->as_relax_times = 1; 1958863406b8SStefano Zampini jac->as_relax_weight = 1.0; 1959863406b8SStefano Zampini jac->as_omega = 1.0; 19604cb006feSStefano Zampini /* Vector valued Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1961863406b8SStefano Zampini jac->as_amg_alpha_opts[0] = 10; 1962863406b8SStefano Zampini jac->as_amg_alpha_opts[1] = 1; 19630bdd8552SBarry Smith jac->as_amg_alpha_opts[2] = 6; 1964863406b8SStefano Zampini jac->as_amg_alpha_opts[3] = 6; 1965863406b8SStefano Zampini jac->as_amg_alpha_opts[4] = 4; 1966863406b8SStefano Zampini jac->as_amg_alpha_theta = 0.25; 19674cb006feSStefano Zampini /* Scalar Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1968863406b8SStefano Zampini jac->as_amg_beta_opts[0] = 10; 1969863406b8SStefano Zampini jac->as_amg_beta_opts[1] = 1; 19700bdd8552SBarry Smith jac->as_amg_beta_opts[2] = 6; 1971863406b8SStefano Zampini jac->as_amg_beta_opts[3] = 6; 1972863406b8SStefano Zampini jac->as_amg_beta_opts[4] = 4; 1973863406b8SStefano Zampini jac->as_amg_beta_theta = 0.25; 1974863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetPrintLevel,(jac->hsolver,jac->as_print)); 1975863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 19764cb006feSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 1977863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetTol,(jac->hsolver,jac->as_tol)); 1978863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1979863406b8SStefano Zampini jac->as_relax_times, 1980863406b8SStefano Zampini jac->as_relax_weight, 1981863406b8SStefano Zampini jac->as_omega)); 1982863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaAMGOptions,(jac->hsolver,jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1983863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1984863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1985863406b8SStefano Zampini jac->as_amg_alpha_theta, 1986863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1987863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 1988863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1989863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1990863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1991863406b8SStefano Zampini jac->as_amg_beta_theta, 1992863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1993863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 199423df4f25SStefano Zampini /* Zero conductivity */ 199523df4f25SStefano Zampini jac->ams_beta_is_zero = PETSC_FALSE; 199623df4f25SStefano Zampini jac->ams_beta_is_zero_part = PETSC_FALSE; 19974cb006feSStefano Zampini PetscFunctionReturn(0); 19984cb006feSStefano Zampini } 1999863406b8SStefano Zampini ierr = PetscStrcmp("ads",jac->hypre_type,&flag);CHKERRQ(ierr); 2000863406b8SStefano Zampini if (flag) { 2001863406b8SStefano Zampini ierr = HYPRE_ADSCreate(&jac->hsolver); 2002863406b8SStefano Zampini pc->ops->setfromoptions = PCSetFromOptions_HYPRE_ADS; 2003863406b8SStefano Zampini pc->ops->view = PCView_HYPRE_ADS; 2004863406b8SStefano Zampini jac->destroy = HYPRE_ADSDestroy; 2005863406b8SStefano Zampini jac->setup = HYPRE_ADSSetup; 2006863406b8SStefano Zampini jac->solve = HYPRE_ADSSolve; 2007863406b8SStefano Zampini jac->coords[0] = NULL; 2008863406b8SStefano Zampini jac->coords[1] = NULL; 2009863406b8SStefano Zampini jac->coords[2] = NULL; 2010863406b8SStefano Zampini /* solver parameters: these are borrowed from mfem package, and they are not the default values from HYPRE ADS */ 2011863406b8SStefano Zampini jac->as_print = 0; 2012863406b8SStefano Zampini jac->as_max_iter = 1; /* used as a preconditioner */ 2013863406b8SStefano Zampini jac->as_tol = 0.; /* used as a preconditioner */ 2014863406b8SStefano Zampini jac->ads_cycle_type = 13; 2015863406b8SStefano Zampini /* Smoothing options */ 2016863406b8SStefano Zampini jac->as_relax_type = 2; 2017863406b8SStefano Zampini jac->as_relax_times = 1; 2018863406b8SStefano Zampini jac->as_relax_weight = 1.0; 2019863406b8SStefano Zampini jac->as_omega = 1.0; 2020863406b8SStefano Zampini /* AMS solver parameters: cycle_type, coarsen type, agg_levels, relax_type, interp_type, Pmax */ 2021863406b8SStefano Zampini jac->ams_cycle_type = 14; 2022863406b8SStefano Zampini jac->as_amg_alpha_opts[0] = 10; 2023863406b8SStefano Zampini jac->as_amg_alpha_opts[1] = 1; 2024863406b8SStefano Zampini jac->as_amg_alpha_opts[2] = 6; 2025863406b8SStefano Zampini jac->as_amg_alpha_opts[3] = 6; 2026863406b8SStefano Zampini jac->as_amg_alpha_opts[4] = 4; 2027863406b8SStefano Zampini jac->as_amg_alpha_theta = 0.25; 2028863406b8SStefano Zampini /* Vector Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 2029863406b8SStefano Zampini jac->as_amg_beta_opts[0] = 10; 2030863406b8SStefano Zampini jac->as_amg_beta_opts[1] = 1; 2031863406b8SStefano Zampini jac->as_amg_beta_opts[2] = 6; 2032863406b8SStefano Zampini jac->as_amg_beta_opts[3] = 6; 2033863406b8SStefano Zampini jac->as_amg_beta_opts[4] = 4; 2034863406b8SStefano Zampini jac->as_amg_beta_theta = 0.25; 2035863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetPrintLevel,(jac->hsolver,jac->as_print)); 2036863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 2037863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 2038863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetTol,(jac->hsolver,jac->as_tol)); 2039863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 2040863406b8SStefano Zampini jac->as_relax_times, 2041863406b8SStefano Zampini jac->as_relax_weight, 2042863406b8SStefano Zampini jac->as_omega)); 2043863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMSOptions,(jac->hsolver,jac->ams_cycle_type, /* AMG coarsen type */ 2044863406b8SStefano Zampini jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 2045863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 2046863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 2047863406b8SStefano Zampini jac->as_amg_alpha_theta, 2048863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 2049863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 2050863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 2051863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 2052863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 2053863406b8SStefano Zampini jac->as_amg_beta_theta, 2054863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 2055863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 2056863406b8SStefano Zampini PetscFunctionReturn(0); 2057863406b8SStefano Zampini } 2058503cfb0cSBarry Smith ierr = PetscFree(jac->hypre_type);CHKERRQ(ierr); 20592fa5cd67SKarl Rupp 20600298fd71SBarry Smith jac->hypre_type = NULL; 2061db966c6cSHong Zhang SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown HYPRE preconditioner %s; Choices are euclid, pilut, parasails, boomeramg, ams",name); 206216d9e3a6SLisandro Dalcin } 206316d9e3a6SLisandro Dalcin 206416d9e3a6SLisandro Dalcin /* 206516d9e3a6SLisandro Dalcin It only gets here if the HYPRE type has not been set before the call to 206616d9e3a6SLisandro Dalcin ...SetFromOptions() which actually is most of the time 206716d9e3a6SLisandro Dalcin */ 2068360ee056SFande Kong PetscErrorCode PCSetFromOptions_HYPRE(PetscOptionItems *PetscOptionsObject,PC pc) 206916d9e3a6SLisandro Dalcin { 207016d9e3a6SLisandro Dalcin PetscErrorCode ierr; 20714ddd07fcSJed Brown PetscInt indx; 2072db966c6cSHong Zhang const char *type[] = {"euclid","pilut","parasails","boomeramg","ams","ads"}; 2073ace3abfcSBarry Smith PetscBool flg; 207416d9e3a6SLisandro Dalcin 207516d9e3a6SLisandro Dalcin PetscFunctionBegin; 20769fa463a7SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE preconditioner options");CHKERRQ(ierr); 2077cab5ea25SPierre Jolivet ierr = PetscOptionsEList("-pc_hypre_type","HYPRE preconditioner type","PCHYPRESetType",type,ALEN(type),"boomeramg",&indx,&flg);CHKERRQ(ierr); 207816d9e3a6SLisandro Dalcin if (flg) { 207916d9e3a6SLisandro Dalcin ierr = PCHYPRESetType_HYPRE(pc,type[indx]);CHKERRQ(ierr); 208002a17cd4SBarry Smith } else { 208102a17cd4SBarry Smith ierr = PCHYPRESetType_HYPRE(pc,"boomeramg");CHKERRQ(ierr); 208216d9e3a6SLisandro Dalcin } 208316d9e3a6SLisandro Dalcin if (pc->ops->setfromoptions) { 20843931853cSBarry Smith ierr = pc->ops->setfromoptions(PetscOptionsObject,pc);CHKERRQ(ierr); 208516d9e3a6SLisandro Dalcin } 208616d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 208716d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 208816d9e3a6SLisandro Dalcin } 208916d9e3a6SLisandro Dalcin 209016d9e3a6SLisandro Dalcin /*@C 209116d9e3a6SLisandro Dalcin PCHYPRESetType - Sets which hypre preconditioner you wish to use 209216d9e3a6SLisandro Dalcin 209316d9e3a6SLisandro Dalcin Input Parameters: 209416d9e3a6SLisandro Dalcin + pc - the preconditioner context 2095db966c6cSHong Zhang - name - either euclid, pilut, parasails, boomeramg, ams, ads 209616d9e3a6SLisandro Dalcin 209716d9e3a6SLisandro Dalcin Options Database Keys: 2098db966c6cSHong Zhang -pc_hypre_type - One of euclid, pilut, parasails, boomeramg, ams, ads 209916d9e3a6SLisandro Dalcin 210016d9e3a6SLisandro Dalcin Level: intermediate 210116d9e3a6SLisandro Dalcin 210216d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 210316d9e3a6SLisandro Dalcin PCHYPRE 210416d9e3a6SLisandro Dalcin 210516d9e3a6SLisandro Dalcin @*/ 21067087cfbeSBarry Smith PetscErrorCode PCHYPRESetType(PC pc,const char name[]) 210716d9e3a6SLisandro Dalcin { 21084ac538c5SBarry Smith PetscErrorCode ierr; 210916d9e3a6SLisandro Dalcin 211016d9e3a6SLisandro Dalcin PetscFunctionBegin; 21110700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 211216d9e3a6SLisandro Dalcin PetscValidCharPointer(name,2); 21134ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCHYPRESetType_C",(PC,const char[]),(pc,name));CHKERRQ(ierr); 211416d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 211516d9e3a6SLisandro Dalcin } 211616d9e3a6SLisandro Dalcin 211716d9e3a6SLisandro Dalcin /*@C 211816d9e3a6SLisandro Dalcin PCHYPREGetType - Gets which hypre preconditioner you are using 211916d9e3a6SLisandro Dalcin 212016d9e3a6SLisandro Dalcin Input Parameter: 212116d9e3a6SLisandro Dalcin . pc - the preconditioner context 212216d9e3a6SLisandro Dalcin 212316d9e3a6SLisandro Dalcin Output Parameter: 2124db966c6cSHong Zhang . name - either euclid, pilut, parasails, boomeramg, ams, ads 212516d9e3a6SLisandro Dalcin 212616d9e3a6SLisandro Dalcin Level: intermediate 212716d9e3a6SLisandro Dalcin 212816d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCHYPRESetType(), PCType (for list of available types), PC, 212916d9e3a6SLisandro Dalcin PCHYPRE 213016d9e3a6SLisandro Dalcin 213116d9e3a6SLisandro Dalcin @*/ 21327087cfbeSBarry Smith PetscErrorCode PCHYPREGetType(PC pc,const char *name[]) 213316d9e3a6SLisandro Dalcin { 21344ac538c5SBarry Smith PetscErrorCode ierr; 213516d9e3a6SLisandro Dalcin 213616d9e3a6SLisandro Dalcin PetscFunctionBegin; 21370700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 213816d9e3a6SLisandro Dalcin PetscValidPointer(name,2); 21394ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCHYPREGetType_C",(PC,const char*[]),(pc,name));CHKERRQ(ierr); 214016d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 214116d9e3a6SLisandro Dalcin } 214216d9e3a6SLisandro Dalcin 214316d9e3a6SLisandro Dalcin /*MC 214416d9e3a6SLisandro Dalcin PCHYPRE - Allows you to use the matrix element based preconditioners in the LLNL package hypre 214516d9e3a6SLisandro Dalcin 214616d9e3a6SLisandro Dalcin Options Database Keys: 2147db966c6cSHong Zhang + -pc_hypre_type - One of euclid, pilut, parasails, boomeramg, ams, ads 214816d9e3a6SLisandro Dalcin - Too many others to list, run with -pc_type hypre -pc_hypre_type XXX -help to see options for the XXX 214916d9e3a6SLisandro Dalcin preconditioner 215016d9e3a6SLisandro Dalcin 215116d9e3a6SLisandro Dalcin Level: intermediate 215216d9e3a6SLisandro Dalcin 215395452b02SPatrick Sanan Notes: 215495452b02SPatrick Sanan Apart from pc_hypre_type (for which there is PCHYPRESetType()), 215516d9e3a6SLisandro Dalcin the many hypre options can ONLY be set via the options database (e.g. the command line 215616d9e3a6SLisandro Dalcin or with PetscOptionsSetValue(), there are no functions to set them) 215716d9e3a6SLisandro Dalcin 2158c231f9e3SBarryFSmith The options -pc_hypre_boomeramg_max_iter and -pc_hypre_boomeramg_tol refer to the number of iterations 21590f1074feSSatish Balay (V-cycles) and tolerance that boomeramg does EACH time it is called. So for example, if 21600f1074feSSatish Balay -pc_hypre_boomeramg_max_iter is set to 2 then 2-V-cycles are being used to define the preconditioner 2161c231f9e3SBarryFSmith (-pc_hypre_boomeramg_tol should be set to 0.0 - the default - to strictly use a fixed number of 21628f87f92bSBarry Smith iterations per hypre call). -ksp_max_it and -ksp_rtol STILL determine the total number of iterations 21630f1074feSSatish Balay and tolerance for the Krylov solver. For example, if -pc_hypre_boomeramg_max_iter is 2 and -ksp_max_it is 10 21640f1074feSSatish Balay then AT MOST twenty V-cycles of boomeramg will be called. 216516d9e3a6SLisandro Dalcin 21660f1074feSSatish Balay Note that the option -pc_hypre_boomeramg_relax_type_all defaults to symmetric relaxation 21670f1074feSSatish Balay (symmetric-SOR/Jacobi), which is required for Krylov solvers like CG that expect symmetry. 21680f1074feSSatish Balay Otherwise, you may want to use -pc_hypre_boomeramg_relax_type_all SOR/Jacobi. 216916d9e3a6SLisandro Dalcin If you wish to use BoomerAMG WITHOUT a Krylov method use -ksp_type richardson NOT -ksp_type preonly 217016d9e3a6SLisandro Dalcin and use -ksp_max_it to control the number of V-cycles. 217116d9e3a6SLisandro Dalcin (see the PETSc FAQ.html at the PETSc website under the Documentation tab). 217216d9e3a6SLisandro Dalcin 217316d9e3a6SLisandro Dalcin 2007-02-03 Using HYPRE-1.11.1b, the routine HYPRE_BoomerAMGSolveT and the option 217416d9e3a6SLisandro Dalcin -pc_hypre_parasails_reuse were failing with SIGSEGV. Dalcin L. 217516d9e3a6SLisandro Dalcin 21765272c319SBarry Smith MatSetNearNullSpace() - if you provide a near null space to your matrix it is ignored by hypre UNLESS you also use 2177fdd15c9aSJunchao Zhang the following two options: 21780b1a5bd9SEric Chamberland 2179fdd15c9aSJunchao Zhang Options Database Keys: 21805272c319SBarry Smith + -pc_hypre_boomeramg_nodal_coarsen <n> - where n is from 1 to 6 (see HYPRE_BOOMERAMGSetNodal()) 2181fdd15c9aSJunchao Zhang - -pc_hypre_boomeramg_vec_interp_variant <v> - where v is from 1 to 3 (see HYPRE_BoomerAMGSetInterpVecVariant()) 21825272c319SBarry Smith 21835272c319SBarry Smith Depending on the linear system you may see the same or different convergence depending on the values you use. 21845272c319SBarry Smith 21859e5bc791SBarry Smith See PCPFMG for access to the hypre Struct PFMG solver 21869e5bc791SBarry Smith 218716d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 21889e5bc791SBarry Smith PCHYPRESetType(), PCPFMG 218916d9e3a6SLisandro Dalcin 219016d9e3a6SLisandro Dalcin M*/ 219116d9e3a6SLisandro Dalcin 21928cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_HYPRE(PC pc) 219316d9e3a6SLisandro Dalcin { 219416d9e3a6SLisandro Dalcin PC_HYPRE *jac; 219516d9e3a6SLisandro Dalcin PetscErrorCode ierr; 219616d9e3a6SLisandro Dalcin 219716d9e3a6SLisandro Dalcin PetscFunctionBegin; 2198b00a9115SJed Brown ierr = PetscNewLog(pc,&jac);CHKERRQ(ierr); 21992fa5cd67SKarl Rupp 220016d9e3a6SLisandro Dalcin pc->data = jac; 22018695de01SBarry Smith pc->ops->reset = PCReset_HYPRE; 220216d9e3a6SLisandro Dalcin pc->ops->destroy = PCDestroy_HYPRE; 220316d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE; 220416d9e3a6SLisandro Dalcin pc->ops->setup = PCSetUp_HYPRE; 220516d9e3a6SLisandro Dalcin pc->ops->apply = PCApply_HYPRE; 220616d9e3a6SLisandro Dalcin jac->comm_hypre = MPI_COMM_NULL; 2207bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetType_C",PCHYPRESetType_HYPRE);CHKERRQ(ierr); 2208bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPREGetType_C",PCHYPREGetType_HYPRE);CHKERRQ(ierr); 22095ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCSetCoordinates_C",PCSetCoordinates_HYPRE);CHKERRQ(ierr); 22105ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteGradient_C",PCHYPRESetDiscreteGradient_HYPRE);CHKERRQ(ierr); 22115ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteCurl_C",PCHYPRESetDiscreteCurl_HYPRE);CHKERRQ(ierr); 22126bf688a0SCe Qin ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetInterpolations_C",PCHYPRESetInterpolations_HYPRE);CHKERRQ(ierr); 22135ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetEdgeConstantVectors_C",PCHYPRESetEdgeConstantVectors_HYPRE);CHKERRQ(ierr); 22145ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetPoissonMatrix_C",PCHYPRESetPoissonMatrix_HYPRE);CHKERRQ(ierr); 22156ea7df73SStefano Zampini #if defined(PETSC_HAVE_HYPRE_DEVICE) 22166ea7df73SStefano Zampini #if defined(HYPRE_USING_HIP) 22176ea7df73SStefano Zampini ierr = PetscHIPInitializeCheck();CHKERRQ(ierr); 22186ea7df73SStefano Zampini #endif 22196ea7df73SStefano Zampini #if defined(HYPRE_USING_CUDA) 22206ea7df73SStefano Zampini ierr = PetscCUDAInitializeCheck();CHKERRQ(ierr); 22216ea7df73SStefano Zampini #endif 22226ea7df73SStefano Zampini #endif 222316d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 222416d9e3a6SLisandro Dalcin } 2225ebc551c0SBarry Smith 2226f91d8e95SBarry Smith /* ---------------------------------------------------------------------------------------------------------------------------------*/ 2227f91d8e95SBarry Smith 2228ebc551c0SBarry Smith typedef struct { 222968326731SBarry Smith MPI_Comm hcomm; /* does not share comm with HYPRE_StructMatrix because need to create solver before getting matrix */ 2230f91d8e95SBarry Smith HYPRE_StructSolver hsolver; 22319e5bc791SBarry Smith 22329e5bc791SBarry Smith /* keep copy of PFMG options used so may view them */ 22334ddd07fcSJed Brown PetscInt its; 22349e5bc791SBarry Smith double tol; 22354ddd07fcSJed Brown PetscInt relax_type; 22364ddd07fcSJed Brown PetscInt rap_type; 22374ddd07fcSJed Brown PetscInt num_pre_relax,num_post_relax; 22384ddd07fcSJed Brown PetscInt max_levels; 2239ebc551c0SBarry Smith } PC_PFMG; 2240ebc551c0SBarry Smith 2241ebc551c0SBarry Smith PetscErrorCode PCDestroy_PFMG(PC pc) 2242ebc551c0SBarry Smith { 2243ebc551c0SBarry Smith PetscErrorCode ierr; 2244f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2245ebc551c0SBarry Smith 2246ebc551c0SBarry Smith PetscFunctionBegin; 22472fa5cd67SKarl Rupp if (ex->hsolver) PetscStackCallStandard(HYPRE_StructPFMGDestroy,(ex->hsolver)); 2248ffc4695bSBarry Smith ierr = MPI_Comm_free(&ex->hcomm);CHKERRMPI(ierr); 2249c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 2250ebc551c0SBarry Smith PetscFunctionReturn(0); 2251ebc551c0SBarry Smith } 2252ebc551c0SBarry Smith 22539e5bc791SBarry Smith static const char *PFMGRelaxType[] = {"Jacobi","Weighted-Jacobi","symmetric-Red/Black-Gauss-Seidel","Red/Black-Gauss-Seidel"}; 22549e5bc791SBarry Smith static const char *PFMGRAPType[] = {"Galerkin","non-Galerkin"}; 22559e5bc791SBarry Smith 2256ebc551c0SBarry Smith PetscErrorCode PCView_PFMG(PC pc,PetscViewer viewer) 2257ebc551c0SBarry Smith { 2258ebc551c0SBarry Smith PetscErrorCode ierr; 2259ace3abfcSBarry Smith PetscBool iascii; 2260f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2261ebc551c0SBarry Smith 2262ebc551c0SBarry Smith PetscFunctionBegin; 2263251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 22649e5bc791SBarry Smith if (iascii) { 22659e5bc791SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE PFMG preconditioning\n");CHKERRQ(ierr); 2266efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max iterations %d\n",ex->its);CHKERRQ(ierr); 2267efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerance %g\n",ex->tol);CHKERRQ(ierr); 2268efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relax type %s\n",PFMGRelaxType[ex->relax_type]);CHKERRQ(ierr); 2269efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RAP type %s\n",PFMGRAPType[ex->rap_type]);CHKERRQ(ierr); 2270efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number pre-relax %d post-relax %d\n",ex->num_pre_relax,ex->num_post_relax);CHKERRQ(ierr); 2271efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max levels %d\n",ex->max_levels);CHKERRQ(ierr); 22729e5bc791SBarry Smith } 2273ebc551c0SBarry Smith PetscFunctionReturn(0); 2274ebc551c0SBarry Smith } 2275ebc551c0SBarry Smith 22764416b707SBarry Smith PetscErrorCode PCSetFromOptions_PFMG(PetscOptionItems *PetscOptionsObject,PC pc) 2277ebc551c0SBarry Smith { 2278ebc551c0SBarry Smith PetscErrorCode ierr; 2279f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2280ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE; 2281ebc551c0SBarry Smith 2282ebc551c0SBarry Smith PetscFunctionBegin; 2283e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"PFMG options");CHKERRQ(ierr); 22840298fd71SBarry Smith ierr = PetscOptionsBool("-pc_pfmg_print_statistics","Print statistics","HYPRE_StructPFMGSetPrintLevel",flg,&flg,NULL);CHKERRQ(ierr); 228568326731SBarry Smith if (flg) { 22865bd1e576SStefano Zampini PetscStackCallStandard(HYPRE_StructPFMGSetPrintLevel,(ex->hsolver,3)); 228768326731SBarry Smith } 22880298fd71SBarry Smith ierr = PetscOptionsInt("-pc_pfmg_its","Number of iterations of PFMG to use as preconditioner","HYPRE_StructPFMGSetMaxIter",ex->its,&ex->its,NULL);CHKERRQ(ierr); 2289fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(ex->hsolver,ex->its)); 22900298fd71SBarry Smith ierr = PetscOptionsInt("-pc_pfmg_num_pre_relax","Number of smoothing steps before coarse grid","HYPRE_StructPFMGSetNumPreRelax",ex->num_pre_relax,&ex->num_pre_relax,NULL);CHKERRQ(ierr); 2291fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetNumPreRelax,(ex->hsolver,ex->num_pre_relax)); 22920298fd71SBarry Smith ierr = PetscOptionsInt("-pc_pfmg_num_post_relax","Number of smoothing steps after coarse grid","HYPRE_StructPFMGSetNumPostRelax",ex->num_post_relax,&ex->num_post_relax,NULL);CHKERRQ(ierr); 2293fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetNumPostRelax,(ex->hsolver,ex->num_post_relax)); 22949e5bc791SBarry Smith 22950298fd71SBarry Smith ierr = PetscOptionsInt("-pc_pfmg_max_levels","Max Levels for MG hierarchy","HYPRE_StructPFMGSetMaxLevels",ex->max_levels,&ex->max_levels,NULL);CHKERRQ(ierr); 2296fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxLevels,(ex->hsolver,ex->max_levels)); 22973b46a515SGlenn Hammond 22980298fd71SBarry Smith ierr = PetscOptionsReal("-pc_pfmg_tol","Tolerance of PFMG","HYPRE_StructPFMGSetTol",ex->tol,&ex->tol,NULL);CHKERRQ(ierr); 2299fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(ex->hsolver,ex->tol)); 23000298fd71SBarry Smith ierr = PetscOptionsEList("-pc_pfmg_relax_type","Relax type for the up and down cycles","HYPRE_StructPFMGSetRelaxType",PFMGRelaxType,ALEN(PFMGRelaxType),PFMGRelaxType[ex->relax_type],&ex->relax_type,NULL);CHKERRQ(ierr); 2301fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetRelaxType,(ex->hsolver, ex->relax_type)); 23020298fd71SBarry Smith ierr = PetscOptionsEList("-pc_pfmg_rap_type","RAP type","HYPRE_StructPFMGSetRAPType",PFMGRAPType,ALEN(PFMGRAPType),PFMGRAPType[ex->rap_type],&ex->rap_type,NULL);CHKERRQ(ierr); 2303fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetRAPType,(ex->hsolver, ex->rap_type)); 2304ebc551c0SBarry Smith ierr = PetscOptionsTail();CHKERRQ(ierr); 2305ebc551c0SBarry Smith PetscFunctionReturn(0); 2306ebc551c0SBarry Smith } 2307ebc551c0SBarry Smith 2308f91d8e95SBarry Smith PetscErrorCode PCApply_PFMG(PC pc,Vec x,Vec y) 2309f91d8e95SBarry Smith { 2310f91d8e95SBarry Smith PetscErrorCode ierr; 2311f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2312d9ca1df4SBarry Smith PetscScalar *yy; 2313d9ca1df4SBarry Smith const PetscScalar *xx; 23144ddd07fcSJed Brown PetscInt ilower[3],iupper[3]; 23152cf14000SStefano Zampini HYPRE_Int hlower[3],hupper[3]; 231668326731SBarry Smith Mat_HYPREStruct *mx = (Mat_HYPREStruct*)(pc->pmat->data); 2317f91d8e95SBarry Smith 2318f91d8e95SBarry Smith PetscFunctionBegin; 2319dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2320aa219208SBarry Smith ierr = DMDAGetCorners(mx->da,&ilower[0],&ilower[1],&ilower[2],&iupper[0],&iupper[1],&iupper[2]);CHKERRQ(ierr); 23212cf14000SStefano Zampini /* when HYPRE_MIXEDINT is defined, sizeof(HYPRE_Int) == 32 */ 2322f91d8e95SBarry Smith iupper[0] += ilower[0] - 1; 2323f91d8e95SBarry Smith iupper[1] += ilower[1] - 1; 2324f91d8e95SBarry Smith iupper[2] += ilower[2] - 1; 23252cf14000SStefano Zampini hlower[0] = (HYPRE_Int)ilower[0]; 23262cf14000SStefano Zampini hlower[1] = (HYPRE_Int)ilower[1]; 23272cf14000SStefano Zampini hlower[2] = (HYPRE_Int)ilower[2]; 23282cf14000SStefano Zampini hupper[0] = (HYPRE_Int)iupper[0]; 23292cf14000SStefano Zampini hupper[1] = (HYPRE_Int)iupper[1]; 23302cf14000SStefano Zampini hupper[2] = (HYPRE_Int)iupper[2]; 2331f91d8e95SBarry Smith 2332f91d8e95SBarry Smith /* copy x values over to hypre */ 2333fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructVectorSetConstantValues,(mx->hb,0.0)); 2334d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 233539accc25SStefano Zampini PetscStackCallStandard(HYPRE_StructVectorSetBoxValues,(mx->hb,hlower,hupper,(HYPRE_Complex*)xx)); 2336d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 2337fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructVectorAssemble,(mx->hb)); 2338fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSolve,(ex->hsolver,mx->hmat,mx->hb,mx->hx)); 2339f91d8e95SBarry Smith 2340f91d8e95SBarry Smith /* copy solution values back to PETSc */ 2341f91d8e95SBarry Smith ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 234239accc25SStefano Zampini PetscStackCallStandard(HYPRE_StructVectorGetBoxValues,(mx->hx,hlower,hupper,(HYPRE_Complex*)yy)); 2343f91d8e95SBarry Smith ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 2344f91d8e95SBarry Smith PetscFunctionReturn(0); 2345f91d8e95SBarry Smith } 2346f91d8e95SBarry Smith 2347ace3abfcSBarry Smith static PetscErrorCode PCApplyRichardson_PFMG(PC pc,Vec b,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt its,PetscBool guesszero,PetscInt *outits,PCRichardsonConvergedReason *reason) 23489e5bc791SBarry Smith { 23499e5bc791SBarry Smith PC_PFMG *jac = (PC_PFMG*)pc->data; 23509e5bc791SBarry Smith PetscErrorCode ierr; 23512cf14000SStefano Zampini HYPRE_Int oits; 23529e5bc791SBarry Smith 23539e5bc791SBarry Smith PetscFunctionBegin; 2354dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2355fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(jac->hsolver,its*jac->its)); 2356fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(jac->hsolver,rtol)); 23579e5bc791SBarry Smith 23589e5bc791SBarry Smith ierr = PCApply_PFMG(pc,b,y);CHKERRQ(ierr); 23592cf14000SStefano Zampini PetscStackCallStandard(HYPRE_StructPFMGGetNumIterations,(jac->hsolver,&oits)); 23609e5bc791SBarry Smith *outits = oits; 23619e5bc791SBarry Smith if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 23629e5bc791SBarry Smith else *reason = PCRICHARDSON_CONVERGED_RTOL; 2363fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(jac->hsolver,jac->tol)); 2364fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(jac->hsolver,jac->its)); 23659e5bc791SBarry Smith PetscFunctionReturn(0); 23669e5bc791SBarry Smith } 23679e5bc791SBarry Smith 23683a32d3dbSGlenn Hammond PetscErrorCode PCSetUp_PFMG(PC pc) 23693a32d3dbSGlenn Hammond { 23703a32d3dbSGlenn Hammond PetscErrorCode ierr; 23713a32d3dbSGlenn Hammond PC_PFMG *ex = (PC_PFMG*) pc->data; 23723a32d3dbSGlenn Hammond Mat_HYPREStruct *mx = (Mat_HYPREStruct*)(pc->pmat->data); 2373ace3abfcSBarry Smith PetscBool flg; 23743a32d3dbSGlenn Hammond 23753a32d3dbSGlenn Hammond PetscFunctionBegin; 2376251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRESTRUCT,&flg);CHKERRQ(ierr); 2377ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_INCOMP,"Must use MATHYPRESTRUCT with this preconditioner"); 23783a32d3dbSGlenn Hammond 23793a32d3dbSGlenn Hammond /* create the hypre solver object and set its information */ 23802fa5cd67SKarl Rupp if (ex->hsolver) PetscStackCallStandard(HYPRE_StructPFMGDestroy,(ex->hsolver)); 2381fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGCreate,(ex->hcomm,&ex->hsolver)); 2382fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetup,(ex->hsolver,mx->hmat,mx->hb,mx->hx)); 2383fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetZeroGuess,(ex->hsolver)); 23843a32d3dbSGlenn Hammond PetscFunctionReturn(0); 23853a32d3dbSGlenn Hammond } 23863a32d3dbSGlenn Hammond 2387ebc551c0SBarry Smith /*MC 2388ebc551c0SBarry Smith PCPFMG - the hypre PFMG multigrid solver 2389ebc551c0SBarry Smith 2390ebc551c0SBarry Smith Level: advanced 2391ebc551c0SBarry Smith 23929e5bc791SBarry Smith Options Database: 23939e5bc791SBarry Smith + -pc_pfmg_its <its> number of iterations of PFMG to use as preconditioner 23949e5bc791SBarry Smith . -pc_pfmg_num_pre_relax <steps> number of smoothing steps before coarse grid 23959e5bc791SBarry Smith . -pc_pfmg_num_post_relax <steps> number of smoothing steps after coarse grid 23969e5bc791SBarry Smith . -pc_pfmg_tol <tol> tolerance of PFMG 23979e5bc791SBarry Smith . -pc_pfmg_relax_type -relaxation type for the up and down cycles, one of Jacobi,Weighted-Jacobi,symmetric-Red/Black-Gauss-Seidel,Red/Black-Gauss-Seidel 23989e5bc791SBarry Smith - -pc_pfmg_rap_type - type of coarse matrix generation, one of Galerkin,non-Galerkin 2399f91d8e95SBarry Smith 240095452b02SPatrick Sanan Notes: 240195452b02SPatrick Sanan This is for CELL-centered descretizations 24029e5bc791SBarry Smith 24038e395302SJed Brown This must be used with the MATHYPRESTRUCT matrix type. 2404aa219208SBarry Smith This is less general than in hypre, it supports only one block per process defined by a PETSc DMDA. 24059e5bc791SBarry Smith 24069e5bc791SBarry Smith .seealso: PCMG, MATHYPRESTRUCT 2407ebc551c0SBarry Smith M*/ 2408ebc551c0SBarry Smith 24098cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_PFMG(PC pc) 2410ebc551c0SBarry Smith { 2411ebc551c0SBarry Smith PetscErrorCode ierr; 2412ebc551c0SBarry Smith PC_PFMG *ex; 2413ebc551c0SBarry Smith 2414ebc551c0SBarry Smith PetscFunctionBegin; 2415b00a9115SJed Brown ierr = PetscNew(&ex);CHKERRQ(ierr); \ 241668326731SBarry Smith pc->data = ex; 2417ebc551c0SBarry Smith 24189e5bc791SBarry Smith ex->its = 1; 24199e5bc791SBarry Smith ex->tol = 1.e-8; 24209e5bc791SBarry Smith ex->relax_type = 1; 24219e5bc791SBarry Smith ex->rap_type = 0; 24229e5bc791SBarry Smith ex->num_pre_relax = 1; 24239e5bc791SBarry Smith ex->num_post_relax = 1; 24243b46a515SGlenn Hammond ex->max_levels = 0; 24259e5bc791SBarry Smith 2426ebc551c0SBarry Smith pc->ops->setfromoptions = PCSetFromOptions_PFMG; 2427ebc551c0SBarry Smith pc->ops->view = PCView_PFMG; 2428ebc551c0SBarry Smith pc->ops->destroy = PCDestroy_PFMG; 2429f91d8e95SBarry Smith pc->ops->apply = PCApply_PFMG; 24309e5bc791SBarry Smith pc->ops->applyrichardson = PCApplyRichardson_PFMG; 243168326731SBarry Smith pc->ops->setup = PCSetUp_PFMG; 24322fa5cd67SKarl Rupp 2433ffc4695bSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(ex->hcomm));CHKERRMPI(ierr); 2434fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGCreate,(ex->hcomm,&ex->hsolver)); 2435ebc551c0SBarry Smith PetscFunctionReturn(0); 2436ebc551c0SBarry Smith } 2437d851a50bSGlenn Hammond 2438325fc9f4SBarry Smith /* ---------------------------------------------------------------------------------------------------------------------------------------------------*/ 2439325fc9f4SBarry Smith 2440d851a50bSGlenn Hammond /* we know we are working with a HYPRE_SStructMatrix */ 2441d851a50bSGlenn Hammond typedef struct { 2442d851a50bSGlenn Hammond MPI_Comm hcomm; /* does not share comm with HYPRE_SStructMatrix because need to create solver before getting matrix */ 2443d851a50bSGlenn Hammond HYPRE_SStructSolver ss_solver; 2444d851a50bSGlenn Hammond 2445d851a50bSGlenn Hammond /* keep copy of SYSPFMG options used so may view them */ 24464ddd07fcSJed Brown PetscInt its; 2447d851a50bSGlenn Hammond double tol; 24484ddd07fcSJed Brown PetscInt relax_type; 24494ddd07fcSJed Brown PetscInt num_pre_relax,num_post_relax; 2450d851a50bSGlenn Hammond } PC_SysPFMG; 2451d851a50bSGlenn Hammond 2452d851a50bSGlenn Hammond PetscErrorCode PCDestroy_SysPFMG(PC pc) 2453d851a50bSGlenn Hammond { 2454d851a50bSGlenn Hammond PetscErrorCode ierr; 2455d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2456d851a50bSGlenn Hammond 2457d851a50bSGlenn Hammond PetscFunctionBegin; 24582fa5cd67SKarl Rupp if (ex->ss_solver) PetscStackCallStandard(HYPRE_SStructSysPFMGDestroy,(ex->ss_solver)); 2459ffc4695bSBarry Smith ierr = MPI_Comm_free(&ex->hcomm);CHKERRMPI(ierr); 2460c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 2461d851a50bSGlenn Hammond PetscFunctionReturn(0); 2462d851a50bSGlenn Hammond } 2463d851a50bSGlenn Hammond 2464d851a50bSGlenn Hammond static const char *SysPFMGRelaxType[] = {"Weighted-Jacobi","Red/Black-Gauss-Seidel"}; 2465d851a50bSGlenn Hammond 2466d851a50bSGlenn Hammond PetscErrorCode PCView_SysPFMG(PC pc,PetscViewer viewer) 2467d851a50bSGlenn Hammond { 2468d851a50bSGlenn Hammond PetscErrorCode ierr; 2469ace3abfcSBarry Smith PetscBool iascii; 2470d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2471d851a50bSGlenn Hammond 2472d851a50bSGlenn Hammond PetscFunctionBegin; 2473251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 2474d851a50bSGlenn Hammond if (iascii) { 2475d851a50bSGlenn Hammond ierr = PetscViewerASCIIPrintf(viewer," HYPRE SysPFMG preconditioning\n");CHKERRQ(ierr); 2476efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max iterations %d\n",ex->its);CHKERRQ(ierr); 2477efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerance %g\n",ex->tol);CHKERRQ(ierr); 2478efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relax type %s\n",PFMGRelaxType[ex->relax_type]);CHKERRQ(ierr); 2479efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number pre-relax %d post-relax %d\n",ex->num_pre_relax,ex->num_post_relax);CHKERRQ(ierr); 2480d851a50bSGlenn Hammond } 2481d851a50bSGlenn Hammond PetscFunctionReturn(0); 2482d851a50bSGlenn Hammond } 2483d851a50bSGlenn Hammond 24844416b707SBarry Smith PetscErrorCode PCSetFromOptions_SysPFMG(PetscOptionItems *PetscOptionsObject,PC pc) 2485d851a50bSGlenn Hammond { 2486d851a50bSGlenn Hammond PetscErrorCode ierr; 2487d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2488ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE; 2489d851a50bSGlenn Hammond 2490d851a50bSGlenn Hammond PetscFunctionBegin; 2491e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"SysPFMG options");CHKERRQ(ierr); 24920298fd71SBarry Smith ierr = PetscOptionsBool("-pc_syspfmg_print_statistics","Print statistics","HYPRE_SStructSysPFMGSetPrintLevel",flg,&flg,NULL);CHKERRQ(ierr); 2493d851a50bSGlenn Hammond if (flg) { 24945bd1e576SStefano Zampini PetscStackCallStandard(HYPRE_SStructSysPFMGSetPrintLevel,(ex->ss_solver,3)); 2495d851a50bSGlenn Hammond } 24960298fd71SBarry Smith ierr = PetscOptionsInt("-pc_syspfmg_its","Number of iterations of SysPFMG to use as preconditioner","HYPRE_SStructSysPFMGSetMaxIter",ex->its,&ex->its,NULL);CHKERRQ(ierr); 2497fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(ex->ss_solver,ex->its)); 24980298fd71SBarry Smith ierr = PetscOptionsInt("-pc_syspfmg_num_pre_relax","Number of smoothing steps before coarse grid","HYPRE_SStructSysPFMGSetNumPreRelax",ex->num_pre_relax,&ex->num_pre_relax,NULL);CHKERRQ(ierr); 2499fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetNumPreRelax,(ex->ss_solver,ex->num_pre_relax)); 25000298fd71SBarry Smith ierr = PetscOptionsInt("-pc_syspfmg_num_post_relax","Number of smoothing steps after coarse grid","HYPRE_SStructSysPFMGSetNumPostRelax",ex->num_post_relax,&ex->num_post_relax,NULL);CHKERRQ(ierr); 2501fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetNumPostRelax,(ex->ss_solver,ex->num_post_relax)); 2502d851a50bSGlenn Hammond 25030298fd71SBarry Smith ierr = PetscOptionsReal("-pc_syspfmg_tol","Tolerance of SysPFMG","HYPRE_SStructSysPFMGSetTol",ex->tol,&ex->tol,NULL);CHKERRQ(ierr); 2504fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(ex->ss_solver,ex->tol)); 250561710fbeSStefano Zampini ierr = PetscOptionsEList("-pc_syspfmg_relax_type","Relax type for the up and down cycles","HYPRE_SStructSysPFMGSetRelaxType",SysPFMGRelaxType,ALEN(SysPFMGRelaxType),SysPFMGRelaxType[ex->relax_type],&ex->relax_type,NULL);CHKERRQ(ierr); 2506fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetRelaxType,(ex->ss_solver, ex->relax_type)); 2507d851a50bSGlenn Hammond ierr = PetscOptionsTail();CHKERRQ(ierr); 2508d851a50bSGlenn Hammond PetscFunctionReturn(0); 2509d851a50bSGlenn Hammond } 2510d851a50bSGlenn Hammond 2511d851a50bSGlenn Hammond PetscErrorCode PCApply_SysPFMG(PC pc,Vec x,Vec y) 2512d851a50bSGlenn Hammond { 2513d851a50bSGlenn Hammond PetscErrorCode ierr; 2514d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2515d9ca1df4SBarry Smith PetscScalar *yy; 2516d9ca1df4SBarry Smith const PetscScalar *xx; 25174ddd07fcSJed Brown PetscInt ilower[3],iupper[3]; 25182cf14000SStefano Zampini HYPRE_Int hlower[3],hupper[3]; 2519d851a50bSGlenn Hammond Mat_HYPRESStruct *mx = (Mat_HYPRESStruct*)(pc->pmat->data); 25204ddd07fcSJed Brown PetscInt ordering= mx->dofs_order; 25214ddd07fcSJed Brown PetscInt nvars = mx->nvars; 25224ddd07fcSJed Brown PetscInt part = 0; 25234ddd07fcSJed Brown PetscInt size; 25244ddd07fcSJed Brown PetscInt i; 2525d851a50bSGlenn Hammond 2526d851a50bSGlenn Hammond PetscFunctionBegin; 2527dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2528aa219208SBarry Smith ierr = DMDAGetCorners(mx->da,&ilower[0],&ilower[1],&ilower[2],&iupper[0],&iupper[1],&iupper[2]);CHKERRQ(ierr); 25292cf14000SStefano Zampini /* when HYPRE_MIXEDINT is defined, sizeof(HYPRE_Int) == 32 */ 2530d851a50bSGlenn Hammond iupper[0] += ilower[0] - 1; 2531d851a50bSGlenn Hammond iupper[1] += ilower[1] - 1; 2532d851a50bSGlenn Hammond iupper[2] += ilower[2] - 1; 25332cf14000SStefano Zampini hlower[0] = (HYPRE_Int)ilower[0]; 25342cf14000SStefano Zampini hlower[1] = (HYPRE_Int)ilower[1]; 25352cf14000SStefano Zampini hlower[2] = (HYPRE_Int)ilower[2]; 25362cf14000SStefano Zampini hupper[0] = (HYPRE_Int)iupper[0]; 25372cf14000SStefano Zampini hupper[1] = (HYPRE_Int)iupper[1]; 25382cf14000SStefano Zampini hupper[2] = (HYPRE_Int)iupper[2]; 2539d851a50bSGlenn Hammond 2540d851a50bSGlenn Hammond size = 1; 25412fa5cd67SKarl Rupp for (i= 0; i< 3; i++) size *= (iupper[i]-ilower[i]+1); 25422fa5cd67SKarl Rupp 2543d851a50bSGlenn Hammond /* copy x values over to hypre for variable ordering */ 2544d851a50bSGlenn Hammond if (ordering) { 2545fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorSetConstantValues,(mx->ss_b,0.0)); 2546d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 254739accc25SStefano Zampini for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorSetBoxValues,(mx->ss_b,part,hlower,hupper,i,(HYPRE_Complex*)(xx+(size*i)))); 2548d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 2549fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorAssemble,(mx->ss_b)); 2550fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructMatrixMatvec,(1.0,mx->ss_mat,mx->ss_b,0.0,mx->ss_x)); 2551fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSolve,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2552d851a50bSGlenn Hammond 2553d851a50bSGlenn Hammond /* copy solution values back to PETSc */ 2554d851a50bSGlenn Hammond ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 255539accc25SStefano Zampini for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorGetBoxValues,(mx->ss_x,part,hlower,hupper,i,(HYPRE_Complex*)(yy+(size*i)))); 2556d851a50bSGlenn Hammond ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 2557a65764d7SBarry Smith } else { /* nodal ordering must be mapped to variable ordering for sys_pfmg */ 2558d851a50bSGlenn Hammond PetscScalar *z; 25594ddd07fcSJed Brown PetscInt j, k; 2560d851a50bSGlenn Hammond 2561785e854fSJed Brown ierr = PetscMalloc1(nvars*size,&z);CHKERRQ(ierr); 2562fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorSetConstantValues,(mx->ss_b,0.0)); 2563d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 2564d851a50bSGlenn Hammond 2565d851a50bSGlenn Hammond /* transform nodal to hypre's variable ordering for sys_pfmg */ 2566d851a50bSGlenn Hammond for (i= 0; i< size; i++) { 2567d851a50bSGlenn Hammond k= i*nvars; 25682fa5cd67SKarl Rupp for (j= 0; j< nvars; j++) z[j*size+i]= xx[k+j]; 2569d851a50bSGlenn Hammond } 257039accc25SStefano Zampini for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorSetBoxValues,(mx->ss_b,part,hlower,hupper,i,(HYPRE_Complex*)(z+(size*i)))); 2571d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 2572fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorAssemble,(mx->ss_b)); 2573fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSolve,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2574d851a50bSGlenn Hammond 2575d851a50bSGlenn Hammond /* copy solution values back to PETSc */ 2576d851a50bSGlenn Hammond ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 257739accc25SStefano Zampini for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorGetBoxValues,(mx->ss_x,part,hlower,hupper,i,(HYPRE_Complex*)(z+(size*i)))); 2578d851a50bSGlenn Hammond /* transform hypre's variable ordering for sys_pfmg to nodal ordering */ 2579d851a50bSGlenn Hammond for (i= 0; i< size; i++) { 2580d851a50bSGlenn Hammond k= i*nvars; 25812fa5cd67SKarl Rupp for (j= 0; j< nvars; j++) yy[k+j]= z[j*size+i]; 2582d851a50bSGlenn Hammond } 2583d851a50bSGlenn Hammond ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 2584d851a50bSGlenn Hammond ierr = PetscFree(z);CHKERRQ(ierr); 2585d851a50bSGlenn Hammond } 2586d851a50bSGlenn Hammond PetscFunctionReturn(0); 2587d851a50bSGlenn Hammond } 2588d851a50bSGlenn Hammond 2589ace3abfcSBarry Smith static PetscErrorCode PCApplyRichardson_SysPFMG(PC pc,Vec b,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt its,PetscBool guesszero,PetscInt *outits,PCRichardsonConvergedReason *reason) 2590d851a50bSGlenn Hammond { 2591d851a50bSGlenn Hammond PC_SysPFMG *jac = (PC_SysPFMG*)pc->data; 2592d851a50bSGlenn Hammond PetscErrorCode ierr; 25932cf14000SStefano Zampini HYPRE_Int oits; 2594d851a50bSGlenn Hammond 2595d851a50bSGlenn Hammond PetscFunctionBegin; 2596dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2597fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(jac->ss_solver,its*jac->its)); 2598fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(jac->ss_solver,rtol)); 2599d851a50bSGlenn Hammond ierr = PCApply_SysPFMG(pc,b,y);CHKERRQ(ierr); 26002cf14000SStefano Zampini PetscStackCallStandard(HYPRE_SStructSysPFMGGetNumIterations,(jac->ss_solver,&oits)); 2601d851a50bSGlenn Hammond *outits = oits; 2602d851a50bSGlenn Hammond if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 2603d851a50bSGlenn Hammond else *reason = PCRICHARDSON_CONVERGED_RTOL; 2604fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(jac->ss_solver,jac->tol)); 2605fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(jac->ss_solver,jac->its)); 2606d851a50bSGlenn Hammond PetscFunctionReturn(0); 2607d851a50bSGlenn Hammond } 2608d851a50bSGlenn Hammond 2609d851a50bSGlenn Hammond PetscErrorCode PCSetUp_SysPFMG(PC pc) 2610d851a50bSGlenn Hammond { 2611d851a50bSGlenn Hammond PetscErrorCode ierr; 2612d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2613d851a50bSGlenn Hammond Mat_HYPRESStruct *mx = (Mat_HYPRESStruct*)(pc->pmat->data); 2614ace3abfcSBarry Smith PetscBool flg; 2615d851a50bSGlenn Hammond 2616d851a50bSGlenn Hammond PetscFunctionBegin; 2617251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRESSTRUCT,&flg);CHKERRQ(ierr); 2618ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_INCOMP,"Must use MATHYPRESSTRUCT with this preconditioner"); 2619d851a50bSGlenn Hammond 2620d851a50bSGlenn Hammond /* create the hypre sstruct solver object and set its information */ 26212fa5cd67SKarl Rupp if (ex->ss_solver) PetscStackCallStandard(HYPRE_SStructSysPFMGDestroy,(ex->ss_solver)); 2622fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGCreate,(ex->hcomm,&ex->ss_solver)); 2623fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetZeroGuess,(ex->ss_solver)); 2624fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetup,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2625d851a50bSGlenn Hammond PetscFunctionReturn(0); 2626d851a50bSGlenn Hammond } 2627d851a50bSGlenn Hammond 2628d851a50bSGlenn Hammond /*MC 2629d851a50bSGlenn Hammond PCSysPFMG - the hypre SysPFMG multigrid solver 2630d851a50bSGlenn Hammond 2631d851a50bSGlenn Hammond Level: advanced 2632d851a50bSGlenn Hammond 2633d851a50bSGlenn Hammond Options Database: 2634d851a50bSGlenn Hammond + -pc_syspfmg_its <its> number of iterations of SysPFMG to use as preconditioner 2635d851a50bSGlenn Hammond . -pc_syspfmg_num_pre_relax <steps> number of smoothing steps before coarse grid 2636d851a50bSGlenn Hammond . -pc_syspfmg_num_post_relax <steps> number of smoothing steps after coarse grid 2637d851a50bSGlenn Hammond . -pc_syspfmg_tol <tol> tolerance of SysPFMG 2638a2b725a8SWilliam Gropp - -pc_syspfmg_relax_type -relaxation type for the up and down cycles, one of Weighted-Jacobi,Red/Black-Gauss-Seidel 2639d851a50bSGlenn Hammond 264095452b02SPatrick Sanan Notes: 264195452b02SPatrick Sanan This is for CELL-centered descretizations 2642d851a50bSGlenn Hammond 2643f6680f47SSatish Balay This must be used with the MATHYPRESSTRUCT matrix type. 2644aa219208SBarry Smith This is less general than in hypre, it supports only one part, and one block per process defined by a PETSc DMDA. 2645d851a50bSGlenn Hammond Also, only cell-centered variables. 2646d851a50bSGlenn Hammond 2647d851a50bSGlenn Hammond .seealso: PCMG, MATHYPRESSTRUCT 2648d851a50bSGlenn Hammond M*/ 2649d851a50bSGlenn Hammond 26508cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_SysPFMG(PC pc) 2651d851a50bSGlenn Hammond { 2652d851a50bSGlenn Hammond PetscErrorCode ierr; 2653d851a50bSGlenn Hammond PC_SysPFMG *ex; 2654d851a50bSGlenn Hammond 2655d851a50bSGlenn Hammond PetscFunctionBegin; 2656b00a9115SJed Brown ierr = PetscNew(&ex);CHKERRQ(ierr); \ 2657d851a50bSGlenn Hammond pc->data = ex; 2658d851a50bSGlenn Hammond 2659d851a50bSGlenn Hammond ex->its = 1; 2660d851a50bSGlenn Hammond ex->tol = 1.e-8; 2661d851a50bSGlenn Hammond ex->relax_type = 1; 2662d851a50bSGlenn Hammond ex->num_pre_relax = 1; 2663d851a50bSGlenn Hammond ex->num_post_relax = 1; 2664d851a50bSGlenn Hammond 2665d851a50bSGlenn Hammond pc->ops->setfromoptions = PCSetFromOptions_SysPFMG; 2666d851a50bSGlenn Hammond pc->ops->view = PCView_SysPFMG; 2667d851a50bSGlenn Hammond pc->ops->destroy = PCDestroy_SysPFMG; 2668d851a50bSGlenn Hammond pc->ops->apply = PCApply_SysPFMG; 2669d851a50bSGlenn Hammond pc->ops->applyrichardson = PCApplyRichardson_SysPFMG; 2670d851a50bSGlenn Hammond pc->ops->setup = PCSetUp_SysPFMG; 26712fa5cd67SKarl Rupp 2672ffc4695bSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(ex->hcomm));CHKERRMPI(ierr); 2673fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGCreate,(ex->hcomm,&ex->ss_solver)); 2674d851a50bSGlenn Hammond PetscFunctionReturn(0); 2675d851a50bSGlenn Hammond } 2676