perf(jacobian-action): major updates to jacobian action application by removing redudant quadrature work. ~5x increase in speed
This commit is contained in:
@@ -12,10 +12,11 @@ import :field.registry;
|
||||
import :utils.domain;
|
||||
|
||||
namespace {
|
||||
namespace eos = mean_field::eos;
|
||||
namespace dimensions = mean_field::dimensions;
|
||||
namespace eos = mean_field::eos;
|
||||
|
||||
using DomainSchema = mean_field::utils::domain::CoreEnvelopeVacuumDomainSchema;
|
||||
using ClosureDomain = mean_field::field::FieldDomainT<mean_field::field::Density>;
|
||||
using DomainSchema = mean_field::utils::domain::CoreEnvelopeVacuumDomainSchema;
|
||||
using ClosureDomain = mean_field::field::FieldDomainT<mean_field::field::Density>;
|
||||
|
||||
enum class ClosureAction { residual, density, enthalpy };
|
||||
|
||||
@@ -339,7 +340,9 @@ namespace {
|
||||
const double density = elementDensityInput * densityShape;
|
||||
|
||||
const double equationOfStateDensity =
|
||||
eos::evaluate<eos::quantity::Density>(barotrope, eos::SpecificEnthalpyValue{baseEnthalpy})
|
||||
eos::evaluate<dimensions::quantity::Density>(
|
||||
barotrope, dimensions::SpecificEnthalpyValue{baseEnthalpy}
|
||||
)
|
||||
.value();
|
||||
|
||||
integrand = density - equationOfStateDensity;
|
||||
@@ -348,7 +351,7 @@ namespace {
|
||||
|
||||
const double densityDerivative =
|
||||
eos::partialDerivative<eos::quantity::Density, eos::quantity::SpecificEnthalpy>(
|
||||
barotrope, eos::SpecificEnthalpyValue{baseEnthalpy}
|
||||
barotrope, dimensions::SpecificEnthalpyValue{baseEnthalpy}
|
||||
)
|
||||
.value();
|
||||
|
||||
@@ -640,16 +643,18 @@ namespace mean_field::operators::kernels {
|
||||
|
||||
enthalpyElement.CalcShape(integrationPoint, enthalpyShape);
|
||||
|
||||
const double densityValue = elementBaseDensity * densityShape;
|
||||
const double densityValue = elementBaseDensity * densityShape;
|
||||
|
||||
const double enthalpyValue = elementBaseEnthalpy * enthalpyShape;
|
||||
const double enthalpyValue = elementBaseEnthalpy * enthalpyShape;
|
||||
|
||||
const double equationOfStateDensity =
|
||||
eos::evaluate<eos::quantity::Density>(barotrope, eos::SpecificEnthalpyValue{enthalpyValue}).value();
|
||||
const double equationOfStateDensity = eos::evaluate<dimensions::quantity::Density>(
|
||||
barotrope, dimensions::SpecificEnthalpyValue{enthalpyValue}
|
||||
)
|
||||
.value();
|
||||
|
||||
const double closureValue = densityValue - equationOfStateDensity;
|
||||
const double closureValue = densityValue - equationOfStateDensity;
|
||||
|
||||
const double geometryActionValue = closureValue * mappingVariation.weight_variation;
|
||||
const double geometryActionValue = closureValue * mappingVariation.weight_variation;
|
||||
|
||||
MFEM_VERIFY(
|
||||
std::isfinite(closureValue) && std::isfinite(geometryActionValue),
|
||||
|
||||
@@ -490,6 +490,8 @@ namespace mean_field::operators::kernels {
|
||||
|
||||
mfem::DenseMatrix gravity_gradient_shape;
|
||||
mfem::DenseMatrix mass_tensor_variation;
|
||||
mapping::VolumeMappingContext mapping_context;
|
||||
mapping::VolumeMappingVariation mapping_variation;
|
||||
|
||||
for (int element_id = 0; element_id < f.mesh->GetNE(); ++element_id) {
|
||||
const mfem::FiniteElement &gravity_gradient_element = *f.gravityFluxFes->GetFE(element_id);
|
||||
@@ -555,7 +557,6 @@ namespace mean_field::operators::kernels {
|
||||
const mfem::IntegrationPoint &integration_point = integration_rule.IntPoint(q);
|
||||
transformation->SetIntPoint(&integration_point);
|
||||
|
||||
mapping::VolumeMappingContext mapping_context;
|
||||
const mapping::MappingStatus status = domain_mapper.EvaluateVolume(
|
||||
mapping_data, *transformation, integration_point, workspace, mapping_context
|
||||
);
|
||||
@@ -568,7 +569,6 @@ namespace mean_field::operators::kernels {
|
||||
<< ", status: " << static_cast<int>(status)
|
||||
);
|
||||
|
||||
mapping::VolumeMappingVariation mapping_variation;
|
||||
const mapping::MappingStatus variation_status = domain_mapper.EvaluateVolumeVariation(
|
||||
mapping_data, displacement_variation_data, *transformation, integration_point, mapping_context,
|
||||
workspace, mapping_variation
|
||||
|
||||
@@ -12,9 +12,10 @@ module mean_field;
|
||||
import :operators.kernels.pressure_force;
|
||||
|
||||
namespace {
|
||||
namespace eos = mean_field::eos;
|
||||
namespace dimensions = mean_field::dimensions;
|
||||
namespace eos = mean_field::eos;
|
||||
|
||||
using DomainSchema = mean_field::utils::domain::CoreEnvelopeVacuumDomainSchema;
|
||||
using DomainSchema = mean_field::utils::domain::CoreEnvelopeVacuumDomainSchema;
|
||||
|
||||
[[nodiscard]] bool is_vacuum_attribute(const int attribute) {
|
||||
return DomainSchema::template attribute_belongs_to<mean_field::utils::domain::Vacuum>(attribute);
|
||||
@@ -416,14 +417,15 @@ namespace {
|
||||
|
||||
if (pressureForceAction == PressureForceAction::residual ||
|
||||
pressureForceAction == PressureForceAction::displacement) {
|
||||
pressureFactor =
|
||||
eos::evaluate<eos::quantity::Pressure>(barotrope, eos::SpecificEnthalpyValue{enthalpyValue})
|
||||
.value();
|
||||
pressureFactor = eos::evaluate<dimensions::quantity::Pressure>(
|
||||
barotrope, dimensions::SpecificEnthalpyValue{enthalpyValue}
|
||||
)
|
||||
.value();
|
||||
} else {
|
||||
const double enthalpyVariationValue = elementEnthalpyVariation * enthalpyShape;
|
||||
|
||||
pressureFactor = eos::partialDerivative<eos::quantity::Pressure, eos::quantity::SpecificEnthalpy>(
|
||||
barotrope, eos::SpecificEnthalpyValue{enthalpyValue}
|
||||
barotrope, dimensions::SpecificEnthalpyValue{enthalpyValue}
|
||||
)
|
||||
.value() *
|
||||
enthalpyVariationValue;
|
||||
|
||||
Reference in New Issue
Block a user