9 #ifndef __laplace_solution_h 10 #define __laplace_solution_h 12 #include <amandus/integrator.h> 13 #include <deal.II/base/smartpointer.h> 14 #include <deal.II/base/tensor.h> 15 #include <deal.II/integrators/l2.h> 16 #include <deal.II/integrators/laplace.h> 36 virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
37 virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
38 virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
39 IntegrationInfo<dim>& info2)
const;
57 virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
58 virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
59 virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
60 IntegrationInfo<dim>& info2)
const;
72 virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
73 virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
74 virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
75 IntegrationInfo<dim>& info2)
const;
87 virtual void cell(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
88 virtual void boundary(DoFInfo<dim>& dinfo, IntegrationInfo<dim>& info)
const;
89 virtual void face(DoFInfo<dim>& dinfo1, DoFInfo<dim>& dinfo2, IntegrationInfo<dim>& info1,
90 IntegrationInfo<dim>& info2)
const;
100 : solution(&solution)
102 this->use_boundary =
true;
103 this->use_face =
false;
110 std::vector<double> rhs(info.fe_values(0).n_quadrature_points, 0.);
112 for (
unsigned int k = 0; k < info.fe_values(0).n_quadrature_points; ++k)
113 rhs[k] = -
solution->laplacian(info.fe_values(0).quadrature_point(k));
115 L2::L2(dinfo.vector(0).block(0), info.fe_values(0), rhs);
122 if (info.fe_values(0).get_fe().conforms(FiniteElementData<dim>::H1))
125 const FEValuesBase<dim>& fe = info.fe_values();
126 Vector<double>& local_vector = dinfo.vector(0).block(0);
128 std::vector<double> boundary_values(fe.n_quadrature_points);
129 solution->value_list(fe.get_quadrature_points(), boundary_values);
131 const unsigned int deg = fe.get_fe().tensor_degree();
132 const double penalty = 2. * Laplace::compute_penalty(dinfo, dinfo, deg, deg);
134 for (
unsigned k = 0; k < fe.n_quadrature_points; ++k)
135 for (
unsigned int i = 0; i < fe.dofs_per_cell; ++i)
136 local_vector(i) += (penalty * fe.shape_value(i, k) * boundary_values[k] -
137 (fe.normal_vector(k) * fe.shape_grad(i, k)) * boundary_values[k]) *
144 IntegrationInfo<dim>&)
const 152 : solution(&solution)
154 this->use_boundary =
true;
155 this->use_face =
true;
162 Assert(info.values.size() >= 1, ExcDimensionMismatch(info.values.size(), 1));
163 Assert(info.gradients.size() >= 1, ExcDimensionMismatch(info.values.size(), 1));
165 std::vector<double> rhs(info.fe_values(0).n_quadrature_points, 0.);
167 for (
unsigned int k = 0; k < info.fe_values(0).n_quadrature_points; ++k)
168 rhs[k] = -
solution->laplacian(info.fe_values(0).quadrature_point(k));
174 L2::L2(dinfo.vector(0).block(0), info.fe_values(0), info.values[0][0]);
176 L2::L2(dinfo.vector(0).block(0), info.fe_values(0), rhs, -factor);
184 if (info.fe_values(0).get_fe().conforms(FiniteElementData<dim>::H1))
187 std::vector<double> boundary_values(info.fe_values(0).n_quadrature_points, 0.);
188 solution->value_list(info.fe_values(0).get_quadrature_points(), boundary_values);
191 const unsigned int deg = info.fe_values(0).get_fe().tensor_degree();
192 Laplace::nitsche_residual(dinfo.vector(0).block(0),
195 info.gradients[0][0],
197 Laplace::compute_penalty(dinfo, dinfo, deg, deg),
204 IntegrationInfo<dim>& info2)
const 206 if (info1.fe_values(0).get_fe().conforms(FiniteElementData<dim>::H1))
209 const unsigned int deg = info1.fe_values(0).get_fe().tensor_degree();
211 Laplace::ip_residual(dinfo1.vector(0).block(0),
212 dinfo2.vector(0).block(0),
216 info1.gradients[0][0],
218 info2.gradients[0][0],
219 Laplace::compute_penalty(dinfo1, dinfo2, deg, deg),
227 : solution(&solution)
229 this->use_boundary =
false;
230 this->use_face =
false;
239 Assert(dinfo.n_values() >= 2, ExcDimensionMismatch(dinfo.n_values(), 4));
241 for (
unsigned int k = 0; k < info.fe_values(0).n_quadrature_points; ++k)
243 const double dx = info.fe_values(0).JxW(k);
245 Tensor<1, dim> Du_h = info.gradients[0][0][k];
246 Tensor<1, dim> Du =
solution->gradient(info.fe_values(0).quadrature_point(k));
247 Tensor<1, dim> ddiff = Du - Du_h;
248 double u_h = info.values[0][0][k];
249 double u =
solution->value(info.fe_values(0).quadrature_point(k));
250 double diff = u - u_h;
253 dinfo.value(0) += (diff * diff) * dx;
255 dinfo.value(1) += (ddiff * ddiff) * dx;
257 dinfo.value(0) = std::sqrt(dinfo.value(0));
258 dinfo.value(1) = std::sqrt(dinfo.value(1));
270 IntegrationInfo<dim>&)
const 278 : solution(&solution)
280 this->use_boundary =
true;
281 this->use_face =
true;
289 const FEValuesBase<dim>& fe = info.fe_values();
291 const std::vector<Tensor<2, dim>>& DDuh = info.hessians[0][0];
292 for (
unsigned k = 0; k < fe.n_quadrature_points; ++k)
294 const double t = dinfo.cell->diameter() *
295 (trace(DDuh[k]) -
solution->laplacian(info.fe_values(0).quadrature_point(k)));
296 dinfo.value(0) += t * t * fe.JxW(k);
298 dinfo.value(0) = std::sqrt(dinfo.value(0));
305 const FEValuesBase<dim>& fe = info.fe_values();
307 std::vector<double> boundary_values(fe.n_quadrature_points, 0.);
308 solution->value_list(fe.get_quadrature_points(), boundary_values);
310 const std::vector<double>& uh = info.values[0][0];
312 const unsigned int deg = fe.get_fe().tensor_degree();
313 const double penalty = Laplace::compute_penalty(dinfo, dinfo, deg, deg);
315 for (
unsigned k = 0; k < fe.n_quadrature_points; ++k)
317 penalty * (boundary_values[k] - uh[k]) * (boundary_values[k] - uh[k]) * fe.JxW(k);
318 dinfo.value(0) = std::sqrt(dinfo.value(0));
324 IntegrationInfo<dim>& info2)
const 326 const FEValuesBase<dim>& fe = info1.fe_values();
327 const std::vector<double>& uh1 = info1.values[0][0];
328 const std::vector<double>& uh2 = info2.values[0][0];
329 const std::vector<Tensor<1, dim>>& Duh1 = info1.gradients[0][0];
330 const std::vector<Tensor<1, dim>>& Duh2 = info2.gradients[0][0];
332 const unsigned int deg1 = info1.fe_values().get_fe().tensor_degree();
333 const unsigned int deg2 = info2.fe_values().get_fe().tensor_degree();
334 const double penalty = 2. * Laplace::compute_penalty(dinfo1, dinfo2, deg1, deg2);
338 h = std::sqrt(dinfo1.face->measure());
340 h = dinfo1.face->measure();
342 for (
unsigned k = 0; k < fe.n_quadrature_points; ++k)
344 double diff1 = uh1[k] - uh2[k];
345 double diff2 = fe.normal_vector(k) * Duh1[k] - fe.normal_vector(k) * Duh2[k];
346 dinfo1.value(0) += (penalty * diff1 * diff1 + h * diff2 * diff2) * fe.JxW(k);
348 dinfo1.value(0) = std::sqrt(dinfo1.value(0));
349 dinfo2.value(0) = dinfo1.value(0);
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: laplace/solution.h:143
Definition: laplace/solution.h:31
SolutionResidual(Function< dim > &solution)
Definition: laplace/solution.h:151
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: laplace/solution.h:269
SmartPointer< Function< dim >, SolutionError< dim > > solution
Definition: laplace/solution.h:78
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: laplace/solution.h:237
double timestep
Current timestep if applicable.
Definition: integrator.h:48
Definition: laplace/eigen.h:19
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: laplace/solution.h:203
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: laplace/solution.h:303
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: laplace/solution.h:287
Definition: laplace/solution.h:67
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: laplace/solution.h:160
virtual void face(DoFInfo< dim > &dinfo1, DoFInfo< dim > &dinfo2, IntegrationInfo< dim > &info1, IntegrationInfo< dim > &info2) const
Definition: laplace/solution.h:323
SmartPointer< Function< dim >, SolutionRHS< dim > > solution
Definition: laplace/solution.h:42
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: laplace/solution.h:120
std::vector< unsigned int > error_types
Definition: integrator.h:113
SolutionEstimate(Function< dim > &solution)
Definition: laplace/solution.h:277
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
SmartPointer< Function< dim >, SolutionEstimate< dim > > solution
Definition: laplace/solution.h:93
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: laplace/solution.h:182
Definition: laplace/solution.h:52
virtual void cell(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: laplace/solution.h:108
virtual void boundary(DoFInfo< dim > &dinfo, IntegrationInfo< dim > &info) const
Definition: laplace/solution.h:263
void add_flags(const dealii::UpdateFlags flags)
Add update flags on all objects.
Definition: integrator.h:454
SolutionError(Function< dim > &solution)
Definition: laplace/solution.h:226
Definition: integrator.h:29
SmartPointer< Function< dim >, SolutionResidual< dim > > solution
Definition: laplace/solution.h:63
Definition: laplace/solution.h:82