This section will cover the basic usage of multi-dimensional Grids. In order to use the ``Grid`` class you need to include the ``schnek/grid.hpp`` header. The ``Grid`` class needs to template arguments. The first argument specifies the type and the second argument specifies the rank of the grid. Let's look at the following simple example. :: #include using namespace schnek; int main() { Grid grid; } This will create a two-dimensional grid containing ``double`` elements. :: #include using namespace schnek; int main() { Grid grid(Grid::IndexType(5,5)); grid = 1.0; for (int j=0; j<5; ++j) grid(j,j) = sqrt(2*j); } Let's go through the example line by line. :: Grid grid(Grid::IndexType(5,5)); This line will create a two dimensional grid of size 5 by 5. To initialise the size of a ``Grid`` you need to pass a two dimensional index array to the constructor. The type of the index array is given by the ``IndexType`` type definition inside the ``Grid`` class. The line :: grid = 1.0; fills all the entries in the ``Grid`` with the value 1. To access individual entries, you can use the overloaded function operator. :: for (int j=0; j<5; ++j) grid(j,j) = sqrt(2*j); These lines will iterate over the index ``j`` and fill the diagonal of the ``Grid`` with a value given by ``sqrt(2*j)`` After the loop has finished the grid will contain the following values. :: 0 1 1 1 1 1 1.41421 1 1 1 1 1 2 1 1 1 1 1 2.44949 1 1 1 1 1 2.82843 **Tip:** It is often useful to use ``typedef``\ s to keep your code short and readable. The declaration an initialisation in the example above can be replaced by. :: typedef schnek::Grid MyGrid; typedef MyGrid::IndexType MyIndex; MyGrid grid(MyIndex(5, 5)); While this introduces more code initially, it will increase readability in the long run.   The code for this tutorial can be found \ `here `__ under the heading\ * Example 1*.