void hypre_F90_IFACE(hypre_structgmressetmaxiter, HYPRE_STRUCTGMRESSETMAXITER) ( hypre_F90_Obj *solver, hypre_F90_Int *max_iter, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructGMRESSetMaxIter( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassInt (max_iter) ) ); }
bool CCDivGradHypreLevelSolver::solveSystem( const int x_idx, const int b_idx, const IntVector<NDIM>& chkbrd_mode_id) { Pointer<PatchLevel<NDIM> > level = d_hierarchy->getPatchLevel(d_level_num); // Copy solution and right-hand-side data to hypre structures. for (PatchLevel<NDIM>::Iterator p(level); p; p++) { Pointer<Patch<NDIM> > patch = level->getPatch(p()); const Box<NDIM>& patch_box = patch->getBox(); Pointer<CellData<NDIM,double> > x_data = patch->getPatchData(x_idx); copyToHypre(d_sol_vec, x_data, patch_box, chkbrd_mode_id); Pointer<CellData<NDIM,double> > b_data = patch->getPatchData(b_idx); copyToHypre(d_rhs_vec, b_data, patch_box, chkbrd_mode_id); } // Assemble the hypre vectors. HYPRE_StructVectorAssemble(d_sol_vec); HYPRE_StructVectorAssemble(d_rhs_vec); // Solve the system. IBTK_TIMER_START(t_solve_system_hypre); if (d_solver_type == "PFMG") { HYPRE_StructPFMGSetMaxIter(d_solver, d_max_iterations); HYPRE_StructPFMGSetTol(d_solver, d_rel_residual_tol); HYPRE_StructPFMGSolve(d_solver, d_matrix, d_rhs_vec, d_sol_vec); HYPRE_StructPFMGGetNumIterations(d_solver, &d_current_its); HYPRE_StructPFMGGetFinalRelativeResidualNorm(d_solver, &d_current_residual_norm); } else if (d_solver_type == "SMG") { HYPRE_StructSMGSetMaxIter(d_solver, d_max_iterations); HYPRE_StructSMGSetTol(d_solver, d_rel_residual_tol); HYPRE_StructSMGSolve(d_solver, d_matrix, d_rhs_vec, d_sol_vec); HYPRE_StructSMGGetNumIterations(d_solver, &d_current_its); HYPRE_StructSMGGetFinalRelativeResidualNorm(d_solver, &d_current_residual_norm); } else if (d_solver_type == "PCG") { HYPRE_StructPCGSetMaxIter(d_solver, d_max_iterations); HYPRE_StructPCGSetTol(d_solver, d_rel_residual_tol); HYPRE_StructPCGSetAbsoluteTol(d_solver, d_abs_residual_tol); HYPRE_StructPCGSolve(d_solver, d_matrix, d_rhs_vec, d_sol_vec); HYPRE_StructPCGGetNumIterations(d_solver, &d_current_its); HYPRE_StructPCGGetFinalRelativeResidualNorm(d_solver, &d_current_residual_norm); } else if (d_solver_type == "GMRES") { HYPRE_StructGMRESSetMaxIter(d_solver, d_max_iterations); HYPRE_StructGMRESSetTol(d_solver, d_rel_residual_tol); HYPRE_StructGMRESSetAbsoluteTol(d_solver, d_abs_residual_tol); HYPRE_StructGMRESSolve(d_solver, d_matrix, d_rhs_vec, d_sol_vec); HYPRE_StructGMRESGetNumIterations(d_solver, &d_current_its); HYPRE_StructGMRESGetFinalRelativeResidualNorm(d_solver, &d_current_residual_norm); } else if (d_solver_type == "FlexGMRES") { HYPRE_StructFlexGMRESSetMaxIter(d_solver, d_max_iterations); HYPRE_StructFlexGMRESSetTol(d_solver, d_rel_residual_tol); HYPRE_StructFlexGMRESSetAbsoluteTol(d_solver, d_abs_residual_tol); HYPRE_StructFlexGMRESSolve(d_solver, d_matrix, d_rhs_vec, d_sol_vec); HYPRE_StructFlexGMRESGetNumIterations(d_solver, &d_current_its); HYPRE_StructFlexGMRESGetFinalRelativeResidualNorm(d_solver, &d_current_residual_norm); } else if (d_solver_type == "LGMRES") { HYPRE_StructLGMRESSetMaxIter(d_solver, d_max_iterations); HYPRE_StructLGMRESSetTol(d_solver, d_rel_residual_tol); HYPRE_StructLGMRESSetAbsoluteTol(d_solver, d_abs_residual_tol); HYPRE_StructLGMRESSolve(d_solver, d_matrix, d_rhs_vec, d_sol_vec); HYPRE_StructLGMRESGetNumIterations(d_solver, &d_current_its); HYPRE_StructLGMRESGetFinalRelativeResidualNorm(d_solver, &d_current_residual_norm); } else if (d_solver_type == "BiCGSTAB") { HYPRE_StructBiCGSTABSetMaxIter(d_solver, d_max_iterations); HYPRE_StructBiCGSTABSetTol(d_solver, d_rel_residual_tol); HYPRE_StructBiCGSTABSetAbsoluteTol(d_solver, d_abs_residual_tol); HYPRE_StructBiCGSTABSolve(d_solver, d_matrix, d_rhs_vec, d_sol_vec); HYPRE_StructBiCGSTABGetNumIterations(d_solver, &d_current_its); HYPRE_StructBiCGSTABGetFinalRelativeResidualNorm(d_solver, &d_current_residual_norm); } IBTK_TIMER_STOP(t_solve_system_hypre); // Pull the solution vector out of the hypre structures. for (PatchLevel<NDIM>::Iterator p(level); p; p++) { Pointer<Patch<NDIM> > patch = level->getPatch(p()); const Box<NDIM>& patch_box = patch->getBox(); Pointer<CellData<NDIM,double> > x_data = patch->getPatchData(x_idx); copyFromHypre(x_data, d_sol_vec, patch_box, chkbrd_mode_id); } return (d_current_residual_norm <= d_rel_residual_tol || d_current_residual_norm <= d_abs_residual_tol); }// solveSystem
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