Skip to content

Bank Erosion Calculator#

The Bank Erosion Calculator module provides functionality for calculating bank erosion in the D-FAST Bank Erosion software.

Overview#

The Bank Erosion Calculator module contains a class that encapsulates the core erosion calculation algorithms. It is responsible for computing equilibrium bank erosion, bank erosion dynamics during specific discharge levels, and wave heights at banks due to passing ships.

Components#

The Bank Erosion Calculator module consists of the following components:

ErosionCalculator Class#

dfastbe.bank_erosion.erosion_calculator #

Bank erosion calculator module.

ErosionCalculator #

Class for calculating bank erosion.

Source code in src/dfastbe/bank_erosion/erosion_calculator.py
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
class ErosionCalculator:
    """Class for calculating bank erosion."""

    @staticmethod
    def comp_erosion_eq(
        bank_height: np.ndarray,
        segment_length: np.ndarray,
        water_level_fairway_ref: np.ndarray,
        discharge_level_pars: SingleParameters,
        bank_fairway_dist: np.ndarray,
        water_depth_fairway: np.ndarray,
        erosion_inputs: SingleErosion,
    ) -> Tuple[np.ndarray, np.ndarray]:
        """
        Compute the equilibrium bank erosion.

        Args:
            bank_height : np.ndarray
                Array containing bank height [m]
            segment_length : np.ndarray
                Array containing length of the segment [m]
            water_level_fairway_ref : np.ndarray
                Array containing water level at fairway [m]
            discharge_level_pars (SingleParameters):
                Discharge level parameters object containing the following attributes.
                    ship_velocity : np.ndarray
                        Array containing ship velocity [m/s]
                    ship_type : np.ndarray
                        Array containing ship type [-]
                    ship_draught : np.ndarray
                        Array containing ship draught [m]
                    mu_slope : np.ndarray
                        Array containing slope [-]
            bank_fairway_dist : np.ndarray
                Array containing distance from bank to fairway [m]
            water_depth_fairway : np.ndarray
                Array containing water depth at the fairway [m]
            erosion_inputs (ErosionInputs):
                ErosionInputs object.

        Returns:
            dn_eq : np.ndarray
                 Equilibrium bank erosion distance [m]
            dv_eq : np.ndarray
                 Equilibrium bank erosion volume [m]
        """
        # ship induced wave height at the beginning of the foreshore
        h0 = ErosionCalculator.comp_hw_ship_at_bank(
            bank_fairway_dist,
            erosion_inputs.wave_fairway_distance_0,
            erosion_inputs.wave_fairway_distance_1,
            water_depth_fairway,
            discharge_level_pars.ship_type,
            discharge_level_pars.ship_draught,
            discharge_level_pars.ship_velocity,
        )
        h0 = np.maximum(h0, EPS)

        zup = np.minimum(bank_height, water_level_fairway_ref + 2 * h0)
        zdo = np.maximum(
            water_level_fairway_ref - 2 * h0, erosion_inputs.bank_protection_level
        )
        ht = np.maximum(zup - zdo, 0)
        hs = np.maximum(bank_height - water_level_fairway_ref + 2 * h0, 0)
        eq_erosion_distance = ht / discharge_level_pars.mu_slope
        eq_erosion_volume = (0.5 * ht + hs) * eq_erosion_distance * segment_length

        return eq_erosion_distance, eq_erosion_volume

    @staticmethod
    def compute_bank_erosion_dynamics(
        single_calculation: SingleCalculation,
        bank_height: np.ndarray,
        segment_length: np.ndarray,
        bank_fairway_dist: np.ndarray,
        water_level_fairway_ref: np.ndarray,
        discharge_level_pars: SingleParameters,
        time_erosion: float,
        erosion_inputs: SingleErosion,
    ) -> SingleCalculation:
        """
        Compute the bank erosion during a specific discharge level.

        Args:
            single_calculation (SingleCalculation):
                velocity : np.ndarray
                    Array containing flow velocity magnitude [m/s]
                water_level_fairway : np.ndarray
                    Array containing water levels at fairway [m]
                chezy : np.ndarray
                    Array containing Chezy values [m0.5/s]
            bank_height : np.ndarray
                Array containing bank height
            segment_length : np.ndarray
                Array containing length of line segment [m]
            water_level_fairway_ref : np.ndarray
                Array containing reference water levels at fairway [m]
            tauc : np.ndarray
                Array containing critical shear stress [N/m2]
            discharge_level_pars: SingleLevelParameters,
                num_ship : np.ndarray
                    Array containing number of ships [-]
                ship_velocity : np.ndarray
                    Array containing ship velocity [m/s]
                num_waves_per_ship : np.ndarray
                    Array containing number of waves per ship [-]
                ship_type : np.ndarray
                    Array containing ship type [-]
                ship_draught : np.ndarray
                    Array containing ship draught [m]
            time_erosion : float
                Erosion period [yr]
            bank_fairway_dist : np.ndarray
                Array containing distance from bank to fairway [m]
            fairway_wave_reduction_distance : np.ndarray
                Array containing distance from fairway at which wave reduction starts [m]
            fairway_wave_disappear_distance : np.ndarray
                Array containing distance from fairway at which all waves are gone [m]
            water_depth_fairway : np.ndarray
                Array containing water depth at fairway [m]
            dike_height : np.ndarray
                Array containing bank protection height [m]
            water_density : float
                Water density [kg/m3]

        Returns:
            parameters (CalculationParameters):
                erosion_distance : np.ndarray
                    Total bank erosion distance [m]
                erosion_volume : np.ndarray
                    Total bank erosion volume [m]
                erosion_distance_shipping : np.ndarray
                    Bank erosion distance due to shipping [m]
                erosion_distance_flow : np.ndarray
                    Bank erosion distance due to current [m]
                ship_wave_max : np.ndarray
                    Maximum bank level subject to ship waves [m]
                ship_wave_min : np.ndarray
                    Minimum bank level subject to ship waves [m]
        """
        sec_year = 3600 * 24 * 365

        # period of ship waves [s]
        ship_wave_period = 0.51 * discharge_level_pars.ship_velocity / g
        ts = (
                ship_wave_period
                * discharge_level_pars.num_ship
                * discharge_level_pars.num_waves_per_ship
        )
        vel = single_calculation.bank_velocity

        # the ship induced wave height at the beginning of the foreshore
        wave_height = ErosionCalculator.comp_hw_ship_at_bank(
            bank_fairway_dist,
            erosion_inputs.wave_fairway_distance_0,
            erosion_inputs.wave_fairway_distance_1,
            single_calculation.water_depth,
            discharge_level_pars.ship_type,
            discharge_level_pars.ship_draught,
            discharge_level_pars.ship_velocity,
        )
        wave_height = np.maximum(wave_height, EPS)

        # compute erosion parameters for each line part
        # erosion coefficient
        erosion_coef = 0.2 * np.sqrt(erosion_inputs.tauc) * 1e-6

        # critical velocity
        critical_velocity = np.sqrt(
            erosion_inputs.tauc / WATER_DENSITY * single_calculation.chezy ** 2 / g
        )

        # strength
        cE = 1.85e-4 / erosion_inputs.tauc

        # total wave damping coefficient
        # mu_tot = (mu_slope / H0) + mu_reed
        # water level along bank line
        ho_line_ship = np.minimum(
            single_calculation.water_level - erosion_inputs.bank_protection_level, 2 * wave_height
        )
        ho_line_flow = np.minimum(
            single_calculation.water_level - erosion_inputs.bank_protection_level,
            single_calculation.water_depth,
            )
        h_line_ship = np.maximum(bank_height - single_calculation.water_level + ho_line_ship, 0)
        h_line_flow = np.maximum(bank_height - single_calculation.water_level + ho_line_flow, 0)

        # compute displacement due to flow
        crit_ratio = np.ones(critical_velocity.shape)
        mask = (vel > critical_velocity) & (
                single_calculation.water_level > erosion_inputs.bank_protection_level
        )
        crit_ratio[mask] = (vel[mask] / critical_velocity[mask]) ** 2
        erosion_distance_flow = erosion_coef * (crit_ratio - 1) * time_erosion * sec_year

        # compute displacement due to ship waves
        ship_wave_max = single_calculation.water_level + 0.5 * wave_height
        ship_wave_min = single_calculation.water_level - 2 * wave_height
        mask = (ship_wave_min < water_level_fairway_ref) & (
                water_level_fairway_ref < ship_wave_max
        )
        # limit mu -> 0

        erosion_distance_shipping = cE * wave_height**2 * ts * time_erosion
        erosion_distance_shipping[~mask] = 0

        # compute erosion volume
        mask = (h_line_ship > 0) & (
                single_calculation.water_level > erosion_inputs.bank_protection_level
        )
        dv_ship = erosion_distance_shipping * segment_length * h_line_ship
        dv_ship[~mask] = 0.0
        erosion_distance_shipping[~mask] = 0.0

        mask = (h_line_flow > 0) & (
                single_calculation.water_level > erosion_inputs.bank_protection_level
        )
        dv_flow = erosion_distance_flow * segment_length * h_line_flow
        dv_flow[~mask] = 0.0
        erosion_distance_flow[~mask] = 0.0

        erosion_distance = erosion_distance_shipping + erosion_distance_flow
        erosion_volume = dv_ship + dv_flow
        single_calculation.erosion_volume_tot = erosion_volume
        single_calculation.erosion_distance_tot = erosion_distance
        single_calculation.erosion_distance_shipping = erosion_distance_shipping
        single_calculation.erosion_distance_flow = erosion_distance_flow
        single_calculation.ship_wave_max = ship_wave_max
        single_calculation.ship_wave_min = ship_wave_min
        return single_calculation

    @staticmethod
    def comp_hw_ship_at_bank(
        bank_fairway_dist: np.ndarray,
        fairway_wave_reduction_distance: np.ndarray,
        fairway_wave_disappear_distance: np.ndarray,
        water_depth_fairway: np.ndarray,
        ship_type: np.ndarray,
        ship_draught: np.ndarray,
        ship_velocity: np.ndarray,
    ) -> np.ndarray:
        """
        Compute wave heights at bank due to passing ships.

        Arguments
        ---------
        bank_fairway_dist : np.ndarray
            Array containing distance from bank to fairway [m]
        fairway_wave_reduction_distance : np.ndarray
            Array containing distance from fairway at which wave reduction starts [m]
        fairway_wave_disappear_distance : np.ndarray
            Array containing distance from fairway at which all waves are gone [m]
        water_depth_fairway : np.ndarray
            Array containing the water depth at the fairway [m]
        ship_type : np.ndarray
            Array containing the ship type [-]
        ship_draught : np.ndarray
            Array containing draught of the ships [m]
        ship_velocity : np.ndarray
            Array containing velocity of the ships [m/s]
        g : float
            Gravitational acceleration [m/s2]

        Returns
        -------
        h0 : np.ndarray
            Array containing wave height at the bank [m]
        """
        h = np.copy(water_depth_fairway)

        a1 = np.zeros(len(bank_fairway_dist))
        # multiple barge convoy set
        a1[ship_type == 1] = 0.5
        # RHK ship / motor ship
        a1[ship_type == 2] = 0.28 * ship_draught[ship_type == 2] ** 1.25
        # towboat
        a1[ship_type == 3] = 1

        froude = ship_velocity / np.sqrt(h * g)
        froude_limit = 0.8
        high_froude = froude > froude_limit
        h[high_froude] = ((ship_velocity[high_froude] / froude_limit) ** 2) / g
        froude[high_froude] = froude_limit

        A = 0.5 * (
                1
                + np.cos(
            (bank_fairway_dist - fairway_wave_disappear_distance)
            / (fairway_wave_reduction_distance - fairway_wave_disappear_distance)
            * np.pi
        )
        )
        A[bank_fairway_dist < fairway_wave_disappear_distance] = 1
        A[bank_fairway_dist > fairway_wave_reduction_distance] = 0

        h0 = a1 * h * (bank_fairway_dist / h) ** (-1 / 3) * froude**4 * A
        return h0

