1 #include <deal.II/base/conditional_ostream.h> 2 #include <deal.II/base/parameter_handler.h> 4 #include <deal.II/base/qprojector.h> 5 #include <deal.II/base/geometry_info.h> 7 #include <deal.II/grid/tria.h> 9 #include <deal.II/fe/fe_dgq.h> 10 #include <deal.II/fe/fe_dgp.h> 11 #include <deal.II/fe/fe_system.h> 12 #include <deal.II/fe/mapping_fe_field.h> 13 #include <deal.II/fe/mapping_q1_eulerian.h> 16 #include <deal.II/dofs/dof_handler.h> 18 #include <deal.II/hp/q_collection.h> 19 #include <deal.II/hp/mapping_collection.h> 20 #include <deal.II/hp/fe_values.h> 22 #include <deal.II/lac/vector.h> 23 #include <deal.II/lac/sparsity_pattern.h> 24 #include <deal.II/lac/trilinos_sparse_matrix.h> 25 #include <deal.II/lac/trilinos_vector.h> 26 #include <deal.II/lac/identity_matrix.h> 28 #include <Epetra_RowMatrixTransposer.h> 31 #include "ADTypes.hpp" 33 #include <CoDiPack/include/codi.hpp> 35 #include "operators.h" 41 template <
int dim,
int n_faces>
43 const int nstate_input,
44 const unsigned int max_degree_input,
45 const unsigned int grid_degree_input)
46 : max_degree(max_degree_input)
47 , max_grid_degree(grid_degree_input)
48 , nstate(nstate_input)
49 , max_grid_degree_check(grid_degree_input)
50 , mpi_communicator(MPI_COMM_WORLD)
51 , pcout(
std::cout, dealii::Utilities::MPI::this_mpi_process(mpi_communicator)==0)
54 template <
int dim,
int n_faces>
56 const dealii::FullMatrix<double> &basis_x,
57 const dealii::FullMatrix<double> &basis_y,
58 const dealii::FullMatrix<double> &basis_z)
60 const unsigned int rows_x = basis_x.m();
61 const unsigned int columns_x = basis_x.n();
62 const unsigned int rows_y = basis_y.m();
63 const unsigned int columns_y = basis_y.n();
64 const unsigned int rows_z = basis_z.m();
65 const unsigned int columns_z = basis_z.n();
69 if constexpr (dim==2){
70 dealii::FullMatrix<double> tens_prod(rows_x * rows_y, columns_x * columns_y);
71 for(
unsigned int jdof=0; jdof<rows_y; jdof++){
72 for(
unsigned int kdof=0; kdof<rows_x; kdof++){
73 for(
unsigned int ndof=0; ndof<columns_y; ndof++){
74 for(
unsigned int odof=0; odof<columns_x; odof++){
75 const unsigned int index_row = rows_x * jdof + kdof;
76 const unsigned int index_col = columns_x * ndof + odof;
77 tens_prod[index_row][index_col] = basis_x[kdof][odof] * basis_y[jdof][ndof];
84 if constexpr (dim==3){
85 dealii::FullMatrix<double> tens_prod(rows_x * rows_y * rows_z, columns_x * columns_y * columns_z);
86 for(
unsigned int idof=0; idof<rows_z; idof++){
87 for(
unsigned int jdof=0; jdof<rows_y; jdof++){
88 for(
unsigned int kdof=0; kdof<rows_x; kdof++){
89 for(
unsigned int mdof=0; mdof<columns_z; mdof++){
90 for(
unsigned int ndof=0; ndof<columns_y; ndof++){
91 for(
unsigned int odof=0; odof<columns_x; odof++){
92 const unsigned int index_row = rows_x * rows_y * idof + rows_x * jdof + kdof;
93 const unsigned int index_col = columns_x * columns_y * mdof + columns_x * ndof + odof;
94 tens_prod[index_row][index_col] = basis_x[kdof][odof] * basis_y[jdof][ndof] * basis_z[idof][mdof];
105 template <
int dim,
int n_faces>
108 const dealii::FullMatrix<double> &basis_x,
109 const dealii::FullMatrix<double> &basis_y,
110 const dealii::FullMatrix<double> &basis_z)
113 const unsigned int rows_x = basis_x.m();
114 const unsigned int columns_x = basis_x.n();
115 const unsigned int rows_y = basis_y.m();
116 const unsigned int columns_y = basis_y.n();
117 const unsigned int rows_z = basis_z.m();
118 const unsigned int columns_z = basis_z.n();
120 const unsigned int rows_1state_x = rows_x /
nstate;
121 const unsigned int columns_1state_x = columns_x /
nstate;
122 const unsigned int rows_1state_y = rows_y /
nstate;
123 const unsigned int columns_1state_y = columns_y /
nstate;
124 const unsigned int rows_1state_z = rows_z /
nstate;
125 const unsigned int columns_1state_z = columns_z /
nstate;
127 const unsigned int rows_all_states = (dim == 1) ? rows_1state_x * nstate :
128 ( (dim == 2) ? rows_1state_x * rows_1state_y *
nstate :
129 rows_1state_x * rows_1state_y * rows_1state_z *
nstate);
130 const unsigned int columns_all_states = (dim == 1) ? columns_1state_x * nstate :
131 ( (dim == 2) ? columns_1state_x * columns_1state_y *
nstate :
132 columns_1state_x * columns_1state_y * columns_1state_z *
nstate);
133 dealii::FullMatrix<double> tens_prod(rows_all_states, columns_all_states);
136 for(
int istate=0; istate<
nstate; istate++){
137 dealii::FullMatrix<double> basis_x_1state(rows_1state_x, columns_1state_x);
138 dealii::FullMatrix<double> basis_y_1state(rows_1state_y, columns_1state_y);
139 dealii::FullMatrix<double> basis_z_1state(rows_1state_z, columns_1state_z);
140 for(
unsigned int r=0; r<rows_1state_x; r++){
141 for(
unsigned int c=0; c<columns_1state_x; c++){
142 basis_x_1state[r][c] = basis_x[istate*rows_1state_x + r][istate*columns_1state_x + c];
145 if constexpr(dim>=2){
146 for(
unsigned int r=0; r<rows_1state_y; r++){
147 for(
unsigned int c=0; c<columns_1state_y; c++){
148 basis_y_1state[r][c] = basis_y[istate*rows_1state_y + r][istate*columns_1state_y + c];
152 if constexpr(dim>=3){
153 for(
unsigned int r=0; r<rows_1state_z; r++){
154 for(
unsigned int c=0; c<columns_1state_z; c++){
155 basis_z_1state[r][c] = basis_z[istate*rows_1state_z + r][istate*columns_1state_z + c];
159 const unsigned int r1state = (dim == 1) ? rows_1state_x : ( (dim==2) ? rows_1state_x * rows_1state_y : rows_1state_x * rows_1state_y * rows_1state_z);
160 const unsigned int c1state = (dim == 1) ? columns_1state_x : ( (dim==2) ? columns_1state_x * columns_1state_y : columns_1state_x * columns_1state_y * columns_1state_z);
161 dealii::FullMatrix<double> tens_prod_1state(r1state, c1state);
162 tens_prod_1state =
tensor_product(basis_x_1state, basis_y_1state, basis_z_1state);
163 for(
unsigned int r=0; r<r1state; r++){
164 for(
unsigned int c=0; c<c1state; c++){
165 tens_prod[istate*r1state + r][istate*c1state + c] = tens_prod_1state[r][c];
172 template <
int dim,
int n_faces>
187 template <
int dim,
int n_faces>
189 const int nstate_input,
190 const unsigned int max_degree_input,
191 const unsigned int grid_degree_input)
195 inline void print_face_orientation_warning()
198 "This scenario was considered and a fix has been implemented. " 199 "However, this scenario was never encountered before and thus could not be verified.\n" 200 "You may remove the abort statement and verify that the solution is as expected.\n" 201 "For more information, please see: " 202 "https://www.dealii.org/current/doxygen/deal.II/DEALGlossary.html#GlossFaceOrientation \n\n";
204 std::cout << msg << msg;
207 template <
int dim,
int n_faces>
208 template <
typename real>
210 const std::vector<bool> face_orientation,
212 std::vector<real> &output_vect,
213 const dealii::FullMatrix<double> &basis)
216 std::vector<real> output_vect_temp = output_vect;
217 const unsigned int columns = basis.m();
218 if(!face_orientation[0]){
219 for(
unsigned int ydof=0; ydof<columns; ydof++){
220 for(
unsigned int xdof=0; xdof<columns; xdof++){
221 output_vect[xdof+ydof*columns] = output_vect_temp[columns*xdof+ydof];
225 if(face_orientation[1]){
226 std::vector<real> output_vect_temp_rotation = output_vect;
227 for(
unsigned int ydof=0; ydof<columns; ydof++){
228 for(
unsigned int xdof=0; xdof<columns; xdof++){
229 output_vect[xdof+ydof*columns] = output_vect_temp_rotation[((columns-1)-ydof)+xdof*columns];
232 std::cout <<
"\nIt appears deal.ii has rotated a face.\n";
233 print_face_orientation_warning();
236 if(face_orientation[2]){
237 std::vector<real> output_vect_temp_flip = output_vect;
238 for(
unsigned int ydof=0; ydof<columns; ydof++){
239 for(
unsigned int xdof=0; xdof<columns; xdof++){
240 output_vect[xdof+ydof*columns] = output_vect_temp_flip[(columns*columns-1)-xdof-ydof*columns];
243 std::cout <<
"\nIt appears deal.ii has flipped a face.\n";
244 print_face_orientation_warning();
249 template <
int dim,
int n_faces>
250 template <
typename real>
252 const std::vector<bool> face_orientation,
254 const std::vector<real> &input_vect,
255 std::vector<real> &output_vect,
256 const dealii::FullMatrix<double> &basis)
259 output_vect = input_vect;
260 const unsigned int columns = basis.m();
261 if(!face_orientation[0]){
262 for(
unsigned int ydof=0; ydof<columns; ydof++){
263 for(
unsigned int xdof=0; xdof<columns; xdof++){
264 output_vect[xdof+ydof*columns] = input_vect[columns*xdof+ydof];
268 if(face_orientation[1]){
269 std::vector<real> output_vect_temp_rotation = output_vect;
270 for(
unsigned int ydof=0; ydof<columns; ydof++){
271 for(
unsigned int xdof=0; xdof<columns; xdof++){
272 output_vect[xdof+ydof*columns] = output_vect_temp_rotation[((columns-1)-ydof)+xdof*columns];
275 std::cout <<
"\nIt appears deal.ii has rotated a face.\n";
276 print_face_orientation_warning();
279 if(face_orientation[2]){
280 std::vector<real> output_vect_temp_flip = output_vect;
281 for(
unsigned int ydof=0; ydof<columns; ydof++){
282 for(
unsigned int xdof=0; xdof<columns; xdof++){
283 output_vect[xdof+ydof*columns] = output_vect_temp_flip[(columns*columns-1)-xdof-ydof*columns];
286 std::cout <<
"\nIt appears deal.ii has flipped a face.\n";
287 print_face_orientation_warning();
292 template <
int dim,
int n_faces>
293 template <
typename real>
295 const std::vector<real> &input_vect,
296 std::vector<real> &output_vect,
297 const dealii::FullMatrix<double> &basis_x,
298 const dealii::FullMatrix<double> &basis_y,
299 const dealii::FullMatrix<double> &basis_z,
304 const unsigned int rows_x = basis_x.m();
305 const unsigned int rows_y = basis_y.m();
306 const unsigned int rows_z = basis_z.m();
307 const unsigned int columns_x = basis_x.n();
308 const unsigned int columns_y = basis_y.n();
309 const unsigned int columns_z = basis_z.n();
310 if constexpr (dim == 1){
311 assert(rows_x == output_vect.size());
312 assert(columns_x == input_vect.size());
314 if constexpr (dim == 2){
315 assert(rows_x * rows_y == output_vect.size());
316 assert(columns_x * columns_y == input_vect.size());
318 if constexpr (dim == 3){
319 assert(rows_x * rows_y * rows_z == output_vect.size());
320 assert(columns_x * columns_y * columns_z == input_vect.size());
323 if constexpr (dim==1){
324 for(
unsigned int iquad=0; iquad<rows_x; iquad++){
326 output_vect[iquad] = 0.0;
327 for(
unsigned int jquad=0; jquad<columns_x; jquad++){
328 output_vect[iquad] += factor * basis_x[iquad][jquad] * input_vect[jquad];
332 if constexpr (dim==2){
334 std::vector<real> temp(rows_x * columns_y);
335 for(
unsigned int x_dir =0; x_dir<rows_x; x_dir++){
336 for(
unsigned int y_dir =0 ; y_dir<columns_y; y_dir++){
337 temp[x_dir * columns_y + y_dir] = 0.0;
338 for(
unsigned int stride =0 ; stride<columns_x; stride++){
339 temp[x_dir * columns_y + y_dir] += input_vect[y_dir * columns_x + stride] * basis_x[x_dir][stride];
344 for(
unsigned int y_dir =0 ; y_dir<rows_y; y_dir++){
345 for(
unsigned int x_dir =0 ; x_dir<rows_x; x_dir++){
347 output_vect[y_dir * rows_x + x_dir] = 0.0;
348 for(
unsigned int stride =0; stride<columns_y; stride++){
349 output_vect[y_dir * rows_x + x_dir] += factor * temp[x_dir * columns_y + stride] * basis_y[y_dir][stride];
354 if constexpr (dim==3){
356 std::vector<real> transformed_x(rows_x * columns_y * columns_z);
357 for(
unsigned int x_dir=0; x_dir<rows_x; x_dir++){
358 for(
unsigned int z_dir=0; z_dir<columns_z; z_dir++){
359 for(
unsigned int y_dir=0; y_dir<columns_y; y_dir++){
360 const unsigned int index = x_dir * columns_y * columns_z + z_dir * columns_y + y_dir;
361 transformed_x[index] = 0.0;
362 for(
unsigned int stride=0; stride<columns_x; stride++){
363 const unsigned int stride_index = z_dir * columns_x * columns_y + y_dir * columns_x + stride;
364 transformed_x[index] += basis_x[x_dir][stride] * input_vect[stride_index];
370 std::vector<real> transformed_x_and_y(rows_y * rows_x * columns_z);
371 for(
unsigned int y_dir=0; y_dir<rows_y; y_dir++){
372 for(
unsigned int x_dir=0; x_dir<rows_x; x_dir++){
373 for(
unsigned int z_dir=0; z_dir<columns_z; z_dir++){
374 const unsigned int index = y_dir * rows_x * columns_z + x_dir * columns_z + z_dir;
375 transformed_x_and_y[index] = 0.0;
376 for(
unsigned int stride = 0;stride<columns_y;stride++){
377 const unsigned int stride_index = x_dir * columns_y * columns_z + z_dir * columns_y + stride;
378 transformed_x_and_y[index] += basis_y[y_dir][stride] * transformed_x[stride_index];
384 for(
unsigned int z_dir=0; z_dir<rows_z; z_dir++){
385 for(
unsigned int y_dir=0; y_dir<rows_y; y_dir++){
386 for(
unsigned int x_dir=0; x_dir<rows_x; x_dir++){
387 const unsigned int index = z_dir * rows_x * rows_y + y_dir * rows_x + x_dir;
389 output_vect[index] =0.0;
390 for(
unsigned int stride=0; stride<columns_z; stride++){
391 const unsigned int stride_index = y_dir * rows_x * columns_z + x_dir * columns_z + stride;
392 output_vect[index] += factor * basis_z[z_dir][stride] * transformed_x_and_y[stride_index];
400 template <
int dim,
int n_faces>
401 template <
typename real>
403 const std::vector<real> &input_vect,
404 std::vector<real> &output_vect,
405 const dealii::FullMatrix<double> &basis_x,
409 this->
matrix_vector_mult(input_vect, output_vect, basis_x, basis_x, basis_x, adding, factor);
412 template <
int dim,
int n_faces>
413 template <
typename real>
415 const std::vector<bool> face_orientation,
416 const unsigned int face_number,
417 const std::vector<real> &input_vect,
418 std::vector<real> &output_vect,
419 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
420 const dealii::FullMatrix<double> &basis_vol,
425 this->
matrix_vector_mult(input_vect, output_vect, basis_surf[0], basis_vol, basis_vol, adding, factor);
427 this->
matrix_vector_mult(input_vect, output_vect, basis_surf[1], basis_vol, basis_vol, adding, factor);
429 this->
matrix_vector_mult(input_vect, output_vect, basis_vol, basis_surf[0], basis_vol, adding, factor);
431 this->
matrix_vector_mult(input_vect, output_vect, basis_vol, basis_surf[1], basis_vol, adding, factor);
433 this->
matrix_vector_mult(input_vect, output_vect, basis_vol, basis_vol, basis_surf[0], adding, factor);
435 this->
matrix_vector_mult(input_vect, output_vect, basis_vol, basis_vol, basis_surf[1], adding, factor);
437 if(!face_orientation[0] || face_orientation[1] || face_orientation[2]){
443 template <
int dim,
int n_faces>
444 template <
typename real>
446 const std::vector<bool> face_orientation,
447 const unsigned int face_number,
448 const std::vector<real> &input_vect,
449 const std::vector<double> &weight_vect,
450 std::vector<real> &output_vect,
451 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
452 const dealii::FullMatrix<double> &basis_vol,
458 std::vector<real> input_vect_corrected;
459 if(!face_orientation[0] || face_orientation[1] || face_orientation[2]){
460 this->face_orientation_inner_product(face_orientation, face_number, input_vect, input_vect_corrected, basis_vol);
462 input_vect_corrected = input_vect;
466 this->
inner_product(input_vect_corrected, weight_vect, output_vect, basis_surf[0], basis_vol, basis_vol, adding, factor);
468 this->
inner_product(input_vect_corrected, weight_vect, output_vect, basis_surf[1], basis_vol, basis_vol, adding, factor);
470 this->
inner_product(input_vect_corrected, weight_vect, output_vect, basis_vol, basis_surf[0], basis_vol, adding, factor);
472 this->
inner_product(input_vect_corrected, weight_vect, output_vect, basis_vol, basis_surf[1], basis_vol, adding, factor);
474 this->
inner_product(input_vect_corrected, weight_vect, output_vect, basis_vol, basis_vol, basis_surf[0], adding, factor);
476 this->
inner_product(input_vect_corrected, weight_vect, output_vect, basis_vol, basis_vol, basis_surf[1], adding, factor);
479 template <
int dim,
int n_faces>
480 template <
typename real>
482 const dealii::Tensor<1,dim,std::vector<real>> &input_vect,
483 std::vector<real> &output_vect,
484 const dealii::FullMatrix<double> &basis,
485 const dealii::FullMatrix<double> &gradient_basis)
489 gradient_basis, gradient_basis, gradient_basis);
492 template <
int dim,
int n_faces>
493 template <
typename real>
495 const dealii::Tensor<1,dim,std::vector<real>> &input_vect,
496 std::vector<real> &output_vect,
497 const dealii::FullMatrix<double> &basis_x,
498 const dealii::FullMatrix<double> &basis_y,
499 const dealii::FullMatrix<double> &basis_z,
500 const dealii::FullMatrix<double> &gradient_basis_x,
501 const dealii::FullMatrix<double> &gradient_basis_y,
502 const dealii::FullMatrix<double> &gradient_basis_z)
504 for(
int idim=0; idim<dim;idim++){
526 template <
int dim,
int n_faces>
527 template <
typename real>
529 const std::vector<real> &input_vect,
530 dealii::Tensor<1,dim,std::vector<real>> &output_vect,
531 const dealii::FullMatrix<double> &basis,
532 const dealii::FullMatrix<double> &gradient_basis)
536 gradient_basis, gradient_basis, gradient_basis);
539 template <
int dim,
int n_faces>
540 template <
typename real>
542 const std::vector<real> &input_vect,
543 dealii::Tensor<1,dim,std::vector<real>> &output_vect,
544 const dealii::FullMatrix<double> &basis_x,
545 const dealii::FullMatrix<double> &basis_y,
546 const dealii::FullMatrix<double> &basis_z,
547 const dealii::FullMatrix<double> &gradient_basis_x,
548 const dealii::FullMatrix<double> &gradient_basis_y,
549 const dealii::FullMatrix<double> &gradient_basis_z)
551 for(
int idim=0; idim<dim;idim++){
573 template <
int dim,
int n_faces>
574 template <
typename real>
576 const std::vector<real> &input_vect,
577 const std::vector<double> &weight_vect,
578 std::vector<real> &output_vect,
579 const dealii::FullMatrix<double> &basis_x,
580 const dealii::FullMatrix<double> &basis_y,
581 const dealii::FullMatrix<double> &basis_z,
586 const unsigned int rows_x = basis_x.m();
587 const unsigned int rows_y = basis_y.m();
588 const unsigned int rows_z = basis_z.m();
589 const unsigned int columns_x = basis_x.n();
590 const unsigned int columns_y = basis_y.n();
591 const unsigned int columns_z = basis_z.n();
594 if constexpr (dim == 1){
595 assert(rows_x == input_vect.size());
596 assert(columns_x == output_vect.size());
598 if constexpr (dim == 2){
599 assert(rows_x * rows_y == input_vect.size());
600 assert(columns_x * columns_y == output_vect.size());
602 if constexpr (dim == 3){
603 assert(rows_x * rows_y * rows_z == input_vect.size());
604 assert(columns_x * columns_y * columns_z == output_vect.size());
606 assert(weight_vect.size() == input_vect.size());
608 dealii::FullMatrix<double> basis_x_trans(columns_x, rows_x);
609 dealii::FullMatrix<double> basis_y_trans(columns_y, rows_y);
610 dealii::FullMatrix<double> basis_z_trans(columns_z, rows_z);
614 for(
unsigned int row=0; row<rows_x; row++){
615 for(
unsigned int col=0; col<columns_x; col++){
616 basis_x_trans[col][row] = basis_x[row][col];
619 for(
unsigned int row=0; row<rows_y; row++){
620 for(
unsigned int col=0; col<columns_y; col++){
621 basis_y_trans[col][row] = basis_y[row][col];
624 for(
unsigned int row=0; row<rows_z; row++){
625 for(
unsigned int col=0; col<columns_z; col++){
626 basis_z_trans[col][row] = basis_z[row][col];
630 std::vector<real> new_input_vect(input_vect.size());
631 for(
unsigned int iquad=0; iquad<input_vect.size(); iquad++){
632 new_input_vect[iquad] = input_vect[iquad] * weight_vect[iquad];
635 this->
matrix_vector_mult(new_input_vect, output_vect, basis_x_trans, basis_y_trans, basis_z_trans, adding, factor);
638 template <
int dim,
int n_faces>
639 template <
typename real>
641 const std::vector<real> &input_vect,
642 const std::vector<double> &weight_vect,
643 std::vector<real> &output_vect,
644 const dealii::FullMatrix<double> &basis_x,
648 this->
inner_product(input_vect, weight_vect, output_vect, basis_x, basis_x, basis_x, adding, factor);
651 template <
int dim,
int n_faces>
653 const dealii::Tensor<1,dim,dealii::FullMatrix<double>> &input_mat,
654 std::vector<double> &output_vect,
655 const std::vector<double> &weights,
656 const dealii::FullMatrix<double> &basis,
657 const double scaling)
659 assert(input_mat[0].m() == output_vect.size());
661 dealii::FullMatrix<double> output_mat(input_mat[0].m(), input_mat[0].n());
662 for(
int idim=0; idim<dim; idim++){
664 if constexpr(dim==1){
665 for(
unsigned int row=0; row<input_mat[0].m(); row++){
666 for(
unsigned int col=0; col<basis.m(); col++){
667 const unsigned int col_index = col;
668 output_vect[row] += scaling * output_mat[row][col_index];
672 if constexpr(dim==2){
673 const unsigned int size_1D = basis.m();
674 for(
unsigned int irow=0; irow<size_1D; irow++){
675 for(
unsigned int jrow=0; jrow<size_1D; jrow++){
676 const unsigned int row_index = irow * size_1D + jrow;
677 for(
unsigned int col=0; col<size_1D; col++){
679 const unsigned int col_index = col + irow * size_1D;
680 output_vect[row_index] += scaling * output_mat[row_index][col_index];
683 const unsigned int col_index = col * size_1D + jrow;
684 output_vect[row_index] += scaling * output_mat[row_index][col_index];
690 if constexpr(dim==3){
691 const unsigned int size_1D = basis.m();
692 for(
unsigned int irow=0; irow<size_1D; irow++){
693 for(
unsigned int jrow=0; jrow<size_1D; jrow++){
694 for(
unsigned int krow=0; krow<size_1D; krow++){
695 const unsigned int row_index = irow * size_1D * size_1D + jrow * size_1D + krow;
696 for(
unsigned int col=0; col<size_1D; col++){
698 const unsigned int col_index = col + irow * size_1D * size_1D + jrow * size_1D;
699 output_vect[row_index] += scaling * output_mat[row_index][col_index];
702 const unsigned int col_index = col * size_1D + krow + irow * size_1D * size_1D;
703 output_vect[row_index] += scaling * output_mat[row_index][col_index];
706 const unsigned int col_index = col * size_1D * size_1D + krow + jrow * size_1D;
707 output_vect[row_index] += scaling * output_mat[row_index][col_index];
717 template <
int dim,
int n_faces>
719 const dealii::FullMatrix<double> &input_mat,
720 std::vector<double> &output_vect_vol,
721 std::vector<double> &output_vect_surf,
722 const std::vector<double> &weights,
723 const std::array<dealii::FullMatrix<double>,2> &surf_basis,
724 const unsigned int iface,
725 const unsigned int dim_not_zero,
726 const double scaling)
728 assert(input_mat.n() == output_vect_vol.size());
729 assert(input_mat.m() == output_vect_surf.size());
730 const unsigned int iface_1D = iface % 2;
732 dealii::FullMatrix<double> output_mat(input_mat.m(), input_mat.n());
734 if constexpr(dim==1){
735 for(
unsigned int row=0; row<surf_basis[iface_1D].m(); row++){
736 for(
unsigned int col=0; col<surf_basis[iface_1D].n(); col++){
737 output_vect_vol[col] += scaling
738 * output_mat[row][col];
739 output_vect_surf[row] -= scaling
740 * output_mat[row][col];
744 if constexpr(dim==2){
745 const unsigned int size_1D_row = surf_basis[iface_1D].m();
746 const unsigned int size_1D_col = surf_basis[iface_1D].n();
747 for(
unsigned int irow=0; irow<size_1D_col; irow++){
748 for(
unsigned int jrow=0; jrow<size_1D_row; jrow++){
749 const unsigned int row_index = irow * size_1D_row + jrow;
750 for(
unsigned int col=0; col<size_1D_col; col++){
752 const unsigned int col_index = col + irow * size_1D_col;
753 output_vect_vol[col_index] += scaling * output_mat[row_index][col_index];
754 output_vect_surf[row_index] -= scaling * output_mat[row_index][col_index];
757 const unsigned int col_index = col * size_1D_col + irow;
758 output_vect_vol[col_index] += scaling * output_mat[row_index][col_index];
759 output_vect_surf[row_index] -= scaling * output_mat[row_index][col_index];
765 if constexpr(dim==3){
766 const unsigned int size_1D_row = surf_basis[iface_1D].m();
767 const unsigned int size_1D_col = surf_basis[iface_1D].n();
768 for(
unsigned int irow=0; irow<size_1D_col; irow++){
769 for(
unsigned int jrow=0; jrow<size_1D_col; jrow++){
770 for(
unsigned int krow=0; krow<size_1D_row; krow++){
771 const unsigned int row_index = irow * size_1D_row * size_1D_col + jrow * size_1D_row + krow;
772 for(
unsigned int col=0; col<size_1D_col; col++){
774 const unsigned int col_index = col + irow * size_1D_col * size_1D_col + jrow * size_1D_col;
775 output_vect_vol[col_index] += scaling * output_mat[row_index][col_index];
776 output_vect_surf[row_index] -= scaling * output_mat[row_index][col_index];
779 const unsigned int col_index = col * size_1D_col + jrow + irow * size_1D_col * size_1D_col;
780 output_vect_vol[col_index] += scaling * output_mat[row_index][col_index];
781 output_vect_surf[row_index] -= scaling * output_mat[row_index][col_index];
784 const unsigned int col_index = col * size_1D_col * size_1D_col + jrow + irow * size_1D_col;
785 output_vect_vol[col_index] += scaling * output_mat[row_index][col_index];
786 output_vect_surf[row_index] -= scaling * output_mat[row_index][col_index];
797 template <
int dim,
int n_faces>
799 const dealii::FullMatrix<double> &input_mat,
800 dealii::FullMatrix<double> &output_mat,
801 const dealii::FullMatrix<double> &basis,
802 const std::vector<double> &weights,
805 assert(input_mat.size() == output_mat.size());
806 const unsigned int size = basis.n();
807 assert(size == weights.size());
809 if constexpr(dim == 1){
812 if constexpr(dim == 2){
815 const unsigned int rows = basis.m();
816 assert(rows == input_mat.m());
818 for(
unsigned int idiag=0; idiag<size; idiag++){
819 dealii::FullMatrix<double> local_block(rows, size);
820 std::vector<unsigned int> row_index(rows);
821 std::vector<unsigned int> col_index(size);
823 std::iota(row_index.begin(), row_index.end(), idiag*rows);
824 std::iota(col_index.begin(), col_index.end(), idiag*size);
826 local_block.extract_submatrix_from(input_mat, row_index, col_index);
827 dealii::FullMatrix<double> local_Hadamard(rows, size);
830 local_Hadamard *= weights[idiag];
832 local_Hadamard.scatter_matrix_to(row_index, col_index, output_mat);
836 for(
unsigned int idiag=0; idiag<rows; idiag++){
837 const unsigned int row_index = idiag * size;
838 for(
unsigned int jdiag=0; jdiag<size; jdiag++){
839 const unsigned int col_index = jdiag * size;
840 for(
unsigned int kdiag=0; kdiag<size; kdiag++){
841 output_mat[row_index + kdiag][col_index + kdiag] = basis[idiag][jdiag]
842 * input_mat[row_index + kdiag][col_index + kdiag]
850 if constexpr(dim == 3){
851 const unsigned int rows = basis.m();
853 unsigned int kdiag=0;
854 for(
unsigned int idiag=0; idiag< size * size; idiag++){
855 if(kdiag==size) kdiag = 0;
856 dealii::FullMatrix<double> local_block(rows, size);
857 std::vector<unsigned int> row_index(rows);
858 std::vector<unsigned int> col_index(size);
860 std::iota(row_index.begin(), row_index.end(), idiag*rows);
861 std::iota(col_index.begin(), col_index.end(), idiag*size);
863 local_block.extract_submatrix_from(input_mat, row_index, col_index);
864 dealii::FullMatrix<double> local_Hadamard(rows, size);
867 local_Hadamard *= weights[kdiag];
869 const unsigned int jdiag = idiag / size;
870 local_Hadamard *= weights[jdiag];
872 local_Hadamard.scatter_matrix_to(row_index, col_index, output_mat);
876 for(
unsigned int zdiag=0; zdiag<size; zdiag++){
877 for(
unsigned int idiag=0; idiag<rows; idiag++){
878 const unsigned int row_index = zdiag * size * rows + idiag * size;
879 for(
unsigned int jdiag=0; jdiag<size; jdiag++){
880 const unsigned int col_index = zdiag * size * size + jdiag * size;
881 for(
unsigned int kdiag=0; kdiag<size; kdiag++){
882 output_mat[row_index + kdiag][col_index + kdiag] = basis[idiag][jdiag]
883 * input_mat[row_index + kdiag][col_index + kdiag]
892 for(
unsigned int row_block=0; row_block<rows; row_block++){
893 for(
unsigned int col_block=0; col_block<size; col_block++){
894 const unsigned int row_index = row_block * size * size;
895 const unsigned int col_index = col_block * size * size;
896 for(
unsigned int jdiag=0; jdiag<size; jdiag++){
897 for(
unsigned int kdiag=0; kdiag<size; kdiag++){
898 output_mat[row_index + jdiag * size + kdiag][col_index + jdiag * size + kdiag] = basis[row_block][col_block]
899 * input_mat[row_index + jdiag * size + kdiag][col_index + jdiag * size + kdiag]
910 template <
int dim,
int n_faces>
912 const dealii::FullMatrix<double> &input_mat1,
913 const dealii::FullMatrix<double> &input_mat2,
914 dealii::FullMatrix<double> &output_mat)
916 const unsigned int rows = input_mat1.m();
917 const unsigned int columns = input_mat1.n();
918 assert(rows == input_mat2.m());
919 assert(columns == input_mat2.n());
921 for(
unsigned int irow=0; irow<rows; irow++){
922 for(
unsigned int icol=0; icol<columns; icol++){
923 output_mat[irow][icol] = input_mat1[irow][icol]
924 * input_mat2[irow][icol];
929 template <
int dim,
int n_faces>
930 template <
typename real>
932 const dealii::FullMatrix<double> &input_mat1,
933 const std::vector<real> &input_mat2,
934 std::vector<real> &output_mat)
936 const unsigned int rows = input_mat1.m();
937 const unsigned int columns = input_mat1.n();
938 assert(rows * columns == input_mat2.size());
940 for(
unsigned int irow=0; irow<rows; irow++){
941 for(
unsigned int icol=0; icol<columns; icol++){
942 output_mat[irow * columns + icol] = input_mat1[irow][icol]
943 * input_mat2[irow * columns + icol];
948 template <
int dim,
int n_faces>
950 const unsigned int rows_size,
951 const unsigned int columns_size,
952 std::vector<std::array<unsigned int,dim>> &rows,
953 std::vector<std::array<unsigned int,dim>> &columns)
956 if constexpr(dim == 1){
957 for(
unsigned int irow=0; irow<rows_size; irow++){
958 for(
unsigned int icol=0; icol<columns_size; icol++){
959 const unsigned int array_index = irow * rows_size + icol;
960 rows[array_index][0] = irow;
961 columns[array_index][0] = icol;
965 if constexpr(dim == 2){
966 for(
unsigned int idiag=0; idiag<rows_size; idiag++){
967 for(
unsigned int jdiag=0; jdiag<columns_size; jdiag++){
968 for(
unsigned int kdiag=0; kdiag<columns_size; kdiag++){
969 const unsigned int array_index = idiag * rows_size * columns_size + jdiag * columns_size + kdiag;
970 const unsigned int row_index = idiag * rows_size;
971 rows[array_index][0] = row_index + jdiag;
972 rows[array_index][1] = row_index + jdiag;
974 const unsigned int col_index_0 = idiag * columns_size;
975 columns[array_index][0] = col_index_0 + kdiag;
977 const unsigned int col_index_1 = kdiag * columns_size;
978 columns[array_index][1] = col_index_1 + jdiag;
983 if constexpr(dim == 3){
984 for(
unsigned int idiag=0; idiag<rows_size; idiag++){
985 for(
unsigned int jdiag=0; jdiag<columns_size; jdiag++){
986 for(
unsigned int kdiag=0; kdiag<columns_size; kdiag++){
987 for(
unsigned int ldiag=0; ldiag<columns_size; ldiag++){
988 const unsigned int array_index = idiag * rows_size * columns_size * columns_size
989 + jdiag * columns_size * columns_size
990 + kdiag * columns_size
992 const unsigned int row_index = idiag * rows_size * columns_size
993 + jdiag * columns_size;
994 rows[array_index][0] = row_index + kdiag;
995 rows[array_index][1] = row_index + kdiag;
996 rows[array_index][2] = row_index + kdiag;
998 const unsigned int col_index_0 = idiag * columns_size * columns_size
999 + jdiag * columns_size;
1000 columns[array_index][0] = col_index_0 + ldiag;
1002 const unsigned int col_index_1 = ldiag * columns_size;
1003 columns[array_index][1] = col_index_1 + kdiag + idiag * columns_size * columns_size;
1005 const unsigned int col_index_2 = ldiag * columns_size * columns_size;
1006 columns[array_index][2] = col_index_2 + kdiag + jdiag * columns_size;
1013 template <
int dim,
int n_faces>
1015 const unsigned int rows_size_1D,
1016 const unsigned int columns_size_1D,
1017 const std::vector<std::array<unsigned int,dim>> &rows,
1018 const std::vector<std::array<unsigned int,dim>> &columns,
1019 const dealii::FullMatrix<double> &basis,
1020 const std::vector<double> &weights,
1021 std::array<dealii::FullMatrix<double>,dim> &basis_sparse)
1023 if constexpr(dim == 1){
1024 for(
unsigned int irow=0; irow<rows_size_1D; irow++){
1025 for(
unsigned int icol=0; icol<columns_size_1D; icol++){
1026 basis_sparse[0][irow][icol] = basis[irow][icol];
1030 if constexpr(dim == 2){
1031 const unsigned int total_size = rows.size();
1032 for(
unsigned int index=0, counter=0; index<total_size; index++, counter++){
1033 if(counter == columns_size_1D){
1037 basis_sparse[0][rows[index][0]][counter] = basis[rows[index][0]%rows_size_1D][columns[index][0]%columns_size_1D]
1038 * weights[rows[index][1]/columns_size_1D];
1040 basis_sparse[1][rows[index][1]][counter] = basis[rows[index][1]/rows_size_1D][columns[index][1]/columns_size_1D]
1041 * weights[rows[index][0]%columns_size_1D];
1044 if constexpr(dim == 3){
1045 const unsigned int total_size = rows.size();
1046 for(
unsigned int index=0, counter=0; index<total_size; index++, counter++){
1047 if(counter == columns_size_1D){
1051 basis_sparse[0][rows[index][0]][counter] = basis[rows[index][0]%rows_size_1D][columns[index][0]%columns_size_1D]
1052 * weights[(rows[index][1]/columns_size_1D)%columns_size_1D]
1053 * weights[rows[index][2]/columns_size_1D/columns_size_1D];
1055 basis_sparse[1][rows[index][1]][counter] = basis[(rows[index][1]/rows_size_1D)%rows_size_1D][(columns[index][1]/columns_size_1D)%columns_size_1D]
1056 * weights[rows[index][0]%columns_size_1D]
1057 * weights[rows[index][2]/columns_size_1D/columns_size_1D];
1059 basis_sparse[2][rows[index][2]][counter] = basis[rows[index][2]/rows_size_1D/rows_size_1D][columns[index][2]/columns_size_1D/columns_size_1D]
1060 * weights[rows[index][0]%columns_size_1D]
1061 * weights[(rows[index][1]/columns_size_1D)%columns_size_1D];
1066 template <
int dim,
int n_faces>
1068 const unsigned int rows_size,
1069 const unsigned int columns_size,
1070 std::vector<unsigned int> &rows,
1071 std::vector<unsigned int> &columns,
1072 const int dim_not_zero)
1075 if constexpr(dim == 1){
1076 for(
unsigned int irow=0; irow<rows_size; irow++){
1077 for(
unsigned int icol=0; icol<columns_size; icol++){
1078 const unsigned int array_index = irow * columns_size + icol;
1079 rows[array_index] = irow;
1080 columns[array_index] = icol;
1084 if constexpr(dim == 2){
1085 for(
unsigned int idiag=0; idiag<rows_size; idiag++){
1086 for(
unsigned int jdiag=0; jdiag<columns_size; jdiag++){
1087 const unsigned int array_index = idiag * columns_size + jdiag ;
1089 const unsigned int row_index = idiag;
1090 rows[array_index] = row_index;
1092 if(dim_not_zero == 0){
1093 const unsigned int col_index_0 = idiag * columns_size;
1094 columns[array_index] = col_index_0 + jdiag;
1097 if(dim_not_zero == 1){
1098 const unsigned int col_index_1 = jdiag * columns_size;
1099 columns[array_index] = col_index_1 + idiag;
1104 if constexpr(dim == 3){
1105 for(
unsigned int idiag=0; idiag<columns_size; idiag++){
1106 for(
unsigned int jdiag=0; jdiag<columns_size; jdiag++){
1107 for(
unsigned int kdiag=0; kdiag<columns_size; kdiag++){
1108 const unsigned int array_index = idiag * columns_size * columns_size
1109 + jdiag * columns_size
1111 const unsigned int row_index = idiag * columns_size + jdiag;
1112 rows[array_index] = row_index;
1114 if(dim_not_zero == 0){
1115 const unsigned int col_index_0 = idiag * columns_size * columns_size
1116 + jdiag * columns_size;
1117 columns[array_index] = col_index_0 + kdiag;
1120 if(dim_not_zero == 1){
1121 const unsigned int col_index_1 = kdiag * columns_size;
1122 columns[array_index] = col_index_1 + jdiag + idiag * columns_size * columns_size;
1125 if(dim_not_zero == 2){
1126 const unsigned int col_index_2 = kdiag * columns_size * columns_size;
1127 columns[array_index] = col_index_2 + jdiag + idiag * columns_size;
1134 template <
int dim,
int n_faces>
1136 const unsigned int rows_size,
1137 const unsigned int columns_size_1D,
1138 const std::vector<unsigned int> &rows,
1139 const std::vector<unsigned int> &columns,
1140 const dealii::FullMatrix<double> &basis,
1141 const std::vector<double> &weights,
1142 dealii::FullMatrix<double> &basis_sparse,
1143 const int dim_not_zero)
1145 if constexpr(dim == 1){
1146 for(
unsigned int irow=0; irow<rows_size; irow++){
1147 for(
unsigned int icol=0; icol<columns_size_1D; icol++){
1148 basis_sparse[irow][icol] = basis[irow][icol];
1152 if constexpr(dim == 2){
1153 const unsigned int total_size = rows.size();
1154 for(
unsigned int index=0, counter=0; index<total_size; index++, counter++){
1155 if(counter == columns_size_1D){
1159 if(dim_not_zero == 0){
1160 basis_sparse[rows[index]][counter] = basis[0][columns[index]%columns_size_1D]
1161 * weights[rows[index]%columns_size_1D];
1164 if(dim_not_zero == 1){
1165 basis_sparse[rows[index]][counter] = basis[0][columns[index]/columns_size_1D]
1166 * weights[rows[index]%columns_size_1D];
1170 if constexpr(dim == 3){
1171 const unsigned int total_size = rows.size();
1172 for(
unsigned int index=0, counter=0; index<total_size; index++, counter++){
1173 if(counter == columns_size_1D){
1177 if(dim_not_zero == 0){
1178 basis_sparse[rows[index]][counter] = basis[0][columns[index]%columns_size_1D]
1179 * weights[rows[index]%columns_size_1D]
1180 * weights[rows[index]/columns_size_1D];
1183 if(dim_not_zero == 1){
1184 basis_sparse[rows[index]][counter] = basis[0][(columns[index]/columns_size_1D)%columns_size_1D]
1185 * weights[rows[index]%columns_size_1D]
1186 * weights[rows[index]/columns_size_1D];
1189 if(dim_not_zero == 2){
1190 basis_sparse[rows[index]][counter] = basis[0][columns[index]/columns_size_1D/columns_size_1D]
1191 * weights[rows[index]%columns_size_1D]
1192 * weights[rows[index]/columns_size_1D];
1205 template <
int dim,
int n_faces>
1207 const int nstate_input,
1208 const unsigned int max_degree_input,
1209 const unsigned int grid_degree_input)
1216 template <
int dim,
int n_faces>
1218 const dealii::FESystem<1,1> &finite_element,
1219 const dealii::Quadrature<1> &quadrature)
1221 const unsigned int n_quad_pts = quadrature.size();
1222 const unsigned int n_dofs = finite_element.dofs_per_cell;
1226 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
1227 const dealii::Point<1> qpoint = quadrature.point(iquad);
1228 for(
unsigned int idof=0; idof<n_dofs; idof++){
1229 const int istate = finite_element.system_to_component_index(idof).first;
1231 this->
oneD_vol_operator[iquad][idof] = finite_element.shape_value_component(idof,qpoint,istate);
1236 template <
int dim,
int n_faces>
1238 const dealii::FESystem<1,1> &finite_element,
1239 const dealii::Quadrature<1> &quadrature)
1241 const unsigned int n_quad_pts = quadrature.size();
1242 const unsigned int n_dofs = finite_element.dofs_per_cell;
1246 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
1247 const dealii::Point<1> qpoint = quadrature.point(iquad);
1248 for(
unsigned int idof=0; idof<n_dofs; idof++){
1249 const int istate = finite_element.system_to_component_index(idof).first;
1251 this->
oneD_grad_operator[iquad][idof] = finite_element.shape_grad_component(idof,qpoint,istate)[0];
1256 template <
int dim,
int n_faces>
1258 const dealii::FESystem<1,1> &finite_element,
1259 const dealii::Quadrature<0> &face_quadrature)
1261 const unsigned int n_face_quad_pts = face_quadrature.size();
1262 const unsigned int n_dofs = finite_element.dofs_per_cell;
1263 const unsigned int n_faces_1D = n_faces / dim;
1265 for(
unsigned int iface=0; iface<n_faces_1D; iface++){
1269 const dealii::Quadrature<1> quadrature = dealii::QProjector<1>::project_to_face(dealii::ReferenceCell::get_hypercube(1),
1272 for(
unsigned int iquad=0; iquad<n_face_quad_pts; iquad++){
1273 const dealii::Point<1> qpoint = quadrature.point(iquad);
1274 for(
unsigned int idof=0; idof<n_dofs; idof++){
1275 const int istate = finite_element.system_to_component_index(idof).first;
1277 this->
oneD_surf_operator[iface][iquad][idof] = finite_element.shape_value_component(idof,qpoint,istate);
1283 template <
int dim,
int n_faces>
1285 const dealii::FESystem<1,1> &finite_element,
1286 const dealii::Quadrature<0> &face_quadrature)
1288 const unsigned int n_face_quad_pts = face_quadrature.size();
1289 const unsigned int n_dofs = finite_element.dofs_per_cell;
1290 const unsigned int n_faces_1D = n_faces / dim;
1292 for(
unsigned int iface=0; iface<n_faces_1D; iface++){
1296 const dealii::Quadrature<1> quadrature = dealii::QProjector<1>::project_to_face(dealii::ReferenceCell::get_hypercube(1),
1299 for(
unsigned int iquad=0; iquad<n_face_quad_pts; iquad++){
1300 const dealii::Point<1> qpoint = quadrature.point(iquad);
1301 for(
unsigned int idof=0; idof<n_dofs; idof++){
1302 const int istate = finite_element.system_to_component_index(idof).first;
1304 this->
oneD_surf_grad_operator[iface][iquad][idof] = finite_element.shape_grad_component(idof,qpoint,istate)[0];
1310 template <
int dim,
int n_faces>
1312 const int nstate_input,
1313 const unsigned int max_degree_input,
1314 const unsigned int grid_degree_input)
1321 template <
int dim,
int n_faces>
1323 const dealii::FESystem<1,1> &finite_element,
1324 const dealii::Quadrature<1> &quadrature)
1326 const unsigned int n_quad_pts = quadrature.size();
1327 const unsigned int n_dofs = finite_element.dofs_per_cell;
1331 const std::vector<double> &quad_weights = quadrature.get_weights ();
1332 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
1333 const dealii::Point<1> qpoint = quadrature.point(iquad);
1334 for(
unsigned int idof=0; idof<n_dofs; idof++){
1335 const int istate = finite_element.system_to_component_index(idof).first;
1337 this->
oneD_vol_operator[iquad][idof] = quad_weights[iquad] * finite_element.shape_value_component(idof,qpoint,istate);
1342 template <
int dim,
int n_faces>
1344 const int nstate_input,
1345 const unsigned int max_degree_input,
1346 const unsigned int grid_degree_input)
1353 template <
int dim,
int n_faces>
1355 const dealii::FESystem<1,1> &finite_element,
1356 const dealii::Quadrature<1> &quadrature)
1358 const unsigned int n_quad_pts = quadrature.size();
1359 const unsigned int n_dofs = finite_element.dofs_per_cell;
1360 const std::vector<double> &quad_weights = quadrature.get_weights ();
1364 for (
unsigned int itest=0; itest<n_dofs; ++itest) {
1365 const int istate_test = finite_element.system_to_component_index(itest).first;
1366 for (
unsigned int itrial=itest; itrial<n_dofs; ++itrial) {
1367 const int istate_trial = finite_element.system_to_component_index(itrial).first;
1369 for (
unsigned int iquad=0; iquad<n_quad_pts; ++iquad) {
1370 const dealii::Point<1> qpoint = quadrature.point(iquad);
1372 finite_element.shape_value_component(itest,qpoint,istate_test)
1373 * finite_element.shape_value_component(itrial,qpoint,istate_trial)
1374 * quad_weights[iquad];
1379 if(istate_test==istate_trial) {
1387 template <
int dim,
int n_faces>
1390 const unsigned int n_dofs,
const unsigned int n_quad_pts,
1392 const std::vector<double> &det_Jac,
1393 const std::vector<double> &quad_weights)
1396 const unsigned int n_shape_fns = n_dofs /
nstate;
1398 dealii::FullMatrix<double> mass_matrix_dim(n_dofs);
1399 dealii::FullMatrix<double> basis_dim(n_dofs);
1406 for(
int istate=0; istate<
nstate; istate++){
1407 for(
unsigned int itest=0; itest<n_shape_fns; ++itest){
1408 for (
unsigned int itrial=itest; itrial<n_shape_fns; ++itrial) {
1410 const unsigned int trial_index = istate*n_shape_fns + itrial;
1411 const unsigned int test_index = istate*n_shape_fns + itest;
1412 for (
unsigned int iquad=0; iquad<n_quad_pts; ++iquad) {
1413 value += basis_dim[iquad][test_index]
1414 * basis_dim[iquad][trial_index]
1416 * quad_weights[iquad];
1418 mass_matrix_dim[trial_index][test_index] = value;
1419 mass_matrix_dim[test_index][trial_index] = value;
1423 return mass_matrix_dim;
1426 template <
int dim,
int n_faces>
1428 const int nstate_input,
1429 const unsigned int max_degree_input,
1430 const unsigned int grid_degree_input,
1431 const bool store_skew_symmetric_form_input)
1433 , store_skew_symmetric_form(store_skew_symmetric_form_input)
1439 template <
int dim,
int n_faces>
1441 const dealii::FESystem<1,1> &finite_element,
1442 const dealii::Quadrature<1> &quadrature)
1444 const unsigned int n_quad_pts = quadrature.size();
1445 const unsigned int n_dofs = finite_element.dofs_per_cell;
1446 const std::vector<double> &quad_weights = quadrature.get_weights ();
1450 for(
unsigned int itest=0; itest<n_dofs; itest++){
1451 const int istate_test = finite_element.system_to_component_index(itest).first;
1452 for(
unsigned int idof=0; idof<n_dofs; idof++){
1453 const int istate = finite_element.system_to_component_index(idof).first;
1455 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
1456 const dealii::Point<1> qpoint = quadrature.point(iquad);
1457 value += finite_element.shape_value_component(itest,qpoint,istate_test)
1458 * finite_element.shape_grad_component(idof, qpoint, istate)[0]
1459 * quad_weights[iquad];
1461 if(istate == istate_test){
1470 for(
unsigned int idof=0; idof<n_dofs; idof++){
1471 for(
unsigned int jdof=0; jdof<n_dofs; jdof++){
1479 template <
int dim,
int n_faces>
1481 const int nstate_input,
1482 const unsigned int max_degree_input,
1483 const unsigned int grid_degree_input)
1490 template <
int dim,
int n_faces>
1492 const dealii::FESystem<1,1> &finite_element,
1493 const dealii::Quadrature<1> &quadrature)
1495 const unsigned int n_dofs = finite_element.dofs_per_cell;
1502 dealii::FullMatrix<double> inv_mass(n_dofs);
1508 template <
int dim,
int n_faces>
1510 const int nstate_input,
1511 const unsigned int max_degree_input,
1512 const unsigned int grid_degree_input)
1519 template <
int dim,
int n_faces>
1521 const dealii::FESystem<1,1> &finite_element,
1522 const dealii::Quadrature<1> &quadrature)
1524 const unsigned int n_dofs = finite_element.dofs_per_cell;
1528 for(
unsigned int idof=0; idof<n_dofs; idof++){
1535 for(
unsigned int idegree=0; idegree< this->
max_degree; idegree++){
1536 dealii::FullMatrix<double> derivative_p_temp(n_dofs, n_dofs);
1542 template <
int dim,
int n_faces>
1544 const int nstate_input,
1545 const unsigned int max_degree_input,
1546 const unsigned int grid_degree_input,
1548 const double FR_user_specified_correction_parameter_value_input)
1550 , FR_param_type(FR_param_input)
1551 , FR_user_specified_correction_parameter_value(FR_user_specified_correction_parameter_value_input)
1559 template <
int dim,
int n_faces>
1561 const unsigned int curr_cell_degree,
1566 double cp = pfact2/(pow(pfact,2));
1567 c = 2.0 * (curr_cell_degree+1)/( curr_cell_degree*((2.0*curr_cell_degree+1.0)*(pow(pfact*cp,2))));
1570 template <
int dim,
int n_faces>
1572 const unsigned int curr_cell_degree,
1577 double cp = pfact2/(pow(pfact,2));
1578 c = 2.0 * (curr_cell_degree)/( (curr_cell_degree+1.0)*((2.0*curr_cell_degree+1.0)*(pow(pfact*cp,2))));
1581 template <
int dim,
int n_faces>
1583 const unsigned int curr_cell_degree,
1588 double cp = pfact2/(pow(pfact,2));
1589 c = - 2.0 / ( pow((2.0*curr_cell_degree+1.0)*(pow(pfact*cp,2)),1.0));
1592 template <
int dim,
int n_faces>
1594 const unsigned int curr_cell_degree,
1600 template <
int dim,
int n_faces>
1602 const unsigned int curr_cell_degree,
1605 if(curr_cell_degree == 2){
1609 else if(curr_cell_degree == 3){
1612 else if(curr_cell_degree == 4){
1616 else if(curr_cell_degree == 5){
1620 this->
pcout <<
"ERROR: cPlus values are only defined for p=2 through p=5. Aborting..." << std::endl;
1625 c/=pow(pow(2.0,curr_cell_degree),2);
1628 template <
int dim,
int n_faces>
1630 const unsigned int curr_cell_degree,
1659 c/=pow(pow(2.0,curr_cell_degree),2);
1662 template <
int dim,
int n_faces>
1664 const dealii::FullMatrix<double> &local_Mass_Matrix,
1665 const dealii::FullMatrix<double> &pth_derivative,
1666 const unsigned int n_dofs,
1668 dealii::FullMatrix<double> &Flux_Reconstruction_operator)
1670 dealii::FullMatrix<double> derivative_p_temp(n_dofs);
1671 derivative_p_temp.add(c, pth_derivative);
1672 dealii::FullMatrix<double> Flux_Reconstruction_operator_temp(n_dofs);
1673 derivative_p_temp.Tmmult(Flux_Reconstruction_operator_temp, local_Mass_Matrix);
1674 Flux_Reconstruction_operator_temp.mmult(Flux_Reconstruction_operator, pth_derivative);
1678 template <
int dim,
int n_faces>
1680 const dealii::FESystem<1,1> &finite_element,
1681 const dealii::Quadrature<1> &quadrature)
1683 const unsigned int n_dofs = finite_element.dofs_per_cell;
1696 template <
int dim,
int n_faces>
1699 const unsigned int n_dofs,
1700 dealii::FullMatrix<double> &pth_deriv,
1701 dealii::FullMatrix<double> &mass_matrix)
1703 dealii::FullMatrix<double> Flux_Reconstruction_operator(n_dofs);
1704 dealii::FullMatrix<double> identity (dealii::IdentityMatrix(pth_deriv.m()));
1705 for(
int idim=0; idim<dim; idim++){
1706 dealii::FullMatrix<double> pth_deriv_dim(n_dofs);
1716 dealii::FullMatrix<double> derivative_p_temp(n_dofs);
1717 derivative_p_temp.add(
FR_param, pth_deriv_dim);
1718 dealii::FullMatrix<double> Flux_Reconstruction_operator_temp(n_dofs);
1719 derivative_p_temp.Tmmult(Flux_Reconstruction_operator_temp, mass_matrix);
1720 Flux_Reconstruction_operator_temp.mmult(Flux_Reconstruction_operator, pth_deriv_dim,
true);
1722 if constexpr (dim>=2){
1723 const int deriv_2p_loop = (dim==2) ? 1 : dim;
1724 double FR_param_sqrd = pow(
FR_param,2.0);
1725 for(
int idim=0; idim<deriv_2p_loop; idim++){
1726 dealii::FullMatrix<double> pth_deriv_dim(n_dofs);
1736 dealii::FullMatrix<double> derivative_p_temp(n_dofs);
1737 derivative_p_temp.add(FR_param_sqrd, pth_deriv_dim);
1738 dealii::FullMatrix<double> Flux_Reconstruction_operator_temp(n_dofs);
1739 derivative_p_temp.Tmmult(Flux_Reconstruction_operator_temp, mass_matrix);
1740 Flux_Reconstruction_operator_temp.mmult(Flux_Reconstruction_operator, pth_deriv_dim,
true);
1743 if constexpr (dim == 3){
1744 double FR_param_cubed = pow(
FR_param,3.0);
1745 dealii::FullMatrix<double> pth_deriv_dim(n_dofs);
1747 dealii::FullMatrix<double> derivative_p_temp(n_dofs);
1748 derivative_p_temp.add(FR_param_cubed, pth_deriv_dim);
1749 dealii::FullMatrix<double> Flux_Reconstruction_operator_temp(n_dofs);
1750 derivative_p_temp.Tmmult(Flux_Reconstruction_operator_temp, mass_matrix);
1751 Flux_Reconstruction_operator_temp.mmult(Flux_Reconstruction_operator, pth_deriv_dim,
true);
1754 return Flux_Reconstruction_operator;
1757 template <
int dim,
int n_faces>
1759 const dealii::FullMatrix<double> &local_Mass_Matrix,
1761 const unsigned int n_dofs)
1763 dealii::FullMatrix<double> dim_FR_operator(n_dofs);
1764 if constexpr (dim == 1){
1768 dealii::FullMatrix<double> FR1(n_dofs);
1770 dealii::FullMatrix<double> FR2(n_dofs);
1772 dealii::FullMatrix<double> FR_cross1(n_dofs);
1774 dim_FR_operator.add(1.0, FR1, 1.0, FR2, 1.0, FR_cross1);
1776 if constexpr (dim == 3){
1777 dealii::FullMatrix<double> FR3(n_dofs);
1779 dealii::FullMatrix<double> FR_cross2(n_dofs);
1781 dealii::FullMatrix<double> FR_cross3(n_dofs);
1783 dealii::FullMatrix<double> FR_triple(n_dofs);
1785 dim_FR_operator.add(1.0, FR3, 1.0, FR_cross2, 1.0, FR_cross3);
1786 dim_FR_operator.add(1.0, FR_triple);
1788 return dim_FR_operator;
1793 template <
int dim,
int n_faces>
1795 const int nstate_input,
1796 const unsigned int max_degree_input,
1797 const unsigned int grid_degree_input,
1800 , FR_param_aux_type(FR_param_aux_input)
1808 template <
int dim,
int n_faces>
1810 const unsigned int curr_cell_degree,
1836 template <
int dim,
int n_faces>
1838 const dealii::FESystem<1,1> &finite_element,
1839 const dealii::Quadrature<1> &quadrature)
1841 const unsigned int n_dofs = finite_element.dofs_per_cell;
1853 template <
int dim,
int n_faces>
1855 const int nstate_input,
1856 const unsigned int max_degree_input,
1857 const unsigned int grid_degree_input)
1864 template <
int dim,
int n_faces>
1866 const dealii::FullMatrix<double> &norm_matrix_inverse,
1867 const dealii::FullMatrix<double> &integral_vol_basis,
1868 dealii::FullMatrix<double> &volume_projection)
1870 norm_matrix_inverse.mTmult(volume_projection, integral_vol_basis);
1872 template <
int dim,
int n_faces>
1874 const dealii::FESystem<1,1> &finite_element,
1875 const dealii::Quadrature<1> &quadrature)
1877 const unsigned int n_dofs = finite_element.dofs_per_cell;
1878 const unsigned int n_quad_pts = quadrature.size();
1883 dealii::FullMatrix<double> mass_inv(n_dofs);
1891 template <
int dim,
int n_faces>
1893 const int nstate_input,
1894 const unsigned int max_degree_input,
1895 const unsigned int grid_degree_input,
1897 const double FR_user_specified_correction_parameter_value_input,
1898 const bool store_transpose_input)
1900 , store_transpose(store_transpose_input)
1901 , FR_param_type(FR_param_input)
1902 , FR_user_specified_correction_parameter_value(FR_user_specified_correction_parameter_value_input)
1908 template <
int dim,
int n_faces>
1910 const dealii::FESystem<1,1> &finite_element,
1911 const dealii::Quadrature<1> &quadrature)
1913 const unsigned int n_dofs = finite_element.dofs_per_cell;
1914 const unsigned int n_quad_pts = quadrature.size();
1926 for(
unsigned int idof=0; idof<n_dofs; idof++){
1927 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
1933 template <
int dim,
int n_faces>
1935 const int nstate_input,
1936 const unsigned int max_degree_input,
1937 const unsigned int grid_degree_input,
1939 const bool store_transpose_input)
1948 template <
int dim,
int n_faces>
1950 const dealii::FESystem<1,1> &finite_element,
1951 const dealii::Quadrature<1> &quadrature)
1953 const unsigned int n_dofs = finite_element.dofs_per_cell;
1954 const unsigned int n_quad_pts = quadrature.size();
1966 for(
unsigned int idof=0; idof<n_dofs; idof++){
1967 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
1974 template <
int dim,
int n_faces>
1976 const int nstate_input,
1977 const unsigned int max_degree_input,
1978 const unsigned int grid_degree_input,
1980 const double FR_user_specified_correction_parameter_value_input)
1983 , FR_user_specified_correction_parameter_value(FR_user_specified_correction_parameter_value_input)
1989 template <
int dim,
int n_faces>
1991 const dealii::FESystem<1,1> &finite_element,
1992 const dealii::Quadrature<1> &quadrature)
1994 const unsigned int n_dofs = finite_element.dofs_per_cell;
1999 dealii::FullMatrix<double> FR_mass_matrix(n_dofs);
2007 template <
int dim,
int n_faces>
2009 const int nstate_input,
2010 const unsigned int max_degree_input,
2011 const unsigned int grid_degree_input,
2020 template <
int dim,
int n_faces>
2022 const dealii::FESystem<1,1> &finite_element,
2023 const dealii::Quadrature<1> &quadrature)
2025 const unsigned int n_dofs = finite_element.dofs_per_cell;
2030 dealii::FullMatrix<double> FR_mass_matrix(n_dofs);
2037 template <
int dim,
int n_faces>
2039 const int nstate_input,
2040 const unsigned int max_degree_input,
2041 const unsigned int grid_degree_input,
2043 const double FR_user_specified_correction_parameter_value_input)
2046 , FR_user_specified_correction_parameter_value(FR_user_specified_correction_parameter_value_input)
2052 template <
int dim,
int n_faces>
2054 const dealii::FESystem<1,1> &finite_element,
2055 const dealii::Quadrature<1> &quadrature)
2057 const unsigned int n_dofs = finite_element.dofs_per_cell;
2062 dealii::FullMatrix<double> FR_mass_matrix(n_dofs);
2069 template <
int dim,
int n_faces>
2071 const int nstate_input,
2072 const unsigned int max_degree_input,
2073 const unsigned int grid_degree_input,
2082 template <
int dim,
int n_faces>
2084 const dealii::FESystem<1,1> &finite_element,
2085 const dealii::Quadrature<1> &quadrature)
2087 const unsigned int n_dofs = finite_element.dofs_per_cell;
2092 dealii::FullMatrix<double> FR_mass_matrix(n_dofs);
2100 template <
int dim,
int n_faces>
2102 const int nstate_input,
2103 const unsigned int max_degree_input,
2104 const unsigned int grid_degree_input)
2111 template <
int dim,
int n_faces>
2113 const dealii::FESystem<1,1> &finite_element,
2114 const dealii::Quadrature<1> &quadrature)
2116 const unsigned int n_quad_pts = quadrature.size();
2117 const unsigned int n_dofs = finite_element.dofs_per_cell;
2121 const std::vector<double> &quad_weights = quadrature.get_weights ();
2122 for(
unsigned int itest=0; itest<n_dofs; itest++){
2123 const int istate_test = finite_element.system_to_component_index(itest).first;
2124 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
2125 const dealii::Point<1> qpoint = quadrature.point(iquad);
2126 this->
oneD_grad_operator[iquad][itest] = finite_element.shape_grad_component(itest, qpoint, istate_test)[0]
2127 * quad_weights[iquad];
2138 template <
int dim,
int n_faces>
2140 const int nstate_input,
2141 const unsigned int max_degree_input,
2142 const unsigned int grid_degree_input)
2149 template <
int dim,
int n_faces>
2151 const dealii::FESystem<1,1> &finite_element,
2152 const dealii::Quadrature<0> &face_quadrature)
2154 const unsigned int n_face_quad_pts = face_quadrature.size();
2155 const unsigned int n_dofs = finite_element.dofs_per_cell;
2156 const unsigned int n_faces_1D = n_faces / dim;
2157 const std::vector<double> &quad_weights = face_quadrature.get_weights ();
2159 for(
unsigned int iface=0; iface<n_faces_1D; iface++){
2163 const dealii::Quadrature<1> quadrature = dealii::QProjector<1>::project_to_face(dealii::ReferenceCell::get_hypercube(1),
2166 for(
unsigned int iquad=0; iquad<n_face_quad_pts; iquad++){
2167 const dealii::Point<1> qpoint = quadrature.point(iquad);
2168 for(
unsigned int idof=0; idof<n_dofs; idof++){
2169 const int istate = finite_element.system_to_component_index(idof).first;
2171 this->
oneD_surf_operator[iface][iquad][idof] = finite_element.shape_value_component(idof,qpoint,istate)
2172 * quad_weights[iquad];
2178 template <
int dim,
int n_faces>
2180 const int nstate_input,
2181 const unsigned int max_degree_input,
2182 const unsigned int grid_degree_input)
2189 template <
int dim,
int n_faces>
2191 const dealii::FESystem<1,1> &finite_element,
2192 const dealii::Quadrature<1> &quadrature)
2194 const unsigned int n_dofs = finite_element.dofs_per_cell;
2202 template <
int dim,
int n_faces>
2204 const unsigned int n_dofs,
2205 const dealii::FullMatrix<double> &norm_matrix,
2206 const dealii::FullMatrix<double> &face_integral,
2207 dealii::FullMatrix<double> &lifting)
2209 dealii::FullMatrix<double> norm_inv(n_dofs);
2210 norm_inv.invert(norm_matrix);
2211 norm_inv.mTmult(lifting, face_integral);
2213 template <
int dim,
int n_faces>
2215 const dealii::FESystem<1,1> &finite_element,
2216 const dealii::Quadrature<0> &face_quadrature)
2218 const unsigned int n_face_quad_pts = face_quadrature.size();
2219 const unsigned int n_dofs = finite_element.dofs_per_cell;
2220 const unsigned int n_faces_1D = n_faces / dim;
2225 for(
unsigned int iface=0; iface<n_faces_1D; iface++){
2232 template <
int dim,
int n_faces>
2234 const int nstate_input,
2235 const unsigned int max_degree_input,
2236 const unsigned int grid_degree_input,
2238 const double FR_user_specified_correction_parameter_value_input)
2240 , FR_param_type(FR_param_input)
2241 , FR_user_specified_correction_parameter_value(FR_user_specified_correction_parameter_value_input)
2247 template <
int dim,
int n_faces>
2249 const dealii::FESystem<1,1> &finite_element,
2250 const dealii::Quadrature<1> &quadrature)
2252 const unsigned int n_dofs = finite_element.dofs_per_cell;
2263 template <
int dim,
int n_faces>
2265 const dealii::FESystem<1,1> &finite_element,
2266 const dealii::Quadrature<0> &face_quadrature)
2268 const unsigned int n_face_quad_pts = face_quadrature.size();
2269 const unsigned int n_dofs = finite_element.dofs_per_cell;
2270 const unsigned int n_faces_1D = n_faces / dim;
2275 for(
unsigned int iface=0; iface<n_faces_1D; iface++){
2289 template <
int dim,
int n_faces>
2291 const int nstate_input,
2292 const unsigned int max_degree_input,
2293 const unsigned int grid_degree_input)
2295 , mapping_shape_functions_grid_nodes(nstate_input, max_degree_input, grid_degree_input)
2296 , mapping_shape_functions_flux_nodes(nstate_input, max_degree_input, grid_degree_input)
2303 template <
int dim,
int n_faces>
2305 const dealii::FESystem<1,1> &finite_element,
2306 const dealii::Quadrature<1> &quadrature)
2308 assert(finite_element.dofs_per_cell == quadrature.size());
2312 template <
int dim,
int n_faces>
2314 const dealii::FESystem<1,1> &finite_element,
2315 const dealii::Quadrature<1> &quadrature,
2316 const dealii::Quadrature<0> &face_quadrature)
2324 template <
int dim,
int n_faces>
2326 const dealii::FESystem<1,1> &finite_element,
2327 const dealii::Quadrature<1> &quadrature)
2339 template <
typename real,
int dim,
int n_faces>
2341 const int nstate_input,
2342 const unsigned int max_degree_input,
2343 const unsigned int grid_degree_input,
2344 const bool store_vol_flux_nodes_input,
2345 const bool store_surf_flux_nodes_input,
2346 const bool store_Jacobian_input)
2348 , store_Jacobian(store_Jacobian_input)
2349 , store_vol_flux_nodes(store_vol_flux_nodes_input)
2350 , store_surf_flux_nodes(store_surf_flux_nodes_input)
2353 template <
typename real,
int dim,
int n_faces>
2355 const dealii::Tensor<1,dim,real> &phys,
2356 const dealii::Tensor<2,dim,real> &metric_cofactor,
2357 dealii::Tensor<1,dim,real> &ref)
2359 for(
int idim=0; idim<dim; idim++){
2360 for(
int idim2=0; idim2<dim; idim2++){
2361 ref[idim] += metric_cofactor[idim2][idim] * phys[idim2];
2367 template <
typename real,
int dim,
int n_faces>
2369 const dealii::Tensor<1,dim,real> &ref,
2370 const dealii::Tensor<2,dim,real> &metric_cofactor,
2371 dealii::Tensor<1,dim,real> &phys)
2373 for(
int idim=0; idim<dim; idim++){
2375 for(
int idim2=0; idim2<dim; idim2++){
2376 phys[idim] += metric_cofactor[idim][idim2]
2382 template <
typename real,
int dim,
int n_faces>
2384 const dealii::Tensor<1,dim,std::vector<real>> &phys,
2385 const dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
2386 dealii::Tensor<1,dim,std::vector<real>> &ref)
2388 assert(phys[0].size() == metric_cofactor[0][0].size());
2389 const unsigned int n_pts = phys[0].size();
2390 for(
int idim=0; idim<dim; idim++){
2391 ref[idim].resize(n_pts);
2392 for(
int idim2=0; idim2<dim; idim2++){
2393 for(
unsigned int ipt=0; ipt<n_pts; ipt++){
2394 ref[idim][ipt] += metric_cofactor[idim2][idim][ipt] * phys[idim2][ipt];
2401 template <
typename real,
int dim,
int n_faces>
2403 const unsigned int n_quad_pts,
2404 const dealii::Tensor<1,dim,real> &ref,
2405 const dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
2406 std::vector<dealii::Tensor<1,dim,real>> &phys)
2408 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
2410 for(
int idim=0; idim<dim; idim++){
2411 phys[iquad][idim] = 0.0;
2412 for(
int idim2=0; idim2<dim; idim2++){
2413 phys[iquad][idim] += metric_cofactor[idim][idim2][iquad]
2416 norm += phys[iquad][idim] * phys[iquad][idim];
2418 phys[iquad] /= sqrt(norm);
2422 template <
typename real,
int dim,
int n_faces>
2424 const unsigned int n_quad_pts,
2425 const unsigned int ,
2426 const std::array<std::vector<real>,dim> &mapping_support_points,
2433 mapping_support_points,
2443 template <
typename real,
int dim,
int n_faces>
2445 const unsigned int n_quad_pts,
2446 const unsigned int n_metric_dofs,
2447 const std::array<std::vector<real>,dim> &mapping_support_points,
2449 const bool use_invariant_curl_form)
2452 for(
int idim=0; idim<dim; idim++){
2453 for(
int jdim=0; jdim<dim; jdim++){
2460 mapping_support_points,
2472 mapping_support_points,
2486 use_invariant_curl_form);
2489 for(
int idim=0; idim<dim; idim++){
2500 template <
typename real,
int dim,
int n_faces>
2502 const unsigned int iface,
2503 const unsigned int n_quad_pts,
2504 const unsigned int n_metric_dofs,
2505 const std::array<std::vector<real>,dim> &mapping_support_points,
2507 const bool use_invariant_curl_form)
2510 for(
int idim=0; idim<dim; idim++){
2511 for(
int jdim=0; jdim<dim; jdim++){
2518 mapping_support_points,
2542 mapping_support_points,
2568 use_invariant_curl_form);
2571 for(
int iface=0; iface<n_faces; iface++){
2572 for(
int idim=0; idim<dim; idim++){
2590 template <
typename real,
int dim,
int n_faces>
2592 const unsigned int n_quad_pts,
2593 const std::array<std::vector<real>,dim> &mapping_support_points,
2594 const dealii::FullMatrix<double> &basis_x_flux_nodes,
2595 const dealii::FullMatrix<double> &basis_y_flux_nodes,
2596 const dealii::FullMatrix<double> &basis_z_flux_nodes,
2597 const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
2598 const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
2599 const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
2600 std::vector<dealii::Tensor<2,dim,real>> &local_Jac)
2602 for(
int idim=0; idim<dim; idim++){
2603 for(
int jdim=0; jdim<dim; jdim++){
2605 std::vector<real> output_vect(n_quad_pts);
2608 grad_basis_x_flux_nodes,
2610 basis_z_flux_nodes);
2614 grad_basis_y_flux_nodes,
2615 basis_z_flux_nodes);
2620 grad_basis_z_flux_nodes);
2621 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
2622 local_Jac[iquad][idim][jdim] = output_vect[iquad];
2628 template <
typename real,
int dim,
int n_faces>
2630 const unsigned int n_quad_pts,
2631 const std::array<std::vector<real>,dim> &mapping_support_points,
2632 const dealii::FullMatrix<double> &basis_x_flux_nodes,
2633 const dealii::FullMatrix<double> &basis_y_flux_nodes,
2634 const dealii::FullMatrix<double> &basis_z_flux_nodes,
2635 const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
2636 const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
2637 const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
2638 std::vector<real> &det_metric_Jac)
2641 assert(pow(this->
max_grid_degree+1,dim) == mapping_support_points[0].size());
2643 std::vector<dealii::Tensor<2,dim,real>> Jacobian_flux_nodes(n_quad_pts);
2645 mapping_support_points,
2649 grad_basis_x_flux_nodes,
2650 grad_basis_y_flux_nodes,
2651 grad_basis_z_flux_nodes,
2652 Jacobian_flux_nodes);
2654 for(
int idim=0; idim<dim; idim++){
2655 for(
int jdim=0; jdim<dim; jdim++){
2657 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
2664 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
2665 det_metric_Jac[iquad] = dealii::determinant(Jacobian_flux_nodes[iquad]);
2667 if(det_metric_Jac[iquad] <= 1e-14){
2668 std::cout<<
"The determinant of the Jacobian is negative. Aborting..."<<std::endl;
2673 template <
typename real,
int dim,
int n_faces>
2675 const unsigned int n_quad_pts,
2676 const unsigned int n_metric_dofs,
2677 const std::array<std::vector<real>,dim> &mapping_support_points,
2678 const dealii::FullMatrix<double> &basis_x_grid_nodes,
2679 const dealii::FullMatrix<double> &basis_y_grid_nodes,
2680 const dealii::FullMatrix<double> &basis_z_grid_nodes,
2681 const dealii::FullMatrix<double> &basis_x_flux_nodes,
2682 const dealii::FullMatrix<double> &basis_y_flux_nodes,
2683 const dealii::FullMatrix<double> &basis_z_flux_nodes,
2684 const dealii::FullMatrix<double> &grad_basis_x_grid_nodes,
2685 const dealii::FullMatrix<double> &grad_basis_y_grid_nodes,
2686 const dealii::FullMatrix<double> &grad_basis_z_grid_nodes,
2687 const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
2688 const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
2689 const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
2690 dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
2691 const bool use_invariant_curl_form)
2696 std::fill(metric_cofactor[0][0].begin(), metric_cofactor[0][0].end(), 1.0);
2699 std::vector<dealii::Tensor<2,dim,real>> Jacobian_flux_nodes(n_quad_pts);
2701 mapping_support_points,
2705 grad_basis_x_flux_nodes,
2706 grad_basis_y_flux_nodes,
2707 grad_basis_z_flux_nodes,
2708 Jacobian_flux_nodes);
2709 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
2710 metric_cofactor[0][0][iquad] = Jacobian_flux_nodes[iquad][1][1];
2711 metric_cofactor[1][0][iquad] = - Jacobian_flux_nodes[iquad][0][1];
2712 metric_cofactor[0][1][iquad] = - Jacobian_flux_nodes[iquad][1][0];
2713 metric_cofactor[1][1][iquad] = Jacobian_flux_nodes[iquad][0][0];
2719 mapping_support_points,
2726 grad_basis_x_grid_nodes,
2727 grad_basis_y_grid_nodes,
2728 grad_basis_z_grid_nodes,
2729 grad_basis_x_flux_nodes,
2730 grad_basis_y_flux_nodes,
2731 grad_basis_z_flux_nodes,
2733 use_invariant_curl_form);
2737 template <
typename real,
int dim,
int n_faces>
2739 const unsigned int n_metric_dofs,
2740 const unsigned int ,
2741 const std::array<std::vector<real>,dim> &mapping_support_points,
2742 const dealii::FullMatrix<double> &basis_x_grid_nodes,
2743 const dealii::FullMatrix<double> &basis_y_grid_nodes,
2744 const dealii::FullMatrix<double> &basis_z_grid_nodes,
2745 const dealii::FullMatrix<double> &basis_x_flux_nodes,
2746 const dealii::FullMatrix<double> &basis_y_flux_nodes,
2747 const dealii::FullMatrix<double> &basis_z_flux_nodes,
2748 const dealii::FullMatrix<double> &grad_basis_x_grid_nodes,
2749 const dealii::FullMatrix<double> &grad_basis_y_grid_nodes,
2750 const dealii::FullMatrix<double> &grad_basis_z_grid_nodes,
2751 const dealii::FullMatrix<double> &grad_basis_x_flux_nodes,
2752 const dealii::FullMatrix<double> &grad_basis_y_flux_nodes,
2753 const dealii::FullMatrix<double> &grad_basis_z_flux_nodes,
2754 dealii::Tensor<2,dim,std::vector<real>> &metric_cofactor,
2755 const bool use_invariant_curl_form)
2760 std::vector<dealii::Tensor<2,dim,real>> grad_Xm(n_metric_dofs);
2762 mapping_support_points,
2766 grad_basis_x_grid_nodes,
2767 grad_basis_y_grid_nodes,
2768 grad_basis_z_grid_nodes,
2773 std::vector<real> z_dy_dxi(n_metric_dofs);
2774 std::vector<real> z_dy_deta(n_metric_dofs);
2775 std::vector<real> z_dy_dzeta(n_metric_dofs);
2777 std::vector<real> x_dz_dxi(n_metric_dofs);
2778 std::vector<real> x_dz_deta(n_metric_dofs);
2779 std::vector<real> x_dz_dzeta(n_metric_dofs);
2781 std::vector<real> y_dx_dxi(n_metric_dofs);
2782 std::vector<real> y_dx_deta(n_metric_dofs);
2783 std::vector<real> y_dx_dzeta(n_metric_dofs);
2785 for(
unsigned int grid_node=0; grid_node<n_metric_dofs; grid_node++){
2786 z_dy_dxi[grid_node] = mapping_support_points[2][grid_node] * grad_Xm[grid_node][1][0];
2787 if(use_invariant_curl_form){
2788 z_dy_dxi[grid_node] = 0.5 * z_dy_dxi[grid_node]
2789 - 0.5 * mapping_support_points[1][grid_node] * grad_Xm[grid_node][2][0];
2791 z_dy_deta[grid_node] = mapping_support_points[2][grid_node] * grad_Xm[grid_node][1][1];
2792 if(use_invariant_curl_form){
2793 z_dy_deta[grid_node] = 0.5 * z_dy_deta[grid_node]
2794 - 0.5 * mapping_support_points[1][grid_node] * grad_Xm[grid_node][2][1];
2796 z_dy_dzeta[grid_node] = mapping_support_points[2][grid_node] * grad_Xm[grid_node][1][2];
2797 if(use_invariant_curl_form){
2798 z_dy_dzeta[grid_node] = 0.5 * z_dy_dzeta[grid_node]
2799 - 0.5 * mapping_support_points[1][grid_node] * grad_Xm[grid_node][2][2];
2802 x_dz_dxi[grid_node] = mapping_support_points[0][grid_node] * grad_Xm[grid_node][2][0];
2803 if(use_invariant_curl_form){
2804 x_dz_dxi[grid_node] = 0.5 * x_dz_dxi[grid_node]
2805 - 0.5 * mapping_support_points[2][grid_node] * grad_Xm[grid_node][0][0];
2807 x_dz_deta[grid_node] = mapping_support_points[0][grid_node] * grad_Xm[grid_node][2][1];
2808 if(use_invariant_curl_form){
2809 x_dz_deta[grid_node] = 0.5 * x_dz_deta[grid_node]
2810 - 0.5 * mapping_support_points[2][grid_node] * grad_Xm[grid_node][0][1];
2812 x_dz_dzeta[grid_node] = mapping_support_points[0][grid_node] * grad_Xm[grid_node][2][2];
2813 if(use_invariant_curl_form){
2814 x_dz_dzeta[grid_node] = 0.5 * x_dz_dzeta[grid_node]
2815 - 0.5 * mapping_support_points[2][grid_node] * grad_Xm[grid_node][0][2];
2818 y_dx_dxi[grid_node] = mapping_support_points[1][grid_node] * grad_Xm[grid_node][0][0];
2819 if(use_invariant_curl_form){
2820 y_dx_dxi[grid_node] = 0.5 * y_dx_dxi[grid_node]
2821 - 0.5 * mapping_support_points[0][grid_node] * grad_Xm[grid_node][1][0];
2823 y_dx_deta[grid_node] = mapping_support_points[1][grid_node] * grad_Xm[grid_node][0][1];
2824 if(use_invariant_curl_form){
2825 y_dx_deta[grid_node] = 0.5 * y_dx_deta[grid_node]
2826 - 0.5 * mapping_support_points[0][grid_node] * grad_Xm[grid_node][1][1];
2828 y_dx_dzeta[grid_node] = mapping_support_points[1][grid_node] * grad_Xm[grid_node][0][2];
2829 if(use_invariant_curl_form){
2830 y_dx_dzeta[grid_node] = 0.5 * y_dx_dzeta[grid_node]
2831 - 0.5 * mapping_support_points[0][grid_node] * grad_Xm[grid_node][1][2];
2838 basis_x_flux_nodes, grad_basis_y_flux_nodes, basis_z_flux_nodes,
false, -1.0);
2840 basis_x_flux_nodes, basis_y_flux_nodes, grad_basis_z_flux_nodes,
true);
2843 grad_basis_x_flux_nodes, basis_y_flux_nodes, basis_z_flux_nodes);
2845 basis_x_flux_nodes, basis_y_flux_nodes, grad_basis_z_flux_nodes,
true, -1.0);
2848 grad_basis_x_flux_nodes, basis_y_flux_nodes, basis_z_flux_nodes,
false, -1.0);
2850 basis_x_flux_nodes, grad_basis_y_flux_nodes, basis_z_flux_nodes,
true);
2854 basis_x_flux_nodes, grad_basis_y_flux_nodes, basis_z_flux_nodes,
false, -1.0);
2856 basis_x_flux_nodes, basis_y_flux_nodes, grad_basis_z_flux_nodes,
true);
2859 grad_basis_x_flux_nodes, basis_y_flux_nodes, basis_z_flux_nodes);
2861 basis_x_flux_nodes, basis_y_flux_nodes, grad_basis_z_flux_nodes,
true, -1.0);
2864 grad_basis_x_flux_nodes, basis_y_flux_nodes, basis_z_flux_nodes,
false, -1.0);
2866 basis_x_flux_nodes, grad_basis_y_flux_nodes, basis_z_flux_nodes,
true);
2870 basis_x_flux_nodes, grad_basis_y_flux_nodes, basis_z_flux_nodes,
false, -1.0);
2872 basis_x_flux_nodes, basis_y_flux_nodes, grad_basis_z_flux_nodes,
true);
2875 grad_basis_x_flux_nodes, basis_y_flux_nodes, basis_z_flux_nodes);
2877 basis_x_flux_nodes, basis_y_flux_nodes, grad_basis_z_flux_nodes,
true, -1.0);
2880 grad_basis_x_flux_nodes, basis_y_flux_nodes, basis_z_flux_nodes,
false, -1.0);
2882 basis_x_flux_nodes, grad_basis_y_flux_nodes, basis_z_flux_nodes,
true);
2892 template <
int dim,
int nstate,
int n_faces>
2894 const unsigned int max_degree_input,
2895 const unsigned int grid_degree_input)
2899 template <
int dim,
int nstate,
int n_faces>
2901 const unsigned int max_degree_input,
2902 const unsigned int grid_degree_input)
2909 template <
int dim,
int nstate,
int n_faces>
2911 const dealii::FESystem<1,1> &finite_element,
2912 const dealii::Quadrature<1> &quadrature)
2914 const unsigned int n_quad_pts = quadrature.size();
2915 const unsigned int n_dofs = finite_element.dofs_per_cell;
2916 const unsigned int n_shape_fns = n_dofs /
nstate;
2919 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
2920 const dealii::Point<1> qpoint = quadrature.point(iquad);
2921 for(
unsigned int idof=0; idof<n_dofs; idof++){
2922 const unsigned int istate = finite_element.system_to_component_index(idof).first;
2923 const unsigned int ishape = finite_element.system_to_component_index(idof).second;
2928 this->
oneD_vol_state_operator[istate][iquad][ishape] = finite_element.shape_value_component(idof,qpoint,istate);
2933 template <
int dim,
int nstate,
int n_faces>
2935 const dealii::FESystem<1,1> &finite_element,
2936 const dealii::Quadrature<1> &quadrature)
2938 const unsigned int n_quad_pts = quadrature.size();
2939 const unsigned int n_dofs = finite_element.dofs_per_cell;
2940 const unsigned int n_shape_fns = n_dofs /
nstate;
2942 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
2943 const dealii::Point<1> qpoint = quadrature.point(iquad);
2944 for(
unsigned int idof=0; idof<n_dofs; idof++){
2945 const unsigned int istate = finite_element.system_to_component_index(idof).first;
2946 const unsigned int ishape = finite_element.system_to_component_index(idof).second;
2950 this->
oneD_grad_state_operator[istate][iquad][ishape] = finite_element.shape_grad_component(idof, qpoint, istate)[0];
2954 template <
int dim,
int nstate,
int n_faces>
2956 const dealii::FESystem<1,1> &finite_element,
2957 const dealii::Quadrature<0> &face_quadrature)
2959 const unsigned int n_face_quad_pts = face_quadrature.size();
2960 const unsigned int n_dofs = finite_element.dofs_per_cell;
2961 const unsigned int n_faces_1D = n_faces / dim;
2962 const unsigned int n_shape_fns = n_dofs /
nstate;
2964 for(
unsigned int iface=0; iface<n_faces_1D; iface++){
2965 const dealii::Quadrature<1> quadrature = dealii::QProjector<1>::project_to_face(dealii::ReferenceCell::get_hypercube(1),
2968 for(
unsigned int iquad=0; iquad<n_face_quad_pts; iquad++){
2969 for(
unsigned int idof=0; idof<n_dofs; idof++){
2970 const unsigned int istate = finite_element.system_to_component_index(idof).first;
2971 const unsigned int ishape = finite_element.system_to_component_index(idof).second;
2975 this->
oneD_surf_state_operator[istate][iface][iquad][ishape] = finite_element.shape_value_component(idof,quadrature.point(iquad),istate);
2981 template <
int dim,
int nstate,
int n_faces>
2983 const unsigned int max_degree_input,
2984 const unsigned int grid_degree_input)
2991 template <
int dim,
int nstate,
int n_faces>
2993 const dealii::FESystem<1,1> &finite_element,
2994 const dealii::Quadrature<1> &quadrature)
2996 const unsigned int n_quad_pts = quadrature.size();
2997 const unsigned int n_dofs = finite_element.dofs_per_cell;
2998 assert(n_dofs == n_quad_pts);
3001 for(
int istate=0; istate<
nstate; istate++){
3004 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
3005 const dealii::Point<1> qpoint = quadrature.point(iquad);
3006 for(
unsigned int idof=0; idof<n_dofs; idof++){
3014 template <
int dim,
int nstate,
int n_faces>
3016 const dealii::FESystem<1,1> &finite_element,
3017 const dealii::Quadrature<1> &quadrature)
3019 const unsigned int n_quad_pts = quadrature.size();
3020 const unsigned int n_dofs = finite_element.dofs_per_cell;
3021 assert(n_dofs == n_quad_pts);
3023 for(
int istate=0; istate<
nstate; istate++){
3026 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
3027 const dealii::Point<1> qpoint = quadrature.point(iquad);
3028 for(
unsigned int idof=0; idof<n_dofs; idof++){
3034 template <
int dim,
int nstate,
int n_faces>
3036 const dealii::FESystem<1,1> &finite_element,
3037 const dealii::Quadrature<0> &face_quadrature)
3039 const unsigned int n_face_quad_pts = face_quadrature.size();
3040 const unsigned int n_dofs = finite_element.dofs_per_cell;
3041 const unsigned int n_faces_1D = n_faces / dim;
3043 for(
unsigned int iface=0; iface<n_faces_1D; iface++){
3044 const dealii::Quadrature<1> quadrature = dealii::QProjector<1>::project_to_face(dealii::ReferenceCell::get_hypercube(1),
3047 for(
int istate=0; istate<
nstate; istate++){
3049 for(
unsigned int iquad=0; iquad<n_face_quad_pts; iquad++){
3050 for(
unsigned int idof=0; idof<n_dofs; idof++){
3051 this->
oneD_surf_state_operator[istate][iface][iquad][idof] = finite_element.shape_value_component(idof,quadrature.point(iquad),0);
3059 template <
int dim,
int nstate,
int n_faces>
3061 const unsigned int max_degree_input,
3062 const unsigned int grid_degree_input)
3069 template <
int dim,
int nstate,
int n_faces>
3071 const dealii::FESystem<1,1> &finite_element,
3072 const dealii::Quadrature<1> &quadrature)
3074 const unsigned int n_quad_pts = quadrature.size();
3075 const unsigned int n_dofs_flux = quadrature.size();
3076 const unsigned int n_dofs = finite_element.dofs_per_cell;
3078 const std::vector<double> &quad_weights = quadrature.get_weights ();
3079 for(
int istate_flux=0; istate_flux<
nstate; istate_flux++){
3082 for(
unsigned int itest=0; itest<n_dofs; itest++){
3083 const int istate_test = finite_element.system_to_component_index(itest).first;
3084 for(
unsigned int idof=0; idof<n_dofs_flux; idof++){
3086 for(
unsigned int iquad=0; iquad<n_quad_pts; iquad++){
3087 const dealii::Point<1> qpoint = quadrature.point(iquad);
3088 value += finite_element.shape_value_component(itest, qpoint, istate_test)
3089 * quad_weights[iquad]
3161 const std::vector<double> &input_vect,
3162 std::vector<double> &output_vect,
3163 const dealii::FullMatrix<double> &basis_x,
3164 const dealii::FullMatrix<double> &basis_y,
3165 const dealii::FullMatrix<double> &basis_z,
3167 const double factor);
3169 const std::vector<FadType> &input_vect,
3170 std::vector<FadType> &output_vect,
3171 const dealii::FullMatrix<double> &basis_x,
3172 const dealii::FullMatrix<double> &basis_y,
3173 const dealii::FullMatrix<double> &basis_z,
3175 const double factor);
3177 const std::vector<RadType> &input_vect,
3178 std::vector<RadType> &output_vect,
3179 const dealii::FullMatrix<double> &basis_x,
3180 const dealii::FullMatrix<double> &basis_y,
3181 const dealii::FullMatrix<double> &basis_z,
3183 const double factor);
3185 const std::vector<FadFadType> &input_vect,
3186 std::vector<FadFadType> &output_vect,
3187 const dealii::FullMatrix<double> &basis_x,
3188 const dealii::FullMatrix<double> &basis_y,
3189 const dealii::FullMatrix<double> &basis_z,
3191 const double factor);
3193 const std::vector<RadFadType> &input_vect,
3194 std::vector<RadFadType> &output_vect,
3195 const dealii::FullMatrix<double> &basis_x,
3196 const dealii::FullMatrix<double> &basis_y,
3197 const dealii::FullMatrix<double> &basis_z,
3199 const double factor);
3202 const dealii::Tensor<1,PHILIP_DIM,std::vector<double>> &input_vect,
3203 std::vector<double> &output_vect,
3204 const dealii::FullMatrix<double> &basis_x,
3205 const dealii::FullMatrix<double> &basis_y,
3206 const dealii::FullMatrix<double> &basis_z,
3207 const dealii::FullMatrix<double> &gradient_basis_x,
3208 const dealii::FullMatrix<double> &gradient_basis_y,
3209 const dealii::FullMatrix<double> &gradient_basis_z);
3211 const dealii::Tensor<1,PHILIP_DIM,std::vector<FadType>> &input_vect,
3212 std::vector<FadType> &output_vect,
3213 const dealii::FullMatrix<double> &basis_x,
3214 const dealii::FullMatrix<double> &basis_y,
3215 const dealii::FullMatrix<double> &basis_z,
3216 const dealii::FullMatrix<double> &gradient_basis_x,
3217 const dealii::FullMatrix<double> &gradient_basis_y,
3218 const dealii::FullMatrix<double> &gradient_basis_z);
3220 const dealii::Tensor<1,PHILIP_DIM,std::vector<RadType>> &input_vect,
3221 std::vector<RadType> &output_vect,
3222 const dealii::FullMatrix<double> &basis_x,
3223 const dealii::FullMatrix<double> &basis_y,
3224 const dealii::FullMatrix<double> &basis_z,
3225 const dealii::FullMatrix<double> &gradient_basis_x,
3226 const dealii::FullMatrix<double> &gradient_basis_y,
3227 const dealii::FullMatrix<double> &gradient_basis_z);
3229 const dealii::Tensor<1,PHILIP_DIM,std::vector<FadFadType>> &input_vect,
3230 std::vector<FadFadType> &output_vect,
3231 const dealii::FullMatrix<double> &basis_x,
3232 const dealii::FullMatrix<double> &basis_y,
3233 const dealii::FullMatrix<double> &basis_z,
3234 const dealii::FullMatrix<double> &gradient_basis_x,
3235 const dealii::FullMatrix<double> &gradient_basis_y,
3236 const dealii::FullMatrix<double> &gradient_basis_z);
3238 const dealii::Tensor<1,PHILIP_DIM,std::vector<RadFadType>> &input_vect,
3239 std::vector<RadFadType> &output_vect,
3240 const dealii::FullMatrix<double> &basis_x,
3241 const dealii::FullMatrix<double> &basis_y,
3242 const dealii::FullMatrix<double> &basis_z,
3243 const dealii::FullMatrix<double> &gradient_basis_x,
3244 const dealii::FullMatrix<double> &gradient_basis_y,
3245 const dealii::FullMatrix<double> &gradient_basis_z);
3248 const dealii::Tensor<1,PHILIP_DIM,std::vector<double>> &input_vect,
3249 std::vector<double> &output_vect,
3250 const dealii::FullMatrix<double> &basis,
3251 const dealii::FullMatrix<double> &gradient_basis);
3253 const dealii::Tensor<1,PHILIP_DIM,std::vector<FadType>> &input_vect,
3254 std::vector<FadType> &output_vect,
3255 const dealii::FullMatrix<double> &basis,
3256 const dealii::FullMatrix<double> &gradient_basis);
3258 const dealii::Tensor<1,PHILIP_DIM,std::vector<RadType>> &input_vect,
3259 std::vector<RadType> &output_vect,
3260 const dealii::FullMatrix<double> &basis,
3261 const dealii::FullMatrix<double> &gradient_basis);
3263 const dealii::Tensor<1,PHILIP_DIM,std::vector<FadFadType>> &input_vect,
3264 std::vector<FadFadType> &output_vect,
3265 const dealii::FullMatrix<double> &basis,
3266 const dealii::FullMatrix<double> &gradient_basis);
3268 const dealii::Tensor<1,PHILIP_DIM,std::vector<RadFadType>> &input_vect,
3269 std::vector<RadFadType> &output_vect,
3270 const dealii::FullMatrix<double> &basis,
3271 const dealii::FullMatrix<double> &gradient_basis);
3275 const std::vector<double> &input_vect,
3276 dealii::Tensor<1,PHILIP_DIM,std::vector<double>> &output_vect,
3277 const dealii::FullMatrix<double> &basis_x,
3278 const dealii::FullMatrix<double> &basis_y,
3279 const dealii::FullMatrix<double> &basis_z,
3280 const dealii::FullMatrix<double> &gradient_basis_x,
3281 const dealii::FullMatrix<double> &gradient_basis_y,
3282 const dealii::FullMatrix<double> &gradient_basis_z);
3284 const std::vector<FadType> &input_vect,
3285 dealii::Tensor<1,PHILIP_DIM,std::vector<FadType>> &output_vect,
3286 const dealii::FullMatrix<double> &basis_x,
3287 const dealii::FullMatrix<double> &basis_y,
3288 const dealii::FullMatrix<double> &basis_z,
3289 const dealii::FullMatrix<double> &gradient_basis_x,
3290 const dealii::FullMatrix<double> &gradient_basis_y,
3291 const dealii::FullMatrix<double> &gradient_basis_z);
3293 const std::vector<RadType> &input_vect,
3294 dealii::Tensor<1,PHILIP_DIM,std::vector<RadType>> &output_vect,
3295 const dealii::FullMatrix<double> &basis_x,
3296 const dealii::FullMatrix<double> &basis_y,
3297 const dealii::FullMatrix<double> &basis_z,
3298 const dealii::FullMatrix<double> &gradient_basis_x,
3299 const dealii::FullMatrix<double> &gradient_basis_y,
3300 const dealii::FullMatrix<double> &gradient_basis_z);
3302 const std::vector<FadFadType> &input_vect,
3303 dealii::Tensor<1,PHILIP_DIM,std::vector<FadFadType>> &output_vect,
3304 const dealii::FullMatrix<double> &basis_x,
3305 const dealii::FullMatrix<double> &basis_y,
3306 const dealii::FullMatrix<double> &basis_z,
3307 const dealii::FullMatrix<double> &gradient_basis_x,
3308 const dealii::FullMatrix<double> &gradient_basis_y,
3309 const dealii::FullMatrix<double> &gradient_basis_z);
3311 const std::vector<RadFadType> &input_vect,
3312 dealii::Tensor<1,PHILIP_DIM,std::vector<RadFadType>> &output_vect,
3313 const dealii::FullMatrix<double> &basis_x,
3314 const dealii::FullMatrix<double> &basis_y,
3315 const dealii::FullMatrix<double> &basis_z,
3316 const dealii::FullMatrix<double> &gradient_basis_x,
3317 const dealii::FullMatrix<double> &gradient_basis_y,
3318 const dealii::FullMatrix<double> &gradient_basis_z);
3321 const std::vector<double> &input_vect,
3322 dealii::Tensor<1,PHILIP_DIM,std::vector<double>> &output_vect,
3323 const dealii::FullMatrix<double> &basis,
3324 const dealii::FullMatrix<double> &gradient_basis);
3326 const std::vector<FadType> &input_vect,
3327 dealii::Tensor<1,PHILIP_DIM,std::vector<FadType>> &output_vect,
3328 const dealii::FullMatrix<double> &basis,
3329 const dealii::FullMatrix<double> &gradient_basis);
3331 const std::vector<RadType> &input_vect,
3332 dealii::Tensor<1,PHILIP_DIM,std::vector<RadType>> &output_vect,
3333 const dealii::FullMatrix<double> &basis,
3334 const dealii::FullMatrix<double> &gradient_basis);
3336 const std::vector<FadFadType> &input_vect,
3337 dealii::Tensor<1,PHILIP_DIM,std::vector<FadFadType>> &output_vect,
3338 const dealii::FullMatrix<double> &basis,
3339 const dealii::FullMatrix<double> &gradient_basis);
3341 const std::vector<RadFadType> &input_vect,
3342 dealii::Tensor<1,PHILIP_DIM,std::vector<RadFadType>> &output_vect,
3343 const dealii::FullMatrix<double> &basis,
3344 const dealii::FullMatrix<double> &gradient_basis);
3348 const std::vector<double> &input_vect,
3349 const std::vector<double> &weight_vect,
3350 std::vector<double> &output_vect,
3351 const dealii::FullMatrix<double> &basis_x,
3352 const dealii::FullMatrix<double> &basis_y,
3353 const dealii::FullMatrix<double> &basis_z,
3354 const bool adding =
false,
3355 const double factor = 1.0);
3357 const std::vector<FadType> &input_vect,
3358 const std::vector<double> &weight_vect,
3359 std::vector<FadType> &output_vect,
3360 const dealii::FullMatrix<double> &basis_x,
3361 const dealii::FullMatrix<double> &basis_y,
3362 const dealii::FullMatrix<double> &basis_z,
3363 const bool adding =
false,
3364 const double factor = 1.0);
3366 const std::vector<RadType> &input_vect,
3367 const std::vector<double> &weight_vect,
3368 std::vector<RadType> &output_vect,
3369 const dealii::FullMatrix<double> &basis_x,
3370 const dealii::FullMatrix<double> &basis_y,
3371 const dealii::FullMatrix<double> &basis_z,
3372 const bool adding =
false,
3373 const double factor = 1.0);
3375 const std::vector<FadFadType> &input_vect,
3376 const std::vector<double> &weight_vect,
3377 std::vector<FadFadType> &output_vect,
3378 const dealii::FullMatrix<double> &basis_x,
3379 const dealii::FullMatrix<double> &basis_y,
3380 const dealii::FullMatrix<double> &basis_z,
3381 const bool adding =
false,
3382 const double factor = 1.0);
3384 const std::vector<RadFadType> &input_vect,
3385 const std::vector<double> &weight_vect,
3386 std::vector<RadFadType> &output_vect,
3387 const dealii::FullMatrix<double> &basis_x,
3388 const dealii::FullMatrix<double> &basis_y,
3389 const dealii::FullMatrix<double> &basis_z,
3390 const bool adding =
false,
3391 const double factor = 1.0);
3394 const std::vector<double> &input_vect,
3395 std::vector<double> &output_vect,
3396 const dealii::FullMatrix<double> &basis_x,
3397 const bool adding =
false,
3398 const double factor = 1.0);
3400 const std::vector<FadType> &input_vect,
3401 std::vector<FadType> &output_vect,
3402 const dealii::FullMatrix<double> &basis_x,
3403 const bool adding =
false,
3404 const double factor = 1.0);
3406 const std::vector<RadType> &input_vect,
3407 std::vector<RadType> &output_vect,
3408 const dealii::FullMatrix<double> &basis_x,
3409 const bool adding =
false,
3410 const double factor = 1.0);
3412 const std::vector<FadFadType> &input_vect,
3413 std::vector<FadFadType> &output_vect,
3414 const dealii::FullMatrix<double> &basis_x,
3415 const bool adding =
false,
3416 const double factor = 1.0);
3418 const std::vector<RadFadType> &input_vect,
3419 std::vector<RadFadType> &output_vect,
3420 const dealii::FullMatrix<double> &basis_x,
3421 const bool adding =
false,
3422 const double factor = 1.0);
3425 const std::vector<double> &input_vect,
3426 const std::vector<double> &weight_vect,
3427 std::vector<double> &output_vect,
3428 const dealii::FullMatrix<double> &basis_x,
3429 const bool adding =
false,
3430 const double factor = 1.0);
3432 const std::vector<FadType> &input_vect,
3433 const std::vector<double> &weight_vect,
3434 std::vector<FadType> &output_vect,
3435 const dealii::FullMatrix<double> &basis_x,
3436 const bool adding =
false,
3437 const double factor = 1.0);
3439 const std::vector<RadType> &input_vect,
3440 const std::vector<double> &weight_vect,
3441 std::vector<RadType> &output_vect,
3442 const dealii::FullMatrix<double> &basis_x,
3443 const bool adding =
false,
3444 const double factor = 1.0);
3446 const std::vector<FadFadType> &input_vect,
3447 const std::vector<double> &weight_vect,
3448 std::vector<FadFadType> &output_vect,
3449 const dealii::FullMatrix<double> &basis_x,
3450 const bool adding =
false,
3451 const double factor = 1.0);
3453 const std::vector<RadFadType> &input_vect,
3454 const std::vector<double> &weight_vect,
3455 std::vector<RadFadType> &output_vect,
3456 const dealii::FullMatrix<double> &basis_x,
3457 const bool adding =
false,
3458 const double factor = 1.0);
3461 const std::vector<bool> face_orientation,
3462 const unsigned int face_number,
3463 const std::vector<double> &input_vect,
3464 std::vector<double> &output_vect,
3465 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
3466 const dealii::FullMatrix<double> &basis_vol,
3467 const bool adding =
false,
3468 const double factor = 1.0);
3470 const std::vector<bool> face_orientation,
3471 const unsigned int face_number,
3472 const std::vector<FadType> &input_vect,
3473 std::vector<FadType> &output_vect,
3474 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
3475 const dealii::FullMatrix<double> &basis_vol,
3476 const bool adding =
false,
3477 const double factor = 1.0);
3479 const std::vector<bool> face_orientation,
3480 const unsigned int face_number,
3481 const std::vector<RadType> &input_vect,
3482 std::vector<RadType> &output_vect,
3483 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
3484 const dealii::FullMatrix<double> &basis_vol,
3485 const bool adding =
false,
3486 const double factor = 1.0);
3488 const std::vector<bool> face_orientation,
3489 const unsigned int face_number,
3490 const std::vector<FadFadType> &input_vect,
3491 std::vector<FadFadType> &output_vect,
3492 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
3493 const dealii::FullMatrix<double> &basis_vol,
3494 const bool adding =
false,
3495 const double factor = 1.0);
3497 const std::vector<bool> face_orientation,
3498 const unsigned int face_number,
3499 const std::vector<RadFadType> &input_vect,
3500 std::vector<RadFadType> &output_vect,
3501 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
3502 const dealii::FullMatrix<double> &basis_vol,
3503 const bool adding =
false,
3504 const double factor = 1.0);
3508 const std::vector<bool> face_orientation,
3509 const unsigned int face_number,
3510 const std::vector<double> &input_vect,
3511 const std::vector<double> &weight_vect,
3512 std::vector< double> &output_vect,
3513 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
3514 const dealii::FullMatrix<double> &basis_vol,
3515 const bool adding =
false,
3516 const double factor = 1.0);
3518 const std::vector<bool> face_orientation,
3519 const unsigned int face_number,
3520 const std::vector<FadType> &input_vect,
3521 const std::vector<double> &weight_vect,
3522 std::vector< FadType> &output_vect,
3523 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
3524 const dealii::FullMatrix<double> &basis_vol,
3525 const bool adding =
false,
3526 const double factor = 1.0);
3528 const std::vector<bool> face_orientation,
3529 const unsigned int face_number,
3530 const std::vector<RadType> &input_vect,
3531 const std::vector<double> &weight_vect,
3532 std::vector< RadType> &output_vect,
3533 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
3534 const dealii::FullMatrix<double> &basis_vol,
3535 const bool adding =
false,
3536 const double factor = 1.0);
3538 const std::vector<bool> face_orientation,
3539 const unsigned int face_number,
3540 const std::vector<FadFadType> &input_vect,
3541 const std::vector<double> &weight_vect,
3542 std::vector< FadFadType> &output_vect,
3543 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
3544 const dealii::FullMatrix<double> &basis_vol,
3545 const bool adding =
false,
3546 const double factor = 1.0);
3548 const std::vector<bool> face_orientation,
3549 const unsigned int face_number,
3550 const std::vector<RadFadType> &input_vect,
3551 const std::vector<double> &weight_vect,
3552 std::vector< RadFadType> &output_vect,
3553 const std::array<dealii::FullMatrix<double>,2> &basis_surf,
3554 const dealii::FullMatrix<double> &basis_vol,
3555 const bool adding =
false,
3556 const double factor = 1.0);
3559 const dealii::FullMatrix<double> &input_mat,
3560 const std::vector<double> &input_vect,
3561 std::vector< double> &output_vect);
3563 const dealii::FullMatrix<double> &input_mat,
3564 const std::vector<FadType> &input_vect,
3565 std::vector< FadType> &output_vect);
3567 const dealii::FullMatrix<double> &input_mat,
3568 const std::vector<RadType> &input_vect,
3569 std::vector< RadType> &output_vect);
3571 const dealii::FullMatrix<double> &input_mat,
3572 const std::vector<FadFadType> &input_vect,
3573 std::vector< FadFadType> &output_vect);
3575 const dealii::FullMatrix<double> &input_mat,
3576 const std::vector<RadFadType> &input_vect,
3577 std::vector< RadFadType> &output_vect);
bool store_transpose
Flag is store transpose operator.
The FLUX basis functions separated by nstate with n shape functions.
vol_projection_operator(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
SumFactorizedOperators(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Precompute 1D operator in constructor.
dealii::ConditionalOStream pcout
Parallel std::cout that only outputs on mpi_rank==0.
const unsigned int max_degree
Max polynomial degree.
void inner_product(const std::vector< real > &input_vect, const std::vector< double > &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)
Computes the inner product between a matrix and a vector multiplied by some weight function...
dealii::Tensor< 2, dim, std::vector< real > > metric_cofactor_vol
The volume metric cofactor matrix.
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
const double FR_user_specified_correction_parameter_value
User specified flux recontruction correction parameter value.
lifting_operator_FR(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input, const Parameters::AllParameters::Flux_Reconstruction FR_param_input, const double FR_user_specified_correction_parameter_value_input=0.0)
Constructor.
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 > &mapping_basis, const bool use_invariant_curl_form=false)
Builds the facet metric operators.
The metric independent inverse of the FR mass matrix .
basis_functions< dim, n_faces > mapping_shape_functions_flux_nodes
Object of mapping shape functions evaluated at flux nodes.
void build_1D_gradient_state_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
unsigned int current_degree
Stores the degree of the current poly degree.
metric_operators(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input, const bool store_vol_flux_nodes_input=false, const bool store_surf_flux_nodes_input=false, const bool store_Jacobian_input=false)
Constructor.
The integration of gradient of solution basis.
FR_mass_inv_aux(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input, const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_input)
Constructor.
const bool store_skew_symmetric_form
Flag to store the skew symmetric form .
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
unsigned int current_degree
Stores the degree of the current poly degree.
const int nstate
Number of states.
void face_orientation_tensor_product(const std::vector< bool > face_orientation, const unsigned int face_number, std::vector< real > &output_vect, const dealii::FullMatrix< double > &basis)
These function correct the face orientation of a face, in case deal.ii changes it.
Sum Factorization derived class.
Sacado::Fad::DFad< double > FadType
Sacado AD type for first derivatives.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
double FR_param
Flux reconstruction paramater value.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &face_quadrature)
Assembles the one dimensional norm operator that it is lifted onto.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
void get_FR_correction_parameter(const unsigned int curr_cell_degree, double &c)
Gets the FR correction parameter for the primary equation and stores.
codi_JacobianComputationType RadType
CoDiPaco reverse-AD type for first derivatives.
unsigned int current_degree
Stores the degree of the current poly degree.
The metric independent FR mass matrix for auxiliary equation .
void build_1D_volume_state_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
void transform_reference_unit_normal_to_physical_unit_normal(const unsigned int n_quad_pts, const dealii::Tensor< 1, dim, real > &ref, const dealii::Tensor< 2, dim, std::vector< real >> &metric_cofactor, std::vector< dealii::Tensor< 1, dim, real >> &phys)
Given a reference tensor, return the physical tensor.
void build_1D_shape_functions_at_volume_flux_nodes(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Constructs the volume and volume gradient operator.
void Hadamard_product(const dealii::FullMatrix< double > &input_mat1, const dealii::FullMatrix< double > &input_mat2, dealii::FullMatrix< double > &output_mat)
Computes a single Hadamard product.
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.
FR_mass(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input, const Parameters::AllParameters::Flux_Reconstruction FR_param_input, const double FR_user_specified_correction_parameter_value_input=0.0)
Constructor.
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
void build_local_Flux_Reconstruction_operator(const dealii::FullMatrix< double > &local_Mass_Matrix, const dealii::FullMatrix< double > &pth_derivative, const unsigned int n_dofs, const double c, dealii::FullMatrix< double > &Flux_Reconstruction_operator)
Computes a single local Flux_Reconstruction operator (ESFR correction operator) on the fly for a loca...
void build_1D_surface_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 0 > &face_quadrature)
Assembles the one dimensional operator.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
void build_determinant_volume_metric_Jacobian(const unsigned int n_quad_pts, const unsigned int n_metric_dofs, const std::array< std::vector< real >, dim > &mapping_support_points, mapping_shape_functions< dim, n_faces > &mapping_basis)
Builds just the determinant of the volume metric determinant.
Projection operator corresponding to basis functions onto -norm for auxiliary equation.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &face_quadrature)
Assembles the one dimensional norm operator that it is lifted onto.
dealii::FullMatrix< double > build_dim_Flux_Reconstruction_operator(const dealii::FullMatrix< double > &local_Mass_Matrix, const int nstate, const unsigned int n_dofs)
Computes the dim sized flux reconstruction operator with simplified tensor product form...
const double FR_user_specified_correction_parameter_value
User specified flux recontruction correction parameter value.
unsigned int current_degree
Stores the degree of the current poly degree.
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)
Computes a matrix-vector product using sum-factorization. Pass the one-dimensional basis...
Files for the baseline physics.
unsigned int current_degree
Stores the degree of the current poly degree.
void build_1D_shape_functions_at_flux_nodes(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature, const dealii::Quadrature< 0 > &face_quadrature)
Constructs the volume, gradient, surface, and surface gradient operator.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
void compute_local_3D_cofactor(const unsigned int n_metric_dofs, const unsigned int n_quad_pts, const std::array< std::vector< real >, dim > &mapping_support_points, const dealii::FullMatrix< double > &basis_x_grid_nodes, const dealii::FullMatrix< double > &basis_y_grid_nodes, const dealii::FullMatrix< double > &basis_z_grid_nodes, const dealii::FullMatrix< double > &basis_x_flux_nodes, const dealii::FullMatrix< double > &basis_y_flux_nodes, const dealii::FullMatrix< double > &basis_z_flux_nodes, const dealii::FullMatrix< double > &grad_basis_x_grid_nodes, const dealii::FullMatrix< double > &grad_basis_y_grid_nodes, const dealii::FullMatrix< double > &grad_basis_z_grid_nodes, const dealii::FullMatrix< double > &grad_basis_x_flux_nodes, const dealii::FullMatrix< double > &grad_basis_y_flux_nodes, const dealii::FullMatrix< double > &grad_basis_z_flux_nodes, dealii::Tensor< 2, dim, std::vector< real >> &metric_cofactor, const bool use_invariant_curl_form=false)
Computes local 3D cofactor matrix.
mapping_shape_functions(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
void divergence_two_pt_flux_Hadamard_product(const dealii::Tensor< 1, dim, dealii::FullMatrix< double >> &input_mat, std::vector< double > &output_vect, const std::vector< double > &weights, const dealii::FullMatrix< double > &basis, const double scaling=2.0)
Computes the divergence of the 2pt flux Hadamard products, then sums the rows.
dealii::Tensor< 2, dim, std::vector< real > > metric_cofactor_surf
The facet metric cofactor matrix, for ONE face.
unsigned int current_degree
Stores the degree of the current poly degree.
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...
lifting_operator(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
Flux_Reconstruction
Type of correction in Flux Reconstruction.
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 bool store_Jacobian
Flag if store metric Jacobian at flux nodes.
basis_functions_state(const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
unsigned int current_degree
Stores the degree of the current poly degree.
-th order modal derivative of basis fuctions, ie/
const double FR_user_specified_correction_parameter_value
User specified flux recontruction correction parameter value.
std::array< dealii::FullMatrix< double >, 2 > oneD_surf_grad_operator
Stores the one dimensional surface gradient operator.
void get_c_negative_FR_parameter(const unsigned int curr_cell_degree, double &c)
Evaluates the flux reconstruction parameter at the bottom limit where the scheme is unstable...
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...
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
That is Quadrature Weights multiplies with basis_at_vol_cubature.
void matrix_vector_mult_surface_1D(const std::vector< bool > face_orientation, 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.
const bool store_surf_flux_nodes
Flag if store metric Jacobian at flux nodes.
void build_local_metric_cofactor_matrix(const unsigned int n_quad_pts, const unsigned int n_metric_dofs, const std::array< std::vector< real >, dim > &mapping_support_points, const dealii::FullMatrix< double > &basis_x_grid_nodes, const dealii::FullMatrix< double > &basis_y_grid_nodes, const dealii::FullMatrix< double > &basis_z_grid_nodes, const dealii::FullMatrix< double > &basis_x_flux_nodes, const dealii::FullMatrix< double > &basis_y_flux_nodes, const dealii::FullMatrix< double > &basis_z_flux_nodes, const dealii::FullMatrix< double > &grad_basis_x_grid_nodes, const dealii::FullMatrix< double > &grad_basis_y_grid_nodes, const dealii::FullMatrix< double > &grad_basis_z_grid_nodes, const dealii::FullMatrix< double > &grad_basis_x_flux_nodes, const dealii::FullMatrix< double > &grad_basis_y_flux_nodes, const dealii::FullMatrix< double > &grad_basis_z_flux_nodes, dealii::Tensor< 2, dim, std::vector< real >> &metric_cofactor, const bool use_invariant_curl_form=false)
Called on the fly and returns the metric cofactor at cubature nodes.
unsigned int current_degree
Stores the degree of the current poly degree.
basis_functions< dim, n_faces > mapping_shape_functions_grid_nodes
Object of mapping shape functions evaluated at grid nodes.
unsigned int current_degree
Stores the degree of the current poly degree.
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.
unsigned int current_degree
Stores the degree of the current poly degree.
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.
void build_1D_surface_gradient_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 0 > &quadrature)
Assembles the one dimensional operator.
void gradient_matrix_vector_mult(const std::vector< real > &input_vect, dealii::Tensor< 1, dim, std::vector< real >> &output_vect, const dealii::FullMatrix< double > &basis_x, const dealii::FullMatrix< double > &basis_y, const dealii::FullMatrix< double > &basis_z, const dealii::FullMatrix< double > &gradient_basis_x, const dealii::FullMatrix< double > &gradient_basis_y, const dealii::FullMatrix< double > &gradient_basis_z)
Computes the gradient of a scalar using sum-factorization.
double compute_factorial(double n)
Standard function to compute factorial of a number.
This is the solution basis , the modal differential opertaor commonly seen in DG defined as ...
ESFR correction matrix without jac dependence.
void get_Huynh_g2_parameter(const unsigned int curr_cell_degree, double &c)
Evaluates Huynh's g2 parameter for flux reconstruction.
std::vector< real > det_Jac_vol
The determinant of the metric Jacobian at volume cubature nodes.
Local mass matrix without jacobian dependence.
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_type
Flux reconstruction parameter type.
The DG lifting operator is defined as the operator that lifts inner products of polynomials of some o...
void build_volume_metric_operators(const unsigned int n_quad_pts, const unsigned int n_metric_dofs, const std::array< std::vector< real >, dim > &mapping_support_points, mapping_shape_functions< dim, n_faces > &mapping_basis, const bool use_invariant_curl_form=false)
Builds the volume metric operators.
dealii::FullMatrix< double > build_dim_mass_matrix(const int nstate, const unsigned int n_dofs, const unsigned int n_quad_pts, basis_functions< dim, n_faces > &basis, const std::vector< double > &det_Jac, const std::vector< double > &quad_weights)
Assemble the dim mass matrix on the fly with metric Jacobian dependence.
bool store_transpose
Flag is store transpose operator.
const unsigned int max_grid_degree
Max grid degree.
void build_metric_Jacobian(const unsigned int n_quad_pts, const std::array< std::vector< real >, dim > &mapping_support_points, const dealii::FullMatrix< double > &basis_x_flux_nodes, const dealii::FullMatrix< double > &basis_y_flux_nodes, const dealii::FullMatrix< double > &basis_z_flux_nodes, const dealii::FullMatrix< double > &grad_basis_x_flux_nodes, const dealii::FullMatrix< double > &grad_basis_y_flux_nodes, const dealii::FullMatrix< double > &grad_basis_z_flux_nodes, std::vector< dealii::Tensor< 2, dim, real >> &local_Jac)
Builds the metric Jacobian evaluated at a vector of points.
void compute_local_vol_projection_operator(const dealii::FullMatrix< double > &norm_matrix_inverse, const dealii::FullMatrix< double > &integral_vol_basis, dealii::FullMatrix< double > &volume_projection)
Computes a single local projection operator on some space (norm).
void Hadamard_product_AD_vector(const dealii::FullMatrix< double > &input_mat1, const std::vector< real > &input_mat2, std::vector< real > &output_mat)
Computes a single Hadamard product for AD type.
void build_1D_gradient_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
dealii::Tensor< 2, dim, std::vector< real > > metric_Jacobian_vol_cubature
Stores the metric Jacobian at flux nodes.
dealii::FullMatrix< double > oneD_transpose_vol_operator
Stores the transpose of the operator for fast weight-adjusted solves.
dealii::FullMatrix< double > build_dim_Flux_Reconstruction_operator_directly(const int nstate, const unsigned int n_dofs, dealii::FullMatrix< double > &pth_deriv, dealii::FullMatrix< double > &mass_matrix)
Computes the dim sized flux reconstruction operator for general Mass Matrix (needed for curvilinear)...
The ESFR lifting operator.
unsigned int current_degree
Stores the degree of the current poly degree.
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 build_1D_surface_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 0 > &face_quadrature)
Assembles the one dimensional operator.
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_type
Flux reconstruction parameter type.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
Base metric operators class that stores functions used in both the volume and on surface.
void build_determinant_metric_Jacobian(const unsigned int n_quad_pts, const std::array< std::vector< real >, dim > &mapping_support_points, const dealii::FullMatrix< double > &basis_x_flux_nodes, const dealii::FullMatrix< double > &basis_y_flux_nodes, const dealii::FullMatrix< double > &basis_z_flux_nodes, const dealii::FullMatrix< double > &grad_basis_x_flux_nodes, const dealii::FullMatrix< double > &grad_basis_y_flux_nodes, const dealii::FullMatrix< double > &grad_basis_z_flux_nodes, std::vector< real > &det_metric_Jac)
Assembles the determinant of metric Jacobian.
ESFR correction matrix for AUX EQUATION without jac dependence.
local_Flux_Reconstruction_operator_aux(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input, const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_aux_input)
Constructor.
void build_1D_surface_state_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 0 > &face_quadrature)
Assembles the one dimensional operator.
dealii::FullMatrix< double > oneD_vol_operator
Stores the one dimensional volume operator.
The mapping shape functions evaluated at the desired nodes (facet set included in volume grid nodes f...
unsigned int current_degree
Stores the degree of the current poly degree.
unsigned int current_grid_degree
Stores the degree of the current grid degree.
unsigned int current_degree
Stores the degree of the current poly degree.
const bool store_vol_flux_nodes
Flag if store metric Jacobian at flux nodes.
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
std::array< dealii::FullMatrix< double >, 2 > oneD_surf_operator
Stores the one dimensional surface operator.
The basis functions separated by nstate with n shape functions.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
unsigned int current_degree
Stores the degree of the current poly degree.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
unsigned int current_degree
Stores the degree of the current poly degree.
The metric independent FR mass matrix .
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
void inner_product_1D(const std::vector< real > &input_vect, const std::vector< double > &weight_vect, std::vector< real > &output_vect, const dealii::FullMatrix< double > &basis_x, const bool adding=false, const double factor=1.0)
Apply the inner product operation using the 1D operator in each direction.
void build_1D_gradient_state_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
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.
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_aux_type
Flux reconstruction parameter type.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
void build_1D_surface_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 0 > &face_quadrature)
Assembles the one dimensional operator.
const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_type
Flux reconstruction parameter type.
void build_local_surface_lifting_operator(const unsigned int n_dofs, const dealii::FullMatrix< double > &norm_matrix, const dealii::FullMatrix< double > &face_integral, dealii::FullMatrix< double > &lifting)
Builds the local lifting operator.
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.
void inner_product_surface_1D(const std::vector< bool > face_orientation, const unsigned int face_number, const std::vector< real > &input_vect, const std::vector< double > &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.
basis_functions(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
std::vector< real > det_Jac_surf
The determinant of the metric Jacobian at facet cubature nodes.
unsigned int current_degree
Stores the degree of the current poly degree.
The metric independent inverse of the FR mass matrix for auxiliary equation .
Projection operator corresponding to basis functions onto -norm.
void get_c_plus_parameter(const unsigned int curr_cell_degree, double &c)
Gets the FR correction parameter corresponding to the maximum timestep.
void build_1D_shape_functions_at_grid_nodes(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Constructs the volume operator and gradient operator.
local_mass(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
unsigned int current_degree
Stores the degree of the current poly degree.
void divergence_matrix_vector_mult(const dealii::Tensor< 1, dim, 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 dealii::FullMatrix< double > &gradient_basis_x, const dealii::FullMatrix< double > &gradient_basis_y, const dealii::FullMatrix< double > &gradient_basis_z)
Computes the divergence using the sum factorization matrix-vector multiplication. ...
vol_integral_gradient_basis(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
void build_1D_volume_state_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
dealii::FullMatrix< double > oneD_skew_symm_vol_oper
Skew-symmetric volume operator .
void get_FR_aux_correction_parameter(const unsigned int curr_cell_degree, double &k)
Gets the FR correction parameter for the auxiliary equations and stores.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
vol_projection_operator_FR(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input, const Parameters::AllParameters::Flux_Reconstruction FR_param_input, const double FR_user_specified_correction_parameter_value_input=0.0, const bool store_transpose_input=false)
Constructor.
std::array< dealii::Tensor< 1, dim, std::vector< real > >, n_faces > flux_nodes_surf
Stores the physical facet flux nodes.
"Stiffness" operator used in DG Strong form.
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...
unsigned int current_degree
Stores the degree of the current poly degree.
FR_mass_aux(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input, const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_input)
Constructor.
virtual void build_1D_volume_state_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
modal_basis_differential_operator(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
void two_pt_flux_Hadamard_product(const dealii::FullMatrix< double > &input_mat, dealii::FullMatrix< double > &output_mat, const dealii::FullMatrix< double > &basis, const std::vector< double > &weights, const int direction)
Computes the Hadamard product ONLY for 2pt flux calculations.
local_Flux_Reconstruction_operator(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input, const Parameters::AllParameters::Flux_Reconstruction FR_param_input, const double FR_user_specified_correction_parameter_value_input=0.0)
Constructor.
double FR_param_aux
Flux reconstruction paramater value.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
FR_mass_inv(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input, const Parameters::AllParameters::Flux_Reconstruction FR_param_input, const double FR_user_specified_correction_parameter_value_input=0.0)
Constructor.
local_basis_stiffness(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input, const bool store_skew_symmetric_form_input=false)
Constructor.
const Parameters::AllParameters::Flux_Reconstruction FR_param_type
Flux reconstruction parameter type.
void get_spectral_difference_parameter(const unsigned int curr_cell_degree, double &c)
Evaluates the spectral difference parameter for flux reconstruction.
const double FR_user_specified_correction_parameter_value
User specified flux recontruction correction parameter value.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
face_integral_basis(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
real1 norm(const dealii::Tensor< 1, dim, real1 > x)
Returns norm of dealii::Tensor<1,dim,real>
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.
void get_c_negative_divided_by_two_FR_parameter(const unsigned int curr_cell_degree, double &c)
Evaluates the flux reconstruction parameter at the bottom limit where the scheme is unstable...
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...
vol_projection_operator_FR_aux(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input, const Parameters::AllParameters::Flux_Reconstruction_Aux FR_param_input, const bool store_transpose_input=false)
Constructor.
void transform_physical_to_reference_vector(const dealii::Tensor< 1, dim, std::vector< real >> &phys, const dealii::Tensor< 2, dim, std::vector< real >> &metric_cofactor, dealii::Tensor< 1, dim, std::vector< real >> &ref)
Given a physical tensor of vector of points, return the reference tensor of vector.
codi_HessianComputationType RadFadType
Nested reverse-forward mode type for Jacobian and Hessian computation using TapeHelper.
const double FR_user_specified_correction_parameter_value
User specified flux recontruction correction parameter value.
void build_1D_volume_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
void build_1D_surface_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 0 > &quadrature)
Assembles the one dimensional operator.
void build_1D_surface_state_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 0 > &face_quadrature)
Assembles the one dimensional operator.
unsigned int current_degree
Stores the degree of the current poly degree.
dealii::Tensor< 1, dim, std::vector< real > > flux_nodes_vol
Stores the physical volume flux nodes.
The surface integral of test functions.
void build_1D_gradient_operator(const dealii::FESystem< 1, 1 > &finite_element, const dealii::Quadrature< 1 > &quadrature)
Assembles the one dimensional operator.
Projection operator corresponding to basis functions onto M-norm (L2).
local_flux_basis_stiffness(const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
unsigned int current_degree
Stores the degree of the current poly degree.
dealii::FullMatrix< double > oneD_transpose_vol_operator
Stores the transpose of the operator for fast weight-adjusted solves.
vol_integral_basis(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
Local stiffness matrix without jacobian dependence.
derivative_p(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
unsigned int current_degree
Stores the degree of the current poly degree.
flux_basis_functions_state(const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
OperatorsBase(const int nstate_input, const unsigned int max_degree_input, const unsigned int grid_degree_input)
Constructor.
unsigned int current_degree
Stores the degree of the current poly degree.
unsigned int current_degree
Stores the degree of the current poly degree.
void surface_two_pt_flux_Hadamard_product(const dealii::FullMatrix< double > &input_mat, std::vector< double > &output_vect_vol, std::vector< double > &output_vect_surf, const std::vector< double > &weights, const std::array< dealii::FullMatrix< double >, 2 > &surf_basis, const unsigned int iface, const unsigned int dim_not_zero, const double scaling=2.0)
Computes the surface cross Hadamard products for skew-symmetric form from Eq. (15) in Chan...