16 #ifndef dealii_integrators_laplace_h 17 #define dealii_integrators_laplace_h 20 #include <deal.II/base/config.h> 22 #include <deal.II/base/exceptions.h> 23 #include <deal.II/base/quadrature.h> 25 #include <deal.II/fe/fe_values.h> 26 #include <deal.II/fe/mapping.h> 28 #include <deal.II/lac/full_matrix.h> 30 #include <deal.II/meshworker/dof_info.h> 32 DEAL_II_NAMESPACE_OPEN
59 const double factor = 1.)
62 const unsigned int n_components = fe.
get_fe().n_components();
66 const double dx = fe.
JxW(k) * factor;
67 for (
unsigned int i = 0; i < n_dofs; ++i)
70 for (
unsigned int d = 0; d < n_components; ++d)
76 for (
unsigned int j = i + 1; j < n_dofs; ++j)
79 for (
unsigned int d = 0; d < n_components; ++d)
108 for (
unsigned int k = 0; k < nq; ++k)
110 const double dx = factor * fe.
JxW(k);
111 for (
unsigned int i = 0; i < n_dofs; ++i)
112 result(i) += dx * (input[k] * fe.
shape_grad(i, k));
132 const unsigned int n_comp = fe.
get_fe().n_components();
138 for (
unsigned int k = 0; k < nq; ++k)
140 const double dx = factor * fe.
JxW(k);
141 for (
unsigned int i = 0; i < n_dofs; ++i)
142 for (
unsigned int d = 0; d < n_comp; ++d)
172 const unsigned int n_comp = fe.
get_fe().n_components();
179 const double dx = fe.
JxW(k) * factor;
181 for (
unsigned int i = 0; i < n_dofs; ++i)
182 for (
unsigned int j = 0; j < n_dofs; ++j)
183 for (
unsigned int d = 0; d < n_comp; ++d)
222 const double dx = fe.
JxW(k) * factor;
224 for (
unsigned int i = 0; i < n_dofs; ++i)
225 for (
unsigned int j = 0; j < n_dofs; ++j)
232 for (
unsigned int d = 0; d < dim; ++d)
240 for (
unsigned int d = 0; d < dim; ++d)
251 M(i, j) += dx * (2. * penalty * u_t * v_t - dnu_t * v_t -
278 const std::vector<double> & input,
280 const std::vector<double> & data,
291 const double dx = factor * fe.
JxW(k);
293 for (
unsigned int i = 0; i < n_dofs; ++i)
296 const double dnu = Dinput[k] * n;
298 const double u = input[k];
299 const double g = data[k];
302 dx * (2. * penalty * (u - g) * v - dnv * (u - g) - dnu * v);
329 const VectorSlice<
const std::vector<std::vector<double>>> & input,
331 const VectorSlice<
const std::vector<std::vector<double>>> & data,
336 const unsigned int n_comp = fe.
get_fe().n_components();
343 const double dx = factor * fe.
JxW(k);
345 for (
unsigned int i = 0; i < n_dofs; ++i)
346 for (
unsigned int d = 0; d < n_comp; ++d)
349 const double dnu = Dinput[d][k] * n;
351 const double u = input[d][k];
352 const double g = data[d][k];
355 dx * (2. * penalty * (u - g) * v - dnv * (u - g) - dnu * v);
389 double factor2 = -1.)
401 const double nui = factor1;
402 const double nue = (factor2 < 0) ? factor1 : factor2;
403 const double nu = .5 * (nui + nue);
407 const double dx = fe1.
JxW(k);
409 for (
unsigned int d = 0; d < fe1.
get_fe().n_components(); ++d)
411 for (
unsigned int i = 0; i < n_dofs; ++i)
413 for (
unsigned int j = 0; j < n_dofs; ++j)
424 dx * (-.5 * nui * dnvi * ui - .5 * nui * dnui * vi +
425 nu * penalty * ui * vi);
427 dx * (.5 * nui * dnvi * ue - .5 * nue * dnue * vi -
428 nu * penalty * vi * ue);
430 dx * (-.5 * nue * dnve * ui + .5 * nui * dnui * ve -
431 nu * penalty * ui * ve);
433 dx * (.5 * nue * dnve * ue + .5 * nue * dnue * ve +
434 nu * penalty * ue * ve);
465 double factor2 = -1.)
479 const double nui = factor1;
480 const double nue = (factor2 < 0) ? factor1 : factor2;
481 const double nu = .5 * (nui + nue);
485 const double dx = fe1.
JxW(k);
487 for (
unsigned int i = 0; i < n_dofs; ++i)
492 for (
unsigned int j = 0; j < n_dofs; ++j)
499 double ngradu1n = 0.;
500 double ngradv1n = 0.;
501 double ngradu2n = 0.;
502 double ngradv2n = 0.;
504 for (
unsigned int d = 0; d < dim; ++d)
520 for (
unsigned int d = 0; d < dim; ++d)
543 dx * (-.5 * nui * dnvi * ui - .5 * nui * dnui * vi +
544 nu * penalty * ui * vi);
546 dx * (.5 * nui * dnvi * ue - .5 * nue * dnue * vi -
547 nu * penalty * vi * ue);
549 dx * (-.5 * nue * dnve * ui + .5 * nui * dnui * ve -
550 nu * penalty * ui * ve);
552 dx * (.5 * nue * dnve * ue + .5 * nue * dnue * ve +
553 nu * penalty * ue * ve);
576 const std::vector<double> & input1,
578 const std::vector<double> & input2,
581 double int_factor = 1.,
582 double ext_factor = -1.)
589 const double nui = int_factor;
590 const double nue = (ext_factor < 0) ? int_factor : ext_factor;
591 const double penalty = .5 * pen * (nui + nue);
597 const double dx = fe1.
JxW(k);
600 for (
unsigned int i = 0; i < n_dofs; ++i)
604 const double dnvi = Dvi * n;
607 const double dnve = Dve * n;
609 const double ui = input1[k];
611 const double dnui = Dui * n;
612 const double ue = input2[k];
614 const double dnue = Due * n;
616 result1(i) += dx * (-.5 * nui * dnvi * ui - .5 * nui * dnui * vi +
618 result1(i) += dx * (.5 * nui * dnvi * ue - .5 * nue * dnue * vi -
620 result2(i) += dx * (-.5 * nue * dnve * ui + .5 * nui * dnui * ve -
622 result2(i) += dx * (.5 * nue * dnve * ue + .5 * nue * dnue * ve +
647 const VectorSlice<
const std::vector<std::vector<double>>> &input1,
650 const VectorSlice<
const std::vector<std::vector<double>>> &input2,
654 double int_factor = 1.,
655 double ext_factor = -1.)
657 const unsigned int n_comp = fe1.
get_fe().n_components();
665 const double nui = int_factor;
666 const double nue = (ext_factor < 0) ? int_factor : ext_factor;
667 const double penalty = .5 * pen * (nui + nue);
672 const double dx = fe1.
JxW(k);
675 for (
unsigned int i = 0; i < n1; ++i)
676 for (
unsigned int d = 0; d < n_comp; ++d)
680 const double dnvi = Dvi * n;
683 const double dnve = Dve * n;
685 const double ui = input1[d][k];
687 const double dnui = Dui * n;
688 const double ue = input2[d][k];
690 const double dnue = Due * n;
692 result1(i) += dx * (-.5 * nui * dnvi * ui -
693 .5 * nui * dnui * vi + penalty * ui * vi);
694 result1(i) += dx * (.5 * nui * dnvi * ue -
695 .5 * nue * dnue * vi - penalty * vi * ue);
696 result2(i) += dx * (-.5 * nue * dnve * ui +
697 .5 * nui * dnui * ve - penalty * ui * ve);
698 result2(i) += dx * (.5 * nue * dnve * ue +
699 .5 * nue * dnue * ve + penalty * ue * ve);
720 template <
int dim,
int spacedim,
typename number>
727 const unsigned int normal1 =
729 const unsigned int normal2 =
731 const unsigned int deg1sq = (deg1 == 0) ? 1 : deg1 * (deg1 + 1);
732 const unsigned int deg2sq = (deg2 == 0) ? 1 : deg2 * (deg2 + 1);
734 double penalty1 = deg1sq / dinfo1.
cell->extent_in_direction(normal1);
735 double penalty2 = deg2sq / dinfo2.
cell->extent_in_direction(normal2);
736 if (dinfo1.
cell->has_children() ^ dinfo2.
cell->has_children())
742 const double penalty = 0.5 * (penalty1 + penalty2);
749 DEAL_II_NAMESPACE_CLOSE
double shape_value_component(const unsigned int function_no, const unsigned int point_no, const unsigned int component) const
void cell_residual(Vector< double > &result, const FEValuesBase< dim > &fe, const std::vector< Tensor< 1, dim >> &input, double factor=1.)
const Tensor< 1, spacedim > & shape_grad(const unsigned int function_no, const unsigned int quadrature_point) const
Triangulation< dim, spacedim >::cell_iterator cell
The current cell.
#define AssertDimension(dim1, dim2)
void ip_matrix(FullMatrix< double > &M11, FullMatrix< double > &M12, FullMatrix< double > &M21, FullMatrix< double > &M22, const FEValuesBase< dim > &fe1, const FEValuesBase< dim > &fe2, double penalty, double factor1=1., double factor2=-1.)
void nitsche_tangential_matrix(FullMatrix< double > &M, const FEValuesBase< dim > &fe, double penalty, double factor=1.)
const unsigned int dofs_per_cell
const Tensor< 1, spacedim > & normal_vector(const unsigned int i) const
void cell_matrix(FullMatrix< double > &M, const FEValuesBase< dim > &fe, const double factor=1.)
#define AssertVectorVectorDimension(vec, dim1, dim2)
Library of integrals over cells and faces.
#define Assert(cond, exc)
static::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
const FiniteElement< dim, spacedim > & get_fe() const
void ip_residual(Vector< double > &result1, Vector< double > &result2, const FEValuesBase< dim > &fe1, const FEValuesBase< dim > &fe2, const std::vector< double > &input1, const std::vector< Tensor< 1, dim >> &Dinput1, const std::vector< double > &input2, const std::vector< Tensor< 1, dim >> &Dinput2, double pen, double int_factor=1., double ext_factor=-1.)
const unsigned int n_quadrature_points
const double & shape_value(const unsigned int function_no, const unsigned int point_no) const
void nitsche_matrix(FullMatrix< double > &M, const FEValuesBase< dim > &fe, double penalty, double factor=1.)
double compute_penalty(const MeshWorker::DoFInfo< dim, spacedim, number > &dinfo1, const MeshWorker::DoFInfo< dim, spacedim, number > &dinfo2, unsigned int deg1, unsigned int deg2)
void nitsche_residual(Vector< double > &result, const FEValuesBase< dim > &fe, const std::vector< double > &input, const std::vector< Tensor< 1, dim >> &Dinput, const std::vector< double > &data, double penalty, double factor=1.)
Triangulation< dim, spacedim >::face_iterator face
The current face.
Tensor< 1, spacedim > shape_grad_component(const unsigned int function_no, const unsigned int point_no, const unsigned int component) const
double JxW(const unsigned int quadrature_point) const
void ip_tangential_matrix(FullMatrix< double > &M11, FullMatrix< double > &M12, FullMatrix< double > &M21, FullMatrix< double > &M22, const FEValuesBase< dim > &fe1, const FEValuesBase< dim > &fe2, double penalty, double factor1=1., double factor2=-1.)
static::ExceptionBase & ExcInternalError()