Contenido - 148.206.53.231

60

Transcript of Contenido - 148.206.53.231

Page 1: Contenido - 148.206.53.231
Page 2: Contenido - 148.206.53.231

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

Page 3: Contenido - 148.206.53.231

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

Page 4: Contenido - 148.206.53.231

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.

Page 5: Contenido - 148.206.53.231

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.

Page 6: Contenido - 148.206.53.231

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.

Page 7: Contenido - 148.206.53.231

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)

Page 8: Contenido - 148.206.53.231

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.

Page 9: Contenido - 148.206.53.231

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

Page 10: Contenido - 148.206.53.231

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.

Page 11: Contenido - 148.206.53.231

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

Page 12: Contenido - 148.206.53.231

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.

Page 13: Contenido - 148.206.53.231

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)

Page 14: Contenido - 148.206.53.231

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.

Page 15: Contenido - 148.206.53.231

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

Page 16: Contenido - 148.206.53.231

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:

Page 17: Contenido - 148.206.53.231

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

Page 18: Contenido - 148.206.53.231

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.

Page 19: Contenido - 148.206.53.231

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,𝑎𝑐𝑡𝑢𝑎𝑙.

Page 20: Contenido - 148.206.53.231

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.

Page 21: Contenido - 148.206.53.231

21

4.2. Diagrama de flujo

Page 22: Contenido - 148.206.53.231

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.

Page 23: Contenido - 148.206.53.231

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.

Page 24: Contenido - 148.206.53.231

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

Page 25: Contenido - 148.206.53.231

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

Page 26: Contenido - 148.206.53.231

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 """

Page 27: Contenido - 148.206.53.231

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

Page 28: Contenido - 148.206.53.231

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

Page 29: Contenido - 148.206.53.231

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.

Page 30: Contenido - 148.206.53.231

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ó

Page 31: Contenido - 148.206.53.231

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.

Page 32: Contenido - 148.206.53.231

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

Page 33: Contenido - 148.206.53.231

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

Page 34: Contenido - 148.206.53.231

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:

Page 35: Contenido - 148.206.53.231

35

Ilustración 1. Aspecto visual de la app

Ilustración 2. Aspecto visual de la app (extensión)

Page 36: Contenido - 148.206.53.231

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

Page 37: Contenido - 148.206.53.231

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

Page 38: Contenido - 148.206.53.231

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.

Page 39: Contenido - 148.206.53.231

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.

Page 40: Contenido - 148.206.53.231

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 (𝑥𝑗

𝑥𝑖)

Page 41: Contenido - 148.206.53.231

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.

Page 42: Contenido - 148.206.53.231

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']

Page 43: Contenido - 148.206.53.231

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'

Page 44: Contenido - 148.206.53.231

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)

Page 45: Contenido - 148.206.53.231

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

Page 46: Contenido - 148.206.53.231

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()

Page 47: Contenido - 148.206.53.231

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

Page 48: Contenido - 148.206.53.231

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'

Page 49: Contenido - 148.206.53.231

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

Page 50: Contenido - 148.206.53.231

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:

Page 51: Contenido - 148.206.53.231

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

Page 52: Contenido - 148.206.53.231

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

Page 53: Contenido - 148.206.53.231

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]

Page 54: Contenido - 148.206.53.231

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

Page 55: Contenido - 148.206.53.231

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

Page 56: Contenido - 148.206.53.231

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)

Page 57: Contenido - 148.206.53.231

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)

Page 58: Contenido - 148.206.53.231

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()

Page 59: Contenido - 148.206.53.231

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

Page 60: Contenido - 148.206.53.231

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.