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
flow_function.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) 2007 - 2026 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_flow_function_h
14#define dealii_flow_function_h
15
16
17#include <deal.II/base/config.h>
18
21#include <deal.II/base/mutex.h>
22#include <deal.II/base/point.h>
23#include <deal.II/base/tensor.h>
24
25#include <cstddef>
26#include <vector>
27
29
30namespace Functions
31{
49 template <int dim>
50 class FlowFunction : public Function<dim>
51 {
52 public:
57
61 virtual ~FlowFunction() override = default;
62
67 void
68 pressure_adjustment(double p);
69
75 virtual void
76 vector_values(const std::vector<Point<dim>> &points,
77 std::vector<std::vector<double>> &values) const override = 0;
83 virtual void
85 const std::vector<Point<dim>> &points,
86 std::vector<std::vector<Tensor<1, dim>>> &gradients) const override = 0;
95 virtual void
96 vector_laplacians(const std::vector<Point<dim>> &points,
97 std::vector<std::vector<double>> &values) const = 0;
98
99 virtual void
100 vector_value(const Point<dim> &points,
101 Vector<double> &value) const override;
102 virtual double
103 value(const Point<dim> &points,
104 const unsigned int component) const override;
105 virtual void
106 vector_value_list(const std::vector<Point<dim>> &points,
107 std::vector<Vector<double>> &values) const override;
108 virtual void
110 const std::vector<Point<dim>> &points,
111 std::vector<std::vector<Tensor<1, dim>>> &gradients) const override;
115 virtual void
116 vector_laplacian_list(const std::vector<Point<dim>> &points,
117 std::vector<Vector<double>> &values) const override;
118
122 virtual std::size_t
123 memory_consumption() const override;
124
125 protected:
130
131 private:
136
140 mutable std::vector<std::vector<double>> aux_values;
141
145 mutable std::vector<std::vector<Tensor<1, dim>>> aux_gradients;
146 };
147
155 template <int dim>
156 class PoisseuilleFlow : public FlowFunction<dim>
157 {
158 public:
163 PoisseuilleFlow(const double r, const double Re);
164
165 virtual ~PoisseuilleFlow() override = default;
166
167 virtual void
168 vector_values(const std::vector<Point<dim>> &points,
169 std::vector<std::vector<double>> &values) const override;
170 virtual void
172 const std::vector<Point<dim>> &points,
173 std::vector<std::vector<Tensor<1, dim>>> &gradients) const override;
174 virtual void
175 vector_laplacians(const std::vector<Point<dim>> &points,
176 std::vector<std::vector<double>> &values) const override;
177
178 private:
179 const double inv_sqr_radius;
180 const double Reynolds;
181 };
182
183
196 template <int dim>
197 class StokesCosine : public FlowFunction<dim>
198 {
199 public:
204 StokesCosine(const double viscosity = 1., const double reaction = 0.);
208 void
209 set_parameters(const double viscosity, const double reaction);
210
211 virtual ~StokesCosine() override = default;
212
213 virtual void
214 vector_values(const std::vector<Point<dim>> &points,
215 std::vector<std::vector<double>> &values) const override;
216 virtual void
218 const std::vector<Point<dim>> &points,
219 std::vector<std::vector<Tensor<1, dim>>> &gradients) const override;
220 virtual void
221 vector_laplacians(const std::vector<Point<dim>> &points,
222 std::vector<std::vector<double>> &values) const override;
223
224 private:
226 double viscosity;
228 double reaction;
229 };
230
231
249 {
250 public:
253
254 virtual void
255 vector_values(const std::vector<Point<2>> &points,
256 std::vector<std::vector<double>> &values) const override;
257 virtual void
259 const std::vector<Point<2>> &points,
260 std::vector<std::vector<Tensor<1, 2>>> &gradients) const override;
261 virtual void
262 vector_laplacians(const std::vector<Point<2>> &points,
263 std::vector<std::vector<double>> &values) const override;
264
265 private:
267 double
268 Psi(double phi) const;
270 double
271 Psi_1(double phi) const;
273 double
274 Psi_2(double phi) const;
276 double
277 Psi_3(double phi) const;
279 double
280 Psi_4(double phi) const;
282 const double omega;
285 static const double lambda;
287 const double coslo;
289 const double lp;
291 const double lm;
292 };
293
301 class Kovasznay : public FlowFunction<2>
302 {
303 public:
311 Kovasznay(const double Re, bool Stokes = false);
312
313 virtual ~Kovasznay() override = default;
314
315 virtual void
316 vector_values(const std::vector<Point<2>> &points,
317 std::vector<std::vector<double>> &values) const override;
318 virtual void
320 const std::vector<Point<2>> &points,
321 std::vector<std::vector<Tensor<1, 2>>> &gradients) const override;
322 virtual void
323 vector_laplacians(const std::vector<Point<2>> &points,
324 std::vector<std::vector<double>> &values) const override;
325
327 double
328 lambda() const;
329
330 private:
331 const double Reynolds;
332 double lbda;
333 double p_average;
334 const bool stokes;
335 };
336
337} // namespace Functions
338
340
341#endif
virtual void vector_value_list(const std::vector< Point< dim > > &points, std::vector< Vector< double > > &values) const override
std::vector< std::vector< Tensor< 1, dim > > > aux_gradients
void pressure_adjustment(double p)
virtual void vector_gradient_list(const std::vector< Point< dim > > &points, std::vector< std::vector< Tensor< 1, dim > > > &gradients) const override
virtual void vector_laplacian_list(const std::vector< Point< dim > > &points, std::vector< Vector< double > > &values) const override
virtual void vector_laplacians(const std::vector< Point< dim > > &points, std::vector< std::vector< double > > &values) const =0
virtual void vector_gradients(const std::vector< Point< dim > > &points, std::vector< std::vector< Tensor< 1, dim > > > &gradients) const override=0
virtual void vector_values(const std::vector< Point< dim > > &points, std::vector< std::vector< double > > &values) const override=0
virtual std::size_t memory_consumption() const override
virtual ~FlowFunction() override=default
virtual void vector_value(const Point< dim > &points, Vector< double > &value) const override
std::vector< std::vector< double > > aux_values
virtual double value(const Point< dim > &points, const unsigned int component) const override
virtual ~Kovasznay() override=default
virtual void vector_values(const std::vector< Point< 2 > > &points, std::vector< std::vector< double > > &values) const override
virtual void vector_gradients(const std::vector< Point< 2 > > &points, std::vector< std::vector< Tensor< 1, 2 > > > &gradients) const override
virtual void vector_laplacians(const std::vector< Point< 2 > > &points, std::vector< std::vector< double > > &values) const override
double lambda() const
The value of lambda.
virtual void vector_gradients(const std::vector< Point< dim > > &points, std::vector< std::vector< Tensor< 1, dim > > > &gradients) const override
virtual void vector_values(const std::vector< Point< dim > > &points, std::vector< std::vector< double > > &values) const override
virtual void vector_laplacians(const std::vector< Point< dim > > &points, std::vector< std::vector< double > > &values) const override
virtual ~PoisseuilleFlow() override=default
double reaction
The reaction parameter.
virtual void vector_values(const std::vector< Point< dim > > &points, std::vector< std::vector< double > > &values) const override
virtual ~StokesCosine() override=default
double viscosity
The viscosity.
void set_parameters(const double viscosity, const double reaction)
virtual void vector_gradients(const std::vector< Point< dim > > &points, std::vector< std::vector< Tensor< 1, dim > > > &gradients) const override
virtual void vector_laplacians(const std::vector< Point< dim > > &points, std::vector< std::vector< double > > &values) const override
virtual void vector_gradients(const std::vector< Point< 2 > > &points, std::vector< std::vector< Tensor< 1, 2 > > > &gradients) const override
virtual void vector_values(const std::vector< Point< 2 > > &points, std::vector< std::vector< double > > &values) const override
double Psi_1(double phi) const
The derivative of Psi()
double Psi(double phi) const
The auxiliary function Psi.
const double lp
Auxiliary variable 1+lambda.
const double lm
Auxiliary variable 1-lambda.
const double omega
The angle of the reentrant corner, set to 3*pi/2.
virtual void vector_laplacians(const std::vector< Point< 2 > > &points, std::vector< std::vector< double > > &values) const override
double Psi_3(double phi) const
The 3rd derivative of Psi()
StokesLSingularity()
Constructor setting up some data.
double Psi_4(double phi) const
The 4th derivative of Psi()
double Psi_2(double phi) const
The 2nd derivative of Psi()
const double coslo
Cosine of lambda times omega.
Definition point.h:111
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39