26 template <
int dim,
int spacedim>
29 , coefficient(
"/Poisson/Functions",
"1",
"Diffusion coefficient")
34 template <
int dim,
int spacedim>
41 auto &cell_matrix = copy.matrices[0];
42 auto &cell_rhs = copy.vectors[0];
44 cell->get_dof_indices(copy.local_dof_indices[0]);
46 const auto &fe_values = scratch.
reinit(cell);
50 for (
const unsigned int q_index : fe_values.quadrature_point_indices())
52 for (
const unsigned int i : fe_values.dof_indices())
53 for (
const unsigned int j : fe_values.dof_indices())
56 fe_values.quadrature_point(q_index)) *
57 fe_values.shape_grad(i, q_index) *
58 fe_values.shape_grad(j, q_index) *
59 fe_values.JxW(q_index));
60 for (
const unsigned int i : fe_values.dof_indices())
61 cell_rhs(i) += (fe_values.shape_value(i, q_index) *
62 this->forcing_term.value(
63 fe_values.quadrature_point(q_index)) *
64 fe_values.JxW(q_index));
70 template <
int dim,
int spacedim>
75 const auto A = linear_operator<VectorType>(this->matrix.block(0, 0));
76 this->preconditioner.initialize(this->matrix.block(0, 0));
78 this->solution.block(0) = Ainv * this->rhs.block(0);
79 this->constraints.distribute(this->solution);
80 this->locally_relevant_solution = this->solution;
85 template <
int dim,
int spacedim>
88 dealii::Vector<float> &error_per_cell)
const
94 this->
triangulation, this->finite_element().tensor_degree() + 1);
98 this->
triangulation, this->finite_element().tensor_degree() + 1);
101 this->finite_element(),
105 face_quadrature_formula,
114 std::vector<unsigned int> cell_indices;
115 std::vector<float> indicators;
125 auto cell_worker = [&](
const auto &cell,
auto &scratch,
auto ©) {
126 const auto &fe_v = scratch.reinit(cell);
127 const auto H = cell->diameter();
130 copy.cell_indices.resize(0);
131 copy.indicators.resize(0);
134 copy.cell_indices.emplace_back(cell->active_cell_index());
139 scratch.extract_local_dof_values(
"solution",
140 this->locally_relevant_solution);
143 const auto &lap_u = scratch.get_laplacians(
"solution", scalar);
146 const auto &q_points = scratch.get_quadrature_points();
147 const auto &JxW = scratch.get_JxW_values();
150 float cell_indicator = 0;
153 for (
const auto q_index : fe_v.quadrature_point_indices())
156 lap_u[q_index] + this->forcing_term.value(q_points[q_index]);
158 cell_indicator += (H * H * res * res * JxW[q_index]);
160 copy.indicators.emplace_back(cell_indicator);
164 auto face_worker = [&](
const auto &cell,
173 const auto &fe_iv = scratch.reinit(cell, f, sf, ncell, nf, nsf);
175 const auto h = cell->face(f)->diameter();
178 copy.cell_indices.emplace_back(cell->active_cell_index());
181 scratch.extract_local_dof_values(
"solution",
182 this->locally_relevant_solution);
185 const auto jump_grad =
186 scratch.get_jumps_in_gradients(
"solution", scalar);
188 const auto &JxW = scratch.get_JxW_values();
189 const auto &normals = scratch.get_normal_vectors();
192 float face_indicator = 0;
193 for (
const auto q_index : fe_iv.quadrature_point_indices())
195 const auto J = jump_grad[q_index] * normals[q_index];
197 face_indicator += (h * J * J * JxW[q_index]);
199 copy.indicators.emplace_back(face_indicator);
203 auto copier = [&](
const auto ©) {
205 for (
unsigned int i = 0; i < copy.cell_indices.size(); ++i)
207 error_per_cell[copy.cell_indices[i]] += copy.indicators[i];
215 this->dof_handler.end(),
226 const double total_error =
228 this->mpi_communicator);
230 deallog <<
"Error estimator: " << total_error << std::endl;
void reinit(const Triangulation< dim, spacedim > &tria)
Construct a LinearProblem.
Solve the Poisson problem, in parallel.
typename LinearProblem< dim, spacedim, LAC::LATrilinos >::ScratchData ScratchData
virtual void custom_estimator(Vector< float > &error_per_cell) const override
Build a custom error estimator.
virtual void solve() override
Make sure we initialize the right type of linear solver.
virtual void assemble_system_one_cell(const typename DoFHandler< dim, spacedim >::active_cell_iterator &cell, ScratchData &scratch, CopyData ©) override
Explicitly assemble the Poisson problem on a single cell.
typename LinearProblem< dim, spacedim, LAC::LATrilinos >::CopyData CopyData
#define AssertDimension(dim1, dim2)
LinearOperator< Domain, Range, Payload > inverse_operator(const LinearOperator< Range, Domain, Payload > &op, Solver &solver, const Preconditioner &preconditioner)
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)
assemble_own_interior_faces_both
T sum(const T &t, const MPI_Comm mpi_communicator)
Wrappers for linear algebra classes.
We collect in this namespace all PDEs that are relevant to Fluid Structure Interaction Problems.
const ::parallel::distributed::Triangulation< dim, spacedim > * triangulation