Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
140 commits
Select commit Hold shift + click to select a range
461ae4e
Allow `mpi_dims_mask` with geometry file
yguclu Sep 18, 2025
1e46072
unit test for mpi_dims_mask
Sep 19, 2025
3376e31
Update test_geometry.py
yguclu Sep 19, 2025
2704716
Update geometry.py
yguclu Sep 19, 2025
e1a13f8
Update test_geometry.py
yguclu Sep 19, 2025
51a32da
new tests for class Geometry
Sep 24, 2025
505db31
run only my tests
Sep 24, 2025
39c51a4
run only my tests
Sep 24, 2025
34e42e6
run only my tests
Sep 24, 2025
90553f9
run only my tests
Sep 24, 2025
243d2b1
run only my tests
Sep 24, 2025
9bfda59
run only my tests
Sep 24, 2025
f75df55
fixed failing tests due to deleting file in parallel
Sep 24, 2025
2a7bb4d
revert files
Sep 24, 2025
659831d
Merge branch 'devel' into yguclu-fix-mpi_dims_mask
alisa-kirkinskaia Sep 26, 2025
e7b6bfb
Avoid function check_decomposition in tests
yguclu Sep 30, 2025
f6afb54
Fix typo in test_geometry.py
yguclu Sep 30, 2025
81b1c6d
Improve Geometry class:
yguclu Sep 30, 2025
e3c30db
Update Geometry unit tests
yguclu Sep 30, 2025
8716dcb
Squashed commit of the following:
yguclu Oct 1, 2025
7111b8e
Do not create __psydac__ directory in parallel
yguclu Oct 1, 2025
cc097a3
Use Geometry.from_file in discretize_domain
yguclu Oct 1, 2025
cd925fb
Use correct parameter name (periods) in MultiPatchDomainDecomposition…
yguclu Oct 1, 2025
f1b6bb1
Add mandatory parameter pdim to Geometry.__init__
yguclu Oct 7, 2025
2716065
Clean up Geometry.read()
yguclu Oct 7, 2025
818be2a
Remove unused property is_parallel from Geometry
yguclu Oct 7, 2025
31fbb37
Merge branch 'devel' into yguclu-improve-Geometry
yguclu Oct 7, 2025
cb8ccb5
Clean up module psydac.mapping.discrete_gallery:
yguclu Oct 8, 2025
f47163e
Merge branch 'devel' into yguclu-improve-Geometry
yguclu Oct 21, 2025
2e56b10
Run fewer tests, only on Ubuntu with Python 3.11
yguclu Oct 21, 2025
2511593
Merge branch 'devel' into yguclu-improve-Geometry
yguclu Jan 26, 2026
b042a0a
Reactivate single-process tests on Ubuntu and macOS
yguclu Jan 26, 2026
0e6a9d6
Merge branch 'devel' into yguclu-improve-Geometry
yguclu Jan 26, 2026
6b6653f
Remove duplicated imports from test_geometry.py
yguclu Jan 26, 2026
8ea76a8
Improve docstring of Geometry class
yguclu Jan 27, 2026
739aee8
Add 'h5py' xdist_group to all unit tests in test_geometry.py
yguclu Jan 27, 2026
66205e7
Handle NumPy integers passed in ncells to Geometry constructor
yguclu Jan 27, 2026
ae6ebf8
Minor cleanup in Geometry constructor
yguclu Jan 27, 2026
7dff021
Run unit tests in mapping, fem, and feec folders
yguclu Jan 27, 2026
fdd357a
Run unit tests in api folder
yguclu Jan 27, 2026
001e592
Revert "Do not create __psydac__ directory in parallel"
yguclu Jan 27, 2026
fae70d3
Merge branch 'devel' into yguclu-improve-Geometry
yguclu Jan 28, 2026
b807f32
Update `CHANGELOG.md` with new and previous changes
yguclu Jan 28, 2026
a06a7d3
Use SymPDE branch clean-multipatch-domain
yguclu Feb 10, 2026
e968bc5
Provide interface orientation to Domain.join
yguclu Feb 10, 2026
a31e07a
Add interface orientation to multipatch geometry files
yguclu Feb 10, 2026
29e82cf
Merge branch 'devel' into yguclu-improve-Geometry
yguclu Feb 11, 2026
326952b
Use `ubuntu_install` action in `documentation` workflow
yguclu Feb 12, 2026
800e506
Clone the latest release of PETSc (see PR #539)
yguclu Feb 12, 2026
9f092d3
Install mpi4py >= 4.0.0 in `parallel_h5py` action
yguclu Feb 12, 2026
e41f301
Merge branch 'devel' into yguclu-improve-Geometry
yguclu Apr 21, 2026
3702e70
Add missing orientation (-1 or +1) to connectivity in test_plot_field
yguclu Apr 21, 2026
d91b2ba
Minor cleanup
yguclu Apr 21, 2026
0b426e2
Avoid deprecation warning about scipy.odr
yguclu Apr 21, 2026
349eee8
Check input domain type in Geometry.from_topological_domain
yguclu Apr 21, 2026
a84e24d
Add docstring to translate() in psydac.cad.cad
yguclu Apr 22, 2026
e291f2a
Merge branch 'devel' into yguclu-improve-Geometry
yguclu Sep 4, 2026
b403819
Test SymPDE version 0.20.0 (from GitHub)
yguclu Sep 9, 2026
ca148d0
Fix wrong action filename in docs workflow
yguclu Sep 11, 2026
43082ab
Give name to checkout step in testing workflow
yguclu Sep 11, 2026
2cb2971
Fix module name in documentation: cmd.mesh >> cmd.psydac_mesh
yguclu Sep 11, 2026
bd4c072
Merge branch 'devel' into yguclu-improve-Geometry
yguclu Oct 3, 2026
0d5d648
Use SymPDE 0.20.0 from PyPI
yguclu Oct 3, 2026
42f2b57
Reactivate all Python versions in testing workflow
yguclu Oct 3, 2026
75eebd5
Fix bad merge (wrong Python versions) in testing.yml
yguclu Oct 4, 2026
6bb18ec
Mention SymPDE 0.20.0 in CHANGELOG.md
yguclu Oct 4, 2026
ec4dc64
First draft of CLAUDE.md configuration file
yguclu Oct 5, 2026
c27f72e
Improve CLAUDE.md
yguclu Oct 5, 2026
d9af9ad
Expand 'Code standards' section of CLAUDE.md
yguclu Oct 5, 2026
9adfa83
Further improve CLAUDE.md
yguclu Oct 5, 2026
10a5088
Remove blank imports from psydac/cad/__init__.py
yguclu Oct 5, 2026
bc216cd
Remove obsolete test_geometry_1() from psydac.cad.tests.test_geometry
yguclu Oct 5, 2026
89e0b6b
Add Pylint configuration to pyproject.toml
yguclu Oct 5, 2026
bc6e145
Update CHANGELOG.md
yguclu Oct 5, 2026
a6e0484
Use Geometry.from_file in polar poisson_2d example
yguclu Oct 6, 2026
66c4041
Move imports into functions in polar poisson_2d example
yguclu Oct 6, 2026
3b324b3
Allow Geometry.__init__ without mappings
yguclu Oct 6, 2026
194e865
Remove obsolete __main__ demo from psydac.cad.cad
yguclu Oct 6, 2026
2db333c
Check user-given domain in Geometry.from_file
yguclu Oct 6, 2026
d3a2973
Write plot of multipatch Poisson test to temporary directory
yguclu Oct 6, 2026
6a957db
Return Cartesian control points from psydac.cad.gallery
yguclu Oct 8, 2026
8ba3869
Use Cartesian control points in psydac.cad.elevate and refine
yguclu Oct 8, 2026
ce0f528
Fix misleading comment in NurbsMapping.from_control_points_weights
yguclu Oct 8, 2026
bc0afb2
Add asserts to test_geometry_2d_1 and test_geometry_2d_2
yguclu Oct 8, 2026
a6c0ef4
Test elevate and refine on all NURBS mappings of the CAD gallery
yguclu Oct 8, 2026
295fe30
Remove test_geometry_2d_3 and test_geometry_2d_4
yguclu Oct 8, 2026
123ff81
Keep the weights of NURBS mappings in psydac.cad.translate
yguclu Oct 9, 2026
c460ed6
Accept spline mappings in psydac.cad.elevate and refine
yguclu Oct 9, 2026
d968c3f
Avoid setting the shape of arrays in KroneckerLinearSolver
yguclu Oct 9, 2026
739a5a4
Fix psydac.cad.elevate and refine for distributed mappings
yguclu Oct 9, 2026
d9fc803
Fix error message in get_max_degree_of_one_space
yguclu Oct 9, 2026
d330670
Check the weights field in NurbsMapping.__init__
yguclu Oct 9, 2026
6441cde
Require a domain decomposition in Geometry.__init__
yguclu Oct 9, 2026
f7d82d9
Create Geometry.from_file through __init__ and remove read()
yguclu Oct 9, 2026
9875e54
Detail the changes to Geometry in CHANGELOG.md
yguclu Oct 9, 2026
d2c34bc
Fix psydac.cad.elevate and refine for mappings with pdim=1, see #618
yguclu Oct 10, 2026
9b567ce
Fix reading multipatch geometries with pdim=1, see #617
yguclu Oct 10, 2026
3797cea
Add 1D unit tests for Geometry and rename the 2D ones
yguclu Oct 10, 2026
9c29988
Mention fixes of #617 and #618 in CHANGELOG.md
yguclu Oct 10, 2026
899e223
Test mappings of curves in 2D/3D and surfaces in 3D
yguclu Oct 10, 2026
361d723
Add missing #527 entries to CHANGELOG.md
yguclu Oct 10, 2026
23b1f47
Use temporary directories instead of xdist groups in test_geometry.py
yguclu Oct 10, 2026
8525407
Reduce code duplication between psydac.cad.elevate and refine
yguclu Oct 10, 2026
4d1d23f
Fix psydac.cad.refine when inserting existing knots, see #619
yguclu Oct 10, 2026
bfa7906
Mention fix of #619 in CHANGELOG.md
yguclu Oct 10, 2026
c0fc0f5
Use mpi_tmp_path fixture in test_geometry_with_mpi_dims_mask
yguclu Oct 10, 2026
ff4b7c2
Restore MPI tests, PETSc tests and coverage report in testing workflow
yguclu Oct 10, 2026
dae164f
Add interface orientation to plate_with_hole multipatch geometry files
yguclu Oct 10, 2026
0ec6c9f
Store mpi_dims_mask in DomainDecomposition and use it in refine, see …
yguclu Oct 10, 2026
dc6c4fc
Mention fix of #622 in CHANGELOG.md
yguclu Oct 10, 2026
0d43b14
Fix local_ncells in DomainDecomposition.refine, see #623
yguclu Oct 10, 2026
0a3752d
Mention fix of #623 in CHANGELOG.md
yguclu Oct 10, 2026
a811068
Update Igakit to dalcinl/igakit@2a0c9ee, which supports NumPy 2.5
yguclu Oct 14, 2026
54ef6d9
Merge branch 'devel' into yguclu-improve-Geometry
yguclu Oct 14, 2026
c97f639
Use the physical dimension of the mappings in Geometry.from_topologic…
yguclu Oct 15, 2026
1fda9a1
Reject domains carrying discrete mappings in Geometry.from_topologica…
yguclu Oct 15, 2026
8e0f521
Add docstring to Geometry.from_topological_domain
yguclu Oct 15, 2026
4239bc6
Mention the pdim fix and the rejection of discrete mappings in CHANGE…
yguclu Oct 15, 2026
dcd2e8c
Revert "Reject domains carrying discrete mappings in Geometry.from_to…
yguclu Oct 16, 2026
ab5c389
Update docstring and CHANGELOG after reverting the rejection of discr…
yguclu Oct 16, 2026
4b35c80
Pair the patches of a geometry file with the domain interiors by name
yguclu Oct 16, 2026
da23324
Add a leading underscore to the private helpers of test_geometry.py
yguclu Oct 16, 2026
c52718c
Mention the patch pairing fix in CHANGELOG.md
yguclu Oct 16, 2026
218c285
Document the Geometry constructors, and move the parameters of Geomet…
yguclu Oct 17, 2026
0669816
Raise a ValueError when an MPI process owns too few coefficients
yguclu Oct 17, 2026
d473149
Mention the explicit error about too few coefficients per process in …
yguclu Oct 17, 2026
1347ad2
Name the function in the CHANGELOG line about too few coefficients
yguclu Oct 17, 2026
9d88472
Rename CLAUDE.md to AGENTS.md, which is read by several coding agents
yguclu Oct 17, 2026
4a592a9
Raise a ValueError when exporting a Geometry without spline mappings …
yguclu Oct 19, 2026
9da84d5
Mention the fix of Geometry.export in CHANGELOG.md
yguclu Oct 19, 2026
a72c626
Remove unused imports in the Python files changed by this PR
yguclu Oct 19, 2026
ac5b09c
Run lint checks on changed files only, and sort imports with the blac…
yguclu Oct 19, 2026
8cf0c21
Fix the pytest decorator and add psydac/mapping in AGENTS.md
yguclu Oct 19, 2026
df50ba6
Add testing conventions to AGENTS.md
yguclu Oct 19, 2026
6ce5094
Add code standards about docstrings, new code style and author credit…
yguclu Oct 19, 2026
9a23279
Mention the documentation tools in AGENTS.md
yguclu Oct 19, 2026
dd65a60
Add a Workflow section to AGENTS.md
yguclu Oct 19, 2026
d563fc6
Mention the isort configuration in CHANGELOG.md
yguclu Oct 19, 2026
03c9266
Clarify the tech stack, the linting tools and the MPI tests in AGENTS.md
yguclu Oct 19, 2026
a6d5aa8
Remove the mpi4py install from the install_h5py action, as on devel (…
yguclu Oct 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 7 additions & 11 deletions .github/workflows/documentation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,11 @@ permissions:
jobs:
build_docs:
runs-on: ubuntu-latest

env:
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN}}
OMP_NUM_THREADS: 2

