Contenido bajo licencia Creative Commons BY 4.0 y código bajo licencia MIT. © Juan Gómez y Nicolas Guarín-Zapata 2019-2020. Este material es parte del curso Mecánica de los Medios Continuos en el programa de Ingeniería Civil de la Universidad EAFIT.

# Soluciones analíticas para presas triangulares

Este Notebook permite visualizar la solución analítica de una presa triangular
para un ángulo interno de 45° sometida al empuje de un fluido de peso específico
$\gamma$ en condiciones hidrostáticas. Adicionalmente, también permite visualizar
la solución para una presa triangular con ángulo interno $\alpha$ sometida al
empuje de un fluido de densidad $\rho$ en condiciones hidrostáticas, y peso
propio para concreto de densidad $\rho_c$.

Estas soluciones pueden usarse como apoyo en la actividad de diseño de la presa
trapezoidal.

## Importación de paquetes


```python
import numpy as np
from numpy import pi, sin, cos, sqrt
import matplotlib.pyplot as plt
from meshzoo import triangle
from ipywidgets import interact
```


```python
%matplotlib notebook
gris = '#757575'
plt.rcParams["mathtext.fontset"] = "cm"
plt.rcParams["text.color"] = gris
plt.rcParams["font.size"] = 12
plt.rcParams["xtick.color"] = gris
plt.rcParams["ytick.color"] = gris
plt.rcParams["axes.labelcolor"] = gris
plt.rcParams["axes.edgecolor"] = gris
plt.rcParams["axes.spines.right"] = False
plt.rcParams["axes.spines.top"] = False
plt.rcParams["image.cmap"] = "RdYlBu_r"
```

## Presa sin peso propio

El siguiente esquema muestra el problema que se está estudiando.

<center>
    
</center>


Para este problema, la solución de tensiones está dada por:

\begin{align}
\sigma_{xx} &= \gamma(y-H)\\
\sigma_{yy} &= -2\gamma x-\gamma(y-H)\\
\tau_{yy} &= -\gamma x
\end{align}


La siguiente función (`plot_dam`) permite graficar los contornos para la presa.
Tiene como parámetro opcional `plot_type` que permite graficar los contornos
para los esfuerzos principales y cortantes máximos — cuando es igual a `"principal"` —
y graficar los esfuerzos en el sistema coordenado dado — cuando es igual a
`"original"`.


```python
def plot_dam(plot_type="principal"):
    npts = 30
    pts, tri = triangle(npts, corners=[[0, 0], [1, 0], [0, 1]])
    x, y = pts.T
    γ = 1
    σ_xx = γ*(y - 1)
    σ_yy = -2*γ*x - γ*(y - 1)
    τ_xy = -γ*x
    τ_max = sqrt((σ_xx - σ_yy)**2/4 + τ_xy**2)
    σ_m = 0.5*(σ_xx + σ_yy)
    σ1 = σ_m + τ_max
    σ2 = σ_m - τ_max
    
    if plot_type == "principal":
        fields = [σ1, σ2, τ_max]
        titles = [r"$\sigma_{1}/\gamma$",
                  r"$\sigma_{2}/\gamma$",
                  r"$\tau_\max/\gamma$"]
    else:
        fields = [σ_xx, σ_yy, τ_xy]
        titles = [r"$\sigma_{xx}/\gamma$",
                  r"$\sigma_{yy}/\gamma$",
                  r"$\tau_{xy}/\gamma$"]

    plt.clf()
    fig = plt.gcf()
    axes = fig.subplots(1, 3)
    for cont, ax in enumerate(axes):
        f_max = max(np.max(fields[cont]), -np.min(fields[cont]))
        im = ax.tricontourf(x, y, tri, fields[cont], levels=12,
                            vmin=-f_max, vmax=f_max)
        fig.colorbar(im, ax=ax, shrink=0.5)
        ax.axis("image")
        ax.axis("off")
        ax.set_title(titles[cont])
    plt.tight_layout()
    return None
```

Por facilidad de uso, hemos creado un _widget_ que permite variar el parámetro
de entrada con un menú desplegable.

<div class="alert alert-warning">
    
Pruebe a cambiar el parámetro de entrada para ver cómo difieren los campos para las componentes
del tensor en el sistema coordenado dado y en sus direcciones principales.

</div>



