Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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: 66 additions & 59 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,77 +5,84 @@

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