adsorpy 1.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- adsorpy-1.0.3/.github/workflows/docs-ci.yml +68 -0
- adsorpy-1.0.3/.github/workflows/publish_to_PyPI.yml +49 -0
- adsorpy-1.0.3/.github/workflows/tests-ci.yml +45 -0
- adsorpy-1.0.3/CHANGELOG.md +57 -0
- adsorpy-1.0.3/LICENSE.md +21 -0
- adsorpy-1.0.3/PKG-INFO +97 -0
- adsorpy-1.0.3/README.md +50 -0
- adsorpy-1.0.3/docs/Makefile +20 -0
- adsorpy-1.0.3/docs/make.bat +35 -0
- adsorpy-1.0.3/docs/source/adsorpy.molecule_lib.rst +7 -0
- adsorpy-1.0.3/docs/source/adsorpy.randomsequentialadsorption.rst +7 -0
- adsorpy-1.0.3/docs/source/adsorpy.rsa_calculator.rst +7 -0
- adsorpy-1.0.3/docs/source/adsorpy.rsa_config.rst +7 -0
- adsorpy-1.0.3/docs/source/adsorpy.rst +19 -0
- adsorpy-1.0.3/docs/source/adsorpy.run_simulation.rst +7 -0
- adsorpy-1.0.3/docs/source/conf.py +109 -0
- adsorpy-1.0.3/docs/source/index.rst +21 -0
- adsorpy-1.0.3/docs/source/modules.rst +7 -0
- adsorpy-1.0.3/images/AdsorPy_Covered_Surface.png +0 -0
- adsorpy-1.0.3/py.typed +0 -0
- adsorpy-1.0.3/pyproject.toml +204 -0
- adsorpy-1.0.3/requirements.txt +5 -0
- adsorpy-1.0.3/requirements_dev.txt +8 -0
- adsorpy-1.0.3/src/__init__.py +0 -0
- adsorpy-1.0.3/src/__main__.py +8 -0
- adsorpy-1.0.3/src/adsorpy/VdW_Radii.csv +93 -0
- adsorpy-1.0.3/src/adsorpy/__init__.py +17 -0
- adsorpy-1.0.3/src/adsorpy/config.json +56 -0
- adsorpy-1.0.3/src/adsorpy/molecule_colour.json +111 -0
- adsorpy-1.0.3/src/adsorpy/molecule_lib.py +656 -0
- adsorpy-1.0.3/src/adsorpy/randomsequentialadsorption.py +1612 -0
- adsorpy-1.0.3/src/adsorpy/rsa_calculator.py +344 -0
- adsorpy-1.0.3/src/adsorpy/rsa_config.py +86 -0
- adsorpy-1.0.3/src/adsorpy/run_simulation.py +572 -0
- adsorpy-1.0.3/tests/__init__.py +0 -0
- adsorpy-1.0.3/tests/rsa_test.py +523 -0
- adsorpy-1.0.3/tests/run_simulation_test.py +312 -0
- adsorpy-1.0.3/tests/test_data/config_test_hard.json +56 -0
- adsorpy-1.0.3/tests/test_data/config_test_periodic.json +56 -0
- adsorpy-1.0.3/tests/test_data/config_test_soft.json +56 -0
- adsorpy-1.0.3/tox.ini +33 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
|
|
2
|
+
name: Docs
|
|
3
|
+
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
branches: [ "main" ]
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
# Top-level permissions for Pages (recommended)
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
pages: write
|
|
13
|
+
id-token: write
|
|
14
|
+
|
|
15
|
+
concurrency:
|
|
16
|
+
group: "pages"
|
|
17
|
+
cancel-in-progress: true
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
deploy-docs:
|
|
21
|
+
name: Build and Upload Docs Artifact
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
# needs: test
|
|
24
|
+
|
|
25
|
+
steps:
|
|
26
|
+
- name: Checkout
|
|
27
|
+
uses: actions/checkout@v6
|
|
28
|
+
|
|
29
|
+
- name: Set up Python
|
|
30
|
+
uses: actions/setup-python@v6
|
|
31
|
+
with:
|
|
32
|
+
python-version: '3.13'
|
|
33
|
+
|
|
34
|
+
- name: Install Sphinx and theme
|
|
35
|
+
run: |
|
|
36
|
+
python -m pip install --upgrade pip
|
|
37
|
+
python -m pip install -e .
|
|
38
|
+
python -m pip install sphinx furo sphinx_design sphinx-autodoc-typehints
|
|
39
|
+
|
|
40
|
+
# Optional: configure Pages (sets up base_url, etc.)
|
|
41
|
+
- name: Configure Pages
|
|
42
|
+
uses: actions/configure-pages@v6
|
|
43
|
+
|
|
44
|
+
- name: Build Sphinx docs
|
|
45
|
+
run: |
|
|
46
|
+
mkdir -p public
|
|
47
|
+
# python -m sphinx docs/source public
|
|
48
|
+
python -m sphinx -W docs/source public
|
|
49
|
+
|
|
50
|
+
- name: Upload artifact for Pages
|
|
51
|
+
uses: actions/upload-pages-artifact@v5
|
|
52
|
+
with:
|
|
53
|
+
path: ./public
|
|
54
|
+
|
|
55
|
+
deploy:
|
|
56
|
+
name: Deploy to GitHub Pages
|
|
57
|
+
runs-on: ubuntu-latest
|
|
58
|
+
needs: deploy-docs
|
|
59
|
+
environment:
|
|
60
|
+
name: github-pages
|
|
61
|
+
url: ${{ steps.deploy-pages.outputs.page_url }}
|
|
62
|
+
permissions:
|
|
63
|
+
pages: write
|
|
64
|
+
id-token: write
|
|
65
|
+
steps:
|
|
66
|
+
- name: Deploy to GitHub Pages
|
|
67
|
+
id: deploy-pages
|
|
68
|
+
uses: actions/deploy-pages@v5
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
on:
|
|
2
|
+
release:
|
|
3
|
+
types:
|
|
4
|
+
- published
|
|
5
|
+
|
|
6
|
+
name: release
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
pypi:
|
|
10
|
+
name: upload release to PyPI
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
permissions:
|
|
13
|
+
id-token: write
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v6
|
|
16
|
+
|
|
17
|
+
- uses: actions/setup-python@v6
|
|
18
|
+
with:
|
|
19
|
+
python-version: "3.x"
|
|
20
|
+
|
|
21
|
+
- name: deps
|
|
22
|
+
run: python -m pip install -U build
|
|
23
|
+
|
|
24
|
+
- name: build
|
|
25
|
+
run: python -m build
|
|
26
|
+
|
|
27
|
+
- name: mint API token
|
|
28
|
+
id: mint-token
|
|
29
|
+
run: |
|
|
30
|
+
# retrieve the ambient OIDC token
|
|
31
|
+
resp=$(curl -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
|
|
32
|
+
"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi")
|
|
33
|
+
oidc_token=$(jq -r '.value' <<< "${resp}")
|
|
34
|
+
|
|
35
|
+
# exchange the OIDC token for an API token
|
|
36
|
+
resp=$(curl -X POST https://pypi.org/_/oidc/mint-token -d "{\"token\": \"${oidc_token}\"}")
|
|
37
|
+
api_token=$(jq -r '.token' <<< "${resp}")
|
|
38
|
+
|
|
39
|
+
# mask the newly minted API token, so that we don't accidentally leak it
|
|
40
|
+
echo "::add-mask::${api_token}"
|
|
41
|
+
|
|
42
|
+
# see the next step in the workflow for an example of using this step output
|
|
43
|
+
echo "api-token=${api_token}" >> "${GITHUB_OUTPUT}"
|
|
44
|
+
|
|
45
|
+
- name: publish
|
|
46
|
+
# gh-action-pypi-publish uses TWINE_PASSWORD automatically
|
|
47
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
48
|
+
with:
|
|
49
|
+
password: ${{ steps.mint-token.outputs.api-token }}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
|
|
2
|
+
name: CI
|
|
3
|
+
|
|
4
|
+
on:
|
|
5
|
+
push:
|
|
6
|
+
paths:
|
|
7
|
+
- "src/**"
|
|
8
|
+
- "tests/**"
|
|
9
|
+
pull_request:
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
test:
|
|
13
|
+
name: Python Tests
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
strategy:
|
|
16
|
+
matrix:
|
|
17
|
+
python-version: [ '3.10', '3.11', '3.12', '3.13', '3.14' ]
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v6
|
|
20
|
+
|
|
21
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
22
|
+
uses: actions/setup-python@v6
|
|
23
|
+
with:
|
|
24
|
+
python-version: ${{ matrix.python-version }}
|
|
25
|
+
|
|
26
|
+
- name: Upgrade pip
|
|
27
|
+
run: python -m pip install --upgrade pip
|
|
28
|
+
|
|
29
|
+
- name: Install tox and plugins
|
|
30
|
+
run: pip install tox tox-gh-actions
|
|
31
|
+
|
|
32
|
+
- name: Run tests with tox
|
|
33
|
+
run: tox -e ruff,mypy,py${{ matrix.python-version }}
|
|
34
|
+
|
|
35
|
+
- name: Upload test results
|
|
36
|
+
if: always() && matrix.python-version == '3.13'
|
|
37
|
+
uses: actions/upload-artifact@v7
|
|
38
|
+
with:
|
|
39
|
+
name: junit-results
|
|
40
|
+
path: results.xml
|
|
41
|
+
|
|
42
|
+
- name: Upload coverage reports to Codecov
|
|
43
|
+
uses: codecov/codecov-action@v6
|
|
44
|
+
with:
|
|
45
|
+
token: ${{ secrets.GIST_SECRET }}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
All important changes to ``AdsorPy`` will be documented in this file.
|
|
3
|
+
|
|
4
|
+
This format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).
|
|
5
|
+
|
|
6
|
+
## [unreleased]
|
|
7
|
+
### Added
|
|
8
|
+
### Changed
|
|
9
|
+
### Fixed
|
|
10
|
+
### Removed
|
|
11
|
+
|
|
12
|
+
## 1.0.3 - 2026-04-28
|
|
13
|
+
### Added
|
|
14
|
+
- Add the ``Simulator`` class as 6th return value of ``run_simulation()``.
|
|
15
|
+
- Add overlap and gap size subtests to the dosing scheme tests of ``run_simulation_test``.
|
|
16
|
+
- Add ``__version__``, ``__name__``, ``__author__``, and ``__author_email__`` to ``__init__.py``.
|
|
17
|
+
### Changed
|
|
18
|
+
- Update CI action/deploy-pages to v5. Update CI action/upload-artifact to v7.
|
|
19
|
+
- Move overlap and gap size test for alt simulation to subtests.
|
|
20
|
+
- Update dependency versions.
|
|
21
|
+
### Fixed
|
|
22
|
+
- Fix ``pyproject.toml``: ``"AdsorPy" = ["py.typed"]`` (from ``rsa-mc``, the old internal project name.)
|
|
23
|
+
- Turn relative imports into absolute imports to make the package pip-installable.
|
|
24
|
+
- Fix the type hints that broke as a result of this.
|
|
25
|
+
- Update ``pyproject.toml`` to have the appropriate keywords and classifiers. The project does not show up on the PyPI index but can be installed from it.
|
|
26
|
+
### Removed
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
## 1.0.2 - 2026-04-23
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
- Update CI actions to move from ``node.js`` 20 to 24.
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
|
|
38
|
+
### Removed
|
|
39
|
+
- Remove unnecessary type casts.
|
|
40
|
+
|
|
41
|
+
## 1.0.1 - 2026-04-23
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
- Implement subtests for the test_run_alt (a test for the RSA simulator on an alternative seed).
|
|
45
|
+
- Add a determinism test to show identical outcome for identical seeds.
|
|
46
|
+
- In ``tool.ruff.lint``: use ``future-annotations = true``, this correctly checks ``__future__`` annotation.
|
|
47
|
+
### Changed
|
|
48
|
+
- Update version dependencies.
|
|
49
|
+
- Strengthen seed comparison test.
|
|
50
|
+
- Vectorise (remove a for-loop) from overlap test.
|
|
51
|
+
|
|
52
|
+
### Fixed
|
|
53
|
+
|
|
54
|
+
### Removed
|
|
55
|
+
|
|
56
|
+
## 1.0.0 - 2025-11-29
|
|
57
|
+
- Full release
|
adsorpy-1.0.3/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 J.F.W. Maas
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
adsorpy-1.0.3/PKG-INFO
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: adsorpy
|
|
3
|
+
Version: 1.0.3
|
|
4
|
+
Summary: Random sequential adsorption (RSA) simulation, 2D lattice-based.
|
|
5
|
+
Project-URL: Repository, https://github.com/JoostFWMaas/AdsorPy
|
|
6
|
+
Project-URL: Documentation, https://joostfwmaas.github.io/AdsorPy
|
|
7
|
+
Project-URL: Changelog, https://github.com/JoostFWMaas/AdsorPy/blob/main/CHANGELOG.md
|
|
8
|
+
Author-email: "J.F.W. Maas" <j.f.w.maas@tue.nl>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE.md
|
|
11
|
+
Keywords: Monte Carlo,RSA,adsorption,computational chemistry,computational physics,coverage,gap size distribution,jamming,lattice model,molecular adsorption,packing,random sequential adsorption,statistical mechanics,stochastic simulation,surface science
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Natural Language :: English
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
26
|
+
Classifier: Topic :: Scientific/Engineering
|
|
27
|
+
Classifier: Topic :: Scientific/Engineering :: Chemistry
|
|
28
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
29
|
+
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
30
|
+
Classifier: Topic :: Software Development
|
|
31
|
+
Classifier: Typing :: Typed
|
|
32
|
+
Requires-Python: >=3.10
|
|
33
|
+
Requires-Dist: matplotlib
|
|
34
|
+
Requires-Dist: numba
|
|
35
|
+
Requires-Dist: numpy
|
|
36
|
+
Requires-Dist: rtree
|
|
37
|
+
Requires-Dist: shapely
|
|
38
|
+
Provides-Extra: testing
|
|
39
|
+
Requires-Dist: hypothesis; extra == 'testing'
|
|
40
|
+
Requires-Dist: mypy; extra == 'testing'
|
|
41
|
+
Requires-Dist: pytest; extra == 'testing'
|
|
42
|
+
Requires-Dist: pytest-cov; extra == 'testing'
|
|
43
|
+
Requires-Dist: ruff; extra == 'testing'
|
|
44
|
+
Requires-Dist: scipy==1.15.3; (python_version <= '3.10') and extra == 'testing'
|
|
45
|
+
Requires-Dist: scipy>=1.16.3; (python_version > '3.10') and extra == 'testing'
|
|
46
|
+
Description-Content-Type: text/markdown
|
|
47
|
+
|
|
48
|
+
# AdsorPy
|
|
49
|
+
|
|
50
|
+

