Hi,

this is my first post. I'll try to keep it short.
Basically, I'm trying to solve a one-way wave equation using finite differences. I'm trying to put the values in an multidim. array, where a column represents a time step.

The first column is the initial condition. I calculate the second column using entries from the first. For some reason, this changes the first column. I do not understand this.


Hope someone has the time to help. Thanks!

I first initialize the variables needed:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
  int xMeshPoints = 20;  // number of points in x-direction.
  int tMeshPoints = 1;  // number of points in t-direction.
  double dt = 0.001;
  double dx = double(2)/(xMeshPoints); // function defined on [0,2].
  double a = 1;

  double v [xMeshPoints][tMeshPoints];

Putting entries in first column, and calculating second column using entries from first:

// Initial condition (t=0):
  for (int i=0; i<=xMeshPoints; i++)
    {
      if (dx*i >= 0.5 && dx*i <= 1)
	v[i][0] = 2;
      else
	v[i][0] = 1;
    }

  // Print first column:
  cout << "First column:" << endl;
  for (int i=0; i<=xMeshPoints; i++)
    {
      cout << v[i][0] << endl;
    }

  // Calculate second column:
  for (int i=0; i<xMeshPoints; i++)
    {
      v[i][1] = v[i][0] - (a*dt/dx)*(v[i+1][0]-v[i][0]);
    }

  // Print first column (again):
  cout << "First column (again):" << endl;
  for (int i=0; i<=xMeshPoints; i++)
    {
      cout << v[i][0] << endl;
    }

  return 0;
}

Output:
First column:
1
1
1
1
1
2
2
2
2
2
1
1
1
1
1
1
1
1
1
1
1
First column (again):
1
1
1
1
1
0.99
0.9799
0.969699
0.959396
0.94899
0.94848
0.947965
0.947444
0.946919
0.946388
0.945852
0.94531
0.944763
0.944211
0.943653
0.94309

You are accessing an element of your array that doesn't exist by using "<=" in multiple places.

an array of size 128,

starting at zero (0)

is from 0 to 127

for(int i = 0; i < 128; i++)

Debugging with a decent compiler would tell you the stack around "v" was corrupted, meaning you are accessing an element of your array that doesn't exist.

// Calculate second column:
  for (int i=0; i < xMeshPoints; i++)
  {
	  v[i][1] = v[i][0] - (a*dt/dx)*(v[i+1][0]-v[i][0]);//<--
//is v[i+1][0] exist when i < xMeshPoints ??
  }

Edited 5 Years Ago by pseudorandom21: n/a

Hi pseudorandom21, thanks for answering my question.
I increased the size of my array by 1, and things are working as expected.

You say that debugging with a decent compiler would help me catch these mistakes. I'm compiling using gcc for windows. That is, I compile by using g++ in the command window. Why doesn't this compiler catch these things?

Again, thanks!

This article has been dead for over six months. Start a new discussion instead.