File multigrid_base.hpp
File List > include > multigrid > multigrid_base.hpp
Go to the documentation of this file
#pragma once
#include <cmath>
#include <string>
#include "multigrid/fdarray.hpp"
#include "multigrid/field.hpp"
#include "multigrid/settings.hpp"
#include "multigrid/stack.hpp"
#include "multigrid/types.hpp"
namespace mgrid {
class MultigridBase {
public:
explicit MultigridBase(const Settings &settings);
virtual ~MultigridBase() = default;
int finestLevel;
int coarsestLevel;
[[nodiscard]] FDArray &get_result() { return solution[finestLevel]; }
template <class T> void initial_guess(T arg) {
solution[finestLevel] = arg;
initialIsSet = true;
}
[[nodiscard]] FDArray &source_term() { return source[finestLevel]; }
template <class T> void source_term(T arg) {
source[finestLevel] = arg;
sourceIsSet = true;
}
[[nodiscard]] bool fully_periodic() const;
void evaluate_operator(Level level, FDArray &result);
void evaluate_residual(Level level, FDArray &result);
void relax(Level level, unsigned long n);
void relax(Level level, double tolerance);
virtual void multigrid() {}
virtual void solve() { multigrid(); }
virtual double differential_operator(Level level, int i, int j) = 0;
virtual void relaxation_updater(Level level, int i, int j) = 0;
virtual std::string filename(std::string root = "") = 0;
virtual void write(int numOfVariables, std::string root = "");
protected:
void mark_source_set() { sourceIsSet = true; }
virtual void on_cycle_end([[maybe_unused]] double residual_norm) {}
Stack solution, source, temp;
const int cycleType;
const unsigned long preRelax;
const unsigned long postRelax;
const double residualTolerance;
const unsigned long maxIterations;
const double aspect;
int nxfine{0}, nzfine{0};
bool sourceIsSet{false};
bool initialIsSet{false};
};
} // namespace mgrid