OPTIMIZACIÓN Y USO DE PDE’s EN MODELOS MATEMÁTICOS Edgar Andres Barrera Vega - Cód: 02-235126 Inti Marcelo Ramon Hernandez - Cód: 02-235104 Dpto. de Ingenierı́a Mecánica y Mecatronica, Facultad de Ingenierı́a Universidad Nacional de Colombia Bogotá D.C. 17 de junio de 2015 Resumen En este artı́culo se presenta el estudio y correspondiente análisis de un problemas de optimización del proceso de diseño de un resorte helicoidal sometido a una carga y frecuencia de carga especı́ficas, con unos esfuerzos cortantes admisibles determinados. Se explica el planteamiento de las ecuaciones y expresiones matemáticas que rigen tales casos, y la posterior implementación de modelos computacionales para que se facilitara el estudio de tal caso. El proceso de optimización consiste en hallar la masa mı́nima del resorte, para que soporte las cargas y frecuencias aplicadas al mismo. También se encuentra el estudio y correspondiente análisis de un problema relacionado con la distrubición de la concentración de un reactivo en un reactor quı́mico cuya sección transversal es constante. Para la resolución del mismo se recurre a la implementación de un modelo matemático que se compone de ecuaciones diferenciales parciales, por lo que su tratamiento cambia respecto a los modelos con ecuaciones diferenciales ordinarias. Y por ultimo se plantea el estudio y correspondiente análisis de un problema de transferencia de calor en una placa plana; la cual esta sometida a una fuente generadora de calor. A pesar de que para la situación real se debe considerar la transferencia de calor por conducción, convección y radiación, en el modelo solo se considerará el efecto ocasionado por conducción. La acción de la fuente de calor se considerará aplicada en un punto especı́fico de la placa. Se espera plantear el modelo matemático que permita determinar la distribución de temperatura a lo largo de la placa, en un esquema temporal implı́cito y explı́cito. Introducción La modelación matemática es una herramienta que ayuda a representar situaciones, sistemas o fenómenos de estudio de alta complejidad, facilitando la comprensión, el análisis y las predicciones de cada caso. Los modelos pueden ser implementados en distintos campos profesionales, como las ingenierı́as, administración, lı́neas de producción, incluso en estrategia militar y áreas de la salud. Sin embargo, cabe aclarar que un modelo matemático representa los escenarios anteriormente descritos de manera parcial e imperfecta. La calidad y eficacia de las representaciones dependen de la robustez y detalles del modelo, como lo son las suposiciones hechas en la descripción del objeto de estudio. Los elementos de un modelo se pueden clasificar en tres:Las variables independientes y parámetros: son los que afectan el modelo pero que no son estudiados por el mismo, pueden asumir valores constantes o variables según la naturaleza del modelo; las variables dependientes, que son los elementos que el modelo se encarga de estudiar; y suposiciones, que incluyen los principios y leyes que rigen el modelo, las ecuaciones constitutivas, e información adicional que pueda simplificar el modelo en algunos rasgos. Por otro lado, la optimización es una herramienta de carácter matemático que se emplea en una gran variedad de campos con el objetivo de encontrar la solución de una cantidad considerable de problemas. La optimización permite mejorar distintos procedimientos y procesos, tales como el diseño 1 convencional, estrategias de mercadeo, entre otros, hallando valores máximos y mı́nimos que satisfagan de la mejor manera una necesidad en particular. Ası́ como hay elementos que afectan un modelo matemático, también se encuentran elementos que afectan un proceso de optimización. En primer lugar, está la Función Objetivo, la cual es la expresión que se quiere maximizar o minimizar según el caso. En segundo lugar están las variables de diseño, sobre las cuales se tiene control y autonomı́a; y finalmente, están las restricciones del proceso, las cuales son limitaciones en los valores que pueden tomar las variables de diseño, para garantizar condiciones de funcionamiento secundarias. 1. Caso de estudio 1 - Diseño óptimo paramétrico de un resorte helicoidal El diseño de elementos de máquinas es uno de los procesos que hace uso de la herramienta de optimización para aumentar la eficiencia del mismo. En este caso en particular se va a realizar la optimización del diseño de un resorte mediante el uso de tal herramienta: Se desea determinar la sensibilidad del proceso de optimización de diseño de un resorte helicoidal (Ver figura 1) sometido a una carga de compresión cı́clica. Al igual que un caso de estudio presentado anteriormente, se requieren los valores óptimos de los diferentes parámetros para resortes cuya masa sea la mı́nima posible. En este caso, se desea conocer la sensibilidad del modelo de optimización para diferentes combinaciones de esfuerzo cortante admisible, frecuencia de carga y para los dos valores de carga diferente, según los valores presentados en las tablas 1, 2, y 3. Figura 1: Esquema del resorte helicoidal τadm1 65 τadm2 70 τadm3 75 τadm4 80 Cuadro 1: Valores de esfuerzo cortante τadm [Ksi], para estudio paramétrico. ω01 80 ω02 90 ω03 100 ω04 110 Cuadro 2: Valores de Frecuencia de carga ω0 [Hz], para estudio paramétrico P1 8 P2 16 Cuadro 3: Valores de Carga aplicada P [lbF], para estudio paramétrico 2 1.0.1. Modelo de optimización Para comenzar a diseñar el Modelo de optimización, se debe determinar los principios y leyes fundamentales que se ven involucradas en el diseño del resorte, las variables de diseño, las restricciones y por supuesto la función objetivo. 1.0.2. Parámetros de diseño del resorte: En esa sección se especifican los parámetros que participan en el funcionamiento del diseño, pero que son independientes de otros. Po [lbF]: Carga Aplicada → Se varı́a como parámetro de estudio; ∆ [in]: Mı́nima deformación por compresión = 0.5 [in]; Q: Número de espiras inactivas = 2; τ [Ksi] : Esfuerzo Cortante admisible → Se varı́a como parámetro de estudio; Dext [in]: Diámetro exterior máximo = 1.5 [in]; δ [in]: Deformación ; ωo [Hz]: Frecuencia de carga → Se varı́a como parámetro de estudio; omega [Hz]: Frecuencia natural del resorte; G[psi]: Módulo de rigidez del material = 1,15E 7 [psi]; K: Constante de elástica del resorte ; ρ [lb/in3 ]: Densidad del material = 0,283[lb/in3 ] 1.0.3. Variables de diseño involucradas: Los factores que se categorizan como variables de diseño son aquellos que se obtienen a raı́z de minimizar la función objetivo, partiendo de una combinación de parámetros determinados por el diseñador y que permiten después obtener el valor de la masa del resorte. D [in]: Diámetro medio; d [in]: Diámetro del alambre; N : Numero de espiras activas; La masa minimizada M del resorte, se obtiene después al reemplazar las variables de diseño obtenidas en la función 5. 1.0.4. Relaciones y principios fundamentales Para estudiar el comportamiento de este problema y poder realizar el modelo computacional del mismo, recurrimos a las siguientes relaciones o principios que fueron tomados de [1, Eq. 10-3, 10-5 y 10-9, Pág. 503] y sirven como base inicial para el correspondiente análisis. Ley de Hooke: P = Kδ; Constante elástica: K= (1) d4 G ; 8D3 N (2) Esfuerzo cortante en un elemento curvo: τ= 8kP D ; πd3 donde k= 3 (4D − d) 0,615d + ; (4D − 4d) D (3) Frecuencia natural: d ω= 2πD2 N 1.0.5. s 2 G ; 2ρ (4) Función objetivo del caso de estudio Ya que el problema pide hallar los valores óptimos de los tres parámetros variables con masa mı́nima, se determina que la función objetivo tiene que ser referente a la masa del resorte. Se parte entonces de la definición general de masa, donde m es la masa del resorte, V el volumen total del resorte y ρ la densidad del material. Se debe despejar la masa en función del volumen y la densidad, de la siguiente manera: m → m = ρV ; ρ= ; V El volumen total del resorte, se obtiene multiplicando el área transversal del alambre, por el perimetro de una espira, por el número de espiras del resorte, de la siguiente manera: V = (N + Q) πd2 πD; 4 Reemplazando la expresión anterior en la fórmula de la masa, se obtiene la siguiente expresión, la cual servirá de referencia para la función objetivo del modelo de optimización: π 2 d2 D ρ ; (5) 4 Teniendo ya todo establecido, se procede ahora a obtener la función objetivo a partir de la Expresión 5 observando que los términos 14 , ρ y π son constantes, por lo tanto, la parte de dicha expresión que varia y se puede tomar como Función Objetivo es la que se presenta a continuación: M = (N + Q) F = (N + Q)d2 D 1.0.6. (6) Restricciones del caso de estudio Las restricciones de este problema surgen de dos tipos de caracterı́sticas: De funcionamiento y geométricas: Las restricciones provenientes del funcionamiento del resorte provienen de las relaciones y principios fundamentales considerados anteriormente, explı́citamente mostrados desde la expresión 1 hasta la expresión 4. Cabe resaltar que todas las restricciones que surgieron durante el planteamiento del problema son de tipo desigualdad. La primera restricción surge de determinar que la deformación máxima del resorte será de 0.5in (∆ = δ = 0,5[in]) y al reemplazar la expresión 2 en la expresión de la Ley de Hooke (1), obteniendo la siguiente fórmula: 8 P D3 N ; d4 G ∆ ≤ (7) La segunda restricción proviene de establecer que el esfuerzo cortante admisible τadm tiene que ser menor al esfuerzo cortante último τ , mostrado en la ecuación 3: τadm ≥ 8P D πd3 0,615d (4D − d) + ; (4D − 4d) D (8) La tercera restricción surge de la expresión 4, la cual es la correspondiente a la frecuencia natural del resorte. En caso tal de que la frecuencia de carga sea igual a la frecuencia natural del muelle, éste entrarı́a en un estado de resonancia, oscilando cada vez mas y de manera mas brusca hasta que el resorte colapse. Por lo anterior, es necesario que la frecuencia de la carga (ω0 ) sea menor que la frecuencia natural (ω); es decir: ω0 d ≤ 2πD2 N 4 s 2 G 2ρ (9) Las restricciones de tipo geométricas surgen de las caracterı́sticas dimensionales del resorte, como lo son su diámetro medio D, el diámetro del alambre d, y el número de espiras activas N . La cuarta restricción parametriza el diámetro externo de las espiras, el cual no debe ser mayor a 1.5 [in] (Dext = 1,5[in]): Dext ≥ D + d (10) La quinta restricción delimita los valores máximos y mı́nimos que puede tener el diámetro del alambre, los cuales son dmin = 0,05[in] y dmax = 0,2[in]: dmin ≤ d ≤ dmax (11) La sexta restricción enmarca el intervalo de valores en los que puede oscilar el valor del diámetro medio D del resorte, los cuales para el caso de estudio, se tomaran de Dmin = 0,25[in] y Dmax = 1,3[in]: Dmin ≤ D ≤ Dmax (12) La ultima restricción establece el rango de espiras que puede tener el resorte, partiendo con un mı́nimo de espiras igual al número de espiras inactivas Nmin = Q = 2 y máximo Nmax = 15 : Nmin ≤ N ≤ Nmax (13) Luego, tomando las restricciones planteadas de las expresiones 7 a la 13, se reemplazan los valores limites; para mayor eficiencia, se dividen las expresiones 7 a la 10 entre dichos valores correspondientes y desigualando todo a ≤ 0 para expresarlo en forma estandar, se obtienen las siguientes expresiones: 1− 8P D τadm πd3 P0 D 3 N ≤ 0 718750d4 0,615d (4D − d) + − 1 ≤ 0; (4D − 4d) D 1− 717,399d ≤ 0 ω0 D2 N (14) (15) (16) D+d −1 ≤ 0 1,5 (17) 0,05 ≤ d ≤ 0,2 (18) 0,25 ≤ D ≤ 1,3 (19) 2 ≤ N ≤ 15 (20) Las expresiones 14 a la 17 son denominadas restricciones del modelo de optimización y las expresiones 18 a la 20 se pueden interpretar como el Dominio de las variables del Diseño. 1.1. Optimización del Diseño Para la optimización del diseño del resorte en cuestión, se recurre al servidor en linea NEOS SERVER, utilizando el paquete computacional Ipopt. Ipopt (Interior Point OPTimizer, pronounced eye-pea-Opt) es un paquete computacional que permite realizar optmización de sistemas no lineales. Está diseñado para encontrar soluciones matemáticas locales a problemas de optmización de la forma: Tomado de [2] min f (x) x ∈ Rn s.t ........ gL ≤ g(x) ≤ gU xL ≤ x ≤ xU 5 P0 [lbF] 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ω0 [rad/seg] 80 80 80 80 90 90 90 90 100 100 100 100 110 110 110 100 80 80 80 80 90 90 90 90 100 100 100 100 110 100 110 110 τadm [ksi] 65 70 75 80 65 70 75 80 65 70 75 80 65 70 75 80 65 70 75 80 65 70 75 80 65 70 75 80 65 70 75 80 N 10.846 10.7227 10.6089 10.5034 10.846 10.7227 10.6089 10.5034 10.846 10.7227 10.6089 10.5034 10.846 10.7227 10.6089 10.5034 12.0599 11.9161 9.7336 7.7143 12.0599 11.9161 9.7336 7.7143 12.0599 11.9161 9.7336 7.7143 12.0599 11.9161 9.7336 7.7143 d [in] 0.0715 0.0687 0.0661 0.0638 0.0715 0.0687 0.0661 0.0638 0.0715 0.0687 0.0661 0.0638 0.0715 0.0687 0.0661 0.0638 0.0525 0.0504 0.0500 0.0500 0.0525 0.0504 0.0500 0.0500 0.0525 0.0504 0.0500 0.0500 0.0525 0.0504 0.0500 0.0500 D [in] 0.4769 0.4533 0.4323 0.4136 0.4769 0.4533 0.4323 0.4136 0.4769 0.4533 0.4323 0.4136 0.4769 0.4533 0.4323 0.4136 0.3840 0.3651 0.3864 0.4175 0.3840 0.3651 0.3864 0.4175 0.3840 0.3651 0.3864 0.4175 0.3840 0.3651 0.3864 0.4175 Masa [lb] 0.0774 0.0671 0.0588 0.0519 0.0774 0.0671 0.0588 0.0519 0.0774 0.0671 0.0588 0.0519 0.0774 0.0671 0.0588 0.0519 0.0367 0.0318 0.0280 0.0250 0.0367 0.0318 0.0280 0.0250 0.0367 0.0318 0.0280 0.0250 0.0367 0.0318 0.0280 0.0250 Cuadro 4: Valores óptimos en el proceso de Diseño del resorte con Diferentes Parametros En el servidor NEOS se carga la descripción del modelo .mod (Ver Apéndice A) en donde se encuentran la función objetivo expresada en 6 y las restricciones que se formularon de la expresión 14 a 20, estableciendo como valores semillas N = 3, d = 0,2 y D = 1. Las soluciones a la Optimización del diseño suministrada por NEOS para cada combinación de parámetros presentados en las Tablas 1 a 3 se puede observar en la Cuadro 4. 1.2. Análisis de Sensibilidad Como el objetivo principal de este articulo es determinar la sensibilidad del modelo, se analizan el numero de condicionamiento para cada caso del diseño, es decir, dejando P0 y ω0 constantes y variando τadm , y ası́ sucesivamente. En las Figuras 2, 3 y 4 se representas las gráficas que relacionan la variación relativa en la entrada de datos y el numero de Condicionamiento dada por la expresión 21 para cada caso particular en donde se deja constante un parámetro. Condicionamiento = ∆M/M ∆x/x donde x es el parametro de entrada. 6 (21) Figura 2: Variación Relativa de τadm Vs Condicionamiento Figura 3: Variación Relativa de ω0 Vs Condicionamiento Figura 4: Variación Relativa de P0 Vs Condicionamiento Como se puede observar en el caso en que el único parámetro que varia es τadm (Ver Figura 2) el numero de condicionamiento máximo que se presenta es menor a 1.75, por lo tanto se puede concluir que el modelo es robusto para datos de entrada dependientes de τadm . Además se aprecia que a medida que aumenta la variación relativa en el dato de entrada, el numero de Condicionamiento disminuye. Ahora, cuando el único parámetro que se varia es la frecuencia de carga ω0 , se puede observar en la Figura 3 que su numero de condicionamiento siempre sera es decir, es decir que cualquier variación en ω0 no refleja ninguna variación en el valor de la Masa optima, por lo tanto se concluye que para datos de entrada dependientes de ω0 el modelo en Insensible o nada Sensible. Finalmente, al observar la Figura 4 se aprecia que la única variación presente en P0 de 16 lbF a 8 lbF representa un numero de Condicionamiento de 1.05029, lo cual deja a la vista que el modelo es robusto para datos de entrada dependientes de P0 . 7 2. Caso de estudio 2 - Transporte unidimensional en un reactor quı́mico (FDM) Una de las ecuaciones diferenciales parciales más comunes es la ecuación de advección - reacción difusión. En particular, la ecuación de advección-difusión-reacción unidimensional (ecuación 22) es un modelo matemático válido para calcular la distribución de la concentración de un reactivo a lo largo de un reactor quı́mico cuya sección transversal permanece constante (Figura 5). ∂y ∂2y ∂y = D 2 −U − ky ∂t ∂x ∂x (22) Donde: y: Concentración del reactivo [kg/m3 ] t: Tiempo [s]. D: Coeficiente de difusión [m2 /s] x: Distancia longitudinal [m]. U : Velocidad promedio (en x) de flujo reactivo [m/s]. k: Velocidad de reacción del reactivo [s−1 ]. Figura 5: Reactor con un solo punto de entrada y salida. 2.1. Modelo matemático Para comenzar a diseñar el Modelo de matemático que describe este problema, se deben determinar los principios y leyes fundamentales que se ven involucradas, las variables dependientes, independientes y las condiciones de frontera. 2.1.1. Parámetros del problema: En esa sección se especifican los parámetros de funcionamiento y las leyes que rigen el modelo:. D = 1.8 [m2 /s]; L= 0.9 [m]; U = 0.2 [m/s] CRef =0.1 [Kg/m3 ]; k= 5[s−1 ]; Donde CRef es un valor de referencia de la concentración. 8 2.1.2. Condiciones de frontera del problema: Este problema posee dos condiciones de frontera: La primera, en el punto x = 0, es tipo Robin (R) o Fourier: −D ∂y + U y = U CRef ∂x (23) La segunda condición de frontera, en el punto x = L, es de tipo Neumann: ∂y =0 ∂x 2.1.3. (24) Adimensionalización: Para poder estudiar y entender mejor el comportamiento de este problema, se procede a realizar la correspondiente adimensionalización de la expresion que lo rige (Ecuación 22 ), ası́ como también de las que describen las condiciones de frontera (Ecuaciones 23 y 24). Dicho proceso se presenta a continuación: En primer lugar, se establecen los siguientes términos adimensionales: y∗ = y CRef x∗ = x Lc ; t∗ = t τ ; Donde τ = Lc U ⇒ t∗ = t U Lc ; Luego, se procede a despejar y derivar las expresiones anteriores, en función de los términos adimensionales: y = y ∗ CRef ; dy = dy ∗ CRef ; x = x∗ Lc; dx = dx∗ Lc t= ⇒ dx2 = dx∗2 Lc2 ; t∗ Lc U ; dt = dt∗ Lc U ; Ahora, se realizan los correspondentes reemplazos en la ecuación 22: CRef U ∂y ∗ CRef ∂ 2 y ∗ CRef ∂y ∗ =D −U − kCRef y ∗ ; ∗ 2 ∗2 Lc ∂t Lc ∂x Lc ∂x∗ Se Cancela el término CRef de toda la expresión, obteniendo: D ∂ 2 y∗ U ∂y ∗ U ∂y ∗ = − − ky ∗ ; Lc ∂t∗ Lc2 ∂x∗2 Lc ∂x∗ Ahora, se despeja el término temporal a un solo lado de la igualdad: ∂y ∗ Lc D ∂ 2 y ∗ Lc U ∂y ∗ Lc ∗ ky ; = − − ∂t∗ U Lc2 ∂x∗2 U Lc ∂x∗ U Luego, se simplifican términos de la expresión: ∂y ∗ D ∂ 2 y∗ ∂y ∗ Lc k ∗ = − − y ; ∗ ∗2 ∗ ∂t U Lc ∂x ∂x U Para reducir cálculos se agrupan términos constantes de la ecuación en dos parámetros: 9 D Lc k ; α= ; U Lc U Finalmente, se obtiene la expresión 22 adimensionalizada: β= ∂ 2 y∗ ∂y ∗ ∂y ∗ = β − − αy ∗ ; (25) ∂t∗ ∂x∗2 ∂x∗ Se prosigue con la adimensionalización de las condiciones de frontera, utilizando los mismos parámetros adimensionales que se establecieron anteriormente. Primero, se adimensionaliza la condición de frontera en x = 0: ∂y + U y = U CRef ∂x CRef ∂y ∗ + U CRef y ∗ = U CRef −D Lc ∂x∗ −D Se cancela el término CRef : −D ∂y ∗ + U y∗ = U Lc ∂x∗ Anulando el coeficiente de la derivada parcial de y respecto a x: ∂y ∗ U Lc ∗ U Lc − y =− ∂x∗ D D Se utilizan los coeficientes β y α, determinados anteriormente: ∂y ∗ 1 1 − y∗ = − ∗ ∂x β β (26) Ahora, se adimensionaliza la condición de frontera en x = L: ∂y =0 ∂x CRef ∂y ∗ =0 Lc ∂x∗ ∂y ∗ =0 ∂x∗ 2.2. 2.2.1. (27) Aplicación del método de diferencias finitas: Ecuación general: Ahora se procede a aplicar el método de diferencias finitas a la ecuación 25, visto en [2], implementando un esquema temporal del tipo Crank Nicolson y centradas en el espacio, como se muestra a continuación: (De ahora en adelante, los términos adimensioanles de de la ecuación 25 se escribirán como: y ∗ = y; x = x; t∗ = t; por cuestiones de practicidad y facilidad de entendimiento de las expresiones) ∗ ∂y ∂2y ∂y =β 2 − − αy; ∂t ∂x ∂x Aplicando diferencias finitas desde una perspectiva muy general se tiene: ∂y yi n+1 − yin = ∂t ∆t n n 2 yi+1 − 2yin + yi−1 ∂ y = 2 ∂x2 ∆x 10 n y n − yi−1 ∂y = i+1 ∂x 2∆x Ahora, se procede a implementar el esquema Crank Nicolson, el cual se considera de tipo semiimplı́cito, para la discretización de la ecuación 25: n+1 n+1 y n+1 − 2yin+1 + yi−1 y n+1 − yi−1 1 yi n+1 − yin = ( β i+1 − i+1 − αyin+1 ) 2 ∆t 2 2∆x ∆x + n n n yi+1 − yi−1 y n − 2yin + yi−1 1 − ( β i+1 − αyin ) 2 2∆x ∆x2 Agrupando términos: 1 β n+1 2β n+1 β n+1 1 n+1 1 n+1 yi n+1 − yin = ( y − y + y − y + y − αyin+1 ) ∆t 2 ∆x2 i+1 2∆x i+1 2∆x i−1 ∆x2 i ∆x2 i−1 + 1 β n 2β n β n 1 n 1 n+1 n y y + ( − 2 yi−1 − 2∆x yi+1 + 2∆x yi−1 − αyi ) 2 ∆x2 i+1 ∆x2 i ∆x Multiplicando toda la expresión por ∆t: yi n+1 − yin = ∆t n+1 1 β∆t n+1 2β∆t n+1 β∆t n+1 ∆t n+1 yi+1 − yi + yi−1 − ( yi+1 + y − ∆t αyin+1 ) 2 2 2 2 ∆x 2∆x 2∆x i−1 ∆x ∆x 2β∆t n β∆t n ∆t n ∆t n+1 1 β∆t n ( y − yi + yi−1 − y + y − ∆t αyin ) 2 ∆x2 i+1 2∆x i+1 2∆x i−1 ∆x2 ∆x2 Se decide reducir constantes en tres coeficientes determinados, para facilitar los cálculos y el entendimiento del planteamiento: + β ∆t = φ; 2 (∆x)2 ∆t = µ; 4 ∆x ∆t α =θ 2 Reemplazando en la expresión anterior: n+1 n+1 n+1 n+1 yi n+1 − yin = φyi+1 − 2φyin+1 + φyi−1 − µyi+1 + µyi−1 − θyin+1 n n n n + φyi+1 − 2φyin + φyi−1 − µyi+1 + µyi−1 − θ yin ) Ahora, se ponen a un lado de la igualdad los términos que se calculan en el tiempo n + 1, y al otro los que se calculan en el tiempo n: n+1 n+1 n+1 n+1 n n n n yi n+1 +2φyin+1 +θ yin+1 −φyi+1 +µyi+1 −φyi−1 −µyi−1 = φyi+1 −µyi+1 −2φyin +yin −θ yin +φyi−1 +µyi−1 Agrupando términos semejantes: n+1 n+1 n n (1 + 2φ + θ)yin+1 − (φ − µ)yi+1 − (φ + µ)yi−1 = (1 − 2φ − θ)yin + (φ − µ)yi+1 + (φ + µ)yi−1 Redefiniendo coeficientes: η = 2φ + θ; γ = φ − µ; ρ = φ + µ; Reemplazando en la ecuación anterior, se obtiene entonces, la ecuación general para los nodos del sistema: n+1 n+1 n n −ρ yi−1 + (1 + η) yin+1 − γ yi+1 = ρ yi−1 + (1 − η) yin + γ yi+1 11 (28) 2.2.2. Condiciones de frontera: Ahora se discretizan las dos condiciones de frontera del problema, aplicando el método de diferencias finitas de tipo centradas: Discretizando la condición de frontera en el punto x = 0: Se parte de la ecuación 26: ∂y 1 1 − y=− ∂x β β Discretizando: yi+1 − yi−1 1 −1 − yi = 2 ∆x β β Aplicandolo al nodo i = 1, es decir, al nodo de frontera: y2 − y0 1 −1 − y1 = 2 ∆x β β ⇒ y0 = y2 − 2 ∆x( −1 1 + y1 ) β β (29) Ahora, se hace el mismo tratamiento al nodo correspondiente al de la frontera para x = L, partiendo de la ecuación 27: ∂y =0 ∂x Discretizando: yi−1 − yi+1 =0 2 ∆x Asumiendo un total de 5 nodos, se aplica la expresión anterior para tal nodo, obteniendo: y4 − y6 =0 2 ∆x ⇒ y4 = y6 (30) Siendo y4 y y6 los nodos penúltimo y fantasma de la frontera en x = L, respectivamente. 2.2.3. Aplicación de la ecuación discretizada 28 a los nodos del sistema: Se aplica la ecuación 28 a los nodos del sistema, teniendo consideración especial con el nodo correspondiente a la frontera en x = 0 y a la frontera en x = L. La ecuación general se comporta de igual forma para todos los nodos internos del dominio. Nodo i = 1: −ρ y0n+1 + (1 + η) y1n+1 − γ y2n+1 = ρ y0n + (1 − η) y1n + γ y2n Se Reemplaza y0 en términos de y2 y y1 , en ambos instantes de tiempo, como se muestra en la expresión 29, obteniendo: −ρ (y2n+1 − 2 ∆x( 1 −1 + y1n+1 )) + (1 + η) y1n+1 − γ y2n+1 = β β ρ (y2n − 2 ∆x( −1 1 + y1n )) + (1 − η) y1n + γ y2n β β Agrupando términos: −ρy2n+1 + 2ρ ∆x( 1 −1 + y1n+1 ) + (1 + η) y1n+1 − γ y2n+1 = β β ρy2n − 2ρ ∆x( −1 1 + y1n ) + (1 − η) y1n + γ y2n β β 12 −ρy2n+1 − 2ρ ∆x 2ρ ∆x n+1 + y1 + (1 + η) y1n+1 − γ y2n+1 = β β ρy2n + 2ρ ∆x 2ρ ∆x n − y1 + (1 − η) y1n + γ y2n β β Finalmente se obtiene: ( 2ρ ∆x ρ∆x −2ρ ∆x + 1 + η)y1n+1 − (ρ + γ)y2n+1 = ( + 1 − η)y1n + (ρ + γ)y2n + 4 (31) β β β Último Nodo (Se asumen 5 nodos en total): −ρ y4n+1 + (1 + η) y5n+1 − γ y6n+1 = ρ y4n + (1 − η) y5n + γ y6n Se Reemplaza y6 por y4 , como se muestra en la expresión 30, obteniendo: −ρ y4n+1 + (1 + η) y5n+1 − γ y4n+1 = ρ y4n + (1 − η) y5n + γ y4n Agrupango términos: −(ρ + γ)y4n+1 + (1 + η) y5n+1 = (ρ + γ)y4n + (1 − η) y5n 2.2.4. (32) Representación Matricial del modelo: Las expresiones de los nodos del sistema se pueden plasmar mediante una representación matricial, reemplazando Ψ = ρ β∆x en las ecuación 31 para la primera fila; en la ecuación 32 para la última fila; y en la ecuación 28 para las filas internas. Se obtiene entonces un esquema matricial de la forma A y n+1 = B y n + BC, tal y como se muestra a continuación: n+1 y1 (2Ψ + 1 + η) −(ρ + γ) 0 0 0 y2 −ρ (1 + η) −γ 0 0 0 −ρ (1 + η) −γ 0 = y3 0 0 −ρ (1 + η) −γ y4 0 0 0 −(ρ + γ) (1 + η) y5 n y1 4Ψ (−2Ψ + 1 − η) (ρ + γ) 0 0 0 0 y2 ρ (1 − η) γ 0 0 0 ρ (1 − η) γ 0 y3 + 0 0 0 0 ρ (1 − η) γ y4 0 0 0 (ρ + γ) (1 − η) y5 0 2.2.5. Análisis de estabilidad: Para realizar el análisis de estabilidad de el modelo se acude a mirar la dominancia de la diagonal de la matriz (aunque esto sólo es estrictamente válido para esquemas implı́citos): X | Aii | ≥ = | Aij |; P ara todo i. (33) i6=j Aplicando esta ecuación a la representación matricial mostrada anteriormente, obtenemos las siguientes desigualdades: | 1 − η | ≥ | ρ + γ |; | 1 − 2φ − θ | ≥ | φ + µ + φ − µ |; | 1 − 2φ − θ | ≥ | 2φ |; 13 |1− |1− β ∆t ∆t α β ∆t |; |≥| 2 − 2 ∆x ∆x2 D ∆t ∆t Lc k D ∆t |≥| |; 2 − 2U U Lc ∆x U Lc ∆x2 Lc k D D |; 2 + 2U ) | ≥ | ∆t U Lc ∆x U Lc ∆x2 Se parte este análisis en dos partes, abriendo el valor absoluto de la expresión y ası́ poder hallar los intervalos en los que puede oscilar el ∆t para respetar la estabilidad del modelo: | 1 − ∆t ( Lı́mite inicial de ∆t: 1 − ∆t ( Lc k D D ; 2 + 2U ) ≥ ∆t U Lc ∆x U Lc ∆x2 1 ≥ ∆t ( D Lc k D ; 2 + 2U ) + ∆t U Lc ∆x U Lc ∆x2 1 ≥ ∆t ( 2D Lc k 2 + 2U ); U Lc ∆x Despejando ∆t: ∆t ≤ ( Lı́mite final de ∆t Lc k −1 2D + ) ; 2U U Lc ∆x2 (34) Lc k D D + ; ) ≤ −∆t 2U U Lc ∆x2 U Lc ∆x2 D Lc k D 1 ≤ ∆t ( ; 2 + 2U ) − ∆t U Lc ∆x U Lc ∆x2 1 − ∆t ( Cancelando términos semejantes: 1 ≤ ∆t Lc k ; 2U Despejando ∆t: ∆t ≥ ( Lc k −1 ) ; 2U (35) Finalmente, se encuentra el intervalo de valores que puede asumir ∆t para mantener la condición de estabilidad del sistema: ( 2.3. Lc k −1 Lc k −1 2D + ) ≤ ∆t ≤ ( ) ; 2U 2U U Lc ∆x2 (36) Implementación computacional: Para simular el modelo matemático anteriormente planteado se hace uso del lenguaje de programación FORTRAN 90, como se puede ver el script en el apéndice B. Para la parte explı́cita de la ecuación matricial (el lado derecho de la igualdad) se usó un simple algoritmo de multiplicación matriz - vector y suma vector- vector. Como todos los valores de este lado son conocidos, se obtiene un vector cuyas entradas también se conocen, y ası́ finalmente tener un sistema matricial Ax = d, donde A es una matriz tridiagonal; x es el vector de incógnitas y d es el vector anteriormente mencionado. Este tipo de sistemas se puede solucionar eficientemente usando el algoritmo de Thomas (Ver [3, Pág 49]), como se puede apreciar a continuación: Identificar el sistema tridiagonal A. 14 Colocar: β1 = A1,1 ; γ1 = d1 ; β1 Para las demás filas se usan las siguientes formulas: βi = Ai,i − γi = Ai,i−1 Ai−1,i ; βi−1 di − Ai,i−1 γi−1 ; βi i = 2, ..., n; i = 2, ..., n; Finalmente se obtiene el vector solución regresivamente, donde: xn = γn ; xi = γi − 2.4. Ai,i+1 xi+1 ; βi i = n − 1, ..., 1; Resultados: Habiendo simulado el modelo matemático implementando una herramienta computacional, usando un numero de 45 nodos a lo largo del reactor, un intervalo de tiempo de 0.01 segundos, y un tiempo total de simulación de 10 segundos, se obtienen las siguientes gráficas: Figura 6: Curvas de la concentración a lo largo del reactor en diferentes instantes de tiempo. 15 Figura 7: Curva de la concentración después de haber transcurrido 10 segundos. En la figura 6 las curvas están ordenadas de abajo hacia arriba, de la siguiente manera: La curva de color rojo corresponde al instante t = 0[s]. La curva de color verde corresponde al instante t = 0,05[s]. La curva de color azul oscuro corresponde al instante t = 0,1[s]. La curva de color rosado corresponde al instante t = 0,2[s]. La curva de color azul claro corresponde al instante t = 0,4[s]. A partir del instante t = 1[s], no se presenta variación en la concentración del reactor, es decir, se estabiliza el sistema. Como se puede observar en la gráfica 6, se verifica, en todas las curvas, el cumplimiento de las condiciones de frontera (Ecuaciones 23 y 24), ya que en el extremo izquierdo del reactor, la concentración es distinta a cero, y en el extremo derecho, todas las curvas parecen comportarse asintóticamente, regidas por la condición de frontera Neumann nula. Adicionalmente se presenta en la gráfica 7 en el instante final de simulación (t = 10[s]), reafirmando la estabilidad del sistema en este intervalo de tiempo. 16 3. Caso de estudio 3 - Modelo de la distribución de temperaturas en una placa sometida a una fuente de calor (FDM) Considere una placa bidimensional fabricada de un material con coeficiente de difusividad térmica α , tal como la mostrada en la figura 8. Como se observa, las fronteras fı́sicas de la placa están designadas por las letras A, B, C, y D. Asuma que la placa está sometida a una fuente de calor puntual localizada en la coordenada x = 0, 5; y = 0, 5. Figura 8: Reactor con un solo punto de entrada y salida. 3.1. Modelo matemático Para comenzar a diseñar el Modelo de matemático que describe este problema, se deben determinar los principios y leyes fundamentales que se ven involucradas, las variables dependientes, independientes, las condiciones de frontera y suposiciones realizadas. Para simplificar el problema, se puede asumir que solo se considera el fenómeno de conducción de calor transitorio, por lo que el problema puede ser modelado mediante la ecuación general de conducción de calor (obtenida de [4]): ∇2 T + egen ˙ 1 ∂T = k α ∂t Re-organizando términos, se obtiene: ∂T − α∇2 T = f (x, y, t) ∂t Donde: f (x, y, t): Corresponde a la función de la fuente de calor. T : Es la Temperatura [K] t: Es el tiempo [s]. α: Es el coeficiente de difusividad térmica[m2 /s].. x y y: Coordenadas espaciales de la placa. 17 (37) 3.2. Parámetros del modelo: Para este problema, la función de la fuente generadora de calor se puede modelar de la siguiente manera: f (x, y, t) = [ 3.2.1. 2 6 [−( x−0,5 wx ) − 3] e −t 1+e 2 − ( y−0,5 wy ) ] (38) Condiciones de frontera del problema: Este problema establece dos tipos de condiciones adimensionales para sus fronteras: Las fronteras A y B pueden ser modeladas como fronteras tipo Dirichlet. θA = 0; (39) θB = 1, 5; (40) ∂θ Las fronteras C y D pueden considerarse como fronteras tipo Neumann con flujo nulo ( ∂n = 0); donde n es el vector unitario ortogonal a la respectiva frontera: 3.2.2. ∂θC = 0; ∂y (41) ∂θD = 0; ∂x (42) Adimensionalización: Para poder estudiar y entender mejor el comportamiento de este problema, se procede a realizar la correspondiente adimensionalización de la expresión que lo rige (Ecuación 37): La expresión 37 también puede expresarse de manera adimensional, de la siguiente manera: ∂θ ατ τ − 2 ∇2 θ = f (x, y, t) ∂t∗ Lref Tref Donde: θ= T −Tref Tref ; Tref = 273[K]; τ= L2ref α ; Reemplazando τ en la expresión anterior, se obtiene la ecuación adimensional del modelo: L2ref ∂θ 2 − ∇ θ = f (x, y, t) ∂t∗ α τ Tref 3.2.3. (43) Aplicación de las diferencias finitas: Ecuación general: Ahora se procede a aplicar el método de diferencias finitas a la ecuación 43, visto en [2], implementando el método ADI (Alternating - Dimension - Implicit). 18 Figura 9: Representación método ADI. Figura 10: Método ADI - Múltiples sistemas TDM. Primero se establece la ecuación general que se va a discretizar, por lo que se debe reemplazar la función de la fuente de calor (Eq: 38) y el término β = L2ref α τ en la ecuación 43: ∂2θ ∂2θ 6 ∂θ −( 2 + ) = β[ − 3] e ∗ 2 ∂t ∂x ∂y 1 + e−t y−0,5 2 2 [−( x−0,5 wx ) − ( wy ) ] Discretización según el método ADI: Ahora se plantea la discretización de las ecuaciones según el método ADI: Discretización en el intervalo temporal [n → n + 1/2] n+1/2 ∂θ ∂t = θi,j n − θi,j ; ∆t/2 (En n) → ∂2θ ∂x2 = n n n θi−1,j − 2θi,j + θi+1,j ; 2 (∆x) (En n) → ∂2θ ∂y 2 = n n n θi,j−1 − 2θi,j + θi,j+1 ; (∆y)2 Discretización en el intervalo temporal [n + 1/2 → n + 1] n+1/2 ∂θ ∂t = n+1 θi,j − θi,j ∆t/2 ; (En n + 1) → ∂2θ ∂x2 = n+1 n+1 n+1 θi−1,j − 2θi,j + θi+1,j ; 2 (∆x) (En n + 1) → ∂2θ ∂y 2 = n+1 n+1 n+1 θi,j−1 − 2θi,j + θi,j+1 ; (∆y)2 19 (44) Discretización de la función de la fuente de calor: f (x, y, t) = [ 1 6 + e−n∆t − 3] e [−( i∆xw− x 0,5 2 ) − ( j∆yw− y 0,5 2 ) ] ; Aplicación de la discretización por medio del metodo ADI: Se aplican las discretizaciones generales a la ecuación 44, en los dos intervalos de tiempo establecidos ([n → n + 1/2]; [n + 1/2 → n + 1]): n+1/2 θi,j n+1/2 n+1/2 n n n n − θi,j θi,j−1 θi−1,j − 2θi,j + θi+1,j + − ( 2 ∆t/2 (∆x) β n+1/2 6 [−( i∆xw− x − 3] e 1 + e−n∆t − ( j∆yw− y 0,5 2 ) n+1/2 n+1 θi,j − θi,j ∆t/2 n+1 n+1 n+1 θi,j−1 θi−1,j − 2θi,j + θi+1,j + − ( (∆x)2 β[ 6 1 + e−(n+1)∆t − 3] e [−( i∆xw− x 0,5 2 ) n+1/2 − 2θi,j + θi,j+1 ) = 2 (∆y) 0,5 2 ) ] (45) n+1/2 n+1/2 − 2θi,j + θi,j+1 ) = (∆y)2 − ( j∆yw− y 0,5 2 ) ] (46) Se procede a desarrollar la ecuaciónes 45 y 46 haciendo las siguientes consideraciones y simplificaciones: ∆x = ∆y = ∆h λ= ∆t 2(∆h)2 µ= ∆t β 2 → Ecuación 45: n+1/2 n+1/2 θi,j n − θi,j − = n+1/2 θi,j n n n θi,j−1 − 2θi,j + θi+1,j ∆t θi−1,j ( + 2 2 (∆x) 6 β∆t [−( i∆xw− x [ − 3] e −n∆t 2 1 + e 0,5 2 ) n+1/2 − ( j∆yw− y n+1/2 n n n n − θi,j − λθi−1,j + λ2θi,j − λθi+1,j − λθi−1,j n+1/2 − 2θi,j + θi,j+1 ) 2 (∆y) 0,5 2 ) ] n+1/2 + λ2θi,j n+1/2 − λθi+1,j = µ f (i∆x, j∆y, n∆t) Acomodando los términos según el tiempo en el que se calculan, se obtiene: n+1/2 θi,j n+1/2 − λθi,j−1 n+1/2 + λ2θi,j n+1/2 − λθi,j+1 n n n n = θi,j + λθi−1,j − λ2θi,j + λθi+1,j + µ f (i∆x, j∆y, n∆t) Finalmente, la expresión para el primer intervalo es: n+1/2 (1 + 2λ)θi,j n+1/2 − λθi,j−1 n+1/2 − λθi,j+1 n n n = (1 − 2λ)θi,j + λθi−1,j + λθi+1,j + µ f (i∆x, j∆y, n∆t) 20 (47) → Ecuación 46: n+1/2 n+1 θi,j − θi,j n+1/2 n+1/2 n+1 n+1 n+1 − λθi−1,j + λ2θi,j − λθi+1,j − λθi,j−1 + λ2θi,j n+1/2 − λθi,j+1 = µ f (i∆x, j∆y, (n + 1)∆t) Acomodando los términos según el tiempo en el que se calculan, se obtiene: n+1 n+1 n+1 n+1 θi,j − λθi−1,j + λ2θi,j − λθi+1,j = n+1/2 thetai,j n+1/2 + λθi,j−1 n+1/2 n+1/2 − λ2θi,j + λθi,j+1 + µ f (i∆x, j∆y, (n + 1)∆t) Finalmente, la expresión para el segundo intervalo de tiempo es: n+1 n+1 n+1 (1 + 2λ)θi,j − λθi−1,j − λθi+1,j n+1/2 n+1/2 = (1 − 2λ)θi,j + λθi,j−1 n+1/2 + λθi,j+1 + µ f (i∆x, j∆y, (n + 1)∆t) (48) Las ecuaciones 47 y 48, se cumplen para todos los nodos internos del dominio. Debido a las condiciones de transferencia de calor en los bordes de la placa, se deben tener consideraciones especiales para establecer las ecuaciones de los nodos de las fronteras: En x = 0 : ∂θ = 0; ∂x θ2,j − θ0,j =0 2∆x → ⇒ θ2,j = θ0,j (49) En x = 1 : θn,j = 1,5; (50) θi,1 = 0; (51) En y = 0 : En y = 1 : ∂θ = 0; ∂y θi,n+1 − θi,n−1 =0 2∆y → ⇒ θi,n+1 = θi,n−1 (52) → Ecuaciones para la frontera A (Nodos (i, 2)): Aplicando la ecuación 47: n+1/2 (1 + 2λ)θi,2 n n (1 − 2λ)θi,2 + λθi−1,2 n+1/2 − λθn+1/2 = − λθ i,3 i,1 n + λθi+1,2 + µ f (i∆x, 2∆y, n∆t) n+1/2 (1 + 2λ)θi,2 n+1/2 − λθi,3 = n n n (1 − 2λ)θi,2 + λθi−1,2 + λθi+1,2 + µ f (i∆x, 2∆y, n∆t) Aplicando la ecuación 48: n+1 n+1 n+1 (1 + 2λ)θi,2 − λθi−1,2 − λθi+1,2 = n+1/2 (1 − 2λ)θi,2 n+1/2 + λθn+1/2 + µ f (i∆x, j∆y, (n + 1)∆t) + λθ i,1 i,3 21 (53) n+1 n+1 n+1 (1 + 2λ)θi,2 − λθi−1,2 − λθi+1,2 = n+1/2 n+1/2 (1 − 2λ)θi,2 + λθi,3 + µ f (i∆x, j∆y, (n + 1)∆t) (54) → Ecuaciones para la frontera B (Nodos (n − 1, j)): Aplicando la ecuación 47: n+1/2 n+1/2 n+1/2 (1 + 2λ)θn−1,j − λθn−1,j−1 − λθn−1,j+1 = n n n (1 − 2λ)θn−1,j + λθn−2,j + λθn,j + µ f ((n − 1)∆x, j∆y, n∆t) n+1/2 n+1/2 n+1/2 (1 + 2λ)θn−1,j − λθn−1,j−1 − λθn−1,j+1 = n n (1 − 2λ)θn−1,j + λθn−2,j + λ 1,5 + µ f ((n − 1)∆x, j∆y, n∆t) (55) Aplicando la ecuación 48: n+1 n+1 n+1 (1 + 2λ)θn−1,j − λθn−2,j − λθn,j = n+1/2 n+1/2 n+1/2 (1 − 2λ)θn−1,j + λθn−1,j−1 + λθn−1,j+1 + µ f ((n − 1)∆x, j∆y, (n + 1)∆t) n+1 n+1 (1 + 2λ)θn−1,j − λθn−2,j = n+1/2 n+1/2 n+1/2 (1 − 2λ)θn−1,j + λθn−1,j−1 + λθn−1,j+1 + 1,5 λ + µ f ((n − 1)∆x, j∆y, (n + 1)∆t) (56) → Ecuaciones para la frontera C (Nodos (i, n)): Aplicando la ecuación 47: n+1/2 (1 + 2λ)θi,n n+1/2 − λθi,n−1 n+1/2 − λθi,n−1 = n n n (1 − 2λ)θi,n + λθi−1,n + λθi+1,n + µ f (i∆x, n∆y, n∆t) n+1/2 n+1/2 − 2λθi,n−1 = (1 + 2λ)θi,n n n n (1 − 2λ)θi,n + λθi−1,n + λθi+1,n + µ f (i∆x, n∆y, n∆t) (57) Aplicando la ecuación 48: n+1 n+1 n+1 (1 + 2λ)θi,n − λθi−1,n − λθi+1,n = n+1/2 (1 − 2λ)θi,n n+1/2 n+1/2 + λθi,n−1 + λθi,n+1 + µ f (i∆x, n∆y, (n + 1)∆t) n+1 n+1 n+1 (1 + 2λ)θi,n − λθi−1,n − λθi+1,n = n+1/2 (1 − 2λ)θi,n n+1/2 + 2λθi,n−1 + µ f (i∆x, n∆y, (n + 1)∆t) 22 (58) → Ecuaciones para la frontera D (Nodos (1, j)): Aplicando la ecuación 47: n+1/2 (1 + 2λ)θ1,j n+1/2 n+1/2 − λθ1,j−1 − λθ1,j+1 = n n n (1 − 2λ)θ1,j + λθ0,j + λθ2,j + µ f (1∆x, j∆y, n∆t) n+1/2 (1 + 2λ)θ1,j n+1/2 n+1/2 − λθ1,j−1 − λθ1,j+1 = n n (1 − 2λ)θ1,j + 2λθ2,j + µ f (1∆x, j∆y, n∆t) (59) Aplicando la ecuación 48: n+1 n+1 n+1 (1 + 2λ)θ1,j − λθ0,j − λθ2,j n+1/2 = (1 − 2λ)θ1,j n+1/2 n+1/2 + λθ1,j−1 + λθ1,j+1 + µ f (1∆x, j∆y, (n + 1)∆t) n+1 n+1 (1 + 2λ)θ1,j − 2λθ2,j = n+1/2 (1 − 2λ)θ1,j n+1/2 n+1/2 + λθ1,j−1 + λθ1,j+1 + µ f (1∆x, j∆y, (n + 1)∆t) (60) Representación matricial del modelo: Ahora, se hace el planteamiento de las ecuaciones del modelo, tanto para los nodos internos como para los nodos de frontera, en forma de matrices, lo cual es bastante útil para la resolución del mismo: → Primer paso: n+1 θi,2 2 θi,2 θi,2 . = . . . . . . −2λ (1 + 2λ) θi,n n +λθi+1,2 µ f (i, j, n) λ θi,1 µ f (i, j, n) 0 +λθi+1,3 µ f (i, j, n) 0 +λθi+1,4 . . + + . . . . . . +λθi+1,n µ f (i, j, n) 0 (1 + 2λ) −λ −λ (1 + 2λ) −λ −λ (1 + 2λ) −λ . λθi−1,2 λθi−1,3 λθi−1,4 λθi−1,n +(1 + 2λ)θi,2 +(1 + 2λ)θi,3 +(1 + 2λ)θi,4 . . . . +(1 + 2λ)θi,n → Segundo Paso: (1 + 2λ) −2λ −λ (1 + 2λ) −λ −λ (1 + 2λ) −λ . 23 . . . −λ θ1,2 θ2,2 θ3,2 . . . . n+1 (1 + 2λ) θn−1,2 = (61) λθ1,j−1 λθ2,j−1 λθ3,j−1 λθn−1,j−1 +(1 − 2λ)θ2,j +(1 − 2λ)θ2,j +(1 − 2λ)θ3,j . . . . +(1 − 2λ)θn−1,j +λθ1,j+1 +λθ2,j+1 +λθ3,j+1 n+1 2 +λθn−1,j+1 µ µ µ + µ f (i, j, n + 1) f (i, j, n + 1) f (i, j, n + 1) . + . . . λ f (i, j, n + 1) 0 0 0 . . . . θn,j (62) → Frontera A: (1 + 2λ) −2λ −λ (1 + 2λ) −λ −λ (1 + 2λ) −λ . (1 − 2λ)θ2,j (1 − 2λ)θ2,j (1 − 2λ)θ3,j (1 − 2λ)θn−1,j +λθ1,3 +λθ2,3 +λθ3,3 . . . . +λθn−1,3 n µ µ µ + µ θ1,j θ2,j θ3,j . . . . n+1 = . . . −λ (1 + 2λ) θn−1,j 0 f (i, j, n + 1) λθ 1,1 f (i, j, n + 1) λθ2,1 0 f (i, j, n + 1) 0 λθ3,1 . . + . + . . . . . . . . . λθn−1,1 λ θn,2 f (i, j, n + 1) (63) → Frontera B: λθn−2,2 λθn−2,3 λθn−2,4 λθn−1,n +(1 − 2λ)θn−1,2 +(1 − 2λ)θn−1,3 +(1 − 2λ)θn−1,4 . . . . +(1 − 2λ)θn−1,n n n+1 θn−1,2 2 θn−1,3 θn−1,4 . = . . . . . −2λ (1 + 2λ) θn−1,n f (i, j, n) λθn,2 λ θi,1 f (i, j, n) λθn,3 0 f (i, j, n) λθn,4 0 . . . + + . . . . . . . . . f (i, j, n) λθn,n 0 (1 + 2λ) −λ −λ (1 + 2λ) −λ −λ (1 + 2λ) −λ . . µ µ µ + µ → Frontera C: 24 (64) (1 + 2λ) −2λ −λ (1 + 2λ) −λ −λ (1 + 2λ) −λ . (1 − 2λ)θ1,n (1 − 2λ)θ2,j (1 − 2λ)θ3,j (1 − 2λ)θn−1,n → n+1 2 +2λθ1,n−1 +2λθ2,n−1 +2λθ3,n−1 . . . . +2λθn−1,n−1 n+1 . . −λ (1 + 2λ) θn−1,n 0 µ f (i, j, n) µ f (i, j, n) 0 µ f (i, j, n) 0 . . + + . . . . . . λ θn,n µ f (i, j, n) = (65) Frontera D: (1 + 2λ) −λ n+1 θ1,2 2 θ1,3 θ1,4 . = . . . . . . −2λ (1 + 2λ) θ1,n n λ θi,1 µ f (i, j, n) µ f (i, j, n) 0 µ f (i, j, n) 0 . . + + . . . . . . 0 µ f (i, j, n) −λ (1 + 2λ) −λ −λ (1 + 2λ) −λ . 2λθ2,2 2λθ2,3 2λθ2,4 2λθ2,n 3.2.4. . θ1,n θ2,n θ3,n . . . . +(1 − 2λ)θ1,2 +(1 − 2λ)θ1,3 +(1 − 2λ)θ1,4 . . . . +(1 − 2λ)θ1,4 (66) Implementación computacional: Para realizar la simulación de este caso de estudio utilizando el modelo matemático anteriormente desarrollado, se hizo uso del lenguaje de programación FORTRAN 90, en el Apéndice C se puede observar el archivo .f90 que contiene el código y algoritmo desarrollado. Este código calcula e implementa los factores adimensionalizados β, λ y µ para luego con ellos llenar las dos matrices tridiagonales correspondientes a cada semiciclo del paso en el tiempo , luego mediante el algoritmo de Thomas (Ver [3]) soluciona el sistema matricial obtenido en las expresiones 61 hasta 66, comenzando el primer semiciclo del paso temporal por la frontera D con la expresion 66 y avanzando hasta la frontera B con la expresión B 64, teniendo en cuenta los nodos internos regidos por la expresión 61, y de igual forma realiza el segundo semiciclo empezando por la frontera A (expresión 63) y terminado en la frontera C (expresión 65) pasando por los nodos internos (expresión 62). Las gráficas de evolución en el tiempo de la temperatura a lo largo de la placa se obtuvieron con el software GNUPLOT. 25 3.3. Resultados: Para la simulación del modelo matemático en este caso de estudio se tomaron como parámetros iniciales los siguientes datos: α = 2,0 Tref = 293K Lref = 1,0 Tiempo de Simulacion = 10 seg Paso temporal ∆t = 5x10−4 seg Numero de Nodos = 20 wx = wy = 1 Los resultados obtenidos con estos parámetros se encuentran en el Apéndice D.1 en donde se pueden observar las gráficas para la evolución de la temperatura a lo largo de la placa en el tiempo. En la Graficas 11 hasta 14 se pueden apreciar los perfiles de temperaturas en distintos instantes de tiempo, ademas es evidente como se cumplen las condiciones de frontera en cada paso temporal. por ejemplo, en las fronteras B y C regidas por las expresiones 39 y 40, las cuales son Condiciones de Dirichlet, su temperatura no varia a largo del tiempo, es decir, son constante; de igual manera se cumple para las fronteras C y D cuyas expresiones son 41 y 42 respectivamente, condiciones Nouman nulas, presentado un perfil de temperaturas en estas fronteras que tiene a ser constante en su respectiva dirección normal. Figura 11: Perfil de Temperaturas en t=0.005 seg. Figura 12: Perfil de Temperaturas en t=0.015 seg. Figura 13: Perfil de Temperaturas en t=0.1 seg. Figura 14: Perfil de Temperaturas en t=10 seg. Para un mayor análisis de estudio, se deicidió variar el parámetro α a valores de α = 4,0 y α = 10,0 y observar el comportamiento de los perfiles de temperaturas a lo largo del tiempo. Estos resultados se encuentran en los Apéndices D.2 y D.3. 26 La única diferencia que se observar la realizar esta variación fue la velocidad con la que evoluciona la temperatura a lo largo de la placa, ya que cuando α = 2,0 la placa experimenta un cambio de temperaturas mas rápido que cuando α = 4,0 y con mayor notoriedad cuando α = 10,0. 3.4. Conclusiones: En las diversas situaciones ingenieriles en donde modelos matemáticos se pueden plantear para solucionar determinado problema, estos resultan tener un alto grado de complejidad que dificultan encontrar una solución analı́tica, como por ejemplo, los casos con ecuaciones diferenciales parciales con alto grado de NO linealidad, como se presentó en este caso de estudio. Para ello, se puede recurrir a soluciones numéricas como el método de diferencias finitas, que aunque no den una solución analı́tica general del problema, permite obtener comportamientos del sistema en distintas situaciones, lo que resulta muy útil al momento de toma de decisiones y criterios de diseño. Referencias [1] Richard G. Budynas y J. Keith Nisbett, Diseño en Ingenierı́a Mecánica de Shigley, Octava Edición, McGraw-Hill, Mexico, DF, 2008. [2] Dr. Carlos A. Duque-Daza y M.Sc. J.A. Ramı́rez, Optimización y Ecuaciones Diferenciales Parciales, Curso de Modelación Matemática, Facultad de Ingenierı́a, Universidad Nacional de Colombia, Bogotá DC, Colombia, 2015. [3] Izar Landeta, Juan Manuel, Elementos de métodos numéricos para ingenierı́a, Cuarta Edición, Editorial Universitaria Potosina, Universidad Autónoma de San Luis de Potosı́, México, 1998. [4] CENGEL Yunes y BOLES Michael, Termodinámica Técnica, Séptima edición, McGraw-Hill, Mexico, DF, 2012. 27 Appendices A. Script del Archivo .mod usado para la Optimización en el NEOS # resorte.mod OQR2-MN-2-3 # Original AMPL coding by Elena Bobrovnikova (summer 1996 at Bell Labs). # Ref.: W. Hock and K. Schittkowski, Test Examples for Nonlinear Programming # Codes. Lecture Notes in Economics and Mathematical Systems, v. 187, # Springer-Verlag, New York, 1981, p. 38. # Number of variables: 3 # Number of constraints: 10 # Objective nonseparable # Objective nonconvex # Nonlinear constraints var x{1..3}; minimize Obj: (x[1]+2)*(x[2]^2)*x[3]; s.t. Ineq1: 1-((P*(x[3]^3)*x[1])/(718750*(x[2]^4))) <= 0; s.t. Ineq2: (((8*P*x[3])/(Tao*3.14159*(x[2]^3)))*(((4*x[3]-x[2])/(4*x[3]-4*x[2]))+ ((0.615*x[2])/x[3])))-1 <= 0; s.t. Ineq3: 1-((14054*x[2])/((Omega*x[3]^2)*x[1])) <= 0; s.t. Ineq4: ((x[3]+x[2])/1.5)-1 <= 0; s.t. Bound1: x[1] <= 15; s.t. Bound2: x[1] >= 2; s.t. Bound3: x[2] <= 0.2; s.t. Bound4: x[2] >= 0.05; s.t. Bound5: x[3] <= 1.3; s.t. Bound6: x[3] >= 0.25; data; var x := 1 3 2 0.2 3 1; 28 B. Script del Archivo .f90 usado para la solución numérica del caso de estudio 2 module tiposDatos ! -------------------------------------------------------------------------------! En este modulo solo creamos los tipos de datos, especialmente un tipo de doble ! precision real, independiente de la maquina. --------------------------------! -------------------------------------------------------------------------------integer(kind=SELECTED_INT_KIND(8)), parameter, public :: & ishort = SELECTED_INT_KIND(8), & ilong = SELECTED_INT_KIND(8) integer(kind=SELECTED_INT_KIND(8)), parameter, public :: & rshort = KIND(1.0), & rlong = SELECTED_REAL_KIND(8), & rllong = SELECTED_REAL_KIND(2*precision(1.0_rlong)) integer(kind=SELECTED_INT_KIND(8)), parameter, public :: isp = ishort integer(kind=SELECTED_INT_KIND(8)), parameter, public :: idp = ilong integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rsp = rshort integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rdp = rlong integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rqp = rllong ! -------------------------------------------------------------------------------end module tiposDatos ! -------------------------------------------------------------------------------! Rutinas para solucionar el sistema de ecuaciones representadas en forma matricial ! tanto explicitamente como implicitamente. ! -------------------------------------------------------------------------------module Programas use tiposDatos implicit none contains ! -------------------------------------------------------------------------------! Rutina para resolver matrices tridiagonales de forma implicita: Ax=d ! donde: ! A -> Matriz de Coeficientes ! x -> Vector de Incognitas ! d -> Vector de Valores Conocidos ! En esta rutina se usa el metodo TDMA o algoritmo de Thomas ! -------------------------------------------------------------------------------subroutine implicit(N, matA, vecD, vecX) use tiposDatos implicit none integer(kind=isp), intent(in) :: N real(kind=rdp), dimension(N), intent(in) :: vecD real(kind=rdp), dimension(N,N), intent(in) :: matA real(kind=rdp), dimension(N), intent(out) :: vecX integer(kind=isp) :: i real(kind=rdp), dimension(N) :: vecB, vecG ! -------------------------------------------------------------------------------vecB(1)=matA(1,1) 29 vecG(1)=vecD(1)/vecB(1) do i=2, N vecB(i)=matA(i,i)-(matA(i,i-1)*matA(i-1,i)/vecB(i-1)) vecG(i)=(vecD(i)-(matA(i,i-1)*vecG(i-1)))/vecB(i) enddo ! -------------------------------------------------------------------------------vecX(N)=vecG(N) do i=N-1,1, -1 vecX(i)=vecG(i)-(matA(i,i+1)*vecX(i+1)/vecB(i)) enddo ! -------------------------------------------------------------------------------return end subroutine implicit ! -------------------------------------------------------------------------------! Rutina para resolver matrices tridiagonales de forma explicita: Ad=x ! donde: ! A -> Matriz de Coeficientes ! x -> Vector de Incognitas ! d -> Vector de Valores Conocidos ! En esta rutina se usa el metodo de multiplicacion de Matrices Tridiagonales ! -------------------------------------------------------------------------------subroutine explicit(N, matA, vecD, vecX) use tiposDatos implicit none integer(kind=isp), intent(in) :: N real(kind=rdp), dimension(N), intent(in) :: vecD real(kind=rdp), dimension(N,N), intent(in) :: matA real(kind=rdp), dimension(N), intent(out) :: vecX integer(kind=isp) :: i ! -------------------------------------------------------------------------------vecX(1)=(matA(1,1)*vecD(1))+(matA(1,2)*vecD(2)) do i = 2, N-1 vecX(i)=(matA(i,i-1)*vecD(i-1))+(matA(i,i)*vecD(i))+(matA(i,i+1)*vecD(i+1)) enddo vecX(N)=(matA(N,N-1)*vecD(N-1))+(matA(N,N)*vecD(N)) ! -------------------------------------------------------------------------------return end subroutine explicit ! -------------------------------------------------------------------------------! -------------------------------------------------------------------------------! -------------------------------------------------------------------------------end module Programas 30 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! -------------------------------------------------------------------------------******************************************************************************** --------------------------------------------------------------------------------------------------------------------------------------------------------------PROGRAMA PRINCIPAL PARA PROBLEMA DE ADVECCION-DIFUSION-REACCION EN UN REACTOR QUIMICO -------------------------------------------------------------------------------Programa para resolver numericamente la concentracion de un reactivo a lo largo de un reactor quimico de seccion transversal constante, usando diferencias finitas centradas en el espacio y Crank-Nicolson en el tiempo, resultanto una ecuacion matricial de la forma: Ax=By+BC Donde: A -> Matriz de Coeficientes para los nodos en el tiempo n+1 (Implicito) X -> Vector de Incognitas de nodos en el tiempo n+1 B -> Matriz de Coeficientes para el tiempo n (Explicito) y -> Vector de Valores conocidos de nodos en el tiempo n BC -> Vector de Condiciones de Frontera -------------------------------------------------------------------------------- program Reactor use tiposDatos use Programas implicit none real(kind=rdp) real(kind=rdp) real(kind=rdp) real(kind=rdp) real(kind=rdp) :: :: :: :: :: D L U cref k ! Coeficiente de Difusion ! Distancia Longitudinal ! Velocidad Promedio de flujo de reactivo ! Valor de Referencia de Concentracion ! Velocidad de reaccion del reactivo real(kind=rdp) :: tiempo real(kind=rdp) :: dt integer(kind=isp) :: N ! Tiempo de Simulacion ! Saltos en el tiempo ! Cantidad de Nodos en dividir la Longitud real(kind=rdp), dimension(:), allocatable :: vecX, vecY, vecBC, vecT real(kind=rdp), dimension(:,:), allocatable :: matA, matB, matResultados real(kind=rdp) :: beta, alfa, phi, mi, theta, eta, gama, rho, psi integer(kind=isp) :: i, j, pasos real(kind=rdp) :: dx character(len=20) :: formatoResultados ! -------------------------------------------------------------------------------! Se leen los datos de entrada del problema ! -------------------------------------------------------------------------------open(unit=35, file=’datosReactor.txt’, action=’read’) read(35,*) D, L, U, cref, k read(35,*) tiempo, dt read(35,*) N 31 ! -------------------------------------------------------------------------------! Se calcula el tama~ no de grilla espacial y el numero de pasos en el tiempo ! -------------------------------------------------------------------------------dx = L/N pasos = floor(tiempo/dt) ! -------------------------------------------------------------------------------! Se adimencionalizan el tama~ no de grilla y los saltos temporales ! -------------------------------------------------------------------------------dx = dx/L dt = dt*U/L ! -------------------------------------------------------------------------------! Se calcula el dt apropiado para cumplir el criterio de estabilidad ! -------------------------------------------------------------------------------print*," " print*,"-----------------------------------------------------------" print*,"Para que el sistema sea estable, el DT debe ser menor a", & & 1.0D0/(((2.0D0*D)/(U*L*dx**2.0D0))+((L*k)/(2.0D0*U))) print*,’El numero de puntos en X es: ’, N print*,’El numero de puntos en T es: ’, pasos print*,’El tamanho de grilla en X es: ’, dx print*,’El tamanho de grilla en T es: ’, dt print*,"-----------------------------------------------------------" print*," " ! -------------------------------------------------------------------------------! Se calculan los valores de Beta y Alfa resultantes de la adimensionalizacion de ! la ecuacion diferencial parcial ! -------------------------------------------------------------------------------beta = D/(U*L) alfa = (L*k)/U ! -------------------------------------------------------------------------------! Se calculan los valores de Phi, Mi y Theta resultantes del Planteamiento ! discreto en diferencias finitas centradas en el espacio y Crank-Nicolson en el ! tiempo ! -------------------------------------------------------------------------------phi = beta*dt/(2.0D0*(dx**2.0D0)) mi = dt/(4.0D0*dx) theta = dt*alfa/2.0D0 ! -------------------------------------------------------------------------------! Se calculan los valores de Eta, Gama y Rho resultantes del reordenamiento y ! agrupacion de terminos en la ecuaciones discreta ! -------------------------------------------------------------------------------eta = (2.0D0*phi) + theta gama = phi - mi rho = phi + mi ! -------------------------------------------------------------------------------! Se calcula en valor Psi resultante de las condiciones de frontera ! -------------------------------------------------------------------------------psi = rho*dx/beta 32 ! -------------------------------------------------------------------------------! Se procede a llenar la Matriz Tridiagonal A (Implicita) ! -------------------------------------------------------------------------------allocate(matA(N,N)) matA = 0.0D0 matA(1,1) = (2.0D0*psi) + 1.0D0 + eta matA(1,2) = -(rho + gama) do i=2, N-1 matA(i,i-1) = -rho matA(i,i) = (1.0D0 + eta) matA(i,i+1) = -gama enddo matA(N,N-1) = -(rho + gama) matA(N,N) = (1.0D0 + eta) ! -------------------------------------------------------------------------------! Se procede a llenar la Matriz Tridiagonal B (Explicita) ! -------------------------------------------------------------------------------allocate(matB(N,N)) matB=0.0D0 matB(1,1) = -(2.0D0*psi) + 1.0D0 - eta matB(1,2) = (rho + gama) do i=2, N-1 matB(i,i-1) = rho matB(i,i) = (1.0D0 - eta) matB(i,i+1) = gama enddo matB(N,N-1) = (rho + gama) matB(N,N) = (1.0D0 - eta) ! -------------------------------------------------------------------------------! Se procede a llenar el Vector de Condicones de Frotenra ! -------------------------------------------------------------------------------allocate(vecBC(N)) vecBC = 0.0D0 vecBC(1) = 4.0D0*psi ! -------------------------------------------------------------------------------! Se procede a llenar el Vector de Valores Conocidos ! -------------------------------------------------------------------------------allocate(vecY(N)) vecY = 0.0D0 ! -------------------------------------------------------------------------------! Se procede a crear la matriz de resultados y escribir en la primera columna los ! Nodos y en la segunda las Condiciones Iniciales ! -------------------------------------------------------------------------------allocate(matResultados(N, pasos+2)) 33 do i=1,N matResultados(i,1) = dx*dble(i) enddo do i=1,N matResultados(i,2) = vecY(i) enddo ! -------------------------------------------------------------------------------! Se da inicio a la solucion numerica del problema ! -------------------------------------------------------------------------------allocate(vecX(N)) allocate(vecT(N)) do j=1,pasos ! -------------------------------------------------------------------------------! Se procede a Realizar la multiplicacion de la matriz A y el Vector Y (lado ! derecho de la ecuacion) para conocer el vector de valores conocidos. ! -------------------------------------------------------------------------------call explicit(N, matB, vecY, vecT) vecY = vecT+vecBC ! -------------------------------------------------------------------------------! Se procede a resolver el sistema matricial del lado izquierdo de la ecuacion ! (Implicito) por medio de LTDM ! -------------------------------------------------------------------------------call implicit(N, matA, vecY, vecX) vecY = vecX ! -------------------------------------------------------------------------------! Se escriben el vector Solucion X en la matriz de Resultados ! -------------------------------------------------------------------------------do i=1, N matResultados(i,j+2)=vecY(i) enddo enddo ! -------------------------------------------------------------------------------! Se crea el archivo de Salida de Resultados ! -------------------------------------------------------------------------------open(unit=99, file=’Resultados.dat’, action=’write’, status=’unknown’) ! ! ! ! ! ! -------------------------------------------------------------------------------Se copian la matriz de resultados en el archivo de salida -------------------------------------------------------------------------------Aca vamos a crear el formato de escritura. La razon de esto es que el numero de pasos de tiempo no es conocido de antemano, y necesitamos definir el formato adecuadamente. if (pasos+2 < 10) then write(formatoResultados,’(A1,I1,A12)’) ’(’,pasos+2,’(ES14.7,3X))’ else if (pasos+2 < 100 ) then 34 write(formatoResultados,’(A1,I2,A12)’) ’(’,pasos+2,’(ES14.7,3X))’ else if (pasos+2 < 1000 ) then write(formatoResultados,’(A1,I3,A12)’) ’(’,pasos+2,’(ES14.7,3X))’ else if (pasos+2 < 10000 ) then write(formatoResultados,’(A1,I4,A12)’) ’(’,pasos+2,’(ES14.7,3X))’ else if (pasos+2 < 100000 ) then write(formatoResultados,’(A1,I5,A12)’) ’(’,pasos+2,’(ES14.7,3X))’ else print*, ’Error con la definicion de formato para la escritura de resultados...’ print*, ’Mire el archivo fuente en la linea 197’ stop endif print*, ’Formato de escritura es: ’, formatoResultados ! -------------------------------------------------------------------------------do i=1,N write(99,formatoResultados) matResultados(i,1)*L, (matResultados(i,j)*cref, j=2,pasos+2) enddo ! -------------------------------------------------------------------------------- close(99) stop contains end program Reactor C. Script del Archivo .f90 usado para la solución numérica del caso de estudio 3 module tiposDatos ! -------------------------------------------------------------------------------! En este modulo solo creamos los tipos de datos, especialmente un tipo de doble ! precision real, independiente de la maquina. --------------------------------! -------------------------------------------------------------------------------integer(kind=SELECTED_INT_KIND(8)), parameter, public :: & ishort = SELECTED_INT_KIND(8), & ilong = SELECTED_INT_KIND(8) integer(kind=SELECTED_INT_KIND(8)), parameter, public :: & rshort = KIND(1.0), & rlong = SELECTED_REAL_KIND(8), & rllong = SELECTED_REAL_KIND(2*precision(1.0_rlong)) integer(kind=SELECTED_INT_KIND(8)), parameter, public :: isp = ishort integer(kind=SELECTED_INT_KIND(8)), parameter, public :: idp = ilong integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rsp = rshort integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rdp = rlong integer(kind=SELECTED_INT_KIND(8)), parameter, public :: rqp = rllong ! -------------------------------------------------------------------------------end module tiposDatos ! ! ! ! -------------------------------------------------------------------------------Rutinas para solucionar el sistema de ecuaciones representadas en forma matricial tanto explicitamente como implicitamente. -------------------------------------------------------------------------------- 35 module Programas use tiposDatos implicit none contains ! -------------------------------------------------------------------------------! Rutina para resolver matrices tridiagonales de forma implicita: Ax=d ! donde: ! A -> Matriz de Coeficientes ! x -> Vector de Incognitas ! d -> Vector de Valores Conocidos ! En esta rutina se usa el metodo TDMA o algoritmo de Thomas ! -------------------------------------------------------------------------------subroutine implicit(N, matA, vecD, vecX) use tiposDatos implicit none integer(kind=isp), intent(in) :: N real(kind=rdp), dimension(N), intent(in) :: vecD real(kind=rdp), dimension(N,N), intent(in) :: matA real(kind=rdp), dimension(N), intent(out) :: vecX integer(kind=isp) :: i real(kind=rdp), dimension(N) :: vecB, vecG ! -------------------------------------------------------------------------------vecB(1)=matA(1,1) vecG(1)=vecD(1)/vecB(1) do i=2, N vecB(i)=matA(i,i)-(matA(i,i-1)*matA(i-1,i)/vecB(i-1)) vecG(i)=(vecD(i)-(matA(i,i-1)*vecG(i-1)))/vecB(i) enddo ! -------------------------------------------------------------------------------vecX(N)=vecG(N) do i=N-1,1, -1 vecX(i)=vecG(i)-(matA(i,i+1)*vecX(i+1)/vecB(i)) enddo ! -------------------------------------------------------------------------------return end subroutine implicit ! -------------------------------------------------------------------------------! Rutina para resolver matrices tridiagonales de forma explicita: Ad=x ! donde: ! A -> Matriz de Coeficientes ! x -> Vector de Incognitas ! d -> Vector de Valores Conocidos ! En esta rutina se usa el metodo de multiplicacion de Matrices Tridiagonales ! -------------------------------------------------------------------------------subroutine explicit(N, matA, vecD, vecX) use tiposDatos implicit none 36 integer(kind=isp), intent(in) :: N real(kind=rdp), dimension(N), intent(in) :: vecD real(kind=rdp), dimension(N,N), intent(in) :: matA real(kind=rdp), dimension(N), intent(out) :: vecX integer(kind=isp) :: i ! -------------------------------------------------------------------------------vecX(1)=(matA(1,1)*vecD(1))+(matA(1,2)*vecD(2)) do i = 2, N-1 vecX(i)=(matA(i,i-1)*vecD(i-1))+(matA(i,i)*vecD(i))+(matA(i,i+1)*vecD(i+1)) enddo vecX(N)=(matA(N,N-1)*vecD(N-1))+(matA(N,N)*vecD(N)) ! -------------------------------------------------------------------------------return end subroutine explicit ! -------------------------------------------------------------------------------! Funcion que modela el factor de fuente de calor ! -------------------------------------------------------------------------------real*8 function fuente(t, x, y, wx, wy) real*8 :: t, x, y, wx, wy fuente= ((6.0D0/(1+exp(-t)))-3.0D0)*exp(-(((x-0.5D0)/wx)**2.0D0)-(((y-0.5D0)/wy)**2.0D0)) end function fuente ! -------------------------------------------------------------------------------! -------------------------------------------------------------------------------! -------------------------------------------------------------------------------end module Programas program Placa use tiposDatos use Programas implicit none real(kind=rdp) :: real(kind=rdp) :: real(kind=rdp) :: real(kind=rdp) :: integer(kind=isp) real(kind=rdp) :: real(kind=rdp) :: alfa Tref L dh, dt :: N TA, TB wx, wy !Coeficiente de Difusividad !Temperatura de Referencia !Longitud de la placa en "x" y "y" !Saltos espaciales en "x" y "y" y saltos temporales !Numero de nodos que se dividiran la placa !Temperatura en las Fronteras A y B de la placa !rangos de la funcion de generacion de calor real(kind=rdp), DIMENSION(:,:), allocatable :: matA, matB, matResultados, matTemp real(kind=rdp), DIMENSION(:), allocatable :: vecGen, vecFA, vecFB, vecX, vecY real(kind=rdp) :: tiempo 37 real(kind=rdp) :: theta, beta, lambda, miu, thetaA, thetaB integer(kind=isp) :: pasos, i, j, k, t character(len=20) :: formatoResultados ! -------------------------------------------------------------------------------! Se leen los datos de entrada del problema ! -------------------------------------------------------------------------------open(unit=35, file=’datosPlaca.txt’, action=’read’) read(35,*) read(35,*) read(35,*) read(35,*) read(35,*) alfa, TA, TB, Tref L tiempo, dt N wx, wy ! -------------------------------------------------------------------------------! Se calcula en tama~ no de la grilla espacial y el numero de pasos en el tiempo ! -------------------------------------------------------------------------------dh = L/N print*, "El tama~ no de grilla es de: ", dh pasos = floor(tiempo/dt) print*, "El numero de pasos en el tiempo es de: ", pasos ! -------------------------------------------------------------------------------! Se calcula el factor beta que adimencionaliza el coeficiente de la fuente ! -------------------------------------------------------------------------------beta = (L**2.0D0)/(alfa*Tref) print*, "El factor beta es de: ", beta ! -------------------------------------------------------------------------------! Se calcula el factor lambda y miu resultante de la discretizacion de las ! ecuaciones ! -------------------------------------------------------------------------------lambda = dt/(2.0D0*dh*dh) miu = dt*beta/2.0D0 print*, "el factor lambda es de: ", lambda print*, "el factor miu es de: ", miu ! -------------------------------------------------------------------------------! Se calcula el beta adimensional en las forteras A y B por C. Dirichlet ! -------------------------------------------------------------------------------thetaA = (TA-Tref)/Tref thetaB = (TB-Tref)/Tref print*, "el factor ThetaA es de: ", ThetaA print*, "el factor ThetaB es de: ", ThetaB ! -------------------------------------------------------------------------------! Se proceden a llenar las matrices A y B resultantes del analisis para cada ! nodo en el tiempo n y n+1 ! -------------------------------------------------------------------------------allocate(matA(N-1,N-1)) matA = 0.0D0 matA(1,1) = 1.0D0 + 2.0D0*lambda 38 matA(1,2) = -lambda do i=2, N-2 matA(i,i-1) = -lambda matA(i,i) = 1.0D0 + 2.0D0*lambda matA(i,i+1) = -lambda enddo matA(N-1,N-2) = -2.0D0*lambda matA(N-1,N-1) = 1.0D0 + 2.0D0*lambda ! -------------------------------------------------------------------------------allocate(matB(N-1,N-1)) matB = 0.0D0 matB(1,1) = 1.0D0 + 2.0D0*lambda matB(1,2) = -2.0D0*lambda do i=2, N-2 matB(i,i-1) = -lambda matB(i,i) = 1.0D0 + 2.0D0*lambda matB(i,i+1) = -lambda enddo matB(N-1,N-2) = -lambda matB(N-1,N-1) = 1.0D0 + 2.0D0*lambda ! -------------------------------------------------------------------------------! Se procede a llenar los vectores de condiciones de Frontera ! -------------------------------------------------------------------------------allocate(vecFA(N-1),vecFB(N-1)) vecFA = 0.0D0 vecFA(1) = lambda*thetaA vecFB = 0.0D0 vecFB(N-1) = lambda*thetaB ! -------------------------------------------------------------------------------! Se procede a llenar la matriz temporal solucion con los valores iniciales ! -------------------------------------------------------------------------------allocate(matTemp(N,N)) matTemp=0.0D0 do i=1,N matTemp(i,1) = thetaA enddo do j=1,N matTemp(N,j) = thetaB enddo ! -------------------------------------------------------------------------------- 39 ! Se procede a llenar la matriz de resultados con las condiciones inciales del ! problema ! -------------------------------------------------------------------------------allocate(matResultados(N*N,pasos+3)) do i=1,N do j=1,N matResultados(j+(i-1)*N,1) = i matResultados(j+(i-1)*N,2) = j matResultados(j+(i-1)*N,3) = matTemp(i,j) enddo enddo ! -------------------------------------------------------------------------------! Se procede a dar comienzo a la solucion numerica por el metodo de ADI al ! caso de estudio ! -------------------------------------------------------------------------------allocate(vecX(N-1),vecY(N-1), vecGen(N-1)) do t=1,pasos ! -------------------------------------------------------------------------------! Se realiza la implemetacion numerica para cuando x->explicito, y->implicito ! -------------------------------------------------------------------------------do i=1,N-1 ! -------------------------------------------------------------------------------! Primero se realiza la implementacion numerica a la frontera D (Lado izquierdo ! de la placa) if (i==1) then do j=2,N vecX(j-1) = (1.0D0 - 2.0D0*lambda)*matTemp(i,j) + 2.0D0*lambda*matTemp(i+1,j) vecGen(j-1) = miu*fuente(dble(t)*dt, dble(i)*dh, dble(j)*dh, wx, wy) enddo vecX = vecX + vecGen + vecFA call implicit(N-1, matA, vecX, vecY) do j=2,N matTemp(i,j)=vecY(j-1) enddo ! -------------------------------------------------------------------------------! Primero se realiza la implementacion numerica a la frontera B (Lado derecho ! de la placa) else if (i==N-1) then do j=2,N vecX(j-1) = lambda*matTemp(i-1,j) + (1.0D0 - 2.0D0*lambda)*matTemp(i,j) + lambda vecGen(j-1) = miu*fuente(dble(t)*dt, dble(i)*dh, dble(j)*dh, wx, wy) enddo 40 vecX = vecX + vecGen + vecFA call implicit(N-1, matA, vecX, vecY) do j=2,N matTemp(i,j)=vecY(j-1) enddo ! -------------------------------------------------------------------------------! Primero se realiza la implementacion numerica a los columnas internas de la ! placa else do j=2,N vecX(j-1) = lambda*matTemp(i-1,j) + (1.0D0 - 2.0D0*lambda)*matTemp(i,j) + lambda vecGen(j-1) = miu*fuente(dble(t)*dt, dble(i)*dh, dble(j)*dh, wx, wy) enddo vecX = vecX + vecGen + vecFA call implicit(N-1, matA, vecX, vecY) do j=2,N matTemp(i,j)=vecY(j-1) enddo endif enddo ! -------------------------------------------------------------------------------! Se realiza la implemetacion numerica para cuando y->explicito, x->implicito ! -------------------------------------------------------------------------------do j=2,N ! -------------------------------------------------------------------------------! Se realiza la implementacion numerica a la frontera A (Lado inferior de la ! placa) if (j==2) then do i=1,N-1 vecX(i) = lambda*thetaA + (1.0D0 - 2.0D0*lambda)*matTemp(i,j) + lambda*matTemp(i vecGen(i) = miu*fuente((dble(t)+0.5D0)*dt, dble(i)*dh, dble(j)*dh, wx, wy) enddo vecX = vecX + vecGen + vecFB call implicit(N-1, matB, vecX, vecY) 41 do i=1,N-1 matTemp(i,j)=vecY(i) enddo ! -------------------------------------------------------------------------------! Se realiza la implementacion numerica a la frontera C (Lado superior de la ! placa) else if (j==N) then do i=1,N-1 vecX(i) = 2.0D0*lambda*matTemp(i,j-1) + (1.0D0 - 2.0D0*lambda)*matTemp(i,j) vecGen(i) = miu*fuente(dble(t)*dt, dble(i)*dh, dble(j)*dh, wx, wy) enddo vecX = vecX + vecGen + vecFB call implicit(N-1, matB, vecX, vecY) do i=1,N-1 matTemp(i,j)=vecY(i) enddo ! -------------------------------------------------------------------------------! Se realiza la implementacion numerica a las filas internas de la placa else do i=1,N-1 vecX(i) = lambda*matTemp(i,j-1) + (1.0D0 - 2.0D0*lambda)*matTemp(i,j) + lambda*m vecGen(i) = miu*fuente(dble(t)*dt, dble(i)*dh, dble(j)*dh, wx, wy) enddo vecX = vecX + vecGen + vecFB call implicit(N-1, matB, vecX, vecY) do i=1,N-1 matTemp(i,j)=vecY(i) enddo endif enddo ! -------------------------------------------------------------------------------! Se imprimen los datos de la matTemp en la matriz de Resultados do i=1,N do j=1,N matResultados(j+(i-1)*N,t+3) = matTemp(i,j) enddo enddo enddo 42 ! -------------------------------------------------------------------------------! Se crea el archivo de Salida de Resultados ! -------------------------------------------------------------------------------open(unit=99, file=’Resultados.dat’, action=’write’, status=’unknown’) ! ! ! ! ! ! -------------------------------------------------------------------------------Se copian la matriz de resultados en el archivo de salida -------------------------------------------------------------------------------Aca vamos a crear el formato de escritura. La razon de esto es que el numero de pasos de tiempo no es conocido de antemano, y necesitamos definir el formato adecuadamente. if (pasos+3 < 10) then write(formatoResultados,’(A1,I1,A12)’) ’(’,pasos+2,’(ES14.7,3X))’ else if (pasos+3 < 100 ) then write(formatoResultados,’(A1,I2,A12)’) ’(’,pasos+2,’(ES14.7,3X))’ else if (pasos+3 < 1000 ) then write(formatoResultados,’(A1,I3,A12)’) ’(’,pasos+2,’(ES14.7,3X))’ else if (pasos+3 < 10000 ) then write(formatoResultados,’(A1,I4,A12)’) ’(’,pasos+2,’(ES14.7,3X))’ else if (pasos+3 < 100000 ) then write(formatoResultados,’(A1,I5,A12)’) ’(’,pasos+2,’(ES14.7,3X))’ else print*, ’Error con la definicion de formato para la escritura de resultados...’ print*, ’Mire el archivo fuente en la linea 197’ stop endif print*, ’Formato de escritura es: ’, formatoResultados ! -------------------------------------------------------------------------------do i=1,N*N write(99,formatoResultados) matResultados(i,1)*dh, matResultados(i,2)*dh, ((matResultados(i, enddo ! -------------------------------------------------------------------------------- close(99) stop contains 43 D. D.1. Resultados Gráficos de la implementación computacional del modelo matemático para el caso de estudio 3 Gráficas de evolución en el tiempo de la temperatura a lo largo de placa para α = 2,0 Figura 15 Figura 16 Figura 17 Figura 18 Figura 19 Figura 20 44 D.2. D.3. Gráficas de evolución en el tiempo de la temperatura a lo largo de placa para α = 4,0 Figura 21 Figura 22 Figura 23 Figura 24 Figura 25 Figura 26 Gráficas de evolución en el tiempo de la temperatura a lo largo de placa para α = 10,0 Figura 27 Figura 28 45 Figura 29 Figura 30 Figura 31 Figura 32 46