civilpy.geotech package

Submodules

civilpy.geotech.culmanns module

CivilPy Copyright (C) 2019-2026 - Dane Parks

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.

class civilpy.geotech.culmanns.CulmannsMethod(coordinates_list=None, soil_unit_weight=<Quantity(117.7, 'force_pound / foot ** 3')>, soil_angle_int_friction=<Quantity(29.8, 'degree')>, angle_back_wall_with_horizontal=<Quantity(0, 'degree')>, angle_of_wall_friction_delta=<Quantity(0, 'degree')>, angle_of_wall_friction_gamma=<Quantity(90, 'degree')>, load_scale=<Quantity(2.9059, 'kip / foot')>, wall_height=<Quantity(19.5, 'foot')>, soil_height_above_wall=<Quantity(4.4, 'foot')>, num_slices=19, total_length=<Quantity(38, 'foot')>, track_offset=<Quantity(2, 'foot')>)[source]

Bases: object

Implements Culmann’s graphical method for lateral earth pressure.

Culmann’s method is a graphical/tabular approach for determining the maximum active lateral earth pressure on a retaining wall under arbitrary backfill geometry and surcharge loading. This class builds the calculation spreadsheet and provides plotting utilities.

table

Spreadsheet of intermediate Culmann calculations (a_i, b_i, c_i, wedge areas, weights, x/y coordinates, and resultant forces).

Type:

pandas.DataFrame

__init__(coordinates_list=None, soil_unit_weight=<Quantity(117.7, 'force_pound / foot ** 3')>, soil_angle_int_friction=<Quantity(29.8, 'degree')>, angle_back_wall_with_horizontal=<Quantity(0, 'degree')>, angle_of_wall_friction_delta=<Quantity(0, 'degree')>, angle_of_wall_friction_gamma=<Quantity(90, 'degree')>, load_scale=<Quantity(2.9059, 'kip / foot')>, wall_height=<Quantity(19.5, 'foot')>, soil_height_above_wall=<Quantity(4.4, 'foot')>, num_slices=19, total_length=<Quantity(38, 'foot')>, track_offset=<Quantity(2, 'foot')>)[source]

Initialise the Culmann’s method calculator and generate the table.

Parameters:
  • coordinates_list (dict, optional) – Dictionary of labelled coordinate points defining the wall geometry and trial wedge locations. Defaults to default_coordinates_list built from Cooper E80 loading.

  • soil_unit_weight (pint.Quantity) – Unit weight of the retained soil (default 117.7 lbf/ft³).

  • soil_angle_int_friction (pint.Quantity) – Angle of internal friction φ (default 29.8°).

  • angle_back_wall_with_horizontal (pint.Quantity) – Angle α between the back of the wall and horizontal (default 0°).

  • angle_of_wall_friction_delta (pint.Quantity) – Wall friction angle δ (default 0°).

  • angle_of_wall_friction_gamma (pint.Quantity) – Angle γ used in the force polygon construction (default 90°).

  • load_scale (pint.Quantity) – Scale factor converting cumulative wedge weight to plot coordinates (default 2.9059 kips/ft).

  • wall_height (pint.Quantity) – Height of the retaining wall (default 19.5 ft).

  • soil_height_above_wall (pint.Quantity) – Height of soil above the wall top (default 4.4 ft).

  • num_slices (int) – Number of trial wedge slices (default 19).

  • total_length (pint.Quantity) – Total horizontal extent of the backfill area (default 38 ft).

  • track_offset (pint.Quantity) – Horizontal offset to the first trial point (default 2 ft).

calculate_A_i(s_i, a_i, b_i, c_i)[source]

Calculate area A_i (ft^2) using the formula provided.

calculate_a_i(x_val, y_val)[source]

Calculate a_i (ft) based on the current coordinates.

calculate_b_i(current_key, keys, coordinates_list, x_val, y_val)[source]

Calculate b_i (ft) using the previous point’s coordinates.

calculate_c_i(current_key, keys, coordinates_list)[source]

Calculate c_i (ft) based on the previous coordinates. If first point, refer to point ‘A’.

calculate_cumulative_weights(values)[source]

Calculate cumulative weights (lbf/ft) for a list of values.

calculate_ll_surcharge(b_i)[source]

Calculate the live-load surcharge for a wedge slice per unit wall length.

Uses a simplified Cooper E80 equivalent strip load distribution. The E80 axle load (80 000 lbf) is distributed over a 4-rail area (18 ft tie spacing × 8.5 ft track width) and integrated over the wedge base length b_i.

Parameters:

b_i (pint.Quantity) – Length of the wedge base segment b_i (ft).

Returns:

Live load surcharge contribution (lbf/ft).

Return type:

pint.Quantity

calculate_running_total(values)[source]

Calculate running total (ft) for a list of values.

