Logbook  (07-04-2025)
Static problems
exact_solution.cpp
1 /******************************************************************************
2  * Copyright (C) Siarhei Uzunbajakau, 2023.
3  *
4  * This program is free software. You can use, modify, and redistribute it under
5  * the terms of the GNU Lesser General Public License as published by the Free
6  * Software Foundation, either version 3 or (at your option) any later version.
7  * This program is distributed without any warranty.
8  *
9  * Refer to COPYING.LESSER for more details.
10  ******************************************************************************/
11 
12 #include "exact_solution.hpp"
13 
14 #pragma GCC diagnostic push
15 #pragma GCC diagnostic ignored "-Wunused-parameter"
16 
17 using namespace dealii;
18 using namespace std;
19 
20 template<>
22  : Function<2>()
23  , SettingsSLDII()
24 {
25  double mur = mur_2;
26  double a2 = std::pow(a, 2.0);
27  double b2 = std::pow(b, 2.0);
28 
29  OMEGA = ((mur - 1.0) / (mur + 1.0)) * (a2 / b2);
30  gamma_1 = (-2.0 * b2 * H_0 * OMEGA) / ((mur + 1.0) - (mur - 1.0) * OMEGA);
31  beta_1 = (mur + 1.0) * gamma_1 / ((mur - 1.0) * a2);
32  alpha_1 = -b2 * H_0 + mur * gamma_1 - mur * b2 * beta_1;
33  delta_1 = (mur * a2 * beta_1 - mur * gamma_1) / a2;
34 }
35 
36 template<>
37 double
38 ExactSolutionSLDII_THETA<2>::value(const Point<2>& r,
39  unsigned int component) const
40 {
41  double rn = r.norm();
42  double r2 = std::pow(rn, 2.0);
43 
44  if (rn < a)
45  return delta_1 * r[0] + H_0 * r[0];
46 
47  if (rn > b)
48  return (-H_0 + alpha_1 / r2) * r[0] + H_0 * r[0];
49 
50  return (beta_1 + gamma_1 / r2) * r[0] + H_0 * r[0];
51 }
52 
53 template<>
54 Tensor<1, 2>
56  unsigned int component) const
57 {
58  double rn = r.norm();
59  double r2 = std::pow(rn, 2.0);
60  double xx = -2.0 * r[0] * r[0] / std::pow(rn, 4.0);
61  double xy = -2.0 * r[0] * r[1] / std::pow(rn, 4.0);
62 
63  Point<2> grad_phi;
64 
65  if (rn < a) {
66  grad_phi[0] = delta_1 + H_0;
67  grad_phi[1] = 0.0;
68  return grad_phi;
69  }
70 
71  if (rn > b) {
72  grad_phi[0] = -H_0 + alpha_1 / r2 + alpha_1 * xx + H_0;
73  grad_phi[1] = alpha_1 * xy;
74  return grad_phi;
75  }
76 
77  grad_phi[0] = beta_1 + gamma_1 / r2 + gamma_1 * xx + H_0;
78  grad_phi[1] = gamma_1 * xy;
79  return grad_phi;
80 }
81 
82 template<>
84  : Function<3>()
85  , SettingsSLDII()
86 {
87  double mur = mur_2;
88  double a3 = std::pow(a, 3.0);
89  double b3 = std::pow(b, 3.0);
90 
91  OMEGA = ((mur - 1.0) / (mur + 2.0)) * (a3 / b3);
92  gamma_1 =
93  (-3.0 * b3 * H_0 * OMEGA) / ((2.0 * mur + 1.0) - 2.0 * (mur - 1.0) * OMEGA);
94  beta_1 = ((2.0 * mur + 1.0) * gamma_1) / ((mur - 1.0) * a3);
95  alpha_1 = (-b3 * H_0 + 2.0 * mur * gamma_1 - mur * b3 * beta_1) / 2.0;
96  delta_1 = (mur * a3 * beta_1 - 2.0 * mur * gamma_1) / a3;
97 }
98 
99 template<>
100 double
101 ExactSolutionSLDII_THETA<3>::value(const Point<3>& r,
102  unsigned int componet) const
103 {
104  double rn = r.norm();
105  double r3 = std::pow(rn, 3.0);
106 
107  if (rn < a)
108  return delta_1 * r[2] + H_0 * r[2];
109 
110  if (rn > b)
111  return (-H_0 + alpha_1 / r3) * r[2] + H_0 * r[2];
112 
113  return (beta_1 + gamma_1 / r3) * r[2] + H_0 * r[2];
114 }
115 
116 template<>
117 Tensor<1, 3>
118 ExactSolutionSLDII_THETA<3>::gradient(const Point<3>& r,
119  unsigned int component) const
120 {
121  double rn = r.norm();
122  double r3 = std::pow(rn, 3.0);
123  double zz = -3.0 * r[2] * r[2] / std::pow(rn, 5.0);
124  double xz = -3.0 * r[0] * r[2] / std::pow(rn, 5.0);
125  double yz = -3.0 * r[1] * r[2] / std::pow(rn, 5.0);
126 
127  Point<3> grad_phi;
128 
129  if (rn < a) {
130  grad_phi[0] = 0.0;
131  grad_phi[1] = 0.0;
132  grad_phi[2] = delta_1 + H_0;
133  return grad_phi;
134  }
135 
136  if (rn > b) {
137  grad_phi[0] = alpha_1 * xz;
138  grad_phi[1] = alpha_1 * yz;
139  grad_phi[2] = -H_0 + alpha_1 / r3 + alpha_1 * zz + H_0;
140  return grad_phi;
141  }
142 
143  grad_phi[0] = gamma_1 * xz;
144  grad_phi[1] = gamma_1 * yz;
145  grad_phi[2] = beta_1 + gamma_1 / r3 + gamma_1 * zz + H_0;
146  return grad_phi;
147 }
148 
149 #pragma GCC diagnostic pop
Describes exact solution, , of the Magnetostatic shield - 2 (sld-ii/) numerical experiment in two and...
Global settings for the Magnetostatic shield - 2 (sld-ii/) numerical experiment.
Definition: settings.hpp:32