From cc4626125b922cff322e9dba796aba43bd08f4c0 Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Fri, 3 Nov 2023 11:56:49 +0100 Subject: [PATCH 1/4] Some fixes for rendering docs to PDF --- docs/core/allocation.qmd | 2 +- docs/core/equations.qmd | 34 +++++++++++++++------------------- docs/core/numerics.qmd | 9 ++++----- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/docs/core/allocation.qmd b/docs/core/allocation.qmd index 3f6b6217e..5f3509d89 100644 --- a/docs/core/allocation.qmd +++ b/docs/core/allocation.qmd @@ -172,7 +172,7 @@ $$ $$ \hat{C}_S^p \leftarrow \hat{C}_S^p - F; $$ -5. Repeat steps 2-4 for the remaining priorities up to $p_\max$. +5. Repeat steps 2-4 for the remaining priorities up to $p_{\max}$. :::{.callout-note} In the future there will be another solve before the priority 1 solve, taking the demand/supply from basins into account. diff --git a/docs/core/equations.qmd b/docs/core/equations.qmd index 4724d68d8..5b1d2e606 100644 --- a/docs/core/equations.qmd +++ b/docs/core/equations.qmd @@ -94,18 +94,16 @@ The presence of division by the basin area means that areas of size zero are not ## The reduction factor {#sec-reduction_factor} At several points in the equations below a *reduction factor* is used. This is a term that makes certain transitions more smooth, for instance when a pump stops providing water when its source basin dries up. The reduction factor is given by -$$ +\begin{align} \phi(x; p) = - \begin{align} - \begin{cases} - 0 &\text{if}\quad x < 0 \\ - -2 \left(\frac{x}{p}\right)^3 + 3\left(\frac{x}{p}\right)^2 &\text{if}\quad 0 \le x \le p \\ - 1 &\text{if}\quad x > p - \end{cases} - \end{align}, -$$ + \begin{cases} + 0 &\text{if}\quad x < 0 \\ + -2 \left(\frac{x}{p}\right)^3 + 3\left(\frac{x}{p}\right)^2 &\text{if}\quad 0 \le x \le p \\ + 1 &\text{if}\quad x > p + \end{cases} +\end{align} -where $p > 0$ is the threshold value which determines the interval $[0,p]$ of the smooth transition between $0$ and $1$, see the plot below. +Here $p > 0$ is the threshold value which determines the interval $[0,p]$ of the smooth transition between $0$ and $1$, see the plot below. ```{python} # | code-fold: true @@ -463,23 +461,21 @@ $$ Q_\text{PID}(t) = K_p e(t) + K_i\int_{t_0}^t e(\tau)\text{d}\tau + K_d \frac{\text{d}e}{\text{d}t}, $$ {#eq-PIDflow} -for given constant parameters $K_p,K_i,K_d$. The pump or outlet can have associated minimum and maximum flow rates $Q_\min, Q_\max$, and so +for given constant parameters $K_p,K_i,K_d$. The pump or outlet can have associated minimum and maximum flow rates $Q_{\min}, Q_{\max}$, and so $$ -Q_\text{pump/outlet} = \text{clip}(\Phi Q_\text{PID}; Q_\min, Q_\max). +Q_\text{pump/outlet} = \text{clip}(\Phi Q_\text{PID}; Q_{\min}, Q_{\max}). $$ Here $u_\text{us}$ is the storage of the basin upstream of the pump or outlet, $\Phi$ is the product of [reduction factors](equations.qmd#sec-reduction_factor) associated with the [pump](equations.qmd#sec-pump) or [outlet](equations.qmd#sec-outlet) and -$$ -\text{clip}(Q; Q_\min, Q_\max) = \begin{align} + \text{clip}(Q; Q_{\min}, Q_{\max}) = \begin{cases} - Q_\min & \text{if} & Q < Q_\min \\ - Q & \text{if} & Q_\min \leq Q \leq Q_\max \\ - Q_\max & \text{if} & Q > Q_\max + Q_{\min} & \text{if} \quad Q < Q_{\min} \\ + Q & \text{if} \quad Q_{\min} \leq Q \leq Q_{\max} \\ + Q_{\max} & \text{if} \quad Q > Q_{\max} \end{cases}. \end{align} -$$ For the integral term we denote $$ @@ -511,7 +507,7 @@ that is, $\hat{f}_\text{PID}$ is the right hand side of the ODE for the controll Using this, solving @eq-PIDflow for $Q_\text{PID}$ yields $$ -Q_\text{pump/outlet} = \text{clip}\left(\phi(u_\text{us})\frac{K_pe + K_iI + K_d \left(\frac{\text{d}\text{SP}}{\text{d}t}-\frac{\hat{f}_\text{PID}}{A(u_\text{PID})}\right)}{1\pm\phi(u_\text{us})\frac{K_d}{A(u_\text{PID})}};Q_\min,Q_\max\right), +Q_\text{pump/outlet} = \text{clip}\left(\phi(u_\text{us})\frac{K_pe + K_iI + K_d \left(\frac{\text{d}\text{SP}}{\text{d}t}-\frac{\hat{f}_\text{PID}}{A(u_\text{PID})}\right)}{1\pm\phi(u_\text{us})\frac{K_d}{A(u_\text{PID})}};Q_{\min},Q_{\max}\right), $$ where the clipping is again done last. Note that to compute this, $\hat{f}_\text{PID}$ has to be known first, meaning that the PID controlled pump/outlet flow rate has to be computed after all other contributions to the PID controlled basin's storage are known. diff --git a/docs/core/numerics.qmd b/docs/core/numerics.qmd index d1e338002..6029eb447 100644 --- a/docs/core/numerics.qmd +++ b/docs/core/numerics.qmd @@ -49,17 +49,16 @@ $$ \mathbf{g}(\mathbf{x}) = \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{x},t_{n+1}) $$ by iterating $\mathbf{g}$ on an initial guess of $\mathbf{w}_{n+1}$; -- Newton-Raphson iterations: approximate $\mathbf{w}_{n+1}$ as a root of the function +- Newton iterations: approximate $\mathbf{w}_{n+1}$ as a root of the function $$ \mathbf{h}(\mathbf{x}) = \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{x},t_{n+1}) - \mathbf{x}, $$ by iteratively finding the root of its linearized form: -$$ + \begin{align} \mathbf{0} =& \mathbf{h}(\mathbf{w}_{n+1}^k) + \mathbf{J}(\mathbf{h})(\mathbf{w}_{n+1}^k)(\mathbf{w}_{n+1}^{k+1}-\mathbf{w}_{n+1}^k) \\ =& \mathbf{w}_n + (t_{n+1}-t_n)\mathbf{f}(\mathbf{w}_{n+1}^k,t_{n+1}) - \mathbf{w}_{n+1}^k \\ +&\left[(t_{n+1}-t_n)\mathbf{J}(\mathbf{f})(\mathbf{w}_{n+1}^k)-\mathbf{I}\right](\mathbf{w}_{n+1}^{k+1}-\mathbf{w}_{n+1}^k). \end{align} -$$ {#eq-newtoniter} Note that this thus requires an evaluation of the Jacobian of $\mathbf{f}$ and solving a linear system per iteration. # The advantage of implicit methods @@ -67,7 +66,7 @@ Note that this thus requires an evaluation of the Jacobian of $\mathbf{f}$ and s The implicit method @eq-eulerbackward is a coupled system of equations for $\mathbf{w}_{n+1}$, while the explicit @eq-eulerforward is fully decoupled. This means in general that in a time integration step with an implicit method the basins communicate information with eachother, while in an explicit method this does not happen. A consequence of this is that local events (e.g. a pump turns on) propagate slowly trough the model using an explicit method but quickly using an implicit method, making implicit methods more stable. # Jacobian computations -The iterations @eq-newtoniter require an evaluation of the Jacobian of $\mathbf{f}$. The Jacobian of `water_balance!` is discussed [here](equations.qmd#the-jacobian). +The Newton iterations above require an evaluation of the Jacobian of $\mathbf{f}$. The Jacobian of `water_balance!` is discussed [here](equations.qmd#the-jacobian). There are several ways to compute the Jacobian: @@ -77,7 +76,7 @@ There are several ways to compute the Jacobian: # Continuity considerations -The convergence of the Newton-Raphson method can be [proven](https://en.wikipedia.org/wiki/Newton%27s_method#Proof_of_quadratic_convergence_for_Newton's_iterative_method) given certain properties of $\mathbf{f}$ around the initial guess and root to find. An important aspect is the smoothness of $\mathbf{f}$. The basin profiles and $Q(h)$ relations are given by interpolated data, and thus we have some control over the smoothness of these functions by the choice of interpolation method. This is discussed further below. the Manning resistance is not mentioned here since it is given by an analytical expression. +The convergence of the Newton method can be [proven](https://en.wikipedia.org/wiki/Newton%27s_method#Proof_of_quadratic_convergence_for_Newton's_iterative_method) given certain properties of $\mathbf{f}$ around the initial guess and root to find. An important aspect is the smoothness of $\mathbf{f}$. The basin profiles and $Q(h)$ relations are given by interpolated data, and thus we have some control over the smoothness of these functions by the choice of interpolation method. This is discussed further below. the Manning resistance is not mentioned here since it is given by an analytical expression. Control mechanisms can change parameters of $\mathbf{f}$ discontinuously, leading to discontinuities of $\mathbf{f}$. This however does not yield problems for the time integration methods in `DifferentialEquations.jl`, since the [callback mechanisms](https://docs.sciml.ai/DiffEqDocs/stable/features/callback_functions/) used to change these parameters make the solver take these discontinuities into account. From ae305cf59af0fabc41910c7a1dec214a3ffbdfc3 Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Fri, 3 Nov 2023 20:41:42 +0100 Subject: [PATCH 2/4] Images with HTML in docs --- docs/couple/modflow-demo.qmd | 30 +++++++++++----------- docs/index.qmd | 14 +++++----- docs/qgis/index.qmd | 50 ++++++++++++++++++------------------ 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/docs/couple/modflow-demo.qmd b/docs/couple/modflow-demo.qmd index 628532baf..b407a0450 100644 --- a/docs/couple/modflow-demo.qmd +++ b/docs/couple/modflow-demo.qmd @@ -60,11 +60,11 @@ and volume-discharge relationships. ::: A visual representation of this simplified conceptual schematization is given -in @fig-volume-depth and @fig-volume-discharge. +in Figure 1 and Figure 2. -![Distribution of water depths over the primary, secondary, and tertiary system.](https://user-images.githubusercontent.com/13662783/187665858-d01fd60f-f3c2-4662-af82-cf8acfbe169b.PNG){#fig-volume-depth} +
Figure 1: Distribution of water depths over the primary, secondary, and tertiary system.
alt="Figure 1: Distribution of water depths over the primary, secondary, and tertiary system."
-![Discharge as a function of basin storage volume.](https://user-images.githubusercontent.com/13662783/187668931-c04d4126-9208-44f5-bafa-4c5f74a96dc9.PNG){#fig-volume-discharge} +
Figure 2: Discharge as a function of basin storage volume.
alt="Figure 2: Discharge as a function of basin storage volume."
An example of the resulting parameters for a single cell is shown in @tbl-hupsel-v-h. The first row shows the water levels when the basin is empty. @@ -85,21 +85,21 @@ in the test cases for the sake of simplicity. : Volume-level table for a single cell in the Hupsel basin. {#tbl-hupsel-v-h} -@fig-grid-volume shows the volume of the first row of the cell based +Figure 3 shows the volume of the first row of the cell based input for the primary system. Symbology is set to unique values. While water levels differ per cell in this parametrization, the "normative volume" defined above is shared by all cells in a basin. -![Basin normative volume of the primary system.](https://user-images.githubusercontent.com/13662783/187672671-20d22031-3b50-474a-9ee1-4408c25a4f30.PNG){#fig-grid-volume} +
Figure 3: Basin normative volume of the primary system.
alt="Figure 3: Basin normative volume of the primary system."
-@fig-grid-volume shows the water level corresponding to the normative storage +Figure 3 shows the water level corresponding to the normative storage volume based input for the primary system (it corresponds to the value shown in the first row of the primary column in @tbl-hupsel-v-h). We see a clear gradient from west to east: as our simplified parametrization assumes a constant water depth for all cells in a single system, water levels spatially fall and rise with the bottom elevation. -![Water level corresponding to the normative basin volume of the primary system.](https://user-images.githubusercontent.com/13662783/187672663-99b9efd3-5e09-4d6f-bd3a-4180ff5b2ce4.PNG){#fig-grid-level} +
Figure 4: Water level corresponding to the normative basin volume of the primary system.
alt="Figure 4: Water level corresponding to the normative basin volume of the primary system."
## Example: Configuration @@ -169,9 +169,9 @@ From these tests, we expect the following behavior: 2. In case of negative recharge (evapotranspiration), infiltration occurs in the surface waters. Infiltration should be zero when the basin volume is 0. -![Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187715341-fd99dc06-2eda-4b84-a201-650dc7220574.png){#fig-hupsel-gwb-steady} +
Figure 5: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
alt="Figure 5: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d."
-@fig-hupsel-gwb-steady shows the water balance of steady-state for submodel of the +Figure 5 shows the water balance of steady-state for submodel of the LHM that has been by selecting the cells belonging to the district containing the Hupsel catch, the Berkel. @@ -194,9 +194,9 @@ steady-state model), the surface waters provide mostly inflow, and recharge is a negative term. In this case, the secondary system provides a small amount of infiltration; most of the water is drawn from the surroundings instead. -![Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187715349-9eee8830-9b03-4a88-b7c9-b16004c694f6.png){#fig-hupsel-gwb-volume0} +
Figure 6: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
alt="Figure 6: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d."
-@fig-hupsel-gwb-volume0 shows the same model, with 0-basin volume which causes +Figure 6 shows the same model, with 0-basin volume which causes water levels to be set equal to bed elevation. Consequently, primary and secondary outflow terms are larger for positive groundwater recharge as they drain at a lower level and intercept the water before the tertiary system does. @@ -215,9 +215,9 @@ process, but without Ribasim. This results in volumes of 0.0, so all MODFLOW 6 water levels are set equal to bed elevation. 3. A coupled run where the water levels are updated by Ribasim. -![Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187769185-f63a5821-dfe8-4d99-b43e-780962e73870.png){#fig-tol-gwb-steady} +
Figure 7: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
alt="Figure 7: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d."
-@fig-tol-gwb-steady shows the water balance of steady-state for a submodel of +Figure 7 shows the water balance of steady-state for a submodel of the LHM for the Polder de Tol and its surroundings. While groundwater recharge is the dominant ingoing flow, lateral groundwater flow (over the entire depth of the groundwater model) is a sizable inflow for the area; the larger lateral @@ -228,9 +228,9 @@ ephemeral tertiary ditches, but by the permanently water-bearing ditches of the primary and secondary system. Unlike the Hupsel, the water balance does not shrink to very small discharges, as there is sizable regional groundwater flow. -![Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187769180-91f6344c-3489-4200-8a0c-d5e82a28ebaf.png){#fig-tol-gwb-volume0} +
Figure 8: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
alt="Figure 8: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d."
-@fig-tol-gwb-volume0 shows the same model, with 0-basin volume which causes +Figure 8 shows the same model, with 0-basin volume which causes water levels to be set equal to bed elevation. The total discharge is larger: the primary and secondary systems are set to lower levels, and so the head difference is larger. While De Tol's evapotranspiration excess can be fed by diff --git a/docs/index.qmd b/docs/index.qmd index 8597df9a7..fb3b7434e 100644 --- a/docs/index.qmd +++ b/docs/index.qmd @@ -52,9 +52,9 @@ a set of symbolic equations, and can be connected to each other. From this a sim system of equations is generated automatically. We use solvers with adaptive time stepping from [DifferentialEquations.jl](https://diffeq.sciml.ai/stable/) to get results. -![Example timeseries of a single basin, the Hupselse Beek, with the input and output fluxes on the top, and the storage volume (the state) below.](https://user-images.githubusercontent.com/4471859/179259333-070dfe18-8f43-4ac4-bb38-013b252e2e4b.png) +
Figure 1: Example timeseries of a single basin, the Hupselse Beek, with the input and output fluxes on the top, and the storage volume (the state) below.
alt="Figure 1: Example timeseries of a single basin, the Hupselse Beek, with the input and output fluxes on the top, and the storage volume (the state) below."
-![Example bar plot of the daily waterbalance for the Hupselse Beek, comparing results of Mozart (left) and Ribasim (right).](https://user-images.githubusercontent.com/4471859/179259174-0caccd4a-c51b-449e-873c-17d48cfc8870.png) +
Figure 2: Example bar plot of the daily waterbalance for the Hupselse Beek, comparing results of Mozart (left) and Ribasim (right).
alt="Figure 2: Example bar plot of the daily waterbalance for the Hupselse Beek, comparing results of Mozart (left) and Ribasim (right)."
# Introduction @@ -108,7 +108,7 @@ Local Surface Water (LSW)). Each basin has an associated polygon, and the set of connected to each other as described by a graph, which we call the network. Below is a representation of both on the map. -![Mozart Local Surface Water polygons and their drainage.](https://user-images.githubusercontent.com/4471859/185932183-62c305e6-bc14-4f3c-a74c-437f831c9145.png) +
Figure 3: Mozart Local Surface Water polygons and their drainage.
alt="Figure 3: Mozart Local Surface Water polygons and their drainage."
The network is described as graph. Flow can be bi-directional, and the graph does not have to be acyclic. @@ -131,16 +131,16 @@ lines between A, B, C, and D) instead. Multiple basins may exist within the same spatial polygon, representing different aspects of the surface water system (perennial ditches, ephemeral -ditches, or even surface ponding). @fig-p, @fig-s, @fig-t show the 25.0 m +ditches, or even surface ponding). Figure 4, Figure 5, Figure 6 show the 25.0 m rasterized primary, secondary, and tertiary surface waters as identified by BRT TOP10NL [@pdoktopnl] in the Hupsel basin (as defined in the Mozart LSW's). These systems may represented in multiple ways. -![Hupsel: primary surface water.](https://user-images.githubusercontent.com/13662783/187625163-d0a81bb6-7f55-4ad1-83e2-90ec1ee79740.PNG){#fig-p} +
Figure 4: Hupsel: primary surface water.
alt="Figure 4: Hupsel: primary surface water."
-![Hupsel: secondary surface water.](https://user-images.githubusercontent.com/13662783/187625170-1acdfb41-7077-443f-b140-ae18cbf21e53.PNG){#fig-s} +
Figure 5: Hupsel: secondary surface water.
alt="Figure 5: Hupsel: secondary surface water."
-![Hupsel: tertiary surface water.](https://user-images.githubusercontent.com/13662783/187625174-3eec28b5-ddbb-4870-94c3-d9e9a43f8eb4.PNG){#fig-t} +
Figure 6: Hupsel: tertiary surface water.
alt="Figure 6: Hupsel: tertiary surface water."
As a single basin (A) containing all surface water, discharging to its downstream basin to the west (B): diff --git a/docs/qgis/index.qmd b/docs/qgis/index.qmd index ee1d4a7f7..f4ebc1aad 100644 --- a/docs/qgis/index.qmd +++ b/docs/qgis/index.qmd @@ -14,18 +14,18 @@ Download `ribasim_qgis.zip`, see the [download section](../index.qmd#sec-downloa Plugins menu > Manage and Install Plugins... -![](https://user-images.githubusercontent.com/4471859/224939069-9aae77ea-898f-442f-83b5-f2671c114956.png){fig-align="left"} +
Select "Install from ZIP": - Browse to the `ribasim_qgis.zip` file containing the plugin that was downloaded earlier - Click "Install Plugin" -![](https://user-images.githubusercontent.com/4471859/224939080-7fec5db2-4417-4f7b-8e45-034d4cf4fd75.png){fig-align="left"} +
Start the Ribasim plugin. -![](https://user-images.githubusercontent.com/4471859/224939101-228e068a-875b-4df2-98bb-6ee6a3830ddd.png){fig-align="left"} +
### Add iMOD plugin @@ -41,20 +41,20 @@ Documentation on the Time Series widget can be found in the [iMOD documentation] Open example model `database.gpkg` or create a new model. -![](https://user-images.githubusercontent.com/4471859/224939126-b38f0eed-2e89-4120-b541-5b8c31798c09.png){fig-align="left"} +
Check if your coordinate reference system (CRS) is set correctly. -![](https://user-images.githubusercontent.com/4471859/224939143-19e9931e-da4b-4717-ba28-67a0f141dd40.png){fig-align="left"} +
If you are working with an unknown CRS, right click the model database group in Layers, and click "Set Group CRS...". -![](https://user-images.githubusercontent.com/4471859/224939165-45807f16-2d3a-41b3-92a2-7fe0e86ae72b.png){fig-align="left"} +
If you are modeling the Netherlands, select "Amersfoort / RD New" (EPSG:28992). -![](https://user-images.githubusercontent.com/4471859/224939182-3486ff0b-842b-4f98-a37e-ecd04f29aa7f.png){fig-align="left"} +
## Edit nodes @@ -62,35 +62,35 @@ If you are modeling the Netherlands, select "Amersfoort / RD New" (EPSG:28992). Select the Node layer. -![](https://user-images.githubusercontent.com/4471859/224939204-2aa2ead2-a028-4673-b747-abeadd821ec8.png){fig-align="left"} +
Turn on the edit mode to be able to add nodes on the map. -![](https://user-images.githubusercontent.com/4471859/224939223-66e232c0-748c-46f0-ba1b-8751a965f114.png){fig-align="left"} +
Add nodes to the map with a left click and select the node type. -![](https://user-images.githubusercontent.com/4471859/224939237-67c1150b-15ec-4044-a02a-26a82f81da05.png){fig-align="left"} +
Turn the edit mode off and save the edits to the Nodes layer. -![](https://user-images.githubusercontent.com/4471859/224946136-e37021d5-80c1-4d90-ac04-d0dbd96879f3.png){fig-align="left"} +
### Edit tables Right click a layer and select "Open Attribute Table". -![](https://user-images.githubusercontent.com/4471859/224939276-ca8f856d-3325-49a7-b457-78b09b81ac5e.png){fig-align="left"} +
Click the yellow pencil icon on the top left to enable editing, and copy and paste a record. A record can be selected by clicking on the row number. -![](https://user-images.githubusercontent.com/4471859/224939287-a8b9f351-9aea-4e3a-8417-3867cd40cda5.png){fig-align="left"} +
Adjust the content. If you prefer, it also works to copy data with the same columns from Excel. Turn off edit mode and save changes to the layer. -![](https://user-images.githubusercontent.com/4471859/224939297-4b0ca812-9618-4d25-ab7a-518bf1ca63e1.png){fig-align="left"} +
## Connect nodes @@ -99,21 +99,21 @@ Excel. Turn off edit mode and save changes to the layer. Make sure the Snapping Toolbar is visible, by going to the View > Toolbars menu. Turn on snapping mode by clicking the magnet and set the snapping distance to 25 pixels. -![](https://user-images.githubusercontent.com/4471859/224939328-8359272a-30bb-4eb1-ab6c-968318ac3997.png){fig-align="left"} +
### Create connecting edges Select the Edge layer and turn on the edit mode. -![](https://user-images.githubusercontent.com/4471859/224939342-c6939331-a60d-4526-a350-3cddb122c62d.png){fig-align="left"} +
Select "Add line feature". -![](https://user-images.githubusercontent.com/4471859/224939354-523cac79-dcd5-4c43-ab5a-db7672fb743e.png){fig-align="left"} +
Create a connection by left clicking a source node and right clicking the destination node. -![](https://user-images.githubusercontent.com/4471859/224939363-88716d43-0536-499d-adb8-2fb4223c0f87.png){fig-align="left"} +
Now leave the edit mode and save the results to the layer. @@ -140,15 +140,15 @@ database = "database.gpkg" In QGIS select the model group. -![](https://user-images.githubusercontent.com/4471859/224939378-a026aec7-419d-4e6e-8b20-df80aa415659.png){fig-align="left"} +
In the Ribasim plugin widget, select the Results tab and click "Associate Results". -![](https://user-images.githubusercontent.com/4471859/224939389-17add58d-6701-49c5-a23a-ce367572d9cd.png){fig-align="left"} +
Select `results/basin.arrow`. -![](https://user-images.githubusercontent.com/4471859/224939408-5c291840-90a4-4efa-a2f0-4fb5986b8779.png){fig-align="left"} +
This adds metadata to the model that the iMOD plugin can use to find the timeseries data that is associated to the model nodes. @@ -157,17 +157,17 @@ that is associated to the model nodes. Click the "Time Series" button of the iMOD plugin. -![](https://user-images.githubusercontent.com/4471859/224939424-ec4c77ff-3d6b-4635-b407-ef18376587e9.png){fig-align="left"} +
Select the variables that you want to plot. -![](https://user-images.githubusercontent.com/4471859/224939436-a9643b68-dff0-49c3-899d-6ba13d9a6d52.png){fig-align="left"} +
Click "Select points" and select a node by dragging a rectangle around it on the map. Hold the Ctrl key to select multiple nodes. Currently only the Basin nodes can be plotted. -![](https://user-images.githubusercontent.com/4471859/224939450-e369791d-3229-4621-87b0-7e1d34d0514d.png){fig-align="left"} +
The associated time series are shown the the graph. -![](https://user-images.githubusercontent.com/4471859/224939471-85a23936-6eb6-4a80-a5b7-8c9a55ddc7f7.png){fig-align="left"} +
From e7dc467cfe09cea624e6c9c1a50a51b4e3be9218 Mon Sep 17 00:00:00 2001 From: Bart de Koning Date: Fri, 3 Nov 2023 20:55:50 +0100 Subject: [PATCH 3/4] last fix --- docs/couple/modflow.qmd | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/couple/modflow.qmd b/docs/couple/modflow.qmd index 12e09dda4..60862bbcc 100644 --- a/docs/couple/modflow.qmd +++ b/docs/couple/modflow.qmd @@ -235,12 +235,10 @@ groundwater response to Ribasim. From Ribasim's perspective, the groundwater head is constant given a timestep, so that: -$$ \begin{align} p = -C \\ q = -C\phi \end{align} -$$ When the head falls below the drainage elevation, the coefficients are 0. @@ -249,22 +247,18 @@ When the head falls below the drainage elevation, the coefficients are 0. From Ribasim's perspective, infiltration is never limited when the head falls below the bottom: -$$ \begin{align} p = -C \\ q = -Cb \end{align} -$$ Otherwise, infiltration and drainage occur with the same equation as for the drainage package: -$$ \begin{align} p = -C \\ q = -C\phi \end{align} -$$ # Assigning MODFLOW water levels @@ -273,12 +267,10 @@ Principally, MODFLOW deals with water levels; Ribasim deals with water volumes. The translation from a water volume to a water level for a single boundary condition is straightforward: -$$ \begin{align} \Delta d = \frac{\Delta V}{A} \\ h = b + d \end{align} -$$ Where $d$ is water depth, $V$ is volume, $A$ is area, $h$ is water level, and $b$ is the bed elevation. From 4d500ef71a5387e76e0a1f219956cd3733567a14 Mon Sep 17 00:00:00 2001 From: Martijn Visser Date: Fri, 3 Nov 2023 21:35:16 +0100 Subject: [PATCH 4/4] Revert "Images with HTML in docs" This reverts commit ae305cf59af0fabc41910c7a1dec214a3ffbdfc3. --- docs/couple/modflow-demo.qmd | 30 +++++++++++----------- docs/index.qmd | 14 +++++----- docs/qgis/index.qmd | 50 ++++++++++++++++++------------------ 3 files changed, 47 insertions(+), 47 deletions(-) diff --git a/docs/couple/modflow-demo.qmd b/docs/couple/modflow-demo.qmd index b407a0450..628532baf 100644 --- a/docs/couple/modflow-demo.qmd +++ b/docs/couple/modflow-demo.qmd @@ -60,11 +60,11 @@ and volume-discharge relationships. ::: A visual representation of this simplified conceptual schematization is given -in Figure 1 and Figure 2. +in @fig-volume-depth and @fig-volume-discharge. -
Figure 1: Distribution of water depths over the primary, secondary, and tertiary system.
alt="Figure 1: Distribution of water depths over the primary, secondary, and tertiary system."
+![Distribution of water depths over the primary, secondary, and tertiary system.](https://user-images.githubusercontent.com/13662783/187665858-d01fd60f-f3c2-4662-af82-cf8acfbe169b.PNG){#fig-volume-depth} -
Figure 2: Discharge as a function of basin storage volume.
alt="Figure 2: Discharge as a function of basin storage volume."
+![Discharge as a function of basin storage volume.](https://user-images.githubusercontent.com/13662783/187668931-c04d4126-9208-44f5-bafa-4c5f74a96dc9.PNG){#fig-volume-discharge} An example of the resulting parameters for a single cell is shown in @tbl-hupsel-v-h. The first row shows the water levels when the basin is empty. @@ -85,21 +85,21 @@ in the test cases for the sake of simplicity. : Volume-level table for a single cell in the Hupsel basin. {#tbl-hupsel-v-h} -Figure 3 shows the volume of the first row of the cell based +@fig-grid-volume shows the volume of the first row of the cell based input for the primary system. Symbology is set to unique values. While water levels differ per cell in this parametrization, the "normative volume" defined above is shared by all cells in a basin. -
Figure 3: Basin normative volume of the primary system.
alt="Figure 3: Basin normative volume of the primary system."
+![Basin normative volume of the primary system.](https://user-images.githubusercontent.com/13662783/187672671-20d22031-3b50-474a-9ee1-4408c25a4f30.PNG){#fig-grid-volume} -Figure 3 shows the water level corresponding to the normative storage +@fig-grid-volume shows the water level corresponding to the normative storage volume based input for the primary system (it corresponds to the value shown in the first row of the primary column in @tbl-hupsel-v-h). We see a clear gradient from west to east: as our simplified parametrization assumes a constant water depth for all cells in a single system, water levels spatially fall and rise with the bottom elevation. -
Figure 4: Water level corresponding to the normative basin volume of the primary system.
alt="Figure 4: Water level corresponding to the normative basin volume of the primary system."
+![Water level corresponding to the normative basin volume of the primary system.](https://user-images.githubusercontent.com/13662783/187672663-99b9efd3-5e09-4d6f-bd3a-4180ff5b2ce4.PNG){#fig-grid-level} ## Example: Configuration @@ -169,9 +169,9 @@ From these tests, we expect the following behavior: 2. In case of negative recharge (evapotranspiration), infiltration occurs in the surface waters. Infiltration should be zero when the basin volume is 0. -
Figure 5: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
alt="Figure 5: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d."
+![Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187715341-fd99dc06-2eda-4b84-a201-650dc7220574.png){#fig-hupsel-gwb-steady} -Figure 5 shows the water balance of steady-state for submodel of the +@fig-hupsel-gwb-steady shows the water balance of steady-state for submodel of the LHM that has been by selecting the cells belonging to the district containing the Hupsel catch, the Berkel. @@ -194,9 +194,9 @@ steady-state model), the surface waters provide mostly inflow, and recharge is a negative term. In this case, the secondary system provides a small amount of infiltration; most of the water is drawn from the surroundings instead. -
Figure 6: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
alt="Figure 6: Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d."
+![Water balance of the MODFLOW 6 boundary conditions for the Hupsel basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187715349-9eee8830-9b03-4a88-b7c9-b16004c694f6.png){#fig-hupsel-gwb-volume0} -Figure 6 shows the same model, with 0-basin volume which causes +@fig-hupsel-gwb-volume0 shows the same model, with 0-basin volume which causes water levels to be set equal to bed elevation. Consequently, primary and secondary outflow terms are larger for positive groundwater recharge as they drain at a lower level and intercept the water before the tertiary system does. @@ -215,9 +215,9 @@ process, but without Ribasim. This results in volumes of 0.0, so all MODFLOW 6 water levels are set equal to bed elevation. 3. A coupled run where the water levels are updated by Ribasim. -
Figure 7: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
alt="Figure 7: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d."
+![Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a standalone MODFLOW 6 run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187769185-f63a5821-dfe8-4d99-b43e-780962e73870.png){#fig-tol-gwb-steady} -Figure 7 shows the water balance of steady-state for a submodel of +@fig-tol-gwb-steady shows the water balance of steady-state for a submodel of the LHM for the Polder de Tol and its surroundings. While groundwater recharge is the dominant ingoing flow, lateral groundwater flow (over the entire depth of the groundwater model) is a sizable inflow for the area; the larger lateral @@ -228,9 +228,9 @@ ephemeral tertiary ditches, but by the permanently water-bearing ditches of the primary and secondary system. Unlike the Hupsel, the water balance does not shrink to very small discharges, as there is sizable regional groundwater flow. -
Figure 8: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.
alt="Figure 8: Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d."
+![Water balance of the MODFLOW 6 boundary conditions for De Tol basin for a zero volume run. The four sequential steady states (01, 02, 03, 04) use net groundwater recharge values of 1.0, 0.5, -0.05 and -0.1 mm/d.](https://user-images.githubusercontent.com/13662783/187769180-91f6344c-3489-4200-8a0c-d5e82a28ebaf.png){#fig-tol-gwb-volume0} -Figure 8 shows the same model, with 0-basin volume which causes +@fig-tol-gwb-volume0 shows the same model, with 0-basin volume which causes water levels to be set equal to bed elevation. The total discharge is larger: the primary and secondary systems are set to lower levels, and so the head difference is larger. While De Tol's evapotranspiration excess can be fed by diff --git a/docs/index.qmd b/docs/index.qmd index fb3b7434e..8597df9a7 100644 --- a/docs/index.qmd +++ b/docs/index.qmd @@ -52,9 +52,9 @@ a set of symbolic equations, and can be connected to each other. From this a sim system of equations is generated automatically. We use solvers with adaptive time stepping from [DifferentialEquations.jl](https://diffeq.sciml.ai/stable/) to get results. -
Figure 1: Example timeseries of a single basin, the Hupselse Beek, with the input and output fluxes on the top, and the storage volume (the state) below.
alt="Figure 1: Example timeseries of a single basin, the Hupselse Beek, with the input and output fluxes on the top, and the storage volume (the state) below."
+![Example timeseries of a single basin, the Hupselse Beek, with the input and output fluxes on the top, and the storage volume (the state) below.](https://user-images.githubusercontent.com/4471859/179259333-070dfe18-8f43-4ac4-bb38-013b252e2e4b.png) -
Figure 2: Example bar plot of the daily waterbalance for the Hupselse Beek, comparing results of Mozart (left) and Ribasim (right).
alt="Figure 2: Example bar plot of the daily waterbalance for the Hupselse Beek, comparing results of Mozart (left) and Ribasim (right)."
+![Example bar plot of the daily waterbalance for the Hupselse Beek, comparing results of Mozart (left) and Ribasim (right).](https://user-images.githubusercontent.com/4471859/179259174-0caccd4a-c51b-449e-873c-17d48cfc8870.png) # Introduction @@ -108,7 +108,7 @@ Local Surface Water (LSW)). Each basin has an associated polygon, and the set of connected to each other as described by a graph, which we call the network. Below is a representation of both on the map. -
Figure 3: Mozart Local Surface Water polygons and their drainage.
alt="Figure 3: Mozart Local Surface Water polygons and their drainage."
+![Mozart Local Surface Water polygons and their drainage.](https://user-images.githubusercontent.com/4471859/185932183-62c305e6-bc14-4f3c-a74c-437f831c9145.png) The network is described as graph. Flow can be bi-directional, and the graph does not have to be acyclic. @@ -131,16 +131,16 @@ lines between A, B, C, and D) instead. Multiple basins may exist within the same spatial polygon, representing different aspects of the surface water system (perennial ditches, ephemeral -ditches, or even surface ponding). Figure 4, Figure 5, Figure 6 show the 25.0 m +ditches, or even surface ponding). @fig-p, @fig-s, @fig-t show the 25.0 m rasterized primary, secondary, and tertiary surface waters as identified by BRT TOP10NL [@pdoktopnl] in the Hupsel basin (as defined in the Mozart LSW's). These systems may represented in multiple ways. -
Figure 4: Hupsel: primary surface water.
alt="Figure 4: Hupsel: primary surface water."
+![Hupsel: primary surface water.](https://user-images.githubusercontent.com/13662783/187625163-d0a81bb6-7f55-4ad1-83e2-90ec1ee79740.PNG){#fig-p} -
Figure 5: Hupsel: secondary surface water.
alt="Figure 5: Hupsel: secondary surface water."
+![Hupsel: secondary surface water.](https://user-images.githubusercontent.com/13662783/187625170-1acdfb41-7077-443f-b140-ae18cbf21e53.PNG){#fig-s} -
Figure 6: Hupsel: tertiary surface water.
alt="Figure 6: Hupsel: tertiary surface water."
+![Hupsel: tertiary surface water.](https://user-images.githubusercontent.com/13662783/187625174-3eec28b5-ddbb-4870-94c3-d9e9a43f8eb4.PNG){#fig-t} As a single basin (A) containing all surface water, discharging to its downstream basin to the west (B): diff --git a/docs/qgis/index.qmd b/docs/qgis/index.qmd index f4ebc1aad..ee1d4a7f7 100644 --- a/docs/qgis/index.qmd +++ b/docs/qgis/index.qmd @@ -14,18 +14,18 @@ Download `ribasim_qgis.zip`, see the [download section](../index.qmd#sec-downloa Plugins menu > Manage and Install Plugins... -
+![](https://user-images.githubusercontent.com/4471859/224939069-9aae77ea-898f-442f-83b5-f2671c114956.png){fig-align="left"} Select "Install from ZIP": - Browse to the `ribasim_qgis.zip` file containing the plugin that was downloaded earlier - Click "Install Plugin" -
+![](https://user-images.githubusercontent.com/4471859/224939080-7fec5db2-4417-4f7b-8e45-034d4cf4fd75.png){fig-align="left"} Start the Ribasim plugin. -
+![](https://user-images.githubusercontent.com/4471859/224939101-228e068a-875b-4df2-98bb-6ee6a3830ddd.png){fig-align="left"} ### Add iMOD plugin @@ -41,20 +41,20 @@ Documentation on the Time Series widget can be found in the [iMOD documentation] Open example model `database.gpkg` or create a new model. -
+![](https://user-images.githubusercontent.com/4471859/224939126-b38f0eed-2e89-4120-b541-5b8c31798c09.png){fig-align="left"} Check if your coordinate reference system (CRS) is set correctly. -
+![](https://user-images.githubusercontent.com/4471859/224939143-19e9931e-da4b-4717-ba28-67a0f141dd40.png){fig-align="left"} If you are working with an unknown CRS, right click the model database group in Layers, and click "Set Group CRS...". -
+![](https://user-images.githubusercontent.com/4471859/224939165-45807f16-2d3a-41b3-92a2-7fe0e86ae72b.png){fig-align="left"} If you are modeling the Netherlands, select "Amersfoort / RD New" (EPSG:28992). -
+![](https://user-images.githubusercontent.com/4471859/224939182-3486ff0b-842b-4f98-a37e-ecd04f29aa7f.png){fig-align="left"} ## Edit nodes @@ -62,35 +62,35 @@ If you are modeling the Netherlands, select "Amersfoort / RD New" (EPSG:28992). Select the Node layer. -
+![](https://user-images.githubusercontent.com/4471859/224939204-2aa2ead2-a028-4673-b747-abeadd821ec8.png){fig-align="left"} Turn on the edit mode to be able to add nodes on the map. -
+![](https://user-images.githubusercontent.com/4471859/224939223-66e232c0-748c-46f0-ba1b-8751a965f114.png){fig-align="left"} Add nodes to the map with a left click and select the node type. -
+![](https://user-images.githubusercontent.com/4471859/224939237-67c1150b-15ec-4044-a02a-26a82f81da05.png){fig-align="left"} Turn the edit mode off and save the edits to the Nodes layer. -
+![](https://user-images.githubusercontent.com/4471859/224946136-e37021d5-80c1-4d90-ac04-d0dbd96879f3.png){fig-align="left"} ### Edit tables Right click a layer and select "Open Attribute Table". -
+![](https://user-images.githubusercontent.com/4471859/224939276-ca8f856d-3325-49a7-b457-78b09b81ac5e.png){fig-align="left"} Click the yellow pencil icon on the top left to enable editing, and copy and paste a record. A record can be selected by clicking on the row number. -
+![](https://user-images.githubusercontent.com/4471859/224939287-a8b9f351-9aea-4e3a-8417-3867cd40cda5.png){fig-align="left"} Adjust the content. If you prefer, it also works to copy data with the same columns from Excel. Turn off edit mode and save changes to the layer. -
+![](https://user-images.githubusercontent.com/4471859/224939297-4b0ca812-9618-4d25-ab7a-518bf1ca63e1.png){fig-align="left"} ## Connect nodes @@ -99,21 +99,21 @@ Excel. Turn off edit mode and save changes to the layer. Make sure the Snapping Toolbar is visible, by going to the View > Toolbars menu. Turn on snapping mode by clicking the magnet and set the snapping distance to 25 pixels. -
+![](https://user-images.githubusercontent.com/4471859/224939328-8359272a-30bb-4eb1-ab6c-968318ac3997.png){fig-align="left"} ### Create connecting edges Select the Edge layer and turn on the edit mode. -
+![](https://user-images.githubusercontent.com/4471859/224939342-c6939331-a60d-4526-a350-3cddb122c62d.png){fig-align="left"} Select "Add line feature". -
+![](https://user-images.githubusercontent.com/4471859/224939354-523cac79-dcd5-4c43-ab5a-db7672fb743e.png){fig-align="left"} Create a connection by left clicking a source node and right clicking the destination node. -
+![](https://user-images.githubusercontent.com/4471859/224939363-88716d43-0536-499d-adb8-2fb4223c0f87.png){fig-align="left"} Now leave the edit mode and save the results to the layer. @@ -140,15 +140,15 @@ database = "database.gpkg" In QGIS select the model group. -
+![](https://user-images.githubusercontent.com/4471859/224939378-a026aec7-419d-4e6e-8b20-df80aa415659.png){fig-align="left"} In the Ribasim plugin widget, select the Results tab and click "Associate Results". -
+![](https://user-images.githubusercontent.com/4471859/224939389-17add58d-6701-49c5-a23a-ce367572d9cd.png){fig-align="left"} Select `results/basin.arrow`. -
+![](https://user-images.githubusercontent.com/4471859/224939408-5c291840-90a4-4efa-a2f0-4fb5986b8779.png){fig-align="left"} This adds metadata to the model that the iMOD plugin can use to find the timeseries data that is associated to the model nodes. @@ -157,17 +157,17 @@ that is associated to the model nodes. Click the "Time Series" button of the iMOD plugin. -
+![](https://user-images.githubusercontent.com/4471859/224939424-ec4c77ff-3d6b-4635-b407-ef18376587e9.png){fig-align="left"} Select the variables that you want to plot. -
+![](https://user-images.githubusercontent.com/4471859/224939436-a9643b68-dff0-49c3-899d-6ba13d9a6d52.png){fig-align="left"} Click "Select points" and select a node by dragging a rectangle around it on the map. Hold the Ctrl key to select multiple nodes. Currently only the Basin nodes can be plotted. -
+![](https://user-images.githubusercontent.com/4471859/224939450-e369791d-3229-4621-87b0-7e1d34d0514d.png){fig-align="left"} The associated time series are shown the the graph. -
+![](https://user-images.githubusercontent.com/4471859/224939471-85a23936-6eb6-4a80-a5b7-8c9a55ddc7f7.png){fig-align="left"}