277 *
for (
unsigned int i = 0; i <
values.size(); ++i)
287 *
const unsigned int )
const
295 *
return return_value;
313 *
virtual void value_list(
const std::vector<
Point<dim>> &points,
314 *
std::vector<double> & values,
315 *
const unsigned int )
const override;
323 *
std::vector<double> & values,
324 *
const unsigned int )
const
327 *
for (
unsigned int i = 0; i <
values.size(); ++i)
328 *
values[i] = 8. * PI * PI *
std::sin(2. * PI * points[i][0]) *
349 *
virtual void value_list(
const std::vector<
Point<dim>> &points,
350 *
std::vector<double> & values,
351 *
const unsigned int )
const override;
362 *
std::vector<double> & values,
363 *
const unsigned int )
const
365 *
for (
unsigned int i = 0; i <
values.size(); ++i)
366 *
values[i] = -
ref.laplacian(points[i]);
374 * <a name=
"Auxiliaryfunctions"></a>
383 *
const unsigned int degree =
std::max(1U, fe_degree);
384 *
return degree * (degree + 1.) * 0.5 *
392 * <a name=
"TheCopyData"></a>
405 *
std::array<double, 2>
values;
415 *
std::vector<types::global_dof_index> local_dof_indices;
416 *
std::vector<CopyDataFace> face_data;
421 *
template <
class Iterator>
422 *
void reinit(
const Iterator &cell,
const unsigned int dofs_per_cell)
424 *
cell_matrix.reinit(dofs_per_cell, dofs_per_cell);
426 *
local_dof_indices.resize(dofs_per_cell);
427 *
cell->get_dof_indices(local_dof_indices);
436 * <a name=
"TheSIPGLaplaceclass"></a>
456 *
void refine_grid();
464 *
const unsigned int degree;
466 *
const QGauss<dim - 1> face_quadrature;
484 * - Vectors to store error estimator square and energy norm square per
486 * - Print convergence rate and errors on the screen.
487 * - The fiffusion coefficient @f$\nu@f$ is set to 1.
488 * - Members that store information about the test case to be computed.
491 * Vector<double> estimated_error_square_per_cell;
492 * Vector<double> energy_norm_square_per_cell;
494 * ConvergenceTable convergence_table;
496 * const double diffusion_coefficient = 1.;
498 * const TestCase test_case;
499 * std::unique_ptr<const Function<dim>> exact_solution;
500 * std::unique_ptr<const Function<dim>> rhs_function;
505 * The constructor here takes the test case as input and then
506 * determines the correct solution and right-hand side classes. The
507 * remaining member variables are initialized in the obvious way.
511 * SIPGLaplace<dim>::SIPGLaplace(const TestCase &test_case)
513 * , quadrature(degree + 1)
514 * , face_quadrature(degree + 1)
515 * , quadrature_overintegration(degree + 2)
516 * , face_quadrature_overintegration(degree + 2)
519 * , dof_handler(triangulation)
520 * , test_case(test_case)
522 * if (test_case == TestCase::convergence_rate)
524 * exact_solution = std::make_unique<const SmoothSolution<dim>>();
525 * rhs_function = std::make_unique<const SmoothRightHandSide<dim>>();
528 * else if (test_case == TestCase::l_singularity)
531 * std::make_unique<const Functions::LSingularityFunction>();
532 * rhs_function = std::make_unique<const SingularRightHandSide<dim>>();
535 * AssertThrow(false, ExcNotImplemented());
541 * void SIPGLaplace<dim>::setup_system()
543 * dof_handler.distribute_dofs(fe);
544 * DynamicSparsityPattern dsp(dof_handler.n_dofs());
545 * DoFTools::make_flux_sparsity_pattern(dof_handler, dsp);
546 * sparsity_pattern.copy_from(dsp);
548 * system_matrix.reinit(sparsity_pattern);
549 * solution.reinit(dof_handler.n_dofs());
550 * system_rhs.reinit(dof_handler.n_dofs());
558 * <a name="Theassemble_systemfunction"></a>
559 * <h3>The assemble_system function</h3>
560 * The assemble function here is similar to that in @ref step_12 "step-12" and @ref step_47 "step-47".
561 * Different from assembling by hand, we just need to focus
562 * on assembling on each cell, each boundary face, and each
563 * interior face. The loops over cells and faces are handled
564 * automatically by MeshWorker::mesh_loop().
568 * The function starts by defining a local (lambda) function that is
569 * used to integrate the cell terms:
573 * void SIPGLaplace<dim>::assemble_system()
575 * const auto cell_worker =
576 * [&](const auto &cell, auto &scratch_data, auto ©_data) {
577 * const FEValues<dim> &fe_v = scratch_data.reinit(cell);
578 * const unsigned int dofs_per_cell = fe_v.dofs_per_cell;
579 * copy_data.reinit(cell, dofs_per_cell);
581 * const auto & q_points = scratch_data.get_quadrature_points();
582 * const unsigned int n_q_points = q_points.size();
583 * const std::vector<double> &JxW = scratch_data.get_JxW_values();
585 * std::vector<double> rhs(n_q_points);
586 * rhs_function->value_list(q_points, rhs);
588 * for (unsigned int point = 0; point < n_q_points; ++point)
589 * for (unsigned int i = 0; i < fe_v.dofs_per_cell; ++i)
591 * for (unsigned int j = 0; j < fe_v.dofs_per_cell; ++j)
592 * copy_data.cell_matrix(i, j) +=
593 * diffusion_coefficient * // nu
594 * fe_v.shape_grad(i, point) * // grad v_h
595 * fe_v.shape_grad(j, point) * // grad u_h
598 * copy_data.cell_rhs(i) += fe_v.shape_value(i, point) * // v_h
606 * Next, we need a function that assembles face integrals on the boundary:
609 * const auto boundary_worker = [&](const auto & cell,
610 * const unsigned int &face_no,
611 * auto & scratch_data,
612 * auto & copy_data) {
613 * const FEFaceValuesBase<dim> &fe_fv = scratch_data.reinit(cell, face_no);
615 * const auto & q_points = scratch_data.get_quadrature_points();
616 * const unsigned int n_q_points = q_points.size();
617 * const unsigned int dofs_per_cell = fe_fv.dofs_per_cell;
619 * const std::vector<double> & JxW = scratch_data.get_JxW_values();
620 * const std::vector<Tensor<1, dim>> &normals =
621 * scratch_data.get_normal_vectors();
623 * std::vector<double> g(n_q_points);
624 * exact_solution->value_list(q_points, g);
626 * const double extent1 = cell->measure() / cell->face(face_no)->measure();
627 * const double penalty = get_penalty_factor(degree, extent1, extent1);
629 * for (unsigned int point = 0; point < n_q_points; ++point)
631 * for (unsigned int i = 0; i < dofs_per_cell; ++i)
632 * for (unsigned int j = 0; j < dofs_per_cell; ++j)
633 * copy_data.cell_matrix(i, j) +=
634 * (-diffusion_coefficient * // - nu
635 * fe_fv.shape_value(i, point) * // v_h
636 * (fe_fv.shape_grad(j, point) * // (grad u_h .
637 * normals[point]) // n)
639 * - diffusion_coefficient * // - nu
640 * (fe_fv.shape_grad(i, point) * // (grad v_h .
641 * normals[point]) * // n)
642 * fe_fv.shape_value(j, point) // u_h
644 * + diffusion_coefficient * penalty * // + nu sigma
645 * fe_fv.shape_value(i, point) * // v_h
646 * fe_fv.shape_value(j, point) // u_h
651 * for (unsigned int i = 0; i < dofs_per_cell; ++i)
652 * copy_data.cell_rhs(i) +=
653 * (-diffusion_coefficient * // - nu
654 * (fe_fv.shape_grad(i, point) * // (grad v_h .
655 * normals[point]) * // n)
659 * + diffusion_coefficient * penalty * // + nu sigma
660 * fe_fv.shape_value(i, point) * g[point] // v_h g
669 * Finally, a function that assembles face integrals on interior
670 * faces. To reinitialize FEInterfaceValues, we need to pass
671 * cells, face and subface indices (for adaptive refinement) to
672 * the reinit() function of FEInterfaceValues:
675 * const auto face_worker = [&](const auto & cell,
676 * const unsigned int &f,
677 * const unsigned int &sf,
678 * const auto & ncell,
679 * const unsigned int &nf,
680 * const unsigned int &nsf,
681 * auto & scratch_data,
682 * auto & copy_data) {
683 * const FEInterfaceValues<dim> &fe_iv =
684 * scratch_data.reinit(cell, f, sf, ncell, nf, nsf);
686 * copy_data.face_data.emplace_back();
687 * CopyDataFace & copy_data_face = copy_data.face_data.back();
688 * const unsigned int n_dofs_face = fe_iv.n_current_interface_dofs();
689 * copy_data_face.joint_dof_indices = fe_iv.get_interface_dof_indices();
690 * copy_data_face.cell_matrix.reinit(n_dofs_face, n_dofs_face);
692 * const std::vector<double> & JxW = fe_iv.get_JxW_values();
693 * const std::vector<Tensor<1, dim>> &normals = fe_iv.get_normal_vectors();
695 * const double extent1 = cell->measure() / cell->face(f)->measure();
696 * const double extent2 = ncell->measure() / ncell->face(nf)->measure();
697 * const double penalty = get_penalty_factor(degree, extent1, extent2);
699 * for (const unsigned int point : fe_iv.quadrature_point_indices())
701 * for (const unsigned int i : fe_iv.dof_indices())
702 * for (const unsigned int j : fe_iv.dof_indices())
703 * copy_data_face.cell_matrix(i, j) +=
704 * (-diffusion_coefficient * // - nu
705 * fe_iv.jump_in_shape_values(i, point) * // [v_h]
706 * (fe_iv.average_of_shape_gradients(j,
707 * point) * // ({grad u_h} .
708 * normals[point]) // n)
711 * diffusion_coefficient * // - nu
712 * (fe_iv.average_of_shape_gradients(i, point) * // (grad v_h .
713 * normals[point]) * // n)
714 * fe_iv.jump_in_shape_values(j, point) // [u_h]
716 * + diffusion_coefficient * penalty * // + nu sigma
717 * fe_iv.jump_in_shape_values(i, point) * // [v_h]
718 * fe_iv.jump_in_shape_values(j, point) // [u_h]
727 * The following lambda function will then copy data into the
728 * global matrix and right-hand side. Though there are no hanging
729 * node constraints in DG discretization, we define an empty
730 * AffineConstraints object that allows us to use the
731 * AffineConstraints::distribute_local_to_global() functionality.
734 * AffineConstraints<double> constraints;
735 * constraints.close();
736 * const auto copier = [&](const auto &c) {
737 * constraints.distribute_local_to_global(c.cell_matrix,
739 * c.local_dof_indices,
745 * Copy data from interior face assembly to the global matrix.
748 * for (auto &cdf : c.face_data)
750 * constraints.distribute_local_to_global(cdf.cell_matrix,
751 * cdf.joint_dof_indices,
759 * With the assembly functions defined, we can now create
760 * ScratchData and CopyData objects, and pass them together with
761 * the lambda functions above to MeshWorker::mesh_loop(). In
762 * addition, we need to specify that we want to assemble on
763 * interior faces exactly once.
766 * const UpdateFlags cell_flags = update_values | update_gradients |
767 * update_quadrature_points | update_JxW_values;
768 * const UpdateFlags face_flags = update_values | update_gradients |
769 * update_quadrature_points |
770 * update_normal_vectors | update_JxW_values;
772 * ScratchData scratch_data(
773 * mapping, fe, quadrature, cell_flags, face_quadrature, face_flags);
774 * CopyData copy_data;
776 * MeshWorker::mesh_loop(dof_handler.begin_active(),
782 * MeshWorker::assemble_own_cells |
783 * MeshWorker::assemble_boundary_faces |
784 * MeshWorker::assemble_own_interior_faces_once,
794 * <a name="Thesolveandoutput_resultsfunction"></a>
795 * <h3>The solve() and output_results() function</h3>
796 * The following two functions are entirely standard and without difficulty.
800 * void SIPGLaplace<dim>::solve()
802 * SparseDirectUMFPACK A_direct;
803 * A_direct.initialize(system_matrix);
804 * A_direct.vmult(solution, system_rhs);
810 * void SIPGLaplace<dim>::output_results(const unsigned int cycle) const
812 * const std::string filename = "sol_Q" + Utilities::int_to_string(degree, 1) +
813 * "-" + Utilities::int_to_string(cycle, 2) +
815 * std::ofstream output(filename);
817 * DataOut<dim> data_out;
818 * data_out.attach_dof_handler(dof_handler);
819 * data_out.add_data_vector(solution, "u", DataOut<dim>::type_dof_data);
820 * data_out.build_patches(mapping);
821 * data_out.write_vtu(output);
828 * <a name="Thecompute_error_estimatefunction"></a>
829 * <h3>The compute_error_estimate() function</h3>
830 * The assembly of the error estimator here is quite similar to
831 * that of the global matrix and right-had side and can be handled
832 * by the MeshWorker::mesh_loop() framework. To understand what
833 * each of the local (lambda) functions is doing, recall first that
834 * the local cell residual is defined as
835 * @f$h_K^2 \left\| f + \nu \Delta u_h \right\|_K^2@f$:
839 * void SIPGLaplace<dim>::compute_error_estimate()
841 * const auto cell_worker =
842 * [&](const auto &cell, auto &scratch_data, auto ©_data) {
843 * const FEValues<dim> &fe_v = scratch_data.reinit(cell);
845 * copy_data.cell_index = cell->active_cell_index();
847 * const auto & q_points = fe_v.get_quadrature_points();
848 * const unsigned int n_q_points = q_points.size();
849 * const std::vector<double> &JxW = fe_v.get_JxW_values();
851 * std::vector<Tensor<2, dim>> hessians(n_q_points);
852 * fe_v.get_function_hessians(solution, hessians);
854 * std::vector<double> rhs(n_q_points);
855 * rhs_function->value_list(q_points, rhs);
857 * const double hk = cell->diameter();
858 * double residual_norm_square = 0;
860 * for (unsigned int point = 0; point < n_q_points; ++point)
862 * const double residual =
863 * rhs[point] + diffusion_coefficient * trace(hessians[point]);
864 * residual_norm_square += residual * residual * JxW[point];
866 * copy_data.value = hk * hk * residual_norm_square;
871 * Next compute boundary terms @f$\sum_{f\in \partial K \cap \partial \Omega}
872 * \sigma \left\| [ u_h-g_D ] \right\|_f^2 @f$:
875 * const auto boundary_worker = [&](const auto & cell,
876 * const unsigned int &face_no,
877 * auto & scratch_data,
878 * auto & copy_data) {
879 * const FEFaceValuesBase<dim> &fe_fv = scratch_data.reinit(cell, face_no);
881 * const auto & q_points = fe_fv.get_quadrature_points();
882 * const unsigned n_q_points = q_points.size();
884 * const std::vector<double> &JxW = fe_fv.get_JxW_values();
886 * std::vector<double> g(n_q_points);
887 * exact_solution->value_list(q_points, g);
889 * std::vector<double> sol_u(n_q_points);
890 * fe_fv.get_function_values(solution, sol_u);
892 * const double extent1 = cell->measure() / cell->face(face_no)->measure();
893 * const double penalty = get_penalty_factor(degree, extent1, extent1);
895 * double difference_norm_square = 0.;
896 * for (unsigned int point = 0; point < q_points.size(); ++point)
898 * const double diff = (g[point] - sol_u[point]);
899 * difference_norm_square += diff * diff * JxW[point];
901 * copy_data.value += penalty * difference_norm_square;
906 * And finally interior face terms @f$\sum_{f\in \partial K}\lbrace \sigma
907 * \left\| [u_h] \right\|_f^2 + h_f \left\| [\nu \nabla u_h \cdot
908 * \mathbf n ] \right\|_f^2 \rbrace@f$:
911 * const auto face_worker = [&](const auto & cell,
912 * const unsigned int &f,
913 * const unsigned int &sf,
914 * const auto & ncell,
915 * const unsigned int &nf,
916 * const unsigned int &nsf,
917 * auto & scratch_data,
918 * auto & copy_data) {
919 * const FEInterfaceValues<dim> &fe_iv =
920 * scratch_data.reinit(cell, f, sf, ncell, nf, nsf);
922 * copy_data.face_data.emplace_back();
923 * CopyDataFace ©_data_face = copy_data.face_data.back();
925 * copy_data_face.cell_indices[0] = cell->active_cell_index();
926 * copy_data_face.cell_indices[1] = ncell->active_cell_index();
928 * const std::vector<double> & JxW = fe_iv.get_JxW_values();
929 * const std::vector<Tensor<1, dim>> &normals = fe_iv.get_normal_vectors();
931 * const auto & q_points = fe_iv.get_quadrature_points();
932 * const unsigned int n_q_points = q_points.size();
934 * std::vector<double> jump(n_q_points);
935 * fe_iv.get_jump_in_function_values(solution, jump);
937 * std::vector<Tensor<1, dim>> grad_jump(n_q_points);
938 * fe_iv.get_jump_in_function_gradients(solution, grad_jump);
940 * const double h = cell->face(f)->diameter();
942 * const double extent1 = cell->measure() / cell->face(f)->measure();
943 * const double extent2 = ncell->measure() / ncell->face(nf)->measure();
944 * const double penalty = get_penalty_factor(degree, extent1, extent2);
946 * double flux_jump_square = 0;
947 * double u_jump_square = 0;
948 * for (unsigned int point = 0; point < n_q_points; ++point)
950 * u_jump_square += jump[point] * jump[point] * JxW[point];
951 * const double flux_jump = grad_jump[point] * normals[point];
952 * flux_jump_square +=
953 * diffusion_coefficient * flux_jump * flux_jump * JxW[point];
955 * copy_data_face.values[0] =
956 * 0.5 * h * (flux_jump_square + penalty * u_jump_square);
957 * copy_data_face.values[1] = copy_data_face.values[0];
962 * Having computed local contributions for each cell, we still
963 * need a way to copy these into the global vector that will hold
964 * the error estimators for all cells:
967 * const auto copier = [&](const auto ©_data) {
968 * if (copy_data.cell_index != numbers::invalid_unsigned_int)
969 * estimated_error_square_per_cell[copy_data.cell_index] +=
971 * for (auto &cdf : copy_data.face_data)
972 * for (unsigned int j = 0; j < 2; ++j)
973 * estimated_error_square_per_cell[cdf.cell_indices[j]] += cdf.values[j];
978 * After all of this set-up, let's
do the actual work:
We resize
992 *
ScratchData scratch_data(
993 *
mapping, fe, quadrature, cell_flags, face_quadrature, face_flags);
995 *
CopyData copy_data;
1012 * <a name=
"Thecompute_energy_norm_errorfunction"></a>
1030 *
template <
int dim>
1041 *
[&](
const auto &cell,
auto &scratch_data,
auto ©_data) {
1044 *
copy_data.cell_index = cell->active_cell_index();
1046 *
const auto & q_points =
fe_v.get_quadrature_points();
1047 *
const unsigned int n_q_points = q_points.
size();
1048 *
const std::vector<double> &JxW =
fe_v.get_JxW_values();
1050 *
std::vector<Tensor<1, dim>>
grad_u(n_q_points);
1051 *
fe_v.get_function_gradients(solution,
grad_u);
1053 *
std::vector<Tensor<1, dim>>
grad_exact(n_q_points);
1056 *
double norm_square = 0;
1057 *
for (
unsigned int point = 0;
point < n_q_points; ++
point)
1071 *
const unsigned int &
face_no,
1072 *
auto & scratch_data,
1073 *
auto & copy_data) {
1076 *
const auto & q_points =
fe_fv.get_quadrature_points();
1077 *
const unsigned n_q_points = q_points.
size();
1079 *
const std::vector<double> &JxW =
fe_fv.get_JxW_values();
1081 *
std::vector<double>
g(n_q_points);
1084 *
std::vector<double>
sol_u(n_q_points);
1085 *
fe_fv.get_function_values(solution,
sol_u);
1087 *
const double extent1 = cell->measure() / cell->face(
face_no)->measure();
1105 *
const unsigned int &f,
1106 *
const unsigned int &sf,
1107 *
const auto &
ncell,
1108 *
const unsigned int &
nf,
1109 *
const unsigned int &
nsf,
1110 *
auto & scratch_data,
1111 *
auto & copy_data) {
1115 *
copy_data.face_data.emplace_back();
1121 *
const std::vector<double> &JxW =
fe_iv.get_JxW_values();
1123 *
const auto & q_points =
fe_iv.get_quadrature_points();
1124 *
const unsigned int n_q_points = q_points.
size();
1126 *
std::vector<double> jump(n_q_points);
1127 *
fe_iv.get_jump_in_function_values(solution, jump);
1129 *
const double extent1 = cell->measure() / cell->face(f)->measure();
1134 *
for (
unsigned int point = 0;
point < n_q_points; ++
point)
1142 *
const auto copier = [&](
const auto ©_data) {
1145 *
for (
auto &
cdf : copy_data.face_data)
1155 *
const ScratchData scratch_data(mapping,
1162 *
CopyData copy_data;
1164 *
dof_handler.
end(),
1184 * <a name=
"Therefine_gridfunction"></a>
1185 * <
h3>
The refine_grid() function</
h3>
1204 * <a name=
"Thecompute_errorsfunction"></a>
1255 *
std::cout <<
" Error in the L2 norm : " <<
L2_error << std::endl
1256 *
<<
" Error in the H1 seminorm : " <<
H1_error << std::endl
1266 * <a name=
"Therunfunction"></a>
1275 *
for (
unsigned int cycle = 0; cycle <
max_cycle; ++cycle)
1277 *
std::cout <<
"Cycle " << cycle << std::endl;
1316 *
std::cout <<
" Number of active cells : "
1320 *
std::cout <<
" Number of degrees of freedom : " << dof_handler.n_dofs()
1336 *
std::cout <<
" Estimated error : "
1344 *
std::cout << std::endl;
1374 *
std::cout <<
"degree = " << degree << std::endl;
1385 * <a name=
"Themainfunction"></a>
1395 *
using namespace dealii;
1396 *
using namespace Step74;
1403 *
catch (std::exception &exc)
1405 *
std::cerr << std::endl
1407 *
<<
"----------------------------------------------------"
1409 *
std::cerr <<
"Exception on processing: " << std::endl
1410 *
<< exc.what() << std::endl
1411 *
<<
"Aborting!" << std::endl
1412 *
<<
"----------------------------------------------------"
1418 *
std::cerr << std::endl
1420 *
<<
"----------------------------------------------------"
1422 *
std::cerr <<
"Unknown exception!" << std::endl
1423 *
<<
"Aborting!" << std::endl
1424 *
<<
"----------------------------------------------------"
1462<table
align=
"center" class=
"doxtable">
1577<
img width=
"600px" src=
"https://www.dealii.org/images/steps/developer/step-74.log-log-plot.png" alt=
"">
1591<a name=
"PlainProg"></a>
value_type * data() const noexcept
void reinit(value_type *starting_element, const std::size_t n_elements)
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
void mesh_loop(const CellIteratorType &begin, const CellIteratorType &end, const CellWorkerFunctionType &cell_worker, const CopierType &copier, const ScratchData &sample_scratch_data, const CopyData &sample_copy_data, const AssembleFlags flags=assemble_own_cells, const BoundaryWorkerFunctionType &boundary_worker=BoundaryWorkerFunctionType(), const FaceWorkerFunctionType &face_worker=FaceWorkerFunctionType(), const unsigned int queue_length=2 *MultithreadInfo::n_threads(), const unsigned int chunk_size=8)
@ update_hessians
Second derivatives of shape functions.
@ update_values
Shape function values.
@ update_normal_vectors
Normal vectors.
@ update_JxW_values
Transformed quadrature weights.
@ update_gradients
Shape function gradients.
@ update_quadrature_points
Transformed quadrature points.
void hyper_L(Triangulation< dim > &tria, const double left=-1., const double right=1., const bool colorize=false)
void hyper_cube(Triangulation< dim, spacedim > &tria, const double left=0., const double right=1., const bool colorize=false)
void refine_and_coarsen_fixed_number(Triangulation< dim, spacedim > &triangulation, const Vector< Number > &criteria, const double top_fraction_of_cells, const double bottom_fraction_of_cells, const unsigned int max_n_cells=std::numeric_limits< unsigned int >::max())
@ matrix
Contents is actually a matrix.
void cell_matrix(FullMatrix< double > &M, const FEValuesBase< dim > &fe, const FEValuesBase< dim > &fetest, const ArrayView< const std::vector< double > > &velocity, const double factor=1.)
double norm(const FEValuesBase< dim > &fe, const ArrayView< const std::vector< Tensor< 1, dim > > > &Du)
void L2(Vector< number > &result, const FEValuesBase< dim > &fe, const std::vector< double > &input, const double factor=1.)
@ assemble_boundary_faces
@ assemble_own_interior_faces_once
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
void run(const Iterator &begin, const std_cxx20::type_identity_t< Iterator > &end, Worker worker, Copier copier, const ScratchData &sample_scratch_data, const CopyData &sample_copy_data, const unsigned int queue_length, const unsigned int chunk_size)
unsigned int n_cells(const internal::TriangulationImplementation::NumberCache< 1 > &c)
int(&) functions(const void *v1, const void *v2)
void assemble(const MeshWorker::DoFInfoBox< dim, DOFINFO > &dinfo, A *assembler)
void reinit(MatrixBlock< MatrixType > &v, const BlockSparsityPattern &p)
static constexpr double PI
static const unsigned int invalid_unsigned_int
::VectorizedArray< Number, width > log(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > cos(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sin(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation