<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://fiscomp.if.ufrgs.br/index.php?action=history&amp;feed=atom&amp;title=Onda_2D%3A_Leapfrog</id>
	<title>Onda 2D: Leapfrog - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="http://fiscomp.if.ufrgs.br/index.php?action=history&amp;feed=atom&amp;title=Onda_2D%3A_Leapfrog"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Onda_2D:_Leapfrog&amp;action=history"/>
	<updated>2026-04-20T15:06:28Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Onda_2D:_Leapfrog&amp;diff=2002&amp;oldid=prev</id>
		<title>Rodrigozferreira: Criou página com '&lt;source lang=&quot;c&quot;&gt; #include&lt;stdio.h&gt; #include&lt;math.h&gt; #include&lt;string.h&gt; #include&lt;stdlib.h&gt; #define nx_ 71 #define ny_ 71  double gauss( int x, int y, int tam);  double     H(...'</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Onda_2D:_Leapfrog&amp;diff=2002&amp;oldid=prev"/>
		<updated>2018-01-24T17:52:05Z</updated>

		<summary type="html">&lt;p&gt;Criou página com &amp;#039;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt; #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;math.h&amp;gt; #include&amp;lt;string.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #define nx_ 71 #define ny_ 71  double gauss( int x, int y, int tam);  double     H(...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include&amp;lt;math.h&amp;gt;&lt;br /&gt;
