Neko 1.99.3
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, 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
50 implicit none
51
52 ! List of all possible types created by the boundary condition factories
53 character(len=25) :: FLUID_PNPN_KNOWN_BCS(15) = [character(len=25) :: &
54 "symmetry", &
55 "velocity_value", &
56 "no_slip", &
57 "outflow", &
58 "normal_outflow", &
59 "outflow+user", &
60 "normal_outflow+user", &
61 "outflow+dong", &
62 "normal_outflow+dong", &
63 "shear_stress", &
64 "user_velocity", &
65 "user_pressure", &
66 "blasius_profile", &
67 "wall_model", &
68 "overset_interface"]
69
70contains
71
78 module subroutine pressure_bc_factory(object, scheme, json, coef, user)
79 class(bc_t), pointer, intent(inout) :: object
80 type(fluid_pnpn_t), intent(in) :: scheme
81 type(json_file), intent(inout) :: json
82 type(coef_t), target, intent(in) :: coef
83 type(user_t), intent(in) :: user
84 character(len=:), allocatable :: type
85 integer :: i, j, k
86 integer, allocatable :: zone_indices(:)
87 character(len=:), allocatable :: default_name
88 character(len=64) :: buf
89 logical :: temp_logical
90
91 if (associated(object)) then
92 call object%free()
93 nullify(object)
94 end if
95
96 call json_get(json, "type", type)
97
98 select case (trim(type))
99 case ("outflow", "normal_outflow")
100 allocate(zero_dirichlet_t::object)
101
102 case ("outflow+dong", "normal_outflow+dong")
103 allocate(dong_outflow_t::object)
104
105 case ("user_pressure", "outflow+user", "normal_outflow+user")
106 allocate(field_dirichlet_t::object)
107 select type (obj => object)
108 type is (field_dirichlet_t)
109 obj%update => user%dirichlet_conditions
110 call json%add("field_name", scheme%p%name)
111 end select
112
113 case ("overset_interface")
114 call json_get_or_default(json, "couple_pressure", temp_logical, .false.)
115 if (temp_logical) then
116 allocate(overset_interface_t::object)
117 select type (obj => object)
118 type is (overset_interface_t)
119 call json%add("field_name", scheme%p%name)
120 obj%morph_interface => user%morph_interface
121 end select
122 else
123 return
124 end if
125
126 case default
127 do i = 1, size(fluid_pnpn_known_bcs)
128 if (trim(type) .eq. trim(fluid_pnpn_known_bcs(i))) return
129 end do
130 call neko_type_error("fluid_pnpn boundary conditions", type, &
131 FLUID_PNPN_KNOWN_BCS)
132 end select
133
134 call json_get_or_lookup(json, "zone_indices", zone_indices)
135 call object%init(coef, json)
136
137 do i = 1, size(zone_indices)
138 call object%mark_zone(coef%msh%labeled_zones(zone_indices(i)))
139 end do
140
141 write(buf, '("pressure_bc_", I0)') zone_indices(1)
142 default_name = trim(buf)
143 call json_get_or_default(json, "name", object%name, default_name)
144 object%zone_indices = zone_indices
145 call object%finalize()
146
147 ! All pressure bcs are currently strong, so for all of them we
148 ! mark with value 1 in the mesh
149 do i = 1, size(zone_indices)
150 do j = 1, scheme%msh%nelv
151 do k = 1, 2 * scheme%msh%gdim
152 if (scheme%msh%facet_type(k,j) .eq. -zone_indices(i)) then
153 scheme%msh%facet_type(k, j) = 1
154 end if
155 end do
156 end do
157 end do
158
159 if (allocated(type)) then
160 deallocate(type)
161 end if
162
163 if (allocated(zone_indices)) then
164 deallocate(zone_indices)
165 end if
166 end subroutine pressure_bc_factory
167
174 module subroutine velocity_bc_factory(object, scheme, json, coef, user)
175 class(bc_t), pointer, intent(inout) :: object
176 type(fluid_pnpn_t), intent(inout) :: scheme
177 type(json_file), intent(inout) :: json
178 type(coef_t), target, intent(in) :: coef
179 type(user_t), intent(in) :: user
180 character(len=:), allocatable :: type
181 integer :: i, j, k
182 integer, allocatable :: zone_indices(:)
183 character(len=:), allocatable :: default_name
184 character(len=64) :: buf
185
186 call json_get(json, "type", type)
187
188 select case (trim(type))
189 case ("symmetry")
190 allocate(symmetry_t::object)
191 case ("velocity_value")
192 allocate(inflow_t::object)
193 case ("no_slip")
194 allocate(no_slip_t::object)
195 case ("normal_outflow", "normal_outflow+dong", "normal_outflow+user")
196 allocate(non_normal_t::object)
197 case ("blasius_profile")
198 allocate(blasius_t::object)
199 case ("shear_stress")
200 allocate(shear_stress_t::object)
201 case ("wall_model")
202 allocate(wall_model_bc_t::object)
203 ! Kind of hack, but OK for now
204 call json%add("scheme_name", scheme%name)
205
206 case ("user_velocity")
207 allocate(field_dirichlet_vector_t::object)
208 select type (obj => object)
210 obj%update => user%dirichlet_conditions
211 end select
212
213 case ("overset_interface")
214 allocate(overset_interface_vector_t::object)
215 select type (obj => object)
217 obj%morph_interface => user%morph_interface
218 end select
219
220 case default
221 do i = 1, size(fluid_pnpn_known_bcs)
222 if (trim(type) .eq. trim(fluid_pnpn_known_bcs(i))) return
223 end do
224 call neko_type_error("fluid_pnpn boundary conditions", type, &
225 FLUID_PNPN_KNOWN_BCS)
226 end select
227
228 call json_get_or_lookup(json, "zone_indices", zone_indices)
229 call object%init(coef, json)
230 do i = 1, size(zone_indices)
231 call object%mark_zone(coef%msh%labeled_zones(zone_indices(i)))
232 end do
233
234 write(buf,'("velocity_bc_",I0)') zone_indices(1)
235 default_name = trim(buf)
236 call json_get_or_default(json, "name", object%name, default_name)
237 object%zone_indices = zone_indices
238 call object%finalize()
239
240 ! Exclude these two because they are bcs for the residual, not velocity
241 if (trim(type) .ne. "normal_outflow" .and. &
242 trim(type) .ne. "normal_outflow+dong") then
243 do i = 1, size(zone_indices)
244 do j = 1, scheme%msh%nelv
245 do k = 1, 2 * scheme%msh%gdim
246 if (scheme%msh%facet_type(k,j) .eq. -zone_indices(i)) then
247 scheme%msh%facet_type(k, j) = 2
248 end if
249 end do
250 end do
251 end do
252 end if
253
254 if (allocated(type)) then
255 deallocate(type)
256 end if
257
258 if (allocated(zone_indices)) then
259 deallocate(zone_indices)
260 end if
261 end subroutine velocity_bc_factory
262
263end 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 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.
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:359
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...
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
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...