From 8ec5842b28c69171c4e2610dbefdef8d2f23ac6b Mon Sep 17 00:00:00 2001 From: Weiqun Zhang Date: Mon, 5 Feb 2024 16:02:13 -0800 Subject: [PATCH] Implement more virtual functions in MLLinOp --- Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.H | 16 ------- Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.cpp | 42 ------------------- .../MLMG/AMReX_MLEBNodeFDLaplacian.H | 6 --- .../MLMG/AMReX_MLEBNodeFDLaplacian.cpp | 18 -------- Src/LinearSolvers/MLMG/AMReX_MLLinOp.H | 36 +++++++++++++--- 5 files changed, 30 insertions(+), 88 deletions(-) diff --git a/Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.H b/Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.H index 0e98eb9ea4d..c0e0f8c3ae5 100644 --- a/Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.H +++ b/Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.H @@ -52,14 +52,6 @@ public: void interpolation (int amrlev, int fmglev, MF& fine, const MF& crse) const override; - void interpAssign (int amrlev, int fmglev, MF& fine, MF& crse) const override; - - void interpolationAmr (int famrlev, MF& fine, const MF& crse, - IntVect const& nghost) const override; - - void averageDownSolutionRHS (int camrlev, MF& crse_sol, MF& crse_rhs, - const MF& fine_sol, const MF& fine_rhs) override; - void apply (int amrlev, int mglev, MF& out, MF& in, BCMode bc_mode, StateMode s_mode, const MLMGBndryT* bndry=nullptr) const override; @@ -73,10 +65,6 @@ public: const MF& b, BCMode bc_mode, const MF* crse_bcdata=nullptr) override; - void reflux (int crse_amrlev, - MF& res, const MF& crse_sol, const MF& crse_rhs, - MF& fine_res, MF& fine_sol, const MF& fine_rhs) const override; - void prepareForSolve () override; [[nodiscard]] bool isSingular (int /*amrlev*/) const override { return false; } @@ -88,10 +76,6 @@ public: void averageDownAndSync (Vector& sol) const override; - void avgDownResAmr (int clev, MF& cres, MF const& fres) const override; - - void avgDownResMG (int clev, MF& cres, MF const& fres) const override; - [[nodiscard]] IntVect getNGrowVectRestriction () const override { return IntVect(0); } diff --git a/Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.cpp b/Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.cpp index 1455f024415..cb814af15fc 100644 --- a/Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.cpp +++ b/Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.cpp @@ -66,27 +66,6 @@ void MLCurlCurl::interpolation (int amrlev, int fmglev, MF& fine, Gpu::streamSynchronize(); } -void -MLCurlCurl::interpAssign (int amrlev, int fmglev, MF& fine, MF& crse) const -{ - amrex::ignore_unused(amrlev, fmglev, fine, crse); - amrex::Abort("MLCurlCurl::interpAssign: TODO"); -} - -void MLCurlCurl::interpolationAmr (int famrlev, MF& fine, const MF& crse, - IntVect const& nghost) const -{ - amrex::ignore_unused(famrlev, fine, crse, nghost); - amrex::Abort("MLCurlCurl::interpolationAmr: TODO"); -} - -void MLCurlCurl::averageDownSolutionRHS (int camrlev, MF& crse_sol, MF& crse_rhs, - const MF& fine_sol, const MF& fine_rhs) -{ - amrex::ignore_unused(camrlev, crse_sol, crse_rhs, fine_sol, fine_rhs); - amrex::Abort("MLCurlCurl::averageDownSolutionRHS: TODO"); -} - void MLCurlCurl::apply (int amrlev, int mglev, MF& out, MF& in, BCMode /*bc_mode*/, StateMode /*s_mode*/, const MLMGBndryT* /*bndry*/) const @@ -311,15 +290,6 @@ void MLCurlCurl::compresid (int amrlev, int mglev, MF& resid, MF const& b) const } } -void MLCurlCurl::reflux (int crse_amrlev, - MF& res, const MF& crse_sol, const MF& crse_rhs, - MF& fine_res, MF& fine_sol, const MF& fine_rhs) const -{ - amrex::ignore_unused(crse_amrlev, res, crse_sol, crse_rhs, fine_res, - fine_sol, fine_rhs); - amrex::Abort("MLCurlCurl::reflux: TODO"); -} - void MLCurlCurl::prepareForSolve () { } @@ -356,18 +326,6 @@ void MLCurlCurl::averageDownAndSync (Vector& sol) const } } -void MLCurlCurl::avgDownResAmr (int clev, MF& cres, MF const& fres) const -{ - amrex::ignore_unused(clev, cres, fres); - amrex::Abort("MLCurlCurl::avgDownResAmr: TODO"); -} - -void MLCurlCurl::avgDownResMG (int clev, MF& cres, MF const& fres) const -{ - amrex::ignore_unused(clev, cres, fres); - amrex::Abort("MLCurlCurl::avgDownResMG: TODO"); -} - void MLCurlCurl::make (Vector >& mf, IntVect const& ng) const { MLLinOpT::make(mf, ng); diff --git a/Src/LinearSolvers/MLMG/AMReX_MLEBNodeFDLaplacian.H b/Src/LinearSolvers/MLMG/AMReX_MLEBNodeFDLaplacian.H index 05b3250caf8..d63267ea89a 100644 --- a/Src/LinearSolvers/MLMG/AMReX_MLEBNodeFDLaplacian.H +++ b/Src/LinearSolvers/MLMG/AMReX_MLEBNodeFDLaplacian.H @@ -84,12 +84,6 @@ public: void restriction (int amrlev, int cmglev, MultiFab& crse, MultiFab& fine) const final; void interpolation (int amrlev, int fmglev, MultiFab& fine, const MultiFab& crse) const final; - void averageDownSolutionRHS (int camrlev, MultiFab& crse_sol, MultiFab& crse_rhs, - const MultiFab& fine_sol, const MultiFab& fine_rhs) final; - - void reflux (int crse_amrlev, - MultiFab& res, const MultiFab& crse_sol, const MultiFab& crse_rhs, - MultiFab& fine_res, MultiFab& fine_sol, const MultiFab& fine_rhs) const final; void prepareForSolve () final; void Fapply (int amrlev, int mglev, MultiFab& out, const MultiFab& in) const final; diff --git a/Src/LinearSolvers/MLMG/AMReX_MLEBNodeFDLaplacian.cpp b/Src/LinearSolvers/MLMG/AMReX_MLEBNodeFDLaplacian.cpp index ad0fc6f1200..5559f133821 100644 --- a/Src/LinearSolvers/MLMG/AMReX_MLEBNodeFDLaplacian.cpp +++ b/Src/LinearSolvers/MLMG/AMReX_MLEBNodeFDLaplacian.cpp @@ -222,24 +222,6 @@ MLEBNodeFDLaplacian::interpolation (int amrlev, int fmglev, MultiFab& fine, } } -void -MLEBNodeFDLaplacian::averageDownSolutionRHS (int /*camrlev*/, MultiFab& /*crse_sol*/, - MultiFab& /*crse_rhs*/, - const MultiFab& /*fine_sol*/, - const MultiFab& /*fine_rhs*/) -{ - amrex::Abort("MLEBNodeFDLaplacian::averageDownSolutionRHS: todo"); -} - -void -MLEBNodeFDLaplacian::reflux (int /*crse_amrlev*/, MultiFab& /*res*/, - const MultiFab& /*crse_sol*/, const MultiFab& /*crse_rhs*/, - MultiFab& /*fine_res*/, MultiFab& /*fine_sol*/, - const MultiFab& /*fine_rhs*/) const -{ - amrex::Abort("MLEBNodeFDLaplacian::reflux: TODO"); -} - void MLEBNodeFDLaplacian::prepareForSolve () { diff --git a/Src/LinearSolvers/MLMG/AMReX_MLLinOp.H b/Src/LinearSolvers/MLMG/AMReX_MLLinOp.H index 3d552729046..66ff8b8f4fd 100644 --- a/Src/LinearSolvers/MLMG/AMReX_MLLinOp.H +++ b/Src/LinearSolvers/MLMG/AMReX_MLLinOp.H @@ -283,7 +283,11 @@ public: * \param fine fine MG level data * \param crse coarse MG level data */ - virtual void interpAssign (int amrlev, int fmglev, MF& fine, MF& crse) const = 0; + virtual void interpAssign (int amrlev, int fmglev, MF& fine, MF& crse) const + { + amrex::ignore_unused(amrlev, fmglev, fine, crse); + amrex::Abort("MLLinOpT::interpAssign: Must be implemented for FMG cycle"); + } /** * \brief Interpolation between AMR levels @@ -294,7 +298,11 @@ public: * \param nghost number of ghost cells */ virtual void interpolationAmr (int famrlev, MF& fine, const MF& crse, - IntVect const& nghost) const = 0; + IntVect const& nghost) const + { + amrex::ignore_unused(famrlev, fine, crse, nghost); + amrex::Abort("MLLinOpT::interpolationAmr: Must be implemeted for composite solves across multiple AMR levels"); + } /** * \brief Average-down data from fine AMR level to coarse AMR level. @@ -306,7 +314,11 @@ public: * \param fine_rhs RHS on fine AMR level */ virtual void averageDownSolutionRHS (int camrlev, MF& crse_sol, MF& crse_rhs, - const MF& fine_sol, const MF& fine_rhs) = 0; + const MF& fine_sol, const MF& fine_rhs) + { + amrex::ignore_unused(camrlev, crse_sol, crse_rhs, fine_sol, fine_rhs); + amrex::Abort("MLLinOpT::averageDownSolutionRHS: Must be implemeted for composite solves across multiple AMR levels"); + } /** * \brief Apply the linear operator, out = L(in) @@ -378,7 +390,12 @@ public: */ virtual void reflux (int crse_amrlev, MF& res, const MF& crse_sol, const MF& crse_rhs, - MF& fine_res, MF& fine_sol, const MF& fine_rhs) const = 0; + MF& fine_res, MF& fine_sol, const MF& fine_rhs) const + { + amrex::ignore_unused(crse_amrlev, res, crse_sol, crse_rhs, fine_res, + fine_sol, fine_rhs); + amrex::Abort("MLLinOpT::reflux: Must be implemeted for composite solves across multiple AMR levels"); + } /** * \brief Compute fluxes @@ -443,7 +460,7 @@ 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> makeNLinOp (int grid_size) const + virtual std::unique_ptr> makeNLinOp (int /*grid_size*/) const { amrex::Abort("MLLinOp::makeNLinOp: N-Solve not supported"); return nullptr; @@ -497,7 +514,13 @@ public: virtual void averageDownAndSync (Vector& sol) const = 0; - virtual void avgDownResAmr (int clev, MF& cres, MF const& fres) const = 0; + virtual void avgDownResAmr (int clev, MF& cres, MF const& fres) const + { + amrex::ignore_unused(clev, cres, fres); + amrex::Abort("MLLinOpT::avgDownResAmr: Must be implemeted for composite solves across multiple AMR levels"); + } + + // This function is needed for FMG cycle, but not V-cycle. virtual void avgDownResMG (int clev, MF& cres, MF const& fres) const; [[nodiscard]] bool isMFIterSafe (int amrlev, int mglev1, int mglev2) const; @@ -1487,6 +1510,7 @@ template void MLLinOpT::avgDownResMG (int clev, MF& cres, MF const& fres) const { + amrex::ignore_unused(clev, cres, fres); if constexpr (amrex::IsFabArray::value) { const int ncomp = this->getNComp(); #ifdef AMREX_USE_EB