59 type(
mesh_t),
intent(inout),
target :: msh
61 type(
stack_nh_t),
allocatable :: new_mesh_dist(:)
62 type(
stack_nz_t),
allocatable :: new_zone_dist(:)
63 type(
stack_nc_t),
allocatable :: new_curve_dist(:)
65 type(
nmsh_hex_t),
allocatable :: recv_buf_msh(:)
69 integer,
allocatable :: recv_buf_idx(:), send_buf_idx(:)
70 type(mpi_status) :: status
71 integer :: i, j, k, ierr, max_recv_idx, label
72 integer :: src, dst, recv_size, gdim, tmp, new_el_idx, new_pel_idx
73 integer :: max_recv(3)
82 call msh%reset_periodic_ids()
88 allocate(new_zone_dist(0:
pe_size - 1))
90 call new_zone_dist(i)%init()
93 call redist_zone(msh, msh%periodic, 5, parts, new_zone_dist)
97 call redist_zone(msh, msh%labeled_zones(j), 7, parts, &
104 allocate(new_curve_dist(0:
pe_size - 1))
106 call new_curve_dist(i)%init()
109 call redist_curve(msh, msh%curve, parts, new_curve_dist)
115 allocate(new_mesh_dist(0:(
pe_size - 1)))
117 call new_mesh_dist(i)%init()
121 ep => msh%elements(i)%e
124 el%v(j)%v_idx = ep%pts(j)%p%id()
125 el%v(j)%v_xyz = ep%pts(j)%p%x
127 call new_mesh_dist(parts%data(i))%push(el)
136 max_recv(1) =
max(max_recv(1), new_mesh_dist(i)%size())
137 max_recv(2) =
max(max_recv(2), new_zone_dist(i)%size())
138 max_recv(3) =
max(max_recv(3), new_curve_dist(i)%size())
141 call mpi_allreduce(mpi_in_place, max_recv, 3, mpi_integer, &
144 allocate(recv_buf_msh(max_recv(1)))
145 allocate(recv_buf_zone(max_recv(2)))
146 allocate(recv_buf_curve(max_recv(3)))
155 select type (nmd_array => new_mesh_dist(dst)%data)
157 call mpi_sendrecv(nmd_array, &
158 new_mesh_dist(dst)%size(),
mpi_nmsh_hex, dst, 0, recv_buf_msh, &
161 call mpi_get_count(status,
mpi_nmsh_hex, recv_size, ierr)
164 call new_mesh_dist(
pe_rank)%push(recv_buf_msh(j))
170 select type (nzd_array => new_zone_dist(dst)%data)
172 call mpi_sendrecv(nzd_array, &
173 new_zone_dist(dst)%size(),
mpi_nmsh_zone, dst, 1, recv_buf_zone,&
179 call new_zone_dist(
pe_rank)%push(recv_buf_zone(j))
182 call mpi_sendrecv(new_curve_dist(dst)%array(), &
183 new_curve_dist(dst)%size(),
mpi_nmsh_curve, dst, 2, recv_buf_curve,&
188 call new_curve_dist(
pe_rank)%push(recv_buf_curve(j))
192 deallocate(recv_buf_msh)
193 deallocate(recv_buf_zone)
194 deallocate(recv_buf_curve)
198 call new_mesh_dist(i)%free
199 call new_zone_dist(i)%free
200 call new_curve_dist(i)%free
207 call msh%init(gdim, new_mesh_dist(
pe_rank)%size())
209 call el_map%init(new_mesh_dist(
pe_rank)%size())
210 call glb_map%init(new_mesh_dist(
pe_rank)%size())
215 select type (np => new_mesh_dist(
pe_rank)%data)
217 do i = 1, new_mesh_dist(
pe_rank)%size()
219 call p(j)%init(np(i)%v(j)%v_xyz, np(i)%v(j)%v_idx)
221 call msh%add_element(i, np(i)%el_idx, &
222 p(1), p(2), p(3), p(4), p(5), p(6), p(7), p(8))
224 if (el_map%get(np(i)%el_idx, tmp) .gt. 0)
then
227 call el_map%set(np(i)%el_idx, tmp)
230 tmp = msh%elements(i)%e%id()
231 call glb_map%set(np(i)%el_idx, tmp)
233 call neko_error(
'Global element id already defined')
237 call new_mesh_dist(
pe_rank)%free()
238 if (
allocated(new_mesh_dist))
then
239 deallocate(new_mesh_dist)
251 select type(zp => new_zone_dist(
pe_rank)%data)
253 do i = 1, new_zone_dist(
pe_rank)%size()
254 if (zp(i)%type .eq. 5)
then
255 call pe_lst%push(zp(i)%p_e)
260 max_recv_idx = 2 * pe_lst%size()
261 call mpi_allreduce(mpi_in_place, max_recv_idx, 1, mpi_integer, &
263 allocate(recv_buf_idx(max_recv_idx))
264 allocate(send_buf_idx(max_recv_idx))
273 select type (pe_lst_array => pe_lst%data)
275 call mpi_sendrecv(pe_lst_array, &
276 pe_lst%size(), mpi_integer, dst, 0, recv_buf_idx, &
277 max_recv_idx, mpi_integer, src, 0,
neko_comm, status, ierr)
279 call mpi_get_count(status, mpi_integer, recv_size, ierr)
283 if (glb_map%get(recv_buf_idx(j), tmp) .eq. 0)
then
285 send_buf_idx(k) = recv_buf_idx(j)
287 send_buf_idx(k) = tmp
291 call mpi_sendrecv(send_buf_idx, k, mpi_integer, src, 1, &
292 recv_buf_idx, max_recv_idx, mpi_integer, dst, 1, &
294 call mpi_get_count(status, mpi_integer, recv_size, ierr)
296 do j = 1, recv_size, 2
297 call glb_map%set(recv_buf_idx(j), recv_buf_idx(j+1))
300 deallocate(recv_buf_idx)
301 deallocate(send_buf_idx)
307 select type (zp => new_zone_dist(
pe_rank)%data)
309 do i = 1, new_zone_dist(
pe_rank)%size()
310 if (el_map%get(zp(i)%e, new_el_idx) .gt. 0)
then
311 call neko_error(
'Missing element after redistribution')
313 select case(zp(i)%type)
315 if (glb_map%get(zp(i)%p_e, new_pel_idx) .gt. 0)
then
316 call neko_error(
'Missing periodic element after redistribution')
319 call msh%mark_periodic_facet(zp(i)%f, new_el_idx, &
320 zp(i)%p_f, zp(i)%p_e, zp(i)%glb_pt_ids)
322 call msh%mark_labeled_facet(zp(i)%f, new_el_idx, zp(i)%p_f)
325 do i = 1, new_zone_dist(
pe_rank)%size()
326 if (el_map%get(zp(i)%e, new_el_idx) .gt. 0)
then
327 call neko_error(
'Missing element after redistribution')
329 select case(zp(i)%type)
331 if (glb_map%get(zp(i)%p_e, new_pel_idx) .gt. 0)
then
332 call neko_error(
'Missing periodic element after redistribution')
335 call msh%apply_periodic_facet(zp(i)%f, new_el_idx, &
336 zp(i)%p_f, zp(i)%p_e, zp(i)%glb_pt_ids)
340 call new_zone_dist(
pe_rank)%free()
341 if (
allocated(new_zone_dist))
then
342 deallocate(new_zone_dist)
349 select type (cp => new_curve_dist(
pe_rank)%data)
351 do i = 1, new_curve_dist(
pe_rank)%size()
352 if (el_map%get(cp(i)%e, new_el_idx) .gt. 0)
then
353 call neko_error(
'Missing element after redistribution')
355 call msh%mark_curve_element(new_el_idx, cp(i)%curve_data, cp(i)%type)
358 call new_curve_dist(
pe_rank)%free()
359 if (
allocated(new_curve_dist))
then
360 deallocate(new_curve_dist)