The evaluation engine for SphericalHarmonic.
This serves as the backend to SphericalHarmonic, SphericalHarmonic1, and SphericalHarmonic2. Typically end-users will not have to access this class directly.
See SphericalEngine.cpp for more information on the implementation.
Example of use:
#include <iostream>
#include <exception>
#include <vector>
try {
double ca[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
vector<double>
C(ca, ca + (
N + 1) * (
N + 2) / 2);
double sa[] = {6, 5, 4, 3, 2, 1};
vector<double>
S(sa, sa +
N * (
N + 1) / 2);
double x = 2,
y = 3,
z = 1,
a = 1;
v = SphericalEngine::Value<true, SphericalEngine::FULL, 1>
cout <<
v <<
" " <<
vx <<
" " <<
vy <<
" " << vz <<
"\n";
}
catch (
const exception&
e) {
cerr <<
"Caught exception: " <<
e.what() <<
"\n";
return 1;
}
}
Definition at line 40 of file SphericalEngine.hpp.
template<bool gradp, SphericalEngine::normalization norm, int L>
Create a CircularEngine object
- Template Parameters
-
gradp | should the gradient be calculated. |
norm | the normalization for the associated Legendre polynomials. |
L | the number of terms in the coefficients. |
- Parameters
-
[in] | c | an array of coeff objects. |
[in] | f | array of coefficient multipliers. f[0] should be 1. |
[in] | p | the radius of the circle = sqrt(x2 + y2). |
[in] | z | the height of the circle. |
[in] | a | the normalizing radius. |
- Exceptions
-
std::bad_alloc | if the memory for the CircularEngine can't be allocated. |
- Returns
- the CircularEngine object.
If you need to evaluate the spherical harmonic sum for several points with constant f, p = sqrt(x2 + y2), z, and a, it is more efficient to construct call SphericalEngine::Circle to give a CircularEngine object and then call CircularEngine::operator()() with arguments x/p and y/p.
Definition at line 298 of file SphericalEngine.cpp.
void GeographicLib::SphericalEngine::RootTable |
( |
int |
N | ) |
|
|
static |
Check that the static table of square roots is big enough and enlarge it if necessary.
- Parameters
-
- Exceptions
-
std::bad_alloc | if the memory for the square root table can't be allocated. |
Typically, there's no need for an end-user to call this routine, because the constructors for SphericalEngine::coeff do so. However, since this updates a static table, there's a possible race condition in a multi-threaded environment. Because this routine does nothing if the table is already large enough, one way to avoid race conditions is to call this routine at program start up (when it's still single threaded), supplying the largest degree that your program will use. E.g.,
suffices to accommodate extant magnetic and gravity models.
Definition at line 376 of file SphericalEngine.cpp.
template<bool gradp, SphericalEngine::normalization norm, int L>
Evaluate a spherical harmonic sum and its gradient.
- Template Parameters
-
gradp | should the gradient be calculated. |
norm | the normalization for the associated Legendre polynomials. |
L | the number of terms in the coefficients. |
- Parameters
-
[in] | c | an array of coeff objects. |
[in] | f | array of coefficient multipliers. f[0] should be 1. |
[in] | x | the x component of the cartesian position. |
[in] | y | the y component of the cartesian position. |
[in] | z | the z component of the cartesian position. |
[in] | a | the normalizing radius. |
[out] | gradx | the x component of the gradient. |
[out] | grady | the y component of the gradient. |
[out] | gradz | the z component of the gradient. |
- Returns
- the spherical harmonic sum.
See the SphericalHarmonic class for the definition of the sum. The coefficients used by this function are, for example, c[0].Cv + f[1] * c[1].Cv + ... + f[L−1] * c[L−1].Cv. (Note that f[0] is not used.) The upper limits on the sum are determined by c[0].nmx() and c[0].mmx(); these limits apply to all the components of the coefficients. The parameters gradp, norm, and L are template parameters, to allow more optimization to be done at compile time.
Clenshaw summation is used which permits the evaluation of the sum without the need to allocate temporary arrays. Thus this function never throws an exception.
Definition at line 153 of file SphericalEngine.cpp.