/*************************************************************************** * 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 rk1(double u1, double u2, double u3, double u4, double u5, double Dt, double Dx, double c); /** * 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 rk2(double u1, double u2, double u3, double u4, double u5, double Dt, double Dx, double c); /** * 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 medias celulares 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 c [in] velocidade de propagacao da onda (EDP) * @param (pred) [in] funcao de previsao para filho esquerdo de uma celula. */ void avancaTempoMeio(int d, int prof, VNo pac[], double xmin[], double xmax[], double Dt, double c, Preditor pred); /** * 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 medias celulares 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 c [in] velocidade de propagacao da onda (EDP) * @param (pred) [in] funcao de previsao para filho esquerdo de uma celula. */ void avancaTempoUm(int d, int prof, VNo pac[], double xmin[], double xmax[], double Dt, double c, Preditor pred); #endif