feat(field-support): added field support system, mid migration
currently the barotope and the pressure force operator are migrated to the new support system
This commit is contained in:
@@ -13,23 +13,16 @@ namespace {
|
||||
const std::array<
|
||||
int,
|
||||
FormT::dynamicOrderCount> &dynamic_orders = {},
|
||||
const mean_field::utils::DOMAINS domain =
|
||||
mean_field::utils::DOMAINS::ALL
|
||||
const mean_field::utils::DOMAINS domain = mean_field::utils::DOMAINS::ALL
|
||||
) {
|
||||
using DensityField =
|
||||
mean_field::field::Field<mean_field::field::Density>;
|
||||
using DensityField = mean_field::field::Field<mean_field::field::Density>;
|
||||
|
||||
const mean_field::quadrature::Query query =
|
||||
DensityField::make_query<FormT>(
|
||||
mean_field::quadrature::QuadratureRole::diagnostic,
|
||||
transformation.OrderW(), dynamic_orders, domain,
|
||||
fem.has_mapping() ? mean_field::quadrature::MappingKind::general
|
||||
: mean_field::quadrature::MappingKind::none
|
||||
);
|
||||
const mean_field::quadrature::Query query = DensityField::make_query<FormT>(
|
||||
mean_field::quadrature::QuadratureRole::diagnostic, transformation.OrderW(), dynamic_orders, domain,
|
||||
fem.has_mapping() ? mean_field::quadrature::MappingKind::general : mean_field::quadrature::MappingKind::none
|
||||
);
|
||||
|
||||
return *fem.quadratureFactory
|
||||
->get(query, transformation.GetGeometryType())
|
||||
.integration_rule;
|
||||
return *fem.quadratureFactory->get(query, transformation.GetGeometryType()).integration_rule;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
@@ -45,15 +38,11 @@ namespace mean_field::analysis {
|
||||
double local_integral;
|
||||
mfem::Array<int> elem_markers;
|
||||
populate_element_mask(fem.mesh.get(), domain, elem_markers);
|
||||
const mfem::ElementTransformation &representative_transformation =
|
||||
*fem.mesh->GetElementTransformation(0);
|
||||
const mfem::ElementTransformation &representative_transformation = *fem.mesh->GetElementTransformation(0);
|
||||
const mfem::IntegrationRule &integration_rule =
|
||||
get_density_rule<field::Density::Form::MassConservation>(
|
||||
fem, representative_transformation, {}, domain
|
||||
);
|
||||
get_density_rule<field::Density::Form::MassConservation>(fem, representative_transformation, {}, domain);
|
||||
|
||||
if (fem.has_mapping() &&
|
||||
coord_space == mapping::COORDINATE_SPACE::PHYSICAL) {
|
||||
if (fem.has_mapping() && coord_space == mapping::COORDINATE_SPACE::PHYSICAL) {
|
||||
mapping::MappedScalarCoefficient mapped_gf_c(*fem.mapping, gf_c);
|
||||
|
||||
// ReSharper disable once CppDFAMemoryLeak // Disabled because MFEM
|
||||
@@ -80,10 +69,7 @@ namespace mean_field::analysis {
|
||||
}
|
||||
|
||||
double global_integral = 0.0;
|
||||
MPI_Allreduce(
|
||||
&local_integral, &global_integral, 1, MPI_DOUBLE, MPI_SUM,
|
||||
fem.mesh->GetComm()
|
||||
);
|
||||
MPI_Allreduce(&local_integral, &global_integral, 1, MPI_DOUBLE, MPI_SUM, fem.mesh->GetComm());
|
||||
return global_integral;
|
||||
}
|
||||
|
||||
@@ -99,12 +85,10 @@ namespace mean_field::analysis {
|
||||
for (int i = 0; i < fem.mesh->GetNE(); ++i) {
|
||||
if (fem.mesh->GetAttribute(i) == 3)
|
||||
continue;
|
||||
mfem::ElementTransformation *trans =
|
||||
fem.mesh->GetElementTransformation(i);
|
||||
const mfem::IntegrationRule &ir =
|
||||
get_density_rule<field::Density::Form::CenterOfMass>(
|
||||
fem, *trans, std::array<int, 1>{1}, utils::DOMAINS::STELLAR
|
||||
);
|
||||
mfem::ElementTransformation *trans = fem.mesh->GetElementTransformation(i);
|
||||
const mfem::IntegrationRule &ir = get_density_rule<field::Density::Form::CenterOfMass>(
|
||||
fem, *trans, std::array<int, 1>{1}, utils::DOMAINS::STELLAR
|
||||
);
|
||||
|
||||
for (int j = 0; j < ir.GetNPoints(); ++j) {
|
||||
const mfem::IntegrationPoint &ip = ir.IntPoint(j);
|
||||
@@ -138,10 +122,7 @@ namespace mean_field::analysis {
|
||||
|
||||
MPI_Allreduce(&local_mass, &global_mass, 1, MPI_DOUBLE, MPI_SUM, comm);
|
||||
|
||||
MPI_Allreduce(
|
||||
local_com.GetData(), global_com.GetData(), dim, MPI_DOUBLE, MPI_SUM,
|
||||
comm
|
||||
);
|
||||
MPI_Allreduce(local_com.GetData(), global_com.GetData(), dim, MPI_DOUBLE, MPI_SUM, comm);
|
||||
|
||||
if (global_mass > 1e-18) {
|
||||
global_com /= global_mass;
|
||||
@@ -157,9 +138,7 @@ namespace mean_field::analysis {
|
||||
mfem::GridFunction &rho,
|
||||
const double target_mass
|
||||
) {
|
||||
if (const double current_mass = domain_integrate_grid_function(
|
||||
fem, rho, utils::DOMAINS::STELLAR
|
||||
);
|
||||
if (const double current_mass = domain_integrate_grid_function(fem, rho, utils::DOMAINS::STELLAR);
|
||||
current_mass > 1e-15)
|
||||
rho *= (target_mass / current_mass);
|
||||
}
|
||||
@@ -168,16 +147,11 @@ namespace mean_field::analysis {
|
||||
const fem::FEM &fem,
|
||||
const mfem::GridFunction &rho
|
||||
) {
|
||||
auto s2_func = [](const mfem::Vector &x) {
|
||||
return std::pow(x(0), 2) + std::pow(x(1), 2);
|
||||
};
|
||||
auto s2_func = [](const mfem::Vector &x) { return std::pow(x(0), 2) + std::pow(x(1), 2); };
|
||||
|
||||
std::unique_ptr<mfem::Coefficient> s2_coeff;
|
||||
if (fem.has_mapping()) {
|
||||
s2_coeff =
|
||||
std::make_unique<mapping::PhysicalPositionFunctionCoefficient>(
|
||||
*fem.mapping, s2_func
|
||||
);
|
||||
s2_coeff = std::make_unique<mapping::PhysicalPositionFunctionCoefficient>(*fem.mapping, s2_func);
|
||||
} else {
|
||||
s2_coeff = std::make_unique<mfem::FunctionCoefficient>(s2_func);
|
||||
}
|
||||
@@ -186,23 +160,16 @@ namespace mean_field::analysis {
|
||||
mfem::ProductCoefficient I_integrand(rho_coeff, *s2_coeff);
|
||||
|
||||
mfem::LinearForm I_lf(fem.densityFes.get());
|
||||
const mfem::ElementTransformation &representative_transformation =
|
||||
*fem.mesh->GetElementTransformation(0);
|
||||
const mfem::IntegrationRule &integration_rule =
|
||||
get_density_rule<field::Density::Form::Quadrupole>(
|
||||
fem, representative_transformation, std::array<int, 1>{2},
|
||||
utils::DOMAINS::STELLAR
|
||||
);
|
||||
mfem::Array<int> stellar_markers;
|
||||
populate_element_mask(
|
||||
fem.mesh.get(), utils::DOMAINS::STELLAR, stellar_markers
|
||||
const mfem::ElementTransformation &representative_transformation = *fem.mesh->GetElementTransformation(0);
|
||||
const mfem::IntegrationRule &integration_rule = get_density_rule<field::Density::Form::Quadrupole>(
|
||||
fem, representative_transformation, std::array<int, 1>{2}, utils::DOMAINS::STELLAR
|
||||
);
|
||||
mfem::Array<int> stellar_markers;
|
||||
populate_element_mask(fem.mesh.get(), utils::DOMAINS::STELLAR, stellar_markers);
|
||||
|
||||
double local_I = 0.0;
|
||||
if (fem.has_mapping()) {
|
||||
mapping::MappedScalarCoefficient mapped_integrand(
|
||||
*fem.mapping, I_integrand
|
||||
);
|
||||
mapping::MappedScalarCoefficient mapped_integrand(*fem.mapping, I_integrand);
|
||||
auto *integrator = new mfem::DomainLFIntegrator(mapped_integrand);
|
||||
integrator->SetIntRule(&integration_rule);
|
||||
I_lf.AddDomainIntegrator(integrator, stellar_markers);
|
||||
@@ -217,9 +184,7 @@ namespace mean_field::analysis {
|
||||
}
|
||||
|
||||
double global_I = 0.0;
|
||||
MPI_Allreduce(
|
||||
&local_I, &global_I, 1, MPI_DOUBLE, MPI_SUM, fem.mesh->GetComm()
|
||||
);
|
||||
MPI_Allreduce(&local_I, &global_I, 1, MPI_DOUBLE, MPI_SUM, fem.mesh->GetComm());
|
||||
return global_I;
|
||||
}
|
||||
|
||||
@@ -229,13 +194,10 @@ namespace mean_field::analysis {
|
||||
const utils::DOMAINS domain
|
||||
) {
|
||||
mfem::ParMesh &mesh = *fem.mesh;
|
||||
const bool physical =
|
||||
(coordinate_space == mapping::COORDINATE_SPACE::PHYSICAL);
|
||||
const bool physical = (coordinate_space == mapping::COORDINATE_SPACE::PHYSICAL);
|
||||
|
||||
if (physical && !fem.has_mapping()) {
|
||||
MFEM_ABORT(
|
||||
"Physical volume requested but no domain mapping is available."
|
||||
);
|
||||
MFEM_ABORT("Physical volume requested but no domain mapping is available.");
|
||||
}
|
||||
|
||||
double local_volume = 0.0;
|
||||
@@ -258,9 +220,7 @@ namespace mean_field::analysis {
|
||||
}
|
||||
mfem::ElementTransformation *T = mesh.GetElementTransformation(e);
|
||||
const mfem::IntegrationRule &ir =
|
||||
get_density_rule<field::Density::Form::MassConservation>(
|
||||
fem, *T, {}, domain
|
||||
);
|
||||
get_density_rule<field::Density::Form::MassConservation>(fem, *T, {}, domain);
|
||||
|
||||
for (int q = 0; q < ir.GetNPoints(); ++q) {
|
||||
const mfem::IntegrationPoint &ip = ir.IntPoint(q);
|
||||
@@ -277,10 +237,7 @@ namespace mean_field::analysis {
|
||||
}
|
||||
|
||||
double global_volume = 0.0;
|
||||
MPI_Allreduce(
|
||||
&local_volume, &global_volume, 1, MPI_DOUBLE, MPI_SUM,
|
||||
mesh.GetComm()
|
||||
);
|
||||
MPI_Allreduce(&local_volume, &global_volume, 1, MPI_DOUBLE, MPI_SUM, mesh.GetComm());
|
||||
return global_volume;
|
||||
}
|
||||
} // namespace mean_field::analysis
|
||||
|
||||
Reference in New Issue
Block a user