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> 958968eb6SStefano Zampini #include <../src/vec/vec/impls/hypre/vhyp.h> 1049a781f5SStefano Zampini #include <../src/mat/impls/hypre/mhypre.h> 11c6db04a5SJed Brown #include <../src/dm/impls/da/hypre/mhyp.h> 124cb006feSStefano Zampini #include <_hypre_parcsr_ls.h> 138a2c336bSFande Kong #include <petscmathypre.h> 1416d9e3a6SLisandro Dalcin 15dff31646SBarry Smith static PetscBool cite = PETSC_FALSE; 16a8d69d7bSBarry 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"; 171f817a21SBarry Smith 1816d9e3a6SLisandro Dalcin /* 1916d9e3a6SLisandro Dalcin Private context (data structure) for the preconditioner. 2016d9e3a6SLisandro Dalcin */ 2116d9e3a6SLisandro Dalcin typedef struct { 2216d9e3a6SLisandro Dalcin HYPRE_Solver hsolver; 2349a781f5SStefano Zampini Mat hpmat; /* MatHYPRE */ 2416d9e3a6SLisandro Dalcin 254ddd07fcSJed Brown HYPRE_Int (*destroy)(HYPRE_Solver); 264ddd07fcSJed Brown HYPRE_Int (*solve)(HYPRE_Solver,HYPRE_ParCSRMatrix,HYPRE_ParVector,HYPRE_ParVector); 274ddd07fcSJed Brown HYPRE_Int (*setup)(HYPRE_Solver,HYPRE_ParCSRMatrix,HYPRE_ParVector,HYPRE_ParVector); 2816d9e3a6SLisandro Dalcin 2916d9e3a6SLisandro Dalcin MPI_Comm comm_hypre; 3016d9e3a6SLisandro Dalcin char *hypre_type; 3116d9e3a6SLisandro Dalcin 3216d9e3a6SLisandro Dalcin /* options for Pilut and BoomerAMG*/ 334ddd07fcSJed Brown PetscInt maxiter; 3439accc25SStefano Zampini PetscReal tol; 3516d9e3a6SLisandro Dalcin 3616d9e3a6SLisandro Dalcin /* options for Pilut */ 374ddd07fcSJed Brown PetscInt factorrowsize; 3816d9e3a6SLisandro Dalcin 3916d9e3a6SLisandro Dalcin /* options for ParaSails */ 404ddd07fcSJed Brown PetscInt nlevels; 418966356dSPierre Jolivet PetscReal threshold; 4239accc25SStefano Zampini PetscReal filter; 4339accc25SStefano Zampini PetscReal loadbal; 444ddd07fcSJed Brown PetscInt logging; 454ddd07fcSJed Brown PetscInt ruse; 464ddd07fcSJed Brown PetscInt symt; 4716d9e3a6SLisandro Dalcin 4822b6d1caSBarry Smith /* options for BoomerAMG */ 49ace3abfcSBarry Smith PetscBool printstatistics; 5016d9e3a6SLisandro Dalcin 5116d9e3a6SLisandro Dalcin /* options for BoomerAMG */ 524ddd07fcSJed Brown PetscInt cycletype; 534ddd07fcSJed Brown PetscInt maxlevels; 5439accc25SStefano Zampini PetscReal strongthreshold; 5539accc25SStefano Zampini PetscReal maxrowsum; 564ddd07fcSJed Brown PetscInt gridsweeps[3]; 574ddd07fcSJed Brown PetscInt coarsentype; 584ddd07fcSJed Brown PetscInt measuretype; 596a251517SEike Mueller PetscInt smoothtype; 608131ecf7SEike Mueller PetscInt smoothnumlevels; 61ec64516dSEike Mueller PetscInt eu_level; /* Number of levels for ILU(k) in Euclid */ 6239accc25SStefano Zampini PetscReal eu_droptolerance; /* Drop tolerance for ILU(k) in Euclid */ 63ec64516dSEike Mueller PetscInt eu_bj; /* Defines use of Block Jacobi ILU in Euclid */ 644ddd07fcSJed Brown PetscInt relaxtype[3]; 6539accc25SStefano Zampini PetscReal relaxweight; 6639accc25SStefano Zampini PetscReal outerrelaxweight; 674ddd07fcSJed Brown PetscInt relaxorder; 6839accc25SStefano Zampini PetscReal truncfactor; 69ace3abfcSBarry Smith PetscBool applyrichardson; 704ddd07fcSJed Brown PetscInt pmax; 714ddd07fcSJed Brown PetscInt interptype; 72589dcaf0SStefano Zampini PetscInt maxc; 73589dcaf0SStefano Zampini PetscInt minc; 74589dcaf0SStefano Zampini 75589dcaf0SStefano Zampini /* AIR */ 76589dcaf0SStefano Zampini PetscInt Rtype; 77589dcaf0SStefano Zampini PetscReal Rstrongthreshold; 78589dcaf0SStefano Zampini PetscReal Rfilterthreshold; 79589dcaf0SStefano Zampini PetscInt Adroptype; 80589dcaf0SStefano Zampini PetscReal Adroptol; 81589dcaf0SStefano Zampini 824ddd07fcSJed Brown PetscInt agg_nl; 834ddd07fcSJed Brown PetscInt agg_num_paths; 84ace3abfcSBarry Smith PetscBool nodal_relax; 854ddd07fcSJed Brown PetscInt nodal_relax_levels; 86589dcaf0SStefano Zampini PetscBool keeptranspose; 874cb006feSStefano Zampini 885272c319SBarry Smith PetscInt nodal_coarsening; 8922e51d31SStefano Zampini PetscInt nodal_coarsening_diag; 905272c319SBarry Smith PetscInt vec_interp_variant; 9122e51d31SStefano Zampini PetscInt vec_interp_qmax; 9222e51d31SStefano Zampini PetscBool vec_interp_smooth; 9322e51d31SStefano Zampini PetscInt interp_refine; 9422e51d31SStefano Zampini 955272c319SBarry Smith HYPRE_IJVector *hmnull; 965272c319SBarry Smith HYPRE_ParVector *phmnull; /* near null space passed to hypre */ 975272c319SBarry Smith PetscInt n_hmnull; 985272c319SBarry Smith Vec hmnull_constant; 9939accc25SStefano Zampini HYPRE_Complex **hmnull_hypre_data_array; /* this is the space in hmnull that was allocated by hypre, it is restored to hypre just before freeing the phmnull vectors */ 1005272c319SBarry Smith 101863406b8SStefano Zampini /* options for AS (Auxiliary Space preconditioners) */ 102863406b8SStefano Zampini PetscInt as_print; 103863406b8SStefano Zampini PetscInt as_max_iter; 104863406b8SStefano Zampini PetscReal as_tol; 105863406b8SStefano Zampini PetscInt as_relax_type; 106863406b8SStefano Zampini PetscInt as_relax_times; 107863406b8SStefano Zampini PetscReal as_relax_weight; 108863406b8SStefano Zampini PetscReal as_omega; 109863406b8SStefano 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) */ 110863406b8SStefano Zampini PetscReal as_amg_alpha_theta; /* AMG strength for vector Poisson (AMS) or Curl problem (ADS) */ 111863406b8SStefano 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) */ 112863406b8SStefano Zampini PetscReal as_amg_beta_theta; /* AMG strength for scalar Poisson (AMS) or vector Poisson (ADS) */ 1134cb006feSStefano Zampini PetscInt ams_cycle_type; 114863406b8SStefano Zampini PetscInt ads_cycle_type; 1154cb006feSStefano Zampini 1164cb006feSStefano Zampini /* additional data */ 1175ac14e1cSStefano Zampini Mat G; /* MatHYPRE */ 1185ac14e1cSStefano Zampini Mat C; /* MatHYPRE */ 1195ac14e1cSStefano Zampini Mat alpha_Poisson; /* MatHYPRE */ 1205ac14e1cSStefano Zampini Mat beta_Poisson; /* MatHYPRE */ 1215ac14e1cSStefano Zampini 1225ac14e1cSStefano Zampini /* extra information for AMS */ 1235ac14e1cSStefano Zampini PetscInt dim; /* geometrical dimension */ 1244cb006feSStefano Zampini HYPRE_IJVector coords[3]; 1254cb006feSStefano Zampini HYPRE_IJVector constants[3]; 1266bf688a0SCe Qin Mat RT_PiFull, RT_Pi[3]; 1276bf688a0SCe Qin Mat ND_PiFull, ND_Pi[3]; 1284cb006feSStefano Zampini PetscBool ams_beta_is_zero; 12923df4f25SStefano Zampini PetscBool ams_beta_is_zero_part; 13023df4f25SStefano Zampini PetscInt ams_proj_freq; 13116d9e3a6SLisandro Dalcin } PC_HYPRE; 13216d9e3a6SLisandro Dalcin 133d2128fa2SBarry Smith PetscErrorCode PCHYPREGetSolver(PC pc,HYPRE_Solver *hsolver) 134d2128fa2SBarry Smith { 135d2128fa2SBarry Smith PC_HYPRE *jac = (PC_HYPRE*)pc->data; 136d2128fa2SBarry Smith 137d2128fa2SBarry Smith PetscFunctionBegin; 138d2128fa2SBarry Smith *hsolver = jac->hsolver; 139d2128fa2SBarry Smith PetscFunctionReturn(0); 140d2128fa2SBarry Smith } 14116d9e3a6SLisandro Dalcin 142fd2dd295SFande Kong /* 1438a2c336bSFande Kong Matrices with AIJ format are created IN PLACE with using (I,J,data) from BoomerAMG. Since the data format in hypre_ParCSRMatrix 1448a2c336bSFande Kong is different from that used in PETSc, the original hypre_ParCSRMatrix can not be used any more after call this routine. 1458a2c336bSFande Kong It is used in PCHMG. Other users should avoid using this function. 146fd2dd295SFande Kong */ 147fd2dd295SFande Kong static PetscErrorCode PCGetCoarseOperators_BoomerAMG(PC pc,PetscInt *nlevels,Mat *operators[]) 1488a2c336bSFande Kong { 1498a2c336bSFande Kong PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1508a2c336bSFande Kong PetscBool same = PETSC_FALSE; 1518a2c336bSFande Kong PetscErrorCode ierr; 1528a2c336bSFande Kong PetscInt num_levels,l; 1538a2c336bSFande Kong Mat *mattmp; 1548a2c336bSFande Kong hypre_ParCSRMatrix **A_array; 1558a2c336bSFande Kong 1568a2c336bSFande Kong PetscFunctionBegin; 1578a2c336bSFande Kong ierr = PetscStrcmp(jac->hypre_type,"boomeramg",&same);CHKERRQ(ierr); 1588a2c336bSFande Kong if (!same) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_NOTSAMETYPE,"Hypre type is not BoomerAMG \n"); 1598a2c336bSFande Kong num_levels = hypre_ParAMGDataNumLevels((hypre_ParAMGData*) (jac->hsolver)); 1608a2c336bSFande Kong ierr = PetscMalloc1(num_levels,&mattmp);CHKERRQ(ierr); 1618a2c336bSFande Kong A_array = hypre_ParAMGDataAArray((hypre_ParAMGData*) (jac->hsolver)); 1628a2c336bSFande Kong for (l=1; l<num_levels; l++) { 1638a2c336bSFande Kong ierr = MatCreateFromParCSR(A_array[l],MATAIJ,PETSC_OWN_POINTER, &(mattmp[num_levels-1-l]));CHKERRQ(ierr); 1648a2c336bSFande Kong /* We want to own the data, and HYPRE can not touch this matrix any more */ 1658a2c336bSFande Kong A_array[l] = NULL; 1668a2c336bSFande Kong } 1678a2c336bSFande Kong *nlevels = num_levels; 1688a2c336bSFande Kong *operators = mattmp; 1698a2c336bSFande Kong PetscFunctionReturn(0); 1708a2c336bSFande Kong } 1718a2c336bSFande Kong 172fd2dd295SFande Kong /* 1738a2c336bSFande Kong Matrices with AIJ format are created IN PLACE with using (I,J,data) from BoomerAMG. Since the data format in hypre_ParCSRMatrix 1748a2c336bSFande Kong is different from that used in PETSc, the original hypre_ParCSRMatrix can not be used any more after call this routine. 1758a2c336bSFande Kong It is used in PCHMG. Other users should avoid using this function. 176fd2dd295SFande Kong */ 177fd2dd295SFande Kong static PetscErrorCode PCGetInterpolations_BoomerAMG(PC pc,PetscInt *nlevels,Mat *interpolations[]) 1788a2c336bSFande Kong { 1798a2c336bSFande Kong PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1808a2c336bSFande Kong PetscBool same = PETSC_FALSE; 1818a2c336bSFande Kong PetscErrorCode ierr; 1828a2c336bSFande Kong PetscInt num_levels,l; 1838a2c336bSFande Kong Mat *mattmp; 1848a2c336bSFande Kong hypre_ParCSRMatrix **P_array; 1858a2c336bSFande Kong 1868a2c336bSFande Kong PetscFunctionBegin; 1878a2c336bSFande Kong ierr = PetscStrcmp(jac->hypre_type,"boomeramg",&same);CHKERRQ(ierr); 1888a2c336bSFande Kong if (!same) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_NOTSAMETYPE,"Hypre type is not BoomerAMG \n"); 1898a2c336bSFande Kong num_levels = hypre_ParAMGDataNumLevels((hypre_ParAMGData*) (jac->hsolver)); 1908a2c336bSFande Kong ierr = PetscMalloc1(num_levels,&mattmp);CHKERRQ(ierr); 1918a2c336bSFande Kong P_array = hypre_ParAMGDataPArray((hypre_ParAMGData*) (jac->hsolver)); 1928a2c336bSFande Kong for (l=1; l<num_levels; l++) { 1938a2c336bSFande Kong ierr = MatCreateFromParCSR(P_array[num_levels-1-l],MATAIJ,PETSC_OWN_POINTER, &(mattmp[l-1]));CHKERRQ(ierr); 1948a2c336bSFande Kong /* We want to own the data, and HYPRE can not touch this matrix any more */ 1958a2c336bSFande Kong P_array[num_levels-1-l] = NULL; 1968a2c336bSFande Kong } 1978a2c336bSFande Kong *nlevels = num_levels; 1988a2c336bSFande Kong *interpolations = mattmp; 1998a2c336bSFande Kong PetscFunctionReturn(0); 2008a2c336bSFande Kong } 2018a2c336bSFande Kong 202ce6a8a0dSJed Brown /* Resets (frees) Hypre's representation of the near null space */ 203ce6a8a0dSJed Brown static PetscErrorCode PCHYPREResetNearNullSpace_Private(PC pc) 204ce6a8a0dSJed Brown { 205ce6a8a0dSJed Brown PC_HYPRE *jac = (PC_HYPRE*)pc->data; 206ce6a8a0dSJed Brown PetscInt i; 2079d678128SJed Brown PetscErrorCode ierr; 208ce6a8a0dSJed Brown 2099d678128SJed Brown PetscFunctionBegin; 210ce6a8a0dSJed Brown for (i=0; i<jac->n_hmnull; i++) { 21139accc25SStefano Zampini PETSC_UNUSED HYPRE_Complex *harray; 21239accc25SStefano Zampini VecHYPRE_ParVectorReplacePointer(jac->hmnull[i],jac->hmnull_hypre_data_array[i],harray); 213ce6a8a0dSJed Brown PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->hmnull[i])); 214ce6a8a0dSJed Brown } 215ce6a8a0dSJed Brown ierr = PetscFree(jac->hmnull);CHKERRQ(ierr); 216ce6a8a0dSJed Brown ierr = PetscFree(jac->hmnull_hypre_data_array);CHKERRQ(ierr); 217ce6a8a0dSJed Brown ierr = PetscFree(jac->phmnull);CHKERRQ(ierr); 218ce6a8a0dSJed Brown ierr = VecDestroy(&jac->hmnull_constant);CHKERRQ(ierr); 2199d678128SJed Brown jac->n_hmnull = 0; 220ce6a8a0dSJed Brown PetscFunctionReturn(0); 221ce6a8a0dSJed Brown } 222ce6a8a0dSJed Brown 22316d9e3a6SLisandro Dalcin static PetscErrorCode PCSetUp_HYPRE(PC pc) 22416d9e3a6SLisandro Dalcin { 22516d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 22649a781f5SStefano Zampini Mat_HYPRE *hjac; 22716d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 22816d9e3a6SLisandro Dalcin HYPRE_ParVector bv,xv; 22949a781f5SStefano Zampini PetscBool ishypre; 23049a781f5SStefano Zampini PetscErrorCode ierr; 23116d9e3a6SLisandro Dalcin 23216d9e3a6SLisandro Dalcin PetscFunctionBegin; 23316d9e3a6SLisandro Dalcin if (!jac->hypre_type) { 23402a17cd4SBarry Smith ierr = PCHYPRESetType(pc,"boomeramg");CHKERRQ(ierr); 23516d9e3a6SLisandro Dalcin } 2365f5c5b43SBarry Smith 23749a781f5SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRE,&ishypre);CHKERRQ(ierr); 23849a781f5SStefano Zampini if (!ishypre) { 2396bf688a0SCe Qin ierr = MatDestroy(&jac->hpmat);CHKERRQ(ierr); 2406bf688a0SCe Qin ierr = MatConvert(pc->pmat,MATHYPRE,MAT_INITIAL_MATRIX,&jac->hpmat);CHKERRQ(ierr); 241589dcaf0SStefano Zampini ierr = PetscLogObjectParent((PetscObject)pc,(PetscObject)jac->hpmat);CHKERRQ(ierr); 24249a781f5SStefano Zampini } else { 24349a781f5SStefano Zampini ierr = PetscObjectReference((PetscObject)pc->pmat);CHKERRQ(ierr); 24449a781f5SStefano Zampini ierr = MatDestroy(&jac->hpmat);CHKERRQ(ierr); 24549a781f5SStefano Zampini jac->hpmat = pc->pmat; 24616d9e3a6SLisandro Dalcin } 24749a781f5SStefano Zampini hjac = (Mat_HYPRE*)(jac->hpmat->data); 2485f5c5b43SBarry Smith 24916d9e3a6SLisandro Dalcin /* special case for BoomerAMG */ 25016d9e3a6SLisandro Dalcin if (jac->setup == HYPRE_BoomerAMGSetup) { 2515272c319SBarry Smith MatNullSpace mnull; 2525272c319SBarry Smith PetscBool has_const; 25349a781f5SStefano Zampini PetscInt bs,nvec,i; 2545272c319SBarry Smith const Vec *vecs; 25539accc25SStefano Zampini HYPRE_Complex *petscvecarray; 2565272c319SBarry Smith 25716d9e3a6SLisandro Dalcin ierr = MatGetBlockSize(pc->pmat,&bs);CHKERRQ(ierr); 2582fa5cd67SKarl Rupp if (bs > 1) PetscStackCallStandard(HYPRE_BoomerAMGSetNumFunctions,(jac->hsolver,bs)); 2595272c319SBarry Smith ierr = MatGetNearNullSpace(pc->mat, &mnull);CHKERRQ(ierr); 2605272c319SBarry Smith if (mnull) { 261ce6a8a0dSJed Brown ierr = PCHYPREResetNearNullSpace_Private(pc);CHKERRQ(ierr); 2625272c319SBarry Smith ierr = MatNullSpaceGetVecs(mnull, &has_const, &nvec, &vecs);CHKERRQ(ierr); 2635272c319SBarry Smith ierr = PetscMalloc1(nvec+1,&jac->hmnull);CHKERRQ(ierr); 26472827435SBarry Smith ierr = PetscMalloc1(nvec+1,&jac->hmnull_hypre_data_array);CHKERRQ(ierr); 2655272c319SBarry Smith ierr = PetscMalloc1(nvec+1,&jac->phmnull);CHKERRQ(ierr); 2665272c319SBarry Smith for (i=0; i<nvec; i++) { 2675272c319SBarry Smith ierr = VecHYPRE_IJVectorCreate(vecs[i],&jac->hmnull[i]);CHKERRQ(ierr); 26872827435SBarry Smith ierr = VecGetArrayRead(vecs[i],(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 26958968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(jac->hmnull[i],petscvecarray,jac->hmnull_hypre_data_array[i]); 27072827435SBarry Smith ierr = VecRestoreArrayRead(vecs[i],(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 2715272c319SBarry Smith PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->hmnull[i],(void**)&jac->phmnull[i])); 2725272c319SBarry Smith } 2735272c319SBarry Smith if (has_const) { 2745272c319SBarry Smith ierr = MatCreateVecs(pc->pmat,&jac->hmnull_constant,NULL);CHKERRQ(ierr); 275589dcaf0SStefano Zampini ierr = PetscLogObjectParent((PetscObject)pc,(PetscObject)jac->hmnull_constant);CHKERRQ(ierr); 2765272c319SBarry Smith ierr = VecSet(jac->hmnull_constant,1);CHKERRQ(ierr); 277*1e1ea65dSPierre Jolivet ierr = VecNormalize(jac->hmnull_constant,NULL);CHKERRQ(ierr); 2785272c319SBarry Smith ierr = VecHYPRE_IJVectorCreate(jac->hmnull_constant,&jac->hmnull[nvec]);CHKERRQ(ierr); 27972827435SBarry Smith ierr = VecGetArrayRead(jac->hmnull_constant,(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 28058968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(jac->hmnull[nvec],petscvecarray,jac->hmnull_hypre_data_array[nvec]); 28172827435SBarry Smith ierr = VecRestoreArrayRead(jac->hmnull_constant,(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 2825272c319SBarry Smith PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->hmnull[nvec],(void**)&jac->phmnull[nvec])); 2835272c319SBarry Smith nvec++; 2845272c319SBarry Smith } 2855272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpVectors,(jac->hsolver,nvec,jac->phmnull)); 2865272c319SBarry Smith jac->n_hmnull = nvec; 2875272c319SBarry Smith } 2884cb006feSStefano Zampini } 289863406b8SStefano Zampini 2904cb006feSStefano Zampini /* special case for AMS */ 2914cb006feSStefano Zampini if (jac->setup == HYPRE_AMSSetup) { 2925ac14e1cSStefano Zampini Mat_HYPRE *hm; 2935ac14e1cSStefano Zampini HYPRE_ParCSRMatrix parcsr; 2946bf688a0SCe Qin if (!jac->coords[0] && !jac->constants[0] && !(jac->ND_PiFull || (jac->ND_Pi[0] && jac->ND_Pi[1]))) { 2956bf688a0SCe 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"); 2966bf688a0SCe Qin } 2975ac14e1cSStefano Zampini if (jac->dim) { 2985ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetDimension,(jac->hsolver,jac->dim)); 2995ac14e1cSStefano Zampini } 3005ac14e1cSStefano Zampini if (jac->constants[0]) { 3015ac14e1cSStefano Zampini HYPRE_ParVector ozz,zoz,zzo = NULL; 3025ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[0],(void**)(&ozz))); 3035ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[1],(void**)(&zoz))); 3045ac14e1cSStefano Zampini if (jac->constants[2]) { 3055ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[2],(void**)(&zzo))); 3065ac14e1cSStefano Zampini } 3075ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetEdgeConstantVectors,(jac->hsolver,ozz,zoz,zzo)); 3085ac14e1cSStefano Zampini } 3095ac14e1cSStefano Zampini if (jac->coords[0]) { 3105ac14e1cSStefano Zampini HYPRE_ParVector coords[3]; 3115ac14e1cSStefano Zampini coords[0] = NULL; 3125ac14e1cSStefano Zampini coords[1] = NULL; 3135ac14e1cSStefano Zampini coords[2] = NULL; 3145ac14e1cSStefano Zampini if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[0],(void**)(&coords[0]))); 3155ac14e1cSStefano Zampini if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[1],(void**)(&coords[1]))); 3165ac14e1cSStefano Zampini if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[2],(void**)(&coords[2]))); 3175ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetCoordinateVectors,(jac->hsolver,coords[0],coords[1],coords[2])); 3185ac14e1cSStefano Zampini } 31949a781f5SStefano Zampini if (!jac->G) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE AMS preconditioner needs the discrete gradient operator via PCHYPRESetDiscreteGradient"); 3205ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->G->data); 3215ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3225ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetDiscreteGradient,(jac->hsolver,parcsr)); 3235ac14e1cSStefano Zampini if (jac->alpha_Poisson) { 3245ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->alpha_Poisson->data); 3255ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3265ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaPoissonMatrix,(jac->hsolver,parcsr)); 3275ac14e1cSStefano Zampini } 3285ac14e1cSStefano Zampini if (jac->ams_beta_is_zero) { 3295ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaPoissonMatrix,(jac->hsolver,NULL)); 3305ac14e1cSStefano Zampini } else if (jac->beta_Poisson) { 3315ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->beta_Poisson->data); 3325ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3335ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaPoissonMatrix,(jac->hsolver,parcsr)); 3345ac14e1cSStefano Zampini } 3356bf688a0SCe Qin if (jac->ND_PiFull || (jac->ND_Pi[0] && jac->ND_Pi[1])) { 3366bf688a0SCe Qin PetscInt i; 3376bf688a0SCe Qin HYPRE_ParCSRMatrix nd_parcsrfull, nd_parcsr[3]; 3386bf688a0SCe Qin if (jac->ND_PiFull) { 3396bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_PiFull->data); 3406bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsrfull))); 3416bf688a0SCe Qin } else { 3426bf688a0SCe Qin nd_parcsrfull = NULL; 3436bf688a0SCe Qin } 3446bf688a0SCe Qin for (i=0;i<3;++i) { 3456bf688a0SCe Qin if (jac->ND_Pi[i]) { 3466bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_Pi[i]->data); 3476bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsr[i]))); 3486bf688a0SCe Qin } else { 3496bf688a0SCe Qin nd_parcsr[i] = NULL; 3506bf688a0SCe Qin } 3516bf688a0SCe Qin } 3526bf688a0SCe Qin PetscStackCallStandard(HYPRE_AMSSetInterpolations,(jac->hsolver,nd_parcsrfull,nd_parcsr[0],nd_parcsr[1],nd_parcsr[2])); 3536bf688a0SCe Qin } 3544cb006feSStefano Zampini } 355863406b8SStefano Zampini /* special case for ADS */ 356863406b8SStefano Zampini if (jac->setup == HYPRE_ADSSetup) { 3575ac14e1cSStefano Zampini Mat_HYPRE *hm; 3585ac14e1cSStefano Zampini HYPRE_ParCSRMatrix parcsr; 3596bf688a0SCe 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])))) { 3606bf688a0SCe Qin SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs either the coordinate vectors via PCSetCoordinates() or the interpolation matrices via PCHYPRESetInterpolations"); 3616bf688a0SCe Qin } 36237096e45SBarry 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"); 36349a781f5SStefano Zampini if (!jac->G) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs the discrete gradient operator via PCHYPRESetDiscreteGradient"); 36449a781f5SStefano Zampini if (!jac->C) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs the discrete curl operator via PCHYPRESetDiscreteGradient"); 3655ac14e1cSStefano Zampini if (jac->coords[0]) { 3665ac14e1cSStefano Zampini HYPRE_ParVector coords[3]; 3675ac14e1cSStefano Zampini coords[0] = NULL; 3685ac14e1cSStefano Zampini coords[1] = NULL; 3695ac14e1cSStefano Zampini coords[2] = NULL; 3705ac14e1cSStefano Zampini if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[0],(void**)(&coords[0]))); 3715ac14e1cSStefano Zampini if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[1],(void**)(&coords[1]))); 3725ac14e1cSStefano Zampini if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[2],(void**)(&coords[2]))); 3735ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetCoordinateVectors,(jac->hsolver,coords[0],coords[1],coords[2])); 3745ac14e1cSStefano Zampini } 3755ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->G->data); 3765ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3775ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetDiscreteGradient,(jac->hsolver,parcsr)); 3785ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->C->data); 3795ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3805ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetDiscreteCurl,(jac->hsolver,parcsr)); 3816bf688a0SCe Qin if ((jac->RT_PiFull || (jac->RT_Pi[0] && jac->RT_Pi[1])) && (jac->ND_PiFull || (jac->ND_Pi[0] && jac->ND_Pi[1]))) { 3826bf688a0SCe Qin PetscInt i; 3836bf688a0SCe Qin HYPRE_ParCSRMatrix rt_parcsrfull, rt_parcsr[3]; 3846bf688a0SCe Qin HYPRE_ParCSRMatrix nd_parcsrfull, nd_parcsr[3]; 3856bf688a0SCe Qin if (jac->RT_PiFull) { 3866bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->RT_PiFull->data); 3876bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&rt_parcsrfull))); 3886bf688a0SCe Qin } else { 3896bf688a0SCe Qin rt_parcsrfull = NULL; 3906bf688a0SCe Qin } 3916bf688a0SCe Qin for (i=0;i<3;++i) { 3926bf688a0SCe Qin if (jac->RT_Pi[i]) { 3936bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->RT_Pi[i]->data); 3946bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&rt_parcsr[i]))); 3956bf688a0SCe Qin } else { 3966bf688a0SCe Qin rt_parcsr[i] = NULL; 3976bf688a0SCe Qin } 3986bf688a0SCe Qin } 3996bf688a0SCe Qin if (jac->ND_PiFull) { 4006bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_PiFull->data); 4016bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsrfull))); 4026bf688a0SCe Qin } else { 4036bf688a0SCe Qin nd_parcsrfull = NULL; 4046bf688a0SCe Qin } 4056bf688a0SCe Qin for (i=0;i<3;++i) { 4066bf688a0SCe Qin if (jac->ND_Pi[i]) { 4076bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_Pi[i]->data); 4086bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsr[i]))); 4096bf688a0SCe Qin } else { 4106bf688a0SCe Qin nd_parcsr[i] = NULL; 4116bf688a0SCe Qin } 4126bf688a0SCe Qin } 4136bf688a0SCe 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])); 4146bf688a0SCe Qin } 415863406b8SStefano Zampini } 41649a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 41749a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b,(void**)&bv)); 41849a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x,(void**)&xv)); 41922e51d31SStefano Zampini PetscStackCallStandard(jac->setup,(jac->hsolver,hmat,bv,xv)); 42016d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 42116d9e3a6SLisandro Dalcin } 42216d9e3a6SLisandro Dalcin 42316d9e3a6SLisandro Dalcin static PetscErrorCode PCApply_HYPRE(PC pc,Vec b,Vec x) 42416d9e3a6SLisandro Dalcin { 42516d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 42649a781f5SStefano Zampini Mat_HYPRE *hjac = (Mat_HYPRE*)(jac->hpmat->data); 42716d9e3a6SLisandro Dalcin PetscErrorCode ierr; 42816d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 42939accc25SStefano Zampini HYPRE_Complex *xv,*sxv; 43039accc25SStefano Zampini HYPRE_Complex *bv,*sbv; 43116d9e3a6SLisandro Dalcin HYPRE_ParVector jbv,jxv; 4324ddd07fcSJed Brown PetscInt hierr; 43316d9e3a6SLisandro Dalcin 43416d9e3a6SLisandro Dalcin PetscFunctionBegin; 435dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 43616d9e3a6SLisandro Dalcin if (!jac->applyrichardson) {ierr = VecSet(x,0.0);CHKERRQ(ierr);} 43739accc25SStefano Zampini ierr = VecGetArrayRead(b,(const PetscScalar **)&bv);CHKERRQ(ierr); 438589dcaf0SStefano Zampini ierr = VecGetArrayWrite(x,(PetscScalar **)&xv);CHKERRQ(ierr); 43939accc25SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->b,bv,sbv); 44058968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->x,xv,sxv); 44116d9e3a6SLisandro Dalcin 44249a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 44349a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b,(void**)&jbv)); 44449a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x,(void**)&jxv)); 445fd3f9acdSBarry Smith PetscStackCall("Hypre solve",hierr = (*jac->solve)(jac->hsolver,hmat,jbv,jxv); 44665e19b50SBarry Smith if (hierr && hierr != HYPRE_ERROR_CONV) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in HYPRE solver, error code %d",hierr); 447fd3f9acdSBarry Smith if (hierr) hypre__global_error = 0;); 44816d9e3a6SLisandro Dalcin 44923df4f25SStefano Zampini if (jac->setup == HYPRE_AMSSetup && jac->ams_beta_is_zero_part) { 4505ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSProjectOutGradients,(jac->hsolver,jxv)); 45121df291bSStefano Zampini } 45239accc25SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->b,sbv,bv); 45358968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->x,sxv,xv); 454589dcaf0SStefano Zampini ierr = VecRestoreArrayWrite(x,(PetscScalar **)&xv);CHKERRQ(ierr); 45539accc25SStefano Zampini ierr = VecRestoreArrayRead(b,(const PetscScalar **)&bv);CHKERRQ(ierr); 45616d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 45716d9e3a6SLisandro Dalcin } 45816d9e3a6SLisandro Dalcin 4598695de01SBarry Smith static PetscErrorCode PCReset_HYPRE(PC pc) 4608695de01SBarry Smith { 4618695de01SBarry Smith PC_HYPRE *jac = (PC_HYPRE*)pc->data; 4628695de01SBarry Smith PetscErrorCode ierr; 4638695de01SBarry Smith 4648695de01SBarry Smith PetscFunctionBegin; 46549a781f5SStefano Zampini ierr = MatDestroy(&jac->hpmat);CHKERRQ(ierr); 4665ac14e1cSStefano Zampini ierr = MatDestroy(&jac->G);CHKERRQ(ierr); 4675ac14e1cSStefano Zampini ierr = MatDestroy(&jac->C);CHKERRQ(ierr); 4685ac14e1cSStefano Zampini ierr = MatDestroy(&jac->alpha_Poisson);CHKERRQ(ierr); 4695ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 4706bf688a0SCe Qin ierr = MatDestroy(&jac->RT_PiFull);CHKERRQ(ierr); 4716bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[0]);CHKERRQ(ierr); 4726bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[1]);CHKERRQ(ierr); 4736bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[2]);CHKERRQ(ierr); 4746bf688a0SCe Qin ierr = MatDestroy(&jac->ND_PiFull);CHKERRQ(ierr); 4756bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[0]);CHKERRQ(ierr); 4766bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[1]);CHKERRQ(ierr); 4776bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[2]);CHKERRQ(ierr); 4788695de01SBarry Smith if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[0])); jac->coords[0] = NULL; 4798695de01SBarry Smith if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[1])); jac->coords[1] = NULL; 4808695de01SBarry Smith if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[2])); jac->coords[2] = NULL; 4818695de01SBarry Smith if (jac->constants[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[0])); jac->constants[0] = NULL; 4828695de01SBarry Smith if (jac->constants[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[1])); jac->constants[1] = NULL; 4838695de01SBarry Smith if (jac->constants[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[2])); jac->constants[2] = NULL; 484ce6a8a0dSJed Brown ierr = PCHYPREResetNearNullSpace_Private(pc);CHKERRQ(ierr); 4855ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_FALSE; 4865ac14e1cSStefano Zampini jac->dim = 0; 4878695de01SBarry Smith PetscFunctionReturn(0); 4888695de01SBarry Smith } 4898695de01SBarry Smith 49016d9e3a6SLisandro Dalcin static PetscErrorCode PCDestroy_HYPRE(PC pc) 49116d9e3a6SLisandro Dalcin { 49216d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 49316d9e3a6SLisandro Dalcin PetscErrorCode ierr; 49416d9e3a6SLisandro Dalcin 49516d9e3a6SLisandro Dalcin PetscFunctionBegin; 4968695de01SBarry Smith ierr = PCReset_HYPRE(pc);CHKERRQ(ierr); 49722e51d31SStefano Zampini if (jac->destroy) PetscStackCallStandard(jac->destroy,(jac->hsolver)); 498503cfb0cSBarry Smith ierr = PetscFree(jac->hypre_type);CHKERRQ(ierr); 499ffc4695bSBarry Smith if (jac->comm_hypre != MPI_COMM_NULL) {ierr = MPI_Comm_free(&(jac->comm_hypre));CHKERRMPI(ierr);} 500c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 50116d9e3a6SLisandro Dalcin 50216d9e3a6SLisandro Dalcin ierr = PetscObjectChangeTypeName((PetscObject)pc,0);CHKERRQ(ierr); 503bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetType_C",NULL);CHKERRQ(ierr); 504bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPREGetType_C",NULL);CHKERRQ(ierr); 5054cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetCoordinates_C",NULL);CHKERRQ(ierr); 5064cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteGradient_C",NULL);CHKERRQ(ierr); 507863406b8SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteCurl_C",NULL);CHKERRQ(ierr); 5086bf688a0SCe Qin ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetInterpolations_C",NULL);CHKERRQ(ierr); 5094cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetConstantEdgeVectors_C",NULL);CHKERRQ(ierr); 5105ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetPoissonMatrix_C",NULL);CHKERRQ(ierr); 511fd2dd295SFande Kong ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetInterpolations_C",NULL);CHKERRQ(ierr); 512fd2dd295SFande Kong ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetCoarseOperators_C",NULL);CHKERRQ(ierr); 51316d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 51416d9e3a6SLisandro Dalcin } 51516d9e3a6SLisandro Dalcin 51616d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 5174416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_Pilut(PetscOptionItems *PetscOptionsObject,PC pc) 51816d9e3a6SLisandro Dalcin { 51916d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 52016d9e3a6SLisandro Dalcin PetscErrorCode ierr; 521ace3abfcSBarry Smith PetscBool flag; 52216d9e3a6SLisandro Dalcin 52316d9e3a6SLisandro Dalcin PetscFunctionBegin; 524e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE Pilut Options");CHKERRQ(ierr); 52516d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_pilut_maxiter","Number of iterations","None",jac->maxiter,&jac->maxiter,&flag);CHKERRQ(ierr); 526fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetMaxIter,(jac->hsolver,jac->maxiter)); 52716d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_pilut_tol","Drop tolerance","None",jac->tol,&jac->tol,&flag);CHKERRQ(ierr); 528fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetDropTolerance,(jac->hsolver,jac->tol)); 52916d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_pilut_factorrowsize","FactorRowSize","None",jac->factorrowsize,&jac->factorrowsize,&flag);CHKERRQ(ierr); 530fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetFactorRowSize,(jac->hsolver,jac->factorrowsize)); 53116d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 53216d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 53316d9e3a6SLisandro Dalcin } 53416d9e3a6SLisandro Dalcin 53516d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_Pilut(PC pc,PetscViewer viewer) 53616d9e3a6SLisandro Dalcin { 53716d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 53816d9e3a6SLisandro Dalcin PetscErrorCode ierr; 539ace3abfcSBarry Smith PetscBool iascii; 54016d9e3a6SLisandro Dalcin 54116d9e3a6SLisandro Dalcin PetscFunctionBegin; 542251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 54316d9e3a6SLisandro Dalcin if (iascii) { 54416d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE Pilut preconditioning\n");CHKERRQ(ierr); 54516d9e3a6SLisandro Dalcin if (jac->maxiter != PETSC_DEFAULT) { 546efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," maximum number of iterations %d\n",jac->maxiter);CHKERRQ(ierr); 54716d9e3a6SLisandro Dalcin } else { 548efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," default maximum number of iterations \n");CHKERRQ(ierr); 54916d9e3a6SLisandro Dalcin } 55016d9e3a6SLisandro Dalcin if (jac->tol != PETSC_DEFAULT) { 551efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," drop tolerance %g\n",(double)jac->tol);CHKERRQ(ierr); 55216d9e3a6SLisandro Dalcin } else { 553efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," default drop tolerance \n");CHKERRQ(ierr); 55416d9e3a6SLisandro Dalcin } 55516d9e3a6SLisandro Dalcin if (jac->factorrowsize != PETSC_DEFAULT) { 556efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," factor row size %d\n",jac->factorrowsize);CHKERRQ(ierr); 55716d9e3a6SLisandro Dalcin } else { 558efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," default factor row size \n");CHKERRQ(ierr); 55916d9e3a6SLisandro Dalcin } 56016d9e3a6SLisandro Dalcin } 56116d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 56216d9e3a6SLisandro Dalcin } 56316d9e3a6SLisandro Dalcin 56416d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 565db966c6cSHong Zhang static PetscErrorCode PCSetFromOptions_HYPRE_Euclid(PetscOptionItems *PetscOptionsObject,PC pc) 566db966c6cSHong Zhang { 567db966c6cSHong Zhang PC_HYPRE *jac = (PC_HYPRE*)pc->data; 568db966c6cSHong Zhang PetscErrorCode ierr; 5698bf83915SBarry Smith PetscBool flag,eu_bj = jac->eu_bj ? PETSC_TRUE : PETSC_FALSE; 570db966c6cSHong Zhang 571db966c6cSHong Zhang PetscFunctionBegin; 572db966c6cSHong Zhang ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE Euclid Options");CHKERRQ(ierr); 573db966c6cSHong Zhang ierr = PetscOptionsInt("-pc_hypre_euclid_level","Factorization levels","None",jac->eu_level,&jac->eu_level,&flag);CHKERRQ(ierr); 574db966c6cSHong Zhang if (flag) PetscStackCallStandard(HYPRE_EuclidSetLevel,(jac->hsolver,jac->eu_level)); 5758bf83915SBarry Smith 5768bf83915SBarry Smith ierr = PetscOptionsReal("-pc_hypre_euclid_droptolerance","Drop tolerance for ILU(k) in Euclid","None",jac->eu_droptolerance,&jac->eu_droptolerance,&flag);CHKERRQ(ierr); 5778bf83915SBarry Smith if (flag) { 5788bf83915SBarry Smith PetscMPIInt size; 5798bf83915SBarry Smith 58055b25c41SPierre Jolivet ierr = MPI_Comm_size(PetscObjectComm((PetscObject)pc),&size);CHKERRMPI(ierr); 5818bf83915SBarry Smith if (size > 1) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"hypre's Euclid does not support a parallel drop tolerance"); 5828bf83915SBarry Smith PetscStackCallStandard(HYPRE_EuclidSetILUT,(jac->hsolver,jac->eu_droptolerance)); 5838bf83915SBarry Smith } 5848bf83915SBarry Smith 5858bf83915SBarry Smith ierr = PetscOptionsBool("-pc_hypre_euclid_bj", "Use Block Jacobi for ILU in Euclid", "None", eu_bj,&eu_bj,&flag);CHKERRQ(ierr); 5868bf83915SBarry Smith if (flag) { 5878bf83915SBarry Smith jac->eu_bj = eu_bj ? 1 : 0; 5888bf83915SBarry Smith PetscStackCallStandard(HYPRE_EuclidSetBJ,(jac->hsolver,jac->eu_bj)); 5898bf83915SBarry Smith } 590db966c6cSHong Zhang ierr = PetscOptionsTail();CHKERRQ(ierr); 591db966c6cSHong Zhang PetscFunctionReturn(0); 592db966c6cSHong Zhang } 593db966c6cSHong Zhang 594db966c6cSHong Zhang static PetscErrorCode PCView_HYPRE_Euclid(PC pc,PetscViewer viewer) 595db966c6cSHong Zhang { 596db966c6cSHong Zhang PC_HYPRE *jac = (PC_HYPRE*)pc->data; 597db966c6cSHong Zhang PetscErrorCode ierr; 598db966c6cSHong Zhang PetscBool iascii; 599db966c6cSHong Zhang 600db966c6cSHong Zhang PetscFunctionBegin; 601db966c6cSHong Zhang ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 602db966c6cSHong Zhang if (iascii) { 603db966c6cSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," HYPRE Euclid preconditioning\n");CHKERRQ(ierr); 604db966c6cSHong Zhang if (jac->eu_level != PETSC_DEFAULT) { 605db966c6cSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," factorization levels %d\n",jac->eu_level);CHKERRQ(ierr); 606db966c6cSHong Zhang } else { 607db966c6cSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," default factorization levels \n");CHKERRQ(ierr); 608db966c6cSHong Zhang } 6098bf83915SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," drop tolerance %g\n",(double)jac->eu_droptolerance);CHKERRQ(ierr); 6108bf83915SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," use Block-Jacobi? %D\n",jac->eu_bj);CHKERRQ(ierr); 611db966c6cSHong Zhang } 612db966c6cSHong Zhang PetscFunctionReturn(0); 613db966c6cSHong Zhang } 614db966c6cSHong Zhang 615db966c6cSHong Zhang /* --------------------------------------------------------------------------------------------*/ 61616d9e3a6SLisandro Dalcin 61716d9e3a6SLisandro Dalcin static PetscErrorCode PCApplyTranspose_HYPRE_BoomerAMG(PC pc,Vec b,Vec x) 61816d9e3a6SLisandro Dalcin { 61916d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 62049a781f5SStefano Zampini Mat_HYPRE *hjac = (Mat_HYPRE*)(jac->hpmat->data); 62116d9e3a6SLisandro Dalcin PetscErrorCode ierr; 62216d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 62339accc25SStefano Zampini HYPRE_Complex *xv,*bv; 62439accc25SStefano Zampini HYPRE_Complex *sbv,*sxv; 62516d9e3a6SLisandro Dalcin HYPRE_ParVector jbv,jxv; 6264ddd07fcSJed Brown PetscInt hierr; 62716d9e3a6SLisandro Dalcin 62816d9e3a6SLisandro Dalcin PetscFunctionBegin; 629dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 63016d9e3a6SLisandro Dalcin ierr = VecSet(x,0.0);CHKERRQ(ierr); 63139accc25SStefano Zampini ierr = VecGetArrayRead(b,(const PetscScalar**)&bv);CHKERRQ(ierr); 63239accc25SStefano Zampini ierr = VecGetArray(x,(PetscScalar**)&xv);CHKERRQ(ierr); 63339accc25SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->b,bv,sbv); 63458968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->x,xv,sxv); 63516d9e3a6SLisandro Dalcin 63649a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 63749a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b,(void**)&jbv)); 63849a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x,(void**)&jxv)); 63916d9e3a6SLisandro Dalcin 64016d9e3a6SLisandro Dalcin hierr = HYPRE_BoomerAMGSolveT(jac->hsolver,hmat,jbv,jxv); 64116d9e3a6SLisandro Dalcin /* error code of 1 in BoomerAMG merely means convergence not achieved */ 642e32f2f54SBarry Smith if (hierr && (hierr != 1)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in HYPRE solver, error code %d",hierr); 64316d9e3a6SLisandro Dalcin if (hierr) hypre__global_error = 0; 64416d9e3a6SLisandro Dalcin 64558968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->b,sbv,bv); 64658968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->x,sxv,xv); 64739accc25SStefano Zampini ierr = VecRestoreArray(x,(PetscScalar**)&xv);CHKERRQ(ierr); 64839accc25SStefano Zampini ierr = VecRestoreArrayRead(b,(const PetscScalar**)&bv);CHKERRQ(ierr); 64916d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 65016d9e3a6SLisandro Dalcin } 65116d9e3a6SLisandro Dalcin 652a669f990SJed Brown /* static array length */ 653a669f990SJed Brown #define ALEN(a) (sizeof(a)/sizeof((a)[0])) 654a669f990SJed Brown 65516d9e3a6SLisandro Dalcin static const char *HYPREBoomerAMGCycleType[] = {"","V","W"}; 6560f1074feSSatish Balay static const char *HYPREBoomerAMGCoarsenType[] = {"CLJP","Ruge-Stueben","","modifiedRuge-Stueben","","","Falgout", "", "PMIS", "", "HMIS"}; 65716d9e3a6SLisandro Dalcin static const char *HYPREBoomerAMGMeasureType[] = {"local","global"}; 65865de4495SJed Brown /* The following corresponds to HYPRE_BoomerAMGSetRelaxType which has many missing numbers in the enum */ 6596a251517SEike Mueller static const char *HYPREBoomerAMGSmoothType[] = {"Schwarz-smoothers","Pilut","ParaSails","Euclid"}; 66065de4495SJed Brown static const char *HYPREBoomerAMGRelaxType[] = {"Jacobi","sequential-Gauss-Seidel","seqboundary-Gauss-Seidel","SOR/Jacobi","backward-SOR/Jacobi", 66165de4495SJed Brown "" /* [5] hybrid chaotic Gauss-Seidel (works only with OpenMP) */,"symmetric-SOR/Jacobi", 66265de4495SJed Brown "" /* 7 */,"l1scaled-SOR/Jacobi","Gaussian-elimination", 6637b7fa87dSPierre Jolivet "" /* 10 */, "" /* 11 */, "" /* 12 */, "l1-Gauss-Seidel" /* nonsymmetric */, "backward-l1-Gauss-Seidel" /* nonsymmetric */, 66465de4495SJed Brown "CG" /* non-stationary */,"Chebyshev","FCF-Jacobi","l1scaled-Jacobi"}; 6650f1074feSSatish Balay static const char *HYPREBoomerAMGInterpType[] = {"classical", "", "", "direct", "multipass", "multipass-wts", "ext+i", 666589dcaf0SStefano Zampini "ext+i-cc", "standard", "standard-wts", "block", "block-wtd", "FF", "FF1", 667589dcaf0SStefano Zampini "ext", "ad-wts", "ext-mm", "ext+i-mm", "ext+e-mm"}; 6684416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_BoomerAMG(PetscOptionItems *PetscOptionsObject,PC pc) 66916d9e3a6SLisandro Dalcin { 67016d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 67116d9e3a6SLisandro Dalcin PetscErrorCode ierr; 67222e51d31SStefano Zampini PetscInt bs,n,indx,level; 673ace3abfcSBarry Smith PetscBool flg, tmp_truth; 67416d9e3a6SLisandro Dalcin double tmpdbl, twodbl[2]; 675589dcaf0SStefano Zampini const char *symtlist[] = {"nonsymmetric","SPD","nonsymmetric,SPD"}; 67616d9e3a6SLisandro Dalcin 67716d9e3a6SLisandro Dalcin PetscFunctionBegin; 678e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE BoomerAMG Options");CHKERRQ(ierr); 6794336a9eeSBarry Smith ierr = PetscOptionsEList("-pc_hypre_boomeramg_cycle_type","Cycle type","None",HYPREBoomerAMGCycleType+1,2,HYPREBoomerAMGCycleType[jac->cycletype],&indx,&flg);CHKERRQ(ierr); 68016d9e3a6SLisandro Dalcin if (flg) { 6814336a9eeSBarry Smith jac->cycletype = indx+1; 682fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleType,(jac->hsolver,jac->cycletype)); 68316d9e3a6SLisandro Dalcin } 68416d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_max_levels","Number of levels (of grids) allowed","None",jac->maxlevels,&jac->maxlevels,&flg);CHKERRQ(ierr); 68516d9e3a6SLisandro Dalcin if (flg) { 686ce94432eSBarry Smith if (jac->maxlevels < 2) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Number of levels %d must be at least two",jac->maxlevels); 687fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxLevels,(jac->hsolver,jac->maxlevels)); 68816d9e3a6SLisandro Dalcin } 68916d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_max_iter","Maximum iterations used PER hypre call","None",jac->maxiter,&jac->maxiter,&flg);CHKERRQ(ierr); 69016d9e3a6SLisandro Dalcin if (flg) { 691ce94432eSBarry Smith if (jac->maxiter < 1) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Number of iterations %d must be at least one",jac->maxiter); 692fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 69316d9e3a6SLisandro Dalcin } 69439accc25SStefano 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); 69516d9e3a6SLisandro Dalcin if (flg) { 69657622a8eSBarry 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); 697fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 69816d9e3a6SLisandro Dalcin } 69922e51d31SStefano Zampini bs = 1; 70022e51d31SStefano Zampini if (pc->pmat) { 70122e51d31SStefano Zampini ierr = MatGetBlockSize(pc->pmat,&bs);CHKERRQ(ierr); 70222e51d31SStefano Zampini } 70322e51d31SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_numfunctions","Number of functions","HYPRE_BoomerAMGSetNumFunctions",bs,&bs,&flg);CHKERRQ(ierr); 70422e51d31SStefano Zampini if (flg) { 70522e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetNumFunctions,(jac->hsolver,bs)); 70622e51d31SStefano Zampini } 70716d9e3a6SLisandro Dalcin 70839accc25SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_truncfactor","Truncation factor for interpolation (0=no truncation)","None",jac->truncfactor,&jac->truncfactor,&flg);CHKERRQ(ierr); 70916d9e3a6SLisandro Dalcin if (flg) { 71057622a8eSBarry 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); 711fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTruncFactor,(jac->hsolver,jac->truncfactor)); 71216d9e3a6SLisandro Dalcin } 71316d9e3a6SLisandro Dalcin 7140f1074feSSatish 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); 7150f1074feSSatish Balay if (flg) { 71657622a8eSBarry Smith if (jac->pmax < 0) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"P_max %g must be greater than or equal to zero",(double)jac->pmax); 717fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetPMaxElmts,(jac->hsolver,jac->pmax)); 7180f1074feSSatish Balay } 7190f1074feSSatish Balay 7200f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_agg_nl","Number of levels of aggressive coarsening","None",jac->agg_nl,&jac->agg_nl,&flg);CHKERRQ(ierr); 7210f1074feSSatish Balay if (flg) { 72257622a8eSBarry Smith if (jac->agg_nl < 0) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Number of levels %g must be greater than or equal to zero",(double)jac->agg_nl); 7230f1074feSSatish Balay 724fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetAggNumLevels,(jac->hsolver,jac->agg_nl)); 7250f1074feSSatish Balay } 7260f1074feSSatish Balay 7270f1074feSSatish 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); 7280f1074feSSatish Balay if (flg) { 72957622a8eSBarry Smith if (jac->agg_num_paths < 1) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Number of paths %g must be greater than or equal to 1",(double)jac->agg_num_paths); 7300f1074feSSatish Balay 731fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumPaths,(jac->hsolver,jac->agg_num_paths)); 7320f1074feSSatish Balay } 7330f1074feSSatish Balay 73439accc25SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_strong_threshold","Threshold for being strongly connected","None",jac->strongthreshold,&jac->strongthreshold,&flg);CHKERRQ(ierr); 73516d9e3a6SLisandro Dalcin if (flg) { 73657622a8eSBarry 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); 737fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThreshold,(jac->hsolver,jac->strongthreshold)); 73816d9e3a6SLisandro Dalcin } 73939accc25SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_max_row_sum","Maximum row sum","None",jac->maxrowsum,&jac->maxrowsum,&flg);CHKERRQ(ierr); 74016d9e3a6SLisandro Dalcin if (flg) { 74157622a8eSBarry 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); 74257622a8eSBarry 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); 743fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxRowSum,(jac->hsolver,jac->maxrowsum)); 74416d9e3a6SLisandro Dalcin } 74516d9e3a6SLisandro Dalcin 74616d9e3a6SLisandro Dalcin /* Grid sweeps */ 7470f1074feSSatish 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); 74816d9e3a6SLisandro Dalcin if (flg) { 749fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumSweeps,(jac->hsolver,indx)); 75016d9e3a6SLisandro Dalcin /* modify the jac structure so we can view the updated options with PC_View */ 75116d9e3a6SLisandro Dalcin jac->gridsweeps[0] = indx; 7520f1074feSSatish Balay jac->gridsweeps[1] = indx; 7530f1074feSSatish Balay /*defaults coarse to 1 */ 7540f1074feSSatish Balay jac->gridsweeps[2] = 1; 75516d9e3a6SLisandro Dalcin } 7565272c319SBarry 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); 7575272c319SBarry Smith if (flg) { 7585272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNodal,(jac->hsolver,jac->nodal_coarsening)); 7595272c319SBarry Smith } 76022e51d31SStefano 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); 76122e51d31SStefano Zampini if (flg) { 76222e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetNodalDiag,(jac->hsolver,jac->nodal_coarsening_diag)); 76322e51d31SStefano Zampini } 764cbc39033SBarry 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); 7655272c319SBarry Smith if (flg) { 7665272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpVecVariant,(jac->hsolver,jac->vec_interp_variant)); 7675272c319SBarry Smith } 76822e51d31SStefano 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); 76922e51d31SStefano Zampini if (flg) { 77022e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetInterpVecQMax,(jac->hsolver,jac->vec_interp_qmax)); 77122e51d31SStefano Zampini } 77222e51d31SStefano 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); 77322e51d31SStefano Zampini if (flg) { 77422e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothInterpVectors,(jac->hsolver,jac->vec_interp_smooth)); 77522e51d31SStefano Zampini } 77622e51d31SStefano 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); 77722e51d31SStefano Zampini if (flg) { 77822e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetInterpRefine,(jac->hsolver,jac->interp_refine)); 77922e51d31SStefano Zampini } 7800f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_down","Number of sweeps for the down cycles","None",jac->gridsweeps[0], &indx,&flg);CHKERRQ(ierr); 78116d9e3a6SLisandro Dalcin if (flg) { 782fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 1)); 7830f1074feSSatish Balay jac->gridsweeps[0] = indx; 78416d9e3a6SLisandro Dalcin } 78516d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_up","Number of sweeps for the up cycles","None",jac->gridsweeps[1],&indx,&flg);CHKERRQ(ierr); 78616d9e3a6SLisandro Dalcin if (flg) { 787fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 2)); 7880f1074feSSatish Balay jac->gridsweeps[1] = indx; 78916d9e3a6SLisandro Dalcin } 7900f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_coarse","Number of sweeps for the coarse level","None",jac->gridsweeps[2],&indx,&flg);CHKERRQ(ierr); 79116d9e3a6SLisandro Dalcin if (flg) { 792fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 3)); 7930f1074feSSatish Balay jac->gridsweeps[2] = indx; 79416d9e3a6SLisandro Dalcin } 79516d9e3a6SLisandro Dalcin 7966a251517SEike Mueller /* Smooth type */ 797*1e1ea65dSPierre Jolivet ierr = PetscOptionsEList("-pc_hypre_boomeramg_smooth_type","Enable more complex smoothers","None",HYPREBoomerAMGSmoothType,ALEN(HYPREBoomerAMGSmoothType),HYPREBoomerAMGSmoothType[0],&indx,&flg);CHKERRQ(ierr); 7986a251517SEike Mueller if (flg) { 7996a251517SEike Mueller jac->smoothtype = indx; 8006a251517SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothType,(jac->hsolver,indx+6)); 8018131ecf7SEike Mueller jac->smoothnumlevels = 25; 8028131ecf7SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,25)); 8038131ecf7SEike Mueller } 8048131ecf7SEike Mueller 8058131ecf7SEike Mueller /* Number of smoothing levels */ 8068131ecf7SEike 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); 8078131ecf7SEike Mueller if (flg && (jac->smoothtype != -1)) { 8088131ecf7SEike Mueller jac->smoothnumlevels = indx; 8098131ecf7SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,indx)); 8106a251517SEike Mueller } 8116a251517SEike Mueller 8121810e44eSEike Mueller /* Number of levels for ILU(k) for Euclid */ 8131810e44eSEike Mueller ierr = PetscOptionsInt("-pc_hypre_boomeramg_eu_level","Number of levels for ILU(k) in Euclid smoother","None",0,&indx,&flg);CHKERRQ(ierr); 8141810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 8151810e44eSEike Mueller jac->eu_level = indx; 8161810e44eSEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuLevel,(jac->hsolver,indx)); 8171810e44eSEike Mueller } 8181810e44eSEike Mueller 8191810e44eSEike Mueller /* Filter for ILU(k) for Euclid */ 8201810e44eSEike Mueller double droptolerance; 82139accc25SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_eu_droptolerance","Drop tolerance for ILU(k) in Euclid smoother","None",0,&droptolerance,&flg);CHKERRQ(ierr); 8221810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 8231810e44eSEike Mueller jac->eu_droptolerance = droptolerance; 8241810e44eSEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuLevel,(jac->hsolver,droptolerance)); 8251810e44eSEike Mueller } 8261810e44eSEike Mueller 8271810e44eSEike Mueller /* Use Block Jacobi ILUT for Euclid */ 8281810e44eSEike Mueller ierr = PetscOptionsBool("-pc_hypre_boomeramg_eu_bj", "Use Block Jacobi for ILU in Euclid smoother?", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 8291810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 8301810e44eSEike Mueller jac->eu_bj = tmp_truth; 831493fc9d9SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuBJ,(jac->hsolver,jac->eu_bj)); 8321810e44eSEike Mueller } 8331810e44eSEike Mueller 83416d9e3a6SLisandro Dalcin /* Relax type */ 835a669f990SJed 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); 83616d9e3a6SLisandro Dalcin if (flg) { 8370f1074feSSatish Balay jac->relaxtype[0] = jac->relaxtype[1] = indx; 838fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxType,(jac->hsolver, indx)); 8390f1074feSSatish Balay /* by default, coarse type set to 9 */ 8400f1074feSSatish Balay jac->relaxtype[2] = 9; 841ddbeb582SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, 9, 3)); 84216d9e3a6SLisandro Dalcin } 843a669f990SJed 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); 84416d9e3a6SLisandro Dalcin if (flg) { 84516d9e3a6SLisandro Dalcin jac->relaxtype[0] = indx; 846fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 1)); 84716d9e3a6SLisandro Dalcin } 848a669f990SJed 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); 84916d9e3a6SLisandro Dalcin if (flg) { 8500f1074feSSatish Balay jac->relaxtype[1] = indx; 851fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 2)); 85216d9e3a6SLisandro Dalcin } 853a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_relax_type_coarse","Relax type on coarse grid","None",HYPREBoomerAMGRelaxType,ALEN(HYPREBoomerAMGRelaxType),HYPREBoomerAMGRelaxType[9],&indx,&flg);CHKERRQ(ierr); 85416d9e3a6SLisandro Dalcin if (flg) { 8550f1074feSSatish Balay jac->relaxtype[2] = indx; 856fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 3)); 85716d9e3a6SLisandro Dalcin } 85816d9e3a6SLisandro Dalcin 85916d9e3a6SLisandro Dalcin /* Relaxation Weight */ 86016d9e3a6SLisandro 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); 86116d9e3a6SLisandro Dalcin if (flg) { 862fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxWt,(jac->hsolver,tmpdbl)); 86316d9e3a6SLisandro Dalcin jac->relaxweight = tmpdbl; 86416d9e3a6SLisandro Dalcin } 86516d9e3a6SLisandro Dalcin 86616d9e3a6SLisandro Dalcin n = 2; 86716d9e3a6SLisandro Dalcin twodbl[0] = twodbl[1] = 1.0; 86816d9e3a6SLisandro 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); 86916d9e3a6SLisandro Dalcin if (flg) { 87016d9e3a6SLisandro Dalcin if (n == 2) { 87116d9e3a6SLisandro Dalcin indx = (int)PetscAbsReal(twodbl[1]); 872fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetLevelRelaxWt,(jac->hsolver,twodbl[0],indx)); 873ce94432eSBarry 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); 87416d9e3a6SLisandro Dalcin } 87516d9e3a6SLisandro Dalcin 87616d9e3a6SLisandro Dalcin /* Outer relaxation Weight */ 87716d9e3a6SLisandro 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); 87816d9e3a6SLisandro Dalcin if (flg) { 879fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetOuterWt,(jac->hsolver, tmpdbl)); 88016d9e3a6SLisandro Dalcin jac->outerrelaxweight = tmpdbl; 88116d9e3a6SLisandro Dalcin } 88216d9e3a6SLisandro Dalcin 88316d9e3a6SLisandro Dalcin n = 2; 88416d9e3a6SLisandro Dalcin twodbl[0] = twodbl[1] = 1.0; 88516d9e3a6SLisandro 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); 88616d9e3a6SLisandro Dalcin if (flg) { 88716d9e3a6SLisandro Dalcin if (n == 2) { 88816d9e3a6SLisandro Dalcin indx = (int)PetscAbsReal(twodbl[1]); 889fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetLevelOuterWt,(jac->hsolver, twodbl[0], indx)); 890ce94432eSBarry 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); 89116d9e3a6SLisandro Dalcin } 89216d9e3a6SLisandro Dalcin 89316d9e3a6SLisandro Dalcin /* the Relax Order */ 894acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_boomeramg_no_CF", "Do not use CF-relaxation", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 89516d9e3a6SLisandro Dalcin 8968afaa268SBarry Smith if (flg && tmp_truth) { 89716d9e3a6SLisandro Dalcin jac->relaxorder = 0; 898fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxOrder,(jac->hsolver, jac->relaxorder)); 89916d9e3a6SLisandro Dalcin } 900a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_measure_type","Measure type","None",HYPREBoomerAMGMeasureType,ALEN(HYPREBoomerAMGMeasureType),HYPREBoomerAMGMeasureType[0],&indx,&flg);CHKERRQ(ierr); 90116d9e3a6SLisandro Dalcin if (flg) { 90216d9e3a6SLisandro Dalcin jac->measuretype = indx; 903fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMeasureType,(jac->hsolver,jac->measuretype)); 90416d9e3a6SLisandro Dalcin } 9050f1074feSSatish Balay /* update list length 3/07 */ 906a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_coarsen_type","Coarsen type","None",HYPREBoomerAMGCoarsenType,ALEN(HYPREBoomerAMGCoarsenType),HYPREBoomerAMGCoarsenType[6],&indx,&flg);CHKERRQ(ierr); 90716d9e3a6SLisandro Dalcin if (flg) { 90816d9e3a6SLisandro Dalcin jac->coarsentype = indx; 909fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCoarsenType,(jac->hsolver,jac->coarsentype)); 91016d9e3a6SLisandro Dalcin } 9110f1074feSSatish Balay 912589dcaf0SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_max_coarse_size", "Maximum size of coarsest grid", "None", jac->maxc, &jac->maxc, &flg);CHKERRQ(ierr); 913589dcaf0SStefano Zampini if (flg) { 914589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetMaxCoarseSize,(jac->hsolver, jac->maxc)); 915589dcaf0SStefano Zampini } 916589dcaf0SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_min_coarse_size", "Minimum size of coarsest grid", "None", jac->minc, &jac->minc, &flg);CHKERRQ(ierr); 917589dcaf0SStefano Zampini if (flg) { 918589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetMinCoarseSize,(jac->hsolver, jac->minc)); 919589dcaf0SStefano Zampini } 920589dcaf0SStefano Zampini 921589dcaf0SStefano Zampini /* AIR */ 922589dcaf0SStefano Zampini #if PETSC_PKG_HYPRE_VERSION_GE(2,18,0) 923589dcaf0SStefano 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); 924589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetRestriction,(jac->hsolver,jac->Rtype)); 925589dcaf0SStefano Zampini if (jac->Rtype) { 926589dcaf0SStefano 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 */ 927589dcaf0SStefano Zampini 928589dcaf0SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_strongthresholdR","Threshold for R","None",jac->Rstrongthreshold,&jac->Rstrongthreshold,NULL);CHKERRQ(ierr); 929589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThresholdR,(jac->hsolver,jac->Rstrongthreshold)); 930589dcaf0SStefano Zampini 931589dcaf0SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_boomeramg_filterthresholdR","Filter threshold for R","None",jac->Rfilterthreshold,&jac->Rfilterthreshold,NULL);CHKERRQ(ierr); 932589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetFilterThresholdR,(jac->hsolver,jac->Rfilterthreshold)); 933589dcaf0SStefano Zampini 934589dcaf0SStefano 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); 935589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetADropTol,(jac->hsolver,jac->Adroptol)); 936589dcaf0SStefano Zampini 937589dcaf0SStefano 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); 938589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetADropType,(jac->hsolver,jac->Adroptype)); 939589dcaf0SStefano Zampini } 940589dcaf0SStefano Zampini #endif 941589dcaf0SStefano Zampini 9420f1074feSSatish Balay /* new 3/07 */ 943a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_interp_type","Interpolation type","None",HYPREBoomerAMGInterpType,ALEN(HYPREBoomerAMGInterpType),HYPREBoomerAMGInterpType[0],&indx,&flg);CHKERRQ(ierr); 944589dcaf0SStefano Zampini if (flg || jac->Rtype) { 945589dcaf0SStefano Zampini if (flg) jac->interptype = indx; 946fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpType,(jac->hsolver,jac->interptype)); 9470f1074feSSatish Balay } 9480f1074feSSatish Balay 949b96a4a96SBarry Smith ierr = PetscOptionsName("-pc_hypre_boomeramg_print_statistics","Print statistics","None",&flg);CHKERRQ(ierr); 95016d9e3a6SLisandro Dalcin if (flg) { 951b96a4a96SBarry Smith level = 3; 9520298fd71SBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_print_statistics","Print statistics","None",level,&level,NULL);CHKERRQ(ierr); 9532fa5cd67SKarl Rupp 954b96a4a96SBarry Smith jac->printstatistics = PETSC_TRUE; 955fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetPrintLevel,(jac->hsolver,level)); 9562ae77aedSBarry Smith } 9572ae77aedSBarry Smith 958b96a4a96SBarry Smith ierr = PetscOptionsName("-pc_hypre_boomeramg_print_debug","Print debug information","None",&flg);CHKERRQ(ierr); 9592ae77aedSBarry Smith if (flg) { 960b96a4a96SBarry Smith level = 3; 9610298fd71SBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_print_debug","Print debug information","None",level,&level,NULL);CHKERRQ(ierr); 9622fa5cd67SKarl Rupp 963b96a4a96SBarry Smith jac->printstatistics = PETSC_TRUE; 964fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetDebugFlag,(jac->hsolver,level)); 96516d9e3a6SLisandro Dalcin } 9668f87f92bSBarry Smith 967acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_boomeramg_nodal_relaxation", "Nodal relaxation via Schwarz", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 9688f87f92bSBarry Smith if (flg && tmp_truth) { 9698f87f92bSBarry Smith PetscInt tmp_int; 9708f87f92bSBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_nodal_relaxation", "Nodal relaxation via Schwarz", "None",jac->nodal_relax_levels,&tmp_int,&flg);CHKERRQ(ierr); 9718f87f92bSBarry Smith if (flg) jac->nodal_relax_levels = tmp_int; 972fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothType,(jac->hsolver,6)); 973fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetDomainType,(jac->hsolver,1)); 974fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetOverlap,(jac->hsolver,0)); 975fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,jac->nodal_relax_levels)); 9768f87f92bSBarry Smith } 9778f87f92bSBarry Smith 978589dcaf0SStefano Zampini ierr = PetscOptionsBool("-pc_hypre_boomeramg_keeptranspose", "Avoid transpose matvecs in preconditioner application", "None", jac->keeptranspose, &jac->keeptranspose, NULL);CHKERRQ(ierr); 979589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetKeepTranspose,(jac->hsolver,jac->keeptranspose ? 1 : 0)); 980589dcaf0SStefano Zampini 981589dcaf0SStefano Zampini /* options for ParaSails solvers */ 982589dcaf0SStefano Zampini ierr = PetscOptionsEList("-pc_hypre_boomeramg_parasails_sym","Symmetry of matrix and preconditioner","None",symtlist,ALEN(symtlist),symtlist[0],&indx,&flg);CHKERRQ(ierr); 983589dcaf0SStefano Zampini if (flg) { 984589dcaf0SStefano Zampini jac->symt = indx; 985589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetSym,(jac->hsolver,jac->symt)); 986589dcaf0SStefano Zampini } 987589dcaf0SStefano Zampini 98816d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 98916d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 99016d9e3a6SLisandro Dalcin } 99116d9e3a6SLisandro Dalcin 992ace3abfcSBarry 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) 99316d9e3a6SLisandro Dalcin { 99416d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 99516d9e3a6SLisandro Dalcin PetscErrorCode ierr; 9962cf14000SStefano Zampini HYPRE_Int oits; 99716d9e3a6SLisandro Dalcin 99816d9e3a6SLisandro Dalcin PetscFunctionBegin; 999dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 1000fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,its*jac->maxiter)); 1001fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,rtol)); 100216d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_TRUE; 100316d9e3a6SLisandro Dalcin ierr = PCApply_HYPRE(pc,b,y);CHKERRQ(ierr); 100416d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_FALSE; 10052cf14000SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGGetNumIterations,(jac->hsolver,&oits)); 10064d0a8057SBarry Smith *outits = oits; 10074d0a8057SBarry Smith if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 10084d0a8057SBarry Smith else *reason = PCRICHARDSON_CONVERGED_RTOL; 1009fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 1010fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 101116d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 101216d9e3a6SLisandro Dalcin } 101316d9e3a6SLisandro Dalcin 101416d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_BoomerAMG(PC pc,PetscViewer viewer) 101516d9e3a6SLisandro Dalcin { 101616d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 101716d9e3a6SLisandro Dalcin PetscErrorCode ierr; 1018ace3abfcSBarry Smith PetscBool iascii; 101916d9e3a6SLisandro Dalcin 102016d9e3a6SLisandro Dalcin PetscFunctionBegin; 1021251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 102216d9e3a6SLisandro Dalcin if (iascii) { 102316d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG preconditioning\n");CHKERRQ(ierr); 1024efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Cycle type %s\n",HYPREBoomerAMGCycleType[jac->cycletype]);CHKERRQ(ierr); 102522e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Maximum number of levels %D\n",jac->maxlevels);CHKERRQ(ierr); 102622e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Maximum number of iterations PER hypre call %D\n",jac->maxiter);CHKERRQ(ierr); 1027efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Convergence tolerance PER hypre call %g\n",(double)jac->tol);CHKERRQ(ierr); 1028efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Threshold for strong coupling %g\n",(double)jac->strongthreshold);CHKERRQ(ierr); 1029efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Interpolation truncation factor %g\n",(double)jac->truncfactor);CHKERRQ(ierr); 103022e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Interpolation: max elements per row %D\n",jac->pmax);CHKERRQ(ierr); 103122e51d31SStefano Zampini if (jac->interp_refine) { 103222e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Interpolation: number of steps of weighted refinement %D\n",jac->interp_refine);CHKERRQ(ierr); 103322e51d31SStefano Zampini } 103422e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Number of levels of aggressive coarsening %D\n",jac->agg_nl);CHKERRQ(ierr); 103522e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Number of paths for aggressive coarsening %D\n",jac->agg_num_paths);CHKERRQ(ierr); 10360f1074feSSatish Balay 1037efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Maximum row sums %g\n",(double)jac->maxrowsum);CHKERRQ(ierr); 103816d9e3a6SLisandro Dalcin 103922e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Sweeps down %D\n",jac->gridsweeps[0]);CHKERRQ(ierr); 104022e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Sweeps up %D\n",jac->gridsweeps[1]);CHKERRQ(ierr); 104122e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Sweeps on coarse %D\n",jac->gridsweeps[2]);CHKERRQ(ierr); 104216d9e3a6SLisandro Dalcin 1043efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax down %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[0]]);CHKERRQ(ierr); 1044efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax up %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[1]]);CHKERRQ(ierr); 1045efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax on coarse %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[2]]);CHKERRQ(ierr); 104616d9e3a6SLisandro Dalcin 1047efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax weight (all) %g\n",(double)jac->relaxweight);CHKERRQ(ierr); 1048efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Outer relax weight (all) %g\n",(double)jac->outerrelaxweight);CHKERRQ(ierr); 104916d9e3a6SLisandro Dalcin 105016d9e3a6SLisandro Dalcin if (jac->relaxorder) { 1051efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Using CF-relaxation\n");CHKERRQ(ierr); 105216d9e3a6SLisandro Dalcin } else { 1053efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Not using CF-relaxation\n");CHKERRQ(ierr); 105416d9e3a6SLisandro Dalcin } 10556a251517SEike Mueller if (jac->smoothtype!=-1) { 1056efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Smooth type %s\n",HYPREBoomerAMGSmoothType[jac->smoothtype]);CHKERRQ(ierr); 105722e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Smooth num levels %D\n",jac->smoothnumlevels);CHKERRQ(ierr); 10587e352d70SEike Mueller } else { 1059efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Not using more complex smoothers.\n");CHKERRQ(ierr); 10601810e44eSEike Mueller } 10611810e44eSEike Mueller if (jac->smoothtype==3) { 106222e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Euclid ILU(k) levels %D\n",jac->eu_level);CHKERRQ(ierr); 106322e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Euclid ILU(k) drop tolerance %g\n",(double)jac->eu_droptolerance);CHKERRQ(ierr); 106422e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Euclid ILU use Block-Jacobi? %D\n",jac->eu_bj);CHKERRQ(ierr); 10656a251517SEike Mueller } 1066efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Measure type %s\n",HYPREBoomerAMGMeasureType[jac->measuretype]);CHKERRQ(ierr); 1067efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Coarsen type %s\n",HYPREBoomerAMGCoarsenType[jac->coarsentype]);CHKERRQ(ierr); 1068589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Interpolation type %s\n",jac->interptype != 100 ? HYPREBoomerAMGInterpType[jac->interptype] : "1pt");CHKERRQ(ierr); 10695272c319SBarry Smith if (jac->nodal_coarsening) { 107084c7a2fdSPierre Jolivet ierr = PetscViewerASCIIPrintf(viewer," Using nodal coarsening with HYPRE_BOOMERAMGSetNodal() %D\n",jac->nodal_coarsening);CHKERRQ(ierr); 10715272c319SBarry Smith } 10725272c319SBarry Smith if (jac->vec_interp_variant) { 1073efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE_BoomerAMGSetInterpVecVariant() %D\n",jac->vec_interp_variant);CHKERRQ(ierr); 107422e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE_BoomerAMGSetInterpVecQMax() %D\n",jac->vec_interp_qmax);CHKERRQ(ierr); 107522e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE_BoomerAMGSetSmoothInterpVectors() %d\n",jac->vec_interp_smooth);CHKERRQ(ierr); 10768f87f92bSBarry Smith } 10778f87f92bSBarry Smith if (jac->nodal_relax) { 107822e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Using nodal relaxation via Schwarz smoothing on levels %D\n",jac->nodal_relax_levels);CHKERRQ(ierr); 10798f87f92bSBarry Smith } 1080589dcaf0SStefano Zampini 1081589dcaf0SStefano Zampini /* AIR */ 1082589dcaf0SStefano Zampini if (jac->Rtype) { 1083589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Using approximate ideal restriction type %D\n",jac->Rtype);CHKERRQ(ierr); 1084589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Threshold for R %g\n",(double)jac->Rstrongthreshold);CHKERRQ(ierr); 1085589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Filter for R %g\n",(double)jac->Rfilterthreshold);CHKERRQ(ierr); 1086589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," A drop tolerance %g\n",(double)jac->Adroptol);CHKERRQ(ierr); 1087589dcaf0SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," A drop type %D\n",jac->Adroptype);CHKERRQ(ierr); 1088589dcaf0SStefano Zampini } 108916d9e3a6SLisandro Dalcin } 109016d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 109116d9e3a6SLisandro Dalcin } 109216d9e3a6SLisandro Dalcin 109316d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 10944416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_ParaSails(PetscOptionItems *PetscOptionsObject,PC pc) 109516d9e3a6SLisandro Dalcin { 109616d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 109716d9e3a6SLisandro Dalcin PetscErrorCode ierr; 10984ddd07fcSJed Brown PetscInt indx; 1099ace3abfcSBarry Smith PetscBool flag; 110016d9e3a6SLisandro Dalcin const char *symtlist[] = {"nonsymmetric","SPD","nonsymmetric,SPD"}; 110116d9e3a6SLisandro Dalcin 110216d9e3a6SLisandro Dalcin PetscFunctionBegin; 1103e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE ParaSails Options");CHKERRQ(ierr); 110416d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_parasails_nlevels","Number of number of levels","None",jac->nlevels,&jac->nlevels,0);CHKERRQ(ierr); 11058966356dSPierre Jolivet ierr = PetscOptionsReal("-pc_hypre_parasails_thresh","Threshold","None",jac->threshold,&jac->threshold,&flag);CHKERRQ(ierr); 11068966356dSPierre Jolivet if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetParams,(jac->hsolver,jac->threshold,jac->nlevels)); 110716d9e3a6SLisandro Dalcin 110816d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_parasails_filter","filter","None",jac->filter,&jac->filter,&flag);CHKERRQ(ierr); 11092fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetFilter,(jac->hsolver,jac->filter)); 111016d9e3a6SLisandro Dalcin 111116d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_parasails_loadbal","Load balance","None",jac->loadbal,&jac->loadbal,&flag);CHKERRQ(ierr); 11122fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetLoadbal,(jac->hsolver,jac->loadbal)); 111316d9e3a6SLisandro Dalcin 1114acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_parasails_logging","Print info to screen","None",(PetscBool)jac->logging,(PetscBool*)&jac->logging,&flag);CHKERRQ(ierr); 11152fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetLogging,(jac->hsolver,jac->logging)); 111616d9e3a6SLisandro Dalcin 1117acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_parasails_reuse","Reuse nonzero pattern in preconditioner","None",(PetscBool)jac->ruse,(PetscBool*)&jac->ruse,&flag);CHKERRQ(ierr); 11182fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetReuse,(jac->hsolver,jac->ruse)); 111916d9e3a6SLisandro Dalcin 1120a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_parasails_sym","Symmetry of matrix and preconditioner","None",symtlist,ALEN(symtlist),symtlist[0],&indx,&flag);CHKERRQ(ierr); 112116d9e3a6SLisandro Dalcin if (flag) { 112216d9e3a6SLisandro Dalcin jac->symt = indx; 1123fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetSym,(jac->hsolver,jac->symt)); 112416d9e3a6SLisandro Dalcin } 112516d9e3a6SLisandro Dalcin 112616d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 112716d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 112816d9e3a6SLisandro Dalcin } 112916d9e3a6SLisandro Dalcin 113016d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_ParaSails(PC pc,PetscViewer viewer) 113116d9e3a6SLisandro Dalcin { 113216d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 113316d9e3a6SLisandro Dalcin PetscErrorCode ierr; 1134ace3abfcSBarry Smith PetscBool iascii; 1135feb237baSPierre Jolivet const char *symt = 0; 113616d9e3a6SLisandro Dalcin 113716d9e3a6SLisandro Dalcin PetscFunctionBegin; 1138251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 113916d9e3a6SLisandro Dalcin if (iascii) { 114016d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE ParaSails preconditioning\n");CHKERRQ(ierr); 1141efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," nlevels %d\n",jac->nlevels);CHKERRQ(ierr); 11428966356dSPierre Jolivet ierr = PetscViewerASCIIPrintf(viewer," threshold %g\n",(double)jac->threshold);CHKERRQ(ierr); 1143efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," filter %g\n",(double)jac->filter);CHKERRQ(ierr); 1144efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," load balance %g\n",(double)jac->loadbal);CHKERRQ(ierr); 1145efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," reuse nonzero structure %s\n",PetscBools[jac->ruse]);CHKERRQ(ierr); 1146efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," print info to screen %s\n",PetscBools[jac->logging]);CHKERRQ(ierr); 11472fa5cd67SKarl Rupp if (!jac->symt) symt = "nonsymmetric matrix and preconditioner"; 11482fa5cd67SKarl Rupp else if (jac->symt == 1) symt = "SPD matrix and preconditioner"; 11492fa5cd67SKarl Rupp else if (jac->symt == 2) symt = "nonsymmetric matrix but SPD preconditioner"; 1150ce94432eSBarry Smith else SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONG,"Unknown HYPRE ParaSails symmetric option %d",jac->symt); 1151efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," %s\n",symt);CHKERRQ(ierr); 115216d9e3a6SLisandro Dalcin } 115316d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 115416d9e3a6SLisandro Dalcin } 11554cb006feSStefano Zampini /* --------------------------------------------------------------------------------------------*/ 11564416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_AMS(PetscOptionItems *PetscOptionsObject,PC pc) 11574cb006feSStefano Zampini { 11584cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 11594cb006feSStefano Zampini PetscErrorCode ierr; 11604cb006feSStefano Zampini PetscInt n; 11614cb006feSStefano Zampini PetscBool flag,flag2,flag3,flag4; 11624cb006feSStefano Zampini 11634cb006feSStefano Zampini PetscFunctionBegin; 11649fa463a7SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE AMS Options");CHKERRQ(ierr); 1165863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ams_print_level","Debugging output level for AMS","None",jac->as_print,&jac->as_print,&flag);CHKERRQ(ierr); 1166863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetPrintLevel,(jac->hsolver,jac->as_print)); 1167863406b8SStefano 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); 1168863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 11694cb006feSStefano 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); 11704cb006feSStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 1171863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ams_tol","Error tolerance for AMS multigrid","None",jac->as_tol,&jac->as_tol,&flag);CHKERRQ(ierr); 1172863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetTol,(jac->hsolver,jac->as_tol)); 1173863406b8SStefano 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); 1174863406b8SStefano 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); 1175863406b8SStefano 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); 1176863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ams_omega","SSOR coefficient for AMS smoother","None",jac->as_omega,&jac->as_omega,&flag4);CHKERRQ(ierr); 11774cb006feSStefano Zampini if (flag || flag2 || flag3 || flag4) { 1178863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1179863406b8SStefano Zampini jac->as_relax_times, 1180863406b8SStefano Zampini jac->as_relax_weight, 1181863406b8SStefano Zampini jac->as_omega)); 11824cb006feSStefano Zampini } 1183863406b8SStefano 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); 11844cb006feSStefano Zampini n = 5; 1185863406b8SStefano Zampini ierr = PetscOptionsIntArray("-pc_hypre_ams_amg_alpha_options","AMG options for vector Poisson","None",jac->as_amg_alpha_opts,&n,&flag2);CHKERRQ(ierr); 11864cb006feSStefano Zampini if (flag || flag2) { 1187863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaAMGOptions,(jac->hsolver,jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1188863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1189863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1190863406b8SStefano Zampini jac->as_amg_alpha_theta, 1191863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1192863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 11934cb006feSStefano Zampini } 1194863406b8SStefano 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); 11954cb006feSStefano Zampini n = 5; 1196863406b8SStefano 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); 11974cb006feSStefano Zampini if (flag || flag2) { 1198863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1199863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1200863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1201863406b8SStefano Zampini jac->as_amg_beta_theta, 1202863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1203863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 12044cb006feSStefano Zampini } 120523df4f25SStefano 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); 120623df4f25SStefano Zampini if (flag) { /* override HYPRE's default only if the options is used */ 120723df4f25SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetProjectionFrequency,(jac->hsolver,jac->ams_proj_freq)); 120823df4f25SStefano Zampini } 12094cb006feSStefano Zampini ierr = PetscOptionsTail();CHKERRQ(ierr); 12104cb006feSStefano Zampini PetscFunctionReturn(0); 12114cb006feSStefano Zampini } 12124cb006feSStefano Zampini 12134cb006feSStefano Zampini static PetscErrorCode PCView_HYPRE_AMS(PC pc,PetscViewer viewer) 12144cb006feSStefano Zampini { 12154cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 12164cb006feSStefano Zampini PetscErrorCode ierr; 12174cb006feSStefano Zampini PetscBool iascii; 12184cb006feSStefano Zampini 12194cb006feSStefano Zampini PetscFunctionBegin; 12204cb006feSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 12214cb006feSStefano Zampini if (iascii) { 12224cb006feSStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS preconditioning\n");CHKERRQ(ierr); 1223efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iterations per application %d\n",jac->as_max_iter);CHKERRQ(ierr); 1224efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace cycle type %d\n",jac->ams_cycle_type);CHKERRQ(ierr); 1225efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iteration tolerance %g\n",jac->as_tol);CHKERRQ(ierr); 1226efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother type %d\n",jac->as_relax_type);CHKERRQ(ierr); 1227efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number of smoothing steps %d\n",jac->as_relax_times);CHKERRQ(ierr); 1228efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother weight %g\n",jac->as_relax_weight);CHKERRQ(ierr); 1229efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother omega %g\n",jac->as_omega);CHKERRQ(ierr); 12304cb006feSStefano Zampini if (jac->alpha_Poisson) { 1231efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," vector Poisson solver (passed in by user)\n");CHKERRQ(ierr); 12324cb006feSStefano Zampini } else { 1233efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," vector Poisson solver (computed) \n");CHKERRQ(ierr); 12344cb006feSStefano Zampini } 1235efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG coarsening type %d\n",jac->as_amg_alpha_opts[0]);CHKERRQ(ierr); 1236efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG levels of aggressive coarsening %d\n",jac->as_amg_alpha_opts[1]);CHKERRQ(ierr); 1237efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG relaxation type %d\n",jac->as_amg_alpha_opts[2]);CHKERRQ(ierr); 1238efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG interpolation type %d\n",jac->as_amg_alpha_opts[3]);CHKERRQ(ierr); 1239efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG max nonzero elements in interpolation rows %d\n",jac->as_amg_alpha_opts[4]);CHKERRQ(ierr); 1240efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG strength threshold %g\n",jac->as_amg_alpha_theta);CHKERRQ(ierr); 12414cb006feSStefano Zampini if (!jac->ams_beta_is_zero) { 12424cb006feSStefano Zampini if (jac->beta_Poisson) { 1243efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," scalar Poisson solver (passed in by user)\n");CHKERRQ(ierr); 12444cb006feSStefano Zampini } else { 1245efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," scalar Poisson solver (computed) \n");CHKERRQ(ierr); 12464cb006feSStefano Zampini } 1247efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG coarsening type %d\n",jac->as_amg_beta_opts[0]);CHKERRQ(ierr); 1248efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG levels of aggressive coarsening %d\n",jac->as_amg_beta_opts[1]);CHKERRQ(ierr); 1249efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG relaxation type %d\n",jac->as_amg_beta_opts[2]);CHKERRQ(ierr); 1250efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG interpolation type %d\n",jac->as_amg_beta_opts[3]);CHKERRQ(ierr); 1251efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG max nonzero elements in interpolation rows %d\n",jac->as_amg_beta_opts[4]);CHKERRQ(ierr); 1252efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG strength threshold %g\n",jac->as_amg_beta_theta);CHKERRQ(ierr); 125323df4f25SStefano Zampini if (jac->ams_beta_is_zero_part) { 1254efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," compatible subspace projection frequency %d (-1 HYPRE uses default)\n",jac->ams_proj_freq);CHKERRQ(ierr); 125523df4f25SStefano Zampini } 125623df4f25SStefano Zampini } else { 1257efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," scalar Poisson solver not used (zero-conductivity everywhere) \n");CHKERRQ(ierr); 12584cb006feSStefano Zampini } 12594cb006feSStefano Zampini } 12604cb006feSStefano Zampini PetscFunctionReturn(0); 12614cb006feSStefano Zampini } 12624cb006feSStefano Zampini 12634416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_ADS(PetscOptionItems *PetscOptionsObject,PC pc) 1264863406b8SStefano Zampini { 1265863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1266863406b8SStefano Zampini PetscErrorCode ierr; 1267863406b8SStefano Zampini PetscInt n; 1268863406b8SStefano Zampini PetscBool flag,flag2,flag3,flag4; 1269863406b8SStefano Zampini 1270863406b8SStefano Zampini PetscFunctionBegin; 1271863406b8SStefano Zampini ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE ADS Options");CHKERRQ(ierr); 1272863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ads_print_level","Debugging output level for ADS","None",jac->as_print,&jac->as_print,&flag);CHKERRQ(ierr); 1273863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetPrintLevel,(jac->hsolver,jac->as_print)); 1274863406b8SStefano 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); 1275863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 1276863406b8SStefano 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); 1277863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetCycleType,(jac->hsolver,jac->ads_cycle_type)); 1278863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ads_tol","Error tolerance for ADS multigrid","None",jac->as_tol,&jac->as_tol,&flag);CHKERRQ(ierr); 1279863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetTol,(jac->hsolver,jac->as_tol)); 1280863406b8SStefano 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); 1281863406b8SStefano 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); 1282863406b8SStefano 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); 1283863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ads_omega","SSOR coefficient for ADS smoother","None",jac->as_omega,&jac->as_omega,&flag4);CHKERRQ(ierr); 1284863406b8SStefano Zampini if (flag || flag2 || flag3 || flag4) { 1285863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1286863406b8SStefano Zampini jac->as_relax_times, 1287863406b8SStefano Zampini jac->as_relax_weight, 1288863406b8SStefano Zampini jac->as_omega)); 1289863406b8SStefano Zampini } 1290863406b8SStefano 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); 1291863406b8SStefano Zampini n = 5; 1292863406b8SStefano 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); 1293863406b8SStefano 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); 1294863406b8SStefano Zampini if (flag || flag2 || flag3) { 1295863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMSOptions,(jac->hsolver,jac->ams_cycle_type, /* AMS cycle type */ 1296863406b8SStefano Zampini jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1297863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1298863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1299863406b8SStefano Zampini jac->as_amg_alpha_theta, 1300863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1301863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 1302863406b8SStefano Zampini } 1303863406b8SStefano 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); 1304863406b8SStefano Zampini n = 5; 1305863406b8SStefano 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); 1306863406b8SStefano Zampini if (flag || flag2) { 1307863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1308863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1309863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1310863406b8SStefano Zampini jac->as_amg_beta_theta, 1311863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1312863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 1313863406b8SStefano Zampini } 1314863406b8SStefano Zampini ierr = PetscOptionsTail();CHKERRQ(ierr); 1315863406b8SStefano Zampini PetscFunctionReturn(0); 1316863406b8SStefano Zampini } 1317863406b8SStefano Zampini 1318863406b8SStefano Zampini static PetscErrorCode PCView_HYPRE_ADS(PC pc,PetscViewer viewer) 1319863406b8SStefano Zampini { 1320863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1321863406b8SStefano Zampini PetscErrorCode ierr; 1322863406b8SStefano Zampini PetscBool iascii; 1323863406b8SStefano Zampini 1324863406b8SStefano Zampini PetscFunctionBegin; 1325863406b8SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1326863406b8SStefano Zampini if (iascii) { 1327863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS preconditioning\n");CHKERRQ(ierr); 1328efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iterations per application %d\n",jac->as_max_iter);CHKERRQ(ierr); 1329efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace cycle type %d\n",jac->ads_cycle_type);CHKERRQ(ierr); 1330efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iteration tolerance %g\n",jac->as_tol);CHKERRQ(ierr); 1331efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother type %d\n",jac->as_relax_type);CHKERRQ(ierr); 1332efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number of smoothing steps %d\n",jac->as_relax_times);CHKERRQ(ierr); 1333efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother weight %g\n",jac->as_relax_weight);CHKERRQ(ierr); 1334efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother omega %g\n",jac->as_omega);CHKERRQ(ierr); 1335efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," AMS solver using boomerAMG\n");CHKERRQ(ierr); 1336efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace cycle type %d\n",jac->ams_cycle_type);CHKERRQ(ierr); 1337efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," coarsening type %d\n",jac->as_amg_alpha_opts[0]);CHKERRQ(ierr); 1338efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," levels of aggressive coarsening %d\n",jac->as_amg_alpha_opts[1]);CHKERRQ(ierr); 1339efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relaxation type %d\n",jac->as_amg_alpha_opts[2]);CHKERRQ(ierr); 1340efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," interpolation type %d\n",jac->as_amg_alpha_opts[3]);CHKERRQ(ierr); 1341efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max nonzero elements in interpolation rows %d\n",jac->as_amg_alpha_opts[4]);CHKERRQ(ierr); 1342efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," strength threshold %g\n",jac->as_amg_alpha_theta);CHKERRQ(ierr); 1343efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," vector Poisson solver using boomerAMG\n");CHKERRQ(ierr); 1344efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," coarsening type %d\n",jac->as_amg_beta_opts[0]);CHKERRQ(ierr); 1345efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," levels of aggressive coarsening %d\n",jac->as_amg_beta_opts[1]);CHKERRQ(ierr); 1346efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relaxation type %d\n",jac->as_amg_beta_opts[2]);CHKERRQ(ierr); 1347efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," interpolation type %d\n",jac->as_amg_beta_opts[3]);CHKERRQ(ierr); 1348efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max nonzero elements in interpolation rows %d\n",jac->as_amg_beta_opts[4]);CHKERRQ(ierr); 1349efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," strength threshold %g\n",jac->as_amg_beta_theta);CHKERRQ(ierr); 1350863406b8SStefano Zampini } 1351863406b8SStefano Zampini PetscFunctionReturn(0); 1352863406b8SStefano Zampini } 1353863406b8SStefano Zampini 1354863406b8SStefano Zampini static PetscErrorCode PCHYPRESetDiscreteGradient_HYPRE(PC pc, Mat G) 13554cb006feSStefano Zampini { 13564cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 13575ac14e1cSStefano Zampini PetscBool ishypre; 13584cb006feSStefano Zampini PetscErrorCode ierr; 13594cb006feSStefano Zampini 13604cb006feSStefano Zampini PetscFunctionBegin; 13615ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)G,MATHYPRE,&ishypre);CHKERRQ(ierr); 13625ac14e1cSStefano Zampini if (ishypre) { 13635ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)G);CHKERRQ(ierr); 13645ac14e1cSStefano Zampini ierr = MatDestroy(&jac->G);CHKERRQ(ierr); 13655ac14e1cSStefano Zampini jac->G = G; 13665ac14e1cSStefano Zampini } else { 13676bf688a0SCe Qin ierr = MatDestroy(&jac->G);CHKERRQ(ierr); 13686bf688a0SCe Qin ierr = MatConvert(G,MATHYPRE,MAT_INITIAL_MATRIX,&jac->G);CHKERRQ(ierr); 13695ac14e1cSStefano Zampini } 13704cb006feSStefano Zampini PetscFunctionReturn(0); 13714cb006feSStefano Zampini } 13724cb006feSStefano Zampini 13734cb006feSStefano Zampini /*@ 13744cb006feSStefano Zampini PCHYPRESetDiscreteGradient - Set discrete gradient matrix 13754cb006feSStefano Zampini 13764cb006feSStefano Zampini Collective on PC 13774cb006feSStefano Zampini 13784cb006feSStefano Zampini Input Parameters: 13794cb006feSStefano Zampini + pc - the preconditioning context 13804cb006feSStefano Zampini - G - the discrete gradient 13814cb006feSStefano Zampini 13824cb006feSStefano Zampini Level: intermediate 13834cb006feSStefano Zampini 138495452b02SPatrick Sanan Notes: 138595452b02SPatrick Sanan G should have as many rows as the number of edges and as many columns as the number of vertices in the mesh 1386863406b8SStefano 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 13874cb006feSStefano Zampini 13884cb006feSStefano Zampini .seealso: 13894cb006feSStefano Zampini @*/ 13904cb006feSStefano Zampini PetscErrorCode PCHYPRESetDiscreteGradient(PC pc, Mat G) 13914cb006feSStefano Zampini { 13924cb006feSStefano Zampini PetscErrorCode ierr; 13934cb006feSStefano Zampini 13944cb006feSStefano Zampini PetscFunctionBegin; 13954cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 13964cb006feSStefano Zampini PetscValidHeaderSpecific(G,MAT_CLASSID,2); 13974cb006feSStefano Zampini PetscCheckSameComm(pc,1,G,2); 13984cb006feSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetDiscreteGradient_C",(PC,Mat),(pc,G));CHKERRQ(ierr); 13994cb006feSStefano Zampini PetscFunctionReturn(0); 14004cb006feSStefano Zampini } 14014cb006feSStefano Zampini 1402863406b8SStefano Zampini static PetscErrorCode PCHYPRESetDiscreteCurl_HYPRE(PC pc, Mat C) 1403863406b8SStefano Zampini { 1404863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 14055ac14e1cSStefano Zampini PetscBool ishypre; 1406863406b8SStefano Zampini PetscErrorCode ierr; 1407863406b8SStefano Zampini 1408863406b8SStefano Zampini PetscFunctionBegin; 14095ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)C,MATHYPRE,&ishypre);CHKERRQ(ierr); 14105ac14e1cSStefano Zampini if (ishypre) { 14115ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)C);CHKERRQ(ierr); 14125ac14e1cSStefano Zampini ierr = MatDestroy(&jac->C);CHKERRQ(ierr); 14135ac14e1cSStefano Zampini jac->C = C; 14145ac14e1cSStefano Zampini } else { 14156bf688a0SCe Qin ierr = MatDestroy(&jac->C);CHKERRQ(ierr); 14166bf688a0SCe Qin ierr = MatConvert(C,MATHYPRE,MAT_INITIAL_MATRIX,&jac->C);CHKERRQ(ierr); 14175ac14e1cSStefano Zampini } 1418863406b8SStefano Zampini PetscFunctionReturn(0); 1419863406b8SStefano Zampini } 1420863406b8SStefano Zampini 1421863406b8SStefano Zampini /*@ 1422863406b8SStefano Zampini PCHYPRESetDiscreteCurl - Set discrete curl matrix 1423863406b8SStefano Zampini 1424863406b8SStefano Zampini Collective on PC 1425863406b8SStefano Zampini 1426863406b8SStefano Zampini Input Parameters: 1427863406b8SStefano Zampini + pc - the preconditioning context 1428863406b8SStefano Zampini - C - the discrete curl 1429863406b8SStefano Zampini 1430863406b8SStefano Zampini Level: intermediate 1431863406b8SStefano Zampini 143295452b02SPatrick Sanan Notes: 143395452b02SPatrick Sanan C should have as many rows as the number of faces and as many columns as the number of edges in the mesh 1434863406b8SStefano 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 1435863406b8SStefano Zampini 1436863406b8SStefano Zampini .seealso: 1437863406b8SStefano Zampini @*/ 1438863406b8SStefano Zampini PetscErrorCode PCHYPRESetDiscreteCurl(PC pc, Mat C) 1439863406b8SStefano Zampini { 1440863406b8SStefano Zampini PetscErrorCode ierr; 1441863406b8SStefano Zampini 1442863406b8SStefano Zampini PetscFunctionBegin; 1443863406b8SStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 1444863406b8SStefano Zampini PetscValidHeaderSpecific(C,MAT_CLASSID,2); 1445863406b8SStefano Zampini PetscCheckSameComm(pc,1,C,2); 1446863406b8SStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetDiscreteCurl_C",(PC,Mat),(pc,C));CHKERRQ(ierr); 1447863406b8SStefano Zampini PetscFunctionReturn(0); 1448863406b8SStefano Zampini } 1449863406b8SStefano Zampini 14506bf688a0SCe Qin static PetscErrorCode PCHYPRESetInterpolations_HYPRE(PC pc, PetscInt dim, Mat RT_PiFull, Mat RT_Pi[], Mat ND_PiFull, Mat ND_Pi[]) 14516bf688a0SCe Qin { 14526bf688a0SCe Qin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 14536bf688a0SCe Qin PetscBool ishypre; 14546bf688a0SCe Qin PetscErrorCode ierr; 14556bf688a0SCe Qin PetscInt i; 14566bf688a0SCe Qin PetscFunctionBegin; 14576bf688a0SCe Qin 14586bf688a0SCe Qin ierr = MatDestroy(&jac->RT_PiFull);CHKERRQ(ierr); 14596bf688a0SCe Qin ierr = MatDestroy(&jac->ND_PiFull);CHKERRQ(ierr); 14606bf688a0SCe Qin for (i=0;i<3;++i) { 14616bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[i]);CHKERRQ(ierr); 14626bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[i]);CHKERRQ(ierr); 14636bf688a0SCe Qin } 14646bf688a0SCe Qin 14656bf688a0SCe Qin jac->dim = dim; 14666bf688a0SCe Qin if (RT_PiFull) { 14676bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)RT_PiFull,MATHYPRE,&ishypre);CHKERRQ(ierr); 14686bf688a0SCe Qin if (ishypre) { 14696bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)RT_PiFull);CHKERRQ(ierr); 14706bf688a0SCe Qin jac->RT_PiFull = RT_PiFull; 14716bf688a0SCe Qin } else { 14726bf688a0SCe Qin ierr = MatConvert(RT_PiFull,MATHYPRE,MAT_INITIAL_MATRIX,&jac->RT_PiFull);CHKERRQ(ierr); 14736bf688a0SCe Qin } 14746bf688a0SCe Qin } 14756bf688a0SCe Qin if (RT_Pi) { 14766bf688a0SCe Qin for (i=0;i<dim;++i) { 14776bf688a0SCe Qin if (RT_Pi[i]) { 14786bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)RT_Pi[i],MATHYPRE,&ishypre);CHKERRQ(ierr); 14796bf688a0SCe Qin if (ishypre) { 14806bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)RT_Pi[i]);CHKERRQ(ierr); 14816bf688a0SCe Qin jac->RT_Pi[i] = RT_Pi[i]; 14826bf688a0SCe Qin } else { 14836bf688a0SCe Qin ierr = MatConvert(RT_Pi[i],MATHYPRE,MAT_INITIAL_MATRIX,&jac->RT_Pi[i]);CHKERRQ(ierr); 14846bf688a0SCe Qin } 14856bf688a0SCe Qin } 14866bf688a0SCe Qin } 14876bf688a0SCe Qin } 14886bf688a0SCe Qin if (ND_PiFull) { 14896bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)ND_PiFull,MATHYPRE,&ishypre);CHKERRQ(ierr); 14906bf688a0SCe Qin if (ishypre) { 14916bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)ND_PiFull);CHKERRQ(ierr); 14926bf688a0SCe Qin jac->ND_PiFull = ND_PiFull; 14936bf688a0SCe Qin } else { 14946bf688a0SCe Qin ierr = MatConvert(ND_PiFull,MATHYPRE,MAT_INITIAL_MATRIX,&jac->ND_PiFull);CHKERRQ(ierr); 14956bf688a0SCe Qin } 14966bf688a0SCe Qin } 14976bf688a0SCe Qin if (ND_Pi) { 14986bf688a0SCe Qin for (i=0;i<dim;++i) { 14996bf688a0SCe Qin if (ND_Pi[i]) { 15006bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)ND_Pi[i],MATHYPRE,&ishypre);CHKERRQ(ierr); 15016bf688a0SCe Qin if (ishypre) { 15026bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)ND_Pi[i]);CHKERRQ(ierr); 15036bf688a0SCe Qin jac->ND_Pi[i] = ND_Pi[i]; 15046bf688a0SCe Qin } else { 15056bf688a0SCe Qin ierr = MatConvert(ND_Pi[i],MATHYPRE,MAT_INITIAL_MATRIX,&jac->ND_Pi[i]);CHKERRQ(ierr); 15066bf688a0SCe Qin } 15076bf688a0SCe Qin } 15086bf688a0SCe Qin } 15096bf688a0SCe Qin } 15106bf688a0SCe Qin 15116bf688a0SCe Qin PetscFunctionReturn(0); 15126bf688a0SCe Qin } 15136bf688a0SCe Qin 15146bf688a0SCe Qin /*@ 15156bf688a0SCe Qin PCHYPRESetInterpolations - Set interpolation matrices for AMS/ADS preconditioner 15166bf688a0SCe Qin 15176bf688a0SCe Qin Collective on PC 15186bf688a0SCe Qin 15196bf688a0SCe Qin Input Parameters: 15206bf688a0SCe Qin + pc - the preconditioning context 15216bf688a0SCe Qin - dim - the dimension of the problem, only used in AMS 15226bf688a0SCe Qin - RT_PiFull - Raviart-Thomas interpolation matrix 15236bf688a0SCe Qin - RT_Pi - x/y/z component of Raviart-Thomas interpolation matrix 15246bf688a0SCe Qin - ND_PiFull - Nedelec interpolation matrix 15256bf688a0SCe Qin - ND_Pi - x/y/z component of Nedelec interpolation matrix 15266bf688a0SCe Qin 152795452b02SPatrick Sanan Notes: 152895452b02SPatrick Sanan For AMS, only Nedelec interpolation matrices are needed, the Raviart-Thomas interpolation matrices can be set to NULL. 15296bf688a0SCe Qin For ADS, both type of interpolation matrices are needed. 15306bf688a0SCe Qin Level: intermediate 15316bf688a0SCe Qin 15326bf688a0SCe Qin .seealso: 15336bf688a0SCe Qin @*/ 15346bf688a0SCe Qin PetscErrorCode PCHYPRESetInterpolations(PC pc, PetscInt dim, Mat RT_PiFull, Mat RT_Pi[], Mat ND_PiFull, Mat ND_Pi[]) 15356bf688a0SCe Qin { 15366bf688a0SCe Qin PetscErrorCode ierr; 15376bf688a0SCe Qin PetscInt i; 15386bf688a0SCe Qin 15396bf688a0SCe Qin PetscFunctionBegin; 15406bf688a0SCe Qin PetscValidHeaderSpecific(pc,PC_CLASSID,1); 15416bf688a0SCe Qin if (RT_PiFull) { 15426bf688a0SCe Qin PetscValidHeaderSpecific(RT_PiFull,MAT_CLASSID,3); 15436bf688a0SCe Qin PetscCheckSameComm(pc,1,RT_PiFull,3); 15446bf688a0SCe Qin } 15456bf688a0SCe Qin if (RT_Pi) { 15466bf688a0SCe Qin PetscValidPointer(RT_Pi,4); 15476bf688a0SCe Qin for (i=0;i<dim;++i) { 15486bf688a0SCe Qin if (RT_Pi[i]) { 15496bf688a0SCe Qin PetscValidHeaderSpecific(RT_Pi[i],MAT_CLASSID,4); 15506bf688a0SCe Qin PetscCheckSameComm(pc,1,RT_Pi[i],4); 15516bf688a0SCe Qin } 15526bf688a0SCe Qin } 15536bf688a0SCe Qin } 15546bf688a0SCe Qin if (ND_PiFull) { 15556bf688a0SCe Qin PetscValidHeaderSpecific(ND_PiFull,MAT_CLASSID,5); 15566bf688a0SCe Qin PetscCheckSameComm(pc,1,ND_PiFull,5); 15576bf688a0SCe Qin } 15586bf688a0SCe Qin if (ND_Pi) { 15596bf688a0SCe Qin PetscValidPointer(ND_Pi,6); 15606bf688a0SCe Qin for (i=0;i<dim;++i) { 15616bf688a0SCe Qin if (ND_Pi[i]) { 15626bf688a0SCe Qin PetscValidHeaderSpecific(ND_Pi[i],MAT_CLASSID,6); 15636bf688a0SCe Qin PetscCheckSameComm(pc,1,ND_Pi[i],6); 15646bf688a0SCe Qin } 15656bf688a0SCe Qin } 15666bf688a0SCe Qin } 15676bf688a0SCe Qin ierr = PetscTryMethod(pc,"PCHYPRESetInterpolations_C",(PC,PetscInt,Mat,Mat[],Mat,Mat[]),(pc,dim,RT_PiFull,RT_Pi,ND_PiFull,ND_Pi));CHKERRQ(ierr); 15686bf688a0SCe Qin PetscFunctionReturn(0); 15696bf688a0SCe Qin } 15706bf688a0SCe Qin 15715ac14e1cSStefano Zampini static PetscErrorCode PCHYPRESetPoissonMatrix_HYPRE(PC pc, Mat A, PetscBool isalpha) 15724cb006feSStefano Zampini { 15734cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 15745ac14e1cSStefano Zampini PetscBool ishypre; 15754cb006feSStefano Zampini PetscErrorCode ierr; 15764cb006feSStefano Zampini 15774cb006feSStefano Zampini PetscFunctionBegin; 15785ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)A,MATHYPRE,&ishypre);CHKERRQ(ierr); 15795ac14e1cSStefano Zampini if (ishypre) { 15805ac14e1cSStefano Zampini if (isalpha) { 15815ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 15825ac14e1cSStefano Zampini ierr = MatDestroy(&jac->alpha_Poisson);CHKERRQ(ierr); 15835ac14e1cSStefano Zampini jac->alpha_Poisson = A; 15845ac14e1cSStefano Zampini } else { 15855ac14e1cSStefano Zampini if (A) { 15865ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 15875ac14e1cSStefano Zampini } else { 15885ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_TRUE; 15895ac14e1cSStefano Zampini } 15905ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 15915ac14e1cSStefano Zampini jac->beta_Poisson = A; 15925ac14e1cSStefano Zampini } 15935ac14e1cSStefano Zampini } else { 15945ac14e1cSStefano Zampini if (isalpha) { 15956bf688a0SCe Qin ierr = MatDestroy(&jac->alpha_Poisson);CHKERRQ(ierr); 15966bf688a0SCe Qin ierr = MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&jac->alpha_Poisson);CHKERRQ(ierr); 15975ac14e1cSStefano Zampini } else { 15985ac14e1cSStefano Zampini if (A) { 15996bf688a0SCe Qin ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 16006bf688a0SCe Qin ierr = MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&jac->beta_Poisson);CHKERRQ(ierr); 16015ac14e1cSStefano Zampini } else { 16025ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 16035ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_TRUE; 16045ac14e1cSStefano Zampini } 16055ac14e1cSStefano Zampini } 16065ac14e1cSStefano Zampini } 16074cb006feSStefano Zampini PetscFunctionReturn(0); 16084cb006feSStefano Zampini } 16094cb006feSStefano Zampini 16104cb006feSStefano Zampini /*@ 16114cb006feSStefano Zampini PCHYPRESetAlphaPoissonMatrix - Set vector Poisson matrix 16124cb006feSStefano Zampini 16134cb006feSStefano Zampini Collective on PC 16144cb006feSStefano Zampini 16154cb006feSStefano Zampini Input Parameters: 16164cb006feSStefano Zampini + pc - the preconditioning context 16174cb006feSStefano Zampini - A - the matrix 16184cb006feSStefano Zampini 16194cb006feSStefano Zampini Level: intermediate 16204cb006feSStefano Zampini 162195452b02SPatrick Sanan Notes: 162295452b02SPatrick Sanan A should be obtained by discretizing the vector valued Poisson problem with linear finite elements 16234cb006feSStefano Zampini 16244cb006feSStefano Zampini .seealso: 16254cb006feSStefano Zampini @*/ 16264cb006feSStefano Zampini PetscErrorCode PCHYPRESetAlphaPoissonMatrix(PC pc, Mat A) 16274cb006feSStefano Zampini { 16284cb006feSStefano Zampini PetscErrorCode ierr; 16294cb006feSStefano Zampini 16304cb006feSStefano Zampini PetscFunctionBegin; 16314cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 16324cb006feSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,2); 16334cb006feSStefano Zampini PetscCheckSameComm(pc,1,A,2); 16345ac14e1cSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetPoissonMatrix_C",(PC,Mat,PetscBool),(pc,A,PETSC_TRUE));CHKERRQ(ierr); 16354cb006feSStefano Zampini PetscFunctionReturn(0); 16364cb006feSStefano Zampini } 16374cb006feSStefano Zampini 16384cb006feSStefano Zampini /*@ 16394cb006feSStefano Zampini PCHYPRESetBetaPoissonMatrix - Set Poisson matrix 16404cb006feSStefano Zampini 16414cb006feSStefano Zampini Collective on PC 16424cb006feSStefano Zampini 16434cb006feSStefano Zampini Input Parameters: 16444cb006feSStefano Zampini + pc - the preconditioning context 16454cb006feSStefano Zampini - A - the matrix 16464cb006feSStefano Zampini 16474cb006feSStefano Zampini Level: intermediate 16484cb006feSStefano Zampini 164995452b02SPatrick Sanan Notes: 165095452b02SPatrick Sanan A should be obtained by discretizing the Poisson problem with linear finite elements. 16514cb006feSStefano Zampini Following HYPRE convention, the scalar Poisson solver of AMS can be turned off by passing NULL. 16524cb006feSStefano Zampini 16534cb006feSStefano Zampini .seealso: 16544cb006feSStefano Zampini @*/ 16554cb006feSStefano Zampini PetscErrorCode PCHYPRESetBetaPoissonMatrix(PC pc, Mat A) 16564cb006feSStefano Zampini { 16574cb006feSStefano Zampini PetscErrorCode ierr; 16584cb006feSStefano Zampini 16594cb006feSStefano Zampini PetscFunctionBegin; 16604cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 16614cb006feSStefano Zampini if (A) { 16624cb006feSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,2); 16634cb006feSStefano Zampini PetscCheckSameComm(pc,1,A,2); 16644cb006feSStefano Zampini } 16655ac14e1cSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetPoissonMatrix_C",(PC,Mat,PetscBool),(pc,A,PETSC_FALSE));CHKERRQ(ierr); 16664cb006feSStefano Zampini PetscFunctionReturn(0); 16674cb006feSStefano Zampini } 16684cb006feSStefano Zampini 16695ac14e1cSStefano Zampini static PetscErrorCode PCHYPRESetEdgeConstantVectors_HYPRE(PC pc,Vec ozz, Vec zoz, Vec zzo) 16704cb006feSStefano Zampini { 16714cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 16724cb006feSStefano Zampini PetscErrorCode ierr; 16734cb006feSStefano Zampini 16744cb006feSStefano Zampini PetscFunctionBegin; 16754cb006feSStefano Zampini /* throw away any vector if already set */ 16764cb006feSStefano Zampini if (jac->constants[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[0])); 16774cb006feSStefano Zampini if (jac->constants[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[1])); 16784cb006feSStefano Zampini if (jac->constants[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[2])); 16794cb006feSStefano Zampini jac->constants[0] = NULL; 16804cb006feSStefano Zampini jac->constants[1] = NULL; 16814cb006feSStefano Zampini jac->constants[2] = NULL; 16824cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(ozz,&jac->constants[0]);CHKERRQ(ierr); 16834cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(ozz,jac->constants[0]);CHKERRQ(ierr); 16844cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(zoz,&jac->constants[1]);CHKERRQ(ierr); 16854cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(zoz,jac->constants[1]);CHKERRQ(ierr); 16865ac14e1cSStefano Zampini jac->dim = 2; 16874cb006feSStefano Zampini if (zzo) { 16884cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(zzo,&jac->constants[2]);CHKERRQ(ierr); 16894cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(zzo,jac->constants[2]);CHKERRQ(ierr); 16905ac14e1cSStefano Zampini jac->dim++; 16914cb006feSStefano Zampini } 16924cb006feSStefano Zampini PetscFunctionReturn(0); 16934cb006feSStefano Zampini } 16944cb006feSStefano Zampini 16954cb006feSStefano Zampini /*@ 16964cb006feSStefano Zampini PCHYPRESetEdgeConstantVectors - Set the representation of the constant vector fields in edge element basis 16974cb006feSStefano Zampini 16984cb006feSStefano Zampini Collective on PC 16994cb006feSStefano Zampini 17004cb006feSStefano Zampini Input Parameters: 17014cb006feSStefano Zampini + pc - the preconditioning context 17024cb006feSStefano Zampini - ozz - vector representing (1,0,0) (or (1,0) in 2D) 17034cb006feSStefano Zampini - zoz - vector representing (0,1,0) (or (0,1) in 2D) 17044cb006feSStefano Zampini - zzo - vector representing (0,0,1) (use NULL in 2D) 17054cb006feSStefano Zampini 17064cb006feSStefano Zampini Level: intermediate 17074cb006feSStefano Zampini 17084cb006feSStefano Zampini Notes: 17094cb006feSStefano Zampini 17104cb006feSStefano Zampini .seealso: 17114cb006feSStefano Zampini @*/ 17124cb006feSStefano Zampini PetscErrorCode PCHYPRESetEdgeConstantVectors(PC pc, Vec ozz, Vec zoz, Vec zzo) 17134cb006feSStefano Zampini { 17144cb006feSStefano Zampini PetscErrorCode ierr; 17154cb006feSStefano Zampini 17164cb006feSStefano Zampini PetscFunctionBegin; 17174cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 17184cb006feSStefano Zampini PetscValidHeaderSpecific(ozz,VEC_CLASSID,2); 17194cb006feSStefano Zampini PetscValidHeaderSpecific(zoz,VEC_CLASSID,3); 17204cb006feSStefano Zampini if (zzo) PetscValidHeaderSpecific(zzo,VEC_CLASSID,4); 17214cb006feSStefano Zampini PetscCheckSameComm(pc,1,ozz,2); 17224cb006feSStefano Zampini PetscCheckSameComm(pc,1,zoz,3); 17234cb006feSStefano Zampini if (zzo) PetscCheckSameComm(pc,1,zzo,4); 17244cb006feSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetEdgeConstantVectors_C",(PC,Vec,Vec,Vec),(pc,ozz,zoz,zzo));CHKERRQ(ierr); 17254cb006feSStefano Zampini PetscFunctionReturn(0); 17264cb006feSStefano Zampini } 17274cb006feSStefano Zampini 1728863406b8SStefano Zampini static PetscErrorCode PCSetCoordinates_HYPRE(PC pc, PetscInt dim, PetscInt nloc, PetscReal *coords) 17294cb006feSStefano Zampini { 17304cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 17314cb006feSStefano Zampini Vec tv; 17324cb006feSStefano Zampini PetscInt i; 17334cb006feSStefano Zampini PetscErrorCode ierr; 17344cb006feSStefano Zampini 17354cb006feSStefano Zampini PetscFunctionBegin; 17364cb006feSStefano Zampini /* throw away any coordinate vector if already set */ 17374cb006feSStefano Zampini if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[0])); 17384cb006feSStefano Zampini if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[1])); 17394cb006feSStefano Zampini if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[2])); 17405ac14e1cSStefano Zampini jac->dim = dim; 17415ac14e1cSStefano Zampini 17424cb006feSStefano Zampini /* compute IJ vector for coordinates */ 17434cb006feSStefano Zampini ierr = VecCreate(PetscObjectComm((PetscObject)pc),&tv);CHKERRQ(ierr); 17444cb006feSStefano Zampini ierr = VecSetType(tv,VECSTANDARD);CHKERRQ(ierr); 17454cb006feSStefano Zampini ierr = VecSetSizes(tv,nloc,PETSC_DECIDE);CHKERRQ(ierr); 17464cb006feSStefano Zampini for (i=0;i<dim;i++) { 17474cb006feSStefano Zampini PetscScalar *array; 17484cb006feSStefano Zampini PetscInt j; 17494cb006feSStefano Zampini 17504cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(tv,&jac->coords[i]);CHKERRQ(ierr); 1751589dcaf0SStefano Zampini ierr = VecGetArrayWrite(tv,&array);CHKERRQ(ierr); 17524cb006feSStefano Zampini for (j=0;j<nloc;j++) { 17534cb006feSStefano Zampini array[j] = coords[j*dim+i]; 17544cb006feSStefano Zampini } 175539accc25SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorSetValues,(jac->coords[i],nloc,NULL,(HYPRE_Complex*)array)); 17564cb006feSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorAssemble,(jac->coords[i])); 1757589dcaf0SStefano Zampini ierr = VecRestoreArrayWrite(tv,&array);CHKERRQ(ierr); 17584cb006feSStefano Zampini } 17594cb006feSStefano Zampini ierr = VecDestroy(&tv);CHKERRQ(ierr); 17604cb006feSStefano Zampini PetscFunctionReturn(0); 17614cb006feSStefano Zampini } 17624cb006feSStefano Zampini 176316d9e3a6SLisandro Dalcin /* ---------------------------------------------------------------------------------*/ 176416d9e3a6SLisandro Dalcin 1765f7a08781SBarry Smith static PetscErrorCode PCHYPREGetType_HYPRE(PC pc,const char *name[]) 176616d9e3a6SLisandro Dalcin { 176716d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 176816d9e3a6SLisandro Dalcin 176916d9e3a6SLisandro Dalcin PetscFunctionBegin; 177016d9e3a6SLisandro Dalcin *name = jac->hypre_type; 177116d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 177216d9e3a6SLisandro Dalcin } 177316d9e3a6SLisandro Dalcin 1774f7a08781SBarry Smith static PetscErrorCode PCHYPRESetType_HYPRE(PC pc,const char name[]) 177516d9e3a6SLisandro Dalcin { 177616d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 177716d9e3a6SLisandro Dalcin PetscErrorCode ierr; 1778ace3abfcSBarry Smith PetscBool flag; 177916d9e3a6SLisandro Dalcin 178016d9e3a6SLisandro Dalcin PetscFunctionBegin; 178116d9e3a6SLisandro Dalcin if (jac->hypre_type) { 178216d9e3a6SLisandro Dalcin ierr = PetscStrcmp(jac->hypre_type,name,&flag);CHKERRQ(ierr); 1783ce94432eSBarry Smith if (!flag) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ORDER,"Cannot reset the HYPRE preconditioner type once it has been set"); 178416d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 178516d9e3a6SLisandro Dalcin } else { 178616d9e3a6SLisandro Dalcin ierr = PetscStrallocpy(name, &jac->hypre_type);CHKERRQ(ierr); 178716d9e3a6SLisandro Dalcin } 178816d9e3a6SLisandro Dalcin 178916d9e3a6SLisandro Dalcin jac->maxiter = PETSC_DEFAULT; 179016d9e3a6SLisandro Dalcin jac->tol = PETSC_DEFAULT; 179116d9e3a6SLisandro Dalcin jac->printstatistics = PetscLogPrintInfo; 179216d9e3a6SLisandro Dalcin 179316d9e3a6SLisandro Dalcin ierr = PetscStrcmp("pilut",jac->hypre_type,&flag);CHKERRQ(ierr); 179416d9e3a6SLisandro Dalcin if (flag) { 1795ffc4695bSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(jac->comm_hypre));CHKERRMPI(ierr); 1796fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParCSRPilutCreate,(jac->comm_hypre,&jac->hsolver)); 179716d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_Pilut; 179816d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_Pilut; 179916d9e3a6SLisandro Dalcin jac->destroy = HYPRE_ParCSRPilutDestroy; 180016d9e3a6SLisandro Dalcin jac->setup = HYPRE_ParCSRPilutSetup; 180116d9e3a6SLisandro Dalcin jac->solve = HYPRE_ParCSRPilutSolve; 180216d9e3a6SLisandro Dalcin jac->factorrowsize = PETSC_DEFAULT; 180316d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 180416d9e3a6SLisandro Dalcin } 1805db966c6cSHong Zhang ierr = PetscStrcmp("euclid",jac->hypre_type,&flag);CHKERRQ(ierr); 1806db966c6cSHong Zhang if (flag) { 18078bf83915SBarry Smith #if defined(PETSC_HAVE_64BIT_INDICES) 18088bf83915SBarry Smith SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_SUP,"Hypre Euclid not support with 64 bit indices"); 18098bf83915SBarry Smith #endif 1810ffc4695bSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(jac->comm_hypre));CHKERRMPI(ierr); 1811db966c6cSHong Zhang PetscStackCallStandard(HYPRE_EuclidCreate,(jac->comm_hypre,&jac->hsolver)); 1812db966c6cSHong Zhang pc->ops->setfromoptions = PCSetFromOptions_HYPRE_Euclid; 1813db966c6cSHong Zhang pc->ops->view = PCView_HYPRE_Euclid; 1814db966c6cSHong Zhang jac->destroy = HYPRE_EuclidDestroy; 1815db966c6cSHong Zhang jac->setup = HYPRE_EuclidSetup; 1816db966c6cSHong Zhang jac->solve = HYPRE_EuclidSolve; 1817db966c6cSHong Zhang jac->factorrowsize = PETSC_DEFAULT; 1818db966c6cSHong Zhang jac->eu_level = PETSC_DEFAULT; /* default */ 1819db966c6cSHong Zhang PetscFunctionReturn(0); 1820db966c6cSHong Zhang } 182116d9e3a6SLisandro Dalcin ierr = PetscStrcmp("parasails",jac->hypre_type,&flag);CHKERRQ(ierr); 182216d9e3a6SLisandro Dalcin if (flag) { 1823ffc4695bSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(jac->comm_hypre));CHKERRMPI(ierr); 1824fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsCreate,(jac->comm_hypre,&jac->hsolver)); 182516d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_ParaSails; 182616d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_ParaSails; 182716d9e3a6SLisandro Dalcin jac->destroy = HYPRE_ParaSailsDestroy; 182816d9e3a6SLisandro Dalcin jac->setup = HYPRE_ParaSailsSetup; 182916d9e3a6SLisandro Dalcin jac->solve = HYPRE_ParaSailsSolve; 183016d9e3a6SLisandro Dalcin /* initialize */ 183116d9e3a6SLisandro Dalcin jac->nlevels = 1; 18328966356dSPierre Jolivet jac->threshold = .1; 183316d9e3a6SLisandro Dalcin jac->filter = .1; 183416d9e3a6SLisandro Dalcin jac->loadbal = 0; 18352fa5cd67SKarl Rupp if (PetscLogPrintInfo) jac->logging = (int) PETSC_TRUE; 18362fa5cd67SKarl Rupp else jac->logging = (int) PETSC_FALSE; 18372fa5cd67SKarl Rupp 183816d9e3a6SLisandro Dalcin jac->ruse = (int) PETSC_FALSE; 183916d9e3a6SLisandro Dalcin jac->symt = 0; 18408966356dSPierre Jolivet PetscStackCallStandard(HYPRE_ParaSailsSetParams,(jac->hsolver,jac->threshold,jac->nlevels)); 1841fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetFilter,(jac->hsolver,jac->filter)); 1842fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetLoadbal,(jac->hsolver,jac->loadbal)); 1843fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetLogging,(jac->hsolver,jac->logging)); 1844fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetReuse,(jac->hsolver,jac->ruse)); 1845fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetSym,(jac->hsolver,jac->symt)); 184616d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 184716d9e3a6SLisandro Dalcin } 184816d9e3a6SLisandro Dalcin ierr = PetscStrcmp("boomeramg",jac->hypre_type,&flag);CHKERRQ(ierr); 184916d9e3a6SLisandro Dalcin if (flag) { 185016d9e3a6SLisandro Dalcin ierr = HYPRE_BoomerAMGCreate(&jac->hsolver); 185116d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_BoomerAMG; 185216d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_BoomerAMG; 185316d9e3a6SLisandro Dalcin pc->ops->applytranspose = PCApplyTranspose_HYPRE_BoomerAMG; 185416d9e3a6SLisandro Dalcin pc->ops->applyrichardson = PCApplyRichardson_HYPRE_BoomerAMG; 1855fd2dd295SFande Kong ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetInterpolations_C",PCGetInterpolations_BoomerAMG);CHKERRQ(ierr); 1856fd2dd295SFande Kong ierr = PetscObjectComposeFunction((PetscObject)pc,"PCGetCoarseOperators_C",PCGetCoarseOperators_BoomerAMG);CHKERRQ(ierr); 185716d9e3a6SLisandro Dalcin jac->destroy = HYPRE_BoomerAMGDestroy; 185816d9e3a6SLisandro Dalcin jac->setup = HYPRE_BoomerAMGSetup; 185916d9e3a6SLisandro Dalcin jac->solve = HYPRE_BoomerAMGSolve; 186016d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_FALSE; 186116d9e3a6SLisandro Dalcin /* these defaults match the hypre defaults */ 186216d9e3a6SLisandro Dalcin jac->cycletype = 1; 186316d9e3a6SLisandro Dalcin jac->maxlevels = 25; 186416d9e3a6SLisandro Dalcin jac->maxiter = 1; 18658f87f92bSBarry Smith jac->tol = 0.0; /* tolerance of zero indicates use as preconditioner (suppresses convergence errors) */ 186616d9e3a6SLisandro Dalcin jac->truncfactor = 0.0; 186716d9e3a6SLisandro Dalcin jac->strongthreshold = .25; 186816d9e3a6SLisandro Dalcin jac->maxrowsum = .9; 186916d9e3a6SLisandro Dalcin jac->coarsentype = 6; 187016d9e3a6SLisandro Dalcin jac->measuretype = 0; 18710f1074feSSatish Balay jac->gridsweeps[0] = jac->gridsweeps[1] = jac->gridsweeps[2] = 1; 18726a251517SEike Mueller jac->smoothtype = -1; /* Not set by default */ 1873b9eb5777SEike Mueller jac->smoothnumlevels = 25; 18741810e44eSEike Mueller jac->eu_level = 0; 18751810e44eSEike Mueller jac->eu_droptolerance = 0; 18761810e44eSEike Mueller jac->eu_bj = 0; 1877589dcaf0SStefano Zampini jac->relaxtype[0] = jac->relaxtype[1] = 6; /* Defaults to SYMMETRIC since in PETSc we are using a PC - most likely with CG */ 18780f1074feSSatish Balay jac->relaxtype[2] = 9; /*G.E. */ 187916d9e3a6SLisandro Dalcin jac->relaxweight = 1.0; 188016d9e3a6SLisandro Dalcin jac->outerrelaxweight = 1.0; 188116d9e3a6SLisandro Dalcin jac->relaxorder = 1; 18820f1074feSSatish Balay jac->interptype = 0; 1883589dcaf0SStefano Zampini jac->Rtype = 0; 1884589dcaf0SStefano Zampini jac->Rstrongthreshold = 0.25; 1885589dcaf0SStefano Zampini jac->Rfilterthreshold = 0.0; 1886589dcaf0SStefano Zampini jac->Adroptype = -1; 1887589dcaf0SStefano Zampini jac->Adroptol = 0.0; 18880f1074feSSatish Balay jac->agg_nl = 0; 18890f1074feSSatish Balay jac->pmax = 0; 18900f1074feSSatish Balay jac->truncfactor = 0.0; 18910f1074feSSatish Balay jac->agg_num_paths = 1; 1892589dcaf0SStefano Zampini jac->maxc = 9; 1893589dcaf0SStefano Zampini jac->minc = 1; 18948f87f92bSBarry Smith 189522e51d31SStefano Zampini jac->nodal_coarsening = 0; 189622e51d31SStefano Zampini jac->nodal_coarsening_diag = 0; 189722e51d31SStefano Zampini jac->vec_interp_variant = 0; 189822e51d31SStefano Zampini jac->vec_interp_qmax = 0; 189922e51d31SStefano Zampini jac->vec_interp_smooth = PETSC_FALSE; 190022e51d31SStefano Zampini jac->interp_refine = 0; 19018f87f92bSBarry Smith jac->nodal_relax = PETSC_FALSE; 19028f87f92bSBarry Smith jac->nodal_relax_levels = 1; 1903fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleType,(jac->hsolver,jac->cycletype)); 1904fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxLevels,(jac->hsolver,jac->maxlevels)); 1905fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 1906fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 1907fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTruncFactor,(jac->hsolver,jac->truncfactor)); 1908fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThreshold,(jac->hsolver,jac->strongthreshold)); 1909fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxRowSum,(jac->hsolver,jac->maxrowsum)); 1910fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCoarsenType,(jac->hsolver,jac->coarsentype)); 1911fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMeasureType,(jac->hsolver,jac->measuretype)); 1912fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxOrder,(jac->hsolver, jac->relaxorder)); 1913fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpType,(jac->hsolver,jac->interptype)); 1914fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetAggNumLevels,(jac->hsolver,jac->agg_nl)); 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 1922589dcaf0SStefano Zampini /* AIR */ 1923589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetRestriction,(jac->hsolver,jac->Rtype)); 1924589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThresholdR,(jac->hsolver,jac->Rstrongthreshold)); 1925589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetFilterThresholdR,(jac->hsolver,jac->Rfilterthreshold)); 1926589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetADropTol,(jac->hsolver,jac->Adroptol)); 1927589dcaf0SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetADropType,(jac->hsolver,jac->Adroptype)); 192816d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 192916d9e3a6SLisandro Dalcin } 19304cb006feSStefano Zampini ierr = PetscStrcmp("ams",jac->hypre_type,&flag);CHKERRQ(ierr); 19314cb006feSStefano Zampini if (flag) { 19324cb006feSStefano Zampini ierr = HYPRE_AMSCreate(&jac->hsolver); 19334cb006feSStefano Zampini pc->ops->setfromoptions = PCSetFromOptions_HYPRE_AMS; 19344cb006feSStefano Zampini pc->ops->view = PCView_HYPRE_AMS; 19354cb006feSStefano Zampini jac->destroy = HYPRE_AMSDestroy; 19364cb006feSStefano Zampini jac->setup = HYPRE_AMSSetup; 19374cb006feSStefano Zampini jac->solve = HYPRE_AMSSolve; 19384cb006feSStefano Zampini jac->coords[0] = NULL; 19394cb006feSStefano Zampini jac->coords[1] = NULL; 19404cb006feSStefano Zampini jac->coords[2] = NULL; 19414cb006feSStefano Zampini /* solver parameters: these are borrowed from mfem package, and they are not the default values from HYPRE AMS */ 1942863406b8SStefano Zampini jac->as_print = 0; 1943863406b8SStefano Zampini jac->as_max_iter = 1; /* used as a preconditioner */ 1944863406b8SStefano Zampini jac->as_tol = 0.; /* used as a preconditioner */ 19454cb006feSStefano Zampini jac->ams_cycle_type = 13; 19464cb006feSStefano Zampini /* Smoothing options */ 1947863406b8SStefano Zampini jac->as_relax_type = 2; 1948863406b8SStefano Zampini jac->as_relax_times = 1; 1949863406b8SStefano Zampini jac->as_relax_weight = 1.0; 1950863406b8SStefano Zampini jac->as_omega = 1.0; 19514cb006feSStefano Zampini /* Vector valued Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1952863406b8SStefano Zampini jac->as_amg_alpha_opts[0] = 10; 1953863406b8SStefano Zampini jac->as_amg_alpha_opts[1] = 1; 19540bdd8552SBarry Smith jac->as_amg_alpha_opts[2] = 6; 1955863406b8SStefano Zampini jac->as_amg_alpha_opts[3] = 6; 1956863406b8SStefano Zampini jac->as_amg_alpha_opts[4] = 4; 1957863406b8SStefano Zampini jac->as_amg_alpha_theta = 0.25; 19584cb006feSStefano Zampini /* Scalar Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1959863406b8SStefano Zampini jac->as_amg_beta_opts[0] = 10; 1960863406b8SStefano Zampini jac->as_amg_beta_opts[1] = 1; 19610bdd8552SBarry Smith jac->as_amg_beta_opts[2] = 6; 1962863406b8SStefano Zampini jac->as_amg_beta_opts[3] = 6; 1963863406b8SStefano Zampini jac->as_amg_beta_opts[4] = 4; 1964863406b8SStefano Zampini jac->as_amg_beta_theta = 0.25; 1965863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetPrintLevel,(jac->hsolver,jac->as_print)); 1966863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 19674cb006feSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 1968863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetTol,(jac->hsolver,jac->as_tol)); 1969863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1970863406b8SStefano Zampini jac->as_relax_times, 1971863406b8SStefano Zampini jac->as_relax_weight, 1972863406b8SStefano Zampini jac->as_omega)); 1973863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaAMGOptions,(jac->hsolver,jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1974863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1975863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1976863406b8SStefano Zampini jac->as_amg_alpha_theta, 1977863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1978863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 1979863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1980863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1981863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1982863406b8SStefano Zampini jac->as_amg_beta_theta, 1983863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1984863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 198523df4f25SStefano Zampini /* Zero conductivity */ 198623df4f25SStefano Zampini jac->ams_beta_is_zero = PETSC_FALSE; 198723df4f25SStefano Zampini jac->ams_beta_is_zero_part = PETSC_FALSE; 19884cb006feSStefano Zampini PetscFunctionReturn(0); 19894cb006feSStefano Zampini } 1990863406b8SStefano Zampini ierr = PetscStrcmp("ads",jac->hypre_type,&flag);CHKERRQ(ierr); 1991863406b8SStefano Zampini if (flag) { 1992863406b8SStefano Zampini ierr = HYPRE_ADSCreate(&jac->hsolver); 1993863406b8SStefano Zampini pc->ops->setfromoptions = PCSetFromOptions_HYPRE_ADS; 1994863406b8SStefano Zampini pc->ops->view = PCView_HYPRE_ADS; 1995863406b8SStefano Zampini jac->destroy = HYPRE_ADSDestroy; 1996863406b8SStefano Zampini jac->setup = HYPRE_ADSSetup; 1997863406b8SStefano Zampini jac->solve = HYPRE_ADSSolve; 1998863406b8SStefano Zampini jac->coords[0] = NULL; 1999863406b8SStefano Zampini jac->coords[1] = NULL; 2000863406b8SStefano Zampini jac->coords[2] = NULL; 2001863406b8SStefano Zampini /* solver parameters: these are borrowed from mfem package, and they are not the default values from HYPRE ADS */ 2002863406b8SStefano Zampini jac->as_print = 0; 2003863406b8SStefano Zampini jac->as_max_iter = 1; /* used as a preconditioner */ 2004863406b8SStefano Zampini jac->as_tol = 0.; /* used as a preconditioner */ 2005863406b8SStefano Zampini jac->ads_cycle_type = 13; 2006863406b8SStefano Zampini /* Smoothing options */ 2007863406b8SStefano Zampini jac->as_relax_type = 2; 2008863406b8SStefano Zampini jac->as_relax_times = 1; 2009863406b8SStefano Zampini jac->as_relax_weight = 1.0; 2010863406b8SStefano Zampini jac->as_omega = 1.0; 2011863406b8SStefano Zampini /* AMS solver parameters: cycle_type, coarsen type, agg_levels, relax_type, interp_type, Pmax */ 2012863406b8SStefano Zampini jac->ams_cycle_type = 14; 2013863406b8SStefano Zampini jac->as_amg_alpha_opts[0] = 10; 2014863406b8SStefano Zampini jac->as_amg_alpha_opts[1] = 1; 2015863406b8SStefano Zampini jac->as_amg_alpha_opts[2] = 6; 2016863406b8SStefano Zampini jac->as_amg_alpha_opts[3] = 6; 2017863406b8SStefano Zampini jac->as_amg_alpha_opts[4] = 4; 2018863406b8SStefano Zampini jac->as_amg_alpha_theta = 0.25; 2019863406b8SStefano Zampini /* Vector Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 2020863406b8SStefano Zampini jac->as_amg_beta_opts[0] = 10; 2021863406b8SStefano Zampini jac->as_amg_beta_opts[1] = 1; 2022863406b8SStefano Zampini jac->as_amg_beta_opts[2] = 6; 2023863406b8SStefano Zampini jac->as_amg_beta_opts[3] = 6; 2024863406b8SStefano Zampini jac->as_amg_beta_opts[4] = 4; 2025863406b8SStefano Zampini jac->as_amg_beta_theta = 0.25; 2026863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetPrintLevel,(jac->hsolver,jac->as_print)); 2027863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 2028863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 2029863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetTol,(jac->hsolver,jac->as_tol)); 2030863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 2031863406b8SStefano Zampini jac->as_relax_times, 2032863406b8SStefano Zampini jac->as_relax_weight, 2033863406b8SStefano Zampini jac->as_omega)); 2034863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMSOptions,(jac->hsolver,jac->ams_cycle_type, /* AMG coarsen type */ 2035863406b8SStefano Zampini jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 2036863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 2037863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 2038863406b8SStefano Zampini jac->as_amg_alpha_theta, 2039863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 2040863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 2041863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 2042863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 2043863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 2044863406b8SStefano Zampini jac->as_amg_beta_theta, 2045863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 2046863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 2047863406b8SStefano Zampini PetscFunctionReturn(0); 2048863406b8SStefano Zampini } 2049503cfb0cSBarry Smith ierr = PetscFree(jac->hypre_type);CHKERRQ(ierr); 20502fa5cd67SKarl Rupp 20510298fd71SBarry Smith jac->hypre_type = NULL; 2052db966c6cSHong Zhang SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown HYPRE preconditioner %s; Choices are euclid, pilut, parasails, boomeramg, ams",name); 205316d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 205416d9e3a6SLisandro Dalcin } 205516d9e3a6SLisandro Dalcin 205616d9e3a6SLisandro Dalcin /* 205716d9e3a6SLisandro Dalcin It only gets here if the HYPRE type has not been set before the call to 205816d9e3a6SLisandro Dalcin ...SetFromOptions() which actually is most of the time 205916d9e3a6SLisandro Dalcin */ 2060360ee056SFande Kong PetscErrorCode PCSetFromOptions_HYPRE(PetscOptionItems *PetscOptionsObject,PC pc) 206116d9e3a6SLisandro Dalcin { 206216d9e3a6SLisandro Dalcin PetscErrorCode ierr; 20634ddd07fcSJed Brown PetscInt indx; 2064db966c6cSHong Zhang const char *type[] = {"euclid","pilut","parasails","boomeramg","ams","ads"}; 2065ace3abfcSBarry Smith PetscBool flg; 206616d9e3a6SLisandro Dalcin 206716d9e3a6SLisandro Dalcin PetscFunctionBegin; 20689fa463a7SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE preconditioner options");CHKERRQ(ierr); 2069cab5ea25SPierre Jolivet ierr = PetscOptionsEList("-pc_hypre_type","HYPRE preconditioner type","PCHYPRESetType",type,ALEN(type),"boomeramg",&indx,&flg);CHKERRQ(ierr); 207016d9e3a6SLisandro Dalcin if (flg) { 207116d9e3a6SLisandro Dalcin ierr = PCHYPRESetType_HYPRE(pc,type[indx]);CHKERRQ(ierr); 207202a17cd4SBarry Smith } else { 207302a17cd4SBarry Smith ierr = PCHYPRESetType_HYPRE(pc,"boomeramg");CHKERRQ(ierr); 207416d9e3a6SLisandro Dalcin } 207516d9e3a6SLisandro Dalcin if (pc->ops->setfromoptions) { 20763931853cSBarry Smith ierr = pc->ops->setfromoptions(PetscOptionsObject,pc);CHKERRQ(ierr); 207716d9e3a6SLisandro Dalcin } 207816d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 207916d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 208016d9e3a6SLisandro Dalcin } 208116d9e3a6SLisandro Dalcin 208216d9e3a6SLisandro Dalcin /*@C 208316d9e3a6SLisandro Dalcin PCHYPRESetType - Sets which hypre preconditioner you wish to use 208416d9e3a6SLisandro Dalcin 208516d9e3a6SLisandro Dalcin Input Parameters: 208616d9e3a6SLisandro Dalcin + pc - the preconditioner context 2087db966c6cSHong Zhang - name - either euclid, pilut, parasails, boomeramg, ams, ads 208816d9e3a6SLisandro Dalcin 208916d9e3a6SLisandro Dalcin Options Database Keys: 2090db966c6cSHong Zhang -pc_hypre_type - One of euclid, pilut, parasails, boomeramg, ams, ads 209116d9e3a6SLisandro Dalcin 209216d9e3a6SLisandro Dalcin Level: intermediate 209316d9e3a6SLisandro Dalcin 209416d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 209516d9e3a6SLisandro Dalcin PCHYPRE 209616d9e3a6SLisandro Dalcin 209716d9e3a6SLisandro Dalcin @*/ 20987087cfbeSBarry Smith PetscErrorCode PCHYPRESetType(PC pc,const char name[]) 209916d9e3a6SLisandro Dalcin { 21004ac538c5SBarry Smith PetscErrorCode ierr; 210116d9e3a6SLisandro Dalcin 210216d9e3a6SLisandro Dalcin PetscFunctionBegin; 21030700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 210416d9e3a6SLisandro Dalcin PetscValidCharPointer(name,2); 21054ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCHYPRESetType_C",(PC,const char[]),(pc,name));CHKERRQ(ierr); 210616d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 210716d9e3a6SLisandro Dalcin } 210816d9e3a6SLisandro Dalcin 210916d9e3a6SLisandro Dalcin /*@C 211016d9e3a6SLisandro Dalcin PCHYPREGetType - Gets which hypre preconditioner you are using 211116d9e3a6SLisandro Dalcin 211216d9e3a6SLisandro Dalcin Input Parameter: 211316d9e3a6SLisandro Dalcin . pc - the preconditioner context 211416d9e3a6SLisandro Dalcin 211516d9e3a6SLisandro Dalcin Output Parameter: 2116db966c6cSHong Zhang . name - either euclid, pilut, parasails, boomeramg, ams, ads 211716d9e3a6SLisandro Dalcin 211816d9e3a6SLisandro Dalcin Level: intermediate 211916d9e3a6SLisandro Dalcin 212016d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCHYPRESetType(), PCType (for list of available types), PC, 212116d9e3a6SLisandro Dalcin PCHYPRE 212216d9e3a6SLisandro Dalcin 212316d9e3a6SLisandro Dalcin @*/ 21247087cfbeSBarry Smith PetscErrorCode PCHYPREGetType(PC pc,const char *name[]) 212516d9e3a6SLisandro Dalcin { 21264ac538c5SBarry Smith PetscErrorCode ierr; 212716d9e3a6SLisandro Dalcin 212816d9e3a6SLisandro Dalcin PetscFunctionBegin; 21290700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 213016d9e3a6SLisandro Dalcin PetscValidPointer(name,2); 21314ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCHYPREGetType_C",(PC,const char*[]),(pc,name));CHKERRQ(ierr); 213216d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 213316d9e3a6SLisandro Dalcin } 213416d9e3a6SLisandro Dalcin 213516d9e3a6SLisandro Dalcin /*MC 213616d9e3a6SLisandro Dalcin PCHYPRE - Allows you to use the matrix element based preconditioners in the LLNL package hypre 213716d9e3a6SLisandro Dalcin 213816d9e3a6SLisandro Dalcin Options Database Keys: 2139db966c6cSHong Zhang + -pc_hypre_type - One of euclid, pilut, parasails, boomeramg, ams, ads 214016d9e3a6SLisandro Dalcin - Too many others to list, run with -pc_type hypre -pc_hypre_type XXX -help to see options for the XXX 214116d9e3a6SLisandro Dalcin preconditioner 214216d9e3a6SLisandro Dalcin 214316d9e3a6SLisandro Dalcin Level: intermediate 214416d9e3a6SLisandro Dalcin 214595452b02SPatrick Sanan Notes: 214695452b02SPatrick Sanan Apart from pc_hypre_type (for which there is PCHYPRESetType()), 214716d9e3a6SLisandro Dalcin the many hypre options can ONLY be set via the options database (e.g. the command line 214816d9e3a6SLisandro Dalcin or with PetscOptionsSetValue(), there are no functions to set them) 214916d9e3a6SLisandro Dalcin 2150c231f9e3SBarryFSmith The options -pc_hypre_boomeramg_max_iter and -pc_hypre_boomeramg_tol refer to the number of iterations 21510f1074feSSatish Balay (V-cycles) and tolerance that boomeramg does EACH time it is called. So for example, if 21520f1074feSSatish Balay -pc_hypre_boomeramg_max_iter is set to 2 then 2-V-cycles are being used to define the preconditioner 2153c231f9e3SBarryFSmith (-pc_hypre_boomeramg_tol should be set to 0.0 - the default - to strictly use a fixed number of 21548f87f92bSBarry Smith iterations per hypre call). -ksp_max_it and -ksp_rtol STILL determine the total number of iterations 21550f1074feSSatish Balay and tolerance for the Krylov solver. For example, if -pc_hypre_boomeramg_max_iter is 2 and -ksp_max_it is 10 21560f1074feSSatish Balay then AT MOST twenty V-cycles of boomeramg will be called. 215716d9e3a6SLisandro Dalcin 21580f1074feSSatish Balay Note that the option -pc_hypre_boomeramg_relax_type_all defaults to symmetric relaxation 21590f1074feSSatish Balay (symmetric-SOR/Jacobi), which is required for Krylov solvers like CG that expect symmetry. 21600f1074feSSatish Balay Otherwise, you may want to use -pc_hypre_boomeramg_relax_type_all SOR/Jacobi. 216116d9e3a6SLisandro Dalcin If you wish to use BoomerAMG WITHOUT a Krylov method use -ksp_type richardson NOT -ksp_type preonly 216216d9e3a6SLisandro Dalcin and use -ksp_max_it to control the number of V-cycles. 216316d9e3a6SLisandro Dalcin (see the PETSc FAQ.html at the PETSc website under the Documentation tab). 216416d9e3a6SLisandro Dalcin 216516d9e3a6SLisandro Dalcin 2007-02-03 Using HYPRE-1.11.1b, the routine HYPRE_BoomerAMGSolveT and the option 216616d9e3a6SLisandro Dalcin -pc_hypre_parasails_reuse were failing with SIGSEGV. Dalcin L. 216716d9e3a6SLisandro Dalcin 21685272c319SBarry Smith MatSetNearNullSpace() - if you provide a near null space to your matrix it is ignored by hypre UNLESS you also use 2169fdd15c9aSJunchao Zhang the following two options: 21700b1a5bd9SEric Chamberland 2171fdd15c9aSJunchao Zhang Options Database Keys: 21725272c319SBarry Smith + -pc_hypre_boomeramg_nodal_coarsen <n> - where n is from 1 to 6 (see HYPRE_BOOMERAMGSetNodal()) 2173fdd15c9aSJunchao Zhang - -pc_hypre_boomeramg_vec_interp_variant <v> - where v is from 1 to 3 (see HYPRE_BoomerAMGSetInterpVecVariant()) 21745272c319SBarry Smith 21755272c319SBarry Smith Depending on the linear system you may see the same or different convergence depending on the values you use. 21765272c319SBarry Smith 21779e5bc791SBarry Smith See PCPFMG for access to the hypre Struct PFMG solver 21789e5bc791SBarry Smith 217916d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 21809e5bc791SBarry Smith PCHYPRESetType(), PCPFMG 218116d9e3a6SLisandro Dalcin 218216d9e3a6SLisandro Dalcin M*/ 218316d9e3a6SLisandro Dalcin 21848cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_HYPRE(PC pc) 218516d9e3a6SLisandro Dalcin { 218616d9e3a6SLisandro Dalcin PC_HYPRE *jac; 218716d9e3a6SLisandro Dalcin PetscErrorCode ierr; 218816d9e3a6SLisandro Dalcin 218916d9e3a6SLisandro Dalcin PetscFunctionBegin; 2190b00a9115SJed Brown ierr = PetscNewLog(pc,&jac);CHKERRQ(ierr); 21912fa5cd67SKarl Rupp 219216d9e3a6SLisandro Dalcin pc->data = jac; 21938695de01SBarry Smith pc->ops->reset = PCReset_HYPRE; 219416d9e3a6SLisandro Dalcin pc->ops->destroy = PCDestroy_HYPRE; 219516d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE; 219616d9e3a6SLisandro Dalcin pc->ops->setup = PCSetUp_HYPRE; 219716d9e3a6SLisandro Dalcin pc->ops->apply = PCApply_HYPRE; 219816d9e3a6SLisandro Dalcin jac->comm_hypre = MPI_COMM_NULL; 2199bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetType_C",PCHYPRESetType_HYPRE);CHKERRQ(ierr); 2200bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPREGetType_C",PCHYPREGetType_HYPRE);CHKERRQ(ierr); 22015ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCSetCoordinates_C",PCSetCoordinates_HYPRE);CHKERRQ(ierr); 22025ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteGradient_C",PCHYPRESetDiscreteGradient_HYPRE);CHKERRQ(ierr); 22035ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteCurl_C",PCHYPRESetDiscreteCurl_HYPRE);CHKERRQ(ierr); 22046bf688a0SCe Qin ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetInterpolations_C",PCHYPRESetInterpolations_HYPRE);CHKERRQ(ierr); 22055ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetEdgeConstantVectors_C",PCHYPRESetEdgeConstantVectors_HYPRE);CHKERRQ(ierr); 22065ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetPoissonMatrix_C",PCHYPRESetPoissonMatrix_HYPRE);CHKERRQ(ierr); 220716d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 220816d9e3a6SLisandro Dalcin } 2209ebc551c0SBarry Smith 2210f91d8e95SBarry Smith /* ---------------------------------------------------------------------------------------------------------------------------------*/ 2211f91d8e95SBarry Smith 2212ebc551c0SBarry Smith typedef struct { 221368326731SBarry Smith MPI_Comm hcomm; /* does not share comm with HYPRE_StructMatrix because need to create solver before getting matrix */ 2214f91d8e95SBarry Smith HYPRE_StructSolver hsolver; 22159e5bc791SBarry Smith 22169e5bc791SBarry Smith /* keep copy of PFMG options used so may view them */ 22174ddd07fcSJed Brown PetscInt its; 22189e5bc791SBarry Smith double tol; 22194ddd07fcSJed Brown PetscInt relax_type; 22204ddd07fcSJed Brown PetscInt rap_type; 22214ddd07fcSJed Brown PetscInt num_pre_relax,num_post_relax; 22224ddd07fcSJed Brown PetscInt max_levels; 2223ebc551c0SBarry Smith } PC_PFMG; 2224ebc551c0SBarry Smith 2225ebc551c0SBarry Smith PetscErrorCode PCDestroy_PFMG(PC pc) 2226ebc551c0SBarry Smith { 2227ebc551c0SBarry Smith PetscErrorCode ierr; 2228f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2229ebc551c0SBarry Smith 2230ebc551c0SBarry Smith PetscFunctionBegin; 22312fa5cd67SKarl Rupp if (ex->hsolver) PetscStackCallStandard(HYPRE_StructPFMGDestroy,(ex->hsolver)); 2232ffc4695bSBarry Smith ierr = MPI_Comm_free(&ex->hcomm);CHKERRMPI(ierr); 2233c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 2234ebc551c0SBarry Smith PetscFunctionReturn(0); 2235ebc551c0SBarry Smith } 2236ebc551c0SBarry Smith 22379e5bc791SBarry Smith static const char *PFMGRelaxType[] = {"Jacobi","Weighted-Jacobi","symmetric-Red/Black-Gauss-Seidel","Red/Black-Gauss-Seidel"}; 22389e5bc791SBarry Smith static const char *PFMGRAPType[] = {"Galerkin","non-Galerkin"}; 22399e5bc791SBarry Smith 2240ebc551c0SBarry Smith PetscErrorCode PCView_PFMG(PC pc,PetscViewer viewer) 2241ebc551c0SBarry Smith { 2242ebc551c0SBarry Smith PetscErrorCode ierr; 2243ace3abfcSBarry Smith PetscBool iascii; 2244f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2245ebc551c0SBarry Smith 2246ebc551c0SBarry Smith PetscFunctionBegin; 2247251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 22489e5bc791SBarry Smith if (iascii) { 22499e5bc791SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE PFMG preconditioning\n");CHKERRQ(ierr); 2250efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max iterations %d\n",ex->its);CHKERRQ(ierr); 2251efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerance %g\n",ex->tol);CHKERRQ(ierr); 2252efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relax type %s\n",PFMGRelaxType[ex->relax_type]);CHKERRQ(ierr); 2253efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RAP type %s\n",PFMGRAPType[ex->rap_type]);CHKERRQ(ierr); 2254efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number pre-relax %d post-relax %d\n",ex->num_pre_relax,ex->num_post_relax);CHKERRQ(ierr); 2255efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max levels %d\n",ex->max_levels);CHKERRQ(ierr); 22569e5bc791SBarry Smith } 2257ebc551c0SBarry Smith PetscFunctionReturn(0); 2258ebc551c0SBarry Smith } 2259ebc551c0SBarry Smith 22604416b707SBarry Smith PetscErrorCode PCSetFromOptions_PFMG(PetscOptionItems *PetscOptionsObject,PC pc) 2261ebc551c0SBarry Smith { 2262ebc551c0SBarry Smith PetscErrorCode ierr; 2263f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2264ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE; 2265ebc551c0SBarry Smith 2266ebc551c0SBarry Smith PetscFunctionBegin; 2267e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"PFMG options");CHKERRQ(ierr); 22680298fd71SBarry Smith ierr = PetscOptionsBool("-pc_pfmg_print_statistics","Print statistics","HYPRE_StructPFMGSetPrintLevel",flg,&flg,NULL);CHKERRQ(ierr); 226968326731SBarry Smith if (flg) { 22705bd1e576SStefano Zampini PetscStackCallStandard(HYPRE_StructPFMGSetPrintLevel,(ex->hsolver,3)); 227168326731SBarry Smith } 22720298fd71SBarry Smith ierr = PetscOptionsInt("-pc_pfmg_its","Number of iterations of PFMG to use as preconditioner","HYPRE_StructPFMGSetMaxIter",ex->its,&ex->its,NULL);CHKERRQ(ierr); 2273fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(ex->hsolver,ex->its)); 22740298fd71SBarry 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); 2275fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetNumPreRelax,(ex->hsolver,ex->num_pre_relax)); 22760298fd71SBarry 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); 2277fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetNumPostRelax,(ex->hsolver,ex->num_post_relax)); 22789e5bc791SBarry Smith 22790298fd71SBarry Smith ierr = PetscOptionsInt("-pc_pfmg_max_levels","Max Levels for MG hierarchy","HYPRE_StructPFMGSetMaxLevels",ex->max_levels,&ex->max_levels,NULL);CHKERRQ(ierr); 2280fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxLevels,(ex->hsolver,ex->max_levels)); 22813b46a515SGlenn Hammond 22820298fd71SBarry Smith ierr = PetscOptionsReal("-pc_pfmg_tol","Tolerance of PFMG","HYPRE_StructPFMGSetTol",ex->tol,&ex->tol,NULL);CHKERRQ(ierr); 2283fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(ex->hsolver,ex->tol)); 22840298fd71SBarry 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); 2285fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetRelaxType,(ex->hsolver, ex->relax_type)); 22860298fd71SBarry Smith ierr = PetscOptionsEList("-pc_pfmg_rap_type","RAP type","HYPRE_StructPFMGSetRAPType",PFMGRAPType,ALEN(PFMGRAPType),PFMGRAPType[ex->rap_type],&ex->rap_type,NULL);CHKERRQ(ierr); 2287fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetRAPType,(ex->hsolver, ex->rap_type)); 2288ebc551c0SBarry Smith ierr = PetscOptionsTail();CHKERRQ(ierr); 2289ebc551c0SBarry Smith PetscFunctionReturn(0); 2290ebc551c0SBarry Smith } 2291ebc551c0SBarry Smith 2292f91d8e95SBarry Smith PetscErrorCode PCApply_PFMG(PC pc,Vec x,Vec y) 2293f91d8e95SBarry Smith { 2294f91d8e95SBarry Smith PetscErrorCode ierr; 2295f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2296d9ca1df4SBarry Smith PetscScalar *yy; 2297d9ca1df4SBarry Smith const PetscScalar *xx; 22984ddd07fcSJed Brown PetscInt ilower[3],iupper[3]; 22992cf14000SStefano Zampini HYPRE_Int hlower[3],hupper[3]; 230068326731SBarry Smith Mat_HYPREStruct *mx = (Mat_HYPREStruct*)(pc->pmat->data); 2301f91d8e95SBarry Smith 2302f91d8e95SBarry Smith PetscFunctionBegin; 2303dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2304aa219208SBarry Smith ierr = DMDAGetCorners(mx->da,&ilower[0],&ilower[1],&ilower[2],&iupper[0],&iupper[1],&iupper[2]);CHKERRQ(ierr); 23052cf14000SStefano Zampini /* when HYPRE_MIXEDINT is defined, sizeof(HYPRE_Int) == 32 */ 2306f91d8e95SBarry Smith iupper[0] += ilower[0] - 1; 2307f91d8e95SBarry Smith iupper[1] += ilower[1] - 1; 2308f91d8e95SBarry Smith iupper[2] += ilower[2] - 1; 23092cf14000SStefano Zampini hlower[0] = (HYPRE_Int)ilower[0]; 23102cf14000SStefano Zampini hlower[1] = (HYPRE_Int)ilower[1]; 23112cf14000SStefano Zampini hlower[2] = (HYPRE_Int)ilower[2]; 23122cf14000SStefano Zampini hupper[0] = (HYPRE_Int)iupper[0]; 23132cf14000SStefano Zampini hupper[1] = (HYPRE_Int)iupper[1]; 23142cf14000SStefano Zampini hupper[2] = (HYPRE_Int)iupper[2]; 2315f91d8e95SBarry Smith 2316f91d8e95SBarry Smith /* copy x values over to hypre */ 2317fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructVectorSetConstantValues,(mx->hb,0.0)); 2318d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 231939accc25SStefano Zampini PetscStackCallStandard(HYPRE_StructVectorSetBoxValues,(mx->hb,hlower,hupper,(HYPRE_Complex*)xx)); 2320d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 2321fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructVectorAssemble,(mx->hb)); 2322fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSolve,(ex->hsolver,mx->hmat,mx->hb,mx->hx)); 2323f91d8e95SBarry Smith 2324f91d8e95SBarry Smith /* copy solution values back to PETSc */ 2325f91d8e95SBarry Smith ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 232639accc25SStefano Zampini PetscStackCallStandard(HYPRE_StructVectorGetBoxValues,(mx->hx,hlower,hupper,(HYPRE_Complex*)yy)); 2327f91d8e95SBarry Smith ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 2328f91d8e95SBarry Smith PetscFunctionReturn(0); 2329f91d8e95SBarry Smith } 2330f91d8e95SBarry Smith 2331ace3abfcSBarry 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) 23329e5bc791SBarry Smith { 23339e5bc791SBarry Smith PC_PFMG *jac = (PC_PFMG*)pc->data; 23349e5bc791SBarry Smith PetscErrorCode ierr; 23352cf14000SStefano Zampini HYPRE_Int oits; 23369e5bc791SBarry Smith 23379e5bc791SBarry Smith PetscFunctionBegin; 2338dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2339fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(jac->hsolver,its*jac->its)); 2340fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(jac->hsolver,rtol)); 23419e5bc791SBarry Smith 23429e5bc791SBarry Smith ierr = PCApply_PFMG(pc,b,y);CHKERRQ(ierr); 23432cf14000SStefano Zampini PetscStackCallStandard(HYPRE_StructPFMGGetNumIterations,(jac->hsolver,&oits)); 23449e5bc791SBarry Smith *outits = oits; 23459e5bc791SBarry Smith if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 23469e5bc791SBarry Smith else *reason = PCRICHARDSON_CONVERGED_RTOL; 2347fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(jac->hsolver,jac->tol)); 2348fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(jac->hsolver,jac->its)); 23499e5bc791SBarry Smith PetscFunctionReturn(0); 23509e5bc791SBarry Smith } 23519e5bc791SBarry Smith 23523a32d3dbSGlenn Hammond PetscErrorCode PCSetUp_PFMG(PC pc) 23533a32d3dbSGlenn Hammond { 23543a32d3dbSGlenn Hammond PetscErrorCode ierr; 23553a32d3dbSGlenn Hammond PC_PFMG *ex = (PC_PFMG*) pc->data; 23563a32d3dbSGlenn Hammond Mat_HYPREStruct *mx = (Mat_HYPREStruct*)(pc->pmat->data); 2357ace3abfcSBarry Smith PetscBool flg; 23583a32d3dbSGlenn Hammond 23593a32d3dbSGlenn Hammond PetscFunctionBegin; 2360251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRESTRUCT,&flg);CHKERRQ(ierr); 2361ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_INCOMP,"Must use MATHYPRESTRUCT with this preconditioner"); 23623a32d3dbSGlenn Hammond 23633a32d3dbSGlenn Hammond /* create the hypre solver object and set its information */ 23642fa5cd67SKarl Rupp if (ex->hsolver) PetscStackCallStandard(HYPRE_StructPFMGDestroy,(ex->hsolver)); 2365fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGCreate,(ex->hcomm,&ex->hsolver)); 2366fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetup,(ex->hsolver,mx->hmat,mx->hb,mx->hx)); 2367fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetZeroGuess,(ex->hsolver)); 23683a32d3dbSGlenn Hammond PetscFunctionReturn(0); 23693a32d3dbSGlenn Hammond } 23703a32d3dbSGlenn Hammond 2371ebc551c0SBarry Smith /*MC 2372ebc551c0SBarry Smith PCPFMG - the hypre PFMG multigrid solver 2373ebc551c0SBarry Smith 2374ebc551c0SBarry Smith Level: advanced 2375ebc551c0SBarry Smith 23769e5bc791SBarry Smith Options Database: 23779e5bc791SBarry Smith + -pc_pfmg_its <its> number of iterations of PFMG to use as preconditioner 23789e5bc791SBarry Smith . -pc_pfmg_num_pre_relax <steps> number of smoothing steps before coarse grid 23799e5bc791SBarry Smith . -pc_pfmg_num_post_relax <steps> number of smoothing steps after coarse grid 23809e5bc791SBarry Smith . -pc_pfmg_tol <tol> tolerance of PFMG 23819e5bc791SBarry 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 23829e5bc791SBarry Smith - -pc_pfmg_rap_type - type of coarse matrix generation, one of Galerkin,non-Galerkin 2383f91d8e95SBarry Smith 238495452b02SPatrick Sanan Notes: 238595452b02SPatrick Sanan This is for CELL-centered descretizations 23869e5bc791SBarry Smith 23878e395302SJed Brown This must be used with the MATHYPRESTRUCT matrix type. 2388aa219208SBarry Smith This is less general than in hypre, it supports only one block per process defined by a PETSc DMDA. 23899e5bc791SBarry Smith 23909e5bc791SBarry Smith .seealso: PCMG, MATHYPRESTRUCT 2391ebc551c0SBarry Smith M*/ 2392ebc551c0SBarry Smith 23938cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_PFMG(PC pc) 2394ebc551c0SBarry Smith { 2395ebc551c0SBarry Smith PetscErrorCode ierr; 2396ebc551c0SBarry Smith PC_PFMG *ex; 2397ebc551c0SBarry Smith 2398ebc551c0SBarry Smith PetscFunctionBegin; 2399b00a9115SJed Brown ierr = PetscNew(&ex);CHKERRQ(ierr); \ 240068326731SBarry Smith pc->data = ex; 2401ebc551c0SBarry Smith 24029e5bc791SBarry Smith ex->its = 1; 24039e5bc791SBarry Smith ex->tol = 1.e-8; 24049e5bc791SBarry Smith ex->relax_type = 1; 24059e5bc791SBarry Smith ex->rap_type = 0; 24069e5bc791SBarry Smith ex->num_pre_relax = 1; 24079e5bc791SBarry Smith ex->num_post_relax = 1; 24083b46a515SGlenn Hammond ex->max_levels = 0; 24099e5bc791SBarry Smith 2410ebc551c0SBarry Smith pc->ops->setfromoptions = PCSetFromOptions_PFMG; 2411ebc551c0SBarry Smith pc->ops->view = PCView_PFMG; 2412ebc551c0SBarry Smith pc->ops->destroy = PCDestroy_PFMG; 2413f91d8e95SBarry Smith pc->ops->apply = PCApply_PFMG; 24149e5bc791SBarry Smith pc->ops->applyrichardson = PCApplyRichardson_PFMG; 241568326731SBarry Smith pc->ops->setup = PCSetUp_PFMG; 24162fa5cd67SKarl Rupp 2417ffc4695bSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(ex->hcomm));CHKERRMPI(ierr); 2418fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGCreate,(ex->hcomm,&ex->hsolver)); 2419ebc551c0SBarry Smith PetscFunctionReturn(0); 2420ebc551c0SBarry Smith } 2421d851a50bSGlenn Hammond 2422325fc9f4SBarry Smith /* ---------------------------------------------------------------------------------------------------------------------------------------------------*/ 2423325fc9f4SBarry Smith 2424d851a50bSGlenn Hammond /* we know we are working with a HYPRE_SStructMatrix */ 2425d851a50bSGlenn Hammond typedef struct { 2426d851a50bSGlenn Hammond MPI_Comm hcomm; /* does not share comm with HYPRE_SStructMatrix because need to create solver before getting matrix */ 2427d851a50bSGlenn Hammond HYPRE_SStructSolver ss_solver; 2428d851a50bSGlenn Hammond 2429d851a50bSGlenn Hammond /* keep copy of SYSPFMG options used so may view them */ 24304ddd07fcSJed Brown PetscInt its; 2431d851a50bSGlenn Hammond double tol; 24324ddd07fcSJed Brown PetscInt relax_type; 24334ddd07fcSJed Brown PetscInt num_pre_relax,num_post_relax; 2434d851a50bSGlenn Hammond } PC_SysPFMG; 2435d851a50bSGlenn Hammond 2436d851a50bSGlenn Hammond PetscErrorCode PCDestroy_SysPFMG(PC pc) 2437d851a50bSGlenn Hammond { 2438d851a50bSGlenn Hammond PetscErrorCode ierr; 2439d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2440d851a50bSGlenn Hammond 2441d851a50bSGlenn Hammond PetscFunctionBegin; 24422fa5cd67SKarl Rupp if (ex->ss_solver) PetscStackCallStandard(HYPRE_SStructSysPFMGDestroy,(ex->ss_solver)); 2443ffc4695bSBarry Smith ierr = MPI_Comm_free(&ex->hcomm);CHKERRMPI(ierr); 2444c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 2445d851a50bSGlenn Hammond PetscFunctionReturn(0); 2446d851a50bSGlenn Hammond } 2447d851a50bSGlenn Hammond 2448d851a50bSGlenn Hammond static const char *SysPFMGRelaxType[] = {"Weighted-Jacobi","Red/Black-Gauss-Seidel"}; 2449d851a50bSGlenn Hammond 2450d851a50bSGlenn Hammond PetscErrorCode PCView_SysPFMG(PC pc,PetscViewer viewer) 2451d851a50bSGlenn Hammond { 2452d851a50bSGlenn Hammond PetscErrorCode ierr; 2453ace3abfcSBarry Smith PetscBool iascii; 2454d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2455d851a50bSGlenn Hammond 2456d851a50bSGlenn Hammond PetscFunctionBegin; 2457251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 2458d851a50bSGlenn Hammond if (iascii) { 2459d851a50bSGlenn Hammond ierr = PetscViewerASCIIPrintf(viewer," HYPRE SysPFMG preconditioning\n");CHKERRQ(ierr); 2460efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max iterations %d\n",ex->its);CHKERRQ(ierr); 2461efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerance %g\n",ex->tol);CHKERRQ(ierr); 2462efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relax type %s\n",PFMGRelaxType[ex->relax_type]);CHKERRQ(ierr); 2463efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number pre-relax %d post-relax %d\n",ex->num_pre_relax,ex->num_post_relax);CHKERRQ(ierr); 2464d851a50bSGlenn Hammond } 2465d851a50bSGlenn Hammond PetscFunctionReturn(0); 2466d851a50bSGlenn Hammond } 2467d851a50bSGlenn Hammond 24684416b707SBarry Smith PetscErrorCode PCSetFromOptions_SysPFMG(PetscOptionItems *PetscOptionsObject,PC pc) 2469d851a50bSGlenn Hammond { 2470d851a50bSGlenn Hammond PetscErrorCode ierr; 2471d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2472ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE; 2473d851a50bSGlenn Hammond 2474d851a50bSGlenn Hammond PetscFunctionBegin; 2475e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"SysPFMG options");CHKERRQ(ierr); 24760298fd71SBarry Smith ierr = PetscOptionsBool("-pc_syspfmg_print_statistics","Print statistics","HYPRE_SStructSysPFMGSetPrintLevel",flg,&flg,NULL);CHKERRQ(ierr); 2477d851a50bSGlenn Hammond if (flg) { 24785bd1e576SStefano Zampini PetscStackCallStandard(HYPRE_SStructSysPFMGSetPrintLevel,(ex->ss_solver,3)); 2479d851a50bSGlenn Hammond } 24800298fd71SBarry Smith ierr = PetscOptionsInt("-pc_syspfmg_its","Number of iterations of SysPFMG to use as preconditioner","HYPRE_SStructSysPFMGSetMaxIter",ex->its,&ex->its,NULL);CHKERRQ(ierr); 2481fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(ex->ss_solver,ex->its)); 24820298fd71SBarry 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); 2483fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetNumPreRelax,(ex->ss_solver,ex->num_pre_relax)); 24840298fd71SBarry 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); 2485fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetNumPostRelax,(ex->ss_solver,ex->num_post_relax)); 2486d851a50bSGlenn Hammond 24870298fd71SBarry Smith ierr = PetscOptionsReal("-pc_syspfmg_tol","Tolerance of SysPFMG","HYPRE_SStructSysPFMGSetTol",ex->tol,&ex->tol,NULL);CHKERRQ(ierr); 2488fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(ex->ss_solver,ex->tol)); 248961710fbeSStefano 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); 2490fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetRelaxType,(ex->ss_solver, ex->relax_type)); 2491d851a50bSGlenn Hammond ierr = PetscOptionsTail();CHKERRQ(ierr); 2492d851a50bSGlenn Hammond PetscFunctionReturn(0); 2493d851a50bSGlenn Hammond } 2494d851a50bSGlenn Hammond 2495d851a50bSGlenn Hammond PetscErrorCode PCApply_SysPFMG(PC pc,Vec x,Vec y) 2496d851a50bSGlenn Hammond { 2497d851a50bSGlenn Hammond PetscErrorCode ierr; 2498d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2499d9ca1df4SBarry Smith PetscScalar *yy; 2500d9ca1df4SBarry Smith const PetscScalar *xx; 25014ddd07fcSJed Brown PetscInt ilower[3],iupper[3]; 25022cf14000SStefano Zampini HYPRE_Int hlower[3],hupper[3]; 2503d851a50bSGlenn Hammond Mat_HYPRESStruct *mx = (Mat_HYPRESStruct*)(pc->pmat->data); 25044ddd07fcSJed Brown PetscInt ordering= mx->dofs_order; 25054ddd07fcSJed Brown PetscInt nvars = mx->nvars; 25064ddd07fcSJed Brown PetscInt part = 0; 25074ddd07fcSJed Brown PetscInt size; 25084ddd07fcSJed Brown PetscInt i; 2509d851a50bSGlenn Hammond 2510d851a50bSGlenn Hammond PetscFunctionBegin; 2511dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2512aa219208SBarry Smith ierr = DMDAGetCorners(mx->da,&ilower[0],&ilower[1],&ilower[2],&iupper[0],&iupper[1],&iupper[2]);CHKERRQ(ierr); 25132cf14000SStefano Zampini /* when HYPRE_MIXEDINT is defined, sizeof(HYPRE_Int) == 32 */ 2514d851a50bSGlenn Hammond iupper[0] += ilower[0] - 1; 2515d851a50bSGlenn Hammond iupper[1] += ilower[1] - 1; 2516d851a50bSGlenn Hammond iupper[2] += ilower[2] - 1; 25172cf14000SStefano Zampini hlower[0] = (HYPRE_Int)ilower[0]; 25182cf14000SStefano Zampini hlower[1] = (HYPRE_Int)ilower[1]; 25192cf14000SStefano Zampini hlower[2] = (HYPRE_Int)ilower[2]; 25202cf14000SStefano Zampini hupper[0] = (HYPRE_Int)iupper[0]; 25212cf14000SStefano Zampini hupper[1] = (HYPRE_Int)iupper[1]; 25222cf14000SStefano Zampini hupper[2] = (HYPRE_Int)iupper[2]; 2523d851a50bSGlenn Hammond 2524d851a50bSGlenn Hammond size = 1; 25252fa5cd67SKarl Rupp for (i= 0; i< 3; i++) size *= (iupper[i]-ilower[i]+1); 25262fa5cd67SKarl Rupp 2527d851a50bSGlenn Hammond /* copy x values over to hypre for variable ordering */ 2528d851a50bSGlenn Hammond if (ordering) { 2529fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorSetConstantValues,(mx->ss_b,0.0)); 2530d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 253139accc25SStefano Zampini for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorSetBoxValues,(mx->ss_b,part,hlower,hupper,i,(HYPRE_Complex*)(xx+(size*i)))); 2532d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 2533fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorAssemble,(mx->ss_b)); 2534fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructMatrixMatvec,(1.0,mx->ss_mat,mx->ss_b,0.0,mx->ss_x)); 2535fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSolve,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2536d851a50bSGlenn Hammond 2537d851a50bSGlenn Hammond /* copy solution values back to PETSc */ 2538d851a50bSGlenn Hammond ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 253939accc25SStefano Zampini for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorGetBoxValues,(mx->ss_x,part,hlower,hupper,i,(HYPRE_Complex*)(yy+(size*i)))); 2540d851a50bSGlenn Hammond ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 2541a65764d7SBarry Smith } else { /* nodal ordering must be mapped to variable ordering for sys_pfmg */ 2542d851a50bSGlenn Hammond PetscScalar *z; 25434ddd07fcSJed Brown PetscInt j, k; 2544d851a50bSGlenn Hammond 2545785e854fSJed Brown ierr = PetscMalloc1(nvars*size,&z);CHKERRQ(ierr); 2546fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorSetConstantValues,(mx->ss_b,0.0)); 2547d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 2548d851a50bSGlenn Hammond 2549d851a50bSGlenn Hammond /* transform nodal to hypre's variable ordering for sys_pfmg */ 2550d851a50bSGlenn Hammond for (i= 0; i< size; i++) { 2551d851a50bSGlenn Hammond k= i*nvars; 25522fa5cd67SKarl Rupp for (j= 0; j< nvars; j++) z[j*size+i]= xx[k+j]; 2553d851a50bSGlenn Hammond } 255439accc25SStefano Zampini for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorSetBoxValues,(mx->ss_b,part,hlower,hupper,i,(HYPRE_Complex*)(z+(size*i)))); 2555d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 2556fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorAssemble,(mx->ss_b)); 2557fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSolve,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2558d851a50bSGlenn Hammond 2559d851a50bSGlenn Hammond /* copy solution values back to PETSc */ 2560d851a50bSGlenn Hammond ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 256139accc25SStefano Zampini for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorGetBoxValues,(mx->ss_x,part,hlower,hupper,i,(HYPRE_Complex*)(z+(size*i)))); 2562d851a50bSGlenn Hammond /* transform hypre's variable ordering for sys_pfmg to nodal ordering */ 2563d851a50bSGlenn Hammond for (i= 0; i< size; i++) { 2564d851a50bSGlenn Hammond k= i*nvars; 25652fa5cd67SKarl Rupp for (j= 0; j< nvars; j++) yy[k+j]= z[j*size+i]; 2566d851a50bSGlenn Hammond } 2567d851a50bSGlenn Hammond ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 2568d851a50bSGlenn Hammond ierr = PetscFree(z);CHKERRQ(ierr); 2569d851a50bSGlenn Hammond } 2570d851a50bSGlenn Hammond PetscFunctionReturn(0); 2571d851a50bSGlenn Hammond } 2572d851a50bSGlenn Hammond 2573ace3abfcSBarry 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) 2574d851a50bSGlenn Hammond { 2575d851a50bSGlenn Hammond PC_SysPFMG *jac = (PC_SysPFMG*)pc->data; 2576d851a50bSGlenn Hammond PetscErrorCode ierr; 25772cf14000SStefano Zampini HYPRE_Int oits; 2578d851a50bSGlenn Hammond 2579d851a50bSGlenn Hammond PetscFunctionBegin; 2580dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2581fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(jac->ss_solver,its*jac->its)); 2582fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(jac->ss_solver,rtol)); 2583d851a50bSGlenn Hammond ierr = PCApply_SysPFMG(pc,b,y);CHKERRQ(ierr); 25842cf14000SStefano Zampini PetscStackCallStandard(HYPRE_SStructSysPFMGGetNumIterations,(jac->ss_solver,&oits)); 2585d851a50bSGlenn Hammond *outits = oits; 2586d851a50bSGlenn Hammond if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 2587d851a50bSGlenn Hammond else *reason = PCRICHARDSON_CONVERGED_RTOL; 2588fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(jac->ss_solver,jac->tol)); 2589fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(jac->ss_solver,jac->its)); 2590d851a50bSGlenn Hammond PetscFunctionReturn(0); 2591d851a50bSGlenn Hammond } 2592d851a50bSGlenn Hammond 2593d851a50bSGlenn Hammond PetscErrorCode PCSetUp_SysPFMG(PC pc) 2594d851a50bSGlenn Hammond { 2595d851a50bSGlenn Hammond PetscErrorCode ierr; 2596d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2597d851a50bSGlenn Hammond Mat_HYPRESStruct *mx = (Mat_HYPRESStruct*)(pc->pmat->data); 2598ace3abfcSBarry Smith PetscBool flg; 2599d851a50bSGlenn Hammond 2600d851a50bSGlenn Hammond PetscFunctionBegin; 2601251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRESSTRUCT,&flg);CHKERRQ(ierr); 2602ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_INCOMP,"Must use MATHYPRESSTRUCT with this preconditioner"); 2603d851a50bSGlenn Hammond 2604d851a50bSGlenn Hammond /* create the hypre sstruct solver object and set its information */ 26052fa5cd67SKarl Rupp if (ex->ss_solver) PetscStackCallStandard(HYPRE_SStructSysPFMGDestroy,(ex->ss_solver)); 2606fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGCreate,(ex->hcomm,&ex->ss_solver)); 2607fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetZeroGuess,(ex->ss_solver)); 2608fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetup,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2609d851a50bSGlenn Hammond PetscFunctionReturn(0); 2610d851a50bSGlenn Hammond } 2611d851a50bSGlenn Hammond 2612d851a50bSGlenn Hammond /*MC 2613d851a50bSGlenn Hammond PCSysPFMG - the hypre SysPFMG multigrid solver 2614d851a50bSGlenn Hammond 2615d851a50bSGlenn Hammond Level: advanced 2616d851a50bSGlenn Hammond 2617d851a50bSGlenn Hammond Options Database: 2618d851a50bSGlenn Hammond + -pc_syspfmg_its <its> number of iterations of SysPFMG to use as preconditioner 2619d851a50bSGlenn Hammond . -pc_syspfmg_num_pre_relax <steps> number of smoothing steps before coarse grid 2620d851a50bSGlenn Hammond . -pc_syspfmg_num_post_relax <steps> number of smoothing steps after coarse grid 2621d851a50bSGlenn Hammond . -pc_syspfmg_tol <tol> tolerance of SysPFMG 2622a2b725a8SWilliam Gropp - -pc_syspfmg_relax_type -relaxation type for the up and down cycles, one of Weighted-Jacobi,Red/Black-Gauss-Seidel 2623d851a50bSGlenn Hammond 262495452b02SPatrick Sanan Notes: 262595452b02SPatrick Sanan This is for CELL-centered descretizations 2626d851a50bSGlenn Hammond 2627f6680f47SSatish Balay This must be used with the MATHYPRESSTRUCT matrix type. 2628aa219208SBarry Smith This is less general than in hypre, it supports only one part, and one block per process defined by a PETSc DMDA. 2629d851a50bSGlenn Hammond Also, only cell-centered variables. 2630d851a50bSGlenn Hammond 2631d851a50bSGlenn Hammond .seealso: PCMG, MATHYPRESSTRUCT 2632d851a50bSGlenn Hammond M*/ 2633d851a50bSGlenn Hammond 26348cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_SysPFMG(PC pc) 2635d851a50bSGlenn Hammond { 2636d851a50bSGlenn Hammond PetscErrorCode ierr; 2637d851a50bSGlenn Hammond PC_SysPFMG *ex; 2638d851a50bSGlenn Hammond 2639d851a50bSGlenn Hammond PetscFunctionBegin; 2640b00a9115SJed Brown ierr = PetscNew(&ex);CHKERRQ(ierr); \ 2641d851a50bSGlenn Hammond pc->data = ex; 2642d851a50bSGlenn Hammond 2643d851a50bSGlenn Hammond ex->its = 1; 2644d851a50bSGlenn Hammond ex->tol = 1.e-8; 2645d851a50bSGlenn Hammond ex->relax_type = 1; 2646d851a50bSGlenn Hammond ex->num_pre_relax = 1; 2647d851a50bSGlenn Hammond ex->num_post_relax = 1; 2648d851a50bSGlenn Hammond 2649d851a50bSGlenn Hammond pc->ops->setfromoptions = PCSetFromOptions_SysPFMG; 2650d851a50bSGlenn Hammond pc->ops->view = PCView_SysPFMG; 2651d851a50bSGlenn Hammond pc->ops->destroy = PCDestroy_SysPFMG; 2652d851a50bSGlenn Hammond pc->ops->apply = PCApply_SysPFMG; 2653d851a50bSGlenn Hammond pc->ops->applyrichardson = PCApplyRichardson_SysPFMG; 2654d851a50bSGlenn Hammond pc->ops->setup = PCSetUp_SysPFMG; 26552fa5cd67SKarl Rupp 2656ffc4695bSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(ex->hcomm));CHKERRMPI(ierr); 2657fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGCreate,(ex->hcomm,&ex->ss_solver)); 2658d851a50bSGlenn Hammond PetscFunctionReturn(0); 2659d851a50bSGlenn Hammond } 2660