comp_erosion_eq(bank_height: np.ndarray, segment_length: np.ndarray, water_level_fairway_ref: np.ndarray, discharge_level_pars: SingleParameters, bank_fairway_dist: np.ndarray, water_depth_fairway: np.ndarray, erosion_inputs: SingleErosion) -> Tuple[np.ndarray, np.ndarray] staticmethod #

Compute the equilibrium bank erosion.

Parameters:

Name Type Description Default
bank_height

np.ndarray Array containing bank height [m]

required
segment_length

np.ndarray Array containing length of the segment [m]

required
water_level_fairway_ref

np.ndarray Array containing water level at fairway [m]

required
discharge_level_pars SingleParameters

Discharge level parameters object containing the following attributes. ship_velocity : np.ndarray Array containing ship velocity [m/s] ship_type : np.ndarray Array containing ship type [-] ship_draught : np.ndarray Array containing ship draught [m] mu_slope : np.ndarray Array containing slope [-]

required
bank_fairway_dist

np.ndarray Array containing distance from bank to fairway [m]

required
water_depth_fairway

np.ndarray Array containing water depth at the fairway [m]

required
erosion_inputs ErosionInputs

ErosionInputs object.

required

Returns:

Name Type Description
dn_eq ndarray

np.ndarray Equilibrium bank erosion distance [m]

