Calculations

VDisp calculations are handled by the CalculationBehaviour.jl module. The following functions are responsible for calculating the effective stresses of the soil before placing any load, the effective stresses after placing the load, and any method specific calculations required afterwards.

Main.CalculationBehaviour.getEffectiveStressFunction
getEffectiveStress(behaviour)

Calculates the effective stress at each nodal point given values in the InputData instance contained in behaviour. Returns two identical Float64 arrays (unless model is ConsolidationSwell and equilibrium moisture profile is saturated above water table). VDisp never alters the second array so the original effective stress values are always available for each nodal point, and alters the first array adding all other stress values to each corresponding nodal point.

Calculations

The effective stress at depth z, $\sigma'_z$, is calculated using the following formulas:

$\sigma'_z = (\gamma_{sat}-\gamma_w)z$

Which can be derived from the following equations:

$\sigma_z = \sigma'_z + u_w$

$u_w = \gamma_w z$

$\sigma_z = \gamma_{sat} z$

This calculation is repeated at each depth increment.

The bulk unit weight, $\gamma$, which is equal to $\gamma_{sat}-\gamma_w$ is calculated by the following formula:

$\gamma = \frac{W}{V} = \frac{G_s (1+w) \gamma_w}{1+e}$

Variables

$\sigma_z$: stress at depth z

$\sigma_z'$: effective stress at depth z

$\gamma_w$: unit weight of water

$\gamma_{sat}$: unit weight of saturated soil

$G_s$: specific gravity of soil

$w$: water content of soil

$e$: void ratio of soil

source
Main.CalculationBehaviour.getSurchargePressureFunction
getSurchargePressure(behaviour, P, PP)

Calculates the stress after adding foundation at each nodal point below the foundation. The values are added to array P, while array PP remains unchanged. VDisp software calls this function using P and PP returned from the getEffectiveStress() function.

Calculations

Using the Boussinesq equation for stress at a point under the corner of a rectangular area, the stress from adding the foundation is calculated at each depth increment. If the calculation must be done from the center (i.e. behaviour.center == true), the 2:1 method is used: length, a, and width, b, are halved, while the whole equation is multiplied by a factor of 4 (the leading factor becomes $\frac{2q}{\pi}$ rather than $\frac{q}{2\pi}$. This is because the calculation in the center can be seen as splitting the rectangular area into 4 quadrants, where the original center is a corner for each rectangle. Now the Boussinesq equation for stress at a point under the corner of a rectangular area can be used, however there are 4 of these rectangles contributing to the load, hence the multiplication by a factor of 4). The stress increase at depth z is denoted as $\sigma_z$, and is calculated using the following equation:

$\sigma_z = \frac{q}{2 \pi} (\text{tan}^{-1}(\frac{ab}{zC})+\frac{abz}{C}(\frac{1}{A^2}+\frac{1}{B^2})) \text{ where,}$

$A^2 = a^2 + z^2$

$B^2 = b^2 + z^2$

$C = \sqrt{a^2+b^2+z^2}$

Variables

$q$: net applied footing pressure

$\sigma_z$: stress increase at depth z

$a$: length of the foundation

$b$: width of the foundation

$z$: depth

source
Main.CalculationBehaviour.getValueFunction
getValue(behaviour::ConsolidationSwellCalculationBehaviour)

This functions first calls getEffectiveStress() and getSurchargePressure() with behaviour as the argument to establish the two arrays P and PP. It then calculates total heave (Δh), subsoil movement (Δh2), and heave above foundation (Δh1). It also calculates values at each depth increment and places them in two tables, heaveAboveFoundationTable and heaveBelowFoundationTable. Returns tuple (P, PP, heaveAboveFoundationTable, heaveBelowFoundationTable, Δh1, Δh2, Δh)

Calculations

$\Delta e_j = C_c \log_{10}{\frac{\sigma_{fj}'}{\sigma_{oj}'}} \text{, if } \sigma_{fj}' < \sigma_{pj}'$

