Skip to content
Open
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
38 changes: 23 additions & 15 deletions include/GMGPolar/gmgpolar.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ class GMGPolar : public IGMGPolar

/* ------------------------------------------------------------------------- */
/* Chooses if full grid smoothing is active on level 0 for extrapolation > 0 */
bool full_grid_smoothing_ = false;
Comment thread
julianlitz marked this conversation as resolved.
bool full_grid_smoothing_;

/* -------------------------------------------------- */
/* Vectors for PCG (Preconditioned Conjugate Gradient)
Expand All @@ -121,41 +121,51 @@ class GMGPolar : public IGMGPolar
HostAllocatableVector<double> pcg_solution_; // x (solution)
HostAllocatableVector<double> pcg_search_direction_; // p (search direction)

/* ---------------------------------------------------------------------------------------------- */
/* Store analytical solution values on host to avoid repeated computation during error evaluation */
HostAllocatableVector<double> analytical_solution_host_;
Comment thread
julianlitz marked this conversation as resolved.
std::vector<std::pair<double, double>> exact_errors_;

/* -------------------- */
/* Convergence criteria */
int number_of_iterations_;
std::vector<double> residual_norms_;
double mean_residual_reduction_factor_;
bool converged(double current_residual_norm, double first_residual_norm);

public: // Public due to cuda restrictions
/* ---------------------------------------------------- */
/* Compute exact error if an exact solution is provided */
// The results are stored as a pair: (weighted L2 error, infinity error).
std::vector<std::pair<double, double>> exact_errors_;
std::pair<double, double> computeExactError(Level<DomainGeometry, DensityProfileCoefficients>& level,
HostConstVector<double> solution, HostVector<double> error,
HostConstVector<double> exact_solution);
std::pair<double, double> evaluateExactError(const PolarGrid& grid, HostConstVector<double> discrete_solution,
HostConstVector<double> analytical_solution_host,
HostVector<double> error);
void computeAnalyticalSolutionOnHost(const PolarGrid& grid, HostVector<double> analytical_solution_host,
const ExactSolution& exact_solution);

/* --------------- */
/* Setup Functions */
int chooseNumberOfLevels(const PolarGrid& finest_grid);
// Public due to cuda restrictions
public:
template <concepts::BoundaryConditions BoundaryConditions, concepts::SourceTerm SourceTerm>
void build_rhs_f(const Level<DomainGeometry, DensityProfileCoefficients>& level, HostVector<double> rhs_f,
const BoundaryConditions& boundary_conditions, const SourceTerm& source_term);
void discretize_rhs_f(const Level<DomainGeometry, DensityProfileCoefficients>& level, HostVector<double> rhs_f);

/* --------------- */
/* Solve Functions */
void applyExtrapolation(int current_level, HostVector<double> fine_values, HostConstVector<double> coarse_values);

private:
/* --------------- */
/* Setup Functions */
int chooseNumberOfLevels(const PolarGrid& finest_grid);
bool checkUniformRefinement(const PolarGrid& grid, double tolerance) const;

/* --------------- */
/* Solve Functions */
void fullMultigridApproximation(MultigridCycleType FMG_cycle, int FMG_iterations);
void solveMultigrid(double& initial_residual_norm, double& current_residual_norm,
double& current_relative_residual_norm, HostConstVector<double> exact_solution);
void solvePCG(double& initial_residual_norm, double& current_residual_norm, double& current_relative_residual_norm,
HostConstVector<double> exact_solution);
double& current_relative_residual_norm);
void solvePCG(double& initial_residual_norm, double& current_residual_norm, double& current_relative_residual_norm);
double residualNorm(const ResidualNormType& norm_type,
const Level<DomainGeometry, DensityProfileCoefficients>& level,
HostConstVector<double> residual) const;
Expand All @@ -169,15 +179,13 @@ class GMGPolar : public IGMGPolar
int iterations);
void applyExtrapolatedMultigridIterations(Level<DomainGeometry, DensityProfileCoefficients>& level,
MultigridCycleType cycle, int iterations);
// Compute the extrapolated values: u_ex = 4/3 u_fine - 1/3 u_coarse
void applyExtrapolation(int current_level, HostVector<double> fine_values, HostConstVector<double> coarse_values);

/* ----------------- */
/* Print information */
void printSettings(const PolarGrid& finest_grid, const PolarGrid& coarsest_grid) const;
void printIterationHeader(const ExactSolution* exact_solution);
void printIterationHeader(bool is_exact_solution_provided);
void printIterationInfo(int iteration, double current_residual_norm, double current_relative_residual_norm,
const ExactSolution* exact_solution);
bool is_exact_solution_provided);

/* ------------------- */
/* Multigrid Functions */
Expand Down
Loading
Loading