1 /**
2  * \file NETGeographicLib/NormalGravity.cpp
3  * \brief Implementation for NETGeographicLib::NormalGravity class
4  *
5  * NETGeographicLib is copyright (c) Scott Heiman (2013)
6  * GeographicLib is Copyright (c) Charles Karney (2010-2012)
7  * <charles@karney.com> and licensed under the MIT/X11 License.
8  * For more information, see
9  * https://geographiclib.sourceforge.io/
10  **********************************************************************/
11 #include "stdafx.h"
12 #include "GeographicLib/NormalGravity.hpp"
13 #include "NormalGravity.h"
14 #include "Geocentric.h"
15 #include "NETGeographicLib.h"
16 
17 using namespace NETGeographicLib;
18 
19 const char BADALLOC[] = "Failed to allocate memory for a GeographicLib::NormalGravity";
20 
21 //*****************************************************************************
22 NormalGravity::!NormalGravity(void)
23 {
24     if ( m_pNormalGravity != NULL )
25     {
26         delete m_pNormalGravity;
27         m_pNormalGravity = NULL;
28     }
29 }
30 
31 //*****************************************************************************
NormalGravity(double a,double GM,double omega,double f_J2,bool geometricp)32 NormalGravity::NormalGravity(double a, double GM, double omega, double f_J2, bool geometricp)
33 {
34     try
35     {
36       m_pNormalGravity = new GeographicLib::NormalGravity( a, GM, omega, f_J2, geometricp );
37     }
38     catch ( std::bad_alloc )
39     {
40         throw gcnew GeographicErr( BADALLOC );
41     }
42     catch ( const std::exception& err )
43     {
44         throw gcnew GeographicErr( err.what() );
45     }
46 }
47 
48 //*****************************************************************************
NormalGravity(StandardModels model)49 NormalGravity::NormalGravity(StandardModels model)
50 {
51     try
52     {
53         m_pNormalGravity = model == StandardModels::WGS84 ?
54             new GeographicLib::NormalGravity( GeographicLib::NormalGravity::WGS84() ) :
55             new GeographicLib::NormalGravity( GeographicLib::NormalGravity::GRS80() );
56     }
57     catch ( std::bad_alloc )
58     {
59         throw gcnew GeographicErr( BADALLOC );
60     }
61 }
62 
63 //*****************************************************************************
NormalGravity(const GeographicLib::NormalGravity & g)64 NormalGravity::NormalGravity( const GeographicLib::NormalGravity& g)
65 {
66     try
67     {
68         m_pNormalGravity = new GeographicLib::NormalGravity( g );
69     }
70     catch ( std::bad_alloc )
71     {
72         throw gcnew GeographicErr( BADALLOC );
73     }
74 }
75 
76 //*****************************************************************************
SurfaceGravity(double lat)77 double NormalGravity::SurfaceGravity(double lat)
78 {
79     return m_pNormalGravity->SurfaceGravity( lat );
80 }
81 
82 //*****************************************************************************
83 double NormalGravity::Gravity(double lat, double h,
84     [System::Runtime::InteropServices::Out] double% gammay,
85     [System::Runtime::InteropServices::Out] double% gammaz)
86 {
87     double ly, lz;
88     double out = m_pNormalGravity->Gravity( lat, h, ly, lz );
89     gammay = ly;
90     gammaz = lz;
91     return out;
92 }
93 
94 //*****************************************************************************
95 double NormalGravity::U(double X, double Y, double Z,
96                 [System::Runtime::InteropServices::Out] double% gammaX,
97                 [System::Runtime::InteropServices::Out] double% gammaY,
98                 [System::Runtime::InteropServices::Out] double% gammaZ)
99 {
100     double lx, ly, lz;
101     double out = m_pNormalGravity->U( X, Y, Z, lx, ly, lz );
102     gammaX = lx;
103     gammaY = ly;
104     gammaZ = lz;
105     return out;
106 }
107 
108 //*****************************************************************************
109 double NormalGravity::V0(double X, double Y, double Z,
110                 [System::Runtime::InteropServices::Out] double% GammaX,
111                 [System::Runtime::InteropServices::Out] double% GammaY,
112                 [System::Runtime::InteropServices::Out] double% GammaZ)
113 {
114     double lx, ly, lz;
115     double out = m_pNormalGravity->V0( X, Y, Z, lx, ly, lz );
116     GammaX = lx;
117     GammaY = ly;
118     GammaZ = lz;
119     return out;
120 }
121 
122 //*****************************************************************************
123 double NormalGravity::Phi(double X, double Y,
124     [System::Runtime::InteropServices::Out] double% fX,
125     [System::Runtime::InteropServices::Out] double% fY)
126 {
127     double lx, ly;
128     double out = m_pNormalGravity->Phi( X, Y, lx, ly );
129     fX = lx;
130     fY = ly;
131     return out;
132 }
133 
134 //*****************************************************************************
135 Geocentric^ NormalGravity::Earth()
136 {
137     return gcnew Geocentric( m_pNormalGravity->Earth() );
138 }
139 
140 //*****************************************************************************
get()141 double NormalGravity::EquatorialRadius::get()
142 { return m_pNormalGravity->EquatorialRadius(); }
143 
144 //*****************************************************************************
get()145 double NormalGravity::MassConstant::get()
146 { return m_pNormalGravity->MassConstant(); }
147 
148 //*****************************************************************************
DynamicalFormFactor(int n)149 double NormalGravity::DynamicalFormFactor(int n)
150 { return m_pNormalGravity->DynamicalFormFactor(n); }
151 
152 //*****************************************************************************
get()153 double NormalGravity::AngularVelocity::get()
154 { return m_pNormalGravity->AngularVelocity(); }
155 
156 //*****************************************************************************
get()157 double NormalGravity::Flattening::get()
158 { return m_pNormalGravity->Flattening(); }
159 
160 //*****************************************************************************
get()161 double NormalGravity::EquatorialGravity::get()
162 { return m_pNormalGravity->EquatorialGravity(); }
163 
164 //*****************************************************************************
get()165 double NormalGravity::PolarGravity::get()
166 { return m_pNormalGravity->PolarGravity(); }
167 
168 //*****************************************************************************
get()169 double NormalGravity::GravityFlattening::get()
170 { return m_pNormalGravity->GravityFlattening(); }
171 
172 //*****************************************************************************
get()173 double NormalGravity::SurfacePotential::get()
174 { return m_pNormalGravity->SurfacePotential(); }
175 
176 //*****************************************************************************
177 NormalGravity^ NormalGravity::WGS84()
178 {
179     return gcnew NormalGravity( StandardModels::WGS84 );
180 }
181 
182 //*****************************************************************************
183 NormalGravity^ NormalGravity::GRS80()
184 {
185     return gcnew NormalGravity( StandardModels::GRS80 );
186 }
187 
188 //*****************************************************************************
J2ToFlattening(double a,double GM,double omega,double J2)189 double NormalGravity::J2ToFlattening(double a, double GM, double omega,
190                                      double J2)
191 {
192     return GeographicLib::NormalGravity::J2ToFlattening( a, GM, omega, J2);
193 }
194 
195 //*****************************************************************************
FlatteningToJ2(double a,double GM,double omega,double f)196 double NormalGravity::FlatteningToJ2(double a, double GM, double omega,
197                                      double f)
198 {
199     return GeographicLib::NormalGravity::FlatteningToJ2( a, GM, omega, f);
200 }
201