16 #ifndef dealii__integrators_laplace_h 17 #define dealii__integrators_laplace_h 20 #include <deal.II/base/config.h> 21 #include <deal.II/base/exceptions.h> 22 #include <deal.II/base/quadrature.h> 23 #include <deal.II/lac/full_matrix.h> 24 #include <deal.II/fe/mapping.h> 25 #include <deal.II/fe/fe_values.h> 26 #include <deal.II/meshworker/dof_info.h> 28 DEAL_II_NAMESPACE_OPEN
55 const double factor = 1.)
58 const unsigned int n_components = fe.
get_fe().n_components();
62 const double dx = fe.
JxW(k) * factor;
63 for (
unsigned int i=0; i<n_dofs; ++i)
66 for (
unsigned int d=0; d<n_components; ++d)
72 for (
unsigned int j=i+1; j<n_dofs; ++j)
75 for (
unsigned int d=0; d<n_components; ++d)
102 Assert(input.size() == nq, ExcDimensionMismatch(input.size(), nq));
103 Assert(result.
size() == n_dofs, ExcDimensionMismatch(result.
size(), n_dofs));
105 for (
unsigned int k=0; k<nq; ++k)
107 const double dx = factor * fe.
JxW(k);
108 for (
unsigned int i=0; i<n_dofs; ++i)
109 result(i) += dx * (input[k] * fe.
shape_grad(i,k));
129 const unsigned int n_comp = fe.
get_fe().n_components();
132 Assert(result.
size() == n_dofs, ExcDimensionMismatch(result.
size(), n_dofs));
134 for (
unsigned int k=0; k<nq; ++k)
136 const double dx = factor * fe.
JxW(k);
137 for (
unsigned int i=0; i<n_dofs; ++i)
138 for (
unsigned int d=0; d<n_comp; ++d)
168 const unsigned int n_comp = fe.
get_fe().n_components();
170 Assert (M.
m() == n_dofs, ExcDimensionMismatch(M.
m(), n_dofs));
171 Assert (M.
n() == n_dofs, ExcDimensionMismatch(M.
n(), n_dofs));
175 const double dx = fe.
JxW(k) * factor;
177 for (
unsigned int i=0; i<n_dofs; ++i)
178 for (
unsigned int j=0; j<n_dofs; ++j)
179 for (
unsigned int d=0; d<n_comp; ++d)
206 const std::vector<double> &input,
208 const std::vector<double> &data,
219 const double dx = factor * fe.
JxW(k);
221 for (
unsigned int i=0; i<n_dofs; ++i)
224 const double dnu = Dinput[k] * n;
226 const double u= input[k];
227 const double g= data[k];
229 result(i) += dx*(2.*penalty*(u-g)*v - dnv*(u-g) - dnu*v);
255 const VectorSlice<
const std::vector<std::vector<double> > > &input,
257 const VectorSlice<
const std::vector<std::vector<double> > > &data,
262 const unsigned int n_comp = fe.
get_fe().n_components();
269 const double dx = factor * fe.
JxW(k);
271 for (
unsigned int i=0; i<n_dofs; ++i)
272 for (
unsigned int d=0; d<n_comp; ++d)
275 const double dnu = Dinput[d][k] * n;
277 const double u= input[d][k];
278 const double g= data[d][k];
280 result(i) += dx*(2.*penalty*(u-g)*v - dnv*(u-g) - dnu*v);
314 double factor2 = -1.)
326 const double nui = factor1;
327 const double nue = (factor2 < 0) ? factor1 : factor2;
328 const double nu = .5*(nui+nue);
332 const double dx = fe1.
JxW(k);
334 for (
unsigned int d=0; d<fe1.
get_fe().n_components(); ++d)
336 for (
unsigned int i=0; i<n_dofs; ++i)
338 for (
unsigned int j=0; j<n_dofs; ++j)
348 M11(i,j) += dx*(-.5*nui*dnvi*ui-.5*nui*dnui*vi+nu*penalty*ui*vi);
349 M12(i,j) += dx*( .5*nui*dnvi*ue-.5*nue*dnue*vi-nu*penalty*vi*ue);
350 M21(i,j) += dx*(-.5*nue*dnve*ui+.5*nui*dnui*ve-nu*penalty*ui*ve);
351 M22(i,j) += dx*( .5*nue*dnve*ue+.5*nue*dnue*ve+nu*penalty*ue*ve);
382 double factor2 = -1.)
396 const double nui = factor1;
397 const double nue = (factor2 < 0) ? factor1 : factor2;
398 const double nu = .5*(nui+nue);
402 const double dx = fe1.
JxW(k);
404 for (
unsigned int i=0; i<n_dofs; ++i)
406 for (
unsigned int j=0; j<n_dofs; ++j)
413 double ngradu1n = 0.;
414 double ngradv1n = 0.;
415 double ngradu2n = 0.;
416 double ngradv2n = 0.;
418 for (
unsigned int d=0; d<dim; ++d)
431 for (
unsigned int d=0; d<fe1.
get_fe().n_components(); ++d)
445 M11(i,j) += dx*(-.5*nui*dnvi*ui-.5*nui*dnui*vi+nu*penalty*ui*vi);
446 M12(i,j) += dx*( .5*nui*dnvi*ue-.5*nue*dnue*vi-nu*penalty*vi*ue);
447 M21(i,j) += dx*(-.5*nue*dnve*ui+.5*nui*dnui*ve-nu*penalty*ui*ve);
448 M22(i,j) += dx*( .5*nue*dnve*ue+.5*nue*dnue*ve+nu*penalty*ue*ve);
472 const std::vector<double> &input1,
474 const std::vector<double> &input2,
477 double int_factor = 1.,
478 double ext_factor = -1.)
481 ExcDimensionMismatch(fe1.
get_fe().n_components(), 1));
483 ExcDimensionMismatch(fe2.
get_fe().n_components(), 1));
485 const double nui = int_factor;
486 const double nue = (ext_factor < 0) ? int_factor : ext_factor;
487 const double penalty = .5 * pen * (nui + nue);
493 const double dx = fe1.
JxW(k);
496 for (
unsigned int i=0; i<n_dofs; ++i)
500 const double dnvi = Dvi * n;
503 const double dnve = Dve * n;
505 const double ui = input1[k];
507 const double dnui = Dui * n;
508 const double ue = input2[k];
510 const double dnue = Due * n;
512 result1(i) += dx*(-.5*nui*dnvi*ui-.5*nui*dnui*vi+penalty*ui*vi);
513 result1(i) += dx*( .5*nui*dnvi*ue-.5*nue*dnue*vi-penalty*vi*ue);
514 result2(i) += dx*(-.5*nue*dnve*ui+.5*nui*dnui*ve-penalty*ui*ve);
515 result2(i) += dx*( .5*nue*dnve*ue+.5*nue*dnue*ve+penalty*ue*ve);
539 const VectorSlice<
const std::vector<std::vector<double> > > &input1,
541 const VectorSlice<
const std::vector<std::vector<double> > > &input2,
544 double int_factor = 1.,
545 double ext_factor = -1.)
547 const unsigned int n_comp = fe1.
get_fe().n_components();
555 const double nui = int_factor;
556 const double nue = (ext_factor < 0) ? int_factor : ext_factor;
557 const double penalty = .5 * pen * (nui + nue);
562 const double dx = fe1.
JxW(k);
565 for (
unsigned int i=0; i<n1; ++i)
566 for (
unsigned int d=0; d<n_comp; ++d)
570 const double dnvi = Dvi * n;
573 const double dnve = Dve * n;
575 const double ui = input1[d][k];
577 const double dnui = Dui * n;
578 const double ue = input2[d][k];
580 const double dnue = Due * n;
582 result1(i) += dx*(-.5*nui*dnvi*ui-.5*nui*dnui*vi+penalty*ui*vi);
583 result1(i) += dx*( .5*nui*dnvi*ue-.5*nue*dnue*vi-penalty*vi*ue);
584 result2(i) += dx*(-.5*nue*dnve*ui+.5*nui*dnui*ve-penalty*ui*ve);
585 result2(i) += dx*( .5*nue*dnve*ue+.5*nue*dnue*ve+penalty*ue*ve);
606 template <
int dim,
int spacedim,
typename number>
615 const unsigned int deg1sq = (deg1 == 0) ? 1 : deg1 * (deg1+1);
616 const unsigned int deg2sq = (deg2 == 0) ? 1 : deg2 * (deg2+1);
618 double penalty1 = deg1sq / dinfo1.
cell->extent_in_direction(normal1);
619 double penalty2 = deg2sq / dinfo2.
cell->extent_in_direction(normal2);
620 if (dinfo1.
cell->has_children() ^ dinfo2.
cell->has_children())
623 Assert (dinfo1.
face->has_children(), ExcInternalError());
626 const double penalty = 0.5*(penalty1 + penalty2);
633 DEAL_II_NAMESPACE_CLOSE
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.)
const unsigned int dofs_per_cell
void cell_matrix(FullMatrix< double > &M, const FEValuesBase< dim > &fe, const double factor=1.)
#define AssertVectorVectorDimension(vec, dim1, dim2)
const FiniteElement< dim, spacedim > & get_fe() const
void cell_residual(Vector< double > &result, const FEValuesBase< dim > &fe, const std::vector< Tensor< 1, dim > > &input, double factor=1.)
double shape_value_component(const unsigned int function_no, const unsigned int point_no, const unsigned int component) const
Library of integrals over cells and faces.
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.)
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 double & shape_value(const unsigned int function_no, const unsigned int point_no) const
#define Assert(cond, exc)
const unsigned int n_quadrature_points
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)
double JxW(const unsigned int quadrature_point) const
Triangulation< dim, spacedim >::face_iterator face
The current face.
const Tensor< 1, spacedim > & shape_grad(const unsigned int function_no, 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.)
const Tensor< 1, spacedim > & normal_vector(const unsigned int i) const
Tensor< 1, spacedim > shape_grad_component(const unsigned int function_no, const unsigned int point_no, const unsigned int component) const