56 type(
mesh_t),
intent(inout),
target :: msh
58 type(
stack_nh_t),
allocatable :: new_mesh_dist(:)
59 type(
stack_nz_t),
allocatable :: new_zone_dist(:)
60 type(
stack_nc_t),
allocatable :: new_curve_dist(:)
62 type(
nmsh_hex_t),
allocatable :: recv_buf_msh(:)
66 integer,
allocatable :: recv_buf_idx(:), send_buf_idx(:)
67 type(mpi_status) :: status
68 integer :: i, j, k, ierr, max_recv_idx, label
69 integer :: src, dst, recv_size, gdim, tmp, new_el_idx, new_pel_idx
70 integer :: max_recv(3)
79 call msh%reset_periodic_ids()
85 allocate(new_zone_dist(0:
pe_size - 1))
87 call new_zone_dist(i)%init()
90 call redist_zone(msh, msh%wall, 1, parts, new_zone_dist)
91 call redist_zone(msh, msh%inlet, 2, parts, new_zone_dist)
92 call redist_zone(msh, msh%outlet, 3, parts, new_zone_dist)
93 call redist_zone(msh, msh%sympln, 4, parts, new_zone_dist)
94 call redist_zone(msh, msh%periodic, 5, parts, new_zone_dist)
95 call redist_zone(msh, msh%outlet_normal, 6, parts, new_zone_dist)
99 call redist_zone(msh, msh%labeled_zones(j), 7, parts, &
100 new_zone_dist, label)
106 allocate(new_curve_dist(0:
pe_size - 1))
108 call new_curve_dist(i)%init()
111 call redist_curve(msh, msh%curve, parts, new_curve_dist)
117 allocate(new_mesh_dist(0:(
pe_size - 1)))
119 call new_mesh_dist(i)%init()
123 ep => msh%elements(i)%e
126 el%v(j)%v_idx = ep%pts(j)%p%id()
127 el%v(j)%v_xyz = ep%pts(j)%p%x
129 call new_mesh_dist(parts%data(i))%push(el)
138 max_recv(1) =
max(max_recv(1), new_mesh_dist(i)%size())
139 max_recv(2) =
max(max_recv(2), new_zone_dist(i)%size())
140 max_recv(3) =
max(max_recv(3), new_curve_dist(i)%size())
143 call mpi_allreduce(mpi_in_place, max_recv, 3, mpi_integer, &
146 allocate(recv_buf_msh(max_recv(1)))
147 allocate(recv_buf_zone(max_recv(2)))
148 allocate(recv_buf_curve(max_recv(3)))
157 select type (nmd_array => new_mesh_dist(dst)%data)
159 call mpi_sendrecv(nmd_array, &
160 new_mesh_dist(dst)%size(),
mpi_nmsh_hex, dst, 0, recv_buf_msh, &
163 call mpi_get_count(status,
mpi_nmsh_hex, recv_size, ierr)
166 call new_mesh_dist(
pe_rank)%push(recv_buf_msh(j))
172 select type (nzd_array => new_zone_dist(dst)%data)
174 call mpi_sendrecv(nzd_array, &
175 new_zone_dist(dst)%size(),
mpi_nmsh_zone, dst, 1, recv_buf_zone,&
181 call new_zone_dist(
pe_rank)%push(recv_buf_zone(j))
184 call mpi_sendrecv(new_curve_dist(dst)%array(), &
185 new_curve_dist(dst)%size(),
mpi_nmsh_curve, dst, 2, recv_buf_curve,&
190 call new_curve_dist(
pe_rank)%push(recv_buf_curve(j))
194 deallocate(recv_buf_msh)
195 deallocate(recv_buf_zone)
196 deallocate(recv_buf_curve)
200 call new_mesh_dist(i)%free
201 call new_zone_dist(i)%free
202 call new_curve_dist(i)%free
209 call msh%init(gdim, new_mesh_dist(
pe_rank)%size())
211 call el_map%init(new_mesh_dist(
pe_rank)%size())
212 call glb_map%init(new_mesh_dist(
pe_rank)%size())
217 select type (np => new_mesh_dist(
pe_rank)%data)
219 do i = 1, new_mesh_dist(
pe_rank)%size()
221 p(j) =
point_t(np(i)%v(j)%v_xyz, np(i)%v(j)%v_idx)
223 call msh%add_element(i, np(i)%el_idx, &
224 p(1), p(2), p(3), p(4), p(5), p(6), p(7), p(8))
226 if (el_map%get(np(i)%el_idx, tmp) .gt. 0)
then
229 call el_map%set(np(i)%el_idx, tmp)
232 tmp = msh%elements(i)%e%id()
233 call glb_map%set(np(i)%el_idx, tmp)
235 call neko_error(
'Global element id already defined')
239 call new_mesh_dist(
pe_rank)%free()
250 select type(zp => new_zone_dist(
pe_rank)%data)
252 do i = 1, new_zone_dist(
pe_rank)%size()
253 if (zp(i)%type .eq. 5)
then
254 call pe_lst%push(zp(i)%p_e)
259 max_recv_idx = 2 * pe_lst%size()
260 call mpi_allreduce(mpi_in_place, max_recv_idx, 1, mpi_integer, &
262 allocate(recv_buf_idx(max_recv_idx))
263 allocate(send_buf_idx(max_recv_idx))
272 select type (pe_lst_array => pe_lst%data)
274 call mpi_sendrecv(pe_lst_array, &
275 pe_lst%size(), mpi_integer, dst, 0, recv_buf_idx, &
276 max_recv_idx, mpi_integer, src, 0,
neko_comm, status, ierr)
278 call mpi_get_count(status, mpi_integer, recv_size, ierr)
282 if (glb_map%get(recv_buf_idx(j), tmp) .eq. 0)
then
284 send_buf_idx(k) = recv_buf_idx(j)
286 send_buf_idx(k) = tmp
290 call mpi_sendrecv(send_buf_idx, k, mpi_integer, src, 1, &
291 recv_buf_idx, max_recv_idx, mpi_integer, dst, 1, &
293 call mpi_get_count(status, mpi_integer, recv_size, ierr)
295 do j = 1, recv_size, 2
296 call glb_map%set(recv_buf_idx(j), recv_buf_idx(j+1))
299 deallocate(recv_buf_idx)
300 deallocate(send_buf_idx)
306 select type (zp => new_zone_dist(
pe_rank)%data)
308 do i = 1, new_zone_dist(
pe_rank)%size()
309 if (el_map%get(zp(i)%e, new_el_idx) .gt. 0)
then
310 call neko_error(
'Missing element after redistribution')
312 select case(zp(i)%type)
314 call msh%mark_wall_facet(zp(i)%f, new_el_idx)
316 call msh%mark_inlet_facet(zp(i)%f, new_el_idx)
318 call msh%mark_outlet_facet(zp(i)%f, new_el_idx)
320 call msh%mark_sympln_facet(zp(i)%f, new_el_idx)
322 if (glb_map%get(zp(i)%p_e, new_pel_idx) .gt. 0)
then
323 call neko_error(
'Missing periodic element after redistribution')
326 call msh%mark_periodic_facet(zp(i)%f, new_el_idx, &
327 zp(i)%p_f, zp(i)%p_e, zp(i)%glb_pt_ids)
329 call msh%mark_outlet_normal_facet(zp(i)%f, new_el_idx)
331 call msh%mark_labeled_facet(zp(i)%f, new_el_idx, zp(i)%p_f)
334 do i = 1, new_zone_dist(
pe_rank)%size()
335 if (el_map%get(zp(i)%e, new_el_idx) .gt. 0)
then
336 call neko_error(
'Missing element after redistribution')
338 select case(zp(i)%type)
340 if (glb_map%get(zp(i)%p_e, new_pel_idx) .gt. 0)
then
341 call neko_error(
'Missing periodic element after redistribution')
344 call msh%apply_periodic_facet(zp(i)%f, new_el_idx, &
345 zp(i)%p_f, zp(i)%p_e, zp(i)%glb_pt_ids)
349 call new_zone_dist(
pe_rank)%free()
355 select type (cp => new_curve_dist(
pe_rank)%data)
357 do i = 1, new_curve_dist(
pe_rank)%size()
358 if (el_map%get(cp(i)%e, new_el_idx) .gt. 0)
then
359 call neko_error(
'Missing element after redistribution')
361 call msh%mark_curve_element(new_el_idx, cp(i)%curve_data, cp(i)%type)
364 call new_curve_dist(
pe_rank)%free()