geolysis 0.10.3__py3-none-any.whl → 0.12.0__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.
@@ -35,8 +35,7 @@ class _Clf(tuple, enum.Enum):
35
35
 
36
36
 
37
37
  class USCSSymbol(_Clf):
38
- """
39
- Unified Soil Classification System (USCS) symbols and descriptions.
38
+ """Unified Soil Classification System (USCS) symbols and descriptions.
40
39
 
41
40
  Each member represents a USCS soil type, grading, or plasticity symbol.
42
41
  Aliases are provided where applicable.
@@ -354,8 +353,7 @@ class _SizeDistribution:
354
353
  Features obtained from the Particle Size Distribution graph.
355
354
  """
356
355
 
357
- def __init__(self, d_10: float = 0.0, d_30: float = 0.0,
358
- d_60: float = 0.0):
356
+ def __init__(self, d_10: float = 0.0, d_30: float = 0.0, d_60: float = 0.0):
359
357
  self.d_10 = d_10
360
358
  self.d_30 = d_30
361
359
  self.d_60 = d_60
@@ -365,7 +363,7 @@ class _SizeDistribution:
365
363
 
366
364
  @property
367
365
  def coeff_of_curvature(self) -> float:
368
- return (self.d_30 ** 2.0) / (self.d_60 * self.d_10)
366
+ return (self.d_30**2.0) / (self.d_60 * self.d_10)
369
367
 
370
368
  @property
371
369
  def coeff_of_uniformity(self) -> float:
@@ -398,12 +396,12 @@ class PSD:
398
396
  """
399
397
 
400
398
  def __init__(
401
- self,
402
- fines: float,
403
- sand: float,
404
- d_10: float = 0,
405
- d_30: float = 0,
406
- d_60: float = 0,
399
+ self,
400
+ fines: float,
401
+ sand: float,
402
+ d_10: float = 0,
403
+ d_30: float = 0,
404
+ d_60: float = 0,
407
405
  ):
408
406
  """
409
407
  :param fines: Percentage of fines in soil sample (%) i.e. The
@@ -650,10 +648,10 @@ class USCS:
650
648
  """
651
649
 
652
650
  def __init__(
653
- self,
654
- atterberg_limits: AtterbergLimits,
655
- psd: PSD,
656
- organic=False,
651
+ self,
652
+ atterberg_limits: AtterbergLimits,
653
+ psd: PSD,
654
+ organic=False,
657
655
  ):
658
656
  """
659
657
  :param atterberg_limits: Atterberg limits of the soil.
@@ -780,9 +778,9 @@ class USCS:
780
778
 
781
779
 
782
780
  def create_aashto_classifier(
783
- liquid_limit: float,
784
- plastic_limit: float,
785
- fines: float,
781
+ liquid_limit: float,
782
+ plastic_limit: float,
783
+ fines: float,
786
784
  ) -> AASHTO:
787
785
  """A helper function that encapsulates the creation of a AASHTO
788
786
  classifier.
