Soluções numéricas da equação de Blasius Nelson Luís Dias nldias@ufpr.br 2 de julho de 2009 Uma camada-limite laminar sobre uma placa plana sem gradiente de pressão longitudinal pode ser resolvida com f + 1 2 f f = 0 (1) sujeita às condições de contorno onde e f (0) = 0, f (0) = 0, f ( ) = 1 (2) f (η) = Ψ(x,y) U δ(x) η = y δ(x) δ(x) = (3) (4) νx U. (5) As condições 2 não configuram um problema de valor inicial clássico, mas sim um problema de valor de contorno. Mesmo assim, vale a pena a seguinte abordagem. A mudança de variáveis u 1 = f, u 2 = f, u 3 = f, (6) produz o seguinte sistema autônomo de equações diferenciais ordinárias: u d 1 u 2, u 2 = u 3, (7) u 3 2 1u 1u 3 Este sistema pode agora ser resolvido com 3 condições iniciais u 1 (0) = 0, u 2 (0) = 0, u 3 (0) = γ (8) 1
onde γ é um valor inicial arbitrário para f (0). A solução de 7 pode ser obtida com o seguinte programa em C: blasius.c blasius.c: tentativa de resolver a camada-limite laminar Nelson Luís Dias 2002-06-05T00:00:00 2009-07-02T08:43:57 atualizado para TT770 Teoria de Camadas-Limite #include <assert.h> #include <stdio.h> #include <stdlib.h> rkvetor: uma implementação de um runge-kutta multidimensional Nelson Luís Dias 20020528 20020528 void rkvetor( long m, número de equações diferenciais ordinárias do sistema == tamanho de y double xn, ponto de avaliação double h, passo que vou dar double *yn, valor atual da função void ff(long, double, double *, double *), double *ynew novo valor da função ) { variáveis long i; contador double h2 = h/2.0, h/2 h3 = h/3.0, h/3 h6 = h/6.0 ; h/6 double *k1, *k2, *k3, *k4, *yaux ; auxiliar aloca memória k1 = (double *) calloc(m,sizeof(double)); k2 = (double *) calloc(m,sizeof(double)); k3 = (double *) calloc(m,sizeof(double)); k4 = (double *) calloc(m,sizeof(double)); yaux = (double *) calloc(m,sizeof(double)); primeira chamada de ff ff(m,xn,yn,k1); ----------------------- mais uma linha de comentários ----------------------- yaux[i] = yn[i] + k1[i]*h2 ; segunda chamada de ff ff(m,xn+h2,yaux,k2); yaux[i] = yn[i] + k2[i]*h2 ; 2
terceira chamada de ff ff(m,xn+h2,yaux,k3) ; yaux[i] = yn[i] + k3[i]*h ; quarta e última chamda de ff ff(m,xn+h,yaux,k4); finalmente, avalia a função ynew[i] = yn[i] + k1[i]*h6 + k2[i]*h3 + k3[i]*h3 + k4[i]*h6 ; desaloca memória free(k1) ; free(k2) ; free(k3) ; free(k4) ; free(yaux) ; retorna return ; aqui eu declaro o sistema de equações diferenciais na forma de uma function void blasius( long m, o número de equações: deve ser sempre igual a 3! double t, o instante de tempo double *omega, o vetor de velocidades angulares double *domdt as derivadas ) { calcula as derivadas domdt[0] = omega[1] ; domdt[1] = omega[2] ; domdt[2] = -omega[0]*omega[2]/2.0 ; return ; outros parâmetros da simulação #define deltat 0.1 intervalo de tempo da simulação #define tmax 20.0 tempo de simulação pointers to pointers... typedef double *vetor ; aqui começa o programa principal int main(int argc, char* argv[]) { long old, índice do vetor de incógnitas new, idem it, índice do tempo nt = tmax/deltat ; double t ; número de intervalos de tempo de simulação um instante de tempo qualquer 3
vetor omega[2] ; o único argumento de blasius é o valor inicial assert (argc == 2) ; double gamma ; sscanf(argv[1],"%lf",&gamma) ; aloca memória para omega ; omega[0] = (double *) calloc(3,sizeof(double)); omega[1] = (double *) calloc(3,sizeof(double)); inicializa omega omega[0][0] = 0.0 ; omega[0][1] = 0.0 ; omega[0][2] = gamma ; imprime um cabeçalho printf("#123456789012345678901234567890123456789012345678901234567890123456789\n"); printf("# tempo f f\ f\ \ \n"); printf("%15.8lf %12.6le %12.6le %12.6e\n",0.0,omega[0][0],omega[0][1],omega[0][2]); sem mais delongas, faço um loop no tempo old = 0 ; new = 1 ; for ( it = 0 ; it < nt ; it++ ) { t = it*deltat ; rkvetor(3,t,deltat,omega[old],blasius,omega[new]) ; imprime uma linha de simulação printf("%15.8lf %+12.6e %+12.6e %+12.6e\n",t+deltat, omega[new][0],omega[new][1],omega[new][2]); olá troca os índices de old e new old = new ; new =! new ; return(0); último comentário do programa! 4
Sucessivas rodadas de blasius.c produzem a seguinte tabela: γ f ( ) 0.1 0.449 0.2 0.731 0.3 0.934 0.4 1.132 0.35 1.035 0.32 0.975 0.33 0.995 0.335 1.005 0.334 1.003 0.333 1.001 0.3325 1.0008 0.3322 1.0002 1.0 2.085409 Se o processo todo estiver certo, então a última saída deve ter gerado o perfil de velocidade O seguinte script de gnuplot deve plotar o resultado: blasius.plt set terminal postscript eps enhanced "Times-Roman" 18 set xlabel {/Symbol h set ylabel {/Times-Italic u/u_{/symbol \245 set output blasius.eps set grid plot blasius.out using 1:3 notitle with lines lt 1 lw 2!epstopdf blasius.eps f (η) = u U (9) 5
O resultado pode ser visto na figura abaixo: 1.2 1 0.8 u/u 0.6 0.4 0.2 0 0 5 10 15 20 η 1 Uma alternativa (Liggett, 1994, p. 196) Sugere a seguinte alternativa para definir condições de contorno em η = 0, e consequentemente produzir um problema de valor inicial desde o início: f = αg, (10) ξ = βη (11) Agora, em ξ = η = 0, a derivada segunda de f (que nós acabamos de determinar por tentativa-eerro acima) é f (0) = γ. A derivada segunda de g em relação a ξ será d 2 g 2 = d = d = 1 d 2 g β 2 = 1 d 2 g β 2 2 = 1 αβ 2 d 2 g 2 = 1 β d = 1 αβ 2 d 2 f 2. (12) 6
Então, Agora, imponha γ/(αβ 2 ) = 1, de tal modo que d 2 g(0)/ 2 = 1. d 2 g 2 = 1 d 2 f 0 αβ 2 2 = γ 0 αβ 2. (13) Voltando à equação diferencial original, d( f /α) = d(βη) = 1 d f αβ (14) d 2 g 2 = 1 d 2 f αβ 2 2 (15) d 3 g 3 = 1 d 3 f αβ 3 3 (16) 2 f + f f = 0, 2αβ 3 g + αgαβ 2 g = 0 (17) É conveniente agora fazer α = β, de modo que a equação (17) torna-se 2g + gg = 0. (18) Trata-se evidentemente da mesma equação de Blasius, porém com condições iniciais diferentes. A sua solução levará à obtenção do valor de α: de (14), lim ξ = 1 α 2 lim d f η = 1 α 2. (19) Rodando blasius de novo com f (0) = 1 (na verdade, g (0) = 1!), g ( ) = 2.085409 (veja a última linha da tabela, convenientemente inserida à espera deste momento); α = 0.69247544534044858, e γ = α 3 = 0.33205737835621146 = f (0), o que concorda com nosso resultado anterior obtido por tentativa-e-erro. Referências Liggett, J. A. (1994). Fluid Mechanics. McGraw-Hill, New York. 7