```python
plt.figure(figsize=(6, 3))
widget0 = interact(plot_dam,
                  plot_type=["original",
                             "principal"])
```


    <IPython.core.display.Javascript object>







    interactive(children=(Dropdown(description='plot_type', index=1, options=('original', 'principal'), value='pri…


## Presa con peso propio

El siguiente esquema muestra el problema que se está estudiando.

<center>
    
</center>

Este es un problema más general que el anterior, ya que la solución es válida
para diferentes ángulos (no solo 45°), y además permite considerar el peso de
la presa. Cuando $\rho_c = 0$ y $\alpha = \pi/4 \approx 0.79$ se tiene el caso
anterior.


En este caso, la solución analítica de tensiones está dada por:

\begin{align}
\frac{\sigma_{rr}}{\rho g} =& - \left(- \frac{\rho_{c} \cot(\alpha)}{4} + \frac{\cot^{3}(\alpha)}{2}\right) \sin(3\theta)
  + \left(\frac{\rho_{c} \cot(\alpha)}{4} - \frac{\cot^{3}(\alpha)}{2}\right) \sin(\theta)\\
  &+ \left(- \frac{\rho_{c}}{4} + \frac{3 \cot^{2}(\alpha)}{4} + \frac{1}{4}\right) \cos(3\theta)
  + \left(\frac{\rho_{c}}{4} + \frac{\cot^{2}(\alpha)}{4} - \frac{1}{4}\right) \cos(\theta)
  - \rho_{c} \cos(\theta)\\
\frac{\sigma_{\theta\theta}}{\rho g} =& \left(- \frac{\rho_{c} \cot(\alpha)}{4}
  + \frac{\cot^{3}(\alpha)}{2}\right) \sin(3\theta) + \left(\frac{3 \rho_{c} \cot(\alpha)}{4}
  - \frac{3 \cot^{3}(\alpha)}{2}\right) \sin(\theta)\\
  &+ \left(\frac{\rho_{c}}{4} - \frac{3 \cot^{2}(\alpha)}{4} - \frac{1}{4}\right) \cos(3\theta)
  + \left(\frac{3 \rho_{c}}{4} + \frac{3 \cot^{2}(\alpha)}{4} - \frac{3}{4}\right) \cos(\theta)
  - \rho_{c} \cos(\theta)\\
\frac{\sigma_{r\theta}}{\rho g} =& - \left(- \frac{\rho_{c} \cot(\alpha)}{4}
  + \frac{\cot^{3}(\alpha)}{2}\right) \cos(3\theta) - \left(\frac{\rho_{c} \cot(\alpha)}{4}
  - \frac{\cot^{3}(\alpha)}{2}\right) \cos(\theta)\\
  &+ \left(\frac{\rho_{c}}{4}  - \frac{3 \cot^{2}(\alpha)}{4} - \frac{1}{4}\right) \sin(3\theta)
  + \left(\frac{\rho_{c}}{4} + \frac{\cot^{2}(\alpha)}{4} - \frac{1}{4}\right) \sin(\theta)
\end{align}


La siguiente función (`plot_dam_weight`) permite graficar los contornos para la presa
con peso propio. Tiene como parámetros opcionales: `α`, `ρ_c` y `plot_type` que permiten
cambiar el ángulo, densidad de la presa y el tipo de gráfica — al igual que en el 
caso anterior —.


```python
def plot_dam_weight(α=pi/4, ρ_c=1.0, plot_type="principal"):
    npts = 30
    pts, tri = triangle(npts, corners=[[0, 0], [cos(α), 0], [cos(α), sin(α)]])
    x, y = pts.T
    r = sqrt(x**2 + y**2)
    θ = np.arctan2(y, x)
    #r = 1
    ρ = 1
    g = 1
    cot = lambda x: cos(x)/sin(x)
    A =  (ρ_c - ρ)*g/24 - ρ*g *cot(α)**2/8
    B = ρ*cot(α)**3/12 - ρ_c*g*cot(α)/24
    C = (ρ_c - ρ)*g/8 + ρ*g*cot(α)**2/8
    D = ρ_c*g*cot(α)/8 - ρ*g*cot(α)**3/4

    σ_rr = -6*A*r*cos(3*θ) - 6*B*r*sin(3*θ) + 2*C*r*cos(θ) \
        + 2*D*r*sin(θ) - ρ_c*g*r*cos(θ)
    τ_rθ = 6*A*r*sin(3*θ) - 6*B*r*cos(3*θ) + 2*C*r*sin(θ) \
        - 2*D*r*cos(θ)
    σ_θθ = 6*A*r*cos(3*θ) + 6*B*r*sin(3*θ) + 6*C*r*cos(θ) \
        + 6*D*r*sin(θ) - ρ_c*g*r*cos(θ)

    τ_max = sqrt((σ_rr - σ_θθ)**2/4 + τ_rθ**2)
    σ_m = 0.5*(σ_rr + σ_θθ)
    σ1 = σ_m + τ_max
    σ2 = σ_m - τ_max
    
    if plot_type == "principal":
        fields = [σ1, σ2, τ_max]
        titles = [r"$\sigma_{1}/\rho g$",
                  r"$\sigma_{2}/\rho g$",
                  r"$\tau_\max/\rho g$"]
    else:
        fields = [σ_rr, σ_θθ, τ_rθ]
        titles = [r"$\sigma_{rr}/\rho g$",
                  r"$\sigma_{\theta\theta}/\rho g$",
                  r"$\tau_{r\theta}/\rho g$"]

    plt.clf()
    fig = plt.gcf()
    axes = fig.subplots(1, 3)
    for cont, ax in enumerate(axes):
        f_max = max(np.max(fields[cont]), -np.min(fields[cont]))
        im = ax.tricontourf(y, x, tri, fields[cont], levels=12, vmin=-f_max, vmax=f_max)
        fig.colorbar(im, ax=ax, shrink=0.5)
        ax.invert_yaxis()
        ax.axis("image")
        ax.axis("off")
        ax.set_title(titles[cont])
    plt.tight_layout()
    return None
```

Por facilidad de uso, hemos creado un _widget_ que permite variar los parámetros.
El ángulo ($\alpha$) y densidad ($\rho_c$), pueden variarse usando deslizadores
y el tipo de gráfico con un menú desplegable.

<div class="alert alert-warning">
    
Pruebe a cambiar los parámetros de entrada para ver cómo difieren los campos.

</div>


```python
plt.figure(figsize=(6, 3))
widget = interact(plot_dam_weight,
                  α=(0.08,1.0),
                  ρ_c=(0.0,10.),
                  plot_type=["original",
                             "principal"])
```


    <IPython.core.display.Javascript object>







    interactive(children=(FloatSlider(value=0.7853981633974483, description='α', max=1.0, min=0.08), FloatSlider(v…


## Referencias

* Juan Gómez, César Augusto Sierra, Juan Carlos Vergara, Mario Sáenz, y Nicolás Guarín-Zapata (2018). Notas de clase: Mecánica del medio continuo. Universidad EAFIT, Disponible en: https://github.com/AppliedMechanics-EAFIT/Notas-MMC.

* J.R. Barber (2010). Elasticity. Springer Netherlands.

## Formato del Notebook

La siguiente celda da formato al Notebook.


```python
from IPython.core.display import HTML
def css_styling():
    styles = open('./nb_style.css', 'r').read()
    return HTML(styles)
css_styling()
```





<link href='http://fonts.googleapis.com/css?family=Fenix' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Alegreya+Sans:100,300,400,500,700,800,900,100italic,300italic,400italic,500italic,700italic,800italic,900italic' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=Source+Code+Pro:300,400' rel='stylesheet' type='text/css'>

<style>

/*
Template for Notebooks for Modelación computacional.

Based on Lorena Barba template available at:

    https://github.com/barbagroup/AeroPython/blob/master/styles/custom.css
*/

/* Fonts */
@font-face {
font-family: "Computer Modern";
src: url('http://mirrors.ctan.org/fonts/cm-unicode/fonts/otf/cmunss.otf');
}

/* Text */
div.cell{
width:800px;
margin-left:16% !important;
margin-right:auto;
}
h1 {
font-family: 'Alegreya Sans', sans-serif;
}
h2 {
font-family: 'Fenix', serif;
}
h3{
font-family: 'Fenix', serif;
margin-top:12px;
margin-bottom: 3px;
}
h4{
font-family: 'Fenix', serif;
}
h5 {
font-family: 'Alegreya Sans', sans-serif;
}	
div.text_cell_render{
font-family: 'Alegreya Sans',Computer Modern, "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;
line-height: 135%;
font-size: 120%;
width:600px;
margin-left:auto;
margin-right:auto;
}
.CodeMirror{
font-family: "Source Code Pro";
font-size: 90%;
}
/* .prompt{
display: None;
}*/
.text_cell_render h1 {
font-weight: 200;
font-size: 50pt;
line-height: 100%;
color:#CD2305;
margin-bottom: 0.5em;
margin-top: 0.5em;
display: block;
}	
.text_cell_render h5 {
font-weight: 300;
font-size: 16pt;
color: #CD2305;
font-style: italic;
margin-bottom: .5em;
margin-top: 0.5em;
display: block;
}
.warning{
color: rgb( 240, 20, 20 )
}
</style>








1a58810f108e5f56b87daea3cb89d5fb4549c7b0
ipynb
Jupyter Notebook
proyectos/presa/soluciones_analiticas.ipynb
AppliedMechanics-EAFIT/Mod_Temporal
6a0506d906ed42b143b773777e8dc0da5af763eb
MIT
2019-02-20T18:14:01.000Z
2020-07-19T22:44:44.000Z
proyectos/presa/soluciones_analiticas.ipynb
AppliedMechanics-EAFIT/Mod_Temporal
6a0506d906ed42b143b773777e8dc0da5af763eb
MIT
2020-04-15T00:22:58.000Z
2020-07-04T17:03:54.000Z
proyectos/presa/soluciones_analiticas.ipynb
AppliedMechanics-EAFIT/Mod_Temporal
6a0506d906ed42b143b773777e8dc0da5af763eb
MIT
2020-05-14T18:17:09.000Z
2020-10-27T06:37:05.000Z
Qwen/Qwen-72B
1. YES
2. YES