# AutoBZCore.jl

We apologize for the inconvenience as we continue improving the documentation.

`AutoBZCore`

— ModuleA package providing a common interface to integration algorithms intended for applications including Brillouin-zone integration and Wannier interpolation. Its design is influenced by high-level libraries like Integrals.jl, and it makes use of Julia's multiple dispatch to provide the same interface for integrands with optimized inplace, batched, and Fourier series evaluation.

**Quickstart**

As a first example, we integrate sine over [0,1] as a function of its period.

```
julia> using AutoBZCore
julia> f = IntegralSolver((x,p) -> sin(p*x), 0, 1, QuadGKJL());
julia> f(0.3) # solves the integral of sin(p*x) over [0,1] with p=0.3
0.14887836958131329
```

Notice that we construct an `IntegralSolver`

object that we can evaluate at different parameters with a function-like interface. For more examples, see the documentation.

**Features**

Special integrand interfaces

`ParameterIntegrand`

: allows user integrand to use keyword arguments`InplaceIntegrand`

: allows an integrand to write its result inplace to an array`BatchIntegrand`

: allows user-side parallelization on e.g. shared memory, distributed memory, or the gpu`FourierIntegrand`

: efficient evaluation of Fourier series for cubatures with hierachical grids

Quadrature algorithms:

- Trapezoidal rule and FastGaussQuadrature.jl:
`QuadratureFunction`

- h-adaptive quadrature (Gauss-Kronrod):
`QuadGKJL`

- h-adaptive cubature (Genz-Malik):
`HCubatureJL`

- p-adaptive, symmetrized Monkhorst-Pack:
`AutoSymPTRJL`

Meta-Algorithms:

- Iterated integration:
`NestedQuad`

- Integrand evaluation counter:
`EvalCounter`

**Extended help**

If you experience issues with AutoBZCore.jl, please report a bug on the GitHub page to contact the developers.