One-dimensional consolidation

class groundhog.consolidation.dissipation.onedimensionalconsolidation.ConsolidationCalculation(height, total_time, no_nodes)[source]

The consolidation equation can be discretised as follows:

\[u_{i,j+1} = u_{i,j} + \frac{c_v \Delta t}{( \Delta z )^2} \left( u_{i-1,j} - 2 u_{i,j} + u_{i+1,j} \right)\]

At permeable boundaries, the excess pore pressure is 0 (\(u = 0\)). At impervious boundaries, the following boundary condition applies:

\[ \begin{align}\begin{aligned}\frac{\partial u}{\partial z} = 0 = \frac{1}{2 \Delta z} \left( u_{i-1,j} - u_{i+1,j} \right) = 0\\\implies u_{i,j+1} = u_{i,j} + \frac{c_v \Delta t}{( \Delta z )^2} \left( 2 u_{i-1,j} - 2 u_{i,j} \right)\end{aligned}\end{align} \]

To ensure stability, the timestep needs to be chosen according to the following criterion:

\[\alpha = \frac{c_v \Delta t}{(\Delta z)^2} < \frac{1}{2}\]

Usually, \(\alpha = 0.25\) is used to determine the timestep.

The discretisation in space and time is done as follows where the number of timesteps is usually calculated from a chosen node offset:

\[\Delta z = \frac{H_0}{m}, \ \Delta t = \frac{t}{n}\]
calculate()[source]

Calculates the pore pressure dissipation until the specified output time

set_bottom_boundary(freedrainage=True)[source]

Sets the boundary condition at the bottom

Set freedrainage=False for an impervious top surface

set_cv(cv, uniform=True, cv_depths=None)[source]

Sets the coefficient of consolidation. A constant value or an array of cv varying with depth can be specified. cv is specified in m2/yr and is converted to m2/s inside the routine (all calcs happen in s)

set_initial(u0, u0_depths)[source]

Sets the initial excess pore pressure distribution

Parameters:
  • u0 – NumPy array with initial excess pore pressure

  • u0_depths – NumPy array with the depths corresponding to the defined excess pore pressures

set_output_times(output_times)[source]

Sets the times at which output is requested. These are pasted into the array with computed times

set_top_boundary(freedrainage=True)[source]

Sets the boundary condition at the top

Set freedrainage=False for an impervious top surface

groundhog.consolidation.dissipation.onedimensionalconsolidation.consolidation_degree(time, cv, drainage_length, distribution='uniform')[source]

Returns the degree of consolidation for a certain time and initial distribution of excess pore pressure.

The average degree of consolidation can be visualised as the area between the initial excess pore pressure distribution and the current isochrone.

The solutions are interpolated from published solutions.

Parameters:
  • time – Time at which excess pore pressures are computed (\(t\)) [\(s\)]

  • cv – Coefficient of consolidation (\(c_v\)) [\(m^2/yr\)]

  • drainage_length – Drainage length (\(H_{dr}\)) [\(m\)]

  • distribution – Shape of the initial excess pore pressure distribution. Choose between "uniform" (default) and "triangular"

\[T_v = \frac{c_v t}{H_{dr}^2}\]
Returns:

Dictionary with the following keys:

  • ’U [pct]’: Degree of consolidation (\(U\)) [%]

  • ’Tv [-]’: Time factor (\(T_v\)) [\(-\)]

Reference - Budhu (2011). Soil mechanics and foundations. John Wiley and Sons.

groundhog.consolidation.dissipation.onedimensionalconsolidation.pore_pressure_fourier(delta_u_0, depths, time, cv, layer_thickness, no_terms=1000)[source]

The function returns the excess pore pressure distribution at the specified depths for a given time. Note that the Fourier series solution only applies for uniform initial excess pore pressure distributions as commonly observed in thin layers. In thick clay layers, where triangular distributions are more common, this solution does not apply. If the stress distribution is irregular, a numerical solution should be applied.

