7. slopestabl

Module for evaluating the factor of safety against sliding by using the limit equilibrium method through the General Limit Equilibrium (GLE) method presented by Fredlund & Krahn (1977).

class slopestabl.SlopeStabl(slices, seedFS=1, Kh=0, maxIter=50, tol=0.001, interSlcFunc='halfsine', minLambda=-0.6, maxLambda=0.6, nLambda=10)[source]

Bases: object

Creates an instance of an object that allows to evaluate the factor of

safety against sliding of a slope.

SlopeStabl(slices, seedFS=1, Kh=0, maxIter=50, tol=1e-3,
           interSlcFunc='halfsine', minLambda=-0.6, maxLambda=0.6,
           nLambda=10)
Attributes:
slices (Slices object): object that contains the data structure of
the slices in which the sliding mass has been divided.
seedFS (float or int): Initial value of factor of safety for
starting the iterarive algorithm. 1 is the default value.
lambda_ (float or int): Factor that multiplies the interlice
function to determine the interslices horizontal forces. 0 is the default value.
Kh (float): horizontal seismic coefficient for the pseudostatic
analysis. Its positive value represents the force is directed out of the slope (i.e. in the direction of failure). 0 is the default value.
maxIter (int): Maximum number of iterations for stoping the
algorithm in case the tolerance is not reached. 50 is the default value.
tol (float): Required tolerace to stop the iterations. Is the
diference between the 2 last values gotten of factor of safety and lambda, it means, two tolerances have to be reached. 1e-3 is the default value.
interSlcFunc (str or ‘float’): Interslice function that relates the
normal interslice forces and the parameter lambda to obtain the shear interslice forces. halfsine is the default value and corresponds to Morgenstern and Price method, but a constant number may be input, for example interSlcFunc=1, corresponds to Spencer method.
maxLambda (float): Maximum value the lambda parameter can get.
0.6 is the default value.
nLambda (float): Number of value the lambda parameter can get from
zero to maxLambda. 6 is the default value.
slices, seedFS=1, Kh=0, maxIter=50, tol=1e-3,
interSlcFunc=’halfsine’, maxLambda=0.6, nLambda=6
Note:
The class Slices requires numpy, scipy, matplotlib and shapely.
Examples:
>>> from numpy import array
>>> from pybimstab.slope import AnthropicSlope
>>> from pybimstab.slipsurface import CircularSurface
>>> from pybimstab.watertable import WaterTable
>>> from pybimstab.slices import MaterialParameters, Slices
>>> from pybimstab.slopestabl import SlopeStabl
>>> slope = AnthropicSlope(slopeHeight=40, slopeDip=[2, 1],
>>>                        crownDist=60, toeDist=30, depth=20)
>>> surface = CircularSurface(slopeCoords=slope.coords,
>>>                           dist1=45.838, dist2=158.726, radius=80)
>>> material = MaterialParameters(
>>>     cohesion=600, frictAngle=20, unitWeight=120, wtUnitWeight=62.4)
>>> watertable = WaterTable(slopeCoords=slope.coords,
                            watertabDepths=array([[0, 140], [20, 0]]))
>>> slices = Slices(
>>>     material=material, slipSurfCoords=surface.coords,
>>>     slopeCoords=slope.coords, numSlices=50,
>>>     watertabCoords=watertable.coords, bim=None)
>>> stabAnalysis = SlopeStabl(slices, seedFS=1, Kh=0)
>>> stabAnalysis.__dict__.keys()
dict_keys(['slices', 'Kh', 'seedFS', 'maxIter', 'tol', 'interSlcFunc',
           'minLambda', 'maxLambda', 'nLambda', 'fsBishop',
           'fsJanbu', 'fsMoment', 'fsForces', 'lambda_',
           'adjustment', 'FS'])
intersliceForceFunct(v=1, u=1)[source]

Method for calculating the interslice function which is a component of the interslice forces; this is done by using the Equation [11] of Zhu et al (2015), with v = u = 1 for a simetric and non-narrowed halfsine function.

When the object is instanced with the clases with a constant interslice function, then, all the values are equal to that constant value.