steps:
- name: Checkout
uses: actions/checkout@v6
Expand All @@ -38,17 +40,7 @@ jobs:
python-version: '3.10'

- name: Install non-Python dependencies on Ubuntu
uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: gfortran openmpi-bin libopenmpi-dev libhdf5-openmpi-dev
version: 1.0
execute_install_scripts: true

- name: Reconfigure non-Python dependencies on Ubuntu
run: |
sudo apt-get update
sudo apt-get install --reinstall openmpi-bin libhdf5-openmpi-dev liblapack-dev libblas-dev
sudo apt install graphviz pandoc
uses: ./.github/actions/ubuntu_installations

- name: Print information on MPI and HDF5 libraries
run: |
Expand All @@ -70,6 +62,10 @@ jobs:
pip install .[test]
pip freeze

- name: Install non-Python dependencies for Documentation
run: |
sudo apt install graphviz pandoc

- name: Install Python dependencies for Documentation
run: |
pip install -r docs/requirements.txt
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ jobs:
OMP_NUM_THREADS: 2

steps:
- uses: actions/checkout@v6
- name: Checkout
uses: actions/checkout@v6
with:
submodules: true

Expand Down
104 changes: 104 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# Project: PSYDAC

## Overview
Python 3 library for isogeometric analysis (IGA). Solve general systems of partial
differential equations (PDEs) in weak form, defined using the domain-specific
language provided by SymPDE. Supports finite element exterior calculus (FEEC)
with tensor-product spline spaces. Handles multi-patch geometries in various ways;
usually broken-FEEC a.k.a. CONGA (conforming/non-conforming Galerkin).
Python code is automatically generated for the assembly of user-defined functionals,
linear forms, and bilinear forms. This Python code is then accelerated to C/Fortran
speed using Pyccel. The library enables large parallel computations on distributed-
memory supercomputers using MPI and OpenMP.

