apsg 1.1.4__tar.gz → 1.1.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {apsg-1.1.4 → apsg-1.1.5}/HISTORY.md +4 -0
- {apsg-1.1.4 → apsg-1.1.5}/PKG-INFO +5 -1
- {apsg-1.1.4 → apsg-1.1.5}/docs/conf.py +11 -11
- {apsg-1.1.4 → apsg-1.1.5}/setup.cfg +1 -1
- {apsg-1.1.4 → apsg-1.1.5}/setup.py +1 -1
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/__init__.py +1 -1
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/feature/_container.py +21 -21
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/feature/_paleomag.py +17 -17
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/helpers/_math.py +2 -2
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg.egg-info/PKG-INFO +5 -1
- {apsg-1.1.4 → apsg-1.1.5}/AUTHORS.md +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/CONTRIBUTING.md +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/LICENSE +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/MANIFEST.in +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/README.md +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/Makefile +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/apsg.database.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/apsg.feature.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/apsg.helpers.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/apsg.math.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/apsg.pandas.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/apsg.plotting.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/authors.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/automodules.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/contributing.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/index.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/installation.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/make.bat +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/docs/tutorials.rst +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/pyproject.toml +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/config.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/database/__init__.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/database/_alchemy.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/database/_sdbread.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/decorator/__init__.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/decorator/_decorator.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/feature/__init__.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/feature/_geodata.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/feature/_statistics.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/feature/_tensor2.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/feature/_tensor3.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/helpers/__init__.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/helpers/_helper.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/helpers/_notation.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/math/__init__.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/math/_matrix.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/math/_vector.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/pandas/__init__.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/pandas/_pandas_api.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/plotting/__init__.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/plotting/_fabricplot.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/plotting/_paleomagplots.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/plotting/_plot_artists.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/plotting/_projection.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/plotting/_roseplot.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/plotting/_stereogrid.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/plotting/_stereonet.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg/shell.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg.egg-info/SOURCES.txt +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg.egg-info/dependency_links.txt +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg.egg-info/entry_points.txt +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg.egg-info/requires.txt +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/src/apsg.egg-info/top_level.txt +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/tests/__init__.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/tests/conftest.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/tests/test_apsg.py +0 -0
- {apsg-1.1.4 → apsg-1.1.5}/tests/test_tensors.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: apsg
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.5
|
|
4
4
|
Summary: APSG - The package for structural geologists
|
|
5
5
|
Home-page: https://github.com/ondrolexa/apsg
|
|
6
6
|
Author: Ondrej Lexa
|
|
@@ -139,6 +139,10 @@ APSG is free software: you can redistribute it and/or modify it under the terms
|
|
|
139
139
|
|
|
140
140
|
# Changes
|
|
141
141
|
|
|
142
|
+
### 1.1.5 (May 15 2024)
|
|
143
|
+
* paleomag Core .dd bug fixed
|
|
144
|
+
* fix round-off domain math error for acosd and asind
|
|
145
|
+
|
|
142
146
|
### 1.1.4 (Dec 13 2023)
|
|
143
147
|
* Ellipsoid repr bugfix
|
|
144
148
|
|
|
@@ -46,7 +46,7 @@ extensions = [
|
|
|
46
46
|
"sphinx_rtd_theme",
|
|
47
47
|
]
|
|
48
48
|
|
|
49
|
-
autodoc_mock_imports = [
|
|
49
|
+
autodoc_mock_imports = ["sqlalchemy"]
|
|
50
50
|
|
|
51
51
|
# Add any paths that contain templates here, relative to this directory.
|
|
52
52
|
templates_path = ["_templates"]
|
|
@@ -61,8 +61,8 @@ source_suffix = ".rst"
|
|
|
61
61
|
master_doc = "index"
|
|
62
62
|
|
|
63
63
|
# General information about the project.
|
|
64
|
-
project =
|
|
65
|
-
copyright =
|
|
64
|
+
project = "APSG"
|
|
65
|
+
copyright = "2023, Ondrej Lexa"
|
|
66
66
|
|
|
67
67
|
# The version info for the project you're documenting, acts as replacement
|
|
68
68
|
# for |version| and |release|, also used in various other places throughout
|
|
@@ -71,7 +71,7 @@ copyright = u"2023, Ondrej Lexa"
|
|
|
71
71
|
# The short X.Y version.
|
|
72
72
|
version = "1.1"
|
|
73
73
|
# The full version, including alpha/beta/rc tags.
|
|
74
|
-
release = "1.1.
|
|
74
|
+
release = "1.1.5"
|
|
75
75
|
|
|
76
76
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
|
77
77
|
# for a list of supported languages.
|
|
@@ -161,7 +161,7 @@ html_theme_options = {
|
|
|
161
161
|
# static files, so a file named "default.css" will overwrite the builtin
|
|
162
162
|
# "default.css".
|
|
163
163
|
|
|
164
|
-
#html_static_path = ["_static"]
|
|
164
|
+
# html_static_path = ["_static"]
|
|
165
165
|
|
|
166
166
|
# If not '', a 'Last updated on:' timestamp is inserted at every page
|
|
167
167
|
# bottom, using the given strftime format.
|
|
@@ -225,7 +225,7 @@ latex_elements = {
|
|
|
225
225
|
# (source start file, target name, title, author, documentclass
|
|
226
226
|
# [howto/manual]).
|
|
227
227
|
latex_documents = [
|
|
228
|
-
("index", "apsg.tex",
|
|
228
|
+
("index", "apsg.tex", "APSG Documentation", "Ondrej Lexa", "manual"),
|
|
229
229
|
]
|
|
230
230
|
|
|
231
231
|
# The name of an image file (relative to this directory) to place at
|
|
@@ -253,7 +253,7 @@ latex_documents = [
|
|
|
253
253
|
|
|
254
254
|
# One entry per manual page. List of tuples
|
|
255
255
|
# (source start file, name, description, authors, manual section).
|
|
256
|
-
man_pages = [("index", "apsg",
|
|
256
|
+
man_pages = [("index", "apsg", "APSG Documentation", ["Ondrej Lexa"], 1)]
|
|
257
257
|
|
|
258
258
|
# If true, show URL addresses after external links.
|
|
259
259
|
# man_show_urls = False
|
|
@@ -268,8 +268,8 @@ texinfo_documents = [
|
|
|
268
268
|
(
|
|
269
269
|
"index",
|
|
270
270
|
"apsg",
|
|
271
|
-
|
|
272
|
-
|
|
271
|
+
"APSG Documentation",
|
|
272
|
+
"Ondrej Lexa",
|
|
273
273
|
"apsg",
|
|
274
274
|
" structural geology module for Python",
|
|
275
275
|
"Earth sciences",
|
|
@@ -289,5 +289,5 @@ texinfo_documents = [
|
|
|
289
289
|
# texinfo_no_detailmenu = False
|
|
290
290
|
|
|
291
291
|
# Sort members by type
|
|
292
|
-
#autodoc_member_order = "groupwise"
|
|
293
|
-
autodoc_member_order =
|
|
292
|
+
# autodoc_member_order = "groupwise"
|
|
293
|
+
autodoc_member_order = "bysource"
|
|
@@ -17,7 +17,7 @@ with open(path.join(CURRENT_PATH, "HISTORY.md")) as file:
|
|
|
17
17
|
|
|
18
18
|
setup(
|
|
19
19
|
name="apsg",
|
|
20
|
-
version="1.1.
|
|
20
|
+
version="1.1.5",
|
|
21
21
|
description="APSG - The package for structural geologists",
|
|
22
22
|
long_description=readme + "\n\n" + history,
|
|
23
23
|
long_description_content_type="text/markdown",
|
|
@@ -142,18 +142,18 @@ class Vector2Set(FeatureSet):
|
|
|
142
142
|
return np.asarray([e.direction for e in self]).T
|
|
143
143
|
|
|
144
144
|
def proj(self, vec):
|
|
145
|
-
"""Return projections of all features in ``
|
|
145
|
+
"""Return projections of all features in ``Vector2Set`` onto vector."""
|
|
146
146
|
return type(self)([e.project() for e in self], name=self.name)
|
|
147
147
|
|
|
148
148
|
def dot(self, vec):
|
|
149
|
-
"""Return array of dot products of all features in ``
|
|
149
|
+
"""Return array of dot products of all features in ``Vector2Set`` with vector."""
|
|
150
150
|
return np.array([e.dot(vec) for e in self])
|
|
151
151
|
|
|
152
152
|
def cross(self, other=None):
|
|
153
|
-
"""Return cross products of all features in ``
|
|
153
|
+
"""Return cross products of all features in ``Vector2Set``
|
|
154
154
|
|
|
155
155
|
Without arguments it returns cross product of all pairs in dataset.
|
|
156
|
-
If argument is ``
|
|
156
|
+
If argument is ``Vector2Set`` of same length or single data object
|
|
157
157
|
element-wise cross-products are calculated.
|
|
158
158
|
"""
|
|
159
159
|
res = []
|
|
@@ -170,10 +170,10 @@ class Vector2Set(FeatureSet):
|
|
|
170
170
|
__pow__ = cross
|
|
171
171
|
|
|
172
172
|
def angle(self, other=None):
|
|
173
|
-
"""Return angles of all data in ``
|
|
173
|
+
"""Return angles of all data in ``Vector2Set`` object
|
|
174
174
|
|
|
175
175
|
Without arguments it returns angles of all pairs in dataset.
|
|
176
|
-
If argument is ``
|
|
176
|
+
If argument is ``Vector2Set`` of same length or single data object
|
|
177
177
|
element-wise angles are calculated.
|
|
178
178
|
"""
|
|
179
179
|
res = []
|
|
@@ -188,13 +188,13 @@ class Vector2Set(FeatureSet):
|
|
|
188
188
|
return np.asarray(res)
|
|
189
189
|
|
|
190
190
|
def normalized(self):
|
|
191
|
-
"""Return ``
|
|
191
|
+
"""Return ``Vector2Set`` object with normalized (unit length) elements."""
|
|
192
192
|
return type(self)([e.normalized() for e in self], name=self.name)
|
|
193
193
|
|
|
194
194
|
uv = normalized
|
|
195
195
|
|
|
196
196
|
def transform(self, F, **kwargs):
|
|
197
|
-
"""Return affine transformation of all features ``
|
|
197
|
+
"""Return affine transformation of all features ``Vector2Set`` by matrix 'F'.
|
|
198
198
|
|
|
199
199
|
Args:
|
|
200
200
|
F: Transformation matrix. Array-like value e.g. ``DeformationGradient3``
|
|
@@ -206,12 +206,12 @@ class Vector2Set(FeatureSet):
|
|
|
206
206
|
return type(self)([e.transform(F, **kwargs) for e in self], name=self.name)
|
|
207
207
|
|
|
208
208
|
def R(self, mean=False):
|
|
209
|
-
"""Return resultant of data in ``
|
|
209
|
+
"""Return resultant of data in ``Vector2Set`` object.
|
|
210
210
|
|
|
211
|
-
Resultant is of same type as features in ``
|
|
212
|
-
that ``
|
|
213
|
-
|
|
214
|
-
|
|
211
|
+
Resultant is of same type as features in ``Vector2Set``. Note
|
|
212
|
+
that ``Axial2`` is axial in nature so resultant can give
|
|
213
|
+
other result than expected. Anyway for axial data orientation
|
|
214
|
+
tensor analysis will give you right answer.
|
|
215
215
|
|
|
216
216
|
Args:
|
|
217
217
|
mean: if True returns mean resultant. Default False
|
|
@@ -254,7 +254,7 @@ class Vector2Set(FeatureSet):
|
|
|
254
254
|
return acosd(abs(self.R(mean=True)))
|
|
255
255
|
|
|
256
256
|
def rdegree(self):
|
|
257
|
-
"""Degree of preffered orientation of vectors in ``
|
|
257
|
+
"""Degree of preffered orientation of vectors in ``Vector2Set``.
|
|
258
258
|
|
|
259
259
|
D = 100 * (2 * abs(R) - n) / n
|
|
260
260
|
"""
|
|
@@ -279,7 +279,7 @@ class Vector2Set(FeatureSet):
|
|
|
279
279
|
return self._cache["svd"]
|
|
280
280
|
|
|
281
281
|
def halfspace(self):
|
|
282
|
-
"""Change orientation of vectors in ``
|
|
282
|
+
"""Change orientation of vectors in ``Vector2Set``, so all have angle<=90 with
|
|
283
283
|
resultant.
|
|
284
284
|
|
|
285
285
|
"""
|
|
@@ -298,13 +298,13 @@ class Vector2Set(FeatureSet):
|
|
|
298
298
|
|
|
299
299
|
@classmethod
|
|
300
300
|
def from_direction(cls, angles, name="Default"):
|
|
301
|
-
"""Create ``
|
|
301
|
+
"""Create ``Vector2Set`` object from arrays of direction angles
|
|
302
302
|
|
|
303
303
|
Args:
|
|
304
304
|
angles: list or angles
|
|
305
305
|
|
|
306
306
|
Keyword Args:
|
|
307
|
-
name: name of ``
|
|
307
|
+
name: name of ``Vector2Set`` object. Default is 'Default'
|
|
308
308
|
|
|
309
309
|
Example:
|
|
310
310
|
>>> f = vec2set.from_angles([120,130,140,125, 132. 131])
|
|
@@ -314,14 +314,14 @@ class Vector2Set(FeatureSet):
|
|
|
314
314
|
|
|
315
315
|
@classmethod
|
|
316
316
|
def from_xy(cls, x, y, name="Default"):
|
|
317
|
-
"""Create ``
|
|
317
|
+
"""Create ``Vector2Set`` object from arrays of x and y components
|
|
318
318
|
|
|
319
319
|
Args:
|
|
320
320
|
x: list or array of x components
|
|
321
321
|
y: list or array of y components
|
|
322
322
|
|
|
323
323
|
Keyword Args:
|
|
324
|
-
name: name of ``
|
|
324
|
+
name: name of ``Vector2Set`` object. Default is 'Default'
|
|
325
325
|
|
|
326
326
|
Example:
|
|
327
327
|
>>> v = vec2set.from_xy([-0.4330127, -0.4330127, -0.66793414],
|
|
@@ -332,7 +332,7 @@ class Vector2Set(FeatureSet):
|
|
|
332
332
|
|
|
333
333
|
@classmethod
|
|
334
334
|
def random(cls, n=100, name="Default"):
|
|
335
|
-
"""Method to create ``
|
|
335
|
+
"""Method to create ``Vector2Set`` of features with uniformly distributed
|
|
336
336
|
random orientation.
|
|
337
337
|
|
|
338
338
|
Keyword Args:
|
|
@@ -349,7 +349,7 @@ class Vector2Set(FeatureSet):
|
|
|
349
349
|
|
|
350
350
|
@classmethod
|
|
351
351
|
def random_vonmises(cls, n=100, position=0, kappa=5, name="Default"):
|
|
352
|
-
"""Return ``
|
|
352
|
+
"""Return ``Vector2Set`` of random vectors sampled from von Mises distribution
|
|
353
353
|
around center position with concentration kappa.
|
|
354
354
|
|
|
355
355
|
Args:
|
|
@@ -156,10 +156,10 @@ class Core(object):
|
|
|
156
156
|
infoln = "{:<8} a={:5.1f} b={:5.1f} s={:5.1f} d={:5.1f} v={}m3 {}"
|
|
157
157
|
ln0 = infoln.format(
|
|
158
158
|
ff,
|
|
159
|
-
self.gref.lin.
|
|
160
|
-
self.gref.lin.
|
|
161
|
-
self.bedding.
|
|
162
|
-
self.bedding.
|
|
159
|
+
self.gref.lin.geo[0],
|
|
160
|
+
self.gref.lin.geo[1],
|
|
161
|
+
self.bedding.geo[0],
|
|
162
|
+
self.bedding.geo[1],
|
|
163
163
|
eformat(self.volume, 2),
|
|
164
164
|
dt,
|
|
165
165
|
)
|
|
@@ -274,7 +274,7 @@ class Core(object):
|
|
|
274
274
|
data["a95"] = body[ix]["Prec"].to_list()
|
|
275
275
|
data["vectors"] = []
|
|
276
276
|
for n, r in body[ix].iterrows():
|
|
277
|
-
data["vectors"].append(r[2] * Vector3(r["Dsp"], r["Isp"]))
|
|
277
|
+
data["vectors"].append(r.iloc[2] * Vector3(r["Dsp"], r["Isp"]))
|
|
278
278
|
return cls(**data)
|
|
279
279
|
|
|
280
280
|
def write_rs3(self, filename=None):
|
|
@@ -295,14 +295,14 @@ class Core(object):
|
|
|
295
295
|
latitude = self.latitude if self.latitude is not None else ""
|
|
296
296
|
longitude = self.longitude if self.longitude is not None else ""
|
|
297
297
|
height = self.height if self.height is not None else ""
|
|
298
|
-
sdec, sinc = (round(self.gref.fol.
|
|
298
|
+
sdec, sinc = (round(self.gref.fol.geo[0]), round(self.gref.fol.geo[1]))
|
|
299
299
|
bdec, binc = (
|
|
300
|
-
(round(self.bedding.
|
|
300
|
+
(round(self.bedding.geo[0]), round(self.bedding.geo[1]))
|
|
301
301
|
if self.bedding is not None
|
|
302
302
|
else ("", "")
|
|
303
303
|
)
|
|
304
304
|
fdec, finc = (
|
|
305
|
-
(round(self.foldaxis.
|
|
305
|
+
(round(self.foldaxis.geo[0]), round(self.foldaxis.geo[1]))
|
|
306
306
|
if self.foldaxis is not None
|
|
307
307
|
else ("", "")
|
|
308
308
|
)
|
|
@@ -324,7 +324,7 @@ class Core(object):
|
|
|
324
324
|
self.a95,
|
|
325
325
|
self.comments,
|
|
326
326
|
):
|
|
327
|
-
ln = f"{id:2} {step:<10} {MAG:>13g} {V.
|
|
327
|
+
ln = f"{id:2} {step:<10} {MAG:>13g} {V.geo[0]:>5.1f} {V.geo[1]:> 5.1f} {geo.geo[0]:>5.1f} {geo.geo[1]:> 5.1f} {tilt.geo[0]:>5.1f} {tilt.geo[1]:> 5.1f} {a95:>5.1f} {comment:10}"
|
|
328
328
|
print(ln, file=res3file, end="\r\n")
|
|
329
329
|
|
|
330
330
|
@property
|
|
@@ -342,14 +342,14 @@ class Core(object):
|
|
|
342
342
|
):
|
|
343
343
|
ln = "{:<4} {: 9.2E} {: 9.2E} {: 9.2E} {: 9.2E} {:5.1f} {:5.1f} {:5.1f} {:5.1f} {:4.1f} {}".format(
|
|
344
344
|
step,
|
|
345
|
-
V
|
|
346
|
-
V
|
|
347
|
-
V
|
|
345
|
+
V.x,
|
|
346
|
+
V.y,
|
|
347
|
+
V.z,
|
|
348
348
|
MAG,
|
|
349
|
-
geo.
|
|
350
|
-
geo.
|
|
351
|
-
tilt.
|
|
352
|
-
tilt.
|
|
349
|
+
geo.geo[0],
|
|
350
|
+
geo.geo[1],
|
|
351
|
+
tilt.geo[0],
|
|
352
|
+
tilt.geo[1],
|
|
353
353
|
a95,
|
|
354
354
|
comment,
|
|
355
355
|
)
|
|
@@ -399,7 +399,7 @@ class Core(object):
|
|
|
399
399
|
def tilt(self):
|
|
400
400
|
"""Returns ``Vector3Set`` of vectors in tilt‐corrected coordinates system"""
|
|
401
401
|
return self.geo.rotate(
|
|
402
|
-
Lineation(self.bedding.
|
|
402
|
+
Lineation(self.bedding.geo[0] - 90, 0), -self.bedding.geo[1]
|
|
403
403
|
)
|
|
404
404
|
|
|
405
405
|
def pca(self, kind="geo", origin=False):
|
|
@@ -22,12 +22,12 @@ def tand(x):
|
|
|
22
22
|
|
|
23
23
|
def asind(x):
|
|
24
24
|
"""Calculate arc sine in degrees"""
|
|
25
|
-
return math.degrees(math.asin(x))
|
|
25
|
+
return math.degrees(math.asin(max(min(x, 1), -1)))
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
def acosd(x):
|
|
29
29
|
"""Calculate arc cosine in degrees"""
|
|
30
|
-
return math.degrees(math.acos(x))
|
|
30
|
+
return math.degrees(math.acos(max(min(x, 1), -1)))
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
def atand(x):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: apsg
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.5
|
|
4
4
|
Summary: APSG - The package for structural geologists
|
|
5
5
|
Home-page: https://github.com/ondrolexa/apsg
|
|
6
6
|
Author: Ondrej Lexa
|
|
@@ -139,6 +139,10 @@ APSG is free software: you can redistribute it and/or modify it under the terms
|
|
|
139
139
|
|
|
140
140
|
# Changes
|
|
141
141
|
|
|
142
|
+
### 1.1.5 (May 15 2024)
|
|
143
|
+
* paleomag Core .dd bug fixed
|
|
144
|
+
* fix round-off domain math error for acosd and asind
|
|
145
|
+
|
|
142
146
|
### 1.1.4 (Dec 13 2023)
|
|
143
147
|
* Ellipsoid repr bugfix
|
|
144
148
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|