Cover both density mass and EOS source in closure quadrature

This commit is contained in:
2026-09-19 10:47:58 -04:00
parent d6554cae6b
commit dd955abca5
8 changed files with 98 additions and 14 deletions

View File

@@ -238,12 +238,19 @@ inline NegativeDensityProjectionReport MeasureNegativeDensityProjection(
const mfem::IntegrationRule* rule = nullptr;
int resolvedOrder = control.quadratureOrder;
if (control.productionQuadrature) {
// PreparedBarotropicClosureOperator uses this source query for
// both rho*q and rho(h)*q, not the separate legacy mass query.
// Reproduce the shared production rule, including the density
// mass degree when it exceeds the nonlinear source degree.
const auto query = field::Field<field::Enthalpy>::make_query<field::Enthalpy::Form::EosClosureSource>(
quadrature::QuadratureRole::discretization, transformation->OrderW(), std::array<int, 1>{extraOrder},
utils::DOMAINS::STELLAR, quadrature::MappingKind::general);
const auto resolution = fem.quadratureFactory->get(query, transformation->GetGeometryType());
const auto sourceResolution = fem.quadratureFactory->get(query, transformation->GetGeometryType());
const auto massQuery = field::Field<field::Density>::make_query<field::Density::Form::EosClosureMass>(
quadrature::QuadratureRole::discretization, transformation->OrderW(), {},
utils::DOMAINS::STELLAR, quadrature::MappingKind::general);
const auto massResolution = fem.quadratureFactory->get(massQuery, transformation->GetGeometryType());
const auto &resolution = sourceResolution.resolution.order >= massResolution.resolution.order
? sourceResolution
: massResolution;
rule = resolution.integration_rule;
resolvedOrder = resolution.resolution.order;
} else {

View File

@@ -127,7 +127,16 @@ std::map<std::string, double> MeasureEnthalpyStep(State &state, const mean_field
mean_field::quadrature::QuadratureRole::discretization, transformation->OrderW(),
std::array<int, 1>{extraOrder}, mean_field::utils::DOMAINS::STELLAR,
mean_field::quadrature::MappingKind::general);
const auto resolution = fem.quadratureFactory->get(query, transformation->GetGeometryType());
auto resolution = fem.quadratureFactory->get(query, transformation->GetGeometryType());
if (!pressure) {
const auto massQuery = mean_field::field::Field<mean_field::field::Density>::template make_query<
mean_field::field::Density::Form::EosClosureMass>(
mean_field::quadrature::QuadratureRole::discretization, transformation->OrderW(), {},
mean_field::utils::DOMAINS::STELLAR, mean_field::quadrature::MappingKind::general);
const auto massResolution = fem.quadratureFactory->get(massQuery, transformation->GetGeometryType());
if (massResolution.resolution.order > resolution.resolution.order)
resolution = massResolution;
}
if (!resolution.integration_rule)
throw std::runtime_error("Missing production EOS quadrature rule.");
const auto &rule = *resolution.integration_rule;

View File

@@ -409,7 +409,16 @@ void ProbeSurfaceTrace(State &s, const mean_field::fem::FEM &f, double n,
: EnthalpyField::template make_query<field::Enthalpy::Form::EosClosureSource>(
quadrature::QuadratureRole::discretization, transformation->OrderW(), std::array<int, 1>{extraOrder},
utils::DOMAINS::STELLAR, quadrature::MappingKind::general);
const auto rule = f.quadratureFactory->get(query, transformation->GetGeometryType());
auto rule = f.quadratureFactory->get(query, transformation->GetGeometryType());
if (!pressure) {
const auto massQuery = field::Field<field::Density>::template make_query<
field::Density::Form::EosClosureMass>(
quadrature::QuadratureRole::discretization, transformation->OrderW(), {},
utils::DOMAINS::STELLAR, quadrature::MappingKind::general);
const auto massResolution = f.quadratureFactory->get(massQuery, transformation->GetGeometryType());
if (massResolution.resolution.order > rule.resolution.order)
rule = massResolution;
}
if (!rule.integration_rule || point < 0 || point >= rule.integration_rule->GetNPoints())
throw std::runtime_error("Surface trace inspection could not resolve its production limiting point.");
const auto &ip = rule.integration_rule->IntPoint(point);