Parameters:
  • v (int or float) – shape parameter. Controls the symmetry. 1 is the defaut value.
  • u (int or float) – shape parameter. Controls the kurtosis. 1 is the defaut value.
Returns:

Values of the all insterslice force function values.

Return type:

(list)

Examples

>>> import matplotlib.pyplot as plt
>>> from pybimstab.slope import AnthropicSlope
>>> from pybimstab.slipsurface import CircularSurface
>>> from pybimstab.slices import MaterialParameters, Slices
>>> from pybimstab.slopestabl import SlopeStabl
>>> slope = AnthropicSlope(slopeHeight=40, slopeDip=[2, 1],
>>>                        crownDist=60, toeDist=30, depth=20)
>>> surface = CircularSurface(slopeCoords=slope.coords,
>>>                           dist1=45.838, dist2=158.726,
>>>                           radius=80)
>>> material = MaterialParameters(cohesion=600, frictAngle=20,
>>>                               unitWeight=120,
>>>                               wtUnitWeight=62.4)
>>> slices = Slices(
>>>     material=material, slipSurfCoords=surface.coords,
>>>     slopeCoords=slope.coords, numSlices=50)
>>> stabAnalysis = SlopeStabl(slices, seedFS=1, Kh=0)
>>> interslcForceFunc = stabAnalysis.intersliceForceFunct(u=1)
>>> plt.plot(interslcForceFunc, 'k')
slopestabl_interSlcFunct_example

example script.

calculateArms()[source]

Method for calculating the arms required for getting the momments of each slice with respect to a rotation point.

This function does not return any output, just modifies the structure of each slice by setting new attributes.

calculateBasicForces()[source]

Method for calculating the forces that do not vary in each iteration or lambda value.

This function does not return any output, just modifies the structure of each slice by setting new attributes.

calculateNormalForce(seedFS, fellenius=False)[source]

Method for calculating the normal force to the base; this is done by using the Equation of section 14.6 of GeoSlope (2015)

Since the normal forces are updated with each iteration, is necessary to input a factor of safety as a seed.

Parameters:seedFS (int or float) – Seed factor of safety.
Returns:Values of all the normal forces at the slice’s bases
Return type:(list)

Examples

>>> from numpy import array
>>> import matplotlib.pyplot as plt
>>> from pybimstab.slope import AnthropicSlope
>>> from pybimstab.slipsurface import CircularSurface
>>> from pybimstab.watertable import WaterTable
>>> from pybimstab.slices import MaterialParameters, Slices
>>> from pybimstab.slopestabl import SlopeStabl
>>> slope = AnthropicSlope(slopeHeight=40, slopeDip=[2, 1],
>>>                        crownDist=60, toeDist=30, depth=20)
>>> surface = CircularSurface(slopeCoords=slope.coords,
>>>                           dist1=45.838, dist2=158.726,
>>>                           radius=80)
>>> material = MaterialParameters(cohesion=600, frictAngle=20,
>>>                               unitWeight=120,
>>>                               wtUnitWeight=62.4)
>>> slices = Slices(
>>>     material=material, slipSurfCoords=surface.coords,
>>>     slopeCoords=slope.coords, numSlices=5)
>>> stabAnalysis = SlopeStabl(slices, seedFS=1, Kh=0)
>>> stabAnalysis.calculateNormalForce(stabAnalysis.FS['fs'])
[45009.409630951726, 68299.77910530512, 70721.13554871723,
 57346.7578530581, 22706.444365285253]
getFm(seedFS, lambda_=0, fellenius=False)[source]

Method for getting the factor of safety with respect to the moments equilimrium; this is done by using the Equation [22] of Fredlund & Krahn (1977).

Since the factor of safety is updated with each iteration, is necessary to input a factor of safety as a seed and the current value of lambda to relate the interslice normal force and the interslice force function with respect to the interslice shear force (Eq. [16] of Fredlund & Krahn (1977)).

Parameters:
  • seedFS (int or float) – Seed factor of safety.
  • lambda (int or float) – Seed value of lambda. 0 is the default value.
Returns:

Dictionary with the value of the factor of safety and a tuple with the boolean that indicated if the toleranfe was reached and the number of the iteration.

Return type:

(dict)

Examples

