2 #include "dg/dg_factory.hpp" 3 #include "inviscid_split_taylor_green_vortex.h" 4 #include "physics/initial_conditions/set_initial_condition.h" 5 #include "physics/initial_conditions/initial_condition_function.h" 6 #include "mesh/grids/nonsymmetric_curved_periodic_grid.hpp" 7 #include "mesh/grids/straight_periodic_cube.hpp" 12 template <
int dim,
int nspecies,
int nstate>
16 template<
int dim,
int nspecies,
int nstate>
19 const unsigned int n_dofs_cell = dg->fe_collection[poly_degree].dofs_per_cell;
20 const unsigned int n_quad_pts = dg->volume_quadrature_collection[poly_degree].size();
21 const unsigned int n_shape_fns = n_dofs_cell / nstate;
24 vol_projection.
build_1D_volume_operator(dg->oneD_fe_collection_1state[poly_degree], dg->oneD_quadrature_collection[poly_degree]);
27 soln_basis.
build_1D_volume_operator(dg->oneD_fe_collection_1state[poly_degree], dg->oneD_quadrature_collection[poly_degree]);
29 dealii::LinearAlgebra::distributed::Vector<double> entropy_var_hat_global(dg->right_hand_side);
30 dealii::LinearAlgebra::distributed::Vector<double> energy_var_hat_global(dg->right_hand_side);
31 std::vector<dealii::types::global_dof_index> dofs_indices (n_dofs_cell);
35 for (
auto cell = dg->dof_handler.begin_active(); cell!=dg->dof_handler.end(); ++cell) {
36 if (!cell->is_locally_owned())
continue;
37 cell->get_dof_indices (dofs_indices);
40 std::array<std::vector<double>,nstate> soln_coeff;
41 for(
unsigned int idof=0; idof<n_dofs_cell; idof++){
42 const unsigned int istate = dg->fe_collection[poly_degree].system_to_component_index(idof).first;
43 const unsigned int ishape = dg->fe_collection[poly_degree].system_to_component_index(idof).second;
45 soln_coeff[istate].resize(n_shape_fns);
46 soln_coeff[istate][ishape] = dg->solution(dofs_indices[idof]);
50 std::array<std::vector<double>,nstate> soln_at_q;
51 for(
int istate=0; istate<nstate; istate++){
52 soln_at_q[istate].resize(n_quad_pts);
57 std::array<std::vector<double>,nstate> entropy_var_at_q;
58 std::array<std::vector<double>,nstate> energy_var_at_q;
59 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
60 std::array<double,nstate> soln_state;
61 for(
int istate=0; istate<nstate; istate++){
62 soln_state[istate] = soln_at_q[istate][iquad];
64 std::array<double,nstate> entropy_var_state = physics_double->compute_entropy_variables(soln_state);
65 std::array<double,nstate> kin_energy_state = physics_double->compute_kinetic_energy_variables(soln_state);
66 for(
int istate=0; istate<nstate; istate++){
68 entropy_var_at_q[istate].resize(n_quad_pts);
69 energy_var_at_q[istate].resize(n_quad_pts);
71 energy_var_at_q[istate][iquad] = kin_energy_state[istate];
72 entropy_var_at_q[istate][iquad] = entropy_var_state[istate];
77 for(
int istate=0; istate<nstate; istate++){
79 std::vector<double> entropy_var_hat(n_shape_fns);
82 std::vector<double> energy_var_hat(n_shape_fns);
86 for(
unsigned int ishape=0; ishape<n_shape_fns; ishape++){
87 const unsigned int idof = istate * n_shape_fns + ishape;
88 entropy_var_hat_global[dofs_indices[idof]] = entropy_var_hat[ishape];
89 energy_var_hat_global[dofs_indices[idof]] = energy_var_hat[ishape];
95 dg->assemble_residual();
96 std::array<double,2> change_entropy_and_energy;
97 change_entropy_and_energy[0] = entropy_var_hat_global * dg->right_hand_side;
98 change_entropy_and_energy[1] = energy_var_hat_global * dg->right_hand_side;
99 return change_entropy_and_energy;
101 template<
int dim,
int nspecies,
int nstate>
104 const unsigned int n_dofs_cell = dg->fe_collection[poly_degree].dofs_per_cell;
105 const unsigned int n_quad_pts = dg->volume_quadrature_collection[poly_degree].size();
106 const unsigned int n_shape_fns = n_dofs_cell / nstate;
107 const unsigned int grid_degree = dg->high_order_grid->fe_system.tensor_degree();
110 soln_basis.
build_1D_volume_operator(dg->oneD_fe_collection_1state[poly_degree], dg->oneD_quadrature_collection[poly_degree]);
111 soln_basis.
build_1D_gradient_operator(dg->oneD_fe_collection_1state[poly_degree], dg->oneD_quadrature_collection[poly_degree]);
115 flux_basis.
build_1D_volume_operator(dg->oneD_fe_collection_flux[poly_degree], dg->oneD_quadrature_collection[poly_degree]);
121 flux_basis_stiffness.
build_1D_volume_operator(dg->oneD_fe_collection_flux[poly_degree], dg->oneD_quadrature_collection[poly_degree]);
126 const std::vector<double> &oneD_vol_quad_weights = dg->oneD_quadrature_collection[poly_degree].get_weights();
129 vol_projection.
build_1D_volume_operator(dg->oneD_fe_collection_1state[poly_degree], dg->oneD_quadrature_collection[poly_degree]);
131 std::vector<dealii::types::global_dof_index> dofs_indices (n_dofs_cell);
135 double volume_term = 0.0;
136 auto metric_cell = dg->high_order_grid->dof_handler_grid.begin_active();
137 for (
auto cell = dg->dof_handler.begin_active(); cell!= dg->dof_handler.end(); ++cell, ++metric_cell) {
138 if (!cell->is_locally_owned())
continue;
139 cell->get_dof_indices (dofs_indices);
142 const dealii::FESystem<dim> &fe_metric = dg->high_order_grid->fe_system;
143 const unsigned int n_metric_dofs = fe_metric.dofs_per_cell;
144 const unsigned int n_grid_nodes = n_metric_dofs / dim;
145 std::vector<dealii::types::global_dof_index> metric_dof_indices(n_metric_dofs);
146 metric_cell->get_dof_indices (metric_dof_indices);
147 std::array<std::vector<double>,dim> mapping_support_points;
148 for(
int idim=0; idim<dim; idim++){
149 mapping_support_points[idim].resize(n_grid_nodes);
153 const std::vector<unsigned int > &index_renumbering = dealii::FETools::hierarchic_to_lexicographic_numbering<dim>(grid_degree);
154 for (
unsigned int idof = 0; idof< n_metric_dofs; ++idof) {
155 const double val = (dg->high_order_grid->volume_nodes[metric_dof_indices[idof]]);
156 const unsigned int istate = fe_metric.system_to_component_index(idof).first;
157 const unsigned int ishape = fe_metric.system_to_component_index(idof).second;
158 const unsigned int igrid_node = index_renumbering[ishape];
159 mapping_support_points[istate][igrid_node] = val;
167 n_quad_pts, n_grid_nodes,
168 mapping_support_points,
170 dg->all_parameters->use_invariant_curl_form);
174 std::array<std::vector<double>,nstate> soln_coeff;
175 for(
unsigned int idof=0; idof<n_dofs_cell; idof++){
176 const unsigned int istate = dg->fe_collection[poly_degree].system_to_component_index(idof).first;
177 const unsigned int ishape = dg->fe_collection[poly_degree].system_to_component_index(idof).second;
179 soln_coeff[istate].resize(n_shape_fns);
180 soln_coeff[istate][ishape] = dg->solution(dofs_indices[idof]);
183 std::array<std::vector<double>,nstate> soln_at_q;
184 std::array<std::vector<double>,dim> vel_at_q;
185 for(
int istate=0; istate<nstate; istate++){
186 soln_at_q[istate].resize(n_quad_pts);
192 std::array<std::vector<double>,nstate> energy_var_vol_int;
193 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
194 std::array<double,nstate> soln_state;
195 for(
int istate=0; istate<nstate; istate++){
196 soln_state[istate] = soln_at_q[istate][iquad];
198 std::array<double,nstate> energy_var;
199 energy_var = physics_double->compute_kinetic_energy_variables(soln_state);
200 for(
int istate=0; istate<nstate; istate++){
202 energy_var_vol_int[istate].resize(n_quad_pts);
204 energy_var_vol_int[istate][iquad] = energy_var[istate];
208 std::array<std::vector<double>,nstate> energy_var_hat;
209 for(
int istate=0; istate<nstate; istate++){
211 energy_var_hat[istate].resize(n_shape_fns);
216 std::array<dealii::Tensor<1,dim,dealii::FullMatrix<double>>,nstate> conv_ref_2pt_flux_at_q;
218 for (
unsigned int iquad=0; iquad<n_quad_pts; ++iquad) {
220 std::array<double,nstate> soln_state;
221 for(
int istate=0; istate<nstate; istate++){
222 soln_state[istate] = soln_at_q[istate][iquad];
228 dealii::Tensor<2,dim,double> metric_cofactor;
229 for(
int idim=0; idim<dim; idim++){
230 for(
int jdim=0; jdim<dim; jdim++){
238 std::array<dealii::Tensor<1,dim,double>,nstate> conv_phys_flux_2pt;
239 std::vector<std::array<dealii::Tensor<1,dim,double>,nstate>> conv_ref_flux_2pt(n_quad_pts);
240 for (
unsigned int flux_basis=iquad; flux_basis<n_quad_pts; ++flux_basis) {
245 dealii::Tensor<2,dim,double> metric_cofactor_flux_basis;
246 for(
int idim=0; idim<dim; idim++){
247 for(
int jdim=0; jdim<dim; jdim++){
248 metric_cofactor_flux_basis[idim][jdim] = metric_oper.
metric_cofactor_vol[idim][jdim][flux_basis];
251 std::array<double,nstate> soln_state_flux_basis;
252 for(
int istate=0; istate<nstate; istate++){
253 soln_state_flux_basis[istate] = soln_at_q[istate][flux_basis];
256 conv_phys_flux_2pt = physics_double->convective_numerical_split_flux(soln_state, soln_state_flux_basis);
259 const double pressure_int = physics_double->compute_pressure(soln_state);
260 const double pressure_ext = physics_double->compute_pressure(soln_state_flux_basis);
261 for(
int idim=0; idim<dim; idim++){
262 conv_phys_flux_2pt[1+idim][idim] -= 0.5*(pressure_int + pressure_ext);
266 for(
int istate=0; istate<nstate; istate++){
269 conv_phys_flux_2pt[istate],
270 0.5*(metric_cofactor + metric_cofactor_flux_basis),
271 conv_ref_flux_2pt[flux_basis][istate]);
276 for(
int istate=0; istate<nstate; istate++){
280 for(
int idim=0; idim<dim; idim++){
283 conv_ref_2pt_flux_at_q[istate][idim].reinit(n_quad_pts, n_quad_pts);
286 for (
unsigned int flux_basis=iquad; flux_basis<n_quad_pts; ++flux_basis) {
288 conv_ref_2pt_flux_at_q[istate][idim][iquad][flux_basis] = conv_ref_flux_2pt[flux_basis][istate][idim];
289 conv_ref_2pt_flux_at_q[istate][idim][flux_basis][iquad] = conv_ref_flux_2pt[flux_basis][istate][idim];
297 for(
int istate=0; istate<nstate; istate++){
300 std::vector<double> conv_flux_divergence(n_quad_pts);
316 std::vector<double> rhs(n_shape_fns);
319 std::vector<double> ones(n_quad_pts, 1.0);
322 for(
unsigned int ishape=0; ishape<n_shape_fns; ishape++){
323 volume_term += energy_var_hat[istate][ishape] * rhs[ishape];
331 template<
int dim,
int nspecies,
int nstate>
334 const unsigned int n_dofs_cell = dg->fe_collection[poly_degree].dofs_per_cell;
335 const unsigned int n_quad_pts = dg->volume_quadrature_collection[poly_degree].size();
336 const unsigned int n_shape_fns = n_dofs_cell / nstate;
340 soln_basis.
build_1D_volume_operator(dg->oneD_fe_collection_1state[poly_degree], dg->oneD_quadrature_collection[poly_degree]);
346 std::vector<dealii::types::global_dof_index> dofs_indices (n_dofs_cell);
350 double entropy_fn = 0.0;
351 const std::vector<double> &quad_weights = dg->volume_quadrature_collection[poly_degree].get_weights();
353 auto metric_cell = dg->high_order_grid->dof_handler_grid.begin_active();
354 for (
auto cell = dg->dof_handler.begin_active(); cell!= dg->dof_handler.end(); ++cell, ++metric_cell) {
355 if (!cell->is_locally_owned())
continue;
356 cell->get_dof_indices (dofs_indices);
359 const dealii::FESystem<dim> &fe_metric = dg->high_order_grid->fe_system;
360 const unsigned int n_metric_dofs = fe_metric.dofs_per_cell;
361 const unsigned int n_grid_nodes = n_metric_dofs / dim;
362 std::vector<dealii::types::global_dof_index> metric_dof_indices(n_metric_dofs);
363 metric_cell->get_dof_indices (metric_dof_indices);
364 std::array<std::vector<double>,dim> mapping_support_points;
365 for(
int idim=0; idim<dim; idim++){
366 mapping_support_points[idim].resize(n_grid_nodes);
370 const std::vector<unsigned int > &index_renumbering = dealii::FETools::hierarchic_to_lexicographic_numbering<dim>(dg->max_grid_degree);
371 for (
unsigned int idof = 0; idof< n_metric_dofs; ++idof) {
372 const double val = (dg->high_order_grid->volume_nodes[metric_dof_indices[idof]]);
373 const unsigned int istate = fe_metric.system_to_component_index(idof).first;
374 const unsigned int ishape = fe_metric.system_to_component_index(idof).second;
375 const unsigned int igrid_node = index_renumbering[ishape];
376 mapping_support_points[istate][igrid_node] = val;
384 n_quad_pts, n_grid_nodes,
385 mapping_support_points,
387 dg->all_parameters->use_invariant_curl_form);
389 std::array<std::vector<double>,nstate> soln_coeff;
390 for(
unsigned int idof=0; idof<n_dofs_cell; idof++){
391 const unsigned int istate = dg->fe_collection[poly_degree].system_to_component_index(idof).first;
392 const unsigned int ishape = dg->fe_collection[poly_degree].system_to_component_index(idof).second;
394 soln_coeff[istate].resize(n_shape_fns);
395 soln_coeff[istate][ishape] = dg->solution(dofs_indices[idof]);
398 std::array<std::vector<double>,nstate> soln_at_q;
399 for(
int istate=0; istate<nstate; istate++){
400 soln_at_q[istate].resize(n_quad_pts);
404 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
405 std::array<double,nstate> soln_state;
406 for(
int istate=0; istate<nstate; istate++){
407 soln_state[istate] = soln_at_q[istate][iquad];
409 const double density = soln_state[0];
410 const double entropy = physics_double->compute_entropy(soln_state);
411 double quadrature_entropy = 0.0;
413 quadrature_entropy = -density*entropy/(physics_double->compute_gamma(soln_state)-1);
415 quadrature_entropy = -density*entropy;
418 entropy_fn += quadrature_entropy * quad_weights[iquad] * metric_oper.
det_Jac_vol[iquad];
426 template<
int dim,
int nspecies,
int nstate>
430 int overintegrate = 10 ;
431 dealii::QGauss<1> quad_extra(dg->max_degree+1+overintegrate);
432 const unsigned int n_dofs_cell = dg->fe_collection[poly_degree].dofs_per_cell;
433 const unsigned int n_quad_pts = dg->volume_quadrature_collection[poly_degree].size();
434 const unsigned int n_shape_fns = n_dofs_cell / nstate;
438 soln_basis.
build_1D_volume_operator(dg->oneD_fe_collection_1state[poly_degree], dg->oneD_quadrature_collection[poly_degree]);
444 std::vector<dealii::types::global_dof_index> dofs_indices (n_dofs_cell);
446 double total_kinetic_energy = 0;
448 const std::vector<double> &quad_weights = dg->volume_quadrature_collection[poly_degree].get_weights();
450 auto metric_cell = dg->high_order_grid->dof_handler_grid.begin_active();
451 for (
auto cell = dg->dof_handler.begin_active(); cell!= dg->dof_handler.end(); ++cell, ++metric_cell) {
452 if (!cell->is_locally_owned())
continue;
455 cell->get_dof_indices (dofs_indices);
457 const dealii::FESystem<dim> &fe_metric = dg->high_order_grid->fe_system;
458 const unsigned int n_metric_dofs = fe_metric.dofs_per_cell;
459 const unsigned int n_grid_nodes = n_metric_dofs / dim;
460 std::vector<dealii::types::global_dof_index> metric_dof_indices(n_metric_dofs);
461 metric_cell->get_dof_indices (metric_dof_indices);
462 std::array<std::vector<double>,dim> mapping_support_points;
463 for(
int idim=0; idim<dim; idim++){
464 mapping_support_points[idim].resize(n_grid_nodes);
468 const std::vector<unsigned int > &index_renumbering = dealii::FETools::hierarchic_to_lexicographic_numbering<dim>(dg->max_grid_degree);
469 for (
unsigned int idof = 0; idof< n_metric_dofs; ++idof) {
470 const double val = (dg->high_order_grid->volume_nodes[metric_dof_indices[idof]]);
471 const unsigned int istate = fe_metric.system_to_component_index(idof).first;
472 const unsigned int ishape = fe_metric.system_to_component_index(idof).second;
473 const unsigned int igrid_node = index_renumbering[ishape];
474 mapping_support_points[istate][igrid_node] = val;
482 n_quad_pts, n_grid_nodes,
483 mapping_support_points,
485 dg->all_parameters->use_invariant_curl_form);
487 std::array<std::vector<double>,nstate> soln_coeff;
488 for(
unsigned int idof=0; idof<n_dofs_cell; idof++){
489 const unsigned int istate = dg->fe_collection[poly_degree].system_to_component_index(idof).first;
490 const unsigned int ishape = dg->fe_collection[poly_degree].system_to_component_index(idof).second;
492 soln_coeff[istate].resize(n_shape_fns);
493 soln_coeff[istate][ishape] = dg->solution(dofs_indices[idof]);
496 std::array<std::vector<double>,nstate> soln_at_q;
497 for(
int istate=0; istate<nstate; istate++){
498 soln_at_q[istate].resize(n_quad_pts);
502 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
503 std::array<double,nstate> soln_state;
504 for(
int istate=0; istate<nstate; istate++){
505 soln_state[istate] = soln_at_q[istate][iquad];
507 const double density = soln_state[0];
508 const double quadrature_kinetic_energy = 0.5*(soln_state[1]*soln_state[1]
509 + soln_state[2]*soln_state[2]
510 + soln_state[3]*soln_state[3])/density;
512 total_kinetic_energy += quadrature_kinetic_energy * quad_weights[iquad] * metric_oper.
det_Jac_vol[iquad];
515 return total_kinetic_energy;
518 template<
int dim,
int nspecies,
int nstate>
522 const unsigned int n_dofs_cell = nstate*pow(poly_degree+1,dim);
523 const unsigned int n_quad_pts = pow(poly_degree+1,dim);
524 std::vector<dealii::types::global_dof_index> dofs_indices1 (n_dofs_cell);
526 double cfl_min = 1e100;
530 for (
auto cell = dg->dof_handler.begin_active(); cell!=dg->dof_handler.end(); ++cell) {
531 if (!cell->is_locally_owned())
continue;
533 cell->get_dof_indices (dofs_indices1);
534 std::vector< std::array<double,nstate>> soln_at_q(n_quad_pts);
535 for (
unsigned int iquad=0; iquad<n_quad_pts; ++iquad) {
536 for (
int istate=0; istate<nstate; istate++) {
537 soln_at_q[iquad][istate] = 0;
540 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
541 dealii::Point<dim> qpoint = dg->volume_quadrature_collection[poly_degree].point(iquad);
542 for(
unsigned int idof=0; idof<n_dofs_cell; idof++){
543 const unsigned int istate = dg->fe_collection[poly_degree].system_to_component_index(idof).first;
544 soln_at_q[iquad][istate] += dg->solution[dofs_indices1[idof]] * dg->fe_collection[poly_degree].shape_value_component(idof, qpoint, istate);
548 std::vector< double > convective_eigenvalues(n_quad_pts);
549 for (
unsigned int isol = 0; isol < n_quad_pts; ++isol) {
550 convective_eigenvalues[isol] = physics_double->max_convective_eigenvalue (soln_at_q[isol]);
552 const double max_eig = *(std::max_element(convective_eigenvalues.begin(), convective_eigenvalues.end()));
554 double cfl = 0.1 * delta_x/max_eig;
562 template <
int dim,
int nspecies,
int nstate>
565 using Triangulation = dealii::parallel::distributed::Triangulation<dim>;
566 std::shared_ptr<Triangulation> grid = std::make_shared<Triangulation>(
568 typename dealii::Triangulation<dim>::MeshSmoothing(
569 dealii::Triangulation<dim>::smoothing_on_refinement |
570 dealii::Triangulation<dim>::smoothing_on_coarsening));
576 double right = 2 * dealii::numbers::PI;
577 const int n_refinements = 2;
578 unsigned int poly_degree = 3;
583 PHiLiP::Grids::nonsymmetric_curved_grid<dim,Triangulation>(*grid, n_refinements);
587 PHiLiP::Grids::straight_periodic_cube<dim,Triangulation>(grid, left, right, pow(2.0,n_refinements));
592 dg->allocate_system (
false,
false,
false);
594 pcout <<
"Implement initial conditions" << std::endl;
595 std::shared_ptr< InitialConditionFunction<dim,nspecies,nstate,double> > initial_condition_function =
599 const unsigned int n_global_active_cells2 = grid->n_global_active_cells();
600 double delta_x = (right-left)/pow(n_global_active_cells2,1.0/dim)/(poly_degree+1.0);
601 pcout<<
" delta x "<<delta_x<<std::endl;
605 pcout <<
"creating ODE solver" << std::endl;
607 pcout <<
"ODE solver successfully created" << std::endl;
608 double finalTime = 14.;
610 pcout <<
" number dofs " << dg->dof_handler.n_dofs()<<std::endl;
611 pcout <<
"preparing to advance solution in time" << std::endl;
613 pcout <<
"WARNING: entropy change is not calculated for multi-species since EC fluxes have not been implemented yet..." << std::endl;
615 ode_solver->current_iteration = 0;
616 ode_solver->allocate_ode_system();
619 const double initial_energy_mpi = (dealii::Utilities::MPI::sum(initial_energy,
mpi_communicator));
620 double initial_entropy = 1e6;
623 const double initial_entropy_mpi = (dealii::Utilities::MPI::sum(initial_entropy,
mpi_communicator));
625 std::ofstream myfile (all_parameters_new.
energy_file +
".gpl" , std::ios::trunc);
626 myfile <<
"time change_in_entropy KE_volume_work" << std::endl;
628 while(ode_solver->current_time < finalTime){
630 const double time_step =
get_timestep(dg,poly_degree, delta_x);
632 pcout<<
"time step "<<time_step<<
" current time "<<ode_solver->current_time<<std::endl;
636 ode_solver->step_in_time(dt,
false);
637 ode_solver->current_iteration += 1;
640 if (is_output_iteration) {
642 dg->output_results_vtk(file_number);
647 const double current_change_entropy_mpi = dealii::Utilities::MPI::sum(current_change_entropy[0],
mpi_communicator);
648 const double current_change_energy_mpi = dealii::Utilities::MPI::sum(current_change_entropy[1],
mpi_communicator);
651 pcout <<
"M plus K norm Change in Entropy at time " << ode_solver->current_time <<
" is " << current_change_entropy_mpi<< std::endl;
652 pcout <<
"M plus K norm Change in Kinetic Energy at time " << ode_solver->current_time <<
" is " << current_change_energy_mpi<< std::endl;
654 if(abs(current_change_entropy[0]) > 1e-12 && (dg->all_parameters->two_point_num_flux_type == Parameters::AllParameters::TwoPointNumericalFlux::IR || dg->all_parameters->two_point_num_flux_type == Parameters::AllParameters::TwoPointNumericalFlux::CH || dg->all_parameters->two_point_num_flux_type == Parameters::AllParameters::TwoPointNumericalFlux::Ra)){
655 pcout <<
" Change in entropy was not monotonically conserved." << std::endl;
661 const double current_energy_mpi = (dealii::Utilities::MPI::sum(current_energy,
mpi_communicator));
662 pcout <<
"Normalized kinetic energy " << ode_solver->current_time <<
" is " << current_energy_mpi/initial_energy_mpi<< std::endl;
666 const double current_entropy_mpi = (dealii::Utilities::MPI::sum(current_entropy,
mpi_communicator));
667 pcout <<
"Normalized entropy " << ode_solver->current_time <<
" is " << current_entropy_mpi/initial_entropy_mpi<< std::endl;
672 double current_vol_work_mpi = (dealii::Utilities::MPI::sum(current_vol_work,
mpi_communicator));
673 pcout<<
"volume work "<<current_vol_work_mpi<<std::endl;
677 myfile << ode_solver->current_time <<
" " << std::fixed << std::setprecision(16) << current_change_entropy_mpi <<
" " << current_vol_work_mpi<< std::endl;
679 myfile << ode_solver->current_time <<
" " << std::fixed << std::setprecision(16) <<
"N/A " << current_vol_work_mpi<< std::endl;
683 if(abs(current_vol_work_mpi) > 1e-12 && (dg->all_parameters->two_point_num_flux_type == Parameters::AllParameters::TwoPointNumericalFlux::Ra || dg->all_parameters->two_point_num_flux_type == Parameters::AllParameters::TwoPointNumericalFlux::KG ) ){
684 pcout<<
"The kinetic energy volume work is not zero."<<std::endl;
dealii::Tensor< 2, dim, std::vector< real > > metric_cofactor_vol
The volume metric cofactor matrix.
bool use_curvilinear_grid
Flag to use curvilinear grid.
double get_timestep(const std::shared_ptr< DGBase< dim, nspecies, double > > &dg, unsigned int poly_degree, const double delta_x) const
Computes the timestep from max eignevector.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
const MPI_Comm mpi_communicator
MPI communicator.
int output_solution_every_x_steps
Outputs the solution every x steps to .vtk file.
void matrix_vector_mult_1D(const std::vector< real > &input_vect, std::vector< real > &output_vect, const dealii::FullMatrix< double > &basis_x, const bool adding=false, const double factor=1.0)
Apply the matrix vector operation using the 1D operator in each direction.
Euler Taylor Green Vortex.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
Files for the baseline physics.
void build_1D_shape_functions_at_flux_nodes(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature, const dealii::Quadrature< 0 > &face_quadrature)
Constructs the volume, gradient, surface, and surface gradient operator.
unsigned int print_iteration_modulo
If ode_output==verbose, print every print_iteration_modulo iterations.
void divergence_two_pt_flux_Hadamard_product(const dealii::Tensor< 1, dim, dealii::FullMatrix< double >> &input_mat, std::vector< double > &output_vect, const std::vector< double > &weights, const dealii::FullMatrix< double > &basis, const double scaling=2.0)
Computes the divergence of the 2pt flux Hadamard products, then sums the rows.
Main parameter class that contains the various other sub-parameter classes.
std::string energy_file
Energy file.
std::array< double, 2 > compute_change_in_entropy(const std::shared_ptr< DGBase< dim, nspecies, double > > &dg, unsigned int poly_degree) const
Computes change in entropy in the norm.
std::vector< real > det_Jac_vol
The determinant of the metric Jacobian at volume cubature nodes.
void build_volume_metric_operators(const unsigned int n_quad_pts, const unsigned int n_metric_dofs, const std::array< std::vector< real >, dim > &mapping_support_points, mapping_shape_functions< dim, n_faces > &mapping_basis, const bool use_invariant_curl_form=false)
Builds the volume metric operators.
ODESolverParam ode_solver_param
Contains parameters for ODE solver.
double initial_time_step
Time step used in ODE solver.
double compute_kinetic_energy(const std::shared_ptr< DGBase< dim, nspecies, double > > &dg, unsigned int poly_degree) const
Computes kinetic energy.
const Parameters::AllParameters *const all_parameters
Pointer to all parameters.
static void set_initial_condition(std::shared_ptr< InitialConditionFunction< dim, nspecies, nstate, double > > initial_condition_function_input, std::shared_ptr< PHiLiP::DGBase< dim, nspecies, real > > dg_input, const Parameters::AllParameters *const parameters_input)
Applies the given initial condition function to the given dg object.
Base metric operators class that stores functions used in both the volume and on surface.
dealii::FullMatrix< double > oneD_vol_operator
Stores the one dimensional volume operator.
The mapping shape functions evaluated at the desired nodes (facet set included in volume grid nodes f...
int run_test() const override
Ensure that the kinetic energy is bounded.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
void inner_product_1D(const std::vector< real > &input_vect, const std::vector< double > &weight_vect, std::vector< real > &output_vect, const dealii::FullMatrix< double > &basis_x, const bool adding=false, const double factor=1.0)
Apply the inner product operation using the 1D operator in each direction.
void transform_physical_to_reference(const dealii::Tensor< 1, dim, real > &phys, const dealii::Tensor< 2, dim, real > &metric_cofactor, dealii::Tensor< 1, dim, real > &ref)
Given a physical tensor, return the reference tensor.
static std::shared_ptr< DGBase< dim, nspecies, real, MeshType > > create_discontinuous_galerkin(const Parameters::AllParameters *const parameters_input, const unsigned int degree, const unsigned int max_degree_input, const unsigned int grid_degree_input, const std::shared_ptr< Triangulation > triangulation_input)
Creates a derived object DG, but returns it as DGBase.
InviscidTaylorGreen(const Parameters::AllParameters *const parameters_input)
Constructor.
double compute_volume_term(const std::shared_ptr< DGBase< dim, nspecies, double > > &dg, unsigned int poly_degree) const
Computes the volume term kinetic energy production.
void build_1D_shape_functions_at_grid_nodes(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Constructs the volume operator and gradient operator.
static std::shared_ptr< PhysicsBase< dim, nspecies, nstate, real > > create_Physics(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ModelBase< dim, nspecies, nstate, real > > model_input=nullptr)
Factory to return the correct physics given input file.
dealii::FullMatrix< double > oneD_skew_symm_vol_oper
Skew-symmetric volume operator .
static std::shared_ptr< InitialConditionFunction< dim, nspecies, nstate, real > > create_InitialConditionFunction(Parameters::AllParameters const *const param)
Construct InitialConditionFunction object from global parameter file.
dealii::ConditionalOStream pcout
ConditionalOStream.
double compute_entropy(const std::shared_ptr< DGBase< dim, nspecies, double > > &dg, unsigned int poly_degree) const
Computes entropy in the norm.
static std::shared_ptr< ODESolverBase< dim, nspecies, real, MeshType > > create_ODESolver(std::shared_ptr< DGBase< dim, nspecies, real, MeshType > > dg_input)
Creates either implicit or explicit ODE solver based on parameter value(no POD basis given) ...
DGBase is independent of the number of state variables.
void build_1D_surface_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 0 > &quadrature)
Assembles the one dimensional operator.
void build_1D_gradient_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
Projection operator corresponding to basis functions onto M-norm (L2).
Local stiffness matrix without jacobian dependence.
Base class of all the tests.
int overintegration
Number of additional quadrature points to use.