10#include "scaleFElib.h"
20 use scale_prc,
only: prc_abort
40 integer :: current_p_lev
41 integer :: current_h_lev
43 integer :: vcyc_num_max
44 real(rp) :: history_residual_l2_initial
45 real(rp) :: history_residual_max_initial
47 real(rp) :: threshold_ratio_residual_l2
48 real(rp) :: threshold_residual_l2
49 real(rp) :: threshold_residual_max
51 procedure :: set_vcycle_parameter => multigridsolverbase_set_vcyc_param
52 procedure :: is_converged => multigridsolverbase_is_converged
83 this%vcyc_num_max = 10
98 subroutine multigridsolverbase_set_vcyc_param( this, &
99 vcyc_num_max, threshold_ratio_residual_l2, threshold_residual_l2, threshold_residual_max )
102 integer,
intent(in) :: vcyc_num_max
103 real(rp),
intent(in) :: threshold_ratio_residual_l2
104 real(rp),
intent(in) :: threshold_residual_l2
105 real(rp),
intent(in) :: threshold_residual_max
107 this%vcyc_num_max = vcyc_num_max
108 this%threshold_ratio_residual_l2 = threshold_ratio_residual_l2
109 this%threshold_residual_l2 = threshold_residual_l2
110 this%threshold_residual_max = threshold_residual_max
112 end subroutine multigridsolverbase_set_vcyc_param
116 function multigridsolverbase_is_converged( this, smoother )
result( conv_flag )
123 real(rp) :: res_l2, res_max
124 real(rp) :: res_decrease_ratio_l2
127 call smoother%Get_current_residual_statistics( res_l2, res_max )
129 res_decrease_ratio_l2 = res_l2 / this%history_residual_l2_initial
130 if ( ( res_decrease_ratio_l2 < this%threshold_ratio_residual_l2 ) &
131 .or. ( res_l2 < this%threshold_residual_l2 &
132 .and. res_max < this%threshold_residual_max ) )
then
138 end function multigridsolverbase_is_converged
module FElib / Mesh / Hierarchy base
integer, parameter, public mesh_hierarchy_type_pmg
Type ID of mesh hierarchy: p-MG.
integer, parameter, public mesh_hierarchy_hmg_finest_level
Finest level index in h-MG.
integer, parameter, public mesh_hierarchy_type_hmg
Type ID of mesh hierarchy: h-MG.
integer, parameter, public mesh_hierarchy_pmg_finest_level
Finest level index in p-MG.
module FElib / Multigrid / Smoother base
module FElib / Multigrid / Solver base
subroutine, public multigridsolverbase_final(this)
Finalize a base object for multigrid solver.
subroutine, public multigridsolverbase_init(this, mesh_hierarchy)
Initialize a base object for multigrid solver.
Base type for mesh hierarchy.
Base type for multigrid smoother.
Base type for multigrid solver.