Reference documentation for deal.II version 9.1.0-pre
geometric_utilities.cc
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2016 - 2018 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 
17 #include <deal.II/base/exceptions.h>
18 #include <deal.II/base/geometric_utilities.h>
19 
20 
21 DEAL_II_NAMESPACE_OPEN
22 
23 
24 namespace GeometricUtilities
25 {
26  namespace Coordinates
27  {
29  double,
30  << "The radius <" << arg1 << "> can not be negative.");
31 
33  double,
34  << "The azimuth angle <" << arg1 << "> is not in [0,2Pi).");
35 
37  double,
38  << "The polar angle <" << arg1 << "> is not in [0,Pi].");
39 
40 
41  template <int dim>
42  std::array<double, dim>
43  to_spherical(const Point<dim> &position)
44  {
45  std::array<double, dim> scoord;
46 
47  // radius
48  scoord[0] = position.norm();
49  // azimuth angle \theta:
50  scoord[1] = std::atan2(position(1), position(0));
51  // correct to [0,2*pi)
52  if (scoord[1] < 0.0)
53  scoord[1] += 2.0 * numbers::PI;
54 
55  // polar angle \phi:
56  if (dim == 3)
57  {
58  // acos returns the angle in the range [0,\pi]
59  if (scoord[0] > std::numeric_limits<double>::min())
60  scoord[2] = std::acos(position(2) / scoord[0]);
61  else
62  scoord[2] = 0.0;
63  }
64  return scoord;
65  }
66 
67  template <std::size_t dim>
69  from_spherical(const std::array<double, dim> &scoord)
70  {
71  Point<dim> ccoord;
72 
73  Assert(scoord[0] >= 0., NegativeRadius(scoord[0]));
74 
75  Assert(scoord[1] >= 0. && scoord[1] < 2. * numbers::PI,
76  SphericalAzimuth(scoord[1]));
77 
78  switch (dim)
79  {
80  case 2:
81  {
82  ccoord[0] = scoord[0] * std::cos(scoord[1]);
83  ccoord[1] = scoord[0] * std::sin(scoord[1]);
84  break;
85  }
86  case 3:
87  {
88  Assert(scoord[2] >= 0. && scoord[2] <= numbers::PI,
89  SphericalPolar(scoord[2]));
90 
91  ccoord[0] = scoord[0] * std::sin(scoord[2]) * std::cos(scoord[1]);
92  ccoord[1] = scoord[0] * std::sin(scoord[2]) * std::sin(scoord[1]);
93  ccoord[2] = scoord[0] * std::cos(scoord[2]);
94  break;
95  }
96  default:
97  Assert(false, ExcNotImplemented());
98  break;
99  }
100 
101  return ccoord;
102  }
103 
104  // explicit instantiations
105 #include "geometric_utilities.inst"
106 
107  } // namespace Coordinates
108 } // namespace GeometricUtilities
109 
110 DEAL_II_NAMESPACE_CLOSE
numbers::NumberTraits< Number >::real_type norm() const
Definition: tensor.h:1301
static const double PI
Definition: numbers.h:143
static::ExceptionBase & SphericalPolar(double arg1)
#define DeclException1(Exception1, type1, outsequence)
Definition: exceptions.h:408
std::array< double, dim > to_spherical(const Point< dim > &point)
#define Assert(cond, exc)
Definition: exceptions.h:1227
static::ExceptionBase & SphericalAzimuth(double arg1)
static::ExceptionBase & NegativeRadius(double arg1)
static::ExceptionBase & ExcNotImplemented()
Point< dim > from_spherical(const std::array< double, dim > &scoord)