Neko 1.99.7
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
fluid_pnpn_bc_fctry.f90
Go to the documentation of this file.
1
2! Copyright (c) 2024-2026, The Neko Authors
3! All rights reserved.
4!
5! Redistribution and use in source and binary forms, with or without
6! modification, are permitted provided that the following conditions
7! are met:
8!
9! * Redistributions of source code must retain the above copyright
10! notice, this list of conditions and the following disclaimer.
11!
12! * Redistributions in binary form must reproduce the above
13! copyright notice, this list of conditions and the following
14! disclaimer in the documentation and/or other materials provided
15! with the distribution.
16!
17! * Neither the name of the authors nor the names of its
18! contributors may be used to endorse or promote products derived
19! from this software without specific prior written permission.
20!
21! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22! "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24! FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25! COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26! INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27! BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28! LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29! CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31! ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32! POSSIBILITY OF SUCH DAMAGE.
33!
34!
36submodule(fluid_pnpn) fluid_pnpn_bc_fctry
37 use user_intf, only : user_t
38 use utils, only : neko_type_error
40 use inflow, only : inflow_t
41 use blasius, only : blasius_t
42 use dirichlet, only : dirichlet_t
44 use symmetry, only : symmetry_t
45 use non_normal, only : non_normal_t
46 use no_slip, only : no_slip_t
55 implicit none
56
57 ! List of all possible types created by the boundary condition factories
58 character(len=25) :: FLUID_PNPN_KNOWN_BCS(17) = [character(len=25) :: &
59 "symmetry", &
60 "velocity_value", &
61 "expression_velocity", &
62 "expression_pressure", &
63 "no_slip", &
64 "outflow", &
65 "normal_outflow", &
66 "outflow+user", &
67 "normal_outflow+user", &
68 "outflow+dong", &
69 "normal_outflow+dong", &
70 "shear_stress", &
71 "user_velocity", &
72 "user_pressure", &
73 "blasius_profile", &
74 "wall_model", &
75 "overset_interface"]
76
77contains
78
85 module subroutine pressure_bc_factory(object, scheme, json, coef, user)
86 class(bc_t), pointer, intent(inout) :: object
87 type(fluid_pnpn_t), intent(in) :: scheme
88 type(json_file), intent(inout) :: json
89 type(coef_t), target, intent(in) :: coef
90 type(user_t), intent(in) :: user
91 character(len=:), allocatable :: type
92 integer :: i, j, k
93 integer, allocatable :: zone_indices(:)
94 character(len=:), allocatable :: default_name
95 character(len=64) :: buf
96 logical :: temp_logical
97
98 if (associated(object)) then
99 call object%free()
100 nullify(object)
101 end if
102
103 call json_get(json, "type", type)
104
105 select case (trim(type))
106 case ("outflow", "normal_outflow")
107 allocate(zero_dirichlet_t::object)
108
109 case ("expression_pressure")
110 allocate(expression_dirichlet_t::object)
111
112 case ("outflow+dong", "normal_outflow+dong")
113 allocate(dong_outflow_t::object)
114
115 case ("user_pressure", "outflow+user", "normal_outflow+user")
116 allocate(field_dirichlet_t::object)
117 select type (obj => object)
118 type is (field_dirichlet_t)
119 obj%update => user%dirichlet_conditions
120 call json%add("field_name", scheme%p%name)
121 end select
122
123 case ("overset_interface")
124 call json_get_or_default(json, "couple_pressure", temp_logical, .false.)
125 if (temp_logical) then
126 allocate(overset_interface_t::object)
127 select type (obj => object)
128 type is (overset_interface_t)
129 call json%add("field_name", scheme%p%name)
130 obj%morph_interface => user%morph_interface
131 end select
132 else
133 return
134 end if
135
136 case default
137 do i = 1, size(fluid_pnpn_known_bcs)
138 if (trim(type) .eq. trim(fluid_pnpn_known_bcs(i))) return
139 end do
140 call neko_type_error("fluid_pnpn boundary conditions", type, &
141 FLUID_PNPN_KNOWN_BCS)
142 end select
143
144 call json_get_or_lookup(json, "zone_indices", zone_indices)
145 call object%init(coef, json)
146
147 do i = 1, size(zone_indices)
148 call object%mark_zone(coef%msh%labeled_zones(zone_indices(i)))
149 end do
150
151 write(buf, '("pressure_bc_", I0)') zone_indices(1)
152 default_name = trim(buf)
153 call json_get_or_default(json, "name", object%name, default_name)
154 object%zone_indices = zone_indices
155 call object%finalize()
156
157 ! All pressure bcs are currently strong, so for all of them we
158 ! mark with value 1 in the mesh
159 do i = 1, size(zone_indices)
160 do j = 1, scheme%msh%nelv
161 do k = 1, 2 * scheme%msh%gdim
162 if (scheme%msh%facet_type(k,j) .eq. -zone_indices(i)) then
163 scheme%msh%facet_type(k, j) = 1
164 end if
165 end do
166 end do
167 end do
168
169 if (allocated(type)) then
170 deallocate(type)
171 end if
172
173 if (allocated(zone_indices)) then
174 deallocate(zone_indices)
175 end if
176 end subroutine pressure_bc_factory
177
184 module subroutine velocity_bc_factory(object, scheme, json, coef, user)
185 class(bc_t), pointer, intent(inout) :: object
186 type(fluid_pnpn_t), intent(inout) :: scheme
187 type(json_file), intent(inout) :: json
188 type(coef_t), target, intent(in) :: coef
189 type(user_t), intent(in) :: user
190 character(len=:), allocatable :: type
191 integer :: i, j, k
192 integer, allocatable :: zone_indices(:)
193 character(len=:), allocatable :: default_name
194 character(len=64) :: buf
195
196 call json_get(json, "type", type)
197
198 select case (trim(type))
199 case ("symmetry")
200 allocate(symmetry_t::object)
201 case ("velocity_value")
202 allocate(inflow_t::object)
203 case ("expression_velocity")
204 allocate(expression_dirichlet_vector_t::object)
205 case ("no_slip")
206 allocate(no_slip_t::object)
207 case ("normal_outflow", "normal_outflow+dong", "normal_outflow+user")
208 allocate(non_normal_t::object)
209 case ("blasius_profile")
210 allocate(blasius_t::object)
211 case ("shear_stress")
212 allocate(shear_stress_t::object)
213 case ("wall_model")
214 allocate(wall_model_bc_t::object)
215 ! Kind of hack, but OK for now
216 call json%add("scheme_name", scheme%name)
217
218 case ("user_velocity")
219 allocate(field_dirichlet_vector_t::object)
220 select type (obj => object)
222 obj%update => user%dirichlet_conditions
223 end select
224
225 case ("overset_interface")
226 allocate(overset_interface_vector_t::object)
227 select type (obj => object)
229 obj%morph_interface => user%morph_interface
230 end select
231
232 case default
233 do i = 1, size(fluid_pnpn_known_bcs)
234 if (trim(type) .eq. trim(fluid_pnpn_known_bcs(i))) return
235 end do
236 call neko_type_error("fluid_pnpn boundary conditions", type, &
237 FLUID_PNPN_KNOWN_BCS)
238 end select
239
240 call json_get_or_lookup(json, "zone_indices", zone_indices)
241 call object%init(coef, json)
242 do i = 1, size(zone_indices)
243 call object%mark_zone(coef%msh%labeled_zones(zone_indices(i)))
244 end do
245
246 write(buf,'("velocity_bc_",I0)') zone_indices(1)
247 default_name = trim(buf)
248 call json_get_or_default(json, "name", object%name, default_name)
249 object%zone_indices = zone_indices
250 call object%finalize()
251
252 ! Exclude these two because they are bcs for the residual, not velocity
253 if (trim(type) .ne. "normal_outflow" .and. &
254 trim(type) .ne. "normal_outflow+dong") then
255 do i = 1, size(zone_indices)
256 do j = 1, scheme%msh%nelv
257 do k = 1, 2 * scheme%msh%gdim
258 if (scheme%msh%facet_type(k,j) .eq. -zone_indices(i)) then
259 scheme%msh%facet_type(k, j) = 2
260 end if
261 end do
262 end do
263 end do
264 end if
265
266 if (allocated(type)) then
267 deallocate(type)
268 end if
269
270 if (allocated(zone_indices)) then
271 deallocate(zone_indices)
272 end if
273 end subroutine velocity_bc_factory
274
275end submodule fluid_pnpn_bc_fctry
Defines a Blasius profile dirichlet condition.
Definition blasius.f90:34
Defines a dirichlet boundary condition.
Definition dirichlet.f90:34
Defines a dong outflow condition.
Defines a vector valued Dirichlet condition prescribed by mathematical expressions.
Defines a Dirichlet condition prescribed by a mathematical expression.
Defines inflow dirichlet conditions.
Defines user dirichlet condition for a scalar field.
Modular version of the Classic Nek5000 Pn/Pn formulation for fluids.
Defines inflow dirichlet conditions.
Definition inflow.f90:34
Defines no-slip boundary condition (extends zero_dirichlet)
Definition no_slip.f90:34
Dirichlet condition on axis aligned plane in the non normal direction.
Defines overset interface vector boundary conditions.
Defines overset interface scalar boundary conditions.
Defines a shear stress boundary condition for a vector field. Maintainer: Timofey Mukha.
Mixed Dirichlet-Neumann axis aligned symmetry plane.
Definition symmetry.f90:34
Interfaces for user interaction with NEKO.
Definition user_intf.f90:34
Utilities.
Definition utils.f90:35
subroutine, public neko_type_error(base_type, wrong_type, known_types)
Reports an error allocating a type for a particular base pointer class.
Definition utils.f90:365
Defines the wall_model_bc_t type. Maintainer: Timofey Mukha.
Defines a zero-valued Dirichlet boundary condition.
Blasius profile for inlet (vector valued).
Definition blasius.f90:55
Generic Dirichlet boundary condition on .
Definition dirichlet.f90:49
Dong outflow condition Follows "A Convective-like Energy-Stable Open Boundary Condition for Simulati...
Dirichlet condition on , where is a mathematical expression given in the case file.
Vector valued Dirichlet condition, with one mathematical expression per component,...
User defined dirichlet condition, for which the user can work with an entire field....
Extension of the user defined dirichlet condition field_dirichlet
Dirichlet condition for inlet (vector valued)
Definition inflow.f90:47
Dirichlet condition in non normal direction of a plane.
Overset interface BC for a scalar field.
Extension of the user defined dirichlet condition overset_interface
A shear stress boundary condition.
Mixed Dirichlet-Neumann symmetry plane condition.
Definition symmetry.f90:50
A type collecting all the overridable user routines and flag to suppress type injection from custom m...
A shear stress boundary condition, computing the stress values using a wall model.
Zero-valued Dirichlet boundary condition. Used for no-slip walls, but also for various auxillary cond...