## Tech stack
- Python 3.10+, type hints required in new code
- meson-python (Meson build backend) for building
- pip with submodules (for igakit)
- pytest + pytest-cov + pytest-mpi + pytest-xdist for testing
- sympde for symbolic definition of weak formulations
- pyccel for translation of Python kernels to Fortran or C
- mpi4py for MPI parallelization
- h5py for parallel I/O
- petsc4py for direct linear solvers (optional install)
- sphinx + numpydoc + nbsphinx + myst-parser for documentation
(see `docs/requirements.txt`; build with `make -C docs html`)

## Code standards
- Follow PEP 8 style guide whenever possible
- Docstrings of public functions and classes follow Numpydoc conventions
- pylint + black + isort for linting and formatting
- Computational kernels to be accelerated with Pyccel named as `<module>_kernels.py`
- Minimize code duplication. Never add code that already exists
- Strive for concise, clean, and human-readable code. Avoid useless verbosity
- Self-explanatory names for variables, functions, and classes
- Do not reassign value to an existing variable, especially if the type changes
- Use short comments (one-liners or inline) to explain "why" rather than "what" or "how"
- In docstrings, use single backticks for names and short code,
and double backticks only for code expressions
- Write new code in clean style (e.g. no superfluous parentheses, f-strings),
even if the surrounding legacy code does not
- Do not add author credits in code or comments;
credit goes in commit messages and PR descriptions

