VertexCFD  0.0-dev
VertexCFD_BCStrategy_IncompressibleLSVOFBoundaryFlux_impl.hpp
1 #ifndef VERTEXCFD_BOUNDARYCONDITION_INCOMPRESSIBLELSVOFBOUNDARYFLUX_IMPL_HPP
2 #define VERTEXCFD_BOUNDARYCONDITION_INCOMPRESSIBLELSVOFBOUNDARYFLUX_IMPL_HPP
3 
4 #include "VertexCFD_BoundaryState_ViscousGradient.hpp"
5 #include "VertexCFD_BoundaryState_ViscousPenaltyParameter.hpp"
6 #include "VertexCFD_Integrator_BoundaryGradBasisDotVector.hpp"
7 
8 #include "incompressible_lsvof_solver/boundary_conditions/VertexCFD_IncompressibleLSVOFBoundaryState_Factory.hpp"
9 #include "incompressible_lsvof_solver/closure_models/VertexCFD_Closure_IncompressibleLSVOFConvectiveFlux.hpp"
10 #include "incompressible_lsvof_solver/closure_models/VertexCFD_Closure_IncompressibleLSVOFNthPhaseFraction.hpp"
11 #include "incompressible_lsvof_solver/closure_models/VertexCFD_Closure_IncompressibleLSVOFScalarConvectiveFlux.hpp"
12 #include "incompressible_lsvof_solver/closure_models/VertexCFD_Closure_IncompressibleLSVOFVariableProperties.hpp"
13 #include "incompressible_lsvof_solver/closure_models/VertexCFD_Closure_IncompressibleLSVOFViscousFlux.hpp"
14 
15 #include "utils/VertexCFD_Utils_PhaseIndex.hpp"
16 #include "utils/VertexCFD_Utils_ScalarToVector.hpp"
17 
18 #include <Panzer_DOF.hpp>
19 #include <Panzer_DOFGradient.hpp>
20 #include <Panzer_DotProduct.hpp>
21 #include <Panzer_Integrator_BasisTimesScalar.hpp>
22 #include <Panzer_Normals.hpp>
23 #include <Panzer_Sum.hpp>
24 
25 #include <Phalanx_DataLayout.hpp>
26 #include <Phalanx_DataLayout_MDALayout.hpp>
27 #include <Phalanx_MDField.hpp>
28 
29 #include <map>
30 #include <string>
31 #include <vector>
32 
33 namespace VertexCFD
34 {
35 namespace BoundaryCondition
36 {
37 //---------------------------------------------------------------------------//
38 template<class EvalType, int NumSpaceDim>
39 IncompressibleLSVOFBoundaryFlux<EvalType, NumSpaceDim>::IncompressibleLSVOFBoundaryFlux(
40  const panzer::BC& bc, const Teuchos::RCP<panzer::GlobalData>& global_data)
41  : BoundaryFluxBase<EvalType, NumSpaceDim>(bc, global_data)
42 {
43 }
44 
45 //---------------------------------------------------------------------------//
46 template<class EvalType, int NumSpaceDim>
48  const panzer::PhysicsBlock& side_pb,
49  const Teuchos::ParameterList& )
50 {
51  // Parameter list for physics block and boundary condition
52  _bc_params = *(this->m_bc.params());
53  this->getModelID(_bc_params, side_pb, _model_id, _side_pb_list);
54 
55  // Get LSVOF model info from parameter list
56  _lsvof_params = side_pb.getParameterList()->sublist(_model_id).sublist(
57  "LSVOF_Properties");
58 
59  // Check if momentum equations should be built
60  _build_mom_eqn
61  = _lsvof_params.isType<bool>("Build LSVOF Navier-Stokes Equations")
62  ? _lsvof_params.get<bool>("Build LSVOF Navier-Stokes Equations")
63  : true;
64 
65  // Initialize NS equation and DOF names
66  if (_build_mom_eqn)
67  {
68  _equ_dof_ns_pair.insert({"continuity", "lagrange_pressure"});
69 
70  for (int d = 0; d < num_space_dim; ++d)
71  {
72  const std::string ds = std::to_string(d);
73  _equ_dof_ns_pair.insert({"momentum_" + ds, "velocity_" + ds});
74  }
75  }
76 
77  const std::string lsvof_model_name
78  = _lsvof_params.get<std::string>("LSVOF Model");
79 
80  const int num_phases = _lsvof_params.get<int>("Number of Phases");
81 
82  // Initialize LSVOF equation and DOF names
83  if (lsvof_model_name == "VOF")
84  {
85  for (int n = 1; n <= num_phases; ++n)
86  {
87  const std::string list_name = "Phase " + std::to_string(n);
88 
89  Teuchos::ParameterList phase_list
90  = _lsvof_params.sublist(list_name);
91 
92  const std::string phase_name
93  = phase_list.get<std::string>("Phase Name");
94 
95  const std::string phase_fraction_name = "alpha_" + phase_name;
96 
97  _all_phase_names.push_back(phase_fraction_name);
98 
99  if (n < num_phases)
100  {
101  _equ_dof_lsvof_pair.insert(
102  {phase_fraction_name + "_equation", phase_fraction_name});
103 
104  _dof_phase_names.push_back(phase_fraction_name);
105  }
106  }
107  }
108 
109  // Initialize parent class variables (only needed with one set of
110  // equations)
111  this->initialize(side_pb, _equ_dof_lsvof_pair);
112 }
113 
114 //---------------------------------------------------------------------------//
115 template<class EvalType, int NumSpaceDim>
117  PHX::FieldManager<panzer::Traits>& fm,
118  const panzer::PhysicsBlock& side_pb,
119  const panzer::ClosureModelFactory_TemplateManager<panzer::Traits>&,
120  const Teuchos::ParameterList&,
121  const Teuchos::ParameterList& user_data) const
122 {
123  // Map to store residuals for each equation listed in pairs
124  std::unordered_map<std::string, std::vector<std::string>> eq_vct_map;
125 
126  // Get integration rule for closure models
127  const auto ir = this->integrationRule();
128 
129  // Create degree of freedom and gradients for NS equations
130  for (auto& pair : _equ_dof_ns_pair)
131  {
132  this->registerDOFsGradient(fm, side_pb, pair.second);
133  }
134 
135  // Create degree of freedom and gradients for LSVOF equations
136  for (auto& pair : _equ_dof_lsvof_pair)
137  {
138  this->registerDOFsGradient(fm, side_pb, pair.second);
139  }
140 
141  // Create LSVOF scalar field array
142  const bool include_time_deriv = false;
143  const bool include_grads = false;
144 
145  const auto phase_vec_op
146  = Utils::ScalarToVector<EvalType, PhaseIndex>::createFromList(
147  *ir,
148  "volume_fractions",
149  _dof_phase_names,
150  include_time_deriv,
151  include_grads);
152 
153  this->template registerEvaluator<EvalType>(fm, phase_vec_op);
154 
155  // Create boundary Nth phase fraction
156  const auto nth_phase_op = Teuchos::rcp(
157  new ClosureModel::IncompressibleLSVOFNthPhaseFraction<EvalType,
158  panzer::Traits>(
159  *ir, _all_phase_names));
160 
161  this->template registerEvaluator<EvalType>(fm, nth_phase_op);
162 
163  // Register normals
164  this->registerSideNormals(fm, side_pb);
165 
166  // Create boundary state operators
167  const auto bc_params = *(this->m_bc.params());
168 
169  auto incomp_lsvof_boundary_state_op
170  = IncompressibleLSVOFBoundaryStateFactory<EvalType,
171  panzer::Traits,
172  num_space_dim>::
173  create(*ir, _all_phase_names, bc_params, _lsvof_params, user_data);
174  this->template registerEvaluator<EvalType>(fm,
175  incomp_lsvof_boundary_state_op);
176 
177  // Create fluid property fields
178  auto var_prop_op = Teuchos::rcp(
179  new ClosureModel::IncompressibleLSVOFVariableProperties<EvalType,
180  panzer::Traits>(
181  *ir, _lsvof_params, _all_phase_names, false, "BOUNDARY_"));
182 
183  this->template registerEvaluator<EvalType>(fm, var_prop_op);
184 
185  // First-order flux //
186 
187  // Create boundary convective fluxes for NS equations
188  if (_build_mom_eqn)
189  {
190  auto convective_flux_op = Teuchos::rcp(
191  new ClosureModel::IncompressibleLSVOFConvectiveFlux<EvalType,
192  panzer::Traits,
193  num_space_dim>(
194  *ir, "BOUNDARY_", "BOUNDARY_"));
195  this->template registerEvaluator<EvalType>(fm, convective_flux_op);
196 
197  for (auto& pair : _equ_dof_ns_pair)
198  {
199  this->registerConvectionTypeFluxOperator(
200  pair, eq_vct_map, "CONVECTIVE", fm, side_pb, 1.0);
201  }
202  }
203 
204  // Create boundary convective fluxes for LSVOF equations
205  int phase_index = 0;
206  for (auto& pair : _equ_dof_lsvof_pair)
207  {
208  const auto& equ_name = pair.first;
209  const auto& dof_name = pair.second;
210 
211  Teuchos::ParameterList conv_flux_params;
212  conv_flux_params.set("Field Name", dof_name);
213  conv_flux_params.set("Equation Name", equ_name);
214 
215  auto lsvof_convective_flux_op = Teuchos::rcp(
216  new ClosureModel::IncompressibleLSVOFScalarConvectiveFlux<
217  EvalType,
218  panzer::Traits,
219  num_space_dim>(*ir,
220  phase_index,
221  _dof_phase_names.size(),
222  equ_name,
223  "BOUNDARY_",
224  "BOUNDARY_"));
225 
226  this->template registerEvaluator<EvalType>(fm,
227  lsvof_convective_flux_op);
228 
229  this->registerConvectionTypeFluxOperator(
230  pair, eq_vct_map, "CONVECTIVE", fm, side_pb, 1.0);
231 
232  ++phase_index;
233  }
234 
235  // Second-order flux //
236 
237  // Register penalty and viscous gradient operators for each equation.
238  if (_build_mom_eqn)
239  {
240  for (auto& pair : _equ_dof_ns_pair)
241  {
242  this->registerPenaltyAndViscousGradientOperator(
243  pair, fm, side_pb, user_data);
244  }
245 
246  // Create boundary fluxes to be used with the penalty method
247  for (auto& pair : this->bnd_prefix)
248  {
249  // Prefix names
250  const std::string flux_prefix = pair.first;
251  const std::string gradient_prefix = pair.second;
252  const std::string field_prefix = "BOUNDARY_";
253 
254  auto viscous_flux_op = Teuchos::rcp(
255  new ClosureModel::IncompressibleLSVOFViscousFlux<EvalType,
256  panzer::Traits,
257  num_space_dim>(
258  *ir,
259  _lsvof_params,
260  flux_prefix,
261  gradient_prefix,
262  field_prefix));
263  this->template registerEvaluator<EvalType>(fm, viscous_flux_op);
264  }
265 
266  // Create viscous flux integrals.
267  for (auto& pair : _equ_dof_ns_pair)
268  {
269  this->registerViscousTypeFluxOperator(
270  pair, eq_vct_map, "VISCOUS", fm, side_pb, 1.0);
271  }
272 
273  // Compose total residual for NS equations
274  for (auto& pair : _equ_dof_ns_pair)
275  {
276  this->registerResidual(pair, eq_vct_map, fm, side_pb);
277  }
278  }
279 
280  // Compose total residual for LSVOF equations
281  for (auto& pair : _equ_dof_lsvof_pair)
282  {
283  this->registerResidual(pair, eq_vct_map, fm, side_pb);
284  }
285 }
286 
287 //---------------------------------------------------------------------------//
288 template<class EvalType, int NumSpaceDim>
289 void IncompressibleLSVOFBoundaryFlux<EvalType, NumSpaceDim>::
290  buildAndRegisterScatterEvaluators(
291  PHX::FieldManager<panzer::Traits>& fm,
292  const panzer::PhysicsBlock& side_pb,
293  const panzer::LinearObjFactory<panzer::Traits>& lof,
294  const Teuchos::ParameterList& /*user_data*/) const
295 {
296  for (auto& pair : _equ_dof_ns_pair)
297  {
298  this->registerScatterOperator(pair, fm, side_pb, lof);
299  }
300 
301  for (auto& pair : _equ_dof_lsvof_pair)
302  {
303  this->registerScatterOperator(pair, fm, side_pb, lof);
304  }
305 }
306 
307 //---------------------------------------------------------------------------//
308 template<class EvalType, int NumSpaceDim>
309 void IncompressibleLSVOFBoundaryFlux<EvalType, NumSpaceDim>::
310  buildAndRegisterGatherAndOrientationEvaluators(
311  PHX::FieldManager<panzer::Traits>& fm,
312  const panzer::PhysicsBlock& side_pb,
313  const panzer::LinearObjFactory<panzer::Traits>& lof,
314  const Teuchos::ParameterList& user_data) const
315 {
316  side_pb.buildAndRegisterGatherAndOrientationEvaluators(fm, lof, user_data);
317 }
318 
319 //---------------------------------------------------------------------------//
320 template<class EvalType, int NumSpaceDim>
321 void IncompressibleLSVOFBoundaryFlux<EvalType, NumSpaceDim>::postRegistrationSetup(
322  typename panzer::Traits::SetupData, PHX::FieldManager<panzer::Traits>&)
323 {
324 }
325 
326 //---------------------------------------------------------------------------//
327 template<class EvalType, int NumSpaceDim>
328 void IncompressibleLSVOFBoundaryFlux<EvalType, NumSpaceDim>::evaluateFields(
329  typename panzer::Traits::EvalData)
330 {
331 }
332 
333 //---------------------------------------------------------------------------//
334 
335 } // end namespace BoundaryCondition
336 } // end namespace VertexCFD
337 
338 #endif // end
339  // VERTEXCFD_BOUNDARYCONDITION_INCOMPRESSIBLELSVOFBOUNDARYFLUX_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23
VertexCFD::BoundaryCondition::IncompressibleLSVOFBoundaryFlux::setup
void setup(const panzer::PhysicsBlock &side_pb, const Teuchos::ParameterList &user_data) override
Definition: VertexCFD_BCStrategy_IncompressibleLSVOFBoundaryFlux_impl.hpp:47
VertexCFD::BoundaryCondition::IncompressibleLSVOFBoundaryFlux
Definition: VertexCFD_BCStrategy_IncompressibleLSVOFBoundaryFlux.hpp:28