Skip to content

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