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> 1149a781f5SStefano Zampini #include <../src/mat/impls/hypre/mhypre.h> 12c6db04a5SJed Brown #include <../src/dm/impls/da/hypre/mhyp.h> 134cb006feSStefano Zampini #include <_hypre_parcsr_ls.h> 1416d9e3a6SLisandro Dalcin 15dff31646SBarry Smith static PetscBool cite = PETSC_FALSE; 161f817a21SBarry 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{http://www.llnl.gov/CASC/hypre/}}\n}\n"; 171f817a21SBarry Smith 1816d9e3a6SLisandro Dalcin /* 1916d9e3a6SLisandro Dalcin Private context (data structure) for the preconditioner. 2016d9e3a6SLisandro Dalcin */ 2116d9e3a6SLisandro Dalcin typedef struct { 2216d9e3a6SLisandro Dalcin HYPRE_Solver hsolver; 2349a781f5SStefano Zampini Mat hpmat; /* MatHYPRE */ 2416d9e3a6SLisandro Dalcin 254ddd07fcSJed Brown HYPRE_Int (*destroy)(HYPRE_Solver); 264ddd07fcSJed Brown HYPRE_Int (*solve)(HYPRE_Solver,HYPRE_ParCSRMatrix,HYPRE_ParVector,HYPRE_ParVector); 274ddd07fcSJed Brown HYPRE_Int (*setup)(HYPRE_Solver,HYPRE_ParCSRMatrix,HYPRE_ParVector,HYPRE_ParVector); 2816d9e3a6SLisandro Dalcin 2916d9e3a6SLisandro Dalcin MPI_Comm comm_hypre; 3016d9e3a6SLisandro Dalcin char *hypre_type; 3116d9e3a6SLisandro Dalcin 3216d9e3a6SLisandro Dalcin /* options for Pilut and BoomerAMG*/ 334ddd07fcSJed Brown PetscInt maxiter; 3416d9e3a6SLisandro Dalcin double tol; 3516d9e3a6SLisandro Dalcin 3616d9e3a6SLisandro Dalcin /* options for Pilut */ 374ddd07fcSJed Brown PetscInt factorrowsize; 3816d9e3a6SLisandro Dalcin 3916d9e3a6SLisandro Dalcin /* options for ParaSails */ 404ddd07fcSJed Brown PetscInt nlevels; 4116d9e3a6SLisandro Dalcin double threshhold; 4216d9e3a6SLisandro Dalcin double filter; 434ddd07fcSJed Brown PetscInt sym; 4416d9e3a6SLisandro Dalcin double loadbal; 454ddd07fcSJed Brown PetscInt logging; 464ddd07fcSJed Brown PetscInt ruse; 474ddd07fcSJed Brown PetscInt symt; 4816d9e3a6SLisandro Dalcin 4922b6d1caSBarry Smith /* options for BoomerAMG */ 50ace3abfcSBarry Smith PetscBool printstatistics; 5116d9e3a6SLisandro Dalcin 5216d9e3a6SLisandro Dalcin /* options for BoomerAMG */ 534ddd07fcSJed Brown PetscInt cycletype; 544ddd07fcSJed Brown PetscInt maxlevels; 5516d9e3a6SLisandro Dalcin double strongthreshold; 5616d9e3a6SLisandro Dalcin double maxrowsum; 574ddd07fcSJed Brown PetscInt gridsweeps[3]; 584ddd07fcSJed Brown PetscInt coarsentype; 594ddd07fcSJed Brown PetscInt measuretype; 606a251517SEike Mueller PetscInt smoothtype; 618131ecf7SEike Mueller PetscInt smoothnumlevels; 62ec64516dSEike Mueller PetscInt eu_level; /* Number of levels for ILU(k) in Euclid */ 63ec64516dSEike Mueller double eu_droptolerance; /* Drop tolerance for ILU(k) in Euclid */ 64ec64516dSEike Mueller PetscInt eu_bj; /* Defines use of Block Jacobi ILU in Euclid */ 654ddd07fcSJed Brown PetscInt relaxtype[3]; 6616d9e3a6SLisandro Dalcin double relaxweight; 6716d9e3a6SLisandro Dalcin double outerrelaxweight; 684ddd07fcSJed Brown PetscInt relaxorder; 6916d9e3a6SLisandro Dalcin double truncfactor; 70ace3abfcSBarry Smith PetscBool applyrichardson; 714ddd07fcSJed Brown PetscInt pmax; 724ddd07fcSJed Brown PetscInt interptype; 734ddd07fcSJed Brown PetscInt agg_nl; 744ddd07fcSJed Brown PetscInt agg_num_paths; 754ddd07fcSJed Brown PetscInt nodal_coarsen; 76ace3abfcSBarry Smith PetscBool nodal_relax; 774ddd07fcSJed Brown PetscInt nodal_relax_levels; 784cb006feSStefano Zampini 795272c319SBarry Smith PetscInt nodal_coarsening; 805272c319SBarry Smith PetscInt vec_interp_variant; 815272c319SBarry Smith HYPRE_IJVector *hmnull; 825272c319SBarry Smith HYPRE_ParVector *phmnull; /* near null space passed to hypre */ 835272c319SBarry Smith PetscInt n_hmnull; 845272c319SBarry Smith Vec hmnull_constant; 8572827435SBarry 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 */ 865272c319SBarry Smith 87863406b8SStefano Zampini /* options for AS (Auxiliary Space preconditioners) */ 88863406b8SStefano Zampini PetscInt as_print; 89863406b8SStefano Zampini PetscInt as_max_iter; 90863406b8SStefano Zampini PetscReal as_tol; 91863406b8SStefano Zampini PetscInt as_relax_type; 92863406b8SStefano Zampini PetscInt as_relax_times; 93863406b8SStefano Zampini PetscReal as_relax_weight; 94863406b8SStefano Zampini PetscReal as_omega; 95863406b8SStefano 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) */ 96863406b8SStefano Zampini PetscReal as_amg_alpha_theta; /* AMG strength for vector Poisson (AMS) or Curl problem (ADS) */ 97863406b8SStefano 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) */ 98863406b8SStefano Zampini PetscReal as_amg_beta_theta; /* AMG strength for scalar Poisson (AMS) or vector Poisson (ADS) */ 994cb006feSStefano Zampini PetscInt ams_cycle_type; 100863406b8SStefano Zampini PetscInt ads_cycle_type; 1014cb006feSStefano Zampini 1024cb006feSStefano Zampini /* additional data */ 103*5ac14e1cSStefano Zampini Mat G; /* MatHYPRE */ 104*5ac14e1cSStefano Zampini Mat C; /* MatHYPRE */ 105*5ac14e1cSStefano Zampini Mat alpha_Poisson; /* MatHYPRE */ 106*5ac14e1cSStefano Zampini Mat beta_Poisson; /* MatHYPRE */ 107*5ac14e1cSStefano Zampini 108*5ac14e1cSStefano Zampini /* extra information for AMS */ 109*5ac14e1cSStefano Zampini PetscInt dim; /* geometrical dimension */ 1104cb006feSStefano Zampini HYPRE_IJVector coords[3]; 1114cb006feSStefano Zampini HYPRE_IJVector constants[3]; 1124cb006feSStefano Zampini PetscBool ams_beta_is_zero; 11323df4f25SStefano Zampini PetscBool ams_beta_is_zero_part; 11423df4f25SStefano Zampini PetscInt ams_proj_freq; 11516d9e3a6SLisandro Dalcin } PC_HYPRE; 11616d9e3a6SLisandro Dalcin 117d2128fa2SBarry Smith #undef __FUNCT__ 118d2128fa2SBarry Smith #define __FUNCT__ "PCHYPREGetSolver" 119d2128fa2SBarry Smith PetscErrorCode PCHYPREGetSolver(PC pc,HYPRE_Solver *hsolver) 120d2128fa2SBarry Smith { 121d2128fa2SBarry Smith PC_HYPRE *jac = (PC_HYPRE*)pc->data; 122d2128fa2SBarry Smith 123d2128fa2SBarry Smith PetscFunctionBegin; 124d2128fa2SBarry Smith *hsolver = jac->hsolver; 125d2128fa2SBarry Smith PetscFunctionReturn(0); 126d2128fa2SBarry Smith } 12716d9e3a6SLisandro Dalcin 12872827435SBarry Smith /* 12972827435SBarry Smith Replaces the address where the HYPRE vector points to its data with the address of 13072827435SBarry Smith PETSc's data. Saves the old address so it can be reset when we are finished with it. 13172827435SBarry Smith Allows use to get the data into a HYPRE vector without the cost of memcopies 13272827435SBarry Smith */ 13372827435SBarry Smith #define HYPREReplacePointer(b,newvalue,savedvalue) { \ 13472827435SBarry Smith hypre_ParVector *par_vector = (hypre_ParVector*)hypre_IJVectorObject(((hypre_IJVector*)b)); \ 13572827435SBarry Smith hypre_Vector *local_vector = hypre_ParVectorLocalVector(par_vector); \ 13672827435SBarry Smith savedvalue = local_vector->data; \ 13772827435SBarry Smith local_vector->data = newvalue; \ 13872827435SBarry Smith } 13972827435SBarry Smith 14016d9e3a6SLisandro Dalcin #undef __FUNCT__ 14116d9e3a6SLisandro Dalcin #define __FUNCT__ "PCSetUp_HYPRE" 14216d9e3a6SLisandro Dalcin static PetscErrorCode PCSetUp_HYPRE(PC pc) 14316d9e3a6SLisandro Dalcin { 14416d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 14549a781f5SStefano Zampini Mat_HYPRE *hjac; 14616d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 14716d9e3a6SLisandro Dalcin HYPRE_ParVector bv,xv; 14849a781f5SStefano Zampini PetscBool ishypre; 14949a781f5SStefano Zampini PetscErrorCode ierr; 15016d9e3a6SLisandro Dalcin 15116d9e3a6SLisandro Dalcin PetscFunctionBegin; 15216d9e3a6SLisandro Dalcin if (!jac->hypre_type) { 15302a17cd4SBarry Smith ierr = PCHYPRESetType(pc,"boomeramg");CHKERRQ(ierr); 15416d9e3a6SLisandro Dalcin } 1555f5c5b43SBarry Smith 15649a781f5SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRE,&ishypre);CHKERRQ(ierr); 15749a781f5SStefano Zampini if (!ishypre) { 15849a781f5SStefano Zampini MatReuse reuse; 15949a781f5SStefano Zampini if (pc->setupcalled) reuse = MAT_REUSE_MATRIX; 16049a781f5SStefano Zampini else reuse = MAT_INITIAL_MATRIX; 16149a781f5SStefano Zampini ierr = MatConvert(pc->pmat,MATHYPRE,reuse,&jac->hpmat);CHKERRQ(ierr); 16249a781f5SStefano Zampini } else { 16349a781f5SStefano Zampini ierr = PetscObjectReference((PetscObject)pc->pmat);CHKERRQ(ierr); 16449a781f5SStefano Zampini ierr = MatDestroy(&jac->hpmat);CHKERRQ(ierr); 16549a781f5SStefano Zampini jac->hpmat = pc->pmat; 16616d9e3a6SLisandro Dalcin } 16749a781f5SStefano Zampini hjac = (Mat_HYPRE*)(jac->hpmat->data); 1685f5c5b43SBarry Smith 16916d9e3a6SLisandro Dalcin /* special case for BoomerAMG */ 17016d9e3a6SLisandro Dalcin if (jac->setup == HYPRE_BoomerAMGSetup) { 1715272c319SBarry Smith MatNullSpace mnull; 1725272c319SBarry Smith PetscBool has_const; 17349a781f5SStefano Zampini PetscInt bs,nvec,i; 1745272c319SBarry Smith const Vec *vecs; 17572827435SBarry Smith PetscScalar *petscvecarray; 1765272c319SBarry Smith 17716d9e3a6SLisandro Dalcin ierr = MatGetBlockSize(pc->pmat,&bs);CHKERRQ(ierr); 1782fa5cd67SKarl Rupp if (bs > 1) PetscStackCallStandard(HYPRE_BoomerAMGSetNumFunctions,(jac->hsolver,bs)); 1795272c319SBarry Smith ierr = MatGetNearNullSpace(pc->mat, &mnull);CHKERRQ(ierr); 1805272c319SBarry Smith if (mnull) { 1815272c319SBarry Smith ierr = MatNullSpaceGetVecs(mnull, &has_const, &nvec, &vecs);CHKERRQ(ierr); 1825272c319SBarry Smith ierr = PetscMalloc1(nvec+1,&jac->hmnull);CHKERRQ(ierr); 18372827435SBarry Smith ierr = PetscMalloc1(nvec+1,&jac->hmnull_hypre_data_array);CHKERRQ(ierr); 1845272c319SBarry Smith ierr = PetscMalloc1(nvec+1,&jac->phmnull);CHKERRQ(ierr); 1855272c319SBarry Smith for (i=0; i<nvec; i++) { 1865272c319SBarry Smith ierr = VecHYPRE_IJVectorCreate(vecs[i],&jac->hmnull[i]);CHKERRQ(ierr); 18772827435SBarry Smith ierr = VecGetArrayRead(vecs[i],(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 18872827435SBarry Smith HYPREReplacePointer(jac->hmnull[i],petscvecarray,jac->hmnull_hypre_data_array[i]); 18972827435SBarry Smith ierr = VecRestoreArrayRead(vecs[i],(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 1905272c319SBarry Smith PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->hmnull[i],(void**)&jac->phmnull[i])); 1915272c319SBarry Smith } 1925272c319SBarry Smith if (has_const) { 1935272c319SBarry Smith ierr = MatCreateVecs(pc->pmat,&jac->hmnull_constant,NULL);CHKERRQ(ierr); 1945272c319SBarry Smith ierr = VecSet(jac->hmnull_constant,1);CHKERRQ(ierr); 1955272c319SBarry Smith ierr = VecNormalize(jac->hmnull_constant,NULL); 1965272c319SBarry Smith ierr = VecHYPRE_IJVectorCreate(jac->hmnull_constant,&jac->hmnull[nvec]);CHKERRQ(ierr); 19772827435SBarry Smith ierr = VecGetArrayRead(jac->hmnull_constant,(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 19872827435SBarry Smith HYPREReplacePointer(jac->hmnull[nvec],petscvecarray,jac->hmnull_hypre_data_array[nvec]); 19972827435SBarry Smith ierr = VecRestoreArrayRead(jac->hmnull_constant,(const PetscScalar **)&petscvecarray);CHKERRQ(ierr); 2005272c319SBarry Smith PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->hmnull[nvec],(void**)&jac->phmnull[nvec])); 2015272c319SBarry Smith nvec++; 2025272c319SBarry Smith } 2035272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpVectors,(jac->hsolver,nvec,jac->phmnull)); 2045272c319SBarry Smith jac->n_hmnull = nvec; 2055272c319SBarry Smith } 2064cb006feSStefano Zampini } 207863406b8SStefano Zampini 2084cb006feSStefano Zampini /* special case for AMS */ 2094cb006feSStefano Zampini if (jac->setup == HYPRE_AMSSetup) { 210*5ac14e1cSStefano Zampini Mat_HYPRE *hm; 211*5ac14e1cSStefano Zampini HYPRE_ParCSRMatrix parcsr; 21249a781f5SStefano Zampini if (!jac->coords[0] && !jac->constants[0]) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE AMS preconditioner needs either the coordinate vectors via PCSetCoordinates() or the edge constant vectors via PCHYPRESetEdgeConstantVectors()"); 213*5ac14e1cSStefano Zampini if (jac->dim) { 214*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetDimension,(jac->hsolver,jac->dim)); 215*5ac14e1cSStefano Zampini } 216*5ac14e1cSStefano Zampini if (jac->constants[0]) { 217*5ac14e1cSStefano Zampini HYPRE_ParVector ozz,zoz,zzo = NULL; 218*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[0],(void**)(&ozz))); 219*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[1],(void**)(&zoz))); 220*5ac14e1cSStefano Zampini if (jac->constants[2]) { 221*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->constants[2],(void**)(&zzo))); 222*5ac14e1cSStefano Zampini } 223*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetEdgeConstantVectors,(jac->hsolver,ozz,zoz,zzo)); 224*5ac14e1cSStefano Zampini } 225*5ac14e1cSStefano Zampini if (jac->coords[0]) { 226*5ac14e1cSStefano Zampini HYPRE_ParVector coords[3]; 227*5ac14e1cSStefano Zampini coords[0] = NULL; 228*5ac14e1cSStefano Zampini coords[1] = NULL; 229*5ac14e1cSStefano Zampini coords[2] = NULL; 230*5ac14e1cSStefano Zampini if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[0],(void**)(&coords[0]))); 231*5ac14e1cSStefano Zampini if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[1],(void**)(&coords[1]))); 232*5ac14e1cSStefano Zampini if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[2],(void**)(&coords[2]))); 233*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetCoordinateVectors,(jac->hsolver,coords[0],coords[1],coords[2])); 234*5ac14e1cSStefano Zampini } 23549a781f5SStefano Zampini if (!jac->G) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE AMS preconditioner needs the discrete gradient operator via PCHYPRESetDiscreteGradient"); 236*5ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->G->data); 237*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 238*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetDiscreteGradient,(jac->hsolver,parcsr)); 239*5ac14e1cSStefano Zampini if (jac->alpha_Poisson) { 240*5ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->alpha_Poisson->data); 241*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 242*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaPoissonMatrix,(jac->hsolver,parcsr)); 243*5ac14e1cSStefano Zampini } 244*5ac14e1cSStefano Zampini if (jac->ams_beta_is_zero) { 245*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaPoissonMatrix,(jac->hsolver,NULL)); 246*5ac14e1cSStefano Zampini } else if (jac->beta_Poisson) { 247*5ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->beta_Poisson->data); 248*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 249*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaPoissonMatrix,(jac->hsolver,parcsr)); 250*5ac14e1cSStefano Zampini } 2514cb006feSStefano Zampini } 252863406b8SStefano Zampini /* special case for ADS */ 253863406b8SStefano Zampini if (jac->setup == HYPRE_ADSSetup) { 254*5ac14e1cSStefano Zampini Mat_HYPRE *hm; 255*5ac14e1cSStefano Zampini HYPRE_ParCSRMatrix parcsr; 25649a781f5SStefano Zampini if (!jac->coords[0]) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs the coordinate vectors via PCSetCoordinates()"); 25737096e45SBarry 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"); 25849a781f5SStefano Zampini if (!jac->G) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs the discrete gradient operator via PCHYPRESetDiscreteGradient"); 25949a781f5SStefano Zampini if (!jac->C) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_USER,"HYPRE ADS preconditioner needs the discrete curl operator via PCHYPRESetDiscreteGradient"); 260*5ac14e1cSStefano Zampini if (jac->coords[0]) { 261*5ac14e1cSStefano Zampini HYPRE_ParVector coords[3]; 262*5ac14e1cSStefano Zampini coords[0] = NULL; 263*5ac14e1cSStefano Zampini coords[1] = NULL; 264*5ac14e1cSStefano Zampini coords[2] = NULL; 265*5ac14e1cSStefano Zampini if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[0],(void**)(&coords[0]))); 266*5ac14e1cSStefano Zampini if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[1],(void**)(&coords[1]))); 267*5ac14e1cSStefano Zampini if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorGetObject,(jac->coords[2],(void**)(&coords[2]))); 268*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetCoordinateVectors,(jac->hsolver,coords[0],coords[1],coords[2])); 269*5ac14e1cSStefano Zampini } 270*5ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->G->data); 271*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 272*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetDiscreteGradient,(jac->hsolver,parcsr)); 273*5ac14e1cSStefano Zampini hm = (Mat_HYPRE*)(jac->C->data); 274*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hm->ij,(void**)(&parcsr))); 275*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_ADSSetDiscreteCurl,(jac->hsolver,parcsr)); 276863406b8SStefano Zampini } 27749a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 27849a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b,(void**)&bv)); 27949a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x,(void**)&xv)); 280fd3f9acdSBarry Smith PetscStackCall("HYPRE_SetupXXX",ierr = (*jac->setup)(jac->hsolver,hmat,bv,xv);CHKERRQ(ierr);); 28116d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 28216d9e3a6SLisandro Dalcin } 28316d9e3a6SLisandro Dalcin 28416d9e3a6SLisandro Dalcin #undef __FUNCT__ 28516d9e3a6SLisandro Dalcin #define __FUNCT__ "PCApply_HYPRE" 28616d9e3a6SLisandro Dalcin static PetscErrorCode PCApply_HYPRE(PC pc,Vec b,Vec x) 28716d9e3a6SLisandro Dalcin { 28816d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 28949a781f5SStefano Zampini Mat_HYPRE *hjac = (Mat_HYPRE*)(jac->hpmat->data); 29016d9e3a6SLisandro Dalcin PetscErrorCode ierr; 29116d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 292d9ca1df4SBarry Smith PetscScalar *xv; 293d9ca1df4SBarry Smith const PetscScalar *bv,*sbv; 29416d9e3a6SLisandro Dalcin HYPRE_ParVector jbv,jxv; 295d9ca1df4SBarry Smith PetscScalar *sxv; 2964ddd07fcSJed Brown PetscInt hierr; 29716d9e3a6SLisandro Dalcin 29816d9e3a6SLisandro Dalcin PetscFunctionBegin; 299dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 30016d9e3a6SLisandro Dalcin if (!jac->applyrichardson) {ierr = VecSet(x,0.0);CHKERRQ(ierr);} 301d9ca1df4SBarry Smith ierr = VecGetArrayRead(b,&bv);CHKERRQ(ierr); 30216d9e3a6SLisandro Dalcin ierr = VecGetArray(x,&xv);CHKERRQ(ierr); 30349a781f5SStefano Zampini HYPREReplacePointer(hjac->b,(PetscScalar*)bv,sbv); 30449a781f5SStefano Zampini HYPREReplacePointer(hjac->x,xv,sxv); 30516d9e3a6SLisandro Dalcin 30649a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 30749a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b,(void**)&jbv)); 30849a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x,(void**)&jxv)); 309fd3f9acdSBarry Smith PetscStackCall("Hypre solve",hierr = (*jac->solve)(jac->hsolver,hmat,jbv,jxv); 31065e19b50SBarry Smith if (hierr && hierr != HYPRE_ERROR_CONV) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in HYPRE solver, error code %d",hierr); 311fd3f9acdSBarry Smith if (hierr) hypre__global_error = 0;); 31216d9e3a6SLisandro Dalcin 31323df4f25SStefano Zampini if (jac->setup == HYPRE_AMSSetup && jac->ams_beta_is_zero_part) { 314*5ac14e1cSStefano Zampini PetscStackCallStandard(HYPRE_AMSProjectOutGradients,(jac->hsolver,jxv)); 31521df291bSStefano Zampini } 31649a781f5SStefano Zampini HYPREReplacePointer(hjac->b,(PetscScalar*)sbv,bv); 31749a781f5SStefano Zampini HYPREReplacePointer(hjac->x,sxv,xv); 31816d9e3a6SLisandro Dalcin ierr = VecRestoreArray(x,&xv);CHKERRQ(ierr); 319d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(b,&bv);CHKERRQ(ierr); 32016d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 32116d9e3a6SLisandro Dalcin } 32216d9e3a6SLisandro Dalcin 32316d9e3a6SLisandro Dalcin #undef __FUNCT__ 3248695de01SBarry Smith #define __FUNCT__ "PCReset_HYPRE" 3258695de01SBarry Smith static PetscErrorCode PCReset_HYPRE(PC pc) 3268695de01SBarry Smith { 3278695de01SBarry Smith PC_HYPRE *jac = (PC_HYPRE*)pc->data; 3288695de01SBarry Smith PetscErrorCode ierr; 3298695de01SBarry Smith 3308695de01SBarry Smith PetscFunctionBegin; 33149a781f5SStefano Zampini ierr = MatDestroy(&jac->hpmat);CHKERRQ(ierr); 332*5ac14e1cSStefano Zampini ierr = MatDestroy(&jac->G);CHKERRQ(ierr); 333*5ac14e1cSStefano Zampini ierr = MatDestroy(&jac->C);CHKERRQ(ierr); 334*5ac14e1cSStefano Zampini ierr = MatDestroy(&jac->alpha_Poisson);CHKERRQ(ierr); 335*5ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 3368695de01SBarry Smith if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[0])); jac->coords[0] = NULL; 3378695de01SBarry Smith if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[1])); jac->coords[1] = NULL; 3388695de01SBarry Smith if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[2])); jac->coords[2] = NULL; 3398695de01SBarry Smith if (jac->constants[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[0])); jac->constants[0] = NULL; 3408695de01SBarry Smith if (jac->constants[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[1])); jac->constants[1] = NULL; 3418695de01SBarry Smith if (jac->constants[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[2])); jac->constants[2] = NULL; 342550a8b7dSBarry Smith if (jac->n_hmnull && jac->hmnull) { 3435272c319SBarry Smith PetscInt i; 344b1c1cd91SBarry Smith PETSC_UNUSED PetscScalar *petscvecarray; 3455272c319SBarry Smith 3465272c319SBarry Smith for (i=0; i<jac->n_hmnull; i++) { 34772827435SBarry Smith HYPREReplacePointer(jac->hmnull[i],jac->hmnull_hypre_data_array[i],petscvecarray); 3485272c319SBarry Smith PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->hmnull[i])); 3495272c319SBarry Smith } 3505272c319SBarry Smith ierr = PetscFree(jac->hmnull);CHKERRQ(ierr); 35172827435SBarry Smith ierr = PetscFree(jac->hmnull_hypre_data_array);CHKERRQ(ierr); 3525272c319SBarry Smith ierr = PetscFree(jac->phmnull);CHKERRQ(ierr); 3535272c319SBarry Smith ierr = VecDestroy(&jac->hmnull_constant);CHKERRQ(ierr); 3545272c319SBarry Smith } 355*5ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_FALSE; 356*5ac14e1cSStefano Zampini jac->dim = 0; 3578695de01SBarry Smith PetscFunctionReturn(0); 3588695de01SBarry Smith } 3598695de01SBarry Smith 3608695de01SBarry Smith #undef __FUNCT__ 36116d9e3a6SLisandro Dalcin #define __FUNCT__ "PCDestroy_HYPRE" 36216d9e3a6SLisandro Dalcin static PetscErrorCode PCDestroy_HYPRE(PC pc) 36316d9e3a6SLisandro Dalcin { 36416d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 36516d9e3a6SLisandro Dalcin PetscErrorCode ierr; 36616d9e3a6SLisandro Dalcin 36716d9e3a6SLisandro Dalcin PetscFunctionBegin; 3688695de01SBarry Smith ierr = PCReset_HYPRE(pc);CHKERRQ(ierr); 369226b0620SJed Brown if (jac->destroy) PetscStackCall("HYPRE_DestroyXXX",ierr = (*jac->destroy)(jac->hsolver);CHKERRQ(ierr);); 370503cfb0cSBarry Smith ierr = PetscFree(jac->hypre_type);CHKERRQ(ierr); 37116d9e3a6SLisandro Dalcin if (jac->comm_hypre != MPI_COMM_NULL) { ierr = MPI_Comm_free(&(jac->comm_hypre));CHKERRQ(ierr);} 372c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 37316d9e3a6SLisandro Dalcin 37416d9e3a6SLisandro Dalcin ierr = PetscObjectChangeTypeName((PetscObject)pc,0);CHKERRQ(ierr); 375bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetType_C",NULL);CHKERRQ(ierr); 376bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPREGetType_C",NULL);CHKERRQ(ierr); 3774cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetCoordinates_C",NULL);CHKERRQ(ierr); 3784cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteGradient_C",NULL);CHKERRQ(ierr); 379863406b8SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteCurl_C",NULL);CHKERRQ(ierr); 3804cb006feSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetConstantEdgeVectors_C",NULL);CHKERRQ(ierr); 381*5ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetPoissonMatrix_C",NULL);CHKERRQ(ierr); 38216d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 38316d9e3a6SLisandro Dalcin } 38416d9e3a6SLisandro Dalcin 38516d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 38616d9e3a6SLisandro Dalcin #undef __FUNCT__ 38716d9e3a6SLisandro Dalcin #define __FUNCT__ "PCSetFromOptions_HYPRE_Pilut" 3884416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_Pilut(PetscOptionItems *PetscOptionsObject,PC pc) 38916d9e3a6SLisandro Dalcin { 39016d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 39116d9e3a6SLisandro Dalcin PetscErrorCode ierr; 392ace3abfcSBarry Smith PetscBool flag; 39316d9e3a6SLisandro Dalcin 39416d9e3a6SLisandro Dalcin PetscFunctionBegin; 395e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE Pilut Options");CHKERRQ(ierr); 39616d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_pilut_maxiter","Number of iterations","None",jac->maxiter,&jac->maxiter,&flag);CHKERRQ(ierr); 397fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetMaxIter,(jac->hsolver,jac->maxiter)); 39816d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_pilut_tol","Drop tolerance","None",jac->tol,&jac->tol,&flag);CHKERRQ(ierr); 399fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetDropTolerance,(jac->hsolver,jac->tol)); 40016d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_pilut_factorrowsize","FactorRowSize","None",jac->factorrowsize,&jac->factorrowsize,&flag);CHKERRQ(ierr); 401fd3f9acdSBarry Smith if (flag) PetscStackCallStandard(HYPRE_ParCSRPilutSetFactorRowSize,(jac->hsolver,jac->factorrowsize)); 40216d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 40316d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 40416d9e3a6SLisandro Dalcin } 40516d9e3a6SLisandro Dalcin 40616d9e3a6SLisandro Dalcin #undef __FUNCT__ 40716d9e3a6SLisandro Dalcin #define __FUNCT__ "PCView_HYPRE_Pilut" 40816d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_Pilut(PC pc,PetscViewer viewer) 40916d9e3a6SLisandro Dalcin { 41016d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 41116d9e3a6SLisandro Dalcin PetscErrorCode ierr; 412ace3abfcSBarry Smith PetscBool iascii; 41316d9e3a6SLisandro Dalcin 41416d9e3a6SLisandro Dalcin PetscFunctionBegin; 415251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 41616d9e3a6SLisandro Dalcin if (iascii) { 41716d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE Pilut preconditioning\n");CHKERRQ(ierr); 41816d9e3a6SLisandro Dalcin if (jac->maxiter != PETSC_DEFAULT) { 41916d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE Pilut: maximum number of iterations %d\n",jac->maxiter);CHKERRQ(ierr); 42016d9e3a6SLisandro Dalcin } else { 42116d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE Pilut: default maximum number of iterations \n");CHKERRQ(ierr); 42216d9e3a6SLisandro Dalcin } 42316d9e3a6SLisandro Dalcin if (jac->tol != PETSC_DEFAULT) { 42457622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE Pilut: drop tolerance %g\n",(double)jac->tol);CHKERRQ(ierr); 42516d9e3a6SLisandro Dalcin } else { 42616d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE Pilut: default drop tolerance \n");CHKERRQ(ierr); 42716d9e3a6SLisandro Dalcin } 42816d9e3a6SLisandro Dalcin if (jac->factorrowsize != PETSC_DEFAULT) { 42916d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE Pilut: factor row size %d\n",jac->factorrowsize);CHKERRQ(ierr); 43016d9e3a6SLisandro Dalcin } else { 43116d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE Pilut: default factor row size \n");CHKERRQ(ierr); 43216d9e3a6SLisandro Dalcin } 43316d9e3a6SLisandro Dalcin } 43416d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 43516d9e3a6SLisandro Dalcin } 43616d9e3a6SLisandro Dalcin 43716d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 43816d9e3a6SLisandro Dalcin 43916d9e3a6SLisandro Dalcin #undef __FUNCT__ 44016d9e3a6SLisandro Dalcin #define __FUNCT__ "PCApplyTranspose_HYPRE_BoomerAMG" 44116d9e3a6SLisandro Dalcin static PetscErrorCode PCApplyTranspose_HYPRE_BoomerAMG(PC pc,Vec b,Vec x) 44216d9e3a6SLisandro Dalcin { 44316d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 44449a781f5SStefano Zampini Mat_HYPRE *hjac = (Mat_HYPRE*)(jac->hpmat->data); 44516d9e3a6SLisandro Dalcin PetscErrorCode ierr; 44616d9e3a6SLisandro Dalcin HYPRE_ParCSRMatrix hmat; 447d9ca1df4SBarry Smith PetscScalar *xv; 448d9ca1df4SBarry Smith const PetscScalar *bv; 44916d9e3a6SLisandro Dalcin HYPRE_ParVector jbv,jxv; 45016d9e3a6SLisandro Dalcin PetscScalar *sbv,*sxv; 4514ddd07fcSJed Brown PetscInt hierr; 45216d9e3a6SLisandro Dalcin 45316d9e3a6SLisandro Dalcin PetscFunctionBegin; 454dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 45516d9e3a6SLisandro Dalcin ierr = VecSet(x,0.0);CHKERRQ(ierr); 456d9ca1df4SBarry Smith ierr = VecGetArrayRead(b,&bv);CHKERRQ(ierr); 45716d9e3a6SLisandro Dalcin ierr = VecGetArray(x,&xv);CHKERRQ(ierr); 45849a781f5SStefano Zampini HYPREReplacePointer(hjac->b,(PetscScalar*)bv,sbv); 45949a781f5SStefano Zampini HYPREReplacePointer(hjac->x,xv,sxv); 46016d9e3a6SLisandro Dalcin 46149a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJMatrixGetObject,(hjac->ij,(void**)&hmat)); 46249a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->b,(void**)&jbv)); 46349a781f5SStefano Zampini PetscStackCallStandard(HYPRE_IJVectorGetObject,(hjac->x,(void**)&jxv)); 46416d9e3a6SLisandro Dalcin 46516d9e3a6SLisandro Dalcin hierr = HYPRE_BoomerAMGSolveT(jac->hsolver,hmat,jbv,jxv); 46616d9e3a6SLisandro Dalcin /* error code of 1 in BoomerAMG merely means convergence not achieved */ 467e32f2f54SBarry Smith if (hierr && (hierr != 1)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error in HYPRE solver, error code %d",hierr); 46816d9e3a6SLisandro Dalcin if (hierr) hypre__global_error = 0; 46916d9e3a6SLisandro Dalcin 47049a781f5SStefano Zampini HYPREReplacePointer(hjac->b,sbv,bv); 47149a781f5SStefano Zampini HYPREReplacePointer(hjac->x,sxv,xv); 47216d9e3a6SLisandro Dalcin ierr = VecRestoreArray(x,&xv);CHKERRQ(ierr); 473d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(b,&bv);CHKERRQ(ierr); 47416d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 47516d9e3a6SLisandro Dalcin } 47616d9e3a6SLisandro Dalcin 477a669f990SJed Brown /* static array length */ 478a669f990SJed Brown #define ALEN(a) (sizeof(a)/sizeof((a)[0])) 479a669f990SJed Brown 48016d9e3a6SLisandro Dalcin static const char *HYPREBoomerAMGCycleType[] = {"","V","W"}; 4810f1074feSSatish Balay static const char *HYPREBoomerAMGCoarsenType[] = {"CLJP","Ruge-Stueben","","modifiedRuge-Stueben","","","Falgout", "", "PMIS", "", "HMIS"}; 48216d9e3a6SLisandro Dalcin static const char *HYPREBoomerAMGMeasureType[] = {"local","global"}; 48365de4495SJed Brown /* The following corresponds to HYPRE_BoomerAMGSetRelaxType which has many missing numbers in the enum */ 4846a251517SEike Mueller static const char *HYPREBoomerAMGSmoothType[] = {"Schwarz-smoothers","Pilut","ParaSails","Euclid"}; 48565de4495SJed Brown static const char *HYPREBoomerAMGRelaxType[] = {"Jacobi","sequential-Gauss-Seidel","seqboundary-Gauss-Seidel","SOR/Jacobi","backward-SOR/Jacobi", 48665de4495SJed Brown "" /* [5] hybrid chaotic Gauss-Seidel (works only with OpenMP) */,"symmetric-SOR/Jacobi", 48765de4495SJed Brown "" /* 7 */,"l1scaled-SOR/Jacobi","Gaussian-elimination", 48865de4495SJed Brown "" /* 10 */, "" /* 11 */, "" /* 12 */, "" /* 13 */, "" /* 14 */, 48965de4495SJed Brown "CG" /* non-stationary */,"Chebyshev","FCF-Jacobi","l1scaled-Jacobi"}; 4900f1074feSSatish Balay static const char *HYPREBoomerAMGInterpType[] = {"classical", "", "", "direct", "multipass", "multipass-wts", "ext+i", 4910f1074feSSatish Balay "ext+i-cc", "standard", "standard-wts", "", "", "FF", "FF1"}; 49216d9e3a6SLisandro Dalcin #undef __FUNCT__ 49316d9e3a6SLisandro Dalcin #define __FUNCT__ "PCSetFromOptions_HYPRE_BoomerAMG" 4944416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_BoomerAMG(PetscOptionItems *PetscOptionsObject,PC pc) 49516d9e3a6SLisandro Dalcin { 49616d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 49716d9e3a6SLisandro Dalcin PetscErrorCode ierr; 4984ddd07fcSJed Brown PetscInt n,indx,level; 499ace3abfcSBarry Smith PetscBool flg, tmp_truth; 50016d9e3a6SLisandro Dalcin double tmpdbl, twodbl[2]; 50116d9e3a6SLisandro Dalcin 50216d9e3a6SLisandro Dalcin PetscFunctionBegin; 503e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE BoomerAMG Options");CHKERRQ(ierr); 5044336a9eeSBarry Smith ierr = PetscOptionsEList("-pc_hypre_boomeramg_cycle_type","Cycle type","None",HYPREBoomerAMGCycleType+1,2,HYPREBoomerAMGCycleType[jac->cycletype],&indx,&flg);CHKERRQ(ierr); 50516d9e3a6SLisandro Dalcin if (flg) { 5064336a9eeSBarry Smith jac->cycletype = indx+1; 507fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleType,(jac->hsolver,jac->cycletype)); 50816d9e3a6SLisandro Dalcin } 50916d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_max_levels","Number of levels (of grids) allowed","None",jac->maxlevels,&jac->maxlevels,&flg);CHKERRQ(ierr); 51016d9e3a6SLisandro Dalcin if (flg) { 511ce94432eSBarry Smith if (jac->maxlevels < 2) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Number of levels %d must be at least two",jac->maxlevels); 512fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxLevels,(jac->hsolver,jac->maxlevels)); 51316d9e3a6SLisandro Dalcin } 51416d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_max_iter","Maximum iterations used PER hypre call","None",jac->maxiter,&jac->maxiter,&flg);CHKERRQ(ierr); 51516d9e3a6SLisandro Dalcin if (flg) { 516ce94432eSBarry Smith if (jac->maxiter < 1) SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_OUTOFRANGE,"Number of iterations %d must be at least one",jac->maxiter); 517fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 51816d9e3a6SLisandro Dalcin } 5190f1074feSSatish 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); 52016d9e3a6SLisandro Dalcin if (flg) { 52157622a8eSBarry 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); 522fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 52316d9e3a6SLisandro Dalcin } 52416d9e3a6SLisandro Dalcin 5250f1074feSSatish Balay ierr = PetscOptionsScalar("-pc_hypre_boomeramg_truncfactor","Truncation factor for interpolation (0=no truncation)","None",jac->truncfactor,&jac->truncfactor,&flg);CHKERRQ(ierr); 52616d9e3a6SLisandro Dalcin if (flg) { 52757622a8eSBarry 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); 528fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTruncFactor,(jac->hsolver,jac->truncfactor)); 52916d9e3a6SLisandro Dalcin } 53016d9e3a6SLisandro Dalcin 5310f1074feSSatish 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); 5320f1074feSSatish Balay if (flg) { 53357622a8eSBarry 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); 534fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetPMaxElmts,(jac->hsolver,jac->pmax)); 5350f1074feSSatish Balay } 5360f1074feSSatish Balay 5370f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_agg_nl","Number of levels of aggressive coarsening","None",jac->agg_nl,&jac->agg_nl,&flg);CHKERRQ(ierr); 5380f1074feSSatish Balay if (flg) { 53957622a8eSBarry 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); 5400f1074feSSatish Balay 541fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetAggNumLevels,(jac->hsolver,jac->agg_nl)); 5420f1074feSSatish Balay } 5430f1074feSSatish Balay 5440f1074feSSatish Balay 5450f1074feSSatish 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); 5460f1074feSSatish Balay if (flg) { 54757622a8eSBarry 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); 5480f1074feSSatish Balay 549fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumPaths,(jac->hsolver,jac->agg_num_paths)); 5500f1074feSSatish Balay } 5510f1074feSSatish Balay 5520f1074feSSatish Balay 55316d9e3a6SLisandro Dalcin ierr = PetscOptionsScalar("-pc_hypre_boomeramg_strong_threshold","Threshold for being strongly connected","None",jac->strongthreshold,&jac->strongthreshold,&flg);CHKERRQ(ierr); 55416d9e3a6SLisandro Dalcin if (flg) { 55557622a8eSBarry 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); 556fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThreshold,(jac->hsolver,jac->strongthreshold)); 55716d9e3a6SLisandro Dalcin } 55816d9e3a6SLisandro Dalcin ierr = PetscOptionsScalar("-pc_hypre_boomeramg_max_row_sum","Maximum row sum","None",jac->maxrowsum,&jac->maxrowsum,&flg);CHKERRQ(ierr); 55916d9e3a6SLisandro Dalcin if (flg) { 56057622a8eSBarry 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); 56157622a8eSBarry 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); 562fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxRowSum,(jac->hsolver,jac->maxrowsum)); 56316d9e3a6SLisandro Dalcin } 56416d9e3a6SLisandro Dalcin 56516d9e3a6SLisandro Dalcin /* Grid sweeps */ 5660f1074feSSatish 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); 56716d9e3a6SLisandro Dalcin if (flg) { 568fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumSweeps,(jac->hsolver,indx)); 56916d9e3a6SLisandro Dalcin /* modify the jac structure so we can view the updated options with PC_View */ 57016d9e3a6SLisandro Dalcin jac->gridsweeps[0] = indx; 5710f1074feSSatish Balay jac->gridsweeps[1] = indx; 5720f1074feSSatish Balay /*defaults coarse to 1 */ 5730f1074feSSatish Balay jac->gridsweeps[2] = 1; 57416d9e3a6SLisandro Dalcin } 5750f1074feSSatish Balay 5765272c319SBarry 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); 5775272c319SBarry Smith if (flg) { 5785272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNodal,(jac->hsolver,jac->nodal_coarsening)); 5795272c319SBarry Smith } 5805272c319SBarry Smith 581cbc39033SBarry 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); 5825272c319SBarry Smith if (flg) { 5835272c319SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpVecVariant,(jac->hsolver,jac->vec_interp_variant)); 5845272c319SBarry Smith } 5855272c319SBarry Smith 5860f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_down","Number of sweeps for the down cycles","None",jac->gridsweeps[0], &indx,&flg);CHKERRQ(ierr); 58716d9e3a6SLisandro Dalcin if (flg) { 588fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 1)); 5890f1074feSSatish Balay jac->gridsweeps[0] = indx; 59016d9e3a6SLisandro Dalcin } 59116d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_up","Number of sweeps for the up cycles","None",jac->gridsweeps[1],&indx,&flg);CHKERRQ(ierr); 59216d9e3a6SLisandro Dalcin if (flg) { 593fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 2)); 5940f1074feSSatish Balay jac->gridsweeps[1] = indx; 59516d9e3a6SLisandro Dalcin } 5960f1074feSSatish Balay ierr = PetscOptionsInt("-pc_hypre_boomeramg_grid_sweeps_coarse","Number of sweeps for the coarse level","None",jac->gridsweeps[2],&indx,&flg);CHKERRQ(ierr); 59716d9e3a6SLisandro Dalcin if (flg) { 598fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleNumSweeps,(jac->hsolver,indx, 3)); 5990f1074feSSatish Balay jac->gridsweeps[2] = indx; 60016d9e3a6SLisandro Dalcin } 60116d9e3a6SLisandro Dalcin 6026a251517SEike Mueller /* Smooth type */ 6036a251517SEike Mueller ierr = PetscOptionsEList("-pc_hypre_boomeramg_smooth_type","Enable more complex smoothers","None",HYPREBoomerAMGSmoothType,ALEN(HYPREBoomerAMGSmoothType),HYPREBoomerAMGSmoothType[0],&indx,&flg); 6046a251517SEike Mueller if (flg) { 6056a251517SEike Mueller jac->smoothtype = indx; 6066a251517SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothType,(jac->hsolver,indx+6)); 6078131ecf7SEike Mueller jac->smoothnumlevels = 25; 6088131ecf7SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,25)); 6098131ecf7SEike Mueller } 6108131ecf7SEike Mueller 6118131ecf7SEike Mueller /* Number of smoothing levels */ 6128131ecf7SEike 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); 6138131ecf7SEike Mueller if (flg && (jac->smoothtype != -1)) { 6148131ecf7SEike Mueller jac->smoothnumlevels = indx; 6158131ecf7SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,indx)); 6166a251517SEike Mueller } 6176a251517SEike Mueller 6181810e44eSEike Mueller /* Number of levels for ILU(k) for Euclid */ 6191810e44eSEike Mueller ierr = PetscOptionsInt("-pc_hypre_boomeramg_eu_level","Number of levels for ILU(k) in Euclid smoother","None",0,&indx,&flg);CHKERRQ(ierr); 6201810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 6211810e44eSEike Mueller jac->eu_level = indx; 6221810e44eSEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuLevel,(jac->hsolver,indx)); 6231810e44eSEike Mueller } 6241810e44eSEike Mueller 6251810e44eSEike Mueller /* Filter for ILU(k) for Euclid */ 6261810e44eSEike Mueller double droptolerance; 6271810e44eSEike Mueller ierr = PetscOptionsScalar("-pc_hypre_boomeramg_eu_droptolerance","Drop tolerance for ILU(k) in Euclid smoother","None",0,&droptolerance,&flg);CHKERRQ(ierr); 6281810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 6291810e44eSEike Mueller jac->eu_droptolerance = droptolerance; 6301810e44eSEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuLevel,(jac->hsolver,droptolerance)); 6311810e44eSEike Mueller } 6321810e44eSEike Mueller 6331810e44eSEike Mueller /* Use Block Jacobi ILUT for Euclid */ 6341810e44eSEike Mueller ierr = PetscOptionsBool("-pc_hypre_boomeramg_eu_bj", "Use Block Jacobi for ILU in Euclid smoother?", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 6351810e44eSEike Mueller if (flg && (jac->smoothtype == 3)) { 6361810e44eSEike Mueller jac->eu_bj = tmp_truth; 637493fc9d9SEike Mueller PetscStackCallStandard(HYPRE_BoomerAMGSetEuBJ,(jac->hsolver,jac->eu_bj)); 6381810e44eSEike Mueller } 6391810e44eSEike Mueller 64016d9e3a6SLisandro Dalcin /* Relax type */ 641a669f990SJed 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); 64216d9e3a6SLisandro Dalcin if (flg) { 6430f1074feSSatish Balay jac->relaxtype[0] = jac->relaxtype[1] = indx; 644fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxType,(jac->hsolver, indx)); 6450f1074feSSatish Balay /* by default, coarse type set to 9 */ 6460f1074feSSatish Balay jac->relaxtype[2] = 9; 6470f1074feSSatish Balay 64816d9e3a6SLisandro Dalcin } 649a669f990SJed 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); 65016d9e3a6SLisandro Dalcin if (flg) { 65116d9e3a6SLisandro Dalcin jac->relaxtype[0] = indx; 652fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 1)); 65316d9e3a6SLisandro Dalcin } 654a669f990SJed 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); 65516d9e3a6SLisandro Dalcin if (flg) { 6560f1074feSSatish Balay jac->relaxtype[1] = indx; 657fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 2)); 65816d9e3a6SLisandro Dalcin } 659a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_relax_type_coarse","Relax type on coarse grid","None",HYPREBoomerAMGRelaxType,ALEN(HYPREBoomerAMGRelaxType),HYPREBoomerAMGRelaxType[9],&indx,&flg);CHKERRQ(ierr); 66016d9e3a6SLisandro Dalcin if (flg) { 6610f1074feSSatish Balay jac->relaxtype[2] = indx; 662fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleRelaxType,(jac->hsolver, indx, 3)); 66316d9e3a6SLisandro Dalcin } 66416d9e3a6SLisandro Dalcin 66516d9e3a6SLisandro Dalcin /* Relaxation Weight */ 66616d9e3a6SLisandro 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); 66716d9e3a6SLisandro Dalcin if (flg) { 668fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxWt,(jac->hsolver,tmpdbl)); 66916d9e3a6SLisandro Dalcin jac->relaxweight = tmpdbl; 67016d9e3a6SLisandro Dalcin } 67116d9e3a6SLisandro Dalcin 67216d9e3a6SLisandro Dalcin n = 2; 67316d9e3a6SLisandro Dalcin twodbl[0] = twodbl[1] = 1.0; 67416d9e3a6SLisandro 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); 67516d9e3a6SLisandro Dalcin if (flg) { 67616d9e3a6SLisandro Dalcin if (n == 2) { 67716d9e3a6SLisandro Dalcin indx = (int)PetscAbsReal(twodbl[1]); 678fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetLevelRelaxWt,(jac->hsolver,twodbl[0],indx)); 679ce94432eSBarry 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); 68016d9e3a6SLisandro Dalcin } 68116d9e3a6SLisandro Dalcin 68216d9e3a6SLisandro Dalcin /* Outer relaxation Weight */ 68316d9e3a6SLisandro 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); 68416d9e3a6SLisandro Dalcin if (flg) { 685fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetOuterWt,(jac->hsolver, tmpdbl)); 68616d9e3a6SLisandro Dalcin jac->outerrelaxweight = tmpdbl; 68716d9e3a6SLisandro Dalcin } 68816d9e3a6SLisandro Dalcin 68916d9e3a6SLisandro Dalcin n = 2; 69016d9e3a6SLisandro Dalcin twodbl[0] = twodbl[1] = 1.0; 69116d9e3a6SLisandro 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); 69216d9e3a6SLisandro Dalcin if (flg) { 69316d9e3a6SLisandro Dalcin if (n == 2) { 69416d9e3a6SLisandro Dalcin indx = (int)PetscAbsReal(twodbl[1]); 695fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetLevelOuterWt,(jac->hsolver, twodbl[0], indx)); 696ce94432eSBarry 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); 69716d9e3a6SLisandro Dalcin } 69816d9e3a6SLisandro Dalcin 69916d9e3a6SLisandro Dalcin /* the Relax Order */ 700acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_boomeramg_no_CF", "Do not use CF-relaxation", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 70116d9e3a6SLisandro Dalcin 7028afaa268SBarry Smith if (flg && tmp_truth) { 70316d9e3a6SLisandro Dalcin jac->relaxorder = 0; 704fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxOrder,(jac->hsolver, jac->relaxorder)); 70516d9e3a6SLisandro Dalcin } 706a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_measure_type","Measure type","None",HYPREBoomerAMGMeasureType,ALEN(HYPREBoomerAMGMeasureType),HYPREBoomerAMGMeasureType[0],&indx,&flg);CHKERRQ(ierr); 70716d9e3a6SLisandro Dalcin if (flg) { 70816d9e3a6SLisandro Dalcin jac->measuretype = indx; 709fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMeasureType,(jac->hsolver,jac->measuretype)); 71016d9e3a6SLisandro Dalcin } 7110f1074feSSatish Balay /* update list length 3/07 */ 712a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_coarsen_type","Coarsen type","None",HYPREBoomerAMGCoarsenType,ALEN(HYPREBoomerAMGCoarsenType),HYPREBoomerAMGCoarsenType[6],&indx,&flg);CHKERRQ(ierr); 71316d9e3a6SLisandro Dalcin if (flg) { 71416d9e3a6SLisandro Dalcin jac->coarsentype = indx; 715fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCoarsenType,(jac->hsolver,jac->coarsentype)); 71616d9e3a6SLisandro Dalcin } 7170f1074feSSatish Balay 7180f1074feSSatish Balay /* new 3/07 */ 719a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_boomeramg_interp_type","Interpolation type","None",HYPREBoomerAMGInterpType,ALEN(HYPREBoomerAMGInterpType),HYPREBoomerAMGInterpType[0],&indx,&flg);CHKERRQ(ierr); 7200f1074feSSatish Balay if (flg) { 7210f1074feSSatish Balay jac->interptype = indx; 722fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpType,(jac->hsolver,jac->interptype)); 7230f1074feSSatish Balay } 7240f1074feSSatish Balay 725b96a4a96SBarry Smith ierr = PetscOptionsName("-pc_hypre_boomeramg_print_statistics","Print statistics","None",&flg);CHKERRQ(ierr); 72616d9e3a6SLisandro Dalcin if (flg) { 727b96a4a96SBarry Smith level = 3; 7280298fd71SBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_print_statistics","Print statistics","None",level,&level,NULL);CHKERRQ(ierr); 7292fa5cd67SKarl Rupp 730b96a4a96SBarry Smith jac->printstatistics = PETSC_TRUE; 731fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetPrintLevel,(jac->hsolver,level)); 7322ae77aedSBarry Smith } 7332ae77aedSBarry Smith 734b96a4a96SBarry Smith ierr = PetscOptionsName("-pc_hypre_boomeramg_print_debug","Print debug information","None",&flg);CHKERRQ(ierr); 7352ae77aedSBarry Smith if (flg) { 736b96a4a96SBarry Smith level = 3; 7370298fd71SBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_print_debug","Print debug information","None",level,&level,NULL);CHKERRQ(ierr); 7382fa5cd67SKarl Rupp 739b96a4a96SBarry Smith jac->printstatistics = PETSC_TRUE; 740fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetDebugFlag,(jac->hsolver,level)); 74116d9e3a6SLisandro Dalcin } 7428f87f92bSBarry Smith 743acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_boomeramg_nodal_relaxation", "Nodal relaxation via Schwarz", "None", PETSC_FALSE, &tmp_truth, &flg);CHKERRQ(ierr); 7448f87f92bSBarry Smith if (flg && tmp_truth) { 7458f87f92bSBarry Smith PetscInt tmp_int; 7468f87f92bSBarry Smith ierr = PetscOptionsInt("-pc_hypre_boomeramg_nodal_relaxation", "Nodal relaxation via Schwarz", "None",jac->nodal_relax_levels,&tmp_int,&flg);CHKERRQ(ierr); 7478f87f92bSBarry Smith if (flg) jac->nodal_relax_levels = tmp_int; 748fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothType,(jac->hsolver,6)); 749fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetDomainType,(jac->hsolver,1)); 750fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetOverlap,(jac->hsolver,0)); 751fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetSmoothNumLevels,(jac->hsolver,jac->nodal_relax_levels)); 7528f87f92bSBarry Smith } 7538f87f92bSBarry Smith 75416d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 75516d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 75616d9e3a6SLisandro Dalcin } 75716d9e3a6SLisandro Dalcin 75816d9e3a6SLisandro Dalcin #undef __FUNCT__ 75916d9e3a6SLisandro Dalcin #define __FUNCT__ "PCApplyRichardson_HYPRE_BoomerAMG" 760ace3abfcSBarry 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) 76116d9e3a6SLisandro Dalcin { 76216d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 76316d9e3a6SLisandro Dalcin PetscErrorCode ierr; 7644ddd07fcSJed Brown PetscInt oits; 76516d9e3a6SLisandro Dalcin 76616d9e3a6SLisandro Dalcin PetscFunctionBegin; 767dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 768fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,its*jac->maxiter)); 769fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,rtol)); 77016d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_TRUE; 77116d9e3a6SLisandro Dalcin ierr = PCApply_HYPRE(pc,b,y);CHKERRQ(ierr); 77216d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_FALSE; 7738b1f7689SBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGGetNumIterations,(jac->hsolver,(HYPRE_Int *)&oits)); 7744d0a8057SBarry Smith *outits = oits; 7754d0a8057SBarry Smith if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 7764d0a8057SBarry Smith else *reason = PCRICHARDSON_CONVERGED_RTOL; 777fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 778fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 77916d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 78016d9e3a6SLisandro Dalcin } 78116d9e3a6SLisandro Dalcin 78216d9e3a6SLisandro Dalcin 78316d9e3a6SLisandro Dalcin #undef __FUNCT__ 78416d9e3a6SLisandro Dalcin #define __FUNCT__ "PCView_HYPRE_BoomerAMG" 78516d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_BoomerAMG(PC pc,PetscViewer viewer) 78616d9e3a6SLisandro Dalcin { 78716d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 78816d9e3a6SLisandro Dalcin PetscErrorCode ierr; 789ace3abfcSBarry Smith PetscBool iascii; 79016d9e3a6SLisandro Dalcin 79116d9e3a6SLisandro Dalcin PetscFunctionBegin; 792251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 79316d9e3a6SLisandro Dalcin if (iascii) { 79416d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG preconditioning\n");CHKERRQ(ierr); 79516d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Cycle type %s\n",HYPREBoomerAMGCycleType[jac->cycletype]);CHKERRQ(ierr); 79616d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Maximum number of levels %d\n",jac->maxlevels);CHKERRQ(ierr); 79716d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Maximum number of iterations PER hypre call %d\n",jac->maxiter);CHKERRQ(ierr); 79857622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Convergence tolerance PER hypre call %g\n",(double)jac->tol);CHKERRQ(ierr); 79957622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Threshold for strong coupling %g\n",(double)jac->strongthreshold);CHKERRQ(ierr); 80057622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Interpolation truncation factor %g\n",(double)jac->truncfactor);CHKERRQ(ierr); 8010f1074feSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Interpolation: max elements per row %d\n",jac->pmax);CHKERRQ(ierr); 8020f1074feSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Number of levels of aggressive coarsening %d\n",jac->agg_nl);CHKERRQ(ierr); 8030f1074feSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Number of paths for aggressive coarsening %d\n",jac->agg_num_paths);CHKERRQ(ierr); 8040f1074feSSatish Balay 80557622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Maximum row sums %g\n",(double)jac->maxrowsum);CHKERRQ(ierr); 80616d9e3a6SLisandro Dalcin 8070f1074feSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Sweeps down %d\n",jac->gridsweeps[0]);CHKERRQ(ierr); 8080f1074feSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Sweeps up %d\n",jac->gridsweeps[1]);CHKERRQ(ierr); 8090f1074feSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Sweeps on coarse %d\n",jac->gridsweeps[2]);CHKERRQ(ierr); 81016d9e3a6SLisandro Dalcin 8110f1074feSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Relax down %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[0]]);CHKERRQ(ierr); 8120f1074feSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Relax up %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[1]]);CHKERRQ(ierr); 8130f1074feSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Relax on coarse %s\n",HYPREBoomerAMGRelaxType[jac->relaxtype[2]]);CHKERRQ(ierr); 81416d9e3a6SLisandro Dalcin 81557622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Relax weight (all) %g\n",(double)jac->relaxweight);CHKERRQ(ierr); 81657622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Outer relax weight (all) %g\n",(double)jac->outerrelaxweight);CHKERRQ(ierr); 81716d9e3a6SLisandro Dalcin 81816d9e3a6SLisandro Dalcin if (jac->relaxorder) { 81916d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Using CF-relaxation\n");CHKERRQ(ierr); 82016d9e3a6SLisandro Dalcin } else { 82116d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Not using CF-relaxation\n");CHKERRQ(ierr); 82216d9e3a6SLisandro Dalcin } 8236a251517SEike Mueller if (jac->smoothtype!=-1) { 8246a251517SEike Mueller ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Smooth type %s\n",HYPREBoomerAMGSmoothType[jac->smoothtype]);CHKERRQ(ierr); 8258131ecf7SEike Mueller ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Smooth num levels %d\n",jac->smoothnumlevels);CHKERRQ(ierr); 8267e352d70SEike Mueller } else { 827c2bc9be0SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Not using more complex smoothers.\n");CHKERRQ(ierr); 8281810e44eSEike Mueller } 8291810e44eSEike Mueller if (jac->smoothtype==3) { 8301810e44eSEike Mueller ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Euclid ILU(k) levels %d\n",jac->eu_level);CHKERRQ(ierr); 8311810e44eSEike Mueller ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Euclid ILU(k) drop tolerance %g\n",jac->eu_droptolerance);CHKERRQ(ierr); 8321810e44eSEike Mueller ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Euclid ILU use Block-Jacobi? %d\n",jac->eu_bj);CHKERRQ(ierr); 8336a251517SEike Mueller } 83416d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Measure type %s\n",HYPREBoomerAMGMeasureType[jac->measuretype]);CHKERRQ(ierr); 83516d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Coarsen type %s\n",HYPREBoomerAMGCoarsenType[jac->coarsentype]);CHKERRQ(ierr); 8360f1074feSSatish Balay ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Interpolation type %s\n",HYPREBoomerAMGInterpType[jac->interptype]);CHKERRQ(ierr); 8375272c319SBarry Smith if (jac->nodal_coarsening) { 8385272c319SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Using nodal coarsening (with HYPRE_BOOMERAMGSetNodal() %D\n",jac->nodal_coarsening);CHKERRQ(ierr); 8395272c319SBarry Smith } 8405272c319SBarry Smith if (jac->vec_interp_variant) { 8415272c319SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: HYPRE_BoomerAMGSetInterpVecVariant() %D\n",jac->vec_interp_variant);CHKERRQ(ierr); 8428f87f92bSBarry Smith } 8438f87f92bSBarry Smith if (jac->nodal_relax) { 8448f87f92bSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE BoomerAMG: Using nodal relaxation via Schwarz smoothing on levels %d\n",jac->nodal_relax_levels);CHKERRQ(ierr); 8458f87f92bSBarry Smith } 84616d9e3a6SLisandro Dalcin } 84716d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 84816d9e3a6SLisandro Dalcin } 84916d9e3a6SLisandro Dalcin 85016d9e3a6SLisandro Dalcin /* --------------------------------------------------------------------------------------------*/ 85116d9e3a6SLisandro Dalcin #undef __FUNCT__ 85216d9e3a6SLisandro Dalcin #define __FUNCT__ "PCSetFromOptions_HYPRE_ParaSails" 8534416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_ParaSails(PetscOptionItems *PetscOptionsObject,PC pc) 85416d9e3a6SLisandro Dalcin { 85516d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 85616d9e3a6SLisandro Dalcin PetscErrorCode ierr; 8574ddd07fcSJed Brown PetscInt indx; 858ace3abfcSBarry Smith PetscBool flag; 85916d9e3a6SLisandro Dalcin const char *symtlist[] = {"nonsymmetric","SPD","nonsymmetric,SPD"}; 86016d9e3a6SLisandro Dalcin 86116d9e3a6SLisandro Dalcin PetscFunctionBegin; 862e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE ParaSails Options");CHKERRQ(ierr); 86316d9e3a6SLisandro Dalcin ierr = PetscOptionsInt("-pc_hypre_parasails_nlevels","Number of number of levels","None",jac->nlevels,&jac->nlevels,0);CHKERRQ(ierr); 86416d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_parasails_thresh","Threshold","None",jac->threshhold,&jac->threshhold,&flag);CHKERRQ(ierr); 8652fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetParams,(jac->hsolver,jac->threshhold,jac->nlevels)); 86616d9e3a6SLisandro Dalcin 86716d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_parasails_filter","filter","None",jac->filter,&jac->filter,&flag);CHKERRQ(ierr); 8682fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetFilter,(jac->hsolver,jac->filter)); 86916d9e3a6SLisandro Dalcin 87016d9e3a6SLisandro Dalcin ierr = PetscOptionsReal("-pc_hypre_parasails_loadbal","Load balance","None",jac->loadbal,&jac->loadbal,&flag);CHKERRQ(ierr); 8712fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetLoadbal,(jac->hsolver,jac->loadbal)); 87216d9e3a6SLisandro Dalcin 873acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_parasails_logging","Print info to screen","None",(PetscBool)jac->logging,(PetscBool*)&jac->logging,&flag);CHKERRQ(ierr); 8742fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetLogging,(jac->hsolver,jac->logging)); 87516d9e3a6SLisandro Dalcin 876acfcf0e5SJed Brown ierr = PetscOptionsBool("-pc_hypre_parasails_reuse","Reuse nonzero pattern in preconditioner","None",(PetscBool)jac->ruse,(PetscBool*)&jac->ruse,&flag);CHKERRQ(ierr); 8772fa5cd67SKarl Rupp if (flag) PetscStackCallStandard(HYPRE_ParaSailsSetReuse,(jac->hsolver,jac->ruse)); 87816d9e3a6SLisandro Dalcin 879a669f990SJed Brown ierr = PetscOptionsEList("-pc_hypre_parasails_sym","Symmetry of matrix and preconditioner","None",symtlist,ALEN(symtlist),symtlist[0],&indx,&flag);CHKERRQ(ierr); 88016d9e3a6SLisandro Dalcin if (flag) { 88116d9e3a6SLisandro Dalcin jac->symt = indx; 882fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetSym,(jac->hsolver,jac->symt)); 88316d9e3a6SLisandro Dalcin } 88416d9e3a6SLisandro Dalcin 88516d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 88616d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 88716d9e3a6SLisandro Dalcin } 88816d9e3a6SLisandro Dalcin 88916d9e3a6SLisandro Dalcin #undef __FUNCT__ 89016d9e3a6SLisandro Dalcin #define __FUNCT__ "PCView_HYPRE_ParaSails" 89116d9e3a6SLisandro Dalcin static PetscErrorCode PCView_HYPRE_ParaSails(PC pc,PetscViewer viewer) 89216d9e3a6SLisandro Dalcin { 89316d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 89416d9e3a6SLisandro Dalcin PetscErrorCode ierr; 895ace3abfcSBarry Smith PetscBool iascii; 89616d9e3a6SLisandro Dalcin const char *symt = 0;; 89716d9e3a6SLisandro Dalcin 89816d9e3a6SLisandro Dalcin PetscFunctionBegin; 899251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 90016d9e3a6SLisandro Dalcin if (iascii) { 90116d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE ParaSails preconditioning\n");CHKERRQ(ierr); 90216d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE ParaSails: nlevels %d\n",jac->nlevels);CHKERRQ(ierr); 90357622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE ParaSails: threshold %g\n",(double)jac->threshhold);CHKERRQ(ierr); 90457622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE ParaSails: filter %g\n",(double)jac->filter);CHKERRQ(ierr); 90557622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE ParaSails: load balance %g\n",(double)jac->loadbal);CHKERRQ(ierr); 906ace3abfcSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE ParaSails: reuse nonzero structure %s\n",PetscBools[jac->ruse]);CHKERRQ(ierr); 907ace3abfcSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE ParaSails: print info to screen %s\n",PetscBools[jac->logging]);CHKERRQ(ierr); 9082fa5cd67SKarl Rupp if (!jac->symt) symt = "nonsymmetric matrix and preconditioner"; 9092fa5cd67SKarl Rupp else if (jac->symt == 1) symt = "SPD matrix and preconditioner"; 9102fa5cd67SKarl Rupp else if (jac->symt == 2) symt = "nonsymmetric matrix but SPD preconditioner"; 911ce94432eSBarry Smith else SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_WRONG,"Unknown HYPRE ParaSails symmetric option %d",jac->symt); 91216d9e3a6SLisandro Dalcin ierr = PetscViewerASCIIPrintf(viewer," HYPRE ParaSails: %s\n",symt);CHKERRQ(ierr); 91316d9e3a6SLisandro Dalcin } 91416d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 91516d9e3a6SLisandro Dalcin } 9164cb006feSStefano Zampini /* --------------------------------------------------------------------------------------------*/ 9174cb006feSStefano Zampini #undef __FUNCT__ 9184cb006feSStefano Zampini #define __FUNCT__ "PCSetFromOptions_HYPRE_AMS" 9194416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_AMS(PetscOptionItems *PetscOptionsObject,PC pc) 9204cb006feSStefano Zampini { 9214cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 9224cb006feSStefano Zampini PetscErrorCode ierr; 9234cb006feSStefano Zampini PetscInt n; 9244cb006feSStefano Zampini PetscBool flag,flag2,flag3,flag4; 9254cb006feSStefano Zampini 9264cb006feSStefano Zampini PetscFunctionBegin; 9279fa463a7SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE AMS Options");CHKERRQ(ierr); 928863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ams_print_level","Debugging output level for AMS","None",jac->as_print,&jac->as_print,&flag);CHKERRQ(ierr); 929863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetPrintLevel,(jac->hsolver,jac->as_print)); 930863406b8SStefano 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); 931863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 9324cb006feSStefano 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); 9334cb006feSStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 934863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ams_tol","Error tolerance for AMS multigrid","None",jac->as_tol,&jac->as_tol,&flag);CHKERRQ(ierr); 935863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_AMSSetTol,(jac->hsolver,jac->as_tol)); 936863406b8SStefano 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); 937863406b8SStefano 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); 938863406b8SStefano 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); 939863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ams_omega","SSOR coefficient for AMS smoother","None",jac->as_omega,&jac->as_omega,&flag4);CHKERRQ(ierr); 9404cb006feSStefano Zampini if (flag || flag2 || flag3 || flag4) { 941863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 942863406b8SStefano Zampini jac->as_relax_times, 943863406b8SStefano Zampini jac->as_relax_weight, 944863406b8SStefano Zampini jac->as_omega)); 9454cb006feSStefano Zampini } 946863406b8SStefano 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); 9474cb006feSStefano Zampini n = 5; 948863406b8SStefano Zampini ierr = PetscOptionsIntArray("-pc_hypre_ams_amg_alpha_options","AMG options for vector Poisson","None",jac->as_amg_alpha_opts,&n,&flag2);CHKERRQ(ierr); 9494cb006feSStefano Zampini if (flag || flag2) { 950863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaAMGOptions,(jac->hsolver,jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 951863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 952863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 953863406b8SStefano Zampini jac->as_amg_alpha_theta, 954863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 955863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 9564cb006feSStefano Zampini } 957863406b8SStefano 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); 9584cb006feSStefano Zampini n = 5; 959863406b8SStefano 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); 9604cb006feSStefano Zampini if (flag || flag2) { 961863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 962863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 963863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 964863406b8SStefano Zampini jac->as_amg_beta_theta, 965863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 966863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 9674cb006feSStefano Zampini } 96823df4f25SStefano 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); 96923df4f25SStefano Zampini if (flag) { /* override HYPRE's default only if the options is used */ 97023df4f25SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetProjectionFrequency,(jac->hsolver,jac->ams_proj_freq)); 97123df4f25SStefano Zampini } 9724cb006feSStefano Zampini ierr = PetscOptionsTail();CHKERRQ(ierr); 9734cb006feSStefano Zampini PetscFunctionReturn(0); 9744cb006feSStefano Zampini } 9754cb006feSStefano Zampini 9764cb006feSStefano Zampini #undef __FUNCT__ 9774cb006feSStefano Zampini #define __FUNCT__ "PCView_HYPRE_AMS" 9784cb006feSStefano Zampini static PetscErrorCode PCView_HYPRE_AMS(PC pc,PetscViewer viewer) 9794cb006feSStefano Zampini { 9804cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 9814cb006feSStefano Zampini PetscErrorCode ierr; 9824cb006feSStefano Zampini PetscBool iascii; 9834cb006feSStefano Zampini 9844cb006feSStefano Zampini PetscFunctionBegin; 9854cb006feSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 9864cb006feSStefano Zampini if (iascii) { 9874cb006feSStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS preconditioning\n");CHKERRQ(ierr); 988863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: subspace iterations per application %d\n",jac->as_max_iter);CHKERRQ(ierr); 9894cb006feSStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: subspace cycle type %d\n",jac->ams_cycle_type);CHKERRQ(ierr); 990863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: subspace iteration tolerance %g\n",jac->as_tol);CHKERRQ(ierr); 991863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: smoother type %d\n",jac->as_relax_type);CHKERRQ(ierr); 992863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: number of smoothing steps %d\n",jac->as_relax_times);CHKERRQ(ierr); 993863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: smoother weight %g\n",jac->as_relax_weight);CHKERRQ(ierr); 994863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: smoother omega %g\n",jac->as_omega);CHKERRQ(ierr); 9954cb006feSStefano Zampini if (jac->alpha_Poisson) { 9964cb006feSStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: vector Poisson solver (passed in by user)\n");CHKERRQ(ierr); 9974cb006feSStefano Zampini } else { 9984cb006feSStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: vector Poisson solver (computed) \n");CHKERRQ(ierr); 9994cb006feSStefano Zampini } 1000863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG coarsening type %d\n",jac->as_amg_alpha_opts[0]);CHKERRQ(ierr); 1001863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG levels of aggressive coarsening %d\n",jac->as_amg_alpha_opts[1]);CHKERRQ(ierr); 1002863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG relaxation type %d\n",jac->as_amg_alpha_opts[2]);CHKERRQ(ierr); 1003863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG interpolation type %d\n",jac->as_amg_alpha_opts[3]);CHKERRQ(ierr); 1004863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG max nonzero elements in interpolation rows %d\n",jac->as_amg_alpha_opts[4]);CHKERRQ(ierr); 1005863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG strength threshold %g\n",jac->as_amg_alpha_theta);CHKERRQ(ierr); 10064cb006feSStefano Zampini if (!jac->ams_beta_is_zero) { 10074cb006feSStefano Zampini if (jac->beta_Poisson) { 10084cb006feSStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: scalar Poisson solver (passed in by user)\n");CHKERRQ(ierr); 10094cb006feSStefano Zampini } else { 10104cb006feSStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: scalar Poisson solver (computed) \n");CHKERRQ(ierr); 10114cb006feSStefano Zampini } 1012863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG coarsening type %d\n",jac->as_amg_beta_opts[0]);CHKERRQ(ierr); 1013863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG levels of aggressive coarsening %d\n",jac->as_amg_beta_opts[1]);CHKERRQ(ierr); 1014863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG relaxation type %d\n",jac->as_amg_beta_opts[2]);CHKERRQ(ierr); 1015863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG interpolation type %d\n",jac->as_amg_beta_opts[3]);CHKERRQ(ierr); 1016863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG max nonzero elements in interpolation rows %d\n",jac->as_amg_beta_opts[4]);CHKERRQ(ierr); 1017863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: boomerAMG strength threshold %g\n",jac->as_amg_beta_theta);CHKERRQ(ierr); 101823df4f25SStefano Zampini if (jac->ams_beta_is_zero_part) { 101923df4f25SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: compatible subspace projection frequency %d (-1 HYPRE uses default)\n",jac->ams_proj_freq);CHKERRQ(ierr); 102023df4f25SStefano Zampini } 102123df4f25SStefano Zampini } else { 102223df4f25SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE AMS: scalar Poisson solver not used (zero-conductivity everywhere) \n");CHKERRQ(ierr); 10234cb006feSStefano Zampini } 10244cb006feSStefano Zampini } 10254cb006feSStefano Zampini PetscFunctionReturn(0); 10264cb006feSStefano Zampini } 10274cb006feSStefano Zampini 10284cb006feSStefano Zampini #undef __FUNCT__ 1029863406b8SStefano Zampini #define __FUNCT__ "PCSetFromOptions_HYPRE_ADS" 10304416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE_ADS(PetscOptionItems *PetscOptionsObject,PC pc) 1031863406b8SStefano Zampini { 1032863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1033863406b8SStefano Zampini PetscErrorCode ierr; 1034863406b8SStefano Zampini PetscInt n; 1035863406b8SStefano Zampini PetscBool flag,flag2,flag3,flag4; 1036863406b8SStefano Zampini 1037863406b8SStefano Zampini PetscFunctionBegin; 1038863406b8SStefano Zampini ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE ADS Options");CHKERRQ(ierr); 1039863406b8SStefano Zampini ierr = PetscOptionsInt("-pc_hypre_ads_print_level","Debugging output level for ADS","None",jac->as_print,&jac->as_print,&flag);CHKERRQ(ierr); 1040863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetPrintLevel,(jac->hsolver,jac->as_print)); 1041863406b8SStefano 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); 1042863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 1043863406b8SStefano 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); 1044863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetCycleType,(jac->hsolver,jac->ads_cycle_type)); 1045863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ads_tol","Error tolerance for ADS multigrid","None",jac->as_tol,&jac->as_tol,&flag);CHKERRQ(ierr); 1046863406b8SStefano Zampini if (flag) PetscStackCallStandard(HYPRE_ADSSetTol,(jac->hsolver,jac->as_tol)); 1047863406b8SStefano 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); 1048863406b8SStefano 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); 1049863406b8SStefano 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); 1050863406b8SStefano Zampini ierr = PetscOptionsReal("-pc_hypre_ads_omega","SSOR coefficient for ADS smoother","None",jac->as_omega,&jac->as_omega,&flag4);CHKERRQ(ierr); 1051863406b8SStefano Zampini if (flag || flag2 || flag3 || flag4) { 1052863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1053863406b8SStefano Zampini jac->as_relax_times, 1054863406b8SStefano Zampini jac->as_relax_weight, 1055863406b8SStefano Zampini jac->as_omega)); 1056863406b8SStefano Zampini } 1057863406b8SStefano 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); 1058863406b8SStefano Zampini n = 5; 1059863406b8SStefano 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); 1060863406b8SStefano 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); 1061863406b8SStefano Zampini if (flag || flag2 || flag3) { 1062863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMSOptions,(jac->hsolver,jac->ams_cycle_type, /* AMS cycle type */ 1063863406b8SStefano Zampini jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1064863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1065863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1066863406b8SStefano Zampini jac->as_amg_alpha_theta, 1067863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1068863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 1069863406b8SStefano Zampini } 1070863406b8SStefano 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); 1071863406b8SStefano Zampini n = 5; 1072863406b8SStefano 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); 1073863406b8SStefano Zampini if (flag || flag2) { 1074863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1075863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1076863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1077863406b8SStefano Zampini jac->as_amg_beta_theta, 1078863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1079863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 1080863406b8SStefano Zampini } 1081863406b8SStefano Zampini ierr = PetscOptionsTail();CHKERRQ(ierr); 1082863406b8SStefano Zampini PetscFunctionReturn(0); 1083863406b8SStefano Zampini } 1084863406b8SStefano Zampini 1085863406b8SStefano Zampini #undef __FUNCT__ 1086863406b8SStefano Zampini #define __FUNCT__ "PCView_HYPRE_ADS" 1087863406b8SStefano Zampini static PetscErrorCode PCView_HYPRE_ADS(PC pc,PetscViewer viewer) 1088863406b8SStefano Zampini { 1089863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1090863406b8SStefano Zampini PetscErrorCode ierr; 1091863406b8SStefano Zampini PetscBool iascii; 1092863406b8SStefano Zampini 1093863406b8SStefano Zampini PetscFunctionBegin; 1094863406b8SStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1095863406b8SStefano Zampini if (iascii) { 1096863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS preconditioning\n");CHKERRQ(ierr); 1097863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: subspace iterations per application %d\n",jac->as_max_iter);CHKERRQ(ierr); 1098863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: subspace cycle type %d\n",jac->ads_cycle_type);CHKERRQ(ierr); 1099863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: subspace iteration tolerance %g\n",jac->as_tol);CHKERRQ(ierr); 1100863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: smoother type %d\n",jac->as_relax_type);CHKERRQ(ierr); 1101863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: number of smoothing steps %d\n",jac->as_relax_times);CHKERRQ(ierr); 1102863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: smoother weight %g\n",jac->as_relax_weight);CHKERRQ(ierr); 1103863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: smoother omega %g\n",jac->as_omega);CHKERRQ(ierr); 1104863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: AMS solver\n");CHKERRQ(ierr); 1105863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: subspace cycle type %d\n",jac->ams_cycle_type);CHKERRQ(ierr); 1106863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG coarsening type %d\n",jac->as_amg_alpha_opts[0]);CHKERRQ(ierr); 1107863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG levels of aggressive coarsening %d\n",jac->as_amg_alpha_opts[1]);CHKERRQ(ierr); 1108863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG relaxation type %d\n",jac->as_amg_alpha_opts[2]);CHKERRQ(ierr); 1109863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG interpolation type %d\n",jac->as_amg_alpha_opts[3]);CHKERRQ(ierr); 1110863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG max nonzero elements in interpolation rows %d\n",jac->as_amg_alpha_opts[4]);CHKERRQ(ierr); 1111863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG strength threshold %g\n",jac->as_amg_alpha_theta);CHKERRQ(ierr); 1112863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: vector Poisson solver\n");CHKERRQ(ierr); 1113863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG coarsening type %d\n",jac->as_amg_beta_opts[0]);CHKERRQ(ierr); 1114863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG levels of aggressive coarsening %d\n",jac->as_amg_beta_opts[1]);CHKERRQ(ierr); 1115863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG relaxation type %d\n",jac->as_amg_beta_opts[2]);CHKERRQ(ierr); 1116863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG interpolation type %d\n",jac->as_amg_beta_opts[3]);CHKERRQ(ierr); 1117863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG max nonzero elements in interpolation rows %d\n",jac->as_amg_beta_opts[4]);CHKERRQ(ierr); 1118863406b8SStefano Zampini ierr = PetscViewerASCIIPrintf(viewer," HYPRE ADS: boomerAMG strength threshold %g\n",jac->as_amg_beta_theta);CHKERRQ(ierr); 1119863406b8SStefano Zampini } 1120863406b8SStefano Zampini PetscFunctionReturn(0); 1121863406b8SStefano Zampini } 1122863406b8SStefano Zampini 1123863406b8SStefano Zampini #undef __FUNCT__ 1124863406b8SStefano Zampini #define __FUNCT__ "PCHYPRESetDiscreteGradient_HYPRE" 1125863406b8SStefano Zampini static PetscErrorCode PCHYPRESetDiscreteGradient_HYPRE(PC pc, Mat G) 11264cb006feSStefano Zampini { 11274cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1128*5ac14e1cSStefano Zampini PetscBool ishypre; 11294cb006feSStefano Zampini PetscErrorCode ierr; 11304cb006feSStefano Zampini 11314cb006feSStefano Zampini PetscFunctionBegin; 1132*5ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)G,MATHYPRE,&ishypre);CHKERRQ(ierr); 1133*5ac14e1cSStefano Zampini if (ishypre) { 1134*5ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)G);CHKERRQ(ierr); 1135*5ac14e1cSStefano Zampini ierr = MatDestroy(&jac->G);CHKERRQ(ierr); 1136*5ac14e1cSStefano Zampini jac->G = G; 1137*5ac14e1cSStefano Zampini } else { 1138*5ac14e1cSStefano Zampini MatReuse reuse = MAT_INITIAL_MATRIX; 1139*5ac14e1cSStefano Zampini if (jac->G) reuse = MAT_REUSE_MATRIX; 1140*5ac14e1cSStefano Zampini ierr = MatConvert(G,MATHYPRE,reuse,&jac->G);CHKERRQ(ierr); 1141*5ac14e1cSStefano Zampini } 11424cb006feSStefano Zampini PetscFunctionReturn(0); 11434cb006feSStefano Zampini } 11444cb006feSStefano Zampini 11454cb006feSStefano Zampini #undef __FUNCT__ 11464cb006feSStefano Zampini #define __FUNCT__ "PCHYPRESetDiscreteGradient" 11474cb006feSStefano Zampini /*@ 11484cb006feSStefano Zampini PCHYPRESetDiscreteGradient - Set discrete gradient matrix 11494cb006feSStefano Zampini 11504cb006feSStefano Zampini Collective on PC 11514cb006feSStefano Zampini 11524cb006feSStefano Zampini Input Parameters: 11534cb006feSStefano Zampini + pc - the preconditioning context 11544cb006feSStefano Zampini - G - the discrete gradient 11554cb006feSStefano Zampini 11564cb006feSStefano Zampini Level: intermediate 11574cb006feSStefano Zampini 11584cb006feSStefano Zampini Notes: G should have as many rows as the number of edges and as many columns as the number of vertices in the mesh 1159863406b8SStefano 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 11604cb006feSStefano Zampini 11614cb006feSStefano Zampini .seealso: 11624cb006feSStefano Zampini @*/ 11634cb006feSStefano Zampini PetscErrorCode PCHYPRESetDiscreteGradient(PC pc, Mat G) 11644cb006feSStefano Zampini { 11654cb006feSStefano Zampini PetscErrorCode ierr; 11664cb006feSStefano Zampini 11674cb006feSStefano Zampini PetscFunctionBegin; 11684cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 11694cb006feSStefano Zampini PetscValidHeaderSpecific(G,MAT_CLASSID,2); 11704cb006feSStefano Zampini PetscCheckSameComm(pc,1,G,2); 11714cb006feSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetDiscreteGradient_C",(PC,Mat),(pc,G));CHKERRQ(ierr); 11724cb006feSStefano Zampini PetscFunctionReturn(0); 11734cb006feSStefano Zampini } 11744cb006feSStefano Zampini 11754cb006feSStefano Zampini #undef __FUNCT__ 1176863406b8SStefano Zampini #define __FUNCT__ "PCHYPRESetDiscreteCurl_HYPRE" 1177863406b8SStefano Zampini static PetscErrorCode PCHYPRESetDiscreteCurl_HYPRE(PC pc, Mat C) 1178863406b8SStefano Zampini { 1179863406b8SStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1180*5ac14e1cSStefano Zampini PetscBool ishypre; 1181863406b8SStefano Zampini PetscErrorCode ierr; 1182863406b8SStefano Zampini 1183863406b8SStefano Zampini PetscFunctionBegin; 1184*5ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)C,MATHYPRE,&ishypre);CHKERRQ(ierr); 1185*5ac14e1cSStefano Zampini if (ishypre) { 1186*5ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)C);CHKERRQ(ierr); 1187*5ac14e1cSStefano Zampini ierr = MatDestroy(&jac->C);CHKERRQ(ierr); 1188*5ac14e1cSStefano Zampini jac->C = C; 1189*5ac14e1cSStefano Zampini } else { 1190*5ac14e1cSStefano Zampini MatReuse reuse = MAT_INITIAL_MATRIX; 1191*5ac14e1cSStefano Zampini if (jac->C) reuse = MAT_REUSE_MATRIX; 1192*5ac14e1cSStefano Zampini ierr = MatConvert(C,MATHYPRE,reuse,&jac->C);CHKERRQ(ierr); 1193*5ac14e1cSStefano Zampini } 1194863406b8SStefano Zampini PetscFunctionReturn(0); 1195863406b8SStefano Zampini } 1196863406b8SStefano Zampini 1197863406b8SStefano Zampini #undef __FUNCT__ 1198863406b8SStefano Zampini #define __FUNCT__ "PCHYPRESetDiscreteCurl" 1199863406b8SStefano Zampini /*@ 1200863406b8SStefano Zampini PCHYPRESetDiscreteCurl - Set discrete curl matrix 1201863406b8SStefano Zampini 1202863406b8SStefano Zampini Collective on PC 1203863406b8SStefano Zampini 1204863406b8SStefano Zampini Input Parameters: 1205863406b8SStefano Zampini + pc - the preconditioning context 1206863406b8SStefano Zampini - C - the discrete curl 1207863406b8SStefano Zampini 1208863406b8SStefano Zampini Level: intermediate 1209863406b8SStefano Zampini 1210863406b8SStefano Zampini Notes: C should have as many rows as the number of faces and as many columns as the number of edges in the mesh 1211863406b8SStefano 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 1212863406b8SStefano Zampini 1213863406b8SStefano Zampini .seealso: 1214863406b8SStefano Zampini @*/ 1215863406b8SStefano Zampini PetscErrorCode PCHYPRESetDiscreteCurl(PC pc, Mat C) 1216863406b8SStefano Zampini { 1217863406b8SStefano Zampini PetscErrorCode ierr; 1218863406b8SStefano Zampini 1219863406b8SStefano Zampini PetscFunctionBegin; 1220863406b8SStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 1221863406b8SStefano Zampini PetscValidHeaderSpecific(C,MAT_CLASSID,2); 1222863406b8SStefano Zampini PetscCheckSameComm(pc,1,C,2); 1223863406b8SStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetDiscreteCurl_C",(PC,Mat),(pc,C));CHKERRQ(ierr); 1224863406b8SStefano Zampini PetscFunctionReturn(0); 1225863406b8SStefano Zampini } 1226863406b8SStefano Zampini 1227863406b8SStefano Zampini #undef __FUNCT__ 1228*5ac14e1cSStefano Zampini #define __FUNCT__ "PCHYPRESetPoissonMatrix_HYPRE" 1229*5ac14e1cSStefano Zampini static PetscErrorCode PCHYPRESetPoissonMatrix_HYPRE(PC pc, Mat A, PetscBool isalpha) 12304cb006feSStefano Zampini { 12314cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 1232*5ac14e1cSStefano Zampini PetscBool ishypre; 12334cb006feSStefano Zampini PetscErrorCode ierr; 12344cb006feSStefano Zampini 12354cb006feSStefano Zampini PetscFunctionBegin; 1236*5ac14e1cSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)A,MATHYPRE,&ishypre);CHKERRQ(ierr); 1237*5ac14e1cSStefano Zampini if (ishypre) { 1238*5ac14e1cSStefano Zampini if (isalpha) { 1239*5ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 1240*5ac14e1cSStefano Zampini ierr = MatDestroy(&jac->alpha_Poisson);CHKERRQ(ierr); 1241*5ac14e1cSStefano Zampini jac->alpha_Poisson = A; 1242*5ac14e1cSStefano Zampini } else { 1243*5ac14e1cSStefano Zampini if (A) { 1244*5ac14e1cSStefano Zampini ierr = PetscObjectReference((PetscObject)A);CHKERRQ(ierr); 1245*5ac14e1cSStefano Zampini } else { 1246*5ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_TRUE; 1247*5ac14e1cSStefano Zampini } 1248*5ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 1249*5ac14e1cSStefano Zampini jac->beta_Poisson = A; 1250*5ac14e1cSStefano Zampini } 1251*5ac14e1cSStefano Zampini } else { 1252*5ac14e1cSStefano Zampini if (isalpha) { 1253*5ac14e1cSStefano Zampini MatReuse reuse = MAT_INITIAL_MATRIX; 1254*5ac14e1cSStefano Zampini if (jac->alpha_Poisson) reuse = MAT_REUSE_MATRIX; 1255*5ac14e1cSStefano Zampini ierr = MatConvert(A,MATHYPRE,reuse,&jac->alpha_Poisson);CHKERRQ(ierr); 1256*5ac14e1cSStefano Zampini } else { 1257*5ac14e1cSStefano Zampini if (A) { 1258*5ac14e1cSStefano Zampini MatReuse reuse = MAT_INITIAL_MATRIX; 1259*5ac14e1cSStefano Zampini if (jac->beta_Poisson) reuse = MAT_REUSE_MATRIX; 1260*5ac14e1cSStefano Zampini ierr = MatConvert(A,MATHYPRE,reuse,&jac->beta_Poisson);CHKERRQ(ierr); 1261*5ac14e1cSStefano Zampini } else { 1262*5ac14e1cSStefano Zampini ierr = MatDestroy(&jac->beta_Poisson);CHKERRQ(ierr); 1263*5ac14e1cSStefano Zampini jac->ams_beta_is_zero = PETSC_TRUE; 1264*5ac14e1cSStefano Zampini } 1265*5ac14e1cSStefano Zampini } 1266*5ac14e1cSStefano Zampini } 12674cb006feSStefano Zampini PetscFunctionReturn(0); 12684cb006feSStefano Zampini } 12694cb006feSStefano Zampini 12704cb006feSStefano Zampini #undef __FUNCT__ 12714cb006feSStefano Zampini #define __FUNCT__ "PCHYPRESetAlphaPoissonMatrix" 12724cb006feSStefano Zampini /*@ 12734cb006feSStefano Zampini PCHYPRESetAlphaPoissonMatrix - Set vector Poisson matrix 12744cb006feSStefano Zampini 12754cb006feSStefano Zampini Collective on PC 12764cb006feSStefano Zampini 12774cb006feSStefano Zampini Input Parameters: 12784cb006feSStefano Zampini + pc - the preconditioning context 12794cb006feSStefano Zampini - A - the matrix 12804cb006feSStefano Zampini 12814cb006feSStefano Zampini Level: intermediate 12824cb006feSStefano Zampini 12834cb006feSStefano Zampini Notes: A should be obtained by discretizing the vector valued Poisson problem with linear finite elements 12844cb006feSStefano Zampini 12854cb006feSStefano Zampini .seealso: 12864cb006feSStefano Zampini @*/ 12874cb006feSStefano Zampini PetscErrorCode PCHYPRESetAlphaPoissonMatrix(PC pc, Mat A) 12884cb006feSStefano Zampini { 12894cb006feSStefano Zampini PetscErrorCode ierr; 12904cb006feSStefano Zampini 12914cb006feSStefano Zampini PetscFunctionBegin; 12924cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 12934cb006feSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,2); 12944cb006feSStefano Zampini PetscCheckSameComm(pc,1,A,2); 1295*5ac14e1cSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetPoissonMatrix_C",(PC,Mat,PetscBool),(pc,A,PETSC_TRUE));CHKERRQ(ierr); 12964cb006feSStefano Zampini PetscFunctionReturn(0); 12974cb006feSStefano Zampini } 12984cb006feSStefano Zampini 12994cb006feSStefano Zampini #undef __FUNCT__ 13004cb006feSStefano Zampini #define __FUNCT__ "PCHYPRESetBetaPoissonMatrix" 13014cb006feSStefano Zampini /*@ 13024cb006feSStefano Zampini PCHYPRESetBetaPoissonMatrix - Set Poisson matrix 13034cb006feSStefano Zampini 13044cb006feSStefano Zampini Collective on PC 13054cb006feSStefano Zampini 13064cb006feSStefano Zampini Input Parameters: 13074cb006feSStefano Zampini + pc - the preconditioning context 13084cb006feSStefano Zampini - A - the matrix 13094cb006feSStefano Zampini 13104cb006feSStefano Zampini Level: intermediate 13114cb006feSStefano Zampini 13124cb006feSStefano Zampini Notes: A should be obtained by discretizing the Poisson problem with linear finite elements. 13134cb006feSStefano Zampini Following HYPRE convention, the scalar Poisson solver of AMS can be turned off by passing NULL. 13144cb006feSStefano Zampini 13154cb006feSStefano Zampini .seealso: 13164cb006feSStefano Zampini @*/ 13174cb006feSStefano Zampini PetscErrorCode PCHYPRESetBetaPoissonMatrix(PC pc, Mat A) 13184cb006feSStefano Zampini { 13194cb006feSStefano Zampini PetscErrorCode ierr; 13204cb006feSStefano Zampini 13214cb006feSStefano Zampini PetscFunctionBegin; 13224cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 13234cb006feSStefano Zampini if (A) { 13244cb006feSStefano Zampini PetscValidHeaderSpecific(A,MAT_CLASSID,2); 13254cb006feSStefano Zampini PetscCheckSameComm(pc,1,A,2); 13264cb006feSStefano Zampini } 1327*5ac14e1cSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetPoissonMatrix_C",(PC,Mat,PetscBool),(pc,A,PETSC_FALSE));CHKERRQ(ierr); 13284cb006feSStefano Zampini PetscFunctionReturn(0); 13294cb006feSStefano Zampini } 13304cb006feSStefano Zampini 13314cb006feSStefano Zampini #undef __FUNCT__ 1332*5ac14e1cSStefano Zampini #define __FUNCT__ "PCHYPRESetEdgeConstantVectors_HYPRE" 1333*5ac14e1cSStefano Zampini static PetscErrorCode PCHYPRESetEdgeConstantVectors_HYPRE(PC pc,Vec ozz, Vec zoz, Vec zzo) 13344cb006feSStefano Zampini { 13354cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 13364cb006feSStefano Zampini PetscErrorCode ierr; 13374cb006feSStefano Zampini 13384cb006feSStefano Zampini PetscFunctionBegin; 13394cb006feSStefano Zampini /* throw away any vector if already set */ 13404cb006feSStefano Zampini if (jac->constants[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[0])); 13414cb006feSStefano Zampini if (jac->constants[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[1])); 13424cb006feSStefano Zampini if (jac->constants[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->constants[2])); 13434cb006feSStefano Zampini jac->constants[0] = NULL; 13444cb006feSStefano Zampini jac->constants[1] = NULL; 13454cb006feSStefano Zampini jac->constants[2] = NULL; 13464cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(ozz,&jac->constants[0]);CHKERRQ(ierr); 13474cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(ozz,jac->constants[0]);CHKERRQ(ierr); 13484cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(zoz,&jac->constants[1]);CHKERRQ(ierr); 13494cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(zoz,jac->constants[1]);CHKERRQ(ierr); 1350*5ac14e1cSStefano Zampini jac->dim = 2; 13514cb006feSStefano Zampini if (zzo) { 13524cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(zzo,&jac->constants[2]);CHKERRQ(ierr); 13534cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCopy(zzo,jac->constants[2]);CHKERRQ(ierr); 1354*5ac14e1cSStefano Zampini jac->dim++; 13554cb006feSStefano Zampini } 13564cb006feSStefano Zampini PetscFunctionReturn(0); 13574cb006feSStefano Zampini } 13584cb006feSStefano Zampini 13594cb006feSStefano Zampini #undef __FUNCT__ 13604cb006feSStefano Zampini #define __FUNCT__ "PCHYPRESetEdgeConstantVectors" 13614cb006feSStefano Zampini /*@ 13624cb006feSStefano Zampini PCHYPRESetEdgeConstantVectors - Set the representation of the constant vector fields in edge element basis 13634cb006feSStefano Zampini 13644cb006feSStefano Zampini Collective on PC 13654cb006feSStefano Zampini 13664cb006feSStefano Zampini Input Parameters: 13674cb006feSStefano Zampini + pc - the preconditioning context 13684cb006feSStefano Zampini - ozz - vector representing (1,0,0) (or (1,0) in 2D) 13694cb006feSStefano Zampini - zoz - vector representing (0,1,0) (or (0,1) in 2D) 13704cb006feSStefano Zampini - zzo - vector representing (0,0,1) (use NULL in 2D) 13714cb006feSStefano Zampini 13724cb006feSStefano Zampini Level: intermediate 13734cb006feSStefano Zampini 13744cb006feSStefano Zampini Notes: 13754cb006feSStefano Zampini 13764cb006feSStefano Zampini .seealso: 13774cb006feSStefano Zampini @*/ 13784cb006feSStefano Zampini PetscErrorCode PCHYPRESetEdgeConstantVectors(PC pc, Vec ozz, Vec zoz, Vec zzo) 13794cb006feSStefano Zampini { 13804cb006feSStefano Zampini PetscErrorCode ierr; 13814cb006feSStefano Zampini 13824cb006feSStefano Zampini PetscFunctionBegin; 13834cb006feSStefano Zampini PetscValidHeaderSpecific(pc,PC_CLASSID,1); 13844cb006feSStefano Zampini PetscValidHeaderSpecific(ozz,VEC_CLASSID,2); 13854cb006feSStefano Zampini PetscValidHeaderSpecific(zoz,VEC_CLASSID,3); 13864cb006feSStefano Zampini if (zzo) PetscValidHeaderSpecific(zzo,VEC_CLASSID,4); 13874cb006feSStefano Zampini PetscCheckSameComm(pc,1,ozz,2); 13884cb006feSStefano Zampini PetscCheckSameComm(pc,1,zoz,3); 13894cb006feSStefano Zampini if (zzo) PetscCheckSameComm(pc,1,zzo,4); 13904cb006feSStefano Zampini ierr = PetscTryMethod(pc,"PCHYPRESetEdgeConstantVectors_C",(PC,Vec,Vec,Vec),(pc,ozz,zoz,zzo));CHKERRQ(ierr); 13914cb006feSStefano Zampini PetscFunctionReturn(0); 13924cb006feSStefano Zampini } 13934cb006feSStefano Zampini 13944cb006feSStefano Zampini #undef __FUNCT__ 1395863406b8SStefano Zampini #define __FUNCT__ "PCSetCoordinates_HYPRE" 1396863406b8SStefano Zampini static PetscErrorCode PCSetCoordinates_HYPRE(PC pc, PetscInt dim, PetscInt nloc, PetscReal *coords) 13974cb006feSStefano Zampini { 13984cb006feSStefano Zampini PC_HYPRE *jac = (PC_HYPRE*)pc->data; 13994cb006feSStefano Zampini Vec tv; 14004cb006feSStefano Zampini PetscInt i; 14014cb006feSStefano Zampini PetscErrorCode ierr; 14024cb006feSStefano Zampini 14034cb006feSStefano Zampini PetscFunctionBegin; 14044cb006feSStefano Zampini /* throw away any coordinate vector if already set */ 14054cb006feSStefano Zampini if (jac->coords[0]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[0])); 14064cb006feSStefano Zampini if (jac->coords[1]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[1])); 14074cb006feSStefano Zampini if (jac->coords[2]) PetscStackCallStandard(HYPRE_IJVectorDestroy,(jac->coords[2])); 1408*5ac14e1cSStefano Zampini jac->dim = dim; 1409*5ac14e1cSStefano Zampini 14104cb006feSStefano Zampini /* compute IJ vector for coordinates */ 14114cb006feSStefano Zampini ierr = VecCreate(PetscObjectComm((PetscObject)pc),&tv);CHKERRQ(ierr); 14124cb006feSStefano Zampini ierr = VecSetType(tv,VECSTANDARD);CHKERRQ(ierr); 14134cb006feSStefano Zampini ierr = VecSetSizes(tv,nloc,PETSC_DECIDE);CHKERRQ(ierr); 14144cb006feSStefano Zampini for (i=0;i<dim;i++) { 14154cb006feSStefano Zampini PetscScalar *array; 14164cb006feSStefano Zampini PetscInt j; 14174cb006feSStefano Zampini 14184cb006feSStefano Zampini ierr = VecHYPRE_IJVectorCreate(tv,&jac->coords[i]);CHKERRQ(ierr); 14194cb006feSStefano Zampini ierr = VecGetArray(tv,&array);CHKERRQ(ierr); 14204cb006feSStefano Zampini for (j=0;j<nloc;j++) { 14214cb006feSStefano Zampini array[j] = coords[j*dim+i]; 14224cb006feSStefano Zampini } 14234cb006feSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorSetValues,(jac->coords[i],nloc,NULL,array)); 14244cb006feSStefano Zampini PetscStackCallStandard(HYPRE_IJVectorAssemble,(jac->coords[i])); 14254cb006feSStefano Zampini ierr = VecRestoreArray(tv,&array);CHKERRQ(ierr); 14264cb006feSStefano Zampini } 14274cb006feSStefano Zampini ierr = VecDestroy(&tv);CHKERRQ(ierr); 14284cb006feSStefano Zampini PetscFunctionReturn(0); 14294cb006feSStefano Zampini } 14304cb006feSStefano Zampini 143116d9e3a6SLisandro Dalcin /* ---------------------------------------------------------------------------------*/ 143216d9e3a6SLisandro Dalcin 143316d9e3a6SLisandro Dalcin #undef __FUNCT__ 143416d9e3a6SLisandro Dalcin #define __FUNCT__ "PCHYPREGetType_HYPRE" 1435f7a08781SBarry Smith static PetscErrorCode PCHYPREGetType_HYPRE(PC pc,const char *name[]) 143616d9e3a6SLisandro Dalcin { 143716d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 143816d9e3a6SLisandro Dalcin 143916d9e3a6SLisandro Dalcin PetscFunctionBegin; 144016d9e3a6SLisandro Dalcin *name = jac->hypre_type; 144116d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 144216d9e3a6SLisandro Dalcin } 144316d9e3a6SLisandro Dalcin 144416d9e3a6SLisandro Dalcin #undef __FUNCT__ 144516d9e3a6SLisandro Dalcin #define __FUNCT__ "PCHYPRESetType_HYPRE" 1446f7a08781SBarry Smith static PetscErrorCode PCHYPRESetType_HYPRE(PC pc,const char name[]) 144716d9e3a6SLisandro Dalcin { 144816d9e3a6SLisandro Dalcin PC_HYPRE *jac = (PC_HYPRE*)pc->data; 144916d9e3a6SLisandro Dalcin PetscErrorCode ierr; 1450ace3abfcSBarry Smith PetscBool flag; 145116d9e3a6SLisandro Dalcin 145216d9e3a6SLisandro Dalcin PetscFunctionBegin; 145316d9e3a6SLisandro Dalcin if (jac->hypre_type) { 145416d9e3a6SLisandro Dalcin ierr = PetscStrcmp(jac->hypre_type,name,&flag);CHKERRQ(ierr); 1455ce94432eSBarry Smith if (!flag) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ORDER,"Cannot reset the HYPRE preconditioner type once it has been set"); 145616d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 145716d9e3a6SLisandro Dalcin } else { 145816d9e3a6SLisandro Dalcin ierr = PetscStrallocpy(name, &jac->hypre_type);CHKERRQ(ierr); 145916d9e3a6SLisandro Dalcin } 146016d9e3a6SLisandro Dalcin 146116d9e3a6SLisandro Dalcin jac->maxiter = PETSC_DEFAULT; 146216d9e3a6SLisandro Dalcin jac->tol = PETSC_DEFAULT; 146316d9e3a6SLisandro Dalcin jac->printstatistics = PetscLogPrintInfo; 146416d9e3a6SLisandro Dalcin 146516d9e3a6SLisandro Dalcin ierr = PetscStrcmp("pilut",jac->hypre_type,&flag);CHKERRQ(ierr); 146616d9e3a6SLisandro Dalcin if (flag) { 1467fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParCSRPilutCreate,(jac->comm_hypre,&jac->hsolver)); 146816d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_Pilut; 146916d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_Pilut; 147016d9e3a6SLisandro Dalcin jac->destroy = HYPRE_ParCSRPilutDestroy; 147116d9e3a6SLisandro Dalcin jac->setup = HYPRE_ParCSRPilutSetup; 147216d9e3a6SLisandro Dalcin jac->solve = HYPRE_ParCSRPilutSolve; 147316d9e3a6SLisandro Dalcin jac->factorrowsize = PETSC_DEFAULT; 147416d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 147516d9e3a6SLisandro Dalcin } 147616d9e3a6SLisandro Dalcin ierr = PetscStrcmp("parasails",jac->hypre_type,&flag);CHKERRQ(ierr); 147716d9e3a6SLisandro Dalcin if (flag) { 1478fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsCreate,(jac->comm_hypre,&jac->hsolver)); 147916d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_ParaSails; 148016d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_ParaSails; 148116d9e3a6SLisandro Dalcin jac->destroy = HYPRE_ParaSailsDestroy; 148216d9e3a6SLisandro Dalcin jac->setup = HYPRE_ParaSailsSetup; 148316d9e3a6SLisandro Dalcin jac->solve = HYPRE_ParaSailsSolve; 148416d9e3a6SLisandro Dalcin /* initialize */ 148516d9e3a6SLisandro Dalcin jac->nlevels = 1; 148616d9e3a6SLisandro Dalcin jac->threshhold = .1; 148716d9e3a6SLisandro Dalcin jac->filter = .1; 148816d9e3a6SLisandro Dalcin jac->loadbal = 0; 14892fa5cd67SKarl Rupp if (PetscLogPrintInfo) jac->logging = (int) PETSC_TRUE; 14902fa5cd67SKarl Rupp else jac->logging = (int) PETSC_FALSE; 14912fa5cd67SKarl Rupp 149216d9e3a6SLisandro Dalcin jac->ruse = (int) PETSC_FALSE; 149316d9e3a6SLisandro Dalcin jac->symt = 0; 1494fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetParams,(jac->hsolver,jac->threshhold,jac->nlevels)); 1495fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetFilter,(jac->hsolver,jac->filter)); 1496fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetLoadbal,(jac->hsolver,jac->loadbal)); 1497fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetLogging,(jac->hsolver,jac->logging)); 1498fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetReuse,(jac->hsolver,jac->ruse)); 1499fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_ParaSailsSetSym,(jac->hsolver,jac->symt)); 150016d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 150116d9e3a6SLisandro Dalcin } 150216d9e3a6SLisandro Dalcin ierr = PetscStrcmp("boomeramg",jac->hypre_type,&flag);CHKERRQ(ierr); 150316d9e3a6SLisandro Dalcin if (flag) { 150416d9e3a6SLisandro Dalcin ierr = HYPRE_BoomerAMGCreate(&jac->hsolver); 150516d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE_BoomerAMG; 150616d9e3a6SLisandro Dalcin pc->ops->view = PCView_HYPRE_BoomerAMG; 150716d9e3a6SLisandro Dalcin pc->ops->applytranspose = PCApplyTranspose_HYPRE_BoomerAMG; 150816d9e3a6SLisandro Dalcin pc->ops->applyrichardson = PCApplyRichardson_HYPRE_BoomerAMG; 150916d9e3a6SLisandro Dalcin jac->destroy = HYPRE_BoomerAMGDestroy; 151016d9e3a6SLisandro Dalcin jac->setup = HYPRE_BoomerAMGSetup; 151116d9e3a6SLisandro Dalcin jac->solve = HYPRE_BoomerAMGSolve; 151216d9e3a6SLisandro Dalcin jac->applyrichardson = PETSC_FALSE; 151316d9e3a6SLisandro Dalcin /* these defaults match the hypre defaults */ 151416d9e3a6SLisandro Dalcin jac->cycletype = 1; 151516d9e3a6SLisandro Dalcin jac->maxlevels = 25; 151616d9e3a6SLisandro Dalcin jac->maxiter = 1; 15178f87f92bSBarry Smith jac->tol = 0.0; /* tolerance of zero indicates use as preconditioner (suppresses convergence errors) */ 151816d9e3a6SLisandro Dalcin jac->truncfactor = 0.0; 151916d9e3a6SLisandro Dalcin jac->strongthreshold = .25; 152016d9e3a6SLisandro Dalcin jac->maxrowsum = .9; 152116d9e3a6SLisandro Dalcin jac->coarsentype = 6; 152216d9e3a6SLisandro Dalcin jac->measuretype = 0; 15230f1074feSSatish Balay jac->gridsweeps[0] = jac->gridsweeps[1] = jac->gridsweeps[2] = 1; 15246a251517SEike Mueller jac->smoothtype = -1; /* Not set by default */ 1525b9eb5777SEike Mueller jac->smoothnumlevels = 25; 15261810e44eSEike Mueller jac->eu_level = 0; 15271810e44eSEike Mueller jac->eu_droptolerance = 0; 15281810e44eSEike Mueller jac->eu_bj = 0; 15298f87f92bSBarry Smith jac->relaxtype[0] = jac->relaxtype[1] = 6; /* Defaults to SYMMETRIC since in PETSc we are using a a PC - most likely with CG */ 15300f1074feSSatish Balay jac->relaxtype[2] = 9; /*G.E. */ 153116d9e3a6SLisandro Dalcin jac->relaxweight = 1.0; 153216d9e3a6SLisandro Dalcin jac->outerrelaxweight = 1.0; 153316d9e3a6SLisandro Dalcin jac->relaxorder = 1; 15340f1074feSSatish Balay jac->interptype = 0; 15350f1074feSSatish Balay jac->agg_nl = 0; 15360f1074feSSatish Balay jac->pmax = 0; 15370f1074feSSatish Balay jac->truncfactor = 0.0; 15380f1074feSSatish Balay jac->agg_num_paths = 1; 15398f87f92bSBarry Smith 15408f87f92bSBarry Smith jac->nodal_coarsen = 0; 15418f87f92bSBarry Smith jac->nodal_relax = PETSC_FALSE; 15428f87f92bSBarry Smith jac->nodal_relax_levels = 1; 1543fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCycleType,(jac->hsolver,jac->cycletype)); 1544fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxLevels,(jac->hsolver,jac->maxlevels)); 1545fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxIter,(jac->hsolver,jac->maxiter)); 1546fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTol,(jac->hsolver,jac->tol)); 1547fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetTruncFactor,(jac->hsolver,jac->truncfactor)); 1548fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetStrongThreshold,(jac->hsolver,jac->strongthreshold)); 1549fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMaxRowSum,(jac->hsolver,jac->maxrowsum)); 1550fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetCoarsenType,(jac->hsolver,jac->coarsentype)); 1551fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetMeasureType,(jac->hsolver,jac->measuretype)); 1552fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxOrder,(jac->hsolver, jac->relaxorder)); 1553fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetInterpType,(jac->hsolver,jac->interptype)); 1554fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetAggNumLevels,(jac->hsolver,jac->agg_nl)); 1555fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetPMaxElmts,(jac->hsolver,jac->pmax)); 1556fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumPaths,(jac->hsolver,jac->agg_num_paths)); 1557fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetRelaxType,(jac->hsolver, jac->relaxtype[0])); /*defaults coarse to 9*/ 1558fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_BoomerAMGSetNumSweeps,(jac->hsolver, jac->gridsweeps[0])); /*defaults coarse to 1 */ 155916d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 156016d9e3a6SLisandro Dalcin } 15614cb006feSStefano Zampini ierr = PetscStrcmp("ams",jac->hypre_type,&flag);CHKERRQ(ierr); 15624cb006feSStefano Zampini if (flag) { 15634cb006feSStefano Zampini ierr = HYPRE_AMSCreate(&jac->hsolver); 15644cb006feSStefano Zampini pc->ops->setfromoptions = PCSetFromOptions_HYPRE_AMS; 15654cb006feSStefano Zampini pc->ops->view = PCView_HYPRE_AMS; 15664cb006feSStefano Zampini jac->destroy = HYPRE_AMSDestroy; 15674cb006feSStefano Zampini jac->setup = HYPRE_AMSSetup; 15684cb006feSStefano Zampini jac->solve = HYPRE_AMSSolve; 15694cb006feSStefano Zampini jac->coords[0] = NULL; 15704cb006feSStefano Zampini jac->coords[1] = NULL; 15714cb006feSStefano Zampini jac->coords[2] = NULL; 15724cb006feSStefano Zampini /* solver parameters: these are borrowed from mfem package, and they are not the default values from HYPRE AMS */ 1573863406b8SStefano Zampini jac->as_print = 0; 1574863406b8SStefano Zampini jac->as_max_iter = 1; /* used as a preconditioner */ 1575863406b8SStefano Zampini jac->as_tol = 0.; /* used as a preconditioner */ 15764cb006feSStefano Zampini jac->ams_cycle_type = 13; 15774cb006feSStefano Zampini /* Smoothing options */ 1578863406b8SStefano Zampini jac->as_relax_type = 2; 1579863406b8SStefano Zampini jac->as_relax_times = 1; 1580863406b8SStefano Zampini jac->as_relax_weight = 1.0; 1581863406b8SStefano Zampini jac->as_omega = 1.0; 15824cb006feSStefano Zampini /* Vector valued Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1583863406b8SStefano Zampini jac->as_amg_alpha_opts[0] = 10; 1584863406b8SStefano Zampini jac->as_amg_alpha_opts[1] = 1; 15850bdd8552SBarry Smith jac->as_amg_alpha_opts[2] = 6; 1586863406b8SStefano Zampini jac->as_amg_alpha_opts[3] = 6; 1587863406b8SStefano Zampini jac->as_amg_alpha_opts[4] = 4; 1588863406b8SStefano Zampini jac->as_amg_alpha_theta = 0.25; 15894cb006feSStefano Zampini /* Scalar Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1590863406b8SStefano Zampini jac->as_amg_beta_opts[0] = 10; 1591863406b8SStefano Zampini jac->as_amg_beta_opts[1] = 1; 15920bdd8552SBarry Smith jac->as_amg_beta_opts[2] = 6; 1593863406b8SStefano Zampini jac->as_amg_beta_opts[3] = 6; 1594863406b8SStefano Zampini jac->as_amg_beta_opts[4] = 4; 1595863406b8SStefano Zampini jac->as_amg_beta_theta = 0.25; 1596863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetPrintLevel,(jac->hsolver,jac->as_print)); 1597863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 15984cb006feSStefano Zampini PetscStackCallStandard(HYPRE_AMSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 1599863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetTol,(jac->hsolver,jac->as_tol)); 1600863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1601863406b8SStefano Zampini jac->as_relax_times, 1602863406b8SStefano Zampini jac->as_relax_weight, 1603863406b8SStefano Zampini jac->as_omega)); 1604863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetAlphaAMGOptions,(jac->hsolver,jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1605863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1606863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1607863406b8SStefano Zampini jac->as_amg_alpha_theta, 1608863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1609863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 1610863406b8SStefano Zampini PetscStackCallStandard(HYPRE_AMSSetBetaAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1611863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1612863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1613863406b8SStefano Zampini jac->as_amg_beta_theta, 1614863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1615863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 161623df4f25SStefano Zampini /* Zero conductivity */ 161723df4f25SStefano Zampini jac->ams_beta_is_zero = PETSC_FALSE; 161823df4f25SStefano Zampini jac->ams_beta_is_zero_part = PETSC_FALSE; 16194cb006feSStefano Zampini PetscFunctionReturn(0); 16204cb006feSStefano Zampini } 1621863406b8SStefano Zampini ierr = PetscStrcmp("ads",jac->hypre_type,&flag);CHKERRQ(ierr); 1622863406b8SStefano Zampini if (flag) { 1623863406b8SStefano Zampini ierr = HYPRE_ADSCreate(&jac->hsolver); 1624863406b8SStefano Zampini pc->ops->setfromoptions = PCSetFromOptions_HYPRE_ADS; 1625863406b8SStefano Zampini pc->ops->view = PCView_HYPRE_ADS; 1626863406b8SStefano Zampini jac->destroy = HYPRE_ADSDestroy; 1627863406b8SStefano Zampini jac->setup = HYPRE_ADSSetup; 1628863406b8SStefano Zampini jac->solve = HYPRE_ADSSolve; 1629863406b8SStefano Zampini jac->coords[0] = NULL; 1630863406b8SStefano Zampini jac->coords[1] = NULL; 1631863406b8SStefano Zampini jac->coords[2] = NULL; 1632863406b8SStefano Zampini /* solver parameters: these are borrowed from mfem package, and they are not the default values from HYPRE ADS */ 1633863406b8SStefano Zampini jac->as_print = 0; 1634863406b8SStefano Zampini jac->as_max_iter = 1; /* used as a preconditioner */ 1635863406b8SStefano Zampini jac->as_tol = 0.; /* used as a preconditioner */ 1636863406b8SStefano Zampini jac->ads_cycle_type = 13; 1637863406b8SStefano Zampini /* Smoothing options */ 1638863406b8SStefano Zampini jac->as_relax_type = 2; 1639863406b8SStefano Zampini jac->as_relax_times = 1; 1640863406b8SStefano Zampini jac->as_relax_weight = 1.0; 1641863406b8SStefano Zampini jac->as_omega = 1.0; 1642863406b8SStefano Zampini /* AMS solver parameters: cycle_type, coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1643863406b8SStefano Zampini jac->ams_cycle_type = 14; 1644863406b8SStefano Zampini jac->as_amg_alpha_opts[0] = 10; 1645863406b8SStefano Zampini jac->as_amg_alpha_opts[1] = 1; 1646863406b8SStefano Zampini jac->as_amg_alpha_opts[2] = 6; 1647863406b8SStefano Zampini jac->as_amg_alpha_opts[3] = 6; 1648863406b8SStefano Zampini jac->as_amg_alpha_opts[4] = 4; 1649863406b8SStefano Zampini jac->as_amg_alpha_theta = 0.25; 1650863406b8SStefano Zampini /* Vector Poisson AMG solver parameters: coarsen type, agg_levels, relax_type, interp_type, Pmax */ 1651863406b8SStefano Zampini jac->as_amg_beta_opts[0] = 10; 1652863406b8SStefano Zampini jac->as_amg_beta_opts[1] = 1; 1653863406b8SStefano Zampini jac->as_amg_beta_opts[2] = 6; 1654863406b8SStefano Zampini jac->as_amg_beta_opts[3] = 6; 1655863406b8SStefano Zampini jac->as_amg_beta_opts[4] = 4; 1656863406b8SStefano Zampini jac->as_amg_beta_theta = 0.25; 1657863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetPrintLevel,(jac->hsolver,jac->as_print)); 1658863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetMaxIter,(jac->hsolver,jac->as_max_iter)); 1659863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetCycleType,(jac->hsolver,jac->ams_cycle_type)); 1660863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetTol,(jac->hsolver,jac->as_tol)); 1661863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetSmoothingOptions,(jac->hsolver,jac->as_relax_type, 1662863406b8SStefano Zampini jac->as_relax_times, 1663863406b8SStefano Zampini jac->as_relax_weight, 1664863406b8SStefano Zampini jac->as_omega)); 1665863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMSOptions,(jac->hsolver,jac->ams_cycle_type, /* AMG coarsen type */ 1666863406b8SStefano Zampini jac->as_amg_alpha_opts[0], /* AMG coarsen type */ 1667863406b8SStefano Zampini jac->as_amg_alpha_opts[1], /* AMG agg_levels */ 1668863406b8SStefano Zampini jac->as_amg_alpha_opts[2], /* AMG relax_type */ 1669863406b8SStefano Zampini jac->as_amg_alpha_theta, 1670863406b8SStefano Zampini jac->as_amg_alpha_opts[3], /* AMG interp_type */ 1671863406b8SStefano Zampini jac->as_amg_alpha_opts[4])); /* AMG Pmax */ 1672863406b8SStefano Zampini PetscStackCallStandard(HYPRE_ADSSetAMGOptions,(jac->hsolver,jac->as_amg_beta_opts[0], /* AMG coarsen type */ 1673863406b8SStefano Zampini jac->as_amg_beta_opts[1], /* AMG agg_levels */ 1674863406b8SStefano Zampini jac->as_amg_beta_opts[2], /* AMG relax_type */ 1675863406b8SStefano Zampini jac->as_amg_beta_theta, 1676863406b8SStefano Zampini jac->as_amg_beta_opts[3], /* AMG interp_type */ 1677863406b8SStefano Zampini jac->as_amg_beta_opts[4])); /* AMG Pmax */ 1678863406b8SStefano Zampini PetscFunctionReturn(0); 1679863406b8SStefano Zampini } 1680503cfb0cSBarry Smith ierr = PetscFree(jac->hypre_type);CHKERRQ(ierr); 16812fa5cd67SKarl Rupp 16820298fd71SBarry Smith jac->hypre_type = NULL; 168333263987SBarry Smith SETERRQ1(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown HYPRE preconditioner %s; Choices are pilut, parasails, boomeramg, ams",name); 168416d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 168516d9e3a6SLisandro Dalcin } 168616d9e3a6SLisandro Dalcin 168716d9e3a6SLisandro Dalcin /* 168816d9e3a6SLisandro Dalcin It only gets here if the HYPRE type has not been set before the call to 168916d9e3a6SLisandro Dalcin ...SetFromOptions() which actually is most of the time 169016d9e3a6SLisandro Dalcin */ 169116d9e3a6SLisandro Dalcin #undef __FUNCT__ 169216d9e3a6SLisandro Dalcin #define __FUNCT__ "PCSetFromOptions_HYPRE" 16934416b707SBarry Smith static PetscErrorCode PCSetFromOptions_HYPRE(PetscOptionItems *PetscOptionsObject,PC pc) 169416d9e3a6SLisandro Dalcin { 169516d9e3a6SLisandro Dalcin PetscErrorCode ierr; 16964ddd07fcSJed Brown PetscInt indx; 1697863406b8SStefano Zampini const char *type[] = {"pilut","parasails","boomeramg","ams","ads"}; 1698ace3abfcSBarry Smith PetscBool flg; 169916d9e3a6SLisandro Dalcin 170016d9e3a6SLisandro Dalcin PetscFunctionBegin; 17019fa463a7SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"HYPRE preconditioner options");CHKERRQ(ierr); 17029c81f712SBarry Smith ierr = PetscOptionsEList("-pc_hypre_type","HYPRE preconditioner type","PCHYPRESetType",type,4,"boomeramg",&indx,&flg);CHKERRQ(ierr); 170316d9e3a6SLisandro Dalcin if (flg) { 170416d9e3a6SLisandro Dalcin ierr = PCHYPRESetType_HYPRE(pc,type[indx]);CHKERRQ(ierr); 170502a17cd4SBarry Smith } else { 170602a17cd4SBarry Smith ierr = PCHYPRESetType_HYPRE(pc,"boomeramg");CHKERRQ(ierr); 170716d9e3a6SLisandro Dalcin } 170816d9e3a6SLisandro Dalcin if (pc->ops->setfromoptions) { 17093931853cSBarry Smith ierr = pc->ops->setfromoptions(PetscOptionsObject,pc);CHKERRQ(ierr); 171016d9e3a6SLisandro Dalcin } 171116d9e3a6SLisandro Dalcin ierr = PetscOptionsTail();CHKERRQ(ierr); 171216d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 171316d9e3a6SLisandro Dalcin } 171416d9e3a6SLisandro Dalcin 171516d9e3a6SLisandro Dalcin #undef __FUNCT__ 171616d9e3a6SLisandro Dalcin #define __FUNCT__ "PCHYPRESetType" 171716d9e3a6SLisandro Dalcin /*@C 171816d9e3a6SLisandro Dalcin PCHYPRESetType - Sets which hypre preconditioner you wish to use 171916d9e3a6SLisandro Dalcin 172016d9e3a6SLisandro Dalcin Input Parameters: 172116d9e3a6SLisandro Dalcin + pc - the preconditioner context 1722863406b8SStefano Zampini - name - either pilut, parasails, boomeramg, ams, ads 172316d9e3a6SLisandro Dalcin 172416d9e3a6SLisandro Dalcin Options Database Keys: 1725863406b8SStefano Zampini -pc_hypre_type - One of pilut, parasails, boomeramg, ams, ads 172616d9e3a6SLisandro Dalcin 172716d9e3a6SLisandro Dalcin Level: intermediate 172816d9e3a6SLisandro Dalcin 172916d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 173016d9e3a6SLisandro Dalcin PCHYPRE 173116d9e3a6SLisandro Dalcin 173216d9e3a6SLisandro Dalcin @*/ 17337087cfbeSBarry Smith PetscErrorCode PCHYPRESetType(PC pc,const char name[]) 173416d9e3a6SLisandro Dalcin { 17354ac538c5SBarry Smith PetscErrorCode ierr; 173616d9e3a6SLisandro Dalcin 173716d9e3a6SLisandro Dalcin PetscFunctionBegin; 17380700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 173916d9e3a6SLisandro Dalcin PetscValidCharPointer(name,2); 17404ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCHYPRESetType_C",(PC,const char[]),(pc,name));CHKERRQ(ierr); 174116d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 174216d9e3a6SLisandro Dalcin } 174316d9e3a6SLisandro Dalcin 174416d9e3a6SLisandro Dalcin #undef __FUNCT__ 174516d9e3a6SLisandro Dalcin #define __FUNCT__ "PCHYPREGetType" 174616d9e3a6SLisandro Dalcin /*@C 174716d9e3a6SLisandro Dalcin PCHYPREGetType - Gets which hypre preconditioner you are using 174816d9e3a6SLisandro Dalcin 174916d9e3a6SLisandro Dalcin Input Parameter: 175016d9e3a6SLisandro Dalcin . pc - the preconditioner context 175116d9e3a6SLisandro Dalcin 175216d9e3a6SLisandro Dalcin Output Parameter: 1753863406b8SStefano Zampini . name - either pilut, parasails, boomeramg, ams, ads 175416d9e3a6SLisandro Dalcin 175516d9e3a6SLisandro Dalcin Level: intermediate 175616d9e3a6SLisandro Dalcin 175716d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCHYPRESetType(), PCType (for list of available types), PC, 175816d9e3a6SLisandro Dalcin PCHYPRE 175916d9e3a6SLisandro Dalcin 176016d9e3a6SLisandro Dalcin @*/ 17617087cfbeSBarry Smith PetscErrorCode PCHYPREGetType(PC pc,const char *name[]) 176216d9e3a6SLisandro Dalcin { 17634ac538c5SBarry Smith PetscErrorCode ierr; 176416d9e3a6SLisandro Dalcin 176516d9e3a6SLisandro Dalcin PetscFunctionBegin; 17660700a824SBarry Smith PetscValidHeaderSpecific(pc,PC_CLASSID,1); 176716d9e3a6SLisandro Dalcin PetscValidPointer(name,2); 17684ac538c5SBarry Smith ierr = PetscTryMethod(pc,"PCHYPREGetType_C",(PC,const char*[]),(pc,name));CHKERRQ(ierr); 176916d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 177016d9e3a6SLisandro Dalcin } 177116d9e3a6SLisandro Dalcin 177216d9e3a6SLisandro Dalcin /*MC 177316d9e3a6SLisandro Dalcin PCHYPRE - Allows you to use the matrix element based preconditioners in the LLNL package hypre 177416d9e3a6SLisandro Dalcin 177516d9e3a6SLisandro Dalcin Options Database Keys: 1776863406b8SStefano Zampini + -pc_hypre_type - One of pilut, parasails, boomeramg, ams, ads 177716d9e3a6SLisandro Dalcin - Too many others to list, run with -pc_type hypre -pc_hypre_type XXX -help to see options for the XXX 177816d9e3a6SLisandro Dalcin preconditioner 177916d9e3a6SLisandro Dalcin 178016d9e3a6SLisandro Dalcin Level: intermediate 178116d9e3a6SLisandro Dalcin 178216d9e3a6SLisandro Dalcin Notes: Apart from pc_hypre_type (for which there is PCHYPRESetType()), 178316d9e3a6SLisandro Dalcin the many hypre options can ONLY be set via the options database (e.g. the command line 178416d9e3a6SLisandro Dalcin or with PetscOptionsSetValue(), there are no functions to set them) 178516d9e3a6SLisandro Dalcin 178616d9e3a6SLisandro Dalcin The options -pc_hypre_boomeramg_max_iter and -pc_hypre_boomeramg_rtol refer to the number of iterations 17870f1074feSSatish Balay (V-cycles) and tolerance that boomeramg does EACH time it is called. So for example, if 17880f1074feSSatish Balay -pc_hypre_boomeramg_max_iter is set to 2 then 2-V-cycles are being used to define the preconditioner 17890f1074feSSatish Balay (-pc_hypre_boomeramg_rtol should be set to 0.0 - the default - to strictly use a fixed number of 17908f87f92bSBarry Smith iterations per hypre call). -ksp_max_it and -ksp_rtol STILL determine the total number of iterations 17910f1074feSSatish Balay and tolerance for the Krylov solver. For example, if -pc_hypre_boomeramg_max_iter is 2 and -ksp_max_it is 10 17920f1074feSSatish Balay then AT MOST twenty V-cycles of boomeramg will be called. 179316d9e3a6SLisandro Dalcin 17940f1074feSSatish Balay Note that the option -pc_hypre_boomeramg_relax_type_all defaults to symmetric relaxation 17950f1074feSSatish Balay (symmetric-SOR/Jacobi), which is required for Krylov solvers like CG that expect symmetry. 17960f1074feSSatish Balay Otherwise, you may want to use -pc_hypre_boomeramg_relax_type_all SOR/Jacobi. 179716d9e3a6SLisandro Dalcin If you wish to use BoomerAMG WITHOUT a Krylov method use -ksp_type richardson NOT -ksp_type preonly 179816d9e3a6SLisandro Dalcin and use -ksp_max_it to control the number of V-cycles. 179916d9e3a6SLisandro Dalcin (see the PETSc FAQ.html at the PETSc website under the Documentation tab). 180016d9e3a6SLisandro Dalcin 180116d9e3a6SLisandro Dalcin 2007-02-03 Using HYPRE-1.11.1b, the routine HYPRE_BoomerAMGSolveT and the option 180216d9e3a6SLisandro Dalcin -pc_hypre_parasails_reuse were failing with SIGSEGV. Dalcin L. 180316d9e3a6SLisandro Dalcin 18045272c319SBarry Smith MatSetNearNullSpace() - if you provide a near null space to your matrix it is ignored by hypre UNLESS you also use 18055272c319SBarry Smith the two options: 18065272c319SBarry Smith + -pc_hypre_boomeramg_nodal_coarsen <n> - where n is from 1 to 6 (see HYPRE_BOOMERAMGSetNodal()) 1807cbc39033SBarry Smith - -pc_hypre_boomeramg_vec_interp_variant <v> where v is from 1 to 3 (see HYPRE_BoomerAMGSetInterpVecVariant()) 18085272c319SBarry Smith 18095272c319SBarry Smith Depending on the linear system you may see the same or different convergence depending on the values you use. 18105272c319SBarry Smith 18119e5bc791SBarry Smith See PCPFMG for access to the hypre Struct PFMG solver 18129e5bc791SBarry Smith 181316d9e3a6SLisandro Dalcin .seealso: PCCreate(), PCSetType(), PCType (for list of available types), PC, 18149e5bc791SBarry Smith PCHYPRESetType(), PCPFMG 181516d9e3a6SLisandro Dalcin 181616d9e3a6SLisandro Dalcin M*/ 181716d9e3a6SLisandro Dalcin 181816d9e3a6SLisandro Dalcin #undef __FUNCT__ 181916d9e3a6SLisandro Dalcin #define __FUNCT__ "PCCreate_HYPRE" 18208cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_HYPRE(PC pc) 182116d9e3a6SLisandro Dalcin { 182216d9e3a6SLisandro Dalcin PC_HYPRE *jac; 182316d9e3a6SLisandro Dalcin PetscErrorCode ierr; 182416d9e3a6SLisandro Dalcin 182516d9e3a6SLisandro Dalcin PetscFunctionBegin; 1826b00a9115SJed Brown ierr = PetscNewLog(pc,&jac);CHKERRQ(ierr); 18272fa5cd67SKarl Rupp 182816d9e3a6SLisandro Dalcin pc->data = jac; 18298695de01SBarry Smith pc->ops->reset = PCReset_HYPRE; 183016d9e3a6SLisandro Dalcin pc->ops->destroy = PCDestroy_HYPRE; 183116d9e3a6SLisandro Dalcin pc->ops->setfromoptions = PCSetFromOptions_HYPRE; 183216d9e3a6SLisandro Dalcin pc->ops->setup = PCSetUp_HYPRE; 183316d9e3a6SLisandro Dalcin pc->ops->apply = PCApply_HYPRE; 183416d9e3a6SLisandro Dalcin jac->comm_hypre = MPI_COMM_NULL; 18354cb006feSStefano Zampini jac->coords[0] = NULL; 18364cb006feSStefano Zampini jac->coords[1] = NULL; 18374cb006feSStefano Zampini jac->coords[2] = NULL; 18384cb006feSStefano Zampini jac->constants[0] = NULL; 18394cb006feSStefano Zampini jac->constants[1] = NULL; 18404cb006feSStefano Zampini jac->constants[2] = NULL; 18415272c319SBarry Smith jac->hmnull = NULL; 18425272c319SBarry Smith jac->n_hmnull = 0; 184316d9e3a6SLisandro Dalcin /* duplicate communicator for hypre */ 1844ce94432eSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(jac->comm_hypre));CHKERRQ(ierr); 1845bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetType_C",PCHYPRESetType_HYPRE);CHKERRQ(ierr); 1846bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPREGetType_C",PCHYPREGetType_HYPRE);CHKERRQ(ierr); 1847*5ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCSetCoordinates_C",PCSetCoordinates_HYPRE);CHKERRQ(ierr); 1848*5ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteGradient_C",PCHYPRESetDiscreteGradient_HYPRE);CHKERRQ(ierr); 1849*5ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetDiscreteCurl_C",PCHYPRESetDiscreteCurl_HYPRE);CHKERRQ(ierr); 1850*5ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetEdgeConstantVectors_C",PCHYPRESetEdgeConstantVectors_HYPRE);CHKERRQ(ierr); 1851*5ac14e1cSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)pc,"PCHYPRESetPoissonMatrix_C",PCHYPRESetPoissonMatrix_HYPRE);CHKERRQ(ierr); 185216d9e3a6SLisandro Dalcin PetscFunctionReturn(0); 185316d9e3a6SLisandro Dalcin } 1854ebc551c0SBarry Smith 1855f91d8e95SBarry Smith /* ---------------------------------------------------------------------------------------------------------------------------------*/ 1856f91d8e95SBarry Smith 1857ebc551c0SBarry Smith typedef struct { 185868326731SBarry Smith MPI_Comm hcomm; /* does not share comm with HYPRE_StructMatrix because need to create solver before getting matrix */ 1859f91d8e95SBarry Smith HYPRE_StructSolver hsolver; 18609e5bc791SBarry Smith 18619e5bc791SBarry Smith /* keep copy of PFMG options used so may view them */ 18624ddd07fcSJed Brown PetscInt its; 18639e5bc791SBarry Smith double tol; 18644ddd07fcSJed Brown PetscInt relax_type; 18654ddd07fcSJed Brown PetscInt rap_type; 18664ddd07fcSJed Brown PetscInt num_pre_relax,num_post_relax; 18674ddd07fcSJed Brown PetscInt max_levels; 1868ebc551c0SBarry Smith } PC_PFMG; 1869ebc551c0SBarry Smith 1870ebc551c0SBarry Smith #undef __FUNCT__ 1871ebc551c0SBarry Smith #define __FUNCT__ "PCDestroy_PFMG" 1872ebc551c0SBarry Smith PetscErrorCode PCDestroy_PFMG(PC pc) 1873ebc551c0SBarry Smith { 1874ebc551c0SBarry Smith PetscErrorCode ierr; 1875f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 1876ebc551c0SBarry Smith 1877ebc551c0SBarry Smith PetscFunctionBegin; 18782fa5cd67SKarl Rupp if (ex->hsolver) PetscStackCallStandard(HYPRE_StructPFMGDestroy,(ex->hsolver)); 1879f91d8e95SBarry Smith ierr = MPI_Comm_free(&ex->hcomm);CHKERRQ(ierr); 1880c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 1881ebc551c0SBarry Smith PetscFunctionReturn(0); 1882ebc551c0SBarry Smith } 1883ebc551c0SBarry Smith 18849e5bc791SBarry Smith static const char *PFMGRelaxType[] = {"Jacobi","Weighted-Jacobi","symmetric-Red/Black-Gauss-Seidel","Red/Black-Gauss-Seidel"}; 18859e5bc791SBarry Smith static const char *PFMGRAPType[] = {"Galerkin","non-Galerkin"}; 18869e5bc791SBarry Smith 1887ebc551c0SBarry Smith #undef __FUNCT__ 1888ebc551c0SBarry Smith #define __FUNCT__ "PCView_PFMG" 1889ebc551c0SBarry Smith PetscErrorCode PCView_PFMG(PC pc,PetscViewer viewer) 1890ebc551c0SBarry Smith { 1891ebc551c0SBarry Smith PetscErrorCode ierr; 1892ace3abfcSBarry Smith PetscBool iascii; 1893f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 1894ebc551c0SBarry Smith 1895ebc551c0SBarry Smith PetscFunctionBegin; 1896251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 18979e5bc791SBarry Smith if (iascii) { 18989e5bc791SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE PFMG preconditioning\n");CHKERRQ(ierr); 18999e5bc791SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE PFMG: max iterations %d\n",ex->its);CHKERRQ(ierr); 19009e5bc791SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE PFMG: tolerance %g\n",ex->tol);CHKERRQ(ierr); 19019e5bc791SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE PFMG: relax type %s\n",PFMGRelaxType[ex->relax_type]);CHKERRQ(ierr); 19029e5bc791SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE PFMG: RAP type %s\n",PFMGRAPType[ex->rap_type]);CHKERRQ(ierr); 19039e5bc791SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," HYPRE PFMG: number pre-relax %d post-relax %d\n",ex->num_pre_relax,ex->num_post_relax);CHKERRQ(ierr); 19043b46a515SGlenn Hammond ierr = PetscViewerASCIIPrintf(viewer," HYPRE PFMG: max levels %d\n",ex->max_levels);CHKERRQ(ierr); 19059e5bc791SBarry Smith } 1906ebc551c0SBarry Smith PetscFunctionReturn(0); 1907ebc551c0SBarry Smith } 1908ebc551c0SBarry Smith 19099e5bc791SBarry Smith 1910ebc551c0SBarry Smith #undef __FUNCT__ 1911ebc551c0SBarry Smith #define __FUNCT__ "PCSetFromOptions_PFMG" 19124416b707SBarry Smith PetscErrorCode PCSetFromOptions_PFMG(PetscOptionItems *PetscOptionsObject,PC pc) 1913ebc551c0SBarry Smith { 1914ebc551c0SBarry Smith PetscErrorCode ierr; 1915f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 1916ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE; 1917ebc551c0SBarry Smith 1918ebc551c0SBarry Smith PetscFunctionBegin; 1919e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"PFMG options");CHKERRQ(ierr); 19200298fd71SBarry Smith ierr = PetscOptionsBool("-pc_pfmg_print_statistics","Print statistics","HYPRE_StructPFMGSetPrintLevel",flg,&flg,NULL);CHKERRQ(ierr); 192168326731SBarry Smith if (flg) { 1922a0324ebeSBarry Smith int level=3; 1923fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetPrintLevel,(ex->hsolver,level)); 192468326731SBarry Smith } 19250298fd71SBarry Smith ierr = PetscOptionsInt("-pc_pfmg_its","Number of iterations of PFMG to use as preconditioner","HYPRE_StructPFMGSetMaxIter",ex->its,&ex->its,NULL);CHKERRQ(ierr); 1926fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(ex->hsolver,ex->its)); 19270298fd71SBarry 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); 1928fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetNumPreRelax,(ex->hsolver,ex->num_pre_relax)); 19290298fd71SBarry 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); 1930fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetNumPostRelax,(ex->hsolver,ex->num_post_relax)); 19319e5bc791SBarry Smith 19320298fd71SBarry Smith ierr = PetscOptionsInt("-pc_pfmg_max_levels","Max Levels for MG hierarchy","HYPRE_StructPFMGSetMaxLevels",ex->max_levels,&ex->max_levels,NULL);CHKERRQ(ierr); 1933fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxLevels,(ex->hsolver,ex->max_levels)); 19343b46a515SGlenn Hammond 19350298fd71SBarry Smith ierr = PetscOptionsReal("-pc_pfmg_tol","Tolerance of PFMG","HYPRE_StructPFMGSetTol",ex->tol,&ex->tol,NULL);CHKERRQ(ierr); 1936fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(ex->hsolver,ex->tol)); 19370298fd71SBarry 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); 1938fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetRelaxType,(ex->hsolver, ex->relax_type)); 19390298fd71SBarry Smith ierr = PetscOptionsEList("-pc_pfmg_rap_type","RAP type","HYPRE_StructPFMGSetRAPType",PFMGRAPType,ALEN(PFMGRAPType),PFMGRAPType[ex->rap_type],&ex->rap_type,NULL);CHKERRQ(ierr); 1940fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetRAPType,(ex->hsolver, ex->rap_type)); 1941ebc551c0SBarry Smith ierr = PetscOptionsTail();CHKERRQ(ierr); 1942ebc551c0SBarry Smith PetscFunctionReturn(0); 1943ebc551c0SBarry Smith } 1944ebc551c0SBarry Smith 1945f91d8e95SBarry Smith #undef __FUNCT__ 1946f91d8e95SBarry Smith #define __FUNCT__ "PCApply_PFMG" 1947f91d8e95SBarry Smith PetscErrorCode PCApply_PFMG(PC pc,Vec x,Vec y) 1948f91d8e95SBarry Smith { 1949f91d8e95SBarry Smith PetscErrorCode ierr; 1950f91d8e95SBarry Smith PC_PFMG *ex = (PC_PFMG*) pc->data; 1951d9ca1df4SBarry Smith PetscScalar *yy; 1952d9ca1df4SBarry Smith const PetscScalar *xx; 19534ddd07fcSJed Brown PetscInt ilower[3],iupper[3]; 195468326731SBarry Smith Mat_HYPREStruct *mx = (Mat_HYPREStruct*)(pc->pmat->data); 1955f91d8e95SBarry Smith 1956f91d8e95SBarry Smith PetscFunctionBegin; 1957dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 1958aa219208SBarry Smith ierr = DMDAGetCorners(mx->da,&ilower[0],&ilower[1],&ilower[2],&iupper[0],&iupper[1],&iupper[2]);CHKERRQ(ierr); 1959f91d8e95SBarry Smith iupper[0] += ilower[0] - 1; 1960f91d8e95SBarry Smith iupper[1] += ilower[1] - 1; 1961f91d8e95SBarry Smith iupper[2] += ilower[2] - 1; 1962f91d8e95SBarry Smith 1963f91d8e95SBarry Smith /* copy x values over to hypre */ 1964fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructVectorSetConstantValues,(mx->hb,0.0)); 1965d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 1966d9ca1df4SBarry Smith PetscStackCallStandard(HYPRE_StructVectorSetBoxValues,(mx->hb,(HYPRE_Int *)ilower,(HYPRE_Int *)iupper,(PetscScalar*)xx)); 1967d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 1968fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructVectorAssemble,(mx->hb)); 1969fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSolve,(ex->hsolver,mx->hmat,mx->hb,mx->hx)); 1970f91d8e95SBarry Smith 1971f91d8e95SBarry Smith /* copy solution values back to PETSc */ 1972f91d8e95SBarry Smith ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 19738b1f7689SBarry Smith PetscStackCallStandard(HYPRE_StructVectorGetBoxValues,(mx->hx,(HYPRE_Int *)ilower,(HYPRE_Int *)iupper,yy)); 1974f91d8e95SBarry Smith ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 1975f91d8e95SBarry Smith PetscFunctionReturn(0); 1976f91d8e95SBarry Smith } 1977f91d8e95SBarry Smith 19789e5bc791SBarry Smith #undef __FUNCT__ 19799e5bc791SBarry Smith #define __FUNCT__ "PCApplyRichardson_PFMG" 1980ace3abfcSBarry 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) 19819e5bc791SBarry Smith { 19829e5bc791SBarry Smith PC_PFMG *jac = (PC_PFMG*)pc->data; 19839e5bc791SBarry Smith PetscErrorCode ierr; 19844ddd07fcSJed Brown PetscInt oits; 19859e5bc791SBarry Smith 19869e5bc791SBarry Smith PetscFunctionBegin; 1987dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 1988fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(jac->hsolver,its*jac->its)); 1989fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(jac->hsolver,rtol)); 19909e5bc791SBarry Smith 19919e5bc791SBarry Smith ierr = PCApply_PFMG(pc,b,y);CHKERRQ(ierr); 19928b1f7689SBarry Smith PetscStackCallStandard(HYPRE_StructPFMGGetNumIterations,(jac->hsolver,(HYPRE_Int *)&oits)); 19939e5bc791SBarry Smith *outits = oits; 19949e5bc791SBarry Smith if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 19959e5bc791SBarry Smith else *reason = PCRICHARDSON_CONVERGED_RTOL; 1996fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetTol,(jac->hsolver,jac->tol)); 1997fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetMaxIter,(jac->hsolver,jac->its)); 19989e5bc791SBarry Smith PetscFunctionReturn(0); 19999e5bc791SBarry Smith } 20009e5bc791SBarry Smith 20019e5bc791SBarry Smith 20023a32d3dbSGlenn Hammond #undef __FUNCT__ 20033a32d3dbSGlenn Hammond #define __FUNCT__ "PCSetUp_PFMG" 20043a32d3dbSGlenn Hammond PetscErrorCode PCSetUp_PFMG(PC pc) 20053a32d3dbSGlenn Hammond { 20063a32d3dbSGlenn Hammond PetscErrorCode ierr; 20073a32d3dbSGlenn Hammond PC_PFMG *ex = (PC_PFMG*) pc->data; 20083a32d3dbSGlenn Hammond Mat_HYPREStruct *mx = (Mat_HYPREStruct*)(pc->pmat->data); 2009ace3abfcSBarry Smith PetscBool flg; 20103a32d3dbSGlenn Hammond 20113a32d3dbSGlenn Hammond PetscFunctionBegin; 2012251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRESTRUCT,&flg);CHKERRQ(ierr); 2013ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_INCOMP,"Must use MATHYPRESTRUCT with this preconditioner"); 20143a32d3dbSGlenn Hammond 20153a32d3dbSGlenn Hammond /* create the hypre solver object and set its information */ 20162fa5cd67SKarl Rupp if (ex->hsolver) PetscStackCallStandard(HYPRE_StructPFMGDestroy,(ex->hsolver)); 2017fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGCreate,(ex->hcomm,&ex->hsolver)); 2018fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetup,(ex->hsolver,mx->hmat,mx->hb,mx->hx)); 2019fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGSetZeroGuess,(ex->hsolver)); 20203a32d3dbSGlenn Hammond PetscFunctionReturn(0); 20213a32d3dbSGlenn Hammond } 20223a32d3dbSGlenn Hammond 2023ebc551c0SBarry Smith 2024ebc551c0SBarry Smith /*MC 2025ebc551c0SBarry Smith PCPFMG - the hypre PFMG multigrid solver 2026ebc551c0SBarry Smith 2027ebc551c0SBarry Smith Level: advanced 2028ebc551c0SBarry Smith 20299e5bc791SBarry Smith Options Database: 20309e5bc791SBarry Smith + -pc_pfmg_its <its> number of iterations of PFMG to use as preconditioner 20319e5bc791SBarry Smith . -pc_pfmg_num_pre_relax <steps> number of smoothing steps before coarse grid 20329e5bc791SBarry Smith . -pc_pfmg_num_post_relax <steps> number of smoothing steps after coarse grid 20339e5bc791SBarry Smith . -pc_pfmg_tol <tol> tolerance of PFMG 20349e5bc791SBarry 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 20359e5bc791SBarry Smith - -pc_pfmg_rap_type - type of coarse matrix generation, one of Galerkin,non-Galerkin 2036f91d8e95SBarry Smith 20379e5bc791SBarry Smith Notes: This is for CELL-centered descretizations 20389e5bc791SBarry Smith 20398e395302SJed Brown This must be used with the MATHYPRESTRUCT matrix type. 2040aa219208SBarry Smith This is less general than in hypre, it supports only one block per process defined by a PETSc DMDA. 20419e5bc791SBarry Smith 20429e5bc791SBarry Smith .seealso: PCMG, MATHYPRESTRUCT 2043ebc551c0SBarry Smith M*/ 2044ebc551c0SBarry Smith 2045ebc551c0SBarry Smith #undef __FUNCT__ 2046ebc551c0SBarry Smith #define __FUNCT__ "PCCreate_PFMG" 20478cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_PFMG(PC pc) 2048ebc551c0SBarry Smith { 2049ebc551c0SBarry Smith PetscErrorCode ierr; 2050ebc551c0SBarry Smith PC_PFMG *ex; 2051ebc551c0SBarry Smith 2052ebc551c0SBarry Smith PetscFunctionBegin; 2053b00a9115SJed Brown ierr = PetscNew(&ex);CHKERRQ(ierr); \ 205468326731SBarry Smith pc->data = ex; 2055ebc551c0SBarry Smith 20569e5bc791SBarry Smith ex->its = 1; 20579e5bc791SBarry Smith ex->tol = 1.e-8; 20589e5bc791SBarry Smith ex->relax_type = 1; 20599e5bc791SBarry Smith ex->rap_type = 0; 20609e5bc791SBarry Smith ex->num_pre_relax = 1; 20619e5bc791SBarry Smith ex->num_post_relax = 1; 20623b46a515SGlenn Hammond ex->max_levels = 0; 20639e5bc791SBarry Smith 2064ebc551c0SBarry Smith pc->ops->setfromoptions = PCSetFromOptions_PFMG; 2065ebc551c0SBarry Smith pc->ops->view = PCView_PFMG; 2066ebc551c0SBarry Smith pc->ops->destroy = PCDestroy_PFMG; 2067f91d8e95SBarry Smith pc->ops->apply = PCApply_PFMG; 20689e5bc791SBarry Smith pc->ops->applyrichardson = PCApplyRichardson_PFMG; 206968326731SBarry Smith pc->ops->setup = PCSetUp_PFMG; 20702fa5cd67SKarl Rupp 2071ce94432eSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(ex->hcomm));CHKERRQ(ierr); 2072fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_StructPFMGCreate,(ex->hcomm,&ex->hsolver)); 2073ebc551c0SBarry Smith PetscFunctionReturn(0); 2074ebc551c0SBarry Smith } 2075d851a50bSGlenn Hammond 2076325fc9f4SBarry Smith /* ---------------------------------------------------------------------------------------------------------------------------------------------------*/ 2077325fc9f4SBarry Smith 2078d851a50bSGlenn Hammond /* we know we are working with a HYPRE_SStructMatrix */ 2079d851a50bSGlenn Hammond typedef struct { 2080d851a50bSGlenn Hammond MPI_Comm hcomm; /* does not share comm with HYPRE_SStructMatrix because need to create solver before getting matrix */ 2081d851a50bSGlenn Hammond HYPRE_SStructSolver ss_solver; 2082d851a50bSGlenn Hammond 2083d851a50bSGlenn Hammond /* keep copy of SYSPFMG options used so may view them */ 20844ddd07fcSJed Brown PetscInt its; 2085d851a50bSGlenn Hammond double tol; 20864ddd07fcSJed Brown PetscInt relax_type; 20874ddd07fcSJed Brown PetscInt num_pre_relax,num_post_relax; 2088d851a50bSGlenn Hammond } PC_SysPFMG; 2089d851a50bSGlenn Hammond 2090d851a50bSGlenn Hammond #undef __FUNCT__ 2091d851a50bSGlenn Hammond #define __FUNCT__ "PCDestroy_SysPFMG" 2092d851a50bSGlenn Hammond PetscErrorCode PCDestroy_SysPFMG(PC pc) 2093d851a50bSGlenn Hammond { 2094d851a50bSGlenn Hammond PetscErrorCode ierr; 2095d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2096d851a50bSGlenn Hammond 2097d851a50bSGlenn Hammond PetscFunctionBegin; 20982fa5cd67SKarl Rupp if (ex->ss_solver) PetscStackCallStandard(HYPRE_SStructSysPFMGDestroy,(ex->ss_solver)); 2099d851a50bSGlenn Hammond ierr = MPI_Comm_free(&ex->hcomm);CHKERRQ(ierr); 2100c31cb41cSBarry Smith ierr = PetscFree(pc->data);CHKERRQ(ierr); 2101d851a50bSGlenn Hammond PetscFunctionReturn(0); 2102d851a50bSGlenn Hammond } 2103d851a50bSGlenn Hammond 2104d851a50bSGlenn Hammond static const char *SysPFMGRelaxType[] = {"Weighted-Jacobi","Red/Black-Gauss-Seidel"}; 2105d851a50bSGlenn Hammond 2106d851a50bSGlenn Hammond #undef __FUNCT__ 2107d851a50bSGlenn Hammond #define __FUNCT__ "PCView_SysPFMG" 2108d851a50bSGlenn Hammond PetscErrorCode PCView_SysPFMG(PC pc,PetscViewer viewer) 2109d851a50bSGlenn Hammond { 2110d851a50bSGlenn Hammond PetscErrorCode ierr; 2111ace3abfcSBarry Smith PetscBool iascii; 2112d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2113d851a50bSGlenn Hammond 2114d851a50bSGlenn Hammond PetscFunctionBegin; 2115251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 2116d851a50bSGlenn Hammond if (iascii) { 2117d851a50bSGlenn Hammond ierr = PetscViewerASCIIPrintf(viewer," HYPRE SysPFMG preconditioning\n");CHKERRQ(ierr); 2118d851a50bSGlenn Hammond ierr = PetscViewerASCIIPrintf(viewer," HYPRE SysPFMG: max iterations %d\n",ex->its);CHKERRQ(ierr); 2119d851a50bSGlenn Hammond ierr = PetscViewerASCIIPrintf(viewer," HYPRE SysPFMG: tolerance %g\n",ex->tol);CHKERRQ(ierr); 2120d851a50bSGlenn Hammond ierr = PetscViewerASCIIPrintf(viewer," HYPRE SysPFMG: relax type %s\n",PFMGRelaxType[ex->relax_type]);CHKERRQ(ierr); 2121d851a50bSGlenn Hammond ierr = PetscViewerASCIIPrintf(viewer," HYPRE SysPFMG: number pre-relax %d post-relax %d\n",ex->num_pre_relax,ex->num_post_relax);CHKERRQ(ierr); 2122d851a50bSGlenn Hammond } 2123d851a50bSGlenn Hammond PetscFunctionReturn(0); 2124d851a50bSGlenn Hammond } 2125d851a50bSGlenn Hammond 2126d851a50bSGlenn Hammond 2127d851a50bSGlenn Hammond #undef __FUNCT__ 2128d851a50bSGlenn Hammond #define __FUNCT__ "PCSetFromOptions_SysPFMG" 21294416b707SBarry Smith PetscErrorCode PCSetFromOptions_SysPFMG(PetscOptionItems *PetscOptionsObject,PC pc) 2130d851a50bSGlenn Hammond { 2131d851a50bSGlenn Hammond PetscErrorCode ierr; 2132d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2133ace3abfcSBarry Smith PetscBool flg = PETSC_FALSE; 2134d851a50bSGlenn Hammond 2135d851a50bSGlenn Hammond PetscFunctionBegin; 2136e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"SysPFMG options");CHKERRQ(ierr); 21370298fd71SBarry Smith ierr = PetscOptionsBool("-pc_syspfmg_print_statistics","Print statistics","HYPRE_SStructSysPFMGSetPrintLevel",flg,&flg,NULL);CHKERRQ(ierr); 2138d851a50bSGlenn Hammond if (flg) { 2139d851a50bSGlenn Hammond int level=3; 2140fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetPrintLevel,(ex->ss_solver,level)); 2141d851a50bSGlenn Hammond } 21420298fd71SBarry Smith ierr = PetscOptionsInt("-pc_syspfmg_its","Number of iterations of SysPFMG to use as preconditioner","HYPRE_SStructSysPFMGSetMaxIter",ex->its,&ex->its,NULL);CHKERRQ(ierr); 2143fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(ex->ss_solver,ex->its)); 21440298fd71SBarry 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); 2145fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetNumPreRelax,(ex->ss_solver,ex->num_pre_relax)); 21460298fd71SBarry 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); 2147fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetNumPostRelax,(ex->ss_solver,ex->num_post_relax)); 2148d851a50bSGlenn Hammond 21490298fd71SBarry Smith ierr = PetscOptionsReal("-pc_syspfmg_tol","Tolerance of SysPFMG","HYPRE_SStructSysPFMGSetTol",ex->tol,&ex->tol,NULL);CHKERRQ(ierr); 2150fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(ex->ss_solver,ex->tol)); 21510298fd71SBarry Smith ierr = PetscOptionsEList("-pc_syspfmg_relax_type","Relax type for the up and down cycles","HYPRE_SStructSysPFMGSetRelaxType",SysPFMGRelaxType,4,SysPFMGRelaxType[ex->relax_type],&ex->relax_type,NULL);CHKERRQ(ierr); 2152fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetRelaxType,(ex->ss_solver, ex->relax_type)); 2153d851a50bSGlenn Hammond ierr = PetscOptionsTail();CHKERRQ(ierr); 2154d851a50bSGlenn Hammond PetscFunctionReturn(0); 2155d851a50bSGlenn Hammond } 2156d851a50bSGlenn Hammond 2157d851a50bSGlenn Hammond #undef __FUNCT__ 2158d851a50bSGlenn Hammond #define __FUNCT__ "PCApply_SysPFMG" 2159d851a50bSGlenn Hammond PetscErrorCode PCApply_SysPFMG(PC pc,Vec x,Vec y) 2160d851a50bSGlenn Hammond { 2161d851a50bSGlenn Hammond PetscErrorCode ierr; 2162d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2163d9ca1df4SBarry Smith PetscScalar *yy; 2164d9ca1df4SBarry Smith const PetscScalar *xx; 21654ddd07fcSJed Brown PetscInt ilower[3],iupper[3]; 2166d851a50bSGlenn Hammond Mat_HYPRESStruct *mx = (Mat_HYPRESStruct*)(pc->pmat->data); 21674ddd07fcSJed Brown PetscInt ordering= mx->dofs_order; 21684ddd07fcSJed Brown PetscInt nvars = mx->nvars; 21694ddd07fcSJed Brown PetscInt part = 0; 21704ddd07fcSJed Brown PetscInt size; 21714ddd07fcSJed Brown PetscInt i; 2172d851a50bSGlenn Hammond 2173d851a50bSGlenn Hammond PetscFunctionBegin; 2174dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2175aa219208SBarry Smith ierr = DMDAGetCorners(mx->da,&ilower[0],&ilower[1],&ilower[2],&iupper[0],&iupper[1],&iupper[2]);CHKERRQ(ierr); 2176d851a50bSGlenn Hammond iupper[0] += ilower[0] - 1; 2177d851a50bSGlenn Hammond iupper[1] += ilower[1] - 1; 2178d851a50bSGlenn Hammond iupper[2] += ilower[2] - 1; 2179d851a50bSGlenn Hammond 2180d851a50bSGlenn Hammond size = 1; 21812fa5cd67SKarl Rupp for (i= 0; i< 3; i++) size *= (iupper[i]-ilower[i]+1); 21822fa5cd67SKarl Rupp 2183d851a50bSGlenn Hammond /* copy x values over to hypre for variable ordering */ 2184d851a50bSGlenn Hammond if (ordering) { 2185fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorSetConstantValues,(mx->ss_b,0.0)); 2186d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 2187d9ca1df4SBarry 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))); 2188d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 2189fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorAssemble,(mx->ss_b)); 2190fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructMatrixMatvec,(1.0,mx->ss_mat,mx->ss_b,0.0,mx->ss_x)); 2191fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSolve,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2192d851a50bSGlenn Hammond 2193d851a50bSGlenn Hammond /* copy solution values back to PETSc */ 2194d851a50bSGlenn Hammond ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 21958b1f7689SBarry Smith for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorGetBoxValues,(mx->ss_x,part,(HYPRE_Int *)ilower,(HYPRE_Int *)iupper,i,yy+(size*i))); 2196d851a50bSGlenn Hammond ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 2197a65764d7SBarry Smith } else { /* nodal ordering must be mapped to variable ordering for sys_pfmg */ 2198d851a50bSGlenn Hammond PetscScalar *z; 21994ddd07fcSJed Brown PetscInt j, k; 2200d851a50bSGlenn Hammond 2201785e854fSJed Brown ierr = PetscMalloc1(nvars*size,&z);CHKERRQ(ierr); 2202fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorSetConstantValues,(mx->ss_b,0.0)); 2203d9ca1df4SBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 2204d851a50bSGlenn Hammond 2205d851a50bSGlenn Hammond /* transform nodal to hypre's variable ordering for sys_pfmg */ 2206d851a50bSGlenn Hammond for (i= 0; i< size; i++) { 2207d851a50bSGlenn Hammond k= i*nvars; 22082fa5cd67SKarl Rupp for (j= 0; j< nvars; j++) z[j*size+i]= xx[k+j]; 2209d851a50bSGlenn Hammond } 22108b1f7689SBarry Smith for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorSetBoxValues,(mx->ss_b,part,(HYPRE_Int *)ilower,(HYPRE_Int *)iupper,i,z+(size*i))); 2211d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 2212fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructVectorAssemble,(mx->ss_b)); 2213fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSolve,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2214d851a50bSGlenn Hammond 2215d851a50bSGlenn Hammond /* copy solution values back to PETSc */ 2216d851a50bSGlenn Hammond ierr = VecGetArray(y,&yy);CHKERRQ(ierr); 22178b1f7689SBarry Smith for (i= 0; i< nvars; i++) PetscStackCallStandard(HYPRE_SStructVectorGetBoxValues,(mx->ss_x,part,(HYPRE_Int *)ilower,(HYPRE_Int *)iupper,i,z+(size*i))); 2218d851a50bSGlenn Hammond /* transform hypre's variable ordering for sys_pfmg to nodal ordering */ 2219d851a50bSGlenn Hammond for (i= 0; i< size; i++) { 2220d851a50bSGlenn Hammond k= i*nvars; 22212fa5cd67SKarl Rupp for (j= 0; j< nvars; j++) yy[k+j]= z[j*size+i]; 2222d851a50bSGlenn Hammond } 2223d851a50bSGlenn Hammond ierr = VecRestoreArray(y,&yy);CHKERRQ(ierr); 2224d851a50bSGlenn Hammond ierr = PetscFree(z);CHKERRQ(ierr); 2225d851a50bSGlenn Hammond } 2226d851a50bSGlenn Hammond PetscFunctionReturn(0); 2227d851a50bSGlenn Hammond } 2228d851a50bSGlenn Hammond 2229d851a50bSGlenn Hammond #undef __FUNCT__ 2230d851a50bSGlenn Hammond #define __FUNCT__ "PCApplyRichardson_SysPFMG" 2231ace3abfcSBarry 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) 2232d851a50bSGlenn Hammond { 2233d851a50bSGlenn Hammond PC_SysPFMG *jac = (PC_SysPFMG*)pc->data; 2234d851a50bSGlenn Hammond PetscErrorCode ierr; 22354ddd07fcSJed Brown PetscInt oits; 2236d851a50bSGlenn Hammond 2237d851a50bSGlenn Hammond PetscFunctionBegin; 2238dff31646SBarry Smith ierr = PetscCitationsRegister(hypreCitation,&cite);CHKERRQ(ierr); 2239fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(jac->ss_solver,its*jac->its)); 2240fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(jac->ss_solver,rtol)); 2241d851a50bSGlenn Hammond ierr = PCApply_SysPFMG(pc,b,y);CHKERRQ(ierr); 22428b1f7689SBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGGetNumIterations,(jac->ss_solver,(HYPRE_Int *)&oits)); 2243d851a50bSGlenn Hammond *outits = oits; 2244d851a50bSGlenn Hammond if (oits == its) *reason = PCRICHARDSON_CONVERGED_ITS; 2245d851a50bSGlenn Hammond else *reason = PCRICHARDSON_CONVERGED_RTOL; 2246fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetTol,(jac->ss_solver,jac->tol)); 2247fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetMaxIter,(jac->ss_solver,jac->its)); 2248d851a50bSGlenn Hammond PetscFunctionReturn(0); 2249d851a50bSGlenn Hammond } 2250d851a50bSGlenn Hammond 2251d851a50bSGlenn Hammond 2252d851a50bSGlenn Hammond #undef __FUNCT__ 2253d851a50bSGlenn Hammond #define __FUNCT__ "PCSetUp_SysPFMG" 2254d851a50bSGlenn Hammond PetscErrorCode PCSetUp_SysPFMG(PC pc) 2255d851a50bSGlenn Hammond { 2256d851a50bSGlenn Hammond PetscErrorCode ierr; 2257d851a50bSGlenn Hammond PC_SysPFMG *ex = (PC_SysPFMG*) pc->data; 2258d851a50bSGlenn Hammond Mat_HYPRESStruct *mx = (Mat_HYPRESStruct*)(pc->pmat->data); 2259ace3abfcSBarry Smith PetscBool flg; 2260d851a50bSGlenn Hammond 2261d851a50bSGlenn Hammond PetscFunctionBegin; 2262251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)pc->pmat,MATHYPRESSTRUCT,&flg);CHKERRQ(ierr); 2263ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)pc),PETSC_ERR_ARG_INCOMP,"Must use MATHYPRESSTRUCT with this preconditioner"); 2264d851a50bSGlenn Hammond 2265d851a50bSGlenn Hammond /* create the hypre sstruct solver object and set its information */ 22662fa5cd67SKarl Rupp if (ex->ss_solver) PetscStackCallStandard(HYPRE_SStructSysPFMGDestroy,(ex->ss_solver)); 2267fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGCreate,(ex->hcomm,&ex->ss_solver)); 2268fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetZeroGuess,(ex->ss_solver)); 2269fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGSetup,(ex->ss_solver,mx->ss_mat,mx->ss_b,mx->ss_x)); 2270d851a50bSGlenn Hammond PetscFunctionReturn(0); 2271d851a50bSGlenn Hammond } 2272d851a50bSGlenn Hammond 2273d851a50bSGlenn Hammond 2274d851a50bSGlenn Hammond /*MC 2275d851a50bSGlenn Hammond PCSysPFMG - the hypre SysPFMG multigrid solver 2276d851a50bSGlenn Hammond 2277d851a50bSGlenn Hammond Level: advanced 2278d851a50bSGlenn Hammond 2279d851a50bSGlenn Hammond Options Database: 2280d851a50bSGlenn Hammond + -pc_syspfmg_its <its> number of iterations of SysPFMG to use as preconditioner 2281d851a50bSGlenn Hammond . -pc_syspfmg_num_pre_relax <steps> number of smoothing steps before coarse grid 2282d851a50bSGlenn Hammond . -pc_syspfmg_num_post_relax <steps> number of smoothing steps after coarse grid 2283d851a50bSGlenn Hammond . -pc_syspfmg_tol <tol> tolerance of SysPFMG 2284d851a50bSGlenn Hammond . -pc_syspfmg_relax_type -relaxation type for the up and down cycles, one of Weighted-Jacobi,Red/Black-Gauss-Seidel 2285d851a50bSGlenn Hammond 2286d851a50bSGlenn Hammond Notes: This is for CELL-centered descretizations 2287d851a50bSGlenn Hammond 2288f6680f47SSatish Balay This must be used with the MATHYPRESSTRUCT matrix type. 2289aa219208SBarry Smith This is less general than in hypre, it supports only one part, and one block per process defined by a PETSc DMDA. 2290d851a50bSGlenn Hammond Also, only cell-centered variables. 2291d851a50bSGlenn Hammond 2292d851a50bSGlenn Hammond .seealso: PCMG, MATHYPRESSTRUCT 2293d851a50bSGlenn Hammond M*/ 2294d851a50bSGlenn Hammond 2295d851a50bSGlenn Hammond #undef __FUNCT__ 2296d851a50bSGlenn Hammond #define __FUNCT__ "PCCreate_SysPFMG" 22978cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PCCreate_SysPFMG(PC pc) 2298d851a50bSGlenn Hammond { 2299d851a50bSGlenn Hammond PetscErrorCode ierr; 2300d851a50bSGlenn Hammond PC_SysPFMG *ex; 2301d851a50bSGlenn Hammond 2302d851a50bSGlenn Hammond PetscFunctionBegin; 2303b00a9115SJed Brown ierr = PetscNew(&ex);CHKERRQ(ierr); \ 2304d851a50bSGlenn Hammond pc->data = ex; 2305d851a50bSGlenn Hammond 2306d851a50bSGlenn Hammond ex->its = 1; 2307d851a50bSGlenn Hammond ex->tol = 1.e-8; 2308d851a50bSGlenn Hammond ex->relax_type = 1; 2309d851a50bSGlenn Hammond ex->num_pre_relax = 1; 2310d851a50bSGlenn Hammond ex->num_post_relax = 1; 2311d851a50bSGlenn Hammond 2312d851a50bSGlenn Hammond pc->ops->setfromoptions = PCSetFromOptions_SysPFMG; 2313d851a50bSGlenn Hammond pc->ops->view = PCView_SysPFMG; 2314d851a50bSGlenn Hammond pc->ops->destroy = PCDestroy_SysPFMG; 2315d851a50bSGlenn Hammond pc->ops->apply = PCApply_SysPFMG; 2316d851a50bSGlenn Hammond pc->ops->applyrichardson = PCApplyRichardson_SysPFMG; 2317d851a50bSGlenn Hammond pc->ops->setup = PCSetUp_SysPFMG; 23182fa5cd67SKarl Rupp 2319ce94432eSBarry Smith ierr = MPI_Comm_dup(PetscObjectComm((PetscObject)pc),&(ex->hcomm));CHKERRQ(ierr); 2320fd3f9acdSBarry Smith PetscStackCallStandard(HYPRE_SStructSysPFMGCreate,(ex->hcomm,&ex->ss_solver)); 2321d851a50bSGlenn Hammond PetscFunctionReturn(0); 2322d851a50bSGlenn Hammond } 2323