1 #include <deal.II/base/function.h> 2 #include "initial_condition_function.h" 4 #include "physics/physics_factory.h" 11 template <
int dim,
int nstate,
typename real>
14 : dealii::Function<dim,real>(nstate)
22 template <
int dim,
int nstate,
typename real>
27 , gamma_gas(param->euler_param.gamma_gas)
28 , mach_inf(param->euler_param.mach_inf)
29 , mach_inf_sqr(mach_inf*mach_inf)
31 template <
int dim,
int nstate,
typename real>
37 if constexpr(dim == 3) {
38 const real x = point[0], y = point[1], z = point[2];
42 value = this->density(point);
46 value = sin(x)*cos(y)*cos(z);
50 value = -cos(x)*sin(y)*cos(z);
58 value = 1.0/(this->gamma_gas*this->mach_inf_sqr) + (1.0/16.0)*(cos(2.0*x)+cos(2.0*y))*(cos(2.0*z)+2.0);
64 template <
int dim,
int nstate,
typename real>
78 template <
int dim,
int nstate,
typename real>
85 template <
int dim,
int nstate,
typename real>
87 ::density(
const dealii::Point<dim,real> &point)
const 92 value = this->primitive_value(point, 4);
93 value *= this->gamma_gas*this->mach_inf_sqr;
100 template <
int dim,
int nstate,
typename real>
108 template <
int dim,
int nstate,
typename real>
110 ::value(
const dealii::Point<dim,real> &,
const unsigned int )
const 119 template <
int dim,
int nstate,
typename real>
127 template <
int dim,
int nstate,
typename real>
129 ::value(
const dealii::Point<dim,real> &point,
const unsigned int )
const 132 if(point[0] >= 0 && point[0] <= 0.25){
133 value = sin(4*dealii::numbers::PI*point[0]);
142 template <
int dim,
int nstate,
typename real>
150 template <
int dim,
int nstate,
typename real>
152 ::value(
const dealii::Point<dim,real> &point,
const unsigned int )
const 155 if constexpr(dim >= 1)
156 value *= cos(dealii::numbers::PI*point[0]);
157 if constexpr(dim >= 2)
158 value *= cos(dealii::numbers::PI*point[1]);
159 if constexpr(dim == 3)
160 value *= cos(dealii::numbers::PI*point[2]);
168 template <
int dim,
int nstate,
typename real>
176 template <
int dim,
int nstate,
typename real>
178 ::value(
const dealii::Point<dim,real> &point,
const unsigned int )
const 181 if constexpr(dim >= 1)
182 value *= sin(dealii::numbers::PI*point[0]);
183 if constexpr(dim >= 2)
184 value *= sin(dealii::numbers::PI*point[1]);
185 if constexpr(dim == 3)
186 value *= sin(dealii::numbers::PI*point[2]);
195 template <
int dim,
int nstate,
typename real>
203 template <
int dim,
int nstate,
typename real>
205 ::value(
const dealii::Point<dim,real> &point,
const unsigned int )
const 208 if constexpr(dim >= 1)
209 value *= exp(-20.0*point[0]*point[0]);
210 if constexpr(dim >= 2)
211 value *= exp(-20.0*point[1]*point[1]);
212 if constexpr(dim == 3)
213 value *= exp(-20.0*point[2]*point[2]);
221 template <
int dim,
int nstate,
typename real>
229 template <
int dim,
int nstate,
typename real>
231 ::value(
const dealii::Point<dim,real> &point,
const unsigned int )
const 234 if constexpr(dim >= 1)
235 value *= sin(2.0*dealii::numbers::PI*point[0]);
236 if constexpr(dim >= 2)
237 value *= sin(2.0*dealii::numbers::PI*point[1]);
238 if constexpr(dim == 3)
239 value *= sin(2.0*dealii::numbers::PI*point[2]);
247 template <
int dim,
int nstate,
typename real>
255 template <
int dim,
int nstate,
typename real>
257 ::value(
const dealii::Point<dim,real> &point,
const unsigned int )
const 260 if constexpr(dim >= 1)
261 value *= sin(dealii::numbers::PI*point[0]);
262 if constexpr(dim >= 2)
263 value *= sin(dealii::numbers::PI*point[1]);
264 if constexpr(dim == 3)
265 value *= sin(dealii::numbers::PI*point[2]);
273 template <
int dim,
int nstate,
typename real>
281 template <
int dim,
int nstate,
typename real>
283 ::value(
const dealii::Point<dim,real> &point,
const unsigned int )
const 286 if constexpr(dim >= 1)
287 value *= sin(dealii::numbers::PI*point[0]);
288 if constexpr(dim >= 2)
289 value *= sin(dealii::numbers::PI*point[1]);
290 if constexpr(dim == 3)
291 value *= sin(dealii::numbers::PI*point[2]);
301 template <
int dim,
int nstate,
typename real>
309 template <
int dim,
int nstate,
typename real>
311 ::value(
const dealii::Point<dim,real> &point,
const unsigned int )
const 314 real pi = dealii::numbers::PI;
315 if(point[0] >= 0.0 && point[0] <= 2.0){
316 value = sin(2*pi*point[0]/2.0);
324 template <
int dim,
int nstate,
typename real>
336 template <
int dim,
int nstate,
typename real>
338 ::value(
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 341 const double pi = dealii::numbers::PI;
342 const double gam = 1.4;
343 const double M_infty = sqrt(2/gam);
345 const double sigma = 1;
346 const double beta = M_infty * 5 * sqrt(2.0)/4.0/pi * exp(1.0/2.0);
347 const double alpha = pi/4;
350 const double x0 = 0.0;
351 const double y0 = 0.0;
352 const double x = point[0] - x0;
353 const double y = point[1] - y0;
355 const double Omega = beta * exp(-0.5/sigma/sigma* (x/R * x/R + y/R * y/R));
356 const double delta_Ux = -y/R * Omega;
357 const double delta_Uy = x/R * Omega;
358 const double delta_T = -(gam-1.0)/2.0 * Omega * Omega;
361 std::array<real,nstate> soln_primitive;
362 soln_primitive[0] = pow((1 + delta_T), 1.0/(gam-1.0));
363 soln_primitive[1] = M_infty * cos(alpha) + delta_Ux;
364 soln_primitive[2] = M_infty * sin(alpha) + delta_Uy;
366 soln_primitive[3] = 0;
368 soln_primitive[nstate-1] = 1.0/gam*pow(1+delta_T, gam/(gam-1.0));
370 const std::array<real,nstate> soln_conservative = this->euler_physics->convert_primitive_to_conservative(soln_primitive);
371 return soln_conservative[istate];
381 template <
int dim,
int nstate,
typename real>
386 , atwood_number(param->flow_solver_param.atwood_number)
394 template <
int dim,
int nstate,
typename real>
396 ::value(
const dealii::Point<dim,real> &point,
const unsigned int istate)
const 398 const double pi = dealii::numbers::PI;
400 const double B = 0.5 * (tanh(15*point[1] + 7.5) - tanh(15*point[1] - 7.5));
402 const double rho1 = 0.5;
403 const double rho2 = rho1 * (1 + atwood_number) / (1 - atwood_number);
405 std::array<real,nstate> soln_primitive;
406 soln_primitive[0] = rho1 + B * (rho2-rho1);
407 soln_primitive[nstate-1] = 1;
408 soln_primitive[1] = B - 0.5;
409 soln_primitive[2] = 0.1 * sin(2 * pi * point[0]);
411 const std::array<real,nstate> soln_conservative = this->euler_physics->convert_primitive_to_conservative(soln_primitive);
412 return soln_conservative[istate];
418 template <
int dim,
int nstate,
typename real>
427 parameters_euler.
pde_type = Parameters::AllParameters::PartialDifferentialEquation::euler;
432 template <
int dim,
int nstate,
typename real>
435 const dealii::Point<dim, real>& point,
const unsigned int istate)
const 438 std::array<real, nstate> soln_primitive;
440 soln_primitive[0] = primitive_value(point, 0);
441 soln_primitive[1] = primitive_value(point, 1);
442 soln_primitive[2] = primitive_value(point, 2);
444 if constexpr (dim > 1)
445 soln_primitive[3] = primitive_value(point, 3);
446 if constexpr (dim > 2)
447 soln_primitive[4] = primitive_value(point, 4);
449 const std::array<real, nstate> soln_conservative = this->euler_physics->convert_primitive_to_conservative(soln_primitive);
450 value = soln_conservative[istate];
455 template <
int dim,
int nstate,
typename real>
457 ::value(
const dealii::Point<dim, real>& point,
const unsigned int istate)
const 460 value = convert_primitive_to_conversative_value(point, istate);
468 template <
int dim,
int nstate,
typename real>
475 template <
int dim,
int nstate,
typename real>
480 if constexpr (dim == 1 && nstate == (dim+2)) {
481 const real x = point[0];
517 template <
int dim,
int nstate,
typename real>
524 template <
int dim,
int nstate,
typename real>
529 if constexpr (dim == 2 && nstate == (dim + 2)) {
530 const real x = point[0];
531 const real y = point[1];
534 value = 1 + 0.99 * sin(x + y);
556 template <
int dim,
int nstate,
typename real>
563 template <
int dim,
int nstate,
typename real>
568 if constexpr (dim == 1 && nstate == (dim + 2)) {
569 const real x = point[0];
581 value = pow(10.0, 9.0);
606 template <
int dim,
int nstate,
typename real>
613 template <
int dim,
int nstate,
typename real>
618 if constexpr (dim == 1 && nstate == (dim + 2)) {
619 const real x = point[0];
625 else if (istate == 1) {
629 else if (istate == 2) {
637 value = 1 + 0.2 * sin(5 * x);
639 else if (istate == 1) {
643 else if (istate == 2) {
655 template <
int dim,
int nstate,
typename real>
663 template <
int dim,
int nstate,
typename real>
665 ::value(
const dealii::Point<dim,real> &,
const unsigned int )
const 673 template <
int dim,
int nstate,
typename real>
674 std::shared_ptr<InitialConditionFunction<dim, nstate, real>>
680 if (flow_type == FlowCaseEnum::taylor_green_vortex) {
681 if constexpr (dim==3 && nstate==dim+2){
684 if(density_initial_condition_type == DensityInitialConditionEnum::uniform) {
685 return std::make_shared<InitialConditionFunction_TaylorGreenVortex<dim,nstate,real> >(
687 }
else if (density_initial_condition_type == DensityInitialConditionEnum::isothermal) {
688 return std::make_shared<InitialConditionFunction_TaylorGreenVortex_Isothermal<dim,nstate,real> >(
692 }
else if (flow_type == FlowCaseEnum::decaying_homogeneous_isotropic_turbulence) {
693 if constexpr (dim==3 && nstate==dim+2)
return nullptr;
694 }
else if (flow_type == FlowCaseEnum::burgers_rewienski_snapshot) {
695 if constexpr (dim==1 && nstate==1)
return std::make_shared<InitialConditionFunction_BurgersRewienski<dim,nstate,real> > ();
696 }
else if (flow_type == FlowCaseEnum::burgers_viscous_snapshot) {
697 if constexpr (dim==1 && nstate==1)
return std::make_shared<InitialConditionFunction_BurgersViscous<dim,nstate,real> > ();
698 }
else if (flow_type == FlowCaseEnum::naca0012 || flow_type == FlowCaseEnum::gaussian_bump) {
699 if constexpr ((dim==2 || dim==3) && nstate==dim+2) {
703 param->euler_param.gamma_gas,
707 return std::make_shared<FreeStreamInitialConditions<dim,nstate,real>>(euler_physics_double);
709 }
else if (flow_type == FlowCaseEnum::burgers_inviscid && param->
use_energy==
false) {
710 if constexpr (nstate==dim && dim<3)
return std::make_shared<InitialConditionFunction_BurgersInviscid<dim, nstate, real> >();
711 }
else if (flow_type == FlowCaseEnum::burgers_inviscid && param->
use_energy==
true) {
712 if constexpr (dim==1 && nstate==1)
return std::make_shared<InitialConditionFunction_BurgersInviscidEnergy<dim,nstate,real> > ();
713 }
else if (flow_type == FlowCaseEnum::advection && param->
use_energy==
true) {
714 if constexpr (nstate==1)
return std::make_shared<InitialConditionFunction_AdvectionEnergy<dim,nstate,real> > ();
715 }
else if (flow_type == FlowCaseEnum::advection && param->
use_energy==
false) {
716 if constexpr (nstate==1)
return std::make_shared<InitialConditionFunction_Advection<dim,nstate,real> > ();
717 }
else if (flow_type == FlowCaseEnum::convection_diffusion && !param->
use_energy) {
718 if constexpr (nstate==1)
return std::make_shared<InitialConditionFunction_ConvDiff<dim,nstate,real> > ();
719 }
else if (flow_type == FlowCaseEnum::convection_diffusion && param->
use_energy) {
720 return std::make_shared<InitialConditionFunction_ConvDiffEnergy<dim,nstate,real> > ();
721 }
else if (flow_type == FlowCaseEnum::periodic_1D_unsteady) {
722 if constexpr (dim==1 && nstate==1)
return std::make_shared<InitialConditionFunction_1DSine<dim,nstate,real> > ();
723 }
else if (flow_type == FlowCaseEnum::isentropic_vortex) {
724 if constexpr (dim>1 && nstate==dim+2)
return std::make_shared<InitialConditionFunction_IsentropicVortex<dim,nstate,real> > (param);
725 }
else if (flow_type == FlowCaseEnum::kelvin_helmholtz_instability) {
726 if constexpr (dim>1 && nstate==dim+2)
return std::make_shared<InitialConditionFunction_KHI<dim,nstate,real> > (param);
727 }
else if (flow_type == FlowCaseEnum::non_periodic_cube_flow) {
728 if constexpr (dim==2 && nstate==1)
return std::make_shared<InitialConditionFunction_Zero<dim,nstate,real> > ();
729 }
else if (flow_type == FlowCaseEnum::sod_shock_tube) {
730 if constexpr (dim==1 && nstate==dim+2)
return std::make_shared<InitialConditionFunction_SodShockTube<dim,nstate,real> > (param);
731 }
else if (flow_type == FlowCaseEnum::low_density_2d) {
732 if constexpr (dim==2 && nstate==dim+2)
return std::make_shared<InitialConditionFunction_LowDensity2D<dim,nstate,real> > (param);
733 }
else if (flow_type == FlowCaseEnum::leblanc_shock_tube) {
734 if constexpr (dim==1 && nstate==dim+2)
return std::make_shared<InitialConditionFunction_LeblancShockTube<dim,nstate,real> > (param);
735 }
else if (flow_type == FlowCaseEnum::shu_osher_problem) {
736 if constexpr (dim == 1 && nstate == dim + 2)
return std::make_shared<InitialConditionFunction_ShuOsherProblem<dim, nstate, real> >(param);
737 }
else if (flow_type == FlowCaseEnum::advection_limiter) {
738 if constexpr (dim < 3 && nstate == 1)
return std::make_shared<InitialConditionFunction_Advection<dim, nstate, real> >();
739 }
else if (flow_type == FlowCaseEnum::burgers_limiter) {
740 if constexpr (nstate==dim && dim<3)
return std::make_shared<InitialConditionFunction_BurgersInviscid<dim, nstate, real> >();
742 std::cout <<
"Invalid Flow Case Type. You probably forgot to add it to the list of flow cases in initial_condition_function.cpp" << std::endl;
InitialConditionFunction_1DSine()
< dealii::Function we are templating on
InitialConditionFunction_BurgersInviscidEnergy()
< dealii::Function we are templating on
FlowCaseType
Selects the flow case to be simulated.
PartialDifferentialEquation pde_type
Store the PDE type to be solved.
Initial Condition Function: Advection Energy.
Initial Condition Function: Taylor Green Vortex (isothermal density)
FlowCaseType flow_case_type
Selected FlowCaseType from the input file.
const double mach_inf
Farfield Mach number.
real primitive_value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of initial condition expressed in terms of primitive variables.
FlowSolverParam flow_solver_param
Contains the parameters for simulation cases (flow solver test)
const double angle_of_attack
Angle of attack.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of initial condition.
Initial Condition Function: 1D Burgers Viscous.
InitialConditionFunction_EulerBase(Parameters::AllParameters const *const param)
< dealii::Function we are templating on
Initial Condition Function: 1D Sod Shock Tube.
InitialConditionFunction()
< dealii::Function we are templating on
bool use_energy
Flag to use an energy monotonicity test.
InitialConditionFunction_BurgersRewienski()
< dealii::Function we are templating on
InitialConditionFunction_TaylorGreenVortex_Isothermal(Parameters::AllParameters const *const param)
Constructor for TaylorGreenVortex_InitialCondition with isothermal density.
InitialConditionFunction_LeblancShockTube(Parameters::AllParameters const *const param)
Constructor for InitialConditionFunction_SodShockTube.
Files for the baseline physics.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of initial condition expressed in terms of conservative variables.
real primitive_value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of initial condition expressed in terms of primitive variables.
Initial Condition Function: Euler Equations (primitive values)
const double side_slip_angle
Sideslip angle.
Initial Condition Function: 1D Shu Osher Problem.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of initial condition.
Initial Condition Function: Convection Diffusion Orders of Accuracy.
real convert_primitive_to_conversative_value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const
Converts value from: primitive to conservative.
Initial Condition Function: Isentropic vortex.
real value(const dealii::Point< dim, real > &point, const unsigned int istate) const override
Value of initial condition.
Main parameter class that contains the various other sub-parameter classes.
InitialConditionFunction_ShuOsherProblem(Parameters::AllParameters const *const param)
Constructor for InitialConditionFunction_SodShockTube.
InitialConditionFunction_BurgersInviscid()
< dealii::Function we are templating on
InitialConditionFunction_LowDensity2D(Parameters::AllParameters const *const param)
Constructor for InitialConditionFunction_SodShockTube.
virtual real density(const dealii::Point< dim, real > &point) const
Value of initial condition for density.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of initial condition.
InitialConditionFunction_ConvDiffEnergy()
< dealii::Function we are templating on
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Returns zero.
real density(const dealii::Point< dim, real > &point) const override
Value of initial condition for density.
real value(const dealii::Point< dim, real > &point, const unsigned int istate) const override
Value of initial condition.
Initial Condition Function: 1D Burgers Inviscid Energy.
Initial condition function factory.
real primitive_value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of initial condition expressed in terms of primitive variables.
real primitive_value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of initial condition expressed in terms of primitive variables.
real primitive_value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const
Value of initial condition expressed in terms of primitive variables.
InitialConditionFunction_TaylorGreenVortex(Parameters::AllParameters const *const param)
< dealii::Function we are templating on
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of initial condition.
Euler equations. Derived from PhysicsBase.
real value(const dealii::Point< dim, real > &point, const unsigned int istate) const override
Value of initial condition.
Initial Condition Function: 1D Burgers Inviscid.
real value(const dealii::Point< dim, real > &point, const unsigned int istate) const override
Value of initial condition.
InitialConditionFunction_Advection()
< dealii::Function we are templating on
Initial Condition Function: 2D Low Density Euler.
Initial condition function used to initialize a particular flow setup/case.
Initial Condition Function: 1D Burgers Rewienski.
Kelvin-Helmholtz Instability, parametrized by Atwood number.
InitialConditionFunction_ConvDiff()
< dealii::Function we are templating on
InitialConditionFunction_SodShockTube(Parameters::AllParameters const *const param)
Constructor for InitialConditionFunction_SodShockTube.
static std::shared_ptr< PhysicsBase< dim, nstate, real > > create_Physics(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ModelBase< dim, nstate, real > > model_input=nullptr)
Factory to return the correct physics given input file.
InitialConditionFunction_AdvectionEnergy()
< dealii::Function we are templating on
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of initial condition.
InitialConditionFunction_BurgersViscous()
< dealii::Function we are templating on
InitialConditionFunction_KHI(Parameters::AllParameters const *const param)
< dealii::Function we are templating on
Initial Condition Function: 1D Burgers Inviscid.
Initial Condition Function: 1D Leblanc Shock Tube.
DensityInitialConditionType
For taylor green vortex, selects the type of density initialization.
real value(const dealii::Point< dim, real > &point, const unsigned int istate=0) const override
Value of initial condition.
const double ref_length
Reference length.
real value(const dealii::Point< dim, real > &point, const unsigned int istate) const override
Value of initial condition.
Initial Condition Function: Taylor Green Vortex (uniform density)
InitialConditionFunction_Zero()
< dealii::Function we are templating on
Initial Condition Function: Convection Diffusion Energy.
static std::shared_ptr< InitialConditionFunction< dim, nstate, real > > create_InitialConditionFunction(Parameters::AllParameters const *const param)
Construct InitialConditionFunction object from global parameter file.
InitialConditionFunction_IsentropicVortex(Parameters::AllParameters const *const param)
< dealii::Function we are templating on
DensityInitialConditionType density_initial_condition_type
Selected DensityInitialConditionType from the input file.