/*************************************************************************** * Copyright (C) 2009 by Douglas Castro * * douglas@ime.unicamp.br * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _TIMESTEP_H_ #define _TIMESTEP_H_ #include #include #include #include "fluxo.h" #include "arvore.h" #include "definicoes.h" /** * Primeiro passo de Runge-Kutta2. Toma um vetor no tempo n e devolve no tempo * n+1/2. No caso em que c (velocidade) e negativa os parametros vao de i-1...1+2 * e no caso em que c nao e constante usamos i-2...i+2 * @param u1 [in] valor da media na celula i-2 (caso necessario, depende de c) * @param u2 [in] valor da media na celula i-1 * @param u3 [in] valor da media na celula i * @param u4 [in] valor da media na celula i+1 * @param u5 [in] valor da media na celula i+2 (caso necessario, depende de c) * @param Dt [in] tamanho do passo no tempo * @param Dx [in] tamanho da celula * @param c [in] velocidade de adveccao (EDP) */ double rk1ndv2(int d, int prof, VFl pc[], double Dt, double ex, double xmin[], double xmax[], Fluxo f); /** * Segundo passo de Runge-Kutta2. Toma um vetor no tempo n+1/2 e devolve no tempo * n+1. No caso em que c (velocidade) e negativa os parametros vao de i-1...1+2 * e no caso em que c nao e constante usamos i-2...i+2 * @param u1 [in] valor da media na celula i-2 (caso necessario, depende de c) * @param u2 [in] valor da media na celula i-1 * @param u3 [in] valor da media na celula i * @param u4 [in] valor da media na celula i+1 * @param u5 [in] valor da media na celula i+2 no momento eh o valor de ui em tempo n (caso necessario, depende de c) * @param Dt [in] tamanho do passo no tempo * @param Dx [in] tamanho da celula * @param c [in] velocidade de adveccao (EDP) */ double rk2ndv2(int d, int prof, VFl pc[], double Dt, double ex, double xmin[], double xmax[], Fluxo f); /** * calcula o o valor da solucao no tempo n+1/2. isto e, o primeiro passo de Runge-Kutta2 * @param d [in] dimensao do dominio * @param prof [in] profundidade na arvore * @param pac [in] pacote com fluxo em algumas celulas e ponteiros para nos da arvore. * @param xmin [in] coordenadas do vertice inferior de uma celula * @param xmax [in] coordenadas do vertice superior de uma celula * @param Dt [in] passo no tempo, por definicao eh o passo necessario para ter estabilidade na malha mais fina * @param f [in] Fluxo continuo (EDP) u_t + div f = u_t + f(u)_x = 0 */ void avancaTempoMeio(int d, int prof, VFl pac[], double xmin[], double xmax[], double Dt, Fluxo f); /** * calcula o o valor da solucao no tempo n+1. isto e, o segundo passo de Runge-Kutta2 * @param d [in] dimensao do dominio * @param prof [in] profundidade na arvore * @param pac [in] pacote com fluxos e ponteiros para nos da arvore. * @param xmin [in] coordenadas do vertice inferior de uma celula * @param xmax [in] coordenadas do vertice superior de uma celula * @param Dt [in] passo no tempo, por definicao eh o passo necessario para ter estabilidade na malha mais fina * @param f [in] fluxo continuo (EDP) */ void avancaTempoUm(int d, int prof, VFl pac[], double xmin[], double xmax[], double Dt, Fluxo f); /** * Runge-Kutta 3 ordem */ /** * Primeiro passo de Runge-Kutta3. Toma um vetor no tempo n e devolve no tempo * n+1/2. No caso em que c (velocidade) e negativa os parametros vao de i-1...1+2 * e no caso em que c nao e constante usamos i-2...i+2 * @param u1 [in] valor da media na celula i-2 (caso necessario, depende de c) * @param u2 [in] valor da media na celula i-1 * @param u3 [in] valor da media na celula i * @param u4 [in] valor da media na celula i+1 * @param u5 [in] valor da media na celula i+2 (caso necessario, depende de c) * @param Dt [in] tamanho do passo no tempo */ double rk1nd3o(int d, No *p, double Dt, double xmin[], double xmax[]); /** * Segundo passo de Runge-Kutta2. Toma um vetor no tempo n+1/2 e devolve no tempo * n+1. No caso em que c (velocidade) e negativa os parametros vao de i-1...1+2 * e no caso em que c nao e constante usamos i-2...i+2 * @param u1 [in] valor da media na celula i-2 (caso necessario, depende de c) * @param u2 [in] valor da media na celula i-1 * @param u3 [in] valor da media na celula i * @param u4 [in] valor da media na celula i+1 * @param u5 [in] valor da media na celula i+2 no momento eh o valor de ui em tempo n (caso necessario, depende de c) * @param Dt [in] tamanho do passo no tempo * @param Dx [in] tamanho da celula * @param c [in] velocidade de adveccao (EDP) */ double rk2nd3o(int d, No *p, double Dt, double xmin[], double xmax[]); /** * calcula o o valor da solucao no tempo n+1/3. isto e, o primeiro passo de Runge-Kutta3 * @param d [in] dimensao do dominio * @param prof [in] profundidade na arvore * @param pac [in] pacote com fluxo em algumas celulas e ponteiros para nos da arvore. * @param xmin [in] coordenadas do vertice inferior de uma celula * @param xmax [in] coordenadas do vertice superior de uma celula * @param Dt [in] passo no tempo, por definicao eh o passo necessario para ter estabilidade na malha mais fina * @param f [in] Fluxo continuo (EDP) u_t + div f = u_t + f(u)_x = 0 */ void avancaT13(int d, int prof, No *p, double xmin[], double xmax[], double Dt, Fluxo f); /** * calcula o o valor da solucao no tempo n+2/3. isto e, o segundo passo de Runge-Kutta3 * @param d [in] dimensao do dominio * @param prof [in] profundidade na arvore * @param pac [in] pacote com fluxo em algumas celulas e ponteiros para nos da arvore. * @param xmin [in] coordenadas do vertice inferior de uma celula * @param xmax [in] coordenadas do vertice superior de uma celula * @param Dt [in] passo no tempo, por definicao eh o passo necessario para ter estabilidade na malha mais fina * @param f [in] Fluxo continuo (EDP) u_t + div f = u_t + f(u)_x = 0 */ void avancaT23(int d, int prof, No *p, double xmin[], double xmax[], double Dt, Fluxo f); /** * calcula o o valor da solucao no tempo n+1. isto e, o terceiro passo de Runge-Kutta3 * @param d [in] dimensao do dominio * @param prof [in] profundidade na arvore * @param pac [in] pacote com fluxo em algumas celulas e ponteiros para nos da arvore. * @param xmin [in] coordenadas do vertice inferior de uma celula * @param xmax [in] coordenadas do vertice superior de uma celula * @param Dt [in] passo no tempo, por definicao eh o passo necessario para ter estabilidade na malha mais fina * @param f [in] Fluxo continuo (EDP) u_t + div f = u_t + f(u)_x = 0 */ void avancaT33(int d, int prof, No *p, double xmin[], double xmax[], double Dt, Fluxo f); #endif