feat(newton): first newton solver implementation
This commit is contained in:
@@ -415,6 +415,57 @@ TEST_CASE(
|
||||
CHECK(preparedOperator.IsPrepared());
|
||||
}
|
||||
|
||||
TEST_CASE(
|
||||
"Prepared Displacement Residual Preserves Pressure Rejection Details",
|
||||
tags::barotrope_prepared
|
||||
) {
|
||||
mean_field::utils::Args args = test_utils::setup_args();
|
||||
mean_field::fem::FEM f = mean_field::fem::setup_fem(args.mesh_file, args, 0);
|
||||
REQUIRE(f.okay());
|
||||
|
||||
const mfem::Vector density = prepared_displacement_residual_test_utils::make_density(f, 0.31);
|
||||
const mfem::Vector displacement = gravity_prepared_test_utils::make_displacement(f, 0.67);
|
||||
const mfem::Vector gravityGradient = prepared_displacement_residual_test_utils::make_gravity_gradient(f, 0.47);
|
||||
mfem::Vector gravityPotential(f.gravityPotentialFes->GetTrueVSize());
|
||||
gravityPotential = 0.0;
|
||||
|
||||
auto dependencies = prepared_displacement_residual_test_utils::make_dependencies();
|
||||
mean_field::operators::context::gravity_field::GravityFieldLinearizationContext gravityContext(
|
||||
f, *f.domainMapperStateless
|
||||
);
|
||||
prepared_displacement_residual_test_utils::prepare_gravity_context(
|
||||
gravityContext, density, displacement, gravityGradient, gravityPotential, dependencies, 19
|
||||
);
|
||||
|
||||
const mean_field::eos::Polytrope equationOfState(3.0, 0.25);
|
||||
const mean_field::physics::RigidRotation rotation = prepared_displacement_residual_test_utils::make_rotation(0.83);
|
||||
mean_field::operators::PreparedDisplacementResidualOperator preparedOperator(
|
||||
f, *f.domainMapperStateless, equationOfState, gravityContext
|
||||
);
|
||||
|
||||
mfem::Vector enthalpy(prepared_displacement_residual_test_utils::make_enthalpy_map(f).reduced_size());
|
||||
enthalpy = std::numeric_limits<double>::max();
|
||||
|
||||
const auto rejected = preparedOperator.TryPrepare({.enthalpy = enthalpy}, dependencies, rotation);
|
||||
REQUIRE_FALSE(rejected.has_value());
|
||||
CHECK(rejected.error().source == mean_field::operators::DisplacementResidualPreparationRejectionSource::pressure);
|
||||
CHECK(
|
||||
rejected.error().reason ==
|
||||
mean_field::operators::DisplacementResidualPreparationRejectionReason::equation_of_state
|
||||
);
|
||||
CHECK(rejected.error().equationOfStateCode == mean_field::eos::EvaluationErrorCode::nonfinite_result);
|
||||
CHECK_FALSE(preparedOperator.IsPrepared());
|
||||
CHECK_THROWS_AS(
|
||||
preparedOperator.Prepare({.enthalpy = enthalpy}, dependencies, rotation), mean_field::eos::EvaluationError
|
||||
);
|
||||
|
||||
enthalpy = 1.0;
|
||||
++dependencies.enthalpy.revision;
|
||||
const auto accepted = preparedOperator.TryPrepare({.enthalpy = enthalpy}, dependencies, rotation);
|
||||
REQUIRE(accepted.has_value());
|
||||
CHECK(preparedOperator.IsPrepared());
|
||||
}
|
||||
|
||||
TEST_CASE(
|
||||
"Prepared Displacement Residual Selectively Orchestrates Its Children",
|
||||
tags::barotrope_context_integration
|
||||
|
||||
Reference in New Issue
Block a user