diff --git a/mlprec/mld_c_base_aggregator_mod.f90 b/mlprec/mld_c_base_aggregator_mod.f90 index 26a512cc..e09be15d 100644 --- a/mlprec/mld_c_base_aggregator_mod.f90 +++ b/mlprec/mld_c_base_aggregator_mod.f90 @@ -285,7 +285,7 @@ contains !! The mapping is store in ILAGGR; for each local row index I, !! ILAGGR(I) contains the index of the aggregate to which index I !! will contribute, in global numbering. - !! Many aggregation produce a binary tentative prolongator, but some + !! Many aggregations produce a binary tentative prolongator, but some !! do not, hence we also need the OP_PROL output. !! AG_DATA is passed here just in case some of the !! aggregators need it internally, most of them will ignore. diff --git a/mlprec/mld_c_base_smoother_mod.f90 b/mlprec/mld_c_base_smoother_mod.f90 index cbb01197..ed7b0720 100644 --- a/mlprec/mld_c_base_smoother_mod.f90 +++ b/mlprec/mld_c_base_smoother_mod.f90 @@ -56,6 +56,9 @@ ! contains a SOLVER object: the SOLVER operates locally within the ! current process, whereas the SMOOTHER object accounts for (possible) ! interactions between processes. +! Some solvers (MUMPS and SuperLU_DIST) can also operate on the entire +! distributed matrix, in which case the smoother object essentially +! becomes transparent. ! module mld_c_base_smoother_mod diff --git a/mlprec/mld_c_diag_solver.f90 b/mlprec/mld_c_diag_solver.f90 index e1b3ac84..97124f10 100644 --- a/mlprec/mld_c_diag_solver.f90 +++ b/mlprec/mld_c_diag_solver.f90 @@ -275,6 +275,18 @@ contains end module mld_c_diag_solver +! +! Module: mld_c_l1_diag_solver_mod +! +! This module defines: +! - the mld_c_l1_diag_solver_type data structure containing the +! L1 diagonal solver. +! The solver is defined as a diagonal containing in each element the +! inverse of the sum of the absolute values of the matrix entries +! along the corresponding row. +! Combined with a Jacobi "smoother" generates +! what are commonly known as the L1-Jacobi iterations +! module mld_c_l1_diag_solver diff --git a/mlprec/mld_c_gs_solver.f90 b/mlprec/mld_c_gs_solver.f90 index 28f14ec6..e3d924b7 100644 --- a/mlprec/mld_c_gs_solver.f90 +++ b/mlprec/mld_c_gs_solver.f90 @@ -47,8 +47,9 @@ ! backward GS (BWGS). The iterations are local to a process (they operate ! on the block diagonal). Combined with a Jacobi smoother will generate a ! hybrid-Gauss-Seidel solver, i.e. Gauss-Seidel within each process, Jacobi -! among the processes. -! +! among the processes. +! With two objects as pre- and post-smoothers it is possible to build a +! Forward-Backward smoother, suitable for symmetric iterations. ! module mld_c_gs_solver diff --git a/mlprec/mld_c_ilu_fact_mod.f90 b/mlprec/mld_c_ilu_fact_mod.f90 index e61ae28a..1cb53d59 100644 --- a/mlprec/mld_c_ilu_fact_mod.f90 +++ b/mlprec/mld_c_ilu_fact_mod.f90 @@ -41,7 +41,7 @@ ! ! Module: mld_c_ilu_fact_mod ! -! This module defines some interfaces used internally by the implementation if +! This module defines some interfaces used internally by the implementation of ! mld_c_ilu_solver, but not visible to the end user. ! ! diff --git a/mlprec/mld_c_ilu_solver.f90 b/mlprec/mld_c_ilu_solver.f90 index 35469561..0ccd4532 100644 --- a/mlprec/mld_c_ilu_solver.f90 +++ b/mlprec/mld_c_ilu_solver.f90 @@ -51,7 +51,7 @@ ! threshold base ILU(T,L) ! 3. The diagonal is stored separately, so strictly speaking this is ! an incomplete LDU factorization; -! 4. The application phase is shared; +! 4. The application phase is shared among all variants; ! ! module mld_c_ilu_solver diff --git a/mlprec/mld_c_inner_mod.f90 b/mlprec/mld_c_inner_mod.f90 index d5b7b50a..6794c7b5 100644 --- a/mlprec/mld_c_inner_mod.f90 +++ b/mlprec/mld_c_inner_mod.f90 @@ -39,8 +39,7 @@ ! ! Module: mld_inner_mod ! -! This module defines the interfaces to the real/complex, single/double -! precision versions of inner MLD2P4 routines. +! This module defines the interfaces to inner MLD2P4 routines. ! The interfaces of the user level routines are defined in mld_prec_mod.f90. ! module mld_c_inner_mod diff --git a/mlprec/mld_c_jac_smoother.f90 b/mlprec/mld_c_jac_smoother.f90 index cac48bd5..568b8642 100644 --- a/mlprec/mld_c_jac_smoother.f90 +++ b/mlprec/mld_c_jac_smoother.f90 @@ -44,10 +44,10 @@ ! the mld_c_jac_smoother_type data structure containing the ! smoother for a Jacobi/block Jacobi smoother. ! The smoother stores in ND the block off-diagonal matrix. -! One special case is treated separately, when the solver is DIAG +! One special case is treated separately, when the solver is DIAG or L1-DIAG ! then the ND is the entire off-diagonal part of the matrix (including the ! main diagonal block), so that it becomes possible to implement -! pure Jacobi global solver. +! a pure Jacobi or L1-Jacobi global solver. ! module mld_c_jac_smoother diff --git a/mlprec/mld_c_mumps_solver.F90 b/mlprec/mld_c_mumps_solver.F90 index 322235d7..bdb10d60 100644 --- a/mlprec/mld_c_mumps_solver.F90 +++ b/mlprec/mld_c_mumps_solver.F90 @@ -48,7 +48,7 @@ ! - the mld_c_mumps_solver_type data structure containing the ingredients ! to interface with the MUMPS package. ! 1. The factorization can be either restricted to the diagonal block of the -! current image or distributed (and thus exact) +! current image or distributed (and thus exact). ! module mld_c_mumps_solver use mld_c_base_solver_mod diff --git a/mlprec/mld_c_prec_mod.f90 b/mlprec/mld_c_prec_mod.f90 index e3b46672..5b2768b5 100644 --- a/mlprec/mld_c_prec_mod.f90 +++ b/mlprec/mld_c_prec_mod.f90 @@ -39,7 +39,7 @@ ! ! Module: mld_c_prec_mod ! -! This module defines the interfaces to the real/complex, single/double +! This module defines the user interfaces to the real/complex, single/double ! precision versions of the user-level MLD2P4 routines. ! module mld_c_prec_mod diff --git a/mlprec/mld_c_prec_type.f90 b/mlprec/mld_c_prec_type.f90 index 17bee31a..523d3c10 100644 --- a/mlprec/mld_c_prec_type.f90 +++ b/mlprec/mld_c_prec_type.f90 @@ -61,24 +61,24 @@ module mld_c_prec_type use psb_prec_mod, only : psb_cprec_type ! - ! Type: mld_Tprec_type. + ! Type: mld_cprec_type. ! ! This is the data type containing all the information about the multilevel - ! preconditioner (here and in the following 'T' denotes 'd', 's', 'c' and - ! 'z', according to the real/complex, single/double precision version of - ! MLD2P4). It consists of an array of 'one-level' intermediate data structures - ! of type mld_Tonelev_type, each containing the information needed to apply + ! preconditioner ('d', 's', 'c' and 'z', according to the real/complex, + ! single/double precision version of MLD2P4). + ! It consists of an array of 'one-level' intermediate data structures + ! of type mld_conelev_type, each containing the information needed to apply ! the smoothing and the coarse-space correction at a generic level. RT is the ! real data type, i.e. S for both S and C, and D for both D and Z. ! - ! type mld_Tprec_type - ! type(mld_Tonelev_type), allocatable :: precv(:) - ! end type mld_Tprec_type + ! type mld_cprec_type + ! type(mld_conelev_type), allocatable :: precv(:) + ! end type mld_cprec_type ! ! Note that the levels are numbered in increasing order starting from - ! the finest one and the number of levels is given by size(precv(:)), - ! and that is the id of the coarsest level. - ! In the multigrid literature authors often number the levels in decreasing + ! the level 1 as the finest one, and the number of levels is given by + ! size(precv(:)) which is the id of the coarsest level. + ! In the multigrid literature many authors number the levels in the opposite ! order, with level 0 being the id of the coarsest level. ! ! @@ -92,9 +92,9 @@ module mld_c_prec_type ! integer(psb_ipk_) :: outer_sweeps = 1 ! - ! Coarse solver requires some tricky checks, and this needs we record the - ! choice in the format given by the user, to keep track against what - ! is put later in the multilevel array + ! Coarse solver requires some tricky checks, and for this we need to + ! record the choice in the format given by the user, + ! to keep track against what is put later in the multilevel array ! integer(psb_ipk_) :: coarse_solver = -1 diff --git a/mlprec/mld_d_base_aggregator_mod.f90 b/mlprec/mld_d_base_aggregator_mod.f90 index 9e465a51..3542ce49 100644 --- a/mlprec/mld_d_base_aggregator_mod.f90 +++ b/mlprec/mld_d_base_aggregator_mod.f90 @@ -285,7 +285,7 @@ contains !! The mapping is store in ILAGGR; for each local row index I, !! ILAGGR(I) contains the index of the aggregate to which index I !! will contribute, in global numbering. - !! Many aggregation produce a binary tentative prolongator, but some + !! Many aggregations produce a binary tentative prolongator, but some !! do not, hence we also need the OP_PROL output. !! AG_DATA is passed here just in case some of the !! aggregators need it internally, most of them will ignore. diff --git a/mlprec/mld_d_base_smoother_mod.f90 b/mlprec/mld_d_base_smoother_mod.f90 index 27cf3b50..5bc5edd4 100644 --- a/mlprec/mld_d_base_smoother_mod.f90 +++ b/mlprec/mld_d_base_smoother_mod.f90 @@ -56,6 +56,9 @@ ! contains a SOLVER object: the SOLVER operates locally within the ! current process, whereas the SMOOTHER object accounts for (possible) ! interactions between processes. +! Some solvers (MUMPS and SuperLU_DIST) can also operate on the entire +! distributed matrix, in which case the smoother object essentially +! becomes transparent. ! module mld_d_base_smoother_mod diff --git a/mlprec/mld_d_diag_solver.f90 b/mlprec/mld_d_diag_solver.f90 index b3a6cb47..c1f0ec4f 100644 --- a/mlprec/mld_d_diag_solver.f90 +++ b/mlprec/mld_d_diag_solver.f90 @@ -275,6 +275,18 @@ contains end module mld_d_diag_solver +! +! Module: mld_d_l1_diag_solver_mod +! +! This module defines: +! - the mld_d_l1_diag_solver_type data structure containing the +! L1 diagonal solver. +! The solver is defined as a diagonal containing in each element the +! inverse of the sum of the absolute values of the matrix entries +! along the corresponding row. +! Combined with a Jacobi "smoother" generates +! what are commonly known as the L1-Jacobi iterations +! module mld_d_l1_diag_solver diff --git a/mlprec/mld_d_gs_solver.f90 b/mlprec/mld_d_gs_solver.f90 index bf37c548..65a06c21 100644 --- a/mlprec/mld_d_gs_solver.f90 +++ b/mlprec/mld_d_gs_solver.f90 @@ -47,8 +47,9 @@ ! backward GS (BWGS). The iterations are local to a process (they operate ! on the block diagonal). Combined with a Jacobi smoother will generate a ! hybrid-Gauss-Seidel solver, i.e. Gauss-Seidel within each process, Jacobi -! among the processes. -! +! among the processes. +! With two objects as pre- and post-smoothers it is possible to build a +! Forward-Backward smoother, suitable for symmetric iterations. ! module mld_d_gs_solver diff --git a/mlprec/mld_d_ilu_fact_mod.f90 b/mlprec/mld_d_ilu_fact_mod.f90 index cb8c4bbe..20bbe28f 100644 --- a/mlprec/mld_d_ilu_fact_mod.f90 +++ b/mlprec/mld_d_ilu_fact_mod.f90 @@ -41,7 +41,7 @@ ! ! Module: mld_d_ilu_fact_mod ! -! This module defines some interfaces used internally by the implementation if +! This module defines some interfaces used internally by the implementation of ! mld_d_ilu_solver, but not visible to the end user. ! ! diff --git a/mlprec/mld_d_ilu_solver.f90 b/mlprec/mld_d_ilu_solver.f90 index 72c6989e..513eea57 100644 --- a/mlprec/mld_d_ilu_solver.f90 +++ b/mlprec/mld_d_ilu_solver.f90 @@ -51,7 +51,7 @@ ! threshold base ILU(T,L) ! 3. The diagonal is stored separately, so strictly speaking this is ! an incomplete LDU factorization; -! 4. The application phase is shared; +! 4. The application phase is shared among all variants; ! ! module mld_d_ilu_solver diff --git a/mlprec/mld_d_inner_mod.f90 b/mlprec/mld_d_inner_mod.f90 index dc654bfd..cc84b67d 100644 --- a/mlprec/mld_d_inner_mod.f90 +++ b/mlprec/mld_d_inner_mod.f90 @@ -39,8 +39,7 @@ ! ! Module: mld_inner_mod ! -! This module defines the interfaces to the real/complex, single/double -! precision versions of inner MLD2P4 routines. +! This module defines the interfaces to inner MLD2P4 routines. ! The interfaces of the user level routines are defined in mld_prec_mod.f90. ! module mld_d_inner_mod diff --git a/mlprec/mld_d_jac_smoother.f90 b/mlprec/mld_d_jac_smoother.f90 index 5b272b54..55ce801c 100644 --- a/mlprec/mld_d_jac_smoother.f90 +++ b/mlprec/mld_d_jac_smoother.f90 @@ -44,10 +44,10 @@ ! the mld_d_jac_smoother_type data structure containing the ! smoother for a Jacobi/block Jacobi smoother. ! The smoother stores in ND the block off-diagonal matrix. -! One special case is treated separately, when the solver is DIAG +! One special case is treated separately, when the solver is DIAG or L1-DIAG ! then the ND is the entire off-diagonal part of the matrix (including the ! main diagonal block), so that it becomes possible to implement -! pure Jacobi global solver. +! a pure Jacobi or L1-Jacobi global solver. ! module mld_d_jac_smoother diff --git a/mlprec/mld_d_mumps_solver.F90 b/mlprec/mld_d_mumps_solver.F90 index 907f0216..2f61528a 100644 --- a/mlprec/mld_d_mumps_solver.F90 +++ b/mlprec/mld_d_mumps_solver.F90 @@ -48,7 +48,7 @@ ! - the mld_d_mumps_solver_type data structure containing the ingredients ! to interface with the MUMPS package. ! 1. The factorization can be either restricted to the diagonal block of the -! current image or distributed (and thus exact) +! current image or distributed (and thus exact). ! module mld_d_mumps_solver use mld_d_base_solver_mod diff --git a/mlprec/mld_d_prec_mod.f90 b/mlprec/mld_d_prec_mod.f90 index c0822a2d..b5950be8 100644 --- a/mlprec/mld_d_prec_mod.f90 +++ b/mlprec/mld_d_prec_mod.f90 @@ -39,7 +39,7 @@ ! ! Module: mld_d_prec_mod ! -! This module defines the interfaces to the real/complex, single/double +! This module defines the user interfaces to the real/complex, single/double ! precision versions of the user-level MLD2P4 routines. ! module mld_d_prec_mod diff --git a/mlprec/mld_d_prec_type.f90 b/mlprec/mld_d_prec_type.f90 index 6ae95835..9450aff5 100644 --- a/mlprec/mld_d_prec_type.f90 +++ b/mlprec/mld_d_prec_type.f90 @@ -61,24 +61,24 @@ module mld_d_prec_type use psb_prec_mod, only : psb_dprec_type ! - ! Type: mld_Tprec_type. + ! Type: mld_dprec_type. ! ! This is the data type containing all the information about the multilevel - ! preconditioner (here and in the following 'T' denotes 'd', 's', 'c' and - ! 'z', according to the real/complex, single/double precision version of - ! MLD2P4). It consists of an array of 'one-level' intermediate data structures - ! of type mld_Tonelev_type, each containing the information needed to apply + ! preconditioner ('d', 's', 'c' and 'z', according to the real/complex, + ! single/double precision version of MLD2P4). + ! It consists of an array of 'one-level' intermediate data structures + ! of type mld_donelev_type, each containing the information needed to apply ! the smoothing and the coarse-space correction at a generic level. RT is the ! real data type, i.e. S for both S and C, and D for both D and Z. ! - ! type mld_Tprec_type - ! type(mld_Tonelev_type), allocatable :: precv(:) - ! end type mld_Tprec_type + ! type mld_dprec_type + ! type(mld_donelev_type), allocatable :: precv(:) + ! end type mld_dprec_type ! ! Note that the levels are numbered in increasing order starting from - ! the finest one and the number of levels is given by size(precv(:)), - ! and that is the id of the coarsest level. - ! In the multigrid literature authors often number the levels in decreasing + ! the level 1 as the finest one, and the number of levels is given by + ! size(precv(:)) which is the id of the coarsest level. + ! In the multigrid literature many authors number the levels in the opposite ! order, with level 0 being the id of the coarsest level. ! ! @@ -92,9 +92,9 @@ module mld_d_prec_type ! integer(psb_ipk_) :: outer_sweeps = 1 ! - ! Coarse solver requires some tricky checks, and this needs we record the - ! choice in the format given by the user, to keep track against what - ! is put later in the multilevel array + ! Coarse solver requires some tricky checks, and for this we need to + ! record the choice in the format given by the user, + ! to keep track against what is put later in the multilevel array ! integer(psb_ipk_) :: coarse_solver = -1 diff --git a/mlprec/mld_s_base_aggregator_mod.f90 b/mlprec/mld_s_base_aggregator_mod.f90 index 8f5f9693..0a8ee29e 100644 --- a/mlprec/mld_s_base_aggregator_mod.f90 +++ b/mlprec/mld_s_base_aggregator_mod.f90 @@ -285,7 +285,7 @@ contains !! The mapping is store in ILAGGR; for each local row index I, !! ILAGGR(I) contains the index of the aggregate to which index I !! will contribute, in global numbering. - !! Many aggregation produce a binary tentative prolongator, but some + !! Many aggregations produce a binary tentative prolongator, but some !! do not, hence we also need the OP_PROL output. !! AG_DATA is passed here just in case some of the !! aggregators need it internally, most of them will ignore. diff --git a/mlprec/mld_s_base_smoother_mod.f90 b/mlprec/mld_s_base_smoother_mod.f90 index d2e74780..2ac5eab2 100644 --- a/mlprec/mld_s_base_smoother_mod.f90 +++ b/mlprec/mld_s_base_smoother_mod.f90 @@ -56,6 +56,9 @@ ! contains a SOLVER object: the SOLVER operates locally within the ! current process, whereas the SMOOTHER object accounts for (possible) ! interactions between processes. +! Some solvers (MUMPS and SuperLU_DIST) can also operate on the entire +! distributed matrix, in which case the smoother object essentially +! becomes transparent. ! module mld_s_base_smoother_mod diff --git a/mlprec/mld_s_diag_solver.f90 b/mlprec/mld_s_diag_solver.f90 index 18b4b7bc..42d418eb 100644 --- a/mlprec/mld_s_diag_solver.f90 +++ b/mlprec/mld_s_diag_solver.f90 @@ -275,6 +275,18 @@ contains end module mld_s_diag_solver +! +! Module: mld_s_l1_diag_solver_mod +! +! This module defines: +! - the mld_s_l1_diag_solver_type data structure containing the +! L1 diagonal solver. +! The solver is defined as a diagonal containing in each element the +! inverse of the sum of the absolute values of the matrix entries +! along the corresponding row. +! Combined with a Jacobi "smoother" generates +! what are commonly known as the L1-Jacobi iterations +! module mld_s_l1_diag_solver diff --git a/mlprec/mld_s_gs_solver.f90 b/mlprec/mld_s_gs_solver.f90 index a106d95a..91b29d8b 100644 --- a/mlprec/mld_s_gs_solver.f90 +++ b/mlprec/mld_s_gs_solver.f90 @@ -47,8 +47,9 @@ ! backward GS (BWGS). The iterations are local to a process (they operate ! on the block diagonal). Combined with a Jacobi smoother will generate a ! hybrid-Gauss-Seidel solver, i.e. Gauss-Seidel within each process, Jacobi -! among the processes. -! +! among the processes. +! With two objects as pre- and post-smoothers it is possible to build a +! Forward-Backward smoother, suitable for symmetric iterations. ! module mld_s_gs_solver diff --git a/mlprec/mld_s_ilu_fact_mod.f90 b/mlprec/mld_s_ilu_fact_mod.f90 index 0722a423..57651cf1 100644 --- a/mlprec/mld_s_ilu_fact_mod.f90 +++ b/mlprec/mld_s_ilu_fact_mod.f90 @@ -41,7 +41,7 @@ ! ! Module: mld_s_ilu_fact_mod ! -! This module defines some interfaces used internally by the implementation if +! This module defines some interfaces used internally by the implementation of ! mld_s_ilu_solver, but not visible to the end user. ! ! diff --git a/mlprec/mld_s_ilu_solver.f90 b/mlprec/mld_s_ilu_solver.f90 index 0af63304..49a75b03 100644 --- a/mlprec/mld_s_ilu_solver.f90 +++ b/mlprec/mld_s_ilu_solver.f90 @@ -51,7 +51,7 @@ ! threshold base ILU(T,L) ! 3. The diagonal is stored separately, so strictly speaking this is ! an incomplete LDU factorization; -! 4. The application phase is shared; +! 4. The application phase is shared among all variants; ! ! module mld_s_ilu_solver diff --git a/mlprec/mld_s_inner_mod.f90 b/mlprec/mld_s_inner_mod.f90 index 91d16768..50f59aa8 100644 --- a/mlprec/mld_s_inner_mod.f90 +++ b/mlprec/mld_s_inner_mod.f90 @@ -39,8 +39,7 @@ ! ! Module: mld_inner_mod ! -! This module defines the interfaces to the real/complex, single/double -! precision versions of inner MLD2P4 routines. +! This module defines the interfaces to inner MLD2P4 routines. ! The interfaces of the user level routines are defined in mld_prec_mod.f90. ! module mld_s_inner_mod diff --git a/mlprec/mld_s_jac_smoother.f90 b/mlprec/mld_s_jac_smoother.f90 index 5dcd0900..9ea25338 100644 --- a/mlprec/mld_s_jac_smoother.f90 +++ b/mlprec/mld_s_jac_smoother.f90 @@ -44,10 +44,10 @@ ! the mld_s_jac_smoother_type data structure containing the ! smoother for a Jacobi/block Jacobi smoother. ! The smoother stores in ND the block off-diagonal matrix. -! One special case is treated separately, when the solver is DIAG +! One special case is treated separately, when the solver is DIAG or L1-DIAG ! then the ND is the entire off-diagonal part of the matrix (including the ! main diagonal block), so that it becomes possible to implement -! pure Jacobi global solver. +! a pure Jacobi or L1-Jacobi global solver. ! module mld_s_jac_smoother diff --git a/mlprec/mld_s_mumps_solver.F90 b/mlprec/mld_s_mumps_solver.F90 index c30f6658..7782d1cc 100644 --- a/mlprec/mld_s_mumps_solver.F90 +++ b/mlprec/mld_s_mumps_solver.F90 @@ -48,7 +48,7 @@ ! - the mld_s_mumps_solver_type data structure containing the ingredients ! to interface with the MUMPS package. ! 1. The factorization can be either restricted to the diagonal block of the -! current image or distributed (and thus exact) +! current image or distributed (and thus exact). ! module mld_s_mumps_solver use mld_s_base_solver_mod diff --git a/mlprec/mld_s_prec_mod.f90 b/mlprec/mld_s_prec_mod.f90 index baf88de6..ea480571 100644 --- a/mlprec/mld_s_prec_mod.f90 +++ b/mlprec/mld_s_prec_mod.f90 @@ -39,7 +39,7 @@ ! ! Module: mld_s_prec_mod ! -! This module defines the interfaces to the real/complex, single/double +! This module defines the user interfaces to the real/complex, single/double ! precision versions of the user-level MLD2P4 routines. ! module mld_s_prec_mod diff --git a/mlprec/mld_s_prec_type.f90 b/mlprec/mld_s_prec_type.f90 index 0e0fed32..4343b321 100644 --- a/mlprec/mld_s_prec_type.f90 +++ b/mlprec/mld_s_prec_type.f90 @@ -61,24 +61,24 @@ module mld_s_prec_type use psb_prec_mod, only : psb_sprec_type ! - ! Type: mld_Tprec_type. + ! Type: mld_sprec_type. ! ! This is the data type containing all the information about the multilevel - ! preconditioner (here and in the following 'T' denotes 'd', 's', 'c' and - ! 'z', according to the real/complex, single/double precision version of - ! MLD2P4). It consists of an array of 'one-level' intermediate data structures - ! of type mld_Tonelev_type, each containing the information needed to apply + ! preconditioner ('d', 's', 'c' and 'z', according to the real/complex, + ! single/double precision version of MLD2P4). + ! It consists of an array of 'one-level' intermediate data structures + ! of type mld_sonelev_type, each containing the information needed to apply ! the smoothing and the coarse-space correction at a generic level. RT is the ! real data type, i.e. S for both S and C, and D for both D and Z. ! - ! type mld_Tprec_type - ! type(mld_Tonelev_type), allocatable :: precv(:) - ! end type mld_Tprec_type + ! type mld_sprec_type + ! type(mld_sonelev_type), allocatable :: precv(:) + ! end type mld_sprec_type ! ! Note that the levels are numbered in increasing order starting from - ! the finest one and the number of levels is given by size(precv(:)), - ! and that is the id of the coarsest level. - ! In the multigrid literature authors often number the levels in decreasing + ! the level 1 as the finest one, and the number of levels is given by + ! size(precv(:)) which is the id of the coarsest level. + ! In the multigrid literature many authors number the levels in the opposite ! order, with level 0 being the id of the coarsest level. ! ! @@ -92,9 +92,9 @@ module mld_s_prec_type ! integer(psb_ipk_) :: outer_sweeps = 1 ! - ! Coarse solver requires some tricky checks, and this needs we record the - ! choice in the format given by the user, to keep track against what - ! is put later in the multilevel array + ! Coarse solver requires some tricky checks, and for this we need to + ! record the choice in the format given by the user, + ! to keep track against what is put later in the multilevel array ! integer(psb_ipk_) :: coarse_solver = -1 diff --git a/mlprec/mld_z_base_aggregator_mod.f90 b/mlprec/mld_z_base_aggregator_mod.f90 index 4579685b..8fe3d2ad 100644 --- a/mlprec/mld_z_base_aggregator_mod.f90 +++ b/mlprec/mld_z_base_aggregator_mod.f90 @@ -285,7 +285,7 @@ contains !! The mapping is store in ILAGGR; for each local row index I, !! ILAGGR(I) contains the index of the aggregate to which index I !! will contribute, in global numbering. - !! Many aggregation produce a binary tentative prolongator, but some + !! Many aggregations produce a binary tentative prolongator, but some !! do not, hence we also need the OP_PROL output. !! AG_DATA is passed here just in case some of the !! aggregators need it internally, most of them will ignore. diff --git a/mlprec/mld_z_base_smoother_mod.f90 b/mlprec/mld_z_base_smoother_mod.f90 index 589323aa..dce0b42d 100644 --- a/mlprec/mld_z_base_smoother_mod.f90 +++ b/mlprec/mld_z_base_smoother_mod.f90 @@ -56,6 +56,9 @@ ! contains a SOLVER object: the SOLVER operates locally within the ! current process, whereas the SMOOTHER object accounts for (possible) ! interactions between processes. +! Some solvers (MUMPS and SuperLU_DIST) can also operate on the entire +! distributed matrix, in which case the smoother object essentially +! becomes transparent. ! module mld_z_base_smoother_mod diff --git a/mlprec/mld_z_diag_solver.f90 b/mlprec/mld_z_diag_solver.f90 index 1928c505..ddaafd38 100644 --- a/mlprec/mld_z_diag_solver.f90 +++ b/mlprec/mld_z_diag_solver.f90 @@ -275,6 +275,18 @@ contains end module mld_z_diag_solver +! +! Module: mld_z_l1_diag_solver_mod +! +! This module defines: +! - the mld_z_l1_diag_solver_type data structure containing the +! L1 diagonal solver. +! The solver is defined as a diagonal containing in each element the +! inverse of the sum of the absolute values of the matrix entries +! along the corresponding row. +! Combined with a Jacobi "smoother" generates +! what are commonly known as the L1-Jacobi iterations +! module mld_z_l1_diag_solver diff --git a/mlprec/mld_z_gs_solver.f90 b/mlprec/mld_z_gs_solver.f90 index 0cb257d2..7615ce6d 100644 --- a/mlprec/mld_z_gs_solver.f90 +++ b/mlprec/mld_z_gs_solver.f90 @@ -47,8 +47,9 @@ ! backward GS (BWGS). The iterations are local to a process (they operate ! on the block diagonal). Combined with a Jacobi smoother will generate a ! hybrid-Gauss-Seidel solver, i.e. Gauss-Seidel within each process, Jacobi -! among the processes. -! +! among the processes. +! With two objects as pre- and post-smoothers it is possible to build a +! Forward-Backward smoother, suitable for symmetric iterations. ! module mld_z_gs_solver diff --git a/mlprec/mld_z_ilu_fact_mod.f90 b/mlprec/mld_z_ilu_fact_mod.f90 index 80edcf81..45e63e17 100644 --- a/mlprec/mld_z_ilu_fact_mod.f90 +++ b/mlprec/mld_z_ilu_fact_mod.f90 @@ -41,7 +41,7 @@ ! ! Module: mld_z_ilu_fact_mod ! -! This module defines some interfaces used internally by the implementation if +! This module defines some interfaces used internally by the implementation of ! mld_z_ilu_solver, but not visible to the end user. ! ! diff --git a/mlprec/mld_z_ilu_solver.f90 b/mlprec/mld_z_ilu_solver.f90 index 7698df50..18681b0c 100644 --- a/mlprec/mld_z_ilu_solver.f90 +++ b/mlprec/mld_z_ilu_solver.f90 @@ -51,7 +51,7 @@ ! threshold base ILU(T,L) ! 3. The diagonal is stored separately, so strictly speaking this is ! an incomplete LDU factorization; -! 4. The application phase is shared; +! 4. The application phase is shared among all variants; ! ! module mld_z_ilu_solver diff --git a/mlprec/mld_z_inner_mod.f90 b/mlprec/mld_z_inner_mod.f90 index b890049f..4016e44f 100644 --- a/mlprec/mld_z_inner_mod.f90 +++ b/mlprec/mld_z_inner_mod.f90 @@ -39,8 +39,7 @@ ! ! Module: mld_inner_mod ! -! This module defines the interfaces to the real/complex, single/double -! precision versions of inner MLD2P4 routines. +! This module defines the interfaces to inner MLD2P4 routines. ! The interfaces of the user level routines are defined in mld_prec_mod.f90. ! module mld_z_inner_mod diff --git a/mlprec/mld_z_jac_smoother.f90 b/mlprec/mld_z_jac_smoother.f90 index 82126dc3..06fa0113 100644 --- a/mlprec/mld_z_jac_smoother.f90 +++ b/mlprec/mld_z_jac_smoother.f90 @@ -44,10 +44,10 @@ ! the mld_z_jac_smoother_type data structure containing the ! smoother for a Jacobi/block Jacobi smoother. ! The smoother stores in ND the block off-diagonal matrix. -! One special case is treated separately, when the solver is DIAG +! One special case is treated separately, when the solver is DIAG or L1-DIAG ! then the ND is the entire off-diagonal part of the matrix (including the ! main diagonal block), so that it becomes possible to implement -! pure Jacobi global solver. +! a pure Jacobi or L1-Jacobi global solver. ! module mld_z_jac_smoother diff --git a/mlprec/mld_z_mumps_solver.F90 b/mlprec/mld_z_mumps_solver.F90 index c9da917c..8d894c0e 100644 --- a/mlprec/mld_z_mumps_solver.F90 +++ b/mlprec/mld_z_mumps_solver.F90 @@ -48,7 +48,7 @@ ! - the mld_z_mumps_solver_type data structure containing the ingredients ! to interface with the MUMPS package. ! 1. The factorization can be either restricted to the diagonal block of the -! current image or distributed (and thus exact) +! current image or distributed (and thus exact). ! module mld_z_mumps_solver use mld_z_base_solver_mod diff --git a/mlprec/mld_z_prec_mod.f90 b/mlprec/mld_z_prec_mod.f90 index d9f979ff..104bff58 100644 --- a/mlprec/mld_z_prec_mod.f90 +++ b/mlprec/mld_z_prec_mod.f90 @@ -39,7 +39,7 @@ ! ! Module: mld_z_prec_mod ! -! This module defines the interfaces to the real/complex, single/double +! This module defines the user interfaces to the real/complex, single/double ! precision versions of the user-level MLD2P4 routines. ! module mld_z_prec_mod diff --git a/mlprec/mld_z_prec_type.f90 b/mlprec/mld_z_prec_type.f90 index 8e948d86..ec144a7a 100644 --- a/mlprec/mld_z_prec_type.f90 +++ b/mlprec/mld_z_prec_type.f90 @@ -61,24 +61,24 @@ module mld_z_prec_type use psb_prec_mod, only : psb_zprec_type ! - ! Type: mld_Tprec_type. + ! Type: mld_zprec_type. ! ! This is the data type containing all the information about the multilevel - ! preconditioner (here and in the following 'T' denotes 'd', 's', 'c' and - ! 'z', according to the real/complex, single/double precision version of - ! MLD2P4). It consists of an array of 'one-level' intermediate data structures - ! of type mld_Tonelev_type, each containing the information needed to apply + ! preconditioner ('d', 's', 'c' and 'z', according to the real/complex, + ! single/double precision version of MLD2P4). + ! It consists of an array of 'one-level' intermediate data structures + ! of type mld_zonelev_type, each containing the information needed to apply ! the smoothing and the coarse-space correction at a generic level. RT is the ! real data type, i.e. S for both S and C, and D for both D and Z. ! - ! type mld_Tprec_type - ! type(mld_Tonelev_type), allocatable :: precv(:) - ! end type mld_Tprec_type + ! type mld_zprec_type + ! type(mld_zonelev_type), allocatable :: precv(:) + ! end type mld_zprec_type ! ! Note that the levels are numbered in increasing order starting from - ! the finest one and the number of levels is given by size(precv(:)), - ! and that is the id of the coarsest level. - ! In the multigrid literature authors often number the levels in decreasing + ! the level 1 as the finest one, and the number of levels is given by + ! size(precv(:)) which is the id of the coarsest level. + ! In the multigrid literature many authors number the levels in the opposite ! order, with level 0 being the id of the coarsest level. ! ! @@ -92,9 +92,9 @@ module mld_z_prec_type ! integer(psb_ipk_) :: outer_sweeps = 1 ! - ! Coarse solver requires some tricky checks, and this needs we record the - ! choice in the format given by the user, to keep track against what - ! is put later in the multilevel array + ! Coarse solver requires some tricky checks, and for this we need to + ! record the choice in the format given by the user, + ! to keep track against what is put later in the multilevel array ! integer(psb_ipk_) :: coarse_solver = -1