Source code for breakwater.core.substructure

from ..utils.exceptions import user_warning, InputError, NotSupportedError

# supported armour layers, i.e. for these armour layers the rules for
# the underlayer and filter have been implemented
def _supported_armour_layers():
    """ returns the supported types of material for the armour layer """
    return ['Rock', 'Xbloc', 'XblocPlus']


[docs]def underlayer(Dn_armour, armour_layer, rho, rho_rock=2650): """ Design first underlayer of a rubble mound breakwater Design the layer of rock immediately below the armour layer, the nominal diameter of this layer (the underlayer) is determined using one of the following rules: - | Rock (CIRIA, CUR, CETMEF, 2007, p. 630) | :math:`M_{50u} = \\frac{M_{50a}}{15}` to :math:`\\frac{M_{50a}}{10}` - | Xbloc (Delta Marine Consultants, 2018) | :math:`M_{50u} = \\frac{M_{50a}}{15}` to :math:`\\frac{M_{50a}}{6}` - | XblocPlus (Delta Marine Consultants, 2018) | :math:`M_{50u} = \\frac{M_{50a}}{20}` to :math:`\\frac{M_{50a}}{8}` Parameters ---------- Dn_armour : float nominal diameter of the armour layer [m] armour_layer : {'Rock', 'Xbloc', 'XblocPlus'} type of the armour layer rho : float, optional, default: 2650 density of the armourstone [kg/m³] rho_rock : float, optional, default: 2650 density of the rock used in the underlayer [kg/m³] Returns ------- [float, float] list with the upper bound and lower bound limit of the Dn50 of the underlayer """ M_armour = rho*Dn_armour**3 if armour_layer == 'Rock': M_upper = M_armour/10 M_lower = M_armour/15 elif armour_layer == 'Xbloc': M_upper = M_armour/6 M_lower = M_armour/15 elif armour_layer == 'XblocPlus': M_upper = M_armour/8 M_lower = M_armour/20 else: supported = ', '.join(_supported_armour_layers()) raise NotSupportedError( (f'{armour_layer} is not implemented as a rule for the underlayer' f', supported types are: {supported}.')) dn_upper = (M_upper/rho_rock)**(1/3) dn_lower = (M_lower/rho_rock)**(1/3) return [dn_lower, dn_upper]
[docs]def filter_layers(Dn, rho=2650): """ Design filter layer of a rubble mound breakwater Design a layer of rock below the first underlayer, or subsequent layers of rock. The nominal diameter of this layer (the filter layer) is given by the following rule: - | Rock (Van den Bos and Verhagen, 2018, p. 142) | :math:`M_{50l} = \\frac{M_{50u}}{25}` to :math:`\\frac{M_{50u}}{10}` Parameters ---------- Dn : float nominal diameter of the layer above the filter layer [m] rho : float, optional, default: 2650 density of the armourstone [kg/m³] Returns ------- [float, float] list with the upper bound and lower bound limit of the Dn50 of the filter layer """ M_upper_layer = Dn**3 dn_upper = Dn/(10**(1/3)) dn_lower = Dn/(25**(1/3)) return [dn_lower, dn_upper]
[docs]def layer_coefficient(material, layers=None, placement=None): """ Get the layer thickness coefficient Determine the layer thickness coefficient, :math:`k_{t}`. In Table 1 and 2 the included layer thickness coefficients can be found. Table 1: :math:`k_{t}` values for Rock (CIRIA, CUR, CETMEF, 2007, p. 126) +---------+-----------+-------+ | Layers | Placement | Value | +=========+===========+=======+ | 1 | Dense | 0.84 | +---------+-----------+-------+ | 2 | Standard | 0.91 | +---------+-----------+-------+ | 2 | Dense | 0.91 | +---------+-----------+-------+ Table 2: :math:`k_{t}` values for Armour Units (CIRIA, CUR, CETMEF, 2007, p. 260) +-------------+--------+-------+ | Armour Unit | Layers | Value | +=============+========+=======+ | Cubes | 2 | 1.1 | +-------------+--------+-------+ | Tetrapods | 2 | 1.02 | +-------------+--------+-------+ | Dolos | 2 | 0.94 | +-------------+--------+-------+ | Accropode | 1 | 1.29 | +-------------+--------+-------+ | CoreLoc | 1 | 1.52 | +-------------+--------+-------+ | Xbloc | 1 | 1.4 | +-------------+--------+-------+ | XblocPlus | 1 | 1.33 | +-------------+--------+-------+ Parameters ---------- material : str material of the layer layers : int, optional, default: None number of layers, required if the material is rock. For armour units the number of layers is not required, but a warning will be shown if the specified layer is different from the table placement : {Standard, Dense}, optional, default: None placement of the material, required if the material is rock Returns ------- kt : float the layer thickness coefficient """ # define dict for rock rock = { 1: {'dense': 0.84}, 2: {'standard': 0.91, 'dense': 0.91} } # define dict for armour units units = { 'Cubes': {'kt': 1.1, 'layers': 2}, 'Tetrapods': {'kt': 1.02, 'layers': 2}, 'Dolos': {'kt': 0.94, 'layers': 2}, 'Accropode': {'kt': 1.29, 'layers': 1}, 'CoreLoc': {'kt': 1.52, 'layers': 1}, 'Xbloc': {'kt': 1.4, 'layers': 1}, 'XblocPlus': {'kt': 1.33, 'layers': 1} } # Check if material has Accropode in the name, # as it can be Accropode I or Accropode II if 'Accropode' in material: # set material to Accropode material = 'Accropode' # get the kt value if material is 'Rock': # check if layer is given if layers is None: raise InputError( 'Layers is a required argument if the material is Rock') # check if placement is given if placement is None: raise InputError( 'Placement is a required argument if the material is Rock') # get the kt value kt = rock[layers][placement.lower()] elif material in list(units.keys()): # get kt value kt = units[material]['kt'] # check layers num_layers = units[material]['layers'] if layers is not None and layers != num_layers: # check number of layers if num_layers == 1: msg = (f'kt value for {material} is only determined for ' f'{num_layers} layer, not {layers}') else: # plural msg = (f'kt value for {material} is only determined for ' f'{num_layers} layers, not {layers}') user_warning(msg) else: # not supported armour layer kt = 1 user_warning(f'{material} is not supported, continued with kt=1') return kt