Skip to content

Update from upstream 2026-07-23 - #71

Draft
max-models wants to merge 56 commits into
devel-tinyfrom
update-from-upstream-20260723
Draft

Update from upstream 2026-07-23#71
max-models wants to merge 56 commits into
devel-tinyfrom
update-from-upstream-20260723

Conversation

@max-models

@max-models max-models commented Jul 23, 2026

Copy link
Copy Markdown
Member

Custom changes

  1. @pytest.mark.parallel was changed to @pytest.mark.mpi, so I had to update the pytest setup a bit.

yguclu and others added 30 commits April 2, 2025 15:18
Closes pyccel#476:

* Do not restrict the maximum Python version to 3.12 in `pyproject.toml`
* Require `Cython >= 3` to avoid `h5py` installation crash w/ Python 3.13
* Require `sympde == 0.19.2` which supports Python 3.13
* Run unit tests with Python 3.13 too
Currently, Psydac can not be used on Apple M4 computers since the
`PSYDAC_BACKEND_GPYCCEL['flags']` is not set correctly.

This change sets the flag for `Apple MX (etc.)` to `apple-mX`, which should
work so long as the naming scheme stays unchanged.

In addition, the regular expression used to find the GFortran version is now
defined in a raw string instead of a standard Python UTF8 string. This
avoids a `SyntaxWarning: invalid escape sequence`.

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
* Use raw strings for docstrings with LaTeX to avoid UTF8 syntax
warnings on escape sequences;
* Use CSC matrices to avoid SciPy sparse solver warning.