dv_eq ndarray

np.ndarray Equilibrium bank erosion volume [m]

Source code in src/dfastbe/bank_erosion/erosion_calculator.py
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
@staticmethod
def comp_erosion_eq(
    bank_height: np.ndarray,
    segment_length: np.ndarray,
    water_level_fairway_ref: np.ndarray,
    discharge_level_pars: SingleParameters,
    bank_fairway_dist: np.ndarray,
    water_depth_fairway: np.ndarray,
    erosion_inputs: SingleErosion,
) -> Tuple[np.ndarray, np.ndarray]:
    """
    Compute the equilibrium bank erosion.

    Args:
        bank_height : np.ndarray
            Array containing bank height [m]
        segment_length : np.ndarray
            Array containing length of the segment [m]
        water_level_fairway_ref : np.ndarray
            Array containing water level at fairway [m]
        discharge_level_pars (SingleParameters):
            Discharge level parameters object containing the following attributes.
                ship_velocity : np.ndarray
                    Array containing ship velocity [m/s]
                ship_type : np.ndarray
                    Array containing ship type [-]
                ship_draught : np.ndarray
                    Array containing ship draught [m]
                mu_slope : np.ndarray
                    Array containing slope [-]
        bank_fairway_dist : np.ndarray
            Array containing distance from bank to fairway [m]
        water_depth_fairway : np.ndarray
            Array containing water depth at the fairway [m]
        erosion_inputs (ErosionInputs):
            ErosionInputs object.

    Returns:
        dn_eq : np.ndarray
             Equilibrium bank erosion distance [m]
        dv_eq : np.ndarray
             Equilibrium bank erosion volume [m]
    """
    # ship induced wave height at the beginning of the foreshore
    h0 = ErosionCalculator.comp_hw_ship_at_bank(
        bank_fairway_dist,
        erosion_inputs.wave_fairway_distance_0,
        erosion_inputs.wave_fairway_distance_1,
        water_depth_fairway,
        discharge_level_pars.ship_type,
        discharge_level_pars.ship_draught,
        discharge_level_pars.ship_velocity,
    )
    h0 = np.maximum(h0, EPS)

    zup = np.minimum(bank_height, water_level_fairway_ref + 2 * h0)
    zdo = np.maximum(
        water_level_fairway_ref - 2 * h0, erosion_inputs.bank_protection_level
    )
    ht = np.maximum(zup - zdo, 0)
    hs = np.maximum(bank_height - water_level_fairway_ref + 2 * h0, 0)
    eq_erosion_distance = ht / discharge_level_pars.mu_slope
    eq_erosion_volume = (0.5 * ht + hs) * eq_erosion_distance * segment_length

    return eq_erosion_distance, eq_erosion_volume

