7 #ifndef __darcy_checkerboard_solution 8 #define __darcy_checkerboard_solution 10 #include <deal.II/base/function.h> 11 #include <deal.II/base/tensor_function.h> 13 #include <amandus/darcy/checkerboard/solution_parameters.h> 20 namespace Checkerboard
24 inline std::pair<double, double>
27 double theta = std::atan2(p[1], p[0]);
30 theta += 2 * numbers::PI;
32 return std::pair<double, double>(hypot(p[0], p[1]), theta);
42 typedef typename TensorFunction<2, 2>::value_type
value_type;
46 virtual value_type value(
const Point<2>& p)
const;
58 : parameters(parameters)
70 for (
unsigned int i = 0; i < 4; ++i)
93 Tensor<2, 2> identity;
94 for (
unsigned int i = 0; i < 2; ++i)
98 unsigned int quadrant;
135 virtual double value(
const Point<2>& p,
const unsigned int component = 0)
const;
136 virtual Tensor<1, 2> gradient(
const Point<2>& p,
const unsigned int component = 0)
const;
139 double mu(
double theta)
const;
140 double dmu(
double theta)
const;
146 : solution_parameters(parameters)
157 if (0 <= theta && theta <= numbers::PI / 2.0)
160 return (std::cos((numbers::PI / 2.0 - sigma) * gamma) *
161 std::cos((theta - numbers::PI / 2.0 + rho) * gamma));
163 else if (3 * numbers::PI / 2.0 <= theta && theta < 2 * numbers::PI)
166 return (std::cos((numbers::PI / 2.0 - rho) * gamma) *
167 std::cos((theta - 3.0 * numbers::PI / 2.0 - sigma) * gamma));
169 else if (numbers::PI / 2.0 < theta && theta <= numbers::PI)
172 return std::cos(rho * gamma) * std::cos((theta - numbers::PI + sigma) * gamma);
174 else if (numbers::PI < theta && theta < 3 * numbers::PI / 2.0)
177 return std::cos(sigma * gamma) * std::cos((theta - numbers::PI - rho) * gamma);
180 Assert(
false, ExcInternalError());
191 if (0 <= theta && theta <= numbers::PI / 2.0)
194 return (-1.0) * gamma * std::cos((numbers::PI / 2.0 - sigma) * gamma) *
195 std::sin((theta - numbers::PI / 2.0 + rho) * gamma);
197 else if (3 * numbers::PI / 2.0 <= theta && theta < 2 * numbers::PI)
200 return ((-1.0) * gamma * std::cos((numbers::PI / 2.0 - rho) * gamma) *
201 std::sin((theta - 3.0 * numbers::PI / 2.0 - sigma) * gamma));
203 else if (numbers::PI / 2.0 < theta && theta <= numbers::PI)
206 return (-1.0) * gamma * std::cos(rho * gamma) * std::sin((theta - numbers::PI + sigma) * gamma);
208 else if (numbers::PI < theta && theta < 3 * numbers::PI / 2.0)
211 return (-1.0) * gamma * std::cos(sigma * gamma) * std::sin((theta - numbers::PI - rho) * gamma);
214 Assert(
false, ExcInternalError());
224 double r = polar.first;
225 double theta = polar.second;
227 return std::pow(r, gamma) *
mu(theta);
237 double r = polar.first;
238 double theta = polar.second;
241 std::pow(r, gamma - 1.0) * (gamma *
mu(theta) * std::cos(theta) -
dmu(theta) * std::sin(theta));
243 std::pow(r, gamma - 1.0) * (gamma *
mu(theta) * std::sin(theta) +
dmu(theta) * std::cos(theta));
264 virtual double value(
const Point<2>& p,
const unsigned int component)
const;
278 , scalar_solution(parameters)
279 , coefficient(parameters)
295 Tensor<1, 2>
value = -1.0 * coefficient_value * grad_u;
296 return value[component];
Definition: solution_parameters.h:283
Definition: darcy/checkerboard/solution.h:259
const ScalarSolution scalar_solution
The exact scalar solution.
Definition: darcy/checkerboard/solution.h:269
~CheckerboardTensorFunction()
Definition: darcy/checkerboard/solution.h:76
TensorFunction< 2, 2 >::value_type value_type
Definition: darcy/checkerboard/solution.h:42
Vector< double > parameters
The parameters of the exact solution.
Definition: solution_parameters.h:291
CheckerboardTensorFunction * inverse_ptr
Definition: darcy/checkerboard/solution.h:53
virtual double value(const Point< 2 > &p, const unsigned int component) const
Definition: darcy/checkerboard/solution.h:284
std::pair< double, double > polar_coords(const Point< 2 > &p)
Definition: darcy/checkerboard/solution.h:25
Definition: constrained_newton.h:15
CheckerboardTensorFunction(const std::vector< double > ¶meters)
Definition: darcy/checkerboard/solution.h:57
const CheckerboardTensorFunction coefficient
The corresponding checkerboard coefficient.
Definition: darcy/checkerboard/solution.h:273
MixedSolution(const std::vector< double > ¶meters)
Definition: darcy/checkerboard/solution.h:276
std::vector< double > parameters
Definition: darcy/checkerboard/solution.h:52
double mu(double theta) const
Definition: darcy/checkerboard/solution.h:151
virtual value_type value(const Point< 2 > &p) const
Definition: darcy/checkerboard/solution.h:91
virtual double value(const Point< 2 > &p, const unsigned int component=0) const
Definition: darcy/checkerboard/solution.h:219
double dmu(double theta) const
Definition: darcy/checkerboard/solution.h:185
SolutionParameters solution_parameters
Definition: darcy/checkerboard/solution.h:142
virtual Tensor< 1, 2 > gradient(const Point< 2 > &p, const unsigned int component=0) const
Definition: darcy/checkerboard/solution.h:231
Definition: darcy/checkerboard/solution.h:130
CheckerboardTensorFunction & inverse()
Definition: darcy/checkerboard/solution.h:85
bool is_inverse
Definition: darcy/checkerboard/solution.h:54
Definition: darcy/checkerboard/solution.h:39
ScalarSolution(const std::vector< double > ¶meters)
Definition: darcy/checkerboard/solution.h:145