## Testing conventions
- Each library subpackage contains a `tests/` folder with an `__init__.py` file
- Unit tests are part of the library and shipped with it
- Unit tests can be run with `psydac test` CLI command (see `README.md`)
- Parallel tests are marked with `@pytest.mark.mpi` (from pytest-mpi) and run with
`psydac test --mpi`; serial tests run with `psydac test`
- Test file names follow `test_<module>.py`
- Test function names follow `test_<function>` or `test_<class>_<method>`
- Parametrize unit tests with `@pytest.mark.parametrize` to minimize code duplication
- Keep run time of tests at a minimum
- Aim for 100% coverage on newly committed code
- Every bugfix comes with a regression test that fails before the fix
- Use distinct sizes in each direction (e.g. 3 x 5 cells, not 4 x 4),
so that swapped indices are detected
- Write files only to the `tmp_path` fixture (`mpi_tmp_path` in MPI tests),
never to the working directory
- After changing a module, also run the tests of the subpackages which use it
(e.g. `psydac/api/tests` after changing `psydac/cad`)

## File structure
- psydac/api - high-level Python interface
- psydac/cad - computer-aided design (CAD) functionality
- psydac/cmd - command-line interface (CLI) commands
- psydac/core - splines functionality
- psydac/ddm - MPI decomposition of domain, vectors of spline coefficients, and matrices
- psydac/feec - finite element exterior calculus (FEEC)
- psydac/fem - "finite element method" middle-level Python interface (spaces and fields)
- psydac/linalg - "linear algebra" low-level Python interface (vectors, linear operators, iterative solvers)
- psydac/mapping - spline and NURBS mappings, and a gallery of discrete mappings
- psydac/polar - implementation of polar splines for H1 spaces
- psydac/pyccel - distillation of an old version of Pyccel for Python code generation (to be removed)
- psydac/utilities - various generic functions used across the library
- docs - Sphinx documentation
- examples - Various examples of library usage (mostly Jupyter notebooks)
- scripts - Various scripts for library maintenance
- subprojects - Git submodules

