void hypre_F90_IFACE(hypre_structpfmgsetrelchange, HYPRE_STRUCTPFMGSETRELCHANGE) ( hypre_F90_Obj *solver, hypre_F90_Int *rel_change, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructPFMGSetRelChange( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (rel_change) ) ); }
void CCDivGradHypreLevelSolver::setupHypreSolver() { // Get the MPI communicator. #ifdef HAVE_MPI MPI_Comm communicator = SAMRAI_MPI::getCommunicator(); #else MPI_Comm communicator; #endif // When using a Krylov method, setup the preconditioner. if (d_solver_type == "PCG" || d_solver_type == "GMRES" || d_solver_type == "FlexGMRES" || d_solver_type == "LGMRES" || d_solver_type == "BiCGSTAB") { if (d_precond_type == "PFMG") { HYPRE_StructPFMGCreate(communicator, &d_precond); HYPRE_StructPFMGSetMaxIter(d_precond, 1); HYPRE_StructPFMGSetTol(d_precond, 0.0); HYPRE_StructPFMGSetZeroGuess(d_precond); HYPRE_StructPFMGSetRAPType(d_precond, d_rap_type); HYPRE_StructPFMGSetRelaxType(d_precond, d_relax_type); HYPRE_StructPFMGSetNumPreRelax(d_precond, d_num_pre_relax_steps); HYPRE_StructPFMGSetNumPostRelax(d_precond, d_num_post_relax_steps); HYPRE_StructPFMGSetSkipRelax(d_precond, d_skip_relax); } else if (d_precond_type == "SMG") { HYPRE_StructSMGCreate(communicator, &d_precond); HYPRE_StructSMGSetMaxIter(d_precond, 1); HYPRE_StructSMGSetTol(d_precond, 0.0); HYPRE_StructSMGSetZeroGuess(d_precond); HYPRE_StructSMGSetMemoryUse(d_precond, d_memory_use); HYPRE_StructSMGSetNumPreRelax(d_precond, d_num_pre_relax_steps); HYPRE_StructSMGSetNumPostRelax(d_precond, d_num_post_relax_steps); } else if (d_precond_type == "Jacobi") { HYPRE_StructJacobiCreate(communicator, &d_precond); HYPRE_StructJacobiSetMaxIter(d_precond, 2); HYPRE_StructJacobiSetTol(d_precond, 0.0); HYPRE_StructJacobiSetZeroGuess(d_precond); } } // Setup the solver. if (d_solver_type == "PFMG") { HYPRE_StructPFMGCreate(communicator, &d_solver); HYPRE_StructPFMGSetMaxIter(d_solver, d_max_iterations); HYPRE_StructPFMGSetTol(d_solver, d_rel_residual_tol); HYPRE_StructPFMGSetRelChange(d_solver, d_rel_change); HYPRE_StructPFMGSetRAPType(d_solver, d_rap_type); HYPRE_StructPFMGSetRelaxType(d_solver, d_relax_type); HYPRE_StructPFMGSetNumPreRelax(d_solver, d_num_pre_relax_steps); HYPRE_StructPFMGSetNumPostRelax(d_solver, d_num_post_relax_steps); HYPRE_StructPFMGSetSkipRelax(d_solver, d_skip_relax); if (d_initial_guess_nonzero) { HYPRE_StructPFMGSetNonZeroGuess(d_solver); } else { HYPRE_StructPFMGSetZeroGuess(d_solver); } HYPRE_StructPFMGSetup(d_solver, d_matrix, d_rhs_vec, d_sol_vec); } else if (d_solver_type == "SMG") { HYPRE_StructSMGCreate(communicator, &d_solver); HYPRE_StructSMGSetMaxIter(d_solver, d_max_iterations); HYPRE_StructSMGSetTol(d_solver, d_rel_residual_tol); HYPRE_StructSMGSetRelChange(d_solver, d_rel_change); HYPRE_StructSMGSetMemoryUse(d_solver, d_memory_use); HYPRE_StructSMGSetNumPreRelax(d_solver, d_num_pre_relax_steps); HYPRE_StructSMGSetNumPostRelax(d_solver, d_num_post_relax_steps); if (d_initial_guess_nonzero) { HYPRE_StructSMGSetNonZeroGuess(d_solver); } else { HYPRE_StructSMGSetZeroGuess(d_solver); } HYPRE_StructSMGSetup(d_solver, d_matrix, d_rhs_vec, d_sol_vec); } else if (d_solver_type == "PCG") { HYPRE_StructPCGCreate(communicator, &d_solver); HYPRE_StructPCGSetMaxIter(d_solver, d_max_iterations); HYPRE_StructPCGSetTol(d_solver, d_rel_residual_tol); HYPRE_StructPCGSetAbsoluteTol(d_solver, d_abs_residual_tol); HYPRE_StructPCGSetTwoNorm(d_solver, d_two_norm); HYPRE_StructPCGSetRelChange(d_solver, d_rel_change); if (d_precond_type == "PFMG") { HYPRE_StructPCGSetPrecond(d_solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, d_precond); } else if (d_precond_type == "SMG") { HYPRE_StructPCGSetPrecond(d_solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, d_precond); } else if (d_precond_type == "Jacobi") { HYPRE_StructPCGSetPrecond(d_solver, HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, d_precond); } else if (d_precond_type == "diagonal_scaling") { d_precond = NULL; HYPRE_StructPCGSetPrecond(d_solver, HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, d_precond); } else if (d_precond_type == "none") { d_precond = NULL; } else { TBOX_ERROR(d_object_name << "::initializeSolverState()\n" << " unknown preconditioner type: " << d_precond_type << std::endl); } HYPRE_StructPCGSetup(d_solver, d_matrix, d_rhs_vec, d_sol_vec); } else if (d_solver_type == "GMRES") { HYPRE_StructGMRESCreate(communicator, &d_solver); HYPRE_StructGMRESSetMaxIter(d_solver, d_max_iterations); HYPRE_StructGMRESSetTol(d_solver, d_rel_residual_tol); HYPRE_StructGMRESSetAbsoluteTol(d_solver, d_abs_residual_tol); if (d_precond_type == "PFMG") { HYPRE_StructGMRESSetPrecond(d_solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, d_precond); } else if (d_precond_type == "SMG") { HYPRE_StructGMRESSetPrecond(d_solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, d_precond); } else if (d_precond_type == "Jacobi") { HYPRE_StructGMRESSetPrecond(d_solver, HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, d_precond); } else if (d_precond_type == "diagonal_scaling") { d_precond = NULL; HYPRE_StructGMRESSetPrecond(d_solver, HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, d_precond); } else if (d_precond_type == "none") { d_precond = NULL; } else { TBOX_ERROR(d_object_name << "::initializeSolverState()\n" << " unknown preconditioner type: " << d_precond_type << std::endl); } HYPRE_StructGMRESSetup(d_solver, d_matrix, d_rhs_vec, d_sol_vec); } else if (d_solver_type == "FlexGMRES") { HYPRE_StructFlexGMRESCreate(communicator, &d_solver); HYPRE_StructFlexGMRESSetMaxIter(d_solver, d_max_iterations); HYPRE_StructFlexGMRESSetTol(d_solver, d_rel_residual_tol); HYPRE_StructFlexGMRESSetAbsoluteTol(d_solver, d_abs_residual_tol); if (d_precond_type == "PFMG") { HYPRE_StructFlexGMRESSetPrecond(d_solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, d_precond); } else if (d_precond_type == "SMG") { HYPRE_StructFlexGMRESSetPrecond(d_solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, d_precond); } else if (d_precond_type == "Jacobi") { HYPRE_StructFlexGMRESSetPrecond(d_solver, HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, d_precond); } else if (d_precond_type == "diagonal_scaling") { d_precond = NULL; HYPRE_StructFlexGMRESSetPrecond(d_solver, HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, d_precond); } else if (d_precond_type == "none") { d_precond = NULL; } else { TBOX_ERROR(d_object_name << "::initializeSolverState()\n" << " unknown preconditioner type: " << d_precond_type << std::endl); } HYPRE_StructFlexGMRESSetup(d_solver, d_matrix, d_rhs_vec, d_sol_vec); } else if (d_solver_type == "LGMRES") { HYPRE_StructLGMRESCreate(communicator, &d_solver); HYPRE_StructLGMRESSetMaxIter(d_solver, d_max_iterations); HYPRE_StructLGMRESSetTol(d_solver, d_rel_residual_tol); HYPRE_StructLGMRESSetAbsoluteTol(d_solver, d_abs_residual_tol); if (d_precond_type == "PFMG") { HYPRE_StructLGMRESSetPrecond(d_solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, d_precond); } else if (d_precond_type == "SMG") { HYPRE_StructLGMRESSetPrecond(d_solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, d_precond); } else if (d_precond_type == "Jacobi") { HYPRE_StructLGMRESSetPrecond(d_solver, HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, d_precond); } else if (d_precond_type == "diagonal_scaling") { d_precond = NULL; HYPRE_StructLGMRESSetPrecond(d_solver, HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, d_precond); } else if (d_precond_type == "none") { d_precond = NULL; } else { TBOX_ERROR(d_object_name << "::initializeSolverState()\n" << " unknown preconditioner type: " << d_precond_type << std::endl); } HYPRE_StructLGMRESSetup(d_solver, d_matrix, d_rhs_vec, d_sol_vec); } else if (d_solver_type == "BiCGSTAB") { HYPRE_StructBiCGSTABCreate(communicator, &d_solver); HYPRE_StructBiCGSTABSetMaxIter(d_solver, d_max_iterations); HYPRE_StructBiCGSTABSetTol(d_solver, d_rel_residual_tol); HYPRE_StructBiCGSTABSetAbsoluteTol(d_solver, d_abs_residual_tol); if (d_precond_type == "PFMG") { HYPRE_StructBiCGSTABSetPrecond(d_solver, HYPRE_StructPFMGSolve, HYPRE_StructPFMGSetup, d_precond); } else if (d_precond_type == "SMG") { HYPRE_StructBiCGSTABSetPrecond(d_solver, HYPRE_StructSMGSolve, HYPRE_StructSMGSetup, d_precond); } else if (d_precond_type == "Jacobi") { HYPRE_StructBiCGSTABSetPrecond(d_solver, HYPRE_StructJacobiSolve, HYPRE_StructJacobiSetup, d_precond); } else if (d_precond_type == "diagonal_scaling") { d_precond = NULL; HYPRE_StructBiCGSTABSetPrecond(d_solver, HYPRE_StructDiagScale, HYPRE_StructDiagScaleSetup, d_precond); } else if (d_precond_type == "none") { d_precond = NULL; } else { TBOX_ERROR(d_object_name << "::initializeSolverState()\n" << " unknown preconditioner type: " << d_precond_type << std::endl); } HYPRE_StructBiCGSTABSetup(d_solver,d_matrix, d_rhs_vec, d_sol_vec); } else { TBOX_ERROR(d_object_name << "::initializeSolverState()\n" << " unknown solver type: " << d_solver_type << std::endl); } return; }// setupHypreSolver