calculate_s_i(a_i, b_i, c_i)[source]

Calculate s_i (ft) as the semi-perimeter of the triangle.

calculate_w_i(A_i, soil_unit_weight)[source]

Calculate w_i (lbf/ft) as the incremental weight of the triangle per unit length.

calculate_x_cgi(x_val, next_x_val)[source]

Calculate x_{cgi} (ft) as the center of gravity x-coordinate.

calculate_x_ci(total_weight, load_scale, soil_angle_int_friction)[source]

Calculate x_ci (dimensionless plotting coordinate on the force polygon).

Converts total wedge weight to a force-polygon x-coordinate by dividing by the load scale (converted to matching units) and projecting onto the friction angle direction.

Parameters:
  • total_weight (pint.Quantity) – Total cumulative wedge weight in lbf/ft.

  • load_scale (pint.Quantity) – Force-polygon scale factor in kips/ft.

  • soil_angle_int_friction (pint.Quantity) – Angle of internal friction φ.

Returns:

The x_ci plotting coordinate (dimensionless).

Return type:

float

calculate_x_ci_prime(y_ci, x_ci, angle_back_wall_with_horizontal, angle_of_wall_friction_delta, soil_angle_int_friction, D, C)[source]
calculate_y_cgi(y_val, next_y_val)[source]

Calculate y_{cgi} (ft) as the center of gravity y-coordinate.

calculate_y_ci(x_ci, soil_angle_int_friction)[source]

Calculate y_ci (dimensionless plotting coordinate on the force polygon).

Parameters:
  • x_ci (float) – The x_ci plotting coordinate (dimensionless).

  • soil_angle_int_friction (pint.Quantity) – Angle of internal friction φ.

Returns:

The y_ci plotting coordinate (dimensionless).

Return type:

float

generate_spreadsheet(coordinates_list, soil_unit_weight, load_scale, soil_angle_int_friction, angle_back_wall_with_horizontal, angle_of_wall_friction_delta)[source]

Calculate various columns for soil and wall friction analysis.

Args: coordinates_list (dict): Dictionary containing coordinate points. soil_unit_weight (float): The unit weight of the soil. load_scale (float): Load scale value. soil_angle_int_friction (float): Angle of internal friction of soil in radians. angle_back_wall_with_horizontal (float): Angle between back of wall and horizontal in radians. angle_of_wall_friction_delta (float): Angle of wall friction in radians.

Returns: pd.DataFrame: DataFrame containing computed columns.

plot_results()[source]

Plot the retaining wall geometry and Culmann’s method construction.

Generates a matplotlib figure showing:

  • Trial wedge points (C_1 … C_n) and the base points A and B.

  • Dashed green lines connecting each C-point back to B.

  • The ground surface line from A through all C-points.

  • A trapezoidal retaining wall cross-section.

The figure is displayed via plt.show().

sort_keys(keys)[source]

Sort C-point keys numerically by their integer suffix.

Parameters:

keys (list[str]) – List of keys in the form "C_1", "C_2", etc.

Returns:

Keys sorted in ascending numerical order.

Return type:

list[str]

civilpy.geotech.culmanns.build_coordinates_list(starting_coordinates_list={'A': (0, 23.9, 'LS1'), 'B': (0, 0, None), 'C_1': (2.0, 19.5, 'LS1'), 'C_10': (20.0, 19.5, 'LS1'), 'C_11': (22.0, 19.5, None), 'C_12': (24.0, 19.5, None), 'C_13': (26.0, 19.5, 'LS2'), 'C_14': (28.0, 19.5, 'LS2'), 'C_15': (30.0, 19.5, 'LS2'), 'C_16': (32.0, 19.5, 'LS2'), 'C_17': (34.0, 19.5, 'LS2'), 'C_18': (36.0, 19.5, 'LS2'), 'C_19': (38.0, 19.5, 'LS2'), 'C_2': (4.0, 19.5, 'LS1'), 'C_3': (6.0, 19.5, 'LS1'), 'C_4': (8.0, 19.5, 'LS1'), 'C_5': (10.0, 19.5, 'LS1'), 'C_6': (12.0, 19.5, 'LS1'), 'C_7': (14.0, 19.5, 'LS1'), 'C_8': (16.0, 19.5, 'LS1'), 'C_9': (18.0, 19.5, 'LS1')}, total_length=38, num_slices=19, track_offset=2, wall_height=19.5, soil_height_above_wall=0)[source]

Populate a Culmann’s method coordinate dictionary with trial wedge points.

Adds num_slices C-points ("C_1""C_n") to starting_coordinates_list. Each point represents the top of a trial failure wedge at a horizontal spacing of total_length / num_slices starting from track_offset.