## Workflow
- PRs are squash-merged and the PR description becomes the commit message:
keep it complete, and write "(fixes #N)" next to each fix
- Every PR adds entries to `CHANGELOG.md` under Added/Changed/Fixed/Removed
- Format of the CHANGELOG entries:
. `- #<PR> : <change>`, followed by `, see #<issue>` if there is one
. `- [DEVELOPER] <change>` for changes which only concern developers
- Issues describe bugs as they appear on `devel`, with a reproducer that runs on `devel`
- Do not commit changes to submodule pointers (`subprojects/`) unless intended

## Always do
- Before claiming done, run these checks on the Python files you changed:
. Run `python -m black --check $(git diff --name-only --diff-filter=d devel -- "*.py")`
. Run `python -m isort --check $(git diff --name-only --diff-filter=d devel -- "*.py")`
. Run `pylint --disable=all --enable=unused-import $(git diff --name-only --diff-filter=d devel -- "*.py")`
- Until the code base is reformatted, black and isort fail on most existing files:
do not reformat code outside your change. The pylint check must pass.
- Unless specified differently, assume process with `rank=0` in MPI communicator is root
- Use root MPI process to perform serial operations (e.g. open/save image)

## Never do
- Commit secrets or `.env` files
- Add new dependencies without team discussion
- Use `eval` function together with `input`
41 changes: 39 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,53 @@ All notable changes to this project will be documented in this file.
## Unreleased

### Added

