40 use json_module,
only : json_file
85 type(json_file),
intent(inout) :: json
86 type(json_file) :: json_subdict
87 character(len=:),
allocatable :: nut_name
89 character(len=:),
allocatable :: delta_type
91 character(len=:),
allocatable :: filter_type
92 character(len=LOG_SIZE) :: log_buf
94 associate(
dofmap => fluid%dm_Xh, &
102 call this%init_base(fluid, nut_name, delta_type, if_ext)
104 call this%test_filter%init(json_subdict, coef)
105 if (json%valid_path(
'filter.transfer_function'))
then
106 call neko_error(
"Dynamic Smagorinsky model does not support " // &
107 "transfer function specified in the json file. " // &
108 "Please hard-code it in " // &
109 "subroutine set_ds_filt() in " // &
110 "src/les/dynamic_smagorisnky.f90")
112 if (json%valid_path(
'filter.type'))
then
113 call json_get(json,
"filter.type", filter_type)
114 if (trim(filter_type) .ne.
"elementwise")
then
115 call neko_error(
"Currently only elementwise filter is supported &
116 &for dynamic smagorinsky model.")
123 write(log_buf,
'(A)')
'Model : Dynamic Smagorinsky'
125 write(log_buf,
'(A, A)')
'Delta evaluation : ', delta_type
127 write(log_buf,
'(A, A)')
'Test filter type : ', &
128 this%test_filter%filter_type
130 write(log_buf,
'(A, L1)')
'extrapolation : ', if_ext
134 call this%c_dyn%init(
dofmap,
"ds_c_dyn")
135 call this%num%init(
dofmap,
"ds_num")
136 call this%den%init(
dofmap,
"ds_den")
139 call this%mij(i)%init(
dofmap)
140 call this%lij(i)%init(
dofmap)
152 call this%c_dyn%free()
154 call this%mij(i)%free()
155 call this%lij(i)%free()
159 call this%test_filter%free()
160 call this%free_base()
169 real(kind=rp),
intent(in) :: t
170 integer,
intent(in) :: tstep
172 type(field_t),
pointer :: u, v, w, u_e, v_e, w_e
174 if (this%if_ext .eqv. .true.)
then
176 associate(ulag => this%ulag, vlag => this%vlag, &
177 wlag => this%wlag, ext_bdf => this%ext_bdf)
179 u => neko_field_registry%get_field_by_name(
"u")
180 v => neko_field_registry%get_field_by_name(
"v")
181 w => neko_field_registry%get_field_by_name(
"w")
182 u_e => neko_field_registry%get_field_by_name(
"u_e")
183 v_e => neko_field_registry%get_field_by_name(
"v_e")
184 w_e => neko_field_registry%get_field_by_name(
"w_e")
186 call this%sumab%compute_fluid(u_e, v_e, w_e, u, v, w, &
187 ulag, vlag, wlag, ext_bdf%advection_coeffs, ext_bdf%nadv)
193 if (neko_bcknd_device .eq. 1)
then
194 call dynamic_smagorinsky_compute_device(this%if_ext, t, tstep, &
195 this%coef, this%nut, &
196 this%delta, this%c_dyn, this%test_filter, &
197 this%mij, this%lij, this%num, this%den)
199 call dynamic_smagorinsky_compute_cpu(this%if_ext, t, tstep, &
200 this%coef, this%nut, &
201 this%delta, this%c_dyn, this%test_filter, &
202 this%mij, this%lij, this%num, this%den)
209 type(elementwise_filter_t),
intent(inout) :: filter_1d
212 if (filter_1d%nx .le. 2)
then
213 call neko_error(
"Dynamic Smagorinsky model error: test filter is not &
214 &defined for the current polynomial order")
216 if (mod(filter_1d%nx,2) .eq. 0)
then
218 filter_1d%transfer(int((filter_1d%nx)/2)) = 0.95_rp
219 filter_1d%transfer(int((filter_1d%nx)/2) + 1) = 0.50_rp
220 filter_1d%transfer(int((filter_1d%nx)/2) + 2) = 0.05_rp
221 if ((int((filter_1d%nx)/2) + 2) .lt. filter_1d%nx)
then
222 do i = int((filter_1d%nx)/2) + 3, filter_1d%nx
223 filter_1d%transfer(i) = 0.0_rp
227 filter_1d%nt = int(filter_1d%nx/2) + 1
230 filter_1d%transfer(int((filter_1d%nx-1)/2)) = 0.95_rp
231 filter_1d%transfer(int((filter_1d%nx-1)/2) + 1) = 0.50_rp
232 filter_1d%transfer(int((filter_1d%nx-1)/2) + 2) = 0.05_rp
233 if ((int((filter_1d%nx-1)/2) + 2) .lt. filter_1d%nx)
then
234 do i = int((filter_1d%nx-1)/2) + 3, filter_1d%nx
235 filter_1d%transfer(i) = 0.0_rp
239 filter_1d%nt = int((filter_1d%nx-1)/2) + 1
242 call filter_1d%build_1d()
Retrieves a parameter by name or assigns a provided default value. In the latter case also adds the m...
Retrieves a parameter by name or throws an error.
Defines a mapping of the degrees of freedom.
Implements the CPU kernel for the smagorinsky_t type.
subroutine, public dynamic_smagorinsky_compute_cpu(if_ext, t, tstep, coef, nut, delta, c_dyn, test_filter, mij, lij, num, den)
Compute eddy viscosity on the CPU.
Implements the device kernel for the smagorinsky_t type.
subroutine, public dynamic_smagorinsky_compute_device(if_ext, t, tstep, coef, nut, delta, c_dyn, test_filter, mij, lij, num, den)
Compute eddy viscosity on the device.
Implements dynamic_smagorinsky_t.
subroutine set_ds_filt(filter_1d)
Set up the test filter.
subroutine dynamic_smagorinsky_free(this)
Destructor for the les_model_t (base) class.
subroutine dynamic_smagorinsky_compute(this, t, tstep)
Compute eddy viscosity.
subroutine dynamic_smagorinsky_init(this, fluid, json)
Constructor.
Implements elementwise_filter_t.
Defines a registry for storing solution fields.
type(field_registry_t), target, public neko_field_registry
Global field registry.
Utilities for retrieving parameters from the case files.
subroutine, public json_extract_object(json, name, object)
Extract object as a separate JSON dictionary.
type(log_t), public neko_log
Global log stream.
integer, parameter, public log_size
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Implements the dynamic Smagorinsky LES model.
Implements the elementwise filter for SEM.
Base type of all fluid formulations.
Base abstract type for LES models based on the Boussinesq approximation.