28#include <Kokkos_Macros.hpp>
48 , aux_gradients(dim + 1)
67 const unsigned int n_points = points.size();
73 std::scoped_lock lock(mutex);
75 for (
unsigned int d = 0; d < dim + 1; ++d)
76 aux_values[d].resize(n_points);
77 vector_values(points, aux_values);
79 for (
unsigned int k = 0; k < n_points; ++k)
83 for (
unsigned int d = 0; d < dim + 1; ++d)
84 values[k](d) = aux_values[d][k];
94 Assert(value.size() == dim + 1,
97 const unsigned int n_points = 1;
98 std::vector<Point<dim>> points(1);
103 std::scoped_lock lock(mutex);
105 for (
unsigned int d = 0; d < dim + 1; ++d)
106 aux_values[d].resize(n_points);
107 vector_values(points, aux_values);
109 for (
unsigned int d = 0; d < dim + 1; ++d)
110 value(d) = aux_values[d][0];
117 const unsigned int comp)
const
120 const unsigned int n_points = 1;
121 std::vector<Point<dim>> points(1);
126 std::scoped_lock lock(mutex);
128 for (
unsigned int d = 0; d < dim + 1; ++d)
129 aux_values[d].resize(n_points);
130 vector_values(points, aux_values);
132 return aux_values[comp][0];
142 const unsigned int n_points = points.size();
143 Assert(values.size() == n_points,
148 std::scoped_lock lock(mutex);
150 for (
unsigned int d = 0; d < dim + 1; ++d)
151 aux_gradients[d].resize(n_points);
152 vector_gradients(points, aux_gradients);
154 for (
unsigned int k = 0; k < n_points; ++k)
158 for (
unsigned int d = 0; d < dim + 1; ++d)
159 values[k][d] = aux_gradients[d][k];
170 const unsigned int n_points = points.size();
171 Assert(values.size() == n_points,
176 std::scoped_lock lock(mutex);
178 for (
unsigned int d = 0; d < dim + 1; ++d)
179 aux_values[d].resize(n_points);
180 vector_laplacians(points, aux_values);
182 for (
unsigned int k = 0; k < n_points; ++k)
186 for (
unsigned int d = 0; d < dim + 1; ++d)
187 values[k](d) = aux_values[d][k];
205 : inv_sqr_radius(1 / r / r)
217 std::vector<std::vector<double>> &values)
const
219 const unsigned int n = points.size();
221 Assert(values.size() == dim + 1,
223 for (
unsigned int d = 0; d < dim + 1; ++d)
226 for (
unsigned int k = 0; k < n; ++k)
232 for (
unsigned int d = 1; d < dim; ++d)
234 r2 *= inv_sqr_radius;
237 values[0][k] = 1. - r2;
239 for (
unsigned int d = 1; d < dim; ++d)
242 values[dim][k] = -2 * (dim - 1) * inv_sqr_radius * p[0] / Reynolds +
255 const unsigned int n = points.size();
257 Assert(values.size() == dim + 1,
259 for (
unsigned int d = 0; d < dim + 1; ++d)
262 for (
unsigned int k = 0; k < n; ++k)
266 values[0][k][0] = 0.;
267 for (
unsigned int d = 1; d < dim; ++d)
268 values[0][k][d] = -2. * p[d] * inv_sqr_radius;
270 for (
unsigned int d = 1; d < dim; ++d)
273 values[dim][k][0] = -2 * (dim - 1) * inv_sqr_radius / Reynolds;
274 for (
unsigned int d = 1; d < dim; ++d)
275 values[dim][k][d] = 0.;
285 std::vector<std::vector<double>> &values)
const
287 const unsigned int n = points.size();
289 Assert(values.size() == dim + 1,
291 for (
unsigned int d = 0; d < dim + 1; ++d)
294 for (
auto &point_values : values)
295 std::fill(point_values.begin(), point_values.end(), 0.);
321 std::vector<std::vector<double>> &values)
const
323 unsigned int n = points.size();
325 Assert(values.size() == dim + 1,
327 for (
unsigned int d = 0; d < dim + 1; ++d)
330 for (
unsigned int k = 0; k < n; ++k)
342 values[0][k] = cx * cx * cy * sy;
343 values[1][k] = -cx * sx * cy * cy;
344 values[2][k] = cx * sx * cy * sy + this->mean_pressure;
352 values[0][k] = cx * cx * cy * sy * cz * sz;
353 values[1][k] = cx * sx * cy * cy * cz * sz;
354 values[2][k] = -2. * cx * sx * cy * sy * cz * cz;
355 values[3][k] = cx * sx * cy * sy * cz * sz + this->mean_pressure;
372 unsigned int n = points.size();
374 Assert(values.size() == dim + 1,
376 for (
unsigned int d = 0; d < dim + 1; ++d)
379 for (
unsigned int k = 0; k < n; ++k)
388 const double cx2 = .5 + .5 * c2x;
389 const double cy2 = .5 + .5 * c2y;
405 const double cz2 = .5 + .5 * c2z;
407 values[0][k][0] = -.125 *
numbers::PI * s2x * s2y * s2z;
408 values[0][k][1] = .25 *
numbers::PI * cx2 * c2y * s2z;
409 values[0][k][2] = .25 *
numbers::PI * cx2 * s2y * c2z;
411 values[1][k][0] = .25 *
numbers::PI * c2x * cy2 * s2z;
412 values[1][k][1] = -.125 *
numbers::PI * s2x * s2y * s2z;
413 values[1][k][2] = .25 *
numbers::PI * s2x * cy2 * c2z;
415 values[2][k][0] = -.5 *
numbers::PI * c2x * s2y * cz2;
416 values[2][k][1] = -.5 *
numbers::PI * s2x * c2y * cz2;
417 values[2][k][2] = .25 *
numbers::PI * s2x * s2y * s2z;
419 values[3][k][0] = .125 *
numbers::PI * c2x * s2y * s2z;
420 values[3][k][1] = .125 *
numbers::PI * s2x * c2y * s2z;
421 values[3][k][2] = .125 *
numbers::PI * s2x * s2y * c2z;
436 std::vector<std::vector<double>> &values)
const
438 unsigned int n = points.size();
440 Assert(values.size() == dim + 1,
442 for (
unsigned int d = 0; d < dim + 1; ++d)
447 vector_values(points, values);
448 for (
unsigned int d = 0; d < dim; ++d)
449 for (
double &point_value : values[d])
450 point_value *= -reaction;
454 for (
unsigned int d = 0; d < dim; ++d)
455 std::fill(values[d].
begin(), values[d].end(), 0.);
459 for (
unsigned int k = 0; k < n; ++k)
472 values[0][k] += -viscosity * pi2 * (1. + 2. * c2x) * s2y -
474 values[1][k] += viscosity * pi2 * s2x * (1. + 2. * c2y) -
485 -.5 * viscosity * pi2 * (1. + 2. * c2x) * s2y * s2z -
487 values[1][k] += .5 * viscosity * pi2 * s2x * (1. + 2. * c2y) * s2z -
490 -.5 * viscosity * pi2 * s2x * s2y * (1. + 2. * c2z) -
508 , coslo(
std::cos(lambda * omega))
560 const std::vector<
Point<2>> &points,
561 std::vector<std::vector<double>> &values)
const
563 unsigned int n = points.size();
566 for (
unsigned int d = 0; d < 2 + 1; ++d)
569 for (
unsigned int k = 0; k < n; ++k)
572 const double x = p[0];
573 const double y = p[1];
575 if ((x < 0) || (y < 0))
577 const double phi = std::atan2(y, -x) +
numbers::PI;
578 const double r2 = x * x + y * y;
590 for (
unsigned int d = 0; d < 3; ++d)
600 const std::vector<
Point<2>> &points,
603 unsigned int n = points.size();
606 for (
unsigned int d = 0; d < 2 + 1; ++d)
609 for (
unsigned int k = 0; k < n; ++k)
612 const double x = p[0];
613 const double y = p[1];
615 if ((x < 0) || (y < 0))
617 const double phi = std::atan2(y, -x) +
numbers::PI;
618 const double r2 = x * x + y * y;
623 const double psi =
Psi(phi);
624 const double psi1 =
Psi_1(phi);
625 const double psi2 =
Psi_2(phi);
630 const double udr =
lambda * rl1 * (
lp * sinp * psi + cosp * psi1);
631 const double udp = rl * (
lp * cosp * psi +
lp * sinp * psi1 -
632 sinp * psi1 + cosp * psi2);
634 const double vdr =
lambda * rl1 * (
lp * cosp * psi - sinp * psi1);
635 const double vdp = rl * (
lp * (cosp * psi1 - sinp * psi) -
636 cosp * psi1 - sinp * psi2);
640 const double pdp = -rl1 * (
lp *
lp * psi2 +
Psi_4(phi)) /
lm;
641 values[0][k][0] = cosp * udr - sinp / r * udp;
642 values[0][k][1] = -sinp * udr - cosp / r * udp;
643 values[1][k][0] = cosp * vdr - sinp / r * vdp;
644 values[1][k][1] = -sinp * vdr - cosp / r * vdp;
645 values[2][k][0] = cosp * pdr - sinp / r * pdp;
646 values[2][k][1] = -sinp * pdr - cosp / r * pdp;
650 for (
unsigned int d = 0; d < 3; ++d)
660 const std::vector<
Point<2>> &points,
661 std::vector<std::vector<double>> &values)
const
663 unsigned int n = points.size();
666 for (
unsigned int d = 0; d < 2 + 1; ++d)
669 for (
auto &point_values : values)
670 std::fill(point_values.begin(), point_values.end(), 0.);
682 long double l = -b / (r2 +
std::sqrt(r2 * r2 + b));
694 std::vector<std::vector<double>> &values)
const
696 unsigned int n = points.size();
699 for (
unsigned int d = 0; d < 2 + 1; ++d)
702 for (
unsigned int k = 0; k < n; ++k)
705 const double x = p[0];
709 values[0][k] = 1. - elx *
std::cos(y);
718 const std::vector<
Point<2>> &points,
719 std::vector<std::vector<
Tensor<1, 2>>> &gradients)
const
721 unsigned int n = points.size();
727 for (
unsigned int i = 0; i < n; ++i)
729 const double x = points[i][0];
730 const double y = points[i][1];
737 gradients[0][i][0] = -
lbda * elx * cy;
740 gradients[1][i][1] =
lbda * elx * cy;
742 gradients[2][i][0] = -
lbda * elx * elx;
743 gradients[2][i][1] = 0.;
751 std::vector<std::vector<double>> &values)
const
753 unsigned int n = points.size();
755 for (
unsigned int d = 0; d < 2 + 1; ++d)
761 for (
unsigned int k = 0; k < n; ++k)
764 const double x = p[0];
765 const double y = zp * p[1];
767 const double u = 1. - elx *
std::cos(y);
769 const double uy = elx * zp *
std::sin(y);
774 values[0][k] = u * ux + v * uy;
775 values[1][k] = u * vx + v * vy;
781 for (
auto &point_values : values)
782 std::fill(point_values.begin(), point_values.end(), 0.);
virtual void vector_value_list(const std::vector< Point< dim > > &points, std::vector< Vector< double > > &values) const override
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 std::size_t memory_consumption() const override
virtual void vector_value(const Point< dim > &points, Vector< double > &value) const override
virtual double value(const Point< dim > &points, const unsigned int component) const override
Kovasznay(const double Re, bool Stokes=false)
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.
PoisseuilleFlow(const double r, const double Re)
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 void vector_values(const std::vector< Point< dim > > &points, std::vector< std::vector< double > > &values) const override
StokesCosine(const double viscosity=1., const double reaction=0.)
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
static const double lambda
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.
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.
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NOT_IMPLEMENTED()
#define Assert(cond, exc)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
::VectorizedArray< Number, width > exp(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > cos(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sin(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > pow(const ::VectorizedArray< Number, width > &, const Number p)