- #527 : Add constructor `Geometry.from_file` with option `domain` to reuse an existing SymPDE domain, after checking that it matches the file
- #527 : Add function `get_available_mappings` and option `mpi_dims_mask` to `discrete_mapping` in `psydac.mapping.discrete_gallery`
- #527 : Add property `mpi_dims_mask` to `DomainDecomposition`
- #596 : Add `topetsc` method to `psydac.linalg.basic.ZeroOperator`
- #596 : Add `out` argument to `array_to_psydac` and `vec_topetsc`
- #576 : Add module `psydac.feec.polar.conga_projections` with broken FEEC polar projections in 2D
- #576 : Add 2D Poisson and TE Maxwell examples on polar mapped domains in `psydac/feec/polar/examples`
- #576 : Add module `psydac.utilities.parallel_utils` for parallel execution and gathering variable-length arrays
- #576 : Add module `psydac.utilities.operators` with class `Laplacian` used in some old examples
- #577 : Add an installation configuration option to choose the backend language
- #567 : Improve `psydac test` command (with several new features)
- #565 : Expand editable install info in `README.md`
- [DEVELOPER] Create action `install_petsc4py` to install PETSc & `petsc4py` w/ complex support
- [DEVELOPER] Configure Pylint in `pyproject.toml`
- [DEVELOPER] Configure isort in `pyproject.toml`, with the profile of black
- [DEVELOPER] Add `AGENTS.md` with developer rules

### Fixed

- #527 : Require `sympde==0.20.0` which changes how multipatch interfaces are defined
- #527 : Fix `psydac.cad.elevate` and `refine` for NURBS mappings, see #608
- #527 : Keep the NURBS weights in `psydac.cad.translate`, see #609
- #527 : Fix type checks of input mappings in module `psydac.cad.cad`, see #610
- #527 : Fix `psydac.cad.elevate` and `refine` for distributed mappings, see #611
- #527 : Check the weights field in `NurbsMapping.__init__`, see #616
- #527 : Fix reading multipatch geometries with `pdim=1`, see #617
- #527 : Fix `psydac.cad.elevate` and `refine` for mappings with `pdim=1`, see #618
- #527 : Fix `psydac.cad.refine` when inserting a value which is already a knot, see #619
- #527 : Keep the `mpi_dims_mask` of a `DomainDecomposition` in `TensorFemSpace.add_refined_space` and `psydac.cad.cad.refine`, see #622
- #527 : Fix `local_ncells` of the decomposition returned by `DomainDecomposition.refine`, see #623
- #527 : Raise a `ValueError` in `Geometry.export` if a patch has no spline mapping, instead of an `AttributeError` after creating the file, see #631
- #527 : Use the physical dimension of the mappings in `Geometry.from_topological_domain` and `from_discrete_mapping`
- #527 : Pair the patches of a geometry file with the domain interiors by name, not by position
- #527 : Avoid setting the `shape` of NumPy arrays (deprecated since NumPy 2.5) in `KroneckerLinearSolver`
- #527 : Fix error message in `psydac.api.discretization.get_max_degree_of_one_space`
- #596 : Allow export to VTK with a prescribed grid containing exact domain bounds
- #596 : Fix global geometric projectors with complex `dtype`
- #576 : Fix bug in `TensorFemSpace.eval_field` caused by round-off at MPI subdomain boundaries
- #576 : Require `sympde==0.19.3` which fixes a bug in the linearity checks
- #579 : Require `h5py>=3.16` which installs correctly with `setuptools>=81.0`
- #576 : Fix bug in `TensorFemSpace.eval_field` caused by round-off at MPI subdomain boundaries
- #579 : Don't run postprocessing unit tests with `pytest-xdist` because `h5py` is not thread-safe
- #579 : Return error code on failure of the `psydac test` and `psydac compile` commands
- #577 : Fix installation following release of Pyccel 2.2
- #571 : Fix correct application of the sum factorization algorithm
- #570 : Optimize PSYDAC logo
- #565 : Expand editable install info in `README.md`
- #567 : Fix parallel creation of folder `__psydac__` in `psydac.api.fem_bilinear_form`
- #566 : Fix command `psydac test --mpi` on Ubuntu machines
- [DEVELOPER] Add missing 'description' properties (required!) to our GitHub actions
- [DEVELOPER] Update CI installation of `petsc4py` after release of `setuptools` 81.0
Expand All @@ -35,13 +60,22 @@ All notable changes to this project will be documented in this file.

### Changed