#include&amp;lt;string.h&amp;gt;&lt;br /&gt;
#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#define nx_ 71&lt;br /&gt;
#define ny_ 71&lt;br /&gt;
&lt;br /&gt;
double gauss( int x, int y, int tam);&lt;br /&gt;
&lt;br /&gt;
double     H( int x, int y, int tam);&lt;br /&gt;
&lt;br /&gt;
void atualizar_onda(double u_new[][ny_], double u_now[][ny_], double u_old[][ny_], double lambda[][ny_], double a,  double b,  double c, int nx, int ny, double rx, double ry);&lt;br /&gt;
&lt;br /&gt;
double delta_u( double rx, double ry, double lambda[][ny_],  double u_now[][ny_], int i,  int j, int  im1, int ip1, int jm1, int jp1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*        META DADOS   */&lt;br /&gt;
//&lt;br /&gt;
/*    nx_ e ny_ , definidos acima por praticidade,    */&lt;br /&gt;
/*    setam o tamanho dos vetores.                    */&lt;br /&gt;
/*                                                    */&lt;br /&gt;
/*    tmax   , tempo total da simulacao               */&lt;br /&gt;
/*    rx e ry, dt/dx e dy/dt respectivamente          */&lt;br /&gt;
/*    lambda , mapa do solo (profundidade em (x,y))   */&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
/*     u representa a altura do mar em (x,y), sendo:  */&lt;br /&gt;
//&lt;br /&gt;
/*    u_old[x][y] em t = t-1    */&lt;br /&gt;
/*    u_now[x][y] em t = t      */&lt;br /&gt;
/*    u_new[x][y] em t = t+1    */&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void main()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    FILE *arq;&lt;br /&gt;
    arq = fopen(&amp;quot;onda.txt&amp;quot;, &amp;quot;w+&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    int tmax, i, j, t, nx, ny;&lt;br /&gt;
&lt;br /&gt;
    nx = nx_;&lt;br /&gt;
    ny = ny_;&lt;br /&gt;
    tmax = 300;&lt;br /&gt;
&lt;br /&gt;
    double u_new[nx][ny], u_old[nx][ny], u_now[nx][ny], lambda[nx][ny], rx, ry;&lt;br /&gt;
&lt;br /&gt;
    rx = 0.25;&lt;br /&gt;
    ry = 0.25;&lt;br /&gt;
&lt;br /&gt;
    //   incio loop da condição inicial,&lt;br /&gt;
    //   laco duplo e usado para percorrer matriz nx*ny&lt;br /&gt;
&lt;br /&gt;
    for(j = 0 ; j &amp;lt; ny  ; j++)&lt;br /&gt;
    {&lt;br /&gt;
        for(i = 0 ; i &amp;lt; nx ; i++)&lt;br /&gt;
        {&lt;br /&gt;
            /* u_now inicial em forma de sino */&lt;br /&gt;
            u_now[i][j] = gauss(i,j,nx);&lt;br /&gt;
            /* lambda inicial em forma de H() */&lt;br /&gt;
            lambda[i][j] = H(i,j,nx);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //   fim loop da condição inicial&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /*  calculo &amp;quot;sintetico&amp;quot; de u_old, pois a atualizacao nao e auto-iniciavel  */&lt;br /&gt;
&lt;br /&gt;
    atualizar_onda(u_old, u_now, u_old, lambda, 0.5, 0, 0.5, nx, ny, rx, ry);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    //inicio do laço temporal&lt;br /&gt;
&lt;br /&gt;
    for(t = 0 ; t &amp;lt; tmax ; t++)&lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        //imprimindo no arquivo com laco duplo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* calculam-se novos valores */&lt;br /&gt;
&lt;br /&gt;
        atualizar_onda( u_new, u_now, u_old, lambda, 1, 1, 1, nx, ny, rx, ry);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* matrizes antes novas se tornam antigas */&lt;br /&gt;
        /*   u_old = u_now, u_now = u_new   */&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        memcpy(u_old,u_now, sizeof(double)*nx*ny);&lt;br /&gt;
        memcpy(u_now,u_new, sizeof(double)*nx*ny);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* OBS: Double tem o valor de 8 bytes na memoria. Como temos uma matriz de nx*ny, pegamos o tamanho*/&lt;br /&gt;
        /* de um double e multiplicamos pela dimensao da matriz */&lt;br /&gt;
        /* sintaxe memcpy(matriz a ser atualizada, matriz que passa o valor, tamanho em bytes da matriz)  */&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
            for(j = 0 ; j &amp;lt; ny ; j++)&lt;br /&gt;
        {&lt;br /&gt;
            for(i = 0 ; i &amp;lt; nx  ; i++)&lt;br /&gt;
            {&lt;br /&gt;
                if(i == j){&lt;br /&gt;
                fprintf(arq, &amp;quot;%d %d %lf\n&amp;quot;, i, j, u_now[i][j]);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Linhas em branco ao final de cada tempo para index do gnuplot */&lt;br /&gt;
        fprintf(arq,&amp;quot;\n\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    fclose(arq);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
double gauss(int x, int y,int tam)&lt;br /&gt;
{&lt;br /&gt;
    /* curva inicial em forma de sino*/&lt;br /&gt;
&lt;br /&gt;
    double A, xc, yc, gauss, sigmax, sigmay;&lt;br /&gt;
    //xc = (tam-1) / 2.;&lt;br /&gt;
    //yc = (tam-1) / 2.;&lt;br /&gt;
    xc = 0;&lt;br /&gt;
    yc = 0;&lt;br /&gt;
&lt;br /&gt;
    A = 1;&lt;br /&gt;
    sigmax = 1;&lt;br /&gt;
    sigmay = 1;&lt;br /&gt;
&lt;br /&gt;
    gauss = A * exp(-0.5*pow(((x-xc)/sigmax),2) -0.5*pow(((y-yc)/sigmay),2));&lt;br /&gt;
&lt;br /&gt;
    return gauss;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/* a funcao H corresponde ao formato do terreno, retorna a profundidade em relação a aguas calmas */&lt;br /&gt;
&lt;br /&gt;
double H(int x, int y,int tam)&lt;br /&gt;
{&lt;br /&gt;
    /* curva para o formato do terreno em forma de sino virado*/&lt;br /&gt;
    double A,xc,yc,h,sigmax,sigmay;&lt;br /&gt;
    //xc = (tam-1) / 2.;&lt;br /&gt;
    //yc = (tam-1) / 2.;&lt;br /&gt;
&lt;br /&gt;
    A = 1;&lt;br /&gt;
    sigmax = 1;&lt;br /&gt;
    sigmay = 1;&lt;br /&gt;
    xc = 0;&lt;br /&gt;
    yc = 0;&lt;br /&gt;
&lt;br /&gt;
    h = 1 - A * exp(-0.5*pow(((x-xc)/sigmax),2) -0.5*pow(((y-yc)/sigmay),2));&lt;br /&gt;
&lt;br /&gt;
    return h;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void atualizar_onda(double u_new[][ny_], double u_now[][ny_], double u_old[][ny_], double lambda[][ny_], double a,  double b,  double c, int nx, int ny, double rx, double ry)&lt;br /&gt;
{&lt;br /&gt;
// DOUBLE U_NEW[][NY_)] SINALIZA PARA O C QUE A FUNÇÃO RECEBERA UMA MATRIZ( TECNICAMENTE RECEBERA O ENDEREÇO NA MEMORIA DA MATRIZ) POR ISSO NÃO É NECESSARIO RETORNAR NENHUM VALOR&lt;br /&gt;
// ESTA &amp;quot;TECNICA&amp;quot; É POSSIVEL POIS O NOME DA MATRIZ, NO CASO U_NEW, É NA VERDADE O ENDEREÇO DESSA MATRIZ NA MEMORIA. COMO ESTAMOS PASSANDO O ENDEREÇO NA MEMORIA, A FUNÇÃO CONSEGUE ALTERAR OS VALORES SEM NECESSIDADE DE RETORNO&lt;br /&gt;
// PRECISAMOS DECLARAR O [NY_] NA FUNÇÃO POR QUESTÕES TECNICAS. MAS PENSEM NESSA SINTAXE COMO: PASSANDO O ENDEREÇO DA MATRIX PARA A FUNÇÃO, SEM NECESSIDADE DE RETORNO. A FUNÇÃO É LIVRE PARA EDITAR A PROPRIA MATRIZ&lt;br /&gt;
&lt;br /&gt;
    int i,j;&lt;br /&gt;
&lt;br /&gt;
    // LOOP DUPLO PARA ATUALIZAR AS PARTES INTERNAS DA MATRIZ&lt;br /&gt;
    for(j = 1 ; j &amp;lt; ny - 1 ; j++)&lt;br /&gt;
    {&lt;br /&gt;
        for(i = 1 ; i &amp;lt; nx - 1  ; i++)&lt;br /&gt;
&lt;br /&gt;
            // SEPAREI PARTE DA EQUAÇAO EM OUTRA FUNÇÃO PARA SIMPLIFICAR A VIDA. DELTA_U É SIMPLESMENTE UMA PARTE DA EQUAÇÃO ORIGINAL&lt;br /&gt;
&lt;br /&gt;
            u_new[i][j] = a * 2 * u_now[i][j] - b * u_old[i][j] + c * delta_u(rx,ry,lambda,u_now,i,j,i-1,i+1,j-1,j+1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //PRECISAMOS AGORA ATUALIZAR AS LINHAS E COLUNAS EXTERNAS DA MATRIZ, POIS ESTAS NÃO FORAM INCLUIDAS NO LOOP ANTERIOR. ESTA AÇÃO NÃO ATUALIZA AS PONTAS, OU QUINAS, DA MATRIZ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    i = 0; // ATUALiZANDO A PRIMEIRA COLUNA DA MATRIZ&lt;br /&gt;
    for( j = 1; j &amp;lt; ny - 1  ; j++)&lt;br /&gt;
    {&lt;br /&gt;
        u_new[i][j] = a * 2 * u_now[i][j] - b * u_old[i][j] + c * delta_u(rx,ry,lambda,u_now,i,j,i+1,i+1,j-1,j+1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    i = nx - 1;// ATUALZANDO A ULTIMA COLUNA DA MATRIZ&lt;br /&gt;
    for( j = 1; j &amp;lt; ny - 1  ; j++)&lt;br /&gt;
    {&lt;br /&gt;
        u_new[i][j] = a * 2 * u_now[i][j] - b * u_old[i][j] + c * delta_u(rx,ry,lambda,u_now,i,j,i-1,i-1,j-1,j+1);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // ---------------------- //&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    j = 0; // ATUALZANDO A PRIMEIRA LINHA DA MATRIZ&lt;br /&gt;
    for( i = 1; i &amp;lt; nx - 1 ; i++)&lt;br /&gt;
    {&lt;br /&gt;
        u_new[i][j] = a * 2 * u_now[i][j] - b * u_old[i][j] + c * delta_u(rx,ry,lambda,u_now,i,j,i-1,i+1,j+1,j+1);&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    j = ny - 1; // ATUALZANDO A ULTIMA LINHA DA MATRIZ&lt;br /&gt;
    for( i = 1; i &amp;lt; nx - 1 ; i++)&lt;br /&gt;
    {&lt;br /&gt;
        u_new[i][j] = a * 2 * u_now[i][j] - b * u_old[i][j] + c * delta_u(rx,ry,lambda,u_now,i,j,i-1,i+1,j-1,j-1); &lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // AGORA VAMOS ATUALIZAR as PONTAS DA MATRIZ. OU CANTOS, SE PREFERIR CHAMAR ASSIM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // PONTA [0][0]&lt;br /&gt;
    i = 0;&lt;br /&gt;
    j = 0;&lt;br /&gt;
    u_new[i][j] = a * 2 * u_now[i][j] - b * u_old[i][j] + c * delta_u(rx,ry,lambda,u_now,i,j,i+1,i+1,j+1,j+1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // PONTA [nx - 1][0]&lt;br /&gt;
    i= nx - 1;&lt;br /&gt;
    j= 0;&lt;br /&gt;
    u_new[i][j] = a * 2 * u_now[i][j] - b * u_old[i][j] + c * delta_u(rx,ry,lambda,u_now,i,j,i-1,i-1,j+1,j+1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // PONTA [0][ny -1]&lt;br /&gt;
    i= 0;&lt;br /&gt;
    j= ny - 1;&lt;br /&gt;
    u_new[i][j] = a * 2 * u_now[i][j] - b * u_old[i][j] + c * delta_u(rx,ry,lambda,u_now,i,j,i+1,i+1,j-1,j-1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // PONTA [NX-1][ny -1]&lt;br /&gt;
    i= nx - 1;&lt;br /&gt;
    j= ny - 1;&lt;br /&gt;
    u_new[i][j] = a * 2 * u_now[i][j] - b * u_old[i][j] + c * delta_u(rx,ry,lambda,u_now,i,j,i-1,i-1,j-1,j-1);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double delta_u( double rx, double ry, double lambda[][ny_],  double u_now[][ny_], int i,  int j, int  im1, int ip1, int jm1, int jp1)&lt;br /&gt;
{&lt;br /&gt;
    //CALCULAMOS AQUI  SEPARADO UMA PARTE DA EQUAÇÃO, POIS ELA MUDA DEPENDENDO DO QUE ESTAMOS CALCULANDO. SEJA UMA COLUNA INICIAL OU FINAL OU UM CANTO DA MATRIZ&lt;br /&gt;
    //PARA ISSO COLOQUEI VALORES AUXILIARES DE IM1, IP1, JM1, JP1 . P DE PLUS E M DE MINUS.POIS ESTES VALORES SAO TROCADOS EM VARIAS PARTES&lt;br /&gt;
&lt;br /&gt;
    return (&lt;br /&gt;
               pow(rx,2) * ( ((0.5 * (lambda[ip1][j] + lambda[i][j])) * (u_now[ip1][j] - u_now[i][j]))&lt;br /&gt;
                             -  ((0.5 * (lambda[i][j] + lambda[im1][j])) * (u_now[i][j] - u_now[im1][j])))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
               + pow(ry,2) * ( ((0.5 * (lambda[i][jp1] + lambda[i][j])) * (u_now[i][jp1] - u_now[i][j]))&lt;br /&gt;
                               -  ((0.5 * (lambda[i][j] + lambda[i][jm1])) * (u_now[i][j] - u_now[i][jm1]))));&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rodrigozferreira</name></author>
	</entry>
</feed>