geolysis 0.9.0__py3-none-any.whl → 0.10.1__py3-none-any.whl

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.
Files changed (32) hide show
  1. geolysis/__init__.py +3 -3
  2. geolysis/bearing_capacity/abc/__init__.py +21 -0
  3. geolysis/bearing_capacity/abc/_cohl/__init__.py +109 -0
  4. geolysis/bearing_capacity/abc/{cohl → _cohl}/_core.py +25 -8
  5. geolysis/bearing_capacity/abc/_cohl/bowles_abc.py +103 -0
  6. geolysis/bearing_capacity/abc/_cohl/meyerhof_abc.py +100 -0
  7. geolysis/bearing_capacity/abc/_cohl/terzaghi_abc.py +148 -0
  8. geolysis/bearing_capacity/ubc/__init__.py +107 -128
  9. geolysis/bearing_capacity/ubc/_core.py +82 -52
  10. geolysis/bearing_capacity/ubc/_hansen_ubc.py +271 -0
  11. geolysis/bearing_capacity/ubc/_terzaghi_ubc.py +178 -0
  12. geolysis/bearing_capacity/ubc/_vesic_ubc.py +253 -0
  13. geolysis/foundation.py +146 -136
  14. geolysis/soil_classifier.py +386 -290
  15. geolysis/spt.py +323 -257
  16. geolysis/{utils/__init__.py → utils.py} +44 -33
  17. geolysis-0.10.1.dist-info/METADATA +182 -0
  18. geolysis-0.10.1.dist-info/RECORD +22 -0
  19. {geolysis-0.9.0.dist-info → geolysis-0.10.1.dist-info}/WHEEL +1 -1
  20. geolysis/bearing_capacity/abc/cohl/__init__.py +0 -137
  21. geolysis/bearing_capacity/abc/cohl/bowles_abc.py +0 -96
  22. geolysis/bearing_capacity/abc/cohl/meyerhof_abc.py +0 -96
  23. geolysis/bearing_capacity/abc/cohl/terzaghi_abc.py +0 -131
  24. geolysis/bearing_capacity/ubc/hansen_ubc.py +0 -287
  25. geolysis/bearing_capacity/ubc/terzaghi_ubc.py +0 -246
  26. geolysis/bearing_capacity/ubc/vesic_ubc.py +0 -293
  27. geolysis/utils/exceptions.py +0 -65
  28. geolysis/utils/validators.py +0 -119
  29. geolysis-0.9.0.dist-info/METADATA +0 -206
  30. geolysis-0.9.0.dist-info/RECORD +0 -24
  31. {geolysis-0.9.0.dist-info → geolysis-0.10.1.dist-info}/licenses/LICENSE.txt +0 -0
  32. {geolysis-0.9.0.dist-info → geolysis-0.10.1.dist-info}/top_level.txt +0 -0
