Skip to content

Elastic

Elastic Methods

Python
from digirock.elastic import *

Core functions for elastic property modelling.

acoustic_bulk_moduli(velp, vels, rhob)

Calculate the bulk modulus for a material from acoustic properties

Whether from dynamic velocity measurements or from wireline log data, we can relate the bulk modulus (\(\kappa\)) of a rock to it's acoustic properties. If the rock is saturated then the modulus will be \(\kappa_{sat}\), if the rock is measured while dry then the modulus will approximate the porous rock framework \(\kappa_{dry}\).

\[ \kappa = \rho_b \left( v_p^2 - \frac{4v_s^2}{3} \right) \]

Parameters:

Name Type Description Default
velp Union[numpy.ndarray, float]

Compressional velocity (m/s)

required
vels Union[numpy.ndarray, float]

Shear velocity (m/s)

required
rhob Union[numpy.ndarray, float]

Bulk density (g/cc)

required

Returns:

Type Description
Union[numpy.ndarray, float]

acoustic bulk modulus GPa

References

[3] Smith et al. 2003

Source code in digirock/elastic.py
Python
@broadcastable("velp", "vels", "rhob")
def acoustic_bulk_moduli(
    velp: NDArrayOrFloat, vels: NDArrayOrFloat, rhob: NDArrayOrFloat
) -> NDArrayOrFloat:
    """Calculate the bulk modulus for a material from acoustic properties

    Whether from dynamic velocity measurements or from wireline log data, we can relate the bulk
    modulus ($\kappa$) of a rock to it's acoustic properties. If the rock is saturated then the modulus will
    be $\kappa_{sat}$, if the rock is measured while dry then the modulus will approximate the porous rock
    framework $\kappa_{dry}$.

    $$
    \kappa = \\rho_b \\left( v_p^2 - \\frac{4v_s^2}{3} \\right)
    $$

    Args:
        velp: Compressional velocity (m/s)
        vels: Shear velocity (m/s)
        rhob: Bulk density (g/cc)

    Returns:
        acoustic bulk modulus GPa

    References:
        [3] Smith et al. 2003
    """
    return rhob * (np.power(velp, 2) - (4 / 3) * np.power(vels, 2)) * 1e-6

acoustic_moduli(velp, vels, rhob)

Shortcut for getting both acoustic moduli

Parameters:

Name Type Description Default
velp Union[numpy.ndarray, float]

Compressional velocity (m/s)

required
vels Union[numpy.ndarray, float]

Shear velocity (m/s)

required
rhob Union[numpy.ndarray, float]

Bulk density (g/cc)

required

Returns:

Type Description
Tuple[Union[numpy.ndarray, float], Union[numpy.ndarray, float]]

acoustic bulk modulus GPa, acoustic shear modulus GPa

References

[3] Smith et al. 2003

Source code in digirock/elastic.py
Python
@broadcastable("velp", "vels", "rhob")
def acoustic_moduli(
    velp: NDArrayOrFloat, vels: NDArrayOrFloat, rhob: NDArrayOrFloat
) -> Tuple[NDArrayOrFloat, NDArrayOrFloat]:
    """Shortcut for getting both acoustic moduli

    Args:
        velp: Compressional velocity (m/s)
        vels: Shear velocity (m/s)
        rhob: Bulk density (g/cc)

    Returns:
        acoustic bulk modulus GPa, acoustic shear modulus GPa

    References:
        [3] Smith et al. 2003
    """
    return acoustic_bulk_moduli(velp, vels, rhob), acoustic_shear_moduli(vels, rhob)

acoustic_shear_moduli(vels, rhob)

Calculate the shear modulus for a material from acoustic properties

\[ \mu = \rho_b v_s^2 \]

Parameters:

Name Type Description Default
vels Union[numpy.ndarray, float]

Shear velocity (m/s)

required
rhob Union[numpy.ndarray, float]

Bulk density (g/cc)

required

Returns:

Type Description
Union[numpy.ndarray, float]

acoustic shear modulus GPa

References

[3] Smith et al. 2003

Source code in digirock/elastic.py
Python
@broadcastable("vels", "rhob")
def acoustic_shear_moduli(vels: NDArrayOrFloat, rhob: NDArrayOrFloat) -> NDArrayOrFloat:
    """Calculate the shear modulus for a material from acoustic properties

    $$
    \mu = \\rho_b v_s^2
    $$

    Args:
        vels: Shear velocity (m/s)
        rhob: Bulk density (g/cc)

    Returns:
        acoustic shear modulus GPa

    References:
        [3] Smith et al. 2003
    """
    return rhob * np.power(vels, 2) * 1e-6

acoustic_vel(k, mu, rhob)

Shortcut for getting both velocities

