refactor(poly): improved const corectness
This commit is contained in:
@@ -70,7 +70,7 @@ namespace laneEmden {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PolySolver::PolySolver(double n, double order) {
|
PolySolver::PolySolver(const double n, const double order) {
|
||||||
|
|
||||||
// --- Check the polytropic index ---
|
// --- Check the polytropic index ---
|
||||||
if (n > 4.99 || n < 0.0) {
|
if (n > 4.99 || n < 0.0) {
|
||||||
@@ -81,14 +81,15 @@ PolySolver::PolySolver(double n, double order) {
|
|||||||
m_polytropicIndex = n;
|
m_polytropicIndex = n;
|
||||||
m_feOrder = order;
|
m_feOrder = order;
|
||||||
|
|
||||||
ResourceManager& rm = ResourceManager::getInstance();
|
// Load and rescale the mesh
|
||||||
const Resource& resource = rm.getResource("mesh:polySphere");
|
const ResourceManager& rm = ResourceManager::getInstance();
|
||||||
const auto &meshIO = std::get<std::unique_ptr<MeshIO>>(resource);
|
const Resource& genericResource = rm.getResource("mesh:polySphere");
|
||||||
|
const auto &meshIO = std::get<std::unique_ptr<MeshIO>>(genericResource);
|
||||||
meshIO->LinearRescale(polycoeff::x1(m_polytropicIndex));
|
meshIO->LinearRescale(polycoeff::x1(m_polytropicIndex));
|
||||||
m_mesh = std::make_unique<mfem::Mesh>(meshIO->GetMesh());
|
m_mesh = std::make_unique<mfem::Mesh>(meshIO->GetMesh());
|
||||||
|
|
||||||
// Use feOrder - 1 for the RT space to satisfy Brezzi-Babuska condition
|
// Use feOrder - 1 for the RT space to satisfy Brezzi-Babuska condition
|
||||||
// for the H1 and RT spaces
|
// for the H1 and RT [H(div)] spaces
|
||||||
m_fecH1 = std::make_unique<mfem::H1_FECollection>(m_feOrder, m_mesh->SpaceDimension());
|
m_fecH1 = std::make_unique<mfem::H1_FECollection>(m_feOrder, m_mesh->SpaceDimension());
|
||||||
m_fecRT = std::make_unique<mfem::RT_FECollection>(m_feOrder - 1, m_mesh->SpaceDimension());
|
m_fecRT = std::make_unique<mfem::RT_FECollection>(m_feOrder - 1, m_mesh->SpaceDimension());
|
||||||
|
|
||||||
@@ -120,7 +121,7 @@ void PolySolver::assembleBlockSystem() {
|
|||||||
blockOffsets[0] = 0;
|
blockOffsets[0] = 0;
|
||||||
blockOffsets[1] = feSpaces[0]->GetVSize();
|
blockOffsets[1] = feSpaces[0]->GetVSize();
|
||||||
blockOffsets[2] = feSpaces[1]->GetVSize();
|
blockOffsets[2] = feSpaces[1]->GetVSize();
|
||||||
blockOffsets.PartialSum();
|
blockOffsets.PartialSum(); // Cumulative sum to get the offsets
|
||||||
|
|
||||||
// Add integrators to block form one by one
|
// Add integrators to block form one by one
|
||||||
// We add integrators corresponding to each term in the weak form
|
// We add integrators corresponding to each term in the weak form
|
||||||
@@ -159,9 +160,10 @@ void PolySolver::assembleBlockSystem() {
|
|||||||
Dform->Finalize();
|
Dform->Finalize();
|
||||||
|
|
||||||
// --- Assemble the NonlinearForm (f) ---
|
// --- Assemble the NonlinearForm (f) ---
|
||||||
|
// Note that the nonlinear form is built here but its essential true dofs (boundary conditions) are
|
||||||
|
// not set until later (when solve is called). They are applied through the operator rather than directly.
|
||||||
auto fform = std::make_unique<mfem::NonlinearForm>(m_feTheta.get());
|
auto fform = std::make_unique<mfem::NonlinearForm>(m_feTheta.get());
|
||||||
fform->AddDomainIntegrator(new polyMFEMUtils::NonlinearPowerIntegrator(m_polytropicIndex));
|
fform->AddDomainIntegrator(new polyMFEMUtils::NonlinearPowerIntegrator(m_polytropicIndex));
|
||||||
// TODO: Add essential boundary conditions to the nonlinear form
|
|
||||||
|
|
||||||
// -- Build the BlockOperator --
|
// -- Build the BlockOperator --
|
||||||
m_polytropOperator = std::make_unique<PolytropeOperator>(
|
m_polytropOperator = std::make_unique<PolytropeOperator>(
|
||||||
@@ -189,7 +191,7 @@ void PolySolver::solve() const {
|
|||||||
mfem::Vector zero_rhs(block_offsets.Last());
|
mfem::Vector zero_rhs(block_offsets.Last());
|
||||||
zero_rhs = 0.0;
|
zero_rhs = 0.0;
|
||||||
|
|
||||||
solverBundle sb = setupNewtonSolver();
|
const solverBundle sb = setupNewtonSolver();
|
||||||
|
|
||||||
// EMB 2025: Calling Mult gets the gradient of the operator for the NewtonSolver
|
// EMB 2025: Calling Mult gets the gradient of the operator for the NewtonSolver
|
||||||
// This then is set as the operator for the solver for NewtonSolver
|
// This then is set as the operator for the solver for NewtonSolver
|
||||||
@@ -261,11 +263,11 @@ void PolySolver::setInitialGuess() const {
|
|||||||
// --- Set the initial guess for the solution ---
|
// --- Set the initial guess for the solution ---
|
||||||
mfem::FunctionCoefficient thetaInitGuess (
|
mfem::FunctionCoefficient thetaInitGuess (
|
||||||
[this](const mfem::Vector &x) {
|
[this](const mfem::Vector &x) {
|
||||||
double r = x.Norml2();
|
const double r = x.Norml2();
|
||||||
double radius = Probe::getMeshRadius(*m_mesh);
|
const double radius = Probe::getMeshRadius(*m_mesh);
|
||||||
double u = 1/radius;
|
const double u = 1/radius;
|
||||||
|
|
||||||
return -std::pow((u*r), 2)+1.0;
|
return -std::pow((u*r), 2)+1.0; // The series expansion is a better guess; however, this is cheaper and ensures that the value at the surface is very close to zero in a way that the series expansion does not
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
m_theta->ProjectCoefficient(thetaInitGuess);
|
m_theta->ProjectCoefficient(thetaInitGuess);
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ struct solverBundle {
|
|||||||
|
|
||||||
class PolySolver {
|
class PolySolver {
|
||||||
public: // Public methods
|
public: // Public methods
|
||||||
PolySolver(double n, double order);
|
PolySolver(const double n, const double order);
|
||||||
~PolySolver();
|
~PolySolver();
|
||||||
|
|
||||||
void solve() const;
|
void solve() const;
|
||||||
|
|||||||
Reference in New Issue
Block a user