Neko  0.9.99
A portable framework for high-order spectral element flow simulations
vreman_device.f90
Go to the documentation of this file.
1 ! Copyright (c) 2023-2024, The Neko Authors
2 ! All rights reserved.
3 !
4 ! Redistribution and use in source and binary forms, with or without
5 ! modification, are permitted provided that the following conditions
6 ! are met:
7 !
8 ! * Redistributions of source code must retain the above copyright
9 ! notice, this list of conditions and the following disclaimer.
10 !
11 ! * Redistributions in binary form must reproduce the above
12 ! copyright notice, this list of conditions and the following
13 ! disclaimer in the documentation and/or other materials provided
14 ! with the distribution.
15 !
16 ! * Neither the name of the authors nor the names of its
17 ! contributors may be used to endorse or promote products derived
18 ! from this software without specific prior written permission.
19 !
20 ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 ! "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 ! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 ! FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 ! COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25 ! INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 ! BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 ! LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 ! CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 ! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 ! ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 ! POSSIBILITY OF SUCH DAMAGE.
32 !
35  use num_types, only : rp
36  use math, only : neko_eps
39  use field, only : field_t
40  use operators, only : dudxyz
41  use coefs, only : coef_t
42  use gs_ops, only : gs_op_add
44  implicit none
45  private
46 
47  public :: vreman_compute_device
48 
49 contains
50 
58  subroutine vreman_compute_device(t, tstep, coef, nut, delta, c)
59  real(kind=rp), intent(in) :: t
60  integer, intent(in) :: tstep
61  type(coef_t), intent(in) :: coef
62  type(field_t), intent(inout) :: nut
63  type(field_t), intent(in) :: delta
64  real(kind=rp), intent(in) :: c
65  ! This is the alpha tensor in the paper
66  type(field_t), pointer :: a11, a12, a13, a21, a22, a23, a31, a32, a33
67  type(field_t), pointer :: u, v, w
68 
69  type(field_t), pointer :: beta11
70  type(field_t), pointer :: beta12
71  type(field_t), pointer :: beta13
72  type(field_t), pointer :: beta22
73  type(field_t), pointer :: beta23
74  type(field_t), pointer :: beta33
75  type(field_t), pointer :: b_beta
76  type(field_t), pointer :: aijaij
77  integer :: temp_indices(17)
78  integer :: e, i
79 
80  u => neko_field_registry%get_field_by_name("u")
81  v => neko_field_registry%get_field_by_name("v")
82  w => neko_field_registry%get_field_by_name("w")
83 
84  call neko_scratch_registry%request_field(a11, temp_indices(1))
85  call neko_scratch_registry%request_field(a12, temp_indices(2))
86  call neko_scratch_registry%request_field(a13, temp_indices(3))
87  call neko_scratch_registry%request_field(a21, temp_indices(4))
88  call neko_scratch_registry%request_field(a22, temp_indices(5))
89  call neko_scratch_registry%request_field(a23, temp_indices(6))
90  call neko_scratch_registry%request_field(a31, temp_indices(7))
91  call neko_scratch_registry%request_field(a32, temp_indices(8))
92  call neko_scratch_registry%request_field(a33, temp_indices(9))
93  call neko_scratch_registry%request_field(beta11, temp_indices(10))
94  call neko_scratch_registry%request_field(beta12, temp_indices(11))
95  call neko_scratch_registry%request_field(beta13, temp_indices(12))
96  call neko_scratch_registry%request_field(beta22, temp_indices(13))
97  call neko_scratch_registry%request_field(beta23, temp_indices(14))
98  call neko_scratch_registry%request_field(beta33, temp_indices(15))
99  call neko_scratch_registry%request_field(b_beta, temp_indices(16))
100  call neko_scratch_registry%request_field(aijaij, temp_indices(17))
101 
102 
103  ! Compute the derivatives of the velocity (the alpha tensor)
104  call dudxyz (a11%x, u%x, coef%drdx, coef%dsdx, coef%dtdx, coef)
105  call dudxyz (a12%x, u%x, coef%drdy, coef%dsdy, coef%dtdy, coef)
106  call dudxyz (a13%x, u%x, coef%drdz, coef%dsdz, coef%dtdz, coef)
107 
108  call dudxyz (a21%x, v%x, coef%drdx, coef%dsdx, coef%dtdx, coef)
109  call dudxyz (a22%x, v%x, coef%drdy, coef%dsdy, coef%dtdy, coef)
110  call dudxyz (a23%x, v%x, coef%drdz, coef%dsdz, coef%dtdz, coef)
111 
112  call dudxyz (a31%x, w%x, coef%drdx, coef%dsdx, coef%dtdx, coef)
113  call dudxyz (a32%x, w%x, coef%drdy, coef%dsdy, coef%dtdy, coef)
114  call dudxyz (a33%x, w%x, coef%drdz, coef%dsdz, coef%dtdz, coef)
115 
116  call coef%gs_h%op(a11, gs_op_add)
117  call coef%gs_h%op(a12, gs_op_add)
118  call coef%gs_h%op(a13, gs_op_add)
119  call coef%gs_h%op(a21, gs_op_add)
120  call coef%gs_h%op(a22, gs_op_add)
121  call coef%gs_h%op(a23, gs_op_add)
122  call coef%gs_h%op(a31, gs_op_add)
123  call coef%gs_h%op(a32, gs_op_add)
124  call coef%gs_h%op(a33, gs_op_add)
125 
126  call device_vreman_nut_compute(a11%x_d, a12%x_d, a13%x_d, &
127  a21%x_d, a22%x_d, a23%x_d, &
128  a31%x_d, a32%x_d, a33%x_d, &
129  delta%x_d, nut%x_d, coef%mult_d, &
130  c, neko_eps, a11%dof%size())
131 
132  call neko_scratch_registry%relinquish_field(temp_indices)
133  end subroutine vreman_compute_device
134 
135 end module vreman_device
136 
Coefficients.
Definition: coef.f90:34
subroutine, public device_vreman_nut_compute(a11_d, a12_d, a13_d, a21_d, a22_d, a23_d, a31_d, a32_d, a33_d, delta_d, nut_d, mult_d, c, eps, n)
Compute the eddy viscosity field for the Sigma model indevice.
Defines a registry for storing solution fields.
type(field_registry_t), target, public neko_field_registry
Global field registry.
Defines a field.
Definition: field.f90:34
Defines Gather-scatter operations.
Definition: gs_ops.f90:34
integer, parameter, public gs_op_add
Definition: gs_ops.f90:36
Definition: math.f90:60
real(kind=rp), parameter, public neko_eps
Machine epsilon .
Definition: math.f90:70
integer, parameter, public rp
Global precision used in computations.
Definition: num_types.f90:12
Operators.
Definition: operators.f90:34
subroutine, public dudxyz(du, u, dr, ds, dt, coef)
Compute derivative of a scalar field along a single direction.
Definition: operators.f90:76
Defines a registry for storing and requesting temporary fields This can be used when you have a funct...
type(scratch_registry_t), target, public neko_scratch_registry
Global scratch registry.
Implements the device kernel for the vreman_t type.
subroutine, public vreman_compute_device(t, tstep, coef, nut, delta, c)
Compute eddy viscosity on the device.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition: coef.f90:55