- #527 : Pass a domain decomposition `ddm` and physical dimension `pdim` to `Geometry.__init__`; remove arguments `ncells`, `periodic`, `filename`, `comm` and `mpi_dims_mask`
- #527 : Use the domain decomposition of the mapping's space in `Geometry.from_discrete_mapping`; remove arguments `comm` and `mpi_dims_mask`
- #527 : Key `Geometry.mappings` by the names of the domain interiors
- #527 : Return Cartesian (not homogeneous) control points from the NURBS functions in `psydac.cad.gallery`, see #608
- #527 : Keep the given SymPDE domain in `discretize(domain, filename=...)`, after checking that it matches the geometry file
- #527 : Do not import the submodules of `psydac.cad` in its `__init__.py`
- #527 : Use latest version of Igakit (commit dalcinl/igakit@2a0c9ee of 2026/10/14) which supports NumPy >= 2.5
- #527 : Raise a `ValueError` with an explanation, instead of an `AssertionError`, in `psydac.fem.partitioning.partition_coefficients` when an MPI process owns too few coefficients
- #576 : Use latest version of Igakit (commit dalcinl/igakit@92ee097 of 2026/07/24) which supports NumPy >= 2.4
- #595 : Use PETSc 3.25.5 whose Python bindings `petsc4py` are built correctly with `cython>=3`
- #580 : Use PETSc 3.25.0 whose Python bindings `petsc4py` install correctly with `setuptools>=81.0`
- #579 : Require `pyccel>=2.2.3` which can compile all kernels with C
- #579 : Require `numpy>=2.1` to support Python >= 3.10
- #579 : Require `pytest>=9.0` and use `pytest.toml` instead of `pytest.ini` for Pytest configuration
- #579 : Move coverage configuration from `pyproject.toml` to `psydac/pytest.toml`
- #570 : Optimize PSYDAC logo
- [DEVELOPER] Update GitHub Actions for repository checkout and Python setup
- [DEVELOPER] Rename actions: `macos/ubuntu_install` -> `macos/ubuntu_installations`
- [DEVELOPER] Do not check file changes to trigger testing workflow on PRs
Expand All @@ -52,6 +86,9 @@ All notable changes to this project will be documented in this file.

### Removed

- #527 : Remove method `Geometry.read`, use constructor `Geometry.from_file` instead
- #527 : Remove property `Geometry.is_parallel`

## [1.0.0] - 2026-01-19