Parameters:

Name Type Description Default
k Union[numpy.ndarray, float]

bulk modulus GPa

required
mu Union[numpy.ndarray, float]

shear modulus GPa

required
rhob Union[numpy.ndarray, float]

bulk density g/cc

required

Returns:

Type Description
Tuple[Union[numpy.ndarray, float], Union[numpy.ndarray, float]]

compressional velocity (m/s), shear velocity (m/s)

Source code in digirock/elastic.py
Python
@broadcastable("k", "mu", "rhob")
def acoustic_vel(
    k: NDArrayOrFloat, mu: NDArrayOrFloat, rhob: NDArrayOrFloat
) -> Tuple[NDArrayOrFloat, NDArrayOrFloat]:
    """Shortcut for getting both velocities

    Args:
        k: bulk modulus GPa
        mu: shear modulus GPa
        rhob: bulk density g/cc

    Returns:
        compressional velocity (m/s), shear velocity (m/s)
    """
    return acoustic_velp(k, mu, rhob), acoustic_vels(mu, rhob)

acoustic_velp(k, mu, rhob)

Calculate the compressional \(v_p\) from material bulk \(\kappa\) and shear \(\mu\) moduli and density \(\rho_b\).

\[ v_p = \sqrt{\frac{\kappa + \dfrac{4}{3}\mu}{\rho_b}} \]

Parameters:

Name Type Description Default
k Union[numpy.ndarray, float]

bulk modulus GPa

required
mu Union[numpy.ndarray, float]

shear modulus GPa

required
rhob Union[numpy.ndarray, float]

bulk density g/cc

required

Returns:

Type Description
Union[numpy.ndarray, float]

compressional velocity (m/s), shear velocity (m/s)

Source code in digirock/elastic.py
Python
@broadcastable("k", "mu", "rhob")
def acoustic_velp(
    k: NDArrayOrFloat, mu: NDArrayOrFloat, rhob: NDArrayOrFloat
) -> NDArrayOrFloat:
    """Calculate the compressional $v_p$ from material bulk $\kappa$ and shear $\mu$ moduli and density $\\rho_b$.

    $$
    v_p = \\sqrt{\\frac{\kappa + \\dfrac{4}{3}\mu}{\\rho_b}}
    $$

    Args:
        k: bulk modulus GPa
        mu: shear modulus GPa
        rhob: bulk density g/cc

    Returns:
        compressional velocity (m/s), shear velocity (m/s)
    """
    return 1000 * np.sqrt((k + (4 / 3) * mu) / rhob)

acoustic_vels(mu, rhob)

Calculate the shear \(v_s\) velocity from material shear \(\mu\) moduli and density \(\rho_b\).

\[ v_s = \sqrt{\frac{\mu}{\rho_b}} \]

Parameters:

Name Type Description Default
mu Union[numpy.ndarray, float]

shear modulus GPa

required
rhob Union[numpy.ndarray, float]

bulk density g/cc

required

Returns:

Type Description
Union[numpy.ndarray, float]

shear velocity (m/s)

Source code in digirock/elastic.py
Python
@broadcastable("k", "mu", "rhob")
def acoustic_vels(mu: NDArrayOrFloat, rhob: NDArrayOrFloat) -> NDArrayOrFloat:
    """Calculate the shear $v_s$ velocity from material shear $\mu$ moduli and density $\\rho_b$.

    $$
    v_s = \\sqrt{\\frac{\mu}{\\rho_b}}
    $$

    Args:
        mu: shear modulus GPa
        rhob: bulk density g/cc

    Returns:
        shear velocity (m/s)
    """
    return 1000 * np.sqrt(mu / rhob)

poisson_ratio(k, mu)

Poisson's Ratio \(v\) from bulk \(\kappa\) and shear \(\mu\) moduli.

\[ v = \frac{3\kappa - 2\mu}{2(3\kappa + \mu)} \]

Parameters:

Name Type Description Default
k Union[numpy.ndarray, float]

Bulk modulus

required
mu Union[numpy.ndarray, float]

Shear modulus

required

Returns:

Type Description
Union[numpy.ndarray, float]

Poisson's ratio

Source code in digirock/elastic.py
Python
@broadcastable("k", "mu")
def poisson_ratio(k: NDArrayOrFloat, mu: NDArrayOrFloat) -> NDArrayOrFloat:
    """Poisson's Ratio $v$ from bulk $\kappa$ and shear $\mu$ moduli.

    $$
    v = \\frac{3\kappa - 2\mu}{2(3\kappa + \mu)}
    $$

    Args:
        k: Bulk modulus
        mu: Shear modulus

    Returns:
        Poisson's ratio
    """
    return (3 * k - 2 * mu) / (2 * (3 * k + mu))