9 #ifndef __stokes_solution_h 10 #define __stokes_solution_h 12 #include <amandus/integrator.h> 13 #include <deal.II/base/flow_function.h> 14 #include <deal.II/base/smartpointer.h> 15 #include <deal.II/base/tensor.h> 16 #include <deal.II/integrators/divergence.h> 17 #include <deal.II/integrators/l2.h> 18 #include <deal.II/integrators/laplace.h> 39 virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
40 virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
41 virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
42 IntegrationInfo<dim>& info2)
const;
60 virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
61 virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
62 virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
63 IntegrationInfo<dim>& info2)
const;
75 virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
76 virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
77 virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
78 IntegrationInfo<dim>& info2)
const;
90 this->use_boundary =
true;
91 this->use_face =
false;
98 std::vector<std::vector<double>> rhs(
99 dim + 1, std::vector<double>(info.fe_values(0).n_quadrature_points, 0.));
102 solution->vector_laplacians(info.fe_values(0).get_quadrature_points(), rhs);
104 L2::L2(dinfo.vector(0).block(0), info.fe_values(0), rhs, -1.);
116 IntegrationInfo<dim>&)
const 124 : solution(&solution)
126 this->use_boundary =
true;
127 this->use_face =
true;
128 this->input_vector_names.push_back(
"Newton iterate");
135 Assert(info.values.size() >= 1, ExcDimensionMismatch(info.values.size(), 1));
136 Assert(info.gradients.size() >= 1, ExcDimensionMismatch(info.values.size(), 1));
138 std::vector<std::vector<double>> rhs(
139 dim + 1, std::vector<double>(info.fe_values(0).n_quadrature_points, 0.));
142 solution->vector_laplacians(info.fe_values(0).get_quadrature_points(), rhs);
144 L2::L2(dinfo.vector(0).block(0), info.fe_values(0), make_slice(rhs, 0, dim));
146 dinfo.vector(0).block(0), info.fe_values(0), make_slice(info.gradients[0], 0, dim));
147 Divergence::gradient_residual(
148 dinfo.vector(0).block(0), info.fe_values(0), info.values[0][dim], -1.);
150 dinfo.vector(0).block(1), info.fe_values(1), make_slice(info.gradients[0], 0, dim), 1.);
157 std::vector<std::vector<double>> values(
158 dim + 1, std::vector<double>(info.fe_values(0).n_quadrature_points, 0.));
159 solution->vector_values(info.fe_values(0).get_quadrature_points(), values);
161 const unsigned int deg = info.fe_values(0).get_fe().tensor_degree();
162 Laplace::nitsche_residual(dinfo.vector(0).block(0),
164 make_slice(info.values[0], 0, dim),
165 make_slice(info.gradients[0], 0, dim),
166 make_slice(values, 0, dim),
167 Laplace::compute_penalty(dinfo, dinfo, deg, deg));
173 IntegrationInfo<dim>& info2)
const 175 const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
176 Laplace::ip_residual(dinfo1.vector(0).block(0),
177 dinfo2.vector(0).block(0),
180 make_slice(info1.values[0], 0, dim),
181 make_slice(info1.gradients[0], 0, dim),
182 make_slice(info2.values[0], 0, dim),
183 make_slice(info2.gradients[0], 0, dim),
184 Laplace::compute_penalty(dinfo1, dinfo2, deg, deg));
191 : solution(&solution)
193 this->use_boundary =
false;
194 this->use_face =
false;
206 Assert(dinfo.n_values() >= 5, ExcDimensionMismatch(dinfo.n_values(), 5));
208 std::vector<std::vector<double>> val(
209 dim + 1, std::vector<double>(info.fe_values(0).n_quadrature_points, 0.));
210 std::vector<std::vector<Tensor<1, dim>>> grad(
211 dim + 1, std::vector<Tensor<1, dim>>(info.fe_values(0).n_quadrature_points));
213 solution->vector_values(info.fe_values(0).get_quadrature_points(), val);
214 solution->vector_gradients(info.fe_values(0).get_quadrature_points(), grad);
216 for (
unsigned int k = 0; k < info.fe_values(0).n_quadrature_points; ++k)
218 const double dx = info.fe_values(0).JxW(k);
220 Tensor<1, dim> Du0 = info.gradients[0][0][k];
222 Du0[0] -= grad[0][k][0];
223 Du0[1] -= grad[0][k][1];
224 Tensor<1, dim> Du1 = info.gradients[0][1][k];
226 Du1[0] -= grad[1][k][0];
227 Du1[1] -= grad[1][k][1];
228 div -= grad[0][k][0] + grad[1][k][1];
229 double u0 = info.values[0][0][k];
231 double u1 = info.values[0][1][k];
234 double p = info.values[0][dim][k];
236 Tensor<1, dim> Dp = info.gradients[0][dim][k];
237 Dp[0] += grad[dim][k][0];
238 Dp[1] += grad[dim][k][1];
241 dinfo.value(0) += (u0 * u0 + u1 * u1) * dx;
243 dinfo.value(1) += ((Du0 * Du0) + (Du1 * Du1)) * dx;
245 if (dinfo.value(2) < div * div)
246 dinfo.value(2) = div * div;
248 dinfo.value(3) += (p * p) * dx;
250 dinfo.value(4) += (Dp * Dp) * dx;
252 for (
unsigned int i = 0; i <= 4; ++i)
253 dinfo.value(i) = std::sqrt(dinfo.value(i));
265 IntegrationInfo<dim>&)
const 278 virtual void cell(MeshWorker::DoFInfo<dim>& dinfo, MeshWorker::IntegrationInfo<dim>& info)
const;
279 virtual void boundary(MeshWorker::DoFInfo<dim>& dinfo,
280 MeshWorker::IntegrationInfo<dim>& info)
const;
281 virtual void face(MeshWorker::DoFInfo<dim>& dinfo1, MeshWorker::DoFInfo<dim>& dinfo2,
282 MeshWorker::IntegrationInfo<dim>& info1,
283 MeshWorker::IntegrationInfo<dim>& info2)
const;
291 : solution(&solution)
294 this->use_boundary =
true;
295 this->use_face =
true;
303 MeshWorker::IntegrationInfo<dim>& info)
const 305 std::vector<std::vector<double>> rhs(
306 dim + 1, std::vector<double>(info.fe_values(0).n_quadrature_points, 0.));
308 solution->vector_laplacians(info.fe_values(0).get_quadrature_points(), rhs);
310 const std::vector<Tensor<2, dim>>& h0 = info.hessians[0][0];
311 const std::vector<Tensor<2, dim>>& h1 = info.hessians[0][1];
312 const std::vector<Tensor<1, dim>>& p1 = info.gradients[0][dim];
314 for (
unsigned int k = 0; k < info.fe_values(0).n_quadrature_points; ++k)
318 r[0] += dinfo.cell->diameter() * (trace(h0[k]) + p1[k][0] - rhs[0][k]);
319 r[1] += dinfo.cell->diameter() * (trace(h1[k]) + p1[k][1] - rhs[1][k]);
321 dinfo.value(0) += (r * r) * info.fe_values(0).JxW(k);
324 dinfo.value(0) = std::sqrt(dinfo.value(0));
330 MeshWorker::IntegrationInfo<dim>& info)
const 332 const FEValuesBase<dim>& fe = info.fe_values();
333 std::vector<std::vector<double>> values(
334 dim + 1, std::vector<double>(info.fe_values(0).n_quadrature_points, 0.));
335 solution->vector_values(info.fe_values(0).get_quadrature_points(), values);
337 const unsigned int deg = fe.get_fe().tensor_degree();
338 const double penalty = Laplace::compute_penalty(dinfo, dinfo, deg, deg);
340 for (
unsigned int k = 0; k < fe.n_quadrature_points; ++k)
343 for (
unsigned int d = 0; d < dim; ++d)
345 diff[d] += (info.values[0][d][k] - values[d][k]);
347 dinfo.value(0) += penalty * (diff * diff) * fe.JxW(k);
349 dinfo.value(0) = std::sqrt(dinfo.value(0));
355 MeshWorker::IntegrationInfo<dim>& info1,
356 MeshWorker::IntegrationInfo<dim>& info2)
const 358 const FEValuesBase<dim>& fe = info1.fe_values();
361 h = std::sqrt(dinfo1.face->measure());
363 h = dinfo1.face->measure();
365 const unsigned int deg1 = info1.fe_values().get_fe().tensor_degree();
366 const unsigned int deg2 = info2.fe_values().get_fe().tensor_degree();
367 const double penalty = 2. * Laplace::compute_penalty(dinfo1, dinfo2, deg1, deg2);
368 for (
unsigned int k = 0; k < fe.n_quadrature_points; ++k)
371 Tensor<1, dim> diff1;
372 for (
unsigned int d = 0; d < dim; ++d)
374 diff += (info1.gradients[0][d][k] - info2.gradients[0][d][k]) * fe.normal_vector(k)[d];
376 diff[d] -= (info1.values[0][dim][k] - info2.values[0][dim][k]) * fe.normal_vector(k)[d];
378 diff1[d] += info1.values[0][d][k] - info2.values[0][d][k];
380 dinfo1.value(0) += (penalty * (diff1 * diff1) + h * (diff * diff)) * fe.JxW(k);
382 dinfo1.value(0) = std::sqrt(dinfo1.value(0));
383 dinfo2.value(0) = dinfo1.value(0);
SmartPointer< FlowFunction< dim >, SolutionError< dim > > solution
Definition: stokes/solution.h:81
Definition: stokes/solution.h:55
SmartPointer< FlowFunction< dim >, SolutionRHS< dim > > solution
Definition: stokes/solution.h:45
virtual void boundary(MeshWorker::DoFInfo< dim > &dinfo, MeshWorker::IntegrationInfo< dim > &info) const
Definition: stokes/solution.h:329
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: stokes/solution.h:258
Definition: stokes/solution.h:274
virtual void face(MeshWorker::DoFInfo< dim > &dinfo1, MeshWorker::DoFInfo< dim > &dinfo2, MeshWorker::IntegrationInfo< dim > &info1, MeshWorker::IntegrationInfo< dim > &info2) const
Definition: stokes/solution.h:354
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: stokes/solution.h:172
Definition: stokes/solution.h:70
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: stokes/solution.h:115
SolutionResidual(FlowFunction< dim > &solution)
Definition: stokes/solution.h:123
Definition: stokes/eigen.h:37
virtual void cell(MeshWorker::DoFInfo< dim > &dinfo, MeshWorker::IntegrationInfo< dim > &info) const
Definition: stokes/solution.h:302
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: stokes/solution.h:264
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: stokes/solution.h:155
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: stokes/solution.h:204
SolutionError(FlowFunction< dim > &solution)
Definition: stokes/solution.h:190
SmartPointer< FlowFunction< dim >, SolutionEstimate< dim > > solution
Definition: stokes/solution.h:286
std::vector< unsigned int > error_types
Definition: integrator.h:113
Definition: stokes/solution.h:34
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: stokes/solution.h:109
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: stokes/solution.h:133
void cell_residual(dealii::Vector< number > &result, const dealii::FEValuesBase< dim > &fe, const dealii::VectorSlice< const std::vector< std::vector< dealii::Tensor< 1, dim >>>> &input, double lambda=0., double mu=1.)
Definition: elasticity/integrators.h:23
SolutionEstimate(FlowFunction< dim > &solution)
Definition: stokes/solution.h:290
SmartPointer< FlowFunction< dim >, SolutionResidual< dim > > solution
Definition: stokes/solution.h:66
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: stokes/solution.h:96
void add_flags(const dealii::UpdateFlags flags)
Add update flags on all objects.
Definition: integrator.h:454
Definition: integrator.h:29