8 template <
int dim,
int nspecies,
int nstate,
typename real>
11 const double diffusion_coefficient,
12 const bool convection,
14 const dealii::Tensor<2,3,double> input_diffusion_tensor,
17 const bool has_nonzero_physical_source)
18 :
PhysicsBase<dim,nspecies,nstate,real>(parameters_input, diffusion, has_nonzero_physical_source, input_diffusion_tensor, manufactured_solution_function)
19 , diffusion_scaling_coeff(diffusion_coefficient)
20 , hasConvection(convection)
21 , hasDiffusion(diffusion)
22 , test_type(parameters_test)
24 static_assert(nstate==dim,
"Physics::Burgers() should be created with nstate==dim");
27 template <
int dim,
int nspecies,
int nstate,
typename real>
31 const dealii::Point<dim, real> &pos,
32 const dealii::Tensor<1,dim,real> &normal_int,
33 const std::array<real,nstate> &soln_int,
34 const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
35 std::array<real,nstate> &soln_bc,
36 std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc)
const 38 std::array<real,nstate> boundary_values;
39 std::array<dealii::Tensor<1,dim,real>,nstate> boundary_gradients;
40 for (
int i=0; i<nstate; i++) {
45 for (
int istate=0; istate<nstate; ++istate) {
48 const bool inflow = (characteristic_dot_n[istate] <= 0.);
54 soln_bc[istate] = boundary_values[istate];
55 soln_grad_bc[istate] = soln_grad_int[istate];
61 soln_bc[istate] = soln_int[istate];
68 soln_grad_bc[istate] = soln_grad_int[istate];
75 template <
int dim,
int nspecies,
int nstate,
typename real>
79 std::array<dealii::Tensor<1,dim,real>,nstate> conv_flux;
80 for (
int flux_dim=0; flux_dim<dim; ++flux_dim) {
81 for (
int s=0; s<nstate; ++s) {
82 conv_flux[s][flux_dim] = 0.5*solution[flux_dim]*solution[s];
88 template <
int dim,
int nspecies,
int nstate,
typename real>
90 const std::array<real,nstate> &conservative_soln1,
91 const std::array<real,nstate> &conservative_soln2)
const 93 std::array<dealii::Tensor<1,dim,real>,nstate> conv_flux;
94 for (
int flux_dim=0; flux_dim<dim; ++flux_dim) {
95 for (
int s=0; s<nstate; ++s) {
96 conv_flux[s][flux_dim] = 1./6. * (conservative_soln1[flux_dim]*conservative_soln1[flux_dim] + conservative_soln1[flux_dim]*conservative_soln2[s] + conservative_soln2[s]*conservative_soln2[s]);
102 template <
int dim,
int nspecies,
int nstate,
typename real>
106 return conservative_soln;
109 template <
int dim,
int nspecies,
int nstate,
typename real>
113 return primitive_soln;
116 template <
int dim,
int nspecies,
int nstate,
typename real>
119 const std::array<real,nstate> &,
120 const std::array<dealii::Tensor<1,dim,real>,nstate> &primitive_soln_gradient)
const 122 return primitive_soln_gradient;
125 template <
int dim,
int nspecies,
int nstate,
typename real>
128 const std::array<real,nstate> &,
129 const std::array<dealii::Tensor<1,dim,real>,nstate> &conservative_soln_gradient)
const 131 return conservative_soln_gradient;
134 template <
int dim,
int nspecies,
int nstate,
typename real>
137 const std::array<real,nstate> &conservative_soln)
const 139 return conservative_soln;
142 template <
int dim,
int nspecies,
int nstate,
typename real>
145 const std::array<real,nstate> &entropy_var)
const 150 template <
int dim,
int nspecies,
int nstate,
typename real>
155 const real zero = 0.0;
159 template <
int dim,
int nspecies,
int nstate,
typename real>
162 const std::array<real,nstate> &solution,
163 const dealii::Tensor<1,dim,real> &normal)
const 165 std::array<real,nstate> eig;
166 for (
int i=0; i<nstate; i++) {
168 for (
int d=0;d<dim;++d) {
169 eig[i] += solution[d]*normal[d];
175 template <
int dim,
int nspecies,
int nstate,
typename real>
180 for (
int i=0; i<dim; i++) {
182 const real abs_soln = abs(soln[i]);
183 max_eig = std::max(max_eig, abs_soln);
189 template <
int dim,
int nspecies,
int nstate,
typename real>
196 template <
int dim,
int nspecies,
int nstate,
typename real>
199 const std::array<real,nstate> &solution,
200 const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient,
201 const dealii::types::global_dof_index )
const 206 template <
int dim,
int nspecies,
int nstate,
typename real>
209 const std::array<real,nstate> &,
210 const std::array<dealii::Tensor<1,dim,real>,nstate> &solution_gradient)
const 212 std::array<dealii::Tensor<1,dim,real>,nstate> diss_flux;
214 for (
int i=0; i<nstate; i++) {
215 for (
int d1=0; d1<dim; d1++) {
216 diss_flux[i][d1] = 0.0;
217 for (
int d2=0; d2<dim; d2++) {
218 diss_flux[i][d1] += -diff_coeff*((this->
diffusion_tensor[d1][d2])*solution_gradient[i][d2]);
225 template <
int dim,
int nspecies,
int nstate,
typename real>
228 const dealii::Point<dim,real> &pos,
229 const std::array<real,nstate> &solution,
230 const real current_time,
231 const dealii::types::global_dof_index )
const 236 template <
int dim,
int nspecies,
int nstate,
typename real>
239 const dealii::Point<dim,real> &pos,
240 const std::array<real,nstate> &,
241 const real current_time)
const 243 std::array<real,nstate> source;
247 if(this->
test_type == TestType::burgers_energy_stability || this->
test_type == TestType::burgers_limiter
248 || this->
test_type == TestType::stability_fr_parameter_range){
249 for(
int istate =0; istate<nstate; istate++){
250 source[istate] = 0.0;
251 const double pi = atan(1)*4.0;
252 const real pi_xmt = pi * (pos[0] - current_time);
253 const real pi_ymt = pi * (pos[1] - current_time);
254 const real pi_zmt = pi * (pos[2] - current_time);
258 source[istate] = pi * sin(pi_xmt)
259 *(1.0 - cos(pi_xmt));
264 const real sourcedt = pi*sin(pi_xmt)*cos(pi_ymt)
265 +pi*cos(pi_xmt)*sin(pi_ymt);
266 const real sourcedx = -pi*sin(pi_xmt)*(cos(pi_xmt))
267 *pow(cos(pi_ymt),2.0);
268 const real sourcedy = -pi*sin(pi_ymt)*(cos(pi_ymt))
269 *pow(cos(pi_xmt),2.0);
270 source[istate] = sourcedt + sourcedx + sourcedy;
275 const real sourcedt = pi*sin(pi_xmt)*cos(pi_ymt)*cos(pi_zmt)
276 +pi*cos(pi_xmt)*sin(pi_ymt)*cos(pi_zmt)
277 +pi*cos(pi_xmt)*cos(pi_ymt)*sin(pi_zmt);
278 const real sourcedx = -pi*sin(pi_xmt)*(cos(pi_xmt))
279 *pow(cos(pi_ymt),2.0)*pow(cos(pi_zmt),2.0);
280 const real sourcedy = -pi*sin(pi_ymt)*(cos(pi_ymt))
281 *pow(cos(pi_xmt),2.0)*pow(cos(pi_zmt),2.0);
282 const real sourcedz = -pi*sin(pi_zmt)*(cos(pi_zmt))
283 *pow(cos(pi_xmt),2.0)*pow(cos(pi_ymt),2.0);
284 source[istate] = sourcedt + sourcedx + sourcedy + sourcedz;
300 for (
int istate=0; istate<nstate; istate++) {
301 source[istate] = 0.0;
304 for (
int d=0;d<dim;++d) {
306 source[istate] += 0.5*manufactured_solution*manufactured_gradient[d];
310 for (
int dr=0; dr<dim; ++dr) {
311 for (
int dc=0; dc<dim; ++dc) {
315 source[istate] += -diff_coeff*hess;
317 for (
int istate=0; istate<nstate; istate++) {
319 real divergence = 0.0;
320 for (
int d=0;d<dim;++d) {
322 divergence += manufactured_gradient[d];
324 source[istate] += 0.5*manufactured_solution*divergence;
348 #if PHILIP_SPECIES==1 const Parameters::AllParameters::TestType test_type
Allows Burgers to distinguish between different unsteady test types.
TestType
Possible integration tests to run.
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
std::array< real, nstate > source_term(const dealii::Point< dim, real > &pos, const std::array< real, nstate > &solution, const real current_time, const dealii::types::global_dof_index cell_index) const
Source term is zero or depends on manufactured solution.
Manufactured solution used for grid studies to check convergence orders.
real max_convective_eigenvalue(const std::array< real, nstate > &soln) const
Maximum convective eigenvalue.
Files for the baseline physics.
real diffusion_coefficient() const
Diffusion coefficient.
std::array< dealii::Tensor< 1, dim, real >, nstate > convert_conservative_gradient_to_primitive_gradient(const std::array< real, nstate > &conservative_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &conservative_soln_gradient) const
std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function
Manufactured solution function.
Main parameter class that contains the various other sub-parameter classes.
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_flux(const std::array< real, nstate > &solution) const
Convective flux: .
std::array< real, nstate > compute_conservative_variables_from_entropy_variables(const std::array< real, nstate > &entropy_var) const
Computes the conservative variables from the entropy variables.
const bool hasDiffusion
Turns on diffusive part of the Burgers problem.
std::array< real, nstate > compute_entropy_variables(const std::array< real, nstate > &conservative_soln) const
Computes the entropy variables.
std::array< dealii::Tensor< 1, dim, real >, nstate > dissipative_flux(const std::array< real, nstate > &solution, const std::array< dealii::Tensor< 1, dim, real >, nstate > &solution_gradient, const dealii::types::global_dof_index cell_index) const
Dissipative flux: u.
real max_viscous_eigenvalue(const std::array< real, nstate > &soln) const
Maximum viscous eigenvalue.
void boundary_face_values(const int, const dealii::Point< dim, real > &, const dealii::Tensor< 1, dim, real > &, const std::array< real, nstate > &, const std::array< dealii::Tensor< 1, dim, real >, nstate > &, std::array< real, nstate > &, std::array< dealii::Tensor< 1, dim, real >, nstate > &) const
If diffusion is present, assign Dirichlet boundary condition.
std::array< real, nstate > convert_primitive_to_conservative(const std::array< real, nstate > &primitive_soln) const
Convert primitive solution to conservative solution.
std::array< real, nstate > convective_eigenvalues(const std::array< real, nstate > &, const dealii::Tensor< 1, dim, real > &) const
Spectral radius of convective term Jacobian is 'c'.
std::array< real, nstate > convert_conservative_to_primitive(const std::array< real, nstate > &conservative_soln) const
Convert conservative variables to primitive variables.
Burger's equation with nonlinear advective term and linear diffusive term. Derived from PhysicsBase...
std::array< dealii::Tensor< 1, dim, real >, nstate > convective_numerical_split_flux(const std::array< real, nstate > &conservative_soln1, const std::array< real, nstate > &conservative_soln2) const override
Convective split flux.
double diffusion_scaling_coeff
Diffusion scaling coefficient in front of the diffusion tensor.
std::array< dealii::Tensor< 1, dim, real >, nstate > convert_primitive_gradient_to_conservative_gradient(const std::array< real, nstate > &primitive_soln, const std::array< dealii::Tensor< 1, dim, real >, nstate > &primitive_soln_gradient) const
Burgers(const Parameters::AllParameters *const parameters_input, const double diffusion_coefficient, const bool convection=true, const bool diffusion=true, const dealii::Tensor< 2, 3, double > input_diffusion_tensor=Parameters::ManufacturedSolutionParam::get_default_diffusion_tensor(), std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function=nullptr, const Parameters::AllParameters::TestType parameters_test=Parameters::AllParameters::TestType::run_control, const bool has_nonzero_physical_source=false)
Constructor.
dealii::Tensor< 2, dim, double > diffusion_tensor
Anisotropic diffusion matrix.