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  , SettingsSLDI()
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 ExactSolutionSLDI_PSI<2>::value(const Point<2>& r, unsigned int component) const
39 {
40  double rn = r.norm();
41  double r2 = std::pow(rn, 2.0);
42 
43  if (rn < a)
44  return delta_1 * r[0];
45 
46  if (rn > b)
47  return (-H_0 + alpha_1 / r2) * r[0];
48 
49  return (beta_1 + gamma_1 / r2) * r[0];
50 }
51 
52 template<>
53 Tensor<1, 2>
54 ExactSolutionSLDI_PSI<2>::gradient(const Point<2>& r,
55  unsigned int component) const
56 {
57  double rn = r.norm();
58  double r2 = std::pow(rn, 2.0);
59  double xx = -2.0 * r[0] * r[0] / std::pow(rn, 4.0);
60  double xy = -2.0 * r[0] * r[1] / std::pow(rn, 4.0);
61 
62  Point<2> grad_phi;
63 
64  if (rn < a) {
65  grad_phi[0] = delta_1;
66  grad_phi[1] = 0.0;
67  return grad_phi;
68  }
69 
70  if (rn > b) {
71  grad_phi[0] = -H_0 + alpha_1 / r2 + alpha_1 * xx;
72  grad_phi[1] = alpha_1 * xy;
73  return grad_phi;
74  }
75 
76  grad_phi[0] = beta_1 + gamma_1 / r2 + gamma_1 * xx;
77  grad_phi[1] = gamma_1 * xy;
78  return grad_phi;
79 }
80 
81 template<>
83  : Function<3>()
84  , SettingsSLDI()
85 {
86  double mur = mur_2;
87  double a3 = std::pow(a, 3.0);
88  double b3 = std::pow(b, 3.0);
89 
90  OMEGA = ((mur - 1.0) / (mur + 2.0)) * (a3 / b3);
91  gamma_1 =
92  (-3.0 * b3 * H_0 * OMEGA) / ((2.0 * mur + 1.0) - 2.0 * (mur - 1.0) * OMEGA);
93  beta_1 = ((2.0 * mur + 1.0) * gamma_1) / ((mur - 1.0) * a3);
94  alpha_1 = (-b3 * H_0 + 2.0 * mur * gamma_1 - mur * b3 * beta_1) / 2.0;
95  delta_1 = (mur * a3 * beta_1 - 2.0 * mur * gamma_1) / a3;
96 }
97 
98 template<>
99 double
100 ExactSolutionSLDI_PSI<3>::value(const Point<3>& r, unsigned int componet) const
101 {
102  double rn = r.norm();
103  double r3 = std::pow(rn, 3.0);
104 
105  if (rn < a)
106  return delta_1 * r[2];
107 
108  if (rn > b)
109  return (-H_0 + alpha_1 / r3) * r[2];
110 
111  return (beta_1 + gamma_1 / r3) * r[2];
112 }
113 
114 template<>
115 Tensor<1, 3>
116 ExactSolutionSLDI_PSI<3>::gradient(const Point<3>& r,
117  unsigned int component) const
118 {
119  double rn = r.norm();
120  double r3 = std::pow(rn, 3.0);
121  double zz = -3.0 * r[2] * r[2] / std::pow(rn, 5.0);
122  double xz = -3.0 * r[0] * r[2] / std::pow(rn, 5.0);
123  double yz = -3.0 * r[1] * r[2] / std::pow(rn, 5.0);
124 
125  Point<3> grad_phi;
126 
127  if (rn < a) {
128  grad_phi[0] = 0.0;
129  grad_phi[1] = 0.0;
130  grad_phi[2] = delta_1;
131  return grad_phi;
132  }
133 
134  if (rn > b) {
135  grad_phi[0] = alpha_1 * xz;
136  grad_phi[1] = alpha_1 * yz;
137  grad_phi[2] = -H_0 + alpha_1 / r3 + alpha_1 * zz;
138  return grad_phi;
139  }
140 
141  grad_phi[0] = gamma_1 * xz;
142  grad_phi[1] = gamma_1 * yz;
143  grad_phi[2] = beta_1 + gamma_1 / r3 + gamma_1 * zz;
144  return grad_phi;
145 }
146 
147 #pragma GCC diagnostic pop
Describes exact solution, , of the Magnetostatic shield - 1 (sld-i/) numerical experiment in two and ...
Global settings for the Magnetostatic shield - 1 (sld-i/) numerical experiment.
Definition: settings.hpp:33