276 subroutine les_model_compute_delta(this)
277 class(les_model_t),
intent(inout) :: this
278 integer :: e, i, j, k
279 integer :: im, ip, jm, jp, km, kp
280 real(kind=rp) :: di, dj, dk, ndim_inv, volume_element
281 integer :: lx_half, ly_half, lz_half
282 character(len=:),
allocatable :: type_string
284 lx_half = this%coef%Xh%lx / 2
285 ly_half = this%coef%Xh%ly / 2
286 lz_half = this%coef%Xh%lz / 2
288 associate(dof => this%coef%dof)
290 if (this%delta_type .eq.
"elementwise_max")
then
293 do e = 1, this%coef%msh%nelv
294 di = (dof%x%x(lx_half, 1, 1, e) &
295 - dof%x%x(lx_half + 1, 1, 1, e))**2 &
296 + (dof%y%x(lx_half, 1, 1, e) &
297 - dof%y%x(lx_half + 1, 1, 1, e))**2 &
298 + (dof%z%x(lx_half, 1, 1, e) &
299 - dof%z%x(lx_half + 1, 1, 1, e))**2
301 dj = (dof%x%x(1, ly_half, 1, e) &
302 - dof%x%x(1, ly_half + 1, 1, e))**2 &
303 + (dof%y%x(1, ly_half, 1, e) &
304 - dof%y%x(1, ly_half + 1, 1, e))**2 &
305 + (dof%z%x(1, ly_half, 1, e) &
306 - dof%z%x(1, ly_half + 1, 1, e))**2
308 dk = (dof%x%x(1, 1, lz_half, e) &
309 - dof%x%x(1, 1, lz_half + 1, e))**2 &
310 + (dof%y%x(1, 1, lz_half, e) &
311 - dof%y%x(1, 1, lz_half + 1, e))**2 &
312 + (dof%z%x(1, 1, lz_half, e) &
313 - dof%z%x(1, 1, lz_half + 1, e))**2
317 this%delta%x(:,:,:,e) = (di * dj * dk)**(1.0_rp / 3.0_rp)
319 else if (this%delta_type .eq.
"elementwise_average")
then
322 do e = 1, this%coef%msh%nelv
323 volume_element = 0.0_rp
324 do k = 1, this%coef%Xh%lx * this%coef%Xh%ly * this%coef%Xh%lz
325 volume_element = volume_element + this%coef%B(k, 1, 1, e)
327 this%delta%x(:,:,:,e) = (volume_element / &
328 (this%coef%Xh%lx - 1.0_rp) / &
329 (this%coef%Xh%ly - 1.0_rp) / &
330 (this%coef%Xh%lz - 1.0_rp) ) ** (1.0_rp / 3.0_rp)
332 else if (this%delta_type .eq.
"pointwise")
then
333 do e = 1, this%coef%msh%nelv
334 do k = 1, this%coef%Xh%lz
336 kp = min(this%coef%Xh%lz, k+1)
338 do j = 1, this%coef%Xh%ly
340 jp = min(this%coef%Xh%ly, j+1)
342 do i = 1, this%coef%Xh%lx
344 ip = min(this%coef%Xh%lx, i+1)
346 di = (dof%x%x(ip, j, k, e) - &
347 dof%x%x(im, j, k, e))**2 &
348 + (dof%y%x(ip, j, k, e) - &
349 dof%y%x(im, j, k, e))**2 &
350 + (dof%z%x(ip, j, k, e) - &
351 dof%z%x(im, j, k, e))**2
353 dj = (dof%x%x(i, jp, k, e) - &
354 dof%x%x(i, jm, k, e))**2 &
355 + (dof%y%x(i, jp, k, e) - &
356 dof%y%x(i, jm, k, e))**2 &
357 + (dof%z%x(i, jp, k, e) - &
358 dof%z%x(i, jm, k, e))**2
360 dk = (dof%x%x(i, j, kp, e) - &
361 dof%x%x(i, j, km, e))**2 &
362 + (dof%y%x(i, j, kp, e) - &
363 dof%y%x(i, j, km, e))**2 &
364 + (dof%z%x(i, j, kp, e) - &
365 dof%z%x(i, j, km, e))**2
367 di = sqrt(di) / (ip - im)
368 dj = sqrt(dj) / (jp - jm)
369 dk = sqrt(dk) / (kp - km)
370 this%delta%x(i,j,k,e) = (di * dj * dk)**(1.0_rp / 3.0_rp)
377 call neko_type_error(
"delta_type for LES model", &
378 this%delta_type, delta_known_types)
382 if (neko_bcknd_device .eq. 1)
then
383 call device_memcpy(this%delta%x, this%delta%x_d, this%delta%dof%size(),&
384 host_to_device, sync = .false.)
385 call this%coef%gs_h%op(this%delta%x, this%delta%dof%size(), gs_op_add)
386 call device_col2(this%delta%x_d, this%coef%mult_d, this%delta%dof%size())
388 call this%coef%gs_h%op(this%delta%x, this%delta%dof%size(), gs_op_add)
389 call col2(this%delta%x, this%coef%mult, this%delta%dof%size())