Fix method plot_2d_decomposition of TensorFemSpace#529
Conversation
There was a problem hiding this comment.
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.
… MPI communication" This reverts commit eadfd56.
There was a problem hiding this comment.
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)
|
Thanks for the fix. Should we also fix |
Done |
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 have expanded the unit test considerably. Would you like to have another look? |
|
@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... |
This leads to images cropped to different sizes on Linux and macOS.
Testing the plots themselves is a nice feature ! Thanks a lot for having worked this out |
Coverage summary from CodacySee diff coverage on Codacy
Coverage variation details
Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: Diff coverage details
Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: See your quality gate settings Change summary preferencesFootnotes
|
* 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>
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`.
Fix bug in method
plot_2d_decompositionofTensorFemSpace, which was failing when run in parallel with a distributed spline mapping.psydac/fem/tests/test_tensor.pywith a unit test which fails on thedevelbranch. 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.fig,ax, andmpi_rootexamples/poisson_2d_mapping.pyto pass the correct mapping (i.e. also a distributed spline mapping if that is used in the computations) toplot_2d_decomposition.Note
The function
plot_2d_decompositiondoes not have to be a method ofTensorFemSpace. See issue #532.TO DO