comp_hw_ship_at_bank(bank_fairway_dist: np.ndarray, fairway_wave_reduction_distance: np.ndarray, fairway_wave_disappear_distance: np.ndarray, water_depth_fairway: np.ndarray, ship_type: np.ndarray, ship_draught: np.ndarray, ship_velocity: np.ndarray) -> np.ndarray staticmethod #

Compute wave heights at bank due to passing ships.

Arguments#

bank_fairway_dist : np.ndarray Array containing distance from bank to fairway [m] fairway_wave_reduction_distance : np.ndarray Array containing distance from fairway at which wave reduction starts [m] fairway_wave_disappear_distance : np.ndarray Array containing distance from fairway at which all waves are gone [m] water_depth_fairway : np.ndarray Array containing the water depth at the fairway [m] ship_type : np.ndarray Array containing the ship type [-] ship_draught : np.ndarray Array containing draught of the ships [m] ship_velocity : np.ndarray Array containing velocity of the ships [m/s] g : float Gravitational acceleration [m/s2]

Returns#

h0 : np.ndarray Array containing wave height at the bank [m]

Source code in src/dfastbe/bank_erosion/erosion_calculator.py
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
@staticmethod
def comp_hw_ship_at_bank(
    bank_fairway_dist: np.ndarray,
    fairway_wave_reduction_distance: np.ndarray,
    fairway_wave_disappear_distance: np.ndarray,
    water_depth_fairway: np.ndarray,
    ship_type: np.ndarray,
    ship_draught: np.ndarray,
    ship_velocity: np.ndarray,
) -> np.ndarray:
    """
    Compute wave heights at bank due to passing ships.

    Arguments
    ---------
    bank_fairway_dist : np.ndarray
        Array containing distance from bank to fairway [m]
    fairway_wave_reduction_distance : np.ndarray
        Array containing distance from fairway at which wave reduction starts [m]
    fairway_wave_disappear_distance : np.ndarray
        Array containing distance from fairway at which all waves are gone [m]
    water_depth_fairway : np.ndarray
        Array containing the water depth at the fairway [m]
    ship_type : np.ndarray
        Array containing the ship type [-]
    ship_draught : np.ndarray
        Array containing draught of the ships [m]
    ship_velocity : np.ndarray
        Array containing velocity of the ships [m/s]
    g : float
        Gravitational acceleration [m/s2]

    Returns
    -------
    h0 : np.ndarray
        Array containing wave height at the bank [m]
    """
    h = np.copy(water_depth_fairway)

    a1 = np.zeros(len(bank_fairway_dist))
    # multiple barge convoy set
    a1[ship_type == 1] = 0.5
    # RHK ship / motor ship
    a1[ship_type == 2] = 0.28 * ship_draught[ship_type == 2] ** 1.25
    # towboat
    a1[ship_type == 3] = 1

    froude = ship_velocity / np.sqrt(h * g)
    froude_limit = 0.8
    high_froude = froude > froude_limit
    h[high_froude] = ((ship_velocity[high_froude] / froude_limit) ** 2) / g
    froude[high_froude] = froude_limit

    A = 0.5 * (
            1
            + np.cos(
        (bank_fairway_dist - fairway_wave_disappear_distance)
        / (fairway_wave_reduction_distance - fairway_wave_disappear_distance)
        * np.pi
    )
    )
    A[bank_fairway_dist < fairway_wave_disappear_distance] = 1
    A[bank_fairway_dist > fairway_wave_reduction_distance] = 0

    h0 = a1 * h * (bank_fairway_dist / h) ** (-1 / 3) * froude**4 * A
    return h0

