Neko  0.9.99
A portable framework for high-order spectral element flow simulations
sigma_device.f90
Go to the documentation of this file.
1 ! Copyright (c) 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 field_list, only : field_list_t
37  use device_math, only : device_col2
38  use math, only : neko_eps
41  use field, only : field_t
42  use operators, only : dudxyz
43  use coefs, only : coef_t
44  use gs_ops, only : gs_op_add
46  implicit none
47  private
48 
49  public :: sigma_compute_device
50 
51 contains
52 
60  subroutine sigma_compute_device(t, tstep, coef, nut, delta, c)
61  real(kind=rp), intent(in) :: t
62  integer, intent(in) :: tstep
63  type(coef_t), intent(in) :: coef
64  type(field_t), intent(inout) :: nut
65  type(field_t), intent(in) :: delta
66  real(kind=rp), intent(in) :: c
67  ! This is the velocity gradient tensor
68  type(field_t), pointer :: g11, g12, g13, g21, g22, g23, g31, g32, g33
69  type(field_t), pointer :: u, v, w
70 
71  real(kind=rp) :: pi_3 = 4.0_rp/3.0_rp*atan(1.0_rp)
72  real(kind=rp) :: eps
73 
74  integer :: temp_indices(9)
75  integer :: e, i
76 
77  ! some constant
78  eps = neko_eps
79 
80  ! get fields from registry
81  u => neko_field_registry%get_field_by_name("u")
82  v => neko_field_registry%get_field_by_name("v")
83  w => neko_field_registry%get_field_by_name("w")
84 
85  call neko_scratch_registry%request_field(g11, temp_indices(1))
86  call neko_scratch_registry%request_field(g12, temp_indices(2))
87  call neko_scratch_registry%request_field(g13, temp_indices(3))
88  call neko_scratch_registry%request_field(g21, temp_indices(4))
89  call neko_scratch_registry%request_field(g22, temp_indices(5))
90  call neko_scratch_registry%request_field(g23, temp_indices(6))
91  call neko_scratch_registry%request_field(g31, temp_indices(7))
92  call neko_scratch_registry%request_field(g32, temp_indices(8))
93  call neko_scratch_registry%request_field(g33, temp_indices(9))
94 
95  ! Compute the derivatives of the velocity (the components of the g tensor)
96  call dudxyz(g11%x, u%x, coef%drdx, coef%dsdx, coef%dtdx, coef)
97  call dudxyz(g12%x, u%x, coef%drdy, coef%dsdy, coef%dtdy, coef)
98  call dudxyz(g13%x, u%x, coef%drdz, coef%dsdz, coef%dtdz, coef)
99 
100  call dudxyz(g21%x, v%x, coef%drdx, coef%dsdx, coef%dtdx, coef)
101  call dudxyz(g22%x, v%x, coef%drdy, coef%dsdy, coef%dtdy, coef)
102  call dudxyz(g23%x, v%x, coef%drdz, coef%dsdz, coef%dtdz, coef)
103 
104  call dudxyz(g31%x, w%x, coef%drdx, coef%dsdx, coef%dtdx, coef)
105  call dudxyz(g32%x, w%x, coef%drdy, coef%dsdy, coef%dtdy, coef)
106  call dudxyz(g33%x, w%x, coef%drdz, coef%dsdz, coef%dtdz, coef)
107 
108  call coef%gs_h%op(g11, gs_op_add)
109  call coef%gs_h%op(g12, gs_op_add)
110  call coef%gs_h%op(g13, gs_op_add)
111  call coef%gs_h%op(g21, gs_op_add)
112  call coef%gs_h%op(g22, gs_op_add)
113  call coef%gs_h%op(g23, gs_op_add)
114  call coef%gs_h%op(g31, gs_op_add)
115  call coef%gs_h%op(g32, gs_op_add)
116  call coef%gs_h%op(g33, gs_op_add)
117 
118  call device_sigma_nut_compute(g11%x_d, g12%x_d, g13%x_d, &
119  g21%x_d, g22%x_d, g23%x_d, &
120  g31%x_d, g32%x_d, g33%x_d, &
121  delta%x_d, nut%x_d, coef%mult_d, &
122  c, eps, g11%dof%size())
123 
124  call neko_scratch_registry%relinquish_field(temp_indices)
125  end subroutine sigma_compute_device
126 end module sigma_device
Coefficients.
Definition: coef.f90:34
subroutine, public device_col2(a_d, b_d, n)
Vector multiplication .
subroutine, public device_sigma_nut_compute(g11_d, g12_d, g13_d, g21_d, g22_d, g23_d, g31_d, g32_d, g33_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 sigma_t type.
subroutine, public sigma_compute_device(t, tstep, coef, nut, delta, c)
Compute eddy viscosity on device.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition: coef.f90:55
field_list_t, To be able to group fields together
Definition: field_list.f90:13