|
|
|
|
@@ -9,6 +9,29 @@ import :operators.context.gravity_field;
|
|
|
|
|
namespace {
|
|
|
|
|
using DomainSchema = mean_field::utils::domain::CoreEnvelopeVacuumDomainSchema;
|
|
|
|
|
|
|
|
|
|
[[nodiscard]] std::unique_ptr<mfem::ParMixedBilinearForm> make_divergence_operator(const mean_field::fem::FEM &f) {
|
|
|
|
|
auto divergence =
|
|
|
|
|
std::make_unique<mfem::ParMixedBilinearForm>(f.gravityFluxFes.get(), f.gravityPotentialFes.get());
|
|
|
|
|
|
|
|
|
|
divergence->SetAssemblyLevel(mfem::AssemblyLevel::PARTIAL);
|
|
|
|
|
|
|
|
|
|
auto integrator = std::make_unique<mfem::VectorFEDivergenceIntegrator>();
|
|
|
|
|
|
|
|
|
|
const mfem::FiniteElement &trialElement = *f.gravityFluxFes->GetTypicalFE();
|
|
|
|
|
const mfem::FiniteElement &testElement = *f.gravityPotentialFes->GetTypicalFE();
|
|
|
|
|
const mfem::ElementTransformation &transformation = *f.mesh->GetElementTransformation(0);
|
|
|
|
|
|
|
|
|
|
f.quadratureFactory->configure_gravity_divergence(
|
|
|
|
|
*integrator, mean_field::quadrature::QuadratureRole::discretization, trialElement, testElement,
|
|
|
|
|
transformation, mean_field::utils::DOMAINS::ALL, mean_field::quadrature::MappingKind::none
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
divergence->AddDomainIntegrator(integrator.release());
|
|
|
|
|
divergence->Assemble();
|
|
|
|
|
|
|
|
|
|
return divergence;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void validate_displacement(
|
|
|
|
|
const mean_field::field::FieldDofMap &displacement_map,
|
|
|
|
|
const mfem::Vector &displacement
|
|
|
|
|
@@ -96,7 +119,7 @@ namespace {
|
|
|
|
|
namespace mean_field::operators::context::gravity_field {
|
|
|
|
|
GravityFieldGeometryContext::GravityFieldGeometryContext(
|
|
|
|
|
const fem::FEM &f,
|
|
|
|
|
const mapping::DomainMapperStateless &domain_mapper
|
|
|
|
|
const mapping::DomainMapper &domain_mapper
|
|
|
|
|
)
|
|
|
|
|
: m_fem(f),
|
|
|
|
|
m_domain_mapper(domain_mapper),
|
|
|
|
|
@@ -170,18 +193,23 @@ namespace mean_field::operators::context::gravity_field {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (discretization_changed) {
|
|
|
|
|
auto mass_operator = std::make_unique<PreparedMappedHDivMassOperator>(m_fem, m_domain_mapper);
|
|
|
|
|
auto source_operator = std::make_unique<PreparedMappedGravitySourceOperator>(m_fem, m_domain_mapper);
|
|
|
|
|
auto mass_operator = std::make_unique<PreparedMappedHDivMassOperator>(m_fem, m_domain_mapper);
|
|
|
|
|
auto source_operator = std::make_unique<PreparedMappedGravitySourceOperator>(m_fem, m_domain_mapper);
|
|
|
|
|
auto divergence_operator = make_divergence_operator(m_fem);
|
|
|
|
|
auto transpose_divergence_operator = std::make_unique<mfem::TransposeOperator>(divergence_operator.get());
|
|
|
|
|
|
|
|
|
|
mass_operator->Prepare(displacement);
|
|
|
|
|
source_operator->Prepare(displacement);
|
|
|
|
|
|
|
|
|
|
m_mass_operator = std::move(mass_operator);
|
|
|
|
|
m_source_operator = std::move(source_operator);
|
|
|
|
|
m_mass_operator = std::move(mass_operator);
|
|
|
|
|
m_source_operator = std::move(source_operator);
|
|
|
|
|
m_divergence_operator = std::move(divergence_operator);
|
|
|
|
|
m_transpose_divergence_operator = std::move(transpose_divergence_operator);
|
|
|
|
|
|
|
|
|
|
preparation.reconstructed_operators = true;
|
|
|
|
|
preparation.rebuilt_mass_operator = true;
|
|
|
|
|
preparation.rebuilt_source_operator = true;
|
|
|
|
|
preparation.reconstructed_operators = true;
|
|
|
|
|
preparation.rebuilt_mass_operator = true;
|
|
|
|
|
preparation.rebuilt_source_operator = true;
|
|
|
|
|
preparation.rebuilt_divergence_operator = true;
|
|
|
|
|
} else {
|
|
|
|
|
MFEM_VERIFY(
|
|
|
|
|
m_mass_operator != nullptr, "GravityFieldGeometryContext has "
|
|
|
|
|
@@ -231,6 +259,23 @@ namespace mean_field::operators::context::gravity_field {
|
|
|
|
|
return *m_source_operator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const mfem::Operator &GravityFieldGeometryContext::GetDivergenceOperator() const {
|
|
|
|
|
MFEM_VERIFY(m_is_prepared, "GravityFieldGeometryContext must be prepared before accessing divergence.");
|
|
|
|
|
MFEM_VERIFY(m_divergence_operator != nullptr, "GravityFieldGeometryContext has no divergence operator.");
|
|
|
|
|
return *m_divergence_operator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const mfem::Operator &GravityFieldGeometryContext::GetTransposeDivergenceOperator() const {
|
|
|
|
|
MFEM_VERIFY(
|
|
|
|
|
m_is_prepared, "GravityFieldGeometryContext must be prepared before accessing transpose divergence."
|
|
|
|
|
);
|
|
|
|
|
MFEM_VERIFY(
|
|
|
|
|
m_transpose_divergence_operator != nullptr,
|
|
|
|
|
"GravityFieldGeometryContext has no transpose-divergence operator."
|
|
|
|
|
);
|
|
|
|
|
return *m_transpose_divergence_operator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const mfem::Vector &GravityFieldGeometryContext::GetDisplacementTrue() const {
|
|
|
|
|
MFEM_VERIFY(
|
|
|
|
|
m_is_prepared, "GravityFieldGeometryContext must be prepared before "
|
|
|
|
|
@@ -257,7 +302,7 @@ namespace mean_field::operators::context::gravity_field {
|
|
|
|
|
|
|
|
|
|
GravityFieldLinearizationContext::GravityFieldLinearizationContext(
|
|
|
|
|
const fem::FEM &f,
|
|
|
|
|
const mapping::DomainMapperStateless &domain_mapper
|
|
|
|
|
const mapping::DomainMapper &domain_mapper
|
|
|
|
|
)
|
|
|
|
|
: m_fem(f),
|
|
|
|
|
m_geometry_context(
|
|
|
|
|
|