67 using VNumber = VectorizedArrayType;
69 static const int dim = dim_x + dim_v;
71 static const dealii::internal::EvaluatorVariant tensorproduct =
72 dealii::internal::EvaluatorVariant::evaluate_evenodd;
90 , do_collocation(false)
100 std::shared_ptr<VelocityField> velocity_field,
103 this->factor_skew = additional_data.factor_skew;
104 this->boundary_descriptor = boundary_descriptor;
105 this->velocity_field = velocity_field;
108 (data.get_matrix_free_x().get_shape_info(0, 0).data[0].element_type ==
109 dealii::internal::MatrixFreeFunctions::ElementType::
110 tensor_symmetric_collocation),
111 (data.get_matrix_free_v().get_shape_info(0, 0).data[0].element_type ==
112 dealii::internal::MatrixFreeFunctions::ElementType::
113 tensor_symmetric_collocation));
115 const bool do_collocation =
116 data.get_matrix_free_x().get_shape_info(0, 0).data[0].element_type ==
117 dealii::internal::MatrixFreeFunctions::ElementType::
118 tensor_symmetric_collocation;
120 this->do_collocation = do_collocation;
126 phi_face_m.reset(
new FEFaceEvaluation<dim_x, dim_v, degree, n_points, Number, VNumber>(data,
true, 0, 0, 0, 0));
127 phi_face_p.reset(
new FEFaceEvaluation<dim_x, dim_v, degree, n_points, Number, VNumber>(data,
false, 0, 0, 0, 0));
134 template <AdvectionOperationEvaluationLevel eval_level =
135 AdvectionOperationEvaluationLevel::all>
138 const VectorType &src,
140 Timers * timers =
nullptr)
143 boundary_descriptor->set_time(time);
148 if (!data.is_ecl_supported())
150 if (timers !=
nullptr)
151 timers->enter(
"FCL");
156 if (timers !=
nullptr)
157 timers->enter(
"advection");
159 data.loop(&This::local_apply_cell,
160 &This::local_apply_face,
161 &This::local_apply_boundary,
166 DataAccessOnFaces::values,
168 DataAccessOnFaces::values,
171 if (timers !=
nullptr)
179 data.cell_loop(&This::local_apply_inverse_mass_matrix,
185 if (timers !=
nullptr)
190 if (timers !=
nullptr)
191 timers->enter(
"ECL");
194 data.loop_cell_centric(
195 &This::local_apply_advect_and_inverse_mass_matrix<eval_level>,
199 eval_level == AdvectionOperationEvaluationLevel::all ?
201 DataAccessOnFaces::values :
203 DataAccessOnFaces::none,
206 if (timers !=
nullptr)
218 template <AdvectionOperationEvaluationLevel eval_level =
219 AdvectionOperationEvaluationLevel::all>
221 local_apply_advect_and_inverse_mass_matrix(
224 const VectorType & src,
229 auto &phi = *this->phi_cell;
230 auto &phi_m = *this->phi_face_m;
231 auto &phi_p = *this->phi_face_p;
232 auto &phi_inv = *this->phi_cell_inv;
235 VNumber *data_ptr = phi.get_data_ptr();
236 VNumber *data_ptr1 = phi_m.get_data_ptr();
237 VNumber *data_ptr2 = phi_p.get_data_ptr();
238 VNumber *data_ptr_inv = phi_inv.get_data_ptr();
241 const dealii::internal::EvaluatorTensorProduct<tensorproduct,
247 eval(*phi.get_shape_values(),
248 dealii::AlignedVector<Number>(),
249 dealii::AlignedVector<Number>());
251 const dealii::internal::EvaluatorTensorProduct<tensorproduct,
257 eval_face(*phi.get_shape_values(),
258 dealii::AlignedVector<Number>(),
259 dealii::AlignedVector<Number>());
261 const dealii::internal::EvaluatorTensorProduct<tensorproduct,
267 eval_(dealii::AlignedVector<Number>(),
268 *phi.get_shape_gradients(),
269 dealii::AlignedVector<Number>());
271 const dealii::internal::EvaluatorTensorProduct<tensorproduct,
277 eval_inv(dealii::AlignedVector<Number>(),
278 dealii::AlignedVector<Number>(),
282 .inverse_shape_values_eo);
288 this->velocity_field->reinit(cell);
292 phi.read_dof_values(src);
294 if(do_collocation ==
false)
296 if(degree + 1 == n_points)
298 if (dim >= 1) eval.template values<0, true, false>(data_ptr, data_ptr);
299 if (dim >= 2) eval.template values<1, true, false>(data_ptr, data_ptr);
300 if (dim >= 3) eval.template values<2, true, false>(data_ptr, data_ptr);
301 if (dim >= 4) eval.template values<3, true, false>(data_ptr, data_ptr);
302 if (dim >= 5) eval.template values<4, true, false>(data_ptr, data_ptr);
303 if (dim >= 6) eval.template values<5, true, false>(data_ptr, data_ptr);
307 dealii::internal::FEEvaluationImplBasisChange<tensorproduct,
308 dealii::internal::EvaluatorQuantity::value,
312 do_forward(1, data.
get_matrix_free_x().get_shape_info().data.front().shape_values_eo,
319 VNumber *buffer = phi_cell_inv->get_data_ptr();
321 if(eval_level != AdvectionOperationEvaluationLevel::cell)
322 for (
auto i = 0u; i < dealii::Utilities::pow<unsigned int>(n_points, dim); i++)
323 buffer[i] = data_ptr[i];
327 dealii::AlignedVector<VNumber> scratch_data_array;
328 scratch_data_array.resize_fast(dealii::Utilities::pow(n_points, dim) * dim_x);
329 VNumber *tempp = scratch_data_array.begin();
331 if(factor_skew != 0.0)
333 if (dim_x >= 1) eval_.template gradients<0, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 0);
334 if (dim_x >= 2) eval_.template gradients<1, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 1);
335 if (dim_x >= 3) eval_.template gradients<2, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 2);
338 for (
auto qv = 0u, q = 0u; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v); ++qv)
339 for (
auto qx = 0u; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x); ++qx, ++q)
341 VNumber grad_in[dim_x];
342 const auto vel = velocity_field->evaluate_x(q, qx, qv);
344 if(factor_skew != 0.0)
345 phi.template submit_value<false>(data_ptr, - factor_skew * (phi.get_gradient_x(tempp, q, qx, qv) * vel), q, qx, qv);
347 if (factor_skew != 1.0)
349 for (
int d = 0; d < dim_x; d++)
350 grad_in[d] = (1.0-factor_skew) * buffer[q] * vel[d];
351 phi.submit_gradient_x(tempp, grad_in, q, qx, qv);
355 if(factor_skew != 1.0)
357 if (dim_x >= 1 && (factor_skew != 0.0))
358 eval_.template gradients<0, false, true >(tempp + dealii::Utilities::pow(n_points, dim) * 0, data_ptr);
360 eval_.template gradients<0, false, false>(tempp + dealii::Utilities::pow(n_points, dim) * 0, data_ptr);
362 if (dim_x >= 2) eval_.template gradients<1, false, true >(tempp + dealii::Utilities::pow(n_points, dim) * 1, data_ptr);
363 if (dim_x >= 3) eval_.template gradients<2, false, true >(tempp + dealii::Utilities::pow(n_points, dim) * 2, data_ptr);
369 dealii::AlignedVector<VNumber> scratch_data_array;
370 scratch_data_array.resize_fast(dealii::Utilities::pow(n_points, dim) * dim_v);
371 VNumber *tempp = scratch_data_array.begin();
373 if(factor_skew != 0.0)
375 if (dim_v >= 1) eval_.template gradients<0 + dim_x, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 0);
376 if (dim_v >= 2) eval_.template gradients<1 + dim_x, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 1);
377 if (dim_v >= 3) eval_.template gradients<2 + dim_x, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 2);
380 for (
auto qv = 0u, q = 0u; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v); ++qv)
381 for (
auto qx = 0u; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x); ++qx, ++q)
383 VNumber grad_in[dim_v];
384 const auto vel = velocity_field->evaluate_v(q, qx, qv);
386 if(factor_skew != 0.0)
387 phi.template submit_value<true>(data_ptr, - factor_skew * (phi.get_gradient_v(tempp, q, qx, qv) * vel), q, qx, qv);
389 if (factor_skew != 1.0)
391 for (
int d = 0; d < dim_v; d++)
392 grad_in[d] = (1.0-factor_skew) * buffer[q] * vel[d];
393 phi.submit_gradient_v(tempp, grad_in, q, qx, qv);
397 if(factor_skew != 1.0)
399 if (dim_v >= 1) eval_.template gradients<0 + dim_x, false, true>(tempp + dealii::Utilities::pow(n_points, dim) * 0, data_ptr);
400 if (dim_v >= 2) eval_.template gradients<1 + dim_x, false, true>(tempp + dealii::Utilities::pow(n_points, dim) * 1, data_ptr);
401 if (dim_v >= 3) eval_.template gradients<2 + dim_x, false, true>(tempp + dealii::Utilities::pow(n_points, dim) * 2, data_ptr);
407 if(eval_level != AdvectionOperationEvaluationLevel::cell)
408 for (
auto face = 0u; face < dim * 2; face++)
410 this->velocity_field->reinit_face(cell, face);
413 phi_m.reinit(cell, face);
418 if(bid == dealii::numbers::internal_face_boundary_id)
420 phi_p.reinit(cell, face);
422 if(eval_level == AdvectionOperationEvaluationLevel::all)
423 phi_p.read_dof_values(src);
426 if(do_collocation ==
false)
430 if(degree + 1 == n_points)
432 if (dim >= 2) eval_face.template values<0, true, false>(data_ptr2, data_ptr2);
433 if (dim >= 3) eval_face.template values<1, true, false>(data_ptr2, data_ptr2);
434 if (dim >= 4) eval_face.template values<2, true, false>(data_ptr2, data_ptr2);
435 if (dim >= 5) eval_face.template values<3, true, false>(data_ptr2, data_ptr2);
436 if (dim >= 6) eval_face.template values<4, true, false>(data_ptr2, data_ptr2);
440 dealii::internal::FEEvaluationImplBasisChange<tensorproduct,
441 dealii::internal::EvaluatorQuantity::value,
445 do_forward(1 ,data.
get_matrix_free_x().get_shape_info().data.front().shape_values_eo,
452 phi_m.read_dof_values_from_buffer(this->phi_cell_inv->get_data_ptr());
455 if(bid == dealii::numbers::internal_face_boundary_id)
457 if (face < dim_x * 2)
459 for (
unsigned int qv = 0, q = 0; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v); ++qv)
460 for (
unsigned int qx = 0; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x - 1); ++qx, ++q)
462 const VectorizedArrayType u_minus = data_ptr1[q];
463 const VectorizedArrayType u_plus = data_ptr2[q];
464 const VectorizedArrayType normal_times_speed = velocity_field->evaluate_face_x(q, qx, qv) * phi_m.get_normal_vector_x(qx);
465 const VectorizedArrayType flux_times_normal_of_minus = 0.5 * ((u_minus + u_plus) * normal_times_speed + std::abs(normal_times_speed) * (u_minus - u_plus)) * alpha;
467 phi_m.template submit_value<ID::SpaceType::X>(data_ptr1, flux_times_normal_of_minus - factor_skew*u_minus*normal_times_speed, q, qx, qv);
472 for (
unsigned int qv = 0, q = 0; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v - 1); ++qv)
473 for (
unsigned int qx = 0; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x); ++qx, ++q)
475 const VectorizedArrayType u_minus = data_ptr1[q];
476 const VectorizedArrayType u_plus = data_ptr2[q];
477 const VectorizedArrayType normal_times_speed = velocity_field->evaluate_face_v(q, qx, qv) * phi_m.get_normal_vector_v(qv);
478 const VectorizedArrayType flux_times_normal_of_minus = 0.5 * ((u_minus + u_plus) * normal_times_speed + std::abs(normal_times_speed) * (u_minus - u_plus)) * alpha;
480 phi_m.template submit_value<ID::SpaceType::V>(data_ptr1, flux_times_normal_of_minus - factor_skew*u_minus*normal_times_speed, q, qx, qv);
486 const auto boundary_pair = boundary_descriptor->get_boundary(bid);
488 if (face < dim_x * 2)
490 for (
unsigned int qv = 0, q = 0; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v); ++qv)
491 for (
unsigned int qx = 0; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x - 1); ++qx, ++q)
493 const VectorizedArrayType u_minus = data_ptr1[q];
494 const VectorizedArrayType u_plus = boundary_pair.first == BoundaryType::DirichletHomogenous ?
496 (-u_minus + 2.0 * hyperdeal::MatrixFreeTools::evaluate_scalar_function(phi_m.template get_quadrature_point<ID::SpaceType::X>(qx, qv), *boundary_pair.second, phi_m.n_vectorization_lanes_filled()));
498 const VectorizedArrayType normal_times_speed = velocity_field->evaluate_face_x(q, qx, qv) * phi_m.get_normal_vector_x(qx);
499 const VectorizedArrayType flux_times_normal_of_minus = 0.5 * ((u_minus + u_plus) * normal_times_speed + std::abs(normal_times_speed) * (u_minus - u_plus)) * alpha;
501 phi_m.template submit_value<ID::SpaceType::X>(data_ptr1, flux_times_normal_of_minus - factor_skew*u_minus*normal_times_speed, q, qx, qv);
506 for (
unsigned int qv = 0, q = 0; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v - 1); ++qv)
507 for (
unsigned int qx = 0; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x); ++qx, ++q)
509 const VectorizedArrayType u_minus = data_ptr1[q];
510 const VectorizedArrayType u_plus = boundary_pair.first == BoundaryType::DirichletHomogenous ?
512 (-u_minus + 2.0 * hyperdeal::MatrixFreeTools::evaluate_scalar_function(phi_m.template get_quadrature_point<ID::SpaceType::V>(qx, qv), *boundary_pair.second, phi_m.n_vectorization_lanes_filled()));
514 const VectorizedArrayType normal_times_speed = velocity_field->evaluate_face_v(q, qx, qv) * phi_m.get_normal_vector_v(qv);
515 const VectorizedArrayType flux_times_normal_of_minus = 0.5 * ((u_minus + u_plus) * normal_times_speed + std::abs(normal_times_speed) * (u_minus - u_plus)) * alpha;
517 phi_m.template submit_value<ID::SpaceType::V>(data_ptr1, flux_times_normal_of_minus - factor_skew*u_minus*normal_times_speed, q, qx, qv);
522 if(do_collocation ==
false)
525 phi_m.distribute_to_buffer(this->phi_cell->get_data_ptr());
530 phi_inv.reinit(cell);
532 for (
auto qv = 0u, q = 0u; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v); ++qv)
533 for (
auto qx = 0u; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x); ++qx, ++q)
534 phi_inv.submit_inv(data_ptr, q, qx, qv);
536 if(do_collocation ==
false)
538 if(degree + 1 == n_points)
540 if (dim >= 6) eval_inv.template hessians<5, false, false>(data_ptr, data_ptr);
541 if (dim >= 5) eval_inv.template hessians<4, false, false>(data_ptr, data_ptr);
542 if (dim >= 4) eval_inv.template hessians<3, false, false>(data_ptr, data_ptr);
543 if (dim >= 3) eval_inv.template hessians<2, false, false>(data_ptr, data_ptr);
544 if (dim >= 2) eval_inv.template hessians<1, false, false>(data_ptr, data_ptr);
545 if (dim >= 1) eval_inv.template hessians<0, false, false>(data_ptr, data_ptr);
549 dealii::internal::FEEvaluationImplBasisChange<tensorproduct,
550 dealii::internal::EvaluatorQuantity::hessian,
554 do_backward(1, data.
get_matrix_free_x().get_shape_info().data.front().inverse_shape_values_eo,
562 phi.set_dof_values(dst);
574 local_apply_inverse_mass_matrix(
575 const MatrixFree<dim_x, dim_v, Number, VectorizedArrayType> &data,
577 const VectorType & src,
582 auto &phi_inv = *this->phi_cell_inv_co;
585 VectorizedArrayType *data_ptr = phi_inv.get_data_ptr();
589 phi_inv.read_dof_values(src);
592 const dealii::internal::EvaluatorTensorProduct<tensorproduct,
598 eval_inv(dealii::AlignedVector<Number>(),
599 dealii::AlignedVector<Number>(),
600 *phi_inv.get_inverse_shape());
604 if(do_collocation ==
false)
606 if (dim >= 1) eval_inv.template hessians<0, true, false>(data_ptr, data_ptr);
607 if (dim >= 2) eval_inv.template hessians<1, true, false>(data_ptr, data_ptr);
608 if (dim >= 3) eval_inv.template hessians<2, true, false>(data_ptr, data_ptr);
609 if (dim >= 4) eval_inv.template hessians<3, true, false>(data_ptr, data_ptr);
610 if (dim >= 5) eval_inv.template hessians<4, true, false>(data_ptr, data_ptr);
611 if (dim >= 6) eval_inv.template hessians<5, true, false>(data_ptr, data_ptr);
614 for (
auto qv = 0u, q = 0u; qv < dealii::Utilities::pow<unsigned int>(degree + 1, dim_v); ++qv)
615 for (
auto qx = 0u; qx < dealii::Utilities::pow<unsigned int>(degree + 1, dim_x); ++qx, ++q)
616 phi_inv.submit_inv(data_ptr, q, qx, qv);
618 if(do_collocation ==
false)
620 if (dim >= 6) eval_inv.template hessians<5, false, false>(data_ptr, data_ptr);
621 if (dim >= 5) eval_inv.template hessians<4, false, false>(data_ptr, data_ptr);
622 if (dim >= 4) eval_inv.template hessians<3, false, false>(data_ptr, data_ptr);
623 if (dim >= 3) eval_inv.template hessians<2, false, false>(data_ptr, data_ptr);
624 if (dim >= 2) eval_inv.template hessians<1, false, false>(data_ptr, data_ptr);
625 if (dim >= 1) eval_inv.template hessians<0, false, false>(data_ptr, data_ptr);
631 phi_inv.set_dof_values(dst);
641 const MatrixFree<dim_x, dim_v, Number, VectorizedArrayType> &data,
643 const VectorType & src,
648 auto &phi = *this->phi_cell;
651 VNumber *data_ptr = phi.get_data_ptr();
654 const dealii::internal::EvaluatorTensorProduct<tensorproduct,
660 eval(*phi.get_shape_values(),
661 dealii::AlignedVector<Number>(),
662 dealii::AlignedVector<Number>());
664 const dealii::internal::EvaluatorTensorProduct<tensorproduct,
670 eval_(dealii::AlignedVector<Number>(),
671 *phi.get_shape_gradients(),
672 dealii::AlignedVector<Number>());
676 this->velocity_field->reinit(cell);
680 phi.read_dof_values(src);
682 if(do_collocation ==
false)
684 if(degree + 1 == n_points)
686 if (dim >= 1) eval.template values<0, true, false>(data_ptr, data_ptr);
687 if (dim >= 2) eval.template values<1, true, false>(data_ptr, data_ptr);
688 if (dim >= 3) eval.template values<2, true, false>(data_ptr, data_ptr);
689 if (dim >= 4) eval.template values<3, true, false>(data_ptr, data_ptr);
690 if (dim >= 5) eval.template values<4, true, false>(data_ptr, data_ptr);
691 if (dim >= 6) eval.template values<5, true, false>(data_ptr, data_ptr);
695 dealii::internal::FEEvaluationImplBasisChange<tensorproduct,
696 dealii::internal::EvaluatorQuantity::value,
700 do_forward(1, data.get_matrix_free_x().get_shape_info().data.front().shape_values_eo,
707 VNumber *buffer = phi_cell_inv->get_data_ptr();
708 for (
auto i = 0u; i < dealii::Utilities::pow<unsigned int>(n_points, dim); i++)
709 buffer[i] = data_ptr[i];
713 dealii::AlignedVector<VNumber> scratch_data_array;
714 scratch_data_array.resize_fast(dealii::Utilities::pow(n_points, dim) * dim_x);
715 VNumber *tempp = scratch_data_array.begin();
717 if(factor_skew != 0.0)
719 if (dim_x >= 1) eval_.template gradients<0, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 0);
720 if (dim_x >= 2) eval_.template gradients<1, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 1);
721 if (dim_x >= 3) eval_.template gradients<2, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 2);
724 for (
auto qv = 0u, q = 0u; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v); ++qv)
725 for (
auto qx = 0u; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x); ++qx, ++q)
727 VNumber grad_in[dim_x];
728 const auto vel = velocity_field->evaluate_x(q, qx, qv);
730 if(factor_skew != 0.0)
731 phi.template submit_value<false>(data_ptr, - factor_skew * (phi.get_gradient_x(tempp, q, qx, qv) * vel), q, qx, qv);
733 if (factor_skew != 1.0)
735 for (
int d = 0; d < dim_x; d++)
736 grad_in[d] = (1.0-factor_skew) * buffer[q] * vel[d];
737 phi.submit_gradient_x(tempp, grad_in, q, qx, qv);
741 if(factor_skew != 1.0)
743 if (dim_x >= 1 && (factor_skew != 0.0))
744 eval_.template gradients<0, false, true >(tempp + dealii::Utilities::pow(n_points, dim) * 0, data_ptr);
746 eval_.template gradients<0, false, false>(tempp + dealii::Utilities::pow(n_points, dim) * 0, data_ptr);
747 if (dim_x >= 2) eval_.template gradients<1, false, true >(tempp + dealii::Utilities::pow(n_points, dim) * 1, data_ptr);
748 if (dim_x >= 3) eval_.template gradients<2, false, true >(tempp + dealii::Utilities::pow(n_points, dim) * 2, data_ptr);
753 dealii::AlignedVector<VNumber> scratch_data_array;
754 scratch_data_array.resize_fast(dealii::Utilities::pow(n_points, dim) * dim_v);
755 VNumber *tempp = scratch_data_array.begin();
757 if(factor_skew != 0.0)
759 if (dim_v >= 1) eval_.template gradients<0 + dim_x, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 0);
760 if (dim_v >= 2) eval_.template gradients<1 + dim_x, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 1);
761 if (dim_v >= 3) eval_.template gradients<2 + dim_x, true, false>(buffer, tempp + dealii::Utilities::pow(n_points, dim) * 2);
764 for (
auto qv = 0u, q = 0u; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v); ++qv)
765 for (
auto qx = 0u; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x); ++qx, ++q)
767 VNumber grad_in[dim_v];
768 const auto vel = velocity_field->evaluate_v(q, qx, qv);
770 if(factor_skew != 0.0)
771 phi.template submit_value<true>(data_ptr, - factor_skew * (phi.get_gradient_v(tempp, q, qx, qv) * vel), q, qx, qv);
773 if (factor_skew != 1.0)
775 for (
int d = 0; d < dim_v; d++)
776 grad_in[d] = (1.0-factor_skew) * buffer[q] * vel[d];
777 phi.submit_gradient_v(tempp, grad_in, q, qx, qv);
781 if(factor_skew != 1.0)
783 if (dim_v >= 1) eval_.template gradients<0 + dim_x, false, true>(tempp + dealii::Utilities::pow(n_points, dim) * 0, data_ptr);
784 if (dim_v >= 2) eval_.template gradients<1 + dim_x, false, true>(tempp + dealii::Utilities::pow(n_points, dim) * 1, data_ptr);
785 if (dim_v >= 3) eval_.template gradients<2 + dim_x, false, true>(tempp + dealii::Utilities::pow(n_points, dim) * 2, data_ptr);
789 if(do_collocation ==
false)
791 if(degree + 1 == n_points)
793 if(dim >= 6) eval.template values<5, false, false>(data_ptr, data_ptr);
794 if(dim >= 5) eval.template values<4, false, false>(data_ptr, data_ptr);
795 if(dim >= 4) eval.template values<3, false, false>(data_ptr, data_ptr);
796 if(dim >= 3) eval.template values<2, false, false>(data_ptr, data_ptr);
797 if(dim >= 2) eval.template values<1, false, false>(data_ptr, data_ptr);
798 if(dim >= 1) eval.template values<0, false, false>(data_ptr, data_ptr);
802 dealii::internal::FEEvaluationImplBasisChange<tensorproduct,
803 dealii::internal::EvaluatorQuantity::value,
807 do_backward(1, data.get_matrix_free_x().get_shape_info().data.front().shape_values_eo,
817 phi.set_dof_values(dst);
827 const MatrixFree<dim_x, dim_v, Number, VectorizedArrayType> &data,
829 const VectorType & src,
834 auto &phi_m = *this->phi_face_m;
835 auto &phi_p = *this->phi_face_p;
837 const dealii::internal::EvaluatorTensorProduct<tensorproduct,
843 eval1(*phi_m.get_shape_values(),
844 dealii::AlignedVector<Number>(),
845 dealii::AlignedVector<Number>());
846 const dealii::internal::EvaluatorTensorProduct<tensorproduct,
852 eval2(*phi_p.get_shape_values(),
853 dealii::AlignedVector<Number>(),
854 dealii::AlignedVector<Number>());
856 this->velocity_field->reinit_face(face);
859 VNumber *data_ptr1 = phi_m.get_data_ptr();
860 VNumber *data_ptr2 = phi_p.get_data_ptr();
868 phi_m.read_dof_values(src);
870 if(do_collocation ==
false)
872 if(degree + 1 == n_points)
874 if (dim >= 2) eval1.template values<0, true, false>(data_ptr1, data_ptr1);
875 if (dim >= 3) eval1.template values<1, true, false>(data_ptr1, data_ptr1);
876 if (dim >= 4) eval1.template values<2, true, false>(data_ptr1, data_ptr1);
877 if (dim >= 5) eval1.template values<3, true, false>(data_ptr1, data_ptr1);
878 if (dim >= 6) eval1.template values<4, true, false>(data_ptr1, data_ptr1);
882 dealii::internal::FEEvaluationImplBasisChange<tensorproduct,
883 dealii::internal::EvaluatorQuantity::value,
887 do_forward(1, data.get_matrix_free_x().get_shape_info().data.front().shape_values_eo,
893 phi_p.read_dof_values(src);
895 if(do_collocation ==
false)
897 if(degree + 1 == n_points)
899 if (dim >= 2) eval2.template values<0, true, false>(data_ptr2, data_ptr2);
900 if (dim >= 3) eval2.template values<1, true, false>(data_ptr2, data_ptr2);
901 if (dim >= 4) eval2.template values<2, true, false>(data_ptr2, data_ptr2);
902 if (dim >= 5) eval2.template values<3, true, false>(data_ptr2, data_ptr2);
903 if (dim >= 6) eval2.template values<4, true, false>(data_ptr2, data_ptr2);
907 dealii::internal::FEEvaluationImplBasisChange<tensorproduct,
908 dealii::internal::EvaluatorQuantity::value,
912 do_forward(1, data.get_matrix_free_x().get_shape_info().data.front().shape_values_eo,
918 if (face.type == ID::SpaceType::X)
920 for (
unsigned int qv = 0, q = 0; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v); ++qv)
921 for (
unsigned int qx = 0; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x - 1); ++qx, ++q)
923 const VectorizedArrayType u_minus = data_ptr1[q];
924 const VectorizedArrayType u_plus = data_ptr2[q];
925 const VectorizedArrayType normal_times_speed = velocity_field->evaluate_face_x(q, qx, qv) * phi_m.get_normal_vector_x(qx);
926 const VectorizedArrayType flux_times_normal_of_minus = 0.5 * ((u_minus + u_plus) * normal_times_speed + std::abs(normal_times_speed) * (u_minus - u_plus)) * alpha;
928 phi_m.template submit_value<ID::SpaceType::X>(data_ptr1, +flux_times_normal_of_minus - factor_skew*u_minus*normal_times_speed, q, qx, qv);
929 phi_p.template submit_value<ID::SpaceType::X>(data_ptr2, -flux_times_normal_of_minus + factor_skew*u_plus*normal_times_speed, q, qx, qv);
934 for (
unsigned int qv = 0, q = 0; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v - 1); ++qv)
935 for (
unsigned int qx = 0; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x); ++qx, ++q)
937 const VectorizedArrayType u_minus = data_ptr1[q];
938 const VectorizedArrayType u_plus = data_ptr2[q];
939 const VectorizedArrayType normal_times_speed = velocity_field->evaluate_face_v(q, qx, qv) * phi_m.get_normal_vector_v(qv);
940 const VectorizedArrayType flux_times_normal_of_minus = 0.5 * ((u_minus + u_plus) * normal_times_speed + std::abs(normal_times_speed) * (u_minus - u_plus)) * alpha;
942 phi_m.template submit_value<ID::SpaceType::V>(data_ptr1, +flux_times_normal_of_minus - factor_skew*u_minus*normal_times_speed, q, qx, qv);
943 phi_p.template submit_value<ID::SpaceType::V>(data_ptr2, -flux_times_normal_of_minus + factor_skew*u_plus*normal_times_speed, q, qx, qv);
947 if(do_collocation ==
false)
949 if(degree + 1 == n_points)
951 if (dim >= 6) eval1.template values<4, false, false>(data_ptr1, data_ptr1);
952 if (dim >= 5) eval1.template values<3, false, false>(data_ptr1, data_ptr1);
953 if (dim >= 4) eval1.template values<2, false, false>(data_ptr1, data_ptr1);
954 if (dim >= 3) eval1.template values<1, false, false>(data_ptr1, data_ptr1);
955 if (dim >= 2) eval1.template values<0, false, false>(data_ptr1, data_ptr1);
959 dealii::internal::FEEvaluationImplBasisChange<tensorproduct,
960 dealii::internal::EvaluatorQuantity::value,
964 do_backward(1, data.get_matrix_free_x().get_shape_info().data.front().shape_values_eo,
false,
971 phi_m.distribute_local_to_global(dst);
973 if(do_collocation ==
false)
975 if(degree + 1 == n_points)
977 if (dim >= 6) eval2.template values<4, false, false>(data_ptr2, data_ptr2);
978 if (dim >= 5) eval2.template values<3, false, false>(data_ptr2, data_ptr2);
979 if (dim >= 4) eval2.template values<2, false, false>(data_ptr2, data_ptr2);
980 if (dim >= 3) eval2.template values<1, false, false>(data_ptr2, data_ptr2);
981 if (dim >= 2) eval2.template values<0, false, false>(data_ptr2, data_ptr2);
985 dealii::internal::FEEvaluationImplBasisChange<tensorproduct,
986 dealii::internal::EvaluatorQuantity::value,
990 do_backward(1, data.get_matrix_free_x().get_shape_info().data.front().shape_values_eo,
false,
999 phi_p.distribute_local_to_global(dst);
1010 local_apply_boundary(
1011 const MatrixFree<dim_x, dim_v, Number, VectorizedArrayType> &data,
1013 const VectorType & src,
1018 const auto bid = data.get_boundary_id(face);
1020 Assert(bid != dealii::numbers::internal_face_boundary_id,
1021 dealii::StandardExceptions::ExcInternalError());
1023 const auto boundary_pair = boundary_descriptor->get_boundary(bid);
1025 auto &phi_m = *this->phi_face_m;
1027 const dealii::internal::EvaluatorTensorProduct<tensorproduct,
1033 eval1(*phi_m.get_shape_values(),
1034 dealii::AlignedVector<Number>(),
1035 dealii::AlignedVector<Number>());
1037 this->velocity_field->reinit_face(face);
1040 VNumber *data_ptr1 = phi_m.get_data_ptr();
1047 phi_m.read_dof_values(src);
1049 if(do_collocation ==
false)
1051 if(degree + 1 == n_points)
1053 if (dim >= 2) eval1.template values<0, true, false>(data_ptr1, data_ptr1);
1054 if (dim >= 3) eval1.template values<1, true, false>(data_ptr1, data_ptr1);
1055 if (dim >= 4) eval1.template values<2, true, false>(data_ptr1, data_ptr1);
1056 if (dim >= 5) eval1.template values<3, true, false>(data_ptr1, data_ptr1);
1057 if (dim >= 6) eval1.template values<4, true, false>(data_ptr1, data_ptr1);
1061 dealii::internal::FEEvaluationImplBasisChange<tensorproduct,
1062 dealii::internal::EvaluatorQuantity::value,
1066 do_forward(1, data.get_matrix_free_x().get_shape_info().data.front().shape_values_eo,
1072 if (face.type == ID::SpaceType::X)
1074 for (
unsigned int qv = 0, q = 0; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v); ++qv)
1075 for (
unsigned int qx = 0; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x - 1); ++qx, ++q)
1077 const VectorizedArrayType u_minus = data_ptr1[q];
1078 const VectorizedArrayType u_plus = (boundary_pair.first == BoundaryType::DirichletHomogenous) ?
1080 (-u_minus + 2.0 * hyperdeal::MatrixFreeTools::evaluate_scalar_function(phi_m.template get_quadrature_point<ID::SpaceType::X>(qx, qv), *boundary_pair.second, phi_m.n_vectorization_lanes_filled()));
1082 const VectorizedArrayType normal_times_speed = velocity_field->evaluate_face_x(q, qx, qv) * phi_m.get_normal_vector_x(qx);
1083 const VectorizedArrayType flux_times_normal_of_minus = 0.5 * ((u_minus + u_plus) * normal_times_speed + std::abs(normal_times_speed) * (u_minus - u_plus)) * alpha;
1085 phi_m.template submit_value<ID::SpaceType::X>(data_ptr1, flux_times_normal_of_minus - factor_skew*u_minus*normal_times_speed, q, qx, qv);
1090 for (
unsigned int qv = 0, q = 0; qv < dealii::Utilities::pow<unsigned int>(n_points, dim_v - 1); ++qv)
1091 for (
unsigned int qx = 0; qx < dealii::Utilities::pow<unsigned int>(n_points, dim_x); ++qx, ++q)
1093 const VectorizedArrayType u_minus = data_ptr1[q];
1094 const VectorizedArrayType u_plus = (boundary_pair.first == BoundaryType::DirichletHomogenous) ?
1096 (-u_minus + 2.0 * hyperdeal::MatrixFreeTools::evaluate_scalar_function(phi_m.template get_quadrature_point<ID::SpaceType::V>(qx, qv), *boundary_pair.second, phi_m.n_vectorization_lanes_filled()));
1098 const VectorizedArrayType normal_times_speed = velocity_field->evaluate_face_v(q, qx, qv) * phi_m.get_normal_vector_v(qv);
1099 const VectorizedArrayType flux_times_normal_of_minus = 0.5 * ((u_minus + u_plus) * normal_times_speed + std::abs(normal_times_speed) * (u_minus - u_plus)) * alpha;
1101 phi_m.template submit_value<ID::SpaceType::V>(data_ptr1, flux_times_normal_of_minus - factor_skew*u_minus*normal_times_speed, q, qx, qv);
1105 if(do_collocation ==
false)
1107 if(degree + 1 == n_points)
1109 if (dim >= 6) eval1.template values<4, false, false>(data_ptr1, data_ptr1);
1110 if (dim >= 5) eval1.template values<3, false, false>(data_ptr1, data_ptr1);
1111 if (dim >= 4) eval1.template values<2, false, false>(data_ptr1, data_ptr1);
1112 if (dim >= 3) eval1.template values<1, false, false>(data_ptr1, data_ptr1);
1113 if (dim >= 2) eval1.template values<0, false, false>(data_ptr1, data_ptr1);
1117 dealii::internal::FEEvaluationImplBasisChange<tensorproduct,
1118 dealii::internal::EvaluatorQuantity::value,
1122 do_backward(1, data.get_matrix_free_x().get_shape_info().data.front().shape_values_eo,
1130 phi_m.distribute_local_to_global(dst);
1133 const MatrixFree<dim_x, dim_v, Number, VectorizedArrayType> &data;
1134 DynamicConvergenceTable & table;
1137 std::shared_ptr<FEEvaluation<dim_x, dim_v, degree, n_points, Number, VNumber>> phi_cell;
1138 std::shared_ptr<FEEvaluationInverse<dim_x, dim_v, degree, n_points, Number, VNumber>> phi_cell_inv;
1139 std::shared_ptr<FEEvaluationInverse<dim_x, dim_v, degree, degree + 1, Number, VNumber>> phi_cell_inv_co;
1140 std::shared_ptr<FEFaceEvaluation<dim_x, dim_v, degree, n_points, Number, VNumber>> phi_face_m;
1141 std::shared_ptr<FEFaceEvaluation<dim_x, dim_v, degree, n_points, Number, VNumber>> phi_face_p;
1144 std::shared_ptr<BoundaryDescriptor<dim, Number>> boundary_descriptor;
1145 std::shared_ptr<VelocityField> velocity_field;
1147 bool do_collocation;
1149 const double alpha = 1.0;
1152 double factor_skew = 0.0;