145 logical,
intent(in) :: inertia
149 integer :: n_particles_old
150 integer :: n_particles_local
151 integer,
allocatable :: particle_ids_local(:)
152 type(
vector_t),
pointer :: x_local, y_local, z_local
153 type(
vector_t),
pointer :: u_local, v_local, w_local
154 type(
vector_t),
pointer :: acc_xlocal, acc_ylocal, acc_zlocal
155 type(
vector_t),
pointer :: d_local, rho_local
156 type(
vector_t),
pointer :: u_lag_local, v_lag_local, w_lag_local
157 type(
vector_t),
pointer :: u_laglag_local, v_laglag_local, w_laglag_local
158 type(
vector_t),
pointer :: acc_xlag_local, acc_ylag_local, acc_zlag_local
159 type(
vector_t),
pointer :: acc_xlaglag_local, &
160 acc_ylaglag_local, acc_zlaglag_local
163 logical :: migration_needed
164 integer :: ind_basic(9)
165 integer :: ind_inertia(14)
182 call periodic_bc%wrap(x, y, z, n, u, v, w, u_lag, &
183 v_lag, w_lag, u_laglag, v_laglag, w_laglag, &
184 acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, &
185 acc_ylaglag, acc_zlaglag)
187 call periodic_bc%wrap(x, y, z, n, u, v, w, u_lag, &
188 v_lag, w_lag, u_laglag, v_laglag, w_laglag)
191 call global_interp%find_points(x%x, y%x, z%x, n)
192 call mpi_allreduce(n, n_global, 1, mpi_integer, mpi_sum,
neko_comm, &
198 call global_interp%find_points(x%x, y%x, z%x, n)
199 n_particles_local = global_interp%n_points_local
201 migration_needed = .false.
202 do rank = 0, global_interp%pe_size - 1
204 migration_needed = migration_needed .or. &
205 global_interp%n_points_pe(rank) .gt. 0
206 migration_needed = migration_needed .or. &
207 global_interp%n_points_pe_local(rank) .gt. 0
210 if (.not. migration_needed .and. n_particles_local .eq. n)
then
211 call this%localize_global_interpolation(global_interp, n)
212 call mpi_allreduce(n, n_global, 1, mpi_integer, mpi_sum,
neko_comm, &
217 allocate(particle_ids_local(n_particles_local))
218 particle_ids_local = 0
220 n_particles_local, .false.)
222 n_particles_local, .false.)
224 n_particles_local, .false.)
226 n_particles_local, .false.)
228 n_particles_local, .false.)
230 n_particles_local, .false.)
232 n_particles_local, .false.)
234 n_particles_local, .false.)
236 n_particles_local, .false.)
239 n_particles_local, .false.)
241 n_particles_local, .false.)
243 n_particles_local, .false.)
245 n_particles_local, .false.)
247 n_particles_local, .false.)
249 n_particles_local, .false.)
251 n_particles_local, .false.)
253 n_particles_local, .false.)
255 ind_inertia(9), n_particles_local, .false.)
257 ind_inertia(10), n_particles_local, .false.)
259 ind_inertia(11), n_particles_local, .false.)
261 ind_inertia(12), n_particles_local, .false.)
263 ind_inertia(13), n_particles_local, .false.)
265 ind_inertia(14), n_particles_local, .false.)
268 call global_interp%init_redist_comm(migrate_comm)
269 call this%migrate_particle_ids(migrate_comm,
particles%ids, &
270 n_particles_old, n_particles_local, particle_ids_local)
271 call this%migrate_particle_scalar(migrate_comm, x, n_particles_old, &
272 n_particles_local, x_local)
273 call this%migrate_particle_scalar(migrate_comm, y, n_particles_old, &
274 n_particles_local, y_local)
275 call this%migrate_particle_scalar(migrate_comm, z, n_particles_old, &
276 n_particles_local, z_local)
277 call this%migrate_particle_scalar(migrate_comm, u_lag, n_particles_old, &
278 n_particles_local, u_lag_local)
279 call this%migrate_particle_scalar(migrate_comm, v_lag, n_particles_old, &
280 n_particles_local, v_lag_local)
281 call this%migrate_particle_scalar(migrate_comm, w_lag, n_particles_old, &
282 n_particles_local, w_lag_local)
283 call this%migrate_particle_scalar(migrate_comm, u_laglag, n_particles_old, &
284 n_particles_local, u_laglag_local)
285 call this%migrate_particle_scalar(migrate_comm, v_laglag, n_particles_old, &
286 n_particles_local, v_laglag_local)
287 call this%migrate_particle_scalar(migrate_comm, w_laglag, n_particles_old, &
288 n_particles_local, w_laglag_local)
290 call this%migrate_particle_scalar(migrate_comm, u, n_particles_old, &
291 n_particles_local, u_local)
292 call this%migrate_particle_scalar(migrate_comm, v, n_particles_old, &
293 n_particles_local, v_local)
294 call this%migrate_particle_scalar(migrate_comm, w, n_particles_old, &
295 n_particles_local, w_local)
296 call this%migrate_particle_scalar(migrate_comm, acc_x, n_particles_old, &
297 n_particles_local, acc_xlocal)
298 call this%migrate_particle_scalar(migrate_comm, acc_y, n_particles_old, &
299 n_particles_local, acc_ylocal)
300 call this%migrate_particle_scalar(migrate_comm, acc_z, n_particles_old, &
301 n_particles_local, acc_zlocal)
302 call this%migrate_particle_scalar(migrate_comm, d, &
303 n_particles_old, n_particles_local, d_local)
304 call this%migrate_particle_scalar(migrate_comm, rho, &
305 n_particles_old, n_particles_local, rho_local)
306 call this%migrate_particle_scalar(migrate_comm, acc_xlag, &
307 n_particles_old, n_particles_local, acc_xlag_local)
308 call this%migrate_particle_scalar(migrate_comm, acc_ylag, &
309 n_particles_old, n_particles_local, acc_ylag_local)
310 call this%migrate_particle_scalar(migrate_comm, acc_zlag, &
311 n_particles_old, n_particles_local, acc_zlag_local)
312 call this%migrate_particle_scalar(migrate_comm, acc_xlaglag, &
313 n_particles_old, n_particles_local, acc_xlaglag_local)
314 call this%migrate_particle_scalar(migrate_comm, acc_ylaglag, &
315 n_particles_old, n_particles_local, acc_ylaglag_local)
316 call this%migrate_particle_scalar(migrate_comm, acc_zlaglag, &
317 n_particles_old, n_particles_local, acc_zlaglag_local)
319 call migrate_comm%free()
321 n = n_particles_local
325 call move_alloc(particle_ids_local,
particles%ids)
329 u_laglag = u_laglag_local
330 v_laglag = v_laglag_local
331 w_laglag = w_laglag_local
341 acc_xlag = acc_xlag_local
342 acc_ylag = acc_ylag_local
343 acc_zlag = acc_zlag_local
344 acc_xlaglag = acc_xlaglag_local
345 acc_ylaglag = acc_ylaglag_local
346 acc_zlaglag = acc_zlaglag_local
349 if (
allocated(particle_ids_local))
deallocate(particle_ids_local)
353 call this%localize_global_interpolation(global_interp, n)
354 call mpi_allreduce(n, n_global, 1, mpi_integer, mpi_sum,
neko_comm, ierr)
365 logical,
intent(in) :: inertia
366 type(particles_t),
intent(inout) :: particles
368 integer,
allocatable :: ids_local(:)
369 type(vector_t),
pointer :: x_local, y_local, z_local
370 type(vector_t),
pointer :: u_lag_local, v_lag_local, w_lag_local
371 type(vector_t),
pointer :: u_laglag_local, v_laglag_local, w_laglag_local
372 type(vector_t),
pointer :: u_local, v_local, w_local
373 type(vector_t),
pointer :: acc_xlocal, acc_ylocal, acc_zlocal
374 type(vector_t),
pointer :: d_local, rho_local
375 type(vector_t),
pointer :: acc_xlag_local, acc_ylag_local, acc_zlag_local
376 type(vector_t),
pointer :: acc_xlaglag_local, &
377 acc_ylaglag_local, acc_zlaglag_local
378 integer,
allocatable :: counts(:)
379 integer,
allocatable :: offsets(:)
381 integer :: ind_basic(9), ind_inertia(14)
398 allocate(ids_local(n_local))
399 call neko_scratch_registry%request_vector(x_local, ind_basic(1), &
401 call neko_scratch_registry%request_vector(y_local, ind_basic(2), &
403 call neko_scratch_registry%request_vector(z_local, ind_basic(3), &
405 call neko_scratch_registry%request_vector(u_lag_local, ind_basic(4), &
407 call neko_scratch_registry%request_vector(v_lag_local, ind_basic(5), &
409 call neko_scratch_registry%request_vector(w_lag_local, ind_basic(6), &
411 call neko_scratch_registry%request_vector(u_laglag_local, ind_basic(7), &
413 call neko_scratch_registry%request_vector(v_laglag_local, ind_basic(8), &
415 call neko_scratch_registry%request_vector(w_laglag_local, ind_basic(9), &
418 call neko_scratch_registry%request_vector(u_local, ind_inertia(1), &
420 call neko_scratch_registry%request_vector(v_local, ind_inertia(2), &
422 call neko_scratch_registry%request_vector(w_local, ind_inertia(3), &
424 call neko_scratch_registry%request_vector(acc_xlocal, ind_inertia(4), &
426 call neko_scratch_registry%request_vector(acc_ylocal, ind_inertia(5), &
428 call neko_scratch_registry%request_vector(acc_zlocal, ind_inertia(6), &
430 call neko_scratch_registry%request_vector(d_local, ind_inertia(7), &
432 call neko_scratch_registry%request_vector(rho_local, ind_inertia(8), &
434 call neko_scratch_registry%request_vector(acc_xlag_local, &
435 ind_inertia(9), n_local, .false.)
436 call neko_scratch_registry%request_vector(acc_ylag_local, &
437 ind_inertia(10), n_local, .false.)
438 call neko_scratch_registry%request_vector(acc_zlag_local, &
439 ind_inertia(11), n_local, .false.)
440 call neko_scratch_registry%request_vector(acc_xlaglag_local, &
441 ind_inertia(12), n_local, .false.)
442 call neko_scratch_registry%request_vector(acc_ylaglag_local, &
443 ind_inertia(13), n_local, .false.)
444 call neko_scratch_registry%request_vector(acc_zlaglag_local, &
445 ind_inertia(14), n_local, .false.)
448 call this%distribute_particle_ids(
particles%ids, counts, offsets, n_local, &
450 call this%distribute_particle_scalar(x, counts, offsets, n_local, x_local)
451 call this%distribute_particle_scalar(y, counts, offsets, n_local, y_local)
452 call this%distribute_particle_scalar(z, counts, offsets, n_local, z_local)
453 call this%distribute_particle_scalar(u_lag, counts, offsets, n_local, &
455 call this%distribute_particle_scalar(v_lag, counts, offsets, n_local, &
457 call this%distribute_particle_scalar(w_lag, counts, offsets, n_local, &
459 call this%distribute_particle_scalar(u_laglag, counts, offsets, n_local, &
461 call this%distribute_particle_scalar(v_laglag, counts, offsets, n_local, &
463 call this%distribute_particle_scalar(w_laglag, counts, offsets, n_local, &
466 call this%distribute_particle_scalar(u, counts, offsets, n_local, &
468 call this%distribute_particle_scalar(v, counts, offsets, n_local, &
470 call this%distribute_particle_scalar(w, counts, offsets, n_local, &
472 call this%distribute_particle_scalar(acc_x, counts, offsets, n_local, &
474 call this%distribute_particle_scalar(acc_y, counts, offsets, n_local, &
476 call this%distribute_particle_scalar(acc_z, counts, offsets, n_local, &
478 call this%distribute_particle_scalar(d, counts, offsets, n_local, &
480 call this%distribute_particle_scalar(rho, counts, offsets, n_local, &
482 call this%distribute_particle_scalar(acc_xlag, counts, offsets, &
483 n_local, acc_xlag_local)
484 call this%distribute_particle_scalar(acc_ylag, counts, offsets, &
485 n_local, acc_ylag_local)
486 call this%distribute_particle_scalar(acc_zlag, counts, offsets, &
487 n_local, acc_zlag_local)
488 call this%distribute_particle_scalar(acc_xlaglag, counts, offsets, &
489 n_local, acc_xlaglag_local)
490 call this%distribute_particle_scalar(acc_ylaglag, counts, offsets, &
491 n_local, acc_ylaglag_local)
492 call this%distribute_particle_scalar(acc_zlaglag, counts, offsets, &
493 n_local, acc_zlaglag_local)
500 call move_alloc(ids_local,
particles%ids)
504 u_laglag = u_laglag_local
505 v_laglag = v_laglag_local
506 w_laglag = w_laglag_local
516 acc_xlag = acc_xlag_local
517 acc_ylag = acc_ylag_local
518 acc_zlag = acc_zlag_local
519 acc_xlaglag = acc_xlaglag_local
520 acc_ylaglag = acc_ylaglag_local
521 acc_zlaglag = acc_zlaglag_local
524 if (
allocated(ids_local))
deallocate(ids_local)
525 call neko_scratch_registry%relinquish(ind_basic)
526 if (inertia)
call neko_scratch_registry%relinquish(ind_inertia)