## abstract interface

implicit interface which can be used to create interpolation routines
for ghost and halo cells within the solvers and to pass them as an
arguement to the interpolation subroutine interpolate.

## private subroutine solver_interpolation_down(target_cell_data, target_cell_variables, target_cell_level, source_cell_data, source_cell_variables, source_child_numbers)

### Arguments

Type | Intent | Optional | Attributes | | Name | |

real, |
intent(inout), |
| allocatable | :: |
**target_cell_data**(:) | The data of the cell you want to reconstruct. The subroutine
implementing this interface does not allocate memory, so the calling
subroutine has to allocate memory for this subroutine. The length
of this array is the number of degrees of freedom (in case of PNPM
or FD) or number of links (in case of LBM) you want to reconstruct. |

integer, |
intent(in) |
| | :: |
**target_cell_variables** | the number of variables you want to interpolate for the target cell.
In case of PNPM it is the number of degrees of freedom (e.g. see
ATELES: scheme_type%nDoFs ). In case of LBM it is the number of
links (e.g. in case of D3Q19 it is 19). |

integer, |
intent(in) |
| | :: |
**target_cell_level** | the level of the cell you want to reconstruct inside the octree.
Since we do a downwards interpolation (from the higher refinement
level to the lower one) we implicitly assume that the source cell
levels are all equal to target_cell_level - 1. |

real, |
intent(in), |
| allocatable | :: |
**source_cell_data**(:,:) | Data of the source cells, which are necessary to interpolate the
target cell on a lower level. Since we are working on an octree
structure we assume to get everytime the data of all 8 children.
So the dimensions of this array are:
First dimension is 8, second dimension is source_cell_variables.
If one source cell is a solid cell put a negative integer number into
source_child_numbers at the right position to indicate that this child
is not valid. |

integer, |
intent(in) |
| | :: |
**source_cell_variables** | the number of variables of the source cell.
In case of PNPM it is the number of degrees of freedom (e.g. see
ATELES: scheme_type%nDoFs ) of the source cells.
In case of LBM it is the number of links (e.g. in case of D3Q19
it is 19). |

integer, |
intent(in), |
| allocatable | :: |
**source_child_numbers**(:) | array of integer numbers of length 8 indicating the position of the
children within the space filling curve. If one child is a solid cell
and therefore not part of the interpolation, put a negative integer
inside this array. This tells the subroutine, that this child will not
be part of the interpolation step. |