# pyabacus: a Python interface for the ABACUS package
`pyabacus` is a Python interface for the ABACUS package, which provides a high-level Python API for interacting with the `ABACUS` library.
This project is built using [pybind11](http://github.com/pybind/pybind11) and [scikit-build-core](https://scikit-build-core.readthedocs.io/), so you can easily build the project and use it in your Python environment.
Now, `pyabacus` provides the following modules:
- `io`: a module for input/output in pyabacus.
- `Cell`: a module for the cell structure to bridge `ModuleNAO` in python module with users' input.
- `ModuleBase`: a module for basic math functions.
- `ModuleNAO`: a module for numerical atomic orbitals (NAO).
- `hsolver`: a module for solving the Hamiltonian.
- [Installation](#installation)
- [CI Examples](#ci-examples)
- [License](#license)
- [Test call](#test-call)
## Installation
- Create and activate a new conda env, e.g. `conda create -n myenv python=3.8 & conda activate myenv`.
- Clone ABACUS main repository and `cd abacus-develop/python/pyabacus`.
- Build pyabacus by `pip install -v .` or install test dependencies & build pyabacus by `pip install .[test]`. (Use `pip install -v .[test] -i https://pypi.tuna.tsinghua.edu.cn/simple` to accelerate installation process.)
## CI Examples
There are examples for CI in `.github/workflows`. A simple way to produces
binary "wheels" for all platforms is illustrated in the "wheels.yml" file,
using .
Use `pytest -v` to run all the unit tests for pyabacus in the local machine.
```shell
$ cd tests/
$ pytest -v
```
Run `python vis_nao.py` to visualize the numerical orbital.
```shell
$ cd examples/
$ python vis_nao.py
```
Run `python ex_s_rotate.py` in `examples` to check the S matrix.
```shell
$ cd examples/
$ python ex_s_rotate.py
norm(S_e3 - S_numer) = 3.341208104032616e-15
```
Run `python diago_matrix.py` in `examples` to check the diagonalization of a matrix.
```shell
$ cd examples/
$ python diago_matrix.py
====== Calculating eigenvalues using davidson method... ======
eigenvalues calculated by pyabacus-davidson is:
[-0.38440611 0.24221155 0.31593272 0.53144616 0.85155108 1.06950154
1.11142053 1.12462153]
eigenvalues calculated by scipy is:
[-0.38440611 0.24221155 0.31593272 0.53144616 0.85155108 1.06950154
1.11142051 1.12462151]
eigenvalues difference:
[4.47258897e-12 5.67104697e-12 8.48299209e-12 1.08900666e-11
1.87927451e-12 3.15688586e-10 2.11438165e-08 2.68884972e-08]
====== Calculating eigenvalues using dav_subspace method... ======
enter diag... is_subspace = 0, ntry = 0
eigenvalues calculated by pyabacus-dav_subspace is:
[-0.38440611 0.24221155 0.31593272 0.53144616 0.85155108 1.06950154
1.11142051 1.12462153]
eigenvalues calculated by scipy is:
[-0.38440611 0.24221155 0.31593272 0.53144616 0.85155108 1.06950154
1.11142051 1.12462151]
eigenvalues difference:
[ 4.64694949e-12 2.14706031e-12 1.09236509e-11 4.66293670e-13
-8.94295749e-12 4.71351846e-11 5.39378986e-10 1.97244101e-08]
```
## License
pybind11 is provided under a BSD-style license that can be found in the LICENSE
file. By using, distributing, or contributing to this project, you agree to the
terms and conditions of this license.
## Test call
```python
import pyabacus as m
s = m.ModuleBase.Sphbes()
s.sphbesj(1, 0.0)
0.0
```
[`cibuildwheel`]: https://cibuildwheel.readthedocs.io