Skip to content

Commit

Permalink
Implement some virtual functions in MLLinOp so that the derived class…
Browse files Browse the repository at this point in the history
…es don't need to
  • Loading branch information
WeiqunZhang committed Feb 5, 2024
1 parent 8f77828 commit 7fad95f
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 52 deletions.
12 changes: 0 additions & 12 deletions Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.H
Original file line number Diff line number Diff line change
Expand Up @@ -77,25 +77,13 @@ public:
MF& res, const MF& crse_sol, const MF& crse_rhs,
MF& fine_res, MF& fine_sol, const MF& fine_rhs) const override;

void compFlux (int amrlev, const Array<MF*,AMREX_SPACEDIM>& fluxes,
MF& sol, Location loc) const override;

void compGrad (int amrlev, const Array<MF*,AMREX_SPACEDIM>& grad,
MF& sol, Location loc) const override;

void applyMetricTerm (int /*amrlev*/, int /*mglev*/, MF& /*rhs*/) const override {}

void unapplyMetricTerm (int /*amrlev*/, int /*mglev*/, MF& /*rhs*/) const override {}

void prepareForSolve () override;

[[nodiscard]] bool isSingular (int /*amrlev*/) const override { return false; }
[[nodiscard]] bool isBottomSingular () const override { return false; }

RT xdoty (int amrlev, int mglev, const MF& x, const MF& y, bool local) const override;

std::unique_ptr<MLLinOpT<MF>> makeNLinOp (int /*grid_size*/) const override { return nullptr; }

[[nodiscard]] RT normInf (int amrlev, MF const& mf, bool local) const override;

void averageDownAndSync (Vector<MF>& sol) const override;
Expand Down
15 changes: 0 additions & 15 deletions Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -320,23 +320,8 @@ void MLCurlCurl::reflux (int crse_amrlev,
amrex::Abort("MLCurlCurl::reflux: TODO");
}

void MLCurlCurl::compFlux (int amrlev, const Array<MF*,AMREX_SPACEDIM>& fluxes,
MF& sol, Location loc) const
{
amrex::ignore_unused(amrlev, fluxes, sol, loc);
amrex::Abort("MLCurlCurl::compFlux: TODO");
}

void MLCurlCurl::compGrad (int amrlev, const Array<MF*,AMREX_SPACEDIM>& grad,
MF& sol, Location loc) const
{
amrex::ignore_unused(amrlev, grad, sol, loc);
amrex::Abort("MLCurlCurl::compGrad: TODO");
}

void MLCurlCurl::prepareForSolve ()
{
// xxxxx TODO MLCurlCurl::prepareForSolve
}