@@ -1,293 +0,0 @@
1
- from geolysis.foundation import Shape
2
- from geolysis.utils import isclose, round_, sin, tan
3
-
4
- from . import hansen_ubc
5
- from ._core import UltimateBearingCapacity
6
-
7
- __all__ = ["VesicUltimateBearingCapacity"]
8
-
9
-
10
- @round_(ndigits=2)
11
- def n_c(friction_angle: float) -> float:
12
- return hansen_ubc.n_c(friction_angle)
13
-
14
-
15
- @round_(ndigits=2)
16
- def n_q(friction_angle: float) -> float:
17
- return hansen_ubc.n_q(friction_angle)
18
-
19
-
20
- @round_(ndigits=2)
21
- def n_gamma(friction_angle: float) -> float:
22
- return 2.0 * (n_q(friction_angle) + 1.0) * tan(friction_angle)
23
-
24
-
25
- @round_(ndigits=2)
26
- def s_c(friction_angle: float,
27
- f_width: float,
28
- f_length: float,
29
- f_shape: Shape) -> float:
30
- _n_q = n_q(friction_angle)
31
- _n_c = n_c(friction_angle)
32
-
33
- if f_shape == Shape.STRIP:
34
- return 1.0
35
- elif f_shape == Shape.RECTANGLE:
36
- return 1.0 + (f_width / f_length) * (_n_q / _n_c)
37
- else: # SQUARE, CIRCLE
38
- return 1.0 + (_n_q / _n_c)
39
-
40
-
41
- @round_(ndigits=2)
42
- def s_q(friction_angle: float,
43
- f_width: float,
44
- f_length: float,
45
- f_shape: Shape) -> float:
46
- if f_shape == Shape.STRIP:
47
- return 1.0
48
- elif f_shape == Shape.RECTANGLE:
49
- return 1.0 + (f_width / f_length) * tan(friction_angle)
50
- else: # SQUARE, CIRCLE
51
- return 1.0 + tan(friction_angle)
52
-
53
-
54
- @round_(ndigits=2)
55
- def s_gamma(f_width: float, f_length: float, f_shape: Shape) -> float:
56
- if f_shape == Shape.STRIP:
57
- return 1.0
58
- elif f_shape == Shape.RECTANGLE:
59
- return 1.0 - 0.4 * (f_width / f_length)
60
- else: # SQUARE, CIRCLE
61
- return 0.6
62
-
63
-
64
- @round_(ndigits=2)
65
- def d_c(f_depth: float, f_width: float) -> float:
66
- return 1.0 + 0.4 * f_depth / f_width
67
-
68
-
69
- @round_(ndigits=2)
70
- def d_q(friction_angle: float, f_depth: float, f_width: float) -> float:
71
- return (1.0 + 2.0 * tan(friction_angle)
72
- * (1.0 - sin(friction_angle)) ** 2.0
73
- * (f_depth / f_width))
74
-
75
-
76
- @round_(ndigits=2)
77
- def d_gamma() -> float:
78
- return 1.0
79
-
80
-
81
- @round_(ndigits=2)
82
- def i_c(load_angle: float) -> float:
83
- return (1.0 - load_angle / 90.0) ** 2.0
84
-
85
-
86
- @round_(ndigits=2)
87
- def i_q(load_angle: float) -> float:
88
- return i_c(load_angle)
89
-
90
-
91
- @round_(ndigits=2)
92
- def i_gamma(friction_angle: float, load_angle: float) -> float:
93
- if isclose(friction_angle, 0.0):
94
- return 1.0
95
- return (1.0 - load_angle / friction_angle) ** 2.0
96
-
97
-
98
- class VesicUltimateBearingCapacity(UltimateBearingCapacity):
99
- r"""Ultimate bearing capacity for soils according to ``Vesic (1973)``.
100
-
101
- :Equation:
102
-
103
- .. math::
104
-
105
- q_u = cN_c s_c d_c i_c + qN_q s_q d_q i_q
106
- + 0.5 \gamma B N_{\gamma} s_{\gamma} d_{\gamma} i_{\gamma}
107
-
108
- .. list-table::
109
- :widths: auto
110
- :header-rows: 1
111
-
112
- * - Symbol
113
- - Description
114
- - Unit
115
- * - :math:`q_u`
116
- - Ultimate bearing capacity
117
- - :math:`kPa`
118
- * - :math:`c`
119
- - Cohesion of soil
120
- - :math:`kPa`
121
- * - :math:`q`
122
- - Overburden pressure of soil
123
- - :math:`kPa`
124
- * - :math:`\gamma`
125
- - Unit weight of soil
126
- - :math:`kN/m^3`
127
- * - :math:`B`
128
- - Width of foundation footing
129
- - :math:`m`
130
- * - :math:`N_c`, :math:`N_q`, :math:`N_{\gamma}`
131
- - Bearing capacity factors
132
- - —
133
- * - :math:`s_c`, :math:`s_q`, :math:`s_{\gamma}`
134
- - Shape factors
135
- - —
136
- * - :math:`d_c`, :math:`d_q`, :math:`d_{\gamma}`
137
- - Depth factors
138
- - —
139
- * - :math:`i_c`, :math:`i_q`, :math:`i_{\gamma}`
140
- - Inclination factors
141
- - —
142
- """
143
-
144
- @property
145
- def n_c(self) -> float:
146
- r"""Bearing capacity factor :math:`N_c`.
147
-
148
- :Equation:
149
-
150
- .. math:: N_c = \cot(\phi) \left(N_q - 1\right)
151
- """
152
- return n_c(self.friction_angle)
153
-
154
- @property
155
- def n_q(self) -> float:
156
- r"""Bearing capacity factor :math:`N_q`.
157
-
158
- :Equation:
159
-
160
- .. math:: N_q = \tan^2\left(45 + \frac{\phi}{2}\right) \cdot
161
- e^{\pi \tan(\phi)}
162
- """
163
- return n_q(self.friction_angle)
164
-
165
- @property
166
- def n_gamma(self) -> float:
167
- r"""Bearing capacity factor :math:`N_{\gamma}`.
168
-
169
- :Equation:
170
-
171
- .. math:: N_{\gamma} = 2(N_q + 1) \tan(\phi)
172
- """
173
- return n_gamma(self.friction_angle)
174
-
175
- @property
176
- def s_c(self) -> float:
177
- r"""Shape factor :math:`S_c`.
178
-
179
- :Equation:
180
-
181
- .. math::
182
-
183
- s_c &= 1.0 \rightarrow \text{Strip footing}
184
-
185
- s_c &= 1 + \dfrac{B}{L} \cdot \dfrac{N_q}{N_c} \rightarrow
186
- \text{Rectangular footing}
187
-
188
- s_c &= 1 + \dfrac{N_q}{N_c} \rightarrow
189
- \text{Square or circular footing}
190
- """
191
- width, length, shape = self.foundation_size.footing_params()
192
- return s_c(self.friction_angle, width, length, shape)
193
-
194
- @property
195
- def s_q(self) -> float:
196
- r"""Shape factor :math:`S_q`.
197
-
198
- :Equation:
199
-
200
- .. math::
201
-
202
- s_q &= 1.0 \rightarrow \text{Strip footing}
203
-
204
- s_q &= 1 + \dfrac{B}{L} \cdot \tan(\phi) \rightarrow
205
- \text{Rectangular footing}
206
-
207
- s_q &= 1 + \tan(\phi) \rightarrow \text{Square or circular footing}
208
- """
209
- width, length, shape = self.foundation_size.footing_params()
210
- return s_q(self.friction_angle, width, length, shape)
211
-
212
- @property
213
- def s_gamma(self) -> float:
214
- r"""Shape factor :math:`S_{\gamma}`.
215
-
216
- :Equation:
217
-
218
- .. math::
219
-
220
- s_{\gamma} &= 1.0 \rightarrow \text{Strip footing}
221
-
222
- s_{\gamma} &= 1.0 - 0.4 \dfrac{B}{L} \rightarrow
223
- \text{Rectangular footing}
224
-
225
- s_{\gamma} &= 0.6 \rightarrow \text{Square or circular footing}
226
- """
227
- width, length, shape = self.foundation_size.footing_params()
228
- return s_gamma(width, length, shape)
229
-
230
- @property
231
- def d_c(self) -> float:
232
- r"""Depth factor :math:`D_c`.
233
-
234
- :Equation:
235
-
236
- .. math:: d_c = 1 + 0.4 \dfrac{D_f}{B}
237
- """
238
- depth, width = self.foundation_size.depth, self.foundation_size.width
239
- return d_c(depth, width)
240
-
241
- @property
242
- def d_q(self) -> float:
243
- r"""Depth factor :math:`D_q`.
244
-
245
- :Equation:
246
-
247
- .. math::
248
-
249
- d_q = 1 + 2 \tan(\phi) \cdot (1 - \sin(\phi))^2
250
- \cdot \dfrac{D_f}{B}
251
- """
252
- depth, width = self.foundation_size.depth, self.foundation_size.width
253
- return d_q(self.friction_angle, depth, width)
254
-
255
- @property
256
- def d_gamma(self) -> float:
257
- r"""Depth factor :math:`D_{\gamma}`.
258
-
259
- :Equation:
260
-
261
- .. math:: d_{\gamma} = 1.0
262
- """
263
- return d_gamma()
264
-
265
- @property
266
- def i_c(self) -> float:
267
- r"""Inclination factor :math:`I_c`.
268
-
269
- :Equation:
270
-
271
- .. math:: i_c = (1 - \dfrac{\alpha}{90})^2
272
- """
273
- return i_c(self.load_angle)
274
-
275
- @property
276
- def i_q(self) -> float:
277
- r"""Inclination factor :math:`I_q`.
278
-
279
- :Equation:
280
-
281
- .. math:: i_q = (1 - \dfrac{\alpha}{90})^2
282
- """
283
- return i_q(self.load_angle)
284
-
285
- @property
286
- def i_gamma(self) -> float:
287
- r"""Inclination factor :math:`I_{\gamma}`.
288
-
289
- :Equation:
290
-
291
- .. math:: i_{\gamma} = \left(1 - \dfrac{\alpha}{\phi} \right)^2
292
- """
293
- return i_gamma(self.friction_angle, self.load_angle)
@@ -1,65 +0,0 @@
1
- from collections import UserString
2
- from typing import Any
3
-
4
-
5
- class ErrorMsg(UserString):
6
- def __init__(self, *, param_name: str = None,
7
- param_value: Any = None,
8
- symbol: str = None,
9
- param_value_bound: Any = None,
10
- msg: str = None):
11
- if not msg:
12
- msg = f"{param_name}: {param_value!r} must be {symbol} {param_value_bound}"
13
-
14
- super().__init__(msg)
15
-
16
- self.param_name = param_name
17
- self.param_value = param_value
18
- self.symbol = symbol
19
- self.param_value_bound = param_value_bound
20
-
21
- @property
22
- def msg(self):
23
- return self.data
24
-
25
- def __add__(self, other):
26
- msg = self.msg + str(other)
27
- return self.__class__(param_name=self.param_name,
28
- param_value=self.param_value,
29
- symbol=self.symbol,
30
- param_value_bound=self.param_value_bound,
31
- msg=msg)
32
-
33
- def __radd__(self, other):
34
- msg = str(other) + self.msg
35
- return self.__class__(param_name=self.param_name,
36
- param_value=self.param_value,
37
- symbol=self.symbol,
38
- param_value_bound=self.param_value_bound,
39
- msg=msg)
40
-
41
- def __repr__(self) -> str:
42
- return f"ErrorMsg(param_name={self.param_name}, " \
43
- f"param_value={self.param_value}, " \
44
- f"symbol={self.symbol}, " \
45
- f"param_value_bound={self.param_value_bound}, msg={self.msg!r})"
46
-
47
- def to_dict(self) -> dict:
48
- return {
49
- "param_name": self.param_name,
50
- "param_value": self.param_value,
51
- "symbol": self.symbol,
52
- "param_value_bound": self.param_value_bound,
53
- "message": self.msg
54
- }
55
-
56
-
57
- class ValidationError(ValueError):
58
- """Exception raised when a validation error occurs."""
59
-
60
- def __init__(self, error: ErrorMsg):
61
- super().__init__(error)
62
- self.error = error
63
-
64
- def __repr__(self):
65
- return f"ValidationError(error={self.error!r})"
@@ -1,119 +0,0 @@
1
- """validators"""
2
- import operator
3
- from functools import wraps
4
- from typing import Any, Callable, Iterable, TypeAlias, List, Tuple, Sequence
5
-
6
- from .exceptions import ErrorMsg, ValidationError
7
-
8
- Number: TypeAlias = int | float
9
-
10
-
11
- class _Validator:
12
-
13
- def __init__(self, bound: Any, /, *,
14
- symbol: str,
15
- check: Callable,
16
- exc_type: Callable,
17
- err_msg: str):
18
- self.bound = bound
19
- self.symbol = symbol
20
- self.check = check
21
- self.exc_type = exc_type
22
- self.err_msg = err_msg
23
-
24
- def check_val(self, val, fname: str):
25
- raise NotImplementedError
26
-
27
- def __call__(self, fn):
28
- @wraps(fn)
29
- def wrapper(obj, val):
30
- if isinstance(val, List | Tuple):
31
- for v in val:
32
- self.check_val(v, fn.__name__)
33
- else:
34
- self.check_val(val, fn.__name__)
35
-
36
- fn(obj, val)
37
-
38
- return wrapper
39
-
40
-
41
- class _NumValidator(_Validator):
42
-
43
- def check_val(self, v: Number, fname: str):
44
- if not self.check(v, self.bound):
45
- msg = ErrorMsg(msg=self.err_msg,
46
- param_name=fname,
47
- param_value=v,
48
- symbol=self.symbol,
49
- param_value_bound=self.bound)
50
- raise self.exc_type(msg)
51
-
52
-
53
- class _LenValidator(_Validator):
54
-
55
- def __call__(self, fn):
56
- @wraps(fn)
57
- def wrapper(obj, val: Sequence):
58
- if not self.check(len(val), self.bound):
59
- msg = ErrorMsg(msg=self.err_msg,
60
- param_name=fn.__name__,
61
- param_value=val,
62
- symbol=self.symbol,
63
- param_value_bound=self.bound)
64
- msg = "Length of " + msg
65
- raise self.exc_type(msg)
66
- fn(obj, val)
67
-
68
- return wrapper
69
-
70
-
71
- class _InValidator(_Validator):
72
- def check_val(self, v, fname):
73
- if not self.check(self.bound, v):
74
- msg = ErrorMsg(msg=self.err_msg,
75
- param_name=fname,
76
- param_value=v,
77
- symbol=self.symbol,
78
- param_value_bound=self.bound)
79
- raise self.exc_type(msg)
80
-
81
-
82
- def in_(bound: Iterable[Any], /, *, exc_type=ValidationError, err_msg=None):
83
- return _InValidator(bound, symbol="in", check=operator.contains,
84
- exc_type=exc_type, err_msg=err_msg)
85
-
86
-
87
- def min_len(bound: int, /, *, exc_type=ValidationError, err_msg=None):
88
- return _LenValidator(bound, symbol=">=", check=operator.ge,
89
- exc_type=exc_type, err_msg=err_msg)
90
-
91
-
92
- def lt(bound: Number, /, *, exc_type=ValidationError, err_msg=None):
93
- return _NumValidator(bound, symbol="<", check=operator.lt,
94
- exc_type=exc_type, err_msg=err_msg)
95
-
96
-
97
- def le(bound: Number, /, *, exc_type=ValidationError, err_msg=None):
98
- return _NumValidator(bound, symbol="<=", check=operator.le,
99
- exc_type=exc_type, err_msg=err_msg)
100
-
101
-
102
- def eq(bound: Number, /, *, exc_type=ValidationError, err_msg=None):
103
- return _NumValidator(bound, symbol="==", check=operator.eq,
104
- exc_type=exc_type, err_msg=err_msg)
105
-
106
-
107
- def ne(bound: Number, /, *, exc_type=ValidationError, err_msg=None):
108
- return _NumValidator(bound, symbol="!=", check=operator.ne,
109
- exc_type=exc_type, err_msg=err_msg)
110
-
111
-
112
- def ge(bound: Number, /, *, exc_type=ValidationError, err_msg=None):
113
- return _NumValidator(bound, symbol=">=", check=operator.ge,
114
- exc_type=exc_type, err_msg=err_msg)
115
-
116
-
117
- def gt(bound: Number, /, *, exc_type=ValidationError, err_msg=None):
118
- return _NumValidator(bound, symbol=">", check=operator.gt,
119
- exc_type=exc_type, err_msg=err_msg)
@@ -1,206 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: geolysis
3
- Version: 0.9.0
4
- Summary: geolysis is an opensource software for geotechnical engineering analysis and modeling.
5
- Author-email: Patrick Boateng <boatengpato.pb@gmail.com>
6
- License: MIT License
7
- Project-URL: Homepage, https://docs.geolysis.io
8
- Project-URL: Documentation, https://docs.geolysis.io
9
- Project-URL: Repository, https://github.com/patrickboateng/geolysis
10
- Project-URL: Discussions, https://github.com/patrickboateng/geolysis/discussions
11
- Project-URL: Issue Tracker, https://github.com/patrickboateng/geolysis/issues
12
- Keywords: geotechnical-engineering,soil-classification,bearing-capacity-analysis,standard-penetration-test-analysis
13
- Classifier: Development Status :: 4 - Beta
14
- Classifier: Intended Audience :: Developers
15
- Classifier: Intended Audience :: Education
16
- Classifier: Intended Audience :: Science/Research
17
- Classifier: License :: OSI Approved :: MIT License
18
- Classifier: Natural Language :: English
19
- Classifier: Operating System :: OS Independent
20
- Classifier: Programming Language :: Python :: 3.11
21
- Classifier: Programming Language :: Python :: 3.12
22
- Classifier: Programming Language :: Python :: Implementation :: CPython
23
- Classifier: Topic :: Scientific/Engineering
24
- Requires-Python: >=3.11
25
- Description-Content-Type: text/markdown
26
- License-File: LICENSE.txt
27
- Provides-Extra: dev
28
- Requires-Dist: pytest; extra == "dev"
29
- Requires-Dist: pytest-cov; extra == "dev"
30
- Requires-Dist: coverage; extra == "dev"
31
- Dynamic: license-file
32
-
33
- <div align="center">
34
- <img src="https://raw.githubusercontent.com/patrickboateng/geolysis/dev/docs/source/_static/branding/geolysislogo.svg"
35
- alt="geolysislogo" width="75%" />
36
- </div><br>
37
-
38
- <div align="center">
39
-
40
- [![PyPI Latest Release](https://img.shields.io/pypi/v/geolysis?style=flat&logo=pypi)](https://pypi.org/project/geolysis/)
41
- [![PyPI Downloads](https://static.pepy.tech/badge/geolysis)](https://pepy.tech/projects/geolysis)
42
- [![PyPI pyversions](https://img.shields.io/pypi/pyversions/geolysis.svg?logo=python&style=flat)](https://pypi.python.org/pypi/geolysis/)
43
- [![license](https://img.shields.io/pypi/l/geolysis?style=flat&logo=opensourceinitiative)](https://opensource.org/license/mit/)
44
-
45
- ![Coveralls Status](https://img.shields.io/coverallsCoverage/github/patrickboateng/geolysis?logo=coveralls)
46
- [![Codacy Badge](https://app.codacy.com/project/badge/Grade/17f88084c6a84a08a20f9d8da1438107)](https://app.codacy.com/gh/patrickboateng/geolysis/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
47
- [![Unit-Tests](https://github.com/patrickboateng/geolysis/actions/workflows/geolysis-unit-tests.yml/badge.svg)](https://github.com/patrickboateng/geolysis/actions/workflows/unit-tests.yml)
48
- [![Documentation Status](https://readthedocs.org/projects/geolysis/badge/?version=latest)](https://geolysis.readthedocs.io/en/latest/?badge=latest)
49
-
50
- </div>
51
-
52
- `geolysis` is an open-source python package (library) for geotechnical analysis
53
- and modeling. It offers tools for soil classification, Standard Penetration
54
- Test (SPT) analysis, and bearing capacity estimation, among others.
55
-
56
- The `geolysis` package is among three other projects, `geolysis.gui`,
57
- `geolysis.excel`, and `geolysis.ai`.
58
-
59
- Here are brief descriptions of the `geolysis` projects:
60
-
61
- 1. `geolysis`
62
-
63
- A python package (library) which provides the core functionalities for
64
- `geolysis.gui` and the `geolysis.excel` applications. Current features
65
- provided by the `geolysis` package are shown in the table below.
66
-
67
- <table>
68
- <tr>
69
- <td><strong>Soil Classification</strong></td>
70
- <td>AASHTO Classification System</td>
71
- </tr>
72
- <tr>
73
- <td></td>
74
- <td>Unified Soil Classification System</td>
75
- </tr>
76
- <tr>
77
- <td><strong>Standard Penetration Test (SPT) Analysis</strong></td>
78
- <td>SPT Energy Correction</td>
79
- </tr>
80
- <tr>
81
- <td></td>
82
- <td>SPT Overburden Pressure Correction</td>
83
- </tr>
84
- <tr>
85
- <td></td>
86
- <td>SPT Dilatancy Correction</td>
87
- </tr>
88
- <tr>
89
- <td></td>
90
- <td>SPT N-Design Calculation</td>
91
- </tr>
92
- <tr>
93
- <td><strong>Bearing Capacity Estimation</strong></td>
94
- <td>Allowable Bearing Capacity Estimation</td>
95
- </tr>
96
- <tr>
97
- <td></td>
98
- <td>Ultimate Bearing Capacity Estimation</td>
99
- </tr>
100
- </table>
101
-
102
- 2. `geolysis.gui`
103
-
104
- A graphical user interface that allows users to interact with the `geolysis`
105
- package. Through this interface, users can view generated reports and
106
- visualizations, such as Particle Size Distribution (PSD) curves, Atterberg
107
- Limits plots, and Compaction curves, among others.
108
-
109
- 3. `geolysis.excel`
110
-
111
- An add-in for Microsoft Excel that performs simple geotechnical analysis.
112
- It offers some features similar to `geolysis.gui` within Microsoft Excel.
113
- Below is an example of the Microsoft Excel addin.
114
-
115
- <div align="center">
116
- <img src="https://raw.githubusercontent.com/patrickboateng/geolysis/main/docs/_static/geolysis_excel_example.gif"
117
- alt="geolysis excel example" width="100%" />
118
- </div><br>
119
-
120
- 4. `geolysis.ai`
121
-
122
- Offers machine learning models that are trained using geotechnical data.
123
-
124
- ## Project Structure
125
-
126
- .
127
- ├── .github # GitHub Actions
128
- ├── docs # Documentation files
129
- ├── geolysis # Source files
130
- ├── tests # Automated tests
131
- └── README.md
132
-
133
- ## Table of Contents
134
-
135
- - [Installation](#installation)
136
- - [Usage Example](#usage-example)
137
- - [Documentation](#documentation)
138
- - [Contributing](#contributing)
139
- - [License](#license)
140
- - [Contact](#contact)
141
-
142
- ## Installation
143
-
144
- ```shell
145
- $ pip install geolysis
146
- ```
147
-
148
- ## Usage Example
149
-
150
- ```python
151
-
152
- >>> from geolysis.soil_classifier import create_soil_classifier
153
- >>> uscs_clf = create_soil_classifier(liquid_limit=34.1,
154
- ... plastic_limit=21.1,
155
- ... fines=47.88,
156
- ... sand=37.84,
157
- ... clf_type="USCS")
158
- >>> clf = uscs_clf.classify()
159
- >>> clf
160
- SoilClf(symbol='SC', description='Clayey sands')
161
- >>> clf.symbol
162
- 'SC'
163
- >>> clf.description
164
- 'Clayey sands'
165
-
166
- ```
167
-
168
- ```python
169
-
170
- >>> from geolysis.soil_classifier import create_soil_classifier
171
- >>> aashto_clf = create_soil_classifier(liquid_limit=34.1,
172
- ... plastic_limit=21.1,
173
- ... fines=47.88,
174
- ... clf_type="AASHTO")
175
- >>> clf = aashto_clf.classify()
176
- >>> clf
177
- SoilClf(symbol='A-6(4)', description='Clayey soils')
178
- >>> clf.symbol
179
- 'A-6(4)'
180
- >>> clf.description
181
- 'Clayey soils'
182
-
183
- ```
184
-
185
- Check out more examples
186
- [here](https://docs.geolysis.io/en/latest/user_guide/getting_started.html#quick-start)
187
-
188
- ## Documentation
189
-
190
- Full documentation is available [here](https://docs.geolysis.io/en/latest/)
191
-
192
- ## Contributing
193
-
194
- Contribution guidelines can be
195
- found [here](https://docs.geolysis.io/en/latest/dev_guide/index.html)
196
-
197
- ## License
198
-
199
- This project is licensed under the MIT License - see the
200
- [LICENSE](https://github.com/patrickboateng/geolysis/blob/main/LICENSE.txt)
201
- file for more details.
202
-
203
- ## Contact
204
-
205
- For questions or feedback, please
206
- contact [boatengpato.pb@gmail.com](mailto:boatengpato.pb@gmail.com)