compute_bank_erosion_dynamics(single_calculation: SingleCalculation, bank_height: np.ndarray, segment_length: np.ndarray, bank_fairway_dist: np.ndarray, water_level_fairway_ref: np.ndarray, discharge_level_pars: SingleParameters, time_erosion: float, erosion_inputs: SingleErosion) -> SingleCalculation staticmethod #

Compute the bank erosion during a specific discharge level.

Parameters:

Name Type Description Default
single_calculation SingleCalculation

velocity : np.ndarray Array containing flow velocity magnitude [m/s] water_level_fairway : np.ndarray Array containing water levels at fairway [m] chezy : np.ndarray Array containing Chezy values [m0.5/s]

required
bank_height

np.ndarray Array containing bank height

required
segment_length

np.ndarray Array containing length of line segment [m]

required
water_level_fairway_ref

np.ndarray Array containing reference water levels at fairway [m]

required
tauc

np.ndarray Array containing critical shear stress [N/m2]

required
discharge_level_pars SingleParameters

SingleLevelParameters, num_ship : np.ndarray Array containing number of ships [-] ship_velocity : np.ndarray Array containing ship velocity [m/s] num_waves_per_ship : np.ndarray Array containing number of waves per ship [-] ship_type : np.ndarray Array containing ship type [-] ship_draught : np.ndarray Array containing ship draught [m]

