Broken FEEC projections on polar domains - #576
alisa-kirkinskaia wants to merge 210 commits into
Conversation
…into polar_splines_alisa
- Remove polar_mapping and use_logical_sol options - Change the analytical solution - Avoid Laplacian() for right hand side - Add disk radius as parse argument
The folder 'subprojects/igakit' was accidentally deleted in commit c51b81b
yguclu
left a comment
There was a problem hiding this comment.
Good job addressing my previous review comments, @alisa-kirkinskaia!
I have gone through the whole PR once again
| @property | ||
| def T(self): | ||
| return self.transpose() |
There was a problem hiding this comment.
The base class LinearOperator already provides an identical implementation for this property. Hence, there is no reason to repeat it here
| Parameters: | ||
| ----------- | ||
|
|
||
| W1 : VectorFemSpace (former ProductFemSpace) | ||
| Full tensor product spline space of the 1-forms S^{p1-1, p2} x S^{p1, p2-1} | ||
|
|
||
| transposed : Boolean | ||
| Switch between P1 and P1 transposed (default is False) |
There was a problem hiding this comment.
As in a previous comment
| Parameters: | |
| ----------- | |
| W1 : VectorFemSpace (former ProductFemSpace) | |
| Full tensor product spline space of the 1-forms S^{p1-1, p2} x S^{p1, p2-1} | |
| transposed : Boolean | |
| Switch between P1 and P1 transposed (default is False) | |
| Parameters: | |
| ----------- | |
| W1 : VectorFemSpace | |
| Full tensor product spline space of 1-forms S^{p1-1, p2} x S^{p1, p2-1}. | |
| transposed : bool, default=False | |
| Switch between P1 and P1 transposed. |
| @property | ||
| def T(self): | ||
| return self.transpose() |
There was a problem hiding this comment.
The base class LinearOperator already provides an identical implementation for this property. Hence, there is no reason to repeat it here
| Parameters: | ||
| ----------- | ||
|
|
||
| W1 : VectorFemSpace (ProductFemSpace) | ||
| Full tensor product spline space of the 1-forms S^{p1-1, p2} x S^{p1, p2-1} | ||
|
|
||
| transposed : Boolean | ||
| Switch between P1 and P1 transposed (default is False) | ||
|
|
||
| hbc : Boolean | ||
| Switch on and off the imposition of homogeneous Dirichlet boundary | ||
| conditions on the tangential (angular) direction (default is False) | ||
| """ | ||
|
|
There was a problem hiding this comment.
See a previous comment about ProductFemSpace. Further, I believe that the homogeneous Dirichlet BCs are imposed along the radial direction for the tangential component of the field. Is that right?
| Parameters: | |
| ----------- | |
| W1 : VectorFemSpace (ProductFemSpace) | |
| Full tensor product spline space of the 1-forms S^{p1-1, p2} x S^{p1, p2-1} | |
| transposed : Boolean | |
| Switch between P1 and P1 transposed (default is False) | |
| hbc : Boolean | |
| Switch on and off the imposition of homogeneous Dirichlet boundary | |
| conditions on the tangential (angular) direction (default is False) | |
| """ | |
| Parameters: | |
| ----------- | |
| W1 : VectorFemSpace | |
| Full tensor product spline space of 1-forms S^{p1-1, p2} x S^{p1, p2-1}. | |
| transposed : bool, default=False | |
| Switch between P1 and P1 transposed. | |
| hbc : bool, default=False | |
| If True, impose homogeneous Dirichlet boundary conditions on the | |
| tangential (angular) component of the field. | |
| """ |
| Parameters: | ||
| ----------- | ||
|
|
||
| W2 : TensorFemSpace | ||
| Full tensor product spline space of the 2-forms S^{p1-1, p2-1} | ||
|
|
||
| transposed : Boolean | ||
| Switch between P2 and P2 transposed (default is False) | ||
| """ | ||
|
|
There was a problem hiding this comment.
| Parameters: | |
| ----------- | |
| W2 : TensorFemSpace | |
| Full tensor product spline space of the 2-forms S^{p1-1, p2-1} | |
| transposed : Boolean | |
| Switch between P2 and P2 transposed (default is False) | |
| """ | |
| Parameters: | |
| ----------- | |
| W2 : TensorFemSpace | |
| Full tensor product spline space of 2-forms S^{p1-1, p2-1}. | |
| transposed : bool, default=False | |
| Switch between P2 and P2 transposed. | |
| """ |
Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
Co-authored-by: Yaman Güçlü <yaman.guclu@gmail.com>
yguclu
left a comment
There was a problem hiding this comment.
Thanks for the latest changes @alisa-kirkinskaia!
|
|
||
| Attributes | ||
| ---------- | ||
| logical_bounds : tuple |
There was a problem hiding this comment.
If these are tuples of Python floats:
| logical_bounds : tuple | |
| logical_bounds : tuple[tuple[float, ...], ...] |
| mapping : sympde.topology.mapping.Mapping | ||
| Mapping used by the solver. It is either the analytical mapping or | ||
| its spline approximation. Initialized by calling ``build_geometry``. |
There was a problem hiding this comment.
Does the PSYDAC class SplineMapping currently subclass the SymPDE class Mapping? @campospinto
| mapping : sympde.topology.mapping.Mapping | ||
| Mapping used by the solver. It is either the analytical mapping or | ||
| its spline approximation. Initialized by calling ``build_geometry``. | ||
|
|
||
| analytical_mapping : sympde.topology.mapping.Mapping | ||
| Original analytical mapping from the logical to the physical domain. | ||
|
|
||
| domain : sympde.topology.Domain | ||
| Physical domain associated with ``mapping``. Initialized by | ||
| calling ``build_geometry``. |
There was a problem hiding this comment.
Are the double tick marks around build_geometry and mapping really needed? I would expect single ticks to be sufficient
| :code | ||
| $(\partial^2_{xx} + \partial^2_{yy}) \phi(x,y) = -\rho(x,y)$ | ||
|
|
||
| """ |
There was a problem hiding this comment.
Excellent, thanks! Could you please mention the new module psydac.utilities.operators in the file CHANGELOG.md?
There was a problem hiding this comment.
Have you checked that this script still runs after removing the local class Laplacian? I think you are missing an import statement
| ---------- | ||
| solution_name : str | ||
| Name of the analytical solution to visualize. | ||
| Must be either ``cavity`` or ``gaussian``. |
There was a problem hiding this comment.
Are double tick marks needed for generating the documentation?
This PR implements broken FEEC projections for the$C^0$ and $C^1$ sequences in 2D (conga_projections.py). The formulas for the projections can be found on pages 19-23 of the arXiv preprint https://arxiv.org/pdf/2505.15996.
Main additions
Broken FEEC polar projections
psydac.feec.polar.conga_projections.LinearOperatorsubclassesC0PolarProjection_V0/1/2acting on the coefficients of scalar- or vector-valued tensor-product splines defined on the logical domain. The tensor-product splines are projected onto the subspacesLinearOperatorsubclassesC1PolarProjection_U0/1/2acting on the coefficients of scalar- or vector-valued tensor-product splines defined on the logical domain. The tensor-product splines are projected onto the subspacesdotmethods of the new projection operators correctly execute in parallel for arbitrary domain decompositions in both the angular and radial dimensions.Tests
tosparsemethods against reference matrix operatorsdotandtosparsemethodsPoisson and Maxwell examples
psydac/feec/polar/examples/poisson_2d.pyfor solving manufactured Poisson problems on polar mapped domains. The script supports disk, target, and Czarny domains, analytical or spline mappings, and different treatments of the polar singularity (polar-spec, polar-std, C0conga, and C1conga).psydac/feec/polar/examples/maxwell_2d.py. The script provides two field configurations defined inpsydac/feec/polar/examples/analytical_solutions.py:CircularCavitySolution: Time-harmonic solution of Maxwell's equations in a disk-like domain withperfectly conducting walls
GaussianInitialCondition: localized rotational Gaussian initial condition for the electric field, with the magnetic field initialized fromFurther changes
eval_fieldandeval_field_gradientofTensorFemSpacerelated to floating point round-off at MPI subdomain boundaries. Add a unit test inpsydac/fem/tests/test_eval_fields_parallel.pyAdditional info
Example of run:
mpirun -n 2 python poisson_2d.py -S -n 16 24 -d 2 2 -t disk -D 0.2 -m 'C0conga'Exact solution, approximate solution and error plot:
Example of run:
mpirun -n 2 python maxwell_2d.py -S -n 16 20 -d 2 2 -T 1 -D 0.2 -s 1Plot of exact solution and approximate solution at final time T = 1:
TODO
C1PolarProjection_V2and test itC1PolarProjection_V0/1/2toC1PolarProjection_U0/1/2(i.e. replaceVwithU)sympy.lambdifywithpyccel.lambdifymaxwell_2d.pyin parallel for a certain combination ofdegreeandncellsmainfunction inwaveTE.py