void hypre_F90_IFACE(hypre_structbicgstabsolve, HYPRE_STRUCTBICGSTABSOLVE) ( hypre_F90_Obj *solver, hypre_F90_Obj *A, hypre_F90_Obj *b, hypre_F90_Obj *x, hypre_F90_Int *ierr ) { *ierr = (hypre_F90_Int) ( HYPRE_StructBiCGSTABSolve( hypre_F90_PassObj (HYPRE_StructSolver, solver), hypre_F90_PassObj (HYPRE_StructMatrix, A), hypre_F90_PassObj (HYPRE_StructVector, b), hypre_F90_PassObj (HYPRE_StructVector, x) ) ); }
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