|
|
51
|
+
|
|
52
|
+

|
|
53
|
+
[](https://codecov.io/github/JoostFWMaas/AdsorPy)
|
|
54
|
+
|
|
55
|
+
Lattice-based random sequential adsorption (RSA) Python 3.10+ script.
|
|
56
|
+
|
|
57
|
+
In RSA, molecules arrive one by one at a surface. Adsorption takes place if the molecule does not overlap with molecules
|
|
58
|
+
already on the surface.
|
|
59
|
+
The list of available orientations for the molecule is traversed in random order until the first orientation that fits
|
|
60
|
+
is found, or until the list is exhausted.
|
|
61
|
+
All available sites are checked, and various metrics can be extracted afterwards such as the coverage, covered area, and
|
|
62
|
+
gap size distribution.
|
|
63
|
+
|
|
64
|
+
## How to use
|
|
65
|
+
|
|
66
|
+
Run the `adsorpy.main` in order to run a simple single run using the standard disk-shaped molecule on hexagonal aluminium oxide.
|
|
67
|
+
New molecules can be created by running the `adsorpy.molecule_lib` or by calling the `adsorpy.molecule_lib.first_time_loader()` function. Molecules can be generated from `.xyz` files. It is
|
|
68
|
+
recommended to run `adsorpy.molecule_lib` directly from command line to define the molecule orientation, then store the new
|
|
69
|
+
molecule string for repeated use.
|
|
70
|
+
|
|
71
|
+
Run the `adsorpy.run_simulation.run_simulation()` function with the molecule footprints generated in the previous step. Output can be printed to stdout, plotted, and saved.
|
|
72
|
+
|
|
73
|
+
User friendliness will be updated at a later stage, allowing the user to define simulation modes, surfaces, and
|
|
74
|
+
molecules more easily.
|
|
75
|
+
|
|
76
|
+
Documentation (generated with `Sphinx`): https://joostfwmaas.github.io/AdsorPy/
|
|
77
|
+
|
|
78
|
+
## Future additions
|
|
79
|
+
|
|
80
|
+
In a future update, the code will be expanded with diffusion, desorption, and species conversion (changing from one molecule on the surface to another).
|
|
81
|
+
|
|
82
|
+
## Design philosophy
|
|
83
|
+
|
|
84
|
+
Because AdsorPy has been made with scientific rigour in mind, the package is tested in multiple ways:
|
|
85
|
+
- Unit tests (`Pytest`) of the code ensure correct behaviour for expected input.
|
|
86
|
+
- Property tests (`Hypothesis`) of the most critical code components ensure correct behaviour for unexpected input as well.
|
|
87
|
+
- `Mypy` (in `--strict` mode) ensures that the package is correctly-typed, as if it were static. The `py.typed` file--a promise that the code is type-hinted properly--is added because the code passes this test.
|
|
88
|
+
- `Ruff` is used as a linter with almost all rules enabled (see the pyproject.toml for the list of exclusions and reasons).
|
|
89
|
+
- `Tox` is used to run all of the aforementioned tests in parallel for multiple Python versions to ensure correct behaviour.
|
|
90
|
+
- CI is used for automated testing.
|
|
91
|
+
|
|
92
|
+
The package also makes use of an optional config file that falls back on standard behaviour, because configs are often used in scientific software (set-and-forget).
|
|
93
|
+
|
|
94
|
+
# Openness and academic collaboration
|
|
95
|
+
|
|
96
|
+
The script was made public for the sake of openness and academic collaboration. Please let me know if you have questions about the script, or if you have discovered any issues/bugs.
|
|
97
|
+
At the end of this file, I will place a list of papers that make use of this work. Feel free to contact me if you want your work to be added to the list as well.
|
adsorpy-1.0.3/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# AdsorPy
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
[](https://codecov.io/github/JoostFWMaas/AdsorPy)
|
|
7
|
+
|
|
8
|
+
Lattice-based random sequential adsorption (RSA) Python 3.10+ script.
|
|
9
|
+
|
|
10
|
+
In RSA, molecules arrive one by one at a surface. Adsorption takes place if the molecule does not overlap with molecules
|
|
11
|
+
already on the surface.
|
|
12
|
+
The list of available orientations for the molecule is traversed in random order until the first orientation that fits
|
|
13
|
+
is found, or until the list is exhausted.
|
|
14
|
+
All available sites are checked, and various metrics can be extracted afterwards such as the coverage, covered area, and
|
|
15
|
+
gap size distribution.
|
|
16
|
+
|
|
17
|
+
## How to use
|
|
18
|
+
|
|
19
|
+
Run the `adsorpy.main` in order to run a simple single run using the standard disk-shaped molecule on hexagonal aluminium oxide.
|
|
20
|
+
New molecules can be created by running the `adsorpy.molecule_lib` or by calling the `adsorpy.molecule_lib.first_time_loader()` function. Molecules can be generated from `.xyz` files. It is
|
|
21
|
+
recommended to run `adsorpy.molecule_lib` directly from command line to define the molecule orientation, then store the new
|
|
22
|
+
molecule string for repeated use.
|
|
23
|
+
|
|
24
|
+
Run the `adsorpy.run_simulation.run_simulation()` function with the molecule footprints generated in the previous step. Output can be printed to stdout, plotted, and saved.
|
|
25
|
+
|
|
26
|
+
User friendliness will be updated at a later stage, allowing the user to define simulation modes, surfaces, and
|
|
27
|
+
molecules more easily.
|
|
28
|
+
|
|
29
|
+
Documentation (generated with `Sphinx`): https://joostfwmaas.github.io/AdsorPy/
|
|
30
|
+
|
|
31
|
+
## Future additions
|
|
32
|
+
|
|
33
|
+
In a future update, the code will be expanded with diffusion, desorption, and species conversion (changing from one molecule on the surface to another).
|
|
34
|
+
|
|
35
|
+
## Design philosophy
|
|
36
|
+
|
|
37
|
+
Because AdsorPy has been made with scientific rigour in mind, the package is tested in multiple ways:
|
|
38
|
+
- Unit tests (`Pytest`) of the code ensure correct behaviour for expected input.
|
|
39
|
+
- Property tests (`Hypothesis`) of the most critical code components ensure correct behaviour for unexpected input as well.
|
|
40
|
+
- `Mypy` (in `--strict` mode) ensures that the package is correctly-typed, as if it were static. The `py.typed` file--a promise that the code is type-hinted properly--is added because the code passes this test.
|
|
41
|
+
- `Ruff` is used as a linter with almost all rules enabled (see the pyproject.toml for the list of exclusions and reasons).
|
|
42
|
+
- `Tox` is used to run all of the aforementioned tests in parallel for multiple Python versions to ensure correct behaviour.
|
|
43
|
+
- CI is used for automated testing.
|
|
44
|
+
|
|
45
|
+
The package also makes use of an optional config file that falls back on standard behaviour, because configs are often used in scientific software (set-and-forget).
|
|
46
|
+
|
|
47
|
+
# Openness and academic collaboration
|
|
48
|
+
|
|
49
|
+
The script was made public for the sake of openness and academic collaboration. Please let me know if you have questions about the script, or if you have discovered any issues/bugs.
|
|
50
|
+
At the end of this file, I will place a list of papers that make use of this work. Feel free to contact me if you want your work to be added to the list as well.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Minimal makefile for Sphinx documentation
|
|
2
|
+
#
|
|
3
|
+
|
|
4
|
+
# You can set these variables from the command line, and also
|
|
5
|
+
# from the environment for the first two.
|
|
6
|
+
SPHINXOPTS ?=
|
|
7
|
+
SPHINXBUILD ?= sphinx-build
|
|
8
|
+
SOURCEDIR = source
|
|
9
|
+
BUILDDIR = build
|
|
10
|
+
|
|
11
|
+
# Put it first so that "make" without argument is like "make help".
|
|
12
|
+
help:
|
|
13
|
+
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
|
14
|
+
|
|
15
|
+
.PHONY: help Makefile
|
|
16
|
+
|
|
17
|
+
# Catch-all target: route all unknown targets to Sphinx using the new
|
|
18
|
+
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
|
19
|
+
%: Makefile
|
|
20
|
+
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
@ECHO OFF
|
|
2
|
+
|
|
3
|
+
pushd %~dp0
|
|
4
|
+
|
|
5
|
+
REM Command file for Sphinx documentation
|
|
6
|
+
|
|
7
|
+
if "%SPHINXBUILD%" == "" (
|
|
8
|
+
set SPHINXBUILD=sphinx-build
|
|
9
|
+
)
|
|
10
|
+
set SOURCEDIR=source
|
|
11
|
+
set BUILDDIR=build
|
|
12
|
+
|
|
13
|
+
%SPHINXBUILD% >NUL 2>NUL
|
|
14
|
+
if errorlevel 9009 (
|
|
15
|
+
echo.
|
|
16
|
+
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
|
|
17
|
+
echo.installed, then set the SPHINXBUILD environment variable to point
|
|
18
|
+
echo.to the full path of the 'sphinx-build' executable. Alternatively you
|
|
19
|
+
echo.may add the Sphinx directory to PATH.
|
|
20
|
+
echo.
|
|
21
|
+
echo.If you don't have Sphinx installed, grab it from
|
|
22
|
+
echo.https://www.sphinx-doc.org/
|
|
23
|
+
exit /b 1
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
if "%1" == "" goto help
|
|
27
|
+
|
|
28
|
+
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
|
|
29
|
+
goto end
|
|
30
|
+
|
|
31
|
+
:help
|
|
32
|
+
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
|
|
33
|
+
|
|
34
|
+
:end
|
|
35
|
+
popd
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
adsorpy package
|
|
2
|
+
===============
|
|
3
|
+
|
|
4
|
+
.. automodule:: adsorpy
|
|
5
|
+
:members:
|
|
6
|
+
:show-inheritance:
|
|
7
|
+
:undoc-members:
|
|
8
|
+
|
|
9
|
+
Submodules
|
|
10
|
+
----------
|
|
11
|
+
|
|
12
|
+
.. toctree::
|
|
13
|
+
:maxdepth: 4
|
|
14
|
+
|
|
15
|
+
adsorpy.molecule_lib
|
|
16
|
+
adsorpy.randomsequentialadsorption
|
|
17
|
+
adsorpy.rsa_calculator
|
|
18
|
+
adsorpy.rsa_config
|
|
19
|
+
adsorpy.run_simulation
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
# Configuration file for the Sphinx documentation builder.
|
|
5
|
+
#
|
|
6
|
+
# For the full list of built-in configuration values, see the documentation:
|
|
7
|
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
|
8
|
+
|
|
9
|
+
# -- Project information -----------------------------------------------------
|
|
10
|
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
|
|
11
|
+
|
|
12
|
+
project = "AdsorPy"
|
|
13
|
+
copyright = "2025, J.F.W. Maas"
|
|
14
|
+
author = "J.F.W. Maas"
|
|
15
|
+
version = "1.0"
|
|
16
|
+
release = "1.0.0"
|
|
17
|
+
|
|
18
|
+
# -- General configuration ---------------------------------------------------
|
|
19
|
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
|
|
20
|
+
|
|
21
|
+
extensions = [
|
|
22
|
+
"sphinx.ext.duration",
|
|
23
|
+
"sphinx.ext.doctest",
|
|
24
|
+
"sphinx.ext.autodoc",
|
|
25
|
+
"sphinx.ext.autosummary",
|
|
26
|
+
"sphinx.ext.napoleon",
|
|
27
|
+
"sphinx_autodoc_typehints",
|
|
28
|
+
"sphinx.ext.viewcode",
|
|
29
|
+
"sphinx.ext.githubpages",
|
|
30
|
+
'sphinx.ext.intersphinx',
|
|
31
|
+
"sphinx_design",
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
intersphinx_mapping = {
|
|
35
|
+
'numpy': ('https://numpy.org/doc/stable/', None),
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
sd_custom_directives = {
|
|
40
|
+
"dropdown-syntax": {
|
|
41
|
+
"inherit": "dropdown",
|
|
42
|
+
"argument": "Syntax",
|
|
43
|
+
"options": {
|
|
44
|
+
"color": "primary",
|
|
45
|
+
"icon": "code",
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
templates_path = ["_templates"]
|
|
51
|
+
# source_dir = "."
|
|
52
|
+
|
|
53
|
+
# autodoc_member_order = "bysource"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# List of patterns, relative to source directory, that match files and
|
|
57
|
+
# directories to ignore when looking for source files.
|
|
58
|
+
# This pattern also affects html_static_path and html_extra_path.
|
|
59
|
+
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "scripts/*.rst"]
|
|
60
|
+
|
|
61
|
+
automodule_path = [""]
|
|
62
|
+
automodule_members = True
|
|
63
|
+
autoclass_content = "both"
|
|
64
|
+
|
|
65
|
+
autodoc_default_options = {
|
|
66
|
+
"members": True,
|
|
67
|
+
"undoc-members": True,
|
|
68
|
+
"private-members": True,
|
|
69
|
+
"special-members": "__init__",
|
|
70
|
+
"inherited-members": True,
|
|
71
|
+
"show-inheritance": True,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
autodoc_member_order = "bysource"
|
|
75
|
+
|
|
76
|
+
suppress_warnings = ["config.cache"]
|
|
77
|
+
|
|
78
|
+
# -- Options for HTML output -------------------------------------------------
|
|
79
|
+
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
|
|
80
|
+
|
|
81
|
+
html_theme = "furo"
|
|
82
|
+
html_title = "AdsorPy 2D lattice-based random sequential adsorption (RSA)"
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
# Get the path to the directory containing the Python modules to mock
|
|
86
|
+
module_directory = Path("../../src/adsorpy/")
|
|
87
|
+
|
|
88
|
+
# Get the path to the directory containing the Python modules to mock
|
|
89
|
+
|
|
90
|
+
# Get a list of all .py files in the directory
|
|
91
|
+
py_files = module_directory.glob("*.py")
|
|
92
|
+
|
|
93
|
+
# Extract the module names from the filenames
|
|
94
|
+
module_names = [f.stem for f in py_files]
|
|
95
|
+
print(module_names)
|
|
96
|
+
|
|
97
|
+
# List of modules to mock during documentation build
|
|
98
|
+
autodoc_mock_imports = module_names
|
|
99
|
+
|
|
100
|
+
# -- Path setup --------------------------------------------------------------
|
|
101
|
+
|
|
102
|
+
# If extensions (or modules to document with autodoc) are in another directory,
|
|
103
|
+
# add these directories to sys.path here. If the directory is relative to the
|
|
104
|
+
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
|
105
|
+
#
|
|
106
|
+
|
|
107
|
+
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "src"))
|
|
108
|
+
|
|
109
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
.. Random Sequential Adsorption documentation master file, created by
|
|
2
|
+
sphinx-quickstart on Fri Apr 26 02:12:35 2024.
|
|
3
|
+
You can adapt this file completely to your liking, but it should at least
|
|
4
|
+
contain the root `toctree` directive.
|
|
5
|
+
|
|
6
|
+
Welcome to the documentation of AdsorPy!
|
|
7
|
+
========================================
|
|
8
|
+
|
|
9
|
+
.. toctree::
|
|
10
|
+
:maxdepth: 4
|
|
11
|
+
:caption: Contents:
|
|
12
|
+
|
|
13
|
+
modules
|
|
14
|
+
|
|
15
|
+
Indices and tables
|
|
16
|
+
==================
|
|
17
|
+
|
|
18
|
+
* :ref:`genindex`
|
|
19
|
+
* :ref:`modindex`
|
|
20
|
+
* :ref:`search`
|
|
21
|
+
|
|
Binary file
|
adsorpy-1.0.3/py.typed
ADDED
|
File without changes
|