Parameters:
  • starting_coordinates_list (dict) – Base dictionary containing at least the fixed "A" (wall top) and "B" (wall toe) points.

  • total_length (float) – Horizontal extent of the soil wedge area (ft).

  • num_slices (int) – Number of trial wedge points to generate.

  • track_offset (float) – Horizontal offset from the wall face to the first trial point (ft).

  • wall_height (float) – Height of the retaining wall (ft).

  • soil_height_above_wall (float) – Additional soil height above the wall top (ft).

Returns:

Updated coordinate dictionary with the new C-points added.

Return type:

dict

civilpy.geotech.culmanns.find_key_for_value_in_tuple_range(data, number)[source]

Find the key in a dictionary where the number falls between the first two values of the tuple.

Args: data (dict): Dictionary containing lists of tuples. number (float): The number to search for within the tuple ranges.

Returns: key: The key in the dictionary whose tuple contains the number, or None if not found.

Module contents

CivilPy Copyright (C) 2019-2026 - Dane Parks

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.

civilpy.geotech.coulomb_active_pressure(unit_weight, height, friction_angle, wall_friction_angle, backfill_inclination, wall_inclination)[source]

Calculate active earth pressure against an abutment using the Coulomb method.

Parameters: unit_weight (float): Unit weight of the soil (kN/m³ or lb/ft³) height (float): Height of the abutment (meters or feet) friction_angle (float): Internal friction angle of the soil (degrees) wall_friction_angle (float): Angle of wall friction (delta) (degrees) backfill_inclination (float): Angle of inclination of the backfill surface (theta) (degrees) wall_inclination (float): Inclination of the back side of the wall (beta) (degrees)

Returns: float: Active earth pressure (kN/m² or lb/ft²)

civilpy.geotech.coulomb_active_pressure_with_surcharge(unit_weight, height, friction_angle, wall_friction_angle, backfill_inclination, wall_inclination, surcharge_load)[source]

Calculate active earth pressure against an abutment using the Coulomb method with a surcharge load.

Parameters: unit_weight (float): Unit weight of the soil (kN/m³ or lb/ft³) height (float): Height of the abutment (meters or feet) friction_angle (float): Internal friction angle of the soil (degrees) wall_friction_angle (float): Angle of wall friction (delta) (degrees) backfill_inclination (float): Angle of inclination of the backfill surface (theta) (degrees) wall_inclination (float): Inclination of the back side of the wall (beta) (degrees) surcharge_load (float): Surcharge load at the surface (kN/m² or lb/ft²)

Returns: float: Active earth pressure (kN/m² or lb/ft²)

civilpy.geotech.culmann_lateral_pressure(unit_weight, height, cohesion, friction_angle, wall_friction_angle, num_slices=100)[source]

Calculate horizontal lateral earth pressure using Culmann’s method.

Parameters: unit_weight (float): Unit weight of the soil (kN/m³) height (float): Height of the wall (meters) cohesion (float): Cohesion of the soil (kPa) friction_angle (float): Internal friction angle of the soil (degrees) wall_friction_angle (float): Wall friction angle (degrees) num_slices (int): Number of slices for the graphical method

Returns: float: Horizontal lateral earth pressure (kPa)

civilpy.geotech.culmann_lateral_pressure_with_surcharge(unit_weight, height, cohesion, friction_angle, wall_friction_angle, surcharge_load, num_slices=100)[source]

Calculate horizontal lateral earth pressure using Culmann’s method including a live load surcharge.

Parameters: unit_weight (float): Unit weight of the soil (kN/m³) height (float): Height of the wall (meters) cohesion (float): Cohesion of the soil (kPa) friction_angle (float): Internal friction angle of the soil (degrees) wall_friction_angle (float): Wall friction angle (degrees) surcharge_load (float): Live load surcharge at the surface (kPa) num_slices (int): Number of slices for the graphical method

Returns: float: Horizontal lateral earth pressure (kPa)

civilpy.geotech.rankine_active_pressure(unit_weight, height, friction_angle)[source]

Calculate active earth pressure against an abutment using the Rankine method.

Parameters: unit_weight (float): Unit weight of the soil (kN/m³ or lb/ft³) height (float): Height of the abutment (meters or feet) friction_angle (float): Internal friction angle of the soil (degrees)

Returns: float: Active earth pressure (kN/m or lb/ft)

civilpy.geotech.rankine_active_pressure_with_surcharge(unit_weight, height, friction_angle, surcharge_load)[source]

Calculate active earth pressure against an abutment using the Rankine method with a surcharge load.

Parameters: unit_weight (float): Unit weight of the soil (kN/m³ or lb/ft³) height (float): Height of the abutment (meters or feet) friction_angle (float): Internal friction angle of the soil (degrees) surcharge_load (float): Surcharge load at the surface (kN/m² or lb/ft²)

Returns: float: Active earth pressure (kN/m² or lb/ft²)