Flujo de Couette entre dos tubos concéntricos GRUPO 50
| Trabajo realizado por estudiantes | |
|---|---|
| Título | Flujo de Couette entre dos tubos concéntricos (Grupo 50) |
| Asignatura | Teoría de Campos |
| Curso | 2025-26 |
| Autores | Brisa Mora, Alejandro Morales, Nicolás López, Adrián Muñoz |
| Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura | |
Contenido
- 1 Póster del artículo
- 2 Introducción
- 3 Representación de la sección trasversal
- 4 Calculo de las velocidades
- 5 Representación del campo de velocidades
- 6 Representación de las líneas de corriente del campo
- 7 Velocidad máxima del fluido
- 8 Rotacional de [math] \vec{u} [/math]
- 9 Campo de Temperaturas
- 10 Gradiente de la temperatura
- 11 Caudal que pasa por la sección θ=0
1 Póster del artículo
Mediante el siguiente enlace podrá acceder al póster del siguiente artículo: Descargar póster
2 Introducción
En este proyecto vamos a considerar el flujo de un fluido incompresible a través de dos cilindros concéntricos, de manera que el exterior se mueve con velocidad angular constante [math]\vec{\mathbf{\omega_e}}[/math] en sentido horario mientras que el interior se mueve con velocidad angular [math]\vec{\mathbf{\omega_i}}[/math] en sentido contrario. Si suponemos que ambos cilindros tienen su eje en [math]𝑂𝑋_3[/math] y pintamos la sección transversal [math](𝑥_{3} = 0)[/math], el cilindro exterior queda proyectado sobre la la circunferencia 𝜌 = 2 y el interior sobre la circunferencia 𝜌 =1. Trabajaremos en coordenadas cilíndricas
3 Representación de la sección trasversal
Como punto de comienzo, vamos a realizar una sección trasversal de los tubos que represente los tubos que representen los puntos ocupado por el fluido. Para ello hemos dibujado un mallado en Matlab que se ve de la siguiente forma:
Código Matlab:
rho=1:0.1:2;
theta=linspace(0,2*pi,100);
[RHO,THETA]=meshgrid(rho,theta);
x=RHO.*cos(THETA);
y=RHO.*sin(THETA);
hold on;
grid on
axis equal;
axis([-3 3 -3 3]);
plot(x,y,'b')
plot(x',y','b')
rin=1;
rex=2;
th=linspace(0, 2*pi, 400);
plot(rin*cos(th),rin*sin(th),'k','LineWidth',2);
plot(rex*cos(th),rex*sin(th),'k','LineWidth',2);
title('Mallado del flujo de Couette entre dos tubos concéntricos')
hold off;
4 Calculo de las velocidades
4.1 Definición del campo de velocidades
Se sabe que la velocidad de las partículas viene dada por [math]\vec{u}(𝜌, θ) = f(𝜌) \vec{e_θ} [/math] y que su presión 𝜌 es constante. Además el campo de velocidades tiene que cumplir la ecuación de Navier-Stokes estacionaria:
en la que µ es el coeficiente de viscosidad del fluido, y donde vamos a despreciar el primer término (parte convectiva). Obteniendo así:
4.2 Cálculo del Laplaciano del campo de velocidades
Para el cálculo del laplaciano vectorial en coordenadas cartesianas tenemos la siguiente formula:
Pero en este ejercicio el campo de velocidades está dado en la base cilíndrica, así que utilizaremos:
4.2.1 Gradiente de la divergencia
Si lo separamos por pasos, en el primer sumando tenemos el gradiente de la divergencia, pero para ello necesitamos calcular primero la divergencia. En nuestro caso, tenemos un fluido incompresible y dado que la divergencia mide el cambio en la densidad de un fluido moviéndose de acuerdo con un campo vectorial, será nulo.
Como la divergencia es nula el gradiente también lo es.
4.2.2 Rotacional del campo de velocidades
Tras haber calculado el rotacional del campo de velocidades, continuamos con el procedimiento calculando el rotacional del rotacional del campo de velocidades.
4.2.3 Calculo final
Tras haber calculado todas las partes de la ecuación, sustituimos en la definición de Laplaciano vectorial
Dado que ya conocemos todas los partes de la ecuación, podemos resolverla, para hallar así el campo de velocidades:
4.3.1 Comprobación de que f(ρ) satisface una ecuación diferencial
La ecuación diferencial dada es:
si desarrollamos la primera parte de la ecuación tenemos:
El resultado obtenido coincide con el segundo y tercer sumando de la ecuación de Navier-Stocks, por lo tanto sustituyendo tenemos:
Y reordenando la ecuación, comprobamos lo que se nos pedía:
4.3.2 Comprobación de una solución conocida
Dada una solución posible solución:
Para poder comprobar que esta solución es válida, es necesario derivar la expresión de forma que dichas derivadas aparezcan en la ecuación diferencial obtenida.
Tras hallar dichas derivadas, las introducimos en la ecuación obtenida anteriormente y verificamos que:
4.3.3 Valores de "a" y "b"
Tenemos que buscar los valores "a" y "b" tal que [math]\vec{\mathbf{u}}[/math] coincide en las fronteras. Para ello se imponen las siguientes condiciones:
[math]\begin{cases}\vec{\mathbf{u}}(ρ=1)=\vec{\mathbf{\omega_i}} \times ρ\vec{\mathbf{e_\rho}} = \omega \rho \vec{\mathbf{e_\theta}} = \omega \vec{\mathbf{e_\theta}} \\ \vec{\mathbf{u}}(ρ=2)=\vec{\mathbf{\omega_e}} \times ρ\vec{\mathbf{e_\rho}} = -n \omega \rho \vec{\mathbf{e_\theta}} = - 2n \omega \vec{\mathbf{e_\theta}}\end{cases} \Longrightarrow \begin{cases}\vec{\mathbf{u}}(ρ=1)= (a\rho + \frac{b}{\rho}) \vec{\mathbf{e_\theta}} = (a+b) \vec{\mathbf{e_\theta}} \\ \vec{\mathbf{u}}(ρ=2)= (a\rho + \frac{b}{\rho}) \vec{\mathbf{e_\theta}}= (2a+\frac{b}{2})\vec{\mathbf{e_\theta}} \end{cases}[/math]
Que haciendo un resolución de un sistema de 2 ecuaciones con 2 incognitas al tener dos funciones ([math]\vec{\mathbf{u}}[/math] y [math]\vec{\mathbf{\omega}} \times \rho\vec{\mathbf{e_\rho}}[/math] ) nos tienes que salir que:
Entonces sustituyo b en a y sale:
quedando la ecuación diferencial como:
5 Representación del campo de velocidades
suponiendo las condiciones del enunciado [math]|\vec{\mathbf{\omega_i}}|=|\vec{\mathbf{\omega_e}}|=1 \text{ y } \mu=1 [/math] y además tenemos que:
Sustituimos en la función y obtenemos:
y su representación sería la siguiente:
Código de Matlab:
rho=linspace(1,2,15);
theta=linspace(0,2*pi,20);
[RHO,THETA]=meshgrid(rho,theta);
x=RHO.*cos(THETA);
y=RHO.*sin(THETA);
f=(1/3)*((8./RHO)-(5.*RHO));
Vrho=zeros(size(RHO));
Vx=-f.*sin(THETA);
Vy=f.*cos(THETA);
hold on;
quiver(x,y,Vx,Vy);
axis equal;
xlabel('x'); ylabel('y');
title('Campo de velocidades');
axis([-3 3 -3 3]);
hold off;
6 Representación de las líneas de corriente del campo
Para ello, necesitamos calcular el campo [math]\vec{\mathbf{v}}[/math] que en cada punto es ortogonal a [math]\vec{\mathbf{u}}[/math]
[math]\vec{\mathbf{v}}=\vec{\mathbf{k}}\times\vec{\mathbf{u}} \rightarrow \vec{\mathbf{v}}(\rho)= \vec{\mathbf{k}}\times -[\frac{1}{3}(4n+1)\omega\rho - \frac{4}{3}(n+1)\omega\frac{1}{\rho}]\vec{\mathbf{e_\theta}}=[/math]
[math]=-[\frac{1}{3}(4n+1)\omega\rho - \frac{4}{3}(n+1)\omega\frac{1}{\rho}]\vec{\mathbf{(-e_\rho)}}=[/math]
[math]=-[\frac{4}{3}(n+1)\omega\frac{1}{\rho}-\frac{1}{3}(4n+1)\omega\rho ]\vec{\mathbf{e_\rho}}[/math]
6.1 Demostración de que el campo [math]\vec{\mathbf{v}}[/math] es irrotacional
Comprobamos que, como dice el enunciado, el campo [math]\vec{\mathbf{v}}[/math] es irrotacional debido a que la divergencia de [math]\vec{\mathbf{u}}[/math] es nula, cosa que ya hemos calculado con anterioridad.
Se comprueba la irrotacionalidad de [math]\vec{\mathbf{v}}[/math] .
6.2 Cálculo de las líneas de corriente
Conocemos que:
Despejamos [math]\psi[/math]:
Calculamos la integral y nos sale que [math]\psi[/math] es: [math] \psi= -\frac{4}{3}(n+1)\omega \cdot ln(\rho) + \frac{1}{3}(4n+1)\omega \cdot\frac{\rho^2}{2} + C, C\in R[/math]
6.3 Representación de las líneas de corriente de [math]\vec{\mathbf{u}}[/math]
Código Matlab:
rho=linspace(1,2,200);
theta=linspace(0, 2*pi,200);
[RHO,THETA]=meshgrid(rho,theta);
X=RHO.*cos(THETA);
Y=RHO.*sin(THETA);
t=(5/6).*RHO.^2-(8/3).*log(RHO);
hold on;
axis equal;
grid on;
title('Líneas de corriente de u');
contour(X,Y,t,20,'LineWidth',1.5);
xlabel('x');
ylabel('y');
hold off;7 Velocidad máxima del fluido
En este apartado, identificaremos los puntos donde la velocidad del fluido es máxima. Para ello, primero calcularemos el módulo del campo vectorial que corresponde a la velocidad: [math]\ \left | \vec u (\rho ) \right | = \left | -\left [\frac{1}{3}(4n+1)\omega\rho - \frac{4}{3}(n+1)\omega \cdot \frac{1}{\rho} \right ] \vec e_\theta \right | = \frac{1}{3}(4n+1)\omega\rho - \frac{4}{3}(n+1)\omega \cdot \frac{1}{\rho} [/math]
A continuación buscamos los valores máximos que dicho módulo puede tomar, es decir, estamos buscando puntos críticos. Por lo tanto, lo derivamos e igualamos a 0.
Como la ecuación obtenida en el punto anterior no puede cumplirse con valores reales, concluimos que la función del módulo no tiene máximos ni mínimos; es estrictamente creciente o estrictamente decreciente. Para determinar el máximo valor que puede tomar el módulo, evaluamos la función en los extremos del intervalo ρ∈(1,2):
[math] \left| \vec{u}(\rho=1) \right| = \frac{1}{3}(4n+1)\omega\rho - \frac{4}{3}(n+1)\omega \cdot \frac{1}{1} = \omega [/math]
[math] \left| \vec{u}(\rho=2) \right| = \frac{1}{3}(4n+1)\omega\rho - \frac{2}{3}(n+1)\omega = 2n\omega [/math]
Entnces podemos concluir que si: [math] \left| \vec{u}(\rho=1) \right| \gt \left| \vec{u}(\rho=2) \right| \text{si } n\lt \frac{1}{2} \Rightarrow \vec{\mathbf{\omega_e}} \lt \frac{1}{2}\vec{\mathbf{\omega_i}} \Rightarrow \text{ Máx en } \left| \vec{u}(\rho=1) \right| [/math]
[math] \left| \vec{u}(\rho=1) \right| \lt \left| \vec{u}(\rho=2) \right| \text{si } n \gt \frac{1}{2} \Rightarrow \vec{\mathbf{\omega_e}} \gt \frac{1}{2}\vec{\mathbf{\omega_i}} \Rightarrow \text{ Máx en } \left| \vec{u}(\rho=2) \right| [/math]
[math] \left| \vec{u}(\rho=1) \right| = \left| \vec{u}(\rho=2) \right| \text{si } n = \frac{1}{2} \Rightarrow \vec{\mathbf{\omega_e}} = \frac{1}{2}\vec{\mathbf{\omega_i}} \Rightarrow \text{ Máx en } \left| \vec{u}(\rho=1) \right| \text{y } \left| \vec{u}(\rho=2) \right| [/math]
7.1 Representación grafica
Código Matlab:
rho=linspace(1,2,400);
theta=linspace(0,2*pi,200);
f=abs((1/3)*(-5.*rho+8./rho));
rhomin=sqrt(8/5);
fmin=abs((1/3)*(-5*rhomin+8/rhomin));
rhomax=2;
fmax=abs((1/3)*(-5*rhomax+8/rhomax));
[RHO,THETA]=meshgrid(rho,theta);
F=abs((1/3)*(-5.*RHO + 8./RHO));
X=RHO.*cos(THETA);
Y=RHO.*sin(THETA);
Z=F;
figure;
subplot(1,2,1)
cmap=turbo(length(rho));
idx=round(rescale(f,1,length(rho)));
hold on
for i=1:length(rho)-1
plot(rho(i:i+1),f(i:i+1),'Color',cmap(idx(i),:),'LineWidth',2);
end
h1=plot(rho_min,fmin,'ko','MarkerSize',8,'LineWidth',2);
h2=plot(rho_max,fmax,'ko','MarkerSize',8,'LineWidth',2);
text(rhomin,fmin,sprintf(' Mínimo = %.f',fmin),'VerticalAlignment','bottom','Color','k','FontSize',10,'FontWeight','bold');
text(rhomax,fmax,sprintf(' Máximo = %.f',fmax),'VerticalAlignment','top','Color','k','FontSize',10,'FontWeight','bold');
xlabel('\rho');
ylabel('
8 Rotacional de [math] \vec{u} [/math]
8.1 Cálculo del rotacional de [math] \vec{u} [/math]
Para calcular el rotacional de un campo vectorial en coordenadas cilíndricas, se utiliza la siguiente expresión:
En este caso, conociendo [math] \vec{u} [/math] : Siendo [math]\vec{u}(ρ, θ) = f(ρ) \vec{e_θ} [/math]
Por tanto, el rotacional es constante en todo el dominio.
8.2 Representación grafica
Código Matlab:
a=5/3;
mr=2*a;
rho=linspace(1,2,300);
theta=linspace(0,2*pi,300);
[RHO,THETA]=meshgrid(rho,theta);
X=RHO.*cos(THETA);
Y=RHO.*sin(THETA);
C=mr*ones(size(RHO));
figure;
pcolor(X,Y,C);
shading interp;
colorbar;
axis equal;
axis([-3 3 -3 3]);
title('Módulo del rotacional de U');
xlabel('x');
ylabel('y');
9 Campo de Temperaturas
La temperatura del fluido viene definida por el siguiente campo:
Y la temperatura máxima que puede alcanzar se puede ver en la grafica como la zona mas amarilla.
9.1 Representación gráfica
Dado el campo de Temperaturas, la representación del campo y de las curvas de nivel es el siguiente:
Código Matlab:
rho=linspace(1,2,400);
theta=linspace(0,2*pi,400);
[RHO,THETA]=meshgrid(rho,theta);
T=log10(1+RHO.^2).*(cos(THETA)).^2;
X=RHO.*cos(THETA);
Y=RHO.*sin(THETA);
rhomax=2;
thetamax=[0, pi];
xmax=rhomax*cos(thetamax);
ymax=rhomax*sin(thetamax);
Tmax=log10(1+rhomax^2);
fprintf('Temperatura máxima = %.6f\n',Tmax);
for i=1:2
fprintf('Máx %d: rho = %.6f, theta = %.6f rad, (x,y) = (%.6f, %.6f)\n',i,rhomax,thetamax(i),xmax(i),ymax(i));
end
figure;
contour(X,Y,T,40);
colorbar;
axis equal tight;
title('Curvas de nivel de T(\rho,\theta)');
xlabel('x');
ylabel('y');
hold on;
clim([min(T(:)),max(T(:))]);
colormap(turbo);
for i=1:2
plot(xmax(i),ymax(i),'ko','MarkerSize',10,'LineWidth',2);
if xmax(i)>0
text(xmax(i)-0.8,ymax(i),sprintf(' Máx %.3f',Tmax),'Color','k','FontSize',11,'FontWeight','bold');
else
text(xmax(i)+0.08,ymax(i),sprintf(' Máx %.3f',Tmax),'Color','k','FontSize',11,'FontWeight','bold');
end
end
grid on
figure;
surf(X,Y,T,'EdgeColor','none');
colormap(turbo);
colorbar;
axis equal;
xlabel('x');
ylabel('y');
zlabel('T');
title('Campo escalar T(\rho,\theta)');
view(25,15);
clim([min(T(:)), max(T(:))]);
hold on;
for i=1:2
plot3(xmax(i),ymax(i),Tmax,'go','MarkerSize',8,'LineWidth',2);
text(xmax(i),ymax(i),Tmax,sprintf(' Máx %.3f',Tmax),'Color','g','FontSize',11,'FontWeight','bold');
end
10 Gradiente de la temperatura
Primero definimos en coordenadas cilíndricas el campo vectorial gradiente de un campo escalar de la siguiente manera:
[math]\triangledown T = \frac{ \partial T}{\partial \rho}\vec{e_\rho} + \frac{1}{\rho}\frac{ \partial T}{\partial \theta}\vec{e_\theta} + \frac{ \partial T}{\partial z}\vec{e_z}[/math]
Pero nuestra función de temperatura T solo depende de [math] \rho [/math] y [math] \theta [/math]
10.1 Demostración que la gráfica del gradiente de temperatura sea ortogonal a las curvas de nivel de la temperatura
En la primera imagen se visualiza el campo gradiente, en la segunda las curvas de nivel de la temperatura y finalmente, la comprobación de que el campo gradiente es ortogonal a las líneas de nivel de la temperatura.
Codigo Matlab:
[x,y]=meshgrid(linspace(-2.2,2.2,401),linspace(-2.2,2.2,401));
rho=hypot(x,y);
theta=atan2(y,x);
T=log10(1+rho.^2).*(cos(theta).^2);
Tr=(2.*rho.*(cos(theta).^2))./((1+rho.^2)*log(10));
Ttheta=-2*cos(theta).*sin(theta).*log10(1+rho.^2);
gx=Tr.*cos(theta)-(Ttheta./rho).*sin(theta);
gy=Tr.*sin(theta)+(Ttheta./rho).*cos(theta);
mask=(rho>=1)&(rho<=2);
T(~mask)=NaN;
gx(~mask)=0;
gy(~mask)=0;
figure('Color','w');hold on;
axis equal;
box on;
grid on;
contour(x,y,T,20);
colormap(turbo);
step=16;
quiver(x(1:step:end,1:step:end),y(1:step:end,1:step:end),gx(1:step:end,1:step:end),gy(1:step:end,1:step:end),0.8,'Color',[1 0 0],'LineWidth',0.8);
title('Curvas de nivel y gradiente');
xlabel('x');
ylabel('y');
xlim([-2.2 2.2]);
ylim([-2.2 2.2]);
figure('Color','w');hold on;
axis equal;
box on;
grid on;
quiver(x(1:step:end,1:step:end),y(1:step:end,1:step:end),gx(1:step:end,1:step:end),gy(1:step:end,1:step:end),0.8,'Color',[1 0 0],'LineWidth',0.8);
title('Gradiente');
xlabel('x');
ylabel('y');
xlim([-2.2 2.2]);
ylim([-2.2 2.2]);11 Caudal que pasa por la sección θ=0
11.1 Cálculo del caudal
La sección [math]\theta = 0[/math] es una línea radial desde [math]ρ = 1[/math] hasta [math]ρ = 2[/math].
El fluido se mueve dependiente de [math]u_\theta[/math], así que el flujo atraviesa esa línea perpendicularmente.
El caudal [math]Q[/math] a través de esa sección (profundidad [math]h = 1 \,\text{m}[/math]) se calcula como:
[math]Q = \int_{A} u_\theta(ρ)\, dA = \int_{z=0}^{z=1}\int_{ρ=1}^{ρ=2} u_\theta(ρ)\, dρ dz,
[/math]
y haciendo la integral donde Z=altura y [math]\rho =base[/math] nos sale que:
[math]Q=-\frac{1}{2}(4n+1)\omega+\frac{4}{3}(n+1)\omega\cdot ln(2) [/math]