Neko 1.99.7
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
scalar_ic.f90
Go to the documentation of this file.
1! Copyright (c) 2021-2026, 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 gather_scatter, only : gs_t, gs_op_add
37 use num_types, only : rp
38 use device_math, only : device_col2
40 use field, only : field_t
43 use coefs, only : coef_t
44 use math, only : col2, cfill, cfill_mask
46 use json_module, only : json_file
50 use point_zone, only : point_zone_t
52 use logger, only : neko_log, log_size
54 use fld_file, only : fld_file_t
55 use checkpoint, only : chkp_t
56 use file, only : file_t
59 use space, only : space_t, gll
60 use field_list, only : field_list_t
63 implicit none
64 private
65
66 interface set_scalar_ic
67 module procedure set_scalar_ic_int, set_scalar_ic_usr
68 end interface set_scalar_ic
69
70 public :: set_scalar_ic
71
72contains
73
87 subroutine set_scalar_ic_int(s, coef, gs, type, params, i)
88 type(field_t), intent(inout) :: s
89 type(coef_t), intent(in) :: coef
90 type(gs_t), intent(inout) :: gs
91 character(len=*) :: type
92 type(json_file), intent(inout) :: params
93 integer, intent(in) :: i
94
95 ! Variables for retrieving JSON parameters
96 real(kind=rp) :: ic_value
97 character(len=:), allocatable :: read_str
98 real(kind=rp) :: zone_value
99
100 if (trim(type) .eq. 'uniform') then
101
102 call json_get_or_lookup(params, 'value', ic_value)
103 call set_scalar_ic_uniform(s, ic_value)
104
105 else if (trim(type) .eq. 'expression') then
106
107 call json_get(params, 'value', read_str)
108 call set_scalar_ic_expression(s, read_str)
109 if (allocated(read_str)) deallocate(read_str)
110
111 else if (trim(type) .eq. 'point_zone') then
112
113 call json_get_or_lookup(params, 'base_value', ic_value)
114 call json_get(params, 'zone_name', read_str)
115 call json_get_or_lookup(params, 'zone_value', zone_value)
116
117 call set_scalar_ic_point_zone(s, ic_value, read_str, zone_value)
118
119 else if (trim(type) .eq. 'field') then
120
121 block
122 character(len=NEKO_FNAME_LEN) :: fname, mesh_fname
123 logical :: interpolate
124 type(json_file) :: interp_subdict
125 integer :: tgt_scal_idx
126
127 call json_get(params, 'file_name', read_str)
128 fname = trim(read_str)
129
130 call json_get_or_default(params, 'interpolate', interpolate, &
131 .false.)
132
133 call json_get_or_default(params, 'mesh_file_name', read_str, &
134 "none")
135 mesh_fname = trim(read_str)
136
137 ! Give the user the option to select which scalar they want to import
138 ! the values from, in the fld file. 0 corresponds to temperature.
139 call json_get_or_default(params, 'target_index', tgt_scal_idx, i)
140
141 call json_get_subdict_or_empty(params, "interpolation", &
142 interp_subdict)
143
144 call set_scalar_ic_fld(s, fname, interpolate, mesh_fname, i, &
145 tgt_scal_idx, interp_subdict)
146
147 end block
148
149 else
150 call neko_error('Invalid initial condition')
151 end if
152
153 call set_scalar_ic_common(s, coef, gs)
154
155 end subroutine set_scalar_ic_int
156
164 subroutine set_scalar_ic_usr(scheme_name, s, coef, gs, user_proc)
165 character(len=*), intent(in) :: scheme_name
166 type(field_t), target, intent(inout) :: s
167 type(coef_t), intent(in) :: coef
168 type(gs_t), intent(inout) :: gs
169 procedure(user_initial_conditions_intf) :: user_proc
170 type(field_list_t) :: fields
171
172 call neko_log%message("Type: user")
173
174 call fields%init(1)
175 call fields%assign_to_field(1, s)
176
177 call user_proc(scheme_name, fields)
178 call set_scalar_ic_common(s, coef, gs)
179
180 end subroutine set_scalar_ic_usr
181
188 subroutine set_scalar_ic_common(s, coef, gs)
189 type(field_t), intent(inout) :: s
190 type(coef_t), intent(in) :: coef
191 type(gs_t), intent(inout) :: gs
192 integer :: n
193
194 n = s%dof%size()
195 if (neko_bcknd_device .eq. 1) then
196 call device_memcpy(s%x, s%x_d, n, host_to_device, sync = .false.)
197 end if
198
199 ! Ensure continuity across elements for initial conditions
200 call gs%op(s%x, n, gs_op_add)
201
202 if (neko_bcknd_device .eq. 1) then
203 call device_col2(s%x_d, coef%mult_d, n)
204 else
205 call col2(s%x, coef%mult, n)
206 end if
207
208 end subroutine set_scalar_ic_common
209
214 subroutine set_scalar_ic_uniform(s, ic_value)
215 type(field_t), intent(inout) :: s
216 real(kind=rp), intent(in) :: ic_value
217 integer :: n
218 character(len=LOG_SIZE) :: log_buf
219
220 call neko_log%message("Type : uniform")
221 write (log_buf, '(A,ES12.6)') "Value: ", ic_value
222 call neko_log%message(log_buf)
223
224 s = ic_value
225 n = s%dof%size()
226 if (neko_bcknd_device .eq. 1) then
227 call cfill(s%x, ic_value, n)
228 end if
229
230 end subroutine set_scalar_ic_uniform
231
240 subroutine set_scalar_ic_expression(s, expr)
241 type(field_t), intent(inout) :: s
242 character(len=*), intent(in) :: expr
243
244 call neko_log%message("Type : expression")
245 call neko_log%message("Value: " // trim(expr))
246
247 call expression_eval_static(expr, s%x, s%dof%size(), &
248 s%dof%x, s%dof%y, s%dof%z, 'scalar initial condition')
249
250 end subroutine set_scalar_ic_expression
251
259 subroutine set_scalar_ic_point_zone(s, base_value, zone_name, zone_value)
260 type(field_t), intent(inout) :: s
261 real(kind=rp), intent(in) :: base_value
262 character(len=*), intent(in) :: zone_name
263 real(kind=rp), intent(in) :: zone_value
264
265 ! Internal variables
266 character(len=LOG_SIZE) :: log_buf
267 class(point_zone_t), pointer :: zone
268 integer :: size
269
270 call neko_log%message("Type : point_zone")
271 write (log_buf, '(A,ES12.6)') "Base value: ", base_value
272 call neko_log%message(log_buf)
273 call neko_log%message("Zone name : " // trim(zone_name))
274 write (log_buf, '(A,ES12.6)') "Zone value: ", zone_value
275 call neko_log%message(log_buf)
276
277 size = s%dof%size()
278 zone => neko_point_zone_registry%get_point_zone(trim(zone_name))
279
280 call set_scalar_ic_uniform(s, base_value)
281 call cfill_mask(s%x, zone_value, size, zone%mask%get(), zone%size)
282
283 end subroutine set_scalar_ic_point_zone
284
300 subroutine set_scalar_ic_fld(s, file_name, &
301 interpolate, mesh_file_name, i, target_idx, global_interp_subdict)
302 type(field_t), target, intent(inout) :: s
303 character(len=*), intent(in) :: file_name
304 logical, intent(in) :: interpolate
305 character(len=*), intent(inout) :: mesh_file_name
306 integer, intent(in) :: i
307 integer, intent(in) :: target_idx
308 type(json_file), intent(inout) :: global_interp_subdict
309
310 character(len=LOG_SIZE) :: log_buf
311 type(field_t), pointer :: ss
312 type(field_list_t) :: s_tgt_list
313
314 if (i .ne. target_idx) then
315 write (log_buf, '(A,I0,A,I0)') "Loading scalar #", target_idx, &
316 " into scalar #", i
317 call neko_log%message(log_buf)
318 end if
319
320 ! use a pointer since import_fields needs a pointer as input
321 ss => s
322
323 ! Put ss in a field list of 1 element
324 call s_tgt_list%init(1)
325 call s_tgt_list%assign(1, ss)
326
327 call import_fields(file_name, global_interp_subdict, mesh_file_name, &
328 s_target_list = s_tgt_list, & ! The target field
329 s_index_list = [target_idx], & ! Take values from target scalar
330 interpolate = interpolate)
331
332 call s_tgt_list%free()
333
334 nullify(ss)
335
336 ! If we are on GPU we need to move s back to the host
337 ! since set_scalar_ic_common copies it again to the device.
338 call s%copy_from(device_to_host, .true.)
339
340 end subroutine set_scalar_ic_fld
341
342end module scalar_ic
Copy data between host and device (or device and device)
Definition device.F90:72
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.
Abstract interface for user defined initial conditions.
Definition user_intf.f90:70
Defines a checkpoint.
Coefficients.
Definition coef.f90:34
subroutine, public device_col2(a_d, b_d, n, strm)
Vector multiplication .
Device abstraction, common interface for various accelerators.
Definition device.F90:34
integer, parameter, public host_to_device
Definition device.F90:48
integer, parameter, public device_to_host
Definition device.F90:48
Evaluation of mathematical expressions given as strings in the case file.
subroutine, public expression_eval_static(str, res, n, x, y, z, usage)
Compile an expression and evaluate it in a set of points, in a context where there is no time state.
Defines a field.
Definition field.f90:34
Module for file I/O operations.
Definition file.f90:34
Simple module to handle fld file series. Provides an interface to the different fields sotred in a fl...
NEKTON fld file format.
Definition fld_file.f90:35
Gather-scatter.
Implements global_interpolation given a dofmap.
Importation of fields from fld files.
Routines to interpolate between different spaces.
Utilities for retrieving parameters from the case files.
subroutine, public json_get_subdict_or_empty(json, key, output)
Extract a sub-object from a json object and returns an empty object if the key is missing.
Logging routines.
Definition log.f90:34
type(log_t), public neko_log
Global log stream.
Definition log.f90:80
integer, parameter, public log_size
Definition log.f90:46
Definition math.f90:60
subroutine, public cfill(a, c, n)
Set all elements to a constant c .
Definition math.f90:597
subroutine, public col2(a, b, n)
Vector multiplication .
Definition math.f90:1046
subroutine, public cfill_mask(a, c, n, mask, n_mask)
Fill a constant to a masked vector. .
Definition math.f90:488
Build configurations.
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
type(point_zone_registry_t), target, public neko_point_zone_registry
Global point_zone registry.
Scalar initial condition.
Definition scalar_ic.f90:34
subroutine set_scalar_ic_uniform(s, ic_value)
Uniform initial condition.
subroutine set_scalar_ic_fld(s, file_name, interpolate, mesh_file_name, i, target_idx, global_interp_subdict)
Set the initial condition of the scalar based on a field. @detail The field is read from an fld file....
subroutine set_scalar_ic_point_zone(s, base_value, zone_name, zone_value)
Point zone initial condition.
subroutine set_scalar_ic_common(s, coef, gs)
Set scalar initial condition (common)
subroutine set_scalar_ic_int(s, coef, gs, type, params, i)
Set scalar initial condition (builtin)
Definition scalar_ic.f90:88
subroutine set_scalar_ic_expression(s, expr)
Expression initial condition.
subroutine set_scalar_ic_usr(scheme_name, s, coef, gs, user_proc)
Set scalar intial condition (user defined)
Defines a function space.
Definition space.f90:34
integer, parameter, public gll
Definition space.f90:50
Interfaces for user interaction with NEKO.
Definition user_intf.f90:34
Utilities.
Definition utils.f90:35
integer function, public extract_fld_file_index(fld_filename, default_index)
Extracts the index of a field file. For example, "myfield.f00045" will return 45. If the suffix of th...
Definition utils.f90:209
integer, parameter, public neko_fname_len
Definition utils.f90:42
subroutine, public neko_warning(warning_msg)
Reports a warning to standard output.
Definition utils.f90:398
subroutine, public filename_chsuffix(fname, new_fname, new_suffix)
Change a filename's suffix.
Definition utils.f90:156
subroutine, public filename_suffix(fname, suffix)
Extract a filename's suffix.
Definition utils.f90:124
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:63
field_list_t, To be able to group fields together
A wrapper around a polymorphic generic_file_t that handles its init. This is essentially a factory fo...
Definition file.f90:56
Interface for NEKTON fld files.
Definition fld_file.f90:66
Gather-scatter kernel.
Implements global interpolation for arbitrary points in the domain.
Interpolation between two space::space_t.
Base abstract type for point zones.
The function space for the SEM solution fields.
Definition space.f90:64