|
|
@ -345,7 +345,7 @@ module mld_prec_type
|
|
|
|
! Character constants used by mld_file_prec_descr
|
|
|
|
! Character constants used by mld_file_prec_descr
|
|
|
|
!
|
|
|
|
!
|
|
|
|
character(len=19), parameter, private :: &
|
|
|
|
character(len=19), parameter, private :: &
|
|
|
|
& eigen_estimates(0:0)=(/'Infinity norm '/)
|
|
|
|
& eigen_estimates(0:0)=(/'infinity norm '/)
|
|
|
|
character(len=19), parameter, private :: &
|
|
|
|
character(len=19), parameter, private :: &
|
|
|
|
& smooth_names(1:3)=(/'pre-smoothing ','post-smoothing ',&
|
|
|
|
& smooth_names(1:3)=(/'pre-smoothing ','post-smoothing ',&
|
|
|
|
& 'pre/post-smoothing'/)
|
|
|
|
& 'pre/post-smoothing'/)
|
|
|
@ -806,6 +806,17 @@ contains
|
|
|
|
write(iout,*) ' Aggregation threshold: ', &
|
|
|
|
write(iout,*) ' Aggregation threshold: ', &
|
|
|
|
& dprcparm(mld_aggr_thresh_)
|
|
|
|
& dprcparm(mld_aggr_thresh_)
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
|
|
|
|
if (iprcparm(mld_aggr_kind_) /= mld_no_smooth_) then
|
|
|
|
|
|
|
|
if (iprcparm(mld_aggr_omega_alg_) == mld_eig_est_) then
|
|
|
|
|
|
|
|
write(iout,*) ' Damping omega computation: spectral radius estimate'
|
|
|
|
|
|
|
|
write(iout,*) ' Spectral radius estimate: ', &
|
|
|
|
|
|
|
|
& eigen_estimates(iprcparm(mld_aggr_eig_))
|
|
|
|
|
|
|
|
else if (iprcparm(mld_aggr_omega_alg_) == mld_user_choice_) then
|
|
|
|
|
|
|
|
write(iout,*) ' Damping omega computation: user defined value.'
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
write(iout,*) ' Damping omega computation: unknown value in iprcparm!!'
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
return
|
|
|
@ -835,16 +846,6 @@ contains
|
|
|
|
& nlaggr(:)
|
|
|
|
& nlaggr(:)
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
if (iprcparm(mld_aggr_kind_) /= mld_no_smooth_) then
|
|
|
|
if (iprcparm(mld_aggr_kind_) /= mld_no_smooth_) then
|
|
|
|
if (iprcparm(mld_aggr_omega_alg_) == mld_eig_est_) then
|
|
|
|
|
|
|
|
write(iout,*) ' Algorithm for damping omega: eigenvalue estimate'
|
|
|
|
|
|
|
|
write(iout,*) ' Eigenvalue estimate: ', &
|
|
|
|
|
|
|
|
& eigen_estimates(iprcparm(mld_aggr_eig_))
|
|
|
|
|
|
|
|
else if (iprcparm(mld_aggr_omega_alg_) == mld_user_choice_) then
|
|
|
|
|
|
|
|
write(iout,*) ' Algorithm for damping omega: user defined value.'
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
write(iout,*) ' Algorithm for damping omega: unknown value in iprcparm!!'
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (present(rprcparm)) then
|
|
|
|
if (present(rprcparm)) then
|
|
|
|
write(iout,*) ' Damping omega: ', &
|
|
|
|
write(iout,*) ' Damping omega: ', &
|
|
|
|
& rprcparm(mld_aggr_omega_val_)
|
|
|
|
& rprcparm(mld_aggr_omega_val_)
|
|
|
@ -885,15 +886,7 @@ contains
|
|
|
|
& nlaggr(:)
|
|
|
|
& nlaggr(:)
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
if (iprcparm(mld_aggr_kind_) /= mld_no_smooth_) then
|
|
|
|
if (iprcparm(mld_aggr_kind_) /= mld_no_smooth_) then
|
|
|
|
if (iprcparm(mld_aggr_omega_alg_) == mld_eig_est_) then
|
|
|
|
|
|
|
|
write(iout,*) ' Algorithm for damping omega: eigenvalue estimate'
|
|
|
|
|
|
|
|
write(iout,*) ' Eigenvalue estimate: ', &
|
|
|
|
|
|
|
|
& eigen_estimates(iprcparm(mld_aggr_eig_))
|
|
|
|
|
|
|
|
else if (iprcparm(mld_aggr_omega_alg_) == mld_user_choice_) then
|
|
|
|
|
|
|
|
write(iout,*) ' Algorithm for damping omega: user defined value.'
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
write(iout,*) ' Algorithm for damping omega: unknown value in iprcparm!!'
|
|
|
|
|
|
|
|
end if
|
|
|
|
|
|
|
|
if (present(rprcparm)) then
|
|
|
|
if (present(rprcparm)) then
|
|
|
|
write(iout,*) ' Damping omega: ', &
|
|
|
|
write(iout,*) ' Damping omega: ', &
|
|
|
|
& rprcparm(mld_aggr_omega_val_)
|
|
|
|
& rprcparm(mld_aggr_omega_val_)
|
|
|
@ -986,6 +979,7 @@ contains
|
|
|
|
!
|
|
|
|
!
|
|
|
|
if (me==psb_root_) then
|
|
|
|
if (me==psb_root_) then
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Preconditioner description'
|
|
|
|
write(iout_,*) 'Preconditioner description'
|
|
|
|
nlev = size(p%baseprecv)
|
|
|
|
nlev = size(p%baseprecv)
|
|
|
|
if (nlev >= 1) then
|
|
|
|
if (nlev >= 1) then
|
|
|
@ -997,6 +991,7 @@ contains
|
|
|
|
|
|
|
|
|
|
|
|
if (nlev > 1) then
|
|
|
|
if (nlev > 1) then
|
|
|
|
write(iout_,*) 'Multilevel Schwarz'
|
|
|
|
write(iout_,*) 'Multilevel Schwarz'
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Base preconditioner (smoother) details'
|
|
|
|
write(iout_,*) 'Base preconditioner (smoother) details'
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
@ -1011,7 +1006,7 @@ contains
|
|
|
|
!
|
|
|
|
!
|
|
|
|
! Print multilevel details
|
|
|
|
! Print multilevel details
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Multilevel details'
|
|
|
|
write(iout_,*) 'Multilevel details'
|
|
|
|
|
|
|
|
|
|
|
|
do ilev = 2, nlev
|
|
|
|
do ilev = 2, nlev
|
|
|
@ -1037,7 +1032,7 @@ contains
|
|
|
|
! Coarse matrices are different at levels 2,...,nlev-1, hence related
|
|
|
|
! Coarse matrices are different at levels 2,...,nlev-1, hence related
|
|
|
|
! info is printed separately
|
|
|
|
! info is printed separately
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
do ilev = 2, nlev-1
|
|
|
|
do ilev = 2, nlev-1
|
|
|
|
call mld_ml_level_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
call mld_ml_level_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
@ -1049,15 +1044,18 @@ contains
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
|
|
|
|
ilev = nlev
|
|
|
|
ilev = nlev
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
call mld_ml_coarse_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
call mld_ml_coarse_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
|
& dprcparm=p%baseprecv(ilev)%rprcparm)
|
|
|
|
& dprcparm=p%baseprecv(ilev)%rprcparm)
|
|
|
|
|
|
|
|
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
else
|
|
|
|
else
|
|
|
|
|
|
|
|
write(iout_,*) trim(name), &
|
|
|
|
write(iout_,*) trim(name),': Error: no base preconditioner available, something is wrong!'
|
|
|
|
& ': Error: no base preconditioner available, something is wrong!'
|
|
|
|
info = -2
|
|
|
|
info = -2
|
|
|
|
return
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
endif
|
|
|
@ -1100,6 +1098,7 @@ contains
|
|
|
|
!
|
|
|
|
!
|
|
|
|
if (me==psb_root_) then
|
|
|
|
if (me==psb_root_) then
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Preconditioner description'
|
|
|
|
write(iout_,*) 'Preconditioner description'
|
|
|
|
nlev = size(p%baseprecv)
|
|
|
|
nlev = size(p%baseprecv)
|
|
|
|
if (nlev >= 1) then
|
|
|
|
if (nlev >= 1) then
|
|
|
@ -1111,6 +1110,7 @@ contains
|
|
|
|
|
|
|
|
|
|
|
|
if (nlev > 1) then
|
|
|
|
if (nlev > 1) then
|
|
|
|
write(iout_,*) 'Multilevel Schwarz'
|
|
|
|
write(iout_,*) 'Multilevel Schwarz'
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Base preconditioner (smoother) details'
|
|
|
|
write(iout_,*) 'Base preconditioner (smoother) details'
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
@ -1125,7 +1125,7 @@ contains
|
|
|
|
!
|
|
|
|
!
|
|
|
|
! Print multilevel details
|
|
|
|
! Print multilevel details
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Multilevel details'
|
|
|
|
write(iout_,*) 'Multilevel details'
|
|
|
|
|
|
|
|
|
|
|
|
do ilev = 2, nlev
|
|
|
|
do ilev = 2, nlev
|
|
|
@ -1151,7 +1151,7 @@ contains
|
|
|
|
! Coarse matrices are different at levels 2,...,nlev-1, hence related
|
|
|
|
! Coarse matrices are different at levels 2,...,nlev-1, hence related
|
|
|
|
! info is printed separately
|
|
|
|
! info is printed separately
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
do ilev = 2, nlev-1
|
|
|
|
do ilev = 2, nlev-1
|
|
|
|
call mld_ml_level_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
call mld_ml_level_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
@ -1163,15 +1163,18 @@ contains
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
|
|
|
|
ilev = nlev
|
|
|
|
ilev = nlev
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
call mld_ml_coarse_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
call mld_ml_coarse_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
|
& rprcparm=p%baseprecv(ilev)%rprcparm)
|
|
|
|
& rprcparm=p%baseprecv(ilev)%rprcparm)
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
else
|
|
|
|
else
|
|
|
|
|
|
|
|
|
|
|
|
write(iout_,*) trim(name),': Error: no base preconditioner available, something is wrong!'
|
|
|
|
write(iout_,*) trim(name), &
|
|
|
|
|
|
|
|
& ': Error: no base preconditioner available, something is wrong!'
|
|
|
|
info = -2
|
|
|
|
info = -2
|
|
|
|
return
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
endif
|
|
|
@ -1236,6 +1239,7 @@ contains
|
|
|
|
!
|
|
|
|
!
|
|
|
|
if (me==psb_root_) then
|
|
|
|
if (me==psb_root_) then
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Preconditioner description'
|
|
|
|
write(iout_,*) 'Preconditioner description'
|
|
|
|
nlev = size(p%baseprecv)
|
|
|
|
nlev = size(p%baseprecv)
|
|
|
|
if (nlev >= 1) then
|
|
|
|
if (nlev >= 1) then
|
|
|
@ -1247,6 +1251,7 @@ contains
|
|
|
|
|
|
|
|
|
|
|
|
if (nlev > 1) then
|
|
|
|
if (nlev > 1) then
|
|
|
|
write(iout_,*) 'Multilevel Schwarz'
|
|
|
|
write(iout_,*) 'Multilevel Schwarz'
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Base preconditioner (smoother) details'
|
|
|
|
write(iout_,*) 'Base preconditioner (smoother) details'
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
@ -1261,7 +1266,7 @@ contains
|
|
|
|
!
|
|
|
|
!
|
|
|
|
! Print multilevel details
|
|
|
|
! Print multilevel details
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Multilevel details'
|
|
|
|
write(iout_,*) 'Multilevel details'
|
|
|
|
|
|
|
|
|
|
|
|
do ilev = 2, nlev
|
|
|
|
do ilev = 2, nlev
|
|
|
@ -1287,7 +1292,7 @@ contains
|
|
|
|
! Coarse matrices are different at levels 2,...,nlev-1, hence related
|
|
|
|
! Coarse matrices are different at levels 2,...,nlev-1, hence related
|
|
|
|
! info is printed separately
|
|
|
|
! info is printed separately
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
do ilev = 2, nlev-1
|
|
|
|
do ilev = 2, nlev-1
|
|
|
|
call mld_ml_level_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
call mld_ml_level_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
@ -1299,15 +1304,17 @@ contains
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
|
|
|
|
ilev = nlev
|
|
|
|
ilev = nlev
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
call mld_ml_coarse_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
call mld_ml_coarse_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
|
& dprcparm=p%baseprecv(ilev)%rprcparm)
|
|
|
|
& dprcparm=p%baseprecv(ilev)%rprcparm)
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
else
|
|
|
|
else
|
|
|
|
|
|
|
|
write(iout_,*) trim(name), &
|
|
|
|
write(iout_,*) trim(name),': Error: no base preconditioner available, something is wrong!'
|
|
|
|
& ': Error: no base preconditioner available, something is wrong!'
|
|
|
|
info = -2
|
|
|
|
info = -2
|
|
|
|
return
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
endif
|
|
|
@ -1348,7 +1355,7 @@ contains
|
|
|
|
! ensured by mld_precbld).
|
|
|
|
! ensured by mld_precbld).
|
|
|
|
!
|
|
|
|
!
|
|
|
|
if (me==psb_root_) then
|
|
|
|
if (me==psb_root_) then
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Preconditioner description'
|
|
|
|
write(iout_,*) 'Preconditioner description'
|
|
|
|
nlev = size(p%baseprecv)
|
|
|
|
nlev = size(p%baseprecv)
|
|
|
|
if (nlev >= 1) then
|
|
|
|
if (nlev >= 1) then
|
|
|
@ -1360,6 +1367,7 @@ contains
|
|
|
|
|
|
|
|
|
|
|
|
if (nlev > 1) then
|
|
|
|
if (nlev > 1) then
|
|
|
|
write(iout_,*) 'Multilevel Schwarz'
|
|
|
|
write(iout_,*) 'Multilevel Schwarz'
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Base preconditioner (smoother) details'
|
|
|
|
write(iout_,*) 'Base preconditioner (smoother) details'
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
@ -1374,7 +1382,7 @@ contains
|
|
|
|
!
|
|
|
|
!
|
|
|
|
! Print multilevel details
|
|
|
|
! Print multilevel details
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
write(iout_,*) 'Multilevel details'
|
|
|
|
write(iout_,*) 'Multilevel details'
|
|
|
|
|
|
|
|
|
|
|
|
do ilev = 2, nlev
|
|
|
|
do ilev = 2, nlev
|
|
|
@ -1400,6 +1408,7 @@ contains
|
|
|
|
! Coarse matrices are different at levels 2,...,nlev-1, hence related
|
|
|
|
! Coarse matrices are different at levels 2,...,nlev-1, hence related
|
|
|
|
! info is printed separately
|
|
|
|
! info is printed separately
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
|
|
|
|
|
|
|
|
do ilev = 2, nlev-1
|
|
|
|
do ilev = 2, nlev-1
|
|
|
|
call mld_ml_level_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
call mld_ml_level_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
@ -1412,15 +1421,17 @@ contains
|
|
|
|
!
|
|
|
|
!
|
|
|
|
|
|
|
|
|
|
|
|
ilev = nlev
|
|
|
|
ilev = nlev
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
call mld_ml_coarse_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
call mld_ml_coarse_descr(iout_,ilev,p%baseprecv(ilev)%iprcparm,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
|
& p%baseprecv(ilev)%nlaggr,info,&
|
|
|
|
& rprcparm=p%baseprecv(ilev)%rprcparm)
|
|
|
|
& rprcparm=p%baseprecv(ilev)%rprcparm)
|
|
|
|
end if
|
|
|
|
end if
|
|
|
|
|
|
|
|
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
write(iout_,*)
|
|
|
|
else
|
|
|
|
else
|
|
|
|
|
|
|
|
write(iout_,*) trim(name), &
|
|
|
|
write(iout_,*) trim(name),': Error: no base preconditioner available, something is wrong!'
|
|
|
|
& ': Error: no base preconditioner available, something is wrong!'
|
|
|
|
info = -2
|
|
|
|
info = -2
|
|
|
|
return
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|