refactor(poly): updated header guards to pragma once
This commit is contained in:
@@ -19,9 +19,7 @@
|
||||
//
|
||||
// *********************************************************************** */
|
||||
|
||||
#ifndef POLYCOEFF_H
|
||||
#define POLYCOEFF_H
|
||||
|
||||
#pragma once
|
||||
#include "mfem.hpp"
|
||||
#include <cmath>
|
||||
|
||||
@@ -55,6 +53,4 @@ namespace polycoeff
|
||||
constexpr static int power[51] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50};
|
||||
constexpr static double coeff[51] = {2.449260049071003e+00, 4.340987403815444e-01, 2.592462347475860e+00, -2.283794512491552e+01, 1.135535208066129e+02, -3.460093673587010e+02, 6.948139716983651e+02, -9.564368645158952e+02, 9.184546798891624e+02, -6.130308987803503e+02, 2.747228735318193e+02, -7.416795903196430e+01, 7.318638538580859e+00, 1.749441306797260e+00, -4.240148582456829e-01, -5.818809544982156e-02, 1.514877217199105e-02, 3.228634707578998e-03, -2.862524323980516e-04, -1.622486968261819e-04, -1.253644717104076e-05, 4.334945141292894e-06, 1.296452565229763e-06, 8.634802209209870e-08, -3.337511676486084e-08, -1.094796628367775e-08, -1.228178760540410e-09, 1.416744125622751e-10, 8.513777351265677e-11, 1.624582561364811e-11, 8.377207519041114e-13, -4.363812865112836e-13, -1.535862757816461e-13, -2.485085045037669e-14, -6.566281276491033e-16, 8.405047965853478e-16, 2.673804441025638e-16, 4.176337890285142e-17, 8.150073570140493e-19, -1.531673805257016e-18, -4.746996933716653e-19, -6.976825828390195e-20, 8.807513368604331e-22, 3.307739310180278e-21, 8.593260940093030e-22, 7.385969061093440e-23, -2.211130577977291e-23, -8.557291048388455e-24, -4.169359901215994e-25, 4.609379358875657e-25, -3.590870335035984e-26};
|
||||
};
|
||||
} // namespace polyCoeff
|
||||
|
||||
#endif // POLYCOEFF_H
|
||||
} // namespace polyCoeff
|
||||
@@ -18,23 +18,24 @@
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
// *********************************************************************** */
|
||||
#include "mfem.hpp"
|
||||
#include "polySolver.h"
|
||||
|
||||
#include <memory>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include "polySolver.h"
|
||||
#include "mfem.hpp"
|
||||
|
||||
#include "4DSTARTypes.h"
|
||||
#include "config.h"
|
||||
#include "integrators.h"
|
||||
#include "mfem.hpp"
|
||||
#include "operator.h"
|
||||
#include "polyCoeff.h"
|
||||
#include "probe.h"
|
||||
#include "resourceManager.h"
|
||||
#include "resourceManagerTypes.h"
|
||||
|
||||
#include "quill/LogMacros.h"
|
||||
|
||||
|
||||
@@ -159,8 +160,7 @@ void PolySolver::assembleBlockSystem() {
|
||||
|
||||
// --- Assemble the NonlinearForm (f) ---
|
||||
auto fform = std::make_unique<mfem::NonlinearForm>(m_feTheta.get());
|
||||
mfem::ConstantCoefficient oneCoeff(1.0);
|
||||
fform->AddDomainIntegrator(new polyMFEMUtils::NonlinearPowerIntegrator(oneCoeff, m_polytropicIndex));
|
||||
fform->AddDomainIntegrator(new polyMFEMUtils::NonlinearPowerIntegrator(m_polytropicIndex));
|
||||
// TODO: Add essential boundary conditions to the nonlinear form
|
||||
|
||||
// -- Build the BlockOperator --
|
||||
@@ -183,8 +183,8 @@ void PolySolver::solve() const {
|
||||
// It's safer to get the offsets directly from the operator after finalization
|
||||
const mfem::Array<int>& block_offsets = m_polytropOperator->GetBlockOffsets(); // Assuming a getter exists or accessing member if public/friend
|
||||
mfem::BlockVector state_vector(block_offsets);
|
||||
state_vector.GetBlock(0) = *m_theta;
|
||||
state_vector.GetBlock(1) = *m_phi;
|
||||
state_vector.GetBlock(0) = static_cast<mfem::Vector>(*m_theta);
|
||||
state_vector.GetBlock(1) = static_cast<mfem::Vector>(*m_phi);
|
||||
|
||||
mfem::Vector zero_rhs(block_offsets.Last());
|
||||
zero_rhs = 0.0;
|
||||
@@ -289,7 +289,7 @@ void PolySolver::saveAndViewSolution(const mfem::BlockVector& state_vector) cons
|
||||
}
|
||||
|
||||
// --- Extract the Solution ---
|
||||
if (bool write11DSolution = m_config.get<bool>("Poly:Output:1D:Save", true)) {
|
||||
if (m_config.get<bool>("Poly:Output:1D:Save", true)) {
|
||||
auto solutionPath = m_config.get<std::string>("Poly:Output:1D:Path", "polytropeSolution_1D.csv");
|
||||
auto derivSolPath = "d" + solutionPath;
|
||||
|
||||
@@ -340,7 +340,7 @@ solverBundle PolySolver::setupNewtonSolver() const {
|
||||
LoadSolverUserParams(newtonRelTol, newtonAbsTol, newtonMaxIter, newtonPrintLevel, gmresRelTol, gmresAbsTol,
|
||||
gmresMaxIter, gmresPrintLevel);
|
||||
|
||||
solverBundle solver;
|
||||
solverBundle solver; // Use this solver bundle to ensure lifetime safety
|
||||
solver.solver.SetRelTol(gmresRelTol);
|
||||
solver.solver.SetAbsTol(gmresAbsTol);
|
||||
solver.solver.SetMaxIter(gmresMaxIter);
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#ifndef POLYSOLVER_H
|
||||
#define POLYSOLVER_H
|
||||
#pragma once
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <memory>
|
||||
@@ -21,8 +20,8 @@ namespace laneEmden {
|
||||
|
||||
// Struct to persist lifetime of the linear and nonlinear solvers
|
||||
struct solverBundle {
|
||||
mfem::GMRESSolver solver;
|
||||
mfem::NewtonSolver newton;
|
||||
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 {
|
||||
@@ -32,10 +31,10 @@ public: // Public methods
|
||||
|
||||
void solve() const;
|
||||
|
||||
double getN() { return m_polytropicIndex; }
|
||||
double getOrder() { return m_feOrder; }
|
||||
mfem::Mesh* getMesh() { return m_mesh.get(); }
|
||||
mfem::GridFunction& getSolution() { return *m_theta; }
|
||||
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();
|
||||
@@ -70,6 +69,4 @@ private: // Private methods
|
||||
void LoadSolverUserParams(double &newtonRelTol, double &newtonAbsTol, int &newtonMaxIter, int &newtonPrintLevel,
|
||||
double &gmresRelTol, double &gmresAbsTol, int &gmresMaxIter, int &gmresPrintLevel) const;
|
||||
|
||||
};
|
||||
|
||||
#endif // POLYSOLVER_H
|
||||
};
|
||||
@@ -22,15 +22,10 @@
|
||||
#include <cmath>
|
||||
|
||||
#include "integrators.h"
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
namespace polyMFEMUtils {
|
||||
NonlinearPowerIntegrator::NonlinearPowerIntegrator(
|
||||
mfem::Coefficient &coeff,
|
||||
double n) :
|
||||
|
||||
m_coeff(coeff),
|
||||
NonlinearPowerIntegrator::NonlinearPowerIntegrator(const double n) :
|
||||
m_polytropicIndex(n) {}
|
||||
|
||||
void NonlinearPowerIntegrator::AssembleElementVector(
|
||||
@@ -60,9 +55,7 @@ namespace polyMFEMUtils {
|
||||
double u_safe = std::max(u_val, 0.0);
|
||||
double u_nl = std::pow(u_safe, m_polytropicIndex);
|
||||
|
||||
// double coeff_val = m_coeff.Eval(Trans, ip);
|
||||
double coeff_val = 1.0;
|
||||
double x2_u_nl = coeff_val * u_nl;
|
||||
double x2_u_nl = u_nl;
|
||||
|
||||
for (int i = 0; i < dof; i++){
|
||||
elvect(i) += shape(i) * x2_u_nl * weight;
|
||||
@@ -95,13 +88,10 @@ namespace polyMFEMUtils {
|
||||
for (int j = 0; j < dof; j++) {
|
||||
u_val += elfun(j) * shape(j);
|
||||
}
|
||||
// double coeff_val = m_coeff.Eval(Trans, ip);
|
||||
double coeff_val = 1.0;
|
||||
|
||||
|
||||
|
||||
// Calculate the Jacobian
|
||||
double u_safe = std::max(u_val, 0.0);
|
||||
double d_u_nl = coeff_val * m_polytropicIndex * std::pow(u_safe, m_polytropicIndex - 1);
|
||||
double d_u_nl = m_polytropicIndex * std::pow(u_safe, m_polytropicIndex - 1);
|
||||
double x2_d_u_nl = d_u_nl;
|
||||
|
||||
for (int i = 0; i < dof; i++) {
|
||||
|
||||
@@ -18,8 +18,7 @@
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
// *********************************************************************** */
|
||||
#ifndef POLYMFEMUTILS_H
|
||||
#define POLYMFEMUTILS_H
|
||||
#pragma once
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include <string>
|
||||
@@ -28,7 +27,7 @@
|
||||
|
||||
|
||||
/**
|
||||
* @file polyMFEMUtils.h
|
||||
* @file integrators.h
|
||||
* @brief A collection of utilities for working with MFEM and solving the lane-emden equation.
|
||||
*/
|
||||
|
||||
@@ -42,24 +41,18 @@ namespace polyMFEMUtils {
|
||||
* @brief A class for nonlinear power integrator.
|
||||
*/
|
||||
class NonlinearPowerIntegrator: public mfem::NonlinearFormIntegrator {
|
||||
private:
|
||||
Config& m_config = Config::getInstance();
|
||||
Probe::LogManager& m_logManager = Probe::LogManager::getInstance();
|
||||
quill::Logger* m_logger = m_logManager.getLogger("log");
|
||||
mfem::Coefficient &m_coeff;
|
||||
double m_polytropicIndex;
|
||||
public:
|
||||
/**
|
||||
* @brief Constructor for NonlinearPowerIntegrator.
|
||||
*
|
||||
*
|
||||
* @param coeff The function coefficient.
|
||||
* @param n The polytropic index.
|
||||
*/
|
||||
NonlinearPowerIntegrator(mfem::Coefficient &coeff, double n);
|
||||
NonlinearPowerIntegrator(double n);
|
||||
|
||||
/**
|
||||
* @brief Assembles the element vector.
|
||||
*
|
||||
*
|
||||
* @param el The finite element.
|
||||
* @param Trans The element transformation.
|
||||
* @param elfun The element function.
|
||||
@@ -68,14 +61,17 @@ namespace polyMFEMUtils {
|
||||
virtual void AssembleElementVector(const mfem::FiniteElement &el, mfem::ElementTransformation &Trans, const mfem::Vector &elfun, mfem::Vector &elvect) override;
|
||||
/**
|
||||
* @brief Assembles the element gradient.
|
||||
*
|
||||
*
|
||||
* @param el The finite element.
|
||||
* @param Trans The element transformation.
|
||||
* @param elfun The element function.
|
||||
* @param elmat The element matrix to be assembled.
|
||||
*/
|
||||
virtual void AssembleElementGrad (const mfem::FiniteElement &el, mfem::ElementTransformation &Trans, const mfem::Vector &elfun, mfem::DenseMatrix &elmat) override;
|
||||
private:
|
||||
Config& m_config = Config::getInstance();
|
||||
Probe::LogManager& m_logManager = Probe::LogManager::getInstance();
|
||||
quill::Logger* m_logger = m_logManager.getLogger("log");
|
||||
double m_polytropicIndex;
|
||||
};
|
||||
} // namespace polyMFEMUtils
|
||||
|
||||
#endif // POLYMFEMUTILS_H
|
||||
} // namespace polyMFEMUtils
|
||||
@@ -1,5 +1,4 @@
|
||||
#ifndef POLY_UTILS_OPERATOR_H
|
||||
#define POLY_UTILS_OPERATOR_H
|
||||
#pragma once
|
||||
|
||||
#include "mfem.hpp"
|
||||
#include "4DSTARTypes.h"
|
||||
@@ -81,6 +80,3 @@ private:
|
||||
void updateInverseNonlinearJacobian(const mfem::Operator &grad) const;
|
||||
void updateInverseSchurCompliment() const;
|
||||
};
|
||||
|
||||
|
||||
#endif // POLY_UTILS_OPERATOR_H
|
||||
Reference in New Issue
Block a user