deal.II version GIT relicensing-6834-g5b78e6bcdf 2026-10-01 11:20:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
grad_div.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2016 - 2024 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_integrators_grad_div_h
14#define dealii_integrators_grad_div_h
15
16
17#include <deal.II/base/config.h>
18
21
23#include <deal.II/fe/mapping.h>
24
26
28
30
31namespace LocalIntegrators
32{
39 namespace GradDiv
40 {
47 template <int dim>
50 const FEValuesBase<dim> &fe,
51 double factor = 1.)
52 {
53 const unsigned int n_dofs = fe.dofs_per_cell;
54
56 AssertDimension(M.m(), n_dofs);
57 AssertDimension(M.n(), n_dofs);
58
59 for (unsigned int k = 0; k < fe.n_quadrature_points; ++k)
60 {
61 const double dx = factor * fe.JxW(k);
62 for (unsigned int i = 0; i < n_dofs; ++i)
63 for (unsigned int j = 0; j < n_dofs; ++j)
64 {
65 const double divu =
66 fe[FEValuesExtractors::Vector(0)].divergence(j, k);
67 const double divv =
68 fe[FEValuesExtractors::Vector(0)].divergence(i, k);
69
70 M(i, j) += dx * divu * divv;
71 }
72 }
73 }
74
81 template <int dim, typename number>
84 const FEValuesBase<dim> &fetest,
85 const ArrayView<const std::vector<Tensor<1, dim>>> &input,
86 const double factor = 1.)
87 {
88 const unsigned int n_dofs = fetest.dofs_per_cell;
89
90 AssertDimension(fetest.get_fe().n_components(), dim);
92
93 for (unsigned int k = 0; k < fetest.n_quadrature_points; ++k)
94 {
95 const double dx = factor * fetest.JxW(k);
96 for (unsigned int i = 0; i < n_dofs; ++i)
97 {
98 const double divv =
99 fetest[FEValuesExtractors::Vector(0)].divergence(i, k);
100 double du = 0.;
101 for (unsigned int d = 0; d < dim; ++d)
102 du += input[d][k][d];
103
104 result(i) += dx * du * divv;
105 }
106 }
107 }
108
117 template <int dim>
118 DEAL_II_DEPRECATED inline void
120 const FEValuesBase<dim> &fe,
121 double penalty,
122 double factor = 1.)
123 {
124 const unsigned int n_dofs = fe.dofs_per_cell;
125
127 AssertDimension(M.m(), n_dofs);
128 AssertDimension(M.n(), n_dofs);
129
130 for (unsigned int k = 0; k < fe.n_quadrature_points; ++k)
131 {
132 const double dx = factor * fe.JxW(k);
133 const Tensor<1, dim> n = fe.normal_vector(k);
134 for (unsigned int i = 0; i < n_dofs; ++i)
135 for (unsigned int j = 0; j < n_dofs; ++j)
136 {
137 const double divu =
138 fe[FEValuesExtractors::Vector(0)].divergence(j, k);
139 const double divv =
140 fe[FEValuesExtractors::Vector(0)].divergence(i, k);
141 double un = 0., vn = 0.;
142 for (unsigned int d = 0; d < dim; ++d)
143 {
144 un += fe.shape_value_component(j, k, d) * n[d];
145 vn += fe.shape_value_component(i, k, d) * n[d];
146 }
147
148 M(i, j) += dx * 2. * penalty * un * vn;
149 M(i, j) -= dx * (divu * vn + divv * un);
150 }
151 }
152 }
153
169 template <int dim>
172 const FEValuesBase<dim> &fe,
173 const ArrayView<const std::vector<double>> &input,
174 const ArrayView<const std::vector<Tensor<1, dim>>> &Dinput,
175 const ArrayView<const std::vector<double>> &data,
176 double penalty,
177 double factor = 1.)
178 {
179 const unsigned int n_dofs = fe.dofs_per_cell;
184
185 for (unsigned int k = 0; k < fe.n_quadrature_points; ++k)
186 {
187 const double dx = factor * fe.JxW(k);
188 const Tensor<1, dim> n = fe.normal_vector(k);
189
190 double umgn = 0.;
191 double divu = 0.;
192 for (unsigned int d = 0; d < dim; ++d)
193 {
194 umgn += (input[d][k] - data[d][k]) * n[d];
195 divu += Dinput[d][k][d];
196 }
197
198 for (unsigned int i = 0; i < n_dofs; ++i)
199 {
200 double vn = 0.;
201 const double divv =
202 fe[FEValuesExtractors::Vector(0)].divergence(i, k);
203 for (unsigned int d = 0; d < dim; ++d)
204 vn += fe.shape_value_component(i, k, d) * n[d];
205
206 result(i) +=
207 dx * (2. * penalty * umgn * vn - divv * umgn - divu * vn);
208 }
209 }
210 }
211
216 template <int dim>
222 const FEValuesBase<dim> &fe1,
223 const FEValuesBase<dim> &fe2,
224 double penalty,
225 double factor1 = 1.,
226 double factor2 = -1.)
227 {
228 const unsigned int n_dofs = fe1.dofs_per_cell;
229 AssertDimension(M11.n(), n_dofs);
230 AssertDimension(M11.m(), n_dofs);
231 AssertDimension(M12.n(), n_dofs);
232 AssertDimension(M12.m(), n_dofs);
233 AssertDimension(M21.n(), n_dofs);
234 AssertDimension(M21.m(), n_dofs);
235 AssertDimension(M22.n(), n_dofs);
236 AssertDimension(M22.m(), n_dofs);
237
238 const double fi = factor1;
239 const double fe = (factor2 < 0) ? factor1 : factor2;
240 const double f = .5 * (fi + fe);
241
242 for (unsigned int k = 0; k < fe1.n_quadrature_points; ++k)
243 {
244 const double dx = fe1.JxW(k);
245 const Tensor<1, dim> n = fe1.normal_vector(k);
246 for (unsigned int i = 0; i < n_dofs; ++i)
247 for (unsigned int j = 0; j < n_dofs; ++j)
248 {
249 double uni = 0.;
250 double une = 0.;
251 double vni = 0.;
252 double vne = 0.;
253 const double divui =
254 fe1[FEValuesExtractors::Vector(0)].divergence(j, k);
255 const double divue =
256 fe2[FEValuesExtractors::Vector(0)].divergence(j, k);
257 const double divvi =
258 fe1[FEValuesExtractors::Vector(0)].divergence(i, k);
259 const double divve =
260 fe2[FEValuesExtractors::Vector(0)].divergence(i, k);
261
262 for (unsigned int d = 0; d < dim; ++d)
263 {
264 uni += fe1.shape_value_component(j, k, d) * n[d];
265 une += fe2.shape_value_component(j, k, d) * n[d];
266 vni += fe1.shape_value_component(i, k, d) * n[d];
267 vne += fe2.shape_value_component(i, k, d) * n[d];
268 }
269 M11(i, j) +=
270 dx * (-.5 * fi * divvi * uni - .5 * fi * divui * vni +
271 f * penalty * uni * vni);
272 M12(i, j) +=
273 dx * (.5 * fi * divvi * une - .5 * fe * divue * vni -
274 f * penalty * vni * une);
275 M21(i, j) +=
276 dx * (-.5 * fe * divve * uni + .5 * fi * divui * vne -
277 f * penalty * uni * vne);
278 M22(i, j) +=
279 dx * (.5 * fe * divve * une + .5 * fe * divue * vne +
280 f * penalty * une * vne);
281 }
282 }
283 }
284
296 template <int dim>
299 Vector<double> &result2,
300 const FEValuesBase<dim> &fe1,
301 const FEValuesBase<dim> &fe2,
302 const ArrayView<const std::vector<double>> &input1,
303 const ArrayView<const std::vector<Tensor<1, dim>>> &Dinput1,
304 const ArrayView<const std::vector<double>> &input2,
305 const ArrayView<const std::vector<Tensor<1, dim>>> &Dinput2,
306 double pen,
307 double int_factor = 1.,
308 double ext_factor = -1.)
309 {
310 const unsigned int n1 = fe1.dofs_per_cell;
311
312 AssertDimension(fe1.get_fe().n_components(), dim);
317
318 const double fi = int_factor;
319 const double fe = (ext_factor < 0) ? int_factor : ext_factor;
320 const double penalty = .5 * pen * (fi + fe);
321
322
323 for (unsigned int k = 0; k < fe1.n_quadrature_points; ++k)
324 {
325 const double dx = fe1.JxW(k);
326 const Tensor<1, dim> n = fe1.normal_vector(k);
327 double uni = 0.;
328 double une = 0.;
329 double divui = 0.;
330 double divue = 0.;
331 for (unsigned int d = 0; d < dim; ++d)
332 {
333 uni += input1[d][k] * n[d];
334 une += input2[d][k] * n[d];
335 divui += Dinput1[d][k][d];
336 divue += Dinput2[d][k][d];
337 }
338
339 for (unsigned int i = 0; i < n1; ++i)
340 {
341 double vni = 0.;
342 double vne = 0.;
343 const double divvi =
344 fe1[FEValuesExtractors::Vector(0)].divergence(i, k);
345 const double divve =
346 fe2[FEValuesExtractors::Vector(0)].divergence(i, k);
347 for (unsigned int d = 0; d < dim; ++d)
348 {
349 vni += fe1.shape_value_component(i, k, d) * n[d];
350 vne += fe2.shape_value_component(i, k, d) * n[d];
351 }
352
353 result1(i) += dx * (-.5 * fi * divvi * uni -
354 .5 * fi * divui * vni + penalty * uni * vni);
355 result1(i) += dx * (.5 * fi * divvi * une -
356 .5 * fe * divue * vni - penalty * vni * une);
357 result2(i) += dx * (-.5 * fe * divve * uni +
358 .5 * fi * divui * vne - penalty * uni * vne);
359 result2(i) += dx * (.5 * fe * divve * une +
360 .5 * fe * divue * vne + penalty * une * vne);
361 }
362 }
363 }
364 } // namespace GradDiv
365} // namespace LocalIntegrators
366
368
369
370#endif
const unsigned int dofs_per_cell
const Tensor< 1, spacedim > & normal_vector(const unsigned int q_point) const
double shape_value_component(const unsigned int i, const unsigned int q_point, const unsigned int component) const
const unsigned int n_quadrature_points
const FiniteElement< dim, spacedim > & get_fe() const
double JxW(const unsigned int q_point) const
unsigned int n_components() const
size_type n() const
size_type m() const
#define DEAL_II_DEPRECATED
Definition config.h:294
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
#define AssertVectorVectorDimension(VEC, DIM1, DIM2)
#define AssertDimension(dim1, dim2)
std::vector< index_type > data
Definition mpi.cc:734
void nitsche_residual(Vector< double > &result, const FEValuesBase< dim > &fe, const ArrayView< const std::vector< double > > &input, const ArrayView< const std::vector< Tensor< 1, dim > > > &Dinput, const ArrayView< const std::vector< double > > &data, double penalty, double factor=1.)
Definition grad_div.h:171
void nitsche_matrix(FullMatrix< double > &M, const FEValuesBase< dim > &fe, double penalty, double factor=1.)
Definition grad_div.h:119
void cell_matrix(FullMatrix< double > &M, const FEValuesBase< dim > &fe, double factor=1.)
Definition grad_div.h:49
void ip_residual(Vector< double > &result1, Vector< double > &result2, const FEValuesBase< dim > &fe1, const FEValuesBase< dim > &fe2, const ArrayView< const std::vector< double > > &input1, const ArrayView< const std::vector< Tensor< 1, dim > > > &Dinput1, const ArrayView< const std::vector< double > > &input2, const ArrayView< const std::vector< Tensor< 1, dim > > > &Dinput2, double pen, double int_factor=1., double ext_factor=-1.)
Definition grad_div.h:298
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.)
Definition grad_div.h:218
void cell_residual(Vector< number > &result, const FEValuesBase< dim > &fetest, const ArrayView< const std::vector< Tensor< 1, dim > > > &input, const double factor=1.)
Definition grad_div.h:83
Library of integrals over cells and faces.
Definition advection.h:32