@@ -807,14 +805,14 @@ def create_aashto_classifier(
807
805
 
808
806
 
809
807
  def create_uscs_classifier(
810
- liquid_limit: float,
811
- plastic_limit: float,
812
- fines: float,
813
- sand: float,
814
- d_10: float = 0,
815
- d_30: float = 0,
816
- d_60: float = 0,
817
- organic: bool = False,
808
+ liquid_limit: float,
809
+ plastic_limit: float,
810
+ fines: float,
811
+ sand: float,
812
+ d_10: float = 0,
813
+ d_30: float = 0,
814
+ d_60: float = 0,
815
+ organic: bool = False,
818
816
  ):
819
817
  """A helper function that encapsulates the creation of a USCS
820
818
  classifier.
geolysis/spt.py CHANGED
@@ -61,9 +61,9 @@ class SPT:
61
61
  """
62
62
 
63
63
  def __init__(
64
- self,
65
- corrected_spt_n_values: Sequence[float],
66
- method: SPTDesignMethod.WEIGHTED = "wgt",
64
+ self,
65
+ corrected_spt_n_values: Sequence[float],
66
+ method: SPTDesignMethod.WEIGHTED = "wgt",
67
67
  ):
68
68
  """
69
69
  :param corrected_spt_n_values: Corrected SPT N-values within the
@@ -82,12 +82,12 @@ class SPT:
82
82
  @corrected_spt_n_values.setter
83
83
  @validate_func_args
84
84
  def corrected_spt_n_values(
85
- self,
86
- corrected_spt_n_values: Annotated[
87
- Sequence[float],
88
- MustHaveLengthGreaterThan(1),
89
- MustHaveValuesBetween(min_value=1.0, max_value=100.0),
90
- ],
85
+ self,
86
+ corrected_spt_n_values: Annotated[
87
+ Sequence[float],
88
+ MustHaveLengthGreaterThan(1),
89
+ MustHaveValuesBetween(min_value=1.0, max_value=100.0),
90
+ ],
91
91
  ) -> None:
92
92
  self._corrected_spt_n_values = corrected_spt_n_values
93
93
 
@@ -115,7 +115,7 @@ class SPT:
115
115
  sum_wgts = 0.0
116
116
 
117
117
  for i, corr_spt_n_val in enumerate(vals, start=1):
118
- wgt = 1 / i ** 2
118
+ wgt = 1 / i**2
119
119
  sum_total += wgt * corr_spt_n_val
120
120
  sum_wgts += wgt
121
121
 
@@ -220,14 +220,14 @@ class EnergyCorrection:
220
220
  }
221
221
 
222
222
  def __init__(
223
- self,
224
- recorded_spt_n_value: int,
225
- *,
226
- energy_percentage=0.6,
227
- borehole_diameter=65.0,
228
- rod_length=3.0,
229
- hammer_type=HammerType.DONUT_1,
230
- sampler_type=SamplerType.STANDARD,
223
+ self,
224
+ recorded_spt_n_value: int,
225
+ *,
226
+ energy_percentage=0.6,
227
+ borehole_diameter=65.0,
228
+ rod_length=3.0,
229
+ hammer_type=HammerType.DONUT_1,
230
+ sampler_type=SamplerType.STANDARD,
231
231
  ):
232
232
  """
233
233
  :param recorded_spt_n_value: Recorded SPT N-value from field.
@@ -254,8 +254,7 @@ class EnergyCorrection:
254
254
  @recorded_spt_n_value.setter
255
255
  @validate_func_args
256
256
  def recorded_spt_n_value(
257
- self,
258
- val: Annotated[int, MustBeBetween(min_value=0, max_value=100)]
257
+ self, val: Annotated[int, MustBeBetween(min_value=0, max_value=100)]
259
258
  ) -> None:
260
259
  self._recorded_spt_value = val
261
260
 
@@ -267,8 +266,7 @@ class EnergyCorrection:
267
266
  @energy_percentage.setter
268
267
  @validate_func_args
269
268
  def energy_percentage(
270
- self,
271
- val: Annotated[float, MustBeBetween(min_value=0.0, max_value=1.0)]
269
+ self, val: Annotated[float, MustBeBetween(min_value=0.0, max_value=1.0)]
272
270
  ) -> None:
273
271
  self._energy_percentage = val
274
272
 
@@ -280,8 +278,7 @@ class EnergyCorrection:
280
278
  @borehole_diameter.setter
281
279
  @validate_func_args
282
280
  def borehole_diameter(
283
- self, val: Annotated[
284
- float, MustBeBetween(min_value=65.0, max_value=200.0)]
281
+ self, val: Annotated[float, MustBeBetween(min_value=65.0, max_value=200.0)]
285
282
  ) -> None:
286
283
  self._borehole_diameter = val
287
284
 
@@ -302,8 +299,7 @@ class EnergyCorrection:
302
299
  @hammer_type.setter
303
300
  @validate_func_args
304
301
  def hammer_type(
305
- self,
306
- hammer_type: Annotated[HammerType, MustBeMemberOf(HammerType)]
302
+ self, hammer_type: Annotated[HammerType, MustBeMemberOf(HammerType)]
307
303
  ):
308
304
  self._hammer_type = hammer_type
309
305
 
@@ -313,8 +309,7 @@ class EnergyCorrection:
313
309
 
314
310
  @sampler_type.setter
315
311
  @validate_func_args
316
- def sampler_type(self,
317
- val: Annotated[SamplerType, MustBeMemberOf(SamplerType)]):
312
+ def sampler_type(self, val: Annotated[SamplerType, MustBeMemberOf(SamplerType)]):
318
313
  self._sampler_type = val
319
314
 
320
315
  @property
@@ -362,10 +357,10 @@ class EnergyCorrection:
362
357
  `ENERGY`: 0.6, 0.55, etc
363
358
  """
364
359
  numerator = (
365
- self.hammer_efficiency
366
- * self.borehole_diameter_correction
367
- * self.sampler_correction
368
- * self.rod_length_correction
360
+ self.hammer_efficiency
361
+ * self.borehole_diameter_correction
362
+ * self.sampler_correction
363
+ * self.rod_length_correction
369
364
  )
370
365
  return numerator / self.energy_percentage
371
366
 
@@ -406,29 +401,17 @@ class OPC:
406
401
  @std_spt_n_value.setter
407
402
  @validate_func_args
408
403
  def std_spt_n_value(
409
- self, val: Annotated[
410
- float, MustBeBetween(min_value=0.0, max_value=100.0)]
404
+ self, val: Annotated[float, MustBeBetween(min_value=0.0, max_value=100.0)]
411
405
  ):
412
406
  self._std_spt_n_value = val
413
407
 
414
408
  @round_(ndigits=1)
415
409
  def corrected_spt_n_value(self) -> float:
416
- r"""Corrected SPT N-value.
417
-
418
- $$
419
- (N_1)_{60} = C_N \cdot N_{60}
420
- $$
421
-
422
- !!! note
423
-
424
- `60` is used in this case to represent `60%` hammer
425
- efficiency and can be any percentage of hammer efficiency
426
- e.g. $N_{55}$ for `55%` hammer efficiency.
427
- """
428
- corrected_spt = self.correction() * self.std_spt_n_value
410
+ r"""Corrected SPT N-value."""
429
411
  # Corrected SPT should not be more
430
412
  # than 2 times the Standardized SPT
431
- return min(corrected_spt, 2 * self.std_spt_n_value)
413
+ correction = min(self.correction(), 2.0)
414
+ return correction * self.std_spt_n_value
432
415
 
433
416
  @abstractmethod
434
417
  def correction(self) -> float:
@@ -447,22 +430,11 @@ class GibbsHoltzOPC(OPC):
447
430
 
448
431
  @eop.setter
449
432
  @validate_func_args
450
- def eop(self, val: Annotated[
451
- float, MustBeBetween(min_value=0.0, max_value=280.0)]):
433
+ def eop(self, val: Annotated[float, MustBeBetween(min_value=0.0, max_value=280.0)]):
452
434
  self._eop = val
453
435
 
454
436
  def correction(self) -> float:
455
- r"""SPT Correction.
456
-
457
- $$
458
- C_N = \dfrac{350}{\sigma_o + 70} \, \sigma_o \le 280kN/m^2
459
- $$
460
-
461
- $\frac{N_c}{N_{60}}$ should lie between 0.45 and 2.0, if
462
- $\frac{N_c}{N_{60}}$ is greater than 2.0, :math:`N_c` should be
463
- divided by 2.0 to obtain the design value used in finding the
464
- bearing capacity of the soil.
465
- """
437
+ r"""SPT Correction."""
466
438
  corr = 350.0 / (self.eop + 70.0)
467
439
  return corr / 2.0 if corr > 2.0 else corr
468
440
 
@@ -476,22 +448,7 @@ class BazaraaPeckOPC(OPC):
476
448
  STD_PRESSURE: Final = 71.8
477
449
 
478
450
  def correction(self) -> float:
479
- r"""SPT Correction.
480
-
481
- $$
482
- C_N = \dfrac{4}{1 + 0.0418 \cdot \sigma_o}, \,
483
- \sigma_o \lt 71.8kN/m^2
484
- $$
485
-
486
- $$
487
- C_N = \dfrac{4}{3.25 + 0.0104 \cdot \sigma_o},
488
- \, \sigma_o \gt 71.8kN/m^2
489
- $$
490
-
491
- $$
492
- C_N = 1 \, , \, \sigma_o = 71.8kN/m^2
493
- $$
494
- """
451
+ r"""SPT Correction."""
495
452
  if isclose(self.eop, self.STD_PRESSURE, rel_tol=0.01):
496
453
  corr = 1.0
497
454
  elif self.eop < self.STD_PRESSURE:
@@ -517,12 +474,7 @@ class PeckOPC(OPC):
517
474
  self._eop = val
518
475
 
519
476
  def correction(self) -> float:
520
- r"""SPT Correction.
521
-
522
- $$
523
- C_N = 0.77 \log \left(\dfrac{2000}{\sigma_o} \right)
524
- $$
525
- """
477
+ r"""SPT Correction."""
526
478
  return 0.77 * log10(2000.0 / self.eop)
527
479
 
528
480
 
@@ -532,12 +484,7 @@ class LiaoWhitmanOPC(OPC):
532
484
  """
533
485
 
534
486
  def correction(self) -> float:
535
- r"""SPT Correction.
536
-
537
- $$
538
- C_N = \sqrt{\dfrac{100}{\sigma_o}}
539
- $$
540
- """
487
+ r"""SPT Correction."""
541
488
  return sqrt(100.0 / self.eop)
542
489
 
543
490
 
@@ -545,12 +492,7 @@ class SkemptonOPC(OPC):
545
492
  """Overburden Pressure Correction according to `Skempton (1986)`."""
546
493
 
547
494
  def correction(self) -> float:
548
- r"""SPT Correction.
549
-
550
- $$
551
- C_N = \dfrac{2}{1 + 0.01044 \cdot \sigma_o}
552
- $$
553
- """
495
+ r"""SPT Correction."""
554
496
  return 2.0 / (1.0 + 0.01044 * self.eop)
555
497
 
556
498
 
@@ -580,32 +522,20 @@ class DilatancyCorrection:
580
522
  @corr_spt_n_value.setter
581
523
  @validate_func_args
582
524
  def corr_spt_n_value(
583
- self, val: Annotated[
584
- float, MustBeBetween(min_value=0.0, max_value=100.0)]
525
+ self, val: Annotated[float, MustBeBetween(min_value=0.0, max_value=100.0)]
585
526
  ):
586
527
  self._corr_spt_n_value = val
587
528
 
588
529
  @round_(ndigits=1)
589
530
  def corrected_spt_n_value(self) -> float:
590
- r"""Corrected SPT N-value.
591
-
592
- $$
593
- (N_1)_{60} = 15 + \dfrac{1}{2}((N_1)_{60} - 15) \, , \,
594
- (N_1)_{60} \gt 15
595
- $$
596
-
597
- $$
598
- (N_1)_{60} = (N_1)_{60} \, , \, (N_1)_{60} \le 15
599
- $$
600
- """
531
+ r"""Corrected SPT N-value."""
601
532
  if self.corr_spt_n_value <= 15.0:
602
533
  return self.corr_spt_n_value
603
534
  return 15.0 + 0.5 * (self.corr_spt_n_value - 15.0)
604
535
 
605
536
 
606
537
  class OPCType(AbstractStrEnum):
607
- """
608
- Enumeration of overburden pressure correction (OPC) methods.
538
+ """Enumeration of overburden pressure correction (OPC) methods.
609
539
 
610
540
  Each member represents a method used to correct SPT results
611
541
  for the effects of overburden pressure in geotechnical design.
@@ -638,18 +568,16 @@ _opctypes = {
638
568
 
639
569
  @validate_func_args
640
570
  def create_overburden_pressure_correction(
641
- std_spt_n_value: float,
642
- eop: float,
643
- opc_type: Annotated[OPCType | str, MustBeMemberOf(OPCType)] = "gibbs",
571
+ std_spt_n_value: float,
572
+ eop: float,
573
+ opc_type: Annotated[OPCType | str, MustBeMemberOf(OPCType)] = "gibbs",
644
574
  ):
645
575
  """A factory function that encapsulates the creation of overburden
646
576
  pressure correction.
647
577
 
648
578
  :param std_spt_n_value: SPT N-value standardized for field
649
579
  procedures.
650
-
651
580
  :param eop: Effective overburden pressure ($kPa$).
652
-
653
581
  :param opc_type: Overburden Pressure Correction type to apply.
654
582
  """
655
583
  opc_type = OPCType(opc_type)
@@ -1,31 +1,12 @@
1
1
  import enum
2
2
  import functools
3
- import math
4
- from math import exp, inf, isclose, log10, pi, sqrt
5
- from statistics import fmean as mean
6
3
  from typing import Callable
7
4
 
8
5
  from func_validator import ValidationError
9
6
 
10
- __all__ = [
11
- "AbstractStrEnum",
12
- "ValidationError",
13
- "inf",
14
- "pi",
15
- "deg2rad",
16
- "rad2deg",
17
- "tan",
18
- "cot",
19
- "sin",
20
- "cos",
21
- "arctan",
22
- "round_",
23
- "mean",
24
- "exp",
25
- "isclose",
26
- "log10",
27
- "sqrt",
28
- ]
7
+ from .math import *
8
+
9
+ __all__ = ["AbstractStrEnum", "ValidationError", "add_repr", "round_"]
29
10
 
30
11
 
31
12
  class StrEnumMeta(enum.EnumMeta):
@@ -46,39 +27,21 @@ class AbstractStrEnum(enum.StrEnum, metaclass=StrEnumMeta):
46
27
  """
47
28
 
48
29
 
49
- def deg2rad(x: float, /) -> float:
50
- """Convert angle x from degrees to radians."""
51
- return math.radians(x)
52
-
53
-
54
- def rad2deg(x: float, /) -> float:
55
- """Convert angle x from radians to degrees."""
56
- return math.degrees(x)
57
-
58
-
59
- def tan(x: float, /) -> float:
60
- """Return the tangent of x (measured in degrees)."""
61
- return math.tan(deg2rad(x))
62
-
63
-
64
- def cot(x: float, /) -> float:
65
- """Return the cotangent of x (measured in degrees)."""
66
- return 1 / tan(x)
67
-
68
-
69
- def sin(x: float, /) -> float:
70
- """Return the sine of x (measured in degrees)."""
71
- return math.sin(deg2rad(x))
30
+ def add_repr(cls):
31
+ """A class decorator that adds a __repr__ method to the class."""
72
32
 
33
+ def __repr__(self) -> str:
34
+ inst_attrs = self.__dict__
35
+ attrs = (f"{key.strip('_')}={val}" for key, val in inst_attrs.items())
36
+ return f"{type(self).__name__}({', '.join(attrs)})"
73
37
 
74
- def cos(x: float, /) -> float:
75
- """Return the cosine of x (measured in degrees)."""
76
- return math.cos(deg2rad(x))
38
+ def __str__(self) -> str:
39
+ return repr(self)
77
40
 
41
+ cls.__repr__ = __repr__
42
+ cls.__str__ = __str__
78
43
 
79
- def arctan(x: float, /) -> float:
80
- """Return the arc tangent (measured in degrees) of x."""
81
- return rad2deg(math.atan(x))
44
+ return cls
82
45
 
83
46
 
84
47
  def round_(ndigits: int) -> Callable:
geolysis/utils/math.py ADDED
@@ -0,0 +1,57 @@
1
+ import math
2
+ from math import exp, inf, isclose, log10, pi, sqrt, isinf, atan
3
+ from statistics import fmean as mean
4
+
5
+ __all__ = [
6
+ "atan",
7
+ "inf",
8
+ "isinf",
9
+ "pi",
10
+ "deg2rad",
11
+ "rad2deg",
12
+ "tandeg",
13
+ "cotdeg",
14
+ "sindeg",
15
+ "cosdeg",
16
+ "arctandeg",
17
+ "mean",
18
+ "exp",
19
+ "isclose",
20
+ "log10",
21
+ "sqrt",
22
+ ]
23
+
24
+
25
+ def deg2rad(x: float, /) -> float:
26
+ """Convert angle x from degrees to radians."""
27
+ return math.radians(x)
28
+
29
+
30
+ def rad2deg(x: float, /) -> float:
31
+ """Convert angle x from radians to degrees."""
32
+ return math.degrees(x)
33
+
34
+
35
+ def tandeg(x: float, /) -> float:
36
+ """Return the tangent of x (measured in degrees)."""
37
+ return math.tan(deg2rad(x))
38
+
39
+
40
+ def cotdeg(x: float, /) -> float:
41
+ """Return the cotangent of x (measured in degrees)."""
42
+ return 1 / tandeg(x)
43
+
44
+
45
+ def sindeg(x: float, /) -> float:
46
+ """Return the sine of x (measured in degrees)."""
47
+ return math.sin(deg2rad(x))
48
+
49
+
50
+ def cosdeg(x: float, /) -> float:
51
+ """Return the cosine of x (measured in degrees)."""
52
+ return math.cos(deg2rad(x))
53
+
54
+
55
+ def arctandeg(x: float, /) -> float:
56
+ """Return the arc tangent (measured in degrees) of x."""
57
+ return rad2deg(math.atan(x))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: geolysis
3
- Version: 0.10.3
3
+ Version: 0.12.0
4
4
  Summary: geolysis is an opensource software for geotechnical engineering analysis and modeling.
5
5
  Author-email: Patrick Boateng <boatengpato.pb@gmail.com>
6
6
  License: MIT License
@@ -57,7 +57,8 @@ The `geolysis` python package is among three other projects, `geolysis.excel`,
57
57
  `geolysis.gui`, and `geolysis.ai`. More details about these projects are
58
58
  provided [here](https://github.com/geolysis-dev).
59
59
 
60
- `geolysis` has only one project dependency which is [func-validator](https://github.com/patrickboateng/func-validator/)
60
+ `geolysis` has only one project dependency which
61
+ is [func-validator](https://github.com/patrickboateng/func-validator/)
61
62
  for validating `function` (and `method`) arguments.
62
63
 
63
64
  The rest of this **README** provides an overview of the `geolysis` python
@@ -83,58 +84,64 @@ $ pip install geolysis
83
84
 
84
85
  ## API Reference
85
86
 
86
- - [Python API](https://docs.geolysis.io/en/latest/reference/)
87
- - [geolysis.bearing_capacity.abc](https://docs.geolysis.io/en/latest/reference/allowable_bearing_capacity/) - _Allowable bearing capacity
87
+ - [Python API](https://docs.geolysis.io/en/latest/reference/)
88
+ - [geolysis.bearing_capacity.abc](https://docs.geolysis.io/en/latest/reference/allowable_bearing_capacity/) -
89
+ _Allowable bearing capacity
88
90
  estimation_
89
- - [geolysis.bearing_capacity.ubc](https://docs.geolysis.io/en/latest/reference/ultimate_bearing_capacity/) - _Ultimate bearing capacity
91
+ - [geolysis.bearing_capacity.ubc](https://docs.geolysis.io/en/latest/reference/ultimate_bearing_capacity/) -
92
+ _Ultimate bearing capacity
90
93
  estimation_
91
- - [geolysis.foundation](https://docs.geolysis.io/en/latest/reference/foundation/) - _Foundation Representation_
92
- - [geolysis.soil_classifier](https://docs.geolysis.io/en/latest/reference/soil_classifier/) - _Soil classification_
93
- - [geolysis.spt](https://docs.geolysis.io/en/latest/reference/spt/) - _Standard Penetration Test (SPT) Analysis_
94
- - [geolysis.utils](https://docs.geolysis.io/en/latest/reference/utils/) - _Utilities_
95
-
94
+ - [geolysis.foundation](https://docs.geolysis.io/en/latest/reference/foundation/) -
95
+ _Foundation Representation_
96
+ - [geolysis.soil_classifier](https://docs.geolysis.io/en/latest/reference/soil_classifier/) -
97
+ _Soil classification_
98
+ - [geolysis.spt](https://docs.geolysis.io/en/latest/reference/spt/) -
99
+ _Standard Penetration Test (SPT) Analysis_
100
+ - [geolysis.utils](https://docs.geolysis.io/en/latest/reference/utils/) -
101
+ _Utilities_
96
102
 
97
103
  ## Imports
98
104
 
99
- - **Bearing Capacity**
100
-
101
- - **Allowable Bearing Capacity (ABC)**
102
-
103
- ```python
104
- from geolysis.bearing_capacity.abc import create_abc_4_cohesionless_soils
105
- ```
106
-
107
- - **Ultimate Bearing Capacity (UBC)**
108
-
109
- ```python
110
- from geolysis.bearing_capacity.ubc import create_ubc_4_all_soil_types
111
- ```
112
-
113
- - **Foundation**
114
-
115
- ```python
116
- from geolysis.foundation import create_foundation
117
- ```
105
+ ### Bearing Capacity
106
+
107
+ - **Allowable Bearing Capacity (ABC)**
108
+
109
+ ```python
110
+ from geolysis.bearing_capacity.abc import create_abc_4_cohesionless_soils
111
+ ```
118
112
 
113
+ - **Ultimate Bearing Capacity (UBC)**
119
114
 
120
- - **Soil Classification**
121
-
122
115
  ```python
123
- from geolysis.soil_classifier import create_uscs_classifier
124
- from geolysis.soil_classifier import create_aashto_classifier
116
+ from geolysis.bearing_capacity.ubc import create_ubc_4_all_soil_types
125
117
  ```
126
-
127
- - **Standard Penetration Test (SPT) Analysis**
128
-
118
+
119
+ ### Foundation
120
+
121
+ ```python
122
+ from geolysis.foundation import create_foundation
123
+ ```
124
+
125
+ ### Soil Classification
126
+
127
+ ```python
128
+ from geolysis.soil_classifier import create_uscs_classifier
129
+ from geolysis.soil_classifier import create_aashto_classifier
130
+ ```
131
+
132
+ ### Standard Penetration Test (SPT) Analysis
133
+
129
134
  ```python
130
135
  from geolysis.spt import DilatancyCorrection
131
136
  from geolysis.spt import EnergyCorrection
132
137
  from geolysis.spt import SPT
133
138
  from geolysis.spt import create_overburden_pressure_correction
134
139
  ```
135
-
140
+
136
141
  ## Project Structure
137
142
 
143
+ These are the main components of the project structure
144
+
138
145
  .
139
146
  ├── .github # GitHub Actions
140
147
  ├── docs # Documentation files
@@ -171,7 +178,8 @@ Check out the full [documentation](https://docs.geolysis.io/en/latest/).
171
178
 
172
179
  ## Contributing
173
180
 
174
- Check out the [contribution guidelines](https://docs.geolysis.io/en/latest/dev_guide/)
181
+ Check out
182
+ the [contribution guidelines](https://docs.geolysis.io/en/latest/dev_guide/)
175
183
 
176
184
  ## License
177
185