Neko 1.99.1
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
derivative_simcomp.f90
Go to the documentation of this file.
1! Copyright (c) 2024-2025, 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!
33!
35
37 use num_types, only : rp, dp, sp
38 use json_module, only : json_file
40 use time_state, only : time_state_t
42 use field, only : field_t
43 use operators, only : dudxyz
44 use case, only : case_t
47 use utils, only : neko_error
49 implicit none
50 private
51
54 type, public, extends(simulation_component_t) :: derivative_t
56 type(field_t), pointer :: u
58 type(field_t), pointer :: du
60 real(kind=rp), pointer :: dr(:,:,:,:)
62 real(kind=rp), pointer :: ds(:,:,:,:)
64 real(kind=rp), pointer :: dt(:,:,:,:)
66 type(field_writer_t) :: writer
67
68 contains
70 procedure, pass(this) :: init => derivative_init_from_json
72 generic :: init_from_components => &
73 init_from_controllers, init_from_controllers_properties
75 procedure, pass(this) :: init_from_controllers => &
79 procedure, pass(this) :: init_from_controllers_properties => &
82 procedure, private, pass(this) :: init_common => derivative_init_common
84 procedure, pass(this) :: free => derivative_free
86 procedure, pass(this) :: compute_ => derivative_compute
87 end type derivative_t
88
89contains
90
92 subroutine derivative_init_from_json(this, json, case)
93 class(derivative_t), intent(inout), target :: this
94 type(json_file), intent(inout) :: json
95 class(case_t), intent(inout), target :: case
96 character(len=:), allocatable :: field_name
97 character(len=:), allocatable :: direction
98 character(len=:), allocatable :: computed_field
99 character(len=20) :: fields(1)
100
101 ! Add fields keyword to the json so that the field_writer_t picks it up.
102 ! Will also add fields to the registry.
103 call json_get(json, "field", field_name)
104 call json_get(json, "direction", direction)
105
106 call json_get_or_default(json, "computed_field", computed_field, &
107 "d" // trim(field_name) // "_d" // direction)
108
109 fields(1) = trim(computed_field)
110 call json%add("fields", fields)
111
112 call this%init_base(json, case)
113 call this%writer%init(json, case)
114
115 call this%init_common(field_name, computed_field, direction)
116 end subroutine derivative_init_from_json
117
122 subroutine derivative_init_common(this, field_name, computed_field, &
123 direction)
124 class(derivative_t), intent(inout) :: this
125 character(len=*) :: field_name
126 character(len=*) :: computed_field
127 character(len=*) :: direction
128
129 this%u => neko_field_registry%get_field_by_name(trim(field_name))
130
131 this%du => neko_field_registry%get_field_by_name(&
132 "d" // field_name // "_d" // direction)
133
134 if (direction .eq. "x") then
135 this%dr => this%case%fluid%c_Xh%drdx
136 this%ds => this%case%fluid%c_Xh%dsdx
137 this%dt => this%case%fluid%c_Xh%dtdx
138 else if (direction .eq. "y") then
139 this%dr => this%case%fluid%c_Xh%drdy
140 this%ds => this%case%fluid%c_Xh%dsdy
141 this%dt => this%case%fluid%c_Xh%dtdy
142 else if (direction .eq. "z") then
143 this%dr => this%case%fluid%c_Xh%drdz
144 this%ds => this%case%fluid%c_Xh%dsdz
145 this%dt => this%case%fluid%c_Xh%dtdz
146 else
147 call neko_error("The direction of the derivative must be x, y or z")
148 end if
149 end subroutine derivative_init_common
150
163 subroutine derivative_init_from_controllers(this, case, order, &
164 preprocess_controller, compute_controller, output_controller, &
165 field_name, computed_field, direction, filename, precision)
166 class(derivative_t), intent(inout) :: this
167 class(case_t), intent(inout), target :: case
168 integer :: order
169 type(time_based_controller_t), intent(in) :: preprocess_controller
170 type(time_based_controller_t), intent(in) :: compute_controller
171 type(time_based_controller_t), intent(in) :: output_controller
172 character(len=*) :: field_name
173 character(len=*) :: computed_field
174 character(len=*) :: direction
175 character(len=*), intent(in), optional :: filename
176 integer, intent(in), optional :: precision
177
178 character(len=20) :: fields(1)
179
180 fields(1) = trim(computed_field)
181
182 call this%init_base_from_components(case, order, preprocess_controller, &
183 compute_controller, output_controller)
184 call this%writer%init_from_components(case, order, preprocess_controller, &
185 compute_controller, output_controller, fields, filename, precision)
186 call this%init_common(field_name, computed_field, direction)
187
189
208 case, order, preprocess_control, preprocess_value, compute_control, &
209 compute_value, output_control, output_value, field_name, &
210 computed_field, direction, filename, precision)
211 class(derivative_t), intent(inout) :: this
212 class(case_t), intent(inout), target :: case
213 integer :: order
214 character(len=*), intent(in) :: preprocess_control
215 real(kind=rp), intent(in) :: preprocess_value
216 character(len=*), intent(in) :: compute_control
217 real(kind=rp), intent(in) :: compute_value
218 character(len=*), intent(in) :: output_control
219 real(kind=rp), intent(in) :: output_value
220 character(len=*) :: field_name
221 character(len=*) :: computed_field
222 character(len=*) :: direction
223 character(len=*), intent(in), optional :: filename
224 integer, intent(in), optional :: precision
225
226 character(len=20) :: fields(1)
227
228 fields(1) = trim(computed_field)
229
230 call this%init_base_from_components(case, order, preprocess_control, &
231 preprocess_value, compute_control, compute_value, output_control, &
232 output_value)
233 call this%writer%init_from_components(case, order, preprocess_control, &
234 preprocess_value, compute_control, compute_value, output_control, &
235 output_value, fields, filename, precision)
236 call this%init_common(field_name, computed_field, direction)
237
239
240
242 subroutine derivative_free(this)
243 class(derivative_t), intent(inout) :: this
244 call this%free_base()
245 call this%writer%free()
246 nullify(this%du)
247 nullify(this%u)
248 nullify(this%dr)
249 nullify(this%ds)
250 nullify(this%dt)
251 end subroutine derivative_free
252
255 subroutine derivative_compute(this, time)
256 class(derivative_t), intent(inout) :: this
257 type(time_state_t), intent(in) :: time
258
259 call dudxyz(this%du%x, this%u%x, this%dr, this%ds, this%dt,&
260 this%case%fluid%c_Xh)
261 end subroutine derivative_compute
262
263end module derivative_simcomp
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 simulation case.
Definition case.f90:34
Implements the derivative_t type.
subroutine derivative_free(this)
Destructor.
subroutine derivative_compute(this, time)
Compute the derivative field.
subroutine derivative_init_from_json(this, json, case)
Constructor from json.
subroutine derivative_init_from_controllers_properties(this, case, order, preprocess_control, preprocess_value, compute_control, compute_value, output_control, output_value, field_name, computed_field, direction, filename, precision)
Constructor from components, passing properties to the time_based_controller` components in the base ...
subroutine derivative_init_common(this, field_name, computed_field, direction)
Common part of constructors from components.
subroutine derivative_init_from_controllers(this, case, order, preprocess_controller, compute_controller, output_controller, field_name, computed_field, direction, filename, precision)
Constructor from components, passing controllers.
Defines a registry for storing solution fields.
type(field_registry_t), target, public neko_field_registry
Global field registry.
Implements the field_writer_t type.
Defines a field.
Definition field.f90:34
Utilities for retrieving parameters from the case files.
integer, parameter, public dp
Definition num_types.f90:9
integer, parameter, public sp
Definition num_types.f90:8
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:80
Implements output_controller_t
Simulation components are objects that encapsulate functionality that can be fit to a particular comp...
subroutine compute_(this, time)
Dummy compute function.
Contains the time_based_controller_t type.
Module with things related to the simulation time.
Utilities.
Definition utils.f90:35
A simulation component that computes a derivative of a field. Wraps the duxyz operator.
A simulation component that writes a 3d field to a file.
Base abstract class for simulation components.
A utility type for determining whether an action should be executed based on the current time value....
A struct that contains all info about the time, expand as needed.