required
time_erosion

float Erosion period [yr]

required
bank_fairway_dist

np.ndarray Array containing distance from bank to fairway [m]

required
fairway_wave_reduction_distance

np.ndarray Array containing distance from fairway at which wave reduction starts [m]

required
fairway_wave_disappear_distance

np.ndarray Array containing distance from fairway at which all waves are gone [m]

required
water_depth_fairway

np.ndarray Array containing water depth at fairway [m]

required
dike_height

np.ndarray Array containing bank protection height [m]

required
water_density

float Water density [kg/m3]

required

Returns:

Name Type Description
parameters CalculationParameters

erosion_distance : np.ndarray Total bank erosion distance [m] erosion_volume : np.ndarray Total bank erosion volume [m] erosion_distance_shipping : np.ndarray Bank erosion distance due to shipping [m] erosion_distance_flow : np.ndarray Bank erosion distance due to current [m] ship_wave_max : np.ndarray Maximum bank level subject to ship waves [m] ship_wave_min : np.ndarray Minimum bank level subject to ship waves [m]

Source code in src/dfastbe/bank_erosion/erosion_calculator.py
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
@staticmethod
def compute_bank_erosion_dynamics(
    single_calculation: SingleCalculation,
    bank_height: np.ndarray,
    segment_length: np.ndarray,
    bank_fairway_dist: np.ndarray,
    water_level_fairway_ref: np.ndarray,
    discharge_level_pars: SingleParameters,
    time_erosion: float,
    erosion_inputs: SingleErosion,
) -> SingleCalculation:
    """
    Compute the bank erosion during a specific discharge level.

    Args:
        single_calculation (SingleCalculation):
            velocity : np.ndarray
                Array containing flow velocity magnitude [m/s]
            water_level_fairway : np.ndarray
                Array containing water levels at fairway [m]
            chezy : np.ndarray
                Array containing Chezy values [m0.5/s]
        bank_height : np.ndarray
            Array containing bank height
        segment_length : np.ndarray
            Array containing length of line segment [m]
        water_level_fairway_ref : np.ndarray
            Array containing reference water levels at fairway [m]
        tauc : np.ndarray
            Array containing critical shear stress [N/m2]
        discharge_level_pars: SingleLevelParameters,
            num_ship : np.ndarray
                Array containing number of ships [-]
            ship_velocity : np.ndarray
                Array containing ship velocity [m/s]
            num_waves_per_ship : np.ndarray
                Array containing number of waves per ship [-]
            ship_type : np.ndarray
                Array containing ship type [-]
            ship_draught : np.ndarray
                Array containing ship draught [m]
        time_erosion : float
            Erosion period [yr]
        bank_fairway_dist : np.ndarray
            Array containing distance from bank to fairway [m]
        fairway_wave_reduction_distance : np.ndarray
            Array containing distance from fairway at which wave reduction starts [m]
        fairway_wave_disappear_distance : np.ndarray
            Array containing distance from fairway at which all waves are gone [m]
        water_depth_fairway : np.ndarray
            Array containing water depth at fairway [m]
        dike_height : np.ndarray
            Array containing bank protection height [m]
        water_density : float
            Water density [kg/m3]

    Returns:
        parameters (CalculationParameters):
            erosion_distance : np.ndarray
                Total bank erosion distance [m]
            erosion_volume : np.ndarray
                Total bank erosion volume [m]
            erosion_distance_shipping : np.ndarray
                Bank erosion distance due to shipping [m]
            erosion_distance_flow : np.ndarray
                Bank erosion distance due to current [m]
            ship_wave_max : np.ndarray
                Maximum bank level subject to ship waves [m]
            ship_wave_min : np.ndarray
                Minimum bank level subject to ship waves [m]
    """
    sec_year = 3600 * 24 * 365

    # period of ship waves [s]
    ship_wave_period = 0.51 * discharge_level_pars.ship_velocity / g
    ts = (
            ship_wave_period
            * discharge_level_pars.num_ship
            * discharge_level_pars.num_waves_per_ship
    )
    vel = single_calculation.bank_velocity

    # the ship induced wave height at the beginning of the foreshore
    wave_height = ErosionCalculator.comp_hw_ship_at_bank(
        bank_fairway_dist,
        erosion_inputs.wave_fairway_distance_0,
        erosion_inputs.wave_fairway_distance_1,
        single_calculation.water_depth,
        discharge_level_pars.ship_type,
        discharge_level_pars.ship_draught,
        discharge_level_pars.ship_velocity,
    )
    wave_height = np.maximum(wave_height, EPS)

    # compute erosion parameters for each line part
    # erosion coefficient
    erosion_coef = 0.2 * np.sqrt(erosion_inputs.tauc) * 1e-6

    # critical velocity
    critical_velocity = np.sqrt(
        erosion_inputs.tauc / WATER_DENSITY * single_calculation.chezy ** 2 / g
    )

    # strength
    cE = 1.85e-4 / erosion_inputs.tauc

    # total wave damping coefficient
    # mu_tot = (mu_slope / H0) + mu_reed
    # water level along bank line
    ho_line_ship = np.minimum(
        single_calculation.water_level - erosion_inputs.bank_protection_level, 2 * wave_height
    )
    ho_line_flow = np.minimum(
        single_calculation.water_level - erosion_inputs.bank_protection_level,
        single_calculation.water_depth,
        )
    h_line_ship = np.maximum(bank_height - single_calculation.water_level + ho_line_ship, 0)
    h_line_flow = np.maximum(bank_height - single_calculation.water_level + ho_line_flow, 0)

    # compute displacement due to flow
    crit_ratio = np.ones(critical_velocity.shape)
    mask = (vel > critical_velocity) & (
            single_calculation.water_level > erosion_inputs.bank_protection_level
    )
    crit_ratio[mask] = (vel[mask] / critical_velocity[mask]) ** 2
    erosion_distance_flow = erosion_coef * (crit_ratio - 1) * time_erosion * sec_year

    # compute displacement due to ship waves
    ship_wave_max = single_calculation.water_level + 0.5 * wave_height
    ship_wave_min = single_calculation.water_level - 2 * wave_height
    mask = (ship_wave_min < water_level_fairway_ref) & (
            water_level_fairway_ref < ship_wave_max
    )
    # limit mu -> 0

    erosion_distance_shipping = cE * wave_height**2 * ts * time_erosion
    erosion_distance_shipping[~mask] = 0

    # compute erosion volume
    mask = (h_line_ship > 0) & (
            single_calculation.water_level > erosion_inputs.bank_protection_level
    )
    dv_ship = erosion_distance_shipping * segment_length * h_line_ship
    dv_ship[~mask] = 0.0
    erosion_distance_shipping[~mask] = 0.0

    mask = (h_line_flow > 0) & (
            single_calculation.water_level > erosion_inputs.bank_protection_level
    )
    dv_flow = erosion_distance_flow * segment_length * h_line_flow
    dv_flow[~mask] = 0.0
    erosion_distance_flow[~mask] = 0.0

    erosion_distance = erosion_distance_shipping + erosion_distance_flow
    erosion_volume = dv_ship + dv_flow
    single_calculation.erosion_volume_tot = erosion_volume
    single_calculation.erosion_distance_tot = erosion_distance
    single_calculation.erosion_distance_shipping = erosion_distance_shipping
    single_calculation.erosion_distance_flow = erosion_distance_flow
    single_calculation.ship_wave_max = ship_wave_max
    single_calculation.ship_wave_min = ship_wave_min
    return single_calculation

The ErosionCalculator class provides methods for calculating bank erosion, such as:

  • comp_erosion_eq: Computes the equilibrium bank erosion distance and volume
  • compute_bank_erosion_dynamics: Computes the bank erosion during a specific discharge level
  • comp_hw_ship_at_bank: Computes wave heights at bank due to passing ships

Usage Example#

from dfastbe.bank_erosion.erosion_calculator import ErosionCalculator
from dfastbe.bank_erosion.data_models.calculation import SingleCalculation, SingleParameters, SingleErosion
import numpy as np

# Initialize ErosionCalculator
calculator = ErosionCalculator()

# Compute equilibrium bank erosion
erosion_distance_eq, erosion_volume_eq = calculator.comp_erosion_eq(
    bank_height=np.array([5.0, 5.5, 6.0]),
    segment_length=np.array([10.0, 10.0, 10.0]),
    water_level_fairway_ref=np.array([2.0, 2.0, 2.0]),
    discharge_level_pars=discharge_level_pars,
    bank_fairway_dist=np.array([20.0, 25.0, 30.0]),
    water_depth_fairway=np.array([3.0, 3.5, 4.0]),
    erosion_inputs=erosion_inputs
)

# Compute bank erosion dynamics
parameter = SingleCalculation()
parameter.bank_velocity = np.array([1.0, 1.2, 1.5])
parameter.water_level = np.array([2.0, 2.0, 2.0])
parameter.chezy = np.array([50.0, 50.0, 50.0])

parameter = calculator.compute_bank_erosion_dynamics(
    parameter,
    bank_height=np.array([5.0, 5.5, 6.0]),
    segment_length=np.array([10.0, 10.0, 10.0]),
    bank_fairway_dist=np.array([20.0, 25.0, 30.0]),
    water_level_fairway_ref=np.array([2.0, 2.0, 2.0]),
    discharge_level_pars=discharge_level_pars,
    time_erosion=1.0,
    water_depth_fairway=np.array([3.0, 3.5, 4.0]),
    erosion_inputs=erosion_inputs
)

For more details on the specific methods and their parameters, refer to the API reference below.