diff --git a/.github/workflows/ci.yml b/.github/workflows/ci-linux.yml similarity index 52% rename from .github/workflows/ci.yml rename to .github/workflows/ci-linux.yml index 8c3dd66c1..2421f42c4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci-linux.yml @@ -1,4 +1,4 @@ -name: CI +name: CI Linux on: - push @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.9, "3.10", "3.11"] + python-version: ["3.9", "3.10", "3.11"] steps: - name: apt install @@ -25,8 +25,17 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install tox tox-gh-actions - - name: Test with tox + pip install pdm nox + - name: Test with nox run: | + # needed to avoid a pdm/unearth bug + $(hg debuginstall -T '{pythonexe}') -m pip install hg-evolve hg-git --no-cache-dir --user + cp docker/hgrc $HOME/.hgrc cp .github/workflows/.fluidfft-site.cfg $HOME - tox + nox -s test_without_fft_and_pythran + nox -s test_with_fft_and_pythran + - uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: true # optional (default = false) + verbose: true # optional (default = false) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 734c6c5ba..bc76b5665 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,12 +2,22 @@ stages: - image - lint - test + - report + - doc variables: - CODECOV_TOKEN: 4d2d8534-60ec-48b3-bf55-93b92f25913d + COVERAGE_DIR: .coverage_$CI_COMMIT_SHA image: registry.heptapod.net:443/fluiddyn/fluidsim/ci/default:stable +# ugly workaround https://gitlab.com/gitlab-org/gitlab/-/issues/370052#note_1207556577 +workflow: + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS + when: never + - if: $CI_COMMIT_BRANCH + # check_bug: # image: fluiddyn/python3-stable:lastest # script: @@ -48,20 +58,83 @@ CI image: --cleanup --destination registry.heptapod.net:443/fluiddyn/fluidsim/ci/$CI_COMMIT_HG_BRANCH:stable + validate_code: stage: lint needs: - job: "CI image" optional: true script: - - pdm install -G dev --no-self - - pdm run make lint - - pdm run make black_check + - echo "CI_COMMIT_HG_BRANCH $CI_COMMIT_HG_BRANCH" + - echo "CI_COMMIT_BRANCH $CI_COMMIT_BRANCH" + - nox -s validate_code + + +test_without_fft_and_pythran: + stage: test + needs: + - job: "CI image" + optional: true + script: + - nox -s test_without_fft_and_pythran + - mkdir $COVERAGE_DIR + - cp -r .coverage/* $COVERAGE_DIR + artifacts: + paths: + - $COVERAGE_DIR/* + expire_in: 60 mins -tests: +test_with_fft_and_pythran: stage: test needs: - job: "CI image" optional: true script: - - tox -e py39,py39-fft,codecov + - nox -s test_with_fft_and_pythran + - mkdir $COVERAGE_DIR + - cp -r .coverage/* $COVERAGE_DIR + artifacts: + paths: + - $COVERAGE_DIR/* + expire_in: 60 mins + + +report_coverage: + stage: report + rules: + - when: on_success + script: + - mv $COVERAGE_DIR .coverage + - pip install coverage + - coverage combine + - coverage report + + +doc:build: + stage: doc + needs: + - job: "CI image" + optional: true + variables: + FLUIDFFT_TRANSONIC_BACKEND: "python" + script: + - python -m venv .venv + - . .venv/bin/activate + - pip install fluidfft + - pdm install -G doc -G fft -G test --no-self + - pip install . --config-settings=setup-args=-Dtransonic-backend=python + - pdm run xvfb-run --auto-servernum sphinx-build -b html -d doc/_build/doctrees doc doc/_build/html + - mkdir -p public/$CI_COMMIT_REF_NAME + - rsync -rvc --delete doc/_build/html/* public/$CI_COMMIT_REF_NAME/ + # This directory can become too large leading to error. + # It can be purged with the botton "Clear runner caches" + # in https://foss.heptapod.net/fluiddyn/fluidsim/-/pipelines + - ls public + - echo "CI_COMMIT_REF_NAME="$CI_COMMIT_REF_NAME + - echo See https://fluiddyn.pages.heptapod.net/fluidsim/$CI_COMMIT_REF_NAME + artifacts: + name: "$CI_COMMIT_REF_NAME" + paths: + - public + expire_in: 5 days + when: always diff --git a/.hgignore b/.hgignore index 33d33ea1a..23c603e0e 100644 --- a/.hgignore +++ b/.hgignore @@ -18,6 +18,7 @@ __pycache__ .pytest_cache/ .mypy_cache/ .coverage/ +.nox bench/launcher_* bench/SLURM* diff --git a/.readthedocs.req b/.readthedocs.req deleted file mode 100644 index e83fc10f4..000000000 --- a/.readthedocs.req +++ /dev/null @@ -1 +0,0 @@ -./lib \ No newline at end of file diff --git a/.readthedocs.yml b/.readthedocs.yml index 5a643b7c0..c925ba75d 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,24 +1,17 @@ -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required version: 2 -# Set the version of Python and other tools you might need build: os: ubuntu-22.04 tools: python: "3.11" + jobs: + post_create_environment: + - pip install pdm pip -U + post_install: + - pdm use -f $READTHEDOCS_VIRTUALENV_PATH + - FLUIDFFT_TRANSONIC_BACKEND="python" pip install fluidfft + - pdm install -G doc -G fft -G test --no-self + - pip install . --config-settings=setup-args=-Dtransonic-backend=python -# Build documentation in the doc directory with Sphinx sphinx: configuration: doc/conf.py - -python: - install: - - requirements: .readthedocs.req - - method: pip - path: . - extra_requirements: - - doc - - fft diff --git a/Makefile b/Makefile index 4dfef067b..267752d4c 100644 --- a/Makefile +++ b/Makefile @@ -37,10 +37,16 @@ shortlog: @hg log -M -r$(RELEASE): --template '- {desc|firstline} (:rev:`{node|short}`)\n' black: - black -l 82 fluidsim scripts bench doc lib --exclude "/(__pythran__|__python__|__numba__|doc/_build|\.ipynb_checkpoints/*)/" + pdm black black_check: - black --check -l 82 fluidsim scripts bench doc lib --exclude "/(__pythran__|__python__|__numba__|doc/_build|\.ipynb_checkpoints/*)/" + pdm black_check + +lint: + pdm lint + +validate_code: + pdm validate_code tests: pytest -v lib @@ -84,9 +90,6 @@ _report_coverage: coverage: _tests_coverage _report_coverage -lint: - pylint -rn --rcfile=pylintrc --jobs=$(shell nproc) fluidsim --exit-zero - define _init_coverage rm -rf .coverage mkdir -p .coverage diff --git a/README.md b/README.md new file mode 100644 index 000000000..17465e1b5 --- /dev/null +++ b/README.md @@ -0,0 +1,100 @@ +# ![FluidSim](https://foss.heptapod.net/fluiddyn/fluidsim/raw/branch/default/doc/logo.svg) + +[![Latest version](https://badge.fury.io/py/fluidsim.svg)](https://pypi.python.org/pypi/fluidsim/) +![Supported Python versions](https://img.shields.io/pypi/pyversions/fluidsim.svg) +[![Documentation status](https://readthedocs.org/projects/fluidsim/badge/?version=latest)](http://fluidsim.readthedocs.org) +[![Chat room](https://img.shields.io/matrix/fluiddyn-users:matrix.org.svg)](https://matrix.to/#/#fluiddyn-users:matrix.org) +[![Code coverage](https://codecov.io/gh/fluiddyn/fluidsim/branch/branch%2Fdefault/graph/badge.svg)](https://codecov.io/gh/fluiddyn/fluidsim) +[![Heptapod CI](https://foss.heptapod.net/fluiddyn/fluidsim/badges/branch/default/pipeline.svg)](https://foss.heptapod.net/fluiddyn/fluidsim/-/pipelines) +[![Github Actions](https://github.com/fluiddyn/fluidsim/actions/workflows/ci.yml/badge.svg?branch=branch/default)](https://github.com/fluiddyn/fluidsim/actions) + +Fluidsim is an extensible framework for studying fluid dynamics with +numerical simulations using Python. Fluidsim is an object-oriented +library to develop solvers (mainly using pseudo-spectral methods) by +writing mainly Python code. The result is **very efficient** even +compared to a pure Fortran or C++ code since the time-consuming tasks +are performed by optimized compiled functions. + +**Documentation**: + +## Getting started + +To try fluidsim without installation: +[![Binder notebook](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/fluiddyn/fluidsim/branch%2Fdefault?urlpath=lab/tree/doc/ipynb) + +For a **basic installation** it should be sufficient to run: + + pip install fluidsim + +or with conda: + + conda install -c conda-forge fluidsim + +Much more detailed instructions are given in [the +documentation](https://fluidsim.readthedocs.io/en/latest/install.html). + +## How does it work? + +Fluidsim is a +[HPC](https://en.wikipedia.org/wiki/High-performance_computing) code. It +is part of the wider project +[FluidDyn](https://pypi.python.org/pypi/fluiddyn/) and its +pseudospectral solvers rely on the library +[fluidfft](http://fluidfft.readthedocs.io) to use very efficient FFT +libraries. Fluidfft is written in C++, Cython and Python. Fluidfft and +fluidsim take advantage of +[Pythran](https://github.com/serge-sans-paille/pythran), an +ahead-of-time compiler which produces very efficient binaries by +compiling Python via C++11. + +An advantage of a CFD code written mostly in Python is that, to run +simulations and analyze the results, the users communicate (possibly +interactively) together and with the machine with Python, which is +nowadays among the best languages to do these tasks. Moreover, it is +much simpler and faster than with pure Fortran or C++ codes to add any +complicated analysis or to write a modified solver. Fluidsim can also be +used to extend existing solvers with Python interfaces such as +[Basilisk](http://basilisk.fr). + +We have created fluidsim to be **easy and nice to use and to develop**, +**efficient** and **robust**. + +*Keywords and ambitions*: fluid dynamics research with Python (>=3.6); +modular, object-oriented, collaborative, tested and documented, free and +open-source software. + +## License + +FluidSim is distributed under the +[CeCILL](http://www.cecill.info/index.en.html) License, a GPL compatible +french license. + +## Metapapers and citations + +If you use FluidSim to produce scientific articles, please cite our +metapapers presenting the [FluidDyn +project](https://openresearchsoftware.metajnl.com/articles/10.5334/jors.237/), +[FluidFFT](https://openresearchsoftware.metajnl.com/articles/10.5334/jors.238/), +and +[FluidSim](https://openresearchsoftware.metajnl.com/articles/10.5334/jors.239/): + + @article{fluiddyn, doi = {10.5334/jors.237}, year = {2019}, publisher + = {Ubiquity Press, Ltd.}, volume = {7}, author = {Pierre Augier and + Ashwin Vishnu Mohanan and Cyrille Bonamy}, title = {{FluidDyn}: A + Python Open-Source Framework for Research and Teaching in Fluid + Dynamics by Simulations, Experiments and Data Processing}, journal = + {Journal of Open Research Software} } + + @article{fluidfft, doi = {10.5334/jors.238}, year = {2019}, publisher + = {Ubiquity Press, Ltd.}, volume = {7}, author = {Ashwin Vishnu + Mohanan and Cyrille Bonamy and Pierre Augier}, title = {{FluidFFT}: + Common {API} (C\$mathplusmathplus\$ and Python) for Fast Fourier + Transform {HPC} Libraries}, journal = {Journal of Open Research + Software} } + + @article{fluidsim, doi = {10.5334/jors.239}, year = {2019}, publisher + = {Ubiquity Press, Ltd.}, volume = {7}, author = {Mohanan, Ashwin + Vishnu and Bonamy, Cyrille and Linares, Miguel Calpe and Augier, + Pierre}, title = {{FluidSim}: {Modular}, {Object}-{Oriented} {Python} + {Package} for {High}-{Performance} {CFD} {Simulations}}, journal = + {Journal of Open Research Software} } diff --git a/README.rst b/README.rst deleted file mode 100644 index a9659cf5b..000000000 --- a/README.rst +++ /dev/null @@ -1,147 +0,0 @@ -====== -|logo| -====== - -|release| |pyversions| |docs| |chat| |coverage| |heptapod_ci| |github_actions| - -.. |logo| image:: https://foss.heptapod.net/fluiddyn/fluidsim/raw/branch/default/doc/logo.svg - :alt: FluidSim - -.. |release| image:: https://badge.fury.io/py/fluidsim.svg - :target: https://pypi.python.org/pypi/fluidsim/ - :alt: Latest version - -.. |pyversions| image:: https://img.shields.io/pypi/pyversions/fluidsim.svg - :alt: Supported Python versions - -.. |docs| image:: https://readthedocs.org/projects/fluidsim/badge/?version=latest - :target: http://fluidsim.readthedocs.org - :alt: Documentation status - -.. |chat| image:: https://img.shields.io/matrix/fluiddyn-users:matrix.org.svg - :target: https://matrix.to/#/#fluiddyn-users:matrix.org - :alt: Chat room - -.. |coverage| image:: https://codecov.io/gh/fluiddyn/fluidsim/branch/branch%2Fdefault/graph/badge.svg - :target: https://codecov.io/gh/fluiddyn/fluidsim - :alt: Code coverage - -.. |heptapod_ci| image:: https://foss.heptapod.net/fluiddyn/fluidsim/badges/branch/default/pipeline.svg - :target: https://foss.heptapod.net/fluiddyn/fluidsim/-/pipelines - :alt: Heptapod CI - -.. |github_actions| image:: https://github.com/fluiddyn/fluidsim/actions/workflows/ci.yml/badge.svg?branch=branch/default - :target: https://github.com/fluiddyn/fluidsim/actions - :alt: Github Actions - -.. description - -.. |binder| image:: https://mybinder.org/badge_logo.svg - :target: https://mybinder.org/v2/gh/fluiddyn/fluidsim/branch%2Fdefault?urlpath=lab/tree/doc/ipynb - :alt: Binder notebook - -Fluidsim is an extensible framework for studying fluid dynamics with numerical -simulations using Python. Fluidsim is an object-oriented library to develop -solvers (mainly using pseudo-spectral methods) by writing mainly Python code. -The result is **very efficient** even compared to a pure Fortran or C++ code -since the time-consuming tasks are performed by optimized compiled functions. - -**Documentation**: https://fluidsim.readthedocs.io - -Getting started ---------------- - -To try fluidsim without installation: |binder| - -For a **basic installation** it should be sufficient to run:: - - pip install fluidsim - -or with conda:: - - conda install -c conda-forge fluidsim - -Much more detailed instructions are given in `the documentation -`__. - -How does it work? ------------------ - -Fluidsim is a `HPC `_ -code. It is part of the wider project `FluidDyn -`_ and its pseudospectral solvers rely -on the library `fluidfft `_ to use very -efficient FFT libraries. Fluidfft is written in C++, Cython and Python. -Fluidfft and fluidsim take advantage of `Pythran -`_, an ahead-of-time compiler -which produces very efficient binaries by compiling Python via C++11. - -An advantage of a CFD code written mostly in Python is that, to run simulations -and analyze the results, the users communicate (possibly interactively) -together and with the machine with Python, which is nowadays among the best -languages to do these tasks. Moreover, it is much simpler and faster than with -pure Fortran or C++ codes to add any complicated analysis or to write a -modified solver. Fluidsim can also be used to extend existing solvers with -Python interfaces such as `Basilisk `__. - -We have created fluidsim to be **easy and nice to use and to develop**, -**efficient** and **robust**. - -*Keywords and ambitions*: fluid dynamics research with Python (>=3.6); -modular, object-oriented, collaborative, tested and documented, free and -open-source software. - -License -------- - -FluidSim is distributed under the CeCILL_ License, a GPL compatible french -license. - -.. _CeCILL: http://www.cecill.info/index.en.html - -Metapapers and citations ------------------------- - -If you use FluidSim to produce scientific articles, please cite our metapapers -presenting the `FluidDyn project -`__, -`FluidFFT -`__, and -`FluidSim -`__: - -.. code :: - - @article{fluiddyn, - doi = {10.5334/jors.237}, - year = {2019}, - publisher = {Ubiquity Press, Ltd.}, - volume = {7}, - author = {Pierre Augier and Ashwin Vishnu Mohanan and Cyrille Bonamy}, - title = {{FluidDyn}: A Python Open-Source Framework for Research and Teaching in Fluid Dynamics - by Simulations, Experiments and Data Processing}, - journal = {Journal of Open Research Software} - } - - @article{fluidfft, - doi = {10.5334/jors.238}, - year = {2019}, - publisher = {Ubiquity Press, Ltd.}, - volume = {7}, - author = {Ashwin Vishnu Mohanan and Cyrille Bonamy and Pierre Augier}, - title = {{FluidFFT}: Common {API} (C$\mathplus\mathplus$ and Python) - for Fast Fourier Transform {HPC} Libraries}, - journal = {Journal of Open Research Software} - } - - @article{fluidsim, - doi = {10.5334/jors.239}, - year = {2019}, - publisher = {Ubiquity Press, Ltd.}, - volume = {7}, - author = {Mohanan, Ashwin Vishnu and Bonamy, Cyrille and Linares, Miguel - Calpe and Augier, Pierre}, - title = {{FluidSim}: {Modular}, {Object}-{Oriented} {Python} {Package} for - {High}-{Performance} {CFD} {Simulations}}, - journal = {Journal of Open Research Software} - } diff --git a/docker/Dockerfile b/docker/Dockerfile index 6097b67a2..1a1269c2d 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -59,4 +59,4 @@ RUN wget https://foss.heptapod.net/fluiddyn/fluidfft/raw/branch/default/doc/inst RUN chmod +x install_pfft.sh RUN ./install_pfft.sh -RUN pip install -U pip pdm tox tox-pdm --user +RUN pip install -U pip pdm nox --user diff --git a/docker/hgrc b/docker/hgrc index f0dae9bb3..31f4fdfce 100644 --- a/docker/hgrc +++ b/docker/hgrc @@ -2,6 +2,7 @@ [ui] # name and email, e.g. # username = Jane Doe +username = appuser editor = emacs -nw -Q # We recommend enabling tweakdefaults to get slight improvements to @@ -20,9 +21,14 @@ rebase = absorb = evolve = topic = +hggit = [extdiff] cmd.meld = [trusted] users = root + +[alias] +lg = log -G +up = up -v diff --git a/fluidsim/solvers/sphere/sw1l/meson.build b/fluidsim/solvers/sphere/sw1l/meson.build index 91b97ae01..bcdcede50 100644 --- a/fluidsim/solvers/sphere/sw1l/meson.build +++ b/fluidsim/solvers/sphere/sw1l/meson.build @@ -1,4 +1,4 @@ -python_souces = [ +python_sources = [ '__init__.py', 'solver.py', 'state.py', diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 000000000..9322eb705 --- /dev/null +++ b/noxfile.py @@ -0,0 +1,35 @@ +import os +import nox + +os.environ.update({"PDM_IGNORE_SAVED_PYTHON": "1"}) + + +@nox.session +def validate_code(session): + session.run_always("pdm", "install", "-G", "dev", "--no-self", external=True) + session.run("pdm", "validate_code", external=True) + + +@nox.session +def test_without_fft_and_pythran(session): + command = "pdm install -G dev -G test -G mpi -G scipy --no-self" + session.run_always(*command.split(), external=True) + session.install(".", "--config-settings=setup-args=-Dtransonic-backend=python") + session.run( + "make", + "_tests_coverage", + external=True, + env={"TRANSONIC_BACKEND": "python", "TRANSONIC_NO_REPLACE": "1"}, + ) + + +@nox.session +def test_with_fft_and_pythran(session): + # first install fluidfft without Pythran compilation + session.install("fluidfft", env={"FLUIDFFT_TRANSONIC_BACKEND": "python"}) + + command = "pdm install -G dev -G test -G fft -G mpi -G scipy --no-self" + session.run_always(*command.split(), external=True) + session.install(".") + + session.run("make", "_tests_coverage", external=True) diff --git a/pyproject.toml b/pyproject.toml index 6ff185e0c..62c68f83e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -162,6 +162,13 @@ dev = [ "-e fluidsim-core @ file:///${PROJECT_ROOT}/lib", ] +[tool.pdm.scripts] +black = 'black -l 82 fluidsim scripts bench doc lib --exclude "/(__pythran__|__python__|__numba__|doc/_build|\.ipynb_checkpoints/*)/"' +lint = {shell="pylint -rn --rcfile=pylintrc --jobs=$(nproc) fluidsim --exit-zero"} +black_check = 'black --check -l 82 fluidsim scripts bench doc lib --exclude "/(__pythran__|__python__|__numba__|doc/_build|\.ipynb_checkpoints/*)/"' +validate_code = {composite = ["black_check", "lint"]} + + [tool.coverage.run] source = [ "./fluidsim", @@ -171,6 +178,9 @@ data_file = ".coverage/coverage" omit = [ "*/try_*.py", "*/_old_*.py", + "**/__pythran__/*.py", + "**/__python__/*.py", + "**/__numba__/*.py", ] [tool.coverage.report] show_missing = true diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 1da44d0e5..000000000 --- a/tox.ini +++ /dev/null @@ -1,52 +0,0 @@ -# Tox (http://tox.testrun.org/) is a tool for running tests in -# multiple virtualenvs. This configuration file will run the test -# suite on all supported python versions. To use it, "pip install tox" -# and then run "tox" from this directory. -# http://tox.readthedocs.io/en/latest/config.html -# -# To run tox faster, check out Detox -# (https://pypi.python.org/pypi/detox), which runs your tox runs in -# parallel. To use it, "pip install detox" and then run "detox" from -# this directory. -[tox] -envlist = - py{39,310,311}-pythran-fft - codecov -isolated_build = True - -[gh-actions] -python = - 3.9: py39-pythran-fft - 3.10: py310-pythran-fft - 3.11: py311-pythran-fft - -[testenv] -setenv = - FLUIDSIM_PATH = {toxinidir}/tmp_fluidsim_path - FLUIDDYN_PATH_SCRATCH = {toxinidir}/tmp_scratch - # no need to compile fluidfft files for these tests - FLUIDFFT_TRANSONIC_BACKEND = python - pythran: FLUIDSIM_TRANSONIC_BACKEND = pythran - !pythran: DISABLE_PYTHRAN = 1 -sitepackages = False -allowlist_externals = make -extras = - test - mpi - fft: fft -commands = - make _tests_coverage - -[testenv:codecov] -passenv = CODECOV_TOKEN -setenv = - CI_COMMIT_BRANCH = {env:CI_COMMIT_BRANCH:env:CI_COMMIT_HG_BRANCH} -sitepackages = True -deps = - codecov -allowlist_externals = make -skip_install = true -commands = - make _report_coverage - codecov --file .coverage/coverage.xml --commit {env:CI_COMMIT_SHA} \ - --branch {env:CI_COMMIT_BRANCH} --name Heptapod{env:CI_JOB_ID}