find volume at given pressure using brenth in scipy.optimize
    this is for single p value, not vectorized
    this cannot handle uncertainties

    :param p: pressure
    :param v0: volume at reference conditions
    :param k0: bulk modulus at reference conditions
    :param k0p: pressure derivative of bulk modulus at different conditions
    :param p_ref: reference pressure (default = 0)
    :param min_strain: minimum strain value to find solution (default = 0.01)
    :return: volume at high pressure

def bm3_v_single(p, v0, k0, k0p, p_ref=0.0, min_strain=0.01):
    """
    find volume at given pressure using brenth in scipy.optimize
    this is for single p value, not vectorized
    this cannot handle uncertainties

    :param p: pressure
    :param v0: volume at reference conditions
    :param k0: bulk modulus at reference conditions
    :param k0p: pressure derivative of bulk modulus at different conditions
    :param p_ref: reference pressure (default = 0)
    :param min_strain: minimum strain value to find solution (default = 0.01)
    :return: volume at high pressure
    """
    if p <= 1.e-5:
        return v0

    def f_diff(v, v0, k0, k0p, p, p_ref=0.0):
        return bm3_p(v, v0, k0, k0p, p_ref=p_ref) - p
    v = brenth(f_diff, v0, v0 * min_strain, args=(v0, k0, k0p, p, p_ref))
    return v