Neko 1.99.2
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
47 implicit none
48
49 ! List of all possible types created by the boundary condition factories
50 character(len=25) :: FLUID_PNPN_KNOWN_BCS(14) = [character(len=25) :: &
51 "symmetry", &
52 "velocity_value", &
53 "no_slip", &
54 "outflow", &
55 "normal_outflow", &
56 "outflow+user", &
57 "normal_outflow+user", &
58 "outflow+dong", &
59 "normal_outflow+dong", &
60 "shear_stress", &
61 "user_velocity", &
62 "user_pressure", &
63 "blasius_profile", &
64 "wall_model"]
65
66contains
67
74 module subroutine pressure_bc_factory(object, scheme, json, coef, user)
75 class(bc_t), pointer, intent(inout) :: object
76 type(fluid_pnpn_t), intent(in) :: scheme
77 type(json_file), intent(inout) :: json
78 type(coef_t), target, intent(in) :: coef
79 type(user_t), intent(in) :: user
80 character(len=:), allocatable :: type
81 integer :: i, j, k
82 integer, allocatable :: zone_indices(:)
83
84 if (associated(object)) then
85 call object%free()
86 nullify(object)
87 end if
88
89 call json_get(json, "type", type)
90
91 select case (trim(type))
92 case ("outflow", "normal_outflow")
93 allocate(zero_dirichlet_t::object)
94
95 case ("outflow+dong", "normal_outflow+dong")
96 allocate(dong_outflow_t::object)
97
98 case ("user_pressure", "outflow+user", "normal_outflow+user")
99 allocate(field_dirichlet_t::object)
100 select type (obj => object)
101 type is (field_dirichlet_t)
102 obj%update => user%dirichlet_conditions
103 call json%add("field_name", scheme%p%name)
104 end select
105
106 case default
107 do i = 1, size(fluid_pnpn_known_bcs)
108 if (trim(type) .eq. trim(fluid_pnpn_known_bcs(i))) return
109 end do
110 call neko_type_error("fluid_pnpn boundary conditions", type, &
111 FLUID_PNPN_KNOWN_BCS)
112 end select
113
114 call json_get_or_lookup(json, "zone_indices", zone_indices)
115 call object%init(coef, json)
116
117 do i = 1, size(zone_indices)
118 call object%mark_zone(coef%msh%labeled_zones(zone_indices(i)))
119 end do
120 call object%finalize()
121
122 ! All pressure bcs are currently strong, so for all of them we
123 ! mark with value 1 in the mesh
124 do i = 1, size(zone_indices)
125 do j = 1, scheme%msh%nelv
126 do k = 1, 2 * scheme%msh%gdim
127 if (scheme%msh%facet_type(k,j) .eq. -zone_indices(i)) then
128 scheme%msh%facet_type(k, j) = 1
129 end if
130 end do
131 end do
132 end do
133
134 if (allocated(type)) then
135 deallocate(type)
136 end if
137
138 if (allocated(zone_indices)) then
139 deallocate(zone_indices)
140 end if
141 end subroutine pressure_bc_factory
142
149 module subroutine velocity_bc_factory(object, scheme, json, coef, user)
150 class(bc_t), pointer, intent(inout) :: object
151 type(fluid_pnpn_t), intent(inout) :: scheme
152 type(json_file), intent(inout) :: json
153 type(coef_t), target, intent(in) :: coef
154 type(user_t), intent(in) :: user
155 character(len=:), allocatable :: type
156 integer :: i, j, k
157 integer, allocatable :: zone_indices(:)
158
159 call json_get(json, "type", type)
160
161 select case (trim(type))
162 case ("symmetry")
163 allocate(symmetry_t::object)
164 case ("velocity_value")
165 allocate(inflow_t::object)
166 case ("no_slip")
167 allocate(zero_dirichlet_t::object)
168 case ("normal_outflow", "normal_outflow+dong", "normal_outflow+user")
169 allocate(non_normal_t::object)
170 case ("blasius_profile")
171 allocate(blasius_t::object)
172 case ("shear_stress")
173 allocate(shear_stress_t::object)
174 case ("wall_model")
175 allocate(wall_model_bc_t::object)
176 ! Kind of hack, but OK for now
177 call json%add("scheme_name", scheme%name)
178
179 case ("user_velocity")
180 allocate(field_dirichlet_vector_t::object)
181 select type (obj => object)
183 obj%update => user%dirichlet_conditions
184 end select
185
186 case default
187 do i = 1, size(fluid_pnpn_known_bcs)
188 if (trim(type) .eq. trim(fluid_pnpn_known_bcs(i))) return
189 end do
190 call neko_type_error("fluid_pnpn boundary conditions", type, &
191 FLUID_PNPN_KNOWN_BCS)
192 end select
193
194 call json_get_or_lookup(json, "zone_indices", zone_indices)
195 call object%init(coef, json)
196 do i = 1, size(zone_indices)
197 call object%mark_zone(coef%msh%labeled_zones(zone_indices(i)))
198 end do
199 call object%finalize()
200
201 ! Exclude these two because they are bcs for the residual, not velocity
202 if (trim(type) .ne. "normal_outflow" .and. &
203 trim(type) .ne. "normal_outflow+dong") then
204 do i = 1, size(zone_indices)
205 do j = 1, scheme%msh%nelv
206 do k = 1, 2 * scheme%msh%gdim
207 if (scheme%msh%facet_type(k,j) .eq. -zone_indices(i)) then
208 scheme%msh%facet_type(k, j) = 2
209 end if
210 end do
211 end do
212 end do
213 end if
214
215 if (allocated(type)) then
216 deallocate(type)
217 end if
218
219 if (allocated(zone_indices)) then
220 deallocate(zone_indices)
221 end if
222 end subroutine velocity_bc_factory
223
224end 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
Dirichlet condition on axis aligned plane in the non normal direction.
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:313
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.
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...