Index Types and the Array Class

The Grid class defines a type called IndexType. In the previous example we have seen that this type is used to specify the extent of the grid. However, it can also be used to index locations in the grid.

In the following example we define a three dimensional grid of size 11x11x11 and fill a single line with the value 1.

  Grid<double, 3> grid(Grid<double, 3>::IndexType(0, 0, 0),
      Grid<double, 3>::IndexType(10, 10, 10));

  grid = 0.0;

  Grid<double, 3>::IndexType index(5, 5, 5);

  for (int i = 0; i <= 10; i++)
    index[1] = i;
    grid[index] = 1.0;

In this a rather contrived example index is of the IndexType specified by the Grid class. As you can see you can access individual elements from the IndexType by using square brackets as in the following line.

    index[1] = i;

This sets the element at position 1, i.e. the second component, to the value of i.

We can use the square brackets to get elements from the grid using an index as seen in the following line.

    grid[index] = 1.0;

The class behind the IndexType is the Array class. Array is a fixed length array that acts much like a C-style array.

  Array<int, 3> a;

  for (int i = 0; i < 3; ++i)
    a[i] = 2 * i + 1;

This piece of code declares an Array of size 3 and fills it with values in a loop. Initialisation can also be done using the constructor as follows.

  Array<int, 3> b(2, 3, 4);

Note that Schnek does not yet provide C++11 style Initialisation of arrays.

Of course you can define Arrays of different types and dimensionality. For example the following line will create an array of five strings and initialise it with values.

  Array<std::string, 5> s("a","b","c","d","e");

One useful feature of Schnek Arrays is the ability to use them in vector style expressions. Loook at the following code.

  Array<int, 3> a(4, 5, 6);
  Array<int, 3> b(2, 3, 4);

  Array<int, 3> c;

  c = a + b;

Here we have declared three arrays a, b, and c. a and b are initialised with values. In the last line c is calculated as the sum of a and b.

  c = a + b;

Schnek uses expression templates to evaluate expressions involving Arrays. This means that the evaluation does not create temporary Array objects and you can safely use Array expressions in your code without speed penalty. Array expressions allow you to add or subtract two arrays and to multiply or divide an array with a scalar value. Note that the Array template parameters have to match for arrays that you want to include in an expression.

The code for this example can be found here.

Leave a Reply

Your email address will not be published. Required fields are marked *