97 kspconvergedreason :: flag
98 class(PetscCnvgCtxType),
pointer :: context
99 petscerrorcode :: ierr
101 petscreal,
parameter :: min_one = -1.0
102 petscreal,
dimension(:),
pointer :: local_dx, local_res
103 petscreal :: xnorm_inf_ims, rnorm_inf_ims, rnorm_l2_ims
104 petscreal :: dvmax_model, rmax_model
105 petscint :: idx_dv, idx_r
108 type(ConvergenceSummaryType),
pointer :: summary
110 petscint :: i, j, istart, iend
112 summary => context%cnvg_summary
116 call kspbuildsolution(ksp, petsc_null_vec, x, ierr)
119 call kspgetrhs(ksp, rhs, ierr)
122 call kspgetoperators(ksp, amat, petsc_null_mat, ierr)
125 call matmult(amat, x, context%residual, ierr)
129 call vecaypx(context%residual, -1.0_dp, rhs, ierr)
132 call vecnorm(context%residual, norm_2, rnorm_l2_ims, ierr)
137 context%rnorm_L2_init = rnorm_l2_ims
138 if (rnorm_l2 < rnorm_l2_tol)
then
140 flag = ksp_converged_happy_breakdown
142 call veccopy(x, context%x_old, ierr)
144 flag = ksp_converged_iterating
151 summary%iter_cnt = summary%iter_cnt + 1
152 iter_cnt = summary%iter_cnt
154 if (summary%nitermax > 1)
then
155 summary%itinner(iter_cnt) = n
156 do i = 1, summary%convnmod
157 summary%convdvmax(i, iter_cnt) = dzero
158 summary%convlocdv(i, iter_cnt) = 0
159 summary%convrmax(i, iter_cnt) = dzero
160 summary%convlocr(i, iter_cnt) = 0
164 call vecwaxpy(context%delta_x, min_one, context%x_old, x, ierr)
167 call vecnorm(context%delta_x, norm_infinity, xnorm_inf_ims, ierr)
171 if (context%icnvgopt == 0 .or. context%icnvgopt == 1)
then
172 call vecnorm(context%residual, norm_infinity, rnorm_inf_ims, ierr)
176 call veccopy(x, context%x_old, ierr)
180 call vecgetarrayreadf90(context%delta_x, local_dx, ierr)
182 call vecgetarrayreadf90(context%residual, local_res, ierr)
184 do i = 1, summary%convnmod
191 istart = summary%model_bounds(i)
192 iend = summary%model_bounds(i + 1) - 1
194 if (abs(local_dx(j)) > abs(dvmax_model))
then
195 dvmax_model = local_dx(j)
198 if (abs(local_res(j)) > abs(rmax_model))
then
199 rmax_model = local_res(j)
203 if (summary%nitermax > 1)
then
204 summary%convdvmax(i, iter_cnt) = dvmax_model
205 summary%convlocdv(i, iter_cnt) = idx_dv
206 summary%convrmax(i, iter_cnt) = rmax_model
207 summary%convlocr(i, iter_cnt) = idx_r
210 call vecrestorearrayf90(context%delta_x, local_dx, ierr)
212 call vecrestorearrayf90(context%residual, local_res, ierr)
215 if (rnorm_l2 < rnorm_l2_tol)
then
217 flag = ksp_converged_happy_breakdown
220 flag = apply_check(context, n, xnorm_inf_ims, rnorm_inf_ims, rnorm_l2_ims)
223 if (flag == ksp_converged_iterating)
then
225 if (n == context%max_its)
then
226 flag = ksp_diverged_its