34submodule(
lpt) lpt_wall_collision
41 use,
intrinsic :: iso_c_binding, only : c_ptr, c_null_ptr, c_associated
51 module subroutine lpt_init_wall_facet_mask(wall_facet_mask, msh, &
53 logical,
allocatable,
intent(inout) :: wall_facet_mask(:, :)
54 type(mesh_t),
intent(in) :: msh
55 integer,
intent(in) :: wall_zone_indices(:)
62 if (
allocated(wall_facet_mask))
deallocate(wall_facet_mask)
63 allocate(wall_facet_mask(2 * msh%gdim, msh%nelv))
64 wall_facet_mask = .false.
66 do i = 1,
size(wall_zone_indices)
67 zone_id = wall_zone_indices(i)
68 if (zone_id .lt. 1 .or. zone_id .gt.
size(msh%labeled_zones))
then
69 call neko_error(
"lpt wall_zone_indices contains an invalid zone id")
72 do j = 1, msh%labeled_zones(zone_id)%size
73 facet = msh%labeled_zones(zone_id)%facet_el(j)%x(1)
74 el = msh%labeled_zones(zone_id)%facet_el(j)%x(2)
75 wall_facet_mask(facet, el) = .true.
78 end subroutine lpt_init_wall_facet_mask
89 module subroutine lpt_handle_elastic_wall_collisions(this, x_old, y_old, &
90 z_old, u_old, v_old, w_old)
91 class(lpt_t),
intent(inout) :: this
92 type(vector_t),
intent(in) :: x_old, y_old, z_old
93 type(vector_t),
intent(inout) :: u_old, v_old, w_old
94 type(matrix_t) :: rst_new
95 type(vector_t),
pointer :: resx, resy, resz
96 integer,
allocatable :: el_list(:)
97 integer,
allocatable :: wall_facet_mask_i(:, :)
98 type(c_ptr) :: el_list_d
99 type(c_ptr) :: wall_facet_mask_d
104 associate(global_interp => this%global_interp, msh => this%msh, &
105 dm_xh => this%dm_Xh, coef => this%coef, &
106 wall_facet_mask => this%wall_facet_mask, &
107 x => this%particles%x, y => this%particles%y, &
108 z => this%particles%z, d => this%particles%d, &
109 u => this%particles%u, v => this%particles%v, &
110 w => this%particles%w, u_lag => this%particles%u_lag, &
111 v_lag => this%particles%v_lag, w_lag => this%particles%w_lag, &
112 u_laglag => this%particles%u_laglag, &
113 v_laglag => this%particles%v_laglag, &
114 w_laglag => this%particles%w_laglag, &
115 acc_x => this%particles%acc_x, acc_y => this%particles%acc_y, &
116 acc_z => this%particles%acc_z, &
117 acc_xlag => this%particles%acc_xlag, &
118 acc_ylag => this%particles%acc_ylag, &
119 acc_zlag => this%particles%acc_zlag, &
120 acc_xlaglag => this%particles%acc_xlaglag, &
121 acc_ylaglag => this%particles%acc_ylaglag, &
122 acc_zlaglag => this%particles%acc_zlaglag, lag_len => this%lag_len)
127 el_list_d = c_null_ptr
128 wall_facet_mask_d = c_null_ptr
131 call rst_new%init(3, n)
141 el_list(i) = global_interp%el_owner0_local(i)
147 call global_interp%rst_finder%find(rst_new, x, y, z, el_list, n, &
151 allocate(wall_facet_mask_i(
size(wall_facet_mask, 1), &
152 size(wall_facet_mask, 2)))
153 wall_facet_mask_i = merge(1, 0, wall_facet_mask)
154 call device_map(wall_facet_mask_i, wall_facet_mask_d, &
155 size(wall_facet_mask_i))
160 wall_facet_mask_d, el_list_d, x_old, y_old, z_old, x, y, z, d, &
161 u, v, w, u_lag, v_lag, w_lag, u_laglag, v_laglag, w_laglag, &
162 acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, acc_ylaglag, &
163 acc_zlaglag, u_old, v_old, w_old, acc_x, acc_y, acc_z, &
166 call lpt_wall_collision_sync_from_device(x, y, z, u, v, w, u_lag, &
167 v_lag, w_lag, u_laglag, v_laglag, w_laglag, acc_xlag, &
168 acc_ylag, acc_zlag, acc_xlaglag, acc_ylaglag, acc_zlaglag, &
169 u_old, v_old, w_old, acc_x, acc_y, acc_z)
173 deallocate(wall_facet_mask_i)
176 wall_facet_mask, el_list, x_old, y_old, z_old, x, y, z, d, u, &
177 v, w, u_lag, v_lag, w_lag, u_laglag, v_laglag, w_laglag, &
178 acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, acc_ylaglag, &
179 acc_zlaglag, u_old, v_old, w_old, acc_x, acc_y, acc_z, &
183 if (c_associated(el_list_d))
then
188 if (
allocated(el_list))
deallocate(el_list)
193 end subroutine lpt_handle_elastic_wall_collisions
196 subroutine lpt_wall_collision_sync_from_device(x, y, z, u, v, w, &
197 u_lag, v_lag, w_lag, u_laglag, v_laglag, w_laglag, acc_xlag, &
198 acc_ylag, acc_zlag, acc_xlaglag, acc_ylaglag, acc_zlaglag, u_old, &
199 v_old, w_old, acc_x, acc_y, acc_z)
200 type(vector_t),
intent(inout) :: x, y, z
201 type(vector_t),
intent(inout) :: u, v, w
202 type(vector_t),
intent(inout) :: u_lag, v_lag, w_lag
203 type(vector_t),
intent(inout) :: u_laglag, v_laglag, w_laglag
204 type(vector_t),
intent(inout) :: acc_xlag, acc_ylag, acc_zlag
205 type(vector_t),
intent(inout) :: acc_xlaglag, acc_ylaglag
206 type(vector_t),
intent(inout) :: acc_zlaglag
207 type(vector_t),
intent(inout) :: u_old, v_old, w_old
208 type(vector_t),
intent(inout) :: acc_x, acc_y, acc_z
235 end subroutine lpt_wall_collision_sync_from_device
237end submodule lpt_wall_collision
Deassociate a Fortran array from a device pointer.
Map a Fortran array to a device (allocate and associate)
Copy data between host and device (or device and device)
Synchronize a device or stream.
Device abstraction, common interface for various accelerators.
integer, parameter, public host_to_device
subroutine, public device_free(x_d)
Deallocate memory on the device.
integer, parameter, public device_to_host
CPU implementation for LPT wall-collision handling.
subroutine, public lpt_handle_elastic_wall_collisions_cpu(msh, dm_xh, coef, wall_facet_mask, el_list, x_old, y_old, z_old, x, y, z, d, u, v, w, u_lag, v_lag, w_lag, u_laglag, v_laglag, w_laglag, acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, acc_ylaglag, acc_zlaglag, u_old, v_old, w_old, acc_x, acc_y, acc_z, lag_len, n)
Reflect inertial particles that hit configured wall facets on the CPU.
Device dispatch for LPT elastic wall-collision handling.
subroutine, public lpt_handle_elastic_wall_collisions_device(msh, dm_xh, coef, wall_facet_mask_d, el_list_d, x_old, y_old, z_old, x, y, z, d, u, v, w, u_lag, v_lag, w_lag, u_laglag, v_laglag, w_laglag, acc_xlag, acc_ylag, acc_zlag, acc_xlaglag, acc_ylaglag, acc_zlaglag, u_old, v_old, w_old, acc_x, acc_y, acc_z, lag_len, n, strm)
Launch device kernel for elastic wall-collision reflection.
Implements lpt_t. (Lagrangian Particle Tracking)
integer, parameter neko_bcknd_device
Defines a registry for storing and requesting temporary objects This can be used when you have a func...
type(scratch_registry_t), target, public neko_scratch_registry
Global scratch registry.