Real MLCurlCurl::xdoty (int amrlev, int mglev, const MF& x, const MF& y,
Expand Down
24 changes: 17 additions & 7 deletions Src/LinearSolvers/MLMG/AMReX_MLLinOp.H
Original file line number Diff line number Diff line change
Expand Up @@ -388,8 +388,11 @@ public:
* \param sol solution
* \param loc location of the fluxes
*/
virtual void compFlux (int amrlev, const Array<MF*,AMREX_SPACEDIM>& fluxes,
MF& sol, Location loc) const = 0;
virtual void compFlux (int /*amrlev*/, const Array<MF*,AMREX_SPACEDIM>& /*fluxes*/,
MF& /*sol*/, Location /*loc*/) const
{
amrex::Abort("AMReX_MLLinOp::compFlux::How did we get here?");
}

/**
* \brief Compute gradients of the solution
Expand All @@ -399,13 +402,16 @@ public:
* \param sol solution
* \param loc location of the gradients
*/
virtual void compGrad (int amrlev, const Array<MF*,AMREX_SPACEDIM>& grad,
MF& sol, Location loc) const = 0;
virtual void compGrad (int /*amrlev*/, const Array<MF*,AMREX_SPACEDIM>& /*grad*/,
MF& /*sol*/, Location /*loc*/) const
{
amrex::Abort("AMReX_MLLinOp::compGrad::How did we get here?");
}

//! apply metric terms if there are any
virtual void applyMetricTerm (int amrlev, int mglev, MF& rhs) const = 0;
virtual void applyMetricTerm (int /*amrlev*/, int /*mglev*/, MF& /*rhs*/) const {}
//! unapply metric terms if there are any
virtual void unapplyMetricTerm (int amrlev, int mglev, MF& rhs) const = 0;
virtual void unapplyMetricTerm (int /*amrlev*/, int /*mglev*/, MF& /*rhs*/) const {}

//! This is needed for our nodal projection solver
virtual void unimposeNeumannBC (int /*amrlev*/, MF& /*rhs*/) const {}
Expand Down Expand Up @@ -437,7 +443,11 @@ public:
//! x dot y, used by the bottom solver
virtual RT xdoty (int amrlev, int mglev, const MF& x, const MF& y, bool local) const = 0;

virtual std::unique_ptr<MLLinOpT<MF>> makeNLinOp (int grid_size) const = 0;
virtual std::unique_ptr<MLLinOpT<MF>> makeNLinOp (int grid_size) const
{
amrex::Abort("MLLinOp::makeNLinOp: N-Solve not supported");
return nullptr;
}

virtual void getFluxes (const Vector<Array<MF*,AMREX_SPACEDIM> >& /*a_flux*/,
const Vector<MF*>& /*a_sol*/,
Expand Down
20 changes: 2 additions & 18 deletions Src/LinearSolvers/MLMG/AMReX_MLNodeLinOp.H
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ public:
}

void setLevelBC (int /*amrlev*/, const MultiFab* /*levelbcdata*/,
const MultiFab* = nullptr, const MultiFab* = nullptr,
const MultiFab* = nullptr) final {}
const MultiFab* = nullptr, const MultiFab* = nullptr,
const MultiFab* = nullptr) final {}

void apply (int amrlev, int mglev, MultiFab& out, MultiFab& in, BCMode bc_mode,
StateMode s_mode, const MLMGBndry* bndry=nullptr) const final;
Expand All @@ -51,17 +51,6 @@ public:
const MultiFab* crse_bcdata=nullptr) override;
void correctionResidual (int amrlev, int mglev, MultiFab& resid, MultiFab& x, const MultiFab& b,
BCMode bc_mode, const MultiFab* crse_bcdata=nullptr) override;
void compFlux (int /*amrlev*/, const Array<MultiFab*,AMREX_SPACEDIM>& /*fluxes*/,
MultiFab& /*sol*/, Location /*loc*/) const final {
amrex::Abort("AMReX_MLNodeLinOp::compFlux::How did we get here?");
}
void compGrad (int /*amrlev*/, const Array<MultiFab*,AMREX_SPACEDIM>& /*grad*/,
MultiFab& /*sol*/, Location /*loc*/) const override {
amrex::Abort("AMReX_MLNodeLinOp::compGrad::How did we get here?");
}

void applyMetricTerm (int /*amrlev*/, int /*mglev*/, MultiFab& /*rhs*/) const final {}
void unapplyMetricTerm (int /*amrlev*/, int /*mglev*/, MultiFab& /*rhs*/) const final {}

Vector<Real> getSolvabilityOffset (int amrlev, int mglev,
MultiFab const& rhs) const override;
Expand All @@ -84,11 +73,6 @@ public:

void nodalSync (int amrlev, int mglev, MultiFab& mf) const;

std::unique_ptr<MLLinOp> makeNLinOp (int /*grid_size*/) const final {
amrex::Abort("MLNodeLinOp::makeNLinOp: N-Solve not supported");
return std::unique_ptr<MLLinOp>{};
}

static std::unique_ptr<iMultiFab> makeOwnerMask (const BoxArray& ba,
const DistributionMapping& dm,
const Geometry& geom);
Expand Down

0 comments on commit 7fad95f

Please sign in to comment.