# tree_d_3d.kernels.fmm_downward.fmm_downward_metal

*module*

The Metal version (Apple-silicon GPU, float32) of the ``fmm_downward`` kernel.

``fmm_downward_pyccel.py`` next to this file is the CPU version with the same
arguments. One thread per node of ``first_node:last_node``; a child has one parent, so
each thread writes its own children's rows of a zeroed delta (no atomics), which the
host adds to the local expansions in float64. The ``power_re`` and ``power_im``
scratch arguments of the CPU version are unused. See :mod:`tree_d_3d.kernels._metal`.

[View source](https://github.com/max-models/tree-d-3d/blob/devel/src/tree_d_3d/kernels/fmm_downward/fmm_downward_metal.py#L1-L1)

## tree_d_3d.kernels.fmm_downward.fmm_downward_metal.fmm_downward

*function*

```python
def fmm_downward(first_node: int, last_node: int, node_center: Array, node_child: Array, binomial: Array, power_re: Array, power_im: Array, local_re: Array, local_im: Array) -> None
```

Shift the local expansions of nodes ``first_node:last_node`` into their children.

[View source](https://github.com/max-models/tree-d-3d/blob/devel/src/tree_d_3d/kernels/fmm_downward/fmm_downward_metal.py#L62-L90)
