Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions include/GMGPolar/igmgpolar.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ class Level;
class LevelCache;

#include "../InputFunctions/boundaryConditions.h"
#include "../InputFunctions/densityProfileCoefficients.h"
#include "../InputFunctions/domainGeometry.h"
#include "../InputFunctions/exactSolution.h"
#include "../InputFunctions/sourceTerm.h"
#include "../Interpolation/interpolation.h"
Expand All @@ -22,7 +20,6 @@ class LevelCache;
#include "../LinearAlgebra/Vector/vector_operations.h"
#include "../PolarGrid/polargrid.h"
#include "../Definitions/global_definitions.h"
#include "test_cases.h"

class IGMGPolar
{
Expand Down
125 changes: 67 additions & 58 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,76 +6,85 @@
int main(int argc, char* argv[])
{
Kokkos::ScopeGuard kokkos_scope(argc, argv);

// Initialize LIKWID markers if enabled
LIKWID_INIT();

// Parse command-line arguments to extract problem configuration
ConfigParser parser;
parser.parse(argc, argv);

// Create GMGPolar solver
std::unique_ptr<IGMGPolar> solver(parser.solver());

// --- General solver output and visualization settings --- //
solver->verbose(parser.verbose()); // Enable/disable verbose output
solver->paraview(parser.paraview()); // Enable/disable ParaView output

// --- Parallelization and threading settings --- //
solver->maxOpenMPThreads(parser.maxOpenMPThreads()); // Maximum OpenMP threads to use
omp_set_num_threads(parser.maxOpenMPThreads()); // Global OpenMP thread limit

// --- Numerical method setup --- //
solver->DirBC_Interior(parser.DirBC_Interior()); // Interior boundary conditions: Dirichlet, Across-the-origin,
solver->stencilDistributionMethod(parser.stencilDistributionMethod()); // Stencil distribution strategy: Take, Give
solver->cacheDensityProfileCoefficients(
parser.cacheDensityProfileCoefficients()); // Cache density profile coefficients: alpha, beta
solver->cacheDomainGeometry(parser.cacheDomainGeometry()); // Cache domain geometry data: arr, att, art, detDF

// --- Multigrid settings --- //
solver->extrapolation(parser.extrapolation()); // Enable/disable extrapolation
solver->maxLevels(parser.maxLevels()); // Max multigrid levels (-1 = use deepest possible)
solver->preSmoothingSteps(parser.preSmoothingSteps()); // Smoothing before coarse-grid correction
solver->postSmoothingSteps(parser.postSmoothingSteps()); // Smoothing after coarse-grid correction
solver->multigridCycle(parser.multigridCycle()); // Multigrid cycle type
solver->FMG(parser.FMG()); // Full Multigrid mode on/off
solver->FMG_iterations(parser.FMG_iterations()); // FMG iteration count
solver->FMG_cycle(parser.FMG_cycle()); // FMG cycle type

// --- Preconditioned Conjugate Gradient settings --- //
solver->PCG(parser.PCG()); // Preconditioned Conjugate Gradient mode on/off
solver->PCG_FMG(parser.PCG_FMG()); // Use FMG as preconditioner for PCG
solver->PCG_FMG_iterations(parser.PCG_FMG_iterations()); // FMG iterations for PCG preconditioner
solver->PCG_FMG_cycle(parser.PCG_FMG_cycle()); // FMG cycle type for PCG preconditioner
solver->PCG_MG_iterations(parser.PCG_MG_iterations()); // Multigrid iterations for PCG preconditioner
solver->PCG_MG_cycle(parser.PCG_MG_cycle()); // Multigrid cycle type for PCG preconditioner

// --- Iterative solver controls --- //
solver->maxIterations(parser.maxIterations()); // Max number of iterations
solver->residualNormType(parser.residualNormType()); // Residual norm type (L2, weighted-L2, L∞)
solver->absoluteTolerance(parser.absoluteTolerance()); // Absolute residual tolerance
solver->relativeTolerance(parser.relativeTolerance()); // Relative residual tolerance

// --- Finalize solver setup --- //
solver->setup(); // (allocates internal data, prepares operators, etc.)

// --- Provide optional exact solution --- //
solver->setSolution(&parser.exactSolution());
// --- Solve Phase --- //
std::visit(
[&](auto const& boundary_condition) {
solver->solve(boundary_condition, parser.sourceTerm());
[&parser](auto const& domain_geometry, auto const& density_profile_coeffs, auto const& boundary_condition) {
// Get the types of the domain geometry and the density profile coefficients
using DG = std::decay_t<decltype(domain_geometry)>;
using DC = std::decay_t<decltype(density_profile_coeffs)>;

// Create GMGPolar solver for the selected geometry and coefficient types
GMGPolar<DG, DC> solver(parser.grid(), domain_geometry, density_profile_coeffs);

// --- General solver output and visualization settings --- //
solver.verbose(parser.verbose()); // Enable/disable verbose output
solver.paraview(parser.paraview()); // Enable/disable ParaView output

// --- Parallelization and threading settings --- //
solver.maxOpenMPThreads(parser.maxOpenMPThreads()); // Maximum OpenMP threads to use
omp_set_num_threads(parser.maxOpenMPThreads()); // Global OpenMP thread limit

// --- Numerical method setup --- //
solver.DirBC_Interior(
parser.DirBC_Interior()); // Interior boundary conditions: Dirichlet, Across-the-origin
solver.stencilDistributionMethod(
parser.stencilDistributionMethod()); // Stencil distribution strategy: Take, Give
solver.cacheDensityProfileCoefficients(
parser.cacheDensityProfileCoefficients()); // Cache density profile coefficients: alpha, beta
solver.cacheDomainGeometry(
parser.cacheDomainGeometry()); // Cache domain geometry data: arr, att, art, detDF

// --- Multigrid settings --- //
solver.extrapolation(parser.extrapolation()); // Enable/disable extrapolation
solver.maxLevels(parser.maxLevels()); // Max multigrid levels (-1 = use deepest possible)
solver.preSmoothingSteps(parser.preSmoothingSteps()); // Smoothing before coarse-grid correction
solver.postSmoothingSteps(parser.postSmoothingSteps()); // Smoothing after coarse-grid correction
solver.multigridCycle(parser.multigridCycle()); // Multigrid cycle type
solver.FMG(parser.FMG()); // Full Multigrid mode on/off
solver.FMG_iterations(parser.FMG_iterations()); // FMG iteration count
solver.FMG_cycle(parser.FMG_cycle()); // FMG cycle type

// --- Preconditioned Conjugate Gradient settings --- //
solver.PCG(parser.PCG()); // Preconditioned Conjugate Gradient mode on/off
solver.PCG_FMG(parser.PCG_FMG()); // Use FMG as preconditioner for PCG
solver.PCG_FMG_iterations(parser.PCG_FMG_iterations()); // FMG iterations for PCG preconditioner
solver.PCG_FMG_cycle(parser.PCG_FMG_cycle()); // FMG cycle type for PCG preconditioner
solver.PCG_MG_iterations(parser.PCG_MG_iterations()); // Multigrid iterations for PCG preconditioner
solver.PCG_MG_cycle(parser.PCG_MG_cycle()); // Multigrid cycle type for PCG preconditioner

// --- Iterative solver controls --- //
solver.maxIterations(parser.maxIterations()); // Max number of iterations
solver.residualNormType(parser.residualNormType()); // Residual norm type (L2, weighted-L2, L∞)
solver.absoluteTolerance(parser.absoluteTolerance()); // Absolute residual tolerance
solver.relativeTolerance(parser.relativeTolerance()); // Relative residual tolerance

// --- Finalize solver setup --- //
solver.setup(); // (allocates internal data, prepares operators, etc.)

// --- Provide optional exact solution --- //
solver.setSolution(&parser.exactSolution());

// --- Solve Phase --- //
solver.solve(boundary_condition, parser.sourceTerm());

// --- Retrieve solution and associated grid --- //
Vector<double> solution = solver.solution();
const PolarGrid& grid = solver.grid();

// Print timing statistics for each solver phase
solver.printTimings();
},
parser.boundaryConditions());

// --- Retrieve solution and associated grid --- //
Vector<double> solution = solver->solution();
const PolarGrid& grid = solver->grid();
parser.domainGeometry(), parser.densityProfileCoefficients(), parser.boundaryConditions());

// Finalize LIKWID performance markers
LIKWID_CLOSE();

// Print timing statistics for each solver phase
solver->printTimings();

return 0;
}
1 change: 1 addition & 0 deletions tests/GMGPolar/convergence_order.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <vector>
#include <random>

#include "../../include/ConfigParser/test_selection.h"
#include "../../include/GMGPolar/gmgpolar.h"

template <class T>
Expand Down
1 change: 1 addition & 0 deletions tests/GMGPolar/pcg_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

// Including the necessary header from the project
#include "../../include/GMGPolar/gmgpolar.h"
#include "../../include/ConfigParser/test_selection.h"

template <class T>
class PCGTestCase;
Expand Down
1 change: 1 addition & 0 deletions tests/GMGPolar/solve_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <random>

// Including the necessary header from the project
#include "../../include/ConfigParser/test_selection.h"
#include "../../include/GMGPolar/gmgpolar.h"

template <class T>
Expand Down