Cavern volume and storage capacity#

Functions to calculate salt cavern volumes and storage capacities.

References#

h2ss.capacity.cavern_volume(height, diameter=85, theta=20)[source]#

Calculate the cavern volume.

Parameters#

heightfloat

Cavern height [m]

diameterfloat

Cavern diameter [m]

thetafloat

Cavern roof angle [°]

Returns#

float

Ideal cavern volume [m³]

Notes#

The cavern’s ideal shape is a cylinder of height \(h_{cylinder}\) [m] with two conical ends each with a height of \(h_{cone}\) [m] based on [1]. Since the volume of a cylinder is defined as \(\pi r^2 h_{cylinder}\) and the volume of a cone is defined as \(\frac{\pi r^2 h_{cone}}{3}\) (i.e. one third of a cylinder’s volume), the bulk cavern volume, \(V_{bulk}\) [m³] can therefore be deduced by calculating the volume of a cylinder of the cavern height, \(h\) [m] and deducting 4/3 of the volume of a cone of height \(h_{cone}\). \(r\) [m] is the radius of the cavern and \(h_{cone}\) is therefore equivalent to \(r \tan(\theta)\), where \(\theta\) [°] is the cavern roof angle.

\[V_{bulk} = \pi \, r^2 \, h - \frac{4}{3} \, \pi \, r^2 \, h_{cone}\]
\[V_{bulk} = \pi \, r^2 \left(h - \frac{4}{3} \, h_{cone}\right)\]
\[V_{bulk} = \pi \, r^2 \left(h - \frac{4}{3} \, r \, \tan(\theta)\right)\]
h2ss.capacity.corrected_cavern_volume(v_cavern, scf=0.7)[source]#

Apply correction factors to the cavern volume.

Parameters#

v_cavernfloat

Ideal cavern volume [m³]

scffloat

Shape correction factor

Returns#

float

Corrected cavern volume [m³]

Notes#

The corrected cavern volume, \(V_{cavern}\) [m³] is defined as

\[V_{cavern} = V_{bulk} \times SCF\]

where \(V_{bulk}\) [m³] is the bulk cavern volume and \(SCF\) is the shape correction factor (deviation of the cavern’s shape due to geological differences). A \(SCF\) of 0.7 is used as the default, as defined in [1], [2], [3], and [4].

h2ss.capacity.temperature_cavern_mid_point(height, depth_top, t_0=10, delta_t=37.5)[source]#

Cavern mid-point temperature.

Parameters#

heightfloat

Cavern height [m]

depth_topfloat

Cavern top depth [m]

t_0float

Mean annual seabed surface temperature [°C]

delta_tfloat

Geothermal gradient; change in temperature with depth [°C km⁻¹]

Returns#

float

Mid-point temperature [K]

Notes#

See [2], Eqn. (2).

\[T_{midpoint} = T_0 + \Delta_T \, \frac{z + 0.5 \, h}{1,000} + 273.15\]

where \(T_{midpoint}\) is the cavern mid-point temperature [K], \(T_0\) is the mean annual surface temperature [°C], \(\Delta_T\) is the change in temperature with depth, i.e. geothermal gradient [°C km⁻¹], \(z\) is the cavern top depth [m], and \(h\) is the cavern height [m].

A \(\Delta_T\) of 37.5 °C km⁻¹ is used based on the geothermal gradient of Kish Basin wells in the Mercia Mudstone Group reported in [5]. Note that the cavern top depth is used instead of the casing shoe depth, as the casing shoe is 30 m above the cavern top depth in this study, rather than at the cavern top as modelled in [2].

h2ss.capacity.pressure_operating(depth_water, thickness_overburden, thickness_salt=50, rho_overburden=2400, rho_salt=2200, rho_water=1027, minf=0.3, maxf=0.8)[source]#

Cavern operating pressures.

Parameters#

depth_waterfloat

Sea water depth [m]

thickness_overburdenfloat

Overburden thickness / halite top depth [m]

thickness_saltfloat

Thickness of the salt above the casing shoe [m]

rho_overburdenfloat

Density of the overburden [kg m⁻³]

rho_saltfloat

Density of the halite [kg m⁻³]

rho_waterfloat

Density of the sea water [kg m⁻³]

minffloat

Factor of lithostatic pressure for the minimum operating pressure

maxffloat

Factor of lithostatic pressure for the maximum operating pressure

Returns#

