contenido - 148.206.53.231
TRANSCRIPT
2
Contenido
1. Justificación ................................................................................................................................. 4
2. Planteamiento del problema ...................................................................................................... 5
3. Fundamentos de transferencia de calor para la solución al problema ....................................... 9
3.1. Conducción .............................................................................................................. 9
3.2. Convección interna forzada .................................................................................. 10
3.3. Convección externa forzada .................................................................................. 15
3.4. Convección natural ................................................................................................ 16
3.5. Convección mixta .................................................................................................. 17
4. Algoritmo de solución ............................................................................................................... 18
4.1. Pseudocódigo ........................................................................................................ 18
4.2. Diagrama de flujo .................................................................................................. 21
5. Implementación del algoritmo en Python y análisis de corridas .............................................. 22
Caso 1 .................................................................................................................................. 27
Caso 2 .................................................................................................................................. 28
6. Desarrollo de la interfaz gráfica y compilación ......................................................................... 30
Widgets ........................................................................................................................... 30
Diseño con el lenguaje Kivy ............................................................................................. 31
Compilación .................................................................................................................... 33
7. Resultados y conclusiones ......................................................................................................... 38
8. Bibliografía ................................................................................................................................ 39
Anexo I. Desarrollo de la solución aproximada al modelo de transferencia de calor ....................... 40
Anexo II. Código completo ................................................................................................................ 42
Archivo main.py .................................................................................................................. 42
Archivo heatloss.kv ............................................................................................................. 47
Archivo heatlossroutine.py ................................................................................................. 52
Archivo convert.py .............................................................................................................. 59
3
Índice de tablas
Tabla 1. Número de Nusselt para distintos intervalos de número de Reynolds ............................... 15
Tabla 2. Espesor de la pared y diámetro exterior para distintos diámetros nominales y números de
cédula ................................................................................................................................................ 24
Tabla 3. Conductividad térmica del material aislante ....................................................................... 26
Tabla 4. Datos y especificaciones para el Caso 1 .............................................................................. 27
Índice de figuras
Figura 1. Diagrama esquemático de la transferencia de calor desde un cilindro ............................... 6
Figura 2. Diagrama esquemático del modelo de resistencias térmicas .............................................. 7
Figura 3. Diagrama de Moody ........................................................................................................... 13
Figura 4. Pérdida de energía térmica para el Caso 1 ......................................................................... 28
Figura 5. Pérdida de energía térmica respecto al espesor de aislamiento para diferentes
velocidades del viento. ...................................................................................................................... 29
Figura 6. Pérdida de energía térmica respecto al espesor de aislamiento para diferentes
velocidades del viento. ...................................................................................................................... 29
Índice de ilustraciones
Ilustración 1. Aspecto visual de la app .............................................................................................. 35
Ilustración 2. Aspecto visual de la app (extensión) ........................................................................... 35
Ilustración 3. Mensaje de error en pantalla ...................................................................................... 36
Ilustración 4. Popup mostrando un resultado .................................................................................. 37
4
1. Justificación
Tanto en grandes industrias como en pymes de los diferentes sectores y subsectores
productivos, la energía térmica representa en muchos casos una parte importante de los costos
totales de energía en las empresas. Por tanto, dentro de este contexto existe un gran potencial
para la aplicación de medidas de ahorro y uso eficiente de la energía que permitan mejorar el
desempeño energético y la competitividad de las organizaciones.
De manera general, la energía térmica de proceso en una planta es transportada del centro
de suministro al usuario por medio de un fluido caloportador o refrigerante que viaja a través de
grandes extensiones de tubería. Para que esta energía pueda aprovecharse en su mayor parte, se
busca reducir al mínimo las pérdidas que ocurren a lo largo del transporte de la misma; sin
embargo, en muchas ocasiones la cantidad de energía útil disminuye drásticamente debido a la
ausencia de aislamiento térmico en las tuberías.
Una de las medidas para remediar el desperdicio de energía es precisamente la aplicación
de aislantes térmicos a tubería y demás equipo industrial que almacena o transporta calor. Para
ello, es necesario justificar económicamente un proyecto de esta naturaleza por medio del cálculo
previo de las pérdidas de energía térmica que se derivan de no contar con el aislamiento
adecuado, y posteriormente relacionar estos resultados con los costos de energía que la empresa
podría ahorrarse al llevar a cabo esta medida.
La idea principal detrás de este proyecto es proporcionar una herramienta sencilla para la
estimación de estas pérdidas de energía por medio del desarrollo de una aplicación para teléfonos
inteligentes (app) que permita al usuario ingresar la información sobre algunos parámetros
fácilmente conocibles y de esta forma obtener la cantidad de energía térmica que está perdiendo
la tubería. De esta forma, se evita la utilización de complejos y costosos instrumentos de medición
y se facilita al ingeniero la tarea de llevar a cabo los cálculos necesarios.
Es importante remarcar que, al tratarse de una aproximación, los resultados obtenidos
pueden tener altos porcentajes de error debido a que el modelo matemático y correlaciones
utilizadas son válidos únicamente para ciertas consideraciones físicas específicas que restringen el
rango de aplicación de las mismas. Desarrollar una aplicación o software que utilice modelos más
complejos que consideren una variedad más amplia de situaciones físicas queda fuera del alcance
de este proyecto, pues lo que se busca es que el usuario, con algunas mediciones in situ sencillas,
pueda determinar el ahorro de energía que puede obtener al aislar las tuberías.
Finalmente, como tema transversal, se busca que este proyecto sea de utilidad para los
estudiantes de ingeniería interesados en incursionar en el campo del desarrollo de apps,
proporcionándoles una guía e introducción práctica a las ciencias de la computación y la
programación. A opinión del autor de este reporte, el conocimiento y dominio de estas
herramientas es de gran utilidad puesto que brinda a los estudiantes la posibilidad de escribir sus
propios códigos y desarrollar sus propios programas para los casos en que los softwares
comerciales no satisfacen las necesidades de cálculo.
5
2. Planteamiento del problema
Como se mencionó en la justificación de este proyecto, el objetivo principal construir una
app que determine la energía que se pierde en tuberías que transportan algún fluido con
temperatura media diferente a la del medio ambiente y que no tienen aislamiento térmico o
cuentan aislamiento deteriorado. Para calcular la pérdida de energía térmica en una tubería, el
modelo utilizado plantea la transferencia de calor a través de un sistema consistente en un fluido
interno, un par de cilindros concéntricos y un fluido externo.
Si bien las condiciones ambientales como la temperatura del aire, la velocidad del viento y la
presión atmosférica varían a lo largo del día, y más aún, a lo largo de un mes o un año, se
considera la transferencia de calor en estado estacionario para facilitar la solución al problema.
Esta suposición puede ser útil si se considera una temperatura promedio para un cierto periodo de
tiempo, por ejemplo, una hora, un día, etc. De ahí, dado que el resultado tendrá unidades de
[kW/m], puede calcularse la energía térmica perdida multiplicando por el periodo de tiempo que
se quiera considerar y la longitud total de la tubería.
Si se sabe que se pierde calor en forma continua hacia el exterior a través de la pared del
tubo, entonces la tasa de transferencia de calor es igual para los tres mecanismos:
�� = ��𝑐𝑜𝑛𝑑 = ��𝑐𝑜𝑛𝑣 = ��𝑟𝑎𝑑 Ec. (1-1)
Para simplificar aún más el problema, se considera también que la transferencia de calor es
unidimensional en la dimensión 𝑟 y por lo tanto la variación de la temperatura en el sistema
depende sólo de la dirección radial (𝑇 = 𝑇(𝑟)). Esta consideración es razonable si se toma en
cuenta que típicamente las tuberías se extienden por longitudes relativamente grandes; si
suponemos que las temperaturas no variarán significativamente desde la entrada del tubo a la
salida, puede despreciarse la transferencia de calor en 𝑧 y en 𝜃 . Por otro lado, en esta solución
consideramos que la magnitud de la tasa de transferencia de calor por radiación ��𝑟𝑎𝑑 es muy
pequeña comparada con las de los otros dos mecanismos de transferencia. Esta consideración es
válida al verificar que la temperatura máxima de la superficie externa de la tubería alcanza una
temperatura máxima de 500 C.
6
Figura 1. Diagrama esquemático de la transferencia de calor desde un cilindro
Considérese entonces un tubo metálico de radio interno 𝑟0 y radio externo 𝑟1 con una
conductividad térmica 𝑘0,1. Rodeando el tubo se encuentra una capa de material aislante de
espesor 𝑥, equivalente a un cilindro de radio interno 𝑟1 y radio externo 𝑟2, y con una conductividad
térmica 𝑘1,2. El fluido interno fluye al interior del tubo a una temperatura 𝑇𝑖 con una velocidad
promedio de 𝑣0, mientras que el fluido externo es el aire, con una temperatura 𝑇∞ igual a la del
medio ambiente y una velocidad del viento igual a 𝑣∞. De aquí en adelante, el subíndice 𝑖 se
utilizará para las propiedades del fluido interno, mientras que el subíndice ∞ se utilizará para las
propiedades del aire del medio ambiente. El diagrama esquemático de este problema se muestra
en la Figura 1.
Con la finalidad de llegar a una sola expresión que nos permita calcular la pérdida de calor
por unidad de longitud, se utilizará el concepto de resistencias térmicas, equivalente al de
resistencias en un circuito eléctrico (Figura 2). De acuerdo con la situación física planteada
anteriormente, el modelo a desarrollar constará de cuatro resistencias térmicas en serie. La
primera, 𝑅1, representará la resistencia térmica por convección interna forzada; la segunda, 𝑅2, la
resistencia térmica por conducción en la pared de la tubería; la tercera, 𝑅3, la resistencia térmica
por conducción dentro del aislamiento térmico; y la cuarta, 𝑅4, la resistencia térmica por
convección en el exterior. La suma de estas resistencias, 𝑅𝑇𝑜𝑡𝑎𝑙, representará la resistencia global
a la transferencia de calor.
7
Figura 2. Diagrama esquemático del modelo de resistencias térmicas
La forma de estas resistencias térmicas se explica a continuación. Se comienza calculando la
tasa de transferencia de calor por conducción en el cilindro y la capa de material aislante. De
acuerdo con la ley de Fourier la transferencia de calor por conducción a través de una capa
cilíndrica puede expresarse como
��𝑐𝑜𝑛𝑑 = −𝑘𝐴𝑑𝑇
𝑑𝑟 [W] Ec. (1-2)
en donde 𝐴 = 2𝜋𝑟𝐿 es el área de transferencia en la ubicación 𝑟. Para resolver esta
ecuación diferencial de primer orden suponemos constantes las temperaturas en las paredes de
cada cilindro. Al separar las variables de la ecuación anterior e integrar desde 𝑟 = 𝑟1 donde 𝑇 =
𝑇1, hasta 𝑟 = 𝑟2, en donde 𝑇 = 𝑇2, el resultado es, para el tubo metálico
��𝑐𝑜𝑛𝑑,𝑡𝑢𝑏𝑜 = −2𝜋𝐿𝑘0,1𝑇1−𝑇0
ln(𝑟1𝑟0
) Ec. (1-3)
y para la capa de aislamiento
��𝑐𝑜𝑛𝑑,𝑎𝑖𝑠𝑙 = −2𝜋𝐿𝑘1,2𝑇2−𝑇1
ln(𝑟2𝑟1
) Ec. (1-4)
donde 𝑘𝑖,𝑗 es la conductividad térmica media del material acotado por las paredes de radios
𝑟𝑖 y 𝑟𝑗.
Para fines prácticos, se hace la suposición de que el tubo transporta un fluido caliente (i.e.,
con una temperatura mayor a la del medio ambiente) en su interior y se utiliza la ley de
enfriamiento de Newton para calcular la transferencia de calor por convección para el fluido
interno y para el aire.
��𝑐𝑜𝑛𝑣,𝑖𝑛𝑡 = ℎ𝑖𝐴0(𝑇𝑖 − 𝑇0) Ec. (1-5)
��𝑐𝑜𝑛𝑣,𝑒𝑥𝑡 = ℎ∞𝐴2(𝑇2 − 𝑇∞) Ec. (1-6)
8
donde 𝐴0 = 2𝜋𝑟0𝐿 y 𝐴2 = 2𝜋𝑟2𝐿.
Las ecuaciones anteriores se reacomodan expresando las diferencias de temperaturas en
función de los radios.
(𝑇𝑖 − 𝑇0) =��
2𝜋𝐿𝑟0
1
ℎ𝑖 Ec. (1-9)
(𝑇0 − 𝑇1) =��
2𝜋𝐿𝑘0,1ln (
𝑟1
𝑟0) Ec. (1-7)
(𝑇1 − 𝑇2) =��
2𝜋𝐿𝑘1,2ln (
𝑟2
𝑟1) Ec. (1-8)
(𝑇2 − 𝑇∞) =��
2𝜋𝐿𝑟2
1
ℎ∞ Ec. (1-10)
Sumando las ecuaciones anteriores y factorizando ��
2𝜋𝐿 da
(𝑇𝑖 − 𝑇∞) =��
2𝜋𝐿[
1
𝑟0ℎ𝑖+
1
𝑘0,1ln (
𝑟1
𝑟0) +
1
𝑘1,2ln (
𝑟2
𝑟1) +
1
𝑟2ℎ∞] Ec. (1-11)
Finalmente, la expresión para calcular la pérdida de calor por unidad de longitud es
��
𝐿=
2𝜋(𝑇𝑖−𝑇∞)1
𝑟0ℎ𝑖+
1
𝑘0,1ln(
𝑟1𝑟0
)+1
𝑘1,2ln(
𝑟2𝑟1
)+1
𝑟2ℎ∞
Ec. (1-12)
La expresión anterior es de gran utilidad, puesto que generalmente se pueden conocer
tanto 𝑇𝑖 y 𝑇∞, como las dimensiones de la tubería y el espesor de la capa de aislante térmico. La
temperatura 𝑇∞ del aire puede conocerse fácilmente al revisar la información meteorológica en
cualquier momento, mientras que la temperatura 𝑇𝑖 del fluido interno regularmente es un
parámetro de operación.
La ecuación (1-12) es la solución analítica a la ecuación diferencial (1-2); sin embargo, existe
una forma alternativa de resolver ��/𝐿 utilizando una expresión que sustituye los logaritmos
naturales por la media logarítmica de los diámetros (McAdams, 1954).Esta forma resulta
apropiada sobre todo en problemas de optimización, en los cuales se busca evitar resultados
indeterminados derivados de la utilización de logaritmos naturales.
��
𝐿=
𝑇𝑖−𝑇∞1
ℎ𝑖(𝜋𝐷0)+
𝑥𝑤𝑘0,1(𝜋𝐷𝑤)
+𝑥
𝑘1,2(𝜋𝐷𝑚)+
1
ℎ∞(𝜋𝐷2)
Ec. (1-13)
donde 𝐷𝑤 y 𝑥𝑤 son el diámetro medio y el espesor de la tubería, respectivamente, y 𝐷𝑚 y 𝑥
son el diámetro medio y el espesor del material aislante, respectivamente. El procedimiento
mediante el cual se llega a esta aproximación se explica más a detalle en el Anexo I.
La ecuación (1-13) se utilizará para la solución del problema por conveniencia, ya que,
además de las temperaturas 𝑇𝑖 y 𝑇∞, sólo requiere los espesores de la tubería y del material
aislante. Además, permite utilizar el espesor 𝑥 del aislamiento térmico como variable
independiente en un análisis de ��/𝐿 vs 𝑥 variando otros parámetros.
9
Recordando el enfoque de resistencias térmicas, la ecuación (1-13) puede ser expresada
como
��
𝐿=
𝑇𝑖−𝑇∞
𝑅1+𝑅2+𝑅3+𝑅4=
𝑇𝑖−𝑇∞
𝑅𝑇𝑜𝑡𝑎𝑙 Ec. (1-14)
en donde
𝑅1 =1
ℎ𝑖(𝜋𝐷0) 𝑅2 =
𝑥𝑤
𝑘0,1(𝜋𝐷𝑤)
𝑅3 =𝑥
𝑘1,2(𝜋𝐷𝑚) 𝑅4 =
1ℎ∞(𝜋𝐷2)
El reto más importante en la resolución del problema por medio de este modelo
matemático, estriba en la determinación de los coeficientes de transferencia de calor por
convección ℎ𝑖 y ℎ∞, puesto que este mecanismo de transferencia es complejo debido a su
dependencia de varias variables del fenómeno físico que deben determinarse experimentalmente
o calcularse con ayuda de correlaciones. Para fines de este proyecto, la obtención de estos
coeficientes se hará por medio de correlaciones.
3. Fundamentos de transferencia de calor para la solución al
problema
Este capítulo resume los aspectos teóricos sobre los cuales se fundamenta la solución al
problema y que servirán para generar el algoritmo de cálculo de la app. Para contextualizar, se
explica brevemente la definición de los mecanismos de conducción, convección interna forzada,
convección externa forzada, convección natural y convección mixta. Asimismo, dada la gran
cantidad de correlaciones disponibles en la literatura, se incluyen únicamente las que actualmente
se consideran más precisas y que tienen un rango de validez más amplio. De cualquier forma,
recordando que la solución al problema será sólo una aproximación, se remarca que las
correlaciones empleadas suelen tener un error del 10% o más, el cual se propaga hasta el
resultado final. Finalmente, es importante mencionar que en todos los casos se considera que la
posición de la tubería es horizontal, hecho que debe tomarse en cuenta al hacer uso de la app
para los cálculos prácticos.
3.1. Conducción
La conducción es un mecanismo de transferencia de energía que tiene lugar tanto en
materiales sólidos como en líquidos y gases. En los primeros, la conducción se da por las
vibraciones de las moléculas en la estructura del material, mientras que en los segundos se da por
las colisiones y la difusión de moléculas. La tasa de transferencia de calor por este mecanismo a
través de cualquier medio depende principalmente de la configuración geométrica, el espesor, el
material y la diferencia de temperaturas entre las fronteras consideradas. En el caso de este
10
mecanismo de transferencia de calor, la conductividad térmica y la difusividad térmica son las
propiedades más relevantes del material.
Conductividad térmica
La conductividad térmica puede verse como la medida de la capacidad de un material para
conducir calor. La fuerte dependencia de esta propiedad respecto a la temperatura resulta en una
mayor complejidad en el análisis, razón por la cual evaluar la conductividad térmica 𝑘 a la
temperatura promedio y tratarla como constante en los cálculos es una práctica común.
Para este caso, calcularemos la conductividad 𝑘0,1 de la tubería a la temperatura media del
fluido interno y del aire:
𝑇𝑚 =𝑇𝑖 + 𝑇∞
2
Difusividad térmica
La difusividad térmica es una medida de la rapidez de un material para difundir el calor en
su interior. Es igual a la conductividad térmica del material dividida entre el producto del valor de
su densidad y la capacidad calorífica específica del mismo. Tiene unidades de [m2/s].
𝛼 =𝑘
𝜌𝐶𝑝
3.2. Convección interna forzada
La convección es un mecanismo de transferencia de calor que requiere la presencia de un
fluido en movimiento sobre una superficie y puede ser expresada de manera sencilla con la
siguiente fórmula general
��𝑐𝑜𝑛𝑣 = ℎ𝐴𝑆(𝑇𝑆 − 𝑇∞)
donde ℎ es el coeficiente de transferencia de calor por convección, 𝐴𝑆 es el área de la
superficie de transferencia y (𝑇𝑆 − 𝑇∞) es la diferencia de temperaturas entre el fluido en
contacto con la superficie y el fluido suficientemente lejos de ésta. Por lo tanto, ℎ puede verse
también como una medida de la rapidez de transferencia de calor por unidad de área y por unidad
de diferencia de temperaturas.
La efectividad de este mecanismo de transferencia depende de las propiedades viscosidad
dinámica 𝜇, conductividad térmica 𝑘, densidad 𝜌, calor específico 𝑐𝑝 y la velocidad 𝑉 del fluido, las
cuales a su vez pueden variar considerablemente en función de la temperatura de éste. En la
práctica, para evitar complejidad en los cálculos, las propiedades del fluido se evalúan a una
temperatura promedio y se les considera constantes.
En la transferencia de calor por convección, el número de Nusselt es una cantidad
importante para entender este mecanismo, puesto que representa la efectividad de la
transferencia de calor por convección a través de una capa de fluido en relación con la
transferencia de calor a través de la misma capa únicamente por conducción.
11
��𝑐𝑜𝑛𝑣
��𝑐𝑜𝑛𝑑=
ℎ∆𝑇
𝑘∆𝑇/𝐿 =
ℎ𝐿
𝑘= Nu
Este número fue concebido como el coeficiente adimensional de transferencia de calor por
convección y es igual a
Nu =ℎ𝐿𝑐
𝑘
donde 𝐿𝑐 es la longitud característica del sistema y ℎ y 𝑘 son el coeficiente convectivo y la
conductividad térmica del fluido, respectivamente. Utilizando la notación de este problema, el
número de Nusselt para la convección interna es:
Nu𝑖 =ℎ𝑖𝐷0
𝑘𝑖
Otro número adimensional importante en el análisis de la convección, es el número de
Prandtl, el cual describe el espesor relativo de las capas límite de velocidad y térmica o, dicho de
otra manera, indica cuál de estas dos capas límite se desarrolla primero en un determinado
material o sustancia.
Pr =Difusividad molecular de la cantidad de movimiento
Difusividad molecular del calor
Pr𝑖 =𝑣𝑖
𝛼𝑖=
𝜇𝑖𝑐𝑝𝑖
𝑘𝑖
Como puede verse en esta definición, el número de Prandtl depende únicamente de las
propiedades internas del fluido y, por tanto, también es función de la temperatura. Un número de
Prandtl mucho mayor a 1 (Pr ≫ 1) indica que el calor se difunde con mucha rapidez, como es el
caso de los metales, mientras que un número de Prandtl mucho menor a 1 (P𝑟 ≪ 1), que es más
común en aceites, indica que el calor se difunde con mucha lentitud. En el caso de los fluidos que
se consideran en este problema, el número de Prandtl se presenta ya en tablas de propiedades,
por lo que no será necesario calcularlo por separado.
Por otro lado, el número de Reynolds es también una cantidad relevante en los cálculos de
convección, puesto que representa la razón de las fuerzas de inercia entre las fuerzas viscosas que
actúan en el fluido.
Re =Fuerzas de inercia
Fuerzas viscosas
Re =𝑉𝐿𝑐
𝑣=
𝜌𝑉𝐿𝑐
𝜇
De acuerdo con el valor del número de Reynolds, un flujo puede clasificarse de la siguiente
manera:
Flujo laminar: Re < 2 300
Flujo de transición: 2 300 < Re < 10 000
12
Flujo turbulento: Re > 10 000
En el caso de la convección interna forzada, un fluido es obligado a desplazarse en el interior
de un tubo o un ducto con ayuda de medios externos –como una bomba o un ventilador–,
dominado por la influencia de la viscosidad en toda la extensión del campo de flujo. Para tubos
circulares, el número de Reynolds puede expresarse de la siguiente manera:
Re𝑖 =𝑉𝑖𝐷0
𝑣𝑖=
𝜌𝑖𝑉𝑖𝐷0
𝜇𝑖 (Ec. 2-1)
donde, en consistencia con la notación que utilizamos al inicio, 𝐷0 es el diámetro interno de
la tubería y 𝜌𝑖, 𝑣𝑖, 𝜇𝑖 y 𝑉𝑖 son la densidad, la viscosidad cinemática, la viscosidad dinámica y la
velocidad del fluido interno, respectivamente. Si se quiere dejar expresado en función del flujo
másico, hay que recordar que
��𝑖 = 𝜌𝑖𝑉𝑖𝐴0 = 𝜌𝑖𝑉𝑖 (𝜋𝐷0
2
4)
de donde se despeja 𝑉𝑖 y se sustituye en la ecuación (2-1) para dar lugar a la siguiente
expresión
Re𝑖 =4��𝑖
𝜇𝑖𝜋𝐷0 (Ec. 2-2)
Las ecuaciones (2-1) y (2-2) se utilizarán más adelante en el algoritmo de cálculo para
brindar al usuario la posibilidad de proporcionar ya sea 𝑉𝑖 o ��𝑖 como datos de entrada en la app.
Las propiedades del fluido interno se calculan a la temperatura media del fluido, la cual es
igual al promedio aritmético de las temperaturas del fluido a la entrada y a la salida del tubo, sin
embargo, a fin de que la interfaz de la app no sea tan complicada, el usuario no tendrá que
proporcionar estas temperaturas sino únicamente el dato de la temperatura media.
En el caso del transporte de fluidos en ductos o tuberías, el factor de fricción es un
parámetro adimensional que juega un papel importante en la determinación de los coeficientes
convectivos. Éste se utiliza para calcular la pérdida de carga en una tubería debido a la fricción y
depende a su vez del número de Reynolds y de la rugosidad interna de la tubería. Las
correlaciones a utilizar dependen por lo tanto del tipo de flujo de que se trate.
Tradicionalmente, el diagrama de Moody (Figura 3) ha sido ampliamente utilizado para
encontrar de forma gráfica el factor de fricción de una tubería en función del número de Reynolds
y la rugosidad relativa de una tubería con márgenes de error bastante aceptables. Sin embargo,
para poder realizar la programación de la app, es más conveniente calcular el factor de fricción por
medio de correlaciones.
13
Figura 3. Diagrama de Moody
En el último siglo, gracias al trabajo experimental de numerosos investigadores se han
propuesto diversas correlaciones empíricas para calcular el factor de fricción en tuberías. No
obstante, dadas las condiciones en que se realizan los experimentos, muchas de ellas tienen un
rango de aplicabilidad muy limitado pues, por ejemplo, sólo son válidas para tubos lisos o para
cierto régimen de flujo en función del número de Reynolds. Algunas de ellas presentan el factor de
fricción de manera explícita, mientras que otras lo expresan implícitamente; estas últimas muchas
veces tienen un menor porcentaje de error, pero requieren la implementación de algún método
numérico para su utilización en un algoritmo.
A continuación, se presentan algunas correlaciones para el cálculo del factor de fricción y
del número de Nusselt de acuerdo con el régimen de flujo en que pueden aplicarse.
Flujo laminar
En régimen laminar, tanto el factor de fricción como el número de Nusselt, son
independientes de la rugosidad relativa, por lo que dependen únicamente del número de
Reynolds.
Factor de fricción 𝑓 =64
Re𝑖 (Ec. 2-3)
Número de Nusselt (𝑇𝑠 = 𝑐𝑡𝑒) Nu𝑖 = ℎ𝑖𝐷0
𝑘𝑖= 3.66 (Ec. 2-4)
Número de Nusselt (�� = 𝑐𝑡𝑒) Nu𝑖 = ℎ𝑖𝐷0
𝑘𝑖= 4.36 (Ec. 2-5)
14
Flujo turbulento
En el régimen turbulento, existen expresiones que son aplicables a flujos en tubos lisos o en
tubos ásperos. En mayoría de los casos reales, la tubería tiene cierta rugosidad, por lo que para
este problema es preferible utilizar correlaciones que consideren esta característica.
Para el cálculo del factor de fricción se utilizarán las ecuaciones de Colebrook (1939) y de
Haaland (1983). La primera es una ecuación implícita y se resolverá mediante el método de Euler
tomando el resultado de la segunda ecuación como valor inicial. Esto se hace así puesto que la
ecuación de Haaland es una ecuación explícita y presenta un error de aproximadamente 2%
respecto a la Ecuación de Colebrook, lo que la hace conveniente para utilizarse como primera
aproximación.
Ecuación de Haaland (1983) 1
√𝑓= −1.8 log [
6.9
Re𝑖+ (
𝜀/𝐷0
3.7)
1.11
] (Ec. 2-6)
Ecuación de Colebrook (1939) 1
√𝑓= −2.0 log [
𝜀/𝐷0
3.7+
2.51
Re𝑖√𝑓] (Ec. 2-7)
El parámetro adimensional 𝜀/𝐷0 es llamado rugosidad relativa y es la razón de la altura
media de la rugosidad del tubo al diámetro de éste. El valor 𝜀 de la rugosidad relativa es difícil de
determinar en la realidad, por lo que el usuario lo deberá indicar manualmente un valor
aproximado. Usualmente, la rugosidad tiene valores entre 0.0015 mm para tuberías de cobre o
latón y hasta 9 mm para tuberías de concreto. Para fines prácticos, se supondrá una rugosidad de
0.005 mm para las opciones de tubería consideradas.
Una vez calculado el factor de fricción, el siguiente paso es calcular el número de Nusselt, el
cual se obtendrá utilizando la correlación de Gnielinski (1976):
Intervalo de validez:
Nu𝑖 = (𝑓/8)(Re𝑖 − 1000)Pr𝑖
1 + 12.7(𝑓/8)0.5 (Pr𝑖2/3
− 1) 0.5 ≤ Pr ≤ 2000
3×103 < Re < 5×106 (Ec. 2-8)
El flujo de transición es más complicado de analizar que los anteriores, por lo que, para fines
prácticos, siempre que el número de Reynolds indique que el flujo está este régimen se utilizarán
las correlaciones para flujo turbulento.
15
3.3. Convección externa forzada
En la convección externa forzada, el fluido es desplazado ya sea por medios externos, como
un ventilador, o por corrientes de viento a altas velocidades, en el caso del aire del medio
ambiente. En el flujo alrededor de cilindros, conceptos como el de capa límite de velocidad, capa
límite térmica, coeficiente de arrastre y temperatura de película juegan un rol fundamental
cuando se quiere entender a fondo este mecanismo de transferencia de calor en este tipo de
configuración geométrica.
Las propiedades del fluido externo (aire, en este caso) se evalúan a la temperatura de
película, la cual es igual al promedio aritmético de la temperatura del fluido en contacto con la
superficie del tubo –o del material aislante– y la temperatura fuera de la capa límite, es decir, la
temperatura del aire del medio ambiente lo suficientemente lejos de la región de capa límite
térmica formada por el flujo de aire sobre la tubería. Escrito en la notación de este problema, la
temperatura de película es
𝑇𝑓 =𝑇2+𝑇∞
2 (Ec. 2-9)
Siguiendo con la notación de este modelo, definimos los números adimensionales de
Reynolds, Prandtl y Nusselt que se utilizarán posteriormente como:
Re∞ =𝑉∞𝐷2
𝑣∞=
𝜌∞𝑉∞𝐷2
𝜇∞ (Ec. 2-10)
Pr∞ =𝑣∞
𝛼∞=
𝜇∞𝑐𝑝∞
𝑘∞ (Ec. 2-11)
Nu∞ =ℎ∞𝐷2
𝑘∞ (Ec. 2-12)
Para el flujo cruzado sobre cilindros, la correlación encontrada por Churchill & Bernstein
(1977) es de las más precisas en la actualidad. Es válida para Re∞Pr∞ > 0.2, aunque los resultados
obtenidos pueden tener desviaciones de hasta un 30%.
Nu∞ =ℎ∞𝐷2
𝑘∞= 0.3 +
0.62 Re∞1/2
Pr∞1/3
[1+(0.4/Pr∞)2/3]1/4 [1 + (
Re∞
282000)
5/8]
4/5
(Ec. 2-13)
Por otro lado, Zukauskas (1972) y Jakob (1949) propusieron un grupo de correlaciones más
simples para distintos rangos del número de Reynolds que son válidas para cualquier líquido o gas
(Tabla 1). Sin embargo, por simplicidad en el algoritmo, se utilizará la correlación de Churchill &
Bernstein (Ecuación 2-13).
Tabla 1. Número de Nusselt para distintos intervalos de número de Reynolds
Intervalo de Re Número de Nusselt
0.4 – 4 Nu = 0.989 Re0.330Pr1/3
4 – 40 Nu = 0.911 Re0.385Pr1/3
40 – 4 000 Nu = 0.683 Re0.466Pr1/3
4 000 – 40 000 Nu = 0.193 Re0.618Pr1/3
40 000 – 400 000 Nu = 0.027 Re0.805Pr1/3
16
3.4. Convección natural
La convección natural es aquella en la que el movimiento del fluido ocurre por medios
naturales. Generalmente, las velocidades asociadas a este mecanismo son relativamente bajas, del
orden de 1 m/s o menor, por lo que a menudo no se puede notar el movimiento a simple vista. Los
coeficientes convectivos en la convección natural dependen mucho de la velocidad del fluido:
entre más alta sea ésta, mayor es el coeficiente.
Una propiedad importante en este mecanismo de transferencia es el coeficiente de
expansión volumétrica, el cual representa la variación de la densidad de un fluido con la
temperatura a presión constante. Tiene unidades de [K−1] en unidades del Sistema Internacional,
indicando que se trata de temperatura absoluta.
𝛽 =1
𝑣(
𝜕𝑣
𝜕𝑇)
𝑃= −
1
𝜌(
𝜕𝜌
𝜕𝑇)
𝑃
El coeficiente de expansión volumétrica se puede expresar de manera aproximada
reemplazando las cantidades diferenciales por diferencias como
𝛽 ≈ −1
𝜌
∆𝜌
∆𝑇= −
1
𝜌
𝜌∞ − 𝜌
𝑇∞ − 𝑇
en donde 𝜌∞ es la densidad y 𝑇∞ es la temperatura del fluido lejos de la superficie. Para
gases ideales, el coeficiente 𝛽 toma una forma más simple, quedando en función únicamente de la
temperatura absoluta
𝛽𝑔𝑎𝑠 𝑖𝑑𝑒𝑎𝑙 =1
𝑇
En este problema, se considerará que el aire se comporta como un gas ideal, por lo que,
utilizando la notación del modelo se tiene
𝛽∞ =1
𝑇∞ (Ec. 2-14)
En problemas de convección natural, los números adimensionales de Grashof y de Rayleigh
son muy importantes para tener una mejor comprensión del fenómeno físico que tiene lugar. El
número de Grashof es un parámetro adimensional que representa los efectos de la convección
natural. Representa la razón entre la fuerza de flotación y la fuerza viscosa que actúan sobre el
fluido, por lo que es el equivalente en convección natural al Número de Reynolds para convección
forzada.
Gr =Fuerzas de flotabilidad
Fuerzas viscosas
Gr𝐿 =𝑔𝛽(𝑇𝑠 − 𝑇∞)𝐿𝑐
3
𝑣2
en donde:
17
𝑔 = aceleración gravitacional, igual a 9.81 m/s2
𝛽 = coeficiente de expansión volumétrica, [1/K] 𝑇𝑠 = temperatura de la superficie, [°C] 𝑇∞ = temperatura del fluido suficientemente lejos de la superficie, [°C] 𝐿𝑐 = longitud característica de la configuración geométrica, [m] 𝑣 = viscosidad cinemática del fluido, [m2/s]
En consistencia con la notación de este modelo, se expresa el número de Grashof como
Gr∞ =𝑔𝛽∞(𝑇2−𝑇∞)𝐷2
3
𝑣∞2 (Ec. 2-15)
Por otro lado, el número de Rayleigh puede considerarse como la razón de las fuerzas de
flotación y los productos de las difusividades térmica y de cantidad de movimiento. Es igual al
producto de los números de Grashof y de Prandtl.
Ra∞ =𝑔𝛽∞(𝑇2 − 𝑇∞)𝐷2
3
𝑣∞2 Pr∞
Ra∞ = Gr∞Pr∞ (Ec. 2-16)
Al igual que en la convección interna forzada y la convección externa forzada, existen
numerosas correlaciones empíricas para determinar los coeficientes convectivos en convección
natural. Para el caso de transferencia de calor desde cilindros horizontales, la correlación de
Churchill & Chu (1975) es útil para cualquier gas, teniendo validez para Ra ≤ 1012 y para
temperatura superficial constante (𝑇𝑠 = cte).
Nu∞ = {0.6 +0.387Ra∞
1/6
[1+(0.559/Pr∞)9/16]8/27}
2
(Ec. 2-17)
Para el caso específico de convección natural desde un tubo hacia el aire, la correlación de
Rice (1923) toma una forma más simple y su porcentaje de error respecto a la de Churchill & Chu
es bastante aceptable (menor al 2%), por lo que es preferible utilizarla en el algoritmo.
Nu = 0.47 Ra0.25 (Ec. 2-18)
3.5. Convección mixta
Se le llama convección mixta a la combinación de los mecanismos de transferencia de calor
por convección externa forzada y convección natural. Aunque en la realidad los dos ocurren
simultáneamente, generalmente uno de ellos es más dominante que el otro, por lo que en la
práctica el menos dominante suele descartarse del análisis. Para determinar si se trata de
convección mixta o si sólo se considera el mecanismo más dominante, se toman los siguientes
criterios:
Si Gr∞/Re∞2 ≫ 1 Se considera únicamente convección natural
Si Gr∞/Re∞2 ≪ 1 Se considera únicamente convección forzada
Si Gr∞/Re∞2 ≈ 1 Se considera convección mixta
18
El parámetro Gr∞/Re∞2 representa la importancia de la convección natural respecto a la
convección externa forzada.
En la convección mixta, el número de Nusselt depende de los números de Reynolds, Grashof
y Prandtl, es decir, Nu∞ = 𝑓(Re∞, Gr∞, Pr∞) y se calcula de la siguiente manera
Nu𝑚𝑖𝑥𝑡𝑎 = (Nu𝑓𝑜𝑟𝑧𝑎𝑑𝑎𝑛 ± Nu𝑛𝑎𝑡𝑢𝑟𝑎𝑙
𝑛 )1/𝑛
en donde el signo + se ocupa para flujos de apoyo y transversal, el signo − se ocupa para
flujos en oposición, y 3 < 𝑛 < 4, con 𝑛 = 3 para superficies verticales y 𝑛 > 3 para superficies
horizontales. En este problema tomamos 𝑛 = 3.5 por comodidad.
4. Algoritmo de solución
Una vez establecido el modelo matemático y el conjunto de correlaciones necesarias para el
cálculo de los coeficientes convectivos, es momento de definir el algoritmo de cálculo sobre el que
se construirá la app. Para facilitar la interpretación y entendimiento del mismo, se presenta un
diagrama de flujo y el pseudocódigo correspondiente. El primero sirve como guía visual para
entender la lógica del algoritmo, mientras que el segundo se asemeja a instrucciones escritas en
algún lenguaje de programación.
4.1. Pseudocódigo
El pseudocódigo es una forma simplificada de esbozar la estructura de un programa de
cómputo y está escrito mitad en inglés1, mitad en código de algún lenguaje de programación. El
pseudocódigo es una herramienta útil puesto que permite al programador clarificar sus
pensamientos y diseñar propiamente una rutina antes de comenzar a escribir cualquier línea de
código fuente. Además, permite ahorrar mucho tiempo valioso al momento de revisar el programa
y localizar errores.
A continuación, se presenta el algoritmo propuesto para realizar el cálculo de ��/𝐿:
1. Ingresar especificaciones del fluido interno: a. Sustancia (nombre) b. Estado termodinámico (presión, temperatura y/o calidad) c. Velocidad promedio o flujo másico
2. Calcular propiedades termofísicas del fluido interno 3. Ingresar especificaciones del aire del medio ambiente:
a. Estado termodinámico (presión atmosférica y temperatura ambiente)
b. Velocidad del viento 4. Calcular propiedades termofísicas del aire 5. Ingresar especificaciones de la tubería
a. Material b. Número de cédula
1 Originalmente el pseudocódigo se escribió en inglés puesto que la mayoría de las investigaciones y desarrollos en ciencias de la computación y programación se hacían y continúan haciéndose en este idioma. Para este algoritmo, se utilizará una combinación de español e inglés para facilitar su lectura.
19
c. Diámetro nominal (NPS) d. Rugosidad
6. Ingresar especificaciones del aislante térmico a. Material b. Espesor
7. Cálculo de hi (coeficiente convectivo del fluido interno) a. Calcular número de Reynolds (Ec.2-1) b. Seleccionar caso (flujo laminar o flujo turbulento) c. Dependiendo del caso, calcular el factor de fricción y el
número de Nusselt con las correlaciones correspondientes d. Calcular hi
8. Cálculo de hinf (coeficiente convectivo del aire) a. Calcular número de Reynolds b. Calcular coeficiente de expansión volumétrica c. Calcular número de Grashof (para la primera iteración,
suponer T2 = (T+Tinf)/2 ) d. Calcular número de Rayleigh e. Determinar si se trata de convección forzada dominante,
convección natural dominante o convección mixta. f. Calcular número de Nusselt g. Calcular hinf
9. Calcular resistencias térmicas (R1, R2, R3 y R4) y luego RTotal 10. Calcular Q/L (Ec.1-13) 11. Calcular T2 con base en el resultado (ver Ec.1-10) 12. Comparar valores T2_new vs T2_old.
a. Si son aproximadamente iguales, terminar programa b. Si no cumple criterio de paro, repetir desde el paso 8.c y
proponer T2_old = T2_new
Como puede verse, el proceso de iteración comienza en el paso 8, inciso c, suponiendo para
el cálculo del número de Grashof de la primera iteración que
𝑇2 =𝑇𝑖 + 𝑇∞
2
Posteriormente este resultado se verifica con ayuda de la ecuación (1-10)
(𝑇2 − 𝑇∞) =��
2𝜋𝐿𝑟2
1
ℎ∞
despejando 𝑇2 y sustituyendo 2𝑟2 = 𝐷2
𝑇2 = 𝑇∞ +��
𝐿
1
𝜋𝐷2ℎ∞
El error relativo porcentual se calcula como
𝑒𝑟 =|𝑇2,𝑎𝑐𝑡𝑢𝑎𝑙 − 𝑇2,𝑎𝑛𝑡𝑒𝑟𝑖𝑜𝑟|
𝑇2,𝑎𝑐𝑡𝑢𝑎𝑙×100%
donde 𝑇2,𝑎𝑛𝑡𝑒𝑟𝑖𝑜𝑟 es el valor inicial supuesto de 𝑇2, y 𝑇2,𝑎𝑐𝑡𝑢𝑎𝑙 es el valor actual de 𝑇2,
proveniente del resultado de ��/𝐿. Para las iteraciones subsecuentes, se actualiza el valor de 𝑇2
como 𝑇2,𝑎𝑛𝑡𝑒𝑟𝑖𝑜𝑟 = 𝑇2,𝑎𝑐𝑡𝑢𝑎𝑙.
20
El criterio de paro se define como: |𝑒𝑟| < 𝑒𝑠, donde 𝑒𝑠 = (0.5×102−𝑛)%. Esto garantiza
que el resultado obtenido será correcto en al menos 𝑛 cifras significativas (Scarborough, 1966). Si
determinamos que el resultado tenga 8 cifras significativas de precisión, entonces 𝑒𝑠 = 5×10−7.
Además, para asegurar que el programa no se quede indefinidamente en este loop en un intento
por buscar la convergencia, se define como criterio de paro el número máximo de iteraciones:
𝐼𝑀𝑎𝑥 = 1000.
21
4.2. Diagrama de flujo
22
5. Implementación del algoritmo en Python y análisis de corridas
El algoritmo tiene que dar como resultado final el valor de ��/𝐿 a partir de los datos de
entrada que ingrese el usuario. Sin embargo, antes de implementar un programa que interactúe
con el usuario, es necesario corroborar que el algoritmo funciona correctamente al variar
parámetros tales como el material y espesor de la tubería y del aislamiento térmico, las
condiciones del aire del medio ambiente, el estado termodinámico del fluido interno y las
velocidades de flujo. Para hacer esto, el bloque de adquisición de datos por parte del usuario se
sustituye por la especificación de datos directamente dentro del programa.
Como se verá más adelante, cada una de las instrucciones que conforman el algoritmo
general requiere a su vez de la definición de otras funciones particulares para interactuar con
información de tablas externas y para realizar los cálculos numéricos. Esta sección está dedicada a
mostrar la estructura de dichas funciones y los resultados del programa de prueba al variar
algunos parámetros.
Tanto el programa de prueba como el código completo de la app están desarrollados en
lenguaje Python, el cual es un lenguaje de programación multipropósito que permite construir casi
cualquier tipo de programa que no requiera acceder directamente al hardware de una
computadora. La decisión de usar Python para el desarrollo de esta app se basó en el hecho de
que éste es un lenguaje de programación de código abierto, es decir, no requiere de la compra de
licencias de uso como en el caso de softwares comerciales como MATLAB ®, por ejemplo. Por otro
lado, Python es un lenguaje versátil y sencillo de aprender, lo cual resulta ideal para quienes se
inician en las ciencias de la computación y la programación; esto permite desarrollar el tipo de
pensamiento lógico necesario para escribir programas para la resolución problemas numéricos,
habilidad que puede ser transferida a cualquier lenguaje de programación.
Existen numerosas bibliotecas2 basadas en Python que ofrecen la posibilidad de programar
desde páginas web o bases de datos hasta rutinas de cálculo para fines científicos. Dependiendo
del proyecto que se esté realizando, se hace la selección de las bibliotecas que conformarán el
programa completo. En este caso, las bibliotecas utilizadas para el programa de prueba y para el
desarrollo de la app son:
1. CoolProp 4.0. Es una biblioteca de código abierto escrita en C++, con wrappers3
disponibles para la mayor parte de los lenguajes de programación y plataformas de interés
técnico. Ofrece las ecuaciones de estado de fluidos puros y pseudo-puros, así como las
propiedades de transporte de 122 componentes, entre ellos el aire húmedo y el agua.
2. Numpy. Es el paquete fundamental para la computación científica. Contiene objetos para
el manejo de matrices N-dimensionales, herramientas para integración con C/C++ y
2 En informática, una biblioteca (en inglés library) es un conjunto de implementaciones funcionales o subrutinas codificadas en un lenguaje de programación, que sirven para ser utilizadas como complemento de un programa principal o un conjunto de éstos.
3 Un wrapper (palabra importada del inglés) es un tipo de adaptador utilizado en informática para transformar una interfaz en otra; por ejemplo, CoolProp 4.0, escrito en C++, tiene wrappers para Python, Java y MATLAB, entre otros.
23
Fortran, funciones de álgebra lineal, Transformada de Fourier, entre muchas otras
características.
3. Scipy. Esta biblioteca de código abierto basada en Python contiene métodos y funciones
para matemáticas, ciencia e ingeniería. Entre estas funciones está interp1d, la cual se
utilizará en el programa para hacer interpolaciones lineales en las tablas de propiedades
termofísicas.
4. Kivy. Es una biblioteca de código abierto basada en Python, útil para el desarrollo de
aplicaciones que requieren el uso de interfaces innovadoras, tales como apps multi-touch.
El código escrito en Kivy funciona en sistemas Linux, Windows, OS X, Android e iOS.
5. Matplotlib. Esta biblioteca contiene funciones para crear gráficos 2D para una gran
variedad de ambientes interactivos y plataformas. Permite generar histogramas, gráficas
de barras, diagramas de dispersión, entre otros, y tiene una interfaz similar a MATLAB®.
Por otra parte, en Python hay módulos precargados que sirven como herramienta para
realizar ciertas tareas específicas. Éstos son archivos con extensión .py que contienen definiciones
y declaraciones que pueden ser importados por scripts o programas principales. En el programa
aquí desarrollado, los módulos utilizados son:
1. csv. Este módulo define funciones para interactuar con archivos de extensión .csv4;
contiene clases para leer y escribir información tabular en formato CSV. Se utilizará para
obtener información proveniente de tablas una vez proporcionadas las especificaciones
por parte del usuario.
2. string. Este módulo que contiene constantes y clases, así como métodos para manipular
objetos del tipo string.
Una de las herramientas más rescatables encontradas como producto del trabajo de
investigación previo al desarrollo de la app es la biblioteca CoolProp, que se mencionó
anteriormente. La sintaxis para usar CoolProp dentro de un script o directamente en la consola es
muy sencilla.
El primer paso es importar la biblioteca:
In[1]: from CoolProp.CoolProp import PropsSI
Posteriormente, si se quiere calcular la temperatura de saturación del agua a 1 atm en K,
por ejemplo, se escribe:
In[2]: PropsSI(‘T’, ‘P’, 101325, ‘Q’, 0, ‘Water’)
a lo que la consola daría como resultado:
Out[2]: 373.1242958476844
4 CSV (comma separated values) es el formato más común para importar y exportar información en bases de datos y hojas de cálculo.
24
Como segundo ejemplo, si se quiere calcular la densidad del nitrógeno a 298 K y 101 325 Pa,
el código sería:
rho = PropsSI(‘D’, ‘T’, 298.15, ‘P’, 101325, ‘Nitrogen’)
Información más detallada sobre la utilización de CoolProp, así como sobre toda la gama de
funciones, ecuaciones de estado y correlaciones para el cálculo de propiedades de fluidos que
están contenidas en esta biblioteca puede ser consultada en http://www.coolprop.org/.
CoolProp se incorporará dentro del programa principal para proporcionar las propiedades
termofísicas de los siguientes fluidos:
1. Agua
2. Aire
3. R123
4. R134a
5. R404A
6. R407C
7. R410A
8. R507C
Es importante mencionar que el intervalo de presiones disponible para cualquiera de los
fluidos considerados es de 611.655 Pa a 2.2064 x107 Pa. Si las condiciones especificadas en el
programa quedan fuera de este intervalo, se corre el riesgo de que el programa termine
abruptamente.
Por otro lado, la información de las especificaciones de la tubería y del material aislante se
presenta en forma de tablas. Para las dimensiones de la tubería se utiliza la siguiente:
Tabla 2. Espesor de la pared y diámetro exterior para distintos diámetros nominales y números de cédula
NPS [in]
OD [in]
Cédula
40 60 80 160
1/8 0.405 0.068 - 0.095 -
1/4 0.54 0.088 - 0.119 -
3/8 0.675 0.091 - 0.126 -
1/2 0.84 0.109 - 0.147 0.187
3/4 1.05 0.113 - 0.154 0.219
1 1.315 0.133 - 0.179 0.25
1 1/4 1.66 0.14 - 0.191 0.25
1 1/2 1.9 0.145 - 0.2 0.281
2 2.375 0.154 - 0.218 0.344
2 1/2 2.875 0.203 - 0.276 0.375
3 3.5 0.216 - 0.3 0.438
3 1/2 4 0.226 - 0.318 -
4 4.5 0.237 - 0.337 0.531
5 5.563 0.258 - 0.375 0.625
6 6.625 0.28 - 0.432 0.719
8 8.625 0.322 0.406 0.5 0.906
10 10.75 0.365 0.5 0.594 1.125
25
Usualmente, los tubos comerciales son identificados por un diámetro nominal en pulgadas
que es muy cercano a sus dimensiones reales. Sin embargo, para hacer cálculos es necesario
conocer con exactitud las dimensiones del tubo; por ejemplo, un tubo de ¼” tendría un diámetro
exterior real de 0.84 pulgadas. Otra especificación es el número de cédula de la tubería (schedule,
en inglés), el cual indica el espesor de la pared de la tubería. Para un determinado diámetro
nominal, el número de cédula aumenta o disminuye en función del espesor de la pared, mientras
que el diámetro exterior no cambia.
La primera columna de la tabla es una lista de los diámetros nominales considerados,
mientras que la segunda indica el diámetro exterior correspondiente; los rótulos NPS y OD son las
iniciales en inglés de Nominal Pipe Size y Outside Diameter, respectivamente. Las tres columnas
restantes indican el espesor en pulgadas correspondiente a cada número de cédula, en función del
diámetro nominal.
La función implementada en Python para obtener información de esta tabla
proporcionando el diámetro nominal y el número de cédula es la siguiente:
def getPipeSize(schedule,NPS): """ Devuelve un diccionario con Di, Do y x del tubo en [m] ------------------------------------------------------ Parametros: schedule = No.de cedula / type: string NPS = 'Nominal Pipe Size' [in] / type: string """ file_name = '/home/directorio/npsizes.csv' with open(file_name) as csv_file: reader = DictReader(csv_file) try: for row in reader: if row['NPS'] == NPS: x = float(row[schedule]) OD = float(row['OD']) break conv_factor=0.0254 #Conversion de [in] a [m] D0 = round(OD*conv_factor,8) D1 = round((OD-x*2)*conv_factor,8) Dw = (D0+D1)/2. dimensions = {'D0':D0,'D1':D1,'x':x,'Dw':Dw} except: raise ValueError('Especificaciones no disponibles para tuberia.') return dimensions
De manera similar, para las propiedades de los materiales de las tuberías metálicas
consideradas se tomó información de tablas de la literatura, mientras que el algoritmo para
26
obtener el valor numérico de la conductividad térmica es parecido al anterior. Los materiales
considerados son:
Acero simple al carbono
Acero AISI 1010
Acero al Carbono-Silicio
Acero al Carbono-Silicio-Magnesio
Acero Inoxidable AISI 302
Acero Inoxidable AISI 304
Acero Inoxidable AISI 316
Acero Inoxidable AISI 347
Por otro lado, para el aislamiento térmico se tomó información de una hoja técnica de un
proveedor de estos productos. En este caso, se trata de colchas pespunteadas industriales
(mantas) a malla metálica. Son colchas flexibles, ligeramente resinadas y pespunteadas a una cara
con malla hexagonal galvanizada de 25 mm (1”), utilizando alambre de acero galvanizado. Para
este producto existen cuatro tipos estándar en cuatro densidades de fabricación: 70, 80, 100 y 128
kg/cm3. Los cuatro tipos de designan como Colcha Pespunteada Industrial (CPI) tipos 160, 164, 159
y 168, respectivamente. Estas colchas son especialmente útiles en aplicaciones sobre aceros
inoxidables, debido a su bajo contenido de cloruros solubles.
Independientemente del tipo, los espesores disponibles (en mm) para estas colchas son: 30,
40, 50, 60, 75, 90, 100, 110 y 120. Además, según el proveedor, se tienen los siguientes valores
para la conductividad térmica (W/m ∙ K):
Tabla 3. Conductividad térmica del material aislante
T. media (°C) Tipo 160 Tipo 164 Tipo 159 Tipo 168
50 0.039 0.04 0.04 0.041
100 0.046 0.045 0.044 0.044
150 0.055 0.053 0.051 0.05
200 0.065 0.063 0.059 0.057
250 0.076 0.075 0.069 0.066
300 0.091 0.089 0.082 0.077
350 0.108 0.106 0.097 0.089
Para el cálculo de la conductividad térmica del material aislante, se implementó la función
interp1d de la biblioteca Scipy. El código para utilizar esta herramienta es el siguiente:
def k_aislante(T,material): """ Devuelve k en [W/m*K] / type: float --------------------------- Parametros: T = [C] / type: float o int material:‘Tipo160’,‘Tipo164’,‘Tipo159’,‘Tipo168’ / type: string """
27
data = np.genfromtxt("/home/directorio/k_aislante.txt", delimiter = "\t", names = True, missing_values = "INFINITE", filling_values = np.inf) k_interp = interp1d(data['Tmedia'], data[material]) if T>350: T = 350 elif T<50: T = 50 k = float(k_interp(T)) return k
En el Anexo I se presenta el código completo de la implementación del algoritmo en Python,
incluyendo, además de las definiciones anteriores, otras funciones y clases creadas para hacer más
fácil la escritura del programa.
Dada la gran cantidad de parámetros que es posible variar para obtener un resultado final,
se proponen algunos casos para observar la variación de la cantidad de energía térmica en función
del espesor del aislamiento térmico. Para ello se generan curvas de ��/𝐿 vs 𝑥 para diferentes
valores de algún parámetro seleccionado.
Caso 1
Para este caso se observa la variación de la cantidad de energía térmica perdida por unidad
de longitud de tubería en función del espesor del aislamiento para los cuatro tipos considerados.
Tabla 4. Datos y especificaciones para el Caso 1
Fluido interno Aire del medio ambiente
Sustancia Agua Presión (atm) 1
Presión (bar) 50 Temperatura (°C) 25
Calidad (%) 80 Velocidad del viento (m/s)
8.5
Velocidad (m/s) 16
Tubería Aislamiento térmico
Diámetro nominal (in) 1 ½ Material variable
Cédula 40
Material Acero al carbono silicio
El primer valor de ��/𝐿, correspondiente a una tubería sin aislamiento, no se representa en
la gráfica debido a que es muy alto en comparación con los demás valores. Este valor es de ��/𝐿 =
2014.48 W/m para un espesor de la capa de aislamiento de 𝑥 = 0 m. Puede observarse en la
gráfica que para este caso se obtuvieron resultados consistentes, ya que la pérdida de calor fue
disminuyendo conforme aumentaba el espesor de la capa de aislamiento térmico. Además, de los
materiales aislantes considerados, se puede ver que el producto más efectivo para aislar
térmicamente la tubería fue el denominado “Tipo 160”, mientras que el menos efectivo fue el
28
“Tipo 168”. En este caso, los productos “Tipo 164” y “Tipo 159” tuvieron valores tan similares que
en la gráfica aparecen traslapados.
Figura 4. Pérdida de energía térmica para el Caso 1
Caso 2
Para este caso se observa la variación de la cantidad de energía térmica perdida por unidad
de longitud de tubería en función del espesor del aislamiento para distintos valores de velocidad
del viento.
Fluido interno Aire del medio ambiente
Sustancia Agua Presión (atm) 1
Presión (bar) 7 Temperatura (°C) 20
Calidad (%) 100 Velocidad del viento (m/s)
2, 3.5, 4.5, 6, 10
Velocidad (m/s) 8
Tubería Aislamiento térmico
Diámetro nominal (in) 1 Material Tipo 160
Cédula 80
Material Acero al carbono silicio
29
Figura 5. Pérdida de energía térmica respecto al espesor de aislamiento para diferentes velocidades del viento.
Figura 6. Pérdida de energía térmica respecto al espesor de aislamiento para diferentes velocidades del viento.
30
Para una tubería sin aislamiento térmico, la pérdida de energía térmica es diferente
dependiendo del valor de la velocidad del viento; sin embargo, una vez que se añade una capa de
aislamiento térmico, la energía térmica perdida por la tubería es casi igual independientemente de
la velocidad del viento considerada.
6. Desarrollo de la interfaz gráfica y compilación
Una de las partes más importantes en el desarrollo de una app es el diseño de la interfaz
gráfica, ya que ésta es el medio para interactuar con el usuario y para obtener los parámetros de
entrada que permitirán efectuar los cálculos del algoritmo implementado. Sólo por mencionarlo,
se hace la observación de que esta parte del proyecto fue la que más tiempo demandó, ya que se
requirió de una lectura exhaustiva de la documentación y guías de usuario de las bibliotecas
utilizadas.
No se pretende presentar a detalle el funcionamiento de cada uno de los componentes que
integran la app; sin embargo, se explicará de manera general en qué consiste la biblioteca Kivy y
algunas de las funciones utilizadas.
Kivy es una biblioteca de código abierto escrita en Python y corre en sistemas Linux,
Windows, OS X, Android y iOS. Está registrada bajo una licencia MIT y es totalmente gratuita, lo
cual la hace bastante atractiva para utilizarse en productos comerciales. El marco de trabajo es
estable y está bien documentado, además de que existe una guía de programación escrita por sus
desarrolladores para ayudar tanto a programadores amateurs, como a programadores avanzados
y desarrolladores.
Widgets
Los widgets son el elemento principal para que una app funcione. Se trata de elementos
gráficos con una determinada apariencia y comportamiento que pueden combinarse o modificarse
de acuerdo a las necesidades de diseño. Los widgets utilizados para el desarrollo de esta app
fueron:
ScrollView
Spinner
Label
Button
GridLayout
BoxLayout
Popup
TextInput
CheckBox
GridLayout y BoxLayout funcionan como contenedores de los widgets añadidos en su
interior, ajustando el tamaño, orden y posición de los mismos. El widget ScrollView se seleccionó
31
pensando en la interacción a través de una pantalla táctil de un celular, ya que esta herramienta
permite deslizar la ventana cuando ésta no cabe completamente en la pantalla de un dispositivo.
La documentación completa sobre los widgets y otras funcionalidades de la biblioteca Kivy
pueden ser encontradas en la página web https://kivy.org/docs/api-kivy.html.
Diseño con el lenguaje Kivy
El lenguaje Kivy fue creado con el propósito de separar la parte de la presentación y la lógica
del comportamiento de los widgets al momento de diseñar una aplicación. Este lenguaje tiene una
sintaxis diferente a Python y sirve para especificar aspectos como el tamaño, posición, alineación y
colores de cada uno de los widgets que integran la app. De esta forma, la presentación es definida
mediante un archivo con extensión .kv, mientras que la lógica (comportamiento) es definida
mediante un archivo .py.
Como ejemplo5, se presenta a continuación el código para un controlador que cambia el
texto de una etiqueta (Label) después de presionar un botón (Button).
import kivy
kivy.require('1.0.5')
from kivy.uix.floatlayout import FloatLayout
from kivy.app import App
from kivy.properties import ObjectProperty, StringProperty
class Controller(FloatLayout):
'''Crea un controlador que recibe un widget personalizado del
archivo en lenguaje kv.
Añade una accion que será llamada del archivo kv.
'''
label_wid = ObjectProperty()
info = StringProperty()
def hacer_algo(self):
self.label_wid.text = 'Mi etiqueta despues de presionar el
boton'
self.info = 'Nuevo texto de info'
class ControllerApp(App):
def build(self):
return Controller(info='Hola mundo')
if __name__ == '__main__':
ControllerApp().run()
5 Ejemplo tomado de la documentación de la biblioteca Kivy.
32
Este código debe guardarse en un archivo llamado main.py para que al correrlo llame
automáticamente a otro archivo llamado controller.kv. Este último debe nombrarse
necesariamente así puesto que el programa busca automáticamente el nombre escrito en la clase
ControllerApp.
Por otra parte, el código contenido en el archivo controller.kv es el siguiente:
#:kivy 1.0
<Controller>:
label_wid: mi_etiqueta_personalizada
BoxLayout:
orientation: 'vertical'
padding: 20
Button:
text: 'info del controlador es: ' + root.info
on_press: root.hacer_algo()
Label:
id: mi_etiqueta_personalizada
text: 'Mi etiqueta antes de presionar el boton'
En este ejemplo ocurren tres eventos importantes:
1. Se utiliza información proporcionada por la clase Controller. Cuando la propiedad info
es cambiada por Controller, el texto 'My controller info is: ' + root.info
será automáticamente re-evaluado, cambiando el texto del botón.
2. Proporcionar información al Controller. La expresión id:
mi_etiqueta_personalizada asigna a la nueva etiqueta creada el id de
mi_etiqueta_personalizada. Luego, usar mi_etiqueta_personalizada en
la expresión label_wid: mi_etiqueta_personalizada da la instancia de esa
etiqueta al controlador.
3. Se crea una llamada personalizada en el botón utilizando el método on_press del
controlador.
De manera similar, el código para controlar el comportamiento de los widgets que
integrarían esta app se escribió dentro de un archivo principal llamado main.py, el cual tiene una
clase denominada “HeatLossApp” que contiene a su vez el conjunto de widgets que conforman la
interfaz completa. Kivy busca automáticamente el archivo con extensión .kv con el mismo nombre
de esta clase, por lo que en este caso el archivo heatloss.kv es el que contiene el código para la
representación gráfica de los widgets.
En adición a estos dos archivos, el código con el algoritmo de cálculo se escribió en un
archivo (módulo) llamado heatlossroutine.py, el cual contiene funciones para extraer y almacenar
los datos de entrada del usuario, así como una función principal llamada computeQL() utilizada
33
para realizar los cálculos. El archivo main.py importa las funciones de este módulo y las integra a la
lógica del comportamiento de la app.
De manera adicional, la app ofrece la opción de usar diferentes unidades de medición para
ingresar la información, por lo que se escribió también un módulo llamado convert.py con
funciones para convertir a unidades del Sistema Internacional los parámetros introducidos por el
usuario.
El código completo de cada uno de los módulos y archivos que integran la app se presenta
en el Anexo II. La mayoría de las funciones y clases creadas está documentada dentro del mismo
código, es decir, cada función tiene una explicación acerca de su propósito, el tipo de información
que debe recibir y el tipo de información que arroja. Por otro lado, las tablas presentadas en el
capítulo 5 se escribieron en los archivos k_aislante.txt, npsizes.csv y propiedades_materiales.csv.
Compilación
De acuerdo con los desarrolladores de la biblioteca Kivy, existen varias formas para compilar
una aplicación que pueda utilizarse en la mayor parte de los dispositivos Android. Entre estas
opciones están los proyectos Buildozer y python-for-android. El primero es más recomendable
para nuevos usuarios, ya que las opciones de configuración son sencillas y permite la compilación
en tan sólo unos cuantos pasos.
Es muy importante mencionar que para poder utilizar estas herramientas de compilación es
indispensable usar Linux como sistema operativo ya que, aunque las aplicaciones creadas en Kivy
pueden funcionar en los demás sistemas operativos, su compilación está disponible únicamente
para sistemas Linux.
Para realizar la compilación de la app, se seleccionó el Buildozer por conveniencia. Esta
herramienta funciona para Python 2.7 y para Python 3.3 o versiones posteriores a ésta. Para
instalar el proyecto buildozer es necesario correr el siguiente comando en la terminal de Linux:
@ pip install --upgrade buildozer
Para compilar la aplicación para Android se utilizó la distribución de Linux Ubuntu 16.04
(64bit). Para este sistema operativo, los comandos que se tienen que correr en la terminal son los
siguientes:
@ sudo pip install --upgrade cython==0.21
@ sudo dpkg --add-architecture i386
@ sudo apt-get update
@ sudo apt-get install build-essential ccache git libncurses5:i386
libstdc++6:i386 libgtk2.0-0:i386 libpangox-1.0-0:i386 libpangoxft-1.0-
0:i386 libidn11:i386 python2.7 python2.7-dev openjdk-8-jdk unzip zlib1g-dev zlib1g:i386
34
Una vez instalado buildozer, es necesario crear un archivo llamado buildozer.spec, el cual
contiene las instrucciones para compilar la aplicación. Para crear este archivo hay que correr el
siguiente comando en la terminal:
@ buildozer init
Una vez creado este archivo, hay que editarlo con las especificaciones de la aplicación,
añadiendo un título, un dominio y una versión, entre otras.
Para iniciar el proceso de compilación, se corre el siguiente comando:
@ buildozer -v android debug
Finalmente, se genera un archivo APK ubicado en el directorio /bin de la ubicación en la que
vive el archivo main.py.
Después de esto, es necesario conectar el teléfono inteligente en el que se quiera instalar la
aplicación a la computadora mediante un cable USB y se debe permitir el modo debugging del
mismo para que se pueda realizar correctamente la instalación. Una vez conectado, el último paso
es instalar la aplicación en el teléfono. Para ello, hay que ejecutar el siguiente comando:
@ buildozer android deploy run logcat
El proceso completo de compilación más instalación en el teléfono puede durar entre
aproximadamente 15 minutos hasta 1 hora, dependiendo de la velocidad de procesamiento de la
computadora utilizada.
Una vez instalada, la aplicación tiene una apariencia como la siguiente:
35
Ilustración 1. Aspecto visual de la app
Ilustración 2. Aspecto visual de la app (extensión)
36
A pesar de que la apariencia final de la aplicación es sencilla, resulta bastante funcional
puesto que presenta una interfaz amigable en la que solamente es necesario presionar los
botones para desplegar las opciones disponibles y sólo hay que ingresar los datos numéricos en las
entradas correspondientes. Para realizar el cálculo final sólo hay que presionar el botón “Calcular
pérdida de calor” y el archivo main.py llamará a una función llamada computeQL() para llevar a
cabo los cálculos.
Para los casos en que las especificaciones estén fuera del intervalo disponible, la aplicación
desplegará una ventana emergente (popup) con un mensaje que indique que ocurrió un error y
que pida al usuario intentar nuevamente el cálculo.
Ilustración 3. Mensaje de error en pantalla
37
Para los demás casos, el popup mostrará simplemente el resultado. Tomando como ejemplo
el Caso 1 presentado en la sección 5, el resultado para una tubería sin aislamiento térmico es:
Ilustración 4. Popup mostrando un resultado
38
7. Resultados y conclusiones
Como se vio en el análisis de corridas de los casos planteados, los resultados que devuelve
el programa son consistentes con lo esperado, es decir, para el caso de vapor de agua a
temperaturas mayores a la del medio ambiente, se observó que la cantidad de calor perdido
desde la tubería iba disminuyendo conforme se aumentaba la capa de aislamiento.
Por otro lado, desde el inicio de este informe se hizo hincapié en el hecho de que los
resultados obtenidos mediante los cálculos llevados a cabo por el algoritmo propuesto son tan
sólo una aproximación de la cantidad de energía térmica que realmente se pierde en alguna
determinada tubería a determinadas condiciones físicas. Como se vio a lo largo del planteamiento
del problema y de la exposición de fundamentos teóricos, se hicieron muchas suposiciones que
simplifican el análisis del comportamiento real del sistema en aras de facilitar el desarrollo de una
solución que permitiera la implementación de un algoritmo sencillo.
No obstante, puede afirmarse que este proyecto cumplió con el objetivo de crear una
aplicación que satisficiera los fines para los que fue concebida, puesto que el algoritmo y el código
desarrollados sientan las bases para la construcción de una app más compleja y con más
funcionalidades. El aspecto visual puede ser mejorado mediante la inclusión de widgets
adicionales, y con una configuración más detallada para generar colores y comportamientos más
llamativos que aprovechen las características de los teléfonos inteligentes.
Como lección aprendida de este proyecto, el autor aconseja que, si el propósito es
desarrollar un software o app más compleja, es pertinente trabajar en conjunto con un
programador experimentado con conocimientos del sistema operativo para el que se quiera
construir la aplicación. De esta forma, el ingeniero/investigador puede centrarse más en el
desarrollo del modelo físico y de los algoritmos para resolver tal modelo.
El siguiente paso para continuar con el desarrollo de esta herramienta es mejorar su
aspecto y, una vez hecho esto, buscar su distribución en alguna de las tiendas virtuales de
aplicaciones para teléfonos móviles. Para el caso de esta app para sistemas Android, es necesario
gestionar una licencia de software libre (como la licencia MIT, por ejemplo) para poder distribuirla
en la Play Store, la cual es la tienda virtual de aplicaciones Android. Si lo que se busca es distribuir
la aplicación con fines lucrativos, existen varias alternativas para esto, como incluir publicidad
dentro de la misma o buscar la adquisición de una licencia comercial.
Finalmente, se espera que el código fuente completo incluido en los anexos sirva de
orientación para alumnos y personas que tengan interés en conocer la manera en que se puede
comenzar a desarrollar aplicaciones desde cero con tan sólo una computadora, mucha paciencia y
muchas ganas de aprender del apasionante mundo de la programación.
39
8. Bibliografía
Bell, I. H., Wronski, J., Quoilin, S., & Lemort, V. (2014). Pure and Pseudo-pure Fluid Thermophysical
Property Evaluation and the Open-Source Thermophysical Property Library CoolProp.
Industrial & Engineering Chemistry Research, 53(6), 2498-2508. doi:10.1021/ie4033999
Bird, R. B., Stewart, W. E., & Lightfoot, E. N. (2006). Fenómenos de transporte (Segunda ed.).
México, D.F.: Limusa Wiley.
Cengel, Y. A., & Ghajar, A. J. (2011). Transferencia de calor y masa (Primera ed.). México, D.F.:
McGraw Hill.
Chapra, S. C., & Canale, R. P. (2015). Métodos numéricos para ingenieros (Séptima ed.). México,
D.F.: McGraw Hill Interamericana.
Danckaert, J. (1969). L'Isolation thermique industrielle. Paris: Eyrolles.
Guttag, J. V. (2013). Introduction to computation and programming using Python. Cambridge,
Massachusetts: MIT Press.
Kern, D. Q. (1950). Process Heat Transfer (Primera ed.). New York: McGraw Hill.
McAdams, W. H. (1954). Heat Transmission (Primera ed.). New York: McGraw Hill.
Python 2.7.13 documentation. (10 de septiembre de 2016). Recuperado el 25 de noviembre de
2016, de Docs.python.org: https://docs.python.org/2/
The Kivy Developer Team. (2016). Kivy Documentation. Obtenido de www.kivy.org:
https://media.readthedocs.org/pdf/kivy/latest/kivy.pdf
Welcome to CoolProp — CoolProp 6.1.0 documentation. (2017). Obtenido de Coolprop.org:
http://www.coolprop.org/
Welty, J. R. (2008). Fundamentals of momentum, heat, and mass transfer (Primera ed.). Hoboken,
N.J.: Wiley.
40
Anexo I. Desarrollo de la solución aproximada al modelo de
transferencia de calor
Como se explicó en el planteamiento del problema, la solución analítica para determinar la
pérdida de energía por unidad de longitud es de la forma
��
𝐿=
2𝜋(𝑇𝑖 − 𝑇∞)
1𝑟0ℎ𝑖
+1
𝑘0,1ln (
𝑟1𝑟0
) +1
𝑘1,2ln (
𝑟2𝑟1
) +1
𝑟2ℎ∞
donde:
𝑇𝑖 es la temperatura media del fluido interno, en [K]
𝑇∞ es la temperatura media del aire del medio ambiente, en [K]
ℎ𝑖 es el coeficiente convectivo del fluido interno, con unidades [W/m2 ∙ K]
ℎ∞ es el coeficiente convectivo del aire del medio ambiente, con unidades [W/m2 ∙ K]
𝑘0,1 es la conductividad térmica del tubo metálico, con unidades [W/m ∙ K]
𝑘1,2 es la conductividad térmica del material aislante, con unidades [W/m ∙ K]
𝑟0 es el radio interno de la tubería, en [m]
𝑟1 es el radio externo de la tubería, en [m]
𝑟2 es el radio correspondiente a la pared externa de la capa de aislamiento, en [m]
Para llegar a la expresión alternativa que sustituye los logaritmos naturales por los radios
medios logarítmicos, el primer paso es definir el concepto de radio medio logarítmico. Éste deriva
del concepto de media logarítmica de diferencia de temperaturas (LMTD, por sus iniciales en
inglés), el cual es ampliamente usado en el diseño termohidráulico de intercambiadores de calor, y
es igual al promedio logarítmico de la diferencia de temperaturas entre el fluido frío y el fluido
caliente, a la entrada y a la salida del intercambiador de calor. Esta definición es:
∆𝑇ln =𝑑𝑡ℎ − 𝑑𝑡𝑐
ln (𝑑𝑡ℎ𝑑𝑡𝑐
)
donde 𝑑𝑡ℎ y 𝑑𝑡𝑐 son las diferencias de temperaturas entre el fluido caliente y el fluido frío
en el lado caliente y en lado frío del intercambiador de calor, respectivamente.
La fórmula anterior se puede extrapolar para cualquier parámetro o propiedad, por lo que,
de manera general, se puede definir la media logarítmica de 𝑥 como:
𝑥𝑖,𝑗 =𝑥𝑗 − 𝑥𝑖
ln (𝑥𝑗
𝑥𝑖)
41
Si sustituimos 𝑥 por el radio de los cilindros, se tiene que
𝑟0,1 =𝑟1 − 𝑟0
ln (𝑟1𝑟0
)
donde 𝑟0,1 es el radio medio logarítmico correspondiente a la pared de la tubería.
Despejando el logaritmo y reconociendo que 𝑟1 − 𝑟0 es igual al espesor 𝑥𝑤 de la pared, se tiene
ln (𝑟1
𝑟0) =
𝑥𝑤
𝑟0,1
De igual manera, se tiene que
𝑟1,2 =𝑟2 − 𝑟1
ln (𝑟2𝑟1
)
donde 𝑟1,2 es el radio medio logarítmico correspondiente a la capa de aislamiento.
Despejando el logaritmo y reconociendo que 𝑟2 − 𝑟1 es igual al espesor 𝑥 de la capa de
aislamiento, se tiene
ln (𝑟2
𝑟1) =
𝑥
𝑟1,2
Los radios 𝑟0,1 y 𝑟1,2 siguen representado una solución analítica, por lo que es necesario
sustituirlos por una aproximación conveniente de la media logarítmica. Por sencillez, se opta por
utilizar la media aritmética:
𝑟𝑖,𝑗 =𝑟𝑗 − 𝑟𝑖
ln (𝑟𝑗
𝑟𝑖)
≈𝑟𝑖 + 𝑟𝑗
2
Se define entonces
𝑟𝑤 =𝑟0 + 𝑟1
2
𝑟𝑚 =𝑟1 + 𝑟2
2
Volviendo a la ecuación inicial y sustituyendo los logaritmos, se tiene entonces
��
𝐿=
(𝑇𝑖 − 𝑇∞)
12𝜋 [
1𝑟0ℎ𝑖
+1
𝑘0,1
𝑥𝑤𝑟𝑤
+1
𝑘1,2
𝑥𝑟𝑚
+1
𝑟2ℎ∞]
��
𝐿=
𝑇𝑖 − 𝑇∞
1(𝜋𝐷0)ℎ𝑖
+𝑥𝑤
𝑘0,1(𝜋𝐷𝑤)+
𝑥𝑘1,2(𝜋𝐷𝑚)
+1
(𝜋𝐷2)ℎ∞
donde 𝐷𝑤 = (𝐷0 + 𝐷1)/2 y 𝐷𝑚 = (𝐷1 + 𝐷2)/2 son los diámetros medios de la tubería y de
la capa de aislamiento térmico.
42
Anexo II. Código completo
Archivo main.py from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.core.window import Window
from kivy.properties import ObjectProperty
from kivy.uix.label import Label
from kivy.uix.popup import Popup
from convert import convertToSIunits
from string import lower, replace, join, split
from heatlossroutine import fluido, computeQL, getPipeSize,
getPipeProperties
class MainLayout(GridLayout):
prop1_box = ObjectProperty()
prop1_name = ObjectProperty()
prop1_value = ObjectProperty()
prop1_units = ObjectProperty()
prop1_lbl = Label(size_hint_y=None, height=40)
result_popup = Popup(title='Resultado final',
size_hint=(None, None), size=(300, 300))
label_result = Label(color=[.36, .7, .57, 1.],
text_size=[220,None],
halign='center',
valign='middle')
def trigger_popup(self):
self.label_result.text = text=self.trigger_text
self.result_popup.content = self.label_result
self.result_popup.open()
# FLUIDO INTERNO: PROPIEDADES Y UNIDADES
def prop1_spinn(self):
if self.prop1_name.text == 'Temperatura':
self.prop1_units.text = 'C'
elif self.prop1_name.text == 'Presion':
self.prop1_units.text = 'bar'
def select_fluid_prop1_units(self):
if self.prop1_name.text == 'Presion':
self.prop1_units.values = ['bar', 'kPa', 'atm']
elif self.prop1_lbl.text == 'Presion':
self.prop1_units.values = ['bar', 'kPa', 'atm']
elif self.prop1_name.text == 'Temperatura':
self.prop1_units.values = ['K', 'C', 'F']
def select_fluid_prop2_units(self):
if self.ids.prop2_name.text == 'Calidad':
self.ids.prop2_units.values = ['%', 'adim']
elif self.ids.prop2_name.text == 'Temperatura':
self.ids.prop2_units.values = ['K', 'C', 'F']
43
def vel_or_m(self):
if self.ids.vel_spinn.text == 'Velocidad':
self.ids.vel_units.text = 'm/s'
elif self.ids.vel_spinn.text == 'Flujo masico':
self.ids.vel_units.text = 'kg/s'
def select_fluid_vel_units(self):
if self.ids.vel_spinn.text == 'Velocidad':
self.ids.vel_units.values = ['m/s', 'ft/s']
elif self.ids.vel_spinn.text == 'Flujo masico':
self.ids.vel_units.values = ['kg/s', 'kg/h']
def select_NPS(self):
if self.ids.pipe_schedule.text == '60':
self.ids.NPS.values = ['8','10']
elif self.ids.pipe_schedule.text == '160':
self.ids.NPS.values = ['1/2', '3/4', '1 1/4', '1 1/2', '2',
'2 1/2', '3', '5', '6', '8','10']
else:
self.ids.NPS.values = ['1/8', '1/4', '3/8', '1/2', '3/4', '1
1/4','1 1/2', '2', '2 1/2', '3', '3 1/2', '4','5', '6', '8','10']
def on_check_fluid_satr_state(self):
#Si se van a calcular las propiedades en región de saturacion
if self.ids.satr_checkbox.active:
print('The checkbox is active.')
self.prop1_lbl.text = ''
self.prop1_name.text = 'Presion'
self.prop1_box.remove_widget(self.prop1_units)
self.prop1_box.remove_widget(self.prop1_value)
self.prop1_box.remove_widget(self.prop1_lbl)
self.prop1_box.add_widget(self.prop1_name)
self.prop1_box.add_widget(self.prop1_value)
self.prop1_box.add_widget(self.prop1_units)
self.ids.prop2_name.text = 'Calidad'
self.ids.prop2_units.text = '%'
#Si las propiedades se calculan en liquido subenfriado o vapor
sbrcl
else:
print('The checkbox is inactive.')
self.prop1_lbl.text = 'Presion'
self.prop1_box.remove_widget(self.prop1_units)
self.prop1_box.remove_widget(self.prop1_value)
self.prop1_box.remove_widget(self.prop1_name)
self.prop1_box.add_widget(self.prop1_lbl)
self.prop1_box.add_widget(self.prop1_value)
self.prop1_box.add_widget(self.prop1_units)
self.prop1_units.text = 'bar'
self.ids.prop2_name.text = 'Temperatura'
self.ids.prop2_units.text = 'C'
def get_fint_data(self):
#Nombre del fluido interno
if self.ids.fluid_name.text == 'Agua/Vapor':
fluid_name = 'water'
44
else:
fluid_name = self.ids.fluid_name.text
print 'Fluido interno: ', fluid_name
#Estado termodinamico del fluido interno
if self.ids.satr_checkbox.active:
if self.ids.prop1_name.text == 'Temperatura':
prop1 = 'T'
elif self.ids.prop1_name.text == 'Presion':
prop1 = 'P'
prop2 = 'Q'
elif not self.ids.satr_checkbox.active:
prop1 = 'P'
prop2 = 'T'
#Propiedad1
try:
val1 = float(self.ids.prop1_value.text)
except ValueError:
val1 = 0.0
units1 = self.ids.prop1_units.text
print prop1, ' = ', val1, units1
#Convertir val1 a unidades SI
val1 = convertToSIunits(units1,val1)
print prop1, ' = ', val1
#Propiedad2
try:
val2 = float(self.ids.prop2_value.text)
except ValueError:
val2 = 0.0
units2 = self.ids.prop2_units.text
print prop2, ' = ', val2, units2
#Convertir val2 a unidades SI
val2 = convertToSIunits(units2,val2)
print prop2, ' = ', val2
#Velocidad interna o flujo masico
if self.ids.vel_spinn.text == 'Velocidad':
vm = 'V'
elif self.ids.vel_spinn.text == 'Flujo masico':
vm = 'm'
try:
vm_val = float(self.ids.vel_value.text)
except ValueError:
vm_val = 0.0
vm_units = self.ids.vel_units.text
print vm, ' = ', vm_val, vm_units
#Convertir vi a unidades SI
vm_val = convertToSIunits(vm_units,vm_val)
print vm, ' = ', vm_val
fint = fluido(fluid_name, prop1, val1, prop2, val2, vm, vm_val)
print " fint's type is: ", type(fint)
45
return fint
def get_air_data(self):
print 'Aire del medio ambiente'
#Presion
try:
Pinf = convertToSIunits(self.ids.Pair_units.text,
float(self.ids.Pair_value.text))
except ValueError:
Pinf = 0.0
print 'Pinf = ', Pinf, 'Pa'
#Temperatura
try:
Tinf = convertToSIunits(self.ids.Tair_units.text,
float(self.ids.Tair_value.text))
except ValueError:
Tinf = 273.15
print 'Tinf = ', Tinf, 'K'
#Velocidad
try:
vinf = convertToSIunits(self.ids.airVel_units.text,
float(self.ids.airVel_value.text))
except ValueError:
vinf = 0.0
print 'vinf = ', vinf, ' m/s'
aire = fluido('air', 'P', Pinf, 'T', Tinf, 'V', vinf)
return aire
def get_pipe_data(self):
cedula = self.ids.pipe_schedule.text
nps = self.ids.NPS.text
material = replace(lower(self.ids.pipe_material.text),' ','_')
tube = getPipeSize(cedula,nps)
tube.update(getPipeProperties(material))
tube['eps'] = 0.025*0.001
print 'Especs tuberia'
print 'Cedula: ', cedula
print 'NPS: ', nps
print 'Material: ', material
print 'Dw = ', tube['Dw']
return tube
def get_insulation_data(self):
material = replace(self.ids.insl_material.text,' ','')
espesor = self.ids.insl_thickness.text
aisl = {'material':material, 'x':espesor}
print 'Especificaciones aislamiento termico'
print 'material: ', material
print 'espesor: x = ', espesor
return aisl
46
def calcular(self):
fint = self.get_fint_data()
aire = self.get_air_data()
tube = self.get_pipe_data()
aisl = self.get_insulation_data()
x = float(aisl['x'])
#root.trigger_popup()
try:
self.result = round(computeQL(fint,aire,tube,aisl,x),4)
self.trigger_text = ' Q/L = ' + str(self.result) + ' W/m'
print 'RESULTADO FINAL: ' + self.trigger_text
except:
self.trigger_text = 'Error:\nAlgun parametro esta fuera de
rango.\n\nIntente nuevamente. '
print self.trigger_text
return None
return self.result
class HeatLossApp(App):
def build(self):
layout = MainLayout(cols=1, spacing=10, padding=10,
size_hint_y=None)
layout.bind(minimum_height=layout.setter('height'))
root = ScrollView(size_hint=(1,None),
size=(Window.width,Window.height))
root.add_widget(layout)
return root
if __name__ == '__main__':
HeatLossApp().run()
47
Archivo heatloss.kv <txt_inpt@TextInput>:
hint_text: 'Indique el valor.'
size_hint_y: None
height: 40
<HorGrid@GridLayout>:
rows: 1
cols: 3
spacing: 10
padding: 10
size_hint_y: None
height: 40
<MainLayout>:
#Declaracion de ids
prop1_box: prop1_box
prop1_name: prop1_name.__self__
prop1_value: prop1_value.__self__
prop1_units: prop1_units.__self__
Label:
text: 'HeatLossApp'
font_size: 30
size_hint_y: None
height: 40
#Bloque de informacion del fluido interno
GridLayout:
cols: 2
spacing: 10
padding: 10
size_hint_y: None
height: 40
Label:
text: 'Fluido interno'
size_hint_x: 1./3.
size_hint_y: None
height: 40
Spinner:
id: fluid_name
text: 'Agua/Vapor'
values:
'Agua/Vapor','R123','R134a','R404a','R404A','R407C','R410','R507C'
size_hint_x: 2./3
size_hint_y: None
height: 40
#Estado termodinamico
HorGrid:
CheckBox:
id: satr_checkbox
size_hint: None, None
height: 40
active: True
on_press: root.on_check_fluid_satr_state()
Label:
text: 'Region de saturacion'
size_hint_x: None
size_hint_y: None
height: 40
48
valign: 'middle'
halign: 'right'
#Definir propiedad 1
HorGrid:
id: prop1_box
Spinner:
id: prop1_name
text: 'Presion'
values: 'Presion', 'Temperatura'
size_hint_y: None
height: 40
on_press: root.prop1_spinn()
txt_inpt:
id: prop1_value
Spinner:
id: prop1_units
text: 'bar'
size_hint_y: None
height: 40
text_autoupdate: True
on_press: root.select_fluid_prop1_units()
#Definir propiedad 2
HorGrid:
id: prop2_box
Label:
id: prop2_name
text: 'Calidad'
size_hint_y: None
height: 40
txt_inpt:
id: prop2_value
Spinner:
id: prop2_units
text: '%'
size_hint_y: None
height: 40
on_press: root.select_fluid_prop2_units()
#Definir velocidad
HorGrid:
Spinner:
id: vel_spinn
text: 'Velocidad'
size_hint_y: None
height: 40
values: 'Velocidad', 'Flujo masico'
on_press: root.vel_or_m()
txt_inpt:
id: vel_value
Spinner:
id: vel_units
text: 'm/s'
size_hint_y: None
height: 40
on_press: root.select_fluid_vel_units()
#Bloque de propiedades del Aire
Label:
text: 'Aire del medio ambiente'
49
font_size: 20
size_hint_y: None
height: 40
HorGrid:
Label:
text: 'Presion'
size_hint_y: None
height: 40
txt_inpt:
id: Pair_value
Spinner:
id: Pair_units
text: 'atm'
values: 'bar','kPa','atm'
size_hint_y: None
height: 40
HorGrid:
Label:
text: 'Temperatura'
size_hint_y: None
height: 40
txt_inpt:
id: Tair_value
Spinner:
id: Tair_units
text: 'C'
values: 'C','F','K','R'
size_hint_y: None
height: 40
HorGrid:
Label:
text: 'Velocidad'
size_hint_y: None
height: 40
txt_inpt:
id: airVel_value
Spinner:
id: airVel_units
text: 'm/s'
values: 'm/s','ft/s'
size_hint_y: None
height: 40
#Bloque de especificaciones de la tuberia
GridLayout:
cols: 1
spacing: 10
padding: 10
size_hint_y: None
height: 40
Label:
text: 'Tuberia'
size_hint_y: None
height: 40
font_size: 20
GridLayout:
cols: 2
spacing: 10
50
padding: 10
size_hint_y: None
height: 40
Label:
text: 'Cedula'
size_hint_x: 1./3.
size_hint_y: None
height: 40
Spinner:
id: pipe_schedule
text: '40'
values: '40','60','80', '160'
size_hint: 1./3., None
height: 40
GridLayout:
cols: 2
spacing: 10
padding: 10
size_hint_y: None
height: 40
Label:
text: 'Diametro Nominal'
size_hint_x: 1./3.
size_hint_y: None
height: 40
Spinner:
id: NPS
text: '1 1/4'
values: '1/8', '1/4', '3/8', '1/2', '3/4', '1 1/4', '1 1/2',
'2', '2 1/2', '3', '3 1/2', '4', '5', '6', '8','10'
size_hint_x: 1./3.
size_hint_y: None
height: 40
on_press: root.select_NPS()
GridLayout:
cols: 2
spacing: 10
padding: 10
size_hint_y: None
height: 40
Label:
text: 'Material'
size_hint_x: 1./3.
size_hint_y: None
height: 40
Spinner:
id: pipe_material
text: 'Acero simple al carbono'
values: 'Acero simple al carbono', 'Acero AISI 1010','Acero
al carbono silicio', 'Acero al carbono magnesio silicio','Acero
inoxidable AISI 302', 'Acero inoxidable AISI 304', 'Acero inoxidable AISI
316', 'Acero inoxidable AISI 347'
size_hint_x: 1./3.
size_hint_y: None
height: 40
#Bloque de especificaciones del aislamiento termico
Label:
51
text: 'Aislamiento termico'
font_size: 20
size_hint_y: None
height: 40
GridLayout:
cols: 2
spacing: 10
padding: 10
size_hint_y: None
height: 40
Label:
text: 'Material'
size_hint_x: 1./3.
size_hint_y: None
height: 40
Spinner:
id: insl_material
size_hint_x: 2./3.
size_hint_y: None
height: 40
text: 'Tipo 160'
values: 'Tipo 160','Tipo 164','Tipo 159','Tipo 168'
HorGrid:
Label:
text: 'Espesor'
size_hint_y: None
height: 40
Spinner:
id: insl_thickness
size_hint_y: None
height: 40
text: '0'
values: '0','30','40','50','60','75','90','100','110','120'
Label:
id: insl_thickness_unit
text: 'mm'
size_hint_y: None
height: 40
#Boton para recopilar datos y ejecutar calculo de Q/L
GridLayout:
cols: 1
rows: 2
spacing: 10
padding: 10
size_hint_y: None
height: 40
Button:
id: computing_button
text: 'Calcular perdida de calor'
size_hint_y: None
height: 40
on_press: root.calcular(), root.trigger_popup()
Label:
text: 'Programa de prueba'
size_hint_y: None
height: 40
52
Archivo heatlossroutine.py import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
from CoolProp.CoolProp import PropsSI
from string import strip
from csv import DictReader
class fluido(object):
def __init__(self, substancia, Prop1, Val1, Prop2, Val2, vm_name,
vm_val):
"""Crea un objeto con propiedades termofisicas y define el estado
termodinamico del fluido a partir de dos de las siguientes
propiedades:
Presion('P'), Temperatura('T') y/o Calidad('Q'). Unidades SI."""
self.nombre = substancia
Val1,Val2=float(Val1),float(Val2)
try:
self.T = PropsSI('T', Prop1, Val1, Prop2, Val2, self.nombre)
self.P = PropsSI('P', Prop1, Val1, Prop2, Val2, self.nombre)
self.rho = PropsSI('D', Prop1, Val1, Prop2, Val2,
self.nombre)
self.Q = PropsSI('Q', Prop1, Val1, Prop2, Val2, self.nombre)
self.k = PropsSI('L',Prop1, Val1, Prop2, Val2, self.nombre)
self.Cp = PropsSI('C',Prop1, Val1, Prop2, Val2, self.nombre)
self.Pr = PropsSI('Prandtl',Prop1, Val1, Prop2, Val2,
self.nombre)
self.mu = PropsSI('V',Prop1, Val1, Prop2, Val2, self.nombre)
except ValueError:
print 'Datos incorrectos o fuera de rango. Intente
nuevamente.'
self.vm_name = vm_name
self.vm_val = vm_val
def T(self):
"""Devuelve la Temperatura del fluido en [K]"""
return self.T
def P(self):
"""Devuelve la Presion absoluta del fluido en [Pa]"""
return self.P
def rho(self):
"""Devuelve la Densidad del fluido en [kg/m^3]"""
return self.rho
def Q(self):
"""Devuelve la Calidad del fluido [adimensional]"""
return self.Q
def k(self):
"""Devuelve la Conductividad Termica del fluido en [W/kg*K]"""
return self.k
53
def Cp(self):
"""Devuelve el Calor Especifico del fluido en [J/kg*K]"""
return self.Cp
def Pr(self):
"""Devuelve el Numero de Prandtl"""
return self.Pr
def mu(self):
"""Devuelve la Viscosidad dinamica del fluido en [Pa*s]"""
return self.mu
def vm_name(self):
"""Define si se trata de flujo masico ('m') o velocidad ('V')"""
return self.vm_name
def vm_val(self):
"""Da el valor de 'm' o de 'V' en unidades SI"""
return self.vm_val
def __str__(self):
"""Devuelve el nombre de la sustancia"""
return self.nombre
def getPipeSize(schedule,NPS):
"""
Devuelve un 'Dict' con Di, Do y x del tubo en [m]
---------------------------
Parametros:
schedule = No.de cedula / type: string
NPS = 'Nominal Pipe Size' [in] / type: string
"""
file_name = '/npsizes.csv'
with open(file_name) as csv_file:
reader = DictReader(csv_file)
try:
for row in reader:
if row['NPS'] == NPS:
x = float(row[schedule])
OD = float(row['OD'])
break
conv_factor=0.0254 #Conversion de [in] a [m]
D0 = round(OD*conv_factor,8)
D1 = round((OD-x*2)*conv_factor,8)
Dw = (D0+D1)/2.
dimensions = {'D0':D0,'D1':D1,'x':x,'Dw':Dw}
except:
raise ValueError('Especificaciones no disponibles para
tuberia.')
return dimensions
def getPipeProperties(material):
"""
Devuelve un 'Dict' con las propiedades del material de la tuberia:
rho[kg/m3]; Cp[J/kg*K]; k[W/m*K]; alpha*e6[m2/s]
54
------------------------------------
material -> Type: string
------------------------------------
Entradas validas:
* acero_simple_al_carbono
* acero_aisi_1010
* acero_aisi-silicio
* acero_al_carbono_magnesio_silicio
* acero_inoxidable_aisi_302
* acero_inoxidable_aisi_304
* acero_inoxidable_aisi_316
* acero_inoxidable_aisi_347
"""
file_name = '/propiedades_materiales.csv'
with open(file_name) as csv_file:
reader = DictReader(csv_file)
for row in reader:
if row['Material'] == material:
rho = float(row['rho'])
Cp = float(row['Cp'])
k = float(row['k'])
alpha_e6 = float(row['alpha_e6'])
break
properties = {'rho':rho,'Cp':Cp,'k':k,'alpha_e6':alpha_e6}
return properties
def k_aislante(T,material):
"""
Devuelve k en [W/m*K] / type: float
---------------------------
Parametros:
T = [C] / type: float o int
material: Tipo160,Tipo164,Tipo159,Tipo168 / type: string
"""
data = np.genfromtxt("/k_aislante.txt",
delimiter = "\t",
names = True,
missing_values = "INFINITE",
filling_values = np.inf)
k_interp = interp1d(data['Tmedia'],data[material])
if T>350:
T = 350
elif T<50:
T = 50
k = float(k_interp(T))
return k
def fHaaland(Re,rugRel):
"""
Formula explicita de Haaland para calcular el factor de friccion.
Re = numero de Reynolds (adim)
rugRel = rugosidad relativa (adim)
"""
f=np.square(1/(-1.8*np.log10((6.9/Re)+(float(rugRel)/3.7)**1.11)))
return f
55
def fColebrook(Re,rugRel,f0):
"""
Ecuacion de Colebrook para el factor de friccion. Implicita.
Re = numero de Reynolds (adim)
rugRel = rugosidad relativa (adim)
f0 = valor inicial de f para comenzar la iteracion
"""
es=5*10**-5 #Tolerancia porcentual
ea=100 #Error relativo porcentual
f_old = f0
while ea>es:
f_new = np.square(1/(-
2.0*np.log10((rugRel/3.7)+(2.51/(Re*np.sqrt(f_old))))))
ea = abs((f_new-f_old)/f_new)*100
f_old = f_new
return round(f_new,6)
def Gnielinski(f,Re,Pr):
"""
f = factor de friccion (adim)
Re = numero de Reynolds (adim)
Pr = numero de Prandl (adim)
Devuelve el numero de Nusselt a partir de la correlacion de
Gnielinski.
Valido para 3*10^3<Re<5*10^6 y 0.5<=Pr<=2000
"""
Nu = (f/8.)*(Re-1000)*Pr / (1+12.7*((f/8.)**0.5)*((Pr**(2./3.))-1))
return Nu
def ChurchillyChu(Ra,Pr):
"""Correlacion de Churchill y Chu [1975] para conveccion natural
desde un
cilindro horizontal isotermico"""
Nu =
(0.6+(0.387*(Ra**(1./6.)))/((1+(0.559/Pr)**(9./16.))**(8./27.)))**2
return Nu
def ChurchillyBernstein(Re,Pr):
"""
Re = numero de Reynolds (adim)
Pr = numero de Prandl (adim)
Correlacion de Churchill y Bernstein para el calculo del numero de
Nusselt
en cilindros horizontales
Valido para Re*Pr<0.2
"""
Nu=0.3+(0.62*(Re**0.5)*(Pr**(1./3.)))*((1+((Re/282000.)**(5./8.)))**(4./5
.))/((1+(0.4/Pr)**(2./3.))**(0.25))
return Nu
56
def computeQL(Propsfint,PropsAire,EspecsTub,EspecsAisl,x):
"""
Programa completo
"""
fint = Propsfint
aire = PropsAire
tube = EspecsTub
aisl = EspecsAisl
aisl['D2'] = tube['D1'] + 2*x
aisl['Dm'] = (tube['D1']+aisl['D2'])/2.
#Calculo del h0 (coeficiente convectivo del fluido interno)
#Numero de Reynolds
#Con velocidad
if fint.vm_name == 'V':
Re_int = fint.rho*fint.vm_val*tube['D0']/fint.mu
#Con flujo masico
elif fint.vm_name == 'm':
Re_int = 4*fint.vm_val/(fint.mu*np.pi*tube['D0'])
#Flujo laminar
try:
if Re_int<2300:
#(Ts=cte)
ffriccion = 64/Re_int
Nu_int = 3.66
#Flujo turbulento:
elif 3e3<Re_int<5e6 and 0.5<=fint.Pr<=2000:
rugRel = tube['eps']/tube['D0']
ffriccion = fColebrook(Re_int,rugRel,fHaaland(Re_int,rugRel))
Nu_int = Gnielinski(ffriccion,Re_int,fint.Pr)
h0=Nu_int*fint.k/tube['D0']
#Valores fuera de rango
except:
raise UnboundLocalError('Valor de Re fuera de rango')
#Calculo de hinf (coeficiente convectivo del aire)
Re_ext = aire.rho*aire.vm_val*aisl['D2']/aire.mu
B=1/aire.T
T2_old = (fint.T+aire.T)/2. #Suposicion inicial [K]
#Proceso iterativo
IMax = 1000
TOL = 0.00005
error = 1
i = 1
while i < IMax:
Gr = 9.81*B*(T2_old-
aire.T)*(tube['D1']**3)/((fint.mu/fint.rho)**2)
Ra = Gr*aire.Pr
Param = Gr/(Re_ext**2)
#Conveccion natural dominante
if Param > 10:
Nu_ext = ChurchillyChu(Ra,aire.Pr)
#Conveccion externa forzada dominante
elif Param < 0.1 and Re_ext*aire.Pr > 2:
Nu_ext = ChurchillyBernstein(Re_ext,aire.Pr)
57
#Conveccion mixta
else:
Nu_forzada = ChurchillyBernstein(Re_ext,aire.Pr)
Nu_natural = ChurchillyChu(Ra,aire.Pr)
n = 3.5 # n>3 para superficies horizontales
Nu_ext = (Nu_forzada**n + Nu_natural**n)**(1/n)
hinf=Nu_ext*aire.k/tube['D1']
#Calculo de las resistencias termicas
R1 = 1./(np.pi*h0*tube['D0'])
R2 = tube['x']/(tube['k']*np.pi*tube['Dw'])
T2 =T2_old-273.15
k12 = k_aislante(T2,aisl['material'])
R3 = x/(k12*np.pi*aisl['Dm'])
R4 = 1./(np.pi*aisl['D2']*hinf)
RTotal = R1+R2+R3+R4
Q_L = (fint.T-aire.T)/RTotal
T2_new = aire.T + Q_L*R4
error = abs(T2_old-T2_new)/T2_old
if error <= TOL:
result = Q_L
break
T2_old = T2_new
i += 1
if i>IMax:
print 'Iteraciones excedidas'
result = Q_L
return result
#Testing
if __name__ == '__main__':
#Fluido interno
# (P=[Pa], T=[K], Q=[adim], vi=[m/s])
sustancia = 'water'
Prop1 = 'T'
Val1 = 400
Prop2 = 'Q'
Val2 = 0.5
vi = 5.
fint = fluido(sustancia, Prop1, Val1, Prop2, Val2, 'V', vi)
#Aire del medio ambiente
Patm = 101325 # [Pa]
Tinf = 25 + 273.15 # [K]
vinf = 8.5 # [m/s]
aire = fluido('air', 'P', Patm, 'T', Tinf, 'V', vinf)
58
#Tuberia
cedula = '40'
NPS = '1 1/2'
material_tube = 'acero_AISI_1010'
tube = getPipeSize(cedula,NPS)
tube.update(getPipeProperties(material_tube))
tube['eps']= 0.025 * 0.001 # [mm]
#Aislamiento termico
aisl = {}
aisl['material'] = 'Tipo164'
#Plot
xx = np.linspace(0.001,0.075,30)
yy = np.zeros(len(xx))
for i,xi in enumerate(xx):
print 'xi = ', xi
QLi = computeQL(fint,aire,tube,aisl,xi)
yy[i] = QLi
plt.plot(xx,yy)
plt.show()
59
Archivo convert.py def convertToSIunits(unit,value=0):
#Presion
if unit == 'bar':
new_value = bar_to_Pa(value)
elif unit == 'kPa':
new_value = kPa_to_Pa(value)
elif unit == 'atm':
new_value = atm_to_Pa(value)
elif unit == 'Pa':
new_value = value
#Temperatura
if unit == 'K':
new_value = value
elif unit == 'C':
new_value = C_to_K(value)
elif unit == 'F':
new_value = F_to_K(value)
#Calidad
if unit == 'adim':
new_value = value
elif unit == '%':
new_value = percent_to_adim(value)
#Longitud
if unit == 'm':
new_value = value
elif unit == 'mm':
new_value = mm_to_m(value)
elif unit == 'in':
new_value = in_to_m(value)
#Velocidad
if unit == 'm/s':
new_value = value
elif unit == 'ft/s':
new_value = ft_to_m(value)
#Flujo masico
if unit == 'kg/s':
new_value = value
elif unit == 'kg/h':
new_value = kgh_to_kgs(value)
return new_value
def bar_to_Pa(x):
return x*100000
def kPa_to_Pa(x):
return x*1000
def atm_to_Pa(x):
return x*101325
def C_to_K(x):
return x + 273.15
def F_to_K(x):
return (x-32)/1.8 + 273.15
60
def percent_to_adim(x):
return x/100.
def mm_to_m(x):
return x/1000.
def in_to_m(x):
return x*0.0254
def ft_to_m(x):
return x*0.3048
def kgh_to_kgs(x):
return x/3600.