31 type(mpi_grp_t) :: mpi_grp
34 logical :: double_sided_comms
52 class(ring_pattern_t),
intent(inout) :: this
53 type(mpi_grp_t),
intent(in) :: mpi_grp
54 logical,
intent(in) :: double_sided_comms
58 this%double_sided_comms = double_sided_comms
59 this%mpi_grp = mpi_grp
61 if (this%mpi_grp%size <= 0)
then
67 if (double_sided_comms)
then
68 this%nsteps = int((mpi_grp%size+2)/2)-1
70 this%nsteps = mpi_grp%size-1
73 if (this%nsteps > 0)
then
74 write(
message(1),
'(a,i0,a)')
"Debug: The ring pattern will perform ", this%nsteps,
" steps."
82 integer pure function ring_pattern_get_nsteps(this)
83 class(ring_pattern_t),
intent(in) :: this
85 ring_pattern_get_nsteps = this%nsteps
107 integer pure function ring_pattern_get_rank_to(this, istep) result(rank_to)
108 class(ring_pattern_t),
intent(in) :: this
109 integer,
intent(in) :: istep
111 logical :: last_step, even_number_tasks, rank_to_first_half
113 rank_to = mod(this%mpi_grp%rank + istep, this%mpi_grp%size)
115 if (this%double_sided_comms)
then
116 last_step = istep == this%nsteps
117 even_number_tasks = mod(this%mpi_grp%size, 2) == 0
118 rank_to_first_half = rank_to < this%mpi_grp%size/2
120 if (last_step .and. even_number_tasks .and. rank_to_first_half)
then
129 integer,
intent(in) :: istep
131 logical :: last_step, even_number_tasks, rank_first_half
133 rank_fr = modulo(this%mpi_grp%rank - istep, this%mpi_grp%size)
135 if (this%double_sided_comms)
then
136 last_step = istep == this%nsteps
137 even_number_tasks = mod(this%mpi_grp%size, 2) == 0
138 rank_first_half = this%mpi_grp%rank < this%mpi_grp%size/2
139 if (last_step .and. even_number_tasks .and. rank_first_half)
then
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This module is an helper to perform ring-pattern communications among all states.
integer pure function ring_pattern_get_nsteps(this)
Returns the total number of steps in the ring.
subroutine ring_pattern_start(this, mpi_grp, double_sided_comms)
Starts the ring pattern scheme.
integer pure function ring_pattern_get_rank_from(this, istep)
Returns the rank from which we receive the information.
integer pure function ring_pattern_get_rank_to(this, istep)
Returns the rank where to send the information.