Amandus: Simulations based on multilevel Schwarz methods
samples.h
Go to the documentation of this file.
1 #include <deal.II/base/function.h>
2 
3 using namespace dealii;
4 
5 namespace CahnHilliard
6 {
7 
8 template <int dim>
9 class Startup : public Function<dim>
10 {
11 public:
12  Startup();
13  virtual void value_list(const std::vector<Point<dim>>& points, std::vector<double>& values,
14  const unsigned int component = 0) const;
15  virtual void vector_value_list(const std::vector<Point<dim>>& points,
16  std::vector<Vector<double>>& values) const;
17 };
18 
19 template <int dim>
21  : Function<dim>(2)
22 {
23 }
24 
25 template <int dim>
26 void
27 Startup<dim>::vector_value_list(const std::vector<Point<dim>>& points,
28  std::vector<Vector<double>>& values) const
29 {
30  AssertDimension(points.size(), values.size());
31 
32  const double eps_square = -1e-2;
33 
34  for (unsigned int k = 0; k < points.size(); ++k)
35  {
36  const Point<dim>& p = points[k];
37  values[k](1) = std::sin(p(0)) * std::sin(p(1));
38  values[k](0) =
39  (values[k](1) * values[k](1) - 1) * values[k](1) + eps_square * 2.0 * values[k](1);
40  }
41 }
42 
43 template <int dim>
44 void
45 Startup<dim>::value_list(const std::vector<Point<dim>>& points, std::vector<double>& values,
46  const unsigned int component) const
47 {
48  AssertDimension(points.size(), values.size());
49 
50  const double eps_square = -1e-2;
51 
52  for (unsigned int k = 0; k < points.size(); ++k)
53  {
54  const Point<dim>& p = points[k];
55  double v = std::sin(p(0)) * std::sin(p(1));
56  double l = (v * v - 1) * v + eps_square * 2.0 * v;
57  if (component == 0)
58  {
59  values[k] = l;
60  }
61  else
62  {
63  values[k] = v;
64  }
65  }
66 }
67 
68 class BallFunction : public Function<2>
69 {
70 public:
72  : Function<2>(2)
73  {
74  }
75 
76  virtual double
77  value(const Point<2>& p, const unsigned int component = 0) const
78  {
79  if (component == 1)
80  {
81  return p.norm() < 0.2 ? 1.0 : -1.0;
82  }
83  else
84  {
85  return 0.0;
86  }
87  }
88 };
89 
90 template <int dim>
91 class CrossFunction : public dealii::Function<dim>
92 {
93 public:
94  CrossFunction();
95  virtual void value_list(const std::vector<Point<dim>>& points, std::vector<double>& values,
96  const unsigned int component = 0) const;
97  virtual void vector_value_list(const std::vector<Point<dim>>& points,
98  std::vector<Vector<double>>& values) const;
99 };
100 
101 template <int dim>
103  : Function<dim>(2)
104 {
105 }
106 
107 template <int dim>
108 void
109 CrossFunction<dim>::vector_value_list(const std::vector<Point<dim>>& points,
110  std::vector<Vector<double>>& values) const
111 {
112  AssertDimension(points.size(), values.size());
113 
114  for (unsigned int k = 0; k < points.size(); ++k)
115  {
116  const Point<dim>& p = points[k];
117  if (std::fabs(p(0)) < .8 && std::fabs(p(1)) < .2)
118  values[k](1) = 1.;
119  else if (std::fabs(p(1)) < .8 && std::fabs(p(0)) < .2)
120  values[k](1) = 1.;
121  else
122  values[k](1) = -1.;
123  }
124 }
125 
126 template <int dim>
127 void
128 CrossFunction<dim>::value_list(const std::vector<Point<dim>>& points, std::vector<double>& values,
129  const unsigned int component) const
130 {
131  AssertDimension(points.size(), values.size());
132 
133  for (unsigned int k = 0; k < points.size(); ++k)
134  {
135  if (component == 1)
136  {
137  const Point<dim>& p = points[k];
138  if (std::fabs(p(0)) < .8 && std::fabs(p(1)) < .2)
139  values[k] = 1.;
140  else if (std::fabs(p(1)) < .8 && std::fabs(p(0)) < .2)
141  values[k] = 1.;
142  else
143  values[k] = -1.;
144  }
145  else
146  {
147  values[k] = 0.0;
148  }
149  }
150 }
151 
152 class TopologicalFunction : public Function<2>
153 {
154 public:
156  : Function<2>(2)
157  {
158  }
159 
160  virtual double
161  value(const Point<2>& p, const unsigned int component = 0) const
162  {
163  if (component == 1)
164  {
165  if (p.norm() < (1.0 / 8.0) || p(1) < p(0) * p(0) + (1.0 / 8.0) - 1.0)
166  {
167  return 1.0;
168  }
169  }
170  return 0.0;
171  }
172 };
173 
174 class TopologicalFunction2 : public Function<2>
175 {
176 public:
178  : Function<2>(2)
179  {
180  }
181 
182  virtual double
183  value(const Point<2>& p, const unsigned int component = 0) const
184  {
185  if (component == 1)
186  {
187  if (p.norm() < (1.0 / 8.0) || p(1) < p(0) * p(0) + (1.0 / 8.0) - 1.0)
188  {
189  return 1.0;
190  }
191  return -1.0;
192  }
193  return 0.0;
194  }
195 };
196 
197 class SquareFunction : public Function<2>
198 {
199 public:
201  : Function<2>(2)
202  {
203  }
204 
205  virtual double
206  value(const Point<2>& p, const unsigned int component = 0) const
207  {
208  if (component == 1)
209  {
210  if (std::abs(p(0)) <= 0.15 && std::abs(p(1)) <= 0.15)
211  {
212  return 1.0;
213  }
214  else
215  {
216  return -1.0;
217  }
218  }
219  return 0.0;
220  }
221 };
222 
223 class Breakup : public Function<2>
224 {
225 public:
227  : Function<2>(2)
228  {
229  }
230 
231  virtual double
232  value(const Point<2>& p, const unsigned int component = 0) const
233  {
234  if (component == 1)
235  {
236  if (std::abs(p(1)) <= 0.3 && std::abs(p(0)) <= p(1) * p(1) + 0.025)
237  {
238  return 1.0;
239  }
240  else
241  {
242  return -1.0;
243  }
244  }
245  return 0.0;
246  }
247 };
248 
249 class DoubleBall : public Function<2>
250 {
251 public:
253  : Function<2>(2)
254  {
255  }
256 
257  virtual double
258  value(const Point<2>& p, const unsigned int component = 0) const
259  {
260  if (component == 1)
261  {
262  double r = 0.175;
263  double overlap = 0.0025;
264  Point<2> center1(0.0, r - overlap);
265  Point<2> center2(0.0, overlap - r);
266  if ((p - center1).norm() <= r || (p - center2).norm() <= r)
267  {
268  return 1.0;
269  }
270  else
271  {
272  return -1.0;
273  }
274  }
275  return 0.0;
276  }
277 };
278 
279 class Strip : public Function<2>
280 {
281 public:
283  : Function<2>(2)
284  {
285  }
286 
287  virtual double
288  value(const Point<2>& p, const unsigned int component = 0) const
289  {
290  if (component == 1)
291  {
292  if (std::abs(p(1)) < 0.5 && (std::abs(p(0)) < 0.05 || ((p(0) > 0 && p(0) < -2.0 * p(1)) ||
293  (p(0) < 0 && p(0) > -2.0 * p(1)))))
294  {
295  return 1.0;
296  }
297  else
298  {
299  return -1.0;
300  }
301  }
302  return 0.0;
303  }
304 };
305 
306 template <int dim>
307 Function<dim>*
308 selector(int i)
309 {
310  switch (i)
311  {
312  case 0:
313  return new Startup<dim>;
314  case 1:
315  return new BallFunction;
316  case 2:
317  return new CrossFunction<dim>;
318  case 3:
319  return new TopologicalFunction;
320  case 4:
321  return new TopologicalFunction2;
322  case 5:
323  return new Functions::ZeroFunction<dim>(2);
324  case 6:
325  return new SquareFunction;
326  case 7:
327  return new Breakup;
328  case 8:
329  return new DoubleBall;
330  case 9:
331  return new Strip;
332  }
333  return 0;
334 }
335 
336 template <int dim>
337 class ShearAdvection : public Function<dim>
338 {
339 public:
340  ShearAdvection(double strength)
341  : Function<dim>(dim)
342  , strength(strength)
343  {
344  }
345 
346  virtual double
347  value(const Point<dim>& p, const unsigned int component = 0) const
348  {
349  if (component == 0)
350  {
351  return -1.0 * this->strength * p(1);
352  }
353  else
354  {
355  return 0.0;
356  }
357  }
358 
359 private:
360  const double strength;
361 };
362 
363 template <int dim>
364 Function<dim>*
365 advectionselector(int i, double strength = 0.0)
366 {
367  switch (i)
368  {
369  case 0:
370  return new ShearAdvection<dim>(strength);
371  }
372  return 0;
373 }
374 }
DoubleBall()
Definition: samples.h:252
Definition: samples.h:249
Definition: samples.h:174
Function< dim > * selector(int i)
Definition: samples.h:308
virtual void vector_value_list(const std::vector< Point< dim >> &points, std::vector< Vector< double >> &values) const
Definition: samples.h:109
Definition: samples.h:91
virtual double value(const Point< 2 > &p, const unsigned int component=0) const
Definition: samples.h:288
virtual double value(const Point< dim > &p, const unsigned int component=0) const
Definition: samples.h:347
Definition: samples.h:152
SquareFunction()
Definition: samples.h:200
virtual double value(const Point< 2 > &p, const unsigned int component=0) const
Definition: samples.h:232
Definition: samples.h:337
Definition: samples.h:197
virtual void vector_value_list(const std::vector< Point< dim >> &points, std::vector< Vector< double >> &values) const
Definition: samples.h:27
Definition: samples.h:279
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const
Definition: samples.h:128
virtual void value_list(const std::vector< Point< dim >> &points, std::vector< double > &values, const unsigned int component=0) const
Definition: samples.h:45
const double strength
Definition: samples.h:360
TopologicalFunction2()
Definition: samples.h:177
BallFunction()
Definition: samples.h:71
ShearAdvection(double strength)
Definition: samples.h:340
virtual double value(const Point< 2 > &p, const unsigned int component=0) const
Definition: samples.h:161
Strip()
Definition: samples.h:282
virtual double value(const Point< 2 > &p, const unsigned int component=0) const
Definition: samples.h:258
Definition: samples.h:68
TopologicalFunction()
Definition: samples.h:155
virtual double value(const Point< 2 > &p, const unsigned int component=0) const
Definition: samples.h:206
Function< dim > * advectionselector(int i, double strength=0.0)
Definition: samples.h:365
Definition: samples.h:223
virtual double value(const Point< 2 > &p, const unsigned int component=0) const
Definition: samples.h:183
Breakup()
Definition: samples.h:226
virtual double value(const Point< 2 > &p, const unsigned int component=0) const
Definition: samples.h:77
CrossFunction()
Definition: samples.h:102
Definition: massout.h:16
Startup()
Definition: allen_cahn.cc:47
Definition: samples.h:9