Releases: SciCompMod/GMGPolar
GMGPolar v2.2.0
GMGPolar 2.2.0
Version 2.2.0 contains, first, the experimental PCG setup as presented in Litz et al (2026). Second, GMGPolar's code and data structures have been reworked and integrated Kokkos to, eventually, allow a full integration in Gysela-X.
-
Preconditioned Conjugate Gradient (PCG)
- Added PCG solver, allowing GMGPolar to be used as a preconditioner for CG instead of a standalone iterative solver.
- When solving the extrapolated problem, PCG converges in up to 4x fewer iterations and runs up to 2x faster end-to-end.
- Addtitional memory overhead is minimal by aliasing PCG work vectors onto existing storage.
-
Kokkos Integration
- Switched to Kokkos-backed vectors and a batched tridiagonal solver with Kokkos parallelization.
- Templated multigrid operators to support future GPU execution spaces, removing the previous polymorphic design.
-
Design and API Cleanup
- Input functions now use C++ concepts instead of polymorphism.
- Simplified interpolation class to interpolate directly between grids instead of levels.
- Encapsulated MUMPS solver in its own class; improved DirectSolver naming consistency.
- Replaced macro-heavy patterns with standard functions for type safety.
- Removed unused Point, MultiIndex classes, redundant LevelCache constructor, and thread reduction factor variable.
-
New Features
- Added support for solves without a multigrid hierarchy.
-
Bug Fixes
- Fixed MUMPS factorization failure when OpenMP multithreading is enabled in versions later than 5.5.1.
-
Testing
- Added formatting validation tests and automatic CI testing with MUMPS.
- Added Google Tests for PCG convergence validation.
Merged pull requests
- Run on gyselax/gyselalibxx_env docker container by @EmilyBourne in #122
- Add a test with MUMPS by @EmilyBourne in #129
- Vector to kokkos view by @AbdelhadiKara in #126
- Remove
cos_thetaandsin_thetaarguments by @EmilyBourne in #132 - Add clang-format test by @EmilyBourne in #127
- Clean up sign comparison warnings by @EmilyBourne in #134
- Pass doubles by copy not reference by @EmilyBourne in #135
- Use Kokkos vectors in COO and CSR matrices by @EmilyBourne in #133
- Interpolate from grids instead from levels by @julianlitz in #140
- Add float conversion warning by @EmilyBourne in #139
- Resolve ConfigParser float conversion by @julianlitz in #145
- Reduce duplication in tests by @EmilyBourne in #148
- Remove unoptimized interpolation operators by @julianlitz in #141
- Remove MultiIndex and Point class by @julianlitz in #143
- Remove thread_reduction_factor by @julianlitz in #150
- Remove 2nd LevelCache Constructor by @julianlitz in #144
- Prefer C++20 std::ssize() over static_cast by @julianlitz in #153
- Improve DirectSolver class names by @julianlitz in #155
- Deactivate OpenMP multithreading during MUMPS factorization by @julianlitz in #147
- Remove macros by @EmilyBourne in #154
- Use operator() instead of rhs_f function in SourceTerms by @EmilyBourne in #138
- Improve readability of Residual implementation by @julianlitz in #157
- Add missing ScopeGuards to initialise Kokkos by @EmilyBourne in #158
- Template GMGPolar class on DomainGeometry by @EmilyBourne in #136
- Template GMGPolar class on DensityProfileCoefficients by @EmilyBourne in #137
- Remove the superclass BoundaryConditions by @EmilyBourne in #159
- Replace SmootherTake macros with type-safe functions by @julianlitz in #163
- Add batched tridiagonal solver with Kokkos parallelization by @julianlitz in #162
- Replace SmootherGive macros with type-safe functions by @julianlitz in #164
- Replace Interpolation macros with type-safe functions by @julianlitz in #169
- Replace ExtrapolatedSmootherTake macros with type-safe functions by @julianlitz in #165
- Replace ExtrapolatedSmootherGive macros with type-safe functions by @julianlitz in #166
- Replace DirectSolverTake macros with type-safe functions by @julianlitz in #167
- Replace DirectSolverGive macros with type-safe functions by @julianlitz in #168
- Make locally inlined functions static by @julianlitz in #172
- Zero-initialize Matrix values by default by @julianlitz in #177
- Correct FMG interpolation description by @julianlitz in #174
- Substitute BatchedTridiagonalSolver in SmootherGive by @julianlitz in #173
- Substitute BatchedTridiagonalSolver in SmootherTake by @julianlitz in #171
- Substitute BatchedTridiagonalSolver in ExtrapolatedSmootherTake by @julianlitz in #175
- Substitute BatchedTridiagonalSolver in ExtrapolatedSmootherGive by @julianlitz in #176
- Simplify multigrid function naming by @julianlitz in #161
- Use assert() in stencil indexing instead of runtime error by @julianlitz in #178
- Remove legacy tridiagonal solver in favor of batched version by @julianlitz in #180
- Correct under- and overflow protection in l2_norm by @julianlitz in #184
- Adjust FMG approximation - Skip costly multigrid cycles on finest level by @julianlitz in #185
- Add applySystemOperator(result, x) to Residual class for PCG support by @julianlitz in #186
- Simplify initializations in GMGPolar::setup by @julianlitz in #187
- Add Preconditioned Conjugate Gradient Method by @julianlitz in #188
- Make template interface the default by @EmilyBourne in #189
- Template
LevelonDomainGeometryby @EmilyBourne in #190 - Encapsulate MUMPS solver class by @julianlitz in #192
- Support single-level multigrid (maxLevels = 1) when extrapolation is disabled by @julianlitz in #193
- Substitute COO_Mumps_Solver in DirectSolver by @julianlitz in #194
- Substitute COO_Mumps_Solver in SmootherTake by @julianlitz in #195
- Substitute COO_Mumps_Solver in ExtrapolatedSmootherTake by @julianlitz in #197
- Remove unused density profile coefficients objects by @EmilyBourne in #199
- Remove unused domain geometry objects by @EmilyBourne in #200
- Avoid redundant coarse-grid solve in F/W-cycle recursion by @julianlitz in #196
- Template on LevelCache not DomainGeometry by @EmilyBourne in #201
- Remove superclass DensityProfileCoefficients by @EmilyBourne in #202
- Remove superclass DomainGeometry by @EmilyBourne in #203
- Remove SourceTerm superclass by @EmilyBourne in #209
- Update README.md with version 2.0.1, 2.1.0, 2.2.0 by @julianlitz in #204
Full Changelog: v2.1.0...v2.2.0
GMGPolar v2.1.0
This release delivers performance optimizations, structural improvements, and extended functionality.
Solver & Performance
- Replaced the custom LU decomposition solver with a faster implementation.
- Fixed an error in the FMG method, reducing iterations when using a small number of multigrid levels.
New Functionality
- Added angular dependence in profile coefficients.
- Enabled multiple solves with the same GMGPolar instance for varying source terms and boundary conditions.
Restructuring & Code Quality
- Refactored GMGPolar by moving command-line parsing into a dedicated ConfigParser.
- Redesigned the solve and setup functions, and reorganized the header file with a clearer structure and enhanced documentation.
Testing & Usability
- Added tests for LU solver, convergence order, and solver validation across multiple settings.
- Improved verbose output formatting for clearer settings and runtime information.
Full Changelog: v2.0.1...v2.1.0
GMGPolar v2.0.1
GMGPolar v2.0.1 addresses some minor items:
- Correction of broken code coverage
- Improved output
- Changed position for anisotropic refinement with ZoniShifted
Full Changelog: v2.0.0...v2.0.1
GMGPolar v2.0.0
- Enhancements and New Class Layout:
- Linear Algebra:
- Introduced custom Vector and SparseMatrix classes.
- Added a (cyclic) Tridiagonal Solver for improved performance and usability.
- Input Functions:
- Separated into distinct components: DomainGeometry, BoundaryConditions, SourceTerm, etc.
- Polar Grid:
- Indexing is now based on circle/radial smoother.
- Residual:
- Improved the residual calculation by addressing the unintuitive behavior that previously applied only to the interior part of the matrix.
- Direct Solver:
- Fixed a bug where boundary values were not treated correctly.
- Built matrices to be symmetric, reducing factorization time.
- Smoother:
- Separated into extrapolated and standard smoothers.
- Replaced the LU-Decomposition algorithm with the Thomas algorithm for improved efficiency.
- New Features
- Introduced W- and F cycles for enhanced solving capabilities.
- Added FMG (Full Multigrid) to obtain improved starting solutions.
- Implemented advanced caching behavior options for the "Give" implementation strategy.
- Added a faster strategy named 'Take,' which is appropriate for cases where memory is less of a constraint, resulting in an 80% increase in memory usage.
- Comprehensive Unit Tests: Integrated Google Unit Tests for all classes, ensuring robust and reliable functionality across the codebase.
- Performance Improvements
- Removed the task-based approach, which did not scale well with increasing parallelization.
- Reduced maximum usage by 61.5% by constructing symmetric matrices and utilizing the tridiagonal structure of smoother matrices.
- Updated Features
- Added a new LU decomposition solver, allowing users to choose between MUMPS and the in-house solver for greater flexibility and performance.
GMGPolar v1.0.3
Corrected two bugs and added tests for prolongation and restriction operators.
What's Changed
- 60 Memory error when creating fine anisotropic grid by @CodingAllan in #61
- 33 prolongation and restriction tests by @CodingAllan in #34
- Correct alpha_coeff value in Poisson test to 1.0 by @julianlitz in #64
Full Changelog: v1.0.2...v1.0.3
GMGPolar v1.0.2
Corrected two bug without effect on the result:
- Do not build matrix Asc_orth in matrix-free approach
- Correct list of coarser nodes for output
GMGPolar v1.0.1
- Improve output schemes
- Added code coverage
- Added some initial software tests
- Correct setup process with MUMPS coarse solver
GMGPolar v1.0
GMGPolar v1.0
GMGPolar offers a taylored Geometric Multigrid solver for geometries described by curvilinear coordinates (in its simplest case, by polar coordinates). GMGPolar uses an implicit extrapolation scheme to raise the convergence order. For nonstandard finite elements, this result has been shown theoretically and for nine-point finite difference stars, we observed up to convergence order four in all numerical simulations. This extrapolation scheme can be used likewise for other domains described by tensor- or product-format meshes in 2D. For curvilinear domains, suited smoothing schemes have been developed and implemented. GMGPolar offers a matrix and matrix-free version for most of its operators. Its original application is on cross-sectional views of realistic Tokamak geometries for fusion plasma simulations.
Contributors