3.1. Cálculo de perfiles de presion#

from sympy import *             # Librería para trabajo simbólico
import math                     # Librería para utilizar símbolos matemáticos
import numpy as np              # Librería para poder trabajar con matrices y vectores
import matplotlib.pyplot as plt # Librería para poder dibujar gráficas
from ipywidgets import interact, interactive, fixed, interact_manual
from skimage import io
from matplotlib.offsetbox import (OffsetImage, AnnotationBbox)
import warnings
warnings.filterwarnings('ignore')
Hide code cell content
g=9.81 #m/s^2

file="https://upload.wikimedia.org/wikipedia/commons/b/bd/Rowing_pictogram.png"
logo=io.imread(file)

def presion(z,H1,H2,rho1,rho2):     #H1 es la cota de la superficie superior desde el fondo    
    if z>H2:        return rho1*g*(H1-z) 
    else:
        return rho1*g*(H1-H2)+rho2*g*(H2-z) 

def dibujar_perfil(H1,H2,rho1,rho2): 
    if H2>H1:
      H2=H1
    
    N = int(H1)*25                      #numero de puntos a representar
    zz = np.linspace(0, H1, N)     #puntos en z
    #pp = presion(zz,H1,H2,rho1,rho2)
    pp=np.zeros((N,1)) 
    for i in range(0,N):
      pp[i] = presion(zz[i],H1,H2,rho1,rho2)
    
    fig, ax = plt.subplots(figsize=(6, 6)) 
    rect1 = plt.Rectangle((0, 0), pp[0], H2, color='#64ABE1', alpha=0.35)
    ax.add_patch(rect1)
    rect2 = plt.Rectangle((0, H2), pp[0], H1-H2, color='#64ABE1', alpha=0.2)
    ax.add_patch(rect2) 
    ax.plot(pp,zz, color="r",linewidth=1.8) 
    ax.plot((pp[0],pp[N-1]),(H1,H1), color="tab:blue", linestyle="-",linewidth=1.8) 
    ax.plot((0,0),(0,H1), color="black", linestyle="--") 
    ax.plot((presion(H2,H1,H2,rho1,rho2),presion(H2,H1,H2,rho1,rho2)),(0,H2), color="red", linestyle=":") 
    for i in range(0,N,5):   # esto es un bucle para pintar flechas
      ax.annotate("", xy=(0.0, zz[i]), xytext=(pp[i], zz[i]),arrowprops={'arrowstyle':'->','lw': 1.2, 'color': 'r', 'alpha': 0.7})

    
    ax.set_xlabel("p (Pa)") # Nombre y unidades del eje x
    ax.set_ylabel("z (m)") # Nombre y unidades del eje y
    ax.set_ylim([0,5])

    imagebox = OffsetImage(logo, zoom = 0.15)
    ab = AnnotationBbox(imagebox, (pp[0]*0.65, H1+0.075), frameon = False)
    ax.add_artist(ab)


def dibujar_perfil_y_fuerzas(H1,H2,rho1,rho2): 
    if H2>H1:
      H2=H1
    
    N = int(H1)*25                      #numero de puntos a representar
    zz = np.linspace(0, H1, N)     #puntos en z
    #pp = presion(zz,H1,H2,rho1,rho2)
    pp=np.zeros((N,1)) 
    for i in range(0,N):
      pp[i] = presion(zz[i],H1,H2,rho1,rho2)
    
    presH2=presion(H2,H1,H2,rho1,rho2)

    fig, ax = plt.subplots(figsize=(6, 6)) 
    rect1 = plt.Rectangle((0, 0), pp[0], H2, color='#64ABE1', alpha=0.35)
    ax.add_patch(rect1)
    rect2 = plt.Rectangle((0, H2), pp[0], H1-H2, color='#64ABE1', alpha=0.2)
    ax.add_patch(rect2) 
    ax.plot(pp,zz, color="r",linewidth=1.8) 
    ax.plot((pp[0],pp[N-1]),(H1,H1), color="tab:blue", linestyle="-",linewidth=1.8) 
    ax.plot((0,0),(0,H1), color="black", linestyle="--") 
    ax.plot((presH2,presH2),(0,H2), color="red", linestyle=":", alpha= 0.3) 
    for i in range(0,N,5):   # esto es un bucle para pintar flechas
      ax.annotate("", xy=(0.0, zz[i]), xytext=(pp[i], zz[i]),arrowprops={'arrowstyle':'->','lw': 1.2, 'color': 'r', 'alpha': 0.3})

    F1=0.5*presH2*(H1-H2)
    F2=presH2*H2
    F3=0.5*(pp[0]-presH2)*H2
    M1=F1*(H2+(H1-H2)/3)
    M2=F2*(H2/2)
    M3=F3*(H2/3)
    Ft=F1+F2+F3
    Mt=M1+M2+M3

    z_cp=Mt/Ft

    len1=F1/Ft*pp[0]*0.8
    len2=F2/Ft*pp[0]*0.8
    len3=F3/Ft*pp[0]*0.8
    lent=pp[0]*0.8

    ax.annotate("", xy=(0.0, H2/2), xytext=(len2, H2/2),arrowprops={'arrowstyle':'->','lw': 2, 'color': 'tab:red', 'alpha': 0.9})
    ax.annotate("", xy=(presH2, H2/3), xytext=(presH2+len3, H2/3),arrowprops={'arrowstyle':'->','lw': 2, 'color': 'tab:red', 'alpha': 0.9})
    ax.annotate("", xy=(0.0, H2+(H1-H2)/3), xytext=(len1, H2+(H1-H2)/3),arrowprops={'arrowstyle':'->','lw': 2, 'color': 'tab:red', 'alpha': 0.9})

    ax.plot(0,z_cp,'ko')
    ax.annotate("", xy=(0.0,z_cp), xytext=(lent, z_cp),arrowprops={'arrowstyle':'->, head_width=0.4, head_length=0.9', 'lw': 4, 'color': 'tab:orange', 'alpha': 0.9})

    print("La fuerza total es:",Ft/1000,"KN")
    print("El momento total es:",Mt/1000,"KN·m")
    print("El centro de presiones está en z_cp=",z_cp,"m")

    imagebox = OffsetImage(logo, zoom = 0.15)
    ab = AnnotationBbox(imagebox, (pp[0]*0.65, H1+0.075), frameon = False)
    ax.add_artist(ab)

    ax.set_xlabel("p (Pa)") # Nombre y unidades del eje x
    ax.set_ylabel("z (m)") # Nombre y unidades del eje y
    ax.set_ylim([0,5])
interactive(dibujar_perfil, H1=(1,5,0.1), H2=(0,5,0.1), rho1=(500,1000,100), rho2=(1000,2000,100))
interactive(dibujar_perfil_y_fuerzas, H1=(1,5,0.1), H2=(0,5,0.1), rho1=(500,1000,100), rho2=(1000,2000,100))