-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add normal_gravitational_potential, normal_gravity_potential, and centrifugal_potential #187
Conversation
2e1c831
to
87f8529
Compare
87f8529
to
6cd8b39
Compare
c19732d
to
bf05e20
Compare
bf05e20
to
894d0ae
Compare
I added a centrifugal_potential method for the triaxial ellipsoid now that PR with the semimajor_axis_longitude attribute has been accepted. |
Note: I tested three different analytic solutions for going between geodetic and ellipsoidal harmonic coordinates, and they all gave the same precision. The alternative forms can be found in the manuscript "Closed-form transformation between geodetic and ellipsoidal coordinates" by Featherstone and Claessens (2008, http://link.springer.com/10.1007/s11200-008-0002-6). I think that the precision is good enough, and I suspect that the problem comes down to the fact that you need to solve a quartic equation. |
The last comit precomputes some variables that are used repeatedly in the normal gravity computations (such as I don't plan on making any further changes to this PR, unless requested. |
@MarkWieczorek this is truly fantastic! Thank you for all your work on this and for the pointer to the paper. I'm reviewing this by pieces whenever I can find some spare time. I'm eager to add this to Boule since it would allow us to work with the disturbing potential instead of geoid heights, which I find more intuitive. |
Fix typo in documentation Co-authored-by: Santiago Soler <santisoler@fastmail.com>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks amazing @MarkWieczorek! I think it's in really good shape to be merged. I just left one minor suggestion. Let me know what do you think.
One other thing I noticed is that the normal_gravity
, normal_gravity_potential
and normal_gravitational_potential
defines the q
and q_0
quantities. Does it worth having private methods for those? Just raising the question to see if that would reduce repeated code, but I don't have strong feelings about it.
Anyways, thanks again for the hard work!
with warnings.catch_warnings(record=True) as warn: | ||
ellipsoid.normal_gravity_potential(latitude, height=-10) | ||
assert len(warn) >= 1 | ||
with warnings.catch_warnings(record=True) as warn: | ||
ellipsoid.normal_gravitational_potential(latitude, height=-10) | ||
assert len(warn) >= 1 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seeing this reminded me that we can use pytest.warns
to check if a code is raising warnings. For example, these lines could be replaced by:
msg = (
"Formulas used are valid for points outside the ellipsoid."
"Height must be greater than or equal to zero."
)
with pytest.warns(UserWarning, match=msg):
ellipsoid.normal_gravity_potential(latitude, height=-10)
with pytest.warns(UserWarning, match=msg):
ellipsoid.normal_gravitational_potential(latitude, height=-10)
With pytest.warns
we can also check that the text of the raised warning to ensure that the code raised the right warning.
We don't need to change these lines here, I'll open a different PR for this.
Co-authored-by: Santiago Soler <santisoler@fastmail.com>
That's a good point. I think that we could create two auxilliary functions for q and q_0. I don't know if we need these for anything besides these three methods, but it would probably clean up the code a bit. Nevertheless, could we do this after #197 ? Changing this now would complicate that PR. |
The docs are failing with this error. I don't know how to resolve this...
|
Yes, totally. I just mentioned after I noticed it, but I don't want that to block this or other PRs. We can totally leave it for later.
This is unrelated to your PR. The reason behind it is because we were installing |
Merged! Sorry for the long delay and many many thanks for implementing all of this @MarkWieczorek! |
This PR makes several additions in order to compute the normal gravity/gravitational potential on or above the ellipsoid.
normal_gravity_potential()
,normal_gravitational_potential()
andcentrifugal_potential()
methods to both the Ellipsoid and Sphere class.Ellipsoid.geodetic_to_ellipsoidal_harmonic()
andEllipsoid.ellipsoidal_harmonic_to_geodetic()
.normal_gravity_potential() = normal_gravitational_potential() + centrifugal_potential()
.Notes
The centrifugal potential calculation needs the perpendicular distance to the rotation axis. For this, I used the definition of the prime radius of curvature and geodetic latitude which gives:$(N(\phi) + h) \cos\phi$ , where $\phi$ is geodetic latitude and $h$ is ellipsoidal height. There are probably other ways that this could be calculated. A separate PR will implement this for triaxial ellipsoids, as we will need to change how we handle
longitude_semimajor_axis
.The geodetic to ellipsoidal harmonic coordinate transforms work, but I am worried about the precision. The conversion from geodetic to ellipsoidal uses the same code as in the
normal_gravity
method, which is based on the equations in Lakshmanan (1991). The inverse is just a a couple atans for the latitude, and the ellipsoidal height is computed as the difference of theprime_vertical_radius
of the two ellipsoids. Even if I can understand why the height might lose precision this way, the latitude shouldn't.Here are a couple of examples:
Maybe this is good enough. I suspect that the loss of precision comes from the Lakshmanan equations (which have some subtractions of similarly sized numbers). Perhaps there is nothing we can do about it. Nevertheless, I note that if this is a problem, then it will also affect the normal gravity routine that uses the same method.
Relevant issues/PRs:
Closes #151