The first official release on PyPI. A complete overhaul since version 0.1.
Expand Down
2 changes: 1 addition & 1 deletion examples/old_examples/poisson_2d_mapping.py
Original file line number Diff line number Diff line change
Expand Up @@ -632,7 +632,7 @@ def main(*, test_case, ncells, degree, nquads,
map_discrete = SplineMapping.from_mapping(V, map_analytic)
# Write discrete geometry to HDF5 file
t0 = time()
geometry = Geometry.from_discrete_mapping(map_discrete, comm=mpi_comm)
geometry = Geometry.from_discrete_mapping(map_discrete)
geometry.export('geo.h5')
t1 = time()
timing['export'] += t1-t0
Expand Down
2 changes: 1 addition & 1 deletion examples/performance/compare_3d_matrix_assembly_speed.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def make_square_torus_geometry_3d(ncells, degree, comm=None):
mapping = SquareTorus('S')
map_discrete = SplineMapping.from_mapping(V_h, mapping.get_callable_mapping())

geometry = Geometry.from_discrete_mapping(map_discrete, comm=comm)
geometry = Geometry.from_discrete_mapping(map_discrete)

if mpi_rank == 0:
if not os.path.isdir('geometry'):
Expand Down
8 changes: 3 additions & 5 deletions psydac/api/ast/tests/test_poisson.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@
from sympde.calculus import grad, dot
from sympde.topology import ScalarFunctionSpace
from sympde.topology import elements_of, LogicalExpr
from sympde.topology import Square
from sympde.topology import Mapping, IdentityMapping, PolarMapping
from sympde.topology import Domain
from sympde.expr import integral
from sympde.expr import LinearForm
from sympde.expr import BilinearForm
Expand All @@ -38,9 +37,8 @@

#==============================================================================
def test_codegen():
domain = Square()
M = Mapping('M',2)
domain = M(domain)
domain = Domain.from_file(filename)
M = domain.mapping
V = ScalarFunctionSpace('V', domain)
u,v = elements_of(V, names='u,v')

Expand Down
6 changes: 4 additions & 2 deletions psydac/api/ast/tests/test_system_1.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from sympde.topology import VectorFunctionSpace
from sympde.topology import element_of
from sympde.topology import Square
from sympde.topology import Mapping#, IdentityMapping, PolarMapping
from sympde.topology import Domain, Mapping
from sympde.expr import integral
from sympde.expr import LinearForm
from sympde.expr import BilinearForm
Expand Down Expand Up @@ -61,7 +61,9 @@ def test_codegen():
h1norm_F = SemiNorm(error, domain, kind='h1')

# Create computational domain from topological domain
domain_h = discretize(domain, filename=filename)
# The spaces are defined on the logical domain, but the geometry needs
# the mapped domain defined in the file
domain_h = discretize(Domain.from_file(filename), filename=filename)

# Discrete spaces
Vh = discretize(V, domain_h)
Expand Down
6 changes: 4 additions & 2 deletions psydac/api/ast/tests/test_system_2.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from sympde.topology import ScalarFunctionSpace, VectorFunctionSpace
from sympde.topology import element_of
from sympde.topology import Square
from sympde.topology import Mapping
from sympde.topology import Domain, Mapping
from sympde.expr import integral
from sympde.expr import LinearForm
from sympde.expr import BilinearForm
Expand Down Expand Up @@ -59,7 +59,9 @@ def test_codegen():
l = LinearForm((q,v), int_0(f1*q[0]+f2*q[1]+v))

# Create computational domain from topological domain
domain_h = discretize(domain, filename=filename)
# The spaces are defined on the logical domain, but the geometry needs
# the mapped domain defined in the file
domain_h = discretize(Domain.from_file(filename), filename=filename)

# Discrete spaces
Vh = discretize(V1*V2, domain_h)
Expand Down
6 changes: 4 additions & 2 deletions psydac/api/ast/tests/test_system_3.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from sympde.topology import VectorFunctionSpace
from sympde.topology import element_of
from sympde.topology import Square
from sympde.topology import Mapping#, IdentityMapping, PolarMapping
from sympde.topology import Domain, Mapping
from sympde.expr import integral
from sympde.expr import BilinearForm
from sympde.expr.evaluation import TerminalExpr
Expand Down Expand Up @@ -54,7 +54,9 @@ def test_codegen():
b = BilinearForm((u,v), int_0(div(v)*div(u)))

# Create computational domain from topological domain
domain_h = discretize(domain, filename=filename)
# The spaces are defined on the logical domain, but the geometry needs
# the mapped domain defined in the file
domain_h = discretize(Domain.from_file(filename), filename=filename)

# Discrete spaces
Vh = discretize(V, domain_h)
Expand Down
13 changes: 5 additions & 8 deletions psydac/api/discretization.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ def get_max_degree_of_one_space(Vh):
Returns
-------
list[int]
The maximum polynomial degre of Vh with respect to each coordinate.
The maximum polynomial degree of Vh with respect to each coordinate.

"""

Expand All @@ -125,7 +125,7 @@ def get_max_degree_of_one_space(Vh):
return [max(p) for p in zip(*degree)]

else:
raise TypeError(f'Type({V}) not understood')
raise TypeError(f'Type {type(Vh).__name__} not understood')


def get_max_degree(*spaces):
Expand Down Expand Up @@ -454,11 +454,8 @@ def discretize_space(V, domain_h, *, degree=None, multiplicity=None, knots=None,

connectivity = construct_connectivity(domain)
if isinstance(domain_h, Geometry) and all(domain_h.mappings.values()):
# from a discrete geoemtry
if interiors[0].name in domain_h.mappings:
mappings = [domain_h.mappings[inter.name] for inter in interiors]
else:
mappings = [domain_h.mappings[inter.logical_domain.name] for inter in interiors]
# from a discrete geometry
mappings = [domain_h.mappings[inter.name] for inter in interiors]

# Get all the FEM spaces from the mapping and convert their coeff_space at the dtype needed
spaces = [change_dtype(m.space, dtype) for m in mappings]
Expand Down Expand Up @@ -578,7 +575,7 @@ def discretize_domain(domain, *, filename=None, ncells=None, periodic=None, comm
raise ValueError("Cannot provide both 'filename' and 'ncells'")

elif filename:
return Geometry(filename=filename, comm=comm, mpi_dims_mask=mpi_dims_mask)
return Geometry.from_file(filename, domain=domain, comm=comm, mpi_dims_mask=mpi_dims_mask)

elif ncells:
return Geometry.from_topological_domain(domain, ncells, periodic=periodic, comm=comm, mpi_dims_mask=mpi_dims_mask)
Expand Down
Loading
Loading