8 INTEGER :: node,pid,
np,nullpid,node0
13 integer,
allocatable :: nelg(:)
14 integer :: nvtot, nelgv, nelgt
17 INTEGER :: wdsize,isize,lsize,csize,wdsizi
23 integer,
allocatable :: gsh_fld(:), xxth(:)
25 integer :: nekcomm, nekgroup, nekreal
28 integer,
private :: queue_dim(30)
29 integer,
private :: queue_fac(30)
30 integer,
private :: queue_div(30)
31 integer,
private :: num_queue
32 integer :: proc_pos(3)
33 integer :: proc_shape(3)
42 allocate(nelg(0:ldimt1))
43 allocate(gsh_fld(0:ldimt3), xxth(ldimt3))
48 use mesh, only : shape_x
49 use size_m
, only : lelt
50 use input, only : param
53 integer :: i, l, iel, ieg
55 integer :: my_shape(3), my_nid
56 integer :: factors(30), num_fac
57 integer :: largest_idx
63 do while (np_targ > 1)
65 if ((np_targ / i) * i == np_targ)
then
76 do while (num_fac > 0)
78 if (my_shape(2) > my_shape(largest_idx)) largest_idx = 2
79 if (my_shape(1) > my_shape(largest_idx)) largest_idx = 1
81 if ((my_shape(largest_idx) / factors(num_fac)) * factors(num_fac) /= my_shape(largest_idx))
then
82 if (nid == 0)
write(*,*)
"Largest dimension isn't divisible by largest factor"
85 my_shape(largest_idx) = my_shape(largest_idx) / factors(num_fac)
86 num_queue = num_queue + 1
87 queue_dim(num_queue) = largest_idx
88 queue_fac(num_queue) = factors(num_fac)
89 queue_div(num_queue) = my_shape(largest_idx)
96 do queue_pos = num_queue, 1, -1
97 l = queue_dim(queue_pos)
98 proc_pos(l) = proc_pos(l) + mod(my_nid, queue_fac(queue_pos)) * my_shape(l)
99 my_shape(l) = my_shape(l) * queue_fac(queue_pos)
100 my_nid = my_nid / queue_fac(queue_pos)
103 if (param(75) < 1)
then
106 if (
gllnid(ieg) /= nid .or.
gllel(ieg) /= iel)
then
107 write(*,*)
"LGL/GLL mismatch", nid,
gllnid(ieg), iel,
gllel(ieg)
110 if (nid == 0)
write(*,*)
"LGL/GLL checks out"
118 integer,
intent(in) :: ieg
125 do queue_pos = 1, num_queue
126 gllnid = queue_fac(queue_pos) *
gllnid + ix(queue_dim(queue_pos)) / queue_div(queue_pos)
127 ix(queue_dim(queue_pos)) = mod(ix(queue_dim(queue_pos)), queue_div(queue_pos))
135 integer,
intent(in) :: ieg
137 integer,
save :: my_seq(30) = -1
141 if (my_seq(1) < 0)
then
143 do queue_pos = 1, num_queue
144 my_seq(queue_pos) = ix(queue_dim(queue_pos)) / queue_div(queue_pos)
145 ix(queue_dim(queue_pos)) = mod(ix(queue_dim(queue_pos)), queue_div(queue_pos))
150 do queue_pos = 1, num_queue
151 if (my_seq(queue_pos) /= ix(queue_dim(queue_pos)) / queue_div(queue_pos))
then
155 ix(queue_dim(queue_pos)) = mod(ix(queue_dim(queue_pos)), queue_div(queue_pos))
165 integer,
intent(in) :: ieg
169 ix(1) = mod(ix(1), proc_shape(1))
170 ix(2) = mod(ix(2), proc_shape(2))
171 ix(3) = mod(ix(3), proc_shape(3))
172 gllel = 1 + ix(1) + ix(2)*proc_shape(1) + ix(3)*proc_shape(1)*proc_shape(2)
179 integer,
intent(in) :: iel
183 my_pos(1) = proc_pos(1) + mod((iel - 1), proc_shape(1))
184 my_pos(2) = proc_pos(2) + mod((iel - 1)/(proc_shape(1)), proc_shape(2))
185 my_pos(3) = proc_pos(3) + mod((iel - 1)/(proc_shape(1)*proc_shape(2)), proc_shape(3))
integer function gllel(ieg)
logical function my_ieg(ieg)
integer function xyz_to_ieg(xyz)
integer function, dimension(3) ieg_to_xyz(ieg)
subroutine init_parallel()
integer function lglel(iel)
integer function gllnid(ieg)