As an infinite amount of terms cannot be evaluated, the sum is limited to a number of terms (1000 by default) which should be sufficient for convergence.

Parameters:
  • delta_u_0 – Initial excess pore pressure (\(\Delta u_0\)) [kPa]

  • depths – Numpy array with the depths for the excess pore pressures (\(z\)) [\(m\)]

  • time – Time at which excess pore pressures are computed (\(t\)) [\(s\)]

  • cv – Coefficient of consolidation (\(c_v\)) [\(m^2/yr\)]

  • layer_thickness – Thickness of the layer considered (\(2 \cdot H_{dr}\)) [\(m\)]

  • no_terms – Number of terms for the Fourier series (\(m\)) [\(-\)]

\[ \begin{align}\begin{aligned}\Delta u (z,t) = \sum_{m=0}^{\infty} \frac{2 \Delta u_0}{M} \sin \left( \frac{M \cdot z}{H_{dr}} \right) \exp \left( -M^2 T_v \right)\\M = \frac{\pi}{2} \left( 2m + 1 \right)\\T_v = \frac{c_v t}{H_{dr}^2}\end{aligned}\end{align} \]
Returns:

Dictionary with the following keys:

  • ’drainage length [m]’: Drainage length (\(H_{dr}\)) [\(m\)]

  • ’delta u [kPa]’: Numpy array with the calculated excess pore pressures (\(\Delta u (z,t)\)) [kPa]

  • ’Tv [-]’: Time factor (\(T_v\)) [\(-\)]

Reference - Budhu (2011). Soil mechanics and foundations. John Wiley and Sons.

class groundhog.consolidation.dissipation.onedimensionalconsolidation.ConsolidationCalculation(height, total_time, no_nodes)[source]

The consolidation equation can be discretised as follows:

\[u_{i,j+1} = u_{i,j} + \frac{c_v \Delta t}{( \Delta z )^2} \left( u_{i-1,j} - 2 u_{i,j} + u_{i+1,j} \right)\]

At permeable boundaries, the excess pore pressure is 0 (\(u = 0\)). At impervious boundaries, the following boundary condition applies:

\[ \begin{align}\begin{aligned}\frac{\partial u}{\partial z} = 0 = \frac{1}{2 \Delta z} \left( u_{i-1,j} - u_{i+1,j} \right) = 0\\\implies u_{i,j+1} = u_{i,j} + \frac{c_v \Delta t}{( \Delta z )^2} \left( 2 u_{i-1,j} - 2 u_{i,j} \right)\end{aligned}\end{align} \]

To ensure stability, the timestep needs to be chosen according to the following criterion:

\[\alpha = \frac{c_v \Delta t}{(\Delta z)^2} < \frac{1}{2}\]

Usually, \(\alpha = 0.25\) is used to determine the timestep.

The discretisation in space and time is done as follows where the number of timesteps is usually calculated from a chosen node offset:

\[\Delta z = \frac{H_0}{m}, \ \Delta t = \frac{t}{n}\]
__init__(height, total_time, no_nodes)[source]

Initialises the consolidation calculation with the height of the layer and the total time. Subdivision of the height in m elements is performed.

calculate()[source]

Calculates the pore pressure dissipation until the specified output time

set_bottom_boundary(freedrainage=True)[source]

Sets the boundary condition at the bottom

Set freedrainage=False for an impervious top surface

set_cv(cv, uniform=True, cv_depths=None)[source]

Sets the coefficient of consolidation. A constant value or an array of cv varying with depth can be specified. cv is specified in m2/yr and is converted to m2/s inside the routine (all calcs happen in s)

set_initial(u0, u0_depths)[source]

Sets the initial excess pore pressure distribution

Parameters:
  • u0 – NumPy array with initial excess pore pressure

  • u0_depths – NumPy array with the depths corresponding to the defined excess pore pressures

set_output_times(output_times)[source]

Sets the times at which output is requested. These are pasted into the array with computed times

set_top_boundary(freedrainage=True)[source]

Sets the boundary condition at the top

Set freedrainage=False for an impervious top surface