GPlates / gplately

GPlately is a Python package to interrogate tectonic plate reconstructions.
https://gplates.github.io/gplately/
GNU General Public License v2.0
60 stars 13 forks source link

Direction Conversion #300

Open anjansapkota opened 2 weeks ago

anjansapkota commented 2 weeks ago

GPlately currently doesn't have a direct function to convert the direction. For example, let's say there's a river that has been flowing through 27.919360, 86.911086 since 300MA towards 48 degrees north (as of recent earth), how many degrees north was it flowing towards at 200 MA?

I have come up with a solution temporarily. It is quite precise, so I'd like to discuss this function more with you and eventually contribute if it turns out well.

Regards, Anjan

jcannon-gplates commented 2 weeks ago

Actually, there's a fairly simple way to do this using pyGPlates shown here.

@GPlates/gplately-dev, here's some thoughts on incorporating this into GPlately...

Perhaps we could incorporate that into a function to reconstruct vectors (in addition to locations) in class PlateReconstruction. We currently have PlateReconstruction.reconstruct() that reconstructs locations, so we could have a similar PlateReconstruction.reconstruct_vectors().

For PlateReconstruction.reconstruct_vectors(), each azimuth also needs a location in order to convert the local azimuth a global 3D vector (that also happens to be tangential to the globe). So that function could accept one or more location/azimuth pairs. It could also accept 3D vectors - which wouldn't even need to be tangential (eg, could be subduction dip vectors). Actually, if wanted, the equivalent for location/azimuth then can specify more than just azimuth (ie, pygplates.LocalCartesian, used in the above example, also has a downward inclination angle) - might as well make full use of that as well - using a vector's magnitude/azimuth/inclination triple.

The thing I'm not sure of is PlateReconstruction.reconstruct() reconstructs features, which also contain aspatial attribute data (not just locations). So things like directions might be part of a feature's attribute data, or coupled to the feature in some way, so you'd want to reconstruct them together somehow. Maybe one option is to pass features (rather than vectors) into PlateReconstruction.reconstruct_vectors() but have a way to tag which feature attributes are direction azimuths (and optionally also inclinations and magnitudes). Then the output would be the reconstructed vectors (or azimuth/inclination/magnitude), in the same order as the input features. By the way, I'll be adding a new type of reconstructed geometry (like ReconstructedFeatureGeometry) that will contain 3D vectors along with its associated reconstructed domain geometry/points (it'll be used for velocities as alluded to here) - we could also use that to output any kind of reconstructed vectors (such as the reconstructed directions discussed here). So the user inputs features into PlateReconstruction.reconstruct_vectors() and it outputs this new type of reconstructed vector geometry (one per input feature). This might need some support from pyGPlates (beyond just adding the new reconstructed vector type).

It would also be interesting to consider the effects of deformation (new in the upcoming pyGPlates 1.0) on vectors. Deformation can change vector magnitudes (due to extension/compression) and change vector directions due to shearing, etc. PyGPlates has a deformation gradient tensor that can determine those changes over time (in pyGPlates 1.0). These would only change the surface (tangential) vector components, not the depth (inclination) components.