Skip to content

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