[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>
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 
100 protected:
101 
102  const MPI_Comm mpi_communicator;
103  dealii::ConditionalOStream pcout;
104 };//End of OperatorsBase
105 
107 /* All dim-sized operators are constructed by their one dimensional equivalent, and we use
108 * sum factorization to perform their operations.
109 * Note that we assume tensor product elements in this operators class.
110 */
111 template<int dim, int n_faces>
112 class SumFactorizedOperators : public OperatorsBase<dim,n_faces>
113 {
114 public:
117  const int nstate_input,
118  const unsigned int max_degree_input,
119  const unsigned int grid_degree_input);
120 
122 
128  template <typename real>
129  void matrix_vector_mult(
130  const std::vector<real> &input_vect,
131  std::vector<real> &output_vect,
132  const dealii::FullMatrix<double> &basis_x,
133  const dealii::FullMatrix<double> &basis_y,
134  const dealii::FullMatrix<double> &basis_z,
135  const bool adding = false,
136  const double factor = 1.0);
138 
148  template <typename real>
149  void divergence_matrix_vector_mult(
150  const dealii::Tensor<1,dim,std::vector<real>> &input_vect,
151  std::vector<real> &output_vect,
152  const dealii::FullMatrix<double> &basis_x,
153  const dealii::FullMatrix<double> &basis_y,
154  const dealii::FullMatrix<double> &basis_z,
155  const dealii::FullMatrix<double> &gradient_basis_x,
156  const dealii::FullMatrix<double> &gradient_basis_y,
157  const dealii::FullMatrix<double> &gradient_basis_z);
158 
160  template <typename real>
161  void divergence_matrix_vector_mult_1D(
162  const dealii::Tensor<1,dim,std::vector<real>> &input_vect,
163  std::vector<real> &output_vect,
164  const dealii::FullMatrix<double> &basis,
165  const dealii::FullMatrix<double> &gradient_basis);
166 
168  template <typename real>
169  void gradient_matrix_vector_mult(
170  const std::vector<real> &input_vect,
171  dealii::Tensor<1,dim,std::vector<real>> &output_vect,
172  const dealii::FullMatrix<double> &basis_x,
173  const dealii::FullMatrix<double> &basis_y,
174  const dealii::FullMatrix<double> &basis_z,
175  const dealii::FullMatrix<double> &gradient_basis_x,
176  const dealii::FullMatrix<double> &gradient_basis_y,
177  const dealii::FullMatrix<double> &gradient_basis_z);
179  template <typename real>
180  void gradient_matrix_vector_mult_1D(
181  const std::vector<real> &input_vect,
182  dealii::Tensor<1,dim,std::vector<real>> &output_vect,
183  const dealii::FullMatrix<double> &basis,
184  const dealii::FullMatrix<double> &gradient_basis);
185 
187 
189  template <typename real>
190  void inner_product(
191  const std::vector<real> &input_vect,
192  const std::vector<double> &weight_vect,
193  std::vector<real> &output_vect,
194  const dealii::FullMatrix<double> &basis_x,
195  const dealii::FullMatrix<double> &basis_y,
196  const dealii::FullMatrix<double> &basis_z,
197  const bool adding = false,
198  const double factor = 1.0);
199 
200 
202 
206  void divergence_two_pt_flux_Hadamard_product(
207  const dealii::Tensor<1,dim,dealii::FullMatrix<double>> &input_mat,
208  std::vector<double> &output_vect,
209  const std::vector<double> &weights,
210  const dealii::FullMatrix<double> &basis,
211  const double scaling = 2.0);//the only direction that isn't identity
212 
213 
215  void surface_two_pt_flux_Hadamard_product(
216  const dealii::FullMatrix<double> &input_mat,
217  std::vector<double> &output_vect_vol,
218  std::vector<double> &output_vect_surf,
219  const std::vector<double> &weights,
220  const std::array<dealii::FullMatrix<double>,2> &surf_basis,
221  const unsigned int iface,
222  const unsigned int dim_not_zero,
223  const double scaling = 2.0);
224 
226 
235  void two_pt_flux_Hadamard_product(
236  const dealii::FullMatrix<double> &input_mat,
237  dealii::FullMatrix<double> &output_mat,
238  const dealii::FullMatrix<double> &basis,//the only direction that isn't identity
239  const std::vector<double> &weights,//vector storing diagonal entries for case not identity
240  const int direction);//direction for the derivative that corresponds to basis
241 
242 
244  void sum_factorized_Hadamard_sparsity_pattern(
245  const unsigned int rows_size,
246  const unsigned int columns_size,
247  std::vector<std::array<unsigned int,dim>> &rows,//vector of non-zero row indices
248  std::vector<std::array<unsigned int,dim>> &columns);//vector of non-zero column indices
249 
251  void sum_factorized_Hadamard_basis_assembly(
252  const unsigned int rows_size_1D,
253  const unsigned int columns_size_1D,
254  const std::vector<std::array<unsigned int,dim>> &rows,//vector of non-zero row indices
255  const std::vector<std::array<unsigned int,dim>> &columns,//vector of non-zero column indices
256  const dealii::FullMatrix<double> &basis,//1D dense basis
257  const std::vector<double> &weights,//Diagonal weights
258  std::array<dealii::FullMatrix<double>,dim> &basis_sparse);//Sparse basis
259 
261  void sum_factorized_Hadamard_surface_sparsity_pattern(
262  const unsigned int rows_size,
263  const unsigned int columns_size,
264  std::vector<unsigned int> &rows,//vector of non-zero row indices
265  std::vector<unsigned int> &columns,//vector of non-zero column indices
266  const int dim_not_zero);//ref direction face is on
267 
269  void sum_factorized_Hadamard_surface_basis_assembly(
270  const unsigned int rows_size,
271  const unsigned int columns_size_1D,
272  const std::vector<unsigned int> &rows,//vector of non-zero row indices
273  const std::vector<unsigned int> &columns,//vector of non-zero column indices
274  const dealii::FullMatrix<double> &basis,//1D dense basis
275  const std::vector<double> &weights,//Diagonal weights
276  dealii::FullMatrix<double> &basis_sparse,//Sparse basis
277  const int dim_not_zero);//ref direction face is on
278 
280 
283  template <typename real>
284  void matrix_vector_mult_1D(
285  const std::vector<real> &input_vect,
286  std::vector<real> &output_vect,
287  const dealii::FullMatrix<double> &basis_x,
288  const bool adding = false,
289  const double factor = 1.0);
290 
292  /* This is for the case where the operator of size dim is the dyadic product of
293  * the same 1D operator in each direction
294  */
295  template <typename real>
296  void inner_product_1D(
297  const std::vector<real> &input_vect,
298  const std::vector<double> &weight_vect,
299  std::vector<real> &output_vect,
300  const dealii::FullMatrix<double> &basis_x,
301  const bool adding = false,
302  const double factor = 1.0);
303 
305 
311  template <typename real>
312  void matrix_vector_mult_surface_1D(
313  const std::vector<bool> face_orientation,
314  const unsigned int face_number,
315  const std::vector<real> &input_vect,
316  std::vector<real> &output_vect,
317  const std::array<dealii::FullMatrix<double>,2> &basis_surf,//only 2 faces in 1D
318  const dealii::FullMatrix<double> &basis_vol,
319  const bool adding = false,
320  const double factor = 1.0);
321 
323  template <typename real>
324  void inner_product_surface_1D(
325  const std::vector<bool> face_orientation,
326  const unsigned int face_number,
327  const std::vector<real> &input_vect,
328  const std::vector<double> &weight_vect,
329  std::vector<real> &output_vect,
330  const std::array<dealii::FullMatrix<double>,2> &basis_surf,//only 2 faces in 1D
331  const dealii::FullMatrix<double> &basis_vol,
332  const bool adding = false,
333  const double factor = 1.0);
334 
336 
341  template <typename real>
342  void face_orientation_tensor_product(
343  const std::vector<bool> face_orientation,
344  const unsigned int face_number,
345  std::vector<real> &output_vect,
346  const dealii::FullMatrix<double> &basis);
347 
348  template <typename real>
349  void face_orientation_inner_product(
350  const std::vector<bool> face_orientation,
351  const unsigned int face_number,
352  const std::vector<real> &input_vect,
353  std::vector<real> &output_vect,
354  const dealii::FullMatrix<double> &basis);
355 
357 
360  void Hadamard_product(
361  const dealii::FullMatrix<double> &input_mat1,
362  const dealii::FullMatrix<double> &input_mat2,
363  dealii::FullMatrix<double> &output_mat);
364 
366 
371  template <typename real>
372  void Hadamard_product_AD_vector(
373  const dealii::FullMatrix<double> &input_mat1,
374  const std::vector<real> &input_mat2,
375  std::vector<real> &output_mat);
376 
377 //protected:
378 public:
380  dealii::FullMatrix<double> oneD_vol_operator;
381 
383 
385  std::array<dealii::FullMatrix<double>,2> oneD_surf_operator;
386 
388  dealii::FullMatrix<double> oneD_grad_operator;
389 
391  std::array<dealii::FullMatrix<double>,2> oneD_surf_grad_operator;
392 
393 };//End of SumFactorizedOperators Class
394 
395 /************************************************************************
396 *
397 * VOLUME OPERATORS
398 *
399 ************************************************************************/
400 
402 /* This class stores the basis functions evaluated at volume and facet
403 * cubature nodes, as well as it's gradient in REFERENCE space.
404 */
405 template<int dim, int n_faces>
406 class basis_functions : public SumFactorizedOperators<dim,n_faces>
407 {
408 public:
411  const int nstate_input,
412  const unsigned int max_degree_input,
413  const unsigned int grid_degree_input);
414 
416  unsigned int current_degree;
417 
419  void build_1D_volume_operator(
420  const dealii::FESystem<1,1> &finite_element,
421  const dealii::Quadrature<1> &quadrature);
422 
424  void build_1D_gradient_operator(
425  const dealii::FESystem<1,1> &finite_element,
426  const dealii::Quadrature<1> &quadrature);
427 
429  void build_1D_surface_operator(
430  const dealii::FESystem<1,1> &finite_element,
431  const dealii::Quadrature<0> &quadrature);
432 
434  void build_1D_surface_gradient_operator(
435  const dealii::FESystem<1,1> &finite_element,
436  const dealii::Quadrature<0> &quadrature);
437 };
438 
440 template<int dim, int n_faces>
441 class vol_integral_basis : public SumFactorizedOperators<dim,n_faces>
442 {
443 public:
446  const int nstate_input,
447  const unsigned int max_degree_input,
448  const unsigned int grid_degree_input);
449 
451  unsigned int current_degree;
452 
454  void build_1D_volume_operator(
455  const dealii::FESystem<1,1> &finite_element,
456  const dealii::Quadrature<1> &quadrature);
457 };
458 
460 template<int dim, int n_faces>
461 class local_mass : public SumFactorizedOperators<dim,n_faces>
462 {
463 public:
465  local_mass (
466  const int nstate_input,
467  const unsigned int max_degree_input,
468  const unsigned int grid_degree_input);
469 
471  unsigned int current_degree;
472 
474  void build_1D_volume_operator(
475  const dealii::FESystem<1,1> &finite_element,
476  const dealii::Quadrature<1> &quadrature); //override;
477 
479 
482  dealii::FullMatrix<double> build_dim_mass_matrix(
483  const int nstate,
484  const unsigned int n_dofs, const unsigned int n_quad_pts,
486  const std::vector<double> &det_Jac,
487  const std::vector<double> &quad_weights);
488 };
489 
491 
496 template<int dim, int n_faces>
498 {
499 public:
502  const int nstate_input,
503  const unsigned int max_degree_input,
504  const unsigned int grid_degree_input,
505  const bool store_skew_symmetric_form_input = false);
506 
508  unsigned int current_degree;
509 
512 
514  void build_1D_volume_operator(
515  const dealii::FESystem<1,1> &finite_element,
516  const dealii::Quadrature<1> &quadrature);
517 
519  dealii::FullMatrix<double> oneD_skew_symm_vol_oper;
520 };
521 
523 template<int dim, int n_faces>
525 {
526 public:
529  const int nstate_input,
530  const unsigned int max_degree_input,
531  const unsigned int grid_degree_input);
532 
534  unsigned int current_degree;
535 
537  void build_1D_volume_operator(
538  const dealii::FESystem<1,1> &finite_element,
539  const dealii::Quadrature<1> &quadrature);
540 };
541 
543 template<int dim, int n_faces>
544 class derivative_p : public SumFactorizedOperators<dim,n_faces>
545 {
546 public:
548  derivative_p (
549  const int nstate_input,
550  const unsigned int max_degree_input,
551  const unsigned int grid_degree_input);
552 
554  unsigned int current_degree;
555 
557  void build_1D_volume_operator(
558  const dealii::FESystem<1,1> &finite_element,
559  const dealii::Quadrature<1> &quadrature);
560 };
561 
563 template<int dim, int n_faces>
565 {
566 public:
569  const int nstate_input,
570  const unsigned int max_degree_input,
571  const unsigned int grid_degree_input,
573  const double FR_user_specified_correction_parameter_value_input=0.0);
574 
577 
580 
582  unsigned int current_degree;
583 
585  double FR_param;
586 
588  /* 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.
589  */
590  void get_Huynh_g2_parameter (
591  const unsigned int curr_cell_degree,
592  double &c);
593 
595 
597  void get_spectral_difference_parameter (
598  const unsigned int curr_cell_degree,
599  double &c);
600 
602 
604  void get_c_negative_FR_parameter (
605  const unsigned int curr_cell_degree,
606  double &c);
607 
609 
612  void get_c_negative_divided_by_two_FR_parameter (
613  const unsigned int curr_cell_degree,
614  double &c);
615 
617 
621  void get_c_plus_parameter (
622  const unsigned int curr_cell_degree,
623  double &c);
624 
626 
633  void get_FR_correction_parameter (
634  const unsigned int curr_cell_degree,
635  double &c);
636 
638 
641  void build_local_Flux_Reconstruction_operator(
642  const dealii::FullMatrix<double> &local_Mass_Matrix,
643  const dealii::FullMatrix<double> &pth_derivative,
644  const unsigned int n_dofs,
645  const double c,
646  dealii::FullMatrix<double> &Flux_Reconstruction_operator);
647 
649  void build_1D_volume_operator(
650  const dealii::FESystem<1,1> &finite_element,
651  const dealii::Quadrature<1> &quadrature);
652 
654 
659  dealii::FullMatrix<double> build_dim_Flux_Reconstruction_operator(
660  const dealii::FullMatrix<double> &local_Mass_Matrix,
661  const int nstate,
662  const unsigned int n_dofs);
663 
665 
671  dealii::FullMatrix<double> build_dim_Flux_Reconstruction_operator_directly(
672  const int nstate,
673  const unsigned int n_dofs,
674  dealii::FullMatrix<double> &pth_deriv,
675  dealii::FullMatrix<double> &mass_matrix);
676 };
677 
679 
683 template<int dim, int n_faces>
685 {
686 public:
689  const int nstate_input,
690  const unsigned int max_degree_input,
691  const unsigned int grid_degree_input,
692  const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_aux_input);
693 
695  unsigned int current_degree;
696 
699 
701  double FR_param_aux;
702 
704 
711  void get_FR_aux_correction_parameter (
712  const unsigned int curr_cell_degree,
713  double &k);
714 
716  void build_1D_volume_operator(
717  const dealii::FESystem<1,1> &finite_element,
718  const dealii::Quadrature<1> &quadrature);
719 };
720 
722 template<int dim, int n_faces>
724 {
725 public:
728  const int nstate_input,
729  const unsigned int max_degree_input,
730  const unsigned int grid_degree_input);
731 
733  unsigned int current_degree;
734 
736  void compute_local_vol_projection_operator(
737  const dealii::FullMatrix<double> &norm_matrix_inverse,
738  const dealii::FullMatrix<double> &integral_vol_basis,
739  dealii::FullMatrix<double> &volume_projection);
740 
742  void build_1D_volume_operator(
743  const dealii::FESystem<1,1> &finite_element,
744  const dealii::Quadrature<1> &quadrature);
745 };
746 
748 template<int dim, int n_faces>
750 {
751 public:
754  const int nstate_input,
755  const unsigned int max_degree_input,
756  const unsigned int grid_degree_input,
758  const double FR_user_specified_correction_parameter_value_input=0.0,
759  const bool store_transpose_input = false);
760 
763 
766 
769 
771  unsigned int current_degree;
772 
774  void build_1D_volume_operator(
775  const dealii::FESystem<1,1> &finite_element,
776  const dealii::Quadrature<1> &quadrature);
777 
779  dealii::FullMatrix<double> oneD_transpose_vol_operator;
780 };
781 
783 template<int dim, int n_faces>
785 {
786 public:
789  const int nstate_input,
790  const unsigned int max_degree_input,
791  const unsigned int grid_degree_input,
793  const bool store_transpose_input = false);
794 
796  unsigned int current_degree;
797 
800 
803 
805  void build_1D_volume_operator(
806  const dealii::FESystem<1,1> &finite_element,
807  const dealii::Quadrature<1> &quadrature);
808 
810  dealii::FullMatrix<double> oneD_transpose_vol_operator;
811 };
812 
814 template<int dim, int n_faces>
815 class FR_mass_inv : public SumFactorizedOperators<dim,n_faces>
816 {
817 public:
819  FR_mass_inv (
820  const int nstate_input,
821  const unsigned int max_degree_input,
822  const unsigned int grid_degree_input,
824  const double FR_user_specified_correction_parameter_value_input=0.0);
825 
827  unsigned int current_degree;
828 
831 
834 
836  void build_1D_volume_operator(
837  const dealii::FESystem<1,1> &finite_element,
838  const dealii::Quadrature<1> &quadrature);
839 };
841 template<int dim, int n_faces>
842 class FR_mass_inv_aux : public SumFactorizedOperators<dim,n_faces>
843 {
844 public:
847  const int nstate_input,
848  const unsigned int max_degree_input,
849  const unsigned int grid_degree_input,
851 
853  unsigned int current_degree;
854 
857 
859  void build_1D_volume_operator(
860  const dealii::FESystem<1,1> &finite_element,
861  const dealii::Quadrature<1> &quadrature);
862 };
864 template<int dim, int n_faces>
865 class FR_mass : public SumFactorizedOperators<dim,n_faces>
866 {
867 public:
869  FR_mass (
870  const int nstate_input,
871  const unsigned int max_degree_input,
872  const unsigned int grid_degree_input,
874  const double FR_user_specified_correction_parameter_value_input=0.0);
875 
877  unsigned int current_degree;
878 
881 
884 
886  void build_1D_volume_operator(
887  const dealii::FESystem<1,1> &finite_element,
888  const dealii::Quadrature<1> &quadrature);
889 };
890 
892 template<int dim, int n_faces>
893 class FR_mass_aux : public SumFactorizedOperators<dim,n_faces>
894 {
895 public:
897  FR_mass_aux (
898  const int nstate_input,
899  const unsigned int max_degree_input,
900  const unsigned int grid_degree_input,
902 
904  unsigned int current_degree;
905 
908 
910  void build_1D_volume_operator(
911  const dealii::FESystem<1,1> &finite_element,
912  const dealii::Quadrature<1> &quadrature);
913 };
914 
916 
923 template <int dim, int n_faces>
925 {
926 public:
929  const int nstate_input,
930  const unsigned int max_degree_input,
931  const unsigned int grid_degree_input);
932 
934  unsigned int current_degree;
935 
937  void build_1D_gradient_operator(
938  const dealii::FESystem<1,1> &finite_element,
939  const dealii::Quadrature<1> &quadrature);
940 };
941 
942 /************************************************************************
943 *
944 * SURFACE OPERATORS
945 *
946 ************************************************************************/
947 
948 
950 
956 template<int dim, int n_faces>
957 class face_integral_basis : public SumFactorizedOperators<dim,n_faces>
958 {
959 public:
962  const int nstate_input,
963  const unsigned int max_degree_input,
964  const unsigned int grid_degree_input);
965 
967  unsigned int current_degree;
968 
970  void build_1D_surface_operator(
971  const dealii::FESystem<1,1> &finite_element,
972  const dealii::Quadrature<0> &face_quadrature);
973 };
974 
976 
981 template<int dim, int n_faces>
982 class lifting_operator : public SumFactorizedOperators<dim,n_faces>
983 {
984 public:
987  const int nstate_input,
988  const unsigned int max_degree_input,
989  const unsigned int grid_degree_input);
990 
992  unsigned int current_degree;
993 
995  void build_local_surface_lifting_operator (
996  const unsigned int n_dofs,
997  const dealii::FullMatrix<double> &norm_matrix,
998  const dealii::FullMatrix<double> &face_integral,
999  dealii::FullMatrix<double> &lifting);
1000 
1002 
1004  void build_1D_volume_operator(
1005  const dealii::FESystem<1,1> &finite_element,
1006  const dealii::Quadrature<1> &face_quadrature);
1007 
1009  void build_1D_surface_operator(
1010  const dealii::FESystem<1,1> &finite_element,
1011  const dealii::Quadrature<0> &face_quadrature);
1012 };
1013 
1015 
1022 template<int dim, int n_faces>
1023 class lifting_operator_FR : public lifting_operator<dim,n_faces>
1024 {
1025 public:
1028  const int nstate_input,
1029  const unsigned int max_degree_input,
1030  const unsigned int grid_degree_input,
1032  const double FR_user_specified_correction_parameter_value_input=0.0);
1033 
1035  unsigned int current_degree;
1036 
1039 
1042 
1044 
1046  void build_1D_volume_operator(
1047  const dealii::FESystem<1,1> &finite_element,
1048  const dealii::Quadrature<1> &face_quadrature);
1049 
1051  void build_1D_surface_operator(
1052  const dealii::FESystem<1,1> &finite_element,
1053  const dealii::Quadrature<0> &face_quadrature);
1054 };
1055 
1056 
1057 /************************************************************************
1058 *
1059 * METRIC MAPPING OPERATORS
1060 *
1061 ************************************************************************/
1062 
1063 
1065 
1070 template<int dim, int n_faces>
1072 {
1073 public:
1076  const int nstate_input,
1077  const unsigned int max_degree_input,
1078  const unsigned int grid_degree_input);
1079 
1081  unsigned int current_degree;
1082 
1084  unsigned int current_grid_degree;
1085 
1088 
1091 
1093 
1100  void build_1D_shape_functions_at_grid_nodes(
1101  const dealii::FESystem<1,1> &finite_element,
1102  const dealii::Quadrature<1> &quadrature);
1103 
1105 
1108  void build_1D_shape_functions_at_flux_nodes(
1109  const dealii::FESystem<1,1> &finite_element,
1110  const dealii::Quadrature<1> &quadrature,
1111  const dealii::Quadrature<0> &face_quadrature);
1112 
1114 
1118  void build_1D_shape_functions_at_volume_flux_nodes(
1119  const dealii::FESystem<1,1> &finite_element,
1120  const dealii::Quadrature<1> &quadrature);
1121 
1122 };
1123 
1124 /*****************************************************************************
1125 *
1126 * METRIC OPERATORS TO BE CALLED ON-THE-FLY
1127 *
1128 *****************************************************************************/
1130 template <typename real, int dim, int n_faces>
1131 class metric_operators: public SumFactorizedOperators<dim,n_faces>
1132 {
1133 public:
1136  const int nstate_input,
1137  const unsigned int max_degree_input,
1138  const unsigned int grid_degree_input,
1139  const bool store_vol_flux_nodes_input = false,
1140  const bool store_surf_flux_nodes_input = false,
1141  const bool store_Jacobian_input = false);
1142 
1144  const bool store_Jacobian;
1145 
1148 
1151 
1153  void transform_physical_to_reference(
1154  const dealii::Tensor<1,dim,real> &phys,
1155  const dealii::Tensor<2,dim,real> &metric_cofactor,
1156  dealii::Tensor<1,dim,real> &ref);
1157 
1159  void transform_reference_to_physical(
1160  const dealii::Tensor<1,dim,real> &ref,
1161  const dealii::Tensor<2,dim,real> &metric_cofactor,
1162  dealii::Tensor<1,dim,real> &phys);
1163 
1165  void transform_physical_to_reference_vector(
1166  const dealii::Tensor<1,dim,std::vector<real>> &phys,
1167  const dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
1168  dealii::Tensor<1,dim,std::vector<real>> &ref);
1169 
1171  void transform_reference_unit_normal_to_physical_unit_normal(
1172  const unsigned int n_quad_pts,
1173  const dealii::Tensor<1,dim,real> &ref,
1174  const dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
1175  std::vector<dealii::Tensor<1,dim,real>> &phys);
1176 
1178  void build_determinant_volume_metric_Jacobian(
1179  const unsigned int n_quad_pts,//number volume quad pts
1180  const unsigned int n_metric_dofs,//dofs of metric basis. NOTE: this is the number of mapping support points
1181  const std::array<std::vector<real>,dim> &mapping_support_points,
1182  mapping_shape_functions<dim,n_faces> &mapping_basis);
1183 
1185 
1189  void build_volume_metric_operators(
1190  const unsigned int n_quad_pts,//number volume quad pts
1191  const unsigned int n_metric_dofs,//dofs of metric basis. NOTE: this is the number of mapping support points
1192  const std::array<std::vector<real>,dim> &mapping_support_points,
1193  mapping_shape_functions<dim,n_faces> &mapping_basis,
1194  const bool use_invariant_curl_form = false);
1195 
1197 
1201  void build_facet_metric_operators(
1202  const unsigned int iface,
1203  const unsigned int n_quad_pts,//number facet quad pts
1204  const unsigned int n_metric_dofs,//dofs of metric basis. NOTE: this is the number of mapping support points
1205  const std::array<std::vector<real>,dim> &mapping_support_points,
1206  mapping_shape_functions<dim,n_faces> &mapping_basis,
1207  const bool use_invariant_curl_form = false);
1208 
1210  dealii::Tensor<2,dim,std::vector<real>> metric_cofactor_vol;
1211 
1213  dealii::Tensor<2,dim,std::vector<real>> metric_cofactor_surf;
1214 
1216  std::vector<real> det_Jac_vol;
1217 
1219  std::vector<real> det_Jac_surf;
1220 
1222  dealii::Tensor<2,dim,std::vector<real>> metric_Jacobian_vol_cubature;
1223 
1225  dealii::Tensor<1,dim,std::vector<real>> flux_nodes_vol;
1226 
1228  std::array<dealii::Tensor<1,dim,std::vector<real>>,n_faces> flux_nodes_surf;
1229 
1230 protected:
1231 
1233 
1236  void build_metric_Jacobian(
1237  const unsigned int n_quad_pts,//the dim sized n_quad_pts, NOT the 1D
1238  const std::array<std::vector<real>,dim> &mapping_support_points,
1239  const dealii::FullMatrix<double> &basis_x_flux_nodes,
1240  const dealii::FullMatrix<double> &basis_y_flux_nodes,
1241  const dealii::FullMatrix<double> &basis_z_flux_nodes,
1242  const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
1243  const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
1244  const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
1245  std::vector<dealii::Tensor<2,dim,real>> &local_Jac);
1246 
1248 
1253  void build_determinant_metric_Jacobian(
1254  const unsigned int n_quad_pts,//number volume quad pts
1255  const std::array<std::vector<real>,dim> &mapping_support_points,
1256  const dealii::FullMatrix<double> &basis_x_flux_nodes,
1257  const dealii::FullMatrix<double> &basis_y_flux_nodes,
1258  const dealii::FullMatrix<double> &basis_z_flux_nodes,
1259  const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
1260  const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
1261  const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
1262  std::vector<real> &det_metric_Jac);
1263 
1265  void build_local_metric_cofactor_matrix(
1266  const unsigned int n_quad_pts,//number volume quad pts
1267  const unsigned int n_metric_dofs,//dofs of metric basis. NOTE: this is the number of mapping support points
1268  const std::array<std::vector<real>,dim> &mapping_support_points,
1269  const dealii::FullMatrix<double> &basis_x_grid_nodes,
1270  const dealii::FullMatrix<double> &basis_y_grid_nodes,
1271  const dealii::FullMatrix<double> &basis_z_grid_nodes,
1272  const dealii::FullMatrix<double> &basis_x_flux_nodes,
1273  const dealii::FullMatrix<double> &basis_y_flux_nodes,
1274  const dealii::FullMatrix<double> &basis_z_flux_nodes,
1275  const dealii::FullMatrix<double> &grad_basis_x_grid_nodes,
1276  const dealii::FullMatrix<double> &grad_basis_y_grid_nodes,
1277  const dealii::FullMatrix<double> &grad_basis_z_grid_nodes,
1278  const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
1279  const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
1280  const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
1281  dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
1282  const bool use_invariant_curl_form = false);
1283 
1285 
1306  void compute_local_3D_cofactor(
1307  const unsigned int n_metric_dofs,
1308  const unsigned int n_quad_pts,
1309  const std::array<std::vector<real>,dim> &mapping_support_points,
1310  const dealii::FullMatrix<double> &basis_x_grid_nodes,
1311  const dealii::FullMatrix<double> &basis_y_grid_nodes,
1312  const dealii::FullMatrix<double> &basis_z_grid_nodes,
1313  const dealii::FullMatrix<double> &basis_x_flux_nodes,
1314  const dealii::FullMatrix<double> &basis_y_flux_nodes,
1315  const dealii::FullMatrix<double> &basis_z_flux_nodes,
1316  const dealii::FullMatrix<double> &grad_basis_x_grid_nodes,
1317  const dealii::FullMatrix<double> &grad_basis_y_grid_nodes,
1318  const dealii::FullMatrix<double> &grad_basis_z_grid_nodes,
1319  const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
1320  const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
1321  const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
1322  dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
1323  const bool use_invariant_curl_form = false);
1324 };
1325 
1326 /************************************************************
1327 *
1328 * SUMFACTORIZED STATE
1329 *
1330 ************************************************************/
1331 
1333 
1336 template <int dim, int nstate, int n_faces>
1338 {
1339 public:
1342  const unsigned int max_degree_input,
1343  const unsigned int grid_degree_input);
1344 
1346  std::array<dealii::FullMatrix<double>,nstate> oneD_vol_state_operator;
1347 
1349  std::array<std::array<dealii::FullMatrix<double>,2>,nstate> oneD_surf_state_operator;
1350 
1352  std::array<dealii::FullMatrix<double>,nstate> oneD_grad_state_operator;
1353 
1355  std::array<std::array<dealii::FullMatrix<double>,2>,nstate> oneD_surf_grad_state_operator;
1356 
1357 };//end of OperatorsBaseState Class
1358 
1360 template <int dim, int nstate, int n_faces>
1361 class basis_functions_state : public SumFactorizedOperatorsState<dim,nstate,n_faces>
1362 {
1363 public:
1366  const unsigned int max_degree_input,
1367  const unsigned int grid_degree_input);
1368 
1370  unsigned int current_degree;
1371 
1373  void build_1D_volume_state_operator(
1374  const dealii::FESystem<1,1> &finite_element,
1375  const dealii::Quadrature<1> &quadrature);
1376 
1378  void build_1D_gradient_state_operator(
1379  const dealii::FESystem<1,1> &finite_element,
1380  const dealii::Quadrature<1> &quadrature);
1381 
1383  void build_1D_surface_state_operator(
1384  const dealii::FESystem<1,1> &finite_element,
1385  const dealii::Quadrature<0> &face_quadrature);
1386 };
1387 
1389 
1392 template <int dim, int nstate, int n_faces>
1394 {
1395 public:
1398  const unsigned int max_degree_input,
1399  const unsigned int grid_degree_input);
1400 
1402  unsigned int current_degree;
1403 
1405  virtual void build_1D_volume_state_operator(
1406  const dealii::FESystem<1,1> &finite_element,
1407  const dealii::Quadrature<1> &quadrature);
1408 
1410  void build_1D_gradient_state_operator(
1411  const dealii::FESystem<1,1> &finite_element,
1412  const dealii::Quadrature<1> &quadrature);
1413 
1415  void build_1D_surface_state_operator(
1416  const dealii::FESystem<1,1> &finite_element,
1417  const dealii::Quadrature<0> &face_quadrature);
1418 };
1419 
1421 
1427 template <int dim, int nstate, int n_faces>
1428 class local_flux_basis_stiffness : public flux_basis_functions_state<dim,nstate,n_faces>
1429 {
1430 public:
1433  const unsigned int max_degree_input,
1434  const unsigned int grid_degree_input);
1435 
1437  unsigned int current_degree;
1438 
1440  void build_1D_volume_state_operator(
1441  const dealii::FESystem<1,1> &finite_element,//pass the finite element of the TEST FUNCTION
1442  const dealii::Quadrature<1> &quadrature);
1443 };
1444 
1445 }
1446 }
1447 
1448 #endif
1449 
bool store_transpose
Flag is store transpose operator.
Definition: operators.h:762
std::array< dealii::FullMatrix< double >, nstate > oneD_vol_state_operator
Stores the one dimensional volume operator.
Definition: operators.h:1346
The FLUX basis functions separated by nstate with n shape functions.
Definition: operators.h:1393
dealii::ConditionalOStream pcout
Parallel std::cout that only outputs on mpi_rank==0.
Definition: operators.h:103
const unsigned int max_degree
Max polynomial degree.
Definition: operators.h:66
dealii::Tensor< 2, dim, std::vector< real > > metric_cofactor_vol
The volume metric cofactor matrix.
Definition: operators.h:1210
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:765
const double FR_user_specified_correction_parameter_value
User specified flux recontruction correction parameter value.
Definition: operators.h:1041
The metric independent inverse of the FR mass matrix .
Definition: operators.h:815
basis_functions< dim, n_faces > mapping_shape_functions_flux_nodes
Object of mapping shape functions evaluated at flux nodes.
Definition: operators.h:1090
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:508
The integration of gradient of solution basis.
Definition: operators.h:924
const bool store_skew_symmetric_form
Flag to store the skew symmetric form .
Definition: operators.h:511
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:853
const int nstate
Number of states.
Definition: operators.h:70
Sum Factorization derived class.
Definition: operators.h:112
double FR_param
Flux reconstruction paramater value.
Definition: operators.h:585
virtual ~OperatorsBase()=default
Destructor.
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:827
The metric independent FR mass matrix for auxiliary equation .
Definition: operators.h:893
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:880
Projection operator corresponding to basis functions onto -norm for auxiliary equation.
Definition: operators.h:784
const double FR_user_specified_correction_parameter_value
User specified flux recontruction correction parameter value.
Definition: operators.h:883
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:733
Files for the baseline physics.
Definition: ADTypes.hpp:10
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:967
dealii::Tensor< 2, dim, std::vector< real > > metric_cofactor_surf
The facet metric cofactor matrix, for ONE face.
Definition: operators.h:1213
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:554
In order to have all state operators be arrays of array, we template by dim, type, nstate, and number of faces.
Definition: operators.h:1337
Flux_Reconstruction
Type of correction in Flux Reconstruction.
const bool store_Jacobian
Flag if store metric Jacobian at flux nodes.
Definition: operators.h:1144
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:1035
-th order modal derivative of basis fuctions, ie/
Definition: operators.h:544
const double FR_user_specified_correction_parameter_value
User specified flux recontruction correction parameter value.
Definition: operators.h:579
std::array< dealii::FullMatrix< double >, 2 > oneD_surf_grad_operator
Stores the one dimensional surface gradient operator.
Definition: operators.h:391
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:1038
That is Quadrature Weights multiplies with basis_at_vol_cubature.
Definition: operators.h:441
const bool store_surf_flux_nodes
Flag if store metric Jacobian at flux nodes.
Definition: operators.h:1150
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:934
basis_functions< dim, n_faces > mapping_shape_functions_grid_nodes
Object of mapping shape functions evaluated at grid nodes.
Definition: operators.h:1087
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:992
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:416
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
double compute_factorial(double n)
Standard function to compute factorial of a number.
Definition: operators.cpp:173
This is the solution basis , the modal differential opertaor commonly seen in DG defined as ...
Definition: operators.h:524
ESFR correction matrix without jac dependence.
Definition: operators.h:564
std::vector< real > det_Jac_vol
The determinant of the metric Jacobian at volume cubature nodes.
Definition: operators.h:1216
Local mass matrix without jacobian dependence.
Definition: operators.h:461
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:856
The DG lifting operator is defined as the operator that lifts inner products of polynomials of some o...
Definition: operators.h:982
bool store_transpose
Flag is store transpose operator.
Definition: operators.h:799
std::array< dealii::FullMatrix< double >, nstate > oneD_grad_state_operator
Stores the one dimensional gradient operator.
Definition: operators.h:1352
const unsigned int max_grid_degree
Max grid degree.
Definition: operators.h:68
std::array< std::array< dealii::FullMatrix< double >, 2 >, nstate > oneD_surf_state_operator
Stores the one dimensional surface operator.
Definition: operators.h:1349
dealii::Tensor< 2, dim, std::vector< real > > metric_Jacobian_vol_cubature
Stores the metric Jacobian at flux nodes.
Definition: operators.h:1222
dealii::FullMatrix< double > oneD_transpose_vol_operator
Stores the transpose of the operator for fast weight-adjusted solves.
Definition: operators.h:779
The ESFR lifting operator.
Definition: operators.h:1023
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:471
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:802
const MPI_Comm mpi_communicator
MPI communicator.
Definition: operators.h:102
Base metric operators class that stores functions used in both the volume and on surface.
Definition: operators.h:1131
ESFR correction matrix for AUX EQUATION without jac dependence.
Definition: operators.h:684
dealii::FullMatrix< double > oneD_vol_operator
Stores the one dimensional volume operator.
Definition: operators.h:380
The mapping shape functions evaluated at the desired nodes (facet set included in volume grid nodes f...
Definition: operators.h:1071
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:771
unsigned int current_grid_degree
Stores the degree of the current grid degree.
Definition: operators.h:1084
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:796
const bool store_vol_flux_nodes
Flag if store metric Jacobian at flux nodes.
Definition: operators.h:1147
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:576
std::array< dealii::FullMatrix< double >, 2 > oneD_surf_operator
Stores the one dimensional surface operator.
Definition: operators.h:385
The basis functions separated by nstate with n shape functions.
Definition: operators.h:1361
std::array< std::array< dealii::FullMatrix< double >, 2 >, nstate > oneD_surf_grad_state_operator
Stores the one dimensional surface gradient operator.
Definition: operators.h:1355
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:451
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:904
The metric independent FR mass matrix .
Definition: operators.h:865
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_aux_type
Flux reconstruction parameter type.
Definition: operators.h:698
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:907
Flux_Reconstruction_Aux
Type of correction in Flux Reconstruction for the auxiliary variables.
dealii::FullMatrix< double > oneD_grad_operator
Stores the one dimensional gradient operator.
Definition: operators.h:388
std::vector< real > det_Jac_surf
The determinant of the metric Jacobian at facet cubature nodes.
Definition: operators.h:1219
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:877
The metric independent inverse of the FR mass matrix for auxiliary equation .
Definition: operators.h:842
Projection operator corresponding to basis functions onto -norm.
Definition: operators.h:749
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:534
dealii::FullMatrix< double > oneD_skew_symm_vol_oper
Skew-symmetric volume operator .
Definition: operators.h:519
std::array< dealii::Tensor< 1, dim, std::vector< real > >, n_faces > flux_nodes_surf
Stores the physical facet flux nodes.
Definition: operators.h:1228
"Stiffness" operator used in DG Strong form.
Definition: operators.h:1428
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:1437
Operator base class.
Definition: operators.h:53
double FR_param_aux
Flux reconstruction paramater value.
Definition: operators.h:701
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
Definition: operators.h:830
const double FR_user_specified_correction_parameter_value
User specified flux recontruction correction parameter value.
Definition: operators.h:833
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
const double FR_user_specified_correction_parameter_value
User specified flux recontruction correction parameter value.
Definition: operators.h:768
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:1081
dealii::Tensor< 1, dim, std::vector< real > > flux_nodes_vol
Stores the physical volume flux nodes.
Definition: operators.h:1225
The surface integral of test functions.
Definition: operators.h:957
Projection operator corresponding to basis functions onto M-norm (L2).
Definition: operators.h:723
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:582
dealii::FullMatrix< double > oneD_transpose_vol_operator
Stores the transpose of the operator for fast weight-adjusted solves.
Definition: operators.h:810
Local stiffness matrix without jacobian dependence.
Definition: operators.h:497
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:1370
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
OperatorsBase(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
Definition: operators.cpp:42
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:1402
unsigned int current_degree
Stores the degree of the current poly degree.
Definition: operators.h:695