tuple[float, float]

Min and max operating pressures [Pa]

Notes#

\[p_{casing} = (\rho_{water} \, t_{water} + \rho_{overburden} \, t_{overburden} + \rho_{salt} \, t_{salt}) \, g\]
\[p_{H_2min} = 0.3 \, p_{casing}\]
\[p_{H_2max} = 0.8 \, p_{casing}\]

\(p_{casing}\) is the lithostatic pressure at the casing shoe [Pa]. The thickness of the overburden, \(t_{overburden}\) [m] is the same as the depth to top of salt. \(t_{salt}\) [m] is the thickness of the salt above the casing shoe. \(t_{water}\) [m] is the sea water depth. \(\rho_{water}\), \(\rho_{overburden}\), and \(\rho_{salt}\) are the densities of the sea water, overburden, and salt, respectively [kg m⁻³]. \(g\) is the acceleration due to gravity [m s⁻²].

\(p_{H_2min}\) and \(p_{H_2max}\) are the minimum and maximum cavern operating pressures, respectively [Pa].

See [2], Eqn. (3) and (4). This function has been modified to include sea water depth and density to suit offshore conditions. The sea water density is assumed as the mean value at a temperature of 10 °C, a salinity of 35 g kg⁻¹, and a surface pressure of 1 atm [6] [7].

h2ss.capacity.density_hydrogen_gas(p_operating_min, p_operating_max, t_mid_point)[source]#

Density of hydrogen at cavern conditions.

Parameters#

p_operating_minfloat

Minimum operating pressure [Pa]

p_operating_maxfloat

Maximum operating pressure [Pa]

t_mid_pointfloat

Mid-point temperature [K]

Returns#

tuple[float, float]

Min and max hydrogen gas densities [kg m⁻³]

Notes#

This function uses the CoolProp [8] wrapper called PyFluids [9]. See [2], Section 3.4.2 and also the CoolProp documentation for useful information on hydrogen [10]. The pyproject.toml configuration file has been set such that the default units used by PyFluids are SI units. PyFluids can also be used to derive the compressibility factor.

Based on [3], Eqn. (3), the density can be approximated using the following equation.

\[\rho = \frac{p \, M}{Z \, R \, T}\]

where \(M\) is the molar mass of hydrogen gas [kg mol⁻¹], \(R\) is the universal gas constant [J K⁻¹ mol⁻¹], \(p\) is the pressure [Pa], \(T\) is the temperature [K], \(Z\) is the compressibility factor, and \(\rho\) is the hydrogen gas density [kg m⁻³].

h2ss.capacity.mass_hydrogen_working(rho_h2_min, rho_h2_max, v_cavern)[source]#

The working mass of hydrogen.

Parameters#

rho_h2_minfloat

Minimum hydrogen density [kg m⁻³]

rho_h2_maxfloat

Maximum hydrogen density [kg m⁻³]

v_cavernfloat

Cavern volume [m³]

Returns#

tuple[float, float, float]

Working mass and the minimum and maximum operating mass of hydrogen [kg]

Notes#

See [2], Eqn. (5) and (6). The mass of hydrogen at the minimum operating pressure represents the cushion gas requirement.

\[m_{min} = \rho_{H_2min} \, V_{cavern}\]
\[m_{max} = \rho_{H_2max} \, V_{cavern}\]
\[m_{working} = m_{max} - m_{min}\]

The working mass of hydrogen, \(m_{working}\) [kg] is the difference between the stored mass of hydrogen at maximum, \(m_{max}\) and minimum, \(m_{min}\) operating pressures [kg], which were derived using the minimum, \(\rho_{H_2min}\) and maximum, \(\rho_{H_2max}\) hydrogen densities [kg m⁻³], respectively, and the cavern volume, \(V_{cavern}\) [m³].

h2ss.capacity.energy_storage_capacity(m_working)[source]#

Cavern energy storage capacity.

Parameters#

m_workingfloat

Working mass of hydrogen [kg]

Returns#

float

Energy storage capacity of cavern [GWh]

Notes#

See [2], Eqn. (7). See also [11] for the heating values. The energy storage capacity of the cavern, \(E_{cavern}\) [GWh] is a function of the working mass of hydrogen, \(m_{working}\) [kg] and the lower heating value of hydrogen, \(LHV\) [MJ kg⁻¹].

\[E_{cavern} = \frac{m_{working} \times LHV}{3,600,000}\]