File stack.hpp
File List > include > multigrid > stack.hpp
Go to the documentation of this file
#pragma once
#include <vector>
#include "multigrid/boundary_conditions.hpp"
#include "multigrid/exceptions.hpp"
#include "multigrid/fdarray.hpp"
#include "multigrid/settings.hpp"
#include "multigrid/types.hpp"
namespace mgrid {
void restriction_operator(FDArray &coarse, const FDArray &fine);
void interpolation_operator(const FDArray &coarse, FDArray &fine);
void injection_operator(FDArray &coarse, const FDArray &fine);
class Stack {
public:
explicit Stack(const Settings &s);
[[nodiscard]] FDArray &operator[](Level l) { return levels_[l]; }
[[nodiscard]] const FDArray &operator[](Level l) const { return levels_[l]; }
[[nodiscard]] Level size() const { return static_cast<Level>(levels_.size()); }
[[nodiscard]] const Axis &axis(int d) const {
return d == 0 ? levels_.front().x_axis() : levels_.front().z_axis();
}
const Level finestLevel;
static constexpr Level coarsestLevel = 0;
BoundaryConditions boundaryConditions;
[[nodiscard]] std::vector<FDArray>::iterator begin() { return levels_.begin(); }
[[nodiscard]] std::vector<FDArray>::iterator end() { return levels_.end(); }
[[nodiscard]] std::vector<FDArray>::const_iterator begin() const { return levels_.begin(); }
[[nodiscard]] std::vector<FDArray>::const_iterator end() const { return levels_.end(); }
void coarsen(Level level);
void coarsen(Level level, FDArray &result);
void inject(Level level);
void inject(Level level, FDArray &result);
void refine(Level level);
void refine(Level level, FDArray &result);
void propagate_boundary_conditions();
private:
std::vector<FDArray> levels_;
};
} // namespace mgrid