Skip to content

Fix method plot_2d_decomposition of TensorFemSpace#529

Merged
yguclu merged 32 commits intodevelfrom
fix-plot_2d_decomposition
Oct 21, 2025
Merged

Fix method plot_2d_decomposition of TensorFemSpace#529
yguclu merged 32 commits intodevelfrom
fix-plot_2d_decomposition

Conversation

@yguclu
Copy link
Copy Markdown
Member

@yguclu yguclu commented Oct 14, 2025

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.

Note

The function plot_2d_decomposition does not have to be a method of TensorFemSpace. See issue #532.

TO DO

  • Test optional parameters
  • Add assert statements to unit test
  • Reactivate all unit tests

@yguclu yguclu marked this pull request as ready for review October 15, 2025 10:14
Copy link
Copy Markdown
Collaborator

@campospinto campospinto left a comment

Choose a reason for hiding this comment

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

Thanks Yaman! The new function plot_2d_decomposition looks good to me and I checked that it works well, both for discrete and analytical mappings (which could also be tested now by passing a different mapping to the function, with the same tensorspace V).

I also find that the function should be a member of the (new) Geometry class.

Copy link
Copy Markdown
Collaborator

@campospinto campospinto left a comment

Choose a reason for hiding this comment

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

Thanks for adding the analytical mapping. It looks good now and can be improved after merging the improved Geometry class (#527 I guess?)

(I'm approving the PR but of course the todo's above should be done first)

@alisa-kirkinskaia
Copy link
Copy Markdown
Contributor

Thanks for the fix. Should we also fix examples/poisson_2d_mapping.py in this PR? Right now it always plots the domain decomposition with analytical mapping.

@yguclu
Copy link
Copy Markdown
Member Author

yguclu commented Oct 20, 2025

Thanks for the fix. Should we also fix examples/poisson_2d_mapping.py in this PR? Right now it always plots the domain decomposition with analytical mapping.

Done

@alisa-kirkinskaia

@yguclu
Copy link
Copy Markdown
Member Author

yguclu commented Oct 20, 2025

Thanks for adding the analytical mapping. It looks good now and can be improved after merging the improved Geometry class (#527 I guess?)

I have actually added the case of a distributed spline mapping, which was failing before. The analytical mapping always worked because every process has access to the same information on the whole domain.

(I'm approving the PR but of course the todo's above should be done first)

I have expanded the unit test considerably. Would you like to have another look?

@campospinto

@yguclu
Copy link
Copy Markdown
Member Author

yguclu commented Oct 20, 2025

@campospinto I need to make some final tweaks to the unit test in order to generate (close to) identical images with Matplotlib on different platforms...

@campospinto
Copy link
Copy Markdown
Collaborator

Thanks for adding the analytical mapping. It looks good now and can be improved after merging the improved Geometry class (#527 I guess?)

I have actually added the case of a distributed spline mapping, which was failing before. The analytical mapping always worked because every process has access to the same information on the whole domain.

(I'm approving the PR but of course the todo's above should be done first)

I have expanded the unit test considerably. Would you like to have another look?

@campospinto

Testing the plots themselves is a nice feature ! Thanks a lot for having worked this out

@codacy-production
Copy link
Copy Markdown

codacy-production bot commented Oct 21, 2025

Coverage summary from Codacy

See diff coverage on Codacy

Coverage variation Diff coverage
Report missing for c531d981 1.89%
Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (c531d98) Report Missing Report Missing Report Missing
Head commit (4c6e0d3) 63304 39146 61.84%

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#529) 53 1 1.89%

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

See your quality gate settings    Change summary preferences

Footnotes

  1. Codacy didn't receive coverage data for the commit, or there was an error processing the received data. Check your integration for errors and validate that your coverage setup is correct.

@yguclu yguclu merged commit c97f265 into devel Oct 21, 2025
9 checks passed
@yguclu yguclu deleted the fix-plot_2d_decomposition branch October 21, 2025 11:41
spossann added a commit to struphy-hub/feectools that referenced this pull request Nov 10, 2025
* Support Python 3.13 (pyccel#475)

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

* Fix PSYDAC_BACKEND_GPYCCEL flags on latest Apple silicon (pyccel#480)

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>

* Resolve warnings in sequential unit tests (pyccel#481)

* 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).

* Pass `out` parameter to `petsc_to_psydac` (pyccel#483)

* Rename `dot` as `inner` in `Vector`, `VectorSpace`, and subclasses (pyccel#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`

* Update docstring for inner product in polar/dense.py (pyccel#488)

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>

* Add a `dot_inner` concrete method to the base class `LinearOperator` (pyccel#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.

* Install PETSc-3.23.2 (latest version) (pyccel#499)

* Update authors (pyccel#500)

* Fix the code generation of unnecessary derivatives (pyccel#490)

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>

* Fix bug in `allocate_matrices` in `DiscreteBilinearForm` (pyccel#507)

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.

* Enable Pyccel 2.0 (pyccel#503)

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>

* New installation procedure and README (pyccel#510)

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`

* Fast Matrix Assembly (pyccel#448)

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>

* Improve multipatch FEM API (pyccel#509)

### 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>

* Allow `mpi_dims_mask` with geometry file (pyccel#526)

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 the parallel low-level 2D Poisson example (pyccel#528)

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 method `plot_2d_decomposition` of `TensorFemSpace` (pyccel#529)

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`.

* Describe library name in README.md (pyccel#535)

Add a NOTE block with the meaning of the PSYDAC acronym, as well as its
pronounciation.

* Fix parallelization bug in polar splines (pyccel#539)

* change version to 2.6.0.dev0

* remove test_tensor.py

* install struohy from 108-psydac-change-renaming-of-globalpojector

---------

Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Co-authored-by: Max <max.lindqvist@ipp.mpg.de>
Co-authored-by: Elena Moral Sánchez <88042165+e-moral-sanchez@users.noreply.github.com>
Co-authored-by: Martin Campos Pinto <campos@ann.jussieu.fr>
Co-authored-by: Frederik Schnack <frederik.schnack@tum.de>
Co-authored-by: Elena Moral Sánchez <Elena.Moral.Sanchez@ipp.mpg.de>
Co-authored-by: Emily Bourne <louise.bourne@gmail.com>
Co-authored-by: Julian Owezarek <julian.owezarek@tum.de>
Co-authored-by: Alisa Kirkinskaia <alisa.kirkinskaia@tum.de>
Co-authored-by: Alisa Kirkinskaia <alisa.kirkinsk@gmail.com>
campospinto pushed a commit that referenced this pull request Dec 12, 2025
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`.
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.

3 participants