>>> # Example Case 1 - Fig. 9 (Fredlund & Krahn, 1977)
>>> from pybimstab.slope import AnthropicSlope
>>> from pybimstab.slipsurface import CircularSurface
>>> from pybimstab.slices import MaterialParameters, Slices
>>> from pybimstab.slopestabl import SlopeStabl
>>> slope = AnthropicSlope(slopeHeight=40, slopeDip=[2, 1],
>>>                        crownDist=60, toeDist=30, depth=20)
>>> surface = CircularSurface(slopeCoords=slope.coords,
>>>                           dist1=45.838, dist2=158.726,
>>>                           radius=80)
>>> material = MaterialParameters(cohesion=600, frictAngle=20,
>>>                               unitWeight=120,
>>>                               wtUnitWeight=62.4)
>>> slices = Slices(
>>>     material=material, slipSurfCoords=surface.coords,
>>>     slopeCoords=slope.coords, numSlices=50,
>>>     watertabCoords=None, bim=None)
>>> stabAnalysis = SlopeStabl(slices, seedFS=1, Kh=0, minLambda=0,
>>>                           interSlcFunc=1, nLambda=10)
>>> stabAnalysis.getFm(stabAnalysis.FS['fs'],
>>>                    stabAnalysis.FS['lambda'])
(2.0750390044795854, True)
getFf(seedFS, lambda_=0)[source]

Method for getting the factor of safety with respect to the forces equilimrium; this is done by using the Equation [23] of Fredlund & Krahn (1977).

Since the factor of safety is updated with each iteration, is necessary to input a factor of safety as a seed and the current value of lambda to relate the interslice normal force and the interslice force function with respect to the interslice shear force (Eq. [16] of Fredlund & Krahn (1977)).

Parameters:
  • seedFS (int or float) – Seed factor of safety.
  • lambda (int or float) – Seed value of lambda. 0 is the default value.
Returns:

Dictionary with the value of the factor of safety and a tuple with the boolean that indicated if the toleranfe was reached and the number of the iteration.

Return type:

(dict)

Examples

>>> # Example Case 1 - Fig. 9 (Fredlund & Krahn, 1977)
>>> from pybimstab.slope import AnthropicSlope
>>> from pybimstab.slipsurface import CircularSurface
>>> from pybimstab.slices import MaterialParameters, Slices
>>> from pybimstab.slopestabl import SlopeStabl
>>> slope = AnthropicSlope(slopeHeight=40, slopeDip=[2, 1],
>>>                        crownDist=60, toeDist=30, depth=20)
>>> surface = CircularSurface(slopeCoords=slope.coords,
>>>                           dist1=45.838, dist2=158.726,
>>>                           radius=80)
>>> material = MaterialParameters(cohesion=600, frictAngle=20,
>>>                               unitWeight=120,
>>>                               wtUnitWeight=62.4)
>>> slices = Slices(
>>>     material=material, slipSurfCoords=surface.coords,
>>>     slopeCoords=slope.coords, numSlices=50,
>>>     watertabCoords=None, bim=None)
>>> stabAnalysis = SlopeStabl(slices, seedFS=1, Kh=0, minLambda=0,
>>>                           interSlcFunc=1, nLambda=10)
>>> stabAnalysis.getFf(stabAnalysis.FS['fs'],
>>>                    stabAnalysis.FS['lambda'])
(2.0741545445738296, True)
intersliceForces(seedFS, lambda_)[source]

Method for getting the shear and normal interslice forces; this is done by using the Equation of section 14.8 of GeoSlope (2015) for the rigth normal force and the Equation [18] of Fredlund & Krahn (1977) for the shear force.

Since the interslice forces are updated with each iteration, is necessary to input a factor of safety as a seed and the current value of lambda to relate the interslice normal force and the interslice force function with respect to the interslice shear force (Eq. [20] of Fredlund & Krahn (1977)).

Parameters:
  • seedFS (int or float) – Seed factor of safety.
  • lambda (int or float) – Seed value of lambda. 0 is the default value.
Returns:

tuple with the interslice forces. the first element contains the normal interslice forces and the second contains the shear interslice forces.

Return type:

(tuple)

Examples

>>> from numpy import array
>>> import matplotlib.pyplot as plt
>>> from pybimstab.slope import AnthropicSlope
>>> from pybimstab.slipsurface import CircularSurface
>>> from pybimstab.watertable import WaterTable
>>> from pybimstab.slices import MaterialParameters, Slices
>>> from pybimstab.slopestabl import SlopeStabl
>>> slope = AnthropicSlope(slopeHeight=40, slopeDip=[2, 1],
>>>                        crownDist=60, toeDist=30, depth=20)
>>> surface = CircularSurface(slopeCoords=slope.coords,
>>>                           dist1=45.838, dist2=158.726,
>>>                           radius=80)
>>> material = MaterialParameters(cohesion=600, frictAngle=20,
>>>                               unitWeight=120,
>>>                               wtUnitWeight=62.4)
>>> slices = Slices(
>>>     material=material, slipSurfCoords=surface.coords,
>>>     slopeCoords=slope.coords, numSlices=5)
>>> stabAnalysis = SlopeStabl(slices, seedFS=1, Kh=0)
>>> stabAnalysis.intersliceForces(stabAnalysis.FS['fs'],
>>>                               stabAnalysis.FS['lambda'])
([0, -24561.260979675248, -42085.32887504204, -38993.844201424305,
  -18464.723052348225, -61.4153504520018],
 [0, -5511.202498703704, -15279.673506543182, -14157.266298947989,
  -4143.22489013017, -2.8712090198929304e-15])
iterateGLE()[source]

Method for getting the factor of safety against sliding through the algorithm of the General Limit Equilibrium (GLE) proposed by Fredlund & Krahn (1977)).

Returns:factor of safety against sliding is the solution exists.
Return type:(tuple or None)

Examples

>>> from numpy import array
>>> import matplotlib.pyplot as plt
>>> from pybimstab.slope import AnthropicSlope
>>> from pybimstab.slipsurface import CircularSurface
>>> from pybimstab.watertable import WaterTable
>>> from pybimstab.slices import MaterialParameters, Slices
>>> from pybimstab.slopestabl import SlopeStabl
>>> slope = AnthropicSlope(slopeHeight=40, slopeDip=[2, 1],
>>>                        crownDist=60, toeDist=30, depth=20)
>>> surface = CircularSurface(slopeCoords=slope.coords,
>>>                           dist1=45.838, dist2=158.726,
>>>                           radius=80)
>>> material = MaterialParameters(cohesion=600, frictAngle=20,
>>>                               unitWeight=120,
>>>                               wtUnitWeight=62.4)
>>> slices = Slices(
>>>     material=material, slipSurfCoords=surface.coords,
>>>     slopeCoords=slope.coords, numSlices=5)
>>> stabAnalysis = SlopeStabl(slices, seedFS=1, Kh=0)
>>> stabAnalysis.iterateGLE()
{'fs': 2.0258090954552275, 'lambda': 0.38174822248691215}
>>> stabAnalysis = SlopeStabl(slices, seedFS=1, Kh=0, nLambda=0)
>>> stabAnalysis.iterateGLE()
{'fsBishop': 2.0267026043637175, 'fsJanbu': 1.770864711650081}
plot()[source]

Method for generating a graphic of the slope stability analysis, including the plot of the convergences

Returns:object with the matplotlib structure of the plot. You might use it to save the figure for example.
Return type:(matplotlib.figure.Figure)

Examples

>>> # Example Case 1 - Fig. 9 (Fredlund & Krahn, 1977)
>>> from pybimstab.slope import AnthropicSlope
>>> from pybimstab.slipsurface import CircularSurface
>>> from pybimstab.slices import MaterialParameters, Slices
>>> from pybimstab.slopestabl import SlopeStabl
>>> slope = AnthropicSlope(slopeHeight=40, slopeDip=[2, 1],
>>>                        crownDist=60, toeDist=30, depth=20)
>>> surface = CircularSurface(slopeCoords=slope.coords,
>>>                           dist1=45.838, dist2=158.726,
>>>                           radius=80)
>>> material = MaterialParameters(cohesion=600, frictAngle=20,
>>>                               unitWeight=120,
>>>                               wtUnitWeight=62.4)
>>> slices = Slices(
>>>     material=material, slipSurfCoords=surface.coords,
>>>     slopeCoords=slope.coords, numSlices=50,
>>>     watertabCoords=None, bim=None)
>>> stabAnalysis = SlopeStabl(slices, seedFS=1, Kh=0, minLambda=0,
>>>                           interSlcFunc=1, nLambda=10)
>>> fig = stabAnalysis.plot()
slopestabl_example1

example script.

>>> # Example Case 5 (Fredlund & Krahn, 1977)
>>> from numpy import array
>>> from pybimstab.slope import AnthropicSlope
>>> from pybimstab.slipsurface import CircularSurface
>>> from pybimstab.watertable import WaterTable
>>> from pybimstab.slices import MaterialParameters, Slices
>>> from pybimstab.slopestabl import SlopeStabl
>>> slope = AnthropicSlope(slopeHeight=40, slopeDip=[2, 1],
>>>                        crownDist=60, toeDist=30, depth=20)
>>> surface = CircularSurface(slopeCoords=slope.coords,
>>>                           dist1=45.838, dist2=158.726,
>>>                           radius=80)
>>> material = MaterialParameters(cohesion=600, frictAngle=20,
>>>                               unitWeight=120,
>>>                               wtUnitWeight=62.4)
>>> watertable = WaterTable(slopeCoords=slope.coords,
>>>                         watertabDepths=array([[0, 140],
>>>                                               [20, 0]]))
>>> slices = Slices(
>>>     material=material, slipSurfCoords=surface.coords,
>>>     slopeCoords=slope.coords, numSlices=50,
>>>     watertabCoords=watertable.coords, bim=None)
>>> stabAnalysis = SlopeStabl(slices, seedFS=1, Kh=0, minLambda=0)
>>> fig = stabAnalysis.plot()
slopestabl_example2

example script.

>>> from numpy import array
>>> from pybimstab.slope import NaturalSlope
>>> from pybimstab.watertable import WaterTable
>>> from pybimstab.bim import BlocksInMatrix
>>> from pybimstab.slipsurface import CircularSurface
>>> from pybimstab.slipsurface import TortuousSurface
>>> from pybimstab.slices import MaterialParameters, Slices
>>> from pybimstab.slopestabl import SlopeStabl
>>> terrainCoords = array(
>>>     [[-2.49, 0.1, 1.7, 3.89, 5.9, 8.12, 9.87, 13.29, 20.29,
>>>       21.43, 22.28, 23.48, 24.65, 25.17],
>>>      [18.16, 17.88, 17.28, 15.73, 14.31, 13.58, 13, 3.61, 3.61,
>>>       3.32, 2.71, 2.23, 1.21, 0.25]])
>>> slope = NaturalSlope(terrainCoords)
>>> bim = BlocksInMatrix(slopeCoords=slope.coords, blockProp=0.2,
>>>                      tileSize=0.35, seed=3210)
>>> watertabDepths = array([[0, 5, 10, 15],
>>>                         [8, 7, 3, 0]])
>>> watertable = WaterTable(slopeCoords=slope.coords,
>>>                         watertabDepths=watertabDepths,
>>>                         smoothFactor=3)
>>> preferredPath = CircularSurface(
>>>     slopeCoords=slope.coords, dist1=5, dist2=15.78, radius=20)
>>> surface = TortuousSurface(
>>>     bim, dist1=4, dist2=15.5, heuristic='euclidean',
>>>     reverseLeft=False, reverseUp=False, smoothFactor=2,
>>>     preferredPath=preferredPath.coords, prefPathFact=2)
>>> material = MaterialParameters(
>>>     cohesion=15, frictAngle=23, unitWeight=17,
>>>     blocksUnitWeight=21, wtUnitWeight=9.8)
>>> slices = Slices(
>>>     material=material, slipSurfCoords=surface.coords,
>>>     slopeCoords=slope.coords, numSlices=20,
>>>     watertabCoords=watertable.coords, bim=bim)
>>> stabAnalysis = SlopeStabl(slices, seedFS=1, Kh=0, nLambda=13,
>>>                           minLambda=0)
>>> fig = stabAnalysis.plot()
slopestabl_example3

example script.