.. sectionauthor:: Yasuyuki SHIMIZU #################################################################### Calculation of 2D flow in meandering channels(basic edition) #################################################################### .. _sgcv: Sine-generated curve ====================================================== Generating a sine-generated curve ------------------------------------------------------------------ According to Langbein and Leopold [Ref:33]_, the channel shape of a meandering river can be approximated by the following sine-generated curve. “Sine-generated curve” does not mean a curve whose planar coordinates on the river follow a sine curve; the “sine” refers to the sine function that is used to express the angle of the channel direction. .. math:: :label: sgc_1 \theta = \theta_0 \sin \cfrac{2\pi s}{L} Where, :math:`s` is the coordinate axis along the channel centerline, :math:`\theta` is an angle from the horizontal direction of the :math:`s` axis (the meandering deflection angle), :math:`\theta_0` is the maximum meandering deflection angle, and :math:`L` is the meandering wavelength (the length along the :math:`s` axis). :numref:`anim10`, :numref:`anim20` and :numref:`anim30` are the simulation results using the sine-generated curves. When using Equation :eq:`sgc_1` to draw a channel shape and when using that shape to perform analyses, such shape needs to be converted to :math:`x-y` coordinates. .. _sg_xy: .. figure:: images/0C/sg_xy.png :width: 80% :align: center : Relationships between :math:`\Delta x, \Delta y, \Delta s` The components in the :math:`x,y` directions of the infinitesimal element, :math:`\Delta s`, along the :math:`s` axis are defined by :numref:`sg_xy` as follows. .. math:: :label: sg_xy1 \Delta x = \Delta s \cos\theta, \hspace{2cm} \Delta y = \Delta s \sin\theta Then, :math:`s,x,y` are given as follows. .. math:: :label: sg_xy2 s=s_0 +\int_{s_0}^s ds, \hspace{1cm} x=x_0 +\int_{s_0}^s \cos\theta ds, \hspace{1cm} y=y_0 +\int_{s_0}^s \sin\theta ds The actual calculation procedure is as follows. #. Successively add infinitesimal :math:`\Delta s` along the :math:`s` axes. #. At each addition, using Equation :eq:`sgc_1`, obtain :math:`\theta`. #. Using :math:`\theta` and :math:`\Delta s` defined above, obtain :math:`\Delta x` and :math:`\Delta y` with Equation :eq:`sg_xy1`. #. By cumulating this, successively obtain the values of :math:`x, y`. The Python code for this is as follows. https://github.com/YasuShimizu/Python-Code/blob/main/sg_plot.py The code above plots four types of alignment for sine-generated curves when :math:`\theta_0` are :math:`30^\circ, 60^\circ, 90^\circ, 120^\circ`. The wavelength, the wave number, and the like are specified in the code. The following figure shows the execution results of the code. .. _sg_curve: .. figure:: images/0C/sg_curve.png :width: 120% :align: center : Example of a sine-generated curve Making calculation grids by using a sine-generated curve --------------------------------------------------------------------------- The shapes shown by :numref:`sg_curve` are the shapes of the centerline. When performing the 2D analysis, we need the coordinates of the right and left banks, and we need the coordinates of each grid obtained by dividing the right and left bank coordinates by the number of grids in the cross-sectional direction. .. _sg_grid: .. figure:: images/0C/sg_grid.png :width: 80% :align: center : Definitions of the right and left banks in a sine-generated curve As shown by :numref:`sg_grid`, the coordinates of the right and left banks are the two points at a distance that is half the river width from the intersection between the :math:`s` axis (the channel centerline) and a traversal line perpendicular to the axis. Assuming that the coordinates of the center of the channel and the grid points of the right and left banks are :math:`(x_c, y_c), (x_r, y_r), (x_l, y_l)`, respectively, then the following equations are satisfied. .. math:: :label: sg_xy3 x_r=x_c+\cfrac{B}{2}\sin\theta, \hspace{2cm} & y_r=y_c-\cfrac{B}{2}\cos\theta x_l=x_c-\cfrac{B}{2}\sin\theta, \hspace{2cm} & y_l=y_c+\cfrac{B}{2}\cos\theta Calculation grids are obtained by dividing the coordinates of the right and left banks with the given grid number. The following is an example for :math:`\theta_0=40^\circ`. .. _grid40: .. figure:: images/0C/grid40.png :width: 120% :align: center : Example of the calculation grids for the sine-generated curve when :math:`\theta=40^\circ` The Python code for generating this grid is as follows. https://github.com/YasuShimizu/Python-Code/blob/main/sg_mkgrid40.py For your reference, an example when :math:`\theta_0=100^\circ` is below. .. _grid100: .. figure:: images/0C/grid100.png :width: 120% :align: center : Example of the calculation grids for the sine-generated curve when :math:`\theta=100^\circ` The Python code is below: https://github.com/YasuShimizu/Python-Code/blob/main/sg_mkgrid100.py .. _art_bar: Giving a "bar and pool" geometry to the bed ----------------------------------------------------------------- For the plane shape of the generated calculation grids :numref:`grid100`, the following equation can give sandbar-like relative heights on the bed. .. math:: :label: amp1 \Delta_z = -A_p\cos\left\{\cfrac{2\pi}{L}(s-\delta_s)\right\} \cos\left\{\cfrac{\pi}{B}n\right\} Where, :math:`\Delta_z` is the height relative to that of the bed, :math:`A_p` is the sandbar wave-height, :math:`s` is the distance along the channel centerline from the upstream end, :math:`n` is the distance from the right bank to the left bank, and :math:`\delta s` is the phase difference between the sandbar and the channel shape. Using Equation :eq:`amp1`, sandbar relative heights are arranged on a channel with a sine-generated curve as follows. Note that in this example, :math:`\theta_0=100^\circ`, :math:`L=` 3.0 m, :math:`B=` 0.3 m, :math:`A_p=` 0.03 m, and :math:`\delta_s=` 0.1 m. .. _grid100_dz: .. figure:: images/0C/grid100_dz.png :width: 120% :align: center : Example of a rendering of a sandbar-like bed on the sine-generated curve when :math:`\theta=100^\circ` The Python code for calculating and rendering :numref:`grid100_dz` is as follows. https://github.com/YasuShimizu/Python-Code/blob/main/sg_mkgrid_dz.py .. _kino_gmc: Kinoshita meandering curve (meander curve proposed by Kinoshita) ======================================================================== According to Abad and Garcia [Ref:34]_, by adding an additional term to Equation :eq:`sgc_1`, such as that shown below, it is possible to reproduce the meandering shape of a natural river, such as :numref:`Alatna`. .. math:: :label: kns_1 \theta = \theta_0 \sin \cfrac{2\pi s}{L} +{\theta_0}^3\left\{J_s \cos\left(3\cfrac{2\pi s}{L}\right) -J_f \sin\left(3\cfrac{2\pi s}{L}\right) \right\} Where, :math:`J_s` and :math:`J_n` are factors that show skewness and flatness, respectively. .. _Alatna: .. figure:: images/0C/AlatnaRiver.png :width: 100% :align: center : The Alatna River in Alaska, U.S.A. [Ref:35]_ In Equation :eq:`kns_1`, assuming that :math:`\theta_0=100^\circ`, :math:`L` =2.8m, :math:`B` =0.2m, and :math:`J_s=1/32, J_f=1/192`, channel calculation girds are generated and shown in :numref:`kino`. Abad and Garcia [Ref:34] call this channel planar shape the Kinoshita-generated meander curve, after the tortuous meander of Kinoshita [Ref:24]_. .. _kino: .. figure:: images/0C/kino.png :width: 100% :align: center : A Kinoshita meander curve channel The Python code for generating calculation grids for :numref:`kino` is as follows. https://github.com/YasuShimizu/Python-Code/blob/main/kinoshita100.py The Kinoshita-generated meander curve in :numref:`kino` can reproduce a bed topography that models the sandbar geometry of an actual river by giving the relative height on the sandbar in Equation :eq:`kns_1`. .. _kinoshita100_dz: .. figure:: images/0C/kinoshita100_dz.png :width: 120% :align: center : Pool and bar geometry bed on the Kinoshita-generated curve when :math:`\theta=100^\circ`, :math:`A_p=` 0.03m, and :math:`\delta_s=` 0.1m. The Python code for rending :numref:`kinoshita100_dz` is below. https://github.com/YasuShimizu/Python-Code/blob/main/kinoshita100_dz.py .. _real_river: Calculation of the sinuosity ================================== For the above sine-generated curve and the Kinoshita-generated curve, the sinuosity of the channel is given by... .. math:: :label: radi \cfrac{1}{r}= \cfrac{\partial \theta}{\partial s} For example, for the sine-generated curve in Equation :eq:`sgc_1`, the sinuosity is given as follows. .. math:: :label: radi_1 \cfrac{1}{r}=\cfrac{\partial \theta}{\partial s} = \cfrac{2\pi}{L}\theta_0 \cos \cfrac{2\pi n}{L} However, the shape of a river tends not to conform exactly to the functional form described above. The sinuosity is calculated from various arbitrary shapes, both for natural and artificial channels. .. _r_cal_1: .. figure:: images/0C/r_cal.png :width: 100% :align: center : Calculating the radius of curvature from the planar coordinates As shown in :numref:`r_cal_1` , when there are planar coordinates along the center of the channel, the radius of curvature can be obtained by using Equation :eq:`radi` in a discrete manner. Now, .. math:: :label: radi_2 \cfrac{d}{ds}\left(\cfrac{dy}{dx}\right)=\cfrac{d}{ds}\tan\theta =\cfrac{1}{\cos^2\theta}\cfrac{d\theta}{ds} Therefore, .. math:: :label: radi_3 \cfrac{1}{r}=\cos^2\theta\cfrac{d}{ds} \left(\cfrac{dy}{dx}\right) Using the symbols shown in :numref:`r_cal_1`, we define the following. .. math:: :label: radi_4 \Delta x_i=x_i-x_{i-1}, \hspace{1cm} \Delta y_i=y_i-y_{i-1}, \hspace{1cm} \Delta s_i =\sqrt{\Delta x_x^2 + \Delta y_i^2} \\ \cos\theta_i = \cfrac{\Delta x_i}{\Delta s_i}, \hspace{4cm} \sin\theta_i = \cfrac{\Delta y_i}{\Delta s_i} \hspace{3cm} Then, we have... .. math:: :label: radi_5 \cfrac{1}{r}=\cos^2\theta \cfrac{d}{ds}\left(\cfrac{dy}{dx}\right) =\cfrac{\Delta x^2}{\Delta s^2} \cfrac{\Delta x \cfrac{d(\Delta y)}{ds}-\Delta y \cfrac{d(\Delta x)}{ds}}{\Delta x^2} =\cfrac{1}{{\Delta s_i}^2} \left[ \Delta x \left\{ \sin\theta_{i+1}-\sin\theta_i \right\} -\Delta y \left\{ \cos\theta_{i+1} - \cos\theta_i \right\} \right] =\cfrac{1}{\Delta s_i} \left[ \cos\theta_i \left\{\sin\theta_{i+1}-\sin\theta_i \right\} -\sin\theta_i \left\{ \cos\theta_{i+1} - \cos\theta_i \right\} \right] The results of comparison between the analytically calculated curvature that is obtained by applying :eq:`radi_1` to the sine-generated curve and the numerically calculated curvature that is obtained by using Equation :eq:`radi_5` are shown in the figure below. The blue line represents analytical solutions, and the orange line represents numerical solutions. This is an example where the meander deviation angle is :math:`\theta_0=90^\circ`. As you can see, the analytical and numerical solutions almost perfectly correspond to each other. .. _rc_cmp: .. figure:: images/0C/rc_cmp.png :width: 100% :align: center : Verification example for a curvature calculation method using numerical calculation The Python code for calculating and rendering :numref:`rc_cmp` are as follows. https://github.com/YasuShimizu/Python-Code/blob/main/radius_cmp.py