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.
- geolysis/__init__.py +3 -3
- geolysis/bearing_capacity/abc/__init__.py +21 -0
- geolysis/bearing_capacity/abc/_cohl/__init__.py +109 -0
- geolysis/bearing_capacity/abc/{cohl → _cohl}/_core.py +25 -8
- geolysis/bearing_capacity/abc/_cohl/bowles_abc.py +103 -0
- geolysis/bearing_capacity/abc/_cohl/meyerhof_abc.py +100 -0
- geolysis/bearing_capacity/abc/_cohl/terzaghi_abc.py +148 -0
- geolysis/bearing_capacity/ubc/__init__.py +107 -128
- geolysis/bearing_capacity/ubc/_core.py +82 -52
- geolysis/bearing_capacity/ubc/_hansen_ubc.py +271 -0
- geolysis/bearing_capacity/ubc/_terzaghi_ubc.py +178 -0
- geolysis/bearing_capacity/ubc/_vesic_ubc.py +253 -0
- geolysis/foundation.py +146 -136
- geolysis/soil_classifier.py +386 -290
- geolysis/spt.py +323 -257
- geolysis/{utils/__init__.py → utils.py} +44 -33
- geolysis-0.10.1.dist-info/METADATA +182 -0
- geolysis-0.10.1.dist-info/RECORD +22 -0
- {geolysis-0.9.0.dist-info → geolysis-0.10.1.dist-info}/WHEEL +1 -1
- geolysis/bearing_capacity/abc/cohl/__init__.py +0 -137
- geolysis/bearing_capacity/abc/cohl/bowles_abc.py +0 -96
- geolysis/bearing_capacity/abc/cohl/meyerhof_abc.py +0 -96
- geolysis/bearing_capacity/abc/cohl/terzaghi_abc.py +0 -131
- geolysis/bearing_capacity/ubc/hansen_ubc.py +0 -287
- geolysis/bearing_capacity/ubc/terzaghi_ubc.py +0 -246
- geolysis/bearing_capacity/ubc/vesic_ubc.py +0 -293
- geolysis/utils/exceptions.py +0 -65
- geolysis/utils/validators.py +0 -119
- geolysis-0.9.0.dist-info/METADATA +0 -206
- geolysis-0.9.0.dist-info/RECORD +0 -24
- {geolysis-0.9.0.dist-info → geolysis-0.10.1.dist-info}/licenses/LICENSE.txt +0 -0
- {geolysis-0.9.0.dist-info → geolysis-0.10.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,271 @@
|
|
1
|
+
from geolysis.foundation import Shape
|
2
|
+
from geolysis.utils import cos, cot, exp, isclose, pi, round_, sin, tan
|
3
|
+
|
4
|
+
from ._core import UltimateBearingCapacity
|
5
|
+
|
6
|
+
__all__ = ["HansenUltimateBearingCapacity"]
|
7
|
+
|
8
|
+
|
9
|
+
class HansenBearingCapacityFactors:
|
10
|
+
|
11
|
+
@staticmethod
|
12
|
+
@round_(ndigits=2)
|
13
|
+
def n_c(friction_angle: float) -> float:
|
14
|
+
if isclose(friction_angle, 0.0):
|
15
|
+
return 5.14
|
16
|
+
return cot(friction_angle) * (
|
17
|
+
HansenBearingCapacityFactors.n_q(friction_angle) - 1.0
|
18
|
+
)
|
19
|
+
|
20
|
+
@staticmethod
|
21
|
+
@round_(ndigits=2)
|
22
|
+
def n_q(friction_angle: float) -> float:
|
23
|
+
return tan(45.0 + friction_angle / 2.0) ** 2.0 * exp(pi * tan(friction_angle))
|
24
|
+
|
25
|
+
@staticmethod
|
26
|
+
@round_(ndigits=2)
|
27
|
+
def n_gamma(friction_angle: float) -> float:
|
28
|
+
return (
|
29
|
+
1.8
|
30
|
+
* (HansenBearingCapacityFactors.n_q(friction_angle) - 1.0)
|
31
|
+
* tan(friction_angle)
|
32
|
+
)
|
33
|
+
|
34
|
+
|
35
|
+
class HansenShapeFactors:
|
36
|
+
|
37
|
+
@staticmethod
|
38
|
+
@round_(ndigits=2)
|
39
|
+
def s_c(f_width: float, f_length: float, f_shape: Shape) -> float:
|
40
|
+
if f_shape == Shape.STRIP:
|
41
|
+
return 1.0
|
42
|
+
elif f_shape == Shape.RECTANGLE:
|
43
|
+
return 1.0 + 0.2 * f_width / f_length
|
44
|
+
else: # SQUARE & CIRCLE
|
45
|
+
return 1.3
|
46
|
+
|
47
|
+
@staticmethod
|
48
|
+
@round_(ndigits=2)
|
49
|
+
def s_q(f_width: float, f_length: float, f_shape: Shape) -> float:
|
50
|
+
if f_shape == Shape.STRIP:
|
51
|
+
return 1.0
|
52
|
+
elif f_shape == Shape.RECTANGLE:
|
53
|
+
return 1.0 + 0.2 * f_width / f_length
|
54
|
+
else: # SQUARE & CIRCLE
|
55
|
+
return 1.2
|
56
|
+
|
57
|
+
@staticmethod
|
58
|
+
@round_(ndigits=2)
|
59
|
+
def s_gamma(f_width: float, f_length: float, f_shape: Shape) -> float:
|
60
|
+
if f_shape == Shape.STRIP:
|
61
|
+
return 1.0
|
62
|
+
elif f_shape == Shape.RECTANGLE:
|
63
|
+
return 1.0 - 0.4 * f_width / f_length
|
64
|
+
elif f_shape == Shape.SQUARE:
|
65
|
+
return 0.8
|
66
|
+
else: # CIRCLE
|
67
|
+
return 0.6
|
68
|
+
|
69
|
+
|
70
|
+
class HansenDepthFactors:
|
71
|
+
|
72
|
+
@staticmethod
|
73
|
+
@round_(ndigits=2)
|
74
|
+
def d_c(f_depth: float, f_width: float) -> float:
|
75
|
+
return 1.0 + 0.35 * f_depth / f_width
|
76
|
+
|
77
|
+
@staticmethod
|
78
|
+
@round_(ndigits=2)
|
79
|
+
def d_q(f_depth: float, f_width: float) -> float:
|
80
|
+
return HansenDepthFactors.d_c(f_depth, f_width)
|
81
|
+
|
82
|
+
@staticmethod
|
83
|
+
@round_(ndigits=2)
|
84
|
+
def d_gamma() -> float:
|
85
|
+
return 1.0
|
86
|
+
|
87
|
+
|
88
|
+
class HansenInclinationFactors:
|
89
|
+
|
90
|
+
@staticmethod
|
91
|
+
@round_(ndigits=2)
|
92
|
+
def i_c(
|
93
|
+
cohesion: float,
|
94
|
+
load_angle: float,
|
95
|
+
f_width: float,
|
96
|
+
f_length: float,
|
97
|
+
) -> float:
|
98
|
+
return 1.0 - sin(load_angle) / (2.0 * cohesion * f_width * f_length)
|
99
|
+
|
100
|
+
@staticmethod
|
101
|
+
@round_(ndigits=2)
|
102
|
+
def i_q(load_angle: float) -> float:
|
103
|
+
return 1.0 - (1.5 * sin(load_angle)) / cos(load_angle)
|
104
|
+
|
105
|
+
@staticmethod
|
106
|
+
@round_(ndigits=2)
|
107
|
+
def i_gamma(load_angle: float) -> float:
|
108
|
+
return HansenInclinationFactors.i_q(load_angle) ** 2.0
|
109
|
+
|
110
|
+
|
111
|
+
class HansenUltimateBearingCapacity(UltimateBearingCapacity):
|
112
|
+
r"""Ultimate bearing capacity for soils according to `Hansen (1961)`."""
|
113
|
+
|
114
|
+
@property
|
115
|
+
def n_c(self) -> float:
|
116
|
+
r"""Bearing capacity factor $N_c$.
|
117
|
+
|
118
|
+
$$
|
119
|
+
N_c = \cot(\phi) \left(N_q - 1\right)
|
120
|
+
$$
|
121
|
+
"""
|
122
|
+
return HansenBearingCapacityFactors.n_c(self.friction_angle)
|
123
|
+
|
124
|
+
@property
|
125
|
+
def n_q(self) -> float:
|
126
|
+
r"""Bearing capacity factor $N_q$.
|
127
|
+
|
128
|
+
$$
|
129
|
+
N_q = \tan^2\left(45 + \frac{\phi}{2}\right) \cdot e^{\pi \tan(\phi)}
|
130
|
+
$$
|
131
|
+
"""
|
132
|
+
return HansenBearingCapacityFactors.n_q(self.friction_angle)
|
133
|
+
|
134
|
+
@property
|
135
|
+
def n_gamma(self) -> float:
|
136
|
+
r"""Bearing capacity factor $N_{\gamma}$.
|
137
|
+
|
138
|
+
$$
|
139
|
+
N_{\gamma} = 1.8 \left(N_q - 1\right) \tan(\phi)
|
140
|
+
$$
|
141
|
+
"""
|
142
|
+
return HansenBearingCapacityFactors.n_gamma(self.friction_angle)
|
143
|
+
|
144
|
+
@property
|
145
|
+
def s_c(self) -> float:
|
146
|
+
r"""Shape factor $S_c$.
|
147
|
+
|
148
|
+
$$
|
149
|
+
s_c = 1.0 \rightarrow \text{Strip footing}
|
150
|
+
$$
|
151
|
+
|
152
|
+
$$
|
153
|
+
s_c = 1.0 + 0.2 \frac{B}{L} \rightarrow \text{Rectangular footing}
|
154
|
+
$$
|
155
|
+
|
156
|
+
$$
|
157
|
+
s_c = 1.3 \rightarrow \text{Square or circular footing}
|
158
|
+
$$
|
159
|
+
"""
|
160
|
+
width, length, shape = self.foundation_size.footing_params()
|
161
|
+
return HansenShapeFactors.s_c(width, length, shape)
|
162
|
+
|
163
|
+
@property
|
164
|
+
def s_q(self) -> float:
|
165
|
+
r"""Shape factor $S_q$.
|
166
|
+
|
167
|
+
$$
|
168
|
+
s_q = 1.0 \rightarrow \text{Strip footing}
|
169
|
+
$$
|
170
|
+
|
171
|
+
$$
|
172
|
+
s_q = 1.0 + 0.2 \cdot \frac{B}{L} \rightarrow \text{Rectangular footing}
|
173
|
+
$$
|
174
|
+
|
175
|
+
$$
|
176
|
+
s_q = 1.2 \rightarrow \text{Square or circular footing}
|
177
|
+
$$
|
178
|
+
"""
|
179
|
+
width, length, shape = self.foundation_size.footing_params()
|
180
|
+
return HansenShapeFactors.s_q(width, length, shape)
|
181
|
+
|
182
|
+
@property
|
183
|
+
def s_gamma(self) -> float:
|
184
|
+
r"""Shape factor $S_{\gamma}$.
|
185
|
+
|
186
|
+
$$
|
187
|
+
s_{\gamma} = 1.0 \rightarrow \text{Strip footing}
|
188
|
+
$$
|
189
|
+
|
190
|
+
$$
|
191
|
+
s_{\gamma} = 1.0 - 0.4 \frac{B}{L} \rightarrow
|
192
|
+
\text{Rectangular footing}
|
193
|
+
$$
|
194
|
+
|
195
|
+
$$
|
196
|
+
s_{\gamma} = 0.8 \rightarrow \text{Square footing}
|
197
|
+
$$
|
198
|
+
|
199
|
+
$$
|
200
|
+
s_{\gamma} = 0.6 \rightarrow \text{Circular footing}
|
201
|
+
$$
|
202
|
+
"""
|
203
|
+
width, length, shape = self.foundation_size.footing_params()
|
204
|
+
return HansenShapeFactors.s_gamma(width, length, shape)
|
205
|
+
|
206
|
+
@property
|
207
|
+
def d_c(self) -> float:
|
208
|
+
r"""Depth factor $D_c$.
|
209
|
+
|
210
|
+
$$
|
211
|
+
d_c = 1.0 + 0.35 \cdot \frac{D_f}{B}
|
212
|
+
$$
|
213
|
+
"""
|
214
|
+
depth = self.foundation_size.depth
|
215
|
+
width = self.foundation_size.width
|
216
|
+
return HansenDepthFactors.d_c(depth, width)
|
217
|
+
|
218
|
+
@property
|
219
|
+
def d_q(self) -> float:
|
220
|
+
r"""Depth factor $D_q$.
|
221
|
+
|
222
|
+
$$
|
223
|
+
d_q = 1.0 + 0.35 \cdot \frac{D_f}{B}
|
224
|
+
$$
|
225
|
+
"""
|
226
|
+
depth = self.foundation_size.depth
|
227
|
+
width = self.foundation_size.width
|
228
|
+
return HansenDepthFactors.d_q(depth, width)
|
229
|
+
|
230
|
+
@property
|
231
|
+
def d_gamma(self) -> float:
|
232
|
+
r"""Depth factor $D_{\gamma}$.
|
233
|
+
|
234
|
+
$$
|
235
|
+
d_{\gamma} = 1.0
|
236
|
+
$$
|
237
|
+
"""
|
238
|
+
return HansenDepthFactors.d_gamma()
|
239
|
+
|
240
|
+
@property
|
241
|
+
def i_c(self) -> float:
|
242
|
+
r"""Inclination factor $I_c$.
|
243
|
+
|
244
|
+
$$
|
245
|
+
I_c = 1 - \frac{\sin(\alpha)}{2cBL}
|
246
|
+
$$
|
247
|
+
"""
|
248
|
+
width, length = self.foundation_size.width, self.foundation_size.length
|
249
|
+
return HansenInclinationFactors.i_c(
|
250
|
+
self.cohesion, self.load_angle, width, length
|
251
|
+
)
|
252
|
+
|
253
|
+
@property
|
254
|
+
def i_q(self) -> float:
|
255
|
+
r"""Inclination factor $I_q$.
|
256
|
+
|
257
|
+
$$
|
258
|
+
I_q = 1 - \frac{1.5 \sin(\alpha)}{\cos(\alpha)}
|
259
|
+
$$
|
260
|
+
"""
|
261
|
+
return HansenInclinationFactors.i_q(self.load_angle)
|
262
|
+
|
263
|
+
@property
|
264
|
+
def i_gamma(self) -> float:
|
265
|
+
r"""Inclination factor $I_{\gamma}$.
|
266
|
+
|
267
|
+
$$
|
268
|
+
I_{\gamma} = I_q^2
|
269
|
+
$$
|
270
|
+
"""
|
271
|
+
return HansenInclinationFactors.i_gamma(self.load_angle)
|
@@ -0,0 +1,178 @@
|
|
1
|
+
from abc import ABC
|
2
|
+
|
3
|
+
from geolysis.utils import cos, cot, deg2rad, exp, isclose, pi, round_, tan
|
4
|
+
from ._core import UltimateBearingCapacity
|
5
|
+
|
6
|
+
__all__ = [
|
7
|
+
"TerzaghiUBC4StripFooting",
|
8
|
+
"TerzaghiUBC4CircularFooting",
|
9
|
+
"TerzaghiUBC4SquareFooting",
|
10
|
+
"TerzaghiUBC4RectangularFooting",
|
11
|
+
]
|
12
|
+
|
13
|
+
from geolysis.foundation import Foundation
|
14
|
+
|
15
|
+
|
16
|
+
class TerzaghiBearingCapacityFactors:
|
17
|
+
|
18
|
+
@staticmethod
|
19
|
+
@round_(ndigits=2)
|
20
|
+
def n_c(friction_angle: float) -> float:
|
21
|
+
if isclose(friction_angle, 0.0):
|
22
|
+
return 5.7
|
23
|
+
return cot(friction_angle) * (
|
24
|
+
TerzaghiBearingCapacityFactors.n_q(friction_angle) - 1.0
|
25
|
+
)
|
26
|
+
|
27
|
+
@staticmethod
|
28
|
+
@round_(ndigits=2)
|
29
|
+
def n_q(friction_angle: float) -> float:
|
30
|
+
return exp((3.0 * pi / 2.0 - deg2rad(friction_angle)) * tan(
|
31
|
+
friction_angle)) / (
|
32
|
+
2.0 * (cos(45.0 + friction_angle / 2.0)) ** 2.0
|
33
|
+
)
|
34
|
+
|
35
|
+
@staticmethod
|
36
|
+
@round_(ndigits=2)
|
37
|
+
def n_gamma(friction_angle: float) -> float:
|
38
|
+
return (TerzaghiBearingCapacityFactors.n_q(
|
39
|
+
friction_angle) - 1.0) * tan(
|
40
|
+
1.4 * friction_angle
|
41
|
+
)
|
42
|
+
|
43
|
+
|
44
|
+
class TerzaghiUltimateBearingCapacity(UltimateBearingCapacity, ABC):
|
45
|
+
|
46
|
+
def __init__(
|
47
|
+
self,
|
48
|
+
friction_angle: float,
|
49
|
+
cohesion: float,
|
50
|
+
moist_unit_wgt: float,
|
51
|
+
foundation_size: Foundation,
|
52
|
+
apply_local_shear: bool = False,
|
53
|
+
) -> None:
|
54
|
+
r"""
|
55
|
+
|
56
|
+
- $q_u$ (kPa): Ultimate bearing capacity
|
57
|
+
- $c$ (kPa): Cohesion of soil
|
58
|
+
- $q$ (kPa): Overburden pressure of soil
|
59
|
+
- $\gamma$ (kN/m³): Unit weight of soil
|
60
|
+
- $B$ (m): Width of foundation footing
|
61
|
+
- $L$ (m): Length of foundation footing
|
62
|
+
- $N_c$, $N_q$, $N_{\gamma}$: Bearing capacity factors
|
63
|
+
|
64
|
+
|
65
|
+
:param friction_angle: Internal angle of friction for general
|
66
|
+
shear failure (degrees).
|
67
|
+
:param cohesion: Cohesion of soil ($kPa$).
|
68
|
+
:param moist_unit_wgt: Moist unit weight of soil ($kN/m^3$).
|
69
|
+
:param foundation_size: Size of the foundation.
|
70
|
+
:param apply_local_shear: Indicate whether bearing capacity
|
71
|
+
failure is general shear or local
|
72
|
+
shear failure.
|
73
|
+
"""
|
74
|
+
super().__init__(
|
75
|
+
friction_angle=friction_angle,
|
76
|
+
cohesion=cohesion,
|
77
|
+
moist_unit_wgt=moist_unit_wgt,
|
78
|
+
foundation_size=foundation_size,
|
79
|
+
apply_local_shear=apply_local_shear,
|
80
|
+
)
|
81
|
+
|
82
|
+
@property
|
83
|
+
def n_c(self) -> float:
|
84
|
+
r"""Bearing capacity factor $N_c$.
|
85
|
+
|
86
|
+
$$N_c = \cot(\phi) \cdot (N_q - 1)$$
|
87
|
+
"""
|
88
|
+
return TerzaghiBearingCapacityFactors.n_c(self.friction_angle)
|
89
|
+
|
90
|
+
@property
|
91
|
+
def n_q(self) -> float:
|
92
|
+
r"""Bearing capacity factor $N_q$.
|
93
|
+
|
94
|
+
$$
|
95
|
+
N_q = \dfrac{e^{(\frac{3\pi}{2} - \phi)\tan\phi}}
|
96
|
+
{2\cos^2(45 + \frac{\phi}{2})}
|
97
|
+
$$
|
98
|
+
"""
|
99
|
+
return TerzaghiBearingCapacityFactors.n_q(self.friction_angle)
|
100
|
+
|
101
|
+
@property
|
102
|
+
def n_gamma(self) -> float:
|
103
|
+
r"""Bearing capacity factor $N_{\gamma}$.
|
104
|
+
|
105
|
+
$$N_{\gamma} = (N_q - 1) \cdot \tan(1.4\phi)$$
|
106
|
+
"""
|
107
|
+
return TerzaghiBearingCapacityFactors.n_gamma(self.friction_angle)
|
108
|
+
|
109
|
+
|
110
|
+
class TerzaghiUBC4StripFooting(TerzaghiUltimateBearingCapacity):
|
111
|
+
r"""Ultimate bearing capacity for strip footing according to
|
112
|
+
`Terzaghi 1943`.
|
113
|
+
|
114
|
+
$$q_u = cN_c + qN_q + 0.5 \gamma BN_{\gamma}$$
|
115
|
+
"""
|
116
|
+
|
117
|
+
@round_(ndigits=2)
|
118
|
+
def bearing_capacity(self) -> float:
|
119
|
+
"""Calculates ultimate bearing capacity for strip footing."""
|
120
|
+
return (
|
121
|
+
self._cohesion_term(1.0)
|
122
|
+
+ self._surcharge_term()
|
123
|
+
+ self._embedment_term(0.5)
|
124
|
+
)
|
125
|
+
|
126
|
+
|
127
|
+
class TerzaghiUBC4CircularFooting(TerzaghiUltimateBearingCapacity):
|
128
|
+
r"""Ultimate bearing capacity for circular footing according to
|
129
|
+
`Terzaghi 1943`.
|
130
|
+
|
131
|
+
$$q_u = 1.3cN_c + qN_q + 0.3 \gamma BN_{\gamma}$$
|
132
|
+
"""
|
133
|
+
|
134
|
+
@round_(ndigits=2)
|
135
|
+
def bearing_capacity(self) -> float:
|
136
|
+
"""Calculates ultimate bearing capacity for circular footing."""
|
137
|
+
return (
|
138
|
+
self._cohesion_term(1.3)
|
139
|
+
+ self._surcharge_term()
|
140
|
+
+ self._embedment_term(0.3)
|
141
|
+
)
|
142
|
+
|
143
|
+
|
144
|
+
class TerzaghiUBC4RectangularFooting(TerzaghiUltimateBearingCapacity):
|
145
|
+
r"""Ultimate bearing capacity for rectangular footing according to
|
146
|
+
`Terzaghi 1943`.
|
147
|
+
|
148
|
+
$$
|
149
|
+
q_u = \left(1 + 0.3 \dfrac{B}{L} \right) c N_c + qN_q
|
150
|
+
+ \left(1 - 0.2 \dfrac{B}{L} \right) 0.5 B \gamma N_{\gamma}
|
151
|
+
$$
|
152
|
+
"""
|
153
|
+
|
154
|
+
@round_(ndigits=2)
|
155
|
+
def bearing_capacity(self) -> float:
|
156
|
+
"""Calculates ultimate bearing capacity for rectangular footing."""
|
157
|
+
width = self.foundation_size.width
|
158
|
+
length = self.foundation_size.length
|
159
|
+
coh_coef = 1.0 + 0.3 * (width / length)
|
160
|
+
emb_coef = (1.0 - 0.2 * (width / length)) / 2.0
|
161
|
+
|
162
|
+
return (
|
163
|
+
self._cohesion_term(coh_coef)
|
164
|
+
+ self._surcharge_term()
|
165
|
+
+ self._embedment_term(emb_coef)
|
166
|
+
)
|
167
|
+
|
168
|
+
|
169
|
+
class TerzaghiUBC4SquareFooting(TerzaghiUBC4RectangularFooting):
|
170
|
+
r"""Ultimate bearing capacity for square footing according to
|
171
|
+
`Terzaghi 1943``.
|
172
|
+
|
173
|
+
$$q_u = 1.3cN_c + qN_q + 0.4 \gamma BN_{\gamma}$$
|
174
|
+
"""
|
175
|
+
|
176
|
+
def bearing_capacity(self):
|
177
|
+
"""Calcalates ultimate bearing capacity for square footing."""
|
178
|
+
return super().bearing_capacity()
|
@@ -0,0 +1,253 @@
|
|
1
|
+
from geolysis.foundation import Shape
|
2
|
+
from geolysis.utils import isclose, round_, sin, tan
|
3
|
+
from ._core import UltimateBearingCapacity
|
4
|
+
from ._hansen_ubc import HansenBearingCapacityFactors
|
5
|
+
|
6
|
+
__all__ = ["VesicUltimateBearingCapacity"]
|
7
|
+
|
8
|
+
|
9
|
+
class VesicBearingCapacityFactors:
|
10
|
+
|
11
|
+
@staticmethod
|
12
|
+
@round_(ndigits=2)
|
13
|
+
def n_c(friction_angle: float) -> float:
|
14
|
+
return HansenBearingCapacityFactors.n_c(friction_angle)
|
15
|
+
|
16
|
+
@staticmethod
|
17
|
+
@round_(ndigits=2)
|
18
|
+
def n_q(friction_angle: float) -> float:
|
19
|
+
return HansenBearingCapacityFactors.n_q(friction_angle)
|
20
|
+
|
21
|
+
@staticmethod
|
22
|
+
@round_(ndigits=2)
|
23
|
+
def n_gamma(friction_angle: float) -> float:
|
24
|
+
return (
|
25
|
+
2.0
|
26
|
+
* (VesicBearingCapacityFactors.n_q(friction_angle) + 1.0)
|
27
|
+
* tan(friction_angle)
|
28
|
+
)
|
29
|
+
|
30
|
+
|
31
|
+
class VesicShapeFactors:
|
32
|
+
@staticmethod
|
33
|
+
@round_(ndigits=2)
|
34
|
+
def s_c(
|
35
|
+
friction_angle: float,
|
36
|
+
f_width: float,
|
37
|
+
f_length: float,
|
38
|
+
f_shape: Shape,
|
39
|
+
) -> float:
|
40
|
+
_n_q = VesicBearingCapacityFactors.n_q(friction_angle)
|
41
|
+
_n_c = VesicBearingCapacityFactors.n_c(friction_angle)
|
42
|
+
|
43
|
+
if f_shape == Shape.STRIP:
|
44
|
+
return 1.0
|
45
|
+
elif f_shape == Shape.RECTANGLE:
|
46
|
+
return 1.0 + (f_width / f_length) * (_n_q / _n_c)
|
47
|
+
else: # SQUARE, CIRCLE
|
48
|
+
return 1.0 + (_n_q / _n_c)
|
49
|
+
|
50
|
+
@staticmethod
|
51
|
+
@round_(ndigits=2)
|
52
|
+
def s_q(
|
53
|
+
friction_angle: float,
|
54
|
+
f_width: float,
|
55
|
+
f_length: float,
|
56
|
+
f_shape: Shape,
|
57
|
+
) -> float:
|
58
|
+
if f_shape == Shape.STRIP:
|
59
|
+
return 1.0
|
60
|
+
elif f_shape == Shape.RECTANGLE:
|
61
|
+
return 1.0 + (f_width / f_length) * tan(friction_angle)
|
62
|
+
else: # SQUARE, CIRCLE
|
63
|
+
return 1.0 + tan(friction_angle)
|
64
|
+
|
65
|
+
@staticmethod
|
66
|
+
@round_(ndigits=2)
|
67
|
+
def s_gamma(f_width: float, f_length: float, f_shape: Shape) -> float:
|
68
|
+
if f_shape == Shape.STRIP:
|
69
|
+
return 1.0
|
70
|
+
elif f_shape == Shape.RECTANGLE:
|
71
|
+
return 1.0 - 0.4 * (f_width / f_length)
|
72
|
+
else: # SQUARE, CIRCLE
|
73
|
+
return 0.6
|
74
|
+
|
75
|
+
|
76
|
+
class VesicDepthFactors:
|
77
|
+
|
78
|
+
@staticmethod
|
79
|
+
@round_(ndigits=2)
|
80
|
+
def d_c(f_depth: float, f_width: float) -> float:
|
81
|
+
return 1.0 + 0.4 * f_depth / f_width
|
82
|
+
|
83
|
+
@staticmethod
|
84
|
+
@round_(ndigits=2)
|
85
|
+
def d_q(friction_angle: float, f_depth: float, f_width: float) -> float:
|
86
|
+
return 1.0 + 2.0 * tan(friction_angle) * (1.0 - sin(friction_angle)) ** 2.0 * (
|
87
|
+
f_depth / f_width
|
88
|
+
)
|
89
|
+
|
90
|
+
@staticmethod
|
91
|
+
@round_(ndigits=2)
|
92
|
+
def d_gamma() -> float:
|
93
|
+
return 1.0
|
94
|
+
|
95
|
+
|
96
|
+
class VesicInclinationFactors:
|
97
|
+
|
98
|
+
@staticmethod
|
99
|
+
@round_(ndigits=2)
|
100
|
+
def i_c(load_angle: float) -> float:
|
101
|
+
return (1.0 - load_angle / 90.0) ** 2.0
|
102
|
+
|
103
|
+
@staticmethod
|
104
|
+
@round_(ndigits=2)
|
105
|
+
def i_q(load_angle: float) -> float:
|
106
|
+
return VesicInclinationFactors.i_c(load_angle)
|
107
|
+
|
108
|
+
@staticmethod
|
109
|
+
@round_(ndigits=2)
|
110
|
+
def i_gamma(friction_angle: float, load_angle: float) -> float:
|
111
|
+
if isclose(friction_angle, 0.0):
|
112
|
+
return 1.0
|
113
|
+
return (1.0 - load_angle / friction_angle) ** 2.0
|
114
|
+
|
115
|
+
|
116
|
+
class VesicUltimateBearingCapacity(UltimateBearingCapacity):
|
117
|
+
"""Ultimate bearing capacity for soils according to `Vesic (1973)`."""
|
118
|
+
|
119
|
+
@property
|
120
|
+
def n_c(self) -> float:
|
121
|
+
r"""Bearing capacity factor $N_c$.
|
122
|
+
|
123
|
+
$$N_c = \cot(\phi) \left(N_q - 1\right)$$
|
124
|
+
"""
|
125
|
+
return VesicBearingCapacityFactors.n_c(self.friction_angle)
|
126
|
+
|
127
|
+
@property
|
128
|
+
def n_q(self) -> float:
|
129
|
+
r"""Bearing capacity factor $N_q$.
|
130
|
+
|
131
|
+
$$
|
132
|
+
N_q = \tan^2\left(45 + \frac{\phi}{2}\right) \cdot
|
133
|
+
e^{\pi \tan(\phi)}
|
134
|
+
$$
|
135
|
+
"""
|
136
|
+
return VesicBearingCapacityFactors.n_q(self.friction_angle)
|
137
|
+
|
138
|
+
@property
|
139
|
+
def n_gamma(self) -> float:
|
140
|
+
r"""Bearing capacity factor $N_{\gamma}$.
|
141
|
+
|
142
|
+
$$N_{\gamma} = 2(N_q + 1) \tan(\phi)$$
|
143
|
+
"""
|
144
|
+
return VesicBearingCapacityFactors.n_gamma(self.friction_angle)
|
145
|
+
|
146
|
+
@property
|
147
|
+
def s_c(self) -> float:
|
148
|
+
r"""Shape factor $S_c$.
|
149
|
+
|
150
|
+
$$s_c = 1.0 \rightarrow \text{Strip footing}$$
|
151
|
+
|
152
|
+
$$
|
153
|
+
s_c = 1 + \dfrac{B}{L} \cdot \dfrac{N_q}{N_c} \rightarrow
|
154
|
+
\text{Rectangular footing}
|
155
|
+
$$
|
156
|
+
|
157
|
+
$$
|
158
|
+
s_c &= 1 + \dfrac{N_q}{N_c} \rightarrow
|
159
|
+
\text{Square or circular footing}
|
160
|
+
$$
|
161
|
+
"""
|
162
|
+
width, length, shape = self.foundation_size.footing_params()
|
163
|
+
return VesicShapeFactors.s_c(self.friction_angle, width, length, shape)
|
164
|
+
|
165
|
+
@property
|
166
|
+
def s_q(self) -> float:
|
167
|
+
r"""Shape factor $S_q$.
|
168
|
+
|
169
|
+
|
170
|
+
$$s_q = 1.0 \rightarrow \text{Strip footing}$$
|
171
|
+
|
172
|
+
$$
|
173
|
+
s_q = 1 + \dfrac{B}{L} \cdot \tan(\phi) \rightarrow
|
174
|
+
\text{Rectangular footing}
|
175
|
+
$$
|
176
|
+
|
177
|
+
$$
|
178
|
+
s_q = 1 + \tan(\phi) \rightarrow \text{Square or circular footing}
|
179
|
+
$$
|
180
|
+
"""
|
181
|
+
width, length, shape = self.foundation_size.footing_params()
|
182
|
+
return VesicShapeFactors.s_q(self.friction_angle, width, length, shape)
|
183
|
+
|
184
|
+
@property
|
185
|
+
def s_gamma(self) -> float:
|
186
|
+
r"""Shape factor $S_{\gamma}$.
|
187
|
+
|
188
|
+
$$s_{\gamma} = 1.0 \rightarrow \text{Strip footing}$$
|
189
|
+
|
190
|
+
$$
|
191
|
+
s_{\gamma} = 1.0 - 0.4 \dfrac{B}{L} \rightarrow
|
192
|
+
\text{Rectangular footing}
|
193
|
+
$$
|
194
|
+
|
195
|
+
$$
|
196
|
+
s_{\gamma} = 0.6 \rightarrow \text{Square or circular footing}
|
197
|
+
$$
|
198
|
+
"""
|
199
|
+
width, length, shape = self.foundation_size.footing_params()
|
200
|
+
return VesicShapeFactors.s_gamma(width, length, shape)
|
201
|
+
|
202
|
+
@property
|
203
|
+
def d_c(self) -> float:
|
204
|
+
r"""Depth factor $D_c$.
|
205
|
+
|
206
|
+
$$d_c = 1 + 0.4 \dfrac{D_f}{B}$$
|
207
|
+
"""
|
208
|
+
depth, width = self.foundation_size.depth, self.foundation_size.width
|
209
|
+
return VesicDepthFactors.d_c(depth, width)
|
210
|
+
|
211
|
+
@property
|
212
|
+
def d_q(self) -> float:
|
213
|
+
r"""Depth factor $D_q$.
|
214
|
+
|
215
|
+
$$
|
216
|
+
d_q = 1 + 2 \tan(\phi) \cdot (1 - \sin(\phi))^2
|
217
|
+
\cdot \dfrac{D_f}{B}
|
218
|
+
$$
|
219
|
+
"""
|
220
|
+
depth, width = self.foundation_size.depth, self.foundation_size.width
|
221
|
+
return VesicDepthFactors.d_q(self.friction_angle, depth, width)
|
222
|
+
|
223
|
+
@property
|
224
|
+
def d_gamma(self) -> float:
|
225
|
+
r"""Depth factor $D_{\gamma}$.
|
226
|
+
|
227
|
+
$$d_{\gamma} = 1.0$$
|
228
|
+
"""
|
229
|
+
return VesicDepthFactors.d_gamma()
|
230
|
+
|
231
|
+
@property
|
232
|
+
def i_c(self) -> float:
|
233
|
+
r"""Inclination factor $I_c$.
|
234
|
+
|
235
|
+
$$i_c = (1 - \dfrac{\alpha}{90})^2$$
|
236
|
+
"""
|
237
|
+
return VesicInclinationFactors.i_c(self.load_angle)
|
238
|
+
|
239
|
+
@property
|
240
|
+
def i_q(self) -> float:
|
241
|
+
r"""Inclination factor $I_q$.
|
242
|
+
|
243
|
+
$$i_q = (1 - \dfrac{\alpha}{90})^2$$
|
244
|
+
"""
|
245
|
+
return VesicInclinationFactors.i_q(self.load_angle)
|
246
|
+
|
247
|
+
@property
|
248
|
+
def i_gamma(self) -> float:
|
249
|
+
r"""Inclination factor $I_{\gamma}$.
|
250
|
+
|
251
|
+
$$i_{\gamma} = \left(1 - \dfrac{\alpha}{\phi} \right)^2$$
|
252
|
+
"""
|
253
|
+
return VesicInclinationFactors.i_gamma(self.friction_angle, self.load_angle)
|