# Degrees of Freedom

The distribution and numbering of degrees of freedom (dofs) are handled by the `DofHandler`

. The DofHandler will be used to query information about the dofs. For example we can obtain the dofs for a particular cell, which we need when assembling the system.

The `DofHandler`

is based on the grid. Here we create a simple grid with Triangle cells, and then create a `DofHandler`

based on the grid

```
grid = generate_grid(Triangle, (20, 20))
dh = DofHandler(grid)
```

```
DofHandler
Fields:
Not closed!
```

## Fields

Before we can distribute the dofs we need to specify fields. A field is simply the unknown function(s) we are solving for. To add a field we need a name (a `Symbol`

) and we also need to specify number of components for the field. Here we add a vector field `:u`

(2 components for a 2D problem) and a scalar field `:p`

.

```
add!(dh, :u, 2)
add!(dh, :p, 1)
```

```
DofHandler
Fields:
:u, interpolation: Lagrange{2, RefTetrahedron, 1}(), dim: 2
:p, interpolation: Lagrange{2, RefTetrahedron, 1}(), dim: 1
Not closed!
```

Finally, when we have added all the fields, we have to `close!`

the `DofHandler`

. When the `DofHandler`

is closed it will traverse the grid and distribute all the dofs for the fields we added.

`close!(dh)`

```
DofHandler
Fields:
:u, interpolation: Lagrange{2, RefTetrahedron, 1}(), dim: 2
:p, interpolation: Lagrange{2, RefTetrahedron, 1}(), dim: 1
Dofs per cell: 9
Total dofs: 1323
```

### Specifying interpolation for a field

In the example above we did not specify which interpolation should be used for our fields `:u`

and `:p`

. By default iso-parametric elements will be used meaning that the interpolation that matches the grid will be used – for a linear grid a linear interpolation will be used etc. It is sometimes useful to separate the grid interpolation from the interpolation that is used to approximate our fields (e.g. sub- and super-parametric elements).

We can specify which interpolation that should be used for the approximation when we add the fields to the dofhandler. For example, here we add our vector field `:u`

with a quadratic interpolation, and our `:p`

field with a linear approximation.

```
add!(dh, :u, 2, Lagrange{2,RefTetrahedron,2}())
add!(dh, :p, 1, Lagrange{2,RefTetrahedron,1}())
```

```
DofHandler
Fields:
:u, interpolation: Lagrange{2, RefTetrahedron, 2}(), dim: 2
:p, interpolation: Lagrange{2, RefTetrahedron, 1}(), dim: 1
Not closed!
```

## Ordering of Dofs

ordered in the same order as we add to dofhandler nodes -> (edges ->) faces -> cells