10 #if !defined(GEOGRAPHICLIB_SPHERICALENGINE_HPP)
11 #define GEOGRAPHICLIB_SPHERICALENGINE_HPP 1
19 # pragma warning (push)
20 # pragma warning (disable: 4251)
46 static std::vector<real>& sqrttable();
53 s =
real(pow(
real(std::numeric_limits<real>::radix),
54 -3 * (std::numeric_limits<real>::max_exponent < (1<<14) ?
55 std::numeric_limits<real>::max_exponent : (1<<14))
62 return std::numeric_limits<real>::epsilon() *
63 sqrt(std::numeric_limits<real>::epsilon());
102 std::vector<real>::const_iterator _Cnm;
103 std::vector<real>::const_iterator _Snm;
108 coeff() : _Nx(-1) , _nmx(-1) , _mmx(-1) {}
125 const std::vector<real>& S,
126 int N,
int nmx,
int mmx)
133 if (!((_Nx >= _nmx && _nmx >= _mmx && _mmx >= 0) ||
135 (_nmx == -1 && _mmx == -1)))
137 if (!(index(_nmx, _mmx) <
int(C.size()) &&
138 index(_nmx, _mmx) < int(S.size()) + (_Nx + 1)))
155 const std::vector<real>& S,
165 if (!(index(_nmx, _mmx) <
int(C.size()) &&
166 index(_nmx, _mmx) < int(S.size()) + (_Nx + 1)))
173 int N()
const {
return _Nx; }
177 int nmx()
const {
return _nmx; }
181 int mmx()
const {
return _mmx; }
190 {
return m * _Nx - m * (m - 1) / 2 + n; }
216 {
return m > _mmx || n > _nmx ? 0 : *(_Cnm + k) * f; }
228 {
return m > _mmx || n > _nmx ? 0 : *(_Snm + (k - (_Nx + 1))) * f; }
239 {
return (M + 1) * (2 * N - M + 2) / 2; }
250 {
return Csize(N, M) - (N + 1); }
277 static void readcoeffs(std::istream& stream,
int& N,
int& M,
278 std::vector<real>& C, std::vector<real>& S,
279 bool truncate =
false);
311 template<
bool gradp, normalization norm,
int L>
339 template<
bool gradp, normalization norm,
int L>
361 static void RootTable(
int N);
373 std::vector<real> temp(0);
374 sqrttable().swap(temp);
380 #if defined(_MSC_VER)
381 # pragma warning (pop)
384 #endif // GEOGRAPHICLIB_SPHERICALENGINE_HPP