1 #include <deal.II/base/tensor.h> 3 #include <deal.II/fe/fe_values.h> 5 #include <deal.II/dofs/dof_handler.h> 6 #include <deal.II/dofs/dof_tools.h> 8 #include <deal.II/dofs/dof_renumbering.h> 10 #include <deal.II/dofs/dof_accessor.h> 12 #include <deal.II/lac/vector.h> 14 #include "ADTypes.hpp" 16 #include <deal.II/fe/fe_dgq.h> 18 #include "strong_dg.hpp" 22 template <
int dim,
int nstate,
typename real,
typename MeshType>
25 const unsigned int degree,
26 const unsigned int max_degree_input,
27 const unsigned int grid_degree_input,
28 const std::shared_ptr<Triangulation> triangulation_input)
29 :
DGBaseState<dim,nstate,real,MeshType>::
DGBaseState(parameters_input, degree, max_degree_input, grid_degree_input, triangulation_input)
37 template <
int dim,
int nstate,
typename real,
typename MeshType>
39 typename dealii::DoFHandler<dim>::active_cell_iterator cell,
40 const dealii::types::global_dof_index current_cell_index,
41 const std::vector<dealii::types::global_dof_index> &cell_dofs_indices,
42 const std::vector<dealii::types::global_dof_index> &metric_dof_indices,
43 const unsigned int poly_degree,
44 const unsigned int grid_degree,
52 std::array<std::vector<real>,dim> &mapping_support_points,
53 dealii::hp::FEValues<dim,dim> &,
54 dealii::hp::FEValues<dim,dim> &,
55 const dealii::FESystem<dim,dim> &,
56 dealii::Vector<real> &local_rhs_int_cell,
57 std::vector<dealii::Tensor<1,dim,real>> &local_auxiliary_RHS,
58 const bool compute_auxiliary_right_hand_side,
59 const bool ,
const bool ,
const bool )
69 soln_basis, soln_basis,
70 flux_basis, flux_basis,
72 soln_basis_projection_oper_int, soln_basis_projection_oper_ext,
76 const dealii::FESystem<dim> &fe_metric = this->
high_order_grid->fe_system;
77 const unsigned int n_metric_dofs = fe_metric.dofs_per_cell;
78 const unsigned int n_grid_nodes = n_metric_dofs / dim;
81 for(
int idim=0; idim<dim; idim++){
82 mapping_support_points[idim].resize(n_grid_nodes);
84 const std::vector<unsigned int > &index_renumbering = dealii::FETools::hierarchic_to_lexicographic_numbering<dim>(grid_degree);
85 for (
unsigned int idof = 0; idof< n_metric_dofs; ++idof) {
86 const real val = (this->
high_order_grid->volume_nodes[metric_dof_indices[idof]]);
87 const unsigned int istate = fe_metric.system_to_component_index(idof).first;
88 const unsigned int ishape = fe_metric.system_to_component_index(idof).second;
89 const unsigned int igrid_node = index_renumbering[ishape];
90 mapping_support_points[istate][igrid_node] = val;
97 mapping_support_points,
101 if(compute_auxiliary_right_hand_side){
108 local_auxiliary_RHS);
118 flux_basis_stiffness,
119 soln_basis_projection_oper_int,
124 template <
int dim,
int nstate,
typename real,
typename MeshType>
126 typename dealii::DoFHandler<dim>::active_cell_iterator ,
127 const dealii::types::global_dof_index current_cell_index,
128 const unsigned int iface,
129 const unsigned int boundary_id,
131 const std::vector<dealii::types::global_dof_index> &cell_dofs_indices,
132 const std::vector<dealii::types::global_dof_index> &,
133 const unsigned int poly_degree,
142 std::array<std::vector<real>,dim> &mapping_support_points,
143 dealii::hp::FEFaceValues<dim,dim> &,
144 const dealii::FESystem<dim,dim> &,
145 dealii::Vector<real> &local_rhs_int_cell,
146 std::vector<dealii::Tensor<1,dim,real>> &local_auxiliary_RHS,
147 const bool compute_auxiliary_right_hand_side,
148 const bool ,
const bool ,
const bool )
151 const dealii::FESystem<dim> &fe_metric = this->
high_order_grid->fe_system;
152 const unsigned int n_metric_dofs = fe_metric.dofs_per_cell;
153 const unsigned int n_grid_nodes = n_metric_dofs / dim;
159 mapping_support_points,
163 if(compute_auxiliary_right_hand_side){
165 iface, current_cell_index, poly_degree,
166 boundary_id, cell_dofs_indices,
167 soln_basis, metric_oper,
168 local_auxiliary_RHS);
174 boundary_id, poly_degree, penalty,
178 soln_basis_projection_oper_int,
185 template <
int dim,
int nstate,
typename real,
typename MeshType>
187 typename dealii::DoFHandler<dim>::active_cell_iterator ,
188 typename dealii::DoFHandler<dim>::active_cell_iterator neighbor_cell,
189 const dealii::types::global_dof_index current_cell_index,
190 const dealii::types::global_dof_index neighbor_cell_index,
191 const unsigned int iface,
192 const unsigned int neighbor_iface,
194 const std::vector<dealii::types::global_dof_index> ¤t_dofs_indices,
195 const std::vector<dealii::types::global_dof_index> &neighbor_dofs_indices,
196 const std::vector<dealii::types::global_dof_index> &,
197 const std::vector<dealii::types::global_dof_index> &neighbor_metric_dofs_indices,
198 const unsigned int poly_degree_int,
199 const unsigned int poly_degree_ext,
201 const unsigned int grid_degree_ext,
212 std::array<std::vector<real>,dim> &mapping_support_points,
213 dealii::hp::FEFaceValues<dim,dim> &,
214 dealii::hp::FEFaceValues<dim,dim> &,
215 dealii::Vector<real> ¤t_cell_rhs,
216 dealii::Vector<real> &neighbor_cell_rhs,
217 std::vector<dealii::Tensor<1,dim,real>> ¤t_cell_rhs_aux,
218 dealii::LinearAlgebra::distributed::Vector<double> &rhs,
219 std::array<dealii::LinearAlgebra::distributed::Vector<double>,dim> &rhs_aux,
220 const bool compute_auxiliary_right_hand_side,
221 const bool ,
const bool ,
const bool )
224 const dealii::FESystem<dim> &fe_metric = this->
high_order_grid->fe_system;
225 const unsigned int n_metric_dofs = fe_metric.dofs_per_cell;
226 const unsigned int n_grid_nodes = n_metric_dofs / dim;
232 mapping_support_points,
241 soln_basis_int, soln_basis_ext,
242 flux_basis_int, flux_basis_ext,
243 flux_basis_stiffness,
244 soln_basis_projection_oper_int, soln_basis_projection_oper_ext,
248 if(!compute_auxiliary_right_hand_side){
252 std::array<std::vector<real>,dim> mapping_support_points_neigh;
253 for(
int idim=0; idim<dim; idim++){
254 mapping_support_points_neigh[idim].resize(n_grid_nodes);
256 const std::vector<unsigned int > &index_renumbering = dealii::FETools::hierarchic_to_lexicographic_numbering<dim>(grid_degree_ext);
257 for (
unsigned int idof = 0; idof< n_metric_dofs; ++idof) {
258 const real val = (this->
high_order_grid->volume_nodes[neighbor_metric_dofs_indices[idof]]);
259 const unsigned int istate = fe_metric.system_to_component_index(idof).first;
260 const unsigned int ishape = fe_metric.system_to_component_index(idof).second;
261 const unsigned int igrid_node = index_renumbering[ishape];
262 mapping_support_points_neigh[istate][igrid_node] = val;
267 mapping_support_points_neigh,
272 if(compute_auxiliary_right_hand_side){
273 const unsigned int n_dofs_neigh_cell = this->
fe_collection[neighbor_cell->active_fe_index()].n_dofs_per_cell();
274 std::vector<dealii::Tensor<1,dim,double>> neighbor_cell_rhs_aux (n_dofs_neigh_cell );
276 iface, neighbor_iface,
277 current_cell_index, neighbor_cell_index,
278 poly_degree_int, poly_degree_ext,
279 current_dofs_indices, neighbor_dofs_indices,
280 soln_basis_int, soln_basis_ext,
282 current_cell_rhs_aux, neighbor_cell_rhs_aux);
284 for (
unsigned int i=0; i<n_dofs_neigh_cell; ++i) {
285 for(
int idim=0; idim<dim; idim++){
286 rhs_aux[idim][neighbor_dofs_indices[i]] += neighbor_cell_rhs_aux[i][idim];
292 iface, neighbor_iface,
295 poly_degree_int, poly_degree_ext,
297 current_dofs_indices, neighbor_dofs_indices,
298 soln_basis_int, soln_basis_ext,
299 flux_basis_int, flux_basis_ext,
300 soln_basis_projection_oper_int, soln_basis_projection_oper_ext,
301 metric_oper_int, metric_oper_ext,
302 current_cell_rhs, neighbor_cell_rhs);
304 const unsigned int n_dofs_neigh_cell = this->
fe_collection[neighbor_cell->active_fe_index()].n_dofs_per_cell();
305 for (
unsigned int i=0; i<n_dofs_neigh_cell; ++i) {
306 rhs[neighbor_dofs_indices[i]] += neighbor_cell_rhs[i];
312 template <
int dim,
int nstate,
typename real,
typename MeshType>
314 typename dealii::DoFHandler<dim>::active_cell_iterator cell,
315 typename dealii::DoFHandler<dim>::active_cell_iterator neighbor_cell,
316 const dealii::types::global_dof_index current_cell_index,
317 const dealii::types::global_dof_index neighbor_cell_index,
318 const unsigned int iface,
319 const unsigned int neighbor_iface,
322 const std::vector<dealii::types::global_dof_index> ¤t_dofs_indices,
323 const std::vector<dealii::types::global_dof_index> &neighbor_dofs_indices,
324 const std::vector<dealii::types::global_dof_index> ¤t_metric_dofs_indices,
325 const std::vector<dealii::types::global_dof_index> &neighbor_metric_dofs_indices,
326 const unsigned int poly_degree_int,
327 const unsigned int poly_degree_ext,
328 const unsigned int grid_degree_int,
329 const unsigned int grid_degree_ext,
340 std::array<std::vector<real>,dim> &mapping_support_points,
341 dealii::hp::FEFaceValues<dim,dim> &fe_values_collection_face_int,
342 dealii::hp::FESubfaceValues<dim,dim> &,
343 dealii::Vector<real> ¤t_cell_rhs,
344 dealii::Vector<real> &neighbor_cell_rhs,
345 std::vector<dealii::Tensor<1,dim,real>> ¤t_cell_rhs_aux,
346 dealii::LinearAlgebra::distributed::Vector<double> &rhs,
347 std::array<dealii::LinearAlgebra::distributed::Vector<double>,dim> &rhs_aux,
348 const bool compute_auxiliary_right_hand_side,
349 const bool compute_dRdW,
const bool compute_dRdX,
const bool compute_d2R)
359 current_dofs_indices,
360 neighbor_dofs_indices,
361 current_metric_dofs_indices,
362 neighbor_metric_dofs_indices,
371 flux_basis_stiffness,
372 soln_basis_projection_oper_int,
373 soln_basis_projection_oper_ext,
377 mapping_support_points,
378 fe_values_collection_face_int,
379 fe_values_collection_face_int,
382 current_cell_rhs_aux,
385 compute_auxiliary_right_hand_side,
386 compute_dRdW, compute_dRdX, compute_d2R);
397 template <
int dim,
int nstate,
typename real,
typename MeshType>
404 if(pde_type == PDE_enum::burgers_viscous){
405 pcout <<
"DG Strong not yet verified for Burgers' viscous. Aborting..." << std::endl;
411 for(
int idim=0; idim<dim; idim++){
417 dealii::hp::MappingCollection<dim> mapping_collection(mapping);
437 soln_basis_int, soln_basis_ext,
438 flux_basis_int, flux_basis_ext,
439 flux_basis_stiffness,
440 soln_basis_projection_oper_int, soln_basis_projection_oper_ext,
444 auto metric_cell = this->
high_order_grid->dof_handler_grid.begin_active();
445 for (
auto soln_cell = this->
dof_handler.begin_active(); soln_cell != this->
dof_handler.end(); ++soln_cell, ++metric_cell) {
446 if (!soln_cell->is_locally_owned())
continue;
452 fe_values_collection_volume,
453 fe_values_collection_face_int,
454 fe_values_collection_face_ext,
455 fe_values_collection_subface,
456 fe_values_collection_volume_lagrange,
461 flux_basis_stiffness,
462 soln_basis_projection_oper_int,
463 soln_basis_projection_oper_ext,
470 for(
int idim=0; idim<dim; idim++){
487 pcout <<
"ERROR: " <<
"auxiliary currently only works for explicit time advancement. Aborting..." << std::endl;
500 template <
int dim,
int nstate,
typename real,
typename MeshType>
502 const std::vector<dealii::types::global_dof_index> ¤t_dofs_indices,
503 const unsigned int poly_degree,
507 std::vector<dealii::Tensor<1,dim,real>> &local_auxiliary_RHS)
511 const unsigned int n_dofs_cell = this->
fe_collection[poly_degree].dofs_per_cell;
512 const unsigned int n_shape_fns = n_dofs_cell /
nstate;
520 std::array<std::vector<real>,
nstate> soln_coeff;
521 for (
unsigned int idof = 0; idof < n_dofs_cell; ++idof) {
522 const unsigned int istate = this->
fe_collection[poly_degree].system_to_component_index(idof).first;
523 const unsigned int ishape = this->
fe_collection[poly_degree].system_to_component_index(idof).second;
525 soln_coeff[istate].resize(n_shape_fns);
531 for(
int istate=0; istate<
nstate; istate++){
532 std::vector<real> soln_at_q(n_quad_pts);
541 dealii::Tensor<1,dim,std::vector<real>> ref_gradient_basis_fns_times_soln;
542 for(
int idim=0; idim<dim; idim++){
543 ref_gradient_basis_fns_times_soln[idim].resize(n_quad_pts);
550 for(
int idim=0; idim<dim; idim++){
551 std::vector<real> phys_gradient_u(n_quad_pts);
552 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
553 for(
int jdim=0; jdim<dim; jdim++){
556 * ref_gradient_basis_fns_times_soln[jdim][iquad];
560 std::vector<real> rhs(n_shape_fns);
567 for(
unsigned int ishape=0; ishape<n_shape_fns; ishape++){
568 local_auxiliary_RHS[istate*n_shape_fns + ishape][idim] += rhs[ishape];
574 template <
int dim,
int nstate,
typename real,
typename MeshType>
576 const unsigned int iface,
577 const dealii::types::global_dof_index current_cell_index,
578 const unsigned int poly_degree,
579 const unsigned int boundary_id,
580 const std::vector<dealii::types::global_dof_index> &dofs_indices,
583 std::vector<dealii::Tensor<1,dim,real>> &local_auxiliary_RHS)
585 (void) current_cell_index;
590 const unsigned int n_shape_fns = n_dofs /
nstate;
591 AssertDimension (n_dofs, dofs_indices.size());
594 std::array<std::vector<real>,
nstate> soln_coeff;
595 for (
unsigned int idof = 0; idof <
n_dofs; ++idof) {
596 const unsigned int istate = this->
fe_collection[poly_degree].system_to_component_index(idof).first;
597 const unsigned int ishape = this->
fe_collection[poly_degree].system_to_component_index(idof).second;
600 soln_coeff[istate].resize(n_shape_fns);
606 std::array<std::vector<real>,
nstate> soln_at_surf_q;
607 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> ref_grad_soln_at_vol_q;
608 for(
int istate=0; istate<
nstate; ++istate){
610 soln_at_surf_q[istate].resize(n_face_quad_pts);
616 for(
int idim=0; idim<dim; idim++){
617 ref_grad_soln_at_vol_q[istate][idim].resize(n_quad_pts_vol);
625 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> phys_grad_soln_at_surf_q;
626 for(
int istate=0; istate<
nstate; istate++){
628 for(
int idim=0; idim<dim; idim++){
629 std::vector<real> phys_gradient_u(n_quad_pts_vol);
630 for(
unsigned int iquad=0; iquad<n_quad_pts_vol; iquad++){
631 for(
int jdim=0; jdim<dim; jdim++){
634 * ref_grad_soln_at_vol_q[istate][jdim][iquad];
636 phys_gradient_u[iquad] /= metric_oper.
det_Jac_vol[iquad];
638 phys_grad_soln_at_surf_q[istate][idim].resize(n_face_quad_pts);
648 const dealii::Tensor<1,dim,double> unit_ref_normal_int = dealii::GeometryInfo<dim>::unit_normal_vector[iface];
649 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> surf_num_flux_minus_surf_soln_dot_normal;
650 for(
unsigned int iquad=0; iquad<n_face_quad_pts; iquad++){
656 dealii::Tensor<2,dim,real> metric_cofactor_surf;
657 for(
int idim=0; idim<dim; idim++){
658 for(
int jdim=0; jdim<dim; jdim++){
662 std::array<real,nstate> soln_state;
663 std::array<dealii::Tensor<1,dim,real>,nstate> phys_grad_soln_state;
664 for(
int istate=0; istate<
nstate; istate++){
665 soln_state[istate] = soln_at_surf_q[istate][iquad];
666 for(
int idim=0; idim<dim; idim++){
667 phys_grad_soln_state[istate][idim] = phys_grad_soln_at_surf_q[istate][idim][iquad];
671 dealii::Tensor<1,dim,real> unit_phys_normal_int;
673 metric_cofactor_surf,
674 unit_phys_normal_int);
675 const double face_Jac_norm_scaled = unit_phys_normal_int.norm();
676 unit_phys_normal_int /= face_Jac_norm_scaled;
678 std::array<real,nstate> soln_boundary;
679 std::array<dealii::Tensor<1,dim,real>,nstate> grad_soln_boundary;
680 dealii::Point<dim,real> surf_flux_node;
681 for(
int idim=0; idim<dim; idim++){
682 surf_flux_node[idim] = metric_oper.
flux_nodes_surf[iface][idim][iquad];
684 this->
pde_physics_double->boundary_face_values (boundary_id, surf_flux_node, unit_phys_normal_int, soln_state, phys_grad_soln_state, soln_boundary, grad_soln_boundary);
686 std::array<real,nstate> diss_soln_num_flux;
687 diss_soln_num_flux = this->
diss_num_flux_double->evaluate_solution_flux(soln_state, soln_boundary, unit_phys_normal_int);
689 for(
int istate=0; istate<
nstate; istate++){
690 for(
int idim=0; idim<dim; idim++){
693 surf_num_flux_minus_surf_soln_dot_normal[istate][idim].resize(n_face_quad_pts);
696 surf_num_flux_minus_surf_soln_dot_normal[istate][idim][iquad]
697 = (diss_soln_num_flux[istate] - soln_at_surf_q[istate][iquad]) * unit_phys_normal_int[idim] * face_Jac_norm_scaled;
703 for(
int istate=0; istate<
nstate; istate++){
704 for(
int idim=0; idim<dim; idim++){
705 std::vector<real> rhs(n_shape_fns);
708 surf_num_flux_minus_surf_soln_dot_normal[istate][idim],
709 surf_quad_weights, rhs,
713 for(
unsigned int ishape=0; ishape<n_shape_fns; ishape++){
714 local_auxiliary_RHS[istate*n_shape_fns + ishape][idim] += rhs[ishape];
720 template <
int dim,
int nstate,
typename real,
typename MeshType>
722 const unsigned int iface,
const unsigned int neighbor_iface,
723 const dealii::types::global_dof_index current_cell_index,
724 const dealii::types::global_dof_index neighbor_cell_index,
725 const unsigned int poly_degree_int,
726 const unsigned int poly_degree_ext,
727 const std::vector<dealii::types::global_dof_index> &dof_indices_int,
728 const std::vector<dealii::types::global_dof_index> &dof_indices_ext,
732 std::vector<dealii::Tensor<1,dim,real>> &local_auxiliary_RHS_int,
733 std::vector<dealii::Tensor<1,dim,real>> &local_auxiliary_RHS_ext)
735 (void) current_cell_index;
736 (void) neighbor_cell_index;
740 const unsigned int n_dofs_int = this->
fe_collection[poly_degree_int].dofs_per_cell;
741 const unsigned int n_dofs_ext = this->
fe_collection[poly_degree_ext].dofs_per_cell;
743 const unsigned int n_shape_fns_int = n_dofs_int /
nstate;
744 const unsigned int n_shape_fns_ext = n_dofs_ext /
nstate;
746 AssertDimension (n_dofs_int, dof_indices_int.size());
747 AssertDimension (n_dofs_ext, dof_indices_ext.size());
750 std::array<std::vector<real>,
nstate> soln_coeff_int;
751 for (
unsigned int idof = 0; idof < n_dofs_int; ++idof) {
752 const unsigned int istate = this->
fe_collection[poly_degree_int].system_to_component_index(idof).first;
753 const unsigned int ishape = this->
fe_collection[poly_degree_int].system_to_component_index(idof).second;
755 if(ishape == 0) soln_coeff_int[istate].resize(n_shape_fns_int);
762 std::array<std::vector<real>,
nstate> soln_coeff_ext;
763 for (
unsigned int idof = 0; idof < n_dofs_ext; ++idof) {
764 const unsigned int istate = this->
fe_collection[poly_degree_ext].system_to_component_index(idof).first;
765 const unsigned int ishape = this->
fe_collection[poly_degree_ext].system_to_component_index(idof).second;
767 if(ishape == 0) soln_coeff_ext[istate].resize(n_shape_fns_ext);
774 std::array<std::vector<real>,
nstate> soln_at_surf_q_int;
775 std::array<std::vector<real>,
nstate> soln_at_surf_q_ext;
776 for(
int istate=0; istate<
nstate; ++istate){
778 soln_at_surf_q_int[istate].resize(n_face_quad_pts);
779 soln_at_surf_q_ext[istate].resize(n_face_quad_pts);
782 soln_coeff_int[istate], soln_at_surf_q_int[istate],
786 soln_coeff_ext[istate], soln_at_surf_q_ext[istate],
793 const dealii::Tensor<1,dim,double> unit_ref_normal_int = dealii::GeometryInfo<dim>::unit_normal_vector[iface];
794 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> surf_num_flux_minus_surf_soln_int_dot_normal;
795 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> surf_num_flux_minus_surf_soln_ext_dot_normal;
796 for (
unsigned int iquad=0; iquad<n_face_quad_pts; ++iquad) {
802 dealii::Tensor<2,dim,real> metric_cofactor_surf;
803 for(
int idim=0; idim<dim; idim++){
804 for(
int jdim=0; jdim<dim; jdim++){
809 dealii::Tensor<1,dim,real> unit_phys_normal_int;
811 metric_cofactor_surf,
812 unit_phys_normal_int);
813 const double face_Jac_norm_scaled = unit_phys_normal_int.norm();
814 unit_phys_normal_int /= face_Jac_norm_scaled;
816 std::array<real,nstate> diss_soln_num_flux;
817 std::array<real,nstate> soln_state_int;
818 std::array<real,nstate> soln_state_ext;
819 for(
int istate=0; istate<
nstate; istate++){
820 soln_state_int[istate] = soln_at_surf_q_int[istate][iquad];
821 soln_state_ext[istate] = soln_at_surf_q_ext[istate][iquad];
823 diss_soln_num_flux = this->
diss_num_flux_double->evaluate_solution_flux(soln_state_int, soln_state_ext, unit_phys_normal_int);
825 for(
int istate=0; istate<
nstate; istate++){
826 for(
int idim=0; idim<dim; idim++){
829 surf_num_flux_minus_surf_soln_int_dot_normal[istate][idim].resize(n_face_quad_pts);
830 surf_num_flux_minus_surf_soln_ext_dot_normal[istate][idim].resize(n_face_quad_pts);
833 surf_num_flux_minus_surf_soln_int_dot_normal[istate][idim][iquad]
834 = (diss_soln_num_flux[istate] - soln_at_surf_q_int[istate][iquad]) * unit_phys_normal_int[idim] * face_Jac_norm_scaled;
836 surf_num_flux_minus_surf_soln_ext_dot_normal[istate][idim][iquad]
837 = (diss_soln_num_flux[istate] - soln_at_surf_q_ext[istate][iquad]) * (- unit_phys_normal_int[idim]) * face_Jac_norm_scaled;
843 for(
int istate=0; istate<
nstate; istate++){
844 for(
int idim=0; idim<dim; idim++){
845 std::vector<real> rhs_int(n_shape_fns_int);
848 surf_num_flux_minus_surf_soln_int_dot_normal[istate][idim],
849 surf_quad_weights, rhs_int,
854 for(
unsigned int ishape=0; ishape<n_shape_fns_int; ishape++){
855 local_auxiliary_RHS_int[istate*n_shape_fns_int + ishape][idim] += rhs_int[ishape];
857 std::vector<real> rhs_ext(n_shape_fns_ext);
860 surf_num_flux_minus_surf_soln_ext_dot_normal[istate][idim],
861 surf_quad_weights, rhs_ext,
866 for(
unsigned int ishape=0; ishape<n_shape_fns_ext; ishape++){
867 local_auxiliary_RHS_ext[istate*n_shape_fns_ext + ishape][idim] += rhs_ext[ishape];
878 template <
int dim,
int nstate,
typename real,
typename MeshType>
880 typename dealii::DoFHandler<dim>::active_cell_iterator cell,
881 const dealii::types::global_dof_index current_cell_index,
882 const std::vector<dealii::types::global_dof_index> &cell_dofs_indices,
883 const unsigned int poly_degree,
889 dealii::Vector<real> &local_rhs_int_cell)
891 (void) current_cell_index;
894 const unsigned int n_dofs_cell = this->
fe_collection[poly_degree].dofs_per_cell;
895 const unsigned int n_shape_fns = n_dofs_cell /
nstate;
897 assert(n_quad_pts == pow(n_quad_pts_1D, dim));
901 AssertDimension (n_dofs_cell, cell_dofs_indices.size());
907 std::array<std::vector<real>,
nstate> soln_coeff;
908 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> aux_soln_coeff;
909 for (
unsigned int idof = 0; idof < n_dofs_cell; ++idof) {
910 const unsigned int istate = this->
fe_collection[poly_degree].system_to_component_index(idof).first;
911 const unsigned int ishape = this->
fe_collection[poly_degree].system_to_component_index(idof).second;
913 soln_coeff[istate].resize(n_shape_fns);
915 for(
int idim=0; idim<dim; idim++){
917 aux_soln_coeff[istate][idim].resize(n_shape_fns);
922 aux_soln_coeff[istate][idim][ishape] = 0.0;
926 std::array<std::vector<real>,
nstate> soln_at_q;
927 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> aux_soln_at_q;
928 std::vector<std::array<real,nstate>> soln_at_q_for_max_CFL(n_quad_pts);
931 for(
int istate=0; istate<
nstate; istate++){
932 soln_at_q[istate].resize(n_quad_pts);
935 for(
int idim=0; idim<dim; idim++){
936 aux_soln_at_q[istate][idim].resize(n_quad_pts);
940 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
941 soln_at_q_for_max_CFL[iquad][istate] = soln_at_q[istate][iquad];
948 real max_artificial_diss = 0.0;
950 typename dealii::DoFHandler<dim>::active_cell_iterator artificial_dissipation_cell(
952 std::vector<dealii::types::global_dof_index> dof_indices_artificial_dissipation(n_dofs_arti_diss);
953 artificial_dissipation_cell->get_dof_indices (dof_indices_artificial_dissipation);
954 for (
unsigned int iquad=0; iquad<n_quad_pts; ++iquad) {
955 real artificial_diss_coeff_at_q = 0.0;
958 for (
unsigned int idof=0; idof<n_dofs_arti_diss; ++idof) {
959 const unsigned int index = dof_indices_artificial_dissipation[idof];
962 max_artificial_diss = std::max(artificial_diss_coeff_at_q, max_artificial_diss);
966 real cell_volume_estimate = 0.0;
967 for (
unsigned int iquad=0; iquad<n_quad_pts; ++iquad) {
968 cell_volume_estimate += metric_oper.
det_Jac_vol[iquad] * vol_quad_weights[iquad];
971 const real diameter = cell->diameter();
972 const real cell_diameter = cell_volume / std::pow(diameter,dim-1);
973 const real cell_radius = 0.5 * cell_diameter;
974 this->cell_volume[current_cell_index] =
cell_volume;
975 this->
max_dt_cell[current_cell_index] = this->
evaluate_CFL ( soln_at_q_for_max_CFL, max_artificial_diss, cell_radius, poly_degree);
978 std::array<std::vector<real>,nstate> entropy_var_at_q;
979 std::array<std::vector<real>,nstate> projected_entropy_var_at_q;
981 for(
int istate=0; istate<
nstate; istate++){
982 entropy_var_at_q[istate].resize(n_quad_pts);
983 projected_entropy_var_at_q[istate].resize(n_quad_pts);
985 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
986 std::array<real,nstate> soln_state;
987 for(
int istate=0; istate<
nstate; istate++){
988 soln_state[istate] = soln_at_q[istate][iquad];
990 std::array<real,nstate> entropy_var;
992 for(
int istate=0; istate<
nstate; istate++){
993 entropy_var_at_q[istate][iquad] = entropy_var[istate];
996 for(
int istate=0; istate<
nstate; istate++){
997 std::vector<real> entropy_var_coeff(n_shape_fns);;
1002 projected_entropy_var_at_q[istate],
1012 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> conv_ref_flux_at_q;
1013 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> diffusive_ref_flux_at_q;
1014 std::array<std::vector<real>,nstate> source_at_q;
1015 std::array<std::vector<real>,nstate> physical_source_at_q;
1018 std::array<std::array<dealii::FullMatrix<real>,dim>,nstate> conv_ref_2pt_flux_at_q;
1020 std::vector<std::array<unsigned int,dim>> Hadamard_rows_sparsity(n_quad_pts * n_quad_pts_1D);
1021 std::vector<std::array<unsigned int,dim>> Hadamard_columns_sparsity(n_quad_pts * n_quad_pts_1D);
1024 for(
int istate=0; istate<
nstate; istate++){
1025 for(
int idim=0; idim<dim; idim++){
1026 conv_ref_2pt_flux_at_q[istate][idim].reinit(n_quad_pts, n_quad_pts_1D);
1035 for (
unsigned int iquad=0; iquad<n_quad_pts; ++iquad) {
1037 std::array<real,nstate> soln_state;
1038 std::array<dealii::Tensor<1,dim,real>,nstate> aux_soln_state;
1039 for(
int istate=0; istate<
nstate; istate++){
1040 soln_state[istate] = soln_at_q[istate][iquad];
1041 for(
int idim=0; idim<dim; idim++){
1042 aux_soln_state[istate][idim] = aux_soln_at_q[istate][idim][iquad];
1049 dealii::Tensor<2,dim,real> metric_cofactor;
1050 for(
int idim=0; idim<dim; idim++){
1051 for(
int jdim=0; jdim<dim; jdim++){
1059 std::array<dealii::Tensor<1,dim,real>,nstate> conv_phys_flux;
1062 std::array<real,nstate> entropy_var;
1063 for(
int istate=0; istate<
nstate; istate++){
1064 entropy_var[istate] = projected_entropy_var_at_q[istate][iquad];
1066 soln_state = this->
pde_physics_double->compute_conservative_variables_from_entropy_variables (entropy_var);
1069 for(
unsigned int row_index = iquad * n_quad_pts_1D, column_index = 0;
1071 column_index < n_quad_pts_1D;
1072 row_index++, column_index++){
1074 if(Hadamard_rows_sparsity[row_index][0] != iquad){
1075 pcout<<
"The volume Hadamard rows sparsity pattern does not match. Aborting..."<<std::endl;
1083 for(
int ref_dim=0; ref_dim<dim; ref_dim++){
1084 const unsigned int flux_quad = Hadamard_columns_sparsity[row_index][ref_dim];
1086 dealii::Tensor<2,dim,real> metric_cofactor_flux_basis;
1087 for(
int idim=0; idim<dim; idim++){
1088 for(
int jdim=0; jdim<dim; jdim++){
1089 metric_cofactor_flux_basis[idim][jdim] = metric_oper.
metric_cofactor_vol[idim][jdim][flux_quad];
1092 std::array<real,nstate> soln_state_flux_basis;
1093 std::array<real,nstate> entropy_var_flux_basis;
1094 for(
int istate=0; istate<
nstate; istate++){
1095 entropy_var_flux_basis[istate] = projected_entropy_var_at_q[istate][flux_quad];
1097 soln_state_flux_basis = this->
pde_physics_double->compute_conservative_variables_from_entropy_variables (entropy_var_flux_basis);
1100 std::array<dealii::Tensor<1,dim,real>,nstate> conv_phys_flux_2pt;
1101 conv_phys_flux_2pt = this->
pde_physics_double->convective_numerical_split_flux(soln_state, soln_state_flux_basis);
1103 for(
int istate=0; istate<
nstate; istate++){
1104 dealii::Tensor<1,dim,real> conv_ref_flux_2pt;
1107 conv_phys_flux_2pt[istate],
1108 0.5*(metric_cofactor + metric_cofactor_flux_basis),
1111 conv_ref_2pt_flux_at_q[istate][ref_dim][iquad][column_index] = conv_ref_flux_2pt[ref_dim];
1122 std::array<dealii::Tensor<1,dim,real>,nstate> diffusive_phys_flux;
1124 diffusive_phys_flux = this->
pde_physics_double->dissipative_flux(soln_state, aux_soln_state, current_cell_index);
1127 std::array<real,nstate> manufactured_source;
1129 dealii::Point<dim,real> vol_flux_node;
1130 for(
int idim=0; idim<dim; idim++){
1138 std::array<real,nstate> physical_source;
1140 dealii::Point<dim,real> vol_flux_node;
1141 for(
int idim=0; idim<dim; idim++){
1145 physical_source = this->
pde_physics_double->physical_source_term (vol_flux_node, soln_state, aux_soln_state, current_cell_index);
1149 for(
int istate=0; istate<
nstate; istate++){
1150 dealii::Tensor<1,dim,real> conv_ref_flux;
1151 dealii::Tensor<1,dim,real> diffusive_ref_flux;
1163 conv_phys_flux[istate],
1169 diffusive_phys_flux[istate],
1171 diffusive_ref_flux);
1176 for(
int idim=0; idim<dim; idim++){
1179 conv_ref_flux_at_q[istate][idim].resize(n_quad_pts);
1180 diffusive_ref_flux_at_q[istate][idim].resize(n_quad_pts);
1187 conv_ref_flux_at_q[istate][idim][iquad] = conv_ref_flux[idim];
1190 diffusive_ref_flux_at_q[istate][idim][iquad] = diffusive_ref_flux[idim];
1194 source_at_q[istate].resize(n_quad_pts);
1196 source_at_q[istate][iquad] = manufactured_source[istate];
1200 physical_source_at_q[istate].resize(n_quad_pts);
1202 physical_source_at_q[istate][iquad] = physical_source[istate];
1208 std::array<dealii::FullMatrix<real>,dim> flux_basis_stiffness_skew_symm_oper_sparse;
1210 for(
int idim=0; idim<dim; idim++){
1211 flux_basis_stiffness_skew_symm_oper_sparse[idim].reinit(n_quad_pts, n_quad_pts_1D);
1214 Hadamard_rows_sparsity, Hadamard_columns_sparsity,
1216 oneD_vol_quad_weights,
1217 flux_basis_stiffness_skew_symm_oper_sparse);
1223 for(
int istate=0; istate<
nstate; istate++){
1226 std::vector<real> conv_flux_divergence(n_quad_pts);
1227 std::vector<real> diffusive_flux_divergence(n_quad_pts);
1235 for(
int ref_dim=0; ref_dim<dim; ref_dim++){
1236 dealii::FullMatrix<real> divergence_ref_flux_Hadamard_product(n_quad_pts, n_quad_pts_1D);
1237 flux_basis.
Hadamard_product(flux_basis_stiffness_skew_symm_oper_sparse[ref_dim], conv_ref_2pt_flux_at_q[istate][ref_dim], divergence_ref_flux_Hadamard_product);
1239 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
1241 conv_flux_divergence[iquad] = 0.0;
1243 for(
unsigned int iquad_1D=0; iquad_1D<n_quad_pts_1D; iquad_1D++){
1244 conv_flux_divergence[iquad] += divergence_ref_flux_Hadamard_product[iquad][iquad_1D];
1270 std::vector<real> rhs(n_shape_fns);
1274 std::vector<real> ones(n_quad_pts, 1.0);
1288 std::vector<real> JxW(n_quad_pts);
1289 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
1290 JxW[iquad] = vol_quad_weights[iquad] * metric_oper.
det_Jac_vol[iquad];
1297 std::vector<real> JxW(n_quad_pts);
1298 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
1299 JxW[iquad] = vol_quad_weights[iquad] * metric_oper.
det_Jac_vol[iquad];
1304 for(
unsigned int ishape=0; ishape<n_shape_fns; ishape++){
1305 local_rhs_int_cell(istate*n_shape_fns + ishape) += rhs[ishape];
1311 template <
int dim,
int nstate,
typename real,
typename MeshType>
1313 const unsigned int iface,
1314 const dealii::types::global_dof_index current_cell_index,
1315 const unsigned int boundary_id,
1316 const unsigned int poly_degree,
1318 const std::vector<dealii::types::global_dof_index> &dof_indices,
1323 dealii::Vector<real> &local_rhs_cell)
1325 (void) current_cell_index;
1331 const unsigned int n_shape_fns = n_dofs /
nstate;
1334 AssertDimension (n_dofs, dof_indices.size());
1340 std::array<std::vector<real>,
nstate> soln_coeff;
1341 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> aux_soln_coeff;
1342 for (
unsigned int idof = 0; idof <
n_dofs; ++idof) {
1343 const unsigned int istate = this->
fe_collection[poly_degree].system_to_component_index(idof).first;
1344 const unsigned int ishape = this->
fe_collection[poly_degree].system_to_component_index(idof).second;
1347 soln_coeff[istate].resize(n_shape_fns);
1351 for(
int idim=0; idim<dim; idim++){
1354 aux_soln_coeff[istate][idim].resize(n_shape_fns);
1361 aux_soln_coeff[istate][idim][ishape] = 0.0;
1366 std::array<std::vector<real>,
nstate> soln_at_vol_q;
1367 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> aux_soln_at_vol_q;
1369 std::array<std::vector<real>,
nstate> soln_at_surf_q;
1370 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> aux_soln_at_surf_q;
1371 for(
int istate=0; istate<
nstate; ++istate){
1373 soln_at_vol_q[istate].resize(n_quad_pts_vol);
1379 soln_at_surf_q[istate].resize(n_face_quad_pts);
1382 soln_coeff[istate], soln_at_surf_q[istate],
1386 for(
int idim=0; idim<dim; idim++){
1388 aux_soln_at_vol_q[istate][idim].resize(n_quad_pts_vol);
1394 aux_soln_at_surf_q[istate][idim].resize(n_face_quad_pts);
1397 aux_soln_coeff[istate][idim], aux_soln_at_surf_q[istate][idim],
1407 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> conv_ref_flux_at_vol_q;
1408 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> diffusive_ref_flux_at_vol_q;
1409 for (
unsigned int iquad=0; iquad<n_quad_pts_vol; ++iquad) {
1413 dealii::Tensor<2,dim,real> metric_cofactor_vol;
1414 for(
int idim=0; idim<dim; idim++){
1415 for(
int jdim=0; jdim<dim; jdim++){
1419 std::array<real,nstate> soln_state;
1420 std::array<dealii::Tensor<1,dim,real>,nstate> aux_soln_state;
1421 for(
int istate=0; istate<
nstate; istate++){
1422 soln_state[istate] = soln_at_vol_q[istate][iquad];
1423 for(
int idim=0; idim<dim; idim++){
1424 aux_soln_state[istate][idim] = aux_soln_at_vol_q[istate][idim][iquad];
1429 std::array<dealii::Tensor<1,dim,real>,nstate> conv_phys_flux;
1435 std::array<dealii::Tensor<1,dim,real>,nstate> diffusive_phys_flux;
1436 diffusive_phys_flux = this->
pde_physics_double->dissipative_flux(soln_state, aux_soln_state, current_cell_index);
1439 for(
int istate=0; istate<
nstate; istate++){
1440 dealii::Tensor<1,dim,real> conv_ref_flux;
1441 dealii::Tensor<1,dim,real> diffusive_ref_flux;
1445 conv_phys_flux[istate],
1446 metric_cofactor_vol,
1451 diffusive_phys_flux[istate],
1452 metric_cofactor_vol,
1453 diffusive_ref_flux);
1458 for(
int idim=0; idim<dim; idim++){
1461 conv_ref_flux_at_vol_q[istate][idim].resize(n_quad_pts_vol);
1462 diffusive_ref_flux_at_vol_q[istate][idim].resize(n_quad_pts_vol);
1466 conv_ref_flux_at_vol_q[istate][idim][iquad] = conv_ref_flux[idim];
1469 diffusive_ref_flux_at_vol_q[istate][idim][iquad] = diffusive_ref_flux[idim];
1479 const dealii::Tensor<1,dim,double> unit_ref_normal_int = dealii::GeometryInfo<dim>::unit_normal_vector[iface];
1480 const int dim_not_zero = iface / 2;
1482 std::array<std::vector<real>,nstate> conv_int_vol_ref_flux_interp_to_face_dot_ref_normal;
1483 std::array<std::vector<real>,nstate> diffusive_int_vol_ref_flux_interp_to_face_dot_ref_normal;
1484 for(
int istate=0; istate<
nstate; istate++){
1486 conv_int_vol_ref_flux_interp_to_face_dot_ref_normal[istate].resize(n_face_quad_pts);
1487 diffusive_int_vol_ref_flux_interp_to_face_dot_ref_normal[istate].resize(n_face_quad_pts);
1495 conv_ref_flux_at_vol_q[istate][dim_not_zero],
1496 conv_int_vol_ref_flux_interp_to_face_dot_ref_normal[istate],
1499 false, unit_ref_normal_int[dim_not_zero]);
1504 diffusive_ref_flux_at_vol_q[istate][dim_not_zero],
1505 diffusive_int_vol_ref_flux_interp_to_face_dot_ref_normal[istate],
1508 false, unit_ref_normal_int[dim_not_zero]);
1518 std::array<std::vector<real>,nstate> entropy_var_vol;
1519 for(
unsigned int iquad=0; iquad<n_quad_pts_vol; iquad++){
1520 std::array<real,nstate> soln_state;
1521 for(
int istate=0; istate<
nstate; istate++){
1522 soln_state[istate] = soln_at_vol_q[istate][iquad];
1524 std::array<real,nstate> entropy_var;
1526 for(
int istate=0; istate<
nstate; istate++){
1528 entropy_var_vol[istate].resize(n_quad_pts_vol);
1530 entropy_var_vol[istate][iquad] = entropy_var[istate];
1535 std::array<std::vector<real>,nstate> projected_entropy_var_vol;
1536 std::array<std::vector<real>,nstate> projected_entropy_var_surf;
1537 for(
int istate=0; istate<
nstate; istate++){
1539 projected_entropy_var_vol[istate].resize(n_quad_pts_vol);
1540 projected_entropy_var_surf[istate].resize(n_face_quad_pts);
1543 std::vector<real> entropy_var_coeff(n_shape_fns);
1548 projected_entropy_var_vol[istate],
1552 projected_entropy_var_surf[istate],
1558 const unsigned int row_size = n_face_quad_pts * n_quad_pts_1D;
1559 const unsigned int col_size = n_face_quad_pts * n_quad_pts_1D;
1560 std::vector<unsigned int> Hadamard_rows_sparsity(row_size);
1561 std::vector<unsigned int> Hadamard_columns_sparsity(col_size);
1566 std::array<std::vector<real>,nstate> surf_vol_ref_2pt_flux_interp_surf;
1567 std::array<std::vector<real>,nstate> surf_vol_ref_2pt_flux_interp_vol;
1570 std::array<dealii::FullMatrix<real>,nstate> surface_ref_2pt_flux;
1572 for(
int istate=0; istate<
nstate; istate++){
1573 surface_ref_2pt_flux[istate].reinit(n_face_quad_pts, n_quad_pts_1D);
1575 for(
unsigned int iquad_face=0; iquad_face<n_face_quad_pts; iquad_face++){
1576 dealii::Tensor<2,dim,real> metric_cofactor_surf;
1577 for(
int idim=0; idim<dim; idim++){
1578 for(
int jdim=0; jdim<dim; jdim++){
1584 std::array<real,nstate> entropy_var_face;
1585 for(
int istate=0; istate<
nstate; istate++){
1586 entropy_var_face[istate] = projected_entropy_var_surf[istate][iquad_face];
1588 std::array<real,nstate> soln_state_face;
1589 soln_state_face= this->
pde_physics_double->compute_conservative_variables_from_entropy_variables (entropy_var_face);
1592 for(
unsigned int row_index = iquad_face * n_quad_pts_1D, column_index = 0;
1593 column_index < n_quad_pts_1D;
1594 row_index++, column_index++){
1596 if(Hadamard_rows_sparsity[row_index] != iquad_face){
1597 pcout<<
"The boundary Hadamard rows sparsity pattern does not match."<<std::endl;
1601 const unsigned int iquad_vol = Hadamard_columns_sparsity[row_index];
1605 dealii::Tensor<2,dim,real> metric_cofactor_vol;
1606 for(
int idim=0; idim<dim; idim++){
1607 for(
int jdim=0; jdim<dim; jdim++){
1611 std::array<real,nstate> entropy_var;
1612 for(
int istate=0; istate<
nstate; istate++){
1613 entropy_var[istate] = projected_entropy_var_vol[istate][iquad_vol];
1615 std::array<real,nstate> soln_state;
1616 soln_state = this->
pde_physics_double->compute_conservative_variables_from_entropy_variables (entropy_var);
1622 std::array<dealii::Tensor<1,dim,real>,nstate> conv_phys_flux_2pt;
1623 conv_phys_flux_2pt = this->
pde_physics_double->convective_numerical_split_flux(soln_state, soln_state_face);
1624 for(
int istate=0; istate<
nstate; istate++){
1625 dealii::Tensor<1,dim,real> conv_ref_flux_2pt;
1628 conv_phys_flux_2pt[istate],
1629 0.5*(metric_cofactor_surf + metric_cofactor_vol),
1632 surface_ref_2pt_flux[istate][iquad_face][column_index] = conv_ref_flux_2pt[dim_not_zero];
1639 const int iface_1D = iface % 2;
1641 dealii::FullMatrix<real> surf_oper_sparse(n_face_quad_pts, n_quad_pts_1D);
1643 Hadamard_rows_sparsity, Hadamard_columns_sparsity,
1645 oneD_quad_weights_vol,
1651 for(
int istate=0; istate<
nstate; istate++){
1653 dealii::FullMatrix<real> surface_ref_2pt_flux_int_Hadamard_with_surf_oper(n_face_quad_pts, n_quad_pts_1D);
1655 surface_ref_2pt_flux[istate],
1656 surface_ref_2pt_flux_int_Hadamard_with_surf_oper);
1658 surf_vol_ref_2pt_flux_interp_surf[istate].resize(n_face_quad_pts);
1659 surf_vol_ref_2pt_flux_interp_vol[istate].resize(n_quad_pts_vol);
1661 for(
unsigned int iface_quad=0; iface_quad<n_face_quad_pts; iface_quad++){
1662 for(
unsigned int iquad_int=0; iquad_int<n_quad_pts_1D; iquad_int++){
1663 surf_vol_ref_2pt_flux_interp_surf[istate][iface_quad]
1664 -= surface_ref_2pt_flux_int_Hadamard_with_surf_oper[iface_quad][iquad_int]
1665 * unit_ref_normal_int[dim_not_zero];
1666 const unsigned int column_index = iface_quad * n_quad_pts_1D + iquad_int;
1667 surf_vol_ref_2pt_flux_interp_vol[istate][Hadamard_columns_sparsity[column_index]]
1668 += surface_ref_2pt_flux_int_Hadamard_with_surf_oper[iface_quad][iquad_int]
1669 * unit_ref_normal_int[dim_not_zero];
1677 std::array<std::vector<real>,nstate> conv_flux_dot_normal;
1678 std::array<std::vector<real>,nstate> diss_flux_dot_normal_diff;
1680 for (
unsigned int iquad=0; iquad<n_face_quad_pts; ++iquad) {
1686 dealii::Tensor<2,dim,real> metric_cofactor_surf;
1687 for(
int idim=0; idim<dim; idim++){
1688 for(
int jdim=0; jdim<dim; jdim++){
1693 dealii::Tensor<1,dim,real> unit_phys_normal_int;
1695 metric_cofactor_surf,
1696 unit_phys_normal_int);
1697 const double face_Jac_norm_scaled = unit_phys_normal_int.norm();
1698 unit_phys_normal_int /= face_Jac_norm_scaled;
1702 std::array<real,nstate> entropy_var_face_int;
1703 std::array<dealii::Tensor<1,dim,real>,nstate> aux_soln_state_int;
1704 std::array<real,nstate> soln_interp_to_face_int;
1705 for(
int istate=0; istate<
nstate; istate++){
1706 soln_interp_to_face_int[istate] = soln_at_surf_q[istate][iquad];
1707 entropy_var_face_int[istate] = projected_entropy_var_surf[istate][iquad];
1708 for(
int idim=0; idim<dim; idim++){
1709 aux_soln_state_int[istate][idim] = aux_soln_at_surf_q[istate][idim][iquad];
1714 std::array<real,nstate> soln_state_int;
1715 soln_state_int = this->
pde_physics_double->compute_conservative_variables_from_entropy_variables (entropy_var_face_int);
1719 for(
int istate=0; istate<
nstate; istate++){
1720 soln_state_int[istate] = soln_at_surf_q[istate][iquad];
1724 std::array<real,nstate> soln_boundary;
1725 std::array<dealii::Tensor<1,dim,real>,nstate> grad_soln_boundary;
1726 dealii::Point<dim,real> surf_flux_node;
1727 for(
int idim=0; idim<dim; idim++){
1728 surf_flux_node[idim] = metric_oper.
flux_nodes_surf[iface][idim][iquad];
1734 this->
pde_physics_double->boundary_face_values (boundary_id, surf_flux_node, unit_phys_normal_int, soln_state_int, aux_soln_state_int, soln_boundary, grad_soln_boundary);
1737 std::array<real,nstate> conv_num_flux_dot_n_at_q;
1738 conv_num_flux_dot_n_at_q = this->
conv_num_flux_double->evaluate_flux(soln_state_int, soln_boundary, unit_phys_normal_int);
1741 std::array<real,nstate> diss_auxi_num_flux_dot_n_at_q;
1743 current_cell_index, current_cell_index,
1745 soln_interp_to_face_int, soln_boundary,
1746 aux_soln_state_int, grad_soln_boundary,
1747 unit_phys_normal_int, penalty,
true);
1749 for(
int istate=0; istate<
nstate; istate++){
1752 conv_flux_dot_normal[istate].resize(n_face_quad_pts);
1753 diss_flux_dot_normal_diff[istate].resize(n_face_quad_pts);
1756 conv_flux_dot_normal[istate][iquad] = face_Jac_norm_scaled * conv_num_flux_dot_n_at_q[istate];
1757 diss_flux_dot_normal_diff[istate][iquad] = face_Jac_norm_scaled * diss_auxi_num_flux_dot_n_at_q[istate]
1758 - diffusive_int_vol_ref_flux_interp_to_face_dot_ref_normal[istate][iquad];
1763 for(
int istate=0; istate<
nstate; istate++){
1764 std::vector<real> rhs(n_shape_fns);
1767 std::vector<real> ones_surf(n_face_quad_pts, 1.0);
1769 surf_vol_ref_2pt_flux_interp_surf[istate],
1774 std::vector<real> ones_vol(n_quad_pts_vol, 1.0);
1782 face_quad_weights, rhs,
1789 face_quad_weights, rhs,
1795 face_quad_weights, rhs,
1800 for(
unsigned int ishape=0; ishape<n_shape_fns; ishape++){
1801 local_rhs_cell(istate*n_shape_fns + ishape) += rhs[ishape];
1807 template <
int dim,
int nstate,
typename real,
typename MeshType>
1809 const unsigned int iface,
const unsigned int neighbor_iface,
1810 const dealii::types::global_dof_index current_cell_index,
1811 const dealii::types::global_dof_index neighbor_cell_index,
1812 const unsigned int poly_degree_int,
1813 const unsigned int poly_degree_ext,
1815 const std::vector<dealii::types::global_dof_index> &dof_indices_int,
1816 const std::vector<dealii::types::global_dof_index> &dof_indices_ext,
1825 dealii::Vector<real> &local_rhs_int_cell,
1826 dealii::Vector<real> &local_rhs_ext_cell)
1828 (void) current_cell_index;
1829 (void) neighbor_cell_index;
1838 const unsigned int n_dofs_int = this->
fe_collection[poly_degree_int].dofs_per_cell;
1839 const unsigned int n_dofs_ext = this->
fe_collection[poly_degree_ext].dofs_per_cell;
1841 const unsigned int n_shape_fns_int = n_dofs_int /
nstate;
1842 const unsigned int n_shape_fns_ext = n_dofs_ext /
nstate;
1844 AssertDimension (n_dofs_int, dof_indices_int.size());
1845 AssertDimension (n_dofs_ext, dof_indices_ext.size());
1848 std::array<std::vector<real>,
nstate> soln_coeff_int;
1849 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> aux_soln_coeff_int;
1850 for (
unsigned int idof = 0; idof < n_dofs_int; ++idof) {
1851 const unsigned int istate = this->
fe_collection[poly_degree_int].system_to_component_index(idof).first;
1852 const unsigned int ishape = this->
fe_collection[poly_degree_int].system_to_component_index(idof).second;
1854 soln_coeff_int[istate].resize(n_shape_fns_int);
1857 for(
int idim=0; idim<dim; idim++){
1859 aux_soln_coeff_int[istate][idim].resize(n_shape_fns_int);
1865 aux_soln_coeff_int[istate][idim][ishape] = 0.0;
1871 std::array<std::vector<real>,
nstate> soln_coeff_ext;
1872 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> aux_soln_coeff_ext;
1873 for (
unsigned int idof = 0; idof < n_dofs_ext; ++idof) {
1874 const unsigned int istate = this->
fe_collection[poly_degree_ext].system_to_component_index(idof).first;
1875 const unsigned int ishape = this->
fe_collection[poly_degree_ext].system_to_component_index(idof).second;
1877 soln_coeff_ext[istate].resize(n_shape_fns_ext);
1880 for(
int idim=0; idim<dim; idim++){
1882 aux_soln_coeff_ext[istate][idim].resize(n_shape_fns_ext);
1888 aux_soln_coeff_ext[istate][idim][ishape] = 0.0;
1894 std::array<std::vector<real>,
nstate> soln_at_vol_q_int;
1895 std::array<std::vector<real>,
nstate> soln_at_vol_q_ext;
1896 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> aux_soln_at_vol_q_int;
1897 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> aux_soln_at_vol_q_ext;
1899 std::array<std::vector<real>,
nstate> soln_at_surf_q_int;
1900 std::array<std::vector<real>,
nstate> soln_at_surf_q_ext;
1901 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> aux_soln_at_surf_q_int;
1902 std::array<dealii::Tensor<1,dim,std::vector<real>>,
nstate> aux_soln_at_surf_q_ext;
1903 for(
int istate=0; istate<
nstate; ++istate){
1905 soln_at_vol_q_int[istate].resize(n_quad_pts_vol_int);
1906 soln_at_vol_q_ext[istate].resize(n_quad_pts_vol_ext);
1914 soln_at_surf_q_int[istate].resize(n_face_quad_pts);
1915 soln_at_surf_q_ext[istate].resize(n_face_quad_pts);
1918 soln_coeff_int[istate], soln_at_surf_q_int[istate],
1922 soln_coeff_ext[istate], soln_at_surf_q_ext[istate],
1926 for(
int idim=0; idim<dim; idim++){
1928 aux_soln_at_vol_q_int[istate][idim].resize(n_quad_pts_vol_int);
1929 aux_soln_at_vol_q_ext[istate][idim].resize(n_quad_pts_vol_ext);
1931 soln_basis_int.
matrix_vector_mult_1D(aux_soln_coeff_int[istate][idim], aux_soln_at_vol_q_int[istate][idim],
1933 soln_basis_ext.
matrix_vector_mult_1D(aux_soln_coeff_ext[istate][idim], aux_soln_at_vol_q_ext[istate][idim],
1937 aux_soln_at_surf_q_int[istate][idim].resize(n_face_quad_pts);
1938 aux_soln_at_surf_q_ext[istate][idim].resize(n_face_quad_pts);
1941 aux_soln_coeff_int[istate][idim], aux_soln_at_surf_q_int[istate][idim],
1945 aux_soln_coeff_ext[istate][idim], aux_soln_at_surf_q_ext[istate][idim],
1958 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> conv_ref_flux_at_vol_q_int;
1959 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> diffusive_ref_flux_at_vol_q_int;
1960 for (
unsigned int iquad=0; iquad<n_quad_pts_vol_int; ++iquad) {
1964 dealii::Tensor<2,dim,real> metric_cofactor_vol_int;
1965 for(
int idim=0; idim<dim; idim++){
1966 for(
int jdim=0; jdim<dim; jdim++){
1967 metric_cofactor_vol_int[idim][jdim] = metric_oper_int.
metric_cofactor_vol[idim][jdim][iquad];
1970 std::array<real,nstate> soln_state;
1971 std::array<dealii::Tensor<1,dim,real>,nstate> aux_soln_state;
1972 for(
int istate=0; istate<
nstate; istate++){
1973 soln_state[istate] = soln_at_vol_q_int[istate][iquad];
1974 for(
int idim=0; idim<dim; idim++){
1975 aux_soln_state[istate][idim] = aux_soln_at_vol_q_int[istate][idim][iquad];
1980 std::array<dealii::Tensor<1,dim,real>,nstate> conv_phys_flux;
1987 std::array<dealii::Tensor<1,dim,real>,nstate> diffusive_phys_flux;
1988 diffusive_phys_flux = this->
pde_physics_double->dissipative_flux(soln_state, aux_soln_state, current_cell_index);
1991 for(
int istate=0; istate<
nstate; istate++){
1992 dealii::Tensor<1,dim,real> conv_ref_flux;
1993 dealii::Tensor<1,dim,real> diffusive_ref_flux;
1997 conv_phys_flux[istate],
1998 metric_cofactor_vol_int,
2003 diffusive_phys_flux[istate],
2004 metric_cofactor_vol_int,
2005 diffusive_ref_flux);
2010 for(
int idim=0; idim<dim; idim++){
2013 conv_ref_flux_at_vol_q_int[istate][idim].resize(n_quad_pts_vol_int);
2014 diffusive_ref_flux_at_vol_q_int[istate][idim].resize(n_quad_pts_vol_int);
2018 conv_ref_flux_at_vol_q_int[istate][idim][iquad] = conv_ref_flux[idim];
2020 diffusive_ref_flux_at_vol_q_int[istate][idim][iquad] = diffusive_ref_flux[idim];
2027 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> conv_ref_flux_at_vol_q_ext;
2028 std::array<dealii::Tensor<1,dim,std::vector<real>>,nstate> diffusive_ref_flux_at_vol_q_ext;
2029 for (
unsigned int iquad=0; iquad<n_quad_pts_vol_ext; ++iquad) {
2032 dealii::Tensor<2,dim,real> metric_cofactor_vol_ext;
2033 for(
int idim=0; idim<dim; idim++){
2034 for(
int jdim=0; jdim<dim; jdim++){
2035 metric_cofactor_vol_ext[idim][jdim] = metric_oper_ext.
metric_cofactor_vol[idim][jdim][iquad];
2039 std::array<real,nstate> soln_state;
2040 std::array<dealii::Tensor<1,dim,real>,nstate> aux_soln_state;
2041 for(
int istate=0; istate<
nstate; istate++){
2042 soln_state[istate] = soln_at_vol_q_ext[istate][iquad];
2043 for(
int idim=0; idim<dim; idim++){
2044 aux_soln_state[istate][idim] = aux_soln_at_vol_q_ext[istate][idim][iquad];
2049 std::array<dealii::Tensor<1,dim,real>,nstate> conv_phys_flux;
2055 std::array<dealii::Tensor<1,dim,real>,nstate> diffusive_phys_flux;
2056 diffusive_phys_flux = this->
pde_physics_double->dissipative_flux(soln_state, aux_soln_state, neighbor_cell_index);
2059 for(
int istate=0; istate<
nstate; istate++){
2060 dealii::Tensor<1,dim,real> conv_ref_flux;
2061 dealii::Tensor<1,dim,real> diffusive_ref_flux;
2065 conv_phys_flux[istate],
2066 metric_cofactor_vol_ext,
2071 diffusive_phys_flux[istate],
2072 metric_cofactor_vol_ext,
2073 diffusive_ref_flux);
2078 for(
int idim=0; idim<dim; idim++){
2081 conv_ref_flux_at_vol_q_ext[istate][idim].resize(n_quad_pts_vol_ext);
2082 diffusive_ref_flux_at_vol_q_ext[istate][idim].resize(n_quad_pts_vol_ext);
2086 conv_ref_flux_at_vol_q_ext[istate][idim][iquad] = conv_ref_flux[idim];
2088 diffusive_ref_flux_at_vol_q_ext[istate][idim][iquad] = diffusive_ref_flux[idim];
2098 const dealii::Tensor<1,dim,double> unit_ref_normal_int = dealii::GeometryInfo<dim>::unit_normal_vector[iface];
2099 const dealii::Tensor<1,dim,double> unit_ref_normal_ext = dealii::GeometryInfo<dim>::unit_normal_vector[neighbor_iface];
2101 const int dim_not_zero_int = iface / 2;
2102 const int dim_not_zero_ext = neighbor_iface / 2;
2104 std::array<std::vector<real>,nstate> conv_int_vol_ref_flux_interp_to_face_dot_ref_normal;
2105 std::array<std::vector<real>,nstate> conv_ext_vol_ref_flux_interp_to_face_dot_ref_normal;
2106 std::array<std::vector<real>,nstate> diffusive_int_vol_ref_flux_interp_to_face_dot_ref_normal;
2107 std::array<std::vector<real>,nstate> diffusive_ext_vol_ref_flux_interp_to_face_dot_ref_normal;
2108 for(
int istate=0; istate<
nstate; istate++){
2110 conv_int_vol_ref_flux_interp_to_face_dot_ref_normal[istate].resize(n_face_quad_pts);
2111 conv_ext_vol_ref_flux_interp_to_face_dot_ref_normal[istate].resize(n_face_quad_pts);
2112 diffusive_int_vol_ref_flux_interp_to_face_dot_ref_normal[istate].resize(n_face_quad_pts);
2113 diffusive_ext_vol_ref_flux_interp_to_face_dot_ref_normal[istate].resize(n_face_quad_pts);
2121 conv_ref_flux_at_vol_q_int[istate][dim_not_zero_int],
2122 conv_int_vol_ref_flux_interp_to_face_dot_ref_normal[istate],
2125 false, unit_ref_normal_int[dim_not_zero_int]);
2127 conv_ref_flux_at_vol_q_ext[istate][dim_not_zero_ext],
2128 conv_ext_vol_ref_flux_interp_to_face_dot_ref_normal[istate],
2131 false, unit_ref_normal_ext[dim_not_zero_ext]);
2136 diffusive_ref_flux_at_vol_q_int[istate][dim_not_zero_int],
2137 diffusive_int_vol_ref_flux_interp_to_face_dot_ref_normal[istate],
2140 false, unit_ref_normal_int[dim_not_zero_int]);
2142 diffusive_ref_flux_at_vol_q_ext[istate][dim_not_zero_ext],
2143 diffusive_ext_vol_ref_flux_interp_to_face_dot_ref_normal[istate],
2146 false, unit_ref_normal_ext[dim_not_zero_ext]);
2157 std::array<std::vector<real>,nstate> entropy_var_vol_int;
2158 for(
unsigned int iquad=0; iquad<n_quad_pts_vol_int; iquad++){
2159 std::array<real,nstate> soln_state;
2160 for(
int istate=0; istate<
nstate; istate++){
2161 soln_state[istate] = soln_at_vol_q_int[istate][iquad];
2163 std::array<real,nstate> entropy_var;
2165 for(
int istate=0; istate<
nstate; istate++){
2167 entropy_var_vol_int[istate].resize(n_quad_pts_vol_int);
2169 entropy_var_vol_int[istate][iquad] = entropy_var[istate];
2172 std::array<std::vector<real>,nstate> entropy_var_vol_ext;
2173 for(
unsigned int iquad=0; iquad<n_quad_pts_vol_ext; iquad++){
2174 std::array<real,nstate> soln_state;
2175 for(
int istate=0; istate<
nstate; istate++){
2176 soln_state[istate] = soln_at_vol_q_ext[istate][iquad];
2178 std::array<real,nstate> entropy_var;
2180 for(
int istate=0; istate<
nstate; istate++){
2182 entropy_var_vol_ext[istate].resize(n_quad_pts_vol_ext);
2184 entropy_var_vol_ext[istate][iquad] = entropy_var[istate];
2189 std::array<std::vector<real>,nstate> projected_entropy_var_vol_int;
2190 std::array<std::vector<real>,nstate> projected_entropy_var_vol_ext;
2191 std::array<std::vector<real>,nstate> projected_entropy_var_surf_int;
2192 std::array<std::vector<real>,nstate> projected_entropy_var_surf_ext;
2193 for(
int istate=0; istate<
nstate; istate++){
2195 projected_entropy_var_vol_int[istate].resize(n_quad_pts_vol_int);
2196 projected_entropy_var_vol_ext[istate].resize(n_quad_pts_vol_ext);
2197 projected_entropy_var_surf_int[istate].resize(n_face_quad_pts);
2198 projected_entropy_var_surf_ext[istate].resize(n_face_quad_pts);
2201 std::vector<real> entropy_var_coeff_int(n_shape_fns_int);
2203 entropy_var_coeff_int,
2206 projected_entropy_var_vol_int[istate],
2209 entropy_var_coeff_int,
2210 projected_entropy_var_surf_int[istate],
2215 std::vector<real> entropy_var_coeff_ext(n_shape_fns_ext);
2217 entropy_var_coeff_ext,
2221 projected_entropy_var_vol_ext[istate],
2224 entropy_var_coeff_ext,
2225 projected_entropy_var_surf_ext[istate],
2231 const unsigned int row_size_int = n_face_quad_pts * n_quad_pts_1D_int;
2232 const unsigned int col_size_int = n_face_quad_pts * n_quad_pts_1D_int;
2233 std::vector<unsigned int> Hadamard_rows_sparsity_int(row_size_int);
2234 std::vector<unsigned int> Hadamard_columns_sparsity_int(col_size_int);
2235 const unsigned int row_size_ext = n_face_quad_pts * n_quad_pts_1D_ext;
2236 const unsigned int col_size_ext = n_face_quad_pts * n_quad_pts_1D_ext;
2237 std::vector<unsigned int> Hadamard_rows_sparsity_ext(row_size_ext);
2238 std::vector<unsigned int> Hadamard_columns_sparsity_ext(col_size_ext);
2244 std::array<std::vector<real>,nstate> surf_vol_ref_2pt_flux_interp_surf_int;
2245 std::array<std::vector<real>,nstate> surf_vol_ref_2pt_flux_interp_surf_ext;
2246 std::array<std::vector<real>,nstate> surf_vol_ref_2pt_flux_interp_vol_int;
2247 std::array<std::vector<real>,nstate> surf_vol_ref_2pt_flux_interp_vol_ext;
2250 std::array<dealii::FullMatrix<real>,nstate> surface_ref_2pt_flux_int;
2251 std::array<dealii::FullMatrix<real>,nstate> surface_ref_2pt_flux_ext;
2253 for(
int istate=0; istate<
nstate; istate++){
2254 surface_ref_2pt_flux_int[istate].reinit(n_face_quad_pts, n_quad_pts_1D_int);
2255 surface_ref_2pt_flux_ext[istate].reinit(n_face_quad_pts, n_quad_pts_1D_ext);
2257 for(
unsigned int iquad_face=0; iquad_face<n_face_quad_pts; iquad_face++){
2258 dealii::Tensor<2,dim,real> metric_cofactor_surf;
2259 for(
int idim=0; idim<dim; idim++){
2260 for(
int jdim=0; jdim<dim; jdim++){
2261 metric_cofactor_surf[idim][jdim] = metric_oper_int.
metric_cofactor_surf[idim][jdim][iquad_face];
2266 std::array<real,nstate> entropy_var_face_int;
2267 std::array<real,nstate> entropy_var_face_ext;
2268 for(
int istate=0; istate<
nstate; istate++){
2269 entropy_var_face_int[istate] = projected_entropy_var_surf_int[istate][iquad_face];
2270 entropy_var_face_ext[istate] = projected_entropy_var_surf_ext[istate][iquad_face];
2272 std::array<real,nstate> soln_state_face_int;
2273 soln_state_face_int = this->
pde_physics_double->compute_conservative_variables_from_entropy_variables (entropy_var_face_int);
2274 std::array<real,nstate> soln_state_face_ext;
2275 soln_state_face_ext = this->
pde_physics_double->compute_conservative_variables_from_entropy_variables (entropy_var_face_ext);
2278 for(
unsigned int row_index = iquad_face * n_quad_pts_1D_int, column_index = 0;
2279 column_index < n_quad_pts_1D_int;
2280 row_index++, column_index++){
2282 if(Hadamard_rows_sparsity_int[row_index] != iquad_face){
2283 pcout<<
"The interior Hadamard rows sparsity pattern does not match."<<std::endl;
2287 const unsigned int iquad_vol = Hadamard_columns_sparsity_int[row_index];
2291 dealii::Tensor<2,dim,real> metric_cofactor_vol_int;
2292 for(
int idim=0; idim<dim; idim++){
2293 for(
int jdim=0; jdim<dim; jdim++){
2294 metric_cofactor_vol_int[idim][jdim] = metric_oper_int.
metric_cofactor_vol[idim][jdim][iquad_vol];
2297 std::array<real,nstate> entropy_var;
2298 for(
int istate=0; istate<
nstate; istate++){
2299 entropy_var[istate] = projected_entropy_var_vol_int[istate][iquad_vol];
2301 std::array<real,nstate> soln_state;
2302 soln_state = this->
pde_physics_double->compute_conservative_variables_from_entropy_variables (entropy_var);
2308 std::array<dealii::Tensor<1,dim,real>,nstate> conv_phys_flux_2pt;
2309 conv_phys_flux_2pt = this->
pde_physics_double->convective_numerical_split_flux(soln_state, soln_state_face_int);
2310 for(
int istate=0; istate<
nstate; istate++){
2311 dealii::Tensor<1,dim,real> conv_ref_flux_2pt;
2314 conv_phys_flux_2pt[istate],
2315 0.5*(metric_cofactor_surf + metric_cofactor_vol_int),
2318 surface_ref_2pt_flux_int[istate][iquad_face][column_index] = conv_ref_flux_2pt[dim_not_zero_int];
2321 for(
unsigned int row_index = iquad_face * n_quad_pts_1D_ext, column_index = 0;
2322 column_index < n_quad_pts_1D_ext;
2323 row_index++, column_index++){
2325 if(Hadamard_rows_sparsity_ext[row_index] != iquad_face){
2326 pcout<<
"The exterior Hadamard rows sparsity pattern does not match."<<std::endl;
2330 const unsigned int iquad_vol = Hadamard_columns_sparsity_ext[row_index];
2334 dealii::Tensor<2,dim,real> metric_cofactor_vol_ext;
2335 for(
int idim=0; idim<dim; idim++){
2336 for(
int jdim=0; jdim<dim; jdim++){
2337 metric_cofactor_vol_ext[idim][jdim] = metric_oper_ext.
metric_cofactor_vol[idim][jdim][iquad_vol];
2340 std::array<real,nstate> entropy_var;
2341 for(
int istate=0; istate<
nstate; istate++){
2342 entropy_var[istate] = projected_entropy_var_vol_ext[istate][iquad_vol];
2344 std::array<real,nstate> soln_state;
2345 soln_state = this->
pde_physics_double->compute_conservative_variables_from_entropy_variables (entropy_var);
2347 std::array<dealii::Tensor<1,dim,real>,nstate> conv_phys_flux_2pt;
2348 conv_phys_flux_2pt = this->
pde_physics_double->convective_numerical_split_flux(soln_state, soln_state_face_ext);
2349 for(
int istate=0; istate<
nstate; istate++){
2350 dealii::Tensor<1,dim,real> conv_ref_flux_2pt;
2353 conv_phys_flux_2pt[istate],
2354 0.5*(metric_cofactor_surf + metric_cofactor_vol_ext),
2357 surface_ref_2pt_flux_ext[istate][iquad_face][column_index] = conv_ref_flux_2pt[dim_not_zero_ext];
2365 const int iface_1D = iface % 2;
2367 dealii::FullMatrix<real> surf_oper_sparse_int(n_face_quad_pts, n_quad_pts_1D_int);
2369 Hadamard_rows_sparsity_int, Hadamard_columns_sparsity_int,
2371 oneD_quad_weights_vol_int,
2372 surf_oper_sparse_int,
2374 const int neighbor_iface_1D = neighbor_iface % 2;
2376 dealii::FullMatrix<real> surf_oper_sparse_ext(n_face_quad_pts, n_quad_pts_1D_ext);
2378 Hadamard_rows_sparsity_ext, Hadamard_columns_sparsity_ext,
2380 oneD_quad_weights_vol_ext,
2381 surf_oper_sparse_ext,
2386 for(
int istate=0; istate<
nstate; istate++){
2388 dealii::FullMatrix<real> surface_ref_2pt_flux_int_Hadamard_with_surf_oper(n_face_quad_pts, n_quad_pts_1D_int);
2390 surface_ref_2pt_flux_int[istate],
2391 surface_ref_2pt_flux_int_Hadamard_with_surf_oper);
2392 dealii::FullMatrix<real> surface_ref_2pt_flux_ext_Hadamard_with_surf_oper(n_face_quad_pts, n_quad_pts_1D_ext);
2394 surface_ref_2pt_flux_ext[istate],
2395 surface_ref_2pt_flux_ext_Hadamard_with_surf_oper);
2397 surf_vol_ref_2pt_flux_interp_surf_int[istate].resize(n_face_quad_pts);
2398 surf_vol_ref_2pt_flux_interp_surf_ext[istate].resize(n_face_quad_pts);
2399 surf_vol_ref_2pt_flux_interp_vol_int[istate].resize(n_quad_pts_vol_int);
2400 surf_vol_ref_2pt_flux_interp_vol_ext[istate].resize(n_quad_pts_vol_ext);
2402 for(
unsigned int iface_quad=0; iface_quad<n_face_quad_pts; iface_quad++){
2403 for(
unsigned int iquad_int=0; iquad_int<n_quad_pts_1D_int; iquad_int++){
2404 surf_vol_ref_2pt_flux_interp_surf_int[istate][iface_quad]
2405 -= surface_ref_2pt_flux_int_Hadamard_with_surf_oper[iface_quad][iquad_int]
2406 * unit_ref_normal_int[dim_not_zero_int];
2407 const unsigned int column_index = iface_quad * n_quad_pts_1D_int + iquad_int;
2408 surf_vol_ref_2pt_flux_interp_vol_int[istate][Hadamard_columns_sparsity_int[column_index]]
2409 += surface_ref_2pt_flux_int_Hadamard_with_surf_oper[iface_quad][iquad_int]
2410 * unit_ref_normal_int[dim_not_zero_int];
2412 for(
unsigned int iquad_ext=0; iquad_ext<n_quad_pts_1D_ext; iquad_ext++){
2413 surf_vol_ref_2pt_flux_interp_surf_ext[istate][iface_quad]
2414 -= surface_ref_2pt_flux_ext_Hadamard_with_surf_oper[iface_quad][iquad_ext]
2415 * (unit_ref_normal_ext[dim_not_zero_ext]);
2416 const unsigned int column_index = iface_quad * n_quad_pts_1D_ext + iquad_ext;
2417 surf_vol_ref_2pt_flux_interp_vol_ext[istate][Hadamard_columns_sparsity_ext[column_index]]
2418 += surface_ref_2pt_flux_ext_Hadamard_with_surf_oper[iface_quad][iquad_ext]
2419 * (unit_ref_normal_ext[dim_not_zero_ext]);
2429 std::array<std::vector<real>,nstate> conv_num_flux_dot_n;
2430 std::array<std::vector<real>,nstate> diss_auxi_num_flux_dot_n;
2431 for (
unsigned int iquad=0; iquad<n_face_quad_pts; ++iquad) {
2437 dealii::Tensor<2,dim,real> metric_cofactor_surf;
2438 for(
int idim=0; idim<dim; idim++){
2439 for(
int jdim=0; jdim<dim; jdim++){
2444 std::array<real,nstate> entropy_var_face_int;
2445 std::array<real,nstate> entropy_var_face_ext;
2446 std::array<dealii::Tensor<1,dim,real>,nstate> aux_soln_state_int;
2447 std::array<dealii::Tensor<1,dim,real>,nstate> aux_soln_state_ext;
2448 std::array<real,nstate> soln_interp_to_face_int;
2449 std::array<real,nstate> soln_interp_to_face_ext;
2450 for(
int istate=0; istate<
nstate; istate++){
2451 soln_interp_to_face_int[istate] = soln_at_surf_q_int[istate][iquad];
2452 soln_interp_to_face_ext[istate] = soln_at_surf_q_ext[istate][iquad];
2453 entropy_var_face_int[istate] = projected_entropy_var_surf_int[istate][iquad];
2454 entropy_var_face_ext[istate] = projected_entropy_var_surf_ext[istate][iquad];
2455 for(
int idim=0; idim<dim; idim++){
2456 aux_soln_state_int[istate][idim] = aux_soln_at_surf_q_int[istate][idim][iquad];
2457 aux_soln_state_ext[istate][idim] = aux_soln_at_surf_q_ext[istate][idim][iquad];
2461 std::array<real,nstate> soln_state_int;
2462 soln_state_int = this->
pde_physics_double->compute_conservative_variables_from_entropy_variables (entropy_var_face_int);
2463 std::array<real,nstate> soln_state_ext;
2464 soln_state_ext = this->
pde_physics_double->compute_conservative_variables_from_entropy_variables (entropy_var_face_ext);
2468 for(
int istate=0; istate<
nstate; istate++){
2469 soln_state_int[istate] = soln_at_surf_q_int[istate][iquad];
2470 soln_state_ext[istate] = soln_at_surf_q_ext[istate][iquad];
2475 dealii::Tensor<1,dim,real> unit_phys_normal_int;
2477 metric_cofactor_surf,
2478 unit_phys_normal_int);
2479 const double face_Jac_norm_scaled = unit_phys_normal_int.norm();
2480 unit_phys_normal_int /= face_Jac_norm_scaled;
2484 std::array<real,nstate> conv_num_flux_dot_n_at_q;
2485 std::array<real,nstate> diss_auxi_num_flux_dot_n_at_q;
2487 conv_num_flux_dot_n_at_q = this->
conv_num_flux_double->evaluate_flux(soln_state_int, soln_state_ext, unit_phys_normal_int);
2490 current_cell_index, neighbor_cell_index,
2492 soln_interp_to_face_int, soln_interp_to_face_ext,
2493 aux_soln_state_int, aux_soln_state_ext,
2494 unit_phys_normal_int, penalty,
false);
2497 for(
int istate=0; istate<
nstate; istate++){
2504 conv_num_flux_dot_n[istate].resize(n_face_quad_pts);
2505 diss_auxi_num_flux_dot_n[istate].resize(n_face_quad_pts);
2509 conv_num_flux_dot_n[istate][iquad] = face_Jac_norm_scaled * conv_num_flux_dot_n_at_q[istate];
2510 diss_auxi_num_flux_dot_n[istate][iquad] = face_Jac_norm_scaled * diss_auxi_num_flux_dot_n_at_q[istate];
2516 for(
int istate=0; istate<
nstate; istate++){
2518 std::vector<real> rhs_int(n_shape_fns_int);
2522 std::vector<real> ones_surf(n_face_quad_pts, 1.0);
2524 surf_vol_ref_2pt_flux_interp_surf_int[istate],
2529 std::vector<real> ones_vol(n_quad_pts_vol_int, 1.0);
2530 soln_basis_int.
inner_product_1D(surf_vol_ref_2pt_flux_interp_vol_int[istate],
2538 conv_int_vol_ref_flux_interp_to_face_dot_ref_normal[istate],
2539 surf_quad_weights, rhs_int,
2546 diffusive_int_vol_ref_flux_interp_to_face_dot_ref_normal[istate],
2547 surf_quad_weights, rhs_int,
2553 surf_quad_weights, rhs_int,
2559 surf_quad_weights, rhs_int,
2565 for(
unsigned int ishape=0; ishape<n_shape_fns_int; ishape++){
2566 local_rhs_int_cell(istate*n_shape_fns_int + ishape) += rhs_int[ishape];
2570 std::vector<real> rhs_ext(n_shape_fns_ext);
2574 std::vector<real> ones_surf(n_face_quad_pts, 1.0);
2576 surf_vol_ref_2pt_flux_interp_surf_ext[istate],
2582 std::vector<real> ones_vol(n_quad_pts_vol_ext, 1.0);
2583 soln_basis_ext.
inner_product_1D(surf_vol_ref_2pt_flux_interp_vol_ext[istate],
2591 conv_ext_vol_ref_flux_interp_to_face_dot_ref_normal[istate],
2592 surf_quad_weights, rhs_ext,
2599 diffusive_ext_vol_ref_flux_interp_to_face_dot_ref_normal[istate],
2600 surf_quad_weights, rhs_ext,
2606 surf_quad_weights, rhs_ext,
2612 surf_quad_weights, rhs_ext,
2618 for(
unsigned int ishape=0; ishape<n_shape_fns_ext; ishape++){
2619 local_rhs_ext_cell(istate*n_shape_fns_ext + ishape) += rhs_ext[ishape];
2636 template <
int dim,
int nstate,
typename real,
typename MeshType>
2638 typename dealii::DoFHandler<dim>::active_cell_iterator ,
2639 const dealii::types::global_dof_index ,
2640 const unsigned int ,
2641 const unsigned int ,
2642 const dealii::FEFaceValuesBase<dim,dim> &,
2644 const dealii::FESystem<dim,dim> &,
2645 const dealii::Quadrature<dim-1> &,
2646 const std::vector<dealii::types::global_dof_index> &,
2647 const std::vector<dealii::types::global_dof_index> &,
2648 dealii::Vector<real> &,
2788 template <
int dim,
int nstate,
typename real,
typename MeshType>
2790 typename dealii::DoFHandler<dim>::active_cell_iterator ,
2791 const dealii::types::global_dof_index ,
2792 const dealii::FEValues<dim,dim> &,
2793 const dealii::FESystem<dim,dim> &,
2794 const dealii::Quadrature<dim> &,
2795 const std::vector<dealii::types::global_dof_index> &,
2796 const std::vector<dealii::types::global_dof_index> &,
2797 dealii::Vector<real> &,
2798 const dealii::FEValues<dim,dim> &,
2915 template <
int dim,
int nstate,
typename real,
typename MeshType>
2917 typename dealii::DoFHandler<dim>::active_cell_iterator ,
2918 const dealii::types::global_dof_index ,
2919 const dealii::types::global_dof_index ,
2920 const std::pair<unsigned int, int> ,
2921 const std::pair<unsigned int, int> ,
2922 const typename dealii::QProjector<dim>::DataSetDescriptor ,
2923 const typename dealii::QProjector<dim>::DataSetDescriptor ,
2924 const dealii::FEFaceValuesBase<dim,dim> &,
2925 const dealii::FEFaceValuesBase<dim,dim> &,
2927 const dealii::FESystem<dim,dim> &,
2928 const dealii::FESystem<dim,dim> &,
2929 const dealii::Quadrature<dim-1> &,
2930 const std::vector<dealii::types::global_dof_index> &,
2931 const std::vector<dealii::types::global_dof_index> &,
2932 const std::vector<dealii::types::global_dof_index> &,
2933 const std::vector<dealii::types::global_dof_index> &,
2934 dealii::Vector<real> &,
2935 dealii::Vector<real> &,
3119 template <
int dim,
int nstate,
typename real,
typename MeshType>
3121 typename dealii::DoFHandler<dim>::active_cell_iterator ,
3122 const dealii::types::global_dof_index ,
3123 const dealii::FEValues<dim,dim> &,
3124 const std::vector<dealii::types::global_dof_index> &,
3125 const std::vector<dealii::types::global_dof_index> &,
3126 const unsigned int ,
3127 const unsigned int ,
3128 dealii::Vector<real> &,
3129 const dealii::FEValues<dim,dim> &)
3135 template <
int dim,
int nstate,
typename real,
typename MeshType>
dealii::Tensor< 2, dim, std::vector< real > > metric_cofactor_vol
The volume metric cofactor matrix.
PartialDifferentialEquation pde_type
Store the PDE type to be solved.
std::array< dealii::FullMatrix< double >, 2 > oneD_surf_operator
Stores the one dimensional surface operator.
void assemble_face_term_derivatives(typename dealii::DoFHandler< dim >::active_cell_iterator cell, const dealii::types::global_dof_index current_cell_index, const dealii::types::global_dof_index neighbor_cell_index, const std::pair< unsigned int, int > face_subface_int, const std::pair< unsigned int, int > face_subface_ext, const typename dealii::QProjector< dim >::DataSetDescriptor face_data_set_int, const typename dealii::QProjector< dim >::DataSetDescriptor face_data_set_ext, const dealii::FEFaceValuesBase< dim, dim > &, const dealii::FEFaceValuesBase< dim, dim > &, const real penalty, const dealii::FESystem< dim, dim > &fe_int, const dealii::FESystem< dim, dim > &fe_ext, const dealii::Quadrature< dim-1 > &face_quadrature, const std::vector< dealii::types::global_dof_index > &metric_dof_indices_int, const std::vector< dealii::types::global_dof_index > &metric_dof_indices_ext, const std::vector< dealii::types::global_dof_index > &soln_dof_indices_int, const std::vector< dealii::types::global_dof_index > &soln_dof_indices_ext, dealii::Vector< real > &local_rhs_int_cell, dealii::Vector< real > &local_rhs_ext_cell, const bool compute_dRdW, const bool compute_dRdX, const bool compute_d2R)
Evaluate the integral over the internal cell edges and its specified derivatives. ...
void assemble_boundary_term_strong(const unsigned int iface, const dealii::types::global_dof_index current_cell_index, const unsigned int boundary_id, const unsigned int poly_degree, const real penalty, const std::vector< dealii::types::global_dof_index > &dof_indices, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper, dealii::Vector< real > &local_rhs_cell)
Strong form primary equation's boundary right-hand-side.
bool use_auxiliary_eq
Flag for using the auxiliary equation.
std::unique_ptr< NumericalFlux::NumericalFluxDissipative< dim, nstate, real > > diss_num_flux_double
Dissipative numerical flux with real type.
const dealii::UpdateFlags neighbor_face_update_flags
Update flags needed at neighbor' face points.
dealii::LinearAlgebra::distributed::Vector< double > artificial_dissipation_c0
Artificial dissipation coefficients.
void sum_factorized_Hadamard_surface_sparsity_pattern(const unsigned int rows_size, const unsigned int columns_size, std::vector< unsigned int > &rows, std::vector< unsigned int > &columns, const int dim_not_zero)
Computes the rows and columns vectors with non-zero indices for surface sum-factorized Hadamard produ...
const Parameters::AllParameters *const all_parameters
Pointer to all parameters.
void inner_product_surface_1D(const unsigned int face_number, const std::vector< real > &input_vect, const std::vector< real > &weight_vect, std::vector< real > &output_vect, const std::array< dealii::FullMatrix< double >, 2 > &basis_surf, const dealii::FullMatrix< double > &basis_vol, const bool adding=false, const double factor=1.0)
Apply sum-factorization inner product on a surface.
void assemble_auxiliary_residual()
Assembles the auxiliary equations' residuals and solves for the auxiliary variables.
dealii::FullMatrix< double > oneD_grad_operator
Stores the one dimensional gradient operator.
std::unique_ptr< NumericalFlux::NumericalFluxConvective< dim, nstate, real > > conv_num_flux_double
Convective numerical flux with real type.
std::array< dealii::LinearAlgebra::distributed::Vector< double >, dim > auxiliary_right_hand_side
The auxiliary equations' right hand sides.
DGStrong(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)
Constructor.
std::shared_ptr< Triangulation > triangulation
Mesh.
void Hadamard_product(const dealii::FullMatrix< real > &input_mat1, const dealii::FullMatrix< real > &input_mat2, dealii::FullMatrix< real > &output_mat)
Computes a single Hadamard product.
void inner_product_1D(const std::vector< real > &input_vect, const std::vector< real > &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.
PartialDifferentialEquation
Possible Partial Differential Equations to solve.
Files for the baseline physics.
ManufacturedSolutionParam manufactured_solution_param
Associated manufactured solution parameters.
unsigned int current_degree
Stores the degree of the current poly degree.
bool use_invariant_curl_form
Flag to use invariant curl form for metric cofactor operator.
dealii::Tensor< 2, dim, std::vector< real > > metric_cofactor_surf
The facet metric cofactor matrix, for ONE face.
void assemble_volume_term_strong(typename dealii::DoFHandler< dim >::active_cell_iterator cell, const dealii::types::global_dof_index current_cell_index, const std::vector< dealii::types::global_dof_index > &cell_dofs_indices, const unsigned int poly_degree, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis, OPERATOR::local_basis_stiffness< dim, 2 *dim, real > &flux_basis_stiffness, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper, dealii::Vector< real > &local_rhs_int_cell)
Strong form primary equation's volume right-hand-side.
void assemble_face_term_strong(const unsigned int iface, const unsigned int neighbor_iface, const dealii::types::global_dof_index current_cell_index, const dealii::types::global_dof_index neighbor_cell_index, const unsigned int poly_degree_int, const unsigned int poly_degree_ext, const real penalty, const std::vector< dealii::types::global_dof_index > &dof_indices_int, const std::vector< dealii::types::global_dof_index > &dof_indices_ext, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_int, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_ext, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis_int, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis_ext, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_int, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_ext, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper_int, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper_ext, dealii::Vector< real > &local_rhs_int_cell, dealii::Vector< real > &local_rhs_ext_cell)
Strong form primary equation's facet right-hand-side.
dealii::FullMatrix< double > oneD_skew_symm_vol_oper
Skew-symmetric volume operator .
ODESolverEnum
Types of ODE solver.
void reinit_operators_for_cell_residual_loop(const unsigned int poly_degree_int, const unsigned int poly_degree_ext, const unsigned int grid_degree, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_int, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_ext, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis_int, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis_ext, OPERATOR::local_basis_stiffness< dim, 2 *dim, real > &flux_basis_stiffness, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_int, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_ext, OPERATOR::mapping_shape_functions< dim, 2 *dim, real > &mapping_basis)
Builds needed operators for cell residual loop.
void assemble_volume_term_derivatives(typename dealii::DoFHandler< dim >::active_cell_iterator cell, const dealii::types::global_dof_index current_cell_index, const dealii::FEValues< dim, dim > &, const dealii::FESystem< dim, dim > &fe, const dealii::Quadrature< dim > &quadrature, const std::vector< dealii::types::global_dof_index > &metric_dof_indices, const std::vector< dealii::types::global_dof_index > &soln_dof_indices, dealii::Vector< real > &local_rhs_cell, const dealii::FEValues< dim, dim > &, const bool compute_dRdW, const bool compute_dRdX, const bool compute_d2R)
Evaluate the integral over the cell volume and the specified derivatives.
dealii::Vector< double > max_dt_cell
Time it takes for the maximum wavespeed to cross the cell domain.
Main parameter class that contains the various other sub-parameter classes.
void transform_reference_to_physical(const dealii::Tensor< 1, dim, real > &ref, const dealii::Tensor< 2, dim, real > &metric_cofactor, dealii::Tensor< 1, dim, real > &phys)
Given a reference tensor, return the physical tensor.
dealii::LinearAlgebra::distributed::Vector< double > solution
Current modal coefficients of the solution.
void assemble_face_term_auxiliary_equation(const unsigned int iface, const unsigned int neighbor_iface, const dealii::types::global_dof_index current_cell_index, const dealii::types::global_dof_index neighbor_cell_index, const unsigned int poly_degree_int, const unsigned int poly_degree_ext, const std::vector< dealii::types::global_dof_index > &dof_indices_int, const std::vector< dealii::types::global_dof_index > &dof_indices_ext, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_int, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_ext, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper_int, std::vector< dealii::Tensor< 1, dim, real >> &local_auxiliary_RHS_int, std::vector< dealii::Tensor< 1, dim, real >> &local_auxiliary_RHS_ext)
Evaluate the facet RHS for the auxiliary equation.
std::vector< real > det_Jac_vol
The determinant of the metric Jacobian at volume cubature nodes.
ManufacturedConvergenceStudyParam manufactured_convergence_study_param
Contains parameters for manufactured convergence study.
const int nstate
Number of state variables.
dealii::DoFHandler< dim > dof_handler_artificial_dissipation
Degrees of freedom handler for C0 artificial dissipation.
DGStrong class templated on the number of state variables.
ODESolverParam ode_solver_param
Contains parameters for ODE solver.
unsigned int current_degree
Stores the degree of the current poly degree.
dealii::TrilinosWrappers::SparseMatrix global_inverse_mass_matrix_auxiliary
Global inverse of the auxiliary mass matrix.
void sum_factorized_Hadamard_surface_basis_assembly(const unsigned int rows_size, const unsigned int columns_size_1D, const std::vector< unsigned int > &rows, const std::vector< unsigned int > &columns, const dealii::FullMatrix< double > &basis, const std::vector< double > &weights, dealii::FullMatrix< double > &basis_sparse, const int dim_not_zero)
Constructs the basis operator storing all non-zero entries for a "sum-factorized" surface Hadamard p...
dealii::hp::QCollection< dim-1 > face_quadrature_collection
Quadrature used to evaluate face integrals.
const unsigned int max_degree
Maximum degree used for p-refi1nement.
std::shared_ptr< Physics::PhysicsBase< dim, nstate, real > > pde_physics_double
Contains the physics of the PDE with real type.
Base metric operators class that stores functions used in both the volume and on surface.
void matrix_vector_mult_surface_1D(const unsigned int face_number, const std::vector< real > &input_vect, std::vector< real > &output_vect, const std::array< dealii::FullMatrix< double >, 2 > &basis_surf, const dealii::FullMatrix< double > &basis_vol, const bool adding=false, const double factor=1.0)
Apply sum-factorization matrix vector multiplication on a surface.
real current_time
The current time set in set_current_time()
void divergence_matrix_vector_mult_1D(const dealii::Tensor< 1, dim, std::vector< real >> &input_vect, std::vector< real > &output_vect, const dealii::FullMatrix< double > &basis, const dealii::FullMatrix< double > &gradient_basis)
Computes the divergence using sum-factorization where the basis are the same in each direction...
void assemble_boundary_term_derivatives(typename dealii::DoFHandler< dim >::active_cell_iterator cell, const dealii::types::global_dof_index current_cell_index, const unsigned int face_number, const unsigned int boundary_id, const dealii::FEFaceValuesBase< dim, dim > &fe_values_boundary, const real penalty, const dealii::FESystem< dim, dim > &fe, const dealii::Quadrature< dim-1 > &quadrature, const std::vector< dealii::types::global_dof_index > &metric_dof_indices, const std::vector< dealii::types::global_dof_index > &soln_dof_indices, dealii::Vector< real > &local_rhs_cell, const bool compute_dRdW, const bool compute_dRdX, const bool compute_d2R)
Assemble boundary term derivatives.
dealii::ConditionalOStream pcout
Parallel std::cout that only outputs on mpi_rank==0.
The mapping shape functions evaluated at the desired nodes (facet set included in volume grid nodes f...
bool use_manufactured_source_term
Uses non-zero source term based on the manufactured solution and the PDE.
bool use_split_form
Flag to use split form.
const dealii::UpdateFlags face_update_flags
Update flags needed at face points.
std::shared_ptr< HighOrderGrid< dim, real, MeshType > > high_order_grid
High order grid that will provide the MappingFEField.
void gradient_matrix_vector_mult_1D(const std::vector< real > &input_vect, dealii::Tensor< 1, dim, std::vector< real >> &output_vect, const dealii::FullMatrix< double > &basis, const dealii::FullMatrix< double > &gradient_basis)
Computes the gradient of a scalar using sum-factorization where the basis are the same in each direct...
real evaluate_CFL(std::vector< std::array< real, nstate > > soln_at_q, const real artificial_dissipation, const real cell_diameter, const unsigned int cell_degree)
Evaluate the time it takes for the maximum wavespeed to cross the cell domain.
void assemble_subface_term_and_build_operators(typename dealii::DoFHandler< dim >::active_cell_iterator cell, typename dealii::DoFHandler< dim >::active_cell_iterator neighbor_cell, const dealii::types::global_dof_index current_cell_index, const dealii::types::global_dof_index neighbor_cell_index, const unsigned int iface, const unsigned int neighbor_iface, const unsigned int, const real penalty, const std::vector< dealii::types::global_dof_index > ¤t_dofs_indices, const std::vector< dealii::types::global_dof_index > &neighbor_dofs_indices, const std::vector< dealii::types::global_dof_index > ¤t_metric_dofs_indices, const std::vector< dealii::types::global_dof_index > &neighbor_metric_dofs_indices, const unsigned int poly_degree_int, const unsigned int poly_degree_ext, const unsigned int grid_degree_int, const unsigned int grid_degree_ext, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_int, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_ext, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis_int, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis_ext, OPERATOR::local_basis_stiffness< dim, 2 *dim, real > &flux_basis_stiffness, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_int, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_ext, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper_int, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper_ext, OPERATOR::mapping_shape_functions< dim, 2 *dim, real > &mapping_basis, std::array< std::vector< real >, dim > &mapping_support_points, dealii::hp::FEFaceValues< dim, dim > &fe_values_collection_face_int, dealii::hp::FESubfaceValues< dim, dim > &, dealii::Vector< real > ¤t_cell_rhs, dealii::Vector< real > &neighbor_cell_rhs, std::vector< dealii::Tensor< 1, dim, real >> ¤t_cell_rhs_aux, dealii::LinearAlgebra::distributed::Vector< double > &rhs, std::array< dealii::LinearAlgebra::distributed::Vector< double >, dim > &rhs_aux, const bool compute_auxiliary_right_hand_side, const bool compute_dRdW, const bool compute_dRdX, const bool compute_d2R)
Builds the necessary operators and assembles subface residual.
const unsigned int max_grid_degree
Maximum grid degree used for hp-refi1nement.
const dealii::UpdateFlags volume_update_flags
Update flags needed at volume points.
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.
dealii::FullMatrix< double > oneD_vol_operator
Stores the one dimensional volume operator.
void sum_factorized_Hadamard_basis_assembly(const unsigned int rows_size_1D, const unsigned int columns_size_1D, const std::vector< std::array< unsigned int, dim >> &rows, const std::vector< std::array< unsigned int, dim >> &columns, const dealii::FullMatrix< double > &basis, const std::vector< double > &weights, std::array< dealii::FullMatrix< double >, dim > &basis_sparse)
Constructs the basis operator storing all non-zero entries for a "sum-factorized" Hadamard product...
void assemble_volume_term_auxiliary_equation(const std::vector< dealii::types::global_dof_index > ¤t_dofs_indices, const unsigned int poly_degree, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper, std::vector< dealii::Tensor< 1, dim, real >> &local_auxiliary_RHS)
Evaluate the volume RHS for the auxiliary equation.
void build_facet_metric_operators(const unsigned int iface, 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, real > &mapping_basis, const bool use_invariant_curl_form=false)
Builds the facet metric operators.
void assemble_boundary_term_auxiliary_equation(const unsigned int iface, const dealii::types::global_dof_index current_cell_index, const unsigned int poly_degree, const unsigned int boundary_id, const std::vector< dealii::types::global_dof_index > &dofs_indices, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper, std::vector< dealii::Tensor< 1, dim, real >> &local_auxiliary_RHS)
Evaluate the boundary RHS for the auxiliary equation.
Abstract class templated on the number of state variables.
bool use_inverse_mass_on_the_fly
Flag to use inverse mass matrix on-the-fly for explicit solves.
ODESolverEnum ode_solver_type
ODE solver type.
dealii::DoFHandler< dim > dof_handler
Finite Element Collection to represent the high-order grid.
void assemble_face_term_and_build_operators(typename dealii::DoFHandler< dim >::active_cell_iterator, typename dealii::DoFHandler< dim >::active_cell_iterator, const dealii::types::global_dof_index current_cell_index, const dealii::types::global_dof_index neighbor_cell_index, const unsigned int iface, const unsigned int neighbor_iface, const real penalty, const std::vector< dealii::types::global_dof_index > ¤t_dofs_indices, const std::vector< dealii::types::global_dof_index > &neighbor_dofs_indices, const std::vector< dealii::types::global_dof_index > ¤t_metric_dofs_indices, const std::vector< dealii::types::global_dof_index > &neighbor_metric_dofs_indices, const unsigned int poly_degree_int, const unsigned int poly_degree_ext, const unsigned int grid_degree_int, const unsigned int grid_degree_ext, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_int, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_ext, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis_int, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis_ext, OPERATOR::local_basis_stiffness< dim, 2 *dim, real > &flux_basis_stiffness, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_int, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_ext, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper_int, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper_ext, OPERATOR::mapping_shape_functions< dim, 2 *dim, real > &mapping_basis, std::array< std::vector< real >, dim > &mapping_support_points, dealii::hp::FEFaceValues< dim, dim > &, dealii::hp::FEFaceValues< dim, dim > &, dealii::Vector< real > ¤t_cell_rhs, dealii::Vector< real > &neighbor_cell_rhs, std::vector< dealii::Tensor< 1, dim, real >> ¤t_cell_rhs_aux, dealii::LinearAlgebra::distributed::Vector< double > &rhs, std::array< dealii::LinearAlgebra::distributed::Vector< double >, dim > &rhs_aux, const bool compute_auxiliary_right_hand_side, const bool compute_dRdW, const bool compute_dRdX, const bool compute_d2R)
Builds the necessary operators and assembles face residual.
void assemble_volume_term_and_build_operators(typename dealii::DoFHandler< dim >::active_cell_iterator cell, const dealii::types::global_dof_index current_cell_index, const std::vector< dealii::types::global_dof_index > &cell_dofs_indices, const std::vector< dealii::types::global_dof_index > &metric_dof_indices, const unsigned int poly_degree, const unsigned int grid_degree, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis, OPERATOR::local_basis_stiffness< dim, 2 *dim, real > &flux_basis_stiffness, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_int, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_ext, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper, OPERATOR::mapping_shape_functions< dim, 2 *dim, real > &mapping_basis, std::array< std::vector< real >, dim > &mapping_support_points, dealii::hp::FEValues< dim, dim > &, dealii::hp::FEValues< dim, dim > &, const dealii::FESystem< dim, dim > &, dealii::Vector< real > &local_rhs_int_cell, std::vector< dealii::Tensor< 1, dim, real >> &local_auxiliary_RHS, const bool compute_auxiliary_right_hand_side, const bool, const bool, const bool)
Builds the necessary operators and assembles volume residual for either primary or auxiliary...
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, real > &mapping_basis, const bool use_invariant_curl_form=false)
Builds the volume metric operators.
std::array< dealii::Tensor< 1, dim, std::vector< real > >, n_faces > flux_nodes_surf
Stores the physical facet flux nodes.
bool add_artificial_dissipation
Flag to add artificial dissipation from Persson's shock capturing paper.
const dealii::hp::FECollection< dim > fe_collection_lagrange
Lagrange basis used in strong form.
dealii::Vector< double > cell_volume
Time it takes for the maximum wavespeed to cross the cell domain.
void assemble_boundary_term_and_build_operators(typename dealii::DoFHandler< dim >::active_cell_iterator, const dealii::types::global_dof_index current_cell_index, const unsigned int iface, const unsigned int boundary_id, const real penalty, const std::vector< dealii::types::global_dof_index > &cell_dofs_indices, const std::vector< dealii::types::global_dof_index > &metric_dof_indices, const unsigned int poly_degree, const unsigned int grid_degree, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis, OPERATOR::local_basis_stiffness< dim, 2 *dim, real > &flux_basis_stiffness, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_int, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_ext, OPERATOR::metric_operators< real, dim, 2 *dim > &metric_oper, OPERATOR::mapping_shape_functions< dim, 2 *dim, real > &mapping_basis, std::array< std::vector< real >, dim > &mapping_support_points, dealii::hp::FEFaceValues< dim, dim > &, const dealii::FESystem< dim, dim > &, dealii::Vector< real > &local_rhs_int_cell, std::vector< dealii::Tensor< 1, dim, real >> &local_auxiliary_RHS, const bool compute_auxiliary_right_hand_side, const bool, const bool, const bool)
Builds the necessary operators and assembles boundary residual for either primary or auxiliary...
dealii::hp::QCollection< 1 > oneD_quadrature_collection
1D quadrature to generate Lagrange polynomials for the sake of flux interpolation.
std::array< dealii::LinearAlgebra::distributed::Vector< double >, dim > auxiliary_solution
The auxiliary equations' solution.
DGBase is independent of the number of state variables.
void assemble_cell_residual(const DoFCellAccessorType1 ¤t_cell, const DoFCellAccessorType2 ¤t_metric_cell, const bool compute_dRdW, const bool compute_dRdX, const bool compute_d2R, dealii::hp::FEValues< dim, dim > &fe_values_collection_volume, dealii::hp::FEFaceValues< dim, dim > &fe_values_collection_face_int, dealii::hp::FEFaceValues< dim, dim > &fe_values_collection_face_ext, dealii::hp::FESubfaceValues< dim, dim > &fe_values_collection_subface, dealii::hp::FEValues< dim, dim > &fe_values_collection_volume_lagrange, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_int, OPERATOR::basis_functions< dim, 2 *dim, real > &soln_basis_ext, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis_int, OPERATOR::basis_functions< dim, 2 *dim, real > &flux_basis_ext, OPERATOR::local_basis_stiffness< dim, 2 *dim, real > &flux_basis_stiffness, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_int, OPERATOR::vol_projection_operator< dim, 2 *dim, real > &soln_basis_projection_oper_ext, OPERATOR::mapping_shape_functions< dim, 2 *dim, real > &mapping_basis, const bool compute_auxiliary_right_hand_side, dealii::LinearAlgebra::distributed::Vector< double > &rhs, std::array< dealii::LinearAlgebra::distributed::Vector< double >, dim > &rhs_aux)
Used in assemble_residual().
dealii::hp::QCollection< dim > volume_quadrature_collection
Finite Element Collection to represent the high-order grid.
unsigned int n_dofs() const
Number of degrees of freedom.
ArtificialDissipationParam artificial_dissipation_param
Contains parameters for artificial dissipation.
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.
const dealii::hp::FECollection< dim > fe_collection
Finite Element Collection for p-finite-element to represent the solution.
dealii::Tensor< 1, dim, std::vector< real > > flux_nodes_vol
Stores the physical volume flux nodes.
void allocate_dual_vector()
Allocate the dual vector for optimization.
Projection operator corresponding to basis functions onto M-norm (L2).
dealii::LinearAlgebra::distributed::Vector< double > right_hand_side
Residual of the current solution.
Local stiffness matrix without jacobian dependence.
void sum_factorized_Hadamard_sparsity_pattern(const unsigned int rows_size, const unsigned int columns_size, std::vector< std::array< unsigned int, dim >> &rows, std::vector< std::array< unsigned int, dim >> &columns)
Computes the rows and columns vectors with non-zero indices for sum-factorized Hadamard products...
void assemble_volume_term_explicit(typename dealii::DoFHandler< dim >::active_cell_iterator cell, const dealii::types::global_dof_index current_cell_index, const dealii::FEValues< dim, dim > &fe_values_volume, const std::vector< dealii::types::global_dof_index > ¤t_dofs_indices, const std::vector< dealii::types::global_dof_index > &metric_dof_indices, const unsigned int poly_degree, const unsigned int grid_degree, dealii::Vector< real > ¤t_cell_rhs, const dealii::FEValues< dim, dim > &fe_values_lagrange)
Evaluate the integral over the cell volume.
const dealii::FE_Q< dim > fe_q_artificial_dissipation
Continuous distribution of artificial dissipation.
void apply_inverse_global_mass_matrix(const dealii::LinearAlgebra::distributed::Vector< double > &input_vector, dealii::LinearAlgebra::distributed::Vector< double > &output_vector, const bool use_auxiliary_eq=false)
Applies the inverse of the local metric dependent mass matrices when the global is not stored...