/* *********************************************************************** // // Copyright (C) 2025 -- The 4D-STAR Collaboration // File Author: Emily Boudreaux // Last Modified: April 21, 2025 // // 4DSSE is free software; you can use it and/or modify // it under the terms and restrictions the GNU General Library Public // License version 3 (GPLv3) as published by the Free Software Foundation. // // 4DSSE is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU Library General Public License for more details. // // You should have received a copy of the GNU Library General Public License // along with this software; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // // *********************************************************************** */ #pragma once #include "mfem.hpp" #include #include #include "integrators.h" #include "4DSTARTypes.h" #include "operator.h" #include "config.h" #include "probe.h" #include "quill/Logger.h" namespace laneEmden { double a (int k, double n); double c(int m, double n); double thetaSeriesExpansion(double xi, double n, int order); } // Struct to persist lifetime of the linear and nonlinear solvers struct solverBundle { mfem::GMRESSolver solver; // Must be first so it lives longer than the newton solver mfem::NewtonSolver newton; // Must be second so that when it is destroyed the solver is still alive preventing a double delete }; class PolySolver { public: // Public methods PolySolver(double n, double order); ~PolySolver(); void solve() const; double getN() const { return m_polytropicIndex; } double getOrder() const { return m_feOrder; } mfem::Mesh* getMesh() const { return m_mesh.get(); } mfem::GridFunction& getSolution() const { return *m_theta; } private: // Private Attributes Config& m_config = Config::getInstance(); Probe::LogManager& m_logManager = Probe::LogManager::getInstance(); quill::Logger* m_logger = m_logManager.getLogger("log"); double m_polytropicIndex, m_feOrder; std::unique_ptr m_mesh; std::unique_ptr m_fecH1; std::unique_ptr m_fecRT; std::unique_ptr m_feTheta; std::unique_ptr m_fePhi; std::unique_ptr m_theta; std::unique_ptr m_phi; std::unique_ptr m_polytropOperator; std::unique_ptr m_prec; private: // Private methods void assembleBlockSystem(); SSE::MFEMArrayPairSet getEssentialTrueDof() const; std::pair, mfem::Array> findCenterElement() const; void setInitialGuess() const; void saveAndViewSolution(const mfem::BlockVector& state_vector) const; solverBundle setupNewtonSolver() const; void setupOperator() const; void LoadSolverUserParams(double &newtonRelTol, double &newtonAbsTol, int &newtonMaxIter, int &newtonPrintLevel, double &gmresRelTol, double &gmresAbsTol, int &gmresMaxIter, int &gmresPrintLevel) const; };