$\Delta e_j = C_r \log_{10}{\frac{\sigma_{pj}'}{\sigma_{oj}'}} + C_c \log_{10}{\frac{\sigma_{fj}'}{\sigma_{pj}'}} \text{, if } \sigma_{fj}' \ge \sigma_{pj}'$

$\sigma_{oj}' = \frac{\sigma_{oj1}' + \sigma_{oj2}'}{2}$

$\rho_{cj} = \frac{\Delta e_j}{1 + e_{0j}}H_j$

$\rho_c = \sum_{j=1}^{n} \rho_{cj}$

Variables

$\Delta e_j$: change in void ratio of soil layer j

$e_{0j}$: initial void ratio of soil layer j

$\sigma_{oj}'$: effective stress of layer j

$\sigma_{oj1}'$: effective stress at top of layer j

$\sigma_{oj2}'$: effective stress at bottom of layer j

$\sigma_{fj}'$: final applied effective stress of layer j

$C_c$: compression index

$C_r$: recompression index

$\rho_{cj}$: one-dimensional consolidation of layer j

$\rho_c$: oen-dimensional consolidation of soil profile

$H_j$: thickness of layer j

$n$: number of layers

Note: Tables heaveAboveFoundationTable and heaveBelowFoundationTable contain the following values in each row: $j$, $\frac{dx}{2} + j \times dx$, $\frac{\rho_{cj}}{H_j}$, $\sigma_{fj}-\sigma_{oj}$

source
Main.CalculationBehaviour.schmertmannApproximationFunction
schmertmannApproximation(behaviour, elasticModulusGiven, PP)

Calculates settlement at each depth increment, $\rho_i$, and sums it up to calculate total settlement, $\rho$. If elasticModulus == true, input file must have elastic moduli, $E_{si}$, for each soil layer. Else, input file must have cone penetration resistance data, $q_{ci}$, for each soil layer. Returns a 2D array of settlement values with each row containing the element number, the depth of the layer, and it's settlement.

Calculations

This subroutine calculates total settlement using the Schmertmann Approximation:

$\rho = C_1 C_t \Delta p \Delta z \sum_{i=1}^{n} \frac{I_{iz}}{E_{si}} \text{ where, }$

$C_1 = 1 - \frac{0.5 \sigma_{od}'}{\Delta p}, C_1 \ge 0.5$

$C_t = 1 + 0.2 \log_{10} \frac{t}{0.1}$

$E_{si} = 2.5 q_{ci} \text{ if rectangular footing, } 3.5 q_{ci} \text{ if long strip footing}$

$I_{zp} = 0.5 + 0.1 \sqrt{\frac{\Delta p}{\sigma_{izp}'}}$

$I_{iz} = 0 \text{ if } z > 2w \text{,} \frac{4}{3}I_{zp} - \frac{I_{zp} z}{1.5w} \text{ if } z > 0.5w \text{ , else } 0.1 + \frac{(I_{zp}-0.1)z}{0.5w}$

$\sigma_{izp}' = \frac{\sigma_{topi}' + \sigma_{boti}'}{2}$

$\Delta p = Q - \sigma_{od}'$

Variables

$C_1$: correction to account for strain relief from embedment

$C_t$: correction for time dependant inrease in settlement

$\sigma_{od}'$: effective stress at bottom of foundation

$\Delta p$: net applied footing pressure

$Q$: applied pressure

$t$: time in years since construction

$\Delta z$: depth increment

$I_{iz}$: influence factor of soil layer i

$E_{si}$: elastic modulus of soil layer i

$q_{ci}$: cone penetration resistance of soil layer i

$\sigma_{topi}'$: effective stress at top of soil layer i

$\sigma_{boti}'$: effective stress at bottom of soil layer i

$\rho_i$: settlement of soil layer i

$\rho$: total settlement

Code

The code first calculates the settlement of each soil layer, $\rho_i$, then sums up settlements at each depth increment. The following two formulas are used to achieve this:

$\rho_i = C_1 C_t \Delta p \Delta z \frac{I_{iz}}{E_{si}}$

$\rho = \sum_{i=1}^{n} \rho_i$

source