mirror of
https://github.com/sfilippone/amg4psblas.git
synced 2026-10-06 22:55:12 +00:00
Compare commits
170
Commits
configry
...
openmp-match
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
494b8b925f | ||
|
|
73e5d49913 | ||
|
|
a612cea167 | ||
|
|
ebe9b45177 | ||
|
|
32994c7ce8 | ||
|
|
d59c9e6c0a | ||
|
|
0d624df346 | ||
|
|
28634f6cda | ||
|
|
80185463ea | ||
|
|
e87c785cc7 | ||
|
|
6414d3aef3 | ||
|
|
a259e8ab53 | ||
|
|
500403dbda | ||
|
|
066c1a5e62 | ||
|
|
1ab166b38b | ||
|
|
5efee20041 | ||
|
|
aa45e2fe93 | ||
|
|
e328f3969c | ||
|
|
9d1a416f99 | ||
|
|
9b065602a8 | ||
|
|
abf258e2e8 | ||
|
|
cdf92ea2b2 | ||
|
|
22d9baf296 | ||
|
|
44f174a571 | ||
|
|
3e945c75b4 | ||
|
|
a71fe82752 | ||
|
|
4f07a70ed1 | ||
|
|
cb660e044d | ||
|
|
d24c8c2d46 | ||
|
|
9ab54adf3f | ||
|
|
71d4cdc319 | ||
|
|
1374f21ba8 | ||
|
|
a9bb6b26fa | ||
|
|
561cadee0f | ||
|
|
5ca78fb871 | ||
|
|
f17082b337 | ||
|
|
1ea1be33ba | ||
|
|
47c6f4f2f8 | ||
|
|
dc1675766f | ||
|
|
ccac816f52 | ||
|
|
c7e8193514 | ||
|
|
36bd3a51a2 | ||
|
|
32777cc15c | ||
|
|
64c23f93f8 | ||
|
|
d19443052d | ||
|
|
df1e4a4616 | ||
|
|
3de1e607eb | ||
|
|
9b13aef1ce | ||
|
|
6dcae6d0c1 | ||
|
|
63b7602d3a | ||
|
|
b66de7f25c | ||
|
|
46047b2202 | ||
|
|
7cfe198d0f | ||
|
|
1aca17cd44 | ||
|
|
ea040ae5ee | ||
|
|
7741abd45d | ||
|
|
b5e52d31f5 | ||
|
|
deab695294 | ||
|
|
a54f084ffb | ||
|
|
bf0532867d | ||
|
|
9818c3f5d1 | ||
|
|
f0c40d348e | ||
|
|
4d6e0e26b6 | ||
|
|
6025b8f0ef | ||
|
|
c7edaaa7c5 | ||
|
|
2044c5c8eb | ||
|
|
f38f3cf09a | ||
|
|
6fd571ecb2 | ||
|
|
bf35c1659b | ||
|
|
b2230a6d6d | ||
|
|
6c20cd7819 | ||
|
|
f921aa47c4 | ||
|
|
532701031e | ||
|
|
b079d71f30 | ||
|
|
e2ca97ca47 | ||
|
|
5bc4f2a080 | ||
|
|
2c8dc2ffdd | ||
|
|
f3d7b3ab5e | ||
|
|
766ef320c2 | ||
|
|
e46f22a37c | ||
|
|
e5b1d7c3ca | ||
|
|
c4ededa9d0 | ||
|
|
5634157c8d | ||
|
|
1355765d14 | ||
|
|
152903e7df | ||
|
|
b1eedbb7ac | ||
|
|
002239f5b6 | ||
|
|
70b7c4db55 | ||
|
|
2cac21b345 | ||
|
|
6180f29f39 | ||
|
|
b4bfdd83e5 | ||
|
|
1140669ea7 | ||
|
|
919e2a2918 | ||
|
|
485a94765b | ||
|
|
2f45f8631b | ||
|
|
baffff3d93 | ||
|
|
25a603debe | ||
|
|
a20f0d47e7 | ||
|
|
76e04ee997 | ||
|
|
0a8debe43a | ||
|
|
8f6dc5fac2 | ||
|
|
7d40fde21d | ||
|
|
1760afbe97 | ||
|
|
60f90804d5 | ||
|
|
e02df3725e | ||
|
|
ac42d7b1dd | ||
|
|
697f325df6 | ||
|
|
58d00b16c6 | ||
|
|
425743939c | ||
|
|
7e48a0a742 | ||
|
|
4f9254ebb0 | ||
|
|
90657b706f | ||
|
|
23a39a6c54 | ||
|
|
873f190961 | ||
|
|
87cdd76f8d | ||
|
|
45fabb5214 | ||
|
|
a9182021bb | ||
|
|
a8f4009cb1 | ||
|
|
794080e386 | ||
|
|
818f7a78a0 | ||
|
|
939d7c9a89 | ||
|
|
92f7cde375 | ||
|
|
af178daa84 | ||
|
|
49777a379b | ||
|
|
5768238f66 | ||
|
|
4c4b2b282e | ||
|
|
9d11a99ed4 | ||
|
|
9bc8b540b3 | ||
|
|
af75364c54 | ||
|
|
1270498170 | ||
|
|
b387308455 | ||
|
|
aba9b29717 | ||
|
|
94ca610bff | ||
|
|
2542c0fda4 | ||
|
|
8482067b52 | ||
|
|
7319dab30f | ||
|
|
4bbba3ebd7 | ||
|
|
988021ff24 | ||
|
|
4e177ce926 | ||
|
|
1fa94d0372 | ||
|
|
0fcbdd74cd | ||
|
|
ba854379e4 | ||
|
|
a6cbd64e65 | ||
|
|
5c589dbf30 | ||
|
|
10e9c53e54 | ||
|
|
0332920a63 | ||
|
|
9b9dfbd198 | ||
|
|
5909e541b0 | ||
|
|
941ca6568a | ||
|
|
39a9c4e4ed | ||
|
|
41b4373494 | ||
|
|
4bf009a1ab | ||
|
|
e3d14dfb9e | ||
|
|
734724e407 | ||
|
|
a3a1dc52c5 | ||
|
|
6dddaaa77b | ||
|
|
12fc3ddc3d | ||
|
|
555d7433b7 | ||
|
|
b060787911 | ||
|
|
50951ef636 | ||
|
|
e1e1da18c6 | ||
|
|
47eba23460 | ||
|
|
f65e1ddaa1 | ||
|
|
02b46a0f85 | ||
|
|
636600f1c7 | ||
|
|
09c72e8eed | ||
|
|
257bf46e3b | ||
|
|
c23c4e2729 | ||
|
|
27fafcd579 | ||
|
|
75d09c6349 |
@@ -1,5 +1,6 @@
|
|||||||
Changelog. A lot less detailed than usual, at least for past
|
Changelog. A lot less detailed than usual, at least for past
|
||||||
history.
|
history.
|
||||||
|
2022/05/20: Restart ChangeLog. Updated to new name AMG4PSBLAS, now using PSB3.8
|
||||||
2018/10/28: Fix interface to MUMPS and configry machinery. Require PSB 3.6.
|
2018/10/28: Fix interface to MUMPS and configry machinery. Require PSB 3.6.
|
||||||
2018/10/10: ICTXT argument in prec%init().
|
2018/10/10: ICTXT argument in prec%init().
|
||||||
2018/07/30: Fixes for Intel compilers. BootCMatch interface in examples.
|
2018/07/30: Fixes for Intel compilers. BootCMatch interface in examples.
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
|
|
||||||
|
|
||||||
AMG4PSBLAS version 1.0
|
AMG4PSBLAS version 1.1
|
||||||
Algebraic Multigrid Package
|
Algebraic Multigrid Package
|
||||||
based on PSBLAS (Parallel Sparse BLAS version 3.7)
|
based on PSBLAS (Parallel Sparse BLAS version 3.8)
|
||||||
|
|
||||||
(C) Copyright 2021
|
(C) Copyright 2022
|
||||||
|
|
||||||
Salvatore Filippone
|
Salvatore Filippone
|
||||||
Pasqua D'Ambra
|
Pasqua D'Ambra
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
include Make.inc
|
include Make.inc
|
||||||
|
|
||||||
|
|
||||||
all: library
|
all: objs lib
|
||||||
|
|
||||||
library: libdir amgp
|
objs: amgp cbnd
|
||||||
#cbnd
|
|
||||||
|
lib: libdir objs
|
||||||
|
cd amgprec && $(MAKE) lib
|
||||||
|
cd cbind && $(MAKE) lib
|
||||||
|
|
||||||
libdir:
|
libdir:
|
||||||
(if test ! -d lib ; then mkdir lib; fi)
|
(if test ! -d lib ; then mkdir lib; fi)
|
||||||
@@ -14,10 +17,11 @@ libdir:
|
|||||||
|
|
||||||
|
|
||||||
amgp:
|
amgp:
|
||||||
$(MAKE) -C amgprec all
|
cd amgprec && $(MAKE) objs
|
||||||
cbnd: amgp
|
cbnd: amgp
|
||||||
$(MAKE) -C cbind all
|
cd cbind && $(MAKE) objs
|
||||||
install: all
|
|
||||||
|
install: lib
|
||||||
mkdir -p $(INSTALL_LIBDIR) &&\
|
mkdir -p $(INSTALL_LIBDIR) &&\
|
||||||
$(INSTALL_DATA) lib/*.a $(INSTALL_LIBDIR)
|
$(INSTALL_DATA) lib/*.a $(INSTALL_LIBDIR)
|
||||||
mkdir -p $(INSTALL_INCLUDEDIR) &&\
|
mkdir -p $(INSTALL_INCLUDEDIR) &&\
|
||||||
@@ -33,22 +37,22 @@ install: all
|
|||||||
mkdir -p $(INSTALL_SAMPLESDIR) && \
|
mkdir -p $(INSTALL_SAMPLESDIR) && \
|
||||||
mkdir -p $(INSTALL_SAMPLESDIR)/simple &&\
|
mkdir -p $(INSTALL_SAMPLESDIR)/simple &&\
|
||||||
mkdir -p $(INSTALL_SAMPLESDIR)/advanced && \
|
mkdir -p $(INSTALL_SAMPLESDIR)/advanced && \
|
||||||
(cd examples; /bin/cp -fr pdegen fileread $(INSTALL_SAMPLESDIR)/simple ) && \
|
(cd samples/simple; /bin/cp -fr pdegen fileread $(INSTALL_SAMPLESDIR)/simple ) && \
|
||||||
(cd tests; /bin/cp -fr pdegen fileread $(INSTALL_SAMPLESDIR)/advanced )
|
(cd samples/advanced; /bin/cp -fr pdegen fileread $(INSTALL_SAMPLESDIR)/advanced )
|
||||||
cleanlib:
|
cleanlib:
|
||||||
(cd lib; /bin/rm -f *.a *$(.mod) *$(.fh))
|
(cd lib; /bin/rm -f *.a *$(.mod) *$(.fh))
|
||||||
(cd include; /bin/rm -f *.a *$(.mod) *$(.fh))
|
(cd include; /bin/rm -f *.a *$(.mod) *$(.fh))
|
||||||
(cd modules; /bin/rm -f *.a *$(.mod) *$(.fh))
|
(cd modules; /bin/rm -f *.a *$(.mod) *$(.fh))
|
||||||
|
|
||||||
veryclean: cleanlib
|
veryclean: cleanlib
|
||||||
(cd amgprec; make veryclean)
|
(cd amgprec && $(MAKE) veryclean)
|
||||||
(cd examples/fileread; make clean)
|
(cd samples/simple/fileread && $(MAKE) clean)
|
||||||
(cd examples/pdegen; make clean)
|
(cd samples/simple/pdegen && $(MAKE) clean)
|
||||||
(cd tests/fileread; make clean)
|
(cd samples/advanced/fileread && $(MAKE) clean)
|
||||||
(cd tests/pdegen; make clean)
|
(cd samples/advanced/pdegen && $(MAKE) clean)
|
||||||
|
|
||||||
check: all
|
check: all
|
||||||
make check -C tests/pdegen
|
make check -C samples/advanced/pdegen
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
(cd amgprec; make clean)
|
(cd amgprec && $(MAKE) clean)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
|
|
||||||
AMG4PSBLAS
|
AMG4PSBLAS
|
||||||
Algebraic Multigrid Package based on PSBLAS (Parallel Sparse BLAS version 3.7)
|
Algebraic Multigrid Package based on PSBLAS (Parallel Sparse BLAS version 3.8)
|
||||||
|
|
||||||
Salvatore Filippone (University of Rome Tor Vergata and IAC-CNR)
|
Salvatore Filippone (University of Rome Tor Vergata and IAC-CNR)
|
||||||
Pasqua D'Ambra (IAC-CNR, Naples, IT)
|
Pasqua D'Ambra (IAC-CNR, Naples, IT)
|
||||||
|
|||||||
+9
-6
@@ -62,17 +62,20 @@ OBJS=$(MODOBJS)
|
|||||||
LOCAL_MODS=$(MODOBJS:.o=$(.mod))
|
LOCAL_MODS=$(MODOBJS:.o=$(.mod))
|
||||||
LIBNAME=libamg_prec.a
|
LIBNAME=libamg_prec.a
|
||||||
|
|
||||||
all: lib impld
|
all: objs impld
|
||||||
|
|
||||||
impld: $(OBJS)
|
objs: $(OBJS)
|
||||||
$(MAKE) -C impl
|
/bin/cp -p amg_const.h $(INCDIR)
|
||||||
|
/bin/cp -p *$(.mod) $(MODDIR)
|
||||||
|
|
||||||
|
impld: objs
|
||||||
|
cd impl && $(MAKE)
|
||||||
|
|
||||||
lib: $(OBJS) impld
|
lib: $(OBJS) impld
|
||||||
|
cd impl && $(MAKE) lib
|
||||||
$(AR) $(HERE)/$(LIBNAME) $(OBJS)
|
$(AR) $(HERE)/$(LIBNAME) $(OBJS)
|
||||||
$(RANLIB) $(HERE)/$(LIBNAME)
|
$(RANLIB) $(HERE)/$(LIBNAME)
|
||||||
/bin/cp -p $(HERE)/$(LIBNAME) $(LIBDIR)
|
/bin/cp -p $(HERE)/$(LIBNAME) $(LIBDIR)
|
||||||
/bin/cp -p amg_const.h $(INCDIR)
|
|
||||||
/bin/cp -p *$(.mod) $(MODDIR)
|
|
||||||
|
|
||||||
|
|
||||||
$(MODOBJS): $(PSBLAS_MODDIR)/$(PSBBASEMODNAME)$(.mod)
|
$(MODOBJS): $(PSBLAS_MODDIR)/$(PSBBASEMODNAME)$(.mod)
|
||||||
@@ -218,4 +221,4 @@ clean: implclean
|
|||||||
/bin/rm -f $(OBJS) $(LOCAL_MODS) *$(.mod)
|
/bin/rm -f $(OBJS) $(LOCAL_MODS) *$(.mod)
|
||||||
|
|
||||||
implclean:
|
implclean:
|
||||||
$(MAKE) -C impl clean
|
cd impl && $(MAKE) clean
|
||||||
|
|||||||
+147
-59
@@ -64,7 +64,7 @@ module amg_base_prec_type
|
|||||||
!
|
!
|
||||||
use psb_const_mod
|
use psb_const_mod
|
||||||
use psb_base_mod, only :&
|
use psb_base_mod, only :&
|
||||||
& psb_desc_type, psb_i_vect_type, psb_i_base_vect_type,&
|
& psb_desc_type, psb_ctxt_type,&
|
||||||
& psb_ipk_, psb_dpk_, psb_spk_, psb_epk_, &
|
& psb_ipk_, psb_dpk_, psb_spk_, psb_epk_, &
|
||||||
& psb_cdfree, psb_halo_, psb_none_, psb_sum_, psb_avg_, &
|
& psb_cdfree, psb_halo_, psb_none_, psb_sum_, psb_avg_, &
|
||||||
& psb_nohalo_, psb_square_root_, psb_toupper, psb_root_,&
|
& psb_nohalo_, psb_square_root_, psb_toupper, psb_root_,&
|
||||||
@@ -81,9 +81,9 @@ module amg_base_prec_type
|
|||||||
!
|
!
|
||||||
! Version numbers
|
! Version numbers
|
||||||
!
|
!
|
||||||
character(len=*), parameter :: amg_version_string_ = "1.0.0"
|
character(len=*), parameter :: amg_version_string_ = "1.1.0"
|
||||||
integer(psb_ipk_), parameter :: amg_version_major_ = 1
|
integer(psb_ipk_), parameter :: amg_version_major_ = 1
|
||||||
integer(psb_ipk_), parameter :: amg_version_minor_ = 0
|
integer(psb_ipk_), parameter :: amg_version_minor_ = 1
|
||||||
integer(psb_ipk_), parameter :: amg_patchlevel_ = 0
|
integer(psb_ipk_), parameter :: amg_patchlevel_ = 0
|
||||||
|
|
||||||
type amg_ml_parms
|
type amg_ml_parms
|
||||||
@@ -136,6 +136,8 @@ module amg_base_prec_type
|
|||||||
integer(psb_lpk_) :: target_coarse_size
|
integer(psb_lpk_) :: target_coarse_size
|
||||||
! 2. maximum number of levels. Defaults to 20
|
! 2. maximum number of levels. Defaults to 20
|
||||||
integer(psb_ipk_) :: max_levs = 20_psb_ipk_
|
integer(psb_ipk_) :: max_levs = 20_psb_ipk_
|
||||||
|
contains
|
||||||
|
procedure, pass(ag) :: default => i_ag_default
|
||||||
end type amg_iaggr_data
|
end type amg_iaggr_data
|
||||||
|
|
||||||
type, extends(amg_iaggr_data) :: amg_saggr_data
|
type, extends(amg_iaggr_data) :: amg_saggr_data
|
||||||
@@ -143,6 +145,8 @@ module amg_base_prec_type
|
|||||||
real(psb_spk_) :: min_cr_ratio = 1.5_psb_spk_
|
real(psb_spk_) :: min_cr_ratio = 1.5_psb_spk_
|
||||||
real(psb_spk_) :: op_complexity = szero
|
real(psb_spk_) :: op_complexity = szero
|
||||||
real(psb_spk_) :: avg_cr = szero
|
real(psb_spk_) :: avg_cr = szero
|
||||||
|
contains
|
||||||
|
procedure, pass(ag) :: default => s_ag_default
|
||||||
end type amg_saggr_data
|
end type amg_saggr_data
|
||||||
|
|
||||||
type, extends(amg_iaggr_data) :: amg_daggr_data
|
type, extends(amg_iaggr_data) :: amg_daggr_data
|
||||||
@@ -150,6 +154,8 @@ module amg_base_prec_type
|
|||||||
real(psb_dpk_) :: min_cr_ratio = 1.5_psb_dpk_
|
real(psb_dpk_) :: min_cr_ratio = 1.5_psb_dpk_
|
||||||
real(psb_dpk_) :: op_complexity = dzero
|
real(psb_dpk_) :: op_complexity = dzero
|
||||||
real(psb_dpk_) :: avg_cr = dzero
|
real(psb_dpk_) :: avg_cr = dzero
|
||||||
|
contains
|
||||||
|
procedure, pass(ag) :: default => d_ag_default
|
||||||
end type amg_daggr_data
|
end type amg_daggr_data
|
||||||
|
|
||||||
|
|
||||||
@@ -643,43 +649,52 @@ contains
|
|||||||
end if
|
end if
|
||||||
end subroutine ml_parms_mlcycledsc
|
end subroutine ml_parms_mlcycledsc
|
||||||
|
|
||||||
subroutine ml_parms_mldescr(pm,iout,info)
|
subroutine ml_parms_mldescr(pm,iout,info,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_ml_parms), intent(in) :: pm
|
class(amg_ml_parms), intent(in) :: pm
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
|
character(1024) :: prefix_
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if ((pm%ml_cycle>=amg_no_ml_).and.(pm%ml_cycle<=amg_max_ml_cycle_)) then
|
if ((pm%ml_cycle>=amg_no_ml_).and.(pm%ml_cycle<=amg_max_ml_cycle_)) then
|
||||||
|
|
||||||
|
|
||||||
write(iout,*) ' Parallel aggregation algorithm: ',&
|
write(iout,*) trim(prefix),' Parallel aggregation algorithm: ',&
|
||||||
& par_aggr_alg_names(pm%par_aggr_alg)
|
& par_aggr_alg_names(pm%par_aggr_alg)
|
||||||
if (pm%aggr_type>0) write(iout,*) ' Aggregation type: ',&
|
if (pm%aggr_type>0) write(iout,*) trim(prefix),' Aggregation type: ',&
|
||||||
& aggr_type_names(pm%aggr_type)
|
& aggr_type_names(pm%aggr_type)
|
||||||
!if (pm%par_aggr_alg /= amg_ext_aggr_) then
|
!if (pm%par_aggr_alg /= amg_ext_aggr_) then
|
||||||
if ( pm%aggr_ord /= amg_aggr_ord_nat_) &
|
if ( pm%aggr_ord /= amg_aggr_ord_nat_) &
|
||||||
& write(iout,*) ' with initial ordering: ',&
|
& write(iout,*) trim(prefix),' with initial ordering: ',&
|
||||||
& ord_names(pm%aggr_ord)
|
& ord_names(pm%aggr_ord)
|
||||||
write(iout,*) ' Aggregation prolongator: ', &
|
write(iout,*) trim(prefix),' Aggregation prolongator: ', &
|
||||||
& aggr_prols(pm%aggr_prol)
|
& aggr_prols(pm%aggr_prol)
|
||||||
if (pm%aggr_prol /= amg_no_smooth_) then
|
if (pm%aggr_prol /= amg_no_smooth_) then
|
||||||
write(iout,*) ' with: ', aggr_filters(pm%aggr_filter)
|
write(iout,*) trim(prefix),' with: ', aggr_filters(pm%aggr_filter)
|
||||||
if (pm%aggr_omega_alg == amg_eig_est_) then
|
if (pm%aggr_omega_alg == amg_eig_est_) then
|
||||||
write(iout,*) ' Damping omega computation: spectral radius estimate'
|
write(iout,*) trim(prefix),' Damping omega computation: spectral radius estimate'
|
||||||
write(iout,*) ' Spectral radius estimate: ', &
|
write(iout,*) trim(prefix),' Spectral radius estimate: ', &
|
||||||
& eigen_estimates(pm%aggr_eig)
|
& eigen_estimates(pm%aggr_eig)
|
||||||
else if (pm%aggr_omega_alg == amg_user_choice_) then
|
else if (pm%aggr_omega_alg == amg_user_choice_) then
|
||||||
write(iout,*) ' Damping omega computation: user defined value.'
|
write(iout,*) trim(prefix),' Damping omega computation: user defined value.'
|
||||||
else
|
else
|
||||||
write(iout,*) ' Damping omega computation: unknown value in iprcparm!!'
|
write(iout,*) trim(prefix),' Damping omega computation: unknown value in iprcparm!!'
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
!end if
|
!end if
|
||||||
else
|
else
|
||||||
write(iout,*) ' Multilevel type: Unkonwn value. Something is amiss....',&
|
write(iout,*) trim(prefix),' Multilevel type: Unkonwn value. Something is amiss....',&
|
||||||
& pm%ml_cycle
|
& pm%ml_cycle
|
||||||
end if
|
end if
|
||||||
|
|
||||||
@@ -687,15 +702,16 @@ contains
|
|||||||
|
|
||||||
end subroutine ml_parms_mldescr
|
end subroutine ml_parms_mldescr
|
||||||
|
|
||||||
subroutine ml_parms_descr(pm,iout,info,coarse)
|
subroutine ml_parms_descr(pm,iout,info,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_ml_parms), intent(in) :: pm
|
class(amg_ml_parms), intent(in) :: pm
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
logical :: coarse_
|
logical :: coarse_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -706,7 +722,7 @@ contains
|
|||||||
end if
|
end if
|
||||||
|
|
||||||
if (coarse_) then
|
if (coarse_) then
|
||||||
call pm%coarsedescr(iout,info)
|
call pm%coarsedescr(iout,info,prefix=prefix)
|
||||||
end if
|
end if
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -714,81 +730,126 @@ contains
|
|||||||
end subroutine ml_parms_descr
|
end subroutine ml_parms_descr
|
||||||
|
|
||||||
|
|
||||||
subroutine ml_parms_coarsedescr(pm,iout,info)
|
subroutine ml_parms_coarsedescr(pm,iout,info,prefix)
|
||||||
|
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_ml_parms), intent(in) :: pm
|
class(amg_ml_parms), intent(in) :: pm
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
write(iout,*) ' Coarse matrix: ',&
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout,*) trim(prefix),' Coarse matrix: ',&
|
||||||
& matrix_names(pm%coarse_mat)
|
& matrix_names(pm%coarse_mat)
|
||||||
select case(pm%coarse_solve)
|
select case(pm%coarse_solve)
|
||||||
case (amg_bjac_,amg_as_)
|
case (amg_bjac_,amg_as_)
|
||||||
write(iout,*) ' Number of sweeps : ',&
|
write(iout,*) trim(prefix),' Coarse solver: ',&
|
||||||
& pm%sweeps_pre
|
|
||||||
write(iout,*) ' Coarse solver: ',&
|
|
||||||
& 'Block Jacobi'
|
& 'Block Jacobi'
|
||||||
|
write(iout,*) trim(prefix),' Number of sweeps : ',&
|
||||||
|
& pm%sweeps_pre
|
||||||
case (amg_l1_bjac_)
|
case (amg_l1_bjac_)
|
||||||
write(iout,*) ' Number of sweeps : ',&
|
write(iout,*) trim(prefix),' Coarse solver: ',&
|
||||||
& pm%sweeps_pre
|
|
||||||
write(iout,*) ' Coarse solver: ',&
|
|
||||||
& 'L1-Block Jacobi'
|
& 'L1-Block Jacobi'
|
||||||
case (amg_jac_)
|
write(iout,*) trim(prefix),' Number of sweeps : ',&
|
||||||
write(iout,*) ' Number of sweeps : ',&
|
|
||||||
& pm%sweeps_pre
|
& pm%sweeps_pre
|
||||||
write(iout,*) ' Coarse solver: ',&
|
case (amg_jac_)
|
||||||
|
write(iout,*) trim(prefix),' Coarse solver: ',&
|
||||||
& 'Point Jacobi'
|
& 'Point Jacobi'
|
||||||
|
write(iout,*) trim(prefix),' Number of sweeps : ',&
|
||||||
|
& pm%sweeps_pre
|
||||||
|
case (amg_l1_jac_)
|
||||||
|
write(iout,*) trim(prefix),' Coarse solver: ',&
|
||||||
|
& 'L1-Jacobi'
|
||||||
|
write(iout,*) trim(prefix),' Number of sweeps : ',&
|
||||||
|
& pm%sweeps_pre
|
||||||
|
case (amg_l1_fbgs_)
|
||||||
|
write(iout,*) trim(prefix),' Coarse solver: ',&
|
||||||
|
& 'L1 Forward-Backward Gauss-Seidel (Hybrid)'
|
||||||
|
write(iout,*) trim(prefix),' Number of sweeps : ',&
|
||||||
|
& pm%sweeps_pre
|
||||||
|
case (amg_l1_gs_)
|
||||||
|
write(iout,*) trim(prefix),' Coarse solver: ',&
|
||||||
|
& 'L1 Gauss-Seidel (Hybrid)'
|
||||||
|
write(iout,*) trim(prefix),' Number of sweeps : ',&
|
||||||
|
& pm%sweeps_pre
|
||||||
|
case (amg_fbgs_)
|
||||||
|
write(iout,*) trim(prefix),' Coarse solver: ',&
|
||||||
|
& 'Forward-Backward Gauss-Seidel (Hybrid)'
|
||||||
|
write(iout,*) trim(prefix),' Number of sweeps : ',&
|
||||||
|
& pm%sweeps_pre
|
||||||
case default
|
case default
|
||||||
write(iout,*) ' Coarse solver: ',&
|
write(iout,*) trim(prefix),' Coarse solver: ',&
|
||||||
& amg_fact_names(pm%coarse_solve)
|
& amg_fact_names(pm%coarse_solve)
|
||||||
end select
|
end select
|
||||||
|
|
||||||
end subroutine ml_parms_coarsedescr
|
end subroutine ml_parms_coarsedescr
|
||||||
|
|
||||||
subroutine s_ml_parms_descr(pm,iout,info,coarse)
|
subroutine s_ml_parms_descr(pm,iout,info,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_sml_parms), intent(in) :: pm
|
class(amg_sml_parms), intent(in) :: pm
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
|
if (present(prefix)) then
|
||||||
call pm%amg_ml_parms%descr(iout,info,coarse)
|
prefix_ = prefix
|
||||||
if (pm%aggr_prol /= amg_no_smooth_) then
|
else
|
||||||
write(iout,*) ' Damping omega value :',pm%aggr_omega_val
|
prefix_ = ""
|
||||||
end if
|
end if
|
||||||
write(iout,*) ' Aggregation threshold:',pm%aggr_thresh
|
|
||||||
|
call pm%amg_ml_parms%descr(iout,info,coarse,prefix=prefix)
|
||||||
|
if (pm%aggr_prol /= amg_no_smooth_) then
|
||||||
|
write(iout,*) trim(prefix),' Damping omega value :',pm%aggr_omega_val
|
||||||
|
end if
|
||||||
|
write(iout,*) trim(prefix),' Aggregation threshold:',pm%aggr_thresh
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
end subroutine s_ml_parms_descr
|
end subroutine s_ml_parms_descr
|
||||||
|
|
||||||
subroutine d_ml_parms_descr(pm,iout,info,coarse)
|
subroutine d_ml_parms_descr(pm,iout,info,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_dml_parms), intent(in) :: pm
|
class(amg_dml_parms), intent(in) :: pm
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
|
if (present(prefix)) then
|
||||||
call pm%amg_ml_parms%descr(iout,info,coarse)
|
prefix_ = prefix
|
||||||
if (pm%aggr_prol /= amg_no_smooth_) then
|
else
|
||||||
write(iout,*) ' Damping omega value :',pm%aggr_omega_val
|
prefix_ = ""
|
||||||
end if
|
end if
|
||||||
write(iout,*) ' Aggregation threshold:',pm%aggr_thresh
|
|
||||||
|
call pm%amg_ml_parms%descr(iout,info,coarse,prefix=prefix)
|
||||||
|
if (pm%aggr_prol /= amg_no_smooth_) then
|
||||||
|
write(iout,*) trim(prefix),' Damping omega value :',pm%aggr_omega_val
|
||||||
|
end if
|
||||||
|
write(iout,*) trim(prefix),' Aggregation threshold:',pm%aggr_thresh
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -1240,4 +1301,31 @@ contains
|
|||||||
& (parms1%aggr_thresh == parms2%aggr_thresh )
|
& (parms1%aggr_thresh == parms2%aggr_thresh )
|
||||||
end function amg_d_equal_aggregation
|
end function amg_d_equal_aggregation
|
||||||
|
|
||||||
|
subroutine i_ag_default(ag)
|
||||||
|
class(amg_iaggr_data), intent(inout) :: ag
|
||||||
|
|
||||||
|
ag%min_coarse_size = -ione
|
||||||
|
ag%min_coarse_size_per_process = -ione
|
||||||
|
ag%max_levs = 20_psb_ipk_
|
||||||
|
end subroutine i_ag_default
|
||||||
|
|
||||||
|
subroutine s_ag_default(ag)
|
||||||
|
class(amg_saggr_data), intent(inout) :: ag
|
||||||
|
|
||||||
|
call ag%amg_iaggr_data%default()
|
||||||
|
ag%min_cr_ratio = 1.5_psb_spk_
|
||||||
|
ag%op_complexity = szero
|
||||||
|
ag%avg_cr = szero
|
||||||
|
end subroutine s_ag_default
|
||||||
|
|
||||||
|
subroutine d_ag_default(ag)
|
||||||
|
class(amg_daggr_data), intent(inout) :: ag
|
||||||
|
|
||||||
|
call ag%amg_iaggr_data%default()
|
||||||
|
ag%min_cr_ratio = 1.5_psb_dpk_
|
||||||
|
ag%op_complexity = dzero
|
||||||
|
ag%avg_cr = dzero
|
||||||
|
end subroutine d_ag_default
|
||||||
|
|
||||||
|
|
||||||
end module amg_base_prec_type
|
end module amg_base_prec_type
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ module amg_c_ainv_solver
|
|||||||
!!$ end interface
|
!!$ end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_c_ainv_solver_descr(sv,info,iout,coarse)
|
subroutine amg_c_ainv_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_dpk_, amg_c_ainv_solver_type, psb_ipk_
|
import :: psb_dpk_, amg_c_ainv_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
@@ -208,7 +208,7 @@ module amg_c_ainv_solver
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_c_ainv_solver_descr
|
end subroutine amg_c_ainv_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -396,21 +396,23 @@ contains
|
|||||||
end subroutine c_as_smoother_default
|
end subroutine c_as_smoother_default
|
||||||
|
|
||||||
|
|
||||||
subroutine c_as_smoother_descr(sm,info,iout,coarse)
|
subroutine c_as_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_c_as_smoother_type), intent(in) :: sm
|
class(amg_c_as_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_c_as_smoother_descr'
|
character(len=20), parameter :: name='amg_c_as_smoother_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
logical :: coarse_
|
logical :: coarse_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -424,16 +426,21 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (.not.coarse_) then
|
if (.not.coarse_) then
|
||||||
write(iout_,*) ' Additive Schwarz with ',&
|
write(iout_,*) trim(prefix_), ' Additive Schwarz with ',&
|
||||||
& sm%novr, ' overlap layers.'
|
& sm%novr, ' overlap layers.'
|
||||||
write(iout_,*) ' Restrictor: ',restrict_names(sm%restr)
|
write(iout_,*) trim(prefix_), ' Restrictor: ',restrict_names(sm%restr)
|
||||||
write(iout_,*) ' Prolongator: ',prolong_names(sm%prol)
|
write(iout_,*) trim(prefix_), ' Prolongator: ',prolong_names(sm%prol)
|
||||||
write(iout_,*) ' Local solver:'
|
write(iout_,*) trim(prefix_), ' Local solver:'
|
||||||
endif
|
endif
|
||||||
if (allocated(sm%sv)) then
|
if (allocated(sm%sv)) then
|
||||||
call sm%sv%descr(info,iout_,coarse=coarse)
|
call sm%sv%descr(info,iout_,coarse=coarse,prefix=prefix)
|
||||||
end if
|
end if
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ module amg_c_base_aggregator_mod
|
|||||||
& psb_c_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
|
& psb_c_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_c_csr_sparse_mat), intent(inout) :: a_csr
|
type(psb_c_csr_sparse_mat), intent(inout) :: a_csr
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(psb_c_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
type(psb_c_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
||||||
@@ -144,7 +144,7 @@ module amg_c_base_aggregator_mod
|
|||||||
& psb_c_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
|
& psb_c_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_c_csr_sparse_mat), intent(inout) :: a_csr
|
type(psb_c_csr_sparse_mat), intent(inout) :: a_csr
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(psb_c_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
type(psb_c_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
||||||
@@ -275,15 +275,22 @@ contains
|
|||||||
val = .false.
|
val = .false.
|
||||||
end function amg_c_base_aggregator_xt_desc
|
end function amg_c_base_aggregator_xt_desc
|
||||||
|
|
||||||
subroutine amg_c_base_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_c_base_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_c_base_aggregator_type), intent(in) :: ag
|
class(amg_c_base_aggregator_type), intent(in) :: ag
|
||||||
type(amg_sml_parms), intent(in) :: parms
|
type(amg_sml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
character(1024) :: prefix_
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
write(iout,*) trim(prefix_),' ', 'Aggregator object type: ',ag%fmt()
|
||||||
call parms%mldescr(iout,info)
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_c_base_aggregator_descr
|
end subroutine amg_c_base_aggregator_descr
|
||||||
|
|||||||
@@ -272,7 +272,7 @@ module amg_c_base_smoother_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_c_base_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_c_base_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: psb_desc_type, psb_cspmat_type, psb_c_base_sparse_mat, &
|
import :: psb_desc_type, psb_cspmat_type, psb_c_base_sparse_mat, &
|
||||||
& psb_c_vect_type, psb_c_base_vect_type, psb_spk_, &
|
& psb_c_vect_type, psb_c_base_vect_type, psb_spk_, &
|
||||||
& amg_c_base_smoother_type, psb_ipk_
|
& amg_c_base_smoother_type, psb_ipk_
|
||||||
@@ -281,6 +281,7 @@ module amg_c_base_smoother_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_c_base_smoother_descr
|
end subroutine amg_c_base_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ module amg_c_base_solver_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_c_base_solver_descr(sv,info,iout,coarse)
|
subroutine amg_c_base_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_desc_type, psb_cspmat_type, psb_c_base_sparse_mat, &
|
import :: psb_desc_type, psb_cspmat_type, psb_c_base_sparse_mat, &
|
||||||
& psb_c_vect_type, psb_c_base_vect_type, psb_spk_, &
|
& psb_c_vect_type, psb_c_base_vect_type, psb_spk_, &
|
||||||
& amg_c_base_solver_type, psb_ipk_
|
& amg_c_base_solver_type, psb_ipk_
|
||||||
@@ -281,7 +281,7 @@ module amg_c_base_solver_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_c_base_solver_descr
|
end subroutine amg_c_base_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -184,16 +184,23 @@ contains
|
|||||||
val = "Decoupled aggregation"
|
val = "Decoupled aggregation"
|
||||||
end function amg_c_dec_aggregator_fmt
|
end function amg_c_dec_aggregator_fmt
|
||||||
|
|
||||||
subroutine amg_c_dec_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_c_dec_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_c_dec_aggregator_type), intent(in) :: ag
|
class(amg_c_dec_aggregator_type), intent(in) :: ag
|
||||||
type(amg_sml_parms), intent(in) :: parms
|
type(amg_sml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
character(1024) :: prefix_
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout,*) 'Decoupled Aggregator'
|
write(iout,*) trim(prefix_),' ','Decoupled Aggregator'
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
write(iout,*) trim(prefix_),' ','Aggregator object type: ',ag%fmt()
|
||||||
call parms%mldescr(iout,info)
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_c_dec_aggregator_descr
|
end subroutine amg_c_dec_aggregator_descr
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ contains
|
|||||||
|
|
||||||
end subroutine c_diag_solver_free
|
end subroutine c_diag_solver_free
|
||||||
|
|
||||||
subroutine c_diag_solver_descr(sv,info,iout,coarse)
|
subroutine c_diag_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -228,11 +228,13 @@ contains
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_c_diag_solver_descr'
|
character(len=20), parameter :: name='amg_c_diag_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -240,8 +242,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
write(iout_,*) ' Diagonal local solver '
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout_,*) trim(prefix_), ' Diagonal local solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -352,7 +359,7 @@ module amg_c_l1_diag_solver
|
|||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
subroutine c_l1_diag_solver_descr(sv,info,iout,coarse)
|
subroutine c_l1_diag_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -361,11 +368,13 @@ contains
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_c_l1_diag_solver_descr'
|
character(len=20), parameter :: name='amg_c_l1_diag_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -373,8 +382,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
write(iout_,*) ' L1 Diagonal solver '
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout_,*) trim(prefix_), ' L1 Diagonal solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
+26
-12
@@ -433,20 +433,22 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine c_gs_solver_free
|
end subroutine c_gs_solver_free
|
||||||
|
|
||||||
subroutine c_gs_solver_descr(sv,info,iout,coarse)
|
subroutine c_gs_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_c_gs_solver_type), intent(in) :: sv
|
class(amg_c_gs_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_c_gs_solver_descr'
|
character(len=20), parameter :: name='amg_c_gs_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -455,12 +457,17 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%eps<=dzero) then
|
if (sv%eps<=dzero) then
|
||||||
write(iout_,*) ' Forward Gauss-Seidel iterative solver with ',&
|
write(iout_,*) trim(prefix_), ' Forward Gauss-Seidel iterative solver with ',&
|
||||||
& sv%sweeps,' sweeps'
|
& sv%sweeps,' sweeps'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Forward Gauss-Seidel iterative solver with tolerance',&
|
write(iout_,*) trim(prefix_), ' Forward Gauss-Seidel iterative solver with tolerance',&
|
||||||
& sv%eps,' and maxit', sv%sweeps
|
& sv%eps,' and maxit', sv%sweeps
|
||||||
end if
|
end if
|
||||||
|
|
||||||
@@ -526,20 +533,22 @@ contains
|
|||||||
val = .true.
|
val = .true.
|
||||||
end function c_gs_solver_is_iterative
|
end function c_gs_solver_is_iterative
|
||||||
|
|
||||||
subroutine c_bwgs_solver_descr(sv,info,iout,coarse)
|
subroutine c_bwgs_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_c_bwgs_solver_type), intent(in) :: sv
|
class(amg_c_bwgs_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_c_bwgs_solver_descr'
|
character(len=20), parameter :: name='amg_c_bwgs_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -548,12 +557,17 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%eps<=dzero) then
|
if (sv%eps<=dzero) then
|
||||||
write(iout_,*) ' Backward Gauss-Seidel iterative solver with ',&
|
write(iout_,*) trim(prefix_), ' Backward Gauss-Seidel iterative solver with ',&
|
||||||
& sv%sweeps,' sweeps'
|
& sv%sweeps,' sweeps'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Backward Gauss-Seidel iterative solver with tolerance',&
|
write(iout_,*) trim(prefix_), ' Backward Gauss-Seidel iterative solver with tolerance',&
|
||||||
& sv%eps,' and maxit', sv%sweeps
|
& sv%eps,' and maxit', sv%sweeps
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine c_id_solver_free
|
end subroutine c_id_solver_free
|
||||||
|
|
||||||
subroutine c_id_solver_descr(sv,info,iout,coarse)
|
subroutine c_id_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -165,12 +165,14 @@ contains
|
|||||||
class(amg_c_id_solver_type), intent(in) :: sv
|
class(amg_c_id_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_c_id_solver_descr'
|
character(len=20), parameter :: name='amg_c_id_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -178,8 +180,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' Identity local solver '
|
write(iout_,*) trim(prefix_), ' Identity local solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine c_ilu_solver_free
|
end subroutine c_ilu_solver_free
|
||||||
|
|
||||||
subroutine c_ilu_solver_descr(sv,info,iout,coarse)
|
subroutine c_ilu_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -414,12 +414,14 @@ contains
|
|||||||
class(amg_c_ilu_solver_type), intent(in) :: sv
|
class(amg_c_ilu_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_c_ilu_solver_descr'
|
character(len=20), parameter :: name='amg_c_ilu_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -428,15 +430,20 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' Incomplete factorization solver: ',&
|
write(iout_,*) trim(prefix_), ' Incomplete factorization solver: ',&
|
||||||
& amg_fact_names(sv%fact_type)
|
& amg_fact_names(sv%fact_type)
|
||||||
select case(sv%fact_type)
|
select case(sv%fact_type)
|
||||||
case(psb_ilu_n_,psb_milu_n_)
|
case(psb_ilu_n_,psb_milu_n_)
|
||||||
write(iout_,*) ' Fill level:',sv%fill_in
|
write(iout_,*) trim(prefix_), ' Fill level:',sv%fill_in
|
||||||
case(psb_ilu_t_)
|
case(psb_ilu_t_)
|
||||||
write(iout_,*) ' Fill level:',sv%fill_in
|
write(iout_,*) trim(prefix_), ' Fill level:',sv%fill_in
|
||||||
write(iout_,*) ' Fill threshold :',sv%thresh
|
write(iout_,*) trim(prefix_), ' Fill threshold :',sv%thresh
|
||||||
end select
|
end select
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ module amg_c_invk_solver
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_c_invk_solver_descr(sv,info,iout,coarse)
|
subroutine amg_c_invk_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_spk_, amg_c_invk_solver_type, psb_ipk_
|
import :: psb_spk_, amg_c_invk_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
@@ -133,7 +133,7 @@ module amg_c_invk_solver
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_c_invk_solver_descr
|
end subroutine amg_c_invk_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -134,16 +134,17 @@ module amg_c_invt_solver
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_c_invt_solver_descr(sv,info,iout,coarse)
|
subroutine amg_c_invt_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_spk_, amg_c_invt_solver_type, psb_ipk_
|
import :: psb_spk_, amg_c_invt_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_c_invt_solver_type), intent(in) :: sv
|
class(amg_c_invt_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
end subroutine amg_c_invt_solver_descr
|
end subroutine amg_c_invt_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|||||||
@@ -219,12 +219,13 @@ module amg_c_jac_smoother
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_c_jac_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_c_jac_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: amg_c_jac_smoother_type, psb_ipk_
|
import :: amg_c_jac_smoother_type, psb_ipk_
|
||||||
class(amg_c_jac_smoother_type), intent(in) :: sm
|
class(amg_c_jac_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_c_jac_smoother_descr
|
end subroutine amg_c_jac_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
@@ -313,12 +314,13 @@ module amg_c_jac_smoother
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_c_l1_jac_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_c_l1_jac_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: amg_c_l1_jac_smoother_type, psb_ipk_
|
import :: amg_c_l1_jac_smoother_type, psb_ipk_
|
||||||
class(amg_c_l1_jac_smoother_type), intent(in) :: sm
|
class(amg_c_l1_jac_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_c_l1_jac_smoother_descr
|
end subroutine amg_c_l1_jac_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -436,7 +436,7 @@ contains
|
|||||||
val = "KRM solver"
|
val = "KRM solver"
|
||||||
end function c_krm_solver_get_fmt
|
end function c_krm_solver_get_fmt
|
||||||
|
|
||||||
subroutine c_krm_solver_descr(sv,info,iout,coarse)
|
subroutine c_krm_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -444,12 +444,14 @@ contains
|
|||||||
class(amg_c_krm_solver_type), intent(in) :: sv
|
class(amg_c_krm_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_c_krm_solver_descr'
|
character(len=20), parameter :: name='amg_c_krm_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -458,23 +460,22 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%global) then
|
if (sv%global) then
|
||||||
write(iout_,*) ' Krylov solver (global)'
|
write(iout_,*) trim(prefix_), ' Krylov solver (global)'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Krylov solver (local) '
|
write(iout_,*) trim(prefix_), ' Krylov solver (local) '
|
||||||
end if
|
end if
|
||||||
write(iout_,*) ' method: ',sv%method
|
write(iout_,*) trim(prefix_), ' method: ',sv%method
|
||||||
write(iout_,*) ' kprec: ',sv%kprec
|
write(iout_,*) trim(prefix_), ' kprec: ',sv%kprec
|
||||||
if (sv%i_sub_solve > 0) then
|
call sv%prec%descr(info,iout_,prefix='KRM : '//prefix_)
|
||||||
write(iout_,*) ' sub_solve: ',amg_fact_names(sv%i_sub_solve)
|
write(iout_,*) trim(prefix_), ' itmax: ',sv%itmax
|
||||||
else
|
write(iout_,*) trim(prefix_), ' eps: ',sv%eps
|
||||||
write(iout_,*) ' sub_solve: ',sv%sub_solve
|
|
||||||
end if
|
|
||||||
write(iout_,*) ' itmax: ',sv%itmax
|
|
||||||
write(iout_,*) ' eps: ',sv%eps
|
|
||||||
write(iout_,*) ' fillin: ',sv%fillin
|
|
||||||
|
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -313,22 +313,24 @@ subroutine c_mumps_solver_finalize(sv)
|
|||||||
|
|
||||||
end subroutine c_mumps_solver_finalize
|
end subroutine c_mumps_solver_finalize
|
||||||
|
|
||||||
subroutine c_mumps_solver_descr(sv,info,iout,coarse)
|
subroutine c_mumps_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_c_mumps_solver_type), intent(in) :: sv
|
class(amg_c_mumps_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
type(psb_ctxt_type) :: ctxt
|
type(psb_ctxt_type) :: ctxt
|
||||||
integer(psb_ipk_) :: me, np
|
integer(psb_ipk_) :: me, np
|
||||||
character(len=20), parameter :: name='amg_z_mumps_solver_descr'
|
character(len=20), parameter :: name='amg_z_mumps_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -337,8 +339,13 @@ subroutine c_mumps_solver_descr(sv,info,iout,coarse)
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' MUMPS Solver. '
|
write(iout_,*) trim(prefix_), ' MUMPS Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ module amg_c_onelev_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_c_base_onelev_descr(lv,il,nl,ilmin,info,iout, verbosity)
|
subroutine amg_c_base_onelev_descr(lv,il,nl,ilmin,info,iout, verbosity,prefix)
|
||||||
import :: psb_cspmat_type, psb_c_vect_type, psb_c_base_vect_type, &
|
import :: psb_cspmat_type, psb_c_vect_type, psb_c_base_vect_type, &
|
||||||
& psb_clinmap_type, psb_spk_, amg_c_onelev_type, &
|
& psb_clinmap_type, psb_spk_, amg_c_onelev_type, &
|
||||||
& psb_ipk_, psb_epk_, psb_desc_type
|
& psb_ipk_, psb_epk_, psb_desc_type
|
||||||
@@ -268,6 +268,7 @@ module amg_c_onelev_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
integer(psb_ipk_), intent(in), optional :: verbosity
|
integer(psb_ipk_), intent(in), optional :: verbosity
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_c_base_onelev_descr
|
end subroutine amg_c_base_onelev_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -155,14 +155,16 @@ module amg_c_prec_type
|
|||||||
|
|
||||||
|
|
||||||
interface amg_precdescr
|
interface amg_precdescr
|
||||||
subroutine amg_cfile_prec_descr(prec,iout,root,verbosity)
|
subroutine amg_cfile_prec_descr(prec,info,iout,root,verbosity,prefix)
|
||||||
import :: amg_cprec_type, psb_ipk_
|
import :: amg_cprec_type, psb_ipk_
|
||||||
implicit none
|
implicit none
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_cprec_type), intent(in) :: prec
|
class(amg_cprec_type), intent(in) :: prec
|
||||||
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
integer(psb_ipk_), intent(in), optional :: root
|
integer(psb_ipk_), intent(in), optional :: root
|
||||||
integer(psb_ipk_), intent(in), optional :: verbosity
|
integer(psb_ipk_), intent(in), optional :: verbosity
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_cfile_prec_descr
|
end subroutine amg_cfile_prec_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -385,20 +385,22 @@ contains
|
|||||||
|
|
||||||
end subroutine c_slu_solver_finalize
|
end subroutine c_slu_solver_finalize
|
||||||
|
|
||||||
subroutine c_slu_solver_descr(sv,info,iout,coarse)
|
subroutine c_slu_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_c_slu_solver_type), intent(in) :: sv
|
class(amg_c_slu_solver_type), intent(in) :: sv
|
||||||
integer, intent(out) :: info
|
integer, intent(out) :: info
|
||||||
integer, intent(in), optional :: iout
|
integer, intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer :: err_act
|
integer :: err_act
|
||||||
character(len=20), parameter :: name='amg_c_slu_solver_descr'
|
character(len=20), parameter :: name='amg_c_slu_solver_descr'
|
||||||
integer :: iout_
|
integer :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -407,8 +409,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' SuperLU Sparse Factorization Solver. '
|
write(iout_,*) trim(prefix_), ' SuperLU Sparse Factorization Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -88,16 +88,25 @@ contains
|
|||||||
val = "Symmetric Decoupled aggregation"
|
val = "Symmetric Decoupled aggregation"
|
||||||
end function amg_c_symdec_aggregator_fmt
|
end function amg_c_symdec_aggregator_fmt
|
||||||
|
|
||||||
subroutine amg_c_symdec_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_c_symdec_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_c_symdec_aggregator_type), intent(in) :: ag
|
class(amg_c_symdec_aggregator_type), intent(in) :: ag
|
||||||
type(amg_sml_parms), intent(in) :: parms
|
type(amg_sml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
write(iout,*) 'Decoupled Aggregator locally-symmetrized'
|
character(1024) :: prefix_
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
|
||||||
call parms%mldescr(iout,info)
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout,*) trim(prefix_),' ','Decoupled Aggregator locally-symmetrized'
|
||||||
|
write(iout,*) trim(prefix_),' ','Aggregator object type: ',ag%fmt()
|
||||||
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_c_symdec_aggregator_descr
|
end subroutine amg_c_symdec_aggregator_descr
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ module amg_d_ainv_solver
|
|||||||
!!$ end interface
|
!!$ end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_d_ainv_solver_descr(sv,info,iout,coarse)
|
subroutine amg_d_ainv_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_dpk_, amg_d_ainv_solver_type, psb_ipk_
|
import :: psb_dpk_, amg_d_ainv_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
@@ -208,7 +208,7 @@ module amg_d_ainv_solver
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_d_ainv_solver_descr
|
end subroutine amg_d_ainv_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -396,21 +396,23 @@ contains
|
|||||||
end subroutine d_as_smoother_default
|
end subroutine d_as_smoother_default
|
||||||
|
|
||||||
|
|
||||||
subroutine d_as_smoother_descr(sm,info,iout,coarse)
|
subroutine d_as_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_d_as_smoother_type), intent(in) :: sm
|
class(amg_d_as_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_d_as_smoother_descr'
|
character(len=20), parameter :: name='amg_d_as_smoother_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
logical :: coarse_
|
logical :: coarse_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -424,16 +426,21 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (.not.coarse_) then
|
if (.not.coarse_) then
|
||||||
write(iout_,*) ' Additive Schwarz with ',&
|
write(iout_,*) trim(prefix_), ' Additive Schwarz with ',&
|
||||||
& sm%novr, ' overlap layers.'
|
& sm%novr, ' overlap layers.'
|
||||||
write(iout_,*) ' Restrictor: ',restrict_names(sm%restr)
|
write(iout_,*) trim(prefix_), ' Restrictor: ',restrict_names(sm%restr)
|
||||||
write(iout_,*) ' Prolongator: ',prolong_names(sm%prol)
|
write(iout_,*) trim(prefix_), ' Prolongator: ',prolong_names(sm%prol)
|
||||||
write(iout_,*) ' Local solver:'
|
write(iout_,*) trim(prefix_), ' Local solver:'
|
||||||
endif
|
endif
|
||||||
if (allocated(sm%sv)) then
|
if (allocated(sm%sv)) then
|
||||||
call sm%sv%descr(info,iout_,coarse=coarse)
|
call sm%sv%descr(info,iout_,coarse=coarse,prefix=prefix)
|
||||||
end if
|
end if
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ module amg_d_base_aggregator_mod
|
|||||||
& psb_d_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
|
& psb_d_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_d_csr_sparse_mat), intent(inout) :: a_csr
|
type(psb_d_csr_sparse_mat), intent(inout) :: a_csr
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
||||||
type(amg_dml_parms), intent(inout) :: parms
|
type(amg_dml_parms), intent(inout) :: parms
|
||||||
type(psb_d_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
type(psb_d_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
||||||
@@ -144,7 +144,7 @@ module amg_d_base_aggregator_mod
|
|||||||
& psb_d_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
|
& psb_d_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_d_csr_sparse_mat), intent(inout) :: a_csr
|
type(psb_d_csr_sparse_mat), intent(inout) :: a_csr
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
||||||
type(amg_dml_parms), intent(inout) :: parms
|
type(amg_dml_parms), intent(inout) :: parms
|
||||||
type(psb_d_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
type(psb_d_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
||||||
@@ -275,15 +275,22 @@ contains
|
|||||||
val = .false.
|
val = .false.
|
||||||
end function amg_d_base_aggregator_xt_desc
|
end function amg_d_base_aggregator_xt_desc
|
||||||
|
|
||||||
subroutine amg_d_base_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_d_base_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_d_base_aggregator_type), intent(in) :: ag
|
class(amg_d_base_aggregator_type), intent(in) :: ag
|
||||||
type(amg_dml_parms), intent(in) :: parms
|
type(amg_dml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
character(1024) :: prefix_
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
write(iout,*) trim(prefix_),' ', 'Aggregator object type: ',ag%fmt()
|
||||||
call parms%mldescr(iout,info)
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_d_base_aggregator_descr
|
end subroutine amg_d_base_aggregator_descr
|
||||||
|
|||||||
@@ -272,7 +272,7 @@ module amg_d_base_smoother_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_d_base_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_d_base_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: psb_desc_type, psb_dspmat_type, psb_d_base_sparse_mat, &
|
import :: psb_desc_type, psb_dspmat_type, psb_d_base_sparse_mat, &
|
||||||
& psb_d_vect_type, psb_d_base_vect_type, psb_dpk_, &
|
& psb_d_vect_type, psb_d_base_vect_type, psb_dpk_, &
|
||||||
& amg_d_base_smoother_type, psb_ipk_
|
& amg_d_base_smoother_type, psb_ipk_
|
||||||
@@ -281,6 +281,7 @@ module amg_d_base_smoother_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_d_base_smoother_descr
|
end subroutine amg_d_base_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ module amg_d_base_solver_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_d_base_solver_descr(sv,info,iout,coarse)
|
subroutine amg_d_base_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_desc_type, psb_dspmat_type, psb_d_base_sparse_mat, &
|
import :: psb_desc_type, psb_dspmat_type, psb_d_base_sparse_mat, &
|
||||||
& psb_d_vect_type, psb_d_base_vect_type, psb_dpk_, &
|
& psb_d_vect_type, psb_d_base_vect_type, psb_dpk_, &
|
||||||
& amg_d_base_solver_type, psb_ipk_
|
& amg_d_base_solver_type, psb_ipk_
|
||||||
@@ -281,7 +281,7 @@ module amg_d_base_solver_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_d_base_solver_descr
|
end subroutine amg_d_base_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -184,16 +184,23 @@ contains
|
|||||||
val = "Decoupled aggregation"
|
val = "Decoupled aggregation"
|
||||||
end function amg_d_dec_aggregator_fmt
|
end function amg_d_dec_aggregator_fmt
|
||||||
|
|
||||||
subroutine amg_d_dec_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_d_dec_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_d_dec_aggregator_type), intent(in) :: ag
|
class(amg_d_dec_aggregator_type), intent(in) :: ag
|
||||||
type(amg_dml_parms), intent(in) :: parms
|
type(amg_dml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
character(1024) :: prefix_
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout,*) 'Decoupled Aggregator'
|
write(iout,*) trim(prefix_),' ','Decoupled Aggregator'
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
write(iout,*) trim(prefix_),' ','Aggregator object type: ',ag%fmt()
|
||||||
call parms%mldescr(iout,info)
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_d_dec_aggregator_descr
|
end subroutine amg_d_dec_aggregator_descr
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ contains
|
|||||||
|
|
||||||
end subroutine d_diag_solver_free
|
end subroutine d_diag_solver_free
|
||||||
|
|
||||||
subroutine d_diag_solver_descr(sv,info,iout,coarse)
|
subroutine d_diag_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -228,11 +228,13 @@ contains
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_d_diag_solver_descr'
|
character(len=20), parameter :: name='amg_d_diag_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -240,8 +242,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
write(iout_,*) ' Diagonal local solver '
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout_,*) trim(prefix_), ' Diagonal local solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -352,7 +359,7 @@ module amg_d_l1_diag_solver
|
|||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
subroutine d_l1_diag_solver_descr(sv,info,iout,coarse)
|
subroutine d_l1_diag_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -361,11 +368,13 @@ contains
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_d_l1_diag_solver_descr'
|
character(len=20), parameter :: name='amg_d_l1_diag_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -373,8 +382,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
write(iout_,*) ' L1 Diagonal solver '
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout_,*) trim(prefix_), ' L1 Diagonal solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
+26
-12
@@ -433,20 +433,22 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine d_gs_solver_free
|
end subroutine d_gs_solver_free
|
||||||
|
|
||||||
subroutine d_gs_solver_descr(sv,info,iout,coarse)
|
subroutine d_gs_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_d_gs_solver_type), intent(in) :: sv
|
class(amg_d_gs_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_d_gs_solver_descr'
|
character(len=20), parameter :: name='amg_d_gs_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -455,12 +457,17 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%eps<=dzero) then
|
if (sv%eps<=dzero) then
|
||||||
write(iout_,*) ' Forward Gauss-Seidel iterative solver with ',&
|
write(iout_,*) trim(prefix_), ' Forward Gauss-Seidel iterative solver with ',&
|
||||||
& sv%sweeps,' sweeps'
|
& sv%sweeps,' sweeps'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Forward Gauss-Seidel iterative solver with tolerance',&
|
write(iout_,*) trim(prefix_), ' Forward Gauss-Seidel iterative solver with tolerance',&
|
||||||
& sv%eps,' and maxit', sv%sweeps
|
& sv%eps,' and maxit', sv%sweeps
|
||||||
end if
|
end if
|
||||||
|
|
||||||
@@ -526,20 +533,22 @@ contains
|
|||||||
val = .true.
|
val = .true.
|
||||||
end function d_gs_solver_is_iterative
|
end function d_gs_solver_is_iterative
|
||||||
|
|
||||||
subroutine d_bwgs_solver_descr(sv,info,iout,coarse)
|
subroutine d_bwgs_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_d_bwgs_solver_type), intent(in) :: sv
|
class(amg_d_bwgs_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_d_bwgs_solver_descr'
|
character(len=20), parameter :: name='amg_d_bwgs_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -548,12 +557,17 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%eps<=dzero) then
|
if (sv%eps<=dzero) then
|
||||||
write(iout_,*) ' Backward Gauss-Seidel iterative solver with ',&
|
write(iout_,*) trim(prefix_), ' Backward Gauss-Seidel iterative solver with ',&
|
||||||
& sv%sweeps,' sweeps'
|
& sv%sweeps,' sweeps'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Backward Gauss-Seidel iterative solver with tolerance',&
|
write(iout_,*) trim(prefix_), ' Backward Gauss-Seidel iterative solver with tolerance',&
|
||||||
& sv%eps,' and maxit', sv%sweeps
|
& sv%eps,' and maxit', sv%sweeps
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine d_id_solver_free
|
end subroutine d_id_solver_free
|
||||||
|
|
||||||
subroutine d_id_solver_descr(sv,info,iout,coarse)
|
subroutine d_id_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -165,12 +165,14 @@ contains
|
|||||||
class(amg_d_id_solver_type), intent(in) :: sv
|
class(amg_d_id_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_d_id_solver_descr'
|
character(len=20), parameter :: name='amg_d_id_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -178,8 +180,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' Identity local solver '
|
write(iout_,*) trim(prefix_), ' Identity local solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine d_ilu_solver_free
|
end subroutine d_ilu_solver_free
|
||||||
|
|
||||||
subroutine d_ilu_solver_descr(sv,info,iout,coarse)
|
subroutine d_ilu_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -414,12 +414,14 @@ contains
|
|||||||
class(amg_d_ilu_solver_type), intent(in) :: sv
|
class(amg_d_ilu_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_d_ilu_solver_descr'
|
character(len=20), parameter :: name='amg_d_ilu_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -428,15 +430,20 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' Incomplete factorization solver: ',&
|
write(iout_,*) trim(prefix_), ' Incomplete factorization solver: ',&
|
||||||
& amg_fact_names(sv%fact_type)
|
& amg_fact_names(sv%fact_type)
|
||||||
select case(sv%fact_type)
|
select case(sv%fact_type)
|
||||||
case(psb_ilu_n_,psb_milu_n_)
|
case(psb_ilu_n_,psb_milu_n_)
|
||||||
write(iout_,*) ' Fill level:',sv%fill_in
|
write(iout_,*) trim(prefix_), ' Fill level:',sv%fill_in
|
||||||
case(psb_ilu_t_)
|
case(psb_ilu_t_)
|
||||||
write(iout_,*) ' Fill level:',sv%fill_in
|
write(iout_,*) trim(prefix_), ' Fill level:',sv%fill_in
|
||||||
write(iout_,*) ' Fill threshold :',sv%thresh
|
write(iout_,*) trim(prefix_), ' Fill threshold :',sv%thresh
|
||||||
end select
|
end select
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ module amg_d_invk_solver
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_d_invk_solver_descr(sv,info,iout,coarse)
|
subroutine amg_d_invk_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_dpk_, amg_d_invk_solver_type, psb_ipk_
|
import :: psb_dpk_, amg_d_invk_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
@@ -133,7 +133,7 @@ module amg_d_invk_solver
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_d_invk_solver_descr
|
end subroutine amg_d_invk_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -134,16 +134,17 @@ module amg_d_invt_solver
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_d_invt_solver_descr(sv,info,iout,coarse)
|
subroutine amg_d_invt_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_dpk_, amg_d_invt_solver_type, psb_ipk_
|
import :: psb_dpk_, amg_d_invt_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_d_invt_solver_type), intent(in) :: sv
|
class(amg_d_invt_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
end subroutine amg_d_invt_solver_descr
|
end subroutine amg_d_invt_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|||||||
@@ -219,12 +219,13 @@ module amg_d_jac_smoother
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_d_jac_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_d_jac_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: amg_d_jac_smoother_type, psb_ipk_
|
import :: amg_d_jac_smoother_type, psb_ipk_
|
||||||
class(amg_d_jac_smoother_type), intent(in) :: sm
|
class(amg_d_jac_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_d_jac_smoother_descr
|
end subroutine amg_d_jac_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
@@ -313,12 +314,13 @@ module amg_d_jac_smoother
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_d_l1_jac_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_d_l1_jac_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: amg_d_l1_jac_smoother_type, psb_ipk_
|
import :: amg_d_l1_jac_smoother_type, psb_ipk_
|
||||||
class(amg_d_l1_jac_smoother_type), intent(in) :: sm
|
class(amg_d_l1_jac_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_d_l1_jac_smoother_descr
|
end subroutine amg_d_l1_jac_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -436,7 +436,7 @@ contains
|
|||||||
val = "KRM solver"
|
val = "KRM solver"
|
||||||
end function d_krm_solver_get_fmt
|
end function d_krm_solver_get_fmt
|
||||||
|
|
||||||
subroutine d_krm_solver_descr(sv,info,iout,coarse)
|
subroutine d_krm_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -444,12 +444,14 @@ contains
|
|||||||
class(amg_d_krm_solver_type), intent(in) :: sv
|
class(amg_d_krm_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_d_krm_solver_descr'
|
character(len=20), parameter :: name='amg_d_krm_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -458,23 +460,22 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%global) then
|
if (sv%global) then
|
||||||
write(iout_,*) ' Krylov solver (global)'
|
write(iout_,*) trim(prefix_), ' Krylov solver (global)'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Krylov solver (local) '
|
write(iout_,*) trim(prefix_), ' Krylov solver (local) '
|
||||||
end if
|
end if
|
||||||
write(iout_,*) ' method: ',sv%method
|
write(iout_,*) trim(prefix_), ' method: ',sv%method
|
||||||
write(iout_,*) ' kprec: ',sv%kprec
|
write(iout_,*) trim(prefix_), ' kprec: ',sv%kprec
|
||||||
if (sv%i_sub_solve > 0) then
|
call sv%prec%descr(info,iout_,prefix='KRM : '//prefix_)
|
||||||
write(iout_,*) ' sub_solve: ',amg_fact_names(sv%i_sub_solve)
|
write(iout_,*) trim(prefix_), ' itmax: ',sv%itmax
|
||||||
else
|
write(iout_,*) trim(prefix_), ' eps: ',sv%eps
|
||||||
write(iout_,*) ' sub_solve: ',sv%sub_solve
|
|
||||||
end if
|
|
||||||
write(iout_,*) ' itmax: ',sv%itmax
|
|
||||||
write(iout_,*) ' eps: ',sv%eps
|
|
||||||
write(iout_,*) ' fillin: ',sv%fillin
|
|
||||||
|
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
+69
-341
@@ -68,7 +68,7 @@
|
|||||||
! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
! POSSIBILITY OF SUCH DAMAGE.
|
! POSSIBILITY OF SUCH DAMAGE.
|
||||||
!
|
!
|
||||||
module dmatchboxp_mod
|
module amg_d_matchboxp_mod
|
||||||
|
|
||||||
use iso_c_binding
|
use iso_c_binding
|
||||||
use psb_base_cbind_mod
|
use psb_base_cbind_mod
|
||||||
@@ -94,33 +94,25 @@ module dmatchboxp_mod
|
|||||||
end subroutine dMatchBoxPC
|
end subroutine dMatchBoxPC
|
||||||
end interface MatchBoxPC
|
end interface MatchBoxPC
|
||||||
|
|
||||||
interface i_aggr_assign
|
interface amg_i_aggr_assign
|
||||||
module procedure i_daggr_assign
|
module procedure amg_i_d_aggr_assign
|
||||||
end interface i_aggr_assign
|
end interface amg_i_aggr_assign
|
||||||
|
|
||||||
interface build_matching
|
interface amg_par_build_matching
|
||||||
module procedure dbuild_matching
|
module procedure amg_d_par_build_matching
|
||||||
end interface build_matching
|
end interface amg_par_build_matching
|
||||||
|
|
||||||
interface build_ahat
|
interface amg_par_build_ahat
|
||||||
module procedure dbuild_ahat
|
module procedure amg_d_par_build_ahat
|
||||||
end interface build_ahat
|
end interface amg_par_build_ahat
|
||||||
|
|
||||||
interface psb_gtranspose
|
interface amg_PMatchBox
|
||||||
module procedure psb_dgtranspose
|
module procedure amg_d_PMatchBox
|
||||||
end interface psb_gtranspose
|
end interface amg_PMatchBox
|
||||||
|
|
||||||
interface psb_htranspose
|
|
||||||
module procedure psb_dhtranspose
|
|
||||||
end interface psb_htranspose
|
|
||||||
|
|
||||||
interface PMatchBox
|
|
||||||
module procedure dPMatchBox
|
|
||||||
end interface PMatchBox
|
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
subroutine dmatchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,&
|
subroutine amg_d_matchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,&
|
||||||
& symmetrize,reproducible,display_inp, display_out, print_out)
|
& symmetrize,reproducible,display_inp, display_out, print_out)
|
||||||
use psb_base_mod
|
use psb_base_mod
|
||||||
use psb_util_mod
|
use psb_util_mod
|
||||||
@@ -151,9 +143,10 @@ contains
|
|||||||
type(psb_ld_coo_sparse_mat) :: tmpcoo
|
type(psb_ld_coo_sparse_mat) :: tmpcoo
|
||||||
logical :: display_out_, print_out_, reproducible_
|
logical :: display_out_, print_out_, reproducible_
|
||||||
logical, parameter :: dump=.false., debug=.false., dump_mate=.false., &
|
logical, parameter :: dump=.false., debug=.false., dump_mate=.false., &
|
||||||
& debug_ilaggr=.false., debug_sync=.false.
|
& debug_ilaggr=.false., debug_sync=.false., debug_mate=.false.
|
||||||
integer(psb_ipk_), save :: idx_bldmtc=-1, idx_phase1=-1, idx_phase2=-1, idx_phase3=-1
|
integer(psb_ipk_), save :: idx_bldmtc=-1, idx_phase1=-1, idx_phase2=-1, idx_phase3=-1
|
||||||
logical, parameter :: do_timings=.true.
|
logical, parameter :: do_timings=.true.
|
||||||
|
integer, parameter :: ilaggr_neginit=-1, ilaggr_nonlocal=-2
|
||||||
|
|
||||||
ictxt = desc_a%get_ctxt()
|
ictxt = desc_a%get_ctxt()
|
||||||
call psb_info(ictxt,iam,np)
|
call psb_info(ictxt,iam,np)
|
||||||
@@ -195,7 +188,7 @@ contains
|
|||||||
call desc_a%l2gip(ilv,info,owned=.false.)
|
call desc_a%l2gip(ilv,info,owned=.false.)
|
||||||
|
|
||||||
call psb_geall(ilaggr,desc_a,info)
|
call psb_geall(ilaggr,desc_a,info)
|
||||||
ilaggr = -1
|
ilaggr = ilaggr_neginit
|
||||||
call psb_geasb(ilaggr,desc_a,info)
|
call psb_geasb(ilaggr,desc_a,info)
|
||||||
nr = a%get_nrows()
|
nr = a%get_nrows()
|
||||||
nc = a%get_ncols()
|
nc = a%get_ncols()
|
||||||
@@ -213,7 +206,7 @@ contains
|
|||||||
end if
|
end if
|
||||||
if (do_timings) call psb_toc(idx_phase1)
|
if (do_timings) call psb_toc(idx_phase1)
|
||||||
if (do_timings) call psb_tic(idx_bldmtc)
|
if (do_timings) call psb_tic(idx_bldmtc)
|
||||||
call build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize)
|
call amg_par_build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize)
|
||||||
if (do_timings) call psb_toc(idx_bldmtc)
|
if (do_timings) call psb_toc(idx_bldmtc)
|
||||||
if (debug) write(0,*) iam,' buildprol from buildmatching:',&
|
if (debug) write(0,*) iam,' buildprol from buildmatching:',&
|
||||||
& info
|
& info
|
||||||
@@ -221,7 +214,20 @@ contains
|
|||||||
call psb_barrier(ictxt)
|
call psb_barrier(ictxt)
|
||||||
if (iam == 0) write(0,*)' out from buildmatching:', info
|
if (iam == 0) write(0,*)' out from buildmatching:', info
|
||||||
end if
|
end if
|
||||||
|
if (debug_mate) then
|
||||||
|
block
|
||||||
|
integer(psb_lpk_), allocatable :: ckmate(:)
|
||||||
|
allocate(ckmate(nr))
|
||||||
|
ckmate(1:nr) = mate(1:nr)
|
||||||
|
call psb_msort(ckmate(1:nr))
|
||||||
|
do i=1,nr-1
|
||||||
|
if ((ckmate(i)>0) .and. (ckmate(i) == ckmate(i+1))) then
|
||||||
|
write(0,*) iam,' Duplicate mate entry at',i,' :',ckmate(i)
|
||||||
|
end if
|
||||||
|
end do
|
||||||
|
end block
|
||||||
|
end if
|
||||||
|
|
||||||
if (info == 0) then
|
if (info == 0) then
|
||||||
if (do_timings) call psb_tic(idx_phase2)
|
if (do_timings) call psb_tic(idx_phase2)
|
||||||
if (debug_sync) then
|
if (debug_sync) then
|
||||||
@@ -267,7 +273,7 @@ contains
|
|||||||
cycle
|
cycle
|
||||||
else
|
else
|
||||||
|
|
||||||
if (ilaggr(k) == -1) then
|
if (ilaggr(k) == ilaggr_neginit) then
|
||||||
|
|
||||||
wk = w(k)
|
wk = w(k)
|
||||||
widx = w(idx)
|
widx = w(idx)
|
||||||
@@ -275,7 +281,7 @@ contains
|
|||||||
nrmagg = wmax*sqrt((wk/wmax)**2+(widx/wmax)**2)
|
nrmagg = wmax*sqrt((wk/wmax)**2+(widx/wmax)**2)
|
||||||
if (nrmagg > epsilon(nrmagg)) then
|
if (nrmagg > epsilon(nrmagg)) then
|
||||||
if (idx <= nr) then
|
if (idx <= nr) then
|
||||||
if (ilaggr(idx) == -1) then
|
if (ilaggr(idx) == ilaggr_neginit) then
|
||||||
! Now, if both vertices are local, the aggregate is local
|
! Now, if both vertices are local, the aggregate is local
|
||||||
! (kinda obvious).
|
! (kinda obvious).
|
||||||
nlaggr(iam) = nlaggr(iam) + 1
|
nlaggr(iam) = nlaggr(iam) + 1
|
||||||
@@ -283,6 +289,9 @@ contains
|
|||||||
ilaggr(idx) = nlaggr(iam)
|
ilaggr(idx) = nlaggr(iam)
|
||||||
wtemp(k) = w(k)/nrmagg
|
wtemp(k) = w(k)/nrmagg
|
||||||
wtemp(idx) = w(idx)/nrmagg
|
wtemp(idx) = w(idx)/nrmagg
|
||||||
|
else
|
||||||
|
write(0,*) iam,' Inconsistent mate? ',k,mate(k),idx,&
|
||||||
|
&mate(idx),ilaggr(idx)
|
||||||
end if
|
end if
|
||||||
nlpairs = nlpairs+1
|
nlpairs = nlpairs+1
|
||||||
else if (idx <= nc) then
|
else if (idx <= nc) then
|
||||||
@@ -302,7 +311,7 @@ contains
|
|||||||
ilaggr(k) = nlaggr(iam)
|
ilaggr(k) = nlaggr(iam)
|
||||||
nlpairs = nlpairs+1
|
nlpairs = nlpairs+1
|
||||||
else
|
else
|
||||||
ilaggr(k) = -2
|
ilaggr(k) = ilaggr_nonlocal
|
||||||
end if
|
end if
|
||||||
else
|
else
|
||||||
! Use a statistically unbiased tie-breaking rule,
|
! Use a statistically unbiased tie-breaking rule,
|
||||||
@@ -311,13 +320,13 @@ contains
|
|||||||
! Should be a symmetric function.
|
! Should be a symmetric function.
|
||||||
!
|
!
|
||||||
call desc_a%indxmap%qry_halo_owner(idx,iown,info)
|
call desc_a%indxmap%qry_halo_owner(idx,iown,info)
|
||||||
ip = i_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg)
|
ip = amg_i_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg)
|
||||||
if (iam == ip) then
|
if (iam == ip) then
|
||||||
nlaggr(iam) = nlaggr(iam) + 1
|
nlaggr(iam) = nlaggr(iam) + 1
|
||||||
ilaggr(k) = nlaggr(iam)
|
ilaggr(k) = nlaggr(iam)
|
||||||
nlpairs = nlpairs+1
|
nlpairs = nlpairs+1
|
||||||
else
|
else
|
||||||
ilaggr(k) = -2
|
ilaggr(k) = ilaggr_nonlocal
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
@@ -333,6 +342,12 @@ contains
|
|||||||
nlsingl = nlsingl + 1
|
nlsingl = nlsingl + 1
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
|
if (ilaggr(k) == ilaggr_neginit) then
|
||||||
|
write(0,*) iam,' Error: no update to ',k,mate(k),&
|
||||||
|
& abs(w(k)),nrmagg,epsilon(nrmagg),wtemp(k)
|
||||||
|
end if
|
||||||
|
else
|
||||||
|
if (ilaggr(k)<0) write(0,*) 'Strange? ',k,ilaggr(k)
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
end do
|
end do
|
||||||
@@ -340,7 +355,7 @@ contains
|
|||||||
if (do_timings) call psb_tic(idx_phase3)
|
if (do_timings) call psb_tic(idx_phase3)
|
||||||
|
|
||||||
! Ok, now compute offsets, gather halo and fix non-local
|
! Ok, now compute offsets, gather halo and fix non-local
|
||||||
! aggregates (those where ilaggr == -2)
|
! aggregates (those where ilaggr == ilaggr_nonlocal)
|
||||||
call psb_sum(ictxt,nlaggr)
|
call psb_sum(ictxt,nlaggr)
|
||||||
ntaggr = sum(nlaggr(0:np-1))
|
ntaggr = sum(nlaggr(0:np-1))
|
||||||
naggrm1 = sum(nlaggr(0:iam-1))
|
naggrm1 = sum(nlaggr(0:iam-1))
|
||||||
@@ -355,7 +370,7 @@ contains
|
|||||||
call psb_halo(wtemp,desc_a,info)
|
call psb_halo(wtemp,desc_a,info)
|
||||||
! Cleanup as yet unmarked entries
|
! Cleanup as yet unmarked entries
|
||||||
do k=1,nr
|
do k=1,nr
|
||||||
if (ilaggr(k) == -2) then
|
if (ilaggr(k) == ilaggr_nonlocal) then
|
||||||
idx = mate(k)
|
idx = mate(k)
|
||||||
if (idx > nr) then
|
if (idx > nr) then
|
||||||
i = ilaggr(idx)
|
i = ilaggr(idx)
|
||||||
@@ -367,9 +382,14 @@ contains
|
|||||||
else
|
else
|
||||||
write(0,*) 'Error : unresolved (paired) index ',k,idx,i,nr,nc, ilv(k),ilv(idx)
|
write(0,*) 'Error : unresolved (paired) index ',k,idx,i,nr,nc, ilv(k),ilv(idx)
|
||||||
end if
|
end if
|
||||||
end if
|
else if (ilaggr(k) <0) then
|
||||||
if (ilaggr(k) <0) then
|
write(0,*) iam,'Matchboxp: Funny number: ',k,ilv(k),ilaggr(k),wtemp(k)
|
||||||
write(0,*) 'Matchboxp: Funny number: ',k,ilv(k),ilaggr(k),wtemp(k)
|
write(0,*) iam,' : : ',nr,nc,mate(k)
|
||||||
|
if (mate(k) <= nr) then
|
||||||
|
write(0,*) iam,' : : ',ilaggr(mate(k)),mate(mate(k)),&
|
||||||
|
& ilv(k),ilv(mate(k)), ilv(mate(mate(k))),ilaggr(mate(mate(k)))
|
||||||
|
end if
|
||||||
|
flush(0)
|
||||||
end if
|
end if
|
||||||
end do
|
end do
|
||||||
if (debug_sync) then
|
if (debug_sync) then
|
||||||
@@ -422,7 +442,7 @@ contains
|
|||||||
|
|
||||||
end block
|
end block
|
||||||
if (iam == 0) then
|
if (iam == 0) then
|
||||||
write(0,*) 'Matching statistics: Unmatched nodes ',&
|
write(0,*) iam,'Matching statistics: Unmatched nodes ',&
|
||||||
& nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs
|
& nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs
|
||||||
end if
|
end if
|
||||||
|
|
||||||
@@ -513,9 +533,9 @@ contains
|
|||||||
write(0,*) iam,' : error from Matching: ',info
|
write(0,*) iam,' : error from Matching: ',info
|
||||||
end if
|
end if
|
||||||
|
|
||||||
end subroutine dmatchboxp_build_prol
|
end subroutine amg_d_matchboxp_build_prol
|
||||||
|
|
||||||
function i_daggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) &
|
function amg_i_d_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) &
|
||||||
& result(iproc)
|
& result(iproc)
|
||||||
!
|
!
|
||||||
! How to break ties? This
|
! How to break ties? This
|
||||||
@@ -557,10 +577,10 @@ contains
|
|||||||
iproc = iown
|
iproc = iown
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
end function i_daggr_assign
|
end function amg_i_d_aggr_assign
|
||||||
|
|
||||||
|
|
||||||
subroutine dbuild_matching(w,a,desc_a,mate,info,display_inp, symmetrize)
|
subroutine amg_d_par_build_matching(w,a,desc_a,mate,info,display_inp, symmetrize)
|
||||||
use psb_base_mod
|
use psb_base_mod
|
||||||
use psb_util_mod
|
use psb_util_mod
|
||||||
use iso_c_binding
|
use iso_c_binding
|
||||||
@@ -609,7 +629,7 @@ contains
|
|||||||
if (iam == 0) write(0,*)' Into build_ahat:'
|
if (iam == 0) write(0,*)' Into build_ahat:'
|
||||||
end if
|
end if
|
||||||
if (do_timings) call psb_tic(idx_bldahat)
|
if (do_timings) call psb_tic(idx_bldahat)
|
||||||
call build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize)
|
call amg_par_build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize)
|
||||||
if (do_timings) call psb_toc(idx_bldahat)
|
if (do_timings) call psb_toc(idx_bldahat)
|
||||||
if (info /= 0) then
|
if (info /= 0) then
|
||||||
write(0,*) 'Error from build_ahat ', info
|
write(0,*) 'Error from build_ahat ', info
|
||||||
@@ -700,7 +720,7 @@ contains
|
|||||||
!
|
!
|
||||||
if (debug) write(0,*) iam,' buildmatching into PMatchBox:'
|
if (debug) write(0,*) iam,' buildmatching into PMatchBox:'
|
||||||
if (do_timings) call psb_tic(idx_cmboxp)
|
if (do_timings) call psb_tic(idx_cmboxp)
|
||||||
call PMatchBox(nr,nz,vlptr,vlind,ewght,&
|
call amg_PMatchBox(nr,nz,vlptr,vlind,ewght,&
|
||||||
& vnl, mate, iam, np,ictxt,&
|
& vnl, mate, iam, np,ictxt,&
|
||||||
& msgis,msgas,msgprc,ph0t,ph1t,ph2t,ph1crd,ph2crd,info,display_inp)
|
& msgis,msgas,msgprc,ph0t,ph1t,ph2t,ph1crd,ph2crd,info,display_inp)
|
||||||
if (do_timings) call psb_toc(idx_cmboxp)
|
if (do_timings) call psb_toc(idx_cmboxp)
|
||||||
@@ -764,9 +784,9 @@ contains
|
|||||||
val(1:n) = tmp(1:n)
|
val(1:n) = tmp(1:n)
|
||||||
end subroutine fix_order
|
end subroutine fix_order
|
||||||
|
|
||||||
end subroutine dbuild_matching
|
end subroutine amg_d_par_build_matching
|
||||||
|
|
||||||
subroutine dbuild_ahat(w,a,ahat,desc_a,info,symmetrize)
|
subroutine amg_d_par_build_ahat(w,a,ahat,desc_a,info,symmetrize)
|
||||||
use psb_base_mod
|
use psb_base_mod
|
||||||
implicit none
|
implicit none
|
||||||
real(psb_dpk_), intent(in) :: w(:)
|
real(psb_dpk_), intent(in) :: w(:)
|
||||||
@@ -1002,301 +1022,9 @@ contains
|
|||||||
end block
|
end block
|
||||||
end if
|
end if
|
||||||
|
|
||||||
end subroutine dbuild_ahat
|
end subroutine amg_d_par_build_ahat
|
||||||
|
|
||||||
subroutine psb_dgtranspose(ain,aout,desc_a,info)
|
subroutine amg_d_PMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,&
|
||||||
use psb_base_mod
|
|
||||||
implicit none
|
|
||||||
type(psb_ldspmat_type), intent(in) :: ain
|
|
||||||
type(psb_ldspmat_type), intent(out) :: aout
|
|
||||||
type(psb_desc_type) :: desc_a
|
|
||||||
integer(psb_ipk_), intent(out) :: info
|
|
||||||
|
|
||||||
!
|
|
||||||
! BEWARE: This routine works under the assumption
|
|
||||||
! that the same DESC_A works for both A and A^T, which
|
|
||||||
! essentially means that A has a symmetric pattern.
|
|
||||||
!
|
|
||||||
type(psb_ldspmat_type) :: atmp, ahalo, aglb
|
|
||||||
type(psb_ld_coo_sparse_mat) :: tmpcoo
|
|
||||||
type(psb_ld_csr_sparse_mat) :: tmpcsr
|
|
||||||
type(psb_ctxt_type) :: ictxt
|
|
||||||
integer(psb_ipk_) :: me, np
|
|
||||||
integer(psb_lpk_) :: i, j, k, nrow, ncol
|
|
||||||
integer(psb_lpk_), allocatable :: ilv(:)
|
|
||||||
character(len=80) :: aname
|
|
||||||
logical, parameter :: debug=.false., dump=.false., debug_sync=.false.
|
|
||||||
|
|
||||||
ictxt = desc_a%get_context()
|
|
||||||
call psb_info(ictxt,me,np)
|
|
||||||
|
|
||||||
nrow = desc_a%get_local_rows()
|
|
||||||
ncol = desc_a%get_local_cols()
|
|
||||||
if (debug_sync) then
|
|
||||||
call psb_barrier(ictxt)
|
|
||||||
if (me == 0) write(0,*) 'Start gtranspose '
|
|
||||||
end if
|
|
||||||
call ain%cscnv(tmpcsr,info)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
ilv = [(i,i=1,ncol)]
|
|
||||||
call desc_a%l2gip(ilv,info,owned=.false.)
|
|
||||||
write(aname,'(a,i3.3,a)') 'atmp-preh-',me,'.mtx'
|
|
||||||
call ain%print(fname=aname,head='atmp before haloTest ',iv=ilv)
|
|
||||||
end if
|
|
||||||
if (dump) then
|
|
||||||
call ain%cscnv(atmp,info)
|
|
||||||
call psb_gather(aglb,atmp,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'aglob-prehalo.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
!call psb_loc_to_glob(tmpcsr%ja,desc_a,info)
|
|
||||||
call atmp%mv_from(tmpcsr)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'tmpcsr-',me,'.mtx'
|
|
||||||
call atmp%print(fname=aname,head='tmpcsr ',iv=ilv)
|
|
||||||
!call psb_set_debug_level(9999)
|
|
||||||
end if
|
|
||||||
|
|
||||||
! FIXME THIS NEEDS REWORKING
|
|
||||||
if (debug) write(0,*) me,' Gtranspose into sphalo :',atmp%get_nrows(),atmp%get_ncols()
|
|
||||||
call psb_sphalo(atmp,desc_a,ahalo,info,rowscale=.true.)
|
|
||||||
if (debug) write(0,*) me,' Gtranspose from sphalo :',ahalo%get_nrows(),ahalo%get_ncols()
|
|
||||||
if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=ahalo)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'ahalo-',me,'.mtx'
|
|
||||||
call ahalo%print(fname=aname,head='ahalo after haloTest ',iv=ilv)
|
|
||||||
write(aname,'(a,i3.3,a)') 'atmp-h-',me,'.mtx'
|
|
||||||
call atmp%print(fname=aname,head='atmp after haloTest ',iv=ilv)
|
|
||||||
end if
|
|
||||||
|
|
||||||
if (info == psb_success_) call ahalo%free()
|
|
||||||
|
|
||||||
call atmp%cp_to(tmpcoo)
|
|
||||||
call tmpcoo%transp()
|
|
||||||
!call psb_glob_to_loc(tmpcoo%ia,desc_a,info,iact='I')
|
|
||||||
if (debug) write(0,*) 'Before cleanup:',tmpcoo%get_nzeros()
|
|
||||||
|
|
||||||
j = 0
|
|
||||||
do k=1, tmpcoo%get_nzeros()
|
|
||||||
if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then
|
|
||||||
j = j+1
|
|
||||||
tmpcoo%ia(j) = tmpcoo%ia(k)
|
|
||||||
tmpcoo%ja(j) = tmpcoo%ja(k)
|
|
||||||
tmpcoo%val(j) = tmpcoo%val(k)
|
|
||||||
end if
|
|
||||||
end do
|
|
||||||
call tmpcoo%set_nzeros(j)
|
|
||||||
|
|
||||||
if (debug) write(0,*) 'After cleanup:',tmpcoo%get_nzeros()
|
|
||||||
|
|
||||||
call ahalo%mv_from(tmpcoo)
|
|
||||||
if (dump) then
|
|
||||||
call psb_gather(aglb,ahalo,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran-preclip.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
|
|
||||||
call ahalo%csclip(aout,info,imax=nrow)
|
|
||||||
|
|
||||||
if (debug) write(0,*) 'After clip:',aout%get_nzeros()
|
|
||||||
|
|
||||||
if (debug_sync) then
|
|
||||||
call psb_barrier(ictxt)
|
|
||||||
if (me == 0) write(0,*) 'End gtranspose '
|
|
||||||
end if
|
|
||||||
!call aout%cscnv(info,type='csr')
|
|
||||||
|
|
||||||
if (dump) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran-',me,'.mtx'
|
|
||||||
call aout%print(fname=aname,head='atrans ',iv=ilv)
|
|
||||||
call psb_gather(aglb,aout,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
end subroutine psb_dgtranspose
|
|
||||||
|
|
||||||
subroutine psb_dhtranspose(ain,aout,desc_a,info)
|
|
||||||
use psb_base_mod
|
|
||||||
implicit none
|
|
||||||
type(psb_ldspmat_type), intent(in) :: ain
|
|
||||||
type(psb_ldspmat_type), intent(out) :: aout
|
|
||||||
type(psb_desc_type) :: desc_a
|
|
||||||
integer(psb_ipk_), intent(out) :: info
|
|
||||||
|
|
||||||
!
|
|
||||||
! BEWARE: This routine works under the assumption
|
|
||||||
! that the same DESC_A works for both A and A^T, which
|
|
||||||
! essentially means that A has a symmetric pattern.
|
|
||||||
!
|
|
||||||
type(psb_ldspmat_type) :: atmp, ahalo, aglb
|
|
||||||
type(psb_ld_coo_sparse_mat) :: tmpcoo, tmpc1, tmpc2, tmpch
|
|
||||||
type(psb_ld_csr_sparse_mat) :: tmpcsr
|
|
||||||
integer(psb_ipk_) :: nz1, nz2, nzh, nz
|
|
||||||
type(psb_ctxt_type) :: ictxt
|
|
||||||
integer(psb_ipk_) :: me, np
|
|
||||||
integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz
|
|
||||||
integer(psb_lpk_), allocatable :: ilv(:)
|
|
||||||
character(len=80) :: aname
|
|
||||||
logical, parameter :: debug=.false., dump=.false., debug_sync=.false.
|
|
||||||
|
|
||||||
ictxt = desc_a%get_context()
|
|
||||||
call psb_info(ictxt,me,np)
|
|
||||||
|
|
||||||
nrow = desc_a%get_local_rows()
|
|
||||||
ncol = desc_a%get_local_cols()
|
|
||||||
if (debug_sync) then
|
|
||||||
call psb_barrier(ictxt)
|
|
||||||
if (me == 0) write(0,*) 'Start htranspose '
|
|
||||||
end if
|
|
||||||
call ain%cscnv(tmpcsr,info)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
ilv = [(i,i=1,ncol)]
|
|
||||||
call desc_a%l2gip(ilv,info,owned=.false.)
|
|
||||||
write(aname,'(a,i3.3,a)') 'atmp-preh-',me,'.mtx'
|
|
||||||
call ain%print(fname=aname,head='atmp before haloTest ',iv=ilv)
|
|
||||||
end if
|
|
||||||
if (dump) then
|
|
||||||
call ain%cscnv(atmp,info)
|
|
||||||
call psb_gather(aglb,atmp,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'aglob-prehalo.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
!call psb_loc_to_glob(tmpcsr%ja,desc_a,info)
|
|
||||||
call atmp%mv_from(tmpcsr)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'tmpcsr-',me,'.mtx'
|
|
||||||
call atmp%print(fname=aname,head='tmpcsr ',iv=ilv)
|
|
||||||
!call psb_set_debug_level(9999)
|
|
||||||
end if
|
|
||||||
|
|
||||||
! FIXME THIS NEEDS REWORKING
|
|
||||||
if (debug) write(0,*) me,' Htranspose into sphalo :',atmp%get_nrows(),atmp%get_ncols()
|
|
||||||
if (.true.) then
|
|
||||||
call psb_sphalo(atmp,desc_a,ahalo,info, outfmt='coo ')
|
|
||||||
call atmp%mv_to(tmpc1)
|
|
||||||
call ahalo%mv_to(tmpch)
|
|
||||||
nz1 = tmpc1%get_nzeros()
|
|
||||||
call psb_loc_to_glob(tmpc1%ia(1:nz1),desc_a,info,iact='I')
|
|
||||||
call psb_loc_to_glob(tmpc1%ja(1:nz1),desc_a,info,iact='I')
|
|
||||||
nzh = tmpch%get_nzeros()
|
|
||||||
call psb_loc_to_glob(tmpch%ia(1:nzh),desc_a,info,iact='I')
|
|
||||||
call psb_loc_to_glob(tmpch%ja(1:nzh),desc_a,info,iact='I')
|
|
||||||
nlz = nz1+nzh
|
|
||||||
call tmpcoo%allocate(ncol,ncol,nlz)
|
|
||||||
tmpcoo%ia(1:nz1) = tmpc1%ia(1:nz1)
|
|
||||||
tmpcoo%ja(1:nz1) = tmpc1%ja(1:nz1)
|
|
||||||
tmpcoo%val(1:nz1) = tmpc1%val(1:nz1)
|
|
||||||
tmpcoo%ia(nz1+1:nz1+nzh) = tmpch%ia(1:nzh)
|
|
||||||
tmpcoo%ja(nz1+1:nz1+nzh) = tmpch%ja(1:nzh)
|
|
||||||
tmpcoo%val(nz1+1:nz1+nzh) = tmpch%val(1:nzh)
|
|
||||||
call tmpcoo%set_nzeros(nlz)
|
|
||||||
call tmpcoo%transp()
|
|
||||||
nz = tmpcoo%get_nzeros()
|
|
||||||
call psb_glob_to_loc(tmpcoo%ia(1:nz),desc_a,info,iact='I')
|
|
||||||
call psb_glob_to_loc(tmpcoo%ja(1:nz),desc_a,info,iact='I')
|
|
||||||
if (.true.) then
|
|
||||||
call tmpcoo%clean_negidx(info)
|
|
||||||
else
|
|
||||||
j = 0
|
|
||||||
do k=1, tmpcoo%get_nzeros()
|
|
||||||
if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then
|
|
||||||
j = j+1
|
|
||||||
tmpcoo%ia(j) = tmpcoo%ia(k)
|
|
||||||
tmpcoo%ja(j) = tmpcoo%ja(k)
|
|
||||||
tmpcoo%val(j) = tmpcoo%val(k)
|
|
||||||
end if
|
|
||||||
end do
|
|
||||||
call tmpcoo%set_nzeros(j)
|
|
||||||
end if
|
|
||||||
call ahalo%mv_from(tmpcoo)
|
|
||||||
call ahalo%csclip(aout,info,imax=nrow)
|
|
||||||
|
|
||||||
else
|
|
||||||
call psb_sphalo(atmp,desc_a,ahalo,info, rowscale=.true.)
|
|
||||||
if (debug) write(0,*) me,' Htranspose from sphalo :',ahalo%get_nrows(),ahalo%get_ncols()
|
|
||||||
if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=ahalo)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'ahalo-',me,'.mtx'
|
|
||||||
call ahalo%print(fname=aname,head='ahalo after haloTest ',iv=ilv)
|
|
||||||
write(aname,'(a,i3.3,a)') 'atmp-h-',me,'.mtx'
|
|
||||||
call atmp%print(fname=aname,head='atmp after haloTest ',iv=ilv)
|
|
||||||
end if
|
|
||||||
|
|
||||||
if (info == psb_success_) call ahalo%free()
|
|
||||||
|
|
||||||
call atmp%cp_to(tmpcoo)
|
|
||||||
call tmpcoo%transp()
|
|
||||||
if (debug) write(0,*) 'Before cleanup:',tmpcoo%get_nzeros()
|
|
||||||
if (.true.) then
|
|
||||||
call tmpcoo%clean_negidx(info)
|
|
||||||
else
|
|
||||||
|
|
||||||
j = 0
|
|
||||||
do k=1, tmpcoo%get_nzeros()
|
|
||||||
if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then
|
|
||||||
j = j+1
|
|
||||||
tmpcoo%ia(j) = tmpcoo%ia(k)
|
|
||||||
tmpcoo%ja(j) = tmpcoo%ja(k)
|
|
||||||
tmpcoo%val(j) = tmpcoo%val(k)
|
|
||||||
end if
|
|
||||||
end do
|
|
||||||
call tmpcoo%set_nzeros(j)
|
|
||||||
end if
|
|
||||||
|
|
||||||
if (debug) write(0,*) 'After cleanup:',tmpcoo%get_nzeros()
|
|
||||||
|
|
||||||
call ahalo%mv_from(tmpcoo)
|
|
||||||
if (dump) then
|
|
||||||
call psb_gather(aglb,ahalo,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran-preclip.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
|
|
||||||
call ahalo%csclip(aout,info,imax=nrow)
|
|
||||||
end if
|
|
||||||
|
|
||||||
if (debug) write(0,*) 'After clip:',aout%get_nzeros()
|
|
||||||
|
|
||||||
if (debug_sync) then
|
|
||||||
call psb_barrier(ictxt)
|
|
||||||
if (me == 0) write(0,*) 'End htranspose '
|
|
||||||
end if
|
|
||||||
!call aout%cscnv(info,type='csr')
|
|
||||||
|
|
||||||
if (dump) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran-',me,'.mtx'
|
|
||||||
call aout%print(fname=aname,head='atrans ',iv=ilv)
|
|
||||||
call psb_gather(aglb,aout,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
end subroutine psb_dhtranspose
|
|
||||||
|
|
||||||
subroutine dPMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,&
|
|
||||||
& verdistance, mate, myrank, numprocs, ictxt,&
|
& verdistance, mate, myrank, numprocs, ictxt,&
|
||||||
& msgindsent,msgactualsent,msgpercent,&
|
& msgindsent,msgactualsent,msgpercent,&
|
||||||
& ph0_time, ph1_time, ph2_time, ph1_card, ph2_card,info,display_inp)
|
& ph0_time, ph1_time, ph2_time, ph1_card, ph2_card,info,display_inp)
|
||||||
@@ -1431,6 +1159,6 @@ contains
|
|||||||
end if
|
end if
|
||||||
where(mate>=0) mate = mate + 1
|
where(mate>=0) mate = mate + 1
|
||||||
|
|
||||||
end subroutine dPMatchBox
|
end subroutine amg_d_PMatchBox
|
||||||
|
|
||||||
end module dmatchboxp_mod
|
end module amg_d_matchboxp_mod
|
||||||
|
|||||||
@@ -313,22 +313,24 @@ subroutine d_mumps_solver_finalize(sv)
|
|||||||
|
|
||||||
end subroutine d_mumps_solver_finalize
|
end subroutine d_mumps_solver_finalize
|
||||||
|
|
||||||
subroutine d_mumps_solver_descr(sv,info,iout,coarse)
|
subroutine d_mumps_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_d_mumps_solver_type), intent(in) :: sv
|
class(amg_d_mumps_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
type(psb_ctxt_type) :: ctxt
|
type(psb_ctxt_type) :: ctxt
|
||||||
integer(psb_ipk_) :: me, np
|
integer(psb_ipk_) :: me, np
|
||||||
character(len=20), parameter :: name='amg_z_mumps_solver_descr'
|
character(len=20), parameter :: name='amg_z_mumps_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -337,8 +339,13 @@ subroutine d_mumps_solver_descr(sv,info,iout,coarse)
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' MUMPS Solver. '
|
write(iout_,*) trim(prefix_), ' MUMPS Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -258,7 +258,7 @@ module amg_d_onelev_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_d_base_onelev_descr(lv,il,nl,ilmin,info,iout, verbosity)
|
subroutine amg_d_base_onelev_descr(lv,il,nl,ilmin,info,iout, verbosity,prefix)
|
||||||
import :: psb_dspmat_type, psb_d_vect_type, psb_d_base_vect_type, &
|
import :: psb_dspmat_type, psb_d_vect_type, psb_d_base_vect_type, &
|
||||||
& psb_dlinmap_type, psb_dpk_, amg_d_onelev_type, &
|
& psb_dlinmap_type, psb_dpk_, amg_d_onelev_type, &
|
||||||
& psb_ipk_, psb_epk_, psb_desc_type
|
& psb_ipk_, psb_epk_, psb_desc_type
|
||||||
@@ -269,6 +269,7 @@ module amg_d_onelev_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
integer(psb_ipk_), intent(in), optional :: verbosity
|
integer(psb_ipk_), intent(in), optional :: verbosity
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_d_base_onelev_descr
|
end subroutine amg_d_base_onelev_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -118,7 +118,7 @@
|
|||||||
|
|
||||||
module amg_d_parmatch_aggregator_mod
|
module amg_d_parmatch_aggregator_mod
|
||||||
use amg_d_base_aggregator_mod
|
use amg_d_base_aggregator_mod
|
||||||
use dmatchboxp_mod
|
use amg_d_matchboxp_mod
|
||||||
#if defined(SERIAL_MPI)
|
#if defined(SERIAL_MPI)
|
||||||
type, extends(amg_d_base_aggregator_type) :: amg_d_parmatch_aggregator_type
|
type, extends(amg_d_base_aggregator_type) :: amg_d_parmatch_aggregator_type
|
||||||
end type amg_d_parmatch_aggregator_type
|
end type amg_d_parmatch_aggregator_type
|
||||||
@@ -132,8 +132,6 @@ module amg_d_parmatch_aggregator_mod
|
|||||||
type(psb_dspmat_type), allocatable :: prol, restr
|
type(psb_dspmat_type), allocatable :: prol, restr
|
||||||
type(psb_dspmat_type), allocatable :: ac, base_a, rwa
|
type(psb_dspmat_type), allocatable :: ac, base_a, rwa
|
||||||
type(psb_desc_type), allocatable :: desc_ac, desc_ax, base_desc, rwdesc
|
type(psb_desc_type), allocatable :: desc_ac, desc_ax, base_desc, rwdesc
|
||||||
integer(psb_ipk_) :: max_csize
|
|
||||||
integer(psb_ipk_) :: max_nlevels
|
|
||||||
logical :: reproducible_matching = .false.
|
logical :: reproducible_matching = .false.
|
||||||
logical :: need_symmetrize = .false.
|
logical :: need_symmetrize = .false.
|
||||||
logical :: unsmoothed_hierarchy = .true.
|
logical :: unsmoothed_hierarchy = .true.
|
||||||
@@ -143,18 +141,18 @@ module amg_d_parmatch_aggregator_mod
|
|||||||
procedure, pass(ag) :: mat_asb => amg_d_parmatch_aggregator_mat_asb
|
procedure, pass(ag) :: mat_asb => amg_d_parmatch_aggregator_mat_asb
|
||||||
procedure, pass(ag) :: inner_mat_asb => amg_d_parmatch_aggregator_inner_mat_asb
|
procedure, pass(ag) :: inner_mat_asb => amg_d_parmatch_aggregator_inner_mat_asb
|
||||||
procedure, pass(ag) :: bld_map => amg_d_parmatch_aggregator_bld_map
|
procedure, pass(ag) :: bld_map => amg_d_parmatch_aggregator_bld_map
|
||||||
procedure, pass(ag) :: csetc => d_parmatch_aggr_csetc
|
procedure, pass(ag) :: csetc => amg_d_parmatch_aggr_csetc
|
||||||
procedure, pass(ag) :: cseti => d_parmatch_aggr_cseti
|
procedure, pass(ag) :: cseti => amg_d_parmatch_aggr_cseti
|
||||||
procedure, pass(ag) :: default => d_parmatch_aggr_set_default
|
procedure, pass(ag) :: default => amg_d_parmatch_aggr_set_default
|
||||||
procedure, pass(ag) :: sizeof => d_parmatch_aggregator_sizeof
|
procedure, pass(ag) :: sizeof => amg_d_parmatch_aggregator_sizeof
|
||||||
procedure, pass(ag) :: update_next => d_parmatch_aggregator_update_next
|
procedure, pass(ag) :: update_next => amg_d_parmatch_aggregator_update_next
|
||||||
procedure, pass(ag) :: bld_wnxt => d_parmatch_bld_wnxt
|
procedure, pass(ag) :: bld_wnxt => amg_d_parmatch_bld_wnxt
|
||||||
procedure, pass(ag) :: bld_default_w => d_bld_default_w
|
procedure, pass(ag) :: bld_default_w => amg_d_bld_default_w
|
||||||
procedure, pass(ag) :: set_c_default_w => d_set_prm_c_default_w
|
procedure, pass(ag) :: set_c_default_w => amg_d_set_prm_c_default_w
|
||||||
procedure, pass(ag) :: descr => d_parmatch_aggregator_descr
|
procedure, pass(ag) :: descr => amg_d_parmatch_aggregator_descr
|
||||||
procedure, pass(ag) :: clone => d_parmatch_aggregator_clone
|
procedure, pass(ag) :: clone => amg_d_parmatch_aggregator_clone
|
||||||
procedure, pass(ag) :: free => d_parmatch_aggregator_free
|
procedure, pass(ag) :: free => amg_d_parmatch_aggregator_free
|
||||||
procedure, nopass :: fmt => d_parmatch_aggregator_fmt
|
procedure, nopass :: fmt => amg_d_parmatch_aggregator_fmt
|
||||||
procedure, nopass :: xt_desc => amg_d_parmatch_aggregator_xt_desc
|
procedure, nopass :: xt_desc => amg_d_parmatch_aggregator_xt_desc
|
||||||
end type amg_d_parmatch_aggregator_type
|
end type amg_d_parmatch_aggregator_type
|
||||||
|
|
||||||
@@ -168,7 +166,7 @@ module amg_d_parmatch_aggregator_mod
|
|||||||
type(amg_dml_parms), intent(inout) :: parms
|
type(amg_dml_parms), intent(inout) :: parms
|
||||||
type(amg_daggr_data), intent(in) :: ag_data
|
type(amg_daggr_data), intent(in) :: ag_data
|
||||||
type(psb_dspmat_type), intent(inout) :: a
|
type(psb_dspmat_type), intent(inout) :: a
|
||||||
type(psb_desc_type), intent(inout) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
|
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
|
||||||
type(psb_ldspmat_type), intent(out) :: t_prol
|
type(psb_ldspmat_type), intent(out) :: t_prol
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
@@ -235,7 +233,7 @@ module amg_d_parmatch_aggregator_mod
|
|||||||
& psb_ldspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_dml_parms, amg_daggr_data
|
& psb_ldspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_dml_parms, amg_daggr_data
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_dspmat_type), intent(in) :: a
|
type(psb_dspmat_type), intent(in) :: a
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_dml_parms), intent(inout) :: parms
|
type(amg_dml_parms), intent(inout) :: parms
|
||||||
type(psb_ldspmat_type), intent(inout) :: t_prol
|
type(psb_ldspmat_type), intent(inout) :: t_prol
|
||||||
@@ -257,7 +255,7 @@ module amg_d_parmatch_aggregator_mod
|
|||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_dml_parms), intent(inout) :: parms
|
type(amg_dml_parms), intent(inout) :: parms
|
||||||
type(psb_ldspmat_type), intent(inout) :: t_prol
|
type(psb_ldspmat_type), intent(inout) :: t_prol
|
||||||
type(psb_dspmat_type), intent(out) :: op_prol,ac, op_restr
|
type(psb_dspmat_type), intent(inout) :: op_prol,ac, op_restr
|
||||||
type(psb_desc_type), intent(inout) :: desc_ac
|
type(psb_desc_type), intent(inout) :: desc_ac
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
end subroutine amg_d_parmatch_unsmth_bld
|
end subroutine amg_d_parmatch_unsmth_bld
|
||||||
@@ -275,7 +273,7 @@ module amg_d_parmatch_aggregator_mod
|
|||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_dml_parms), intent(inout) :: parms
|
type(amg_dml_parms), intent(inout) :: parms
|
||||||
type(psb_ldspmat_type), intent(inout) :: t_prol
|
type(psb_ldspmat_type), intent(inout) :: t_prol
|
||||||
type(psb_dspmat_type), intent(out) :: op_prol,ac, op_restr
|
type(psb_dspmat_type), intent(inout) :: op_prol,ac, op_restr
|
||||||
type(psb_desc_type), intent(inout) :: desc_ac
|
type(psb_desc_type), intent(inout) :: desc_ac
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
end subroutine amg_d_parmatch_smth_bld
|
end subroutine amg_d_parmatch_smth_bld
|
||||||
@@ -288,11 +286,11 @@ module amg_d_parmatch_aggregator_mod
|
|||||||
& psb_ldspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_dml_parms, amg_daggr_data
|
& psb_ldspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_dml_parms, amg_daggr_data
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_dspmat_type), intent(inout) :: a
|
type(psb_dspmat_type), intent(inout) :: a
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_dml_parms), intent(inout) :: parms
|
type(amg_dml_parms), intent(inout) :: parms
|
||||||
type(psb_ldspmat_type), intent(inout) :: t_prol
|
type(psb_ldspmat_type), intent(inout) :: t_prol
|
||||||
type(psb_dspmat_type), intent(out) :: op_prol,ac, op_restr
|
type(psb_dspmat_type), intent(inout) :: op_prol,ac, op_restr
|
||||||
type(psb_desc_type), intent(out) :: desc_ac
|
type(psb_desc_type), intent(out) :: desc_ac
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
end subroutine amg_d_parmatch_spmm_bld_ov
|
end subroutine amg_d_parmatch_spmm_bld_ov
|
||||||
@@ -306,11 +304,11 @@ module amg_d_parmatch_aggregator_mod
|
|||||||
& psb_d_csr_sparse_mat, psb_ld_csr_sparse_mat
|
& psb_d_csr_sparse_mat, psb_ld_csr_sparse_mat
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_d_csr_sparse_mat), intent(inout) :: a
|
type(psb_d_csr_sparse_mat), intent(inout) :: a
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_dml_parms), intent(inout) :: parms
|
type(amg_dml_parms), intent(inout) :: parms
|
||||||
type(psb_ldspmat_type), intent(inout) :: t_prol
|
type(psb_ldspmat_type), intent(inout) :: t_prol
|
||||||
type(psb_dspmat_type), intent(out) :: op_prol,ac, op_restr
|
type(psb_dspmat_type), intent(inout) :: op_prol,ac, op_restr
|
||||||
type(psb_desc_type), intent(out) :: desc_ac
|
type(psb_desc_type), intent(out) :: desc_ac
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
end subroutine amg_d_parmatch_spmm_bld_inner
|
end subroutine amg_d_parmatch_spmm_bld_inner
|
||||||
@@ -320,7 +318,7 @@ module amg_d_parmatch_aggregator_mod
|
|||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
subroutine d_bld_default_w(ag,nr)
|
subroutine amg_d_bld_default_w(ag,nr)
|
||||||
use psb_realloc_mod
|
use psb_realloc_mod
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_d_parmatch_aggregator_type), target, intent(inout) :: ag
|
class(amg_d_parmatch_aggregator_type), target, intent(inout) :: ag
|
||||||
@@ -330,9 +328,9 @@ contains
|
|||||||
if (info /= psb_success_) return
|
if (info /= psb_success_) return
|
||||||
ag%w = done
|
ag%w = done
|
||||||
!call ag%set_c_default_w()
|
!call ag%set_c_default_w()
|
||||||
end subroutine d_bld_default_w
|
end subroutine amg_d_bld_default_w
|
||||||
|
|
||||||
subroutine d_set_prm_c_default_w(ag)
|
subroutine amg_d_set_prm_c_default_w(ag)
|
||||||
use psb_realloc_mod
|
use psb_realloc_mod
|
||||||
use iso_c_binding
|
use iso_c_binding
|
||||||
implicit none
|
implicit none
|
||||||
@@ -342,9 +340,9 @@ contains
|
|||||||
!write(0,*) 'prm_c_deafult_w '
|
!write(0,*) 'prm_c_deafult_w '
|
||||||
call psb_safe_ab_cpy(ag%w,ag%w_nxt,info)
|
call psb_safe_ab_cpy(ag%w,ag%w_nxt,info)
|
||||||
|
|
||||||
end subroutine d_set_prm_c_default_w
|
end subroutine amg_d_set_prm_c_default_w
|
||||||
|
|
||||||
subroutine d_parmatch_bld_wnxt(ag,ilaggr,valaggr,nx)
|
subroutine amg_d_parmatch_bld_wnxt(ag,ilaggr,valaggr,nx)
|
||||||
use psb_realloc_mod
|
use psb_realloc_mod
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_d_parmatch_aggregator_type), target, intent(inout) :: ag
|
class(amg_d_parmatch_aggregator_type), target, intent(inout) :: ag
|
||||||
@@ -358,14 +356,14 @@ contains
|
|||||||
!write(0,*) 'Executing bld_wnxt ',nx
|
!write(0,*) 'Executing bld_wnxt ',nx
|
||||||
call psb_realloc(nx,ag%w_nxt,info)
|
call psb_realloc(nx,ag%w_nxt,info)
|
||||||
|
|
||||||
end subroutine d_parmatch_bld_wnxt
|
end subroutine amg_d_parmatch_bld_wnxt
|
||||||
|
|
||||||
function d_parmatch_aggregator_fmt() result(val)
|
function amg_d_parmatch_aggregator_fmt() result(val)
|
||||||
implicit none
|
implicit none
|
||||||
character(len=32) :: val
|
character(len=32) :: val
|
||||||
|
|
||||||
val = "Parallel Matching aggregation"
|
val = "Parallel Matching aggregation"
|
||||||
end function d_parmatch_aggregator_fmt
|
end function amg_d_parmatch_aggregator_fmt
|
||||||
|
|
||||||
function amg_d_parmatch_aggregator_xt_desc() result(val)
|
function amg_d_parmatch_aggregator_xt_desc() result(val)
|
||||||
implicit none
|
implicit none
|
||||||
@@ -374,7 +372,7 @@ contains
|
|||||||
val = .true.
|
val = .true.
|
||||||
end function amg_d_parmatch_aggregator_xt_desc
|
end function amg_d_parmatch_aggregator_xt_desc
|
||||||
|
|
||||||
function d_parmatch_aggregator_sizeof(ag) result(val)
|
function amg_d_parmatch_aggregator_sizeof(ag) result(val)
|
||||||
use psb_realloc_mod
|
use psb_realloc_mod
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_d_parmatch_aggregator_type), intent(in) :: ag
|
class(amg_d_parmatch_aggregator_type), intent(in) :: ag
|
||||||
@@ -390,23 +388,30 @@ contains
|
|||||||
if (allocated(ag%base_desc)) val = val + ag%base_desc%sizeof()
|
if (allocated(ag%base_desc)) val = val + ag%base_desc%sizeof()
|
||||||
if (allocated(ag%desc_ax)) val = val + ag%desc_ax%sizeof()
|
if (allocated(ag%desc_ax)) val = val + ag%desc_ax%sizeof()
|
||||||
|
|
||||||
end function d_parmatch_aggregator_sizeof
|
end function amg_d_parmatch_aggregator_sizeof
|
||||||
|
|
||||||
subroutine d_parmatch_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_d_parmatch_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_d_parmatch_aggregator_type), intent(in) :: ag
|
class(amg_d_parmatch_aggregator_type), intent(in) :: ag
|
||||||
type(amg_dml_parms), intent(in) :: parms
|
type(amg_dml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
character(1024) :: prefix_
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout,*) 'Parallel Matching Aggregator'
|
write(iout,*) trim(prefix_),' ','Parallel Matching Aggregator'
|
||||||
write(iout,*) ' Number of matching sweeps: ',ag%n_sweeps
|
write(iout,*) trim(prefix_),' ',' Number of matching sweeps: ',ag%n_sweeps
|
||||||
write(iout,*) ' Matching algorithm : MatchBoxP (PREIS)'
|
write(iout,*) trim(prefix_),' ',' Matching algorithm : MatchBoxP (PREIS)'
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
write(iout,*) trim(prefix_),' ','Aggregator object type: ',ag%fmt()
|
||||||
call parms%mldescr(iout,info)
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine d_parmatch_aggregator_descr
|
end subroutine amg_d_parmatch_aggregator_descr
|
||||||
|
|
||||||
function is_legal_malg(alg) result(val)
|
function is_legal_malg(alg) result(val)
|
||||||
logical :: val
|
logical :: val
|
||||||
@@ -437,7 +442,7 @@ contains
|
|||||||
end function is_legal_nlevels
|
end function is_legal_nlevels
|
||||||
|
|
||||||
|
|
||||||
subroutine d_parmatch_aggregator_update_next(ag,agnext,info)
|
subroutine amg_d_parmatch_aggregator_update_next(ag,agnext,info)
|
||||||
use psb_realloc_mod
|
use psb_realloc_mod
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_d_parmatch_aggregator_type), target, intent(inout) :: ag
|
class(amg_d_parmatch_aggregator_type), target, intent(inout) :: ag
|
||||||
@@ -452,10 +457,10 @@ contains
|
|||||||
& agnext%matching_alg = ag%matching_alg
|
& agnext%matching_alg = ag%matching_alg
|
||||||
if (.not.is_legal_nsweeps(agnext%n_sweeps))&
|
if (.not.is_legal_nsweeps(agnext%n_sweeps))&
|
||||||
& agnext%n_sweeps = ag%n_sweeps
|
& agnext%n_sweeps = ag%n_sweeps
|
||||||
if (.not.is_legal_csize(agnext%max_csize))&
|
!!$ if (.not.is_legal_csize(agnext%max_csize))&
|
||||||
& agnext%max_csize = ag%max_csize
|
!!$ & agnext%max_csize = ag%max_csize
|
||||||
if (.not.is_legal_nlevels(agnext%max_nlevels))&
|
!!$ if (.not.is_legal_nlevels(agnext%max_nlevels))&
|
||||||
& agnext%max_nlevels = ag%max_nlevels
|
!!$ & agnext%max_nlevels = ag%max_nlevels
|
||||||
! Is this going to generate shallow copies/memory leaks/double frees?
|
! Is this going to generate shallow copies/memory leaks/double frees?
|
||||||
! To be investigated further.
|
! To be investigated further.
|
||||||
call psb_safe_ab_cpy(ag%w_nxt,agnext%w,info)
|
call psb_safe_ab_cpy(ag%w_nxt,agnext%w,info)
|
||||||
@@ -470,9 +475,9 @@ contains
|
|||||||
! What should we do here?
|
! What should we do here?
|
||||||
end select
|
end select
|
||||||
info = 0
|
info = 0
|
||||||
end subroutine d_parmatch_aggregator_update_next
|
end subroutine amg_d_parmatch_aggregator_update_next
|
||||||
|
|
||||||
subroutine d_parmatch_aggr_csetc(ag,what,val,info,idx)
|
subroutine amg_d_parmatch_aggr_csetc(ag,what,val,info,idx)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -514,9 +519,9 @@ contains
|
|||||||
! Do nothing
|
! Do nothing
|
||||||
end select
|
end select
|
||||||
return
|
return
|
||||||
end subroutine d_parmatch_aggr_csetc
|
end subroutine amg_d_parmatch_aggr_csetc
|
||||||
|
|
||||||
subroutine d_parmatch_aggr_cseti(ag,what,val,info,idx)
|
subroutine amg_d_parmatch_aggr_cseti(ag,what,val,info,idx)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -540,10 +545,6 @@ contains
|
|||||||
case('AGGR_SIZE')
|
case('AGGR_SIZE')
|
||||||
ag%orig_aggr_size = val
|
ag%orig_aggr_size = val
|
||||||
ag%n_sweeps=max(1,ceiling(log(val*1.0)/log(2.0)))
|
ag%n_sweeps=max(1,ceiling(log(val*1.0)/log(2.0)))
|
||||||
case('PRMC_MAX_CSIZE')
|
|
||||||
ag%max_csize=val
|
|
||||||
case('PRMC_MAX_NLEVELS')
|
|
||||||
ag%max_nlevels=val
|
|
||||||
case('PRMC_W_SIZE')
|
case('PRMC_W_SIZE')
|
||||||
call ag%bld_default_w(val)
|
call ag%bld_default_w(val)
|
||||||
case('PRMC_REPRODUCIBLE_MATCHING')
|
case('PRMC_REPRODUCIBLE_MATCHING')
|
||||||
@@ -556,9 +557,9 @@ contains
|
|||||||
! Do nothing
|
! Do nothing
|
||||||
end select
|
end select
|
||||||
return
|
return
|
||||||
end subroutine d_parmatch_aggr_cseti
|
end subroutine amg_d_parmatch_aggr_cseti
|
||||||
|
|
||||||
subroutine d_parmatch_aggr_set_default(ag)
|
subroutine amg_d_parmatch_aggr_set_default(ag)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -569,8 +570,8 @@ contains
|
|||||||
ag%matching_alg = 0
|
ag%matching_alg = 0
|
||||||
ag%n_sweeps = 1
|
ag%n_sweeps = 1
|
||||||
ag%jacobi_sweeps = 0
|
ag%jacobi_sweeps = 0
|
||||||
ag%max_nlevels = 36
|
!!$ ag%max_nlevels = 36
|
||||||
ag%max_csize = -1
|
!!$ ag%max_csize = -1
|
||||||
!
|
!
|
||||||
! Apparently BootCMatch works better
|
! Apparently BootCMatch works better
|
||||||
! by keeping all entries
|
! by keeping all entries
|
||||||
@@ -579,9 +580,9 @@ contains
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
end subroutine d_parmatch_aggr_set_default
|
end subroutine amg_d_parmatch_aggr_set_default
|
||||||
|
|
||||||
subroutine d_parmatch_aggregator_free(ag,info)
|
subroutine amg_d_parmatch_aggregator_free(ag,info)
|
||||||
use iso_c_binding
|
use iso_c_binding
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_d_parmatch_aggregator_type), intent(inout) :: ag
|
class(amg_d_parmatch_aggregator_type), intent(inout) :: ag
|
||||||
@@ -618,9 +619,9 @@ contains
|
|||||||
call ag%rwdesc%free(info); deallocate(ag%rwdesc,stat=info)
|
call ag%rwdesc%free(info); deallocate(ag%rwdesc,stat=info)
|
||||||
end if
|
end if
|
||||||
|
|
||||||
end subroutine d_parmatch_aggregator_free
|
end subroutine amg_d_parmatch_aggregator_free
|
||||||
|
|
||||||
subroutine d_parmatch_aggregator_clone(ag,agnext,info)
|
subroutine amg_d_parmatch_aggregator_clone(ag,agnext,info)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_d_parmatch_aggregator_type), intent(inout) :: ag
|
class(amg_d_parmatch_aggregator_type), intent(inout) :: ag
|
||||||
class(amg_d_base_aggregator_type), allocatable, intent(inout) :: agnext
|
class(amg_d_base_aggregator_type), allocatable, intent(inout) :: agnext
|
||||||
@@ -640,7 +641,7 @@ contains
|
|||||||
! Should never ever get here
|
! Should never ever get here
|
||||||
info = -1
|
info = -1
|
||||||
end select
|
end select
|
||||||
end subroutine d_parmatch_aggregator_clone
|
end subroutine amg_d_parmatch_aggregator_clone
|
||||||
|
|
||||||
subroutine amg_d_parmatch_aggregator_bld_map(ag,desc_a,desc_ac,ilaggr,nlaggr,&
|
subroutine amg_d_parmatch_aggregator_bld_map(ag,desc_a,desc_ac,ilaggr,nlaggr,&
|
||||||
& op_restr,op_prol,map,info)
|
& op_restr,op_prol,map,info)
|
||||||
|
|||||||
@@ -155,14 +155,16 @@ module amg_d_prec_type
|
|||||||
|
|
||||||
|
|
||||||
interface amg_precdescr
|
interface amg_precdescr
|
||||||
subroutine amg_dfile_prec_descr(prec,iout,root,verbosity)
|
subroutine amg_dfile_prec_descr(prec,info,iout,root,verbosity,prefix)
|
||||||
import :: amg_dprec_type, psb_ipk_
|
import :: amg_dprec_type, psb_ipk_
|
||||||
implicit none
|
implicit none
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_dprec_type), intent(in) :: prec
|
class(amg_dprec_type), intent(in) :: prec
|
||||||
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
integer(psb_ipk_), intent(in), optional :: root
|
integer(psb_ipk_), intent(in), optional :: root
|
||||||
integer(psb_ipk_), intent(in), optional :: verbosity
|
integer(psb_ipk_), intent(in), optional :: verbosity
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_dfile_prec_descr
|
end subroutine amg_dfile_prec_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -385,20 +385,22 @@ contains
|
|||||||
|
|
||||||
end subroutine d_slu_solver_finalize
|
end subroutine d_slu_solver_finalize
|
||||||
|
|
||||||
subroutine d_slu_solver_descr(sv,info,iout,coarse)
|
subroutine d_slu_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_d_slu_solver_type), intent(in) :: sv
|
class(amg_d_slu_solver_type), intent(in) :: sv
|
||||||
integer, intent(out) :: info
|
integer, intent(out) :: info
|
||||||
integer, intent(in), optional :: iout
|
integer, intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer :: err_act
|
integer :: err_act
|
||||||
character(len=20), parameter :: name='amg_d_slu_solver_descr'
|
character(len=20), parameter :: name='amg_d_slu_solver_descr'
|
||||||
integer :: iout_
|
integer :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -407,8 +409,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' SuperLU Sparse Factorization Solver. '
|
write(iout_,*) trim(prefix_), ' SuperLU Sparse Factorization Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ module amg_d_sludist_solver
|
|||||||
use iso_c_binding
|
use iso_c_binding
|
||||||
use amg_d_base_solver_mod
|
use amg_d_base_solver_mod
|
||||||
|
|
||||||
#if defined(LPK8)
|
#if (!defined(HAVE_SLUDIST_)) || defined(IPK8)
|
||||||
|
|
||||||
type, extends(amg_d_base_solver_type) :: amg_d_sludist_solver_type
|
type, extends(amg_d_base_solver_type) :: amg_d_sludist_solver_type
|
||||||
|
|
||||||
@@ -270,10 +270,12 @@ contains
|
|||||||
! Local variables
|
! Local variables
|
||||||
type(psb_dspmat_type) :: atmp
|
type(psb_dspmat_type) :: atmp
|
||||||
type(psb_d_csr_sparse_mat) :: acsr
|
type(psb_d_csr_sparse_mat) :: acsr
|
||||||
integer :: n_row,n_col, nrow_a, nztota, nglob, nzt, npr, npc
|
|
||||||
integer :: ifrst, ibcheck
|
|
||||||
type(psb_ctxt_type) :: ctxt
|
type(psb_ctxt_type) :: ctxt
|
||||||
integer :: np,me,i, err_act, debug_unit, debug_level
|
integer(psb_lpk_), allocatable :: gia(:), gja(:)
|
||||||
|
integer(psb_lpk_) :: lfrst
|
||||||
|
integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota, nglob, nzt, npr, npc
|
||||||
|
integer(psb_ipk_) :: ifrst, ibcheck
|
||||||
|
integer(psb_ipk_) :: np,me,i, err_act, debug_unit, debug_level
|
||||||
character(len=20) :: name='d_sludist_solver_bld', ch_err
|
character(len=20) :: name='d_sludist_solver_bld', ch_err
|
||||||
|
|
||||||
info=psb_success_
|
info=psb_success_
|
||||||
@@ -293,19 +295,36 @@ contains
|
|||||||
n_col = desc_a%get_local_cols()
|
n_col = desc_a%get_local_cols()
|
||||||
nglob = desc_a%get_global_rows()
|
nglob = desc_a%get_global_rows()
|
||||||
|
|
||||||
call a%cscnv(atmp,info,type='coo')
|
!
|
||||||
|
! Strategy here is as follows: because a call to SLUDIST
|
||||||
|
! as a gobal solver is mostly done at the coarsest level,
|
||||||
|
! even if we start from a problem requiring 8 bytes, chances
|
||||||
|
! are that the global size will be suitable for 4 bytes
|
||||||
|
! anyway, so we hope for the best, and throw an error
|
||||||
|
! if something goes wrong.
|
||||||
|
!
|
||||||
|
if (nglob > huge(1_psb_ipk_)) then
|
||||||
|
write(0,*) me,' ',trim(name),': Error: overflow of local indices '
|
||||||
|
info=psb_err_internal_error_
|
||||||
|
call psb_errpush(info,name)
|
||||||
|
goto 9999
|
||||||
|
end if
|
||||||
|
|
||||||
|
call a%cscnv(atmp,info,type='csr')
|
||||||
|
! This in case we are dealing with AS
|
||||||
call psb_rwextd(n_row,atmp,info,b=b)
|
call psb_rwextd(n_row,atmp,info,b=b)
|
||||||
call atmp%cscnv(info,type='csr',dupl=psb_dupl_add_)
|
|
||||||
call atmp%mv_to(acsr)
|
call atmp%mv_to(acsr)
|
||||||
nrow_a = acsr%get_nrows()
|
nrow_a = acsr%get_nrows()
|
||||||
nztota = acsr%get_nzeros()
|
nztota = acsr%get_nzeros()
|
||||||
|
call psb_loc_to_glob(ione,lfrst,desc_a,info)
|
||||||
|
|
||||||
! Fix the entries to call C-base SuperLU
|
! Fix the entries to call C-base SuperLU
|
||||||
call psb_loc_to_glob(1,ifrst,desc_a,info)
|
call psb_realloc(nztota,gja,info)
|
||||||
call psb_loc_to_glob(nrow_a,ibcheck,desc_a,info)
|
call psb_loc_to_glob(acsr%ja(1:nztota),gja(1:nztota), desc_a, info, iact='I')
|
||||||
call psb_loc_to_glob(acsr%ja(1:nztota),desc_a,info,iact='I')
|
acsr%ja(1:nztota) = gja(1:nztota)
|
||||||
acsr%ja(:) = acsr%ja(:) - 1
|
acsr%ja(:) = acsr%ja(:) - 1
|
||||||
acsr%irp(:) = acsr%irp(:) - 1
|
acsr%irp(:) = acsr%irp(:) - 1
|
||||||
ifrst = ifrst - 1
|
ifrst = lfrst - 1
|
||||||
info = amg_dsludist_fact(nglob,nrow_a,nztota,ifrst,&
|
info = amg_dsludist_fact(nglob,nrow_a,nztota,ifrst,&
|
||||||
& acsr%val,acsr%irp,acsr%ja,sv%lufactors,&
|
& acsr%val,acsr%irp,acsr%ja,sv%lufactors,&
|
||||||
& npr,npc)
|
& npr,npc)
|
||||||
@@ -318,7 +337,6 @@ contains
|
|||||||
end if
|
end if
|
||||||
|
|
||||||
call acsr%free()
|
call acsr%free()
|
||||||
call atmp%free()
|
|
||||||
|
|
||||||
if (debug_level >= psb_debug_outer_) &
|
if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),' end'
|
& write(debug_unit,*) me,' ',trim(name),' end'
|
||||||
@@ -403,15 +421,16 @@ contains
|
|||||||
|
|
||||||
end subroutine d_sludist_solver_finalize
|
end subroutine d_sludist_solver_finalize
|
||||||
|
|
||||||
subroutine d_sludist_solver_descr(sv,info,iout,coarse)
|
subroutine d_sludist_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_d_sludist_solver_type), intent(in) :: sv
|
class(amg_d_sludist_solver_type), intent(in) :: sv
|
||||||
integer, intent(out) :: info
|
integer, intent(out) :: info
|
||||||
integer, intent(in), optional :: iout
|
integer, intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer :: err_act
|
integer :: err_act
|
||||||
@@ -419,6 +438,7 @@ contains
|
|||||||
integer :: me, np
|
integer :: me, np
|
||||||
character(len=20), parameter :: name='amg_d_sludist_solver_descr'
|
character(len=20), parameter :: name='amg_d_sludist_solver_descr'
|
||||||
integer :: iout_
|
integer :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -427,8 +447,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' SuperLU_Dist Sparse Factorization Solver. '
|
write(iout_,*) trim(prefix_), ' SuperLU_Dist Sparse Factorization Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -88,16 +88,25 @@ contains
|
|||||||
val = "Symmetric Decoupled aggregation"
|
val = "Symmetric Decoupled aggregation"
|
||||||
end function amg_d_symdec_aggregator_fmt
|
end function amg_d_symdec_aggregator_fmt
|
||||||
|
|
||||||
subroutine amg_d_symdec_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_d_symdec_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_d_symdec_aggregator_type), intent(in) :: ag
|
class(amg_d_symdec_aggregator_type), intent(in) :: ag
|
||||||
type(amg_dml_parms), intent(in) :: parms
|
type(amg_dml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
write(iout,*) 'Decoupled Aggregator locally-symmetrized'
|
character(1024) :: prefix_
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
|
||||||
call parms%mldescr(iout,info)
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout,*) trim(prefix_),' ','Decoupled Aggregator locally-symmetrized'
|
||||||
|
write(iout,*) trim(prefix_),' ','Aggregator object type: ',ag%fmt()
|
||||||
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_d_symdec_aggregator_descr
|
end subroutine amg_d_symdec_aggregator_descr
|
||||||
|
|||||||
@@ -390,20 +390,22 @@ contains
|
|||||||
|
|
||||||
end subroutine d_umf_solver_finalize
|
end subroutine d_umf_solver_finalize
|
||||||
|
|
||||||
subroutine d_umf_solver_descr(sv,info,iout,coarse)
|
subroutine d_umf_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_d_umf_solver_type), intent(in) :: sv
|
class(amg_d_umf_solver_type), intent(in) :: sv
|
||||||
integer, intent(out) :: info
|
integer, intent(out) :: info
|
||||||
integer, intent(in), optional :: iout
|
integer, intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer :: err_act
|
integer :: err_act
|
||||||
character(len=20), parameter :: name='amg_d_umf_solver_descr'
|
character(len=20), parameter :: name='amg_d_umf_solver_descr'
|
||||||
integer :: iout_
|
integer :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -412,8 +414,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' UMFPACK Sparse Factorization Solver. '
|
write(iout_,*) trim(prefix_), ' UMFPACK Sparse Factorization Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ module amg_s_ainv_solver
|
|||||||
!!$ end interface
|
!!$ end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_s_ainv_solver_descr(sv,info,iout,coarse)
|
subroutine amg_s_ainv_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_dpk_, amg_s_ainv_solver_type, psb_ipk_
|
import :: psb_dpk_, amg_s_ainv_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
@@ -208,7 +208,7 @@ module amg_s_ainv_solver
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_s_ainv_solver_descr
|
end subroutine amg_s_ainv_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -396,21 +396,23 @@ contains
|
|||||||
end subroutine s_as_smoother_default
|
end subroutine s_as_smoother_default
|
||||||
|
|
||||||
|
|
||||||
subroutine s_as_smoother_descr(sm,info,iout,coarse)
|
subroutine s_as_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_s_as_smoother_type), intent(in) :: sm
|
class(amg_s_as_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_s_as_smoother_descr'
|
character(len=20), parameter :: name='amg_s_as_smoother_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
logical :: coarse_
|
logical :: coarse_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -424,16 +426,21 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (.not.coarse_) then
|
if (.not.coarse_) then
|
||||||
write(iout_,*) ' Additive Schwarz with ',&
|
write(iout_,*) trim(prefix_), ' Additive Schwarz with ',&
|
||||||
& sm%novr, ' overlap layers.'
|
& sm%novr, ' overlap layers.'
|
||||||
write(iout_,*) ' Restrictor: ',restrict_names(sm%restr)
|
write(iout_,*) trim(prefix_), ' Restrictor: ',restrict_names(sm%restr)
|
||||||
write(iout_,*) ' Prolongator: ',prolong_names(sm%prol)
|
write(iout_,*) trim(prefix_), ' Prolongator: ',prolong_names(sm%prol)
|
||||||
write(iout_,*) ' Local solver:'
|
write(iout_,*) trim(prefix_), ' Local solver:'
|
||||||
endif
|
endif
|
||||||
if (allocated(sm%sv)) then
|
if (allocated(sm%sv)) then
|
||||||
call sm%sv%descr(info,iout_,coarse=coarse)
|
call sm%sv%descr(info,iout_,coarse=coarse,prefix=prefix)
|
||||||
end if
|
end if
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ module amg_s_base_aggregator_mod
|
|||||||
& psb_s_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
|
& psb_s_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_s_csr_sparse_mat), intent(inout) :: a_csr
|
type(psb_s_csr_sparse_mat), intent(inout) :: a_csr
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(psb_s_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
type(psb_s_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
||||||
@@ -144,7 +144,7 @@ module amg_s_base_aggregator_mod
|
|||||||
& psb_s_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
|
& psb_s_coo_sparse_mat, amg_sml_parms, psb_spk_, psb_ipk_, psb_lpk_
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_s_csr_sparse_mat), intent(inout) :: a_csr
|
type(psb_s_csr_sparse_mat), intent(inout) :: a_csr
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(psb_s_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
type(psb_s_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
||||||
@@ -275,15 +275,22 @@ contains
|
|||||||
val = .false.
|
val = .false.
|
||||||
end function amg_s_base_aggregator_xt_desc
|
end function amg_s_base_aggregator_xt_desc
|
||||||
|
|
||||||
subroutine amg_s_base_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_s_base_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_s_base_aggregator_type), intent(in) :: ag
|
class(amg_s_base_aggregator_type), intent(in) :: ag
|
||||||
type(amg_sml_parms), intent(in) :: parms
|
type(amg_sml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
character(1024) :: prefix_
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
write(iout,*) trim(prefix_),' ', 'Aggregator object type: ',ag%fmt()
|
||||||
call parms%mldescr(iout,info)
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_s_base_aggregator_descr
|
end subroutine amg_s_base_aggregator_descr
|
||||||
|
|||||||
@@ -272,7 +272,7 @@ module amg_s_base_smoother_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_s_base_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_s_base_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: psb_desc_type, psb_sspmat_type, psb_s_base_sparse_mat, &
|
import :: psb_desc_type, psb_sspmat_type, psb_s_base_sparse_mat, &
|
||||||
& psb_s_vect_type, psb_s_base_vect_type, psb_spk_, &
|
& psb_s_vect_type, psb_s_base_vect_type, psb_spk_, &
|
||||||
& amg_s_base_smoother_type, psb_ipk_
|
& amg_s_base_smoother_type, psb_ipk_
|
||||||
@@ -281,6 +281,7 @@ module amg_s_base_smoother_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_s_base_smoother_descr
|
end subroutine amg_s_base_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ module amg_s_base_solver_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_s_base_solver_descr(sv,info,iout,coarse)
|
subroutine amg_s_base_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_desc_type, psb_sspmat_type, psb_s_base_sparse_mat, &
|
import :: psb_desc_type, psb_sspmat_type, psb_s_base_sparse_mat, &
|
||||||
& psb_s_vect_type, psb_s_base_vect_type, psb_spk_, &
|
& psb_s_vect_type, psb_s_base_vect_type, psb_spk_, &
|
||||||
& amg_s_base_solver_type, psb_ipk_
|
& amg_s_base_solver_type, psb_ipk_
|
||||||
@@ -281,7 +281,7 @@ module amg_s_base_solver_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_s_base_solver_descr
|
end subroutine amg_s_base_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -184,16 +184,23 @@ contains
|
|||||||
val = "Decoupled aggregation"
|
val = "Decoupled aggregation"
|
||||||
end function amg_s_dec_aggregator_fmt
|
end function amg_s_dec_aggregator_fmt
|
||||||
|
|
||||||
subroutine amg_s_dec_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_s_dec_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_s_dec_aggregator_type), intent(in) :: ag
|
class(amg_s_dec_aggregator_type), intent(in) :: ag
|
||||||
type(amg_sml_parms), intent(in) :: parms
|
type(amg_sml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
character(1024) :: prefix_
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout,*) 'Decoupled Aggregator'
|
write(iout,*) trim(prefix_),' ','Decoupled Aggregator'
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
write(iout,*) trim(prefix_),' ','Aggregator object type: ',ag%fmt()
|
||||||
call parms%mldescr(iout,info)
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_s_dec_aggregator_descr
|
end subroutine amg_s_dec_aggregator_descr
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ contains
|
|||||||
|
|
||||||
end subroutine s_diag_solver_free
|
end subroutine s_diag_solver_free
|
||||||
|
|
||||||
subroutine s_diag_solver_descr(sv,info,iout,coarse)
|
subroutine s_diag_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -228,11 +228,13 @@ contains
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_s_diag_solver_descr'
|
character(len=20), parameter :: name='amg_s_diag_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -240,8 +242,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
write(iout_,*) ' Diagonal local solver '
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout_,*) trim(prefix_), ' Diagonal local solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -352,7 +359,7 @@ module amg_s_l1_diag_solver
|
|||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
subroutine s_l1_diag_solver_descr(sv,info,iout,coarse)
|
subroutine s_l1_diag_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -361,11 +368,13 @@ contains
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_s_l1_diag_solver_descr'
|
character(len=20), parameter :: name='amg_s_l1_diag_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -373,8 +382,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
write(iout_,*) ' L1 Diagonal solver '
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout_,*) trim(prefix_), ' L1 Diagonal solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
+26
-12
@@ -433,20 +433,22 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine s_gs_solver_free
|
end subroutine s_gs_solver_free
|
||||||
|
|
||||||
subroutine s_gs_solver_descr(sv,info,iout,coarse)
|
subroutine s_gs_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_s_gs_solver_type), intent(in) :: sv
|
class(amg_s_gs_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_s_gs_solver_descr'
|
character(len=20), parameter :: name='amg_s_gs_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -455,12 +457,17 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%eps<=dzero) then
|
if (sv%eps<=dzero) then
|
||||||
write(iout_,*) ' Forward Gauss-Seidel iterative solver with ',&
|
write(iout_,*) trim(prefix_), ' Forward Gauss-Seidel iterative solver with ',&
|
||||||
& sv%sweeps,' sweeps'
|
& sv%sweeps,' sweeps'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Forward Gauss-Seidel iterative solver with tolerance',&
|
write(iout_,*) trim(prefix_), ' Forward Gauss-Seidel iterative solver with tolerance',&
|
||||||
& sv%eps,' and maxit', sv%sweeps
|
& sv%eps,' and maxit', sv%sweeps
|
||||||
end if
|
end if
|
||||||
|
|
||||||
@@ -526,20 +533,22 @@ contains
|
|||||||
val = .true.
|
val = .true.
|
||||||
end function s_gs_solver_is_iterative
|
end function s_gs_solver_is_iterative
|
||||||
|
|
||||||
subroutine s_bwgs_solver_descr(sv,info,iout,coarse)
|
subroutine s_bwgs_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_s_bwgs_solver_type), intent(in) :: sv
|
class(amg_s_bwgs_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_s_bwgs_solver_descr'
|
character(len=20), parameter :: name='amg_s_bwgs_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -548,12 +557,17 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%eps<=dzero) then
|
if (sv%eps<=dzero) then
|
||||||
write(iout_,*) ' Backward Gauss-Seidel iterative solver with ',&
|
write(iout_,*) trim(prefix_), ' Backward Gauss-Seidel iterative solver with ',&
|
||||||
& sv%sweeps,' sweeps'
|
& sv%sweeps,' sweeps'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Backward Gauss-Seidel iterative solver with tolerance',&
|
write(iout_,*) trim(prefix_), ' Backward Gauss-Seidel iterative solver with tolerance',&
|
||||||
& sv%eps,' and maxit', sv%sweeps
|
& sv%eps,' and maxit', sv%sweeps
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine s_id_solver_free
|
end subroutine s_id_solver_free
|
||||||
|
|
||||||
subroutine s_id_solver_descr(sv,info,iout,coarse)
|
subroutine s_id_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -165,12 +165,14 @@ contains
|
|||||||
class(amg_s_id_solver_type), intent(in) :: sv
|
class(amg_s_id_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_s_id_solver_descr'
|
character(len=20), parameter :: name='amg_s_id_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -178,8 +180,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' Identity local solver '
|
write(iout_,*) trim(prefix_), ' Identity local solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine s_ilu_solver_free
|
end subroutine s_ilu_solver_free
|
||||||
|
|
||||||
subroutine s_ilu_solver_descr(sv,info,iout,coarse)
|
subroutine s_ilu_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -414,12 +414,14 @@ contains
|
|||||||
class(amg_s_ilu_solver_type), intent(in) :: sv
|
class(amg_s_ilu_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_s_ilu_solver_descr'
|
character(len=20), parameter :: name='amg_s_ilu_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -428,15 +430,20 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' Incomplete factorization solver: ',&
|
write(iout_,*) trim(prefix_), ' Incomplete factorization solver: ',&
|
||||||
& amg_fact_names(sv%fact_type)
|
& amg_fact_names(sv%fact_type)
|
||||||
select case(sv%fact_type)
|
select case(sv%fact_type)
|
||||||
case(psb_ilu_n_,psb_milu_n_)
|
case(psb_ilu_n_,psb_milu_n_)
|
||||||
write(iout_,*) ' Fill level:',sv%fill_in
|
write(iout_,*) trim(prefix_), ' Fill level:',sv%fill_in
|
||||||
case(psb_ilu_t_)
|
case(psb_ilu_t_)
|
||||||
write(iout_,*) ' Fill level:',sv%fill_in
|
write(iout_,*) trim(prefix_), ' Fill level:',sv%fill_in
|
||||||
write(iout_,*) ' Fill threshold :',sv%thresh
|
write(iout_,*) trim(prefix_), ' Fill threshold :',sv%thresh
|
||||||
end select
|
end select
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ module amg_s_invk_solver
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_s_invk_solver_descr(sv,info,iout,coarse)
|
subroutine amg_s_invk_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_spk_, amg_s_invk_solver_type, psb_ipk_
|
import :: psb_spk_, amg_s_invk_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
@@ -133,7 +133,7 @@ module amg_s_invk_solver
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_s_invk_solver_descr
|
end subroutine amg_s_invk_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -134,16 +134,17 @@ module amg_s_invt_solver
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_s_invt_solver_descr(sv,info,iout,coarse)
|
subroutine amg_s_invt_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_spk_, amg_s_invt_solver_type, psb_ipk_
|
import :: psb_spk_, amg_s_invt_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_s_invt_solver_type), intent(in) :: sv
|
class(amg_s_invt_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
end subroutine amg_s_invt_solver_descr
|
end subroutine amg_s_invt_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|||||||
@@ -219,12 +219,13 @@ module amg_s_jac_smoother
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_s_jac_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_s_jac_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: amg_s_jac_smoother_type, psb_ipk_
|
import :: amg_s_jac_smoother_type, psb_ipk_
|
||||||
class(amg_s_jac_smoother_type), intent(in) :: sm
|
class(amg_s_jac_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_s_jac_smoother_descr
|
end subroutine amg_s_jac_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
@@ -313,12 +314,13 @@ module amg_s_jac_smoother
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_s_l1_jac_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_s_l1_jac_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: amg_s_l1_jac_smoother_type, psb_ipk_
|
import :: amg_s_l1_jac_smoother_type, psb_ipk_
|
||||||
class(amg_s_l1_jac_smoother_type), intent(in) :: sm
|
class(amg_s_l1_jac_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_s_l1_jac_smoother_descr
|
end subroutine amg_s_l1_jac_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -436,7 +436,7 @@ contains
|
|||||||
val = "KRM solver"
|
val = "KRM solver"
|
||||||
end function s_krm_solver_get_fmt
|
end function s_krm_solver_get_fmt
|
||||||
|
|
||||||
subroutine s_krm_solver_descr(sv,info,iout,coarse)
|
subroutine s_krm_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -444,12 +444,14 @@ contains
|
|||||||
class(amg_s_krm_solver_type), intent(in) :: sv
|
class(amg_s_krm_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_s_krm_solver_descr'
|
character(len=20), parameter :: name='amg_s_krm_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -458,23 +460,22 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%global) then
|
if (sv%global) then
|
||||||
write(iout_,*) ' Krylov solver (global)'
|
write(iout_,*) trim(prefix_), ' Krylov solver (global)'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Krylov solver (local) '
|
write(iout_,*) trim(prefix_), ' Krylov solver (local) '
|
||||||
end if
|
end if
|
||||||
write(iout_,*) ' method: ',sv%method
|
write(iout_,*) trim(prefix_), ' method: ',sv%method
|
||||||
write(iout_,*) ' kprec: ',sv%kprec
|
write(iout_,*) trim(prefix_), ' kprec: ',sv%kprec
|
||||||
if (sv%i_sub_solve > 0) then
|
call sv%prec%descr(info,iout_,prefix='KRM : '//prefix_)
|
||||||
write(iout_,*) ' sub_solve: ',amg_fact_names(sv%i_sub_solve)
|
write(iout_,*) trim(prefix_), ' itmax: ',sv%itmax
|
||||||
else
|
write(iout_,*) trim(prefix_), ' eps: ',sv%eps
|
||||||
write(iout_,*) ' sub_solve: ',sv%sub_solve
|
|
||||||
end if
|
|
||||||
write(iout_,*) ' itmax: ',sv%itmax
|
|
||||||
write(iout_,*) ' eps: ',sv%eps
|
|
||||||
write(iout_,*) ' fillin: ',sv%fillin
|
|
||||||
|
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
+69
-341
@@ -68,7 +68,7 @@
|
|||||||
! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
! POSSIBILITY OF SUCH DAMAGE.
|
! POSSIBILITY OF SUCH DAMAGE.
|
||||||
!
|
!
|
||||||
module smatchboxp_mod
|
module amg_s_matchboxp_mod
|
||||||
|
|
||||||
use iso_c_binding
|
use iso_c_binding
|
||||||
use psb_base_cbind_mod
|
use psb_base_cbind_mod
|
||||||
@@ -94,33 +94,25 @@ module smatchboxp_mod
|
|||||||
end subroutine sMatchBoxPC
|
end subroutine sMatchBoxPC
|
||||||
end interface MatchBoxPC
|
end interface MatchBoxPC
|
||||||
|
|
||||||
interface i_aggr_assign
|
interface amg_i_aggr_assign
|
||||||
module procedure i_saggr_assign
|
module procedure amg_i_s_aggr_assign
|
||||||
end interface i_aggr_assign
|
end interface amg_i_aggr_assign
|
||||||
|
|
||||||
interface build_matching
|
interface amg_par_build_matching
|
||||||
module procedure sbuild_matching
|
module procedure amg_s_par_build_matching
|
||||||
end interface build_matching
|
end interface amg_par_build_matching
|
||||||
|
|
||||||
interface build_ahat
|
interface amg_par_build_ahat
|
||||||
module procedure sbuild_ahat
|
module procedure amg_s_par_build_ahat
|
||||||
end interface build_ahat
|
end interface amg_par_build_ahat
|
||||||
|
|
||||||
interface psb_gtranspose
|
interface amg_PMatchBox
|
||||||
module procedure psb_sgtranspose
|
module procedure amg_s_PMatchBox
|
||||||
end interface psb_gtranspose
|
end interface amg_PMatchBox
|
||||||
|
|
||||||
interface psb_htranspose
|
|
||||||
module procedure psb_shtranspose
|
|
||||||
end interface psb_htranspose
|
|
||||||
|
|
||||||
interface PMatchBox
|
|
||||||
module procedure sPMatchBox
|
|
||||||
end interface PMatchBox
|
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
subroutine smatchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,&
|
subroutine amg_s_matchboxp_build_prol(w,a,desc_a,ilaggr,nlaggr,prol,info,&
|
||||||
& symmetrize,reproducible,display_inp, display_out, print_out)
|
& symmetrize,reproducible,display_inp, display_out, print_out)
|
||||||
use psb_base_mod
|
use psb_base_mod
|
||||||
use psb_util_mod
|
use psb_util_mod
|
||||||
@@ -151,9 +143,10 @@ contains
|
|||||||
type(psb_ls_coo_sparse_mat) :: tmpcoo
|
type(psb_ls_coo_sparse_mat) :: tmpcoo
|
||||||
logical :: display_out_, print_out_, reproducible_
|
logical :: display_out_, print_out_, reproducible_
|
||||||
logical, parameter :: dump=.false., debug=.false., dump_mate=.false., &
|
logical, parameter :: dump=.false., debug=.false., dump_mate=.false., &
|
||||||
& debug_ilaggr=.false., debug_sync=.false.
|
& debug_ilaggr=.false., debug_sync=.false., debug_mate=.false.
|
||||||
integer(psb_ipk_), save :: idx_bldmtc=-1, idx_phase1=-1, idx_phase2=-1, idx_phase3=-1
|
integer(psb_ipk_), save :: idx_bldmtc=-1, idx_phase1=-1, idx_phase2=-1, idx_phase3=-1
|
||||||
logical, parameter :: do_timings=.true.
|
logical, parameter :: do_timings=.true.
|
||||||
|
integer, parameter :: ilaggr_neginit=-1, ilaggr_nonlocal=-2
|
||||||
|
|
||||||
ictxt = desc_a%get_ctxt()
|
ictxt = desc_a%get_ctxt()
|
||||||
call psb_info(ictxt,iam,np)
|
call psb_info(ictxt,iam,np)
|
||||||
@@ -195,7 +188,7 @@ contains
|
|||||||
call desc_a%l2gip(ilv,info,owned=.false.)
|
call desc_a%l2gip(ilv,info,owned=.false.)
|
||||||
|
|
||||||
call psb_geall(ilaggr,desc_a,info)
|
call psb_geall(ilaggr,desc_a,info)
|
||||||
ilaggr = -1
|
ilaggr = ilaggr_neginit
|
||||||
call psb_geasb(ilaggr,desc_a,info)
|
call psb_geasb(ilaggr,desc_a,info)
|
||||||
nr = a%get_nrows()
|
nr = a%get_nrows()
|
||||||
nc = a%get_ncols()
|
nc = a%get_ncols()
|
||||||
@@ -213,7 +206,7 @@ contains
|
|||||||
end if
|
end if
|
||||||
if (do_timings) call psb_toc(idx_phase1)
|
if (do_timings) call psb_toc(idx_phase1)
|
||||||
if (do_timings) call psb_tic(idx_bldmtc)
|
if (do_timings) call psb_tic(idx_bldmtc)
|
||||||
call build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize)
|
call amg_par_build_matching(w,a,desc_a,mate,info,display_inp=display_inp,symmetrize=symmetrize)
|
||||||
if (do_timings) call psb_toc(idx_bldmtc)
|
if (do_timings) call psb_toc(idx_bldmtc)
|
||||||
if (debug) write(0,*) iam,' buildprol from buildmatching:',&
|
if (debug) write(0,*) iam,' buildprol from buildmatching:',&
|
||||||
& info
|
& info
|
||||||
@@ -221,7 +214,20 @@ contains
|
|||||||
call psb_barrier(ictxt)
|
call psb_barrier(ictxt)
|
||||||
if (iam == 0) write(0,*)' out from buildmatching:', info
|
if (iam == 0) write(0,*)' out from buildmatching:', info
|
||||||
end if
|
end if
|
||||||
|
if (debug_mate) then
|
||||||
|
block
|
||||||
|
integer(psb_lpk_), allocatable :: ckmate(:)
|
||||||
|
allocate(ckmate(nr))
|
||||||
|
ckmate(1:nr) = mate(1:nr)
|
||||||
|
call psb_msort(ckmate(1:nr))
|
||||||
|
do i=1,nr-1
|
||||||
|
if ((ckmate(i)>0) .and. (ckmate(i) == ckmate(i+1))) then
|
||||||
|
write(0,*) iam,' Duplicate mate entry at',i,' :',ckmate(i)
|
||||||
|
end if
|
||||||
|
end do
|
||||||
|
end block
|
||||||
|
end if
|
||||||
|
|
||||||
if (info == 0) then
|
if (info == 0) then
|
||||||
if (do_timings) call psb_tic(idx_phase2)
|
if (do_timings) call psb_tic(idx_phase2)
|
||||||
if (debug_sync) then
|
if (debug_sync) then
|
||||||
@@ -267,7 +273,7 @@ contains
|
|||||||
cycle
|
cycle
|
||||||
else
|
else
|
||||||
|
|
||||||
if (ilaggr(k) == -1) then
|
if (ilaggr(k) == ilaggr_neginit) then
|
||||||
|
|
||||||
wk = w(k)
|
wk = w(k)
|
||||||
widx = w(idx)
|
widx = w(idx)
|
||||||
@@ -275,7 +281,7 @@ contains
|
|||||||
nrmagg = wmax*sqrt((wk/wmax)**2+(widx/wmax)**2)
|
nrmagg = wmax*sqrt((wk/wmax)**2+(widx/wmax)**2)
|
||||||
if (nrmagg > epsilon(nrmagg)) then
|
if (nrmagg > epsilon(nrmagg)) then
|
||||||
if (idx <= nr) then
|
if (idx <= nr) then
|
||||||
if (ilaggr(idx) == -1) then
|
if (ilaggr(idx) == ilaggr_neginit) then
|
||||||
! Now, if both vertices are local, the aggregate is local
|
! Now, if both vertices are local, the aggregate is local
|
||||||
! (kinda obvious).
|
! (kinda obvious).
|
||||||
nlaggr(iam) = nlaggr(iam) + 1
|
nlaggr(iam) = nlaggr(iam) + 1
|
||||||
@@ -283,6 +289,9 @@ contains
|
|||||||
ilaggr(idx) = nlaggr(iam)
|
ilaggr(idx) = nlaggr(iam)
|
||||||
wtemp(k) = w(k)/nrmagg
|
wtemp(k) = w(k)/nrmagg
|
||||||
wtemp(idx) = w(idx)/nrmagg
|
wtemp(idx) = w(idx)/nrmagg
|
||||||
|
else
|
||||||
|
write(0,*) iam,' Inconsistent mate? ',k,mate(k),idx,&
|
||||||
|
&mate(idx),ilaggr(idx)
|
||||||
end if
|
end if
|
||||||
nlpairs = nlpairs+1
|
nlpairs = nlpairs+1
|
||||||
else if (idx <= nc) then
|
else if (idx <= nc) then
|
||||||
@@ -302,7 +311,7 @@ contains
|
|||||||
ilaggr(k) = nlaggr(iam)
|
ilaggr(k) = nlaggr(iam)
|
||||||
nlpairs = nlpairs+1
|
nlpairs = nlpairs+1
|
||||||
else
|
else
|
||||||
ilaggr(k) = -2
|
ilaggr(k) = ilaggr_nonlocal
|
||||||
end if
|
end if
|
||||||
else
|
else
|
||||||
! Use a statistically unbiased tie-breaking rule,
|
! Use a statistically unbiased tie-breaking rule,
|
||||||
@@ -311,13 +320,13 @@ contains
|
|||||||
! Should be a symmetric function.
|
! Should be a symmetric function.
|
||||||
!
|
!
|
||||||
call desc_a%indxmap%qry_halo_owner(idx,iown,info)
|
call desc_a%indxmap%qry_halo_owner(idx,iown,info)
|
||||||
ip = i_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg)
|
ip = amg_i_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg)
|
||||||
if (iam == ip) then
|
if (iam == ip) then
|
||||||
nlaggr(iam) = nlaggr(iam) + 1
|
nlaggr(iam) = nlaggr(iam) + 1
|
||||||
ilaggr(k) = nlaggr(iam)
|
ilaggr(k) = nlaggr(iam)
|
||||||
nlpairs = nlpairs+1
|
nlpairs = nlpairs+1
|
||||||
else
|
else
|
||||||
ilaggr(k) = -2
|
ilaggr(k) = ilaggr_nonlocal
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
@@ -333,6 +342,12 @@ contains
|
|||||||
nlsingl = nlsingl + 1
|
nlsingl = nlsingl + 1
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
|
if (ilaggr(k) == ilaggr_neginit) then
|
||||||
|
write(0,*) iam,' Error: no update to ',k,mate(k),&
|
||||||
|
& abs(w(k)),nrmagg,epsilon(nrmagg),wtemp(k)
|
||||||
|
end if
|
||||||
|
else
|
||||||
|
if (ilaggr(k)<0) write(0,*) 'Strange? ',k,ilaggr(k)
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
end do
|
end do
|
||||||
@@ -340,7 +355,7 @@ contains
|
|||||||
if (do_timings) call psb_tic(idx_phase3)
|
if (do_timings) call psb_tic(idx_phase3)
|
||||||
|
|
||||||
! Ok, now compute offsets, gather halo and fix non-local
|
! Ok, now compute offsets, gather halo and fix non-local
|
||||||
! aggregates (those where ilaggr == -2)
|
! aggregates (those where ilaggr == ilaggr_nonlocal)
|
||||||
call psb_sum(ictxt,nlaggr)
|
call psb_sum(ictxt,nlaggr)
|
||||||
ntaggr = sum(nlaggr(0:np-1))
|
ntaggr = sum(nlaggr(0:np-1))
|
||||||
naggrm1 = sum(nlaggr(0:iam-1))
|
naggrm1 = sum(nlaggr(0:iam-1))
|
||||||
@@ -355,7 +370,7 @@ contains
|
|||||||
call psb_halo(wtemp,desc_a,info)
|
call psb_halo(wtemp,desc_a,info)
|
||||||
! Cleanup as yet unmarked entries
|
! Cleanup as yet unmarked entries
|
||||||
do k=1,nr
|
do k=1,nr
|
||||||
if (ilaggr(k) == -2) then
|
if (ilaggr(k) == ilaggr_nonlocal) then
|
||||||
idx = mate(k)
|
idx = mate(k)
|
||||||
if (idx > nr) then
|
if (idx > nr) then
|
||||||
i = ilaggr(idx)
|
i = ilaggr(idx)
|
||||||
@@ -367,9 +382,14 @@ contains
|
|||||||
else
|
else
|
||||||
write(0,*) 'Error : unresolved (paired) index ',k,idx,i,nr,nc, ilv(k),ilv(idx)
|
write(0,*) 'Error : unresolved (paired) index ',k,idx,i,nr,nc, ilv(k),ilv(idx)
|
||||||
end if
|
end if
|
||||||
end if
|
else if (ilaggr(k) <0) then
|
||||||
if (ilaggr(k) <0) then
|
write(0,*) iam,'Matchboxp: Funny number: ',k,ilv(k),ilaggr(k),wtemp(k)
|
||||||
write(0,*) 'Matchboxp: Funny number: ',k,ilv(k),ilaggr(k),wtemp(k)
|
write(0,*) iam,' : : ',nr,nc,mate(k)
|
||||||
|
if (mate(k) <= nr) then
|
||||||
|
write(0,*) iam,' : : ',ilaggr(mate(k)),mate(mate(k)),&
|
||||||
|
& ilv(k),ilv(mate(k)), ilv(mate(mate(k))),ilaggr(mate(mate(k)))
|
||||||
|
end if
|
||||||
|
flush(0)
|
||||||
end if
|
end if
|
||||||
end do
|
end do
|
||||||
if (debug_sync) then
|
if (debug_sync) then
|
||||||
@@ -422,7 +442,7 @@ contains
|
|||||||
|
|
||||||
end block
|
end block
|
||||||
if (iam == 0) then
|
if (iam == 0) then
|
||||||
write(0,*) 'Matching statistics: Unmatched nodes ',&
|
write(0,*) iam,'Matching statistics: Unmatched nodes ',&
|
||||||
& nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs
|
& nunmatched,' Singletons:',nlsingl,' Pairs:',nlpairs
|
||||||
end if
|
end if
|
||||||
|
|
||||||
@@ -513,9 +533,9 @@ contains
|
|||||||
write(0,*) iam,' : error from Matching: ',info
|
write(0,*) iam,' : error from Matching: ',info
|
||||||
end if
|
end if
|
||||||
|
|
||||||
end subroutine smatchboxp_build_prol
|
end subroutine amg_s_matchboxp_build_prol
|
||||||
|
|
||||||
function i_saggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) &
|
function amg_i_s_aggr_assign(iam, iown, kg, idxg, wk, widx, nrmagg) &
|
||||||
& result(iproc)
|
& result(iproc)
|
||||||
!
|
!
|
||||||
! How to break ties? This
|
! How to break ties? This
|
||||||
@@ -557,10 +577,10 @@ contains
|
|||||||
iproc = iown
|
iproc = iown
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
end function i_saggr_assign
|
end function amg_i_s_aggr_assign
|
||||||
|
|
||||||
|
|
||||||
subroutine sbuild_matching(w,a,desc_a,mate,info,display_inp, symmetrize)
|
subroutine amg_s_par_build_matching(w,a,desc_a,mate,info,display_inp, symmetrize)
|
||||||
use psb_base_mod
|
use psb_base_mod
|
||||||
use psb_util_mod
|
use psb_util_mod
|
||||||
use iso_c_binding
|
use iso_c_binding
|
||||||
@@ -609,7 +629,7 @@ contains
|
|||||||
if (iam == 0) write(0,*)' Into build_ahat:'
|
if (iam == 0) write(0,*)' Into build_ahat:'
|
||||||
end if
|
end if
|
||||||
if (do_timings) call psb_tic(idx_bldahat)
|
if (do_timings) call psb_tic(idx_bldahat)
|
||||||
call build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize)
|
call amg_par_build_ahat(w,a,ahatnd,desc_a,info,symmetrize=symmetrize)
|
||||||
if (do_timings) call psb_toc(idx_bldahat)
|
if (do_timings) call psb_toc(idx_bldahat)
|
||||||
if (info /= 0) then
|
if (info /= 0) then
|
||||||
write(0,*) 'Error from build_ahat ', info
|
write(0,*) 'Error from build_ahat ', info
|
||||||
@@ -700,7 +720,7 @@ contains
|
|||||||
!
|
!
|
||||||
if (debug) write(0,*) iam,' buildmatching into PMatchBox:'
|
if (debug) write(0,*) iam,' buildmatching into PMatchBox:'
|
||||||
if (do_timings) call psb_tic(idx_cmboxp)
|
if (do_timings) call psb_tic(idx_cmboxp)
|
||||||
call PMatchBox(nr,nz,vlptr,vlind,ewght,&
|
call amg_PMatchBox(nr,nz,vlptr,vlind,ewght,&
|
||||||
& vnl, mate, iam, np,ictxt,&
|
& vnl, mate, iam, np,ictxt,&
|
||||||
& msgis,msgas,msgprc,ph0t,ph1t,ph2t,ph1crd,ph2crd,info,display_inp)
|
& msgis,msgas,msgprc,ph0t,ph1t,ph2t,ph1crd,ph2crd,info,display_inp)
|
||||||
if (do_timings) call psb_toc(idx_cmboxp)
|
if (do_timings) call psb_toc(idx_cmboxp)
|
||||||
@@ -764,9 +784,9 @@ contains
|
|||||||
val(1:n) = tmp(1:n)
|
val(1:n) = tmp(1:n)
|
||||||
end subroutine fix_order
|
end subroutine fix_order
|
||||||
|
|
||||||
end subroutine sbuild_matching
|
end subroutine amg_s_par_build_matching
|
||||||
|
|
||||||
subroutine sbuild_ahat(w,a,ahat,desc_a,info,symmetrize)
|
subroutine amg_s_par_build_ahat(w,a,ahat,desc_a,info,symmetrize)
|
||||||
use psb_base_mod
|
use psb_base_mod
|
||||||
implicit none
|
implicit none
|
||||||
real(psb_spk_), intent(in) :: w(:)
|
real(psb_spk_), intent(in) :: w(:)
|
||||||
@@ -1002,301 +1022,9 @@ contains
|
|||||||
end block
|
end block
|
||||||
end if
|
end if
|
||||||
|
|
||||||
end subroutine sbuild_ahat
|
end subroutine amg_s_par_build_ahat
|
||||||
|
|
||||||
subroutine psb_sgtranspose(ain,aout,desc_a,info)
|
subroutine amg_s_PMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,&
|
||||||
use psb_base_mod
|
|
||||||
implicit none
|
|
||||||
type(psb_lsspmat_type), intent(in) :: ain
|
|
||||||
type(psb_lsspmat_type), intent(out) :: aout
|
|
||||||
type(psb_desc_type) :: desc_a
|
|
||||||
integer(psb_ipk_), intent(out) :: info
|
|
||||||
|
|
||||||
!
|
|
||||||
! BEWARE: This routine works under the assumption
|
|
||||||
! that the same DESC_A works for both A and A^T, which
|
|
||||||
! essentially means that A has a symmetric pattern.
|
|
||||||
!
|
|
||||||
type(psb_lsspmat_type) :: atmp, ahalo, aglb
|
|
||||||
type(psb_ls_coo_sparse_mat) :: tmpcoo
|
|
||||||
type(psb_ls_csr_sparse_mat) :: tmpcsr
|
|
||||||
type(psb_ctxt_type) :: ictxt
|
|
||||||
integer(psb_ipk_) :: me, np
|
|
||||||
integer(psb_lpk_) :: i, j, k, nrow, ncol
|
|
||||||
integer(psb_lpk_), allocatable :: ilv(:)
|
|
||||||
character(len=80) :: aname
|
|
||||||
logical, parameter :: debug=.false., dump=.false., debug_sync=.false.
|
|
||||||
|
|
||||||
ictxt = desc_a%get_context()
|
|
||||||
call psb_info(ictxt,me,np)
|
|
||||||
|
|
||||||
nrow = desc_a%get_local_rows()
|
|
||||||
ncol = desc_a%get_local_cols()
|
|
||||||
if (debug_sync) then
|
|
||||||
call psb_barrier(ictxt)
|
|
||||||
if (me == 0) write(0,*) 'Start gtranspose '
|
|
||||||
end if
|
|
||||||
call ain%cscnv(tmpcsr,info)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
ilv = [(i,i=1,ncol)]
|
|
||||||
call desc_a%l2gip(ilv,info,owned=.false.)
|
|
||||||
write(aname,'(a,i3.3,a)') 'atmp-preh-',me,'.mtx'
|
|
||||||
call ain%print(fname=aname,head='atmp before haloTest ',iv=ilv)
|
|
||||||
end if
|
|
||||||
if (dump) then
|
|
||||||
call ain%cscnv(atmp,info)
|
|
||||||
call psb_gather(aglb,atmp,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'aglob-prehalo.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
!call psb_loc_to_glob(tmpcsr%ja,desc_a,info)
|
|
||||||
call atmp%mv_from(tmpcsr)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'tmpcsr-',me,'.mtx'
|
|
||||||
call atmp%print(fname=aname,head='tmpcsr ',iv=ilv)
|
|
||||||
!call psb_set_debug_level(9999)
|
|
||||||
end if
|
|
||||||
|
|
||||||
! FIXME THIS NEEDS REWORKING
|
|
||||||
if (debug) write(0,*) me,' Gtranspose into sphalo :',atmp%get_nrows(),atmp%get_ncols()
|
|
||||||
call psb_sphalo(atmp,desc_a,ahalo,info,rowscale=.true.)
|
|
||||||
if (debug) write(0,*) me,' Gtranspose from sphalo :',ahalo%get_nrows(),ahalo%get_ncols()
|
|
||||||
if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=ahalo)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'ahalo-',me,'.mtx'
|
|
||||||
call ahalo%print(fname=aname,head='ahalo after haloTest ',iv=ilv)
|
|
||||||
write(aname,'(a,i3.3,a)') 'atmp-h-',me,'.mtx'
|
|
||||||
call atmp%print(fname=aname,head='atmp after haloTest ',iv=ilv)
|
|
||||||
end if
|
|
||||||
|
|
||||||
if (info == psb_success_) call ahalo%free()
|
|
||||||
|
|
||||||
call atmp%cp_to(tmpcoo)
|
|
||||||
call tmpcoo%transp()
|
|
||||||
!call psb_glob_to_loc(tmpcoo%ia,desc_a,info,iact='I')
|
|
||||||
if (debug) write(0,*) 'Before cleanup:',tmpcoo%get_nzeros()
|
|
||||||
|
|
||||||
j = 0
|
|
||||||
do k=1, tmpcoo%get_nzeros()
|
|
||||||
if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then
|
|
||||||
j = j+1
|
|
||||||
tmpcoo%ia(j) = tmpcoo%ia(k)
|
|
||||||
tmpcoo%ja(j) = tmpcoo%ja(k)
|
|
||||||
tmpcoo%val(j) = tmpcoo%val(k)
|
|
||||||
end if
|
|
||||||
end do
|
|
||||||
call tmpcoo%set_nzeros(j)
|
|
||||||
|
|
||||||
if (debug) write(0,*) 'After cleanup:',tmpcoo%get_nzeros()
|
|
||||||
|
|
||||||
call ahalo%mv_from(tmpcoo)
|
|
||||||
if (dump) then
|
|
||||||
call psb_gather(aglb,ahalo,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran-preclip.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
|
|
||||||
call ahalo%csclip(aout,info,imax=nrow)
|
|
||||||
|
|
||||||
if (debug) write(0,*) 'After clip:',aout%get_nzeros()
|
|
||||||
|
|
||||||
if (debug_sync) then
|
|
||||||
call psb_barrier(ictxt)
|
|
||||||
if (me == 0) write(0,*) 'End gtranspose '
|
|
||||||
end if
|
|
||||||
!call aout%cscnv(info,type='csr')
|
|
||||||
|
|
||||||
if (dump) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran-',me,'.mtx'
|
|
||||||
call aout%print(fname=aname,head='atrans ',iv=ilv)
|
|
||||||
call psb_gather(aglb,aout,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
end subroutine psb_sgtranspose
|
|
||||||
|
|
||||||
subroutine psb_shtranspose(ain,aout,desc_a,info)
|
|
||||||
use psb_base_mod
|
|
||||||
implicit none
|
|
||||||
type(psb_lsspmat_type), intent(in) :: ain
|
|
||||||
type(psb_lsspmat_type), intent(out) :: aout
|
|
||||||
type(psb_desc_type) :: desc_a
|
|
||||||
integer(psb_ipk_), intent(out) :: info
|
|
||||||
|
|
||||||
!
|
|
||||||
! BEWARE: This routine works under the assumption
|
|
||||||
! that the same DESC_A works for both A and A^T, which
|
|
||||||
! essentially means that A has a symmetric pattern.
|
|
||||||
!
|
|
||||||
type(psb_lsspmat_type) :: atmp, ahalo, aglb
|
|
||||||
type(psb_ls_coo_sparse_mat) :: tmpcoo, tmpc1, tmpc2, tmpch
|
|
||||||
type(psb_ls_csr_sparse_mat) :: tmpcsr
|
|
||||||
integer(psb_ipk_) :: nz1, nz2, nzh, nz
|
|
||||||
type(psb_ctxt_type) :: ictxt
|
|
||||||
integer(psb_ipk_) :: me, np
|
|
||||||
integer(psb_lpk_) :: i, j, k, nrow, ncol, nlz
|
|
||||||
integer(psb_lpk_), allocatable :: ilv(:)
|
|
||||||
character(len=80) :: aname
|
|
||||||
logical, parameter :: debug=.false., dump=.false., debug_sync=.false.
|
|
||||||
|
|
||||||
ictxt = desc_a%get_context()
|
|
||||||
call psb_info(ictxt,me,np)
|
|
||||||
|
|
||||||
nrow = desc_a%get_local_rows()
|
|
||||||
ncol = desc_a%get_local_cols()
|
|
||||||
if (debug_sync) then
|
|
||||||
call psb_barrier(ictxt)
|
|
||||||
if (me == 0) write(0,*) 'Start htranspose '
|
|
||||||
end if
|
|
||||||
call ain%cscnv(tmpcsr,info)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
ilv = [(i,i=1,ncol)]
|
|
||||||
call desc_a%l2gip(ilv,info,owned=.false.)
|
|
||||||
write(aname,'(a,i3.3,a)') 'atmp-preh-',me,'.mtx'
|
|
||||||
call ain%print(fname=aname,head='atmp before haloTest ',iv=ilv)
|
|
||||||
end if
|
|
||||||
if (dump) then
|
|
||||||
call ain%cscnv(atmp,info)
|
|
||||||
call psb_gather(aglb,atmp,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'aglob-prehalo.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
!call psb_loc_to_glob(tmpcsr%ja,desc_a,info)
|
|
||||||
call atmp%mv_from(tmpcsr)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'tmpcsr-',me,'.mtx'
|
|
||||||
call atmp%print(fname=aname,head='tmpcsr ',iv=ilv)
|
|
||||||
!call psb_set_debug_level(9999)
|
|
||||||
end if
|
|
||||||
|
|
||||||
! FIXME THIS NEEDS REWORKING
|
|
||||||
if (debug) write(0,*) me,' Htranspose into sphalo :',atmp%get_nrows(),atmp%get_ncols()
|
|
||||||
if (.true.) then
|
|
||||||
call psb_sphalo(atmp,desc_a,ahalo,info, outfmt='coo ')
|
|
||||||
call atmp%mv_to(tmpc1)
|
|
||||||
call ahalo%mv_to(tmpch)
|
|
||||||
nz1 = tmpc1%get_nzeros()
|
|
||||||
call psb_loc_to_glob(tmpc1%ia(1:nz1),desc_a,info,iact='I')
|
|
||||||
call psb_loc_to_glob(tmpc1%ja(1:nz1),desc_a,info,iact='I')
|
|
||||||
nzh = tmpch%get_nzeros()
|
|
||||||
call psb_loc_to_glob(tmpch%ia(1:nzh),desc_a,info,iact='I')
|
|
||||||
call psb_loc_to_glob(tmpch%ja(1:nzh),desc_a,info,iact='I')
|
|
||||||
nlz = nz1+nzh
|
|
||||||
call tmpcoo%allocate(ncol,ncol,nlz)
|
|
||||||
tmpcoo%ia(1:nz1) = tmpc1%ia(1:nz1)
|
|
||||||
tmpcoo%ja(1:nz1) = tmpc1%ja(1:nz1)
|
|
||||||
tmpcoo%val(1:nz1) = tmpc1%val(1:nz1)
|
|
||||||
tmpcoo%ia(nz1+1:nz1+nzh) = tmpch%ia(1:nzh)
|
|
||||||
tmpcoo%ja(nz1+1:nz1+nzh) = tmpch%ja(1:nzh)
|
|
||||||
tmpcoo%val(nz1+1:nz1+nzh) = tmpch%val(1:nzh)
|
|
||||||
call tmpcoo%set_nzeros(nlz)
|
|
||||||
call tmpcoo%transp()
|
|
||||||
nz = tmpcoo%get_nzeros()
|
|
||||||
call psb_glob_to_loc(tmpcoo%ia(1:nz),desc_a,info,iact='I')
|
|
||||||
call psb_glob_to_loc(tmpcoo%ja(1:nz),desc_a,info,iact='I')
|
|
||||||
if (.true.) then
|
|
||||||
call tmpcoo%clean_negidx(info)
|
|
||||||
else
|
|
||||||
j = 0
|
|
||||||
do k=1, tmpcoo%get_nzeros()
|
|
||||||
if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then
|
|
||||||
j = j+1
|
|
||||||
tmpcoo%ia(j) = tmpcoo%ia(k)
|
|
||||||
tmpcoo%ja(j) = tmpcoo%ja(k)
|
|
||||||
tmpcoo%val(j) = tmpcoo%val(k)
|
|
||||||
end if
|
|
||||||
end do
|
|
||||||
call tmpcoo%set_nzeros(j)
|
|
||||||
end if
|
|
||||||
call ahalo%mv_from(tmpcoo)
|
|
||||||
call ahalo%csclip(aout,info,imax=nrow)
|
|
||||||
|
|
||||||
else
|
|
||||||
call psb_sphalo(atmp,desc_a,ahalo,info, rowscale=.true.)
|
|
||||||
if (debug) write(0,*) me,' Htranspose from sphalo :',ahalo%get_nrows(),ahalo%get_ncols()
|
|
||||||
if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=ahalo)
|
|
||||||
|
|
||||||
if (debug) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'ahalo-',me,'.mtx'
|
|
||||||
call ahalo%print(fname=aname,head='ahalo after haloTest ',iv=ilv)
|
|
||||||
write(aname,'(a,i3.3,a)') 'atmp-h-',me,'.mtx'
|
|
||||||
call atmp%print(fname=aname,head='atmp after haloTest ',iv=ilv)
|
|
||||||
end if
|
|
||||||
|
|
||||||
if (info == psb_success_) call ahalo%free()
|
|
||||||
|
|
||||||
call atmp%cp_to(tmpcoo)
|
|
||||||
call tmpcoo%transp()
|
|
||||||
if (debug) write(0,*) 'Before cleanup:',tmpcoo%get_nzeros()
|
|
||||||
if (.true.) then
|
|
||||||
call tmpcoo%clean_negidx(info)
|
|
||||||
else
|
|
||||||
|
|
||||||
j = 0
|
|
||||||
do k=1, tmpcoo%get_nzeros()
|
|
||||||
if ((tmpcoo%ia(k) > 0).and.(tmpcoo%ja(k)>0)) then
|
|
||||||
j = j+1
|
|
||||||
tmpcoo%ia(j) = tmpcoo%ia(k)
|
|
||||||
tmpcoo%ja(j) = tmpcoo%ja(k)
|
|
||||||
tmpcoo%val(j) = tmpcoo%val(k)
|
|
||||||
end if
|
|
||||||
end do
|
|
||||||
call tmpcoo%set_nzeros(j)
|
|
||||||
end if
|
|
||||||
|
|
||||||
if (debug) write(0,*) 'After cleanup:',tmpcoo%get_nzeros()
|
|
||||||
|
|
||||||
call ahalo%mv_from(tmpcoo)
|
|
||||||
if (dump) then
|
|
||||||
call psb_gather(aglb,ahalo,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran-preclip.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
|
|
||||||
call ahalo%csclip(aout,info,imax=nrow)
|
|
||||||
end if
|
|
||||||
|
|
||||||
if (debug) write(0,*) 'After clip:',aout%get_nzeros()
|
|
||||||
|
|
||||||
if (debug_sync) then
|
|
||||||
call psb_barrier(ictxt)
|
|
||||||
if (me == 0) write(0,*) 'End htranspose '
|
|
||||||
end if
|
|
||||||
!call aout%cscnv(info,type='csr')
|
|
||||||
|
|
||||||
if (dump) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran-',me,'.mtx'
|
|
||||||
call aout%print(fname=aname,head='atrans ',iv=ilv)
|
|
||||||
call psb_gather(aglb,aout,desc_a,info)
|
|
||||||
if (me==psb_root_) then
|
|
||||||
write(aname,'(a,i3.3,a)') 'atran.mtx'
|
|
||||||
call aglb%print(fname=aname,head='Test ')
|
|
||||||
end if
|
|
||||||
end if
|
|
||||||
|
|
||||||
end subroutine psb_shtranspose
|
|
||||||
|
|
||||||
subroutine sPMatchBox(nlver,nledge,verlocptr,verlocind,edgelocweight,&
|
|
||||||
& verdistance, mate, myrank, numprocs, ictxt,&
|
& verdistance, mate, myrank, numprocs, ictxt,&
|
||||||
& msgindsent,msgactualsent,msgpercent,&
|
& msgindsent,msgactualsent,msgpercent,&
|
||||||
& ph0_time, ph1_time, ph2_time, ph1_card, ph2_card,info,display_inp)
|
& ph0_time, ph1_time, ph2_time, ph1_card, ph2_card,info,display_inp)
|
||||||
@@ -1431,6 +1159,6 @@ contains
|
|||||||
end if
|
end if
|
||||||
where(mate>=0) mate = mate + 1
|
where(mate>=0) mate = mate + 1
|
||||||
|
|
||||||
end subroutine sPMatchBox
|
end subroutine amg_s_PMatchBox
|
||||||
|
|
||||||
end module smatchboxp_mod
|
end module amg_s_matchboxp_mod
|
||||||
|
|||||||
@@ -313,22 +313,24 @@ subroutine s_mumps_solver_finalize(sv)
|
|||||||
|
|
||||||
end subroutine s_mumps_solver_finalize
|
end subroutine s_mumps_solver_finalize
|
||||||
|
|
||||||
subroutine s_mumps_solver_descr(sv,info,iout,coarse)
|
subroutine s_mumps_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_s_mumps_solver_type), intent(in) :: sv
|
class(amg_s_mumps_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
type(psb_ctxt_type) :: ctxt
|
type(psb_ctxt_type) :: ctxt
|
||||||
integer(psb_ipk_) :: me, np
|
integer(psb_ipk_) :: me, np
|
||||||
character(len=20), parameter :: name='amg_z_mumps_solver_descr'
|
character(len=20), parameter :: name='amg_z_mumps_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -337,8 +339,13 @@ subroutine s_mumps_solver_descr(sv,info,iout,coarse)
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' MUMPS Solver. '
|
write(iout_,*) trim(prefix_), ' MUMPS Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -258,7 +258,7 @@ module amg_s_onelev_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_s_base_onelev_descr(lv,il,nl,ilmin,info,iout, verbosity)
|
subroutine amg_s_base_onelev_descr(lv,il,nl,ilmin,info,iout, verbosity,prefix)
|
||||||
import :: psb_sspmat_type, psb_s_vect_type, psb_s_base_vect_type, &
|
import :: psb_sspmat_type, psb_s_vect_type, psb_s_base_vect_type, &
|
||||||
& psb_slinmap_type, psb_spk_, amg_s_onelev_type, &
|
& psb_slinmap_type, psb_spk_, amg_s_onelev_type, &
|
||||||
& psb_ipk_, psb_epk_, psb_desc_type
|
& psb_ipk_, psb_epk_, psb_desc_type
|
||||||
@@ -269,6 +269,7 @@ module amg_s_onelev_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
integer(psb_ipk_), intent(in), optional :: verbosity
|
integer(psb_ipk_), intent(in), optional :: verbosity
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_s_base_onelev_descr
|
end subroutine amg_s_base_onelev_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -118,7 +118,7 @@
|
|||||||
|
|
||||||
module amg_s_parmatch_aggregator_mod
|
module amg_s_parmatch_aggregator_mod
|
||||||
use amg_s_base_aggregator_mod
|
use amg_s_base_aggregator_mod
|
||||||
use smatchboxp_mod
|
use amg_s_matchboxp_mod
|
||||||
#if defined(SERIAL_MPI)
|
#if defined(SERIAL_MPI)
|
||||||
type, extends(amg_s_base_aggregator_type) :: amg_s_parmatch_aggregator_type
|
type, extends(amg_s_base_aggregator_type) :: amg_s_parmatch_aggregator_type
|
||||||
end type amg_s_parmatch_aggregator_type
|
end type amg_s_parmatch_aggregator_type
|
||||||
@@ -132,8 +132,6 @@ module amg_s_parmatch_aggregator_mod
|
|||||||
type(psb_sspmat_type), allocatable :: prol, restr
|
type(psb_sspmat_type), allocatable :: prol, restr
|
||||||
type(psb_sspmat_type), allocatable :: ac, base_a, rwa
|
type(psb_sspmat_type), allocatable :: ac, base_a, rwa
|
||||||
type(psb_desc_type), allocatable :: desc_ac, desc_ax, base_desc, rwdesc
|
type(psb_desc_type), allocatable :: desc_ac, desc_ax, base_desc, rwdesc
|
||||||
integer(psb_ipk_) :: max_csize
|
|
||||||
integer(psb_ipk_) :: max_nlevels
|
|
||||||
logical :: reproducible_matching = .false.
|
logical :: reproducible_matching = .false.
|
||||||
logical :: need_symmetrize = .false.
|
logical :: need_symmetrize = .false.
|
||||||
logical :: unsmoothed_hierarchy = .true.
|
logical :: unsmoothed_hierarchy = .true.
|
||||||
@@ -143,18 +141,18 @@ module amg_s_parmatch_aggregator_mod
|
|||||||
procedure, pass(ag) :: mat_asb => amg_s_parmatch_aggregator_mat_asb
|
procedure, pass(ag) :: mat_asb => amg_s_parmatch_aggregator_mat_asb
|
||||||
procedure, pass(ag) :: inner_mat_asb => amg_s_parmatch_aggregator_inner_mat_asb
|
procedure, pass(ag) :: inner_mat_asb => amg_s_parmatch_aggregator_inner_mat_asb
|
||||||
procedure, pass(ag) :: bld_map => amg_s_parmatch_aggregator_bld_map
|
procedure, pass(ag) :: bld_map => amg_s_parmatch_aggregator_bld_map
|
||||||
procedure, pass(ag) :: csetc => s_parmatch_aggr_csetc
|
procedure, pass(ag) :: csetc => amg_s_parmatch_aggr_csetc
|
||||||
procedure, pass(ag) :: cseti => s_parmatch_aggr_cseti
|
procedure, pass(ag) :: cseti => amg_s_parmatch_aggr_cseti
|
||||||
procedure, pass(ag) :: default => s_parmatch_aggr_set_default
|
procedure, pass(ag) :: default => amg_s_parmatch_aggr_set_default
|
||||||
procedure, pass(ag) :: sizeof => s_parmatch_aggregator_sizeof
|
procedure, pass(ag) :: sizeof => amg_s_parmatch_aggregator_sizeof
|
||||||
procedure, pass(ag) :: update_next => s_parmatch_aggregator_update_next
|
procedure, pass(ag) :: update_next => amg_s_parmatch_aggregator_update_next
|
||||||
procedure, pass(ag) :: bld_wnxt => s_parmatch_bld_wnxt
|
procedure, pass(ag) :: bld_wnxt => amg_s_parmatch_bld_wnxt
|
||||||
procedure, pass(ag) :: bld_default_w => s_bld_default_w
|
procedure, pass(ag) :: bld_default_w => amg_s_bld_default_w
|
||||||
procedure, pass(ag) :: set_c_default_w => s_set_prm_c_default_w
|
procedure, pass(ag) :: set_c_default_w => amg_s_set_prm_c_default_w
|
||||||
procedure, pass(ag) :: descr => s_parmatch_aggregator_descr
|
procedure, pass(ag) :: descr => amg_s_parmatch_aggregator_descr
|
||||||
procedure, pass(ag) :: clone => s_parmatch_aggregator_clone
|
procedure, pass(ag) :: clone => amg_s_parmatch_aggregator_clone
|
||||||
procedure, pass(ag) :: free => s_parmatch_aggregator_free
|
procedure, pass(ag) :: free => amg_s_parmatch_aggregator_free
|
||||||
procedure, nopass :: fmt => s_parmatch_aggregator_fmt
|
procedure, nopass :: fmt => amg_s_parmatch_aggregator_fmt
|
||||||
procedure, nopass :: xt_desc => amg_s_parmatch_aggregator_xt_desc
|
procedure, nopass :: xt_desc => amg_s_parmatch_aggregator_xt_desc
|
||||||
end type amg_s_parmatch_aggregator_type
|
end type amg_s_parmatch_aggregator_type
|
||||||
|
|
||||||
@@ -168,7 +166,7 @@ module amg_s_parmatch_aggregator_mod
|
|||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(amg_saggr_data), intent(in) :: ag_data
|
type(amg_saggr_data), intent(in) :: ag_data
|
||||||
type(psb_sspmat_type), intent(inout) :: a
|
type(psb_sspmat_type), intent(inout) :: a
|
||||||
type(psb_desc_type), intent(inout) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
|
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
|
||||||
type(psb_lsspmat_type), intent(out) :: t_prol
|
type(psb_lsspmat_type), intent(out) :: t_prol
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
@@ -235,7 +233,7 @@ module amg_s_parmatch_aggregator_mod
|
|||||||
& psb_lsspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_sml_parms, amg_saggr_data
|
& psb_lsspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_sml_parms, amg_saggr_data
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_sspmat_type), intent(in) :: a
|
type(psb_sspmat_type), intent(in) :: a
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(psb_lsspmat_type), intent(inout) :: t_prol
|
type(psb_lsspmat_type), intent(inout) :: t_prol
|
||||||
@@ -257,7 +255,7 @@ module amg_s_parmatch_aggregator_mod
|
|||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(psb_lsspmat_type), intent(inout) :: t_prol
|
type(psb_lsspmat_type), intent(inout) :: t_prol
|
||||||
type(psb_sspmat_type), intent(out) :: op_prol,ac, op_restr
|
type(psb_sspmat_type), intent(inout) :: op_prol,ac, op_restr
|
||||||
type(psb_desc_type), intent(inout) :: desc_ac
|
type(psb_desc_type), intent(inout) :: desc_ac
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
end subroutine amg_s_parmatch_unsmth_bld
|
end subroutine amg_s_parmatch_unsmth_bld
|
||||||
@@ -275,7 +273,7 @@ module amg_s_parmatch_aggregator_mod
|
|||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(psb_lsspmat_type), intent(inout) :: t_prol
|
type(psb_lsspmat_type), intent(inout) :: t_prol
|
||||||
type(psb_sspmat_type), intent(out) :: op_prol,ac, op_restr
|
type(psb_sspmat_type), intent(inout) :: op_prol,ac, op_restr
|
||||||
type(psb_desc_type), intent(inout) :: desc_ac
|
type(psb_desc_type), intent(inout) :: desc_ac
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
end subroutine amg_s_parmatch_smth_bld
|
end subroutine amg_s_parmatch_smth_bld
|
||||||
@@ -288,11 +286,11 @@ module amg_s_parmatch_aggregator_mod
|
|||||||
& psb_lsspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_sml_parms, amg_saggr_data
|
& psb_lsspmat_type, psb_dpk_, psb_ipk_, psb_lpk_, amg_sml_parms, amg_saggr_data
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_sspmat_type), intent(inout) :: a
|
type(psb_sspmat_type), intent(inout) :: a
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(psb_lsspmat_type), intent(inout) :: t_prol
|
type(psb_lsspmat_type), intent(inout) :: t_prol
|
||||||
type(psb_sspmat_type), intent(out) :: op_prol,ac, op_restr
|
type(psb_sspmat_type), intent(inout) :: op_prol,ac, op_restr
|
||||||
type(psb_desc_type), intent(out) :: desc_ac
|
type(psb_desc_type), intent(out) :: desc_ac
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
end subroutine amg_s_parmatch_spmm_bld_ov
|
end subroutine amg_s_parmatch_spmm_bld_ov
|
||||||
@@ -306,11 +304,11 @@ module amg_s_parmatch_aggregator_mod
|
|||||||
& psb_s_csr_sparse_mat, psb_ls_csr_sparse_mat
|
& psb_s_csr_sparse_mat, psb_ls_csr_sparse_mat
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_s_csr_sparse_mat), intent(inout) :: a
|
type(psb_s_csr_sparse_mat), intent(inout) :: a
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(psb_lsspmat_type), intent(inout) :: t_prol
|
type(psb_lsspmat_type), intent(inout) :: t_prol
|
||||||
type(psb_sspmat_type), intent(out) :: op_prol,ac, op_restr
|
type(psb_sspmat_type), intent(inout) :: op_prol,ac, op_restr
|
||||||
type(psb_desc_type), intent(out) :: desc_ac
|
type(psb_desc_type), intent(out) :: desc_ac
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
end subroutine amg_s_parmatch_spmm_bld_inner
|
end subroutine amg_s_parmatch_spmm_bld_inner
|
||||||
@@ -320,7 +318,7 @@ module amg_s_parmatch_aggregator_mod
|
|||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
subroutine s_bld_default_w(ag,nr)
|
subroutine amg_s_bld_default_w(ag,nr)
|
||||||
use psb_realloc_mod
|
use psb_realloc_mod
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_s_parmatch_aggregator_type), target, intent(inout) :: ag
|
class(amg_s_parmatch_aggregator_type), target, intent(inout) :: ag
|
||||||
@@ -330,9 +328,9 @@ contains
|
|||||||
if (info /= psb_success_) return
|
if (info /= psb_success_) return
|
||||||
ag%w = done
|
ag%w = done
|
||||||
!call ag%set_c_default_w()
|
!call ag%set_c_default_w()
|
||||||
end subroutine s_bld_default_w
|
end subroutine amg_s_bld_default_w
|
||||||
|
|
||||||
subroutine s_set_prm_c_default_w(ag)
|
subroutine amg_s_set_prm_c_default_w(ag)
|
||||||
use psb_realloc_mod
|
use psb_realloc_mod
|
||||||
use iso_c_binding
|
use iso_c_binding
|
||||||
implicit none
|
implicit none
|
||||||
@@ -342,9 +340,9 @@ contains
|
|||||||
!write(0,*) 'prm_c_deafult_w '
|
!write(0,*) 'prm_c_deafult_w '
|
||||||
call psb_safe_ab_cpy(ag%w,ag%w_nxt,info)
|
call psb_safe_ab_cpy(ag%w,ag%w_nxt,info)
|
||||||
|
|
||||||
end subroutine s_set_prm_c_default_w
|
end subroutine amg_s_set_prm_c_default_w
|
||||||
|
|
||||||
subroutine s_parmatch_bld_wnxt(ag,ilaggr,valaggr,nx)
|
subroutine amg_s_parmatch_bld_wnxt(ag,ilaggr,valaggr,nx)
|
||||||
use psb_realloc_mod
|
use psb_realloc_mod
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_s_parmatch_aggregator_type), target, intent(inout) :: ag
|
class(amg_s_parmatch_aggregator_type), target, intent(inout) :: ag
|
||||||
@@ -358,14 +356,14 @@ contains
|
|||||||
!write(0,*) 'Executing bld_wnxt ',nx
|
!write(0,*) 'Executing bld_wnxt ',nx
|
||||||
call psb_realloc(nx,ag%w_nxt,info)
|
call psb_realloc(nx,ag%w_nxt,info)
|
||||||
|
|
||||||
end subroutine s_parmatch_bld_wnxt
|
end subroutine amg_s_parmatch_bld_wnxt
|
||||||
|
|
||||||
function s_parmatch_aggregator_fmt() result(val)
|
function amg_s_parmatch_aggregator_fmt() result(val)
|
||||||
implicit none
|
implicit none
|
||||||
character(len=32) :: val
|
character(len=32) :: val
|
||||||
|
|
||||||
val = "Parallel Matching aggregation"
|
val = "Parallel Matching aggregation"
|
||||||
end function s_parmatch_aggregator_fmt
|
end function amg_s_parmatch_aggregator_fmt
|
||||||
|
|
||||||
function amg_s_parmatch_aggregator_xt_desc() result(val)
|
function amg_s_parmatch_aggregator_xt_desc() result(val)
|
||||||
implicit none
|
implicit none
|
||||||
@@ -374,7 +372,7 @@ contains
|
|||||||
val = .true.
|
val = .true.
|
||||||
end function amg_s_parmatch_aggregator_xt_desc
|
end function amg_s_parmatch_aggregator_xt_desc
|
||||||
|
|
||||||
function s_parmatch_aggregator_sizeof(ag) result(val)
|
function amg_s_parmatch_aggregator_sizeof(ag) result(val)
|
||||||
use psb_realloc_mod
|
use psb_realloc_mod
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_s_parmatch_aggregator_type), intent(in) :: ag
|
class(amg_s_parmatch_aggregator_type), intent(in) :: ag
|
||||||
@@ -390,23 +388,30 @@ contains
|
|||||||
if (allocated(ag%base_desc)) val = val + ag%base_desc%sizeof()
|
if (allocated(ag%base_desc)) val = val + ag%base_desc%sizeof()
|
||||||
if (allocated(ag%desc_ax)) val = val + ag%desc_ax%sizeof()
|
if (allocated(ag%desc_ax)) val = val + ag%desc_ax%sizeof()
|
||||||
|
|
||||||
end function s_parmatch_aggregator_sizeof
|
end function amg_s_parmatch_aggregator_sizeof
|
||||||
|
|
||||||
subroutine s_parmatch_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_s_parmatch_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_s_parmatch_aggregator_type), intent(in) :: ag
|
class(amg_s_parmatch_aggregator_type), intent(in) :: ag
|
||||||
type(amg_sml_parms), intent(in) :: parms
|
type(amg_sml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
character(1024) :: prefix_
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout,*) 'Parallel Matching Aggregator'
|
write(iout,*) trim(prefix_),' ','Parallel Matching Aggregator'
|
||||||
write(iout,*) ' Number of matching sweeps: ',ag%n_sweeps
|
write(iout,*) trim(prefix_),' ',' Number of matching sweeps: ',ag%n_sweeps
|
||||||
write(iout,*) ' Matching algorithm : MatchBoxP (PREIS)'
|
write(iout,*) trim(prefix_),' ',' Matching algorithm : MatchBoxP (PREIS)'
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
write(iout,*) trim(prefix_),' ','Aggregator object type: ',ag%fmt()
|
||||||
call parms%mldescr(iout,info)
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine s_parmatch_aggregator_descr
|
end subroutine amg_s_parmatch_aggregator_descr
|
||||||
|
|
||||||
function is_legal_malg(alg) result(val)
|
function is_legal_malg(alg) result(val)
|
||||||
logical :: val
|
logical :: val
|
||||||
@@ -437,7 +442,7 @@ contains
|
|||||||
end function is_legal_nlevels
|
end function is_legal_nlevels
|
||||||
|
|
||||||
|
|
||||||
subroutine s_parmatch_aggregator_update_next(ag,agnext,info)
|
subroutine amg_s_parmatch_aggregator_update_next(ag,agnext,info)
|
||||||
use psb_realloc_mod
|
use psb_realloc_mod
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_s_parmatch_aggregator_type), target, intent(inout) :: ag
|
class(amg_s_parmatch_aggregator_type), target, intent(inout) :: ag
|
||||||
@@ -452,10 +457,10 @@ contains
|
|||||||
& agnext%matching_alg = ag%matching_alg
|
& agnext%matching_alg = ag%matching_alg
|
||||||
if (.not.is_legal_nsweeps(agnext%n_sweeps))&
|
if (.not.is_legal_nsweeps(agnext%n_sweeps))&
|
||||||
& agnext%n_sweeps = ag%n_sweeps
|
& agnext%n_sweeps = ag%n_sweeps
|
||||||
if (.not.is_legal_csize(agnext%max_csize))&
|
!!$ if (.not.is_legal_csize(agnext%max_csize))&
|
||||||
& agnext%max_csize = ag%max_csize
|
!!$ & agnext%max_csize = ag%max_csize
|
||||||
if (.not.is_legal_nlevels(agnext%max_nlevels))&
|
!!$ if (.not.is_legal_nlevels(agnext%max_nlevels))&
|
||||||
& agnext%max_nlevels = ag%max_nlevels
|
!!$ & agnext%max_nlevels = ag%max_nlevels
|
||||||
! Is this going to generate shallow copies/memory leaks/double frees?
|
! Is this going to generate shallow copies/memory leaks/double frees?
|
||||||
! To be investigated further.
|
! To be investigated further.
|
||||||
call psb_safe_ab_cpy(ag%w_nxt,agnext%w,info)
|
call psb_safe_ab_cpy(ag%w_nxt,agnext%w,info)
|
||||||
@@ -470,9 +475,9 @@ contains
|
|||||||
! What should we do here?
|
! What should we do here?
|
||||||
end select
|
end select
|
||||||
info = 0
|
info = 0
|
||||||
end subroutine s_parmatch_aggregator_update_next
|
end subroutine amg_s_parmatch_aggregator_update_next
|
||||||
|
|
||||||
subroutine s_parmatch_aggr_csetc(ag,what,val,info,idx)
|
subroutine amg_s_parmatch_aggr_csetc(ag,what,val,info,idx)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -514,9 +519,9 @@ contains
|
|||||||
! Do nothing
|
! Do nothing
|
||||||
end select
|
end select
|
||||||
return
|
return
|
||||||
end subroutine s_parmatch_aggr_csetc
|
end subroutine amg_s_parmatch_aggr_csetc
|
||||||
|
|
||||||
subroutine s_parmatch_aggr_cseti(ag,what,val,info,idx)
|
subroutine amg_s_parmatch_aggr_cseti(ag,what,val,info,idx)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -540,10 +545,6 @@ contains
|
|||||||
case('AGGR_SIZE')
|
case('AGGR_SIZE')
|
||||||
ag%orig_aggr_size = val
|
ag%orig_aggr_size = val
|
||||||
ag%n_sweeps=max(1,ceiling(log(val*1.0)/log(2.0)))
|
ag%n_sweeps=max(1,ceiling(log(val*1.0)/log(2.0)))
|
||||||
case('PRMC_MAX_CSIZE')
|
|
||||||
ag%max_csize=val
|
|
||||||
case('PRMC_MAX_NLEVELS')
|
|
||||||
ag%max_nlevels=val
|
|
||||||
case('PRMC_W_SIZE')
|
case('PRMC_W_SIZE')
|
||||||
call ag%bld_default_w(val)
|
call ag%bld_default_w(val)
|
||||||
case('PRMC_REPRODUCIBLE_MATCHING')
|
case('PRMC_REPRODUCIBLE_MATCHING')
|
||||||
@@ -556,9 +557,9 @@ contains
|
|||||||
! Do nothing
|
! Do nothing
|
||||||
end select
|
end select
|
||||||
return
|
return
|
||||||
end subroutine s_parmatch_aggr_cseti
|
end subroutine amg_s_parmatch_aggr_cseti
|
||||||
|
|
||||||
subroutine s_parmatch_aggr_set_default(ag)
|
subroutine amg_s_parmatch_aggr_set_default(ag)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -569,8 +570,8 @@ contains
|
|||||||
ag%matching_alg = 0
|
ag%matching_alg = 0
|
||||||
ag%n_sweeps = 1
|
ag%n_sweeps = 1
|
||||||
ag%jacobi_sweeps = 0
|
ag%jacobi_sweeps = 0
|
||||||
ag%max_nlevels = 36
|
!!$ ag%max_nlevels = 36
|
||||||
ag%max_csize = -1
|
!!$ ag%max_csize = -1
|
||||||
!
|
!
|
||||||
! Apparently BootCMatch works better
|
! Apparently BootCMatch works better
|
||||||
! by keeping all entries
|
! by keeping all entries
|
||||||
@@ -579,9 +580,9 @@ contains
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
end subroutine s_parmatch_aggr_set_default
|
end subroutine amg_s_parmatch_aggr_set_default
|
||||||
|
|
||||||
subroutine s_parmatch_aggregator_free(ag,info)
|
subroutine amg_s_parmatch_aggregator_free(ag,info)
|
||||||
use iso_c_binding
|
use iso_c_binding
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_s_parmatch_aggregator_type), intent(inout) :: ag
|
class(amg_s_parmatch_aggregator_type), intent(inout) :: ag
|
||||||
@@ -618,9 +619,9 @@ contains
|
|||||||
call ag%rwdesc%free(info); deallocate(ag%rwdesc,stat=info)
|
call ag%rwdesc%free(info); deallocate(ag%rwdesc,stat=info)
|
||||||
end if
|
end if
|
||||||
|
|
||||||
end subroutine s_parmatch_aggregator_free
|
end subroutine amg_s_parmatch_aggregator_free
|
||||||
|
|
||||||
subroutine s_parmatch_aggregator_clone(ag,agnext,info)
|
subroutine amg_s_parmatch_aggregator_clone(ag,agnext,info)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_s_parmatch_aggregator_type), intent(inout) :: ag
|
class(amg_s_parmatch_aggregator_type), intent(inout) :: ag
|
||||||
class(amg_s_base_aggregator_type), allocatable, intent(inout) :: agnext
|
class(amg_s_base_aggregator_type), allocatable, intent(inout) :: agnext
|
||||||
@@ -640,7 +641,7 @@ contains
|
|||||||
! Should never ever get here
|
! Should never ever get here
|
||||||
info = -1
|
info = -1
|
||||||
end select
|
end select
|
||||||
end subroutine s_parmatch_aggregator_clone
|
end subroutine amg_s_parmatch_aggregator_clone
|
||||||
|
|
||||||
subroutine amg_s_parmatch_aggregator_bld_map(ag,desc_a,desc_ac,ilaggr,nlaggr,&
|
subroutine amg_s_parmatch_aggregator_bld_map(ag,desc_a,desc_ac,ilaggr,nlaggr,&
|
||||||
& op_restr,op_prol,map,info)
|
& op_restr,op_prol,map,info)
|
||||||
|
|||||||
@@ -155,14 +155,16 @@ module amg_s_prec_type
|
|||||||
|
|
||||||
|
|
||||||
interface amg_precdescr
|
interface amg_precdescr
|
||||||
subroutine amg_sfile_prec_descr(prec,iout,root,verbosity)
|
subroutine amg_sfile_prec_descr(prec,info,iout,root,verbosity,prefix)
|
||||||
import :: amg_sprec_type, psb_ipk_
|
import :: amg_sprec_type, psb_ipk_
|
||||||
implicit none
|
implicit none
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_sprec_type), intent(in) :: prec
|
class(amg_sprec_type), intent(in) :: prec
|
||||||
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
integer(psb_ipk_), intent(in), optional :: root
|
integer(psb_ipk_), intent(in), optional :: root
|
||||||
integer(psb_ipk_), intent(in), optional :: verbosity
|
integer(psb_ipk_), intent(in), optional :: verbosity
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_sfile_prec_descr
|
end subroutine amg_sfile_prec_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -385,20 +385,22 @@ contains
|
|||||||
|
|
||||||
end subroutine s_slu_solver_finalize
|
end subroutine s_slu_solver_finalize
|
||||||
|
|
||||||
subroutine s_slu_solver_descr(sv,info,iout,coarse)
|
subroutine s_slu_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_s_slu_solver_type), intent(in) :: sv
|
class(amg_s_slu_solver_type), intent(in) :: sv
|
||||||
integer, intent(out) :: info
|
integer, intent(out) :: info
|
||||||
integer, intent(in), optional :: iout
|
integer, intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer :: err_act
|
integer :: err_act
|
||||||
character(len=20), parameter :: name='amg_s_slu_solver_descr'
|
character(len=20), parameter :: name='amg_s_slu_solver_descr'
|
||||||
integer :: iout_
|
integer :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -407,8 +409,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' SuperLU Sparse Factorization Solver. '
|
write(iout_,*) trim(prefix_), ' SuperLU Sparse Factorization Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -88,16 +88,25 @@ contains
|
|||||||
val = "Symmetric Decoupled aggregation"
|
val = "Symmetric Decoupled aggregation"
|
||||||
end function amg_s_symdec_aggregator_fmt
|
end function amg_s_symdec_aggregator_fmt
|
||||||
|
|
||||||
subroutine amg_s_symdec_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_s_symdec_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_s_symdec_aggregator_type), intent(in) :: ag
|
class(amg_s_symdec_aggregator_type), intent(in) :: ag
|
||||||
type(amg_sml_parms), intent(in) :: parms
|
type(amg_sml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
write(iout,*) 'Decoupled Aggregator locally-symmetrized'
|
character(1024) :: prefix_
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
|
||||||
call parms%mldescr(iout,info)
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout,*) trim(prefix_),' ','Decoupled Aggregator locally-symmetrized'
|
||||||
|
write(iout,*) trim(prefix_),' ','Aggregator object type: ',ag%fmt()
|
||||||
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_s_symdec_aggregator_descr
|
end subroutine amg_s_symdec_aggregator_descr
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ module amg_z_ainv_solver
|
|||||||
!!$ end interface
|
!!$ end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_z_ainv_solver_descr(sv,info,iout,coarse)
|
subroutine amg_z_ainv_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_dpk_, amg_z_ainv_solver_type, psb_ipk_
|
import :: psb_dpk_, amg_z_ainv_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
@@ -208,7 +208,7 @@ module amg_z_ainv_solver
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_z_ainv_solver_descr
|
end subroutine amg_z_ainv_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -396,21 +396,23 @@ contains
|
|||||||
end subroutine z_as_smoother_default
|
end subroutine z_as_smoother_default
|
||||||
|
|
||||||
|
|
||||||
subroutine z_as_smoother_descr(sm,info,iout,coarse)
|
subroutine z_as_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_z_as_smoother_type), intent(in) :: sm
|
class(amg_z_as_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_z_as_smoother_descr'
|
character(len=20), parameter :: name='amg_z_as_smoother_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
logical :: coarse_
|
logical :: coarse_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -424,16 +426,21 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (.not.coarse_) then
|
if (.not.coarse_) then
|
||||||
write(iout_,*) ' Additive Schwarz with ',&
|
write(iout_,*) trim(prefix_), ' Additive Schwarz with ',&
|
||||||
& sm%novr, ' overlap layers.'
|
& sm%novr, ' overlap layers.'
|
||||||
write(iout_,*) ' Restrictor: ',restrict_names(sm%restr)
|
write(iout_,*) trim(prefix_), ' Restrictor: ',restrict_names(sm%restr)
|
||||||
write(iout_,*) ' Prolongator: ',prolong_names(sm%prol)
|
write(iout_,*) trim(prefix_), ' Prolongator: ',prolong_names(sm%prol)
|
||||||
write(iout_,*) ' Local solver:'
|
write(iout_,*) trim(prefix_), ' Local solver:'
|
||||||
endif
|
endif
|
||||||
if (allocated(sm%sv)) then
|
if (allocated(sm%sv)) then
|
||||||
call sm%sv%descr(info,iout_,coarse=coarse)
|
call sm%sv%descr(info,iout_,coarse=coarse,prefix=prefix)
|
||||||
end if
|
end if
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ module amg_z_base_aggregator_mod
|
|||||||
& psb_z_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
|
& psb_z_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_z_csr_sparse_mat), intent(inout) :: a_csr
|
type(psb_z_csr_sparse_mat), intent(inout) :: a_csr
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
||||||
type(amg_dml_parms), intent(inout) :: parms
|
type(amg_dml_parms), intent(inout) :: parms
|
||||||
type(psb_z_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
type(psb_z_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
||||||
@@ -144,7 +144,7 @@ module amg_z_base_aggregator_mod
|
|||||||
& psb_z_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
|
& psb_z_coo_sparse_mat, amg_dml_parms, psb_dpk_, psb_ipk_, psb_lpk_
|
||||||
implicit none
|
implicit none
|
||||||
type(psb_z_csr_sparse_mat), intent(inout) :: a_csr
|
type(psb_z_csr_sparse_mat), intent(inout) :: a_csr
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: nlaggr(:)
|
||||||
type(amg_dml_parms), intent(inout) :: parms
|
type(amg_dml_parms), intent(inout) :: parms
|
||||||
type(psb_z_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
type(psb_z_coo_sparse_mat), intent(inout) :: coo_prol, coo_restr
|
||||||
@@ -275,15 +275,22 @@ contains
|
|||||||
val = .false.
|
val = .false.
|
||||||
end function amg_z_base_aggregator_xt_desc
|
end function amg_z_base_aggregator_xt_desc
|
||||||
|
|
||||||
subroutine amg_z_base_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_z_base_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_z_base_aggregator_type), intent(in) :: ag
|
class(amg_z_base_aggregator_type), intent(in) :: ag
|
||||||
type(amg_dml_parms), intent(in) :: parms
|
type(amg_dml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
character(1024) :: prefix_
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
write(iout,*) trim(prefix_),' ', 'Aggregator object type: ',ag%fmt()
|
||||||
call parms%mldescr(iout,info)
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_z_base_aggregator_descr
|
end subroutine amg_z_base_aggregator_descr
|
||||||
|
|||||||
@@ -272,7 +272,7 @@ module amg_z_base_smoother_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_z_base_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_z_base_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: psb_desc_type, psb_zspmat_type, psb_z_base_sparse_mat, &
|
import :: psb_desc_type, psb_zspmat_type, psb_z_base_sparse_mat, &
|
||||||
& psb_z_vect_type, psb_z_base_vect_type, psb_dpk_, &
|
& psb_z_vect_type, psb_z_base_vect_type, psb_dpk_, &
|
||||||
& amg_z_base_smoother_type, psb_ipk_
|
& amg_z_base_smoother_type, psb_ipk_
|
||||||
@@ -281,6 +281,7 @@ module amg_z_base_smoother_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_z_base_smoother_descr
|
end subroutine amg_z_base_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ module amg_z_base_solver_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_z_base_solver_descr(sv,info,iout,coarse)
|
subroutine amg_z_base_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_desc_type, psb_zspmat_type, psb_z_base_sparse_mat, &
|
import :: psb_desc_type, psb_zspmat_type, psb_z_base_sparse_mat, &
|
||||||
& psb_z_vect_type, psb_z_base_vect_type, psb_dpk_, &
|
& psb_z_vect_type, psb_z_base_vect_type, psb_dpk_, &
|
||||||
& amg_z_base_solver_type, psb_ipk_
|
& amg_z_base_solver_type, psb_ipk_
|
||||||
@@ -281,7 +281,7 @@ module amg_z_base_solver_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_z_base_solver_descr
|
end subroutine amg_z_base_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -184,16 +184,23 @@ contains
|
|||||||
val = "Decoupled aggregation"
|
val = "Decoupled aggregation"
|
||||||
end function amg_z_dec_aggregator_fmt
|
end function amg_z_dec_aggregator_fmt
|
||||||
|
|
||||||
subroutine amg_z_dec_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_z_dec_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_z_dec_aggregator_type), intent(in) :: ag
|
class(amg_z_dec_aggregator_type), intent(in) :: ag
|
||||||
type(amg_dml_parms), intent(in) :: parms
|
type(amg_dml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
character(1024) :: prefix_
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout,*) 'Decoupled Aggregator'
|
write(iout,*) trim(prefix_),' ','Decoupled Aggregator'
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
write(iout,*) trim(prefix_),' ','Aggregator object type: ',ag%fmt()
|
||||||
call parms%mldescr(iout,info)
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_z_dec_aggregator_descr
|
end subroutine amg_z_dec_aggregator_descr
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ contains
|
|||||||
|
|
||||||
end subroutine z_diag_solver_free
|
end subroutine z_diag_solver_free
|
||||||
|
|
||||||
subroutine z_diag_solver_descr(sv,info,iout,coarse)
|
subroutine z_diag_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -228,11 +228,13 @@ contains
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_z_diag_solver_descr'
|
character(len=20), parameter :: name='amg_z_diag_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -240,8 +242,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
write(iout_,*) ' Diagonal local solver '
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout_,*) trim(prefix_), ' Diagonal local solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -352,7 +359,7 @@ module amg_z_l1_diag_solver
|
|||||||
|
|
||||||
contains
|
contains
|
||||||
|
|
||||||
subroutine z_l1_diag_solver_descr(sv,info,iout,coarse)
|
subroutine z_l1_diag_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -361,11 +368,13 @@ contains
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_z_l1_diag_solver_descr'
|
character(len=20), parameter :: name='amg_z_l1_diag_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -373,8 +382,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
write(iout_,*) ' L1 Diagonal solver '
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout_,*) trim(prefix_), ' L1 Diagonal solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
+26
-12
@@ -433,20 +433,22 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine z_gs_solver_free
|
end subroutine z_gs_solver_free
|
||||||
|
|
||||||
subroutine z_gs_solver_descr(sv,info,iout,coarse)
|
subroutine z_gs_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_z_gs_solver_type), intent(in) :: sv
|
class(amg_z_gs_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_z_gs_solver_descr'
|
character(len=20), parameter :: name='amg_z_gs_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -455,12 +457,17 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%eps<=dzero) then
|
if (sv%eps<=dzero) then
|
||||||
write(iout_,*) ' Forward Gauss-Seidel iterative solver with ',&
|
write(iout_,*) trim(prefix_), ' Forward Gauss-Seidel iterative solver with ',&
|
||||||
& sv%sweeps,' sweeps'
|
& sv%sweeps,' sweeps'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Forward Gauss-Seidel iterative solver with tolerance',&
|
write(iout_,*) trim(prefix_), ' Forward Gauss-Seidel iterative solver with tolerance',&
|
||||||
& sv%eps,' and maxit', sv%sweeps
|
& sv%eps,' and maxit', sv%sweeps
|
||||||
end if
|
end if
|
||||||
|
|
||||||
@@ -526,20 +533,22 @@ contains
|
|||||||
val = .true.
|
val = .true.
|
||||||
end function z_gs_solver_is_iterative
|
end function z_gs_solver_is_iterative
|
||||||
|
|
||||||
subroutine z_bwgs_solver_descr(sv,info,iout,coarse)
|
subroutine z_bwgs_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_z_bwgs_solver_type), intent(in) :: sv
|
class(amg_z_bwgs_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_z_bwgs_solver_descr'
|
character(len=20), parameter :: name='amg_z_bwgs_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -548,12 +557,17 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%eps<=dzero) then
|
if (sv%eps<=dzero) then
|
||||||
write(iout_,*) ' Backward Gauss-Seidel iterative solver with ',&
|
write(iout_,*) trim(prefix_), ' Backward Gauss-Seidel iterative solver with ',&
|
||||||
& sv%sweeps,' sweeps'
|
& sv%sweeps,' sweeps'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Backward Gauss-Seidel iterative solver with tolerance',&
|
write(iout_,*) trim(prefix_), ' Backward Gauss-Seidel iterative solver with tolerance',&
|
||||||
& sv%eps,' and maxit', sv%sweeps
|
& sv%eps,' and maxit', sv%sweeps
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine z_id_solver_free
|
end subroutine z_id_solver_free
|
||||||
|
|
||||||
subroutine z_id_solver_descr(sv,info,iout,coarse)
|
subroutine z_id_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -165,12 +165,14 @@ contains
|
|||||||
class(amg_z_id_solver_type), intent(in) :: sv
|
class(amg_z_id_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_z_id_solver_descr'
|
character(len=20), parameter :: name='amg_z_id_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
if (present(iout)) then
|
if (present(iout)) then
|
||||||
@@ -178,8 +180,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' Identity local solver '
|
write(iout_,*) trim(prefix_), ' Identity local solver '
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -406,7 +406,7 @@ contains
|
|||||||
return
|
return
|
||||||
end subroutine z_ilu_solver_free
|
end subroutine z_ilu_solver_free
|
||||||
|
|
||||||
subroutine z_ilu_solver_descr(sv,info,iout,coarse)
|
subroutine z_ilu_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -414,12 +414,14 @@ contains
|
|||||||
class(amg_z_ilu_solver_type), intent(in) :: sv
|
class(amg_z_ilu_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_z_ilu_solver_descr'
|
character(len=20), parameter :: name='amg_z_ilu_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -428,15 +430,20 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' Incomplete factorization solver: ',&
|
write(iout_,*) trim(prefix_), ' Incomplete factorization solver: ',&
|
||||||
& amg_fact_names(sv%fact_type)
|
& amg_fact_names(sv%fact_type)
|
||||||
select case(sv%fact_type)
|
select case(sv%fact_type)
|
||||||
case(psb_ilu_n_,psb_milu_n_)
|
case(psb_ilu_n_,psb_milu_n_)
|
||||||
write(iout_,*) ' Fill level:',sv%fill_in
|
write(iout_,*) trim(prefix_), ' Fill level:',sv%fill_in
|
||||||
case(psb_ilu_t_)
|
case(psb_ilu_t_)
|
||||||
write(iout_,*) ' Fill level:',sv%fill_in
|
write(iout_,*) trim(prefix_), ' Fill level:',sv%fill_in
|
||||||
write(iout_,*) ' Fill threshold :',sv%thresh
|
write(iout_,*) trim(prefix_), ' Fill threshold :',sv%thresh
|
||||||
end select
|
end select
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ module amg_z_invk_solver
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_z_invk_solver_descr(sv,info,iout,coarse)
|
subroutine amg_z_invk_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_dpk_, amg_z_invk_solver_type, psb_ipk_
|
import :: psb_dpk_, amg_z_invk_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
@@ -133,7 +133,7 @@ module amg_z_invk_solver
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_z_invk_solver_descr
|
end subroutine amg_z_invk_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -134,16 +134,17 @@ module amg_z_invt_solver
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_z_invt_solver_descr(sv,info,iout,coarse)
|
subroutine amg_z_invt_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
import :: psb_dpk_, amg_z_invt_solver_type, psb_ipk_
|
import :: psb_dpk_, amg_z_invt_solver_type, psb_ipk_
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_z_invt_solver_type), intent(in) :: sv
|
class(amg_z_invt_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
end subroutine amg_z_invt_solver_descr
|
end subroutine amg_z_invt_solver_descr
|
||||||
end interface
|
end interface
|
||||||
|
|||||||
@@ -219,12 +219,13 @@ module amg_z_jac_smoother
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_z_jac_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_z_jac_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: amg_z_jac_smoother_type, psb_ipk_
|
import :: amg_z_jac_smoother_type, psb_ipk_
|
||||||
class(amg_z_jac_smoother_type), intent(in) :: sm
|
class(amg_z_jac_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_z_jac_smoother_descr
|
end subroutine amg_z_jac_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
@@ -313,12 +314,13 @@ module amg_z_jac_smoother
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_z_l1_jac_smoother_descr(sm,info,iout,coarse)
|
subroutine amg_z_l1_jac_smoother_descr(sm,info,iout,coarse,prefix)
|
||||||
import :: amg_z_l1_jac_smoother_type, psb_ipk_
|
import :: amg_z_l1_jac_smoother_type, psb_ipk_
|
||||||
class(amg_z_l1_jac_smoother_type), intent(in) :: sm
|
class(amg_z_l1_jac_smoother_type), intent(in) :: sm
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_z_l1_jac_smoother_descr
|
end subroutine amg_z_l1_jac_smoother_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -436,7 +436,7 @@ contains
|
|||||||
val = "KRM solver"
|
val = "KRM solver"
|
||||||
end function z_krm_solver_get_fmt
|
end function z_krm_solver_get_fmt
|
||||||
|
|
||||||
subroutine z_krm_solver_descr(sv,info,iout,coarse)
|
subroutine z_krm_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
@@ -444,12 +444,14 @@ contains
|
|||||||
class(amg_z_krm_solver_type), intent(in) :: sv
|
class(amg_z_krm_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
character(len=20), parameter :: name='amg_z_krm_solver_descr'
|
character(len=20), parameter :: name='amg_z_krm_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -458,23 +460,22 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
if (sv%global) then
|
if (sv%global) then
|
||||||
write(iout_,*) ' Krylov solver (global)'
|
write(iout_,*) trim(prefix_), ' Krylov solver (global)'
|
||||||
else
|
else
|
||||||
write(iout_,*) ' Krylov solver (local) '
|
write(iout_,*) trim(prefix_), ' Krylov solver (local) '
|
||||||
end if
|
end if
|
||||||
write(iout_,*) ' method: ',sv%method
|
write(iout_,*) trim(prefix_), ' method: ',sv%method
|
||||||
write(iout_,*) ' kprec: ',sv%kprec
|
write(iout_,*) trim(prefix_), ' kprec: ',sv%kprec
|
||||||
if (sv%i_sub_solve > 0) then
|
call sv%prec%descr(info,iout_,prefix='KRM : '//prefix_)
|
||||||
write(iout_,*) ' sub_solve: ',amg_fact_names(sv%i_sub_solve)
|
write(iout_,*) trim(prefix_), ' itmax: ',sv%itmax
|
||||||
else
|
write(iout_,*) trim(prefix_), ' eps: ',sv%eps
|
||||||
write(iout_,*) ' sub_solve: ',sv%sub_solve
|
|
||||||
end if
|
|
||||||
write(iout_,*) ' itmax: ',sv%itmax
|
|
||||||
write(iout_,*) ' eps: ',sv%eps
|
|
||||||
write(iout_,*) ' fillin: ',sv%fillin
|
|
||||||
|
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -313,22 +313,24 @@ subroutine z_mumps_solver_finalize(sv)
|
|||||||
|
|
||||||
end subroutine z_mumps_solver_finalize
|
end subroutine z_mumps_solver_finalize
|
||||||
|
|
||||||
subroutine z_mumps_solver_descr(sv,info,iout,coarse)
|
subroutine z_mumps_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_z_mumps_solver_type), intent(in) :: sv
|
class(amg_z_mumps_solver_type), intent(in) :: sv
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer(psb_ipk_) :: err_act
|
integer(psb_ipk_) :: err_act
|
||||||
type(psb_ctxt_type) :: ctxt
|
type(psb_ctxt_type) :: ctxt
|
||||||
integer(psb_ipk_) :: me, np
|
integer(psb_ipk_) :: me, np
|
||||||
character(len=20), parameter :: name='amg_z_mumps_solver_descr'
|
character(len=20), parameter :: name='amg_z_mumps_solver_descr'
|
||||||
integer(psb_ipk_) :: iout_
|
integer(psb_ipk_) :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -337,8 +339,13 @@ subroutine z_mumps_solver_descr(sv,info,iout,coarse)
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' MUMPS Solver. '
|
write(iout_,*) trim(prefix_), ' MUMPS Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -257,7 +257,7 @@ module amg_z_onelev_mod
|
|||||||
end interface
|
end interface
|
||||||
|
|
||||||
interface
|
interface
|
||||||
subroutine amg_z_base_onelev_descr(lv,il,nl,ilmin,info,iout, verbosity)
|
subroutine amg_z_base_onelev_descr(lv,il,nl,ilmin,info,iout, verbosity,prefix)
|
||||||
import :: psb_zspmat_type, psb_z_vect_type, psb_z_base_vect_type, &
|
import :: psb_zspmat_type, psb_z_vect_type, psb_z_base_vect_type, &
|
||||||
& psb_zlinmap_type, psb_dpk_, amg_z_onelev_type, &
|
& psb_zlinmap_type, psb_dpk_, amg_z_onelev_type, &
|
||||||
& psb_ipk_, psb_epk_, psb_desc_type
|
& psb_ipk_, psb_epk_, psb_desc_type
|
||||||
@@ -268,6 +268,7 @@ module amg_z_onelev_mod
|
|||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
integer(psb_ipk_), intent(in), optional :: verbosity
|
integer(psb_ipk_), intent(in), optional :: verbosity
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_z_base_onelev_descr
|
end subroutine amg_z_base_onelev_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -155,14 +155,16 @@ module amg_z_prec_type
|
|||||||
|
|
||||||
|
|
||||||
interface amg_precdescr
|
interface amg_precdescr
|
||||||
subroutine amg_zfile_prec_descr(prec,iout,root,verbosity)
|
subroutine amg_zfile_prec_descr(prec,info,iout,root,verbosity,prefix)
|
||||||
import :: amg_zprec_type, psb_ipk_
|
import :: amg_zprec_type, psb_ipk_
|
||||||
implicit none
|
implicit none
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_zprec_type), intent(in) :: prec
|
class(amg_zprec_type), intent(in) :: prec
|
||||||
|
integer(psb_ipk_), intent(out) :: info
|
||||||
integer(psb_ipk_), intent(in), optional :: iout
|
integer(psb_ipk_), intent(in), optional :: iout
|
||||||
integer(psb_ipk_), intent(in), optional :: root
|
integer(psb_ipk_), intent(in), optional :: root
|
||||||
integer(psb_ipk_), intent(in), optional :: verbosity
|
integer(psb_ipk_), intent(in), optional :: verbosity
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
end subroutine amg_zfile_prec_descr
|
end subroutine amg_zfile_prec_descr
|
||||||
end interface
|
end interface
|
||||||
|
|
||||||
|
|||||||
@@ -385,20 +385,22 @@ contains
|
|||||||
|
|
||||||
end subroutine z_slu_solver_finalize
|
end subroutine z_slu_solver_finalize
|
||||||
|
|
||||||
subroutine z_slu_solver_descr(sv,info,iout,coarse)
|
subroutine z_slu_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_z_slu_solver_type), intent(in) :: sv
|
class(amg_z_slu_solver_type), intent(in) :: sv
|
||||||
integer, intent(out) :: info
|
integer, intent(out) :: info
|
||||||
integer, intent(in), optional :: iout
|
integer, intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer :: err_act
|
integer :: err_act
|
||||||
character(len=20), parameter :: name='amg_z_slu_solver_descr'
|
character(len=20), parameter :: name='amg_z_slu_solver_descr'
|
||||||
integer :: iout_
|
integer :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -407,8 +409,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' SuperLU Sparse Factorization Solver. '
|
write(iout_,*) trim(prefix_), ' SuperLU Sparse Factorization Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ module amg_z_sludist_solver
|
|||||||
use iso_c_binding
|
use iso_c_binding
|
||||||
use amg_z_base_solver_mod
|
use amg_z_base_solver_mod
|
||||||
|
|
||||||
#if defined(LPK8)
|
#if (!defined(HAVE_SLUDIST_)) || defined(IPK8)
|
||||||
|
|
||||||
type, extends(amg_z_base_solver_type) :: amg_z_sludist_solver_type
|
type, extends(amg_z_base_solver_type) :: amg_z_sludist_solver_type
|
||||||
|
|
||||||
@@ -270,10 +270,12 @@ contains
|
|||||||
! Local variables
|
! Local variables
|
||||||
type(psb_zspmat_type) :: atmp
|
type(psb_zspmat_type) :: atmp
|
||||||
type(psb_z_csr_sparse_mat) :: acsr
|
type(psb_z_csr_sparse_mat) :: acsr
|
||||||
integer :: n_row,n_col, nrow_a, nztota, nglob, nzt, npr, npc
|
|
||||||
integer :: ifrst, ibcheck
|
|
||||||
type(psb_ctxt_type) :: ctxt
|
type(psb_ctxt_type) :: ctxt
|
||||||
integer :: np,me,i, err_act, debug_unit, debug_level
|
integer(psb_lpk_), allocatable :: gia(:), gja(:)
|
||||||
|
integer(psb_lpk_) :: lfrst
|
||||||
|
integer(psb_ipk_) :: n_row,n_col, nrow_a, nztota, nglob, nzt, npr, npc
|
||||||
|
integer(psb_ipk_) :: ifrst, ibcheck
|
||||||
|
integer(psb_ipk_) :: np,me,i, err_act, debug_unit, debug_level
|
||||||
character(len=20) :: name='z_sludist_solver_bld', ch_err
|
character(len=20) :: name='z_sludist_solver_bld', ch_err
|
||||||
|
|
||||||
info=psb_success_
|
info=psb_success_
|
||||||
@@ -293,19 +295,36 @@ contains
|
|||||||
n_col = desc_a%get_local_cols()
|
n_col = desc_a%get_local_cols()
|
||||||
nglob = desc_a%get_global_rows()
|
nglob = desc_a%get_global_rows()
|
||||||
|
|
||||||
call a%cscnv(atmp,info,type='coo')
|
!
|
||||||
|
! Strategy here is as follows: because a call to SLUDIST
|
||||||
|
! as a gobal solver is mostly done at the coarsest level,
|
||||||
|
! even if we start from a problem requiring 8 bytes, chances
|
||||||
|
! are that the global size will be suitable for 4 bytes
|
||||||
|
! anyway, so we hope for the best, and throw an error
|
||||||
|
! if something goes wrong.
|
||||||
|
!
|
||||||
|
if (nglob > huge(1_psb_ipk_)) then
|
||||||
|
write(0,*) me,' ',trim(name),': Error: overflow of local indices '
|
||||||
|
info=psb_err_internal_error_
|
||||||
|
call psb_errpush(info,name)
|
||||||
|
goto 9999
|
||||||
|
end if
|
||||||
|
|
||||||
|
call a%cscnv(atmp,info,type='csr')
|
||||||
|
! This in case we are dealing with AS
|
||||||
call psb_rwextd(n_row,atmp,info,b=b)
|
call psb_rwextd(n_row,atmp,info,b=b)
|
||||||
call atmp%cscnv(info,type='csr',dupl=psb_dupl_add_)
|
|
||||||
call atmp%mv_to(acsr)
|
call atmp%mv_to(acsr)
|
||||||
nrow_a = acsr%get_nrows()
|
nrow_a = acsr%get_nrows()
|
||||||
nztota = acsr%get_nzeros()
|
nztota = acsr%get_nzeros()
|
||||||
|
call psb_loc_to_glob(ione,lfrst,desc_a,info)
|
||||||
|
|
||||||
! Fix the entries to call C-base SuperLU
|
! Fix the entries to call C-base SuperLU
|
||||||
call psb_loc_to_glob(1,ifrst,desc_a,info)
|
call psb_realloc(nztota,gja,info)
|
||||||
call psb_loc_to_glob(nrow_a,ibcheck,desc_a,info)
|
call psb_loc_to_glob(acsr%ja(1:nztota),gja(1:nztota), desc_a, info, iact='I')
|
||||||
call psb_loc_to_glob(acsr%ja(1:nztota),desc_a,info,iact='I')
|
acsr%ja(1:nztota) = gja(1:nztota)
|
||||||
acsr%ja(:) = acsr%ja(:) - 1
|
acsr%ja(:) = acsr%ja(:) - 1
|
||||||
acsr%irp(:) = acsr%irp(:) - 1
|
acsr%irp(:) = acsr%irp(:) - 1
|
||||||
ifrst = ifrst - 1
|
ifrst = lfrst - 1
|
||||||
info = amg_zsludist_fact(nglob,nrow_a,nztota,ifrst,&
|
info = amg_zsludist_fact(nglob,nrow_a,nztota,ifrst,&
|
||||||
& acsr%val,acsr%irp,acsr%ja,sv%lufactors,&
|
& acsr%val,acsr%irp,acsr%ja,sv%lufactors,&
|
||||||
& npr,npc)
|
& npr,npc)
|
||||||
@@ -318,7 +337,6 @@ contains
|
|||||||
end if
|
end if
|
||||||
|
|
||||||
call acsr%free()
|
call acsr%free()
|
||||||
call atmp%free()
|
|
||||||
|
|
||||||
if (debug_level >= psb_debug_outer_) &
|
if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),' end'
|
& write(debug_unit,*) me,' ',trim(name),' end'
|
||||||
@@ -403,15 +421,16 @@ contains
|
|||||||
|
|
||||||
end subroutine z_sludist_solver_finalize
|
end subroutine z_sludist_solver_finalize
|
||||||
|
|
||||||
subroutine z_sludist_solver_descr(sv,info,iout,coarse)
|
subroutine z_sludist_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_z_sludist_solver_type), intent(in) :: sv
|
class(amg_z_sludist_solver_type), intent(in) :: sv
|
||||||
integer, intent(out) :: info
|
integer, intent(out) :: info
|
||||||
integer, intent(in), optional :: iout
|
integer, intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer :: err_act
|
integer :: err_act
|
||||||
@@ -419,6 +438,7 @@ contains
|
|||||||
integer :: me, np
|
integer :: me, np
|
||||||
character(len=20), parameter :: name='amg_z_sludist_solver_descr'
|
character(len=20), parameter :: name='amg_z_sludist_solver_descr'
|
||||||
integer :: iout_
|
integer :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -427,8 +447,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' SuperLU_Dist Sparse Factorization Solver. '
|
write(iout_,*) trim(prefix_), ' SuperLU_Dist Sparse Factorization Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -88,16 +88,25 @@ contains
|
|||||||
val = "Symmetric Decoupled aggregation"
|
val = "Symmetric Decoupled aggregation"
|
||||||
end function amg_z_symdec_aggregator_fmt
|
end function amg_z_symdec_aggregator_fmt
|
||||||
|
|
||||||
subroutine amg_z_symdec_aggregator_descr(ag,parms,iout,info)
|
subroutine amg_z_symdec_aggregator_descr(ag,parms,iout,info,prefix)
|
||||||
implicit none
|
implicit none
|
||||||
class(amg_z_symdec_aggregator_type), intent(in) :: ag
|
class(amg_z_symdec_aggregator_type), intent(in) :: ag
|
||||||
type(amg_dml_parms), intent(in) :: parms
|
type(amg_dml_parms), intent(in) :: parms
|
||||||
integer(psb_ipk_), intent(in) :: iout
|
integer(psb_ipk_), intent(in) :: iout
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
write(iout,*) 'Decoupled Aggregator locally-symmetrized'
|
character(1024) :: prefix_
|
||||||
write(iout,*) 'Aggregator object type: ',ag%fmt()
|
|
||||||
call parms%mldescr(iout,info)
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
|
write(iout,*) trim(prefix_),' ','Decoupled Aggregator locally-symmetrized'
|
||||||
|
write(iout,*) trim(prefix_),' ','Aggregator object type: ',ag%fmt()
|
||||||
|
call parms%mldescr(iout,info,prefix=prefix)
|
||||||
|
|
||||||
return
|
return
|
||||||
end subroutine amg_z_symdec_aggregator_descr
|
end subroutine amg_z_symdec_aggregator_descr
|
||||||
|
|||||||
@@ -390,20 +390,22 @@ contains
|
|||||||
|
|
||||||
end subroutine z_umf_solver_finalize
|
end subroutine z_umf_solver_finalize
|
||||||
|
|
||||||
subroutine z_umf_solver_descr(sv,info,iout,coarse)
|
subroutine z_umf_solver_descr(sv,info,iout,coarse,prefix)
|
||||||
|
|
||||||
Implicit None
|
Implicit None
|
||||||
|
|
||||||
! Arguments
|
! Arguments
|
||||||
class(amg_z_umf_solver_type), intent(in) :: sv
|
class(amg_z_umf_solver_type), intent(in) :: sv
|
||||||
integer, intent(out) :: info
|
integer, intent(out) :: info
|
||||||
integer, intent(in), optional :: iout
|
integer, intent(in), optional :: iout
|
||||||
logical, intent(in), optional :: coarse
|
logical, intent(in), optional :: coarse
|
||||||
|
character(len=*), intent(in), optional :: prefix
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
integer :: err_act
|
integer :: err_act
|
||||||
character(len=20), parameter :: name='amg_z_umf_solver_descr'
|
character(len=20), parameter :: name='amg_z_umf_solver_descr'
|
||||||
integer :: iout_
|
integer :: iout_
|
||||||
|
character(1024) :: prefix_
|
||||||
|
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
info = psb_success_
|
info = psb_success_
|
||||||
@@ -412,8 +414,13 @@ contains
|
|||||||
else
|
else
|
||||||
iout_ = psb_out_unit
|
iout_ = psb_out_unit
|
||||||
endif
|
endif
|
||||||
|
if (present(prefix)) then
|
||||||
|
prefix_ = prefix
|
||||||
|
else
|
||||||
|
prefix_ = ""
|
||||||
|
end if
|
||||||
|
|
||||||
write(iout_,*) ' UMFPACK Sparse Factorization Solver. '
|
write(iout_,*) trim(prefix_), ' UMFPACK Sparse Factorization Solver. '
|
||||||
|
|
||||||
call psb_erractionrestore(err_act)
|
call psb_erractionrestore(err_act)
|
||||||
return
|
return
|
||||||
|
|||||||
+14
-11
@@ -67,22 +67,25 @@ OBJS=$(F90OBJS) $(COBJS) $(MPCOBJS)
|
|||||||
|
|
||||||
LIBNAME=libamg_prec.a
|
LIBNAME=libamg_prec.a
|
||||||
|
|
||||||
|
objs: $(OBJS) aggrd levd smoothd solvd
|
||||||
|
|
||||||
lib: $(OBJS) aggrd levd smoothd solvd
|
lib: $(OBJS) aggrd levd smoothd solvd
|
||||||
|
cd aggregator && $(MAKE) lib
|
||||||
|
cd level && $(MAKE) lib
|
||||||
|
cd smoother && $(MAKE) lib
|
||||||
|
cd solver && $(MAKE) lib
|
||||||
$(AR) $(HERE)/$(LIBNAME) $(OBJS)
|
$(AR) $(HERE)/$(LIBNAME) $(OBJS)
|
||||||
$(RANLIB) $(HERE)/$(LIBNAME)
|
$(RANLIB) $(HERE)/$(LIBNAME)
|
||||||
|
|
||||||
aggrd:
|
aggrd:
|
||||||
$(MAKE) -C aggregator
|
cd aggregator && $(MAKE) objs
|
||||||
levd:
|
levd:
|
||||||
$(MAKE) -C level
|
cd level && $(MAKE) objs
|
||||||
smoothd:
|
smoothd:
|
||||||
$(MAKE) -C smoother
|
cd smoother && $(MAKE) objs
|
||||||
solvd:
|
solvd:
|
||||||
$(MAKE) -C solver
|
cd solver && $(MAKE) objs
|
||||||
|
|
||||||
mpobjs:
|
|
||||||
(make $(MPFOBJS) FC="$(MPFC)" FCOPT="$(FCOPT)")
|
|
||||||
(make $(MPCOBJS) CC="$(MPCC)" CCOPT="$(CCOPT)")
|
|
||||||
|
|
||||||
veryclean: clean
|
veryclean: clean
|
||||||
/bin/rm -f $(LIBNAME)
|
/bin/rm -f $(LIBNAME)
|
||||||
@@ -91,10 +94,10 @@ clean: solvclean smoothclean levclean aggrclean
|
|||||||
/bin/rm -f $(OBJS) $(LOCAL_MODS)
|
/bin/rm -f $(OBJS) $(LOCAL_MODS)
|
||||||
|
|
||||||
aggrclean:
|
aggrclean:
|
||||||
$(MAKE) -C aggregator clean
|
cd aggregator && $(MAKE) clean
|
||||||
levclean:
|
levclean:
|
||||||
$(MAKE) -C level clean
|
cd level && $(MAKE) clean
|
||||||
smoothclean:
|
smoothclean:
|
||||||
$(MAKE) -C smoother clean
|
cd smoother && $(MAKE) clean
|
||||||
solvclean:
|
solvclean:
|
||||||
$(MAKE) -C solver clean
|
cd solver && $(MAKE) clean
|
||||||
|
|||||||
@@ -62,13 +62,30 @@ amg_s_parmatch_smth_bld.o \
|
|||||||
amg_s_parmatch_spmm_bld_inner.o
|
amg_s_parmatch_spmm_bld_inner.o
|
||||||
|
|
||||||
MPCOBJS=MatchBoxPC.o \
|
MPCOBJS=MatchBoxPC.o \
|
||||||
algoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateC.o
|
sendBundledMessages.o \
|
||||||
|
initialize.o \
|
||||||
|
extractUChunk.o \
|
||||||
|
isAlreadyMatched.o \
|
||||||
|
findOwnerOfGhost.o \
|
||||||
|
clean.o \
|
||||||
|
computeCandidateMate.o \
|
||||||
|
parallelComputeCandidateMateB.o \
|
||||||
|
processMatchedVertices.o \
|
||||||
|
processMatchedVerticesAndSendMessages.o \
|
||||||
|
processCrossEdge.o \
|
||||||
|
queueTransfer.o \
|
||||||
|
processMessages.o \
|
||||||
|
processExposedVertex.o \
|
||||||
|
algoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateC.o \
|
||||||
|
algoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateCMP.o
|
||||||
|
|
||||||
OBJS = $(FOBJS) $(MPCOBJS)
|
OBJS = $(FOBJS) $(MPCOBJS)
|
||||||
|
|
||||||
LIBNAME=libamg_prec.a
|
LIBNAME=libamg_prec.a
|
||||||
|
|
||||||
lib: $(OBJS)
|
objs: $(OBJS)
|
||||||
|
|
||||||
|
lib: objs
|
||||||
$(AR) $(HERE)/$(LIBNAME) $(OBJS)
|
$(AR) $(HERE)/$(LIBNAME) $(OBJS)
|
||||||
$(RANLIB) $(HERE)/$(LIBNAME)
|
$(RANLIB) $(HERE)/$(LIBNAME)
|
||||||
|
|
||||||
|
|||||||
@@ -60,17 +60,43 @@ void dMatchBoxPC(MilanLongInt NLVer, MilanLongInt NLEdge,
|
|||||||
MilanLongInt* ph1_card, MilanLongInt* ph2_card ) {
|
MilanLongInt* ph1_card, MilanLongInt* ph2_card ) {
|
||||||
#if !defined(SERIAL_MPI)
|
#if !defined(SERIAL_MPI)
|
||||||
MPI_Comm C_comm=MPI_Comm_f2c(icomm);
|
MPI_Comm C_comm=MPI_Comm_f2c(icomm);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr,"MatchBoxPC: rank %d nlver %ld nledge %ld [ %ld %ld ]\n",
|
fprintf(stderr,"MatchBoxPC: rank %d nlver %ld nledge %ld [ %ld %ld ]\n",
|
||||||
myRank,NLVer, NLEdge,verDistance[0],verDistance[1]);
|
myRank,NLVer, NLEdge,verDistance[0],verDistance[1]);
|
||||||
#endif
|
#endif
|
||||||
dalgoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateC(NLVer, NLEdge,
|
|
||||||
|
|
||||||
|
#define TIME_TRACKER
|
||||||
|
#ifdef TIME_TRACKER
|
||||||
|
double tmr = MPI_Wtime();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define OMP
|
||||||
|
#ifdef OMP
|
||||||
|
dalgoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateCMP(NLVer, NLEdge,
|
||||||
verLocPtr, verLocInd, edgeLocWeight,
|
verLocPtr, verLocInd, edgeLocWeight,
|
||||||
verDistance, Mate,
|
verDistance, Mate,
|
||||||
myRank, numProcs, C_comm,
|
myRank, numProcs, C_comm,
|
||||||
msgIndSent, msgActualSent, msgPercent,
|
msgIndSent, msgActualSent, msgPercent,
|
||||||
ph0_time, ph1_time, ph2_time,
|
ph0_time, ph1_time, ph2_time,
|
||||||
ph1_card, ph2_card );
|
ph1_card, ph2_card );
|
||||||
|
#else
|
||||||
|
dalgoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateC(NLVer, NLEdge,
|
||||||
|
verLocPtr, verLocInd, edgeLocWeight,
|
||||||
|
verDistance, Mate,
|
||||||
|
myRank, numProcs, C_comm,
|
||||||
|
msgIndSent, msgActualSent, msgPercent,
|
||||||
|
ph0_time, ph1_time, ph2_time,
|
||||||
|
ph1_card, ph2_card );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TIME_TRACKER
|
||||||
|
tmr = MPI_Wtime() - tmr;
|
||||||
|
fprintf(stderr, "Elaboration time: %f for %ld nodes\n", tmr, NLVer);
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,145 +52,412 @@
|
|||||||
|
|
||||||
#ifndef _matchboxpC_H_
|
#ifndef _matchboxpC_H_
|
||||||
#define _matchboxpC_H_
|
#define _matchboxpC_H_
|
||||||
//Turn on a lot of debugging information with this switch:
|
// Turn on a lot of debugging information with this switch:
|
||||||
//#define PRINT_DEBUG_INFO_
|
//#define PRINT_DEBUG_INFO_
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
// #include "matchboxp.h"
|
#include "omp.h"
|
||||||
#include "primitiveDataTypeDefinitions.h"
|
#include "primitiveDataTypeDefinitions.h"
|
||||||
#include "dataStrStaticQueue.h"
|
#include "dataStrStaticQueue.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
const int NUM_THREAD = 4;
|
||||||
|
const int UCHUNK = 10;
|
||||||
|
|
||||||
|
const MilanLongInt REQUEST = 1;
|
||||||
|
const MilanLongInt SUCCESS = 2;
|
||||||
|
const MilanLongInt FAILURE = 3;
|
||||||
|
const MilanLongInt SIZEINFO = 4;
|
||||||
|
|
||||||
|
const int ComputeTag = 7; // Predefined tag
|
||||||
|
const int BundleTag = 9; // Predefined tag
|
||||||
|
|
||||||
|
static vector<MilanLongInt> DEFAULT_VECTOR;
|
||||||
|
|
||||||
|
// MPI type map
|
||||||
|
template <typename T>
|
||||||
|
MPI_Datatype TypeMap();
|
||||||
|
template <>
|
||||||
|
inline MPI_Datatype TypeMap<int64_t>() { return MPI_LONG_LONG; }
|
||||||
|
template <>
|
||||||
|
inline MPI_Datatype TypeMap<int>() { return MPI_INT; }
|
||||||
|
template <>
|
||||||
|
inline MPI_Datatype TypeMap<double>() { return MPI_DOUBLE; }
|
||||||
|
template <>
|
||||||
|
inline MPI_Datatype TypeMap<float>() { return MPI_FLOAT; }
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C"
|
||||||
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(SERIAL_MPI)
|
#if !defined(SERIAL_MPI)
|
||||||
|
|
||||||
#define MilanMpiLongInt MPI_LONG_LONG
|
#define MilanMpiLongInt MPI_LONG_LONG
|
||||||
|
|
||||||
#ifndef _primitiveDataType_Definition_
|
#ifndef _primitiveDataType_Definition_
|
||||||
#define _primitiveDataType_Definition_
|
#define _primitiveDataType_Definition_
|
||||||
//Regular integer:
|
// Regular integer:
|
||||||
#ifndef INTEGER_H
|
#ifndef INTEGER_H
|
||||||
#define INTEGER_H
|
#define INTEGER_H
|
||||||
typedef int32_t MilanInt;
|
typedef int32_t MilanInt;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Regular long integer:
|
// Regular long integer:
|
||||||
#ifndef LONG_INT_H
|
#ifndef LONG_INT_H
|
||||||
#define LONG_INT_H
|
#define LONG_INT_H
|
||||||
#ifdef BIT64
|
#ifdef BIT64
|
||||||
typedef int64_t MilanLongInt;
|
typedef int64_t MilanLongInt;
|
||||||
typedef MPI_LONG MilanMpiLongInt;
|
typedef MPI_LONG MilanMpiLongInt;
|
||||||
#else
|
#else
|
||||||
typedef int32_t MilanLongInt;
|
typedef int32_t MilanLongInt;
|
||||||
typedef MPI_INT MilanMpiLongInt;
|
typedef MPI_INT MilanMpiLongInt;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Regular boolean
|
// Regular boolean
|
||||||
#ifndef BOOL_H
|
#ifndef BOOL_H
|
||||||
#define BOOL_H
|
#define BOOL_H
|
||||||
typedef bool MilanBool;
|
typedef bool MilanBool;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Regular double and absolute value computation:
|
// Regular double and absolute value computation:
|
||||||
#ifndef REAL_H
|
#ifndef REAL_H
|
||||||
#define REAL_H
|
#define REAL_H
|
||||||
typedef double MilanReal;
|
typedef double MilanReal;
|
||||||
typedef MPI_DOUBLE MilanMpiReal;
|
typedef MPI_DOUBLE MilanMpiReal;
|
||||||
inline MilanReal MilanAbs(MilanReal value)
|
inline MilanReal MilanAbs(MilanReal value)
|
||||||
{
|
{
|
||||||
return fabs(value);
|
return fabs(value);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Regular float and absolute value computation:
|
// Regular float and absolute value computation:
|
||||||
#ifndef FLOAT_H
|
#ifndef FLOAT_H
|
||||||
#define FLOAT_H
|
#define FLOAT_H
|
||||||
typedef float MilanFloat;
|
typedef float MilanFloat;
|
||||||
typedef MPI_FLOAT MilanMpiFloat;
|
typedef MPI_FLOAT MilanMpiFloat;
|
||||||
inline MilanFloat MilanAbsFloat(MilanFloat value)
|
inline MilanFloat MilanAbsFloat(MilanFloat value)
|
||||||
{
|
{
|
||||||
return fabs(value);
|
return fabs(value);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//// Define the limits:
|
//// Define the limits:
|
||||||
#ifndef LIMITS_H
|
#ifndef LIMITS_H
|
||||||
#define LIMITS_H
|
#define LIMITS_H
|
||||||
//Integer Maximum and Minimum:
|
// Integer Maximum and Minimum:
|
||||||
// #define MilanIntMax INT_MAX
|
// #define MilanIntMax INT_MAX
|
||||||
// #define MilanIntMin INT_MIN
|
// #define MilanIntMin INT_MIN
|
||||||
#define MilanIntMax INT32_MAX
|
#define MilanIntMax INT32_MAX
|
||||||
#define MilanIntMin INT32_MIN
|
#define MilanIntMin INT32_MIN
|
||||||
|
|
||||||
#ifdef BIT64
|
#ifdef BIT64
|
||||||
#define MilanLongIntMax INT64_MAX
|
#define MilanLongIntMax INT64_MAX
|
||||||
#define MilanLongIntMin -INT64_MAX
|
#define MilanLongIntMin -INT64_MAX
|
||||||
#else
|
#else
|
||||||
#define MilanLongIntMax INT32_MAX
|
#define MilanLongIntMax INT32_MAX
|
||||||
#define MilanLongIntMin -INT32_MAX
|
#define MilanLongIntMin -INT32_MAX
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// +INFINITY
|
// +INFINITY
|
||||||
const double PLUS_INFINITY = numeric_limits<int>::infinity();
|
const double PLUS_INFINITY = numeric_limits<int>::infinity();
|
||||||
const double MINUS_INFINITY = -PLUS_INFINITY;
|
const double MINUS_INFINITY = -PLUS_INFINITY;
|
||||||
//#define MilanRealMax LDBL_MAX
|
//#define MilanRealMax LDBL_MAX
|
||||||
#define MilanRealMax PLUS_INFINITY
|
#define MilanRealMax PLUS_INFINITY
|
||||||
#define MilanRealMin MINUS_INFINITY
|
#define MilanRealMin MINUS_INFINITY
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Function of find the owner of a ghost vertex using binary search:
|
// Function of find the owner of a ghost vertex using binary search:
|
||||||
inline MilanInt findOwnerOfGhost(MilanLongInt vtxIndex, MilanLongInt *mVerDistance,
|
MilanInt findOwnerOfGhost(MilanLongInt vtxIndex, MilanLongInt *mVerDistance,
|
||||||
MilanInt myRank, MilanInt numProcs);
|
MilanInt myRank, MilanInt numProcs);
|
||||||
|
|
||||||
void dalgoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateC
|
MilanLongInt firstComputeCandidateMate(MilanLongInt adj1,
|
||||||
(
|
MilanLongInt adj2,
|
||||||
MilanLongInt NLVer, MilanLongInt NLEdge,
|
MilanLongInt *verLocInd,
|
||||||
MilanLongInt* verLocPtr, MilanLongInt* verLocInd, MilanReal* edgeLocWeight,
|
MilanReal *edgeLocWeight);
|
||||||
MilanLongInt* verDistance,
|
|
||||||
MilanLongInt* Mate,
|
|
||||||
MilanInt myRank, MilanInt numProcs, MPI_Comm comm,
|
|
||||||
MilanLongInt* msgIndSent, MilanLongInt* msgActualSent, MilanReal* msgPercent,
|
|
||||||
MilanReal* ph0_time, MilanReal* ph1_time, MilanReal* ph2_time,
|
|
||||||
MilanLongInt* ph1_card, MilanLongInt* ph2_card );
|
|
||||||
|
|
||||||
void salgoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateC
|
void queuesTransfer(vector<MilanLongInt> &U,
|
||||||
(
|
vector<MilanLongInt> &privateU,
|
||||||
MilanLongInt NLVer, MilanLongInt NLEdge,
|
vector<MilanLongInt> &QLocalVtx,
|
||||||
MilanLongInt* verLocPtr, MilanLongInt* verLocInd, MilanFloat* edgeLocWeight,
|
vector<MilanLongInt> &QGhostVtx,
|
||||||
MilanLongInt* verDistance,
|
vector<MilanLongInt> &QMsgType,
|
||||||
MilanLongInt* Mate,
|
vector<MilanInt> &QOwner,
|
||||||
MilanInt myRank, MilanInt numProcs, MPI_Comm comm,
|
vector<MilanLongInt> &privateQLocalVtx,
|
||||||
MilanLongInt* msgIndSent, MilanLongInt* msgActualSent, MilanReal* msgPercent,
|
vector<MilanLongInt> &privateQGhostVtx,
|
||||||
MilanReal* ph0_time, MilanReal* ph1_time, MilanReal* ph2_time,
|
vector<MilanLongInt> &privateQMsgType,
|
||||||
MilanLongInt* ph1_card, MilanLongInt* ph2_card );
|
vector<MilanInt> &privateQOwner);
|
||||||
|
|
||||||
void dMatchBoxPC(MilanLongInt NLVer, MilanLongInt NLEdge,
|
bool isAlreadyMatched(MilanLongInt node,
|
||||||
MilanLongInt* verLocPtr, MilanLongInt* verLocInd, MilanReal* edgeLocWeight,
|
MilanLongInt StartIndex,
|
||||||
MilanLongInt* verDistance,
|
MilanLongInt EndIndex,
|
||||||
MilanLongInt* Mate,
|
vector<MilanLongInt> &GMate,
|
||||||
MilanInt myRank, MilanInt numProcs, MilanInt icomm,
|
MilanLongInt *Mate,
|
||||||
MilanLongInt* msgIndSent, MilanLongInt* msgActualSent, MilanReal* msgPercent,
|
map<MilanLongInt, MilanLongInt> &Ghost2LocalMap);
|
||||||
MilanReal* ph0_time, MilanReal* ph1_time, MilanReal* ph2_time,
|
|
||||||
MilanLongInt* ph1_card, MilanLongInt* ph2_card );
|
|
||||||
|
|
||||||
void sMatchBoxPC(MilanLongInt NLVer, MilanLongInt NLEdge,
|
MilanLongInt computeCandidateMate(MilanLongInt adj1,
|
||||||
MilanLongInt* verLocPtr, MilanLongInt* verLocInd, MilanFloat* edgeLocWeight,
|
MilanLongInt adj2,
|
||||||
MilanLongInt* verDistance,
|
MilanReal *edgeLocWeight,
|
||||||
MilanLongInt* Mate,
|
MilanLongInt k,
|
||||||
MilanInt myRank, MilanInt numProcs, MilanInt icomm,
|
MilanLongInt *verLocInd,
|
||||||
MilanLongInt* msgIndSent, MilanLongInt* msgActualSent, MilanReal* msgPercent,
|
MilanLongInt StartIndex,
|
||||||
MilanReal* ph0_time, MilanReal* ph1_time, MilanReal* ph2_time,
|
MilanLongInt EndIndex,
|
||||||
MilanLongInt* ph1_card, MilanLongInt* ph2_card );
|
vector<MilanLongInt> &GMate,
|
||||||
|
MilanLongInt *Mate,
|
||||||
|
map<MilanLongInt, MilanLongInt> &Ghost2LocalMap);
|
||||||
|
|
||||||
|
void initialize(MilanLongInt NLVer, MilanLongInt NLEdge,
|
||||||
|
MilanLongInt StartIndex, MilanLongInt EndIndex,
|
||||||
|
MilanLongInt *numGhostEdgesPtr,
|
||||||
|
MilanLongInt *numGhostVerticesPtr,
|
||||||
|
MilanLongInt *S,
|
||||||
|
MilanLongInt *verLocInd,
|
||||||
|
MilanLongInt *verLocPtr,
|
||||||
|
map<MilanLongInt, MilanLongInt> &Ghost2LocalMap,
|
||||||
|
vector<MilanLongInt> &Counter,
|
||||||
|
vector<MilanLongInt> &verGhostPtr,
|
||||||
|
vector<MilanLongInt> &verGhostInd,
|
||||||
|
vector<MilanLongInt> &tempCounter,
|
||||||
|
vector<MilanLongInt> &GMate,
|
||||||
|
vector<MilanLongInt> &Message,
|
||||||
|
vector<MilanLongInt> &QLocalVtx,
|
||||||
|
vector<MilanLongInt> &QGhostVtx,
|
||||||
|
vector<MilanLongInt> &QMsgType,
|
||||||
|
vector<MilanInt> &QOwner,
|
||||||
|
MilanLongInt *&candidateMate,
|
||||||
|
vector<MilanLongInt> &U,
|
||||||
|
vector<MilanLongInt> &privateU,
|
||||||
|
vector<MilanLongInt> &privateQLocalVtx,
|
||||||
|
vector<MilanLongInt> &privateQGhostVtx,
|
||||||
|
vector<MilanLongInt> &privateQMsgType,
|
||||||
|
vector<MilanInt> &privateQOwner);
|
||||||
|
|
||||||
|
void clean(MilanLongInt NLVer,
|
||||||
|
MilanInt myRank,
|
||||||
|
MilanLongInt MessageIndex,
|
||||||
|
vector<MPI_Request> &SRequest,
|
||||||
|
vector<MPI_Status> &SStatus,
|
||||||
|
MilanInt BufferSize,
|
||||||
|
MilanLongInt *Buffer,
|
||||||
|
MilanLongInt msgActual,
|
||||||
|
MilanLongInt *msgActualSent,
|
||||||
|
MilanLongInt msgInd,
|
||||||
|
MilanLongInt *msgIndSent,
|
||||||
|
MilanLongInt NumMessagesBundled,
|
||||||
|
MilanReal *msgPercent);
|
||||||
|
|
||||||
|
void PARALLEL_COMPUTE_CANDIDATE_MATE_B(MilanLongInt NLVer,
|
||||||
|
MilanLongInt *verLocPtr,
|
||||||
|
MilanLongInt *verLocInd,
|
||||||
|
MilanInt myRank,
|
||||||
|
MilanReal *edgeLocWeight,
|
||||||
|
MilanLongInt *candidateMate);
|
||||||
|
|
||||||
|
void PARALLEL_PROCESS_EXPOSED_VERTEX_B(MilanLongInt NLVer,
|
||||||
|
MilanLongInt *candidateMate,
|
||||||
|
MilanLongInt *verLocInd,
|
||||||
|
MilanLongInt *verLocPtr,
|
||||||
|
MilanLongInt StartIndex,
|
||||||
|
MilanLongInt EndIndex,
|
||||||
|
MilanLongInt *Mate,
|
||||||
|
vector<MilanLongInt> &GMate,
|
||||||
|
map<MilanLongInt, MilanLongInt> &Ghost2LocalMap,
|
||||||
|
MilanReal *edgeLocWeight,
|
||||||
|
MilanLongInt *myCardPtr,
|
||||||
|
MilanLongInt *msgIndPtr,
|
||||||
|
MilanLongInt *NumMessagesBundledPtr,
|
||||||
|
MilanLongInt *SPtr,
|
||||||
|
MilanLongInt *verDistance,
|
||||||
|
MilanLongInt *PCounter,
|
||||||
|
vector<MilanLongInt> &Counter,
|
||||||
|
MilanInt myRank,
|
||||||
|
MilanInt numProcs,
|
||||||
|
vector<MilanLongInt> &U,
|
||||||
|
vector<MilanLongInt> &privateU,
|
||||||
|
vector<MilanLongInt> &QLocalVtx,
|
||||||
|
vector<MilanLongInt> &QGhostVtx,
|
||||||
|
vector<MilanLongInt> &QMsgType,
|
||||||
|
vector<MilanInt> &QOwner,
|
||||||
|
vector<MilanLongInt> &privateQLocalVtx,
|
||||||
|
vector<MilanLongInt> &privateQGhostVtx,
|
||||||
|
vector<MilanLongInt> &privateQMsgType,
|
||||||
|
vector<MilanInt> &privateQOwner);
|
||||||
|
|
||||||
|
void PROCESS_CROSS_EDGE(MilanLongInt *edge,
|
||||||
|
MilanLongInt *SPtr);
|
||||||
|
|
||||||
|
void processMatchedVertices(
|
||||||
|
MilanLongInt NLVer,
|
||||||
|
vector<MilanLongInt> &UChunkBeingProcessed,
|
||||||
|
vector<MilanLongInt> &U,
|
||||||
|
vector<MilanLongInt> &privateU,
|
||||||
|
MilanLongInt StartIndex,
|
||||||
|
MilanLongInt EndIndex,
|
||||||
|
MilanLongInt *myCardPtr,
|
||||||
|
MilanLongInt *msgIndPtr,
|
||||||
|
MilanLongInt *NumMessagesBundledPtr,
|
||||||
|
MilanLongInt *SPtr,
|
||||||
|
MilanLongInt *verLocPtr,
|
||||||
|
MilanLongInt *verLocInd,
|
||||||
|
MilanLongInt *verDistance,
|
||||||
|
MilanLongInt *PCounter,
|
||||||
|
vector<MilanLongInt> &Counter,
|
||||||
|
MilanInt myRank,
|
||||||
|
MilanInt numProcs,
|
||||||
|
MilanLongInt *candidateMate,
|
||||||
|
vector<MilanLongInt> &GMate,
|
||||||
|
MilanLongInt *Mate,
|
||||||
|
map<MilanLongInt, MilanLongInt> &Ghost2LocalMap,
|
||||||
|
MilanReal *edgeLocWeight,
|
||||||
|
vector<MilanLongInt> &QLocalVtx,
|
||||||
|
vector<MilanLongInt> &QGhostVtx,
|
||||||
|
vector<MilanLongInt> &QMsgType,
|
||||||
|
vector<MilanInt> &QOwner,
|
||||||
|
vector<MilanLongInt> &privateQLocalVtx,
|
||||||
|
vector<MilanLongInt> &privateQGhostVtx,
|
||||||
|
vector<MilanLongInt> &privateQMsgType,
|
||||||
|
vector<MilanInt> &privateQOwner);
|
||||||
|
|
||||||
|
void processMatchedVerticesAndSendMessages(
|
||||||
|
MilanLongInt NLVer,
|
||||||
|
vector<MilanLongInt> &UChunkBeingProcessed,
|
||||||
|
vector<MilanLongInt> &U,
|
||||||
|
vector<MilanLongInt> &privateU,
|
||||||
|
MilanLongInt StartIndex,
|
||||||
|
MilanLongInt EndIndex,
|
||||||
|
MilanLongInt *myCardPtr,
|
||||||
|
MilanLongInt *msgIndPtr,
|
||||||
|
MilanLongInt *NumMessagesBundledPtr,
|
||||||
|
MilanLongInt *SPtr,
|
||||||
|
MilanLongInt *verLocPtr,
|
||||||
|
MilanLongInt *verLocInd,
|
||||||
|
MilanLongInt *verDistance,
|
||||||
|
MilanLongInt *PCounter,
|
||||||
|
vector<MilanLongInt> &Counter,
|
||||||
|
MilanInt myRank,
|
||||||
|
MilanInt numProcs,
|
||||||
|
MilanLongInt *candidateMate,
|
||||||
|
vector<MilanLongInt> &GMate,
|
||||||
|
MilanLongInt *Mate,
|
||||||
|
map<MilanLongInt, MilanLongInt> &Ghost2LocalMap,
|
||||||
|
MilanReal *edgeLocWeight,
|
||||||
|
vector<MilanLongInt> &QLocalVtx,
|
||||||
|
vector<MilanLongInt> &QGhostVtx,
|
||||||
|
vector<MilanLongInt> &QMsgType,
|
||||||
|
vector<MilanInt> &QOwner,
|
||||||
|
vector<MilanLongInt> &privateQLocalVtx,
|
||||||
|
vector<MilanLongInt> &privateQGhostVtx,
|
||||||
|
vector<MilanLongInt> &privateQMsgType,
|
||||||
|
vector<MilanInt> &privateQOwner,
|
||||||
|
MPI_Comm comm,
|
||||||
|
MilanLongInt *msgActual,
|
||||||
|
vector<MilanLongInt> &Message);
|
||||||
|
|
||||||
|
void sendBundledMessages(MilanLongInt *numGhostEdgesPtr,
|
||||||
|
MilanInt *BufferSizePtr,
|
||||||
|
MilanLongInt *Buffer,
|
||||||
|
vector<MilanLongInt> &PCumulative,
|
||||||
|
vector<MilanLongInt> &PMessageBundle,
|
||||||
|
vector<MilanLongInt> &PSizeInfoMessages,
|
||||||
|
MilanLongInt *PCounter,
|
||||||
|
MilanLongInt NumMessagesBundled,
|
||||||
|
MilanLongInt *msgActualPtr,
|
||||||
|
MilanLongInt *MessageIndexPtr,
|
||||||
|
MilanInt numProcs,
|
||||||
|
MilanInt myRank,
|
||||||
|
MPI_Comm comm,
|
||||||
|
vector<MilanLongInt> &QLocalVtx,
|
||||||
|
vector<MilanLongInt> &QGhostVtx,
|
||||||
|
vector<MilanLongInt> &QMsgType,
|
||||||
|
vector<MilanInt> &QOwner,
|
||||||
|
vector<MPI_Request> &SRequest,
|
||||||
|
vector<MPI_Status> &SStatus);
|
||||||
|
|
||||||
|
void processMessages(
|
||||||
|
MilanLongInt NLVer,
|
||||||
|
MilanLongInt *Mate,
|
||||||
|
MilanLongInt *candidateMate,
|
||||||
|
map<MilanLongInt, MilanLongInt> &Ghost2LocalMap,
|
||||||
|
vector<MilanLongInt> &GMate,
|
||||||
|
vector<MilanLongInt> &Counter,
|
||||||
|
MilanLongInt StartIndex,
|
||||||
|
MilanLongInt EndIndex,
|
||||||
|
MilanLongInt *myCardPtr,
|
||||||
|
MilanLongInt *msgIndPtr,
|
||||||
|
MilanLongInt *msgActualPtr,
|
||||||
|
MilanReal *edgeLocWeight,
|
||||||
|
MilanLongInt *verDistance,
|
||||||
|
MilanLongInt *verLocPtr,
|
||||||
|
MilanLongInt k,
|
||||||
|
MilanLongInt *verLocInd,
|
||||||
|
MilanInt numProcs,
|
||||||
|
MilanInt myRank,
|
||||||
|
MPI_Comm comm,
|
||||||
|
vector<MilanLongInt> &Message,
|
||||||
|
MilanLongInt numGhostEdges,
|
||||||
|
MilanLongInt u,
|
||||||
|
MilanLongInt v,
|
||||||
|
MilanLongInt *SPtr,
|
||||||
|
vector<MilanLongInt> &U);
|
||||||
|
|
||||||
|
void extractUChunk(
|
||||||
|
vector<MilanLongInt> &UChunkBeingProcessed,
|
||||||
|
vector<MilanLongInt> &U,
|
||||||
|
vector<MilanLongInt> &privateU);
|
||||||
|
|
||||||
|
void dalgoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateCMP(
|
||||||
|
MilanLongInt NLVer, MilanLongInt NLEdge,
|
||||||
|
MilanLongInt *verLocPtr, MilanLongInt *verLocInd, MilanReal *edgeLocWeight,
|
||||||
|
MilanLongInt *verDistance,
|
||||||
|
MilanLongInt *Mate,
|
||||||
|
MilanInt myRank, MilanInt numProcs, MPI_Comm comm,
|
||||||
|
MilanLongInt *msgIndSent, MilanLongInt *msgActualSent, MilanReal *msgPercent,
|
||||||
|
MilanReal *ph0_time, MilanReal *ph1_time, MilanReal *ph2_time,
|
||||||
|
MilanLongInt *ph1_card, MilanLongInt *ph2_card);
|
||||||
|
|
||||||
|
void dalgoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateC(
|
||||||
|
MilanLongInt NLVer, MilanLongInt NLEdge,
|
||||||
|
MilanLongInt *verLocPtr, MilanLongInt *verLocInd, MilanReal *edgeLocWeight,
|
||||||
|
MilanLongInt *verDistance,
|
||||||
|
MilanLongInt *Mate,
|
||||||
|
MilanInt myRank, MilanInt numProcs, MPI_Comm comm,
|
||||||
|
MilanLongInt *msgIndSent, MilanLongInt *msgActualSent, MilanReal *msgPercent,
|
||||||
|
MilanReal *ph0_time, MilanReal *ph1_time, MilanReal *ph2_time,
|
||||||
|
MilanLongInt *ph1_card, MilanLongInt *ph2_card);
|
||||||
|
|
||||||
|
void salgoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateC(
|
||||||
|
MilanLongInt NLVer, MilanLongInt NLEdge,
|
||||||
|
MilanLongInt *verLocPtr, MilanLongInt *verLocInd, MilanFloat *edgeLocWeight,
|
||||||
|
MilanLongInt *verDistance,
|
||||||
|
MilanLongInt *Mate,
|
||||||
|
MilanInt myRank, MilanInt numProcs, MPI_Comm comm,
|
||||||
|
MilanLongInt *msgIndSent, MilanLongInt *msgActualSent, MilanReal *msgPercent,
|
||||||
|
MilanReal *ph0_time, MilanReal *ph1_time, MilanReal *ph2_time,
|
||||||
|
MilanLongInt *ph1_card, MilanLongInt *ph2_card);
|
||||||
|
|
||||||
|
void dMatchBoxPC(MilanLongInt NLVer, MilanLongInt NLEdge,
|
||||||
|
MilanLongInt *verLocPtr, MilanLongInt *verLocInd, MilanReal *edgeLocWeight,
|
||||||
|
MilanLongInt *verDistance,
|
||||||
|
MilanLongInt *Mate,
|
||||||
|
MilanInt myRank, MilanInt numProcs, MilanInt icomm,
|
||||||
|
MilanLongInt *msgIndSent, MilanLongInt *msgActualSent, MilanReal *msgPercent,
|
||||||
|
MilanReal *ph0_time, MilanReal *ph1_time, MilanReal *ph2_time,
|
||||||
|
MilanLongInt *ph1_card, MilanLongInt *ph2_card);
|
||||||
|
|
||||||
|
void sMatchBoxPC(MilanLongInt NLVer, MilanLongInt NLEdge,
|
||||||
|
MilanLongInt *verLocPtr, MilanLongInt *verLocInd, MilanFloat *edgeLocWeight,
|
||||||
|
MilanLongInt *verDistance,
|
||||||
|
MilanLongInt *Mate,
|
||||||
|
MilanInt myRank, MilanInt numProcs, MilanInt icomm,
|
||||||
|
MilanLongInt *msgIndSent, MilanLongInt *msgActualSent, MilanReal *msgPercent,
|
||||||
|
MilanReal *ph0_time, MilanReal *ph1_time, MilanReal *ph2_time,
|
||||||
|
MilanLongInt *ph1_card, MilanLongInt *ph2_card);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -72,12 +72,6 @@
|
|||||||
|
|
||||||
#ifdef SERIAL_MPI
|
#ifdef SERIAL_MPI
|
||||||
#else
|
#else
|
||||||
//MPI type map
|
|
||||||
template<typename T> MPI_Datatype TypeMap();
|
|
||||||
template<> inline MPI_Datatype TypeMap<int64_t>() { return MPI_LONG_LONG; }
|
|
||||||
template<> inline MPI_Datatype TypeMap<int>() { return MPI_INT; }
|
|
||||||
template<> inline MPI_Datatype TypeMap<double>() { return MPI_DOUBLE; }
|
|
||||||
template<> inline MPI_Datatype TypeMap<float>() { return MPI_FLOAT; }
|
|
||||||
|
|
||||||
// DOUBLE PRECISION VERSION
|
// DOUBLE PRECISION VERSION
|
||||||
//WARNING: The vertex block on a given rank is contiguous
|
//WARNING: The vertex block on a given rank is contiguous
|
||||||
|
|||||||
+554
@@ -0,0 +1,554 @@
|
|||||||
|
#include "MatchBoxPC.h"
|
||||||
|
|
||||||
|
// ***********************************************************************
|
||||||
|
//
|
||||||
|
// MatchboxP: A C++ library for approximate weighted matching
|
||||||
|
// Mahantesh Halappanavar (hala@pnnl.gov)
|
||||||
|
// Pacific Northwest National Laboratory
|
||||||
|
//
|
||||||
|
// ***********************************************************************
|
||||||
|
//
|
||||||
|
// Copyright (2021) Battelle Memorial Institute
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
// Redistribution and use in source and binary forms, with or without
|
||||||
|
// modification, are permitted provided that the following conditions
|
||||||
|
// are met:
|
||||||
|
//
|
||||||
|
// 1. Redistributions of source code must retain the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer.
|
||||||
|
//
|
||||||
|
// 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
// notice, this list of conditions and the following disclaimer in the
|
||||||
|
// documentation and/or other materials provided with the distribution.
|
||||||
|
//
|
||||||
|
// 3. Neither the name of the copyright holder nor the names of its
|
||||||
|
// contributors may be used to endorse or promote products derived from
|
||||||
|
// this software without specific prior written permission.
|
||||||
|
//
|
||||||
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
// COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
//
|
||||||
|
// ************************************************************************
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/////////////////////////// DOMINATING EDGES MODEL ///////////////////////////////////
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/* Function : algoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMate()
|
||||||
|
*
|
||||||
|
* Date : New update: Feb 17, 2019, Richland, Washington.
|
||||||
|
* Date : Original development: May 17, 2009, E&CS Bldg.
|
||||||
|
*
|
||||||
|
* Purpose : Compute Approximate Maximum Weight Matching in Linear Time
|
||||||
|
*
|
||||||
|
* Args : inputMatrix - instance of Compressed-Col format of Matrix
|
||||||
|
* Mate - The Mate array
|
||||||
|
*
|
||||||
|
* Returns : By Value: (void)
|
||||||
|
* By Reference: Mate
|
||||||
|
*
|
||||||
|
* Comments : 1/2 Approx Algorithm. Picks the locally available heaviest edge.
|
||||||
|
* Assumption: The Mate Array is empty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
NLVer = #of vertices, NLEdge = #of edges
|
||||||
|
CSR/CSC/Compressed format: verLocPtr = Pointer, verLocInd = Index, edgeLocWeight = edge weights (positive real numbers)
|
||||||
|
verDistance = A vector of size |P|+1 containing the cumulative number of vertices per process
|
||||||
|
Mate = A vector of size |V_p| (local subgraph) to store the output (matching)
|
||||||
|
MPI: myRank, numProcs, comm,
|
||||||
|
Statistics: msgIndSent, msgActualSent, msgPercent : Size: |P| number of processes in the comm-world
|
||||||
|
Statistics: ph0_time, ph1_time, ph2_time: Runtimes
|
||||||
|
Statistics: ph1_card, ph2_card : Size: |P| number of processes in the comm-world (number of matched edges in Phase 1 and Phase 2)
|
||||||
|
*/
|
||||||
|
//#define DEBUG_HANG_
|
||||||
|
#ifdef SERIAL_MPI
|
||||||
|
#else
|
||||||
|
|
||||||
|
// DOUBLE PRECISION VERSION
|
||||||
|
// WARNING: The vertex block on a given rank is contiguous
|
||||||
|
void dalgoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMateCMP(
|
||||||
|
MilanLongInt NLVer, MilanLongInt NLEdge,
|
||||||
|
MilanLongInt *verLocPtr, MilanLongInt *verLocInd,
|
||||||
|
MilanReal *edgeLocWeight,
|
||||||
|
MilanLongInt *verDistance,
|
||||||
|
MilanLongInt *Mate,
|
||||||
|
MilanInt myRank, MilanInt numProcs, MPI_Comm comm,
|
||||||
|
MilanLongInt *msgIndSent, MilanLongInt *msgActualSent,
|
||||||
|
MilanReal *msgPercent,
|
||||||
|
MilanReal *ph0_time, MilanReal *ph1_time, MilanReal *ph2_time,
|
||||||
|
MilanLongInt *ph1_card, MilanLongInt *ph2_card)
|
||||||
|
{
|
||||||
|
|
||||||
|
/*
|
||||||
|
* verDistance: it's a vector long as the number of processors.
|
||||||
|
* verDistance[i] contains the first node index of the i-th processor
|
||||||
|
* verDistance[i + 1] contains the last node index of the i-th processor
|
||||||
|
* NLVer: number of elements in the LocPtr
|
||||||
|
* NLEdge: number of edges assigned to the current processor
|
||||||
|
*
|
||||||
|
* Contains the portion of matrix assigned to the processor in
|
||||||
|
* Yale notation
|
||||||
|
* verLocInd: contains the positions on row of the matrix
|
||||||
|
* verLocPtr: i-th value is the position of the first element on the i-th row and
|
||||||
|
* i+1-th value is the position of the first element on the i+1-th row
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(SERIAL_MPI)
|
||||||
|
#ifdef PRINT_DEBUG_INFO_
|
||||||
|
cout << "\n(" << myRank << ")Within algoEdgeApproxDominatingEdgesLinearSearchMessageBundling()";
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PRINT_DEBUG_INFO_
|
||||||
|
cout << "\n(" << myRank << ") verDistance [" ;
|
||||||
|
for (int i = 0; i < numProcs; i++)
|
||||||
|
cout << verDistance[i] << "," << verDistance[i+1];
|
||||||
|
cout << "]\n";
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
#ifdef DEBUG_HANG_
|
||||||
|
if (myRank == 0) {
|
||||||
|
cout << "\n(" << myRank << ") verDistance [" ;
|
||||||
|
for (int i = 0; i < numProcs; i++)
|
||||||
|
cout << verDistance[i] << "," ;
|
||||||
|
cout << verDistance[numProcs]<< "]\n";
|
||||||
|
}
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MilanLongInt StartIndex = verDistance[myRank]; // The starting vertex owned by the current rank
|
||||||
|
MilanLongInt EndIndex = verDistance[myRank + 1] - 1; // The ending vertex owned by the current rank
|
||||||
|
|
||||||
|
MPI_Status computeStatus;
|
||||||
|
|
||||||
|
MilanLongInt msgActual = 0, msgInd = 0;
|
||||||
|
MilanReal heaviestEdgeWt = 0.0f; // Assumes positive weight
|
||||||
|
MilanReal startTime, finishTime;
|
||||||
|
|
||||||
|
startTime = MPI_Wtime();
|
||||||
|
|
||||||
|
// Data structures for sending and receiving messages:
|
||||||
|
vector<MilanLongInt> Message; // [ u, v, message_type ]
|
||||||
|
Message.resize(3, -1);
|
||||||
|
// Data structures for Message Bundling:
|
||||||
|
// Although up to two messages can be sent along any cross edge,
|
||||||
|
// only one message will be sent in the initialization phase -
|
||||||
|
// one of: REQUEST/FAILURE/SUCCESS
|
||||||
|
vector<MilanLongInt> QLocalVtx, QGhostVtx, QMsgType;
|
||||||
|
vector<MilanInt> QOwner; // Changed by Fabio to be an integer, addresses needs to be integers!
|
||||||
|
|
||||||
|
MilanLongInt *PCounter = new MilanLongInt[numProcs];
|
||||||
|
for (int i = 0; i < numProcs; i++)
|
||||||
|
PCounter[i] = 0;
|
||||||
|
|
||||||
|
MilanLongInt NumMessagesBundled = 0;
|
||||||
|
// TODO when the last computational section will be refactored this could be eliminated
|
||||||
|
MilanInt ghostOwner = 0; // Changed by Fabio to be an integer, addresses needs to be integers!
|
||||||
|
MilanLongInt *candidateMate = nullptr;
|
||||||
|
#ifdef PRINT_DEBUG_INFO_
|
||||||
|
cout << "\n(" << myRank << ")NV: " << NLVer << " Edges: " << NLEdge;
|
||||||
|
fflush(stdout);
|
||||||
|
cout << "\n(" << myRank << ")StartIndex: " << StartIndex << " EndIndex: " << EndIndex;
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
// Other Variables:
|
||||||
|
MilanLongInt u = -1, v = -1, w = -1, i = 0;
|
||||||
|
MilanLongInt k = -1, adj1 = -1, adj2 = -1;
|
||||||
|
MilanLongInt k1 = -1, adj11 = -1, adj12 = -1;
|
||||||
|
MilanLongInt myCard = 0;
|
||||||
|
|
||||||
|
// Build the Ghost Vertex Set: Vg
|
||||||
|
map<MilanLongInt, MilanLongInt> Ghost2LocalMap; // Map each ghost vertex to a local vertex
|
||||||
|
vector<MilanLongInt> Counter; // Store the edge count for each ghost vertex
|
||||||
|
MilanLongInt numGhostVertices = 0, numGhostEdges = 0; // Number of Ghost vertices
|
||||||
|
|
||||||
|
#ifdef PRINT_DEBUG_INFO_
|
||||||
|
cout << "\n(" << myRank << ")About to compute Ghost Vertices...";
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
#ifdef DEBUG_HANG_
|
||||||
|
if (myRank == 0)
|
||||||
|
cout << "\n(" << myRank << ")About to compute Ghost Vertices...";
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Define Adjacency Lists for Ghost Vertices:
|
||||||
|
// cout<<"Building Ghost data structures ... \n\n";
|
||||||
|
vector<MilanLongInt> verGhostPtr, verGhostInd, tempCounter;
|
||||||
|
// Mate array for ghost vertices:
|
||||||
|
vector<MilanLongInt> GMate; // Proportional to the number of ghost vertices
|
||||||
|
MilanLongInt S;
|
||||||
|
MilanLongInt privateMyCard = 0;
|
||||||
|
vector<MilanLongInt> PCumulative, PMessageBundle, PSizeInfoMessages;
|
||||||
|
vector<MPI_Request> SRequest; // Requests that are used for each send message
|
||||||
|
vector<MPI_Status> SStatus; // Status of sent messages, used in MPI_Wait
|
||||||
|
MilanLongInt MessageIndex = 0; // Pointer for current message
|
||||||
|
MilanInt BufferSize;
|
||||||
|
MilanLongInt *Buffer;
|
||||||
|
|
||||||
|
vector<MilanLongInt> privateQLocalVtx, privateQGhostVtx, privateQMsgType;
|
||||||
|
vector<MilanInt> privateQOwner;
|
||||||
|
vector<MilanLongInt> U, privateU;
|
||||||
|
|
||||||
|
initialize(NLVer, NLEdge, StartIndex,
|
||||||
|
EndIndex, &numGhostEdges,
|
||||||
|
&numGhostVertices, &S,
|
||||||
|
verLocInd, verLocPtr,
|
||||||
|
Ghost2LocalMap, Counter,
|
||||||
|
verGhostPtr, verGhostInd,
|
||||||
|
tempCounter, GMate,
|
||||||
|
Message, QLocalVtx,
|
||||||
|
QGhostVtx, QMsgType, QOwner,
|
||||||
|
candidateMate, U,
|
||||||
|
privateU,
|
||||||
|
privateQLocalVtx,
|
||||||
|
privateQGhostVtx,
|
||||||
|
privateQMsgType,
|
||||||
|
privateQOwner);
|
||||||
|
|
||||||
|
finishTime = MPI_Wtime();
|
||||||
|
*ph0_time = finishTime - startTime; // Time taken for Phase-0: Initialization
|
||||||
|
#ifdef DEBUG_HANG_
|
||||||
|
cout << myRank << " Finished initialization" << endl;
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
startTime = MPI_Wtime();
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////////// INITIALIZATION /////////////////////////////////////
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Compute the Initial Matching Set:
|
||||||
|
|
||||||
|
/*
|
||||||
|
* OMP PARALLEL_COMPUTE_CANDIDATE_MATE_B has been splitted from
|
||||||
|
* PARALLEL_PROCESS_EXPOSED_VERTEX_B in order to better parallelize
|
||||||
|
* the two.
|
||||||
|
* PARALLEL_COMPUTE_CANDIDATE_MATE_B is now totally parallel.
|
||||||
|
*/
|
||||||
|
|
||||||
|
PARALLEL_COMPUTE_CANDIDATE_MATE_B(NLVer,
|
||||||
|
verLocPtr,
|
||||||
|
verLocInd,
|
||||||
|
myRank,
|
||||||
|
edgeLocWeight,
|
||||||
|
candidateMate);
|
||||||
|
|
||||||
|
#ifdef DEBUG_HANG_
|
||||||
|
cout << myRank << " Finished Exposed Vertex" << endl;
|
||||||
|
fflush(stdout);
|
||||||
|
#if 0
|
||||||
|
cout << myRank << " candidateMate after parallelCompute " <<endl;
|
||||||
|
for (int i=0; i<NLVer; i++) {
|
||||||
|
cout << candidateMate[i] << " " ;
|
||||||
|
}
|
||||||
|
cout << endl;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* PARALLEL_PROCESS_EXPOSED_VERTEX_B
|
||||||
|
* TODO: write comment
|
||||||
|
*
|
||||||
|
* TODO: Test when it's actually more efficient to execute this code
|
||||||
|
* in parallel.
|
||||||
|
*/
|
||||||
|
PARALLEL_PROCESS_EXPOSED_VERTEX_B(NLVer,
|
||||||
|
candidateMate,
|
||||||
|
verLocInd,
|
||||||
|
verLocPtr,
|
||||||
|
StartIndex,
|
||||||
|
EndIndex,
|
||||||
|
Mate,
|
||||||
|
GMate,
|
||||||
|
Ghost2LocalMap,
|
||||||
|
edgeLocWeight,
|
||||||
|
&myCard,
|
||||||
|
&msgInd,
|
||||||
|
&NumMessagesBundled,
|
||||||
|
&S,
|
||||||
|
verDistance,
|
||||||
|
PCounter,
|
||||||
|
Counter,
|
||||||
|
myRank,
|
||||||
|
numProcs,
|
||||||
|
U,
|
||||||
|
privateU,
|
||||||
|
QLocalVtx,
|
||||||
|
QGhostVtx,
|
||||||
|
QMsgType,
|
||||||
|
QOwner,
|
||||||
|
privateQLocalVtx,
|
||||||
|
privateQGhostVtx,
|
||||||
|
privateQMsgType,
|
||||||
|
privateQOwner);
|
||||||
|
|
||||||
|
tempCounter.clear(); // Do not need this any more
|
||||||
|
|
||||||
|
#ifdef DEBUG_HANG_
|
||||||
|
cout << myRank << " Finished Exposed Vertex" << endl;
|
||||||
|
fflush(stdout);
|
||||||
|
#if 0
|
||||||
|
cout << myRank << " Mate after Exposed Vertices " <<endl;
|
||||||
|
for (int i=0; i<NLVer; i++) {
|
||||||
|
cout << Mate[i] << " " ;
|
||||||
|
}
|
||||||
|
cout << endl;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/////////////////////////// PROCESS MATCHED VERTICES //////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// TODO what would be the optimal UCHUNK
|
||||||
|
vector<MilanLongInt> UChunkBeingProcessed;
|
||||||
|
UChunkBeingProcessed.reserve(UCHUNK);
|
||||||
|
|
||||||
|
processMatchedVertices(NLVer,
|
||||||
|
UChunkBeingProcessed,
|
||||||
|
U,
|
||||||
|
privateU,
|
||||||
|
StartIndex,
|
||||||
|
EndIndex,
|
||||||
|
&myCard,
|
||||||
|
&msgInd,
|
||||||
|
&NumMessagesBundled,
|
||||||
|
&S,
|
||||||
|
verLocPtr,
|
||||||
|
verLocInd,
|
||||||
|
verDistance,
|
||||||
|
PCounter,
|
||||||
|
Counter,
|
||||||
|
myRank,
|
||||||
|
numProcs,
|
||||||
|
candidateMate,
|
||||||
|
GMate,
|
||||||
|
Mate,
|
||||||
|
Ghost2LocalMap,
|
||||||
|
edgeLocWeight,
|
||||||
|
QLocalVtx,
|
||||||
|
QGhostVtx,
|
||||||
|
QMsgType,
|
||||||
|
QOwner,
|
||||||
|
privateQLocalVtx,
|
||||||
|
privateQGhostVtx,
|
||||||
|
privateQMsgType,
|
||||||
|
privateQOwner);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG_HANG_
|
||||||
|
cout << myRank << " Finished Process Vertices" << endl;
|
||||||
|
fflush(stdout);
|
||||||
|
#if 0
|
||||||
|
cout << myRank << " Mate after Matched Vertices " <<endl;
|
||||||
|
for (int i=0; i<NLVer; i++) {
|
||||||
|
cout << Mate[i] << " " ;
|
||||||
|
}
|
||||||
|
cout << endl;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
///////////////////////////// SEND BUNDLED MESSAGES /////////////////////////////////////
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
sendBundledMessages(&numGhostEdges,
|
||||||
|
&BufferSize,
|
||||||
|
Buffer,
|
||||||
|
PCumulative,
|
||||||
|
PMessageBundle,
|
||||||
|
PSizeInfoMessages,
|
||||||
|
PCounter,
|
||||||
|
NumMessagesBundled,
|
||||||
|
&msgActual,
|
||||||
|
&MessageIndex,
|
||||||
|
numProcs,
|
||||||
|
myRank,
|
||||||
|
comm,
|
||||||
|
QLocalVtx,
|
||||||
|
QGhostVtx,
|
||||||
|
QMsgType,
|
||||||
|
QOwner,
|
||||||
|
SRequest,
|
||||||
|
SStatus);
|
||||||
|
|
||||||
|
///////////////////////// END OF SEND BUNDLED MESSAGES //////////////////////////////////
|
||||||
|
|
||||||
|
finishTime = MPI_Wtime();
|
||||||
|
*ph1_time = finishTime - startTime; // Time taken for Phase-1
|
||||||
|
|
||||||
|
#ifdef DEBUG_HANG_
|
||||||
|
cout << myRank << " Finished sendBundles" << endl;
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*ph1_card = myCard; // Cardinality at the end of Phase-1
|
||||||
|
startTime = MPI_Wtime();
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
//////////////////////////////////////// MAIN LOOP //////////////////////////////////////
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Main While Loop:
|
||||||
|
#ifdef PRINT_DEBUG_INFO_
|
||||||
|
cout << "\n(" << myRank << "=========================************===============================" << endl;
|
||||||
|
fflush(stdout);
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
#ifdef PRINT_DEBUG_INFO_
|
||||||
|
cout << "\n(" << myRank << ")Entering While(true) loop..";
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
#ifdef PRINT_DEBUG_INFO_
|
||||||
|
cout << "\n(" << myRank << "=========================************===============================" << endl;
|
||||||
|
fflush(stdout);
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
#ifdef DEBUG_HANG_
|
||||||
|
//if (myRank == 0)
|
||||||
|
cout << "\n(" << myRank << ") Main loop" << endl;
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/////////////////////////// PROCESS MATCHED VERTICES //////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
processMatchedVerticesAndSendMessages(NLVer,
|
||||||
|
UChunkBeingProcessed,
|
||||||
|
U,
|
||||||
|
privateU,
|
||||||
|
StartIndex,
|
||||||
|
EndIndex,
|
||||||
|
&myCard,
|
||||||
|
&msgInd,
|
||||||
|
&NumMessagesBundled,
|
||||||
|
&S,
|
||||||
|
verLocPtr,
|
||||||
|
verLocInd,
|
||||||
|
verDistance,
|
||||||
|
PCounter,
|
||||||
|
Counter,
|
||||||
|
myRank,
|
||||||
|
numProcs,
|
||||||
|
candidateMate,
|
||||||
|
GMate,
|
||||||
|
Mate,
|
||||||
|
Ghost2LocalMap,
|
||||||
|
edgeLocWeight,
|
||||||
|
QLocalVtx,
|
||||||
|
QGhostVtx,
|
||||||
|
QMsgType,
|
||||||
|
QOwner,
|
||||||
|
privateQLocalVtx,
|
||||||
|
privateQGhostVtx,
|
||||||
|
privateQMsgType,
|
||||||
|
privateQOwner,
|
||||||
|
comm,
|
||||||
|
&msgActual,
|
||||||
|
Message);
|
||||||
|
|
||||||
|
///////////////////////// END OF PROCESS MATCHED VERTICES /////////////////////////
|
||||||
|
|
||||||
|
//// BREAK IF NO MESSAGES EXPECTED /////////
|
||||||
|
#ifdef DEBUG_HANG_
|
||||||
|
#if 0
|
||||||
|
cout << myRank << " Mate after ProcessMatchedAndSend phase "<<S <<endl;
|
||||||
|
for (int i=0; i<NLVer; i++) {
|
||||||
|
cout << Mate[i] << " " ;
|
||||||
|
}
|
||||||
|
cout << endl;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef PRINT_DEBUG_INFO_
|
||||||
|
cout << "\n(" << myRank << ")Deciding whether to break: S= " << S << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (S == 0) {
|
||||||
|
#ifdef DEBUG_HANG_
|
||||||
|
cout << "\n(" << myRank << ") Breaking out" << endl;
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/////////////////////////// PROCESS MESSAGES //////////////////////////////////////
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
processMessages(NLVer,
|
||||||
|
Mate,
|
||||||
|
candidateMate,
|
||||||
|
Ghost2LocalMap,
|
||||||
|
GMate,
|
||||||
|
Counter,
|
||||||
|
StartIndex,
|
||||||
|
EndIndex,
|
||||||
|
&myCard,
|
||||||
|
&msgInd,
|
||||||
|
&msgActual,
|
||||||
|
edgeLocWeight,
|
||||||
|
verDistance,
|
||||||
|
verLocPtr,
|
||||||
|
k,
|
||||||
|
verLocInd,
|
||||||
|
numProcs,
|
||||||
|
myRank,
|
||||||
|
comm,
|
||||||
|
Message,
|
||||||
|
numGhostEdges,
|
||||||
|
u,
|
||||||
|
v,
|
||||||
|
&S,
|
||||||
|
U);
|
||||||
|
|
||||||
|
///////////////////////// END OF PROCESS MESSAGES /////////////////////////////////
|
||||||
|
#ifdef DEBUG_HANG_
|
||||||
|
#if 0
|
||||||
|
cout << myRank << " Mate after ProcessMessages phase "<<S <<endl;
|
||||||
|
for (int i=0; i<NLVer; i++) {
|
||||||
|
cout << Mate[i] << " " ;
|
||||||
|
}
|
||||||
|
cout << endl;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifdef PRINT_DEBUG_INFO_
|
||||||
|
cout << "\n(" << myRank << ")Finished Message processing phase: S= " << S;
|
||||||
|
fflush(stdout);
|
||||||
|
cout << "\n(" << myRank << ")** SENT : ACTUAL= " << msgActual;
|
||||||
|
fflush(stdout);
|
||||||
|
cout << "\n(" << myRank << ")** SENT : INDIVIDUAL= " << msgInd << endl;
|
||||||
|
fflush(stdout);
|
||||||
|
#endif
|
||||||
|
} // End of while (true)
|
||||||
|
|
||||||
|
clean(NLVer,
|
||||||
|
myRank,
|
||||||
|
MessageIndex,
|
||||||
|
SRequest,
|
||||||
|
SStatus,
|
||||||
|
BufferSize,
|
||||||
|
Buffer,
|
||||||
|
msgActual,
|
||||||
|
msgActualSent,
|
||||||
|
msgInd,
|
||||||
|
msgIndSent,
|
||||||
|
NumMessagesBundled,
|
||||||
|
msgPercent);
|
||||||
|
|
||||||
|
finishTime = MPI_Wtime();
|
||||||
|
*ph2_time = finishTime - startTime; // Time taken for Phase-2
|
||||||
|
*ph2_card = myCard; // Cardinality at the end of Phase-2
|
||||||
|
}
|
||||||
|
// End of algoDistEdgeApproxDomEdgesLinearSearchMesgBndlSmallMate
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -83,8 +83,8 @@ subroutine amg_c_dec_aggregator_build_tprol(ag,parms,ag_data,&
|
|||||||
class(amg_c_dec_aggregator_type), target, intent(inout) :: ag
|
class(amg_c_dec_aggregator_type), target, intent(inout) :: ag
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(amg_saggr_data), intent(in) :: ag_data
|
type(amg_saggr_data), intent(in) :: ag_data
|
||||||
type(psb_cspmat_type), intent(in) :: a
|
type(psb_cspmat_type), intent(inout) :: a
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
|
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
|
||||||
type(psb_lcspmat_type), intent(out) :: t_prol
|
type(psb_lcspmat_type), intent(out) :: t_prol
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
@@ -97,6 +97,8 @@ subroutine amg_c_dec_aggregator_build_tprol(ag,parms,ag_data,&
|
|||||||
integer(psb_lpk_) :: ntaggr
|
integer(psb_lpk_) :: ntaggr
|
||||||
integer(psb_ipk_) :: debug_level, debug_unit
|
integer(psb_ipk_) :: debug_level, debug_unit
|
||||||
logical :: clean_zeros
|
logical :: clean_zeros
|
||||||
|
integer(psb_ipk_), save :: idx_map_bld=-1, idx_map_tprol=-1
|
||||||
|
logical, parameter :: do_timings=.false.
|
||||||
|
|
||||||
name='amg_c_dec_aggregator_tprol'
|
name='amg_c_dec_aggregator_tprol'
|
||||||
call psb_erractionsave(err_act)
|
call psb_erractionsave(err_act)
|
||||||
@@ -108,6 +110,10 @@ subroutine amg_c_dec_aggregator_build_tprol(ag,parms,ag_data,&
|
|||||||
info = psb_success_
|
info = psb_success_
|
||||||
ctxt = desc_a%get_context()
|
ctxt = desc_a%get_context()
|
||||||
call psb_info(ctxt,me,np)
|
call psb_info(ctxt,me,np)
|
||||||
|
if ((do_timings).and.(idx_map_bld==-1)) &
|
||||||
|
& idx_map_bld = psb_get_timer_idx("DEC_TPROL: map_bld")
|
||||||
|
if ((do_timings).and.(idx_map_tprol==-1)) &
|
||||||
|
& idx_map_tprol = psb_get_timer_idx("DEC_TPROL: map_tprol")
|
||||||
|
|
||||||
call amg_check_def(parms%ml_cycle,'Multilevel cycle',&
|
call amg_check_def(parms%ml_cycle,'Multilevel cycle',&
|
||||||
& amg_mult_ml_,is_legal_ml_cycle)
|
& amg_mult_ml_,is_legal_ml_cycle)
|
||||||
@@ -121,10 +127,14 @@ subroutine amg_c_dec_aggregator_build_tprol(ag,parms,ag_data,&
|
|||||||
! The decoupled aggregator based on SOC measures ignores
|
! The decoupled aggregator based on SOC measures ignores
|
||||||
! ag_data except for clean_zeros; soc_map_bld is a procedure pointer.
|
! ag_data except for clean_zeros; soc_map_bld is a procedure pointer.
|
||||||
!
|
!
|
||||||
|
if (do_timings) call psb_tic(idx_map_bld)
|
||||||
clean_zeros = ag%do_clean_zeros
|
clean_zeros = ag%do_clean_zeros
|
||||||
call ag%soc_map_bld(parms%aggr_ord,parms%aggr_thresh,clean_zeros,a,desc_a,nlaggr,ilaggr,info)
|
call ag%soc_map_bld(parms%aggr_ord,parms%aggr_thresh,clean_zeros,a,desc_a,nlaggr,ilaggr,info)
|
||||||
|
if (do_timings) call psb_toc(idx_map_bld)
|
||||||
|
if (do_timings) call psb_tic(idx_map_tprol)
|
||||||
|
|
||||||
if (info==psb_success_) call amg_map_to_tprol(desc_a,ilaggr,nlaggr,t_prol,info)
|
if (info==psb_success_) call amg_map_to_tprol(desc_a,ilaggr,nlaggr,t_prol,info)
|
||||||
|
if (do_timings) call psb_toc(idx_map_tprol)
|
||||||
if (info /= psb_success_) then
|
if (info /= psb_success_) then
|
||||||
info=psb_err_from_subroutine_
|
info=psb_err_from_subroutine_
|
||||||
call psb_errpush(info,name,a_err='soc_map_bld/map_to_tprol')
|
call psb_errpush(info,name,a_err='soc_map_bld/map_to_tprol')
|
||||||
|
|||||||
@@ -86,8 +86,8 @@ subroutine amg_c_symdec_aggregator_build_tprol(ag,parms,ag_data,&
|
|||||||
class(amg_c_symdec_aggregator_type), target, intent(inout) :: ag
|
class(amg_c_symdec_aggregator_type), target, intent(inout) :: ag
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(amg_saggr_data), intent(in) :: ag_data
|
type(amg_saggr_data), intent(in) :: ag_data
|
||||||
type(psb_cspmat_type), intent(in) :: a
|
type(psb_cspmat_type), intent(inout) :: a
|
||||||
type(psb_desc_type), intent(in) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
|
integer(psb_lpk_), allocatable, intent(out) :: ilaggr(:),nlaggr(:)
|
||||||
type(psb_lcspmat_type), intent(out) :: op_prol
|
type(psb_lcspmat_type), intent(out) :: op_prol
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
|||||||
@@ -105,7 +105,7 @@
|
|||||||
!
|
!
|
||||||
!
|
!
|
||||||
subroutine amg_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
subroutine amg_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
||||||
& ac,desc_ac,op_prol,op_restr,info)
|
& ac,desc_ac,op_prol,op_restr,t_prol,info)
|
||||||
use psb_base_mod
|
use psb_base_mod
|
||||||
use amg_base_prec_type
|
use amg_base_prec_type
|
||||||
use amg_c_inner_mod, amg_protect_name => amg_caggrmat_minnrg_bld
|
use amg_c_inner_mod, amg_protect_name => amg_caggrmat_minnrg_bld
|
||||||
@@ -117,8 +117,8 @@ subroutine amg_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
type(psb_desc_type), intent(inout) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(psb_lcspmat_type), intent(inout) :: op_prol
|
type(psb_lcspmat_type), intent(inout) :: t_prol
|
||||||
type(psb_lcspmat_type), intent(out) :: ac,op_restr
|
type(psb_cspmat_type), intent(inout) :: op_prol, ac,op_restr
|
||||||
type(psb_desc_type), intent(inout) :: desc_ac
|
type(psb_desc_type), intent(inout) :: desc_ac
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
|
|
||||||
@@ -171,6 +171,8 @@ subroutine amg_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
|
|
||||||
filter_mat = (parms%aggr_filter == amg_filter_mat_)
|
filter_mat = (parms%aggr_filter == amg_filter_mat_)
|
||||||
|
|
||||||
|
!NEEDS TO BE REWORKED !!
|
||||||
|
|
||||||
! naggr: number of local aggregates
|
! naggr: number of local aggregates
|
||||||
! nrow: local rows.
|
! nrow: local rows.
|
||||||
!
|
!
|
||||||
@@ -183,361 +185,361 @@ subroutine amg_caggrmat_minnrg_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
goto 9999
|
goto 9999
|
||||||
end if
|
end if
|
||||||
|
|
||||||
! Get the diagonal D
|
!!$ ! Get the diagonal D
|
||||||
adiag = a%get_diag(info)
|
!!$ adiag = a%get_diag(info)
|
||||||
if (info == psb_success_) &
|
!!$ if (info == psb_success_) &
|
||||||
& call psb_realloc(ncol,adiag,info)
|
!!$ & call psb_realloc(ncol,adiag,info)
|
||||||
if (info == psb_success_) &
|
!!$ if (info == psb_success_) &
|
||||||
& call psb_halo(adiag,desc_a,info)
|
!!$ & call psb_halo(adiag,desc_a,info)
|
||||||
if (info == psb_success_) call a%cp_to_l(la)
|
!!$ if (info == psb_success_) call a%cp_to_l(la)
|
||||||
if (info /= psb_success_) then
|
!!$ if (info /= psb_success_) then
|
||||||
call psb_errpush(psb_err_from_subroutine_,name,a_err='sp_getdiag')
|
!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='sp_getdiag')
|
||||||
goto 9999
|
!!$ goto 9999
|
||||||
end if
|
!!$ end if
|
||||||
|
!!$
|
||||||
do i=1,size(adiag)
|
!!$ do i=1,size(adiag)
|
||||||
if (adiag(i) /= czero) then
|
!!$ if (adiag(i) /= czero) then
|
||||||
adinv(i) = cone / adiag(i)
|
!!$ adinv(i) = cone / adiag(i)
|
||||||
else
|
!!$ else
|
||||||
adinv(i) = cone
|
!!$ adinv(i) = cone
|
||||||
end if
|
!!$ end if
|
||||||
end do
|
!!$ end do
|
||||||
|
!!$
|
||||||
|
!!$
|
||||||
|
!!$
|
||||||
! 1. Allocate Ptilde in sparse matrix form
|
!!$ ! 1. Allocate Ptilde in sparse matrix form
|
||||||
call op_prol%mv_to(tmpcoo)
|
!!$ call op_prol%mv_to(tmpcoo)
|
||||||
call ptilde%mv_from(tmpcoo)
|
!!$ call ptilde%mv_from(tmpcoo)
|
||||||
call ptilde%cscnv(info,type='csr')
|
!!$ call ptilde%cscnv(info,type='csr')
|
||||||
|
!!$
|
||||||
if (info == psb_success_) call la%cscnv(am3,info,type='csr',dupl=psb_dupl_add_)
|
!!$ if (info == psb_success_) call la%cscnv(am3,info,type='csr',dupl=psb_dupl_add_)
|
||||||
if (info == psb_success_) call la%cscnv(da,info,type='csr',dupl=psb_dupl_add_)
|
!!$ if (info == psb_success_) call la%cscnv(da,info,type='csr',dupl=psb_dupl_add_)
|
||||||
if (info /= psb_success_) then
|
!!$ if (info /= psb_success_) then
|
||||||
call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv')
|
!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='spcnv')
|
||||||
goto 9999
|
!!$ goto 9999
|
||||||
end if
|
!!$ end if
|
||||||
if (debug_level >= psb_debug_outer_) &
|
!!$ if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),&
|
!!$ & write(debug_unit,*) me,' ',trim(name),&
|
||||||
& ' Initial copies done.'
|
!!$ & ' Initial copies done.'
|
||||||
|
!!$
|
||||||
call da%scal(adinv,info)
|
!!$ call da%scal(adinv,info)
|
||||||
|
!!$
|
||||||
call psb_spspmm(da,ptilde,dap,info)
|
!!$ call psb_spspmm(da,ptilde,dap,info)
|
||||||
|
!!$
|
||||||
if(info /= psb_success_) then
|
!!$ if(info /= psb_success_) then
|
||||||
call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1')
|
!!$ call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1')
|
||||||
goto 9999
|
!!$ goto 9999
|
||||||
end if
|
!!$ end if
|
||||||
|
!!$
|
||||||
call dap%clone(atmp,info)
|
!!$ call dap%clone(atmp,info)
|
||||||
|
!!$
|
||||||
call psb_sphalo(atmp,desc_a,am4,info,&
|
!!$ call psb_sphalo(atmp,desc_a,am4,info,&
|
||||||
& colcnv=.false.,rowscale=.true.,outfmt='CSR ')
|
!!$ & colcnv=.false.,rowscale=.true.,outfmt='CSR ')
|
||||||
if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=am4)
|
!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=am4)
|
||||||
if (info == psb_success_) call am4%free()
|
!!$ if (info == psb_success_) call am4%free()
|
||||||
|
!!$
|
||||||
call psb_spspmm(da,atmp,dadap,info)
|
!!$ call psb_spspmm(da,atmp,dadap,info)
|
||||||
call atmp%free()
|
!!$ call atmp%free()
|
||||||
|
!!$
|
||||||
! !$ write(0,*) 'Columns of AP',psb_sp_get_ncols(ap)
|
!!$ ! !$ write(0,*) 'Columns of AP',psb_sp_get_ncols(ap)
|
||||||
! !$ write(0,*) 'Columns of ADAP',psb_sp_get_ncols(adap)
|
!!$ ! !$ write(0,*) 'Columns of ADAP',psb_sp_get_ncols(adap)
|
||||||
call dap%mv_to(csc_dap)
|
!!$ call dap%mv_to(csc_dap)
|
||||||
call dadap%mv_to(csc_dadap)
|
!!$ call dadap%mv_to(csc_dadap)
|
||||||
|
!!$
|
||||||
call csc_mat_col_prod(csc_dap,csc_dadap,omp,info)
|
!!$ call csc_mat_col_prod(csc_dap,csc_dadap,omp,info)
|
||||||
call csc_mat_col_prod(csc_dadap,csc_dadap,oden,info)
|
!!$ call csc_mat_col_prod(csc_dadap,csc_dadap,oden,info)
|
||||||
call psb_sum(ctxt,omp)
|
!!$ call psb_sum(ctxt,omp)
|
||||||
call psb_sum(ctxt,oden)
|
!!$ call psb_sum(ctxt,oden)
|
||||||
! !$ write(0,*) trim(name),' OMP :',omp
|
!!$ ! !$ write(0,*) trim(name),' OMP :',omp
|
||||||
! !$ write(0,*) trim(name),' ODEN:',oden
|
!!$ ! !$ write(0,*) trim(name),' ODEN:',oden
|
||||||
|
!!$
|
||||||
omp = omp/oden
|
!!$ omp = omp/oden
|
||||||
|
!!$
|
||||||
! !$ write(0,*) 'Check on output prolongator ',omp(1:min(size(omp),10))
|
!!$ ! !$ write(0,*) 'Check on output prolongator ',omp(1:min(size(omp),10))
|
||||||
if (debug_level >= psb_debug_outer_) &
|
!!$ if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),&
|
!!$ & write(debug_unit,*) me,' ',trim(name),&
|
||||||
& 'Done NUMBMM 1'
|
!!$ & 'Done NUMBMM 1'
|
||||||
|
!!$
|
||||||
call am3%mv_to(acsr3)
|
!!$ call am3%mv_to(acsr3)
|
||||||
! Compute omega_int
|
!!$ ! Compute omega_int
|
||||||
ommx = czero
|
!!$ ommx = czero
|
||||||
do i=1, ncol
|
!!$ do i=1, ncol
|
||||||
if (ilaggr(i) >0) then
|
!!$ if (ilaggr(i) >0) then
|
||||||
omi(i) = omp(ilaggr(i))
|
!!$ omi(i) = omp(ilaggr(i))
|
||||||
else
|
!!$ else
|
||||||
omi(i) = czero
|
!!$ omi(i) = czero
|
||||||
end if
|
!!$ end if
|
||||||
if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i)
|
!!$ if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i)
|
||||||
end do
|
!!$ end do
|
||||||
! Compute omega_fine
|
!!$ ! Compute omega_fine
|
||||||
do i=1, nrow
|
!!$ do i=1, nrow
|
||||||
omf(i) = ommx
|
!!$ omf(i) = ommx
|
||||||
do j=acsr3%irp(i),acsr3%irp(i+1)-1
|
!!$ do j=acsr3%irp(i),acsr3%irp(i+1)-1
|
||||||
if(abs(omi(acsr3%ja(j))) .lt. abs(omf(i))) omf(i)=omi(acsr3%ja(j))
|
!!$ if(abs(omi(acsr3%ja(j))) .lt. abs(omf(i))) omf(i)=omi(acsr3%ja(j))
|
||||||
end do
|
!!$ end do
|
||||||
!!$ if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = czero
|
!!$ ! ! if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = czero
|
||||||
if(psb_minreal(omf(i)) < szero) omf(i) = czero
|
!!$ if(psb_minreal(omf(i)) < szero) omf(i) = czero
|
||||||
end do
|
!!$ end do
|
||||||
|
!!$
|
||||||
omf(1:nrow) = omf(1:nrow) * adinv(1:nrow)
|
!!$ omf(1:nrow) = omf(1:nrow) * adinv(1:nrow)
|
||||||
|
!!$
|
||||||
if (filter_mat) then
|
!!$ if (filter_mat) then
|
||||||
!
|
!!$ !
|
||||||
! Build the filtered matrix Af from A
|
!!$ ! Build the filtered matrix Af from A
|
||||||
!
|
!!$ !
|
||||||
call la%cscnv(acsrf,info,dupl=psb_dupl_add_)
|
!!$ call la%cscnv(acsrf,info,dupl=psb_dupl_add_)
|
||||||
|
!!$
|
||||||
do i=1,nrow
|
!!$ do i=1,nrow
|
||||||
tmp = czero
|
!!$ tmp = czero
|
||||||
jd = -1
|
!!$ jd = -1
|
||||||
do j=acsrf%irp(i),acsrf%irp(i+1)-1
|
!!$ do j=acsrf%irp(i),acsrf%irp(i+1)-1
|
||||||
if (acsrf%ja(j) == i) jd = j
|
!!$ if (acsrf%ja(j) == i) jd = j
|
||||||
if (abs(acsrf%val(j)) < theta*sqrt(abs(adiag(i)*adiag(acsrf%ja(j))))) then
|
!!$ if (abs(acsrf%val(j)) < theta*sqrt(abs(adiag(i)*adiag(acsrf%ja(j))))) then
|
||||||
tmp=tmp+acsrf%val(j)
|
!!$ tmp=tmp+acsrf%val(j)
|
||||||
acsrf%val(j)=czero
|
!!$ acsrf%val(j)=czero
|
||||||
endif
|
!!$ endif
|
||||||
enddo
|
!!$ enddo
|
||||||
if (jd == -1) then
|
!!$ if (jd == -1) then
|
||||||
write(0,*) 'Wrong input: we need the diagonal!!!!', i
|
!!$ write(0,*) 'Wrong input: we need the diagonal!!!!', i
|
||||||
else
|
!!$ else
|
||||||
acsrf%val(jd)=acsrf%val(jd)-tmp
|
!!$ acsrf%val(jd)=acsrf%val(jd)-tmp
|
||||||
end if
|
!!$ end if
|
||||||
enddo
|
!!$ enddo
|
||||||
! Take out zeroed terms
|
!!$ ! Take out zeroed terms
|
||||||
call acsrf%clean_zeros(info)
|
!!$ call acsrf%clean_zeros(info)
|
||||||
|
!!$
|
||||||
!
|
!!$ !
|
||||||
! Build the smoothed prolongator using the filtered matrix
|
!!$ ! Build the smoothed prolongator using the filtered matrix
|
||||||
!
|
!!$ !
|
||||||
do i=1,acsrf%get_nrows()
|
!!$ do i=1,acsrf%get_nrows()
|
||||||
do j=acsrf%irp(i),acsrf%irp(i+1)-1
|
!!$ do j=acsrf%irp(i),acsrf%irp(i+1)-1
|
||||||
if (acsrf%ja(j) == i) then
|
!!$ if (acsrf%ja(j) == i) then
|
||||||
acsrf%val(j) = cone - omf(i)*acsrf%val(j)
|
!!$ acsrf%val(j) = cone - omf(i)*acsrf%val(j)
|
||||||
else
|
!!$ else
|
||||||
acsrf%val(j) = - omf(i)*acsrf%val(j)
|
!!$ acsrf%val(j) = - omf(i)*acsrf%val(j)
|
||||||
end if
|
!!$ end if
|
||||||
end do
|
!!$ end do
|
||||||
end do
|
!!$ end do
|
||||||
|
!!$
|
||||||
if (debug_level >= psb_debug_outer_) &
|
!!$ if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),&
|
!!$ & write(debug_unit,*) me,' ',trim(name),&
|
||||||
& 'Done gather, going for SYMBMM 1'
|
!!$ & 'Done gather, going for SYMBMM 1'
|
||||||
|
!!$
|
||||||
call af%mv_from(acsrf)
|
!!$ call af%mv_from(acsrf)
|
||||||
!
|
!!$ !
|
||||||
! op_prol = (I-w*D*Af)Ptilde
|
!!$ ! op_prol = (I-w*D*Af)Ptilde
|
||||||
! Doing it this way means to consider diag(Af_i)
|
!!$ ! Doing it this way means to consider diag(Af_i)
|
||||||
!
|
!!$ !
|
||||||
!
|
!!$ !
|
||||||
call psb_spspmm(af,ptilde,op_prol,info)
|
!!$ call psb_spspmm(af,ptilde,op_prol,info)
|
||||||
if (debug_level >= psb_debug_outer_) &
|
!!$ if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),&
|
!!$ & write(debug_unit,*) me,' ',trim(name),&
|
||||||
& 'Done SPSPMM 1'
|
!!$ & 'Done SPSPMM 1'
|
||||||
else
|
!!$ else
|
||||||
!
|
!!$ !
|
||||||
! Build the smoothed prolongator using the original matrix
|
!!$ ! Build the smoothed prolongator using the original matrix
|
||||||
!
|
!!$ !
|
||||||
do i=1,acsr3%get_nrows()
|
!!$ do i=1,acsr3%get_nrows()
|
||||||
do j=acsr3%irp(i),acsr3%irp(i+1)-1
|
!!$ do j=acsr3%irp(i),acsr3%irp(i+1)-1
|
||||||
if (acsr3%ja(j) == i) then
|
!!$ if (acsr3%ja(j) == i) then
|
||||||
acsr3%val(j) = cone - omf(i)*acsr3%val(j)
|
!!$ acsr3%val(j) = cone - omf(i)*acsr3%val(j)
|
||||||
else
|
!!$ else
|
||||||
acsr3%val(j) = - omf(i)*acsr3%val(j)
|
!!$ acsr3%val(j) = - omf(i)*acsr3%val(j)
|
||||||
end if
|
!!$ end if
|
||||||
end do
|
!!$ end do
|
||||||
end do
|
!!$ end do
|
||||||
|
!!$
|
||||||
call am3%mv_from(acsr3)
|
!!$ call am3%mv_from(acsr3)
|
||||||
if (debug_level >= psb_debug_outer_) &
|
!!$ if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),&
|
!!$ & write(debug_unit,*) me,' ',trim(name),&
|
||||||
& 'Done gather, going for SYMBMM 1'
|
!!$ & 'Done gather, going for SYMBMM 1'
|
||||||
!
|
!!$ !
|
||||||
!
|
!!$ !
|
||||||
! op_prol = (I-w*D*A)Ptilde
|
!!$ ! op_prol = (I-w*D*A)Ptilde
|
||||||
!
|
!!$ !
|
||||||
!
|
!!$ !
|
||||||
call psb_spspmm(am3,ptilde,op_prol,info)
|
!!$ call psb_spspmm(am3,ptilde,op_prol,info)
|
||||||
if (debug_level >= psb_debug_outer_) &
|
!!$ if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),&
|
!!$ & write(debug_unit,*) me,' ',trim(name),&
|
||||||
& 'Done NUMBMM 1'
|
!!$ & 'Done NUMBMM 1'
|
||||||
|
!!$
|
||||||
end if
|
!!$ end if
|
||||||
|
!!$
|
||||||
|
!!$
|
||||||
!
|
!!$ !
|
||||||
! Ok, let's start over with the restrictor
|
!!$ ! Ok, let's start over with the restrictor
|
||||||
!
|
!!$ !
|
||||||
call ptilde%transc(rtilde)
|
!!$ call ptilde%transc(rtilde)
|
||||||
call la%cscnv(atmp,info,type='csr')
|
!!$ call la%cscnv(atmp,info,type='csr')
|
||||||
call psb_sphalo(atmp,desc_a,am4,info,&
|
!!$ call psb_sphalo(atmp,desc_a,am4,info,&
|
||||||
& colcnv=.true.,rowscale=.true.)
|
!!$ & colcnv=.true.,rowscale=.true.)
|
||||||
nrt = am4%get_nrows()
|
!!$ nrt = am4%get_nrows()
|
||||||
call am4%csclip(atmp2,info,lone,nrt,lone,ncol)
|
!!$ call am4%csclip(atmp2,info,lone,nrt,lone,ncol)
|
||||||
call atmp2%cscnv(info,type='CSR')
|
!!$ call atmp2%cscnv(info,type='CSR')
|
||||||
if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=atmp2)
|
!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp,info,b=atmp2)
|
||||||
call am4%free()
|
!!$ call am4%free()
|
||||||
call atmp2%free()
|
!!$ call atmp2%free()
|
||||||
|
!!$
|
||||||
! This is to compute the transpose. It ONLY works if the
|
!!$ ! This is to compute the transpose. It ONLY works if the
|
||||||
! original A has a symmetric pattern.
|
!!$ ! original A has a symmetric pattern.
|
||||||
call atmp%transc(atmp2)
|
!!$ call atmp%transc(atmp2)
|
||||||
call atmp2%csclip(dat,info,lone,nrow,lone,ncol)
|
!!$ call atmp2%csclip(dat,info,lone,nrow,lone,ncol)
|
||||||
call dat%cscnv(info,type='csr')
|
!!$ call dat%cscnv(info,type='csr')
|
||||||
call dat%scal(adinv,info)
|
!!$ call dat%scal(adinv,info)
|
||||||
|
!!$
|
||||||
! Now for the product.
|
!!$ ! Now for the product.
|
||||||
call psb_spspmm(dat,ptilde,datp,info)
|
!!$ call psb_spspmm(dat,ptilde,datp,info)
|
||||||
|
!!$
|
||||||
call datp%clone(atmp2,info)
|
!!$ call datp%clone(atmp2,info)
|
||||||
call psb_sphalo(atmp2,desc_a,am4,info,&
|
!!$ call psb_sphalo(atmp2,desc_a,am4,info,&
|
||||||
& colcnv=.false.,rowscale=.true.,outfmt='CSR ')
|
!!$ & colcnv=.false.,rowscale=.true.,outfmt='CSR ')
|
||||||
if (info == psb_success_) call psb_rwextd(ncol,atmp2,info,b=am4)
|
!!$ if (info == psb_success_) call psb_rwextd(ncol,atmp2,info,b=am4)
|
||||||
if (info == psb_success_) call am4%free()
|
!!$ if (info == psb_success_) call am4%free()
|
||||||
|
!!$
|
||||||
|
!!$
|
||||||
call psb_symbmm(dat,atmp2,datdatp,info)
|
!!$ call psb_symbmm(dat,atmp2,datdatp,info)
|
||||||
call psb_numbmm(dat,atmp2,datdatp)
|
!!$ call psb_numbmm(dat,atmp2,datdatp)
|
||||||
call atmp2%free()
|
!!$ call atmp2%free()
|
||||||
|
!!$
|
||||||
call datp%mv_to(csc_datp)
|
!!$ call datp%mv_to(csc_datp)
|
||||||
call datdatp%mv_to(csc_datdatp)
|
!!$ call datdatp%mv_to(csc_datdatp)
|
||||||
|
!!$
|
||||||
call csc_mat_col_prod(csc_datp,csc_datdatp,omp,info)
|
!!$ call csc_mat_col_prod(csc_datp,csc_datdatp,omp,info)
|
||||||
call csc_mat_col_prod(csc_datdatp,csc_datdatp,oden,info)
|
!!$ call csc_mat_col_prod(csc_datdatp,csc_datdatp,oden,info)
|
||||||
call psb_sum(ctxt,omp)
|
!!$ call psb_sum(ctxt,omp)
|
||||||
call psb_sum(ctxt,oden)
|
!!$ call psb_sum(ctxt,oden)
|
||||||
|
!!$
|
||||||
|
!!$
|
||||||
! !$ write(debug_unit,*) trim(name),' OMP_R :',omp
|
!!$ ! !$ write(debug_unit,*) trim(name),' OMP_R :',omp
|
||||||
! ! $ write(debug_unit,*) trim(name),' ODEN_R:',oden
|
!!$ ! ! $ write(debug_unit,*) trim(name),' ODEN_R:',oden
|
||||||
omp = omp/oden
|
!!$ omp = omp/oden
|
||||||
! !$ write(0,*) 'Check on output restrictor',omp(1:min(size(omp),10))
|
!!$ ! !$ write(0,*) 'Check on output restrictor',omp(1:min(size(omp),10))
|
||||||
! Compute omega_int
|
!!$ ! Compute omega_int
|
||||||
ommx = czero
|
!!$ ommx = czero
|
||||||
do i=1, ncol
|
!!$ do i=1, ncol
|
||||||
if (ilaggr(i) >0) then
|
!!$ if (ilaggr(i) >0) then
|
||||||
omi(i) = omp(ilaggr(i))
|
!!$ omi(i) = omp(ilaggr(i))
|
||||||
else
|
!!$ else
|
||||||
omi(i) = czero
|
!!$ omi(i) = czero
|
||||||
end if
|
!!$ end if
|
||||||
if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i)
|
!!$ if(abs(omi(i)) .gt. abs(ommx)) ommx = omi(i)
|
||||||
end do
|
!!$ end do
|
||||||
! Compute omega_fine
|
!!$ ! Compute omega_fine
|
||||||
! Going over the columns of atmp means going over the rows
|
!!$ ! Going over the columns of atmp means going over the rows
|
||||||
! of A^T. Hopefully ;-)
|
!!$ ! of A^T. Hopefully ;-)
|
||||||
call atmp%cp_to(acsc)
|
!!$ call atmp%cp_to(acsc)
|
||||||
|
!!$
|
||||||
do i=1, nrow
|
!!$ do i=1, nrow
|
||||||
omf(i) = ommx
|
!!$ omf(i) = ommx
|
||||||
do j= acsc%icp(i),acsc%icp(i+1)-1
|
!!$ do j= acsc%icp(i),acsc%icp(i+1)-1
|
||||||
if(abs(omi(acsc%ia(j))) .lt. abs(omf(i))) omf(i)=omi(acsc%ia(j))
|
!!$ if(abs(omi(acsc%ia(j))) .lt. abs(omf(i))) omf(i)=omi(acsc%ia(j))
|
||||||
end do
|
!!$ end do
|
||||||
!!$ if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = czero
|
!!$ ! ! if(min(real(omf(i)),aimag(omf(i))) < szero) omf(i) = czero
|
||||||
if(psb_minreal(omf(i)) < szero) omf(i) = czero
|
!!$ if(psb_minreal(omf(i)) < szero) omf(i) = czero
|
||||||
end do
|
!!$ end do
|
||||||
omf(1:nrow) = omf(1:nrow)*adinv(1:nrow)
|
!!$ omf(1:nrow) = omf(1:nrow)*adinv(1:nrow)
|
||||||
call psb_halo(omf,desc_a,info)
|
!!$ call psb_halo(omf,desc_a,info)
|
||||||
call acsc%free()
|
!!$ call acsc%free()
|
||||||
|
!!$
|
||||||
|
!!$
|
||||||
call atmp%mv_to(acsr1)
|
!!$ call atmp%mv_to(acsr1)
|
||||||
|
!!$
|
||||||
do i=1,acsr1%get_nrows()
|
!!$ do i=1,acsr1%get_nrows()
|
||||||
do j=acsr1%irp(i),acsr1%irp(i+1)-1
|
!!$ do j=acsr1%irp(i),acsr1%irp(i+1)-1
|
||||||
if (acsr1%ja(j) == i) then
|
!!$ if (acsr1%ja(j) == i) then
|
||||||
acsr1%val(j) = cone - acsr1%val(j)*omf(acsr1%ja(j))
|
!!$ acsr1%val(j) = cone - acsr1%val(j)*omf(acsr1%ja(j))
|
||||||
else
|
!!$ else
|
||||||
acsr1%val(j) = - acsr1%val(j)*omf(acsr1%ja(j))
|
!!$ acsr1%val(j) = - acsr1%val(j)*omf(acsr1%ja(j))
|
||||||
end if
|
!!$ end if
|
||||||
end do
|
!!$ end do
|
||||||
end do
|
!!$ end do
|
||||||
call atmp%mv_from(acsr1)
|
!!$ call atmp%mv_from(acsr1)
|
||||||
|
!!$
|
||||||
call rtilde%mv_to(tmpcoo)
|
!!$ call rtilde%mv_to(tmpcoo)
|
||||||
nzl = tmpcoo%get_nzeros()
|
!!$ nzl = tmpcoo%get_nzeros()
|
||||||
i=0
|
!!$ i=0
|
||||||
do k=1, nzl
|
!!$ do k=1, nzl
|
||||||
if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then
|
!!$ if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then
|
||||||
i = i+1
|
!!$ i = i+1
|
||||||
tmpcoo%val(i) = tmpcoo%val(k)
|
!!$ tmpcoo%val(i) = tmpcoo%val(k)
|
||||||
tmpcoo%ia(i) = tmpcoo%ia(k)
|
!!$ tmpcoo%ia(i) = tmpcoo%ia(k)
|
||||||
tmpcoo%ja(i) = tmpcoo%ja(k)
|
!!$ tmpcoo%ja(i) = tmpcoo%ja(k)
|
||||||
end if
|
!!$ end if
|
||||||
end do
|
!!$ end do
|
||||||
call tmpcoo%set_nzeros(i)
|
!!$ call tmpcoo%set_nzeros(i)
|
||||||
call rtilde%mv_from(tmpcoo)
|
!!$ call rtilde%mv_from(tmpcoo)
|
||||||
call rtilde%cscnv(info,type='csr')
|
!!$ call rtilde%cscnv(info,type='csr')
|
||||||
|
!!$
|
||||||
call psb_spspmm(rtilde,atmp,op_restr,info)
|
!!$ call psb_spspmm(rtilde,atmp,op_restr,info)
|
||||||
|
!!$
|
||||||
!
|
!!$ !
|
||||||
! Now we have to gather the halo of op_prol, and add it to itself
|
!!$ ! Now we have to gather the halo of op_prol, and add it to itself
|
||||||
! to multiply it by A,
|
!!$ ! to multiply it by A,
|
||||||
!
|
!!$ !
|
||||||
call op_prol%clone(tmp_prol,info)
|
!!$ call op_prol%clone(tmp_prol,info)
|
||||||
if (info == psb_success_) call psb_sphalo(tmp_prol,desc_a,am4,info,&
|
!!$ if (info == psb_success_) call psb_sphalo(tmp_prol,desc_a,am4,info,&
|
||||||
& colcnv=.false.,rowscale=.true.)
|
!!$ & colcnv=.false.,rowscale=.true.)
|
||||||
if (info == psb_success_) call psb_rwextd(ncol,tmp_prol,info,b=am4)
|
!!$ if (info == psb_success_) call psb_rwextd(ncol,tmp_prol,info,b=am4)
|
||||||
if (info == psb_success_) call am4%free()
|
!!$ if (info == psb_success_) call am4%free()
|
||||||
|
!!$
|
||||||
if(info /= psb_success_) then
|
!!$ if(info /= psb_success_) then
|
||||||
call psb_errpush(psb_err_internal_error_,name,a_err='Halo of op_prol')
|
!!$ call psb_errpush(psb_err_internal_error_,name,a_err='Halo of op_prol')
|
||||||
goto 9999
|
!!$ goto 9999
|
||||||
end if
|
!!$ end if
|
||||||
|
!!$
|
||||||
!
|
!!$ !
|
||||||
! Now we have to fix this. The only rows of B that are correct
|
!!$ ! Now we have to fix this. The only rows of B that are correct
|
||||||
! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:)
|
!!$ ! are those corresponding to "local" aggregates, i.e. indices in ilaggr(:)
|
||||||
!
|
!!$ !
|
||||||
call op_restr%mv_to(tmpcoo)
|
!!$ call op_restr%mv_to(tmpcoo)
|
||||||
|
!!$
|
||||||
nzl = tmpcoo%get_nzeros()
|
!!$ nzl = tmpcoo%get_nzeros()
|
||||||
i=0
|
!!$ i=0
|
||||||
do k=1, nzl
|
!!$ do k=1, nzl
|
||||||
if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then
|
!!$ if ((naggrm1 < tmpcoo%ia(k)) .and. (tmpcoo%ia(k) <= naggrp1)) then
|
||||||
i = i+1
|
!!$ i = i+1
|
||||||
tmpcoo%val(i) = tmpcoo%val(k)
|
!!$ tmpcoo%val(i) = tmpcoo%val(k)
|
||||||
tmpcoo%ia(i) = tmpcoo%ia(k)
|
!!$ tmpcoo%ia(i) = tmpcoo%ia(k)
|
||||||
tmpcoo%ja(i) = tmpcoo%ja(k)
|
!!$ tmpcoo%ja(i) = tmpcoo%ja(k)
|
||||||
end if
|
!!$ end if
|
||||||
end do
|
!!$ end do
|
||||||
call tmpcoo%set_nzeros(i)
|
!!$ call tmpcoo%set_nzeros(i)
|
||||||
call op_restr%mv_from(tmpcoo)
|
!!$ call op_restr%mv_from(tmpcoo)
|
||||||
call op_restr%cscnv(info,type='csr')
|
!!$ call op_restr%cscnv(info,type='csr')
|
||||||
|
!!$
|
||||||
|
!!$
|
||||||
if (debug_level >= psb_debug_outer_) &
|
!!$ if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),&
|
!!$ & write(debug_unit,*) me,' ',trim(name),&
|
||||||
& 'starting sphalo/ rwxtd'
|
!!$ & 'starting sphalo/ rwxtd'
|
||||||
|
!!$
|
||||||
call psb_spspmm(la,tmp_prol,am3,info)
|
!!$ call psb_spspmm(la,tmp_prol,am3,info)
|
||||||
if (debug_level >= psb_debug_outer_) &
|
!!$ if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),&
|
!!$ & write(debug_unit,*) me,' ',trim(name),&
|
||||||
& 'Done SPSPMM 2'
|
!!$ & 'Done SPSPMM 2'
|
||||||
|
!!$
|
||||||
call psb_sphalo(am3,desc_a,am4,info,&
|
!!$ call psb_sphalo(am3,desc_a,am4,info,&
|
||||||
& colcnv=.false.,rowscale=.true.)
|
!!$ & colcnv=.false.,rowscale=.true.)
|
||||||
if (info == psb_success_) call psb_rwextd(ncol,am3,info,b=am4)
|
!!$ if (info == psb_success_) call psb_rwextd(ncol,am3,info,b=am4)
|
||||||
if (info == psb_success_) call am4%free()
|
!!$ if (info == psb_success_) call am4%free()
|
||||||
|
!!$
|
||||||
if(info /= psb_success_) then
|
!!$ if(info /= psb_success_) then
|
||||||
call psb_errpush(psb_err_internal_error_,name,&
|
!!$ call psb_errpush(psb_err_internal_error_,name,&
|
||||||
& a_err='Extend am3')
|
!!$ & a_err='Extend am3')
|
||||||
goto 9999
|
!!$ goto 9999
|
||||||
end if
|
!!$ end if
|
||||||
if (debug_level >= psb_debug_outer_) &
|
!!$ if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),&
|
!!$ & write(debug_unit,*) me,' ',trim(name),&
|
||||||
& 'Done sphalo/ rwxtd'
|
!!$ & 'Done sphalo/ rwxtd'
|
||||||
|
!!$
|
||||||
call psb_spspmm(op_restr,am3,ac,info)
|
!!$ call psb_spspmm(op_restr,am3,ac,info)
|
||||||
if (info == psb_success_) call am3%free()
|
!!$ if (info == psb_success_) call am3%free()
|
||||||
if (info == psb_success_) call ac%cscnv(info,type='coo',dupl=psb_dupl_add_)
|
!!$ if (info == psb_success_) call ac%cscnv(info,type='coo',dupl=psb_dupl_add_)
|
||||||
|
!!$
|
||||||
if (info /= psb_success_) then
|
!!$ if (info /= psb_success_) then
|
||||||
call psb_errpush(psb_err_internal_error_,name,&
|
!!$ call psb_errpush(psb_err_internal_error_,name,&
|
||||||
&a_err='Build ac = op_restr x am3')
|
!!$ &a_err='Build ac = op_restr x am3')
|
||||||
goto 9999
|
!!$ goto 9999
|
||||||
end if
|
!!$ end if
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
type(psb_desc_type), intent(inout) :: desc_a
|
type(psb_desc_type), intent(inout) :: desc_a
|
||||||
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
integer(psb_lpk_), intent(inout) :: ilaggr(:), nlaggr(:)
|
||||||
type(amg_sml_parms), intent(inout) :: parms
|
type(amg_sml_parms), intent(inout) :: parms
|
||||||
type(psb_cspmat_type), intent(out) :: op_prol,ac,op_restr
|
type(psb_cspmat_type), intent(inout) :: op_prol,ac,op_restr
|
||||||
type(psb_lcspmat_type), intent(inout) :: t_prol
|
type(psb_lcspmat_type), intent(inout) :: t_prol
|
||||||
type(psb_desc_type), intent(inout) :: desc_ac
|
type(psb_desc_type), intent(inout) :: desc_ac
|
||||||
integer(psb_ipk_), intent(out) :: info
|
integer(psb_ipk_), intent(out) :: info
|
||||||
@@ -140,6 +140,9 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
real(psb_spk_) :: anorm, omega, tmp, dg, theta
|
real(psb_spk_) :: anorm, omega, tmp, dg, theta
|
||||||
logical, parameter :: debug_new=.false.
|
logical, parameter :: debug_new=.false.
|
||||||
character(len=80) :: filename
|
character(len=80) :: filename
|
||||||
|
logical, parameter :: do_timings=.false.
|
||||||
|
integer(psb_ipk_), save :: idx_spspmm=-1, idx_phase1=-1, idx_gtrans=-1, idx_phase2=-1, idx_refine=-1
|
||||||
|
integer(psb_ipk_), save :: idx_phase3=-1, idx_cdasb=-1, idx_ptap=-1
|
||||||
|
|
||||||
name='amg_aggrmat_smth_bld'
|
name='amg_aggrmat_smth_bld'
|
||||||
info=psb_success_
|
info=psb_success_
|
||||||
@@ -153,6 +156,23 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
ctxt = desc_a%get_context()
|
ctxt = desc_a%get_context()
|
||||||
|
|
||||||
call psb_info(ctxt, me, np)
|
call psb_info(ctxt, me, np)
|
||||||
|
if ((do_timings).and.(idx_spspmm==-1)) &
|
||||||
|
& idx_spspmm = psb_get_timer_idx("DEC_SMTH_BLD: par_spspmm")
|
||||||
|
if ((do_timings).and.(idx_phase1==-1)) &
|
||||||
|
& idx_phase1 = psb_get_timer_idx("DEC_SMTH_BLD: phase1 ")
|
||||||
|
if ((do_timings).and.(idx_phase2==-1)) &
|
||||||
|
& idx_phase2 = psb_get_timer_idx("DEC_SMTH_BLD: phase2 ")
|
||||||
|
if ((do_timings).and.(idx_phase3==-1)) &
|
||||||
|
& idx_phase3 = psb_get_timer_idx("DEC_SMTH_BLD: phase3 ")
|
||||||
|
if ((do_timings).and.(idx_gtrans==-1)) &
|
||||||
|
& idx_gtrans = psb_get_timer_idx("DEC_SMTH_BLD: gtrans ")
|
||||||
|
if ((do_timings).and.(idx_refine==-1)) &
|
||||||
|
& idx_refine = psb_get_timer_idx("DEC_SMTH_BLD: refine ")
|
||||||
|
if ((do_timings).and.(idx_cdasb==-1)) &
|
||||||
|
& idx_cdasb = psb_get_timer_idx("DEC_SMTH_BLD: cdasb ")
|
||||||
|
if ((do_timings).and.(idx_ptap==-1)) &
|
||||||
|
& idx_ptap = psb_get_timer_idx("DEC_SMTH_BLD: ptap_bld ")
|
||||||
|
|
||||||
|
|
||||||
nglob = desc_a%get_global_rows()
|
nglob = desc_a%get_global_rows()
|
||||||
nrow = desc_a%get_local_rows()
|
nrow = desc_a%get_local_rows()
|
||||||
@@ -171,6 +191,7 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
! naggr: number of local aggregates
|
! naggr: number of local aggregates
|
||||||
! nrow: local rows.
|
! nrow: local rows.
|
||||||
!
|
!
|
||||||
|
if (do_timings) call psb_tic(idx_phase1)
|
||||||
|
|
||||||
! Get the diagonal D
|
! Get the diagonal D
|
||||||
adiag = a%get_diag(info)
|
adiag = a%get_diag(info)
|
||||||
@@ -196,7 +217,7 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
!
|
!
|
||||||
! Build the filtered matrix Af from A
|
! Build the filtered matrix Af from A
|
||||||
!
|
!
|
||||||
|
!$OMP parallel do private(i,j,tmp,jd) schedule(static)
|
||||||
do i=1, nrow
|
do i=1, nrow
|
||||||
tmp = czero
|
tmp = czero
|
||||||
jd = -1
|
jd = -1
|
||||||
@@ -214,11 +235,13 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
acsrf%val(jd)=acsrf%val(jd)-tmp
|
acsrf%val(jd)=acsrf%val(jd)-tmp
|
||||||
end if
|
end if
|
||||||
enddo
|
enddo
|
||||||
|
!$OMP end parallel do
|
||||||
! Take out zeroed terms
|
! Take out zeroed terms
|
||||||
call acsrf%clean_zeros(info)
|
call acsrf%clean_zeros(info)
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
|
||||||
|
!$OMP parallel do private(i) schedule(static)
|
||||||
do i=1,size(adiag)
|
do i=1,size(adiag)
|
||||||
if (adiag(i) /= czero) then
|
if (adiag(i) /= czero) then
|
||||||
adiag(i) = cone / adiag(i)
|
adiag(i) = cone / adiag(i)
|
||||||
@@ -226,7 +249,7 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
adiag(i) = cone
|
adiag(i) = cone
|
||||||
end if
|
end if
|
||||||
end do
|
end do
|
||||||
|
!$OMP end parallel do
|
||||||
if (parms%aggr_omega_alg == amg_eig_est_) then
|
if (parms%aggr_omega_alg == amg_eig_est_) then
|
||||||
|
|
||||||
if (parms%aggr_eig == amg_max_norm_) then
|
if (parms%aggr_eig == amg_max_norm_) then
|
||||||
@@ -252,8 +275,9 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
call psb_errpush(info,name,a_err='invalid amg_aggr_omega_alg_')
|
call psb_errpush(info,name,a_err='invalid amg_aggr_omega_alg_')
|
||||||
goto 9999
|
goto 9999
|
||||||
end if
|
end if
|
||||||
|
if (do_timings) call psb_toc(idx_phase1)
|
||||||
|
|
||||||
|
if (do_timings) call psb_tic(idx_phase2)
|
||||||
call acsrf%scal(adiag,info)
|
call acsrf%scal(adiag,info)
|
||||||
if (info /= psb_success_) goto 9999
|
if (info /= psb_success_) goto 9999
|
||||||
|
|
||||||
@@ -267,6 +291,8 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
|
|
||||||
call psb_cdasb(desc_ac,info)
|
call psb_cdasb(desc_ac,info)
|
||||||
call psb_cd_reinit(desc_ac,info)
|
call psb_cd_reinit(desc_ac,info)
|
||||||
|
if (do_timings) call psb_toc(idx_phase2)
|
||||||
|
if (do_timings) call psb_tic(idx_phase3)
|
||||||
!
|
!
|
||||||
! Build the smoothed prolongator using either A or Af
|
! Build the smoothed prolongator using either A or Af
|
||||||
! acsr1 = (I-w*D*A) Prol acsr1 = (I-w*D*Af) Prol
|
! acsr1 = (I-w*D*A) Prol acsr1 = (I-w*D*Af) Prol
|
||||||
@@ -279,8 +305,8 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1')
|
call psb_errpush(psb_err_from_subroutine_,name,a_err='spspmm 1')
|
||||||
goto 9999
|
goto 9999
|
||||||
end if
|
end if
|
||||||
|
if (do_timings) call psb_toc(idx_phase3)
|
||||||
|
if (do_timings) call psb_tic(idx_ptap)
|
||||||
if (debug_level >= psb_debug_outer_) &
|
if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),&
|
& write(debug_unit,*) me,' ',trim(name),&
|
||||||
& 'Done SPSPMM 1'
|
& 'Done SPSPMM 1'
|
||||||
@@ -292,7 +318,7 @@ subroutine amg_caggrmat_smth_bld(a,desc_a,ilaggr,nlaggr,parms,&
|
|||||||
|
|
||||||
call op_prol%mv_from(coo_prol)
|
call op_prol%mv_from(coo_prol)
|
||||||
call op_restr%mv_from(coo_restr)
|
call op_restr%mv_from(coo_restr)
|
||||||
|
if (do_timings) call psb_toc(idx_ptap)
|
||||||
if (debug_level >= psb_debug_outer_) &
|
if (debug_level >= psb_debug_outer_) &
|
||||||
& write(debug_unit,*) me,' ',trim(name),&
|
& write(debug_unit,*) me,' ',trim(name),&
|
||||||
& 'Done smooth_aggregate '
|
& 'Done smooth_aggregate '
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user