Keep central density as seed data in the n1 sandbox

This commit is contained in:
2026-09-16 14:39:55 -04:00
parent 0470e3b2a1
commit a1d7d4e679
3 changed files with 86 additions and 5 deletions

View File

@@ -116,6 +116,49 @@ TEST_CASE(
CHECK(context.hasActiveSolver());
}
TEST_CASE(
"An Explicit Lane Emden Seed Builds A Fixed Angular Momentum Context Without Fixing Central Density",
"[user-api][solver][context][seed][fixed-angular-momentum]"
) {
using namespace mean_field;
auto finiteElements = makeFiniteElements();
REQUIRE(finiteElements.okay());
constexpr double radius = utils::RADIUS;
const double polytropicConstant = 2.0 * utils::G * radius * radius / std::numbers::pi_v<double>;
const double seedCentralDensity = std::numbers::pi_v<double> * utils::MASS / (4.0 * radius * radius * radius);
auto stellarModel = model::StellarModel(
eos::Polytrope({.n = 1.0, .K = polytropicConstant}),
surface::Isobaric({.Psurf = dimensions::PressureValue{0.0}}),
integral::FixedTotalMass({.Mtotal = dimensions::MassValue{utils::MASS}}),
integral::FixedAngularMomentum({.Jtotal = dimensions::AngularMomentumValue{0.05}})
);
auto discretization = equilibrium::makeStellarDiscretization(
std::move(finiteElements), normalization::PhysicalRieszDiagonal{dimensions::LengthValue{radius}, utils::G}
);
auto context = solver::makeContext(
std::move(stellarModel), std::move(discretization), preconditioning::makePreconditioner(),
solver::linear::FGMRES({.restartLength = 20, .printLevel = -1}),
seed::LaneEmden({.centralDensity = dimensions::DensityValue{seedCentralDensity}})
);
using Problem = typename std::remove_cvref_t<decltype(context)>::ProblemType;
STATIC_CHECK(Problem::hasFixedAngularMomentum);
STATIC_CHECK_FALSE(Problem::hasFixedCentralDensity);
REQUIRE(context.isReady());
CHECK_FALSE(context.hasActiveSolver());
{
auto equilibriumSolver = solver::make(context, solver::nonlinear::Newton{});
CHECK(equilibriumSolver.isReady());
CHECK(context.hasActiveSolver());
}
CHECK_FALSE(context.hasActiveSolver());
REQUIRE(context.isReady());
auto nextSolver = solver::make(context, solver::nonlinear::Newton{});
CHECK(nextSolver.isReady());
}
TEST_CASE(
"Fixed Angular Momentum User API Generates Rotation And Its Composable Solver Border",
"[user-api][fixed-angular-momentum][type]"