# tree_d_3d.kernels.evaluate_log_quadtree.evaluate_log_quadtree_numpy

*module*

The version of the ``evaluate_log_quadtree`` kernel for machines without Pyccel.

There is no vectorized form (each target walks the tree with its own stack): this is the algorithm of
``evaluate_log_quadtree_pyccel.py``, run by the Python interpreter.

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

## tree_d_3d.kernels.evaluate_log_quadtree.evaluate_log_quadtree_numpy.evaluate_log_quadtree

*function*

```python
def evaluate_log_quadtree(targets: float[:, :], exclude: int64[:], pos: float[:, :], charge: float[:], perm: int64[:], node_center: float[:, :], node_half: float[:], node_start: int64[:], node_end: int64[:], node_child: int64[:], node_qabs: float[:], moment_re: float[:, :], moment_im: float[:, :], theta: float, softening: float, stack: int64[:], phi: float[:], field: float[:, :], status: int64[:]) -> None
```

Re-exported from: `tree_d_3d.kernels.evaluate_log_quadtree.evaluate_log_quadtree_pyccel`

Line-charge potential and field at targets, without k_e.

Same traversal and opening rule as :func:`evaluate_quadtree`. Accepted
cells use the order-p expansion, unsoftened: for a target at z,
``sum q/(z - z_j) = sum_n a_n w**(n+1)`` and
``sum q ln(z - z_j) = a_0 ln(z - c) - sum_{n>=1} a_n w**n / n`` with
``w = 1 / (z - c)``. ``status[0]`` becomes 1 + a target that met an unsoftened coincident charge
(the first, on the CPU).

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