# tree_d_3d.kernels

*module*

The Barnes-Hut and FMM kernels: one folder per kernel.

Every kernel ``<name>`` lives in its own folder::

    tree_d_3d/kernels/<name>/__init__.py        kernel = xp.kernels.Kernel.from_folder(...)
    tree_d_3d/kernels/<name>/<name>_pyccel.py   CPU, compiled with Pyccel on first use
    tree_d_3d/kernels/<name>/<name>_numpy.py    CPU, when Pyccel is unavailable
    tree_d_3d/kernels/<name>/<name>_cuda.cu     GPU (CuPy), compiled with NVRTC
    tree_d_3d/kernels/<name>/<name>_metal.py    Apple GPU (MLX), float32

All versions take the same arguments; a kernel runs the CUDA version on CuPy arrays
and the Pyccel version (or NumPy without Pyccel) on NumPy arrays. Importing this
package needs neither Pyccel nor CuPy.

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

## tree_d_3d.kernels.KERNEL_NAMES

*attribute* · *module attribute*

```python
KERNEL_NAMES = ('quadtree_quadrants', 'quadtree_scatter', 'quadtree_moments', 'evaluate_quadtree', 'direct_sum', 'pair_energy', 'log_quadtree_moments', 'evaluate_log_quadtree', 'direct_log_sum', 'fmm_traverse', 'fmm_m2l', 'fmm_downward', 'fmm_evaluate', 'soften_pairs')
```

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

## tree_d_3d.kernels.METAL_KERNEL_NAMES

*attribute* · *module attribute*

```python
METAL_KERNEL_NAMES = KERNEL_NAMES
```

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

## tree_d_3d.kernels.kernels_compiled

*function*

```python
def kernels_compiled() -> bool
```

Whether the kernels run compiled.

On the CuPy backend they always do (CUDA); otherwise this checks once per
process whether the Pyccel versions compile. Without them the tree kernels
run as Python loops, so ``method="auto"`` sums directly.

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

## tree_d_3d.kernels.metal_kernel

*function*

```python
def metal_kernel(name: str) -> Callable[..., None]
```

Return the Metal version of kernel ``name``: a function with the Pyccel arguments.

Needs MLX and a Metal GPU (``pip install 'tree-d-3d[metal]'``); the arrays are NumPy
arrays, computed in float32 and written back into the output arrays.

**Raises**

- `KeyError` — If the kernel has no Metal version.
- `RuntimeError` — If there is no usable Metal GPU.

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

**Modules**

- `tree_d_3d.kernels.compile`
- `tree_d_3d.kernels.direct_log_sum`
- `tree_d_3d.kernels.direct_sum`
- `tree_d_3d.kernels.evaluate_log_quadtree`
- `tree_d_3d.kernels.evaluate_quadtree`
- `tree_d_3d.kernels.fmm_downward`
- `tree_d_3d.kernels.fmm_evaluate`
- `tree_d_3d.kernels.fmm_m2l`
- `tree_d_3d.kernels.fmm_traverse`
- `tree_d_3d.kernels.log_quadtree_moments`
- `tree_d_3d.kernels.pair_energy`
- `tree_d_3d.kernels.quadtree_moments`
- `tree_d_3d.kernels.quadtree_quadrants`
- `tree_d_3d.kernels.quadtree_scatter`
- `tree_d_3d.kernels.soften_pairs`
- `tree_d_3d.kernels.tests`
