1 #pragma once
2 /**
3  * \file NETGeographicLib/SphericalCoefficients.h
4  * \brief Header for NETGeographicLib::SphericalCoefficients class
5  *
6  * NETGeographicLib is copyright (c) Scott Heiman (2013)
7  * GeographicLib is Copyright (c) Charles Karney (2010-2012)
8  * <charles@karney.com> and licensed under the MIT/X11 License.
9  * For more information, see
10  * https://geographiclib.sourceforge.io/
11  **********************************************************************/
12 
13 namespace NETGeographicLib
14 {
15     /*!
16     \brief .NET wrapper for GeographicLib::SphericalEngine::coeff.
17 
18     This class allows .NET applications to access GeographicLib::SphericalEngine::coeff.
19 
20     The SphericalHarmonic classes provide accessor functions that allow
21     you to examine the coefficients.  These accessor functions export a
22     GeographicLib::SphericalEngine::coeff object.  The GeographicLib::SphericalEngine
23     class is not implemented in NETGeographicLib.  SphericalCoefficients is provided as
24     a substitute for GeographicLib::SphericalEngine::coeff allowing you to examine the
25     coefficients in .NET applications.
26 
27     Use SphericalHarmonic::Coefficients, SphericalHarmonic1::Coefficient*,
28     or SphericalHarmonic2::Coefficient* to obtain an instance of this
29     class.
30 
31     <B>INTERFACE DIFFERENCES:</B><BR>
32     This class does not implement readcoeffs.
33     */
34     public ref class SphericalCoefficients
35     {
36         private:
37         // The cosine coefficients.
38         array<double>^ m_C; // size = Csize(m_nmx,m_mmx)
39         // The sine coefficients
40         array<double>^ m_S; // size = Ssize(m_nmx,m_mmx)
41         // The dimension of the coefficients
42         int m_N;
43         int m_nmx;
44         int m_mmx;
45     public:
46         /*!
47         \brief Constructor.
48         \param[in] c A reference to a GeographicLib::SphericalEngine::coeff object.
49         This constructor is for internal use only.  Developers should
50         not create an instance of SphericalCoefficients.  Use
51         SphericalHarmonic::Coefficients, SphericalHarmonic1::Coefficient*,
52         or SphericalHarmonic2::Coefficient* to obtain an instance of this
53         class.
54         */
55         SphericalCoefficients( const GeographicLib::SphericalEngine::coeff& c );
56 
57         /**
58         * @return \e N the degree giving storage layout for \e C and \e S.
59         **********************************************************************/
get()60         property int N { int get() { return m_N; } }
61         /**
62         * @return \e nmx the maximum degree to be used.
63         **********************************************************************/
get()64         property int nmx { int get() { return m_nmx; } }
65         /**
66         * @return \e mmx the maximum order to be used.
67         **********************************************************************/
get()68         property int mmx { int get() { return m_mmx; } }
69         /**
70         * The one-dimensional index into \e C and \e S.
71         *
72         * @param[in] n the degree.
73         * @param[in] m the order.
74         * @return the one-dimensional index.
75         **********************************************************************/
index(int n,int m)76         int index(int n, int m)
77         { return m * m_N - m * (m - 1) / 2 + n; }
78         /**
79         * An element of \e C.
80         *
81         * @param[in] k the one-dimensional index.
82         * @return the value of the \e C coefficient.
83         **********************************************************************/
Cv(int k)84         double Cv(int k) { return m_C[k]; }
85         /**
86         * An element of \e S.
87         *
88         * @param[in] k the one-dimensional index.
89         * @return the value of the \e S coefficient.
90         **********************************************************************/
Sv(int k)91         double Sv(int k) { return m_S[k - (m_N + 1)]; }
92         /**
93         * An element of \e C with checking.
94         *
95         * @param[in] k the one-dimensional index.
96         * @param[in] n the requested degree.
97         * @param[in] m the requested order.
98         * @param[in] f a multiplier.
99         * @return the value of the \e C coefficient multiplied by \e f in \e n
100         *   and \e m are in range else 0.
101         **********************************************************************/
Cv(int k,int n,int m,double f)102         double Cv(int k, int n, int m, double f)
103         { return m > m_mmx || n > m_nmx ? 0 : m_C[k] * f; }
104         /**
105         * An element of \e S with checking.
106         *
107         * @param[in] k the one-dimensional index.
108         * @param[in] n the requested degree.
109         * @param[in] m the requested order.
110         * @param[in] f a multiplier.
111         * @return the value of the \e S coefficient multiplied by \e f in \e n
112         *   and \e m are in range else 0.
113         **********************************************************************/
Sv(int k,int n,int m,double f)114         double Sv(int k, int n, int m, double f)
115         { return m > m_mmx || n > m_nmx ? 0 : m_S[k - (m_N + 1)] * f; }
116 
117         /**
118         * The size of the coefficient vector for the cosine terms.
119         *
120         * @param[in] N the maximum degree.
121         * @param[in] M the maximum order.
122         * @return the size of the vector of cosine terms as stored in column
123         *   major order.
124         **********************************************************************/
Csize(int N,int M)125         static int Csize(int N, int M)
126         { return (M + 1) * (2 * N - M + 2) / 2; }
127 
128         /**
129         * The size of the coefficient vector for the sine terms.
130         *
131         * @param[in] N the maximum degree.
132         * @param[in] M the maximum order.
133         * @return the size of the vector of cosine terms as stored in column
134         *   major order.
135         **********************************************************************/
Ssize(int N,int M)136         static int Ssize(int N, int M)
137         { return Csize(N, M) - (N + 1); }
138 
139     };
140 } // namespace NETGeographicLib
141