We do not address the NumPy warnings which arise in our MPI unit tests
(see pyccel#353).
…yccel#484)

Main changes
--------------
* Rename the method `dot` of the base class `VectorSpace` as `inner`,
and make it an abstract method (which must be implemented by the
subclasses).

* Rename the method `dot` of the base class `Vector` as `inner`. This is
a concrete method which calls `self.space.inner` and does not need to be
overridden by the subclasses.

* Add `inner` methods to the classes `StencilVector`,
`BlockVectorSpace`, and `DenseVectorSpace`. These methods override the
abstract method of the base class as required, and are derived from the
former functions `Stencil.dot`, `BlockVector.dot`, and
`DenseVector.dot`, which have been removed (see next point).

* Remove the property `dtype` and the method `dot` (now `inner`) from
the classes `StencilVector`, `BlockVector`, and `DenseVector`, because
the default methods of the base class already provide a sufficient
implementation.

This fixes pyccel#330.

Necessary additional changes
------------------------------
* Update all linear solvers in `linalg.solvers` with the new method
calls;
* Update all unit tests with the new method calls, in files:
   - `api/tests/test_assembly.py`
   - `feec/tests/test_commuting_projections.py`
   - `feec/tests/test_global_projectors.py`
   - `linalg/tests/test_block.py`
   - `linalg/tests/test_linalg.py`
   - `linalg/tests/test_stencil_interface_matrix.py`
   - `linalg/tests/test_stencil_vector.py`

Unrelated additional changes
-----------------------------
* Rename the class `VectorDot` as `VectorInner` in module
`api.ast.linalg`, although never used in Psydac.
* Speed up 3D unit tests in:
   - `feec/tests/test_commuting_projectors.py`
   - `feec/tests/test_global_projectors.py`
---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
…yccel#493)

Implement `M.dot(u).inner(v)`, or `(M @ u).inner(v)`, without creating a
temporary vector. The result of the dot product is written to a local
work vector stored in the `LinearOperator` object. This work vector is
then used to compute the inner product with the vector `v`. The
subclasses do not need to override this method, unless a more efficient
implementation which avoids writing to the work vector altogether
(reducing memory pressure) is needed.

A unit test is added: function `test_dot_inner` in file
psydac/linalg/tests/test_linalg.py.

Additionally, the helper function `get_StencilVectorSpace` defined in
psydac/linalg/tests/test_linalg.py (only used in the same file and in
test_matrix_free.py) has a new signature and now works in any number of
dimensions.

Fixes pyccel#491.
This PR changes the code generation involved in the `discretize`
function to avoid calculating unnecessary derivatives. This allows for
using constant spline (degree 0) discretizations, for which we have to
make a special case in the calculation of ghost regions in
`psydac/linalg/stencil.py`.

Additionally, we add basic unit tests checking discretizations using
zero-degree splines.

This fixes pyccel#489 and fixes pyccel#307.

On this occasion, we also do small changes in the
`.github/workflows/testing.yml` script as some tests had complications
without them.

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Always use the maximum padding between test and trial spaces in
`allocate_matrices` in `DiscreteBilinearForm`. (Earlier this was not
done in the case of scalar spaces.) Fixes pyccel#504.
Pyccel 2.0 was just released, which means some of the kernels in Psydac
need to be updated:

- Remove the `template` decorator (see
pyccel/pyccel#2331)
   * Add `T` as `TypeVar` 
   * Specify `T`, `T[:]`, `T[:,:]`, ... in function arguments.
- Replace `@types` decorators (see
pyccel/pyccel#2329)
- Replace `const` with `Final` (see
pyccel/pyccel#2340)

Further changes:

- Update import path for `epyccel` (fixes pyccel#426)
- Update arguments to `epyccel` (see
pyccel/pyccel#2348):
    * Rename `fflags` to `flags`
    * Replace `accelerators` list with `openmp` bool
- Require Pyccel >= 2.0.1 (fixes pyccel#471)

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Co-authored-by: Elena Moral Sánchez <Elena.Moral.Sanchez@ipp.mpg.de>
Co-authored-by: Emily Bourne <louise.bourne@gmail.com>
Recently the installation of `h5py` in parallel mode (i.e. with MPI
support through `mpi4py`) seems to have been simplified. This may be due
to the recent move of `mpi4py` to wheels, or other factors. Therefore we
can now simplify our installation procedure as follows:
```sh
pip install h5py --no-cache-dir --no-binary h5py
pip install .[test]
```

We update here the CI workflows and completely rewrite our README file.

**Commit summary**

- Completely rewrite `README.md`:
   * Expand initial description
   * Add Citing and Contributing sections
   * Shorten Installation section
   * Reorganize documentation sections
* Move detailed installation instructions to separate file
`docs/installation.md`
   * Move mesh generation to separate file `docs/psydac-mesh.md`
- Add BibTeX file `CITING.bib` with citation of 2022 ECCOMAS proceedings
- Remove obsolete files `requirements.txt` and `requirements_extra.txt`
- Rename (and move) `docs_requirements.txt` as `docs/requirements.txt`
- Update installation procedure in `testing` CI workflow
- Change name in `testing` workflow from "Run tests" to "Unit tests"
- Modify `testing` and `documentation` workflows so that they only run
when needed
- Allow running workflows manually
- Fix broken CI badge in `README.md`
This PR implements the sum factorization algorithm as shown in **Sum
factorization techniques in Isogeometric Analysis** by Andrea Bressan &
Stefan Takacs for **bilinear forms on 3D volumes**.

The old element-by-element assembly can still be employed by passing a
corresponding flag
```python
# a some BilinearForm
a_h = discretize(a, domain_h, (Vh, Vh), backend=backend, sum_factorization=False)
```

Currently, the new generated code does not make use of OpenMP.

Main changes
--------------
- Write new module `psydac.api.fem_common` which:
   * Contains the old functions previously in module `psydac.api.fem`.
* Has functions `construct_test_space_arguments` and
`construct_trial_space_arguments` returning also the multiplicity.
* Has new functions `compute_max_nderiv`, `compute_imports`,
`compute_free_arguments`.
- Move `DiscreteSumForm` to a new module `psydac.api.fem_sum_form`.
- Create a new module `psydac.api.fem_bilinear_form` which only contains
one new class `DiscreteBilinearForm`. The new module shows all imports
clearly. The new class:
* Generates the code to assemble the given discrete bilinear form into a
matrix (a `BlockLinearOperator` object of `StencilMatrix` objects, or
just a single `StencilMatrix` object), using sum factorization.
* Does not inherit from `BasicDiscrete` (and hence `BasicCodeGen`).
Accordingly, no PSYDAC abstract syntax tree (an object representing a
function, of class `DefNode`) is created by the constructor of `AST`,
which stores it in its `expr` attribute. (Both classes `DefNode` and
`AST` are defined in module `psydac.api.ast.fem`.)
* Does not create a `Parser` object from `psydac.api.ast.parser`, which
used to convert a PSYDAC `DefNode` to an old-Pyccel `FunctionDef` from
`psydac.pyccel.ast.core`.
* Does not generate the old assembly Python code (in the form of a
string) using the function `pycode` from
`psydac.pyccel.codegen.printing.pycode`.
- Add a new unit test file
`api/tests/test_sum_factorization_assembly_3d`.
- Modify function `discretize` in module `psydac.api.discretization` so
that, given a bilinear form in 3D and not asking for OpenMP support, it
creates an object of type `DiscreteBilinearForm` from module
`psydac.api.fem_bilinear_form`. In all other cases, or if
`sum_factorization=False`, it creates an object of namesake type from
the old module `psydac.api.fem`.

Other changes
--------------
- Expand docstring of class `AST` in module `psydac.api.ast.fem`.
- Expand docstrings of function `parse` and class `Parser` in module
`psydac.api.ast.parser`. Clean up `Parser.__init__`.
- Minor cleanup in class `BasicCodeGen` in module `psydac.api.basic`.
- Generate random filenames using `random.choice()` instead of
`random.SystemRandom().choice()`.

Unrelated to matrix assembly:
- Add method `set_scalar` to `ScaledLinearOperator`.
- Reimplement method `idot` of `LinearOperator` using local storage.
This avoids creating unnecessary temporary vectors (especially
beneficial for the method `dot` of `SumLinearOperator`).

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Co-authored-by: elmosa <Elena.Moral.Sanchez@ipp.mpg.de>
### Commit summary

- Fix pyccel#461 : Move contents of `psydac/feec/multipatch/api.py` to
`psydac/api/feec.py` and `psydac/api/discretization.py`.
- Remove old code from `psydac/feec/multipatch/operators.py` and
replace it by the contents in
`psydac/feec/multipatch/non_matching_operators.py` to make the structure
more clear.
- Fix pyccel#463 
- Fix pyccel#272 : keep the `FEMLinearOperator` as a more light-weight class
that encapsulates a `LinearOperator` and has a `apply` and `__call__`
function to make it act on a `FEMField`. Remove duplicated code with
`LinearOperator`. Make operators in `psydac/feec` subclasses of
`LinearOperator`.
- Fix pyccel#462: Add conforming projections and Hodge operators to
single-patch `DiscreteDeRham`
- Add single-patch test for the conforming projectors
- Adapt all the tests/files to the new notations. For the single patch
cases mostly renaming `derham_h.derivatives` to `derham_h.derivatives()`
and `derham_h.derivatives_as_matrices` to
`derham_h.derivatives(kind='linop')`
- Merge single-patch and multi-patch operators to the same file if it
makes things clearer. Take Hodge and conforming projection operators out
of the multipatch subdirectory.
- Fix pyccel#409 : the global projector interface in DiscreteDeRhamMultipatch
- Fix pyccel#331. 
- Add a `SparseMatrixLinearOperator` in `psydac/linalg/sparse.py` to use
a sparse matrix as a `LinearOperator`. This is needed for the conforming
projections.
- Rename `GlobalProjectors` to `GlobalGeometricProjectors`


### Notes

With the current changes, we get all FEEC operators directly from the
discrete de Rham object. Further, the same code also runs if the
domain is a single patch.

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Add the optional parameter `mpi_dims_mask` to the constructor of class
`Geometry`, as well as its class methods `from_discrete_mapping` and
`from_topological_domain`. Add unit tests to verify that the domain is
correctly decomposed.

---------

Co-authored-by: Alisa Kirkinskaia <alisa.kirkinskaia@tum.de>
Co-authored-by: Alisa Kirkinskaia <alisa.kirkinsk@gmail.com>
Fix `examples/poisson_2d_mapping.py`:

- Use renamed method `get_assembly_grids` (formerly
`get_quadrature_grids`) of class `TensorFemSpace`
- Add missing definition of `Vnew` variable in the case of distributed
visualization
- Avoid string warnings
Fix bug in method `plot_2d_decomposition` of `TensorFemSpace`, which was
failing when run in parallel with a distributed spline mapping.

- Create a new test file `psydac/fem/tests/test_tensor.py` with a unit
test which fails on the `devel` branch. This compares the generated PNG
images with "reference" ones which are known to be correct, within a 2 %
relative tolerance on each of the RGB channels.
- Only evaluate mapping in local subdomain owned by process
- Gather global mapping information on root process
- Add optional parameters `fig`, `ax`, and `mpi_root`
- Add docstring
- Update `examples/poisson_2d_mapping.py` to pass the correct mapping
(i.e. also a distributed spline mapping if that is used in the
computations) to `plot_2d_decomposition`.
Add a NOTE block with the meaning of the PSYDAC acronym, as well as its
pronounciation.
We implement the class `DirichletProjector` and
`MultipatchDirichletProjector` and include tests.

DirichletProjector
---------------------------
is a subclass of `LinearOperator`. Projects coefficients of functions
belonging to a `fem_space` of `space_kind` $\in$ `{"h1", "hcurl",
"hdiv", "l2"}` to coefficients of functions satisfying the corresponding
homogeneous Dirichlet boundary conditions. These projectors **respect
periodicity**, i.e., coefficients corresponding to "periodic boundaries"
**will not be changed**.

Take for example the constant function $f(x, y) = 1$ on an Annulus.
```python
P0, _, _ = derham_h.projectors()
f        = lambda x, y : 1
F        = P0(f)
plot_field_2d(fem_field=F, domain=domain, N_vis=100, cmap='plasma')
```
See [image](https://github.com/user-attachments/assets/83dc42c6-5ecc-46ae-a0a0-6ceae85526fe).

Applying the `DirichletProjector` sets correctly only the DOFs to 0 that
belong to basis functions that are different from 0 on the
"x1-direction-boundary".

```python
DP0, _ = derham_h.dirichlet_projectors(kind='linop')
F_dp   = FemField(derham_h.V0, DP0 @ F.coeffs)
plot_field_2d(fem_field=F_dp, domain=domain, N_vis=100, cmap='plasma')
```
See [image](https://github.com/user-attachments/assets/a117c5c6-8379-4bcf-b8a8-71e59d2d0eeb).

Usage
---------
Obtain these projectors in the **FEEC context** directly from a
`DiscreteDeRham` object
```python
DP0, DP1 = derham_h.dirichlet_projectors(kind='linop') # in 1D
DP0, DP1, DP2 = derham_h.dirichlet_projectors(kind='linop') # in 2D
DP0, DP1, DP2, DP3 = derham_h.dirichlet_projectors(kind='linop') # in 3D
```
The last projector is simply an `IdentityOperator`.

When instead working with **FEM** objects only: 
```python
from psydac.fem.projectors import DirichletProjector

# working with a space that has a kind
V   = ScalarFunctionSpace('V', domain, kind='h1')
Vh  = discretize(V, domain_h, degree=degree)
DP  = DirichletProjector(Vh)

# working with a space that has no kind
V   = VectorFunctionSpace('V', domain)
Vh  = discretize(V, domain_h, degree=degree)
DP  = DirichletProjector(Vh, kind='hcurl') # or 'hdiv'
```

Similarity with `conforming_projectors`
--------------------------------------------------------
Identical to `derham_h.conforming_projectors(kind='linop', hom_bc=True)`
**on a single-patch**.
On **multi-patch** domains, `derham_h.conforming_projectors` also affect
the solution at the **interfaces** between patches, as required by the
broken-FEEC theory. If required, they have the additional ability to
preserve moments of the solution.
Unfortunately, the conforming projectors are only implemented in 2D.

---------

Co-authored-by: Frederik Schnack <frederik.schnack@ipp.mpg.de>
- Move the script `psydac_accelerate.py` to the function `main` in the new module `psydac/cmd/accelerate.py`
- Define a `psydac-accelerate` executable in file `pyproject.toml`
- Update instructions in `README.md`
- Ignore Bandit warnings about `subprocess` import and calls

Fixes pyccel#511.

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
- Remove the ancient documentation folder `doc`
- Remove the old CI configuration file `.travis.yml`
- Remove the outdated `TODO.rst`

This fixes pyccel#496.

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
We add a `diagonal(self, inverse=False, sqrt=False, out=None)` method to
the class `KroneckerStencilMatrix`.
Additionally, we fix the `diagonal` method of `StencilDiagonalMatrix`,
both making it run in general, and also allowing for the kwarg `sqrt`
which had been missing until now.

This method comes in handy for the computation of the yet to be
implemented LST preconditioners.
For the computation of these, we compute 1D mass matrices which are the
building blocks of 2D or 3D logical mass matrices. Additionally, we
compute the diagonal of said 2D or 3D logical mass matrix.
Thus, instead of having to assemble the entire 2D or 3D mass matrix, we
can build them as `KroneckerStencilMatrices`, which is much cheaper, and
then obtain the diagonal.

This feature reduces the runtime of a yet to be implemented LST
preconditioner test from 2 minutes down to 20 seconds.

A very fast test for this new method is included in this PR.
- Create `script/` folder for maintenance scripts
- Create `script/add_header.py` for adding a license header to the top
of every Python file
- Apply script to `examples/`, `mesh/`, `performance/`, and `psydac/`
folders
- Remove obsolete header lines (e.g. `# coding utf-8`, `#!
/usr/bin/python`, `# Copyright ...`) from all Python files
- Clean up imports in several modules across the library

---------

Co-authored-by: Frederik Schnack <frederik.schnack@tum.de>
Add logo for README and documentation. Fixes pyccel#534.

- Add `docs/logo/` folder with three SVG images:
   * `psydac_platypus.svg` with the PSYDAC platypus logo
   * `psydac_banner.svg` with a long banner (text + logo) for the README
* `psydac_square.svg` with a compact square banner (text + logo) for use
in presentations with a white background
- Include contents of `README.md` in generated documentation
- Use absolute paths in `README.md` for correct linking
- Add `myst-parser` to documentation requirements
- Fix instructions in "Building the Docs" section
- Remove useless links from bottom of main page in documentation
(already present on the top)
- Add square PSYDAC logo to header in documentation page
- Improve layout of documentation page
Implement preconditioners for mass matrices as proposed by Loli, Sangalli &
Tani in 2022 [Easy and efficient preconditioning of the isogeometric mass
matrix](https://doi.org/10.1016/j.camwa.2020.12.009). Fixes pyccel#525.

* Add `construct_LST_preconditioner()` to `psydac.fem.lst_preconditioner`.
  This creates the preconditioner for a single mass matrix, with or without
  Dirichlet boundary conditions, in the form of a `LinearOperator`. It uses
  `@functools.lru_cache` to avoid expensive recalculations.

* Add method `LST_preconditioners` to class `DiscreteDeRham`. This calls
  `construct_LST_preconditioner()` to create preconditioners for multiple mass
  matrices.

* Move functions `to_bnd` and `matrix_to_bandsolver` from test module
  `test_kron_direct_solver` to library module `psydac.linalg.direct_solvers`.

* Convert `matrix_to_bandsolver` into `BandedSolver.from_stencil_mat_1d`.

* Provide example in `examples/vector_potential_3d.py`.

* Provide test `linalg/tests/test_solvers.py::test_LST_preconditioner` with
  extensive information about the efficiency of the implementation.

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Refactor the linear solvers to have the preconditioner baked in the same
class. The preconditioner is now a parameter to the constructor of the
solver class, so there is no need to have a different class for the
preconditioned solvers. Fixes pyccel#469 and pyccel#556.

**Commit Summary**

- Merge `PConjugateGradient` into `ConjugateGradient`
- Merge `PBiConjugateGradientStabilized` into
`BiConjugateGradientStabilized`
- Rename confusing property `linop` of `InverseLinearOperator` as
`fwd_linop`
- Accept any capitalization in solver names (hence one can pass `'CG'`,
`'BiCG'`, `'GMRES'`, etc.)
- Relax too strict complex assertion in `ScaledLinearOperator`
- Raise a `Warning` when using LSMR or BiCG solvers with complex
matrices
- Improve unit tests

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Co-authored-by: Martin Campos Pinto <martin.campos-pinto@ipp.mpg.de>
- Do not remove `sum_factorization` argument from auxiliary equation for
L2 boundary projection
- Do not use sum factorization for assembly over 3D multi-patch domains
(see issue pyccel#545)
- Make 2D plots work for multi-patch domains
- Set correct multipatch FEM space type on disconnected multipatch
domains (fix pyccel#552)
- Raise a warning when discretizing a multipatch domain with a periodic
flag (fix pyccel#551)

---------

Co-authored-by: Martin Campos Pinto <martin.campos-pinto@ipp.mpg.de>
Co-authored-by: Martin Campos Pinto <campos@ann.jussieu.fr>
Make the necessary changes for being able to upload the `psydac` package
to PyPI through a CI workflow:

* Add actions `ubuntu_install` and `macos_install` for installation of
non-Python dependencies
* Require Python >= 3.10 (3.9 is no longer supported). Run tests with
Python 3.14, too
* Require Pyccel >= 2.1.0 and use its new subcommands
* Update PETSc version to 3.24.2
* Add `igakit` as a `git` submodule
* Use `meson-python` as build backend to bundle `igakit` into `psydac`
for publishing to PyPI
* Remove `setup.py` after dropping `setuptools` build backend
* Write PSYDAC in all caps across the whole repository
* Avoid version duplication: have `psydac/version.py` read value from
`pyproject.toml`
* Update instructions for editable install: flag `--no-build-isolation`
should be given to `pip`
* Do not require `wheel` and `numpy` for building
* Add `deploy_check` workflow which uploads PSYDAC to TestPyPI from a
pull request into the `main` branch
* Add `deploy` workflow which uploads PSYDAC to PyPI after a merge into
the `main` branch

---------

Co-authored-by: Emily Bourne <louise.bourne@gmail.com>
yguclu and others added 13 commits January 22, 2026 14:51
**Relevant changes**
- Explain that `devel` branch is cloned by default
- Explain that `build/` folder should be removed before attempting
another editable install

**Additional changes**
- Run documentation workflow whenever `README.md` is modified
- Run testing workflow on PRs only when set to "ready for review"
- Add new `Unreleased` section to `CHANGELOG.md`
Make sure that the MPI tests on Ubuntu are collected by Pytest when run
through `mpirun`. To this end, pass `env=os.environ` to
`subprocess.run()`.

**Other changes**
- Make sure that the full command is printed before being executed
- Print the command with quotes to allow copy & paste to the terminal
- Update `CHANGELOG.md`
### Main changes

- Allow selecting a specific test function in a module by passing `--mod
test_<MODULE>::test_<FUNCTION>`
- Pass `--dist loadgroup` to group test execution by the `xdist_group`
mark (see the documentation of
[pytest-xdist](https://pytest-xdist.readthedocs.io/en/stable/distribution.html#running-tests-across-multiple-cpus)),
which allows running non-thread-safe tests sequentially on a single
runner
- Remove local `.pytest_cache` folder before running tests
- Move `pytest.ini` to package root, so it can be used after
installation
- If not present, copy `pytest.ini` to local working directory before
running tests

### Additional changes

- Fix the parallel creation of the folder `__psydac__` in
`psydac.api.fem_bilinear_form`: only root process creates it
Change the way we color the background of our logo and remove some invisible
layers. This reduces the file size by a lot, e.g. the banner went down from
7 MB to 64 KB. The changes are mostly visible in bright mode.

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Fix an issue that prevented the use of the sum factorization for matrix
assembly: in the function `discretize`, the variable `terminal_expr` is
not a scalar but rather a tuple with a single element.

**Detailed list of changes**

- Check whether `terminal_expr[0]` is a `DomainExpression`, not
`terminal_expr`
- In the folder `examples/performance/`, rename the file `README.md` to
`matrix_assembly_speed_log.md`
- Clarify purpose and usage of the aforementioned markdown file

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Clean up platform-specific flags for GCC compilers. In particular, do
not use the plausible but inexistent flag `-mcpu=apple-m4` on Apple M4
computers (which use ARM chips). Instead, always use `-march=native`,
and additionally `-mavx` on `x86_64` architectures. Further, do not use
`-mtune=native` as this is not always supported. These changes fix pyccel#568

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Allow Psydac to be installed with a parametrisable backend (C or
Fortran). Following changes to the meson files generated by Pyccel the
root `meson.build` file is updated to define `py` and `m_dep`.

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
- Use `pyccel >= 2.2.3`: this allows compiling all kernels with C
- Require `h5py >= 3.16` to allow for standard install with `setuptools
>= 81.0`
- Require `numpy >= 2.1` to support Python >= 3.10
- Use `pytest.toml` instead of `pytest.ini` for Pytest configuration
(requires `pytest >= 9.0`)
- Move coverage configuration from `pyproject.toml` to
`psydac/pytest.toml`
- Don't run postprocessing unit tests with `pytest-xdist` because `h5py`
is not thread-safe: add Pytest mark `@pytest.mark.xdist_group('h5py')`
to all unit tests in `psydac/api/tests/test_postprocessing.py`
- Return error code on failure of the `psydac test` command; this was
not correctly returned before, hence the CI could not detect when the
unit tests were failing in a subprocess
- Return error code on failure of the `psydac compile` command; this fix
does not directly affect the CI, but it is included for correctness.
- Check correct reporting of failure for `psydac test` command in CI
testing
- Use correct configuration file in coverage CI tests
- For clarity, rename temporary folder where all CI tests are run:
`pytest` -> `scratch`
- Clean up `.gitignore`; specifically, stop ignoring files which don't
exist anymore
- Speed-up some tests by using coarser grids and fewer patches in
multi-patch domains
- Improve asserts in `feec/tests/test_global_projectors.py` by using the
expected convergence orders
- Ignore additional paths through `.gitignore`:
   * `prof` folders generated by profiling tools 
   * `__*pyccel__*/` folders generated by Pyccel

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Following the release of PETSc version `3.25.0` on March 30, 2026:

- Update PETSc version in `docs/installation.md` from `3.24.2` to
`3.25.0`
- Instead of `release` branch, download PETSc `3.25.0` in GitHub
workflows

Other Changes:

- Create 'install_petsc4py' action to install PETSc & petsc4py w/
complex support; use it in the workflows 'testing' and 'documentation'
- Rename actions:
    * parallel_h5py -> install_h5py
    * macos_install -> macos_installation
    * ubuntu_install -> ubuntu_installation
- Update CHANGELOG.md
…ed files, accept upstream additions and deletions
@max-models
max-models marked this pull request as draft July 23, 2026 09:00
@max-models
max-models marked this pull request as ready for review July 24, 2026 11:39
@max-models
max-models requested a review from spossann July 24, 2026 11:40

@spossann spossann left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like the struphy tests to run before merging this. The CI test skipped all tests, maybe we should run them.

@max-models

Copy link
Copy Markdown
Member Author

I would like the struphy tests to run before merging this. The CI test skipped all tests, maybe we should run them.

I'm actually a bit lost in the workflow for feectools at the moment, is this not testing struphy? https://github.com/struphy-hub/feectools/actions/runs/30090086679/job/89471175346?pr=71

@spossann

Copy link
Copy Markdown
Member

I would like the struphy tests to run before merging this. The CI test skipped all tests, maybe we should run them.

I'm actually a bit lost in the workflow for feectools at the moment, is this not testing struphy? https://github.com/struphy-hub/feectools/actions/runs/30090086679/job/89471175346?pr=71

Yes indeed, but the tests were all skipped, I guess due to testmon. We should run all struphy tests (from the struphy CI?) whenever we rebase with upstream.

@max-models

Copy link
Copy Markdown
Member Author

I would like the struphy tests to run before merging this. The CI test skipped all tests, maybe we should run them.

I'm actually a bit lost in the workflow for feectools at the moment, is this not testing struphy? https://github.com/struphy-hub/feectools/actions/runs/30090086679/job/89471175346?pr=71

Yes indeed, but the tests were all skipped, I guess due to testmon. We should run all struphy tests (from the struphy CI?) whenever we rebase with upstream.

Ah, ok I see. Let's do it next week so we are sure the struphy tests pass before merging.

@max-models
max-models marked this pull request as draft July 24, 2026 13:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants