116d9e3a6SLisandro Dalcin 216d9e3a6SLisandro Dalcin /* 316d9e3a6SLisandro Dalcin Provides an interface to the LLNL package hypre 416d9e3a6SLisandro Dalcin */ 50f1074feSSatish Balay 60f1074feSSatish Balay /* Must use hypre 2.0.0 or more recent. */ 70f1074feSSatish Balay 8af0996ceSBarry Smith #include <petsc/private/pcimpl.h> /*I "petscpc.h" I*/ 949a781f5SStefano Zampini /* this include is needed ONLY to allow access to the private data inside the Mat object specific to hypre */ 1049a781f5SStefano Zampini #include <petsc/private/matimpl.h> 1158968eb6SStefano Zampini #include <../src/vec/vec/impls/hypre/vhyp.h> 1249a781f5SStefano Zampini #include <../src/mat/impls/hypre/mhypre.h> 13c6db04a5SJed Brown #include <../src/dm/impls/da/hypre/mhyp.h> 144cb006feSStefano Zampini #include <_hypre_parcsr_ls.h> 15*8a2c336bSFande Kong #include <petscmathypre.h> 1616d9e3a6SLisandro Dalcin 17dff31646SBarry Smith static PetscBool cite = PETSC_FALSE; 18a8d69d7bSBarry 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"; 191f817a21SBarry Smith 2016d9e3a6SLisandro Dalcin /* 2116d9e3a6SLisandro Dalcin Private context (data structure) for the preconditioner. 2216d9e3a6SLisandro Dalcin */ 2316d9e3a6SLisandro Dalcin typedef struct { 2416d9e3a6SLisandro Dalcin HYPRE_Solver hsolver; 2549a781f5SStefano Zampini Mat hpmat; /* MatHYPRE */ 2616d9e3a6SLisandro Dalcin 274ddd07fcSJed Brown HYPRE_Int (*destroy)(HYPRE_Solver); 284ddd07fcSJed Brown HYPRE_Int (*solve)(HYPRE_Solver,HYPRE_ParCSRMatrix,HYPRE_ParVector,HYPRE_ParVector); 294ddd07fcSJed Brown HYPRE_Int (*setup)(HYPRE_Solver,HYPRE_ParCSRMatrix,HYPRE_ParVector,HYPRE_ParVector); 3016d9e3a6SLisandro Dalcin 3116d9e3a6SLisandro Dalcin MPI_Comm comm_hypre; 3216d9e3a6SLisandro Dalcin char *hypre_type; 3316d9e3a6SLisandro Dalcin 3416d9e3a6SLisandro Dalcin /* options for Pilut and BoomerAMG*/ 354ddd07fcSJed Brown PetscInt maxiter; 3616d9e3a6SLisandro Dalcin double tol; 3716d9e3a6SLisandro Dalcin 3816d9e3a6SLisandro Dalcin /* options for Pilut */ 394ddd07fcSJed Brown PetscInt factorrowsize; 4016d9e3a6SLisandro Dalcin 4116d9e3a6SLisandro Dalcin /* options for ParaSails */ 424ddd07fcSJed Brown PetscInt nlevels; 4316d9e3a6SLisandro Dalcin double threshhold; 4416d9e3a6SLisandro Dalcin double filter; 454ddd07fcSJed Brown PetscInt sym; 4616d9e3a6SLisandro Dalcin double loadbal; 474ddd07fcSJed Brown PetscInt logging; 484ddd07fcSJed Brown PetscInt ruse; 494ddd07fcSJed Brown PetscInt symt; 5016d9e3a6SLisandro Dalcin 5122b6d1caSBarry Smith /* options for BoomerAMG */ 52ace3abfcSBarry Smith PetscBool printstatistics; 5316d9e3a6SLisandro Dalcin 5416d9e3a6SLisandro Dalcin /* options for BoomerAMG */ 554ddd07fcSJed Brown PetscInt cycletype; 564ddd07fcSJed Brown PetscInt maxlevels; 5716d9e3a6SLisandro Dalcin double strongthreshold; 5816d9e3a6SLisandro Dalcin double maxrowsum; 594ddd07fcSJed Brown PetscInt gridsweeps[3]; 604ddd07fcSJed Brown PetscInt coarsentype; 614ddd07fcSJed Brown PetscInt measuretype; 626a251517SEike Mueller PetscInt smoothtype; 638131ecf7SEike Mueller PetscInt smoothnumlevels; 64ec64516dSEike Mueller PetscInt eu_level; /* Number of levels for ILU(k) in Euclid */ 65ec64516dSEike Mueller double eu_droptolerance; /* Drop tolerance for ILU(k) in Euclid */ 66ec64516dSEike Mueller PetscInt eu_bj; /* Defines use of Block Jacobi ILU in Euclid */ 674ddd07fcSJed Brown PetscInt relaxtype[3]; 6816d9e3a6SLisandro Dalcin double relaxweight; 6916d9e3a6SLisandro Dalcin double outerrelaxweight; 704ddd07fcSJed Brown PetscInt relaxorder; 7116d9e3a6SLisandro Dalcin double truncfactor; 72ace3abfcSBarry Smith PetscBool applyrichardson; 734ddd07fcSJed Brown PetscInt pmax; 744ddd07fcSJed Brown PetscInt interptype; 754ddd07fcSJed Brown PetscInt agg_nl; 764ddd07fcSJed Brown PetscInt agg_num_paths; 77ace3abfcSBarry Smith PetscBool nodal_relax; 784ddd07fcSJed Brown PetscInt nodal_relax_levels; 794cb006feSStefano Zampini 805272c319SBarry Smith PetscInt nodal_coarsening; 8122e51d31SStefano Zampini PetscInt nodal_coarsening_diag; 825272c319SBarry Smith PetscInt vec_interp_variant; 8322e51d31SStefano Zampini PetscInt vec_interp_qmax; 8422e51d31SStefano Zampini PetscBool vec_interp_smooth; 8522e51d31SStefano Zampini PetscInt interp_refine; 8622e51d31SStefano Zampini 875272c319SBarry Smith HYPRE_IJVector *hmnull; 885272c319SBarry Smith HYPRE_ParVector *phmnull; /* near null space passed to hypre */ 895272c319SBarry Smith PetscInt n_hmnull; 905272c319SBarry Smith Vec hmnull_constant; 9172827435SBarry Smith PetscScalar **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 */ 925272c319SBarry Smith 93863406b8SStefano Zampini /* options for AS (Auxiliary Space preconditioners) */ 94863406b8SStefano Zampini PetscInt as_print; 95863406b8SStefano Zampini PetscInt as_max_iter; 96863406b8SStefano Zampini PetscReal as_tol; 97863406b8SStefano Zampini PetscInt as_relax_type; 98863406b8SStefano Zampini PetscInt as_relax_times; 99863406b8SStefano Zampini PetscReal as_relax_weight; 100863406b8SStefano Zampini PetscReal as_omega; 101863406b8SStefano 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) */ 102863406b8SStefano Zampini PetscReal as_amg_alpha_theta; /* AMG strength for vector Poisson (AMS) or Curl problem (ADS) */ 103863406b8SStefano 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) */ 104863406b8SStefano Zampini PetscReal as_amg_beta_theta; /* AMG strength for scalar Poisson (AMS) or vector Poisson (ADS) */ 1054cb006feSStefano Zampini PetscInt ams_cycle_type; 106863406b8SStefano Zampini PetscInt ads_cycle_type; 1074cb006feSStefano Zampini 1084cb006feSStefano Zampini /* additional data */ 1095ac14e1cSStefano Zampini Mat G; /* MatHYPRE */ 1105ac14e1cSStefano Zampini Mat C; /* MatHYPRE */ 1115ac14e1cSStefano Zampini Mat alpha_Poisson; /* MatHYPRE */ 1125ac14e1cSStefano Zampini Mat beta_Poisson; /* MatHYPRE */ 1135ac14e1cSStefano Zampini 1145ac14e1cSStefano Zampini /* extra information for AMS */ 1155ac14e1cSStefano Zampini PetscInt dim; /* geometrical dimension */ 1164cb006feSStefano Zampini HYPRE_IJVector coords[3]; 1174cb006feSStefano Zampini HYPRE_IJVector constants[3]; 1186bf688a0SCe Qin Mat RT_PiFull, RT_Pi[3]; 1196bf688a0SCe Qin Mat ND_PiFull, ND_Pi[3]; 1204cb006feSStefano Zampini PetscBool ams_beta_is_zero; 12123df4f25SStefano Zampini PetscBool ams_beta_is_zero_part; 12223df4f25SStefano Zampini PetscInt ams_proj_freq; 12316d9e3a6SLisandro Dalcin } PC_HYPRE; 12416d9e3a6SLisandro Dalcin 125d2128fa2SBarry Smith PetscErrorCode PCHYPREGetSolver(PC pc,HYPRE_Solver *hsolver) 126d2128fa2SBarry Smith { 127d2128fa2SBarry Smith PC_HYPRE *jac = (PC_HYPRE*)pc->data; 128d2128fa2SBarry Smith 129d2128fa2SBarry Smith PetscFunctionBegin; 130d2128fa2SBarry Smith *hsolver = jac->hsolver; 131d2128fa2SBarry Smith PetscFunctionReturn(0); 132d2128fa2SBarry Smith } 13316d9e3a6SLisandro Dalcin 134*8a2c336bSFande Kong /*@ 135*8a2c336bSFande Kong PCHYPREBoomerAMGGetCoarseOperators - Gets coarse operator matrices for all levels (except the finest level) 136*8a2c336bSFande Kong 137*8a2c336bSFande Kong Logically Collective on PC 138*8a2c336bSFande Kong 139*8a2c336bSFande Kong Input Parameters: 140*8a2c336bSFande Kong + pc - the multigrid context (BoomerAMG) 141*8a2c336bSFande Kong 142*8a2c336bSFande Kong Output Parameter: 143*8a2c336bSFande Kong - num_levels - the number of levels 144*8a2c336bSFande Kong . operators - the coarse operator matrices (size of num_levels-1) 145*8a2c336bSFande Kong 146*8a2c336bSFande Kong Notes: 147*8a2c336bSFande Kong Matrices with AIJ format are created IN PLACE with using (I,J,data) from BoomerAMG. Since the data format in hypre_ParCSRMatrix 148*8a2c336bSFande Kong is different from that used in PETSc, the original hypre_ParCSRMatrix can not be used any more after call this routine. 149*8a2c336bSFande Kong It is used in PCHMG. Other users should avoid using this function. 150*8a2c336bSFande Kong 151*8a2c336bSFande Kong Level: developer 152*8a2c336bSFande Kong 153*8a2c336bSFande Kong .keywords: MG, get, multigrid, interpolation, level 154*8a2c336bSFande Kong 155*8a2c336bSFande Kong .seealso: PCMGGetInterpolation(), PCMGGetInterpolations(), PCHYPREBoomerAMGGetInterpolations() 156*8a2c336bSFande Kong @*/ 157*8a2c336bSFande Kong PetscErrorCode PCHYPREBoomerAMGGetCoarseOperators(PC pc,PetscInt *nlevels,Mat *operators[]) 158*8a2c336bSFande Kong { 159*8a2c336bSFande Kong PC_HYPRE *jac = (PC_HYPRE*)pc->data; 160*8a2c336bSFande Kong PetscBool same = PETSC_FALSE; 161*8a2c336bSFande Kong PetscErrorCode ierr; 162*8a2c336bSFande Kong PetscInt num_levels,l; 163*8a2c336bSFande Kong Mat *mattmp; 164*8a2c336bSFande Kong hypre_ParCSRMatrix **A_array; 165*8a2c336bSFande Kong 166*8a2c336bSFande Kong PetscFunctionBegin; 167*8a2c336bSFande Kong PetscValidIntPointer(nlevels,2); 168*8a2c336bSFande Kong PetscValidIntPointer(operators,3); 169*8a2c336bSFande Kong ierr = PetscStrcmp(jac->hypre_type,"boomeramg",&same);CHKERRQ(ierr); 170*8a2c336bSFande Kong if (!same) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_NOTSAMETYPE,"Hypre type is not BoomerAMG \n"); 171*8a2c336bSFande Kong num_levels = hypre_ParAMGDataNumLevels((hypre_ParAMGData*) (jac->hsolver)); 172*8a2c336bSFande Kong ierr = PetscMalloc1(num_levels,&mattmp);CHKERRQ(ierr); 173*8a2c336bSFande Kong A_array = hypre_ParAMGDataAArray((hypre_ParAMGData*) (jac->hsolver)); 174*8a2c336bSFande Kong for (l=1; l<num_levels; l++) { 175*8a2c336bSFande Kong ierr = MatCreateFromParCSR(A_array[l],MATAIJ,PETSC_OWN_POINTER, &(mattmp[num_levels-1-l]));CHKERRQ(ierr); 176*8a2c336bSFande Kong /* We want to own the data, and HYPRE can not touch this matrix any more */ 177*8a2c336bSFande Kong A_array[l] = NULL; 178*8a2c336bSFande Kong } 179*8a2c336bSFande Kong *nlevels = num_levels; 180*8a2c336bSFande Kong *operators = mattmp; 181*8a2c336bSFande Kong PetscFunctionReturn(0); 182*8a2c336bSFande Kong } 183*8a2c336bSFande Kong 184*8a2c336bSFande Kong /*@ 185*8a2c336bSFande Kong PCHYPREBoomerAMGGetInterpolations - Gets interpolation matrices for all levels (except level 0) 186*8a2c336bSFande Kong 187*8a2c336bSFande Kong Logically Collective on PC 188*8a2c336bSFande Kong 189*8a2c336bSFande Kong Input Parameters: 190*8a2c336bSFande Kong + pc - the multigrid context (BoomerAMG) 191*8a2c336bSFande Kong 192*8a2c336bSFande Kong Output Parameter: 193*8a2c336bSFande Kong - num_levels - the number of levels 194*8a2c336bSFande Kong . interpolations - the interpolation matrices (size of num_levels-1) 195*8a2c336bSFande Kong 196*8a2c336bSFande Kong Notes: 197*8a2c336bSFande Kong Matrices with AIJ format are created IN PLACE with using (I,J,data) from BoomerAMG. Since the data format in hypre_ParCSRMatrix 198*8a2c336bSFande Kong is different from that used in PETSc, the original hypre_ParCSRMatrix can not be used any more after call this routine. 199*8a2c336bSFande Kong It is used in PCHMG. Other users should avoid using this function. 200*8a2c336bSFande Kong 201*8a2c336bSFande Kong Level: developer 202*8a2c336bSFande Kong 203*8a2c336bSFande Kong .keywords: MG, get, multigrid, interpolation, level 204*8a2c336bSFande Kong 205*8a2c336bSFande Kong .seealso: PCMGGetInterpolations(), PCHYPREBoomerAMGGetCoarseOperators() 206*8a2c336bSFande Kong @*/ 207*8a2c336bSFande Kong PetscErrorCode PCHYPREBoomerAMGGetInterpolations(PC pc,PetscInt *nlevels,Mat *interpolations[]) 208*8a2c336bSFande Kong { 209*8a2c336bSFande Kong PC_HYPRE *jac = (PC_HYPRE*)pc->data; 210*8a2c336bSFande Kong PetscBool same = PETSC_FALSE; 211*8a2c336bSFande Kong PetscErrorCode ierr; 212*8a2c336bSFande Kong PetscInt num_levels,l; 213*8a2c336bSFande Kong Mat *mattmp; 214*8a2c336bSFande Kong hypre_ParCSRMatrix **P_array; 215*8a2c336bSFande Kong 216*8a2c336bSFande Kong PetscFunctionBegin; 217*8a2c336bSFande Kong PetscValidIntPointer(nlevels,2); 218*8a2c336bSFande Kong PetscValidIntPointer(interpolations,3); 219*8a2c336bSFande Kong ierr = PetscStrcmp(jac->hypre_type,"boomeramg",&same);CHKERRQ(ierr); 220*8a2c336bSFande Kong if (!same) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_NOTSAMETYPE,"Hypre type is not BoomerAMG \n"); 221*8a2c336bSFande Kong num_levels = hypre_ParAMGDataNumLevels((hypre_ParAMGData*) (jac->hsolver)); 222*8a2c336bSFande Kong ierr = PetscMalloc1(num_levels,&mattmp);CHKERRQ(ierr); 223*8a2c336bSFande Kong P_array = hypre_ParAMGDataPArray((hypre_ParAMGData*) (jac->hsolver)); 224*8a2c336bSFande Kong for (l=1; l<num_levels; l++) { 225*8a2c336bSFande Kong ierr = MatCreateFromParCSR(P_array[num_levels-1-l],MATAIJ,PETSC_OWN_POINTER, &(mattmp[l-1]));CHKERRQ(ierr); 226*8a2c336bSFande Kong /* We want to own the data, and HYPRE can not touch this matrix any more */ 227*8a2c336bSFande Kong P_array[num_levels-1-l] = NULL; 228*8a2c336bSFande Kong } 229*8a2c336bSFande Kong *nlevels = num_levels; 230*8a2c336bSFande Kong *interpolations = mattmp; 231*8a2c336bSFande Kong PetscFunctionReturn(0); 232*8a2c336bSFande Kong } 233*8a2c336bSFande Kong 234ce6a8a0dSJed Brown /* Resets (frees) Hypre's representation of the near null space */ 235ce6a8a0dSJed Brown static PetscErrorCode PCHYPREResetNearNullSpace_Private(PC pc) 236ce6a8a0dSJed Brown { 237ce6a8a0dSJed Brown PC_HYPRE *jac = (PC_HYPRE*)pc->data; 238ce6a8a0dSJed Brown PetscInt i; 2399d678128SJed Brown PetscErrorCode ierr; 240ce6a8a0dSJed Brown PETSC_UNUSED PetscScalar *petscvecarray; 241ce6a8a0dSJed Brown 2429d678128SJed Brown PetscFunctionBegin; 243ce6a8a0dSJed Brown for (i=0; i<jac->n_hmnull; i++) { 244ce6a8a0dSJed Brown VecHYPRE_ParVectorReplacePointer(jac->hmnull[i],jac->hmnull_hypre_data_array[i],petscvecarray); 245ce6a8a0dSJed Brown PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->hmnull[i])); 246ce6a8a0dSJed Brown } 247ce6a8a0dSJed Brown ierr = PetscFree(jac->hmnull);CHKERRQ(ierr); 248ce6a8a0dSJed Brown ierr = PetscFree(jac->hmnull_hypre_data_array);CHKERRQ(ierr); 249ce6a8a0dSJed Brown ierr = PetscFree(jac->phmnull);CHKERRQ(ierr); 250ce6a8a0dSJed Brown ierr = VecDestroy(&jac->hmnull_constant);CHKERRQ(ierr); 2519d678128SJed Brown jac->n_hmnull = 0; 252ce6a8a0dSJed Brown PetscFunctionReturn(0); 253ce6a8a0dSJed Brown } 254ce6a8a0dSJed Brown 25516d9e3a6SLisandro Dalcin static PetscErrorCode PCSetUp_HYPRE(PC pc) 25616d9e3a6SLisandro Dalcin { 25716d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 25849a781f5SStefano Zampini Mat_HYPRE *hjac; 25916d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 26016d9e3a6SLisandro Dalcin HYPRE_ParVector bv,xv; 26149a781f5SStefano Zampini PetscBool ishypre; 26249a781f5SStefano Zampini PetscErrorCode ierr; 26316d9e3a6SLisandro Dalcin 26416d9e3a6SLisandro Dalcin PetscFunctionBegin; 26516d9e3a6SLisandro Dalcin if (!jac->hypre_type) { 26602a17cd4SBarry Smith ierr = PCHYPRESetType(pc,"boomeramg");CHKERRQ(ierr); 26716d9e3a6SLisandro Dalcin } 2685f5c5b43SBarry Smith 26949a781f5SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRE,&ishypre);CHKERRQ(ierr); 27049a781f5SStefano Zampini if (!ishypre) { 2716bf688a0SCe Qin ierr = MatDestroy(&jac->hpmat);CHKERRQ(ierr); 2726bf688a0SCe Qin ierr = MatConvert(pc->pmat,MATHYPRE,MAT_INITIAL_MATRIX,&jac->hpmat);CHKERRQ(ierr); 27349a781f5SStefano Zampini } else { 27449a781f5SStefano Zampini ierr = PetscObjectReference((PetscObject)pc->pmat);CHKERRQ(ierr); 27549a781f5SStefano Zampini ierr = MatDestroy(&jac->hpmat);CHKERRQ(ierr); 27649a781f5SStefano Zampini jac->hpmat = pc->pmat; 27716d9e3a6SLisandro Dalcin } 27849a781f5SStefano Zampini hjac = (Mat_HYPRE*)(jac->hpmat->data); 2795f5c5b43SBarry Smith 28016d9e3a6SLisandro Dalcin /* special case for BoomerAMG */ 28116d9e3a6SLisandro Dalcin if (jac->setup == HYPRE_BoomerAMGSetup) { 2825272c319SBarry Smith MatNullSpace mnull; 2835272c319SBarry Smith PetscBool has_const; 28449a781f5SStefano Zampini PetscInt bs,nvec,i; 2855272c319SBarry Smith const Vec *vecs; 28672827435SBarry Smith PetscScalar *petscvecarray; 2875272c319SBarry Smith 28816d9e3a6SLisandro Dalcin ierr = MatGetBlockSize(pc->pmat,&bs);CHKERRQ(ierr); 2892fa5cd67SKarl Rupp if (bs > 1) PetscStackCallStandard(HYPRE_BoomerAMGSetNumFunctions,(jac->hsolver,bs)); 2905272c319SBarry Smith ierr = MatGetNearNullSpace(pc->mat, &mnull);CHKERRQ(ierr); 2915272c319SBarry Smith if (mnull) { 292ce6a8a0dSJed Brown ierr = PCHYPREResetNearNullSpace_Private(pc);CHKERRQ(ierr); 2935272c319SBarry Smith ierr = MatNullSpaceGetVecs(mnull, &has_const, &nvec, &vecs);CHKERRQ(ierr); 2945272c319SBarry Smith ierr = PetscMalloc1(nvec+1,&jac->hmnull);CHKERRQ(ierr); 29572827435SBarry Smith ierr = PetscMalloc1(nvec+1,&jac->hmnull_hypre_data_array);CHKERRQ(ierr); 2965272c319SBarry Smith ierr = PetscMalloc1(nvec+1,&jac->phmnull);CHKERRQ(ierr); 2975272c319SBarry Smith for (i=0; i<nvec; i++) { 2985272c319SBarry Smith ierr = VecHYPRE_IJVectorCreate(vecs[i],&jac->hmnull[i]);CHKERRQ(ierr); 29972827435SBarry Smith ierr = VecGetArrayRead(vecs[i],(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 30058968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(jac->hmnull[i],petscvecarray,jac->hmnull_hypre_data_array[i]); 30172827435SBarry Smith ierr = VecRestoreArrayRead(vecs[i],(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 3025272c319SBarry Smith PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->hmnull[i],(void**)&jac->phmnull[i])); 3035272c319SBarry Smith } 3045272c319SBarry Smith if (has_const) { 3055272c319SBarry Smith ierr = MatCreateVecs(pc->pmat,&jac->hmnull_constant,NULL);CHKERRQ(ierr); 3065272c319SBarry Smith ierr = VecSet(jac->hmnull_constant,1);CHKERRQ(ierr); 3075272c319SBarry Smith ierr = VecNormalize(jac->hmnull_constant,NULL); 3085272c319SBarry Smith ierr = VecHYPRE_IJVectorCreate(jac->hmnull_constant,&jac->hmnull[nvec]);CHKERRQ(ierr); 30972827435SBarry Smith ierr = VecGetArrayRead(jac->hmnull_constant,(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 31058968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(jac->hmnull[nvec],petscvecarray,jac->hmnull_hypre_data_array[nvec]); 31172827435SBarry Smith ierr = VecRestoreArrayRead(jac->hmnull_constant,(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 3125272c319SBarry Smith PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->hmnull[nvec],(void**)&jac->phmnull[nvec])); 3135272c319SBarry Smith nvec++; 3145272c319SBarry Smith } 3155272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpVectors,(jac->hsolver,nvec,jac->phmnull)); 3165272c319SBarry Smith jac->n_hmnull = nvec; 3175272c319SBarry Smith } 3184cb006feSStefano Zampini } 319863406b8SStefano Zampini 3204cb006feSStefano Zampini /* special case for AMS */ 3214cb006feSStefano Zampini if (jac->setup == HYPRE_AMSSetup) { 3225ac14e1cSStefano Zampini Mat_HYPRE *hm; 3235ac14e1cSStefano Zampini HYPRE_ParCSRMatrix parcsr; 3246bf688a0SCe Qin if (!jac->coords[0] && !jac->constants[0] && !(jac->ND_PiFull || (jac->ND_Pi[0] && jac->ND_Pi[1]))) { 3256bf688a0SCe 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"); 3266bf688a0SCe Qin } 3275ac14e1cSStefano Zampini if (jac->dim) { 3285ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetDimension,(jac->hsolver,jac->dim)); 3295ac14e1cSStefano Zampini } 3305ac14e1cSStefano Zampini if (jac->constants[0]) { 3315ac14e1cSStefano Zampini HYPRE_ParVector ozz,zoz,zzo = NULL; 3325ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[0],(void**)(&ozz))); 3335ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[1],(void**)(&zoz))); 3345ac14e1cSStefano Zampini if (jac->constants[2]) { 3355ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[2],(void**)(&zzo))); 3365ac14e1cSStefano Zampini } 3375ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetEdgeConstantVectors,(jac->hsolver,ozz,zoz,zzo)); 3385ac14e1cSStefano Zampini } 3395ac14e1cSStefano Zampini if (jac->coords[0]) { 3405ac14e1cSStefano Zampini HYPRE_ParVector coords[3]; 3415ac14e1cSStefano Zampini coords[0] = NULL; 3425ac14e1cSStefano Zampini coords[1] = NULL; 3435ac14e1cSStefano Zampini coords[2] = NULL; 3445ac14e1cSStefano Zampini if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[0],(void**)(&coords[0]))); 3455ac14e1cSStefano Zampini if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[1],(void**)(&coords[1]))); 3465ac14e1cSStefano Zampini if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[2],(void**)(&coords[2]))); 3475ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetCoordinateVectors,(jac->hsolver,coords[0],coords[1],coords[2])); 3485ac14e1cSStefano Zampini } 34949a781f5SStefano Zampini if (!jac->G) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE AMS preconditioner needs the discrete gradient operator via PCHYPRESetDiscreteGradient"); 3505ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->G->data); 3515ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3525ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetDiscreteGradient,(jac->hsolver,parcsr)); 3535ac14e1cSStefano Zampini if (jac->alpha_Poisson) { 3545ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->alpha_Poisson->data); 3555ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3565ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaPoissonMatrix,(jac->hsolver,parcsr)); 3575ac14e1cSStefano Zampini } 3585ac14e1cSStefano Zampini if (jac->ams_beta_is_zero) { 3595ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaPoissonMatrix,(jac->hsolver,NULL)); 3605ac14e1cSStefano Zampini } else if (jac->beta_Poisson) { 3615ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->beta_Poisson->data); 3625ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 3635ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaPoissonMatrix,(jac->hsolver,parcsr)); 3645ac14e1cSStefano Zampini } 3656bf688a0SCe Qin if (jac->ND_PiFull || (jac->ND_Pi[0] && jac->ND_Pi[1])) { 3666bf688a0SCe Qin PetscInt i; 3676bf688a0SCe Qin HYPRE_ParCSRMatrix nd_parcsrfull, nd_parcsr[3]; 3686bf688a0SCe Qin if (jac->ND_PiFull) { 3696bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_PiFull->data); 3706bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsrfull))); 3716bf688a0SCe Qin } else { 3726bf688a0SCe Qin nd_parcsrfull = NULL; 3736bf688a0SCe Qin } 3746bf688a0SCe Qin for (i=0;i<3;++i) { 3756bf688a0SCe Qin if (jac->ND_Pi[i]) { 3766bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_Pi[i]->data); 3776bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsr[i]))); 3786bf688a0SCe Qin } else { 3796bf688a0SCe Qin nd_parcsr[i] = NULL; 3806bf688a0SCe Qin } 3816bf688a0SCe Qin } 3826bf688a0SCe Qin PetscStackCallStandard(HYPRE_AMSSetInterpolations,(jac->hsolver,nd_parcsrfull,nd_parcsr[0],nd_parcsr[1],nd_parcsr[2])); 3836bf688a0SCe Qin } 3844cb006feSStefano Zampini } 385863406b8SStefano Zampini /* special case for ADS */ 386863406b8SStefano Zampini if (jac->setup == HYPRE_ADSSetup) { 3875ac14e1cSStefano Zampini Mat_HYPRE *hm; 3885ac14e1cSStefano Zampini HYPRE_ParCSRMatrix parcsr; 3896bf688a0SCe 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])))) { 3906bf688a0SCe Qin SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs either the coordinate vectors via PCSetCoordinates() or the interpolation matrices via PCHYPRESetInterpolations"); 3916bf688a0SCe Qin } 39237096e45SBarry 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"); 39349a781f5SStefano Zampini if (!jac->G) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs the discrete gradient operator via PCHYPRESetDiscreteGradient"); 39449a781f5SStefano Zampini if (!jac->C) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs the discrete curl operator via PCHYPRESetDiscreteGradient"); 3955ac14e1cSStefano Zampini if (jac->coords[0]) { 3965ac14e1cSStefano Zampini HYPRE_ParVector coords[3]; 3975ac14e1cSStefano Zampini coords[0] = NULL; 3985ac14e1cSStefano Zampini coords[1] = NULL; 3995ac14e1cSStefano Zampini coords[2] = NULL; 4005ac14e1cSStefano Zampini if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[0],(void**)(&coords[0]))); 4015ac14e1cSStefano Zampini if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[1],(void**)(&coords[1]))); 4025ac14e1cSStefano Zampini if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[2],(void**)(&coords[2]))); 4035ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetCoordinateVectors,(jac->hsolver,coords[0],coords[1],coords[2])); 4045ac14e1cSStefano Zampini } 4055ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->G->data); 4065ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 4075ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetDiscreteGradient,(jac->hsolver,parcsr)); 4085ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->C->data); 4095ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 4105ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetDiscreteCurl,(jac->hsolver,parcsr)); 4116bf688a0SCe Qin if ((jac->RT_PiFull || (jac->RT_Pi[0] && jac->RT_Pi[1])) && (jac->ND_PiFull || (jac->ND_Pi[0] && jac->ND_Pi[1]))) { 4126bf688a0SCe Qin PetscInt i; 4136bf688a0SCe Qin HYPRE_ParCSRMatrix rt_parcsrfull, rt_parcsr[3]; 4146bf688a0SCe Qin HYPRE_ParCSRMatrix nd_parcsrfull, nd_parcsr[3]; 4156bf688a0SCe Qin if (jac->RT_PiFull) { 4166bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->RT_PiFull->data); 4176bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&rt_parcsrfull))); 4186bf688a0SCe Qin } else { 4196bf688a0SCe Qin rt_parcsrfull = NULL; 4206bf688a0SCe Qin } 4216bf688a0SCe Qin for (i=0;i<3;++i) { 4226bf688a0SCe Qin if (jac->RT_Pi[i]) { 4236bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->RT_Pi[i]->data); 4246bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&rt_parcsr[i]))); 4256bf688a0SCe Qin } else { 4266bf688a0SCe Qin rt_parcsr[i] = NULL; 4276bf688a0SCe Qin } 4286bf688a0SCe Qin } 4296bf688a0SCe Qin if (jac->ND_PiFull) { 4306bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_PiFull->data); 4316bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsrfull))); 4326bf688a0SCe Qin } else { 4336bf688a0SCe Qin nd_parcsrfull = NULL; 4346bf688a0SCe Qin } 4356bf688a0SCe Qin for (i=0;i<3;++i) { 4366bf688a0SCe Qin if (jac->ND_Pi[i]) { 4376bf688a0SCe Qin hm = (Mat_HYPRE*)(jac->ND_Pi[i]->data); 4386bf688a0SCe Qin PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&nd_parcsr[i]))); 4396bf688a0SCe Qin } else { 4406bf688a0SCe Qin nd_parcsr[i] = NULL; 4416bf688a0SCe Qin } 4426bf688a0SCe Qin } 4436bf688a0SCe 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])); 4446bf688a0SCe Qin } 445863406b8SStefano Zampini } 44649a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 44749a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b,(void**)&bv)); 44849a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x,(void**)&xv)); 44922e51d31SStefano Zampini PetscStackCallStandard(jac->setup,(jac->hsolver,hmat,bv,xv)); 45016d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 45116d9e3a6SLisandro Dalcin } 45216d9e3a6SLisandro Dalcin 45316d9e3a6SLisandro Dalcin static PetscErrorCode PCApply_HYPRE(PC pc,Vec b,Vec x) 45416d9e3a6SLisandro Dalcin { 45516d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 45649a781f5SStefano Zampini Mat_HYPRE *hjac = (Mat_HYPRE*)(jac->hpmat->data); 45716d9e3a6SLisandro Dalcin PetscErrorCode ierr; 45816d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 459d9ca1df4SBarry Smith PetscScalar *xv; 460d9ca1df4SBarry Smith const PetscScalar *bv,*sbv; 46116d9e3a6SLisandro Dalcin HYPRE_ParVector jbv,jxv; 462d9ca1df4SBarry Smith PetscScalar *sxv; 4634ddd07fcSJed Brown PetscInt hierr; 46416d9e3a6SLisandro Dalcin 46516d9e3a6SLisandro Dalcin PetscFunctionBegin; 466dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 46716d9e3a6SLisandro Dalcin if (!jac->applyrichardson) {ierr = VecSet(x,0.0);CHKERRQ(ierr);} 468d9ca1df4SBarry Smith ierr = VecGetArrayRead(b,&bv);CHKERRQ(ierr); 46916d9e3a6SLisandro Dalcin ierr = VecGetArray(x,&xv);CHKERRQ(ierr); 47058968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->b,(PetscScalar*)bv,sbv); 47158968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->x,xv,sxv); 47216d9e3a6SLisandro Dalcin 47349a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 47449a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b,(void**)&jbv)); 47549a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x,(void**)&jxv)); 476fd3f9acdSBarry Smith PetscStackCall("Hypre solve",hierr = (*jac->solve)(jac->hsolver,hmat,jbv,jxv); 47765e19b50SBarry Smith if (hierr && hierr != HYPRE_ERROR_CONV) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in HYPRE solver, error code %d",hierr); 478fd3f9acdSBarry Smith if (hierr) hypre__global_error = 0;); 47916d9e3a6SLisandro Dalcin 48023df4f25SStefano Zampini if (jac->setup == HYPRE_AMSSetup && jac->ams_beta_is_zero_part) { 4815ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSProjectOutGradients,(jac->hsolver,jxv)); 48221df291bSStefano Zampini } 48358968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->b,(PetscScalar*)sbv,bv); 48458968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->x,sxv,xv); 48516d9e3a6SLisandro Dalcin ierr = VecRestoreArray(x,&xv);CHKERRQ(ierr); 486d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(b,&bv);CHKERRQ(ierr); 48716d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 48816d9e3a6SLisandro Dalcin } 48916d9e3a6SLisandro Dalcin 4908695de01SBarry Smith static PetscErrorCode PCReset_HYPRE(PC pc) 4918695de01SBarry Smith { 4928695de01SBarry Smith PC_HYPRE *jac = (PC_HYPRE*)pc->data; 4938695de01SBarry Smith PetscErrorCode ierr; 4948695de01SBarry Smith 4958695de01SBarry Smith PetscFunctionBegin; 49649a781f5SStefano Zampini ierr = MatDestroy(&jac->hpmat);CHKERRQ(ierr); 4975ac14e1cSStefano Zampini ierr = MatDestroy(&jac->G);CHKERRQ(ierr); 4985ac14e1cSStefano Zampini ierr = MatDestroy(&jac->C);CHKERRQ(ierr); 4995ac14e1cSStefano Zampini ierr = MatDestroy(&jac->alpha_Poisson);CHKERRQ(ierr); 5005ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 5016bf688a0SCe Qin ierr = MatDestroy(&jac->RT_PiFull);CHKERRQ(ierr); 5026bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[0]);CHKERRQ(ierr); 5036bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[1]);CHKERRQ(ierr); 5046bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[2]);CHKERRQ(ierr); 5056bf688a0SCe Qin ierr = MatDestroy(&jac->ND_PiFull);CHKERRQ(ierr); 5066bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[0]);CHKERRQ(ierr); 5076bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[1]);CHKERRQ(ierr); 5086bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[2]);CHKERRQ(ierr); 5098695de01SBarry Smith if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[0])); jac->coords[0] = NULL; 5108695de01SBarry Smith if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[1])); jac->coords[1] = NULL; 5118695de01SBarry Smith if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[2])); jac->coords[2] = NULL; 5128695de01SBarry Smith if (jac->constants[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[0])); jac->constants[0] = NULL; 5138695de01SBarry Smith if (jac->constants[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[1])); jac->constants[1] = NULL; 5148695de01SBarry Smith if (jac->constants[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[2])); jac->constants[2] = NULL; 515ce6a8a0dSJed Brown ierr = PCHYPREResetNearNullSpace_Private(pc);CHKERRQ(ierr); 5165ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_FALSE; 5175ac14e1cSStefano Zampini jac->dim = 0; 5188695de01SBarry Smith PetscFunctionReturn(0); 5198695de01SBarry Smith } 5208695de01SBarry Smith 52116d9e3a6SLisandro Dalcin static PetscErrorCode PCDestroy_HYPRE(PC pc) 52216d9e3a6SLisandro Dalcin { 52316d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 52416d9e3a6SLisandro Dalcin PetscErrorCode ierr; 52516d9e3a6SLisandro Dalcin 52616d9e3a6SLisandro Dalcin PetscFunctionBegin; 5278695de01SBarry Smith ierr = PCReset_HYPRE(pc);CHKERRQ(ierr); 52822e51d31SStefano Zampini if (jac->destroy) PetscStackCallStandard(jac->destroy,(jac->hsolver)); 529503cfb0cSBarry Smith ierr = PetscFree(jac->hypre_type);CHKERRQ(ierr); 53016d9e3a6SLisandro Dalcin if (jac->comm_hypre != MPI_COMM_NULL) { ierr = MPI_Comm_free(&(jac->comm_hypre));CHKERRQ(ierr);} 531c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 53216d9e3a6SLisandro Dalcin 53316d9e3a6SLisandro Dalcin ierr = PetscObjectChangeTypeName((PetscObject)pc,0);CHKERRQ(ierr); 534bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetType_C",NULL);CHKERRQ(ierr); 535bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPREGetType_C",NULL);CHKERRQ(ierr); 5364cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetCoordinates_C",NULL);CHKERRQ(ierr); 5374cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteGradient_C",NULL);CHKERRQ(ierr); 538863406b8SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteCurl_C",NULL);CHKERRQ(ierr); 5396bf688a0SCe Qin ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetInterpolations_C",NULL);CHKERRQ(ierr); 5404cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetConstantEdgeVectors_C",NULL);CHKERRQ(ierr); 5415ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetPoissonMatrix_C",NULL);CHKERRQ(ierr); 54216d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 54316d9e3a6SLisandro Dalcin } 54416d9e3a6SLisandro Dalcin 54516d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 5464416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_Pilut(PetscOptionItems *PetscOptionsObject,PC pc) 54716d9e3a6SLisandro Dalcin { 54816d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 54916d9e3a6SLisandro Dalcin PetscErrorCode ierr; 550ace3abfcSBarry Smith PetscBool flag; 55116d9e3a6SLisandro Dalcin 55216d9e3a6SLisandro Dalcin PetscFunctionBegin; 553e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE Pilut Options");CHKERRQ(ierr); 55416d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_pilut_maxiter","Number of iterations","None",jac->maxiter,&jac->maxiter,&flag);CHKERRQ(ierr); 555fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetMaxIter,(jac->hsolver,jac->maxiter)); 55616d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_pilut_tol","Drop tolerance","None",jac->tol,&jac->tol,&flag);CHKERRQ(ierr); 557fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetDropTolerance,(jac->hsolver,jac->tol)); 55816d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_pilut_factorrowsize","FactorRowSize","None",jac->factorrowsize,&jac->factorrowsize,&flag);CHKERRQ(ierr); 559fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetFactorRowSize,(jac->hsolver,jac->factorrowsize)); 56016d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 56116d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 56216d9e3a6SLisandro Dalcin } 56316d9e3a6SLisandro Dalcin 56416d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_Pilut(PC pc,PetscViewer viewer) 56516d9e3a6SLisandro Dalcin { 56616d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 56716d9e3a6SLisandro Dalcin PetscErrorCode ierr; 568ace3abfcSBarry Smith PetscBool iascii; 56916d9e3a6SLisandro Dalcin 57016d9e3a6SLisandro Dalcin PetscFunctionBegin; 571251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 57216d9e3a6SLisandro Dalcin if (iascii) { 57316d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE Pilut preconditioning\n");CHKERRQ(ierr); 57416d9e3a6SLisandro Dalcin if (jac->maxiter != PETSC_DEFAULT) { 575efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," maximum number of iterations %d\n",jac->maxiter);CHKERRQ(ierr); 57616d9e3a6SLisandro Dalcin } else { 577efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," default maximum number of iterations \n");CHKERRQ(ierr); 57816d9e3a6SLisandro Dalcin } 57916d9e3a6SLisandro Dalcin if (jac->tol != PETSC_DEFAULT) { 580efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," drop tolerance %g\n",(double)jac->tol);CHKERRQ(ierr); 58116d9e3a6SLisandro Dalcin } else { 582efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," default drop tolerance \n");CHKERRQ(ierr); 58316d9e3a6SLisandro Dalcin } 58416d9e3a6SLisandro Dalcin if (jac->factorrowsize != PETSC_DEFAULT) { 585efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," factor row size %d\n",jac->factorrowsize);CHKERRQ(ierr); 58616d9e3a6SLisandro Dalcin } else { 587efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," default factor row size \n");CHKERRQ(ierr); 58816d9e3a6SLisandro Dalcin } 58916d9e3a6SLisandro Dalcin } 59016d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 59116d9e3a6SLisandro Dalcin } 59216d9e3a6SLisandro Dalcin 59316d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 594db966c6cSHong Zhang static PetscErrorCode PCSetFromOptions_HYPRE_Euclid(PetscOptionItems *PetscOptionsObject,PC pc) 595db966c6cSHong Zhang { 596db966c6cSHong Zhang PC_HYPRE *jac = (PC_HYPRE*)pc->data; 597db966c6cSHong Zhang PetscErrorCode ierr; 598db966c6cSHong Zhang PetscBool flag; 599db966c6cSHong Zhang 600db966c6cSHong Zhang PetscFunctionBegin; 601db966c6cSHong Zhang ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE Euclid Options");CHKERRQ(ierr); 602db966c6cSHong Zhang ierr = PetscOptionsInt("-pc_hypre_euclid_level","Factorization levels","None",jac->eu_level,&jac->eu_level,&flag);CHKERRQ(ierr); 603db966c6cSHong Zhang if (flag) PetscStackCallStandard(HYPRE_EuclidSetLevel,(jac->hsolver,jac->eu_level)); 604db966c6cSHong Zhang ierr = PetscOptionsTail();CHKERRQ(ierr); 605db966c6cSHong Zhang PetscFunctionReturn(0); 606db966c6cSHong Zhang } 607db966c6cSHong Zhang 608db966c6cSHong Zhang static PetscErrorCode PCView_HYPRE_Euclid(PC pc,PetscViewer viewer) 609db966c6cSHong Zhang { 610db966c6cSHong Zhang PC_HYPRE *jac = (PC_HYPRE*)pc->data; 611db966c6cSHong Zhang PetscErrorCode ierr; 612db966c6cSHong Zhang PetscBool iascii; 613db966c6cSHong Zhang 614db966c6cSHong Zhang PetscFunctionBegin; 615db966c6cSHong Zhang ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 616db966c6cSHong Zhang if (iascii) { 617db966c6cSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," HYPRE Euclid preconditioning\n");CHKERRQ(ierr); 618db966c6cSHong Zhang if (jac->eu_level != PETSC_DEFAULT) { 619db966c6cSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," factorization levels %d\n",jac->eu_level);CHKERRQ(ierr); 620db966c6cSHong Zhang } else { 621db966c6cSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," default factorization levels \n");CHKERRQ(ierr); 622db966c6cSHong Zhang } 623db966c6cSHong Zhang } 624db966c6cSHong Zhang PetscFunctionReturn(0); 625db966c6cSHong Zhang } 626db966c6cSHong Zhang 627db966c6cSHong Zhang /* --------------------------------------------------------------------------------------------*/ 62816d9e3a6SLisandro Dalcin 62916d9e3a6SLisandro Dalcin static PetscErrorCode PCApplyTranspose_HYPRE_BoomerAMG(PC pc,Vec b,Vec x) 63016d9e3a6SLisandro Dalcin { 63116d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 63249a781f5SStefano Zampini Mat_HYPRE *hjac = (Mat_HYPRE*)(jac->hpmat->data); 63316d9e3a6SLisandro Dalcin PetscErrorCode ierr; 63416d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 635d9ca1df4SBarry Smith PetscScalar *xv; 636d9ca1df4SBarry Smith const PetscScalar *bv; 63716d9e3a6SLisandro Dalcin HYPRE_ParVector jbv,jxv; 63816d9e3a6SLisandro Dalcin PetscScalar *sbv,*sxv; 6394ddd07fcSJed Brown PetscInt hierr; 64016d9e3a6SLisandro Dalcin 64116d9e3a6SLisandro Dalcin PetscFunctionBegin; 642dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 64316d9e3a6SLisandro Dalcin ierr = VecSet(x,0.0);CHKERRQ(ierr); 644d9ca1df4SBarry Smith ierr = VecGetArrayRead(b,&bv);CHKERRQ(ierr); 64516d9e3a6SLisandro Dalcin ierr = VecGetArray(x,&xv);CHKERRQ(ierr); 64658968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->b,(PetscScalar*)bv,sbv); 64758968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->x,xv,sxv); 64816d9e3a6SLisandro Dalcin 64949a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 65049a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b,(void**)&jbv)); 65149a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x,(void**)&jxv)); 65216d9e3a6SLisandro Dalcin 65316d9e3a6SLisandro Dalcin hierr = HYPRE_BoomerAMGSolveT(jac->hsolver,hmat,jbv,jxv); 65416d9e3a6SLisandro Dalcin /* error code of 1 in BoomerAMG merely means convergence not achieved */ 655e32f2f54SBarry Smith if (hierr && (hierr != 1)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in HYPRE solver, error code %d",hierr); 65616d9e3a6SLisandro Dalcin if (hierr) hypre__global_error = 0; 65716d9e3a6SLisandro Dalcin 65858968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->b,sbv,bv); 65958968eb6SStefano Zampini VecHYPRE_ParVectorReplacePointer(hjac->x,sxv,xv); 66016d9e3a6SLisandro Dalcin ierr = VecRestoreArray(x,&xv);CHKERRQ(ierr); 661d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(b,&bv);CHKERRQ(ierr); 66216d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 66316d9e3a6SLisandro Dalcin } 66416d9e3a6SLisandro Dalcin 665a669f990SJed Brown /* static array length */ 666a669f990SJed Brown #define ALEN(a) (sizeof(a)/sizeof((a)[0])) 667a669f990SJed Brown 66816d9e3a6SLisandro Dalcin static const char *HYPREBoomerAMGCycleType[] = {"","V","W"}; 6690f1074feSSatish Balay static const char *HYPREBoomerAMGCoarsenType[] = {"CLJP","Ruge-Stueben","","modifiedRuge-Stueben","","","Falgout", "", "PMIS", "", "HMIS"}; 67016d9e3a6SLisandro Dalcin static const char *HYPREBoomerAMGMeasureType[] = {"local","global"}; 67165de4495SJed Brown /* The following corresponds to HYPRE_BoomerAMGSetRelaxType which has many missing numbers in the enum */ 6726a251517SEike Mueller static const char *HYPREBoomerAMGSmoothType[] = {"Schwarz-smoothers","Pilut","ParaSails","Euclid"}; 67365de4495SJed Brown static const char *HYPREBoomerAMGRelaxType[] = {"Jacobi","sequential-Gauss-Seidel","seqboundary-Gauss-Seidel","SOR/Jacobi","backward-SOR/Jacobi", 67465de4495SJed Brown "" /* [5] hybrid chaotic Gauss-Seidel (works only with OpenMP) */,"symmetric-SOR/Jacobi", 67565de4495SJed Brown "" /* 7 */,"l1scaled-SOR/Jacobi","Gaussian-elimination", 6767b7fa87dSPierre Jolivet "" /* 10 */, "" /* 11 */, "" /* 12 */, "l1-Gauss-Seidel" /* nonsymmetric */, "backward-l1-Gauss-Seidel" /* nonsymmetric */, 67765de4495SJed Brown "CG" /* non-stationary */,"Chebyshev","FCF-Jacobi","l1scaled-Jacobi"}; 6780f1074feSSatish Balay static const char *HYPREBoomerAMGInterpType[] = {"classical", "", "", "direct", "multipass", "multipass-wts", "ext+i", 679e2287abbSStefano Zampini "ext+i-cc", "standard", "standard-wts", "block", "block-wtd", "FF", "FF1"}; 6804416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_BoomerAMG(PetscOptionItems *PetscOptionsObject,PC pc) 68116d9e3a6SLisandro Dalcin { 68216d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 68316d9e3a6SLisandro Dalcin PetscErrorCode ierr; 68422e51d31SStefano Zampini PetscInt bs,n,indx,level; 685ace3abfcSBarry Smith PetscBool flg, tmp_truth; 68616d9e3a6SLisandro Dalcin double tmpdbl, twodbl[2]; 68716d9e3a6SLisandro Dalcin 68816d9e3a6SLisandro Dalcin PetscFunctionBegin; 689e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE BoomerAMG Options");CHKERRQ(ierr); 6904336a9eeSBarry Smith ierr = PetscOptionsEList("-pc_hypre_boomeramg_cycle_type","Cycle type","None",HYPREBoomerAMGCycleType+1,2,HYPREBoomerAMGCycleType[jac->cycletype],&indx,&flg);CHKERRQ(ierr); 69116d9e3a6SLisandro Dalcin if (flg) { 6924336a9eeSBarry Smith jac->cycletype = indx+1; 693fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleType,(jac->hsolver,jac->cycletype)); 69416d9e3a6SLisandro Dalcin } 69516d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_max_levels","Number of levels (of grids) allowed","None",jac->maxlevels,&jac->maxlevels,&flg);CHKERRQ(ierr); 69616d9e3a6SLisandro Dalcin if (flg) { 697ce94432eSBarry Smith if (jac->maxlevels < 2) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Number of levels %d must be at least two",jac->maxlevels); 698fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxLevels,(jac->hsolver,jac->maxlevels)); 69916d9e3a6SLisandro Dalcin } 70016d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_max_iter","Maximum iterations used PER hypre call","None",jac->maxiter,&jac->maxiter,&flg);CHKERRQ(ierr); 70116d9e3a6SLisandro Dalcin if (flg) { 702ce94432eSBarry Smith if (jac->maxiter < 1) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Number of iterations %d must be at least one",jac->maxiter); 703fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 70416d9e3a6SLisandro Dalcin } 7050f1074feSSatish Balay ierr = PetscOptionsScalar("-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); 70616d9e3a6SLisandro Dalcin if (flg) { 70757622a8eSBarry 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); 708fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 70916d9e3a6SLisandro Dalcin } 71022e51d31SStefano Zampini bs = 1; 71122e51d31SStefano Zampini if (pc->pmat) { 71222e51d31SStefano Zampini ierr = MatGetBlockSize(pc->pmat,&bs);CHKERRQ(ierr); 71322e51d31SStefano Zampini } 71422e51d31SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_boomeramg_numfunctions","Number of functions","HYPRE_BoomerAMGSetNumFunctions",bs,&bs,&flg);CHKERRQ(ierr); 71522e51d31SStefano Zampini if (flg) { 71622e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetNumFunctions,(jac->hsolver,bs)); 71722e51d31SStefano Zampini } 71816d9e3a6SLisandro Dalcin 7190f1074feSSatish Balay ierr = PetscOptionsScalar("-pc_hypre_boomeramg_truncfactor","Truncation factor for interpolation (0=no truncation)","None",jac->truncfactor,&jac->truncfactor,&flg);CHKERRQ(ierr); 72016d9e3a6SLisandro Dalcin if (flg) { 72157622a8eSBarry 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); 722fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTruncFactor,(jac->hsolver,jac->truncfactor)); 72316d9e3a6SLisandro Dalcin } 72416d9e3a6SLisandro Dalcin 7250f1074feSSatish 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); 7260f1074feSSatish Balay if (flg) { 72757622a8eSBarry 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); 728fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetPMaxElmts,(jac->hsolver,jac->pmax)); 7290f1074feSSatish Balay } 7300f1074feSSatish Balay 7310f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_agg_nl","Number of levels of aggressive coarsening","None",jac->agg_nl,&jac->agg_nl,&flg);CHKERRQ(ierr); 7320f1074feSSatish Balay if (flg) { 73357622a8eSBarry 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); 7340f1074feSSatish Balay 735fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetAggNumLevels,(jac->hsolver,jac->agg_nl)); 7360f1074feSSatish Balay } 7370f1074feSSatish Balay 7380f1074feSSatish 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); 7390f1074feSSatish Balay if (flg) { 74057622a8eSBarry 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); 7410f1074feSSatish Balay 742fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumPaths,(jac->hsolver,jac->agg_num_paths)); 7430f1074feSSatish Balay } 7440f1074feSSatish Balay 7450f1074feSSatish Balay 74616d9e3a6SLisandro Dalcin ierr = PetscOptionsScalar("-pc_hypre_boomeramg_strong_threshold","Threshold for being strongly connected","None",jac->strongthreshold,&jac->strongthreshold,&flg);CHKERRQ(ierr); 74716d9e3a6SLisandro Dalcin if (flg) { 74857622a8eSBarry 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); 749fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThreshold,(jac->hsolver,jac->strongthreshold)); 75016d9e3a6SLisandro Dalcin } 75116d9e3a6SLisandro Dalcin ierr = PetscOptionsScalar("-pc_hypre_boomeramg_max_row_sum","Maximum row sum","None",jac->maxrowsum,&jac->maxrowsum,&flg);CHKERRQ(ierr); 75216d9e3a6SLisandro Dalcin if (flg) { 75357622a8eSBarry 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); 75457622a8eSBarry 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); 755fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxRowSum,(jac->hsolver,jac->maxrowsum)); 75616d9e3a6SLisandro Dalcin } 75716d9e3a6SLisandro Dalcin 75816d9e3a6SLisandro Dalcin /* Grid sweeps */ 7590f1074feSSatish 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); 76016d9e3a6SLisandro Dalcin if (flg) { 761fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumSweeps,(jac->hsolver,indx)); 76216d9e3a6SLisandro Dalcin /* modify the jac structure so we can view the updated options with PC_View */ 76316d9e3a6SLisandro Dalcin jac->gridsweeps[0] = indx; 7640f1074feSSatish Balay jac->gridsweeps[1] = indx; 7650f1074feSSatish Balay /*defaults coarse to 1 */ 7660f1074feSSatish Balay jac->gridsweeps[2] = 1; 76716d9e3a6SLisandro Dalcin } 7685272c319SBarry 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); 7695272c319SBarry Smith if (flg) { 7705272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNodal,(jac->hsolver,jac->nodal_coarsening)); 7715272c319SBarry Smith } 77222e51d31SStefano 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); 77322e51d31SStefano Zampini if (flg) { 77422e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetNodalDiag,(jac->hsolver,jac->nodal_coarsening_diag)); 77522e51d31SStefano Zampini } 776cbc39033SBarry 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); 7775272c319SBarry Smith if (flg) { 7785272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpVecVariant,(jac->hsolver,jac->vec_interp_variant)); 7795272c319SBarry Smith } 78022e51d31SStefano 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); 78122e51d31SStefano Zampini if (flg) { 78222e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetInterpVecQMax,(jac->hsolver,jac->vec_interp_qmax)); 78322e51d31SStefano Zampini } 78422e51d31SStefano 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); 78522e51d31SStefano Zampini if (flg) { 78622e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothInterpVectors,(jac->hsolver,jac->vec_interp_smooth)); 78722e51d31SStefano Zampini } 78822e51d31SStefano 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); 78922e51d31SStefano Zampini if (flg) { 79022e51d31SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetInterpRefine,(jac->hsolver,jac->interp_refine)); 79122e51d31SStefano Zampini } 7920f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_down","Number of sweeps for the down cycles","None",jac->gridsweeps[0], &indx,&flg);CHKERRQ(ierr); 79316d9e3a6SLisandro Dalcin if (flg) { 794fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 1)); 7950f1074feSSatish Balay jac->gridsweeps[0] = indx; 79616d9e3a6SLisandro Dalcin } 79716d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_up","Number of sweeps for the up cycles","None",jac->gridsweeps[1],&indx,&flg);CHKERRQ(ierr); 79816d9e3a6SLisandro Dalcin if (flg) { 799fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 2)); 8000f1074feSSatish Balay jac->gridsweeps[1] = indx; 80116d9e3a6SLisandro Dalcin } 8020f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_coarse","Number of sweeps for the coarse level","None",jac->gridsweeps[2],&indx,&flg);CHKERRQ(ierr); 80316d9e3a6SLisandro Dalcin if (flg) { 804fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 3)); 8050f1074feSSatish Balay jac->gridsweeps[2] = indx; 80616d9e3a6SLisandro Dalcin } 80716d9e3a6SLisandro Dalcin 8086a251517SEike Mueller /* Smooth type */ 8096a251517SEike Mueller ierr = PetscOptionsEList("-pc_hypre_boomeramg_smooth_type","Enable more complex smoothers","None",HYPREBoomerAMGSmoothType,ALEN(HYPREBoomerAMGSmoothType),HYPREBoomerAMGSmoothType[0],&indx,&flg); 8106a251517SEike Mueller if (flg) { 8116a251517SEike Mueller jac->smoothtype = indx; 8126a251517SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothType,(jac->hsolver,indx+6)); 8138131ecf7SEike Mueller jac->smoothnumlevels = 25; 8148131ecf7SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,25)); 8158131ecf7SEike Mueller } 8168131ecf7SEike Mueller 8178131ecf7SEike Mueller /* Number of smoothing levels */ 8188131ecf7SEike 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); 8198131ecf7SEike Mueller if (flg && (jac->smoothtype != -1)) { 8208131ecf7SEike Mueller jac->smoothnumlevels = indx; 8218131ecf7SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,indx)); 8226a251517SEike Mueller } 8236a251517SEike Mueller 8241810e44eSEike Mueller /* Number of levels for ILU(k) for Euclid */ 8251810e44eSEike Mueller ierr = PetscOptionsInt("-pc_hypre_boomeramg_eu_level","Number of levels for ILU(k) in Euclid smoother","None",0,&indx,&flg);CHKERRQ(ierr); 8261810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 8271810e44eSEike Mueller jac->eu_level = indx; 8281810e44eSEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuLevel,(jac->hsolver,indx)); 8291810e44eSEike Mueller } 8301810e44eSEike Mueller 8311810e44eSEike Mueller /* Filter for ILU(k) for Euclid */ 8321810e44eSEike Mueller double droptolerance; 8331810e44eSEike Mueller ierr = PetscOptionsScalar("-pc_hypre_boomeramg_eu_droptolerance","Drop tolerance for ILU(k) in Euclid smoother","None",0,&droptolerance,&flg);CHKERRQ(ierr); 8341810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 8351810e44eSEike Mueller jac->eu_droptolerance = droptolerance; 8361810e44eSEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuLevel,(jac->hsolver,droptolerance)); 8371810e44eSEike Mueller } 8381810e44eSEike Mueller 8391810e44eSEike Mueller /* Use Block Jacobi ILUT for Euclid */ 8401810e44eSEike Mueller ierr = PetscOptionsBool("-pc_hypre_boomeramg_eu_bj", "Use Block Jacobi for ILU in Euclid smoother?", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 8411810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 8421810e44eSEike Mueller jac->eu_bj = tmp_truth; 843493fc9d9SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuBJ,(jac->hsolver,jac->eu_bj)); 8441810e44eSEike Mueller } 8451810e44eSEike Mueller 84616d9e3a6SLisandro Dalcin /* Relax type */ 847a669f990SJed 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); 84816d9e3a6SLisandro Dalcin if (flg) { 8490f1074feSSatish Balay jac->relaxtype[0] = jac->relaxtype[1] = indx; 850fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxType,(jac->hsolver, indx)); 8510f1074feSSatish Balay /* by default, coarse type set to 9 */ 8520f1074feSSatish Balay jac->relaxtype[2] = 9; 853ddbeb582SStefano Zampini PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, 9, 3)); 85416d9e3a6SLisandro Dalcin } 855a669f990SJed 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); 85616d9e3a6SLisandro Dalcin if (flg) { 85716d9e3a6SLisandro Dalcin jac->relaxtype[0] = indx; 858fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 1)); 85916d9e3a6SLisandro Dalcin } 860a669f990SJed 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); 86116d9e3a6SLisandro Dalcin if (flg) { 8620f1074feSSatish Balay jac->relaxtype[1] = indx; 863fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 2)); 86416d9e3a6SLisandro Dalcin } 865a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_relax_type_coarse","Relax type on coarse grid","None",HYPREBoomerAMGRelaxType,ALEN(HYPREBoomerAMGRelaxType),HYPREBoomerAMGRelaxType[9],&indx,&flg);CHKERRQ(ierr); 86616d9e3a6SLisandro Dalcin if (flg) { 8670f1074feSSatish Balay jac->relaxtype[2] = indx; 868fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 3)); 86916d9e3a6SLisandro Dalcin } 87016d9e3a6SLisandro Dalcin 87116d9e3a6SLisandro Dalcin /* Relaxation Weight */ 87216d9e3a6SLisandro 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); 87316d9e3a6SLisandro Dalcin if (flg) { 874fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxWt,(jac->hsolver,tmpdbl)); 87516d9e3a6SLisandro Dalcin jac->relaxweight = tmpdbl; 87616d9e3a6SLisandro Dalcin } 87716d9e3a6SLisandro Dalcin 87816d9e3a6SLisandro Dalcin n = 2; 87916d9e3a6SLisandro Dalcin twodbl[0] = twodbl[1] = 1.0; 88016d9e3a6SLisandro 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); 88116d9e3a6SLisandro Dalcin if (flg) { 88216d9e3a6SLisandro Dalcin if (n == 2) { 88316d9e3a6SLisandro Dalcin indx = (int)PetscAbsReal(twodbl[1]); 884fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetLevelRelaxWt,(jac->hsolver,twodbl[0],indx)); 885ce94432eSBarry 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); 88616d9e3a6SLisandro Dalcin } 88716d9e3a6SLisandro Dalcin 88816d9e3a6SLisandro Dalcin /* Outer relaxation Weight */ 88916d9e3a6SLisandro 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); 89016d9e3a6SLisandro Dalcin if (flg) { 891fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetOuterWt,(jac->hsolver, tmpdbl)); 89216d9e3a6SLisandro Dalcin jac->outerrelaxweight = tmpdbl; 89316d9e3a6SLisandro Dalcin } 89416d9e3a6SLisandro Dalcin 89516d9e3a6SLisandro Dalcin n = 2; 89616d9e3a6SLisandro Dalcin twodbl[0] = twodbl[1] = 1.0; 89716d9e3a6SLisandro 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); 89816d9e3a6SLisandro Dalcin if (flg) { 89916d9e3a6SLisandro Dalcin if (n == 2) { 90016d9e3a6SLisandro Dalcin indx = (int)PetscAbsReal(twodbl[1]); 901fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetLevelOuterWt,(jac->hsolver, twodbl[0], indx)); 902ce94432eSBarry 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); 90316d9e3a6SLisandro Dalcin } 90416d9e3a6SLisandro Dalcin 90516d9e3a6SLisandro Dalcin /* the Relax Order */ 906acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_boomeramg_no_CF", "Do not use CF-relaxation", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 90716d9e3a6SLisandro Dalcin 9088afaa268SBarry Smith if (flg && tmp_truth) { 90916d9e3a6SLisandro Dalcin jac->relaxorder = 0; 910fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxOrder,(jac->hsolver, jac->relaxorder)); 91116d9e3a6SLisandro Dalcin } 912a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_measure_type","Measure type","None",HYPREBoomerAMGMeasureType,ALEN(HYPREBoomerAMGMeasureType),HYPREBoomerAMGMeasureType[0],&indx,&flg);CHKERRQ(ierr); 91316d9e3a6SLisandro Dalcin if (flg) { 91416d9e3a6SLisandro Dalcin jac->measuretype = indx; 915fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMeasureType,(jac->hsolver,jac->measuretype)); 91616d9e3a6SLisandro Dalcin } 9170f1074feSSatish Balay /* update list length 3/07 */ 918a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_coarsen_type","Coarsen type","None",HYPREBoomerAMGCoarsenType,ALEN(HYPREBoomerAMGCoarsenType),HYPREBoomerAMGCoarsenType[6],&indx,&flg);CHKERRQ(ierr); 91916d9e3a6SLisandro Dalcin if (flg) { 92016d9e3a6SLisandro Dalcin jac->coarsentype = indx; 921fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCoarsenType,(jac->hsolver,jac->coarsentype)); 92216d9e3a6SLisandro Dalcin } 9230f1074feSSatish Balay 9240f1074feSSatish Balay /* new 3/07 */ 925a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_interp_type","Interpolation type","None",HYPREBoomerAMGInterpType,ALEN(HYPREBoomerAMGInterpType),HYPREBoomerAMGInterpType[0],&indx,&flg);CHKERRQ(ierr); 9260f1074feSSatish Balay if (flg) { 9270f1074feSSatish Balay jac->interptype = indx; 928fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpType,(jac->hsolver,jac->interptype)); 9290f1074feSSatish Balay } 9300f1074feSSatish Balay 931b96a4a96SBarry Smith ierr = PetscOptionsName("-pc_hypre_boomeramg_print_statistics","Print statistics","None",&flg);CHKERRQ(ierr); 93216d9e3a6SLisandro Dalcin if (flg) { 933b96a4a96SBarry Smith level = 3; 9340298fd71SBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_print_statistics","Print statistics","None",level,&level,NULL);CHKERRQ(ierr); 9352fa5cd67SKarl Rupp 936b96a4a96SBarry Smith jac->printstatistics = PETSC_TRUE; 937fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetPrintLevel,(jac->hsolver,level)); 9382ae77aedSBarry Smith } 9392ae77aedSBarry Smith 940b96a4a96SBarry Smith ierr = PetscOptionsName("-pc_hypre_boomeramg_print_debug","Print debug information","None",&flg);CHKERRQ(ierr); 9412ae77aedSBarry Smith if (flg) { 942b96a4a96SBarry Smith level = 3; 9430298fd71SBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_print_debug","Print debug information","None",level,&level,NULL);CHKERRQ(ierr); 9442fa5cd67SKarl Rupp 945b96a4a96SBarry Smith jac->printstatistics = PETSC_TRUE; 946fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetDebugFlag,(jac->hsolver,level)); 94716d9e3a6SLisandro Dalcin } 9488f87f92bSBarry Smith 949acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_boomeramg_nodal_relaxation", "Nodal relaxation via Schwarz", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 9508f87f92bSBarry Smith if (flg && tmp_truth) { 9518f87f92bSBarry Smith PetscInt tmp_int; 9528f87f92bSBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_nodal_relaxation", "Nodal relaxation via Schwarz", "None",jac->nodal_relax_levels,&tmp_int,&flg);CHKERRQ(ierr); 9538f87f92bSBarry Smith if (flg) jac->nodal_relax_levels = tmp_int; 954fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothType,(jac->hsolver,6)); 955fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetDomainType,(jac->hsolver,1)); 956fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetOverlap,(jac->hsolver,0)); 957fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,jac->nodal_relax_levels)); 9588f87f92bSBarry Smith } 9598f87f92bSBarry Smith 96016d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 96116d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 96216d9e3a6SLisandro Dalcin } 96316d9e3a6SLisandro Dalcin 964ace3abfcSBarry 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) 96516d9e3a6SLisandro Dalcin { 96616d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 96716d9e3a6SLisandro Dalcin PetscErrorCode ierr; 9684ddd07fcSJed Brown PetscInt oits; 96916d9e3a6SLisandro Dalcin 97016d9e3a6SLisandro Dalcin PetscFunctionBegin; 971dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 972fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,its*jac->maxiter)); 973fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,rtol)); 97416d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_TRUE; 97516d9e3a6SLisandro Dalcin ierr = PCApply_HYPRE(pc,b,y);CHKERRQ(ierr); 97616d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_FALSE; 9778b1f7689SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGGetNumIterations,(jac->hsolver,(HYPRE_Int *)&oits)); 9784d0a8057SBarry Smith *outits = oits; 9794d0a8057SBarry Smith if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 9804d0a8057SBarry Smith else *reason = PCRICHARDSON_CONVERGED_RTOL; 981fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 982fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 98316d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 98416d9e3a6SLisandro Dalcin } 98516d9e3a6SLisandro Dalcin 98616d9e3a6SLisandro Dalcin 98716d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_BoomerAMG(PC pc,PetscViewer viewer) 98816d9e3a6SLisandro Dalcin { 98916d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 99016d9e3a6SLisandro Dalcin PetscErrorCode ierr; 991ace3abfcSBarry Smith PetscBool iascii; 99216d9e3a6SLisandro Dalcin 99316d9e3a6SLisandro Dalcin PetscFunctionBegin; 994251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 99516d9e3a6SLisandro Dalcin if (iascii) { 99616d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG preconditioning\n");CHKERRQ(ierr); 997efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Cycle type %s\n",HYPREBoomerAMGCycleType[jac->cycletype]);CHKERRQ(ierr); 99822e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Maximum number of levels %D\n",jac->maxlevels);CHKERRQ(ierr); 99922e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Maximum number of iterations PER hypre call %D\n",jac->maxiter);CHKERRQ(ierr); 1000efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Convergence tolerance PER hypre call %g\n",(double)jac->tol);CHKERRQ(ierr); 1001efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Threshold for strong coupling %g\n",(double)jac->strongthreshold);CHKERRQ(ierr); 1002efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Interpolation truncation factor %g\n",(double)jac->truncfactor);CHKERRQ(ierr); 100322e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Interpolation: max elements per row %D\n",jac->pmax);CHKERRQ(ierr); 100422e51d31SStefano Zampini if (jac->interp_refine) { 100522e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Interpolation: number of steps of weighted refinement %D\n",jac->interp_refine);CHKERRQ(ierr); 100622e51d31SStefano Zampini } 100722e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Number of levels of aggressive coarsening %D\n",jac->agg_nl);CHKERRQ(ierr); 100822e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Number of paths for aggressive coarsening %D\n",jac->agg_num_paths);CHKERRQ(ierr); 10090f1074feSSatish Balay 1010efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Maximum row sums %g\n",(double)jac->maxrowsum);CHKERRQ(ierr); 101116d9e3a6SLisandro Dalcin 101222e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Sweeps down %D\n",jac->gridsweeps[0]);CHKERRQ(ierr); 101322e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Sweeps up %D\n",jac->gridsweeps[1]);CHKERRQ(ierr); 101422e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Sweeps on coarse %D\n",jac->gridsweeps[2]);CHKERRQ(ierr); 101516d9e3a6SLisandro Dalcin 1016efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax down %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[0]]);CHKERRQ(ierr); 1017efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax up %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[1]]);CHKERRQ(ierr); 1018efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax on coarse %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[2]]);CHKERRQ(ierr); 101916d9e3a6SLisandro Dalcin 1020efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Relax weight (all) %g\n",(double)jac->relaxweight);CHKERRQ(ierr); 1021efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Outer relax weight (all) %g\n",(double)jac->outerrelaxweight);CHKERRQ(ierr); 102216d9e3a6SLisandro Dalcin 102316d9e3a6SLisandro Dalcin if (jac->relaxorder) { 1024efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Using CF-relaxation\n");CHKERRQ(ierr); 102516d9e3a6SLisandro Dalcin } else { 1026efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Not using CF-relaxation\n");CHKERRQ(ierr); 102716d9e3a6SLisandro Dalcin } 10286a251517SEike Mueller if (jac->smoothtype!=-1) { 1029efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Smooth type %s\n",HYPREBoomerAMGSmoothType[jac->smoothtype]);CHKERRQ(ierr); 103022e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Smooth num levels %D\n",jac->smoothnumlevels);CHKERRQ(ierr); 10317e352d70SEike Mueller } else { 1032efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Not using more complex smoothers.\n");CHKERRQ(ierr); 10331810e44eSEike Mueller } 10341810e44eSEike Mueller if (jac->smoothtype==3) { 103522e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Euclid ILU(k) levels %D\n",jac->eu_level);CHKERRQ(ierr); 103622e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Euclid ILU(k) drop tolerance %g\n",(double)jac->eu_droptolerance);CHKERRQ(ierr); 103722e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Euclid ILU use Block-Jacobi? %D\n",jac->eu_bj);CHKERRQ(ierr); 10386a251517SEike Mueller } 1039efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Measure type %s\n",HYPREBoomerAMGMeasureType[jac->measuretype]);CHKERRQ(ierr); 1040efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Coarsen type %s\n",HYPREBoomerAMGCoarsenType[jac->coarsentype]);CHKERRQ(ierr); 1041efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Interpolation type %s\n",HYPREBoomerAMGInterpType[jac->interptype]);CHKERRQ(ierr); 10425272c319SBarry Smith if (jac->nodal_coarsening) { 1043efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," Using nodal coarsening (with HYPRE_BOOMERAMGSetNodal() %D\n",jac->nodal_coarsening);CHKERRQ(ierr); 10445272c319SBarry Smith } 10455272c319SBarry Smith if (jac->vec_interp_variant) { 1046efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE_BoomerAMGSetInterpVecVariant() %D\n",jac->vec_interp_variant);CHKERRQ(ierr); 104722e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE_BoomerAMGSetInterpVecQMax() %D\n",jac->vec_interp_qmax);CHKERRQ(ierr); 104822e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE_BoomerAMGSetSmoothInterpVectors() %d\n",jac->vec_interp_smooth);CHKERRQ(ierr); 10498f87f92bSBarry Smith } 10508f87f92bSBarry Smith if (jac->nodal_relax) { 105122e51d31SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," Using nodal relaxation via Schwarz smoothing on levels %D\n",jac->nodal_relax_levels);CHKERRQ(ierr); 10528f87f92bSBarry Smith } 105316d9e3a6SLisandro Dalcin } 105416d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 105516d9e3a6SLisandro Dalcin } 105616d9e3a6SLisandro Dalcin 105716d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 10584416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_ParaSails(PetscOptionItems *PetscOptionsObject,PC pc) 105916d9e3a6SLisandro Dalcin { 106016d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 106116d9e3a6SLisandro Dalcin PetscErrorCode ierr; 10624ddd07fcSJed Brown PetscInt indx; 1063ace3abfcSBarry Smith PetscBool flag; 106416d9e3a6SLisandro Dalcin const char *symtlist[] = {"nonsymmetric","SPD","nonsymmetric,SPD"}; 106516d9e3a6SLisandro Dalcin 106616d9e3a6SLisandro Dalcin PetscFunctionBegin; 1067e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE ParaSails Options");CHKERRQ(ierr); 106816d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_parasails_nlevels","Number of number of levels","None",jac->nlevels,&jac->nlevels,0);CHKERRQ(ierr); 106916d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_parasails_thresh","Threshold","None",jac->threshhold,&jac->threshhold,&flag);CHKERRQ(ierr); 10702fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetParams,(jac->hsolver,jac->threshhold,jac->nlevels)); 107116d9e3a6SLisandro Dalcin 107216d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_parasails_filter","filter","None",jac->filter,&jac->filter,&flag);CHKERRQ(ierr); 10732fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetFilter,(jac->hsolver,jac->filter)); 107416d9e3a6SLisandro Dalcin 107516d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_parasails_loadbal","Load balance","None",jac->loadbal,&jac->loadbal,&flag);CHKERRQ(ierr); 10762fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetLoadbal,(jac->hsolver,jac->loadbal)); 107716d9e3a6SLisandro Dalcin 1078acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_parasails_logging","Print info to screen","None",(PetscBool)jac->logging,(PetscBool*)&jac->logging,&flag);CHKERRQ(ierr); 10792fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetLogging,(jac->hsolver,jac->logging)); 108016d9e3a6SLisandro Dalcin 1081acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_parasails_reuse","Reuse nonzero pattern in preconditioner","None",(PetscBool)jac->ruse,(PetscBool*)&jac->ruse,&flag);CHKERRQ(ierr); 10822fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetReuse,(jac->hsolver,jac->ruse)); 108316d9e3a6SLisandro Dalcin 1084a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_parasails_sym","Symmetry of matrix and preconditioner","None",symtlist,ALEN(symtlist),symtlist[0],&indx,&flag);CHKERRQ(ierr); 108516d9e3a6SLisandro Dalcin if (flag) { 108616d9e3a6SLisandro Dalcin jac->symt = indx; 1087fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetSym,(jac->hsolver,jac->symt)); 108816d9e3a6SLisandro Dalcin } 108916d9e3a6SLisandro Dalcin 109016d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 109116d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 109216d9e3a6SLisandro Dalcin } 109316d9e3a6SLisandro Dalcin 109416d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_ParaSails(PC pc,PetscViewer viewer) 109516d9e3a6SLisandro Dalcin { 109616d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 109716d9e3a6SLisandro Dalcin PetscErrorCode ierr; 1098ace3abfcSBarry Smith PetscBool iascii; 109916d9e3a6SLisandro Dalcin const char *symt = 0;; 110016d9e3a6SLisandro Dalcin 110116d9e3a6SLisandro Dalcin PetscFunctionBegin; 1102251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 110316d9e3a6SLisandro Dalcin if (iascii) { 110416d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE ParaSails preconditioning\n");CHKERRQ(ierr); 1105efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," nlevels %d\n",jac->nlevels);CHKERRQ(ierr); 1106efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," threshold %g\n",(double)jac->threshhold);CHKERRQ(ierr); 1107efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," filter %g\n",(double)jac->filter);CHKERRQ(ierr); 1108efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," load balance %g\n",(double)jac->loadbal);CHKERRQ(ierr); 1109efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," reuse nonzero structure %s\n",PetscBools[jac->ruse]);CHKERRQ(ierr); 1110efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," print info to screen %s\n",PetscBools[jac->logging]);CHKERRQ(ierr); 11112fa5cd67SKarl Rupp if (!jac->symt) symt = "nonsymmetric matrix and preconditioner"; 11122fa5cd67SKarl Rupp else if (jac->symt == 1) symt = "SPD matrix and preconditioner"; 11132fa5cd67SKarl Rupp else if (jac->symt == 2) symt = "nonsymmetric matrix but SPD preconditioner"; 1114ce94432eSBarry Smith else SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONG,"Unknown HYPRE ParaSails symmetric option %d",jac->symt); 1115efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," %s\n",symt);CHKERRQ(ierr); 111616d9e3a6SLisandro Dalcin } 111716d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 111816d9e3a6SLisandro Dalcin } 11194cb006feSStefano Zampini /* --------------------------------------------------------------------------------------------*/ 11204416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_AMS(PetscOptionItems *PetscOptionsObject,PC pc) 11214cb006feSStefano Zampini { 11224cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 11234cb006feSStefano Zampini PetscErrorCode ierr; 11244cb006feSStefano Zampini PetscInt n; 11254cb006feSStefano Zampini PetscBool flag,flag2,flag3,flag4; 11264cb006feSStefano Zampini 11274cb006feSStefano Zampini PetscFunctionBegin; 11289fa463a7SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE AMS Options");CHKERRQ(ierr); 1129863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ams_print_level","Debugging output level for AMS","None",jac->as_print,&jac->as_print,&flag);CHKERRQ(ierr); 1130863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetPrintLevel,(jac->hsolver,jac->as_print)); 1131863406b8SStefano 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); 1132863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 11334cb006feSStefano 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); 11344cb006feSStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 1135863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ams_tol","Error tolerance for AMS multigrid","None",jac->as_tol,&jac->as_tol,&flag);CHKERRQ(ierr); 1136863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetTol,(jac->hsolver,jac->as_tol)); 1137863406b8SStefano 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); 1138863406b8SStefano 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); 1139863406b8SStefano 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); 1140863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ams_omega","SSOR coefficient for AMS smoother","None",jac->as_omega,&jac->as_omega,&flag4);CHKERRQ(ierr); 11414cb006feSStefano Zampini if (flag || flag2 || flag3 || flag4) { 1142863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1143863406b8SStefano Zampini jac->as_relax_times, 1144863406b8SStefano Zampini jac->as_relax_weight, 1145863406b8SStefano Zampini jac->as_omega)); 11464cb006feSStefano Zampini } 1147863406b8SStefano 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); 11484cb006feSStefano Zampini n = 5; 1149863406b8SStefano Zampini ierr = PetscOptionsIntArray("-pc_hypre_ams_amg_alpha_options","AMG options for vector Poisson","None",jac->as_amg_alpha_opts,&n,&flag2);CHKERRQ(ierr); 11504cb006feSStefano Zampini if (flag || flag2) { 1151863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaAMGOptions,(jac->hsolver,jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1152863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1153863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1154863406b8SStefano Zampini jac->as_amg_alpha_theta, 1155863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1156863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 11574cb006feSStefano Zampini } 1158863406b8SStefano 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); 11594cb006feSStefano Zampini n = 5; 1160863406b8SStefano 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); 11614cb006feSStefano Zampini if (flag || flag2) { 1162863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1163863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1164863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1165863406b8SStefano Zampini jac->as_amg_beta_theta, 1166863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1167863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 11684cb006feSStefano Zampini } 116923df4f25SStefano 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); 117023df4f25SStefano Zampini if (flag) { /* override HYPRE's default only if the options is used */ 117123df4f25SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetProjectionFrequency,(jac->hsolver,jac->ams_proj_freq)); 117223df4f25SStefano Zampini } 11734cb006feSStefano Zampini ierr = PetscOptionsTail();CHKERRQ(ierr); 11744cb006feSStefano Zampini PetscFunctionReturn(0); 11754cb006feSStefano Zampini } 11764cb006feSStefano Zampini 11774cb006feSStefano Zampini static PetscErrorCode PCView_HYPRE_AMS(PC pc,PetscViewer viewer) 11784cb006feSStefano Zampini { 11794cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 11804cb006feSStefano Zampini PetscErrorCode ierr; 11814cb006feSStefano Zampini PetscBool iascii; 11824cb006feSStefano Zampini 11834cb006feSStefano Zampini PetscFunctionBegin; 11844cb006feSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 11854cb006feSStefano Zampini if (iascii) { 11864cb006feSStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS preconditioning\n");CHKERRQ(ierr); 1187efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iterations per application %d\n",jac->as_max_iter);CHKERRQ(ierr); 1188efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace cycle type %d\n",jac->ams_cycle_type);CHKERRQ(ierr); 1189efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iteration tolerance %g\n",jac->as_tol);CHKERRQ(ierr); 1190efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother type %d\n",jac->as_relax_type);CHKERRQ(ierr); 1191efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number of smoothing steps %d\n",jac->as_relax_times);CHKERRQ(ierr); 1192efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother weight %g\n",jac->as_relax_weight);CHKERRQ(ierr); 1193efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother omega %g\n",jac->as_omega);CHKERRQ(ierr); 11944cb006feSStefano Zampini if (jac->alpha_Poisson) { 1195efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," vector Poisson solver (passed in by user)\n");CHKERRQ(ierr); 11964cb006feSStefano Zampini } else { 1197efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," vector Poisson solver (computed) \n");CHKERRQ(ierr); 11984cb006feSStefano Zampini } 1199efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG coarsening type %d\n",jac->as_amg_alpha_opts[0]);CHKERRQ(ierr); 1200efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG levels of aggressive coarsening %d\n",jac->as_amg_alpha_opts[1]);CHKERRQ(ierr); 1201efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG relaxation type %d\n",jac->as_amg_alpha_opts[2]);CHKERRQ(ierr); 1202efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG interpolation type %d\n",jac->as_amg_alpha_opts[3]);CHKERRQ(ierr); 1203efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG max nonzero elements in interpolation rows %d\n",jac->as_amg_alpha_opts[4]);CHKERRQ(ierr); 1204efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG strength threshold %g\n",jac->as_amg_alpha_theta);CHKERRQ(ierr); 12054cb006feSStefano Zampini if (!jac->ams_beta_is_zero) { 12064cb006feSStefano Zampini if (jac->beta_Poisson) { 1207efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," scalar Poisson solver (passed in by user)\n");CHKERRQ(ierr); 12084cb006feSStefano Zampini } else { 1209efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," scalar Poisson solver (computed) \n");CHKERRQ(ierr); 12104cb006feSStefano Zampini } 1211efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG coarsening type %d\n",jac->as_amg_beta_opts[0]);CHKERRQ(ierr); 1212efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG levels of aggressive coarsening %d\n",jac->as_amg_beta_opts[1]);CHKERRQ(ierr); 1213efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG relaxation type %d\n",jac->as_amg_beta_opts[2]);CHKERRQ(ierr); 1214efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG interpolation type %d\n",jac->as_amg_beta_opts[3]);CHKERRQ(ierr); 1215efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG max nonzero elements in interpolation rows %d\n",jac->as_amg_beta_opts[4]);CHKERRQ(ierr); 1216efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," boomerAMG strength threshold %g\n",jac->as_amg_beta_theta);CHKERRQ(ierr); 121723df4f25SStefano Zampini if (jac->ams_beta_is_zero_part) { 1218efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," compatible subspace projection frequency %d (-1 HYPRE uses default)\n",jac->ams_proj_freq);CHKERRQ(ierr); 121923df4f25SStefano Zampini } 122023df4f25SStefano Zampini } else { 1221efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," scalar Poisson solver not used (zero-conductivity everywhere) \n");CHKERRQ(ierr); 12224cb006feSStefano Zampini } 12234cb006feSStefano Zampini } 12244cb006feSStefano Zampini PetscFunctionReturn(0); 12254cb006feSStefano Zampini } 12264cb006feSStefano Zampini 12274416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_ADS(PetscOptionItems *PetscOptionsObject,PC pc) 1228863406b8SStefano Zampini { 1229863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1230863406b8SStefano Zampini PetscErrorCode ierr; 1231863406b8SStefano Zampini PetscInt n; 1232863406b8SStefano Zampini PetscBool flag,flag2,flag3,flag4; 1233863406b8SStefano Zampini 1234863406b8SStefano Zampini PetscFunctionBegin; 1235863406b8SStefano Zampini ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE ADS Options");CHKERRQ(ierr); 1236863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ads_print_level","Debugging output level for ADS","None",jac->as_print,&jac->as_print,&flag);CHKERRQ(ierr); 1237863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetPrintLevel,(jac->hsolver,jac->as_print)); 1238863406b8SStefano 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); 1239863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 1240863406b8SStefano 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); 1241863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetCycleType,(jac->hsolver,jac->ads_cycle_type)); 1242863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ads_tol","Error tolerance for ADS multigrid","None",jac->as_tol,&jac->as_tol,&flag);CHKERRQ(ierr); 1243863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetTol,(jac->hsolver,jac->as_tol)); 1244863406b8SStefano 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); 1245863406b8SStefano 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); 1246863406b8SStefano 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); 1247863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ads_omega","SSOR coefficient for ADS smoother","None",jac->as_omega,&jac->as_omega,&flag4);CHKERRQ(ierr); 1248863406b8SStefano Zampini if (flag || flag2 || flag3 || flag4) { 1249863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1250863406b8SStefano Zampini jac->as_relax_times, 1251863406b8SStefano Zampini jac->as_relax_weight, 1252863406b8SStefano Zampini jac->as_omega)); 1253863406b8SStefano Zampini } 1254863406b8SStefano 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); 1255863406b8SStefano Zampini n = 5; 1256863406b8SStefano 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); 1257863406b8SStefano 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); 1258863406b8SStefano Zampini if (flag || flag2 || flag3) { 1259863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMSOptions,(jac->hsolver,jac->ams_cycle_type, /* AMS cycle type */ 1260863406b8SStefano Zampini jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1261863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1262863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1263863406b8SStefano Zampini jac->as_amg_alpha_theta, 1264863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1265863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 1266863406b8SStefano Zampini } 1267863406b8SStefano 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); 1268863406b8SStefano Zampini n = 5; 1269863406b8SStefano 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); 1270863406b8SStefano Zampini if (flag || flag2) { 1271863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1272863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1273863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1274863406b8SStefano Zampini jac->as_amg_beta_theta, 1275863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1276863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 1277863406b8SStefano Zampini } 1278863406b8SStefano Zampini ierr = PetscOptionsTail();CHKERRQ(ierr); 1279863406b8SStefano Zampini PetscFunctionReturn(0); 1280863406b8SStefano Zampini } 1281863406b8SStefano Zampini 1282863406b8SStefano Zampini static PetscErrorCode PCView_HYPRE_ADS(PC pc,PetscViewer viewer) 1283863406b8SStefano Zampini { 1284863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1285863406b8SStefano Zampini PetscErrorCode ierr; 1286863406b8SStefano Zampini PetscBool iascii; 1287863406b8SStefano Zampini 1288863406b8SStefano Zampini PetscFunctionBegin; 1289863406b8SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1290863406b8SStefano Zampini if (iascii) { 1291863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS preconditioning\n");CHKERRQ(ierr); 1292efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iterations per application %d\n",jac->as_max_iter);CHKERRQ(ierr); 1293efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace cycle type %d\n",jac->ads_cycle_type);CHKERRQ(ierr); 1294efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace iteration tolerance %g\n",jac->as_tol);CHKERRQ(ierr); 1295efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother type %d\n",jac->as_relax_type);CHKERRQ(ierr); 1296efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number of smoothing steps %d\n",jac->as_relax_times);CHKERRQ(ierr); 1297efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother weight %g\n",jac->as_relax_weight);CHKERRQ(ierr); 1298efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," smoother omega %g\n",jac->as_omega);CHKERRQ(ierr); 1299efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," AMS solver using boomerAMG\n");CHKERRQ(ierr); 1300efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," subspace cycle type %d\n",jac->ams_cycle_type);CHKERRQ(ierr); 1301efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," coarsening type %d\n",jac->as_amg_alpha_opts[0]);CHKERRQ(ierr); 1302efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," levels of aggressive coarsening %d\n",jac->as_amg_alpha_opts[1]);CHKERRQ(ierr); 1303efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relaxation type %d\n",jac->as_amg_alpha_opts[2]);CHKERRQ(ierr); 1304efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," interpolation type %d\n",jac->as_amg_alpha_opts[3]);CHKERRQ(ierr); 1305efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max nonzero elements in interpolation rows %d\n",jac->as_amg_alpha_opts[4]);CHKERRQ(ierr); 1306efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," strength threshold %g\n",jac->as_amg_alpha_theta);CHKERRQ(ierr); 1307efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," vector Poisson solver using boomerAMG\n");CHKERRQ(ierr); 1308efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," coarsening type %d\n",jac->as_amg_beta_opts[0]);CHKERRQ(ierr); 1309efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," levels of aggressive coarsening %d\n",jac->as_amg_beta_opts[1]);CHKERRQ(ierr); 1310efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relaxation type %d\n",jac->as_amg_beta_opts[2]);CHKERRQ(ierr); 1311efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," interpolation type %d\n",jac->as_amg_beta_opts[3]);CHKERRQ(ierr); 1312efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max nonzero elements in interpolation rows %d\n",jac->as_amg_beta_opts[4]);CHKERRQ(ierr); 1313efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," strength threshold %g\n",jac->as_amg_beta_theta);CHKERRQ(ierr); 1314863406b8SStefano Zampini } 1315863406b8SStefano Zampini PetscFunctionReturn(0); 1316863406b8SStefano Zampini } 1317863406b8SStefano Zampini 1318863406b8SStefano Zampini static PetscErrorCode PCHYPRESetDiscreteGradient_HYPRE(PC pc, Mat G) 13194cb006feSStefano Zampini { 13204cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 13215ac14e1cSStefano Zampini PetscBool ishypre; 13224cb006feSStefano Zampini PetscErrorCode ierr; 13234cb006feSStefano Zampini 13244cb006feSStefano Zampini PetscFunctionBegin; 13255ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)G,MATHYPRE,&ishypre);CHKERRQ(ierr); 13265ac14e1cSStefano Zampini if (ishypre) { 13275ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)G);CHKERRQ(ierr); 13285ac14e1cSStefano Zampini ierr = MatDestroy(&jac->G);CHKERRQ(ierr); 13295ac14e1cSStefano Zampini jac->G = G; 13305ac14e1cSStefano Zampini } else { 13316bf688a0SCe Qin ierr = MatDestroy(&jac->G);CHKERRQ(ierr); 13326bf688a0SCe Qin ierr = MatConvert(G,MATHYPRE,MAT_INITIAL_MATRIX,&jac->G);CHKERRQ(ierr); 13335ac14e1cSStefano Zampini } 13344cb006feSStefano Zampini PetscFunctionReturn(0); 13354cb006feSStefano Zampini } 13364cb006feSStefano Zampini 13374cb006feSStefano Zampini /*@ 13384cb006feSStefano Zampini PCHYPRESetDiscreteGradient - Set discrete gradient matrix 13394cb006feSStefano Zampini 13404cb006feSStefano Zampini Collective on PC 13414cb006feSStefano Zampini 13424cb006feSStefano Zampini Input Parameters: 13434cb006feSStefano Zampini + pc - the preconditioning context 13444cb006feSStefano Zampini - G - the discrete gradient 13454cb006feSStefano Zampini 13464cb006feSStefano Zampini Level: intermediate 13474cb006feSStefano Zampini 134895452b02SPatrick Sanan Notes: 134995452b02SPatrick Sanan G should have as many rows as the number of edges and as many columns as the number of vertices in the mesh 1350863406b8SStefano 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 13514cb006feSStefano Zampini 13524cb006feSStefano Zampini .seealso: 13534cb006feSStefano Zampini @*/ 13544cb006feSStefano Zampini PetscErrorCode PCHYPRESetDiscreteGradient(PC pc, Mat G) 13554cb006feSStefano Zampini { 13564cb006feSStefano Zampini PetscErrorCode ierr; 13574cb006feSStefano Zampini 13584cb006feSStefano Zampini PetscFunctionBegin; 13594cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 13604cb006feSStefano Zampini PetscValidHeaderSpecific(G,MAT_CLASSID,2); 13614cb006feSStefano Zampini PetscCheckSameComm(pc,1,G,2); 13624cb006feSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetDiscreteGradient_C",(PC,Mat),(pc,G));CHKERRQ(ierr); 13634cb006feSStefano Zampini PetscFunctionReturn(0); 13644cb006feSStefano Zampini } 13654cb006feSStefano Zampini 1366863406b8SStefano Zampini static PetscErrorCode PCHYPRESetDiscreteCurl_HYPRE(PC pc, Mat C) 1367863406b8SStefano Zampini { 1368863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 13695ac14e1cSStefano Zampini PetscBool ishypre; 1370863406b8SStefano Zampini PetscErrorCode ierr; 1371863406b8SStefano Zampini 1372863406b8SStefano Zampini PetscFunctionBegin; 13735ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)C,MATHYPRE,&ishypre);CHKERRQ(ierr); 13745ac14e1cSStefano Zampini if (ishypre) { 13755ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)C);CHKERRQ(ierr); 13765ac14e1cSStefano Zampini ierr = MatDestroy(&jac->C);CHKERRQ(ierr); 13775ac14e1cSStefano Zampini jac->C = C; 13785ac14e1cSStefano Zampini } else { 13796bf688a0SCe Qin ierr = MatDestroy(&jac->C);CHKERRQ(ierr); 13806bf688a0SCe Qin ierr = MatConvert(C,MATHYPRE,MAT_INITIAL_MATRIX,&jac->C);CHKERRQ(ierr); 13815ac14e1cSStefano Zampini } 1382863406b8SStefano Zampini PetscFunctionReturn(0); 1383863406b8SStefano Zampini } 1384863406b8SStefano Zampini 1385863406b8SStefano Zampini /*@ 1386863406b8SStefano Zampini PCHYPRESetDiscreteCurl - Set discrete curl matrix 1387863406b8SStefano Zampini 1388863406b8SStefano Zampini Collective on PC 1389863406b8SStefano Zampini 1390863406b8SStefano Zampini Input Parameters: 1391863406b8SStefano Zampini + pc - the preconditioning context 1392863406b8SStefano Zampini - C - the discrete curl 1393863406b8SStefano Zampini 1394863406b8SStefano Zampini Level: intermediate 1395863406b8SStefano Zampini 139695452b02SPatrick Sanan Notes: 139795452b02SPatrick Sanan C should have as many rows as the number of faces and as many columns as the number of edges in the mesh 1398863406b8SStefano 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 1399863406b8SStefano Zampini 1400863406b8SStefano Zampini .seealso: 1401863406b8SStefano Zampini @*/ 1402863406b8SStefano Zampini PetscErrorCode PCHYPRESetDiscreteCurl(PC pc, Mat C) 1403863406b8SStefano Zampini { 1404863406b8SStefano Zampini PetscErrorCode ierr; 1405863406b8SStefano Zampini 1406863406b8SStefano Zampini PetscFunctionBegin; 1407863406b8SStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 1408863406b8SStefano Zampini PetscValidHeaderSpecific(C,MAT_CLASSID,2); 1409863406b8SStefano Zampini PetscCheckSameComm(pc,1,C,2); 1410863406b8SStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetDiscreteCurl_C",(PC,Mat),(pc,C));CHKERRQ(ierr); 1411863406b8SStefano Zampini PetscFunctionReturn(0); 1412863406b8SStefano Zampini } 1413863406b8SStefano Zampini 14146bf688a0SCe Qin static PetscErrorCode PCHYPRESetInterpolations_HYPRE(PC pc, PetscInt dim, Mat RT_PiFull, Mat RT_Pi[], Mat ND_PiFull, Mat ND_Pi[]) 14156bf688a0SCe Qin { 14166bf688a0SCe Qin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 14176bf688a0SCe Qin PetscBool ishypre; 14186bf688a0SCe Qin PetscErrorCode ierr; 14196bf688a0SCe Qin PetscInt i; 14206bf688a0SCe Qin PetscFunctionBegin; 14216bf688a0SCe Qin 14226bf688a0SCe Qin ierr = MatDestroy(&jac->RT_PiFull);CHKERRQ(ierr); 14236bf688a0SCe Qin ierr = MatDestroy(&jac->ND_PiFull);CHKERRQ(ierr); 14246bf688a0SCe Qin for (i=0;i<3;++i) { 14256bf688a0SCe Qin ierr = MatDestroy(&jac->RT_Pi[i]);CHKERRQ(ierr); 14266bf688a0SCe Qin ierr = MatDestroy(&jac->ND_Pi[i]);CHKERRQ(ierr); 14276bf688a0SCe Qin } 14286bf688a0SCe Qin 14296bf688a0SCe Qin jac->dim = dim; 14306bf688a0SCe Qin if (RT_PiFull) { 14316bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)RT_PiFull,MATHYPRE,&ishypre);CHKERRQ(ierr); 14326bf688a0SCe Qin if (ishypre) { 14336bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)RT_PiFull);CHKERRQ(ierr); 14346bf688a0SCe Qin jac->RT_PiFull = RT_PiFull; 14356bf688a0SCe Qin } else { 14366bf688a0SCe Qin ierr = MatConvert(RT_PiFull,MATHYPRE,MAT_INITIAL_MATRIX,&jac->RT_PiFull);CHKERRQ(ierr); 14376bf688a0SCe Qin } 14386bf688a0SCe Qin } 14396bf688a0SCe Qin if (RT_Pi) { 14406bf688a0SCe Qin for (i=0;i<dim;++i) { 14416bf688a0SCe Qin if (RT_Pi[i]) { 14426bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)RT_Pi[i],MATHYPRE,&ishypre);CHKERRQ(ierr); 14436bf688a0SCe Qin if (ishypre) { 14446bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)RT_Pi[i]);CHKERRQ(ierr); 14456bf688a0SCe Qin jac->RT_Pi[i] = RT_Pi[i]; 14466bf688a0SCe Qin } else { 14476bf688a0SCe Qin ierr = MatConvert(RT_Pi[i],MATHYPRE,MAT_INITIAL_MATRIX,&jac->RT_Pi[i]);CHKERRQ(ierr); 14486bf688a0SCe Qin } 14496bf688a0SCe Qin } 14506bf688a0SCe Qin } 14516bf688a0SCe Qin } 14526bf688a0SCe Qin if (ND_PiFull) { 14536bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)ND_PiFull,MATHYPRE,&ishypre);CHKERRQ(ierr); 14546bf688a0SCe Qin if (ishypre) { 14556bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)ND_PiFull);CHKERRQ(ierr); 14566bf688a0SCe Qin jac->ND_PiFull = ND_PiFull; 14576bf688a0SCe Qin } else { 14586bf688a0SCe Qin ierr = MatConvert(ND_PiFull,MATHYPRE,MAT_INITIAL_MATRIX,&jac->ND_PiFull);CHKERRQ(ierr); 14596bf688a0SCe Qin } 14606bf688a0SCe Qin } 14616bf688a0SCe Qin if (ND_Pi) { 14626bf688a0SCe Qin for (i=0;i<dim;++i) { 14636bf688a0SCe Qin if (ND_Pi[i]) { 14646bf688a0SCe Qin ierr = PetscObjectTypeCompare((PetscObject)ND_Pi[i],MATHYPRE,&ishypre);CHKERRQ(ierr); 14656bf688a0SCe Qin if (ishypre) { 14666bf688a0SCe Qin ierr = PetscObjectReference((PetscObject)ND_Pi[i]);CHKERRQ(ierr); 14676bf688a0SCe Qin jac->ND_Pi[i] = ND_Pi[i]; 14686bf688a0SCe Qin } else { 14696bf688a0SCe Qin ierr = MatConvert(ND_Pi[i],MATHYPRE,MAT_INITIAL_MATRIX,&jac->ND_Pi[i]);CHKERRQ(ierr); 14706bf688a0SCe Qin } 14716bf688a0SCe Qin } 14726bf688a0SCe Qin } 14736bf688a0SCe Qin } 14746bf688a0SCe Qin 14756bf688a0SCe Qin PetscFunctionReturn(0); 14766bf688a0SCe Qin } 14776bf688a0SCe Qin 14786bf688a0SCe Qin /*@ 14796bf688a0SCe Qin PCHYPRESetInterpolations - Set interpolation matrices for AMS/ADS preconditioner 14806bf688a0SCe Qin 14816bf688a0SCe Qin Collective on PC 14826bf688a0SCe Qin 14836bf688a0SCe Qin Input Parameters: 14846bf688a0SCe Qin + pc - the preconditioning context 14856bf688a0SCe Qin - dim - the dimension of the problem, only used in AMS 14866bf688a0SCe Qin - RT_PiFull - Raviart-Thomas interpolation matrix 14876bf688a0SCe Qin - RT_Pi - x/y/z component of Raviart-Thomas interpolation matrix 14886bf688a0SCe Qin - ND_PiFull - Nedelec interpolation matrix 14896bf688a0SCe Qin - ND_Pi - x/y/z component of Nedelec interpolation matrix 14906bf688a0SCe Qin 149195452b02SPatrick Sanan Notes: 149295452b02SPatrick Sanan For AMS, only Nedelec interpolation matrices are needed, the Raviart-Thomas interpolation matrices can be set to NULL. 14936bf688a0SCe Qin For ADS, both type of interpolation matrices are needed. 14946bf688a0SCe Qin Level: intermediate 14956bf688a0SCe Qin 14966bf688a0SCe Qin .seealso: 14976bf688a0SCe Qin @*/ 14986bf688a0SCe Qin PetscErrorCode PCHYPRESetInterpolations(PC pc, PetscInt dim, Mat RT_PiFull, Mat RT_Pi[], Mat ND_PiFull, Mat ND_Pi[]) 14996bf688a0SCe Qin { 15006bf688a0SCe Qin PetscErrorCode ierr; 15016bf688a0SCe Qin PetscInt i; 15026bf688a0SCe Qin 15036bf688a0SCe Qin PetscFunctionBegin; 15046bf688a0SCe Qin PetscValidHeaderSpecific(pc,PC_CLASSID,1); 15056bf688a0SCe Qin if (RT_PiFull) { 15066bf688a0SCe Qin PetscValidHeaderSpecific(RT_PiFull,MAT_CLASSID,3); 15076bf688a0SCe Qin PetscCheckSameComm(pc,1,RT_PiFull,3); 15086bf688a0SCe Qin } 15096bf688a0SCe Qin if (RT_Pi) { 15106bf688a0SCe Qin PetscValidPointer(RT_Pi,4); 15116bf688a0SCe Qin for (i=0;i<dim;++i) { 15126bf688a0SCe Qin if (RT_Pi[i]) { 15136bf688a0SCe Qin PetscValidHeaderSpecific(RT_Pi[i],MAT_CLASSID,4); 15146bf688a0SCe Qin PetscCheckSameComm(pc,1,RT_Pi[i],4); 15156bf688a0SCe Qin } 15166bf688a0SCe Qin } 15176bf688a0SCe Qin } 15186bf688a0SCe Qin if (ND_PiFull) { 15196bf688a0SCe Qin PetscValidHeaderSpecific(ND_PiFull,MAT_CLASSID,5); 15206bf688a0SCe Qin PetscCheckSameComm(pc,1,ND_PiFull,5); 15216bf688a0SCe Qin } 15226bf688a0SCe Qin if (ND_Pi) { 15236bf688a0SCe Qin PetscValidPointer(ND_Pi,6); 15246bf688a0SCe Qin for (i=0;i<dim;++i) { 15256bf688a0SCe Qin if (ND_Pi[i]) { 15266bf688a0SCe Qin PetscValidHeaderSpecific(ND_Pi[i],MAT_CLASSID,6); 15276bf688a0SCe Qin PetscCheckSameComm(pc,1,ND_Pi[i],6); 15286bf688a0SCe Qin } 15296bf688a0SCe Qin } 15306bf688a0SCe Qin } 15316bf688a0SCe Qin ierr = PetscTryMethod(pc,"PCHYPRESetInterpolations_C",(PC,PetscInt,Mat,Mat[],Mat,Mat[]),(pc,dim,RT_PiFull,RT_Pi,ND_PiFull,ND_Pi));CHKERRQ(ierr); 15326bf688a0SCe Qin PetscFunctionReturn(0); 15336bf688a0SCe Qin } 15346bf688a0SCe Qin 15355ac14e1cSStefano Zampini static PetscErrorCode PCHYPRESetPoissonMatrix_HYPRE(PC pc, Mat A, PetscBool isalpha) 15364cb006feSStefano Zampini { 15374cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 15385ac14e1cSStefano Zampini PetscBool ishypre; 15394cb006feSStefano Zampini PetscErrorCode ierr; 15404cb006feSStefano Zampini 15414cb006feSStefano Zampini PetscFunctionBegin; 15425ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)A,MATHYPRE,&ishypre);CHKERRQ(ierr); 15435ac14e1cSStefano Zampini if (ishypre) { 15445ac14e1cSStefano Zampini if (isalpha) { 15455ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 15465ac14e1cSStefano Zampini ierr = MatDestroy(&jac->alpha_Poisson);CHKERRQ(ierr); 15475ac14e1cSStefano Zampini jac->alpha_Poisson = A; 15485ac14e1cSStefano Zampini } else { 15495ac14e1cSStefano Zampini if (A) { 15505ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 15515ac14e1cSStefano Zampini } else { 15525ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_TRUE; 15535ac14e1cSStefano Zampini } 15545ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 15555ac14e1cSStefano Zampini jac->beta_Poisson = A; 15565ac14e1cSStefano Zampini } 15575ac14e1cSStefano Zampini } else { 15585ac14e1cSStefano Zampini if (isalpha) { 15596bf688a0SCe Qin ierr = MatDestroy(&jac->alpha_Poisson);CHKERRQ(ierr); 15606bf688a0SCe Qin ierr = MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&jac->alpha_Poisson);CHKERRQ(ierr); 15615ac14e1cSStefano Zampini } else { 15625ac14e1cSStefano Zampini if (A) { 15636bf688a0SCe Qin ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 15646bf688a0SCe Qin ierr = MatConvert(A,MATHYPRE,MAT_INITIAL_MATRIX,&jac->beta_Poisson);CHKERRQ(ierr); 15655ac14e1cSStefano Zampini } else { 15665ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 15675ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_TRUE; 15685ac14e1cSStefano Zampini } 15695ac14e1cSStefano Zampini } 15705ac14e1cSStefano Zampini } 15714cb006feSStefano Zampini PetscFunctionReturn(0); 15724cb006feSStefano Zampini } 15734cb006feSStefano Zampini 15744cb006feSStefano Zampini /*@ 15754cb006feSStefano Zampini PCHYPRESetAlphaPoissonMatrix - Set vector Poisson matrix 15764cb006feSStefano Zampini 15774cb006feSStefano Zampini Collective on PC 15784cb006feSStefano Zampini 15794cb006feSStefano Zampini Input Parameters: 15804cb006feSStefano Zampini + pc - the preconditioning context 15814cb006feSStefano Zampini - A - the matrix 15824cb006feSStefano Zampini 15834cb006feSStefano Zampini Level: intermediate 15844cb006feSStefano Zampini 158595452b02SPatrick Sanan Notes: 158695452b02SPatrick Sanan A should be obtained by discretizing the vector valued Poisson problem with linear finite elements 15874cb006feSStefano Zampini 15884cb006feSStefano Zampini .seealso: 15894cb006feSStefano Zampini @*/ 15904cb006feSStefano Zampini PetscErrorCode PCHYPRESetAlphaPoissonMatrix(PC pc, Mat A) 15914cb006feSStefano Zampini { 15924cb006feSStefano Zampini PetscErrorCode ierr; 15934cb006feSStefano Zampini 15944cb006feSStefano Zampini PetscFunctionBegin; 15954cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 15964cb006feSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,2); 15974cb006feSStefano Zampini PetscCheckSameComm(pc,1,A,2); 15985ac14e1cSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetPoissonMatrix_C",(PC,Mat,PetscBool),(pc,A,PETSC_TRUE));CHKERRQ(ierr); 15994cb006feSStefano Zampini PetscFunctionReturn(0); 16004cb006feSStefano Zampini } 16014cb006feSStefano Zampini 16024cb006feSStefano Zampini /*@ 16034cb006feSStefano Zampini PCHYPRESetBetaPoissonMatrix - Set Poisson matrix 16044cb006feSStefano Zampini 16054cb006feSStefano Zampini Collective on PC 16064cb006feSStefano Zampini 16074cb006feSStefano Zampini Input Parameters: 16084cb006feSStefano Zampini + pc - the preconditioning context 16094cb006feSStefano Zampini - A - the matrix 16104cb006feSStefano Zampini 16114cb006feSStefano Zampini Level: intermediate 16124cb006feSStefano Zampini 161395452b02SPatrick Sanan Notes: 161495452b02SPatrick Sanan A should be obtained by discretizing the Poisson problem with linear finite elements. 16154cb006feSStefano Zampini Following HYPRE convention, the scalar Poisson solver of AMS can be turned off by passing NULL. 16164cb006feSStefano Zampini 16174cb006feSStefano Zampini .seealso: 16184cb006feSStefano Zampini @*/ 16194cb006feSStefano Zampini PetscErrorCode PCHYPRESetBetaPoissonMatrix(PC pc, Mat A) 16204cb006feSStefano Zampini { 16214cb006feSStefano Zampini PetscErrorCode ierr; 16224cb006feSStefano Zampini 16234cb006feSStefano Zampini PetscFunctionBegin; 16244cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 16254cb006feSStefano Zampini if (A) { 16264cb006feSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,2); 16274cb006feSStefano Zampini PetscCheckSameComm(pc,1,A,2); 16284cb006feSStefano Zampini } 16295ac14e1cSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetPoissonMatrix_C",(PC,Mat,PetscBool),(pc,A,PETSC_FALSE));CHKERRQ(ierr); 16304cb006feSStefano Zampini PetscFunctionReturn(0); 16314cb006feSStefano Zampini } 16324cb006feSStefano Zampini 16335ac14e1cSStefano Zampini static PetscErrorCode PCHYPRESetEdgeConstantVectors_HYPRE(PC pc,Vec ozz, Vec zoz, Vec zzo) 16344cb006feSStefano Zampini { 16354cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 16364cb006feSStefano Zampini PetscErrorCode ierr; 16374cb006feSStefano Zampini 16384cb006feSStefano Zampini PetscFunctionBegin; 16394cb006feSStefano Zampini /* throw away any vector if already set */ 16404cb006feSStefano Zampini if (jac->constants[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[0])); 16414cb006feSStefano Zampini if (jac->constants[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[1])); 16424cb006feSStefano Zampini if (jac->constants[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[2])); 16434cb006feSStefano Zampini jac->constants[0] = NULL; 16444cb006feSStefano Zampini jac->constants[1] = NULL; 16454cb006feSStefano Zampini jac->constants[2] = NULL; 16464cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(ozz,&jac->constants[0]);CHKERRQ(ierr); 16474cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(ozz,jac->constants[0]);CHKERRQ(ierr); 16484cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(zoz,&jac->constants[1]);CHKERRQ(ierr); 16494cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(zoz,jac->constants[1]);CHKERRQ(ierr); 16505ac14e1cSStefano Zampini jac->dim = 2; 16514cb006feSStefano Zampini if (zzo) { 16524cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(zzo,&jac->constants[2]);CHKERRQ(ierr); 16534cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(zzo,jac->constants[2]);CHKERRQ(ierr); 16545ac14e1cSStefano Zampini jac->dim++; 16554cb006feSStefano Zampini } 16564cb006feSStefano Zampini PetscFunctionReturn(0); 16574cb006feSStefano Zampini } 16584cb006feSStefano Zampini 16594cb006feSStefano Zampini /*@ 16604cb006feSStefano Zampini PCHYPRESetEdgeConstantVectors - Set the representation of the constant vector fields in edge element basis 16614cb006feSStefano Zampini 16624cb006feSStefano Zampini Collective on PC 16634cb006feSStefano Zampini 16644cb006feSStefano Zampini Input Parameters: 16654cb006feSStefano Zampini + pc - the preconditioning context 16664cb006feSStefano Zampini - ozz - vector representing (1,0,0) (or (1,0) in 2D) 16674cb006feSStefano Zampini - zoz - vector representing (0,1,0) (or (0,1) in 2D) 16684cb006feSStefano Zampini - zzo - vector representing (0,0,1) (use NULL in 2D) 16694cb006feSStefano Zampini 16704cb006feSStefano Zampini Level: intermediate 16714cb006feSStefano Zampini 16724cb006feSStefano Zampini Notes: 16734cb006feSStefano Zampini 16744cb006feSStefano Zampini .seealso: 16754cb006feSStefano Zampini @*/ 16764cb006feSStefano Zampini PetscErrorCode PCHYPRESetEdgeConstantVectors(PC pc, Vec ozz, Vec zoz, Vec zzo) 16774cb006feSStefano Zampini { 16784cb006feSStefano Zampini PetscErrorCode ierr; 16794cb006feSStefano Zampini 16804cb006feSStefano Zampini PetscFunctionBegin; 16814cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 16824cb006feSStefano Zampini PetscValidHeaderSpecific(ozz,VEC_CLASSID,2); 16834cb006feSStefano Zampini PetscValidHeaderSpecific(zoz,VEC_CLASSID,3); 16844cb006feSStefano Zampini if (zzo) PetscValidHeaderSpecific(zzo,VEC_CLASSID,4); 16854cb006feSStefano Zampini PetscCheckSameComm(pc,1,ozz,2); 16864cb006feSStefano Zampini PetscCheckSameComm(pc,1,zoz,3); 16874cb006feSStefano Zampini if (zzo) PetscCheckSameComm(pc,1,zzo,4); 16884cb006feSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetEdgeConstantVectors_C",(PC,Vec,Vec,Vec),(pc,ozz,zoz,zzo));CHKERRQ(ierr); 16894cb006feSStefano Zampini PetscFunctionReturn(0); 16904cb006feSStefano Zampini } 16914cb006feSStefano Zampini 1692863406b8SStefano Zampini static PetscErrorCode PCSetCoordinates_HYPRE(PC pc, PetscInt dim, PetscInt nloc, PetscReal *coords) 16934cb006feSStefano Zampini { 16944cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 16954cb006feSStefano Zampini Vec tv; 16964cb006feSStefano Zampini PetscInt i; 16974cb006feSStefano Zampini PetscErrorCode ierr; 16984cb006feSStefano Zampini 16994cb006feSStefano Zampini PetscFunctionBegin; 17004cb006feSStefano Zampini /* throw away any coordinate vector if already set */ 17014cb006feSStefano Zampini if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[0])); 17024cb006feSStefano Zampini if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[1])); 17034cb006feSStefano Zampini if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[2])); 17045ac14e1cSStefano Zampini jac->dim = dim; 17055ac14e1cSStefano Zampini 17064cb006feSStefano Zampini /* compute IJ vector for coordinates */ 17074cb006feSStefano Zampini ierr = VecCreate(PetscObjectComm((PetscObject)pc),&tv);CHKERRQ(ierr); 17084cb006feSStefano Zampini ierr = VecSetType(tv,VECSTANDARD);CHKERRQ(ierr); 17094cb006feSStefano Zampini ierr = VecSetSizes(tv,nloc,PETSC_DECIDE);CHKERRQ(ierr); 17104cb006feSStefano Zampini for (i=0;i<dim;i++) { 17114cb006feSStefano Zampini PetscScalar *array; 17124cb006feSStefano Zampini PetscInt j; 17134cb006feSStefano Zampini 17144cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(tv,&jac->coords[i]);CHKERRQ(ierr); 17154cb006feSStefano Zampini ierr = VecGetArray(tv,&array);CHKERRQ(ierr); 17164cb006feSStefano Zampini for (j=0;j<nloc;j++) { 17174cb006feSStefano Zampini array[j] = coords[j*dim+i]; 17184cb006feSStefano Zampini } 17194cb006feSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorSetValues,(jac->coords[i],nloc,NULL,array)); 17204cb006feSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorAssemble,(jac->coords[i])); 17214cb006feSStefano Zampini ierr = VecRestoreArray(tv,&array);CHKERRQ(ierr); 17224cb006feSStefano Zampini } 17234cb006feSStefano Zampini ierr = VecDestroy(&tv);CHKERRQ(ierr); 17244cb006feSStefano Zampini PetscFunctionReturn(0); 17254cb006feSStefano Zampini } 17264cb006feSStefano Zampini 172716d9e3a6SLisandro Dalcin /* ---------------------------------------------------------------------------------*/ 172816d9e3a6SLisandro Dalcin 1729f7a08781SBarry Smith static PetscErrorCode PCHYPREGetType_HYPRE(PC pc,const char *name[]) 173016d9e3a6SLisandro Dalcin { 173116d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 173216d9e3a6SLisandro Dalcin 173316d9e3a6SLisandro Dalcin PetscFunctionBegin; 173416d9e3a6SLisandro Dalcin *name = jac->hypre_type; 173516d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 173616d9e3a6SLisandro Dalcin } 173716d9e3a6SLisandro Dalcin 1738f7a08781SBarry Smith static PetscErrorCode PCHYPRESetType_HYPRE(PC pc,const char name[]) 173916d9e3a6SLisandro Dalcin { 174016d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 174116d9e3a6SLisandro Dalcin PetscErrorCode ierr; 1742ace3abfcSBarry Smith PetscBool flag; 174316d9e3a6SLisandro Dalcin 174416d9e3a6SLisandro Dalcin PetscFunctionBegin; 174516d9e3a6SLisandro Dalcin if (jac->hypre_type) { 174616d9e3a6SLisandro Dalcin ierr = PetscStrcmp(jac->hypre_type,name,&flag);CHKERRQ(ierr); 1747ce94432eSBarry Smith if (!flag) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ORDER,"Cannot reset the HYPRE preconditioner type once it has been set"); 174816d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 174916d9e3a6SLisandro Dalcin } else { 175016d9e3a6SLisandro Dalcin ierr = PetscStrallocpy(name, &jac->hypre_type);CHKERRQ(ierr); 175116d9e3a6SLisandro Dalcin } 175216d9e3a6SLisandro Dalcin 175316d9e3a6SLisandro Dalcin jac->maxiter = PETSC_DEFAULT; 175416d9e3a6SLisandro Dalcin jac->tol = PETSC_DEFAULT; 175516d9e3a6SLisandro Dalcin jac->printstatistics = PetscLogPrintInfo; 175616d9e3a6SLisandro Dalcin 175716d9e3a6SLisandro Dalcin ierr = PetscStrcmp("pilut",jac->hypre_type,&flag);CHKERRQ(ierr); 175816d9e3a6SLisandro Dalcin if (flag) { 1759572a0576SBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(jac->comm_hypre));CHKERRQ(ierr); 1760fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParCSRPilutCreate,(jac->comm_hypre,&jac->hsolver)); 176116d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_Pilut; 176216d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_Pilut; 176316d9e3a6SLisandro Dalcin jac->destroy = HYPRE_ParCSRPilutDestroy; 176416d9e3a6SLisandro Dalcin jac->setup = HYPRE_ParCSRPilutSetup; 176516d9e3a6SLisandro Dalcin jac->solve = HYPRE_ParCSRPilutSolve; 176616d9e3a6SLisandro Dalcin jac->factorrowsize = PETSC_DEFAULT; 176716d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 176816d9e3a6SLisandro Dalcin } 1769db966c6cSHong Zhang ierr = PetscStrcmp("euclid",jac->hypre_type,&flag);CHKERRQ(ierr); 1770db966c6cSHong Zhang if (flag) { 1771db966c6cSHong Zhang ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(jac->comm_hypre));CHKERRQ(ierr); 1772db966c6cSHong Zhang PetscStackCallStandard(HYPRE_EuclidCreate,(jac->comm_hypre,&jac->hsolver)); 1773db966c6cSHong Zhang pc->ops->setfromoptions = PCSetFromOptions_HYPRE_Euclid; 1774db966c6cSHong Zhang pc->ops->view = PCView_HYPRE_Euclid; 1775db966c6cSHong Zhang jac->destroy = HYPRE_EuclidDestroy; 1776db966c6cSHong Zhang jac->setup = HYPRE_EuclidSetup; 1777db966c6cSHong Zhang jac->solve = HYPRE_EuclidSolve; 1778db966c6cSHong Zhang jac->factorrowsize = PETSC_DEFAULT; 1779db966c6cSHong Zhang jac->eu_level = PETSC_DEFAULT; /* default */ 1780db966c6cSHong Zhang PetscFunctionReturn(0); 1781db966c6cSHong Zhang } 178216d9e3a6SLisandro Dalcin ierr = PetscStrcmp("parasails",jac->hypre_type,&flag);CHKERRQ(ierr); 178316d9e3a6SLisandro Dalcin if (flag) { 1784572a0576SBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(jac->comm_hypre));CHKERRQ(ierr); 1785fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsCreate,(jac->comm_hypre,&jac->hsolver)); 178616d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_ParaSails; 178716d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_ParaSails; 178816d9e3a6SLisandro Dalcin jac->destroy = HYPRE_ParaSailsDestroy; 178916d9e3a6SLisandro Dalcin jac->setup = HYPRE_ParaSailsSetup; 179016d9e3a6SLisandro Dalcin jac->solve = HYPRE_ParaSailsSolve; 179116d9e3a6SLisandro Dalcin /* initialize */ 179216d9e3a6SLisandro Dalcin jac->nlevels = 1; 179316d9e3a6SLisandro Dalcin jac->threshhold = .1; 179416d9e3a6SLisandro Dalcin jac->filter = .1; 179516d9e3a6SLisandro Dalcin jac->loadbal = 0; 17962fa5cd67SKarl Rupp if (PetscLogPrintInfo) jac->logging = (int) PETSC_TRUE; 17972fa5cd67SKarl Rupp else jac->logging = (int) PETSC_FALSE; 17982fa5cd67SKarl Rupp 179916d9e3a6SLisandro Dalcin jac->ruse = (int) PETSC_FALSE; 180016d9e3a6SLisandro Dalcin jac->symt = 0; 1801fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetParams,(jac->hsolver,jac->threshhold,jac->nlevels)); 1802fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetFilter,(jac->hsolver,jac->filter)); 1803fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetLoadbal,(jac->hsolver,jac->loadbal)); 1804fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetLogging,(jac->hsolver,jac->logging)); 1805fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetReuse,(jac->hsolver,jac->ruse)); 1806fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetSym,(jac->hsolver,jac->symt)); 180716d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 180816d9e3a6SLisandro Dalcin } 180916d9e3a6SLisandro Dalcin ierr = PetscStrcmp("boomeramg",jac->hypre_type,&flag);CHKERRQ(ierr); 181016d9e3a6SLisandro Dalcin if (flag) { 181116d9e3a6SLisandro Dalcin ierr = HYPRE_BoomerAMGCreate(&jac->hsolver); 181216d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_BoomerAMG; 181316d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_BoomerAMG; 181416d9e3a6SLisandro Dalcin pc->ops->applytranspose = PCApplyTranspose_HYPRE_BoomerAMG; 181516d9e3a6SLisandro Dalcin pc->ops->applyrichardson = PCApplyRichardson_HYPRE_BoomerAMG; 181616d9e3a6SLisandro Dalcin jac->destroy = HYPRE_BoomerAMGDestroy; 181716d9e3a6SLisandro Dalcin jac->setup = HYPRE_BoomerAMGSetup; 181816d9e3a6SLisandro Dalcin jac->solve = HYPRE_BoomerAMGSolve; 181916d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_FALSE; 182016d9e3a6SLisandro Dalcin /* these defaults match the hypre defaults */ 182116d9e3a6SLisandro Dalcin jac->cycletype = 1; 182216d9e3a6SLisandro Dalcin jac->maxlevels = 25; 182316d9e3a6SLisandro Dalcin jac->maxiter = 1; 18248f87f92bSBarry Smith jac->tol = 0.0; /* tolerance of zero indicates use as preconditioner (suppresses convergence errors) */ 182516d9e3a6SLisandro Dalcin jac->truncfactor = 0.0; 182616d9e3a6SLisandro Dalcin jac->strongthreshold = .25; 182716d9e3a6SLisandro Dalcin jac->maxrowsum = .9; 182816d9e3a6SLisandro Dalcin jac->coarsentype = 6; 182916d9e3a6SLisandro Dalcin jac->measuretype = 0; 18300f1074feSSatish Balay jac->gridsweeps[0] = jac->gridsweeps[1] = jac->gridsweeps[2] = 1; 18316a251517SEike Mueller jac->smoothtype = -1; /* Not set by default */ 1832b9eb5777SEike Mueller jac->smoothnumlevels = 25; 18331810e44eSEike Mueller jac->eu_level = 0; 18341810e44eSEike Mueller jac->eu_droptolerance = 0; 18351810e44eSEike Mueller jac->eu_bj = 0; 18368f87f92bSBarry Smith jac->relaxtype[0] = jac->relaxtype[1] = 6; /* Defaults to SYMMETRIC since in PETSc we are using a a PC - most likely with CG */ 18370f1074feSSatish Balay jac->relaxtype[2] = 9; /*G.E. */ 183816d9e3a6SLisandro Dalcin jac->relaxweight = 1.0; 183916d9e3a6SLisandro Dalcin jac->outerrelaxweight = 1.0; 184016d9e3a6SLisandro Dalcin jac->relaxorder = 1; 18410f1074feSSatish Balay jac->interptype = 0; 18420f1074feSSatish Balay jac->agg_nl = 0; 18430f1074feSSatish Balay jac->pmax = 0; 18440f1074feSSatish Balay jac->truncfactor = 0.0; 18450f1074feSSatish Balay jac->agg_num_paths = 1; 18468f87f92bSBarry Smith 184722e51d31SStefano Zampini jac->nodal_coarsening = 0; 184822e51d31SStefano Zampini jac->nodal_coarsening_diag = 0; 184922e51d31SStefano Zampini jac->vec_interp_variant = 0; 185022e51d31SStefano Zampini jac->vec_interp_qmax = 0; 185122e51d31SStefano Zampini jac->vec_interp_smooth = PETSC_FALSE; 185222e51d31SStefano Zampini jac->interp_refine = 0; 18538f87f92bSBarry Smith jac->nodal_relax = PETSC_FALSE; 18548f87f92bSBarry Smith jac->nodal_relax_levels = 1; 1855fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleType,(jac->hsolver,jac->cycletype)); 1856fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxLevels,(jac->hsolver,jac->maxlevels)); 1857fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 1858fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 1859fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTruncFactor,(jac->hsolver,jac->truncfactor)); 1860fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThreshold,(jac->hsolver,jac->strongthreshold)); 1861fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxRowSum,(jac->hsolver,jac->maxrowsum)); 1862fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCoarsenType,(jac->hsolver,jac->coarsentype)); 1863fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMeasureType,(jac->hsolver,jac->measuretype)); 1864fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxOrder,(jac->hsolver, jac->relaxorder)); 1865fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpType,(jac->hsolver,jac->interptype)); 1866fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetAggNumLevels,(jac->hsolver,jac->agg_nl)); 1867fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetPMaxElmts,(jac->hsolver,jac->pmax)); 1868fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumPaths,(jac->hsolver,jac->agg_num_paths)); 1869fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxType,(jac->hsolver, jac->relaxtype[0])); /*defaults coarse to 9*/ 1870fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumSweeps,(jac->hsolver, jac->gridsweeps[0])); /*defaults coarse to 1 */ 187116d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 187216d9e3a6SLisandro Dalcin } 18734cb006feSStefano Zampini ierr = PetscStrcmp("ams",jac->hypre_type,&flag);CHKERRQ(ierr); 18744cb006feSStefano Zampini if (flag) { 18754cb006feSStefano Zampini ierr = HYPRE_AMSCreate(&jac->hsolver); 18764cb006feSStefano Zampini pc->ops->setfromoptions = PCSetFromOptions_HYPRE_AMS; 18774cb006feSStefano Zampini pc->ops->view = PCView_HYPRE_AMS; 18784cb006feSStefano Zampini jac->destroy = HYPRE_AMSDestroy; 18794cb006feSStefano Zampini jac->setup = HYPRE_AMSSetup; 18804cb006feSStefano Zampini jac->solve = HYPRE_AMSSolve; 18814cb006feSStefano Zampini jac->coords[0] = NULL; 18824cb006feSStefano Zampini jac->coords[1] = NULL; 18834cb006feSStefano Zampini jac->coords[2] = NULL; 18844cb006feSStefano Zampini /* solver parameters: these are borrowed from mfem package, and they are not the default values from HYPRE AMS */ 1885863406b8SStefano Zampini jac->as_print = 0; 1886863406b8SStefano Zampini jac->as_max_iter = 1; /* used as a preconditioner */ 1887863406b8SStefano Zampini jac->as_tol = 0.; /* used as a preconditioner */ 18884cb006feSStefano Zampini jac->ams_cycle_type = 13; 18894cb006feSStefano Zampini /* Smoothing options */ 1890863406b8SStefano Zampini jac->as_relax_type = 2; 1891863406b8SStefano Zampini jac->as_relax_times = 1; 1892863406b8SStefano Zampini jac->as_relax_weight = 1.0; 1893863406b8SStefano Zampini jac->as_omega = 1.0; 18944cb006feSStefano Zampini /* Vector valued Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1895863406b8SStefano Zampini jac->as_amg_alpha_opts[0] = 10; 1896863406b8SStefano Zampini jac->as_amg_alpha_opts[1] = 1; 18970bdd8552SBarry Smith jac->as_amg_alpha_opts[2] = 6; 1898863406b8SStefano Zampini jac->as_amg_alpha_opts[3] = 6; 1899863406b8SStefano Zampini jac->as_amg_alpha_opts[4] = 4; 1900863406b8SStefano Zampini jac->as_amg_alpha_theta = 0.25; 19014cb006feSStefano Zampini /* Scalar Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1902863406b8SStefano Zampini jac->as_amg_beta_opts[0] = 10; 1903863406b8SStefano Zampini jac->as_amg_beta_opts[1] = 1; 19040bdd8552SBarry Smith jac->as_amg_beta_opts[2] = 6; 1905863406b8SStefano Zampini jac->as_amg_beta_opts[3] = 6; 1906863406b8SStefano Zampini jac->as_amg_beta_opts[4] = 4; 1907863406b8SStefano Zampini jac->as_amg_beta_theta = 0.25; 1908863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetPrintLevel,(jac->hsolver,jac->as_print)); 1909863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 19104cb006feSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 1911863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetTol,(jac->hsolver,jac->as_tol)); 1912863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1913863406b8SStefano Zampini jac->as_relax_times, 1914863406b8SStefano Zampini jac->as_relax_weight, 1915863406b8SStefano Zampini jac->as_omega)); 1916863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaAMGOptions,(jac->hsolver,jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1917863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1918863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1919863406b8SStefano Zampini jac->as_amg_alpha_theta, 1920863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1921863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 1922863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1923863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1924863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1925863406b8SStefano Zampini jac->as_amg_beta_theta, 1926863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1927863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 192823df4f25SStefano Zampini /* Zero conductivity */ 192923df4f25SStefano Zampini jac->ams_beta_is_zero = PETSC_FALSE; 193023df4f25SStefano Zampini jac->ams_beta_is_zero_part = PETSC_FALSE; 19314cb006feSStefano Zampini PetscFunctionReturn(0); 19324cb006feSStefano Zampini } 1933863406b8SStefano Zampini ierr = PetscStrcmp("ads",jac->hypre_type,&flag);CHKERRQ(ierr); 1934863406b8SStefano Zampini if (flag) { 1935863406b8SStefano Zampini ierr = HYPRE_ADSCreate(&jac->hsolver); 1936863406b8SStefano Zampini pc->ops->setfromoptions = PCSetFromOptions_HYPRE_ADS; 1937863406b8SStefano Zampini pc->ops->view = PCView_HYPRE_ADS; 1938863406b8SStefano Zampini jac->destroy = HYPRE_ADSDestroy; 1939863406b8SStefano Zampini jac->setup = HYPRE_ADSSetup; 1940863406b8SStefano Zampini jac->solve = HYPRE_ADSSolve; 1941863406b8SStefano Zampini jac->coords[0] = NULL; 1942863406b8SStefano Zampini jac->coords[1] = NULL; 1943863406b8SStefano Zampini jac->coords[2] = NULL; 1944863406b8SStefano Zampini /* solver parameters: these are borrowed from mfem package, and they are not the default values from HYPRE ADS */ 1945863406b8SStefano Zampini jac->as_print = 0; 1946863406b8SStefano Zampini jac->as_max_iter = 1; /* used as a preconditioner */ 1947863406b8SStefano Zampini jac->as_tol = 0.; /* used as a preconditioner */ 1948863406b8SStefano Zampini jac->ads_cycle_type = 13; 1949863406b8SStefano Zampini /* Smoothing options */ 1950863406b8SStefano Zampini jac->as_relax_type = 2; 1951863406b8SStefano Zampini jac->as_relax_times = 1; 1952863406b8SStefano Zampini jac->as_relax_weight = 1.0; 1953863406b8SStefano Zampini jac->as_omega = 1.0; 1954863406b8SStefano Zampini /* AMS solver parameters: cycle_type, coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1955863406b8SStefano Zampini jac->ams_cycle_type = 14; 1956863406b8SStefano Zampini jac->as_amg_alpha_opts[0] = 10; 1957863406b8SStefano Zampini jac->as_amg_alpha_opts[1] = 1; 1958863406b8SStefano Zampini jac->as_amg_alpha_opts[2] = 6; 1959863406b8SStefano Zampini jac->as_amg_alpha_opts[3] = 6; 1960863406b8SStefano Zampini jac->as_amg_alpha_opts[4] = 4; 1961863406b8SStefano Zampini jac->as_amg_alpha_theta = 0.25; 1962863406b8SStefano Zampini /* Vector Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1963863406b8SStefano Zampini jac->as_amg_beta_opts[0] = 10; 1964863406b8SStefano Zampini jac->as_amg_beta_opts[1] = 1; 1965863406b8SStefano Zampini jac->as_amg_beta_opts[2] = 6; 1966863406b8SStefano Zampini jac->as_amg_beta_opts[3] = 6; 1967863406b8SStefano Zampini jac->as_amg_beta_opts[4] = 4; 1968863406b8SStefano Zampini jac->as_amg_beta_theta = 0.25; 1969863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetPrintLevel,(jac->hsolver,jac->as_print)); 1970863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 1971863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 1972863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetTol,(jac->hsolver,jac->as_tol)); 1973863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1974863406b8SStefano Zampini jac->as_relax_times, 1975863406b8SStefano Zampini jac->as_relax_weight, 1976863406b8SStefano Zampini jac->as_omega)); 1977863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMSOptions,(jac->hsolver,jac->ams_cycle_type, /* AMG coarsen type */ 1978863406b8SStefano Zampini jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1979863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1980863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1981863406b8SStefano Zampini jac->as_amg_alpha_theta, 1982863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1983863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 1984863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1985863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1986863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1987863406b8SStefano Zampini jac->as_amg_beta_theta, 1988863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1989863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 1990863406b8SStefano Zampini PetscFunctionReturn(0); 1991863406b8SStefano Zampini } 1992503cfb0cSBarry Smith ierr = PetscFree(jac->hypre_type);CHKERRQ(ierr); 19932fa5cd67SKarl Rupp 19940298fd71SBarry Smith jac->hypre_type = NULL; 1995db966c6cSHong Zhang SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown HYPRE preconditioner %s; Choices are euclid, pilut, parasails, boomeramg, ams",name); 199616d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 199716d9e3a6SLisandro Dalcin } 199816d9e3a6SLisandro Dalcin 199916d9e3a6SLisandro Dalcin /* 200016d9e3a6SLisandro Dalcin It only gets here if the HYPRE type has not been set before the call to 200116d9e3a6SLisandro Dalcin ...SetFromOptions() which actually is most of the time 200216d9e3a6SLisandro Dalcin */ 2003360ee056SFande Kong PetscErrorCode PCSetFromOptions_HYPRE(PetscOptionItems *PetscOptionsObject,PC pc) 200416d9e3a6SLisandro Dalcin { 200516d9e3a6SLisandro Dalcin PetscErrorCode ierr; 20064ddd07fcSJed Brown PetscInt indx; 2007db966c6cSHong Zhang const char *type[] = {"euclid","pilut","parasails","boomeramg","ams","ads"}; 2008ace3abfcSBarry Smith PetscBool flg; 200916d9e3a6SLisandro Dalcin 201016d9e3a6SLisandro Dalcin PetscFunctionBegin; 20119fa463a7SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE preconditioner options");CHKERRQ(ierr); 20129c81f712SBarry Smith ierr = PetscOptionsEList("-pc_hypre_type","HYPRE preconditioner type","PCHYPRESetType",type,4,"boomeramg",&indx,&flg);CHKERRQ(ierr); 201316d9e3a6SLisandro Dalcin if (flg) { 201416d9e3a6SLisandro Dalcin ierr = PCHYPRESetType_HYPRE(pc,type[indx]);CHKERRQ(ierr); 201502a17cd4SBarry Smith } else { 201602a17cd4SBarry Smith ierr = PCHYPRESetType_HYPRE(pc,"boomeramg");CHKERRQ(ierr); 201716d9e3a6SLisandro Dalcin } 201816d9e3a6SLisandro Dalcin if (pc->ops->setfromoptions) { 20193931853cSBarry Smith ierr = pc->ops->setfromoptions(PetscOptionsObject,pc);CHKERRQ(ierr); 202016d9e3a6SLisandro Dalcin } 202116d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 202216d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 202316d9e3a6SLisandro Dalcin } 202416d9e3a6SLisandro Dalcin 202516d9e3a6SLisandro Dalcin /*@C 202616d9e3a6SLisandro Dalcin PCHYPRESetType - Sets which hypre preconditioner you wish to use 202716d9e3a6SLisandro Dalcin 202816d9e3a6SLisandro Dalcin Input Parameters: 202916d9e3a6SLisandro Dalcin + pc - the preconditioner context 2030db966c6cSHong Zhang - name - either euclid, pilut, parasails, boomeramg, ams, ads 203116d9e3a6SLisandro Dalcin 203216d9e3a6SLisandro Dalcin Options Database Keys: 2033db966c6cSHong Zhang -pc_hypre_type - One of euclid, pilut, parasails, boomeramg, ams, ads 203416d9e3a6SLisandro Dalcin 203516d9e3a6SLisandro Dalcin Level: intermediate 203616d9e3a6SLisandro Dalcin 203716d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 203816d9e3a6SLisandro Dalcin PCHYPRE 203916d9e3a6SLisandro Dalcin 204016d9e3a6SLisandro Dalcin @*/ 20417087cfbeSBarry Smith PetscErrorCode PCHYPRESetType(PC pc,const char name[]) 204216d9e3a6SLisandro Dalcin { 20434ac538c5SBarry Smith PetscErrorCode ierr; 204416d9e3a6SLisandro Dalcin 204516d9e3a6SLisandro Dalcin PetscFunctionBegin; 20460700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 204716d9e3a6SLisandro Dalcin PetscValidCharPointer(name,2); 20484ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCHYPRESetType_C",(PC,const char[]),(pc,name));CHKERRQ(ierr); 204916d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 205016d9e3a6SLisandro Dalcin } 205116d9e3a6SLisandro Dalcin 205216d9e3a6SLisandro Dalcin /*@C 205316d9e3a6SLisandro Dalcin PCHYPREGetType - Gets which hypre preconditioner you are using 205416d9e3a6SLisandro Dalcin 205516d9e3a6SLisandro Dalcin Input Parameter: 205616d9e3a6SLisandro Dalcin . pc - the preconditioner context 205716d9e3a6SLisandro Dalcin 205816d9e3a6SLisandro Dalcin Output Parameter: 2059db966c6cSHong Zhang . name - either euclid, pilut, parasails, boomeramg, ams, ads 206016d9e3a6SLisandro Dalcin 206116d9e3a6SLisandro Dalcin Level: intermediate 206216d9e3a6SLisandro Dalcin 206316d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCHYPRESetType(), PCType (for list of available types), PC, 206416d9e3a6SLisandro Dalcin PCHYPRE 206516d9e3a6SLisandro Dalcin 206616d9e3a6SLisandro Dalcin @*/ 20677087cfbeSBarry Smith PetscErrorCode PCHYPREGetType(PC pc,const char *name[]) 206816d9e3a6SLisandro Dalcin { 20694ac538c5SBarry Smith PetscErrorCode ierr; 207016d9e3a6SLisandro Dalcin 207116d9e3a6SLisandro Dalcin PetscFunctionBegin; 20720700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 207316d9e3a6SLisandro Dalcin PetscValidPointer(name,2); 20744ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCHYPREGetType_C",(PC,const char*[]),(pc,name));CHKERRQ(ierr); 207516d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 207616d9e3a6SLisandro Dalcin } 207716d9e3a6SLisandro Dalcin 207816d9e3a6SLisandro Dalcin /*MC 207916d9e3a6SLisandro Dalcin PCHYPRE - Allows you to use the matrix element based preconditioners in the LLNL package hypre 208016d9e3a6SLisandro Dalcin 208116d9e3a6SLisandro Dalcin Options Database Keys: 2082db966c6cSHong Zhang + -pc_hypre_type - One of euclid, pilut, parasails, boomeramg, ams, ads 208316d9e3a6SLisandro Dalcin - Too many others to list, run with -pc_type hypre -pc_hypre_type XXX -help to see options for the XXX 208416d9e3a6SLisandro Dalcin preconditioner 208516d9e3a6SLisandro Dalcin 208616d9e3a6SLisandro Dalcin Level: intermediate 208716d9e3a6SLisandro Dalcin 208895452b02SPatrick Sanan Notes: 208995452b02SPatrick Sanan Apart from pc_hypre_type (for which there is PCHYPRESetType()), 209016d9e3a6SLisandro Dalcin the many hypre options can ONLY be set via the options database (e.g. the command line 209116d9e3a6SLisandro Dalcin or with PetscOptionsSetValue(), there are no functions to set them) 209216d9e3a6SLisandro Dalcin 2093c231f9e3SBarryFSmith The options -pc_hypre_boomeramg_max_iter and -pc_hypre_boomeramg_tol refer to the number of iterations 20940f1074feSSatish Balay (V-cycles) and tolerance that boomeramg does EACH time it is called. So for example, if 20950f1074feSSatish Balay -pc_hypre_boomeramg_max_iter is set to 2 then 2-V-cycles are being used to define the preconditioner 2096c231f9e3SBarryFSmith (-pc_hypre_boomeramg_tol should be set to 0.0 - the default - to strictly use a fixed number of 20978f87f92bSBarry Smith iterations per hypre call). -ksp_max_it and -ksp_rtol STILL determine the total number of iterations 20980f1074feSSatish Balay and tolerance for the Krylov solver. For example, if -pc_hypre_boomeramg_max_iter is 2 and -ksp_max_it is 10 20990f1074feSSatish Balay then AT MOST twenty V-cycles of boomeramg will be called. 210016d9e3a6SLisandro Dalcin 21010f1074feSSatish Balay Note that the option -pc_hypre_boomeramg_relax_type_all defaults to symmetric relaxation 21020f1074feSSatish Balay (symmetric-SOR/Jacobi), which is required for Krylov solvers like CG that expect symmetry. 21030f1074feSSatish Balay Otherwise, you may want to use -pc_hypre_boomeramg_relax_type_all SOR/Jacobi. 210416d9e3a6SLisandro Dalcin If you wish to use BoomerAMG WITHOUT a Krylov method use -ksp_type richardson NOT -ksp_type preonly 210516d9e3a6SLisandro Dalcin and use -ksp_max_it to control the number of V-cycles. 210616d9e3a6SLisandro Dalcin (see the PETSc FAQ.html at the PETSc website under the Documentation tab). 210716d9e3a6SLisandro Dalcin 210816d9e3a6SLisandro Dalcin 2007-02-03 Using HYPRE-1.11.1b, the routine HYPRE_BoomerAMGSolveT and the option 210916d9e3a6SLisandro Dalcin -pc_hypre_parasails_reuse were failing with SIGSEGV. Dalcin L. 211016d9e3a6SLisandro Dalcin 21115272c319SBarry Smith MatSetNearNullSpace() - if you provide a near null space to your matrix it is ignored by hypre UNLESS you also use 21125272c319SBarry Smith the two options: 21135272c319SBarry Smith + -pc_hypre_boomeramg_nodal_coarsen <n> - where n is from 1 to 6 (see HYPRE_BOOMERAMGSetNodal()) 2114cbc39033SBarry Smith - -pc_hypre_boomeramg_vec_interp_variant <v> where v is from 1 to 3 (see HYPRE_BoomerAMGSetInterpVecVariant()) 21155272c319SBarry Smith 21165272c319SBarry Smith Depending on the linear system you may see the same or different convergence depending on the values you use. 21175272c319SBarry Smith 21189e5bc791SBarry Smith See PCPFMG for access to the hypre Struct PFMG solver 21199e5bc791SBarry Smith 212016d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 21219e5bc791SBarry Smith PCHYPRESetType(), PCPFMG 212216d9e3a6SLisandro Dalcin 212316d9e3a6SLisandro Dalcin M*/ 212416d9e3a6SLisandro Dalcin 21258cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_HYPRE(PC pc) 212616d9e3a6SLisandro Dalcin { 212716d9e3a6SLisandro Dalcin PC_HYPRE *jac; 212816d9e3a6SLisandro Dalcin PetscErrorCode ierr; 212916d9e3a6SLisandro Dalcin 213016d9e3a6SLisandro Dalcin PetscFunctionBegin; 2131b00a9115SJed Brown ierr = PetscNewLog(pc,&jac);CHKERRQ(ierr); 21322fa5cd67SKarl Rupp 213316d9e3a6SLisandro Dalcin pc->data = jac; 21348695de01SBarry Smith pc->ops->reset = PCReset_HYPRE; 213516d9e3a6SLisandro Dalcin pc->ops->destroy = PCDestroy_HYPRE; 213616d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE; 213716d9e3a6SLisandro Dalcin pc->ops->setup = PCSetUp_HYPRE; 213816d9e3a6SLisandro Dalcin pc->ops->apply = PCApply_HYPRE; 213916d9e3a6SLisandro Dalcin jac->comm_hypre = MPI_COMM_NULL; 2140bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetType_C",PCHYPRESetType_HYPRE);CHKERRQ(ierr); 2141bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPREGetType_C",PCHYPREGetType_HYPRE);CHKERRQ(ierr); 21425ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCSetCoordinates_C",PCSetCoordinates_HYPRE);CHKERRQ(ierr); 21435ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteGradient_C",PCHYPRESetDiscreteGradient_HYPRE);CHKERRQ(ierr); 21445ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteCurl_C",PCHYPRESetDiscreteCurl_HYPRE);CHKERRQ(ierr); 21456bf688a0SCe Qin ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetInterpolations_C",PCHYPRESetInterpolations_HYPRE);CHKERRQ(ierr); 21465ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetEdgeConstantVectors_C",PCHYPRESetEdgeConstantVectors_HYPRE);CHKERRQ(ierr); 21475ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetPoissonMatrix_C",PCHYPRESetPoissonMatrix_HYPRE);CHKERRQ(ierr); 214816d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 214916d9e3a6SLisandro Dalcin } 2150ebc551c0SBarry Smith 2151f91d8e95SBarry Smith /* ---------------------------------------------------------------------------------------------------------------------------------*/ 2152f91d8e95SBarry Smith 2153ebc551c0SBarry Smith typedef struct { 215468326731SBarry Smith MPI_Comm hcomm; /* does not share comm with HYPRE_StructMatrix because need to create solver before getting matrix */ 2155f91d8e95SBarry Smith HYPRE_StructSolver hsolver; 21569e5bc791SBarry Smith 21579e5bc791SBarry Smith /* keep copy of PFMG options used so may view them */ 21584ddd07fcSJed Brown PetscInt its; 21599e5bc791SBarry Smith double tol; 21604ddd07fcSJed Brown PetscInt relax_type; 21614ddd07fcSJed Brown PetscInt rap_type; 21624ddd07fcSJed Brown PetscInt num_pre_relax,num_post_relax; 21634ddd07fcSJed Brown PetscInt max_levels; 2164ebc551c0SBarry Smith } PC_PFMG; 2165ebc551c0SBarry Smith 2166ebc551c0SBarry Smith PetscErrorCode PCDestroy_PFMG(PC pc) 2167ebc551c0SBarry Smith { 2168ebc551c0SBarry Smith PetscErrorCode ierr; 2169f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2170ebc551c0SBarry Smith 2171ebc551c0SBarry Smith PetscFunctionBegin; 21722fa5cd67SKarl Rupp if (ex->hsolver) PetscStackCallStandard(HYPRE_StructPFMGDestroy,(ex->hsolver)); 2173f91d8e95SBarry Smith ierr = MPI_Comm_free(&ex->hcomm);CHKERRQ(ierr); 2174c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 2175ebc551c0SBarry Smith PetscFunctionReturn(0); 2176ebc551c0SBarry Smith } 2177ebc551c0SBarry Smith 21789e5bc791SBarry Smith static const char *PFMGRelaxType[] = {"Jacobi","Weighted-Jacobi","symmetric-Red/Black-Gauss-Seidel","Red/Black-Gauss-Seidel"}; 21799e5bc791SBarry Smith static const char *PFMGRAPType[] = {"Galerkin","non-Galerkin"}; 21809e5bc791SBarry Smith 2181ebc551c0SBarry Smith PetscErrorCode PCView_PFMG(PC pc,PetscViewer viewer) 2182ebc551c0SBarry Smith { 2183ebc551c0SBarry Smith PetscErrorCode ierr; 2184ace3abfcSBarry Smith PetscBool iascii; 2185f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2186ebc551c0SBarry Smith 2187ebc551c0SBarry Smith PetscFunctionBegin; 2188251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 21899e5bc791SBarry Smith if (iascii) { 21909e5bc791SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE PFMG preconditioning\n");CHKERRQ(ierr); 2191efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max iterations %d\n",ex->its);CHKERRQ(ierr); 2192efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerance %g\n",ex->tol);CHKERRQ(ierr); 2193efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relax type %s\n",PFMGRelaxType[ex->relax_type]);CHKERRQ(ierr); 2194efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," RAP type %s\n",PFMGRAPType[ex->rap_type]);CHKERRQ(ierr); 2195efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number pre-relax %d post-relax %d\n",ex->num_pre_relax,ex->num_post_relax);CHKERRQ(ierr); 2196efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max levels %d\n",ex->max_levels);CHKERRQ(ierr); 21979e5bc791SBarry Smith } 2198ebc551c0SBarry Smith PetscFunctionReturn(0); 2199ebc551c0SBarry Smith } 2200ebc551c0SBarry Smith 22014416b707SBarry Smith PetscErrorCode PCSetFromOptions_PFMG(PetscOptionItems *PetscOptionsObject,PC pc) 2202ebc551c0SBarry Smith { 2203ebc551c0SBarry Smith PetscErrorCode ierr; 2204f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2205ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE; 2206ebc551c0SBarry Smith 2207ebc551c0SBarry Smith PetscFunctionBegin; 2208e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"PFMG options");CHKERRQ(ierr); 22090298fd71SBarry Smith ierr = PetscOptionsBool("-pc_pfmg_print_statistics","Print statistics","HYPRE_StructPFMGSetPrintLevel",flg,&flg,NULL);CHKERRQ(ierr); 221068326731SBarry Smith if (flg) { 2211a0324ebeSBarry Smith int level=3; 2212fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetPrintLevel,(ex->hsolver,level)); 221368326731SBarry Smith } 22140298fd71SBarry Smith ierr = PetscOptionsInt("-pc_pfmg_its","Number of iterations of PFMG to use as preconditioner","HYPRE_StructPFMGSetMaxIter",ex->its,&ex->its,NULL);CHKERRQ(ierr); 2215fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(ex->hsolver,ex->its)); 22160298fd71SBarry 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); 2217fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetNumPreRelax,(ex->hsolver,ex->num_pre_relax)); 22180298fd71SBarry 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); 2219fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetNumPostRelax,(ex->hsolver,ex->num_post_relax)); 22209e5bc791SBarry Smith 22210298fd71SBarry Smith ierr = PetscOptionsInt("-pc_pfmg_max_levels","Max Levels for MG hierarchy","HYPRE_StructPFMGSetMaxLevels",ex->max_levels,&ex->max_levels,NULL);CHKERRQ(ierr); 2222fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxLevels,(ex->hsolver,ex->max_levels)); 22233b46a515SGlenn Hammond 22240298fd71SBarry Smith ierr = PetscOptionsReal("-pc_pfmg_tol","Tolerance of PFMG","HYPRE_StructPFMGSetTol",ex->tol,&ex->tol,NULL);CHKERRQ(ierr); 2225fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(ex->hsolver,ex->tol)); 22260298fd71SBarry 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); 2227fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetRelaxType,(ex->hsolver, ex->relax_type)); 22280298fd71SBarry Smith ierr = PetscOptionsEList("-pc_pfmg_rap_type","RAP type","HYPRE_StructPFMGSetRAPType",PFMGRAPType,ALEN(PFMGRAPType),PFMGRAPType[ex->rap_type],&ex->rap_type,NULL);CHKERRQ(ierr); 2229fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetRAPType,(ex->hsolver, ex->rap_type)); 2230ebc551c0SBarry Smith ierr = PetscOptionsTail();CHKERRQ(ierr); 2231ebc551c0SBarry Smith PetscFunctionReturn(0); 2232ebc551c0SBarry Smith } 2233ebc551c0SBarry Smith 2234f91d8e95SBarry Smith PetscErrorCode PCApply_PFMG(PC pc,Vec x,Vec y) 2235f91d8e95SBarry Smith { 2236f91d8e95SBarry Smith PetscErrorCode ierr; 2237f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 2238d9ca1df4SBarry Smith PetscScalar *yy; 2239d9ca1df4SBarry Smith const PetscScalar *xx; 22404ddd07fcSJed Brown PetscInt ilower[3],iupper[3]; 224168326731SBarry Smith Mat_HYPREStruct *mx = (Mat_HYPREStruct*)(pc->pmat->data); 2242f91d8e95SBarry Smith 2243f91d8e95SBarry Smith PetscFunctionBegin; 2244dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2245aa219208SBarry Smith ierr = DMDAGetCorners(mx->da,&ilower[0],&ilower[1],&ilower[2],&iupper[0],&iupper[1],&iupper[2]);CHKERRQ(ierr); 2246f91d8e95SBarry Smith iupper[0] += ilower[0] - 1; 2247f91d8e95SBarry Smith iupper[1] += ilower[1] - 1; 2248f91d8e95SBarry Smith iupper[2] += ilower[2] - 1; 2249f91d8e95SBarry Smith 2250f91d8e95SBarry Smith /* copy x values over to hypre */ 2251fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructVectorSetConstantValues,(mx->hb,0.0)); 2252d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 2253d9ca1df4SBarry Smith PetscStackCallStandard(HYPRE_StructVectorSetBoxValues,(mx->hb,(HYPRE_Int *)ilower,(HYPRE_Int *)iupper,(PetscScalar*)xx)); 2254d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 2255fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructVectorAssemble,(mx->hb)); 2256fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSolve,(ex->hsolver,mx->hmat,mx->hb,mx->hx)); 2257f91d8e95SBarry Smith 2258f91d8e95SBarry Smith /* copy solution values back to PETSc */ 2259f91d8e95SBarry Smith ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 22608b1f7689SBarry Smith PetscStackCallStandard(HYPRE_StructVectorGetBoxValues,(mx->hx,(HYPRE_Int *)ilower,(HYPRE_Int *)iupper,yy)); 2261f91d8e95SBarry Smith ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 2262f91d8e95SBarry Smith PetscFunctionReturn(0); 2263f91d8e95SBarry Smith } 2264f91d8e95SBarry Smith 2265ace3abfcSBarry 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) 22669e5bc791SBarry Smith { 22679e5bc791SBarry Smith PC_PFMG *jac = (PC_PFMG*)pc->data; 22689e5bc791SBarry Smith PetscErrorCode ierr; 22694ddd07fcSJed Brown PetscInt oits; 22709e5bc791SBarry Smith 22719e5bc791SBarry Smith PetscFunctionBegin; 2272dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2273fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(jac->hsolver,its*jac->its)); 2274fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(jac->hsolver,rtol)); 22759e5bc791SBarry Smith 22769e5bc791SBarry Smith ierr = PCApply_PFMG(pc,b,y);CHKERRQ(ierr); 22778b1f7689SBarry Smith PetscStackCallStandard(HYPRE_StructPFMGGetNumIterations,(jac->hsolver,(HYPRE_Int *)&oits)); 22789e5bc791SBarry Smith *outits = oits; 22799e5bc791SBarry Smith if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 22809e5bc791SBarry Smith else *reason = PCRICHARDSON_CONVERGED_RTOL; 2281fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(jac->hsolver,jac->tol)); 2282fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(jac->hsolver,jac->its)); 22839e5bc791SBarry Smith PetscFunctionReturn(0); 22849e5bc791SBarry Smith } 22859e5bc791SBarry Smith 22869e5bc791SBarry Smith 22873a32d3dbSGlenn Hammond PetscErrorCode PCSetUp_PFMG(PC pc) 22883a32d3dbSGlenn Hammond { 22893a32d3dbSGlenn Hammond PetscErrorCode ierr; 22903a32d3dbSGlenn Hammond PC_PFMG *ex = (PC_PFMG*) pc->data; 22913a32d3dbSGlenn Hammond Mat_HYPREStruct *mx = (Mat_HYPREStruct*)(pc->pmat->data); 2292ace3abfcSBarry Smith PetscBool flg; 22933a32d3dbSGlenn Hammond 22943a32d3dbSGlenn Hammond PetscFunctionBegin; 2295251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRESTRUCT,&flg);CHKERRQ(ierr); 2296ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_INCOMP,"Must use MATHYPRESTRUCT with this preconditioner"); 22973a32d3dbSGlenn Hammond 22983a32d3dbSGlenn Hammond /* create the hypre solver object and set its information */ 22992fa5cd67SKarl Rupp if (ex->hsolver) PetscStackCallStandard(HYPRE_StructPFMGDestroy,(ex->hsolver)); 2300fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGCreate,(ex->hcomm,&ex->hsolver)); 2301fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetup,(ex->hsolver,mx->hmat,mx->hb,mx->hx)); 2302fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetZeroGuess,(ex->hsolver)); 23033a32d3dbSGlenn Hammond PetscFunctionReturn(0); 23043a32d3dbSGlenn Hammond } 23053a32d3dbSGlenn Hammond 2306ebc551c0SBarry Smith /*MC 2307ebc551c0SBarry Smith PCPFMG - the hypre PFMG multigrid solver 2308ebc551c0SBarry Smith 2309ebc551c0SBarry Smith Level: advanced 2310ebc551c0SBarry Smith 23119e5bc791SBarry Smith Options Database: 23129e5bc791SBarry Smith + -pc_pfmg_its <its> number of iterations of PFMG to use as preconditioner 23139e5bc791SBarry Smith . -pc_pfmg_num_pre_relax <steps> number of smoothing steps before coarse grid 23149e5bc791SBarry Smith . -pc_pfmg_num_post_relax <steps> number of smoothing steps after coarse grid 23159e5bc791SBarry Smith . -pc_pfmg_tol <tol> tolerance of PFMG 23169e5bc791SBarry 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 23179e5bc791SBarry Smith - -pc_pfmg_rap_type - type of coarse matrix generation, one of Galerkin,non-Galerkin 2318f91d8e95SBarry Smith 231995452b02SPatrick Sanan Notes: 232095452b02SPatrick Sanan This is for CELL-centered descretizations 23219e5bc791SBarry Smith 23228e395302SJed Brown This must be used with the MATHYPRESTRUCT matrix type. 2323aa219208SBarry Smith This is less general than in hypre, it supports only one block per process defined by a PETSc DMDA. 23249e5bc791SBarry Smith 23259e5bc791SBarry Smith .seealso: PCMG, MATHYPRESTRUCT 2326ebc551c0SBarry Smith M*/ 2327ebc551c0SBarry Smith 23288cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_PFMG(PC pc) 2329ebc551c0SBarry Smith { 2330ebc551c0SBarry Smith PetscErrorCode ierr; 2331ebc551c0SBarry Smith PC_PFMG *ex; 2332ebc551c0SBarry Smith 2333ebc551c0SBarry Smith PetscFunctionBegin; 2334b00a9115SJed Brown ierr = PetscNew(&ex);CHKERRQ(ierr); \ 233568326731SBarry Smith pc->data = ex; 2336ebc551c0SBarry Smith 23379e5bc791SBarry Smith ex->its = 1; 23389e5bc791SBarry Smith ex->tol = 1.e-8; 23399e5bc791SBarry Smith ex->relax_type = 1; 23409e5bc791SBarry Smith ex->rap_type = 0; 23419e5bc791SBarry Smith ex->num_pre_relax = 1; 23429e5bc791SBarry Smith ex->num_post_relax = 1; 23433b46a515SGlenn Hammond ex->max_levels = 0; 23449e5bc791SBarry Smith 2345ebc551c0SBarry Smith pc->ops->setfromoptions = PCSetFromOptions_PFMG; 2346ebc551c0SBarry Smith pc->ops->view = PCView_PFMG; 2347ebc551c0SBarry Smith pc->ops->destroy = PCDestroy_PFMG; 2348f91d8e95SBarry Smith pc->ops->apply = PCApply_PFMG; 23499e5bc791SBarry Smith pc->ops->applyrichardson = PCApplyRichardson_PFMG; 235068326731SBarry Smith pc->ops->setup = PCSetUp_PFMG; 23512fa5cd67SKarl Rupp 2352ce94432eSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(ex->hcomm));CHKERRQ(ierr); 2353fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGCreate,(ex->hcomm,&ex->hsolver)); 2354ebc551c0SBarry Smith PetscFunctionReturn(0); 2355ebc551c0SBarry Smith } 2356d851a50bSGlenn Hammond 2357325fc9f4SBarry Smith /* ---------------------------------------------------------------------------------------------------------------------------------------------------*/ 2358325fc9f4SBarry Smith 2359d851a50bSGlenn Hammond /* we know we are working with a HYPRE_SStructMatrix */ 2360d851a50bSGlenn Hammond typedef struct { 2361d851a50bSGlenn Hammond MPI_Comm hcomm; /* does not share comm with HYPRE_SStructMatrix because need to create solver before getting matrix */ 2362d851a50bSGlenn Hammond HYPRE_SStructSolver ss_solver; 2363d851a50bSGlenn Hammond 2364d851a50bSGlenn Hammond /* keep copy of SYSPFMG options used so may view them */ 23654ddd07fcSJed Brown PetscInt its; 2366d851a50bSGlenn Hammond double tol; 23674ddd07fcSJed Brown PetscInt relax_type; 23684ddd07fcSJed Brown PetscInt num_pre_relax,num_post_relax; 2369d851a50bSGlenn Hammond } PC_SysPFMG; 2370d851a50bSGlenn Hammond 2371d851a50bSGlenn Hammond PetscErrorCode PCDestroy_SysPFMG(PC pc) 2372d851a50bSGlenn Hammond { 2373d851a50bSGlenn Hammond PetscErrorCode ierr; 2374d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2375d851a50bSGlenn Hammond 2376d851a50bSGlenn Hammond PetscFunctionBegin; 23772fa5cd67SKarl Rupp if (ex->ss_solver) PetscStackCallStandard(HYPRE_SStructSysPFMGDestroy,(ex->ss_solver)); 2378d851a50bSGlenn Hammond ierr = MPI_Comm_free(&ex->hcomm);CHKERRQ(ierr); 2379c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 2380d851a50bSGlenn Hammond PetscFunctionReturn(0); 2381d851a50bSGlenn Hammond } 2382d851a50bSGlenn Hammond 2383d851a50bSGlenn Hammond static const char *SysPFMGRelaxType[] = {"Weighted-Jacobi","Red/Black-Gauss-Seidel"}; 2384d851a50bSGlenn Hammond 2385d851a50bSGlenn Hammond PetscErrorCode PCView_SysPFMG(PC pc,PetscViewer viewer) 2386d851a50bSGlenn Hammond { 2387d851a50bSGlenn Hammond PetscErrorCode ierr; 2388ace3abfcSBarry Smith PetscBool iascii; 2389d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2390d851a50bSGlenn Hammond 2391d851a50bSGlenn Hammond PetscFunctionBegin; 2392251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 2393d851a50bSGlenn Hammond if (iascii) { 2394d851a50bSGlenn Hammond ierr = PetscViewerASCIIPrintf(viewer," HYPRE SysPFMG preconditioning\n");CHKERRQ(ierr); 2395efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," max iterations %d\n",ex->its);CHKERRQ(ierr); 2396efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," tolerance %g\n",ex->tol);CHKERRQ(ierr); 2397efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," relax type %s\n",PFMGRelaxType[ex->relax_type]);CHKERRQ(ierr); 2398efd4aadfSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," number pre-relax %d post-relax %d\n",ex->num_pre_relax,ex->num_post_relax);CHKERRQ(ierr); 2399d851a50bSGlenn Hammond } 2400d851a50bSGlenn Hammond PetscFunctionReturn(0); 2401d851a50bSGlenn Hammond } 2402d851a50bSGlenn Hammond 24034416b707SBarry Smith PetscErrorCode PCSetFromOptions_SysPFMG(PetscOptionItems *PetscOptionsObject,PC pc) 2404d851a50bSGlenn Hammond { 2405d851a50bSGlenn Hammond PetscErrorCode ierr; 2406d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2407ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE; 2408d851a50bSGlenn Hammond 2409d851a50bSGlenn Hammond PetscFunctionBegin; 2410e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"SysPFMG options");CHKERRQ(ierr); 24110298fd71SBarry Smith ierr = PetscOptionsBool("-pc_syspfmg_print_statistics","Print statistics","HYPRE_SStructSysPFMGSetPrintLevel",flg,&flg,NULL);CHKERRQ(ierr); 2412d851a50bSGlenn Hammond if (flg) { 2413d851a50bSGlenn Hammond int level=3; 2414fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetPrintLevel,(ex->ss_solver,level)); 2415d851a50bSGlenn Hammond } 24160298fd71SBarry Smith ierr = PetscOptionsInt("-pc_syspfmg_its","Number of iterations of SysPFMG to use as preconditioner","HYPRE_SStructSysPFMGSetMaxIter",ex->its,&ex->its,NULL);CHKERRQ(ierr); 2417fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(ex->ss_solver,ex->its)); 24180298fd71SBarry 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); 2419fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetNumPreRelax,(ex->ss_solver,ex->num_pre_relax)); 24200298fd71SBarry 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); 2421fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetNumPostRelax,(ex->ss_solver,ex->num_post_relax)); 2422d851a50bSGlenn Hammond 24230298fd71SBarry Smith ierr = PetscOptionsReal("-pc_syspfmg_tol","Tolerance of SysPFMG","HYPRE_SStructSysPFMGSetTol",ex->tol,&ex->tol,NULL);CHKERRQ(ierr); 2424fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(ex->ss_solver,ex->tol)); 242561710fbeSStefano 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); 2426fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetRelaxType,(ex->ss_solver, ex->relax_type)); 2427d851a50bSGlenn Hammond ierr = PetscOptionsTail();CHKERRQ(ierr); 2428d851a50bSGlenn Hammond PetscFunctionReturn(0); 2429d851a50bSGlenn Hammond } 2430d851a50bSGlenn Hammond 2431d851a50bSGlenn Hammond PetscErrorCode PCApply_SysPFMG(PC pc,Vec x,Vec y) 2432d851a50bSGlenn Hammond { 2433d851a50bSGlenn Hammond PetscErrorCode ierr; 2434d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2435d9ca1df4SBarry Smith PetscScalar *yy; 2436d9ca1df4SBarry Smith const PetscScalar *xx; 24374ddd07fcSJed Brown PetscInt ilower[3],iupper[3]; 2438d851a50bSGlenn Hammond Mat_HYPRESStruct *mx = (Mat_HYPRESStruct*)(pc->pmat->data); 24394ddd07fcSJed Brown PetscInt ordering= mx->dofs_order; 24404ddd07fcSJed Brown PetscInt nvars = mx->nvars; 24414ddd07fcSJed Brown PetscInt part = 0; 24424ddd07fcSJed Brown PetscInt size; 24434ddd07fcSJed Brown PetscInt i; 2444d851a50bSGlenn Hammond 2445d851a50bSGlenn Hammond PetscFunctionBegin; 2446dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2447aa219208SBarry Smith ierr = DMDAGetCorners(mx->da,&ilower[0],&ilower[1],&ilower[2],&iupper[0],&iupper[1],&iupper[2]);CHKERRQ(ierr); 2448d851a50bSGlenn Hammond iupper[0] += ilower[0] - 1; 2449d851a50bSGlenn Hammond iupper[1] += ilower[1] - 1; 2450d851a50bSGlenn Hammond iupper[2] += ilower[2] - 1; 2451d851a50bSGlenn Hammond 2452d851a50bSGlenn Hammond size = 1; 24532fa5cd67SKarl Rupp for (i= 0; i< 3; i++) size *= (iupper[i]-ilower[i]+1); 24542fa5cd67SKarl Rupp 2455d851a50bSGlenn Hammond /* copy x values over to hypre for variable ordering */ 2456d851a50bSGlenn Hammond if (ordering) { 2457fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorSetConstantValues,(mx->ss_b,0.0)); 2458d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 2459d9ca1df4SBarry Smith for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorSetBoxValues,(mx->ss_b,part,(HYPRE_Int *)ilower,(HYPRE_Int *)iupper,i,(PetscScalar*)xx+(size*i))); 2460d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 2461fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorAssemble,(mx->ss_b)); 2462fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructMatrixMatvec,(1.0,mx->ss_mat,mx->ss_b,0.0,mx->ss_x)); 2463fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSolve,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2464d851a50bSGlenn Hammond 2465d851a50bSGlenn Hammond /* copy solution values back to PETSc */ 2466d851a50bSGlenn Hammond ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 24678b1f7689SBarry Smith for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorGetBoxValues,(mx->ss_x,part,(HYPRE_Int *)ilower,(HYPRE_Int *)iupper,i,yy+(size*i))); 2468d851a50bSGlenn Hammond ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 2469a65764d7SBarry Smith } else { /* nodal ordering must be mapped to variable ordering for sys_pfmg */ 2470d851a50bSGlenn Hammond PetscScalar *z; 24714ddd07fcSJed Brown PetscInt j, k; 2472d851a50bSGlenn Hammond 2473785e854fSJed Brown ierr = PetscMalloc1(nvars*size,&z);CHKERRQ(ierr); 2474fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorSetConstantValues,(mx->ss_b,0.0)); 2475d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 2476d851a50bSGlenn Hammond 2477d851a50bSGlenn Hammond /* transform nodal to hypre's variable ordering for sys_pfmg */ 2478d851a50bSGlenn Hammond for (i= 0; i< size; i++) { 2479d851a50bSGlenn Hammond k= i*nvars; 24802fa5cd67SKarl Rupp for (j= 0; j< nvars; j++) z[j*size+i]= xx[k+j]; 2481d851a50bSGlenn Hammond } 24828b1f7689SBarry Smith for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorSetBoxValues,(mx->ss_b,part,(HYPRE_Int *)ilower,(HYPRE_Int *)iupper,i,z+(size*i))); 2483d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 2484fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorAssemble,(mx->ss_b)); 2485fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSolve,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2486d851a50bSGlenn Hammond 2487d851a50bSGlenn Hammond /* copy solution values back to PETSc */ 2488d851a50bSGlenn Hammond ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 24898b1f7689SBarry Smith for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorGetBoxValues,(mx->ss_x,part,(HYPRE_Int *)ilower,(HYPRE_Int *)iupper,i,z+(size*i))); 2490d851a50bSGlenn Hammond /* transform hypre's variable ordering for sys_pfmg to nodal ordering */ 2491d851a50bSGlenn Hammond for (i= 0; i< size; i++) { 2492d851a50bSGlenn Hammond k= i*nvars; 24932fa5cd67SKarl Rupp for (j= 0; j< nvars; j++) yy[k+j]= z[j*size+i]; 2494d851a50bSGlenn Hammond } 2495d851a50bSGlenn Hammond ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 2496d851a50bSGlenn Hammond ierr = PetscFree(z);CHKERRQ(ierr); 2497d851a50bSGlenn Hammond } 2498d851a50bSGlenn Hammond PetscFunctionReturn(0); 2499d851a50bSGlenn Hammond } 2500d851a50bSGlenn Hammond 2501ace3abfcSBarry 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) 2502d851a50bSGlenn Hammond { 2503d851a50bSGlenn Hammond PC_SysPFMG *jac = (PC_SysPFMG*)pc->data; 2504d851a50bSGlenn Hammond PetscErrorCode ierr; 25054ddd07fcSJed Brown PetscInt oits; 2506d851a50bSGlenn Hammond 2507d851a50bSGlenn Hammond PetscFunctionBegin; 2508dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2509fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(jac->ss_solver,its*jac->its)); 2510fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(jac->ss_solver,rtol)); 2511d851a50bSGlenn Hammond ierr = PCApply_SysPFMG(pc,b,y);CHKERRQ(ierr); 25128b1f7689SBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGGetNumIterations,(jac->ss_solver,(HYPRE_Int *)&oits)); 2513d851a50bSGlenn Hammond *outits = oits; 2514d851a50bSGlenn Hammond if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 2515d851a50bSGlenn Hammond else *reason = PCRICHARDSON_CONVERGED_RTOL; 2516fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(jac->ss_solver,jac->tol)); 2517fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(jac->ss_solver,jac->its)); 2518d851a50bSGlenn Hammond PetscFunctionReturn(0); 2519d851a50bSGlenn Hammond } 2520d851a50bSGlenn Hammond 2521d851a50bSGlenn Hammond PetscErrorCode PCSetUp_SysPFMG(PC pc) 2522d851a50bSGlenn Hammond { 2523d851a50bSGlenn Hammond PetscErrorCode ierr; 2524d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2525d851a50bSGlenn Hammond Mat_HYPRESStruct *mx = (Mat_HYPRESStruct*)(pc->pmat->data); 2526ace3abfcSBarry Smith PetscBool flg; 2527d851a50bSGlenn Hammond 2528d851a50bSGlenn Hammond PetscFunctionBegin; 2529251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRESSTRUCT,&flg);CHKERRQ(ierr); 2530ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_INCOMP,"Must use MATHYPRESSTRUCT with this preconditioner"); 2531d851a50bSGlenn Hammond 2532d851a50bSGlenn Hammond /* create the hypre sstruct solver object and set its information */ 25332fa5cd67SKarl Rupp if (ex->ss_solver) PetscStackCallStandard(HYPRE_SStructSysPFMGDestroy,(ex->ss_solver)); 2534fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGCreate,(ex->hcomm,&ex->ss_solver)); 2535fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetZeroGuess,(ex->ss_solver)); 2536fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetup,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2537d851a50bSGlenn Hammond PetscFunctionReturn(0); 2538d851a50bSGlenn Hammond } 2539d851a50bSGlenn Hammond 2540d851a50bSGlenn Hammond /*MC 2541d851a50bSGlenn Hammond PCSysPFMG - the hypre SysPFMG multigrid solver 2542d851a50bSGlenn Hammond 2543d851a50bSGlenn Hammond Level: advanced 2544d851a50bSGlenn Hammond 2545d851a50bSGlenn Hammond Options Database: 2546d851a50bSGlenn Hammond + -pc_syspfmg_its <its> number of iterations of SysPFMG to use as preconditioner 2547d851a50bSGlenn Hammond . -pc_syspfmg_num_pre_relax <steps> number of smoothing steps before coarse grid 2548d851a50bSGlenn Hammond . -pc_syspfmg_num_post_relax <steps> number of smoothing steps after coarse grid 2549d851a50bSGlenn Hammond . -pc_syspfmg_tol <tol> tolerance of SysPFMG 2550d851a50bSGlenn Hammond . -pc_syspfmg_relax_type -relaxation type for the up and down cycles, one of Weighted-Jacobi,Red/Black-Gauss-Seidel 2551d851a50bSGlenn Hammond 255295452b02SPatrick Sanan Notes: 255395452b02SPatrick Sanan This is for CELL-centered descretizations 2554d851a50bSGlenn Hammond 2555f6680f47SSatish Balay This must be used with the MATHYPRESSTRUCT matrix type. 2556aa219208SBarry Smith This is less general than in hypre, it supports only one part, and one block per process defined by a PETSc DMDA. 2557d851a50bSGlenn Hammond Also, only cell-centered variables. 2558d851a50bSGlenn Hammond 2559d851a50bSGlenn Hammond .seealso: PCMG, MATHYPRESSTRUCT 2560d851a50bSGlenn Hammond M*/ 2561d851a50bSGlenn Hammond 25628cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_SysPFMG(PC pc) 2563d851a50bSGlenn Hammond { 2564d851a50bSGlenn Hammond PetscErrorCode ierr; 2565d851a50bSGlenn Hammond PC_SysPFMG *ex; 2566d851a50bSGlenn Hammond 2567d851a50bSGlenn Hammond PetscFunctionBegin; 2568b00a9115SJed Brown ierr = PetscNew(&ex);CHKERRQ(ierr); \ 2569d851a50bSGlenn Hammond pc->data = ex; 2570d851a50bSGlenn Hammond 2571d851a50bSGlenn Hammond ex->its = 1; 2572d851a50bSGlenn Hammond ex->tol = 1.e-8; 2573d851a50bSGlenn Hammond ex->relax_type = 1; 2574d851a50bSGlenn Hammond ex->num_pre_relax = 1; 2575d851a50bSGlenn Hammond ex->num_post_relax = 1; 2576d851a50bSGlenn Hammond 2577d851a50bSGlenn Hammond pc->ops->setfromoptions = PCSetFromOptions_SysPFMG; 2578d851a50bSGlenn Hammond pc->ops->view = PCView_SysPFMG; 2579d851a50bSGlenn Hammond pc->ops->destroy = PCDestroy_SysPFMG; 2580d851a50bSGlenn Hammond pc->ops->apply = PCApply_SysPFMG; 2581d851a50bSGlenn Hammond pc->ops->applyrichardson = PCApplyRichardson_SysPFMG; 2582d851a50bSGlenn Hammond pc->ops->setup = PCSetUp_SysPFMG; 25832fa5cd67SKarl Rupp 2584ce94432eSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(ex->hcomm));CHKERRQ(ierr); 2585fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGCreate,(ex->hcomm,&ex->ss_solver)); 2586d851a50bSGlenn Hammond PetscFunctionReturn(0); 2587d851a50bSGlenn Hammond } 2588