[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
operators.h
1 #ifndef __OPERATORS_H__
2 #define __OPERATORS_H__
3 
4 #include <deal.II/base/conditional_ostream.h>
5 #include <deal.II/base/parameter_handler.h>
6 
7 #include <deal.II/base/qprojector.h>
8 
9 #include <deal.II/grid/tria.h>
10 
11 #include <deal.II/fe/fe_dgq.h>
12 #include <deal.II/fe/fe_dgp.h>
13 #include <deal.II/fe/fe_system.h>
14 #include <deal.II/fe/mapping_fe_field.h>
15 #include <deal.II/fe/fe_q.h>
16 
17 #include <deal.II/dofs/dof_handler.h>
18 
19 #include <deal.II/hp/q_collection.h>
20 #include <deal.II/hp/mapping_collection.h>
21 #include <deal.II/hp/fe_values.h>
22 
23 #include <deal.II/lac/vector.h>
24 #include <deal.II/lac/sparsity_pattern.h>
25 #include <deal.II/lac/trilinos_sparse_matrix.h>
26 #include <deal.II/lac/trilinos_vector.h>
27 
28 #include <Epetra_RowMatrixTransposer.h>
29 #include <AztecOO.h>
30 
31 #include "ADTypes.hpp"
32 #include <Sacado.hpp>
33 #include <CoDiPack/include/codi.hpp>
34 
35 #include "parameters/all_parameters.h"
36 #include "parameters/parameters.h"
37 
38 namespace PHiLiP {
39 namespace OPERATOR {
40 
42 
52 template <int dim, int n_faces, typename real>
54 {
55 public:
57  virtual ~OperatorsBase() = default;
58 
61  const int nstate_input,//number of states input
62  const unsigned int max_degree_input,//max poly degree for operators
63  const unsigned int grid_degree_input);//max grid degree for operators
64 
66  const unsigned int max_degree;
68  const unsigned int max_grid_degree;
70  const int nstate;
71 
72 protected:
74  unsigned int max_grid_degree_check;
75 
76 public:
77 
79  dealii::FullMatrix<double> tensor_product(
80  const dealii::FullMatrix<double> &basis_x,
81  const dealii::FullMatrix<double> &basis_y,
82  const dealii::FullMatrix<double> &basis_z);
83 
85 
91  dealii::FullMatrix<double> tensor_product_state(
92  const int nstate,
93  const dealii::FullMatrix<double> &basis_x,
94  const dealii::FullMatrix<double> &basis_y,
95  const dealii::FullMatrix<double> &basis_z);
96 
98  double compute_factorial(double n);
99 
101  virtual void matrix_vector_mult(
102  const std::vector<real> &input_vect,
103  std::vector<real> &output_vect,
104  const dealii::FullMatrix<double> &basis_x,
105  const dealii::FullMatrix<double> &basis_y,
106  const dealii::FullMatrix<double> &basis_z,
107  const bool adding = false,
108  const double factor = 1.0) = 0;
110  virtual void inner_product(
111  const std::vector<real> &input_vect,
112  const std::vector<real> &weight_vect,
113  std::vector<real> &output_vect,
114  const dealii::FullMatrix<double> &basis_x,
115  const dealii::FullMatrix<double> &basis_y,
116  const dealii::FullMatrix<double> &basis_z,
117  const bool adding = false,
118  const double factor = 1.0) = 0;
119 protected:
120 
121  const MPI_Comm mpi_communicator;
122  dealii::ConditionalOStream pcout;
123 };//End of OperatorsBase
124 
126 /* All dim-sized operators are constructed by their one dimensional equivalent, and we use
127 * sum factorization to perform their operations.
128 * Note that we assume tensor product elements in this operators class.
129 */
130 template<int dim, int n_faces, typename real>
131 class SumFactorizedOperators : public OperatorsBase<dim,n_faces,real>
132 {
133 public:
136  const int nstate_input,
137  const unsigned int max_degree_input,
138  const unsigned int grid_degree_input);
139 
141 
147  void matrix_vector_mult(
148  const std::vector<real> &input_vect,
149  std::vector<real> &output_vect,
150  const dealii::FullMatrix<double> &basis_x,
151  const dealii::FullMatrix<double> &basis_y,
152  const dealii::FullMatrix<double> &basis_z,
153  const bool adding = false,
154  const double factor = 1.0) override;
156 
166  void divergence_matrix_vector_mult(
167  const dealii::Tensor<1,dim,std::vector<real>> &input_vect,
168  std::vector<real> &output_vect,
169  const dealii::FullMatrix<double> &basis_x,
170  const dealii::FullMatrix<double> &basis_y,
171  const dealii::FullMatrix<double> &basis_z,
172  const dealii::FullMatrix<double> &gradient_basis_x,
173  const dealii::FullMatrix<double> &gradient_basis_y,
174  const dealii::FullMatrix<double> &gradient_basis_z);
175 
177  void divergence_matrix_vector_mult_1D(
178  const dealii::Tensor<1,dim,std::vector<real>> &input_vect,
179  std::vector<real> &output_vect,
180  const dealii::FullMatrix<double> &basis,
181  const dealii::FullMatrix<double> &gradient_basis);
182 
184  void gradient_matrix_vector_mult(
185  const std::vector<real> &input_vect,
186  dealii::Tensor<1,dim,std::vector<real>> &output_vect,
187  const dealii::FullMatrix<double> &basis_x,
188  const dealii::FullMatrix<double> &basis_y,
189  const dealii::FullMatrix<double> &basis_z,
190  const dealii::FullMatrix<double> &gradient_basis_x,
191  const dealii::FullMatrix<double> &gradient_basis_y,
192  const dealii::FullMatrix<double> &gradient_basis_z);
194  void gradient_matrix_vector_mult_1D(
195  const std::vector<real> &input_vect,
196  dealii::Tensor<1,dim,std::vector<real>> &output_vect,
197  const dealii::FullMatrix<double> &basis,
198  const dealii::FullMatrix<double> &gradient_basis);
199 
201 
203  void inner_product(
204  const std::vector<real> &input_vect,
205  const std::vector<real> &weight_vect,
206  std::vector<real> &output_vect,
207  const dealii::FullMatrix<double> &basis_x,
208  const dealii::FullMatrix<double> &basis_y,
209  const dealii::FullMatrix<double> &basis_z,
210  const bool adding = false,
211  const double factor = 1.0) override;
212 
213 
215 
219  void divergence_two_pt_flux_Hadamard_product(
220  const dealii::Tensor<1,dim,dealii::FullMatrix<real>> &input_mat,
221  std::vector<real> &output_vect,
222  const std::vector<real> &weights,
223  const dealii::FullMatrix<double> &basis,
224  const double scaling = 2.0);//the only direction that isn't identity
225 
226 
228  void surface_two_pt_flux_Hadamard_product(
229  const dealii::FullMatrix<real> &input_mat,
230  std::vector<real> &output_vect_vol,
231  std::vector<real> &output_vect_surf,
232  const std::vector<real> &weights,
233  const std::array<dealii::FullMatrix<double>,2> &surf_basis,
234  const unsigned int iface,
235  const unsigned int dim_not_zero,
236  const double scaling = 2.0);
237 
239 
248  void two_pt_flux_Hadamard_product(
249  const dealii::FullMatrix<real> &input_mat,
250  dealii::FullMatrix<real> &output_mat,
251  const dealii::FullMatrix<double> &basis,//the only direction that isn't identity
252  const std::vector<real> &weights,//vector storing diagonal entries for case not identity
253  const int direction);//direction for the derivative that corresponds to basis
254 
255 
257  void sum_factorized_Hadamard_sparsity_pattern(
258  const unsigned int rows_size,
259  const unsigned int columns_size,
260  std::vector<std::array<unsigned int,dim>> &rows,//vector of non-zero row indices
261  std::vector<std::array<unsigned int,dim>> &columns);//vector of non-zero column indices
262 
264  void sum_factorized_Hadamard_basis_assembly(
265  const unsigned int rows_size_1D,
266  const unsigned int columns_size_1D,
267  const std::vector<std::array<unsigned int,dim>> &rows,//vector of non-zero row indices
268  const std::vector<std::array<unsigned int,dim>> &columns,//vector of non-zero column indices
269  const dealii::FullMatrix<double> &basis,//1D dense basis
270  const std::vector<double> &weights,//Diagonal weights
271  std::array<dealii::FullMatrix<double>,dim> &basis_sparse);//Sparse basis
272 
274  void sum_factorized_Hadamard_surface_sparsity_pattern(
275  const unsigned int rows_size,
276  const unsigned int columns_size,
277  std::vector<unsigned int> &rows,//vector of non-zero row indices
278  std::vector<unsigned int> &columns,//vector of non-zero column indices
279  const int dim_not_zero);//ref direction face is on
280 
282  void sum_factorized_Hadamard_surface_basis_assembly(
283  const unsigned int rows_size,
284  const unsigned int columns_size_1D,
285  const std::vector<unsigned int> &rows,//vector of non-zero row indices
286  const std::vector<unsigned int> &columns,//vector of non-zero column indices
287  const dealii::FullMatrix<double> &basis,//1D dense basis
288  const std::vector<double> &weights,//Diagonal weights
289  dealii::FullMatrix<double> &basis_sparse,//Sparse basis
290  const int dim_not_zero);//ref direction face is on
291 
293 
296  void matrix_vector_mult_1D(
297  const std::vector<real> &input_vect,
298  std::vector<real> &output_vect,
299  const dealii::FullMatrix<double> &basis_x,
300  const bool adding = false,
301  const double factor = 1.0);
302 
304  /* This is for the case where the operator of size dim is the dyadic product of
305  * the same 1D operator in each direction
306  */
307  void inner_product_1D(
308  const std::vector<real> &input_vect,
309  const std::vector<real> &weight_vect,
310  std::vector<real> &output_vect,
311  const dealii::FullMatrix<double> &basis_x,
312  const bool adding = false,
313  const double factor = 1.0);
314 
316 
322  void matrix_vector_mult_surface_1D(
323  const unsigned int face_number,
324  const std::vector<real> &input_vect,
325  std::vector<real> &output_vect,
326  const std::array<dealii::FullMatrix<double>,2> &basis_surf,//only 2 faces in 1D
327  const dealii::FullMatrix<double> &basis_vol,
328  const bool adding = false,
329  const double factor = 1.0);
330 
332  void inner_product_surface_1D(
333  const unsigned int face_number,
334  const std::vector<real> &input_vect,
335  const std::vector<real> &weight_vect,
336  std::vector<real> &output_vect,
337  const std::array<dealii::FullMatrix<double>,2> &basis_surf,//only 2 faces in 1D
338  const dealii::FullMatrix<double> &basis_vol,
339  const bool adding = false,
340  const double factor = 1.0);
341 
342 
344 
347  void Hadamard_product(
348  const dealii::FullMatrix<real> &input_mat1,
349  const dealii::FullMatrix<real> &input_mat2,
350  dealii::FullMatrix<real> &output_mat);
351 
352 //protected:
353 public:
355  dealii::FullMatrix<double> oneD_vol_operator;
356 
358 
360  std::array<dealii::FullMatrix<double>,2> oneD_surf_operator;
361 
363  dealii::FullMatrix<double> oneD_grad_operator;
364 
366  std::array<dealii::FullMatrix<double>,2> oneD_surf_grad_operator;
367 
368 };//End of SumFactorizedOperators Class
369 
370 /************************************************************************
371 *
372 * VOLUME OPERATORS
373 *
374 ************************************************************************/
375 
377 /* This class stores the basis functions evaluated at volume and facet
378 * cubature nodes, as well as it's gradient in REFERENCE space.
379 */
380 template<int dim, int n_faces, typename real>
381 class basis_functions : public SumFactorizedOperators<dim,n_faces,real>
382 {
383 public:
386  const int nstate_input,
387  const unsigned int max_degree_input,
388  const unsigned int grid_degree_input);
389 
391  unsigned int current_degree;
392 
394  void build_1D_volume_operator(
395  const dealii::FESystem<1,1> &finite_element,
396  const dealii::Quadrature<1> &quadrature);
397 
399  void build_1D_gradient_operator(
400  const dealii::FESystem<1,1> &finite_element,
401  const dealii::Quadrature<1> &quadrature);
402 
404  void build_1D_surface_operator(
405  const dealii::FESystem<1,1> &finite_element,
406  const dealii::Quadrature<0> &quadrature);
407 
409  void build_1D_surface_gradient_operator(
410  const dealii::FESystem<1,1> &finite_element,
411  const dealii::Quadrature<0> &quadrature);
412 };
413 
415 template<int dim, int n_faces, typename real>
416 class vol_integral_basis : public SumFactorizedOperators<dim,n_faces,real>
417 {
418 public:
421  const int nstate_input,
422  const unsigned int max_degree_input,
423  const unsigned int grid_degree_input);
424 
426  unsigned int current_degree;
427 
429  void build_1D_volume_operator(
430  const dealii::FESystem<1,1> &finite_element,
431  const dealii::Quadrature<1> &quadrature);
432 };
433 
435 template<int dim, int n_faces, typename real>
436 class local_mass : public SumFactorizedOperators<dim,n_faces,real>
437 {
438 public:
440  local_mass (
441  const int nstate_input,
442  const unsigned int max_degree_input,
443  const unsigned int grid_degree_input);
444 
446  unsigned int current_degree;
447 
449  void build_1D_volume_operator(
450  const dealii::FESystem<1,1> &finite_element,
451  const dealii::Quadrature<1> &quadrature); //override;
452 
454 
457  dealii::FullMatrix<double> build_dim_mass_matrix(
458  const int nstate,
459  const unsigned int n_dofs, const unsigned int n_quad_pts,
461  const std::vector<double> &det_Jac,
462  const std::vector<double> &quad_weights);
463 };
464 
466 
471 template<int dim, int n_faces, typename real>
472 class local_basis_stiffness : public SumFactorizedOperators<dim,n_faces,real>
473 {
474 public:
477  const int nstate_input,
478  const unsigned int max_degree_input,
479  const unsigned int grid_degree_input,
480  const bool store_skew_symmetric_form_input = false);
481 
483  unsigned int current_degree;
484 
487 
489  void build_1D_volume_operator(
490  const dealii::FESystem<1,1> &finite_element,
491  const dealii::Quadrature<1> &quadrature);
492 
494  dealii::FullMatrix<double> oneD_skew_symm_vol_oper;
495 };
496 
498 template<int dim, int n_faces, typename real>
500 {
501 public:
504  const int nstate_input,
505  const unsigned int max_degree_input,
506  const unsigned int grid_degree_input);
507 
509  unsigned int current_degree;
510 
512  void build_1D_volume_operator(
513  const dealii::FESystem<1,1> &finite_element,
514  const dealii::Quadrature<1> &quadrature);
515 };
516 
518 template<int dim, int n_faces, typename real>
519 class derivative_p : public SumFactorizedOperators<dim,n_faces,real>
520 {
521 public:
523  derivative_p (
524  const int nstate_input,
525  const unsigned int max_degree_input,
526  const unsigned int grid_degree_input);
527 
529  unsigned int current_degree;
530 
532  void build_1D_volume_operator(
533  const dealii::FESystem<1,1> &finite_element,
534  const dealii::Quadrature<1> &quadrature);
535 };
536 
538 template<int dim, int n_faces, typename real>
540 {
541 public:
544  const int nstate_input,
545  const unsigned int max_degree_input,
546  const unsigned int grid_degree_input,
548 
550  unsigned int current_degree;
551 
554 
556  double FR_param;
557 
559  /* This parameter recovers Huynh, Hung T. "A flux reconstruction approach to high-order schemes including discontinuous Galerkin methods." 18th AIAA computational fluid dynamics conference. 2007.
560  */
561  void get_Huynh_g2_parameter (
562  const unsigned int curr_cell_degree,
563  double &c);
564 
566 
568  void get_spectral_difference_parameter (
569  const unsigned int curr_cell_degree,
570  double &c);
571 
573 
575  void get_c_negative_FR_parameter (
576  const unsigned int curr_cell_degree,
577  double &c);
578 
580 
583  void get_c_negative_divided_by_two_FR_parameter (
584  const unsigned int curr_cell_degree,
585  double &c);
586 
588 
592  void get_c_plus_parameter (
593  const unsigned int curr_cell_degree,
594  double &c);
595 
597 
604  void get_FR_correction_parameter (
605  const unsigned int curr_cell_degree,
606  double &c);
607 
609 
612  void build_local_Flux_Reconstruction_operator(
613  const dealii::FullMatrix<double> &local_Mass_Matrix,
614  const dealii::FullMatrix<double> &pth_derivative,
615  const unsigned int n_dofs,
616  const double c,
617  dealii::FullMatrix<double> &Flux_Reconstruction_operator);
618 
620  void build_1D_volume_operator(
621  const dealii::FESystem<1,1> &finite_element,
622  const dealii::Quadrature<1> &quadrature);
623 
625 
630  dealii::FullMatrix<double> build_dim_Flux_Reconstruction_operator(
631  const dealii::FullMatrix<double> &local_Mass_Matrix,
632  const int nstate,
633  const unsigned int n_dofs);
634 
636 
642  dealii::FullMatrix<double> build_dim_Flux_Reconstruction_operator_directly(
643  const int nstate,
644  const unsigned int n_dofs,
645  dealii::FullMatrix<double> &pth_deriv,
646  dealii::FullMatrix<double> &mass_matrix);
647 };
648 
650 
654 template<int dim, int n_faces, typename real>
656 {
657 public:
660  const int nstate_input,
661  const unsigned int max_degree_input,
662  const unsigned int grid_degree_input,
663  const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_aux_input);
664 
666  unsigned int current_degree;
667 
670 
672  double FR_param_aux;
673 
675 
682  void get_FR_aux_correction_parameter (
683  const unsigned int curr_cell_degree,
684  double &k);
685 
687  void build_1D_volume_operator(
688  const dealii::FESystem<1,1> &finite_element,
689  const dealii::Quadrature<1> &quadrature);
690 };
691 
693 template<int dim, int n_faces, typename real>
694 class vol_projection_operator : public SumFactorizedOperators<dim,n_faces,real>
695 {
696 public:
699  const int nstate_input,
700  const unsigned int max_degree_input,
701  const unsigned int grid_degree_input);
702 
704  unsigned int current_degree;
705 
707  void compute_local_vol_projection_operator(
708  const dealii::FullMatrix<double> &norm_matrix_inverse,
709  const dealii::FullMatrix<double> &integral_vol_basis,
710  dealii::FullMatrix<double> &volume_projection);
711 
713  void build_1D_volume_operator(
714  const dealii::FESystem<1,1> &finite_element,
715  const dealii::Quadrature<1> &quadrature);
716 };
717 
719 template<int dim, int n_faces, typename real>
720 class vol_projection_operator_FR : public vol_projection_operator<dim,n_faces,real>
721 {
722 public:
725  const int nstate_input,
726  const unsigned int max_degree_input,
727  const unsigned int grid_degree_input,
729  const bool store_transpose_input = false);
730 
732  unsigned int current_degree;
733 
736 
739 
741  void build_1D_volume_operator(
742  const dealii::FESystem<1,1> &finite_element,
743  const dealii::Quadrature<1> &quadrature);
744 
746  dealii::FullMatrix<double> oneD_transpose_vol_operator;
747 };
748 
750 template<int dim, int n_faces, typename real>
752 {
753 public:
756  const int nstate_input,
757  const unsigned int max_degree_input,
758  const unsigned int grid_degree_input,
760  const bool store_transpose_input = false);
761 
763  unsigned int current_degree;
764 
767 
770 
772  void build_1D_volume_operator(
773  const dealii::FESystem<1,1> &finite_element,
774  const dealii::Quadrature<1> &quadrature);
775 
777  dealii::FullMatrix<double> oneD_transpose_vol_operator;
778 };
779 
781 template<int dim, int n_faces, typename real>
782 class FR_mass_inv : public SumFactorizedOperators<dim,n_faces,real>
783 {
784 public:
786  FR_mass_inv (
787  const int nstate_input,
788  const unsigned int max_degree_input,
789  const unsigned int grid_degree_input,
791 
793  unsigned int current_degree;
794 
797 
799  void build_1D_volume_operator(
800  const dealii::FESystem<1,1> &finite_element,
801  const dealii::Quadrature<1> &quadrature);
802 };
804 template<int dim, int n_faces, typename real>
805 class FR_mass_inv_aux : public SumFactorizedOperators<dim,n_faces,real>
806 {
807 public:
810  const int nstate_input,
811  const unsigned int max_degree_input,
812  const unsigned int grid_degree_input,
814 
816  unsigned int current_degree;
817 
820 
822  void build_1D_volume_operator(
823  const dealii::FESystem<1,1> &finite_element,
824  const dealii::Quadrature<1> &quadrature);
825 };
827 template<int dim, int n_faces, typename real>
828 class FR_mass : public SumFactorizedOperators<dim,n_faces,real>
829 {
830 public:
832  FR_mass (
833  const int nstate_input,
834  const unsigned int max_degree_input,
835  const unsigned int grid_degree_input,
837 
839  unsigned int current_degree;
840 
843 
845  void build_1D_volume_operator(
846  const dealii::FESystem<1,1> &finite_element,
847  const dealii::Quadrature<1> &quadrature);
848 };
849 
851 template<int dim, int n_faces, typename real>
852 class FR_mass_aux : public SumFactorizedOperators<dim,n_faces,real>
853 {
854 public:
856  FR_mass_aux (
857  const int nstate_input,
858  const unsigned int max_degree_input,
859  const unsigned int grid_degree_input,
861 
863  unsigned int current_degree;
864 
867 
869  void build_1D_volume_operator(
870  const dealii::FESystem<1,1> &finite_element,
871  const dealii::Quadrature<1> &quadrature);
872 };
873 
875 
882 template <int dim, int n_faces, typename real>
883 class vol_integral_gradient_basis : public SumFactorizedOperators<dim,n_faces,real>
884 {
885 public:
888  const int nstate_input,
889  const unsigned int max_degree_input,
890  const unsigned int grid_degree_input);
891 
893  unsigned int current_degree;
894 
896  void build_1D_gradient_operator(
897  const dealii::FESystem<1,1> &finite_element,
898  const dealii::Quadrature<1> &quadrature);
899 };
900 
901 /************************************************************************
902 *
903 * SURFACE OPERATORS
904 *
905 ************************************************************************/
906 
907 
909 
915 template<int dim, int n_faces, typename real>
916 class face_integral_basis : public SumFactorizedOperators<dim,n_faces,real>
917 {
918 public:
921  const int nstate_input,
922  const unsigned int max_degree_input,
923  const unsigned int grid_degree_input);
924 
926  unsigned int current_degree;
927 
929  void build_1D_surface_operator(
930  const dealii::FESystem<1,1> &finite_element,
931  const dealii::Quadrature<0> &face_quadrature);
932 };
933 
935 
940 template<int dim, int n_faces, typename real>
941 class lifting_operator : public SumFactorizedOperators<dim,n_faces,real>
942 {
943 public:
946  const int nstate_input,
947  const unsigned int max_degree_input,
948  const unsigned int grid_degree_input);
949 
951  unsigned int current_degree;
952 
954  void build_local_surface_lifting_operator (
955  const unsigned int n_dofs,
956  const dealii::FullMatrix<double> &norm_matrix,
957  const dealii::FullMatrix<double> &face_integral,
958  dealii::FullMatrix<double> &lifting);
959 
961 
963  void build_1D_volume_operator(
964  const dealii::FESystem<1,1> &finite_element,
965  const dealii::Quadrature<1> &face_quadrature);
966 
968  void build_1D_surface_operator(
969  const dealii::FESystem<1,1> &finite_element,
970  const dealii::Quadrature<0> &face_quadrature);
971 };
972 
974 
981 template<int dim, int n_faces, typename real>
982 class lifting_operator_FR : public lifting_operator<dim,n_faces,real>
983 {
984 public:
987  const int nstate_input,
988  const unsigned int max_degree_input,
989  const unsigned int grid_degree_input,
991 
993  unsigned int current_degree;
994 
997 
999 
1001  void build_1D_volume_operator(
1002  const dealii::FESystem<1,1> &finite_element,
1003  const dealii::Quadrature<1> &face_quadrature);
1004 
1006  void build_1D_surface_operator(
1007  const dealii::FESystem<1,1> &finite_element,
1008  const dealii::Quadrature<0> &face_quadrature);
1009 };
1010 
1011 
1012 /************************************************************************
1013 *
1014 * METRIC MAPPING OPERATORS
1015 *
1016 ************************************************************************/
1017 
1018 
1020 
1025 template<int dim, int n_faces, typename real>
1026 class mapping_shape_functions: public SumFactorizedOperators<dim,n_faces,real>
1027 {
1028 public:
1031  const int nstate_input,
1032  const unsigned int max_degree_input,
1033  const unsigned int grid_degree_input);
1034 
1036  unsigned int current_degree;
1037 
1039  unsigned int current_grid_degree;
1040 
1043 
1046 
1048 
1055  void build_1D_shape_functions_at_grid_nodes(
1056  const dealii::FESystem<1,1> &finite_element,
1057  const dealii::Quadrature<1> &quadrature);
1058 
1060 
1063  void build_1D_shape_functions_at_flux_nodes(
1064  const dealii::FESystem<1,1> &finite_element,
1065  const dealii::Quadrature<1> &quadrature,
1066  const dealii::Quadrature<0> &face_quadrature);
1067 
1069 
1073  void build_1D_shape_functions_at_volume_flux_nodes(
1074  const dealii::FESystem<1,1> &finite_element,
1075  const dealii::Quadrature<1> &quadrature);
1076 
1077 };
1078 
1079 /*****************************************************************************
1080 *
1081 * METRIC OPERTAORS TO BE CALLED ON-THE-FLY
1082 *
1083 *****************************************************************************/
1085 template <typename real, int dim, int n_faces>
1086 class metric_operators: public SumFactorizedOperators<dim,n_faces,real>
1087 {
1088 public:
1091  const int nstate_input,
1092  const unsigned int max_degree_input,
1093  const unsigned int grid_degree_input,
1094  const bool store_vol_flux_nodes_input = false,
1095  const bool store_surf_flux_nodes_input = false,
1096  const bool store_Jacobian_input = false);
1097 
1099  const bool store_Jacobian;
1100 
1103 
1106 
1108  void transform_physical_to_reference(
1109  const dealii::Tensor<1,dim,real> &phys,
1110  const dealii::Tensor<2,dim,real> &metric_cofactor,
1111  dealii::Tensor<1,dim,real> &ref);
1112 
1114  void transform_reference_to_physical(
1115  const dealii::Tensor<1,dim,real> &ref,
1116  const dealii::Tensor<2,dim,real> &metric_cofactor,
1117  dealii::Tensor<1,dim,real> &phys);
1118 
1120  void transform_physical_to_reference_vector(
1121  const dealii::Tensor<1,dim,std::vector<real>> &phys,
1122  const dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
1123  dealii::Tensor<1,dim,std::vector<real>> &ref);
1124 
1126  void transform_reference_unit_normal_to_physical_unit_normal(
1127  const unsigned int n_quad_pts,
1128  const dealii::Tensor<1,dim,real> &ref,
1129  const dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
1130  std::vector<dealii::Tensor<1,dim,real>> &phys);
1131 
1133  void build_determinant_volume_metric_Jacobian(
1134  const unsigned int n_quad_pts,//number volume quad pts
1135  const unsigned int n_metric_dofs,//dofs of metric basis. NOTE: this is the number of mapping support points
1136  const std::array<std::vector<real>,dim> &mapping_support_points,
1138 
1140 
1144  void build_volume_metric_operators(
1145  const unsigned int n_quad_pts,//number volume quad pts
1146  const unsigned int n_metric_dofs,//dofs of metric basis. NOTE: this is the number of mapping support points
1147  const std::array<std::vector<real>,dim> &mapping_support_points,
1149  const bool use_invariant_curl_form = false);
1150 
1152 
1156  void build_facet_metric_operators(
1157  const unsigned int iface,
1158  const unsigned int n_quad_pts,//number facet quad pts
1159  const unsigned int n_metric_dofs,//dofs of metric basis. NOTE: this is the number of mapping support points
1160  const std::array<std::vector<real>,dim> &mapping_support_points,
1162  const bool use_invariant_curl_form = false);
1163 
1165  dealii::Tensor<2,dim,std::vector<real>> metric_cofactor_vol;
1166 
1168  dealii::Tensor<2,dim,std::vector<real>> metric_cofactor_surf;
1169 
1171  std::vector<real> det_Jac_vol;
1172 
1174  std::vector<real> det_Jac_surf;
1175 
1177  dealii::Tensor<2,dim,std::vector<real>> metric_Jacobian_vol_cubature;
1178 
1180  dealii::Tensor<1,dim,std::vector<real>> flux_nodes_vol;
1181 
1183  std::array<dealii::Tensor<1,dim,std::vector<real>>,n_faces> flux_nodes_surf;
1184 
1185 protected:
1186 
1188 
1191  void build_metric_Jacobian(
1192  const unsigned int n_quad_pts,//the dim sized n_quad_pts, NOT the 1D
1193  const std::array<std::vector<real>,dim> &mapping_support_points,
1194  const dealii::FullMatrix<double> &basis_x_flux_nodes,
1195  const dealii::FullMatrix<double> &basis_y_flux_nodes,
1196  const dealii::FullMatrix<double> &basis_z_flux_nodes,
1197  const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
1198  const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
1199  const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
1200  std::vector<dealii::Tensor<2,dim,real>> &local_Jac);
1201 
1203 
1208  void build_determinant_metric_Jacobian(
1209  const unsigned int n_quad_pts,//number volume quad pts
1210  const std::array<std::vector<real>,dim> &mapping_support_points,
1211  const dealii::FullMatrix<double> &basis_x_flux_nodes,
1212  const dealii::FullMatrix<double> &basis_y_flux_nodes,
1213  const dealii::FullMatrix<double> &basis_z_flux_nodes,
1214  const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
1215  const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
1216  const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
1217  std::vector<real> &det_metric_Jac);
1218 
1220  void build_local_metric_cofactor_matrix(
1221  const unsigned int n_quad_pts,//number volume quad pts
1222  const unsigned int n_metric_dofs,//dofs of metric basis. NOTE: this is the number of mapping support points
1223  const std::array<std::vector<real>,dim> &mapping_support_points,
1224  const dealii::FullMatrix<double> &basis_x_grid_nodes,
1225  const dealii::FullMatrix<double> &basis_y_grid_nodes,
1226  const dealii::FullMatrix<double> &basis_z_grid_nodes,
1227  const dealii::FullMatrix<double> &basis_x_flux_nodes,
1228  const dealii::FullMatrix<double> &basis_y_flux_nodes,
1229  const dealii::FullMatrix<double> &basis_z_flux_nodes,
1230  const dealii::FullMatrix<double> &grad_basis_x_grid_nodes,
1231  const dealii::FullMatrix<double> &grad_basis_y_grid_nodes,
1232  const dealii::FullMatrix<double> &grad_basis_z_grid_nodes,
1233  const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
1234  const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
1235  const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
1236  dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
1237  const bool use_invariant_curl_form = false);
1238 
1240 
1261  void compute_local_3D_cofactor(
1262  const unsigned int n_metric_dofs,
1263  const unsigned int n_quad_pts,
1264  const std::array<std::vector<real>,dim> &mapping_support_points,
1265  const dealii::FullMatrix<double> &basis_x_grid_nodes,
1266  const dealii::FullMatrix<double> &basis_y_grid_nodes,
1267  const dealii::FullMatrix<double> &basis_z_grid_nodes,
1268  const dealii::FullMatrix<double> &basis_x_flux_nodes,
1269  const dealii::FullMatrix<double> &basis_y_flux_nodes,
1270  const dealii::FullMatrix<double> &basis_z_flux_nodes,
1271  const dealii::FullMatrix<double> &grad_basis_x_grid_nodes,
1272  const dealii::FullMatrix<double> &grad_basis_y_grid_nodes,
1273  const dealii::FullMatrix<double> &grad_basis_z_grid_nodes,
1274  const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
1275  const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
1276  const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
1277  dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
1278  const bool use_invariant_curl_form = false);
1279 };
1280 
1281 /************************************************************
1282 *
1283 * SUMFACTORIZED STATE
1284 *
1285 ************************************************************/
1286 
1288 
1291 template <int dim, int nstate, int n_faces, typename real>
1292 class SumFactorizedOperatorsState : public SumFactorizedOperators<dim,n_faces,real>
1293 {
1294 public:
1297  const unsigned int max_degree_input,
1298  const unsigned int grid_degree_input);
1299 
1301  std::array<dealii::FullMatrix<double>,nstate> oneD_vol_state_operator;
1302 
1304  std::array<std::array<dealii::FullMatrix<double>,2>,nstate> oneD_surf_state_operator;
1305 
1307  std::array<dealii::FullMatrix<double>,nstate> oneD_grad_state_operator;
1308 
1310  std::array<std::array<dealii::FullMatrix<double>,2>,nstate> oneD_surf_grad_state_operator;
1311 
1312 };//end of OperatorsBaseState Class
1313 
1315 template <int dim, int nstate, int n_faces, typename real>
1316 class basis_functions_state : public SumFactorizedOperatorsState<dim,nstate,n_faces,real>
1317 {
1318 public:
1321  const unsigned int max_degree_input,
1322  const unsigned int grid_degree_input);
1323 
1325  unsigned int current_degree;
1326 
1328  void build_1D_volume_state_operator(
1329  const dealii::FESystem<1,1> &finite_element,
1330  const dealii::Quadrature<1> &quadrature);
1331 
1333  void build_1D_gradient_state_operator(
1334  const dealii::FESystem<1,1> &finite_element,
1335  const dealii::Quadrature<1> &quadrature);
1336 
1338  void build_1D_surface_state_operator(
1339  const dealii::FESystem<1,1> &finite_element,
1340  const dealii::Quadrature<0> &face_quadrature);
1341 };
1342 
1344 
1347 template <int dim, int nstate, int n_faces, typename real>
1348 class flux_basis_functions_state : public SumFactorizedOperatorsState<dim,nstate,n_faces,real>
1349 {
1350 public:
1353  const unsigned int max_degree_input,
1354  const unsigned int grid_degree_input);
1355 
1357  unsigned int current_degree;
1358 
1360  virtual void build_1D_volume_state_operator(
1361  const dealii::FESystem<1,1> &finite_element,
1362  const dealii::Quadrature<1> &quadrature);
1363 
1365  void build_1D_gradient_state_operator(
1366  const dealii::FESystem<1,1> &finite_element,
1367  const dealii::Quadrature<1> &quadrature);
1368 
1370  void build_1D_surface_state_operator(
1371  const dealii::FESystem<1,1> &finite_element,
1372  const dealii::Quadrature<0> &face_quadrature);
1373 };
1374 
1376 
1382 template <int dim, int nstate, int n_faces, typename real>
1383 class local_flux_basis_stiffness : public flux_basis_functions_state<dim,nstate,n_faces,real>
1384 {
1385 public:
1388  const unsigned int max_degree_input,
1389  const unsigned int grid_degree_input);
1390 
1392  unsigned int current_degree;
1393 
1395  void build_1D_volume_state_operator(
1396  const dealii::FESystem<1,1> &finite_element,//pass the finite element of the TEST FUNCTION
1397  const dealii::Quadrature<1> &quadrature);
1398 };
1399 
1400 }
1401 }
1402 
1403 #endif
1404 
The FLUX basis functions separated by nstate with n shape functions.
Definition: operators.h:1348
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:732
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:1325
basis_functions< dim, n_faces, real > mapping_shape_functions_grid_nodes
Object of mapping shape functions evaluated at grid nodes.
Definition: operators.h:1042
dealii::Tensor< 2, dim, std::vector< real > > metric_cofactor_vol
The volume metric cofactor matrix.
Definition: operators.h:1165
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:738
std::array< dealii::FullMatrix< double >, 2 > oneD_surf_operator
Stores the one dimensional surface operator.
Definition: operators.h:360
The metric independent inverse of the FR mass matrix .
Definition: operators.h:782
bool store_transpose
Flag is store transpose operator.
Definition: operators.h:735
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:426
virtual void inner_product(const std::vector< real > &input_vect, const std::vector< real > &weight_vect, std::vector< real > &output_vect, const dealii::FullMatrix< double > &basis_x, const dealii::FullMatrix< double > &basis_y, const dealii::FullMatrix< double > &basis_z, const bool adding=false, const double factor=1.0)=0
virtual function to be defined.
The integration of gradient of solution basis.
Definition: operators.h:883
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:816
const MPI_Comm mpi_communicator
MPI communicator.
Definition: operators.h:121
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:550
Sum Factorization derived class.
Definition: operators.h:131
virtual ~OperatorsBase()=default
Destructor.
unsigned int current_grid_degree
Stores the degree of the current grid degree.
Definition: operators.h:1039
const unsigned int max_grid_degree
Max grid degree.
Definition: operators.h:68
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:863
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:769
dealii::FullMatrix< double > oneD_grad_operator
Stores the one dimensional gradient operator.
Definition: operators.h:363
dealii::ConditionalOStream pcout
Parallel std::cout that only outputs on mpi_rank==0.
Definition: operators.h:122
dealii::FullMatrix< double > tensor_product(const dealii::FullMatrix< double > &basis_x, const dealii::FullMatrix< double > &basis_y, const dealii::FullMatrix< double > &basis_z)
Returns the tensor product of matrices passed.
Definition: operators.cpp:55
The metric independent FR mass matrix for auxiliary equation .
Definition: operators.h:852
dealii::FullMatrix< double > tensor_product_state(const int nstate, const dealii::FullMatrix< double > &basis_x, const dealii::FullMatrix< double > &basis_y, const dealii::FullMatrix< double > &basis_z)
Returns the tensor product of matrices passed, but makes it sparse diagonal by state.
Definition: operators.cpp:106
bool store_transpose
Flag is store transpose operator.
Definition: operators.h:766
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:819
const int nstate
Number of states.
Definition: operators.h:70
double compute_factorial(double n)
Standard function to compute factorial of a number.
Definition: operators.cpp:173
Projection operator corresponding to basis functions onto -norm for auxiliary equation.
Definition: operators.h:751
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:893
Files for the baseline physics.
Definition: ADTypes.hpp:10
double FR_param_aux
Flux reconstruction paramater value.
Definition: operators.h:672
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:1036
const unsigned int max_degree
Max polynomial degree.
Definition: operators.h:66
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:926
std::array< dealii::FullMatrix< double >, 2 > oneD_surf_grad_operator
Stores the one dimensional surface gradient operator.
Definition: operators.h:366
dealii::Tensor< 2, dim, std::vector< real > > metric_cofactor_surf
The facet metric cofactor matrix, for ONE face.
Definition: operators.h:1168
dealii::FullMatrix< double > oneD_transpose_vol_operator
Stores the transpose of the operator for fast weight-adjusted solves.
Definition: operators.h:777
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:993
In order to have all state operators be arrays of array, we template by dim, type, nstate, and number of faces.
Definition: operators.h:1292
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:951
Flux_Reconstruction
Type of correction in Flux Reconstruction.
dealii::FullMatrix< double > oneD_skew_symm_vol_oper
Skew-symmetric volume operator .
Definition: operators.h:494
const bool store_Jacobian
Flag if store metric Jacobian at flux nodes.
Definition: operators.h:1099
-th order modal derivative of basis fuctions, ie/
Definition: operators.h:519
That is Quadrature Weights multiplies with basis_at_vol_cubature.
Definition: operators.h:416
const bool store_surf_flux_nodes
Flag if store metric Jacobian at flux nodes.
Definition: operators.h:1105
This is the solution basis , the modal differential opertaor commonly seen in DG defined as ...
Definition: operators.h:499
ESFR correction matrix without jac dependence.
Definition: operators.h:539
std::vector< real > det_Jac_vol
The determinant of the metric Jacobian at volume cubature nodes.
Definition: operators.h:1171
Local mass matrix without jacobian dependence.
Definition: operators.h:436
The DG lifting operator is defined as the operator that lifts inner products of polynomials of some o...
Definition: operators.h:941
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:391
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:763
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:1392
dealii::FullMatrix< double > oneD_transpose_vol_operator
Stores the transpose of the operator for fast weight-adjusted solves.
Definition: operators.h:746
dealii::Tensor< 2, dim, std::vector< real > > metric_Jacobian_vol_cubature
Stores the metric Jacobian at flux nodes.
Definition: operators.h:1177
The ESFR lifting operator.
Definition: operators.h:982
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:866
double FR_param
Flux reconstruction paramater value.
Definition: operators.h:556
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:666
Base metric operators class that stores functions used in both the volume and on surface.
Definition: operators.h:1086
unsigned int max_grid_degree_check
Check to see if the metrics used are a higher order then the initialized grid.
Definition: operators.h:74
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:842
ESFR correction matrix for AUX EQUATION without jac dependence.
Definition: operators.h:655
The mapping shape functions evaluated at the desired nodes (facet set included in volume grid nodes f...
Definition: operators.h:1026
const bool store_vol_flux_nodes
Flag if store metric Jacobian at flux nodes.
Definition: operators.h:1102
OperatorsBase(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
Definition: operators.cpp:42
The basis functions separated by nstate with n shape functions.
Definition: operators.h:1316
std::array< dealii::FullMatrix< double >, nstate > oneD_vol_state_operator
Stores the one dimensional volume operator.
Definition: operators.h:1301
The metric independent FR mass matrix .
Definition: operators.h:828
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:553
std::array< std::array< dealii::FullMatrix< double >, 2 >, nstate > oneD_surf_grad_state_operator
Stores the one dimensional surface gradient operator.
Definition: operators.h:1310
dealii::FullMatrix< double > oneD_vol_operator
Stores the one dimensional volume operator.
Definition: operators.h:355
Flux_Reconstruction_Aux
Type of correction in Flux Reconstruction for the auxiliary variables.
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:793
std::vector< real > det_Jac_surf
The determinant of the metric Jacobian at facet cubature nodes.
Definition: operators.h:1174
basis_functions< dim, n_faces, real > mapping_shape_functions_flux_nodes
Object of mapping shape functions evaluated at flux nodes.
Definition: operators.h:1045
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:704
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_aux_type
Flux reconstruction parameter type.
Definition: operators.h:669
The metric independent inverse of the FR mass matrix for auxiliary equation .
Definition: operators.h:805
std::array< std::array< dealii::FullMatrix< double >, 2 >, nstate > oneD_surf_state_operator
Stores the one dimensional surface operator.
Definition: operators.h:1304
Projection operator corresponding to basis functions onto -norm.
Definition: operators.h:720
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:446
const bool store_skew_symmetric_form
Flag to store the skew symmetric form .
Definition: operators.h:486
std::array< dealii::Tensor< 1, dim, std::vector< real > >, n_faces > flux_nodes_surf
Stores the physical facet flux nodes.
Definition: operators.h:1183
"Stiffness" operator used in DG Strong form.
Definition: operators.h:1383
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:996
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:839
std::array< dealii::FullMatrix< double >, nstate > oneD_grad_state_operator
Stores the one dimensional gradient operator.
Definition: operators.h:1307
Operator base class.
Definition: operators.h:53
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:509
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:796
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:1357
dealii::Tensor< 1, dim, std::vector< real > > flux_nodes_vol
Stores the physical volume flux nodes.
Definition: operators.h:1180
The surface integral of test functions.
Definition: operators.h:916
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:529
Projection operator corresponding to basis functions onto M-norm (L2).
Definition: operators.h:694
Local stiffness matrix without jacobian dependence.
Definition: operators.h:472
virtual void matrix_vector_mult(const std::vector< real > &input_vect, std::vector< real > &output_vect, const dealii::FullMatrix< double > &basis_x, const dealii::FullMatrix< double > &basis_y, const dealii::FullMatrix< double > &basis_z, const bool adding=false, const double factor=1.0)=0
virtual function to be defined.
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:483