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