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:
2026-08-23 10:13:53 -04:00
parent dc912fd15e
commit 0f3ca8050b
137 changed files with 29975 additions and 16389 deletions

View File

@@ -13,8 +13,7 @@ namespace {
template <typename Query, typename List> struct contains_type;
template <typename Query>
struct contains_type<Query, blocks::type_list<>> : std::false_type { };
template <typename Query> struct contains_type<Query, blocks::type_list<>> : std::false_type { };
template <typename Query, typename Head, typename... Tail>
struct contains_type<Query, blocks::type_list<Head, Tail...>>
@@ -23,30 +22,24 @@ namespace {
std::true_type,
contains_type<Query, blocks::type_list<Tail...>>> { };
template <typename Query, typename List>
inline constexpr bool contains_type_v = contains_type<Query, List>::value;
template <typename Query, typename List> inline constexpr bool contains_type_v = contains_type<Query, List>::value;
template <int index, typename List> struct type_at;
template <typename Head, typename... Tail>
struct type_at<0, blocks::type_list<Head, Tail...>> {
template <typename Head, typename... Tail> struct type_at<0, blocks::type_list<Head, Tail...>> {
using type = Head;
};
template <int index, typename Head, typename... Tail>
struct type_at<index, blocks::type_list<Head, Tail...>> {
template <int index, typename Head, typename... Tail> struct type_at<index, blocks::type_list<Head, Tail...>> {
static_assert(index > 0);
using type =
typename type_at<index - 1, blocks::type_list<Tail...>>::type;
using type = typename type_at<index - 1, blocks::type_list<Tail...>>::type;
};
template <int index, typename List>
using type_at_t = typename type_at<index, List>::type;
template <int index, typename List> using type_at_t = typename type_at<index, List>::type;
template <typename Row> struct block_row_traits;
template <typename Residual, typename... Values>
struct block_row_traits<blocks::block_row<Residual, Values...>> {
template <typename Residual, typename... Values> struct block_row_traits<blocks::block_row<Residual, Values...>> {
using residual = Residual;
using values = blocks::type_list<Values...>;
@@ -56,10 +49,7 @@ namespace {
template <typename Row, typename... ExpectedValues>
inline constexpr bool row_has_exact_values_v =
block_row_traits<Row>::value_count == sizeof...(ExpectedValues) &&
(contains_type_v<
ExpectedValues,
typename block_row_traits<Row>::values> &&
...);
(contains_type_v<ExpectedValues, typename block_row_traits<Row>::values> && ...);
struct foreign_value final : blocks::value_block_base { };
struct foreign_residual final : blocks::residual_block_base { };
@@ -69,17 +59,10 @@ TEST_CASE(
"Block Types Preserve Their Semantic Hierarchy",
tags::unit &tags::solver &tags::utils
) {
STATIC_REQUIRE(
std::is_base_of_v<blocks::block, blocks::residual_block_base>
);
STATIC_REQUIRE(std::is_base_of_v<blocks::block, blocks::residual_block_base>);
STATIC_REQUIRE(std::is_base_of_v<blocks::block, blocks::value_block_base>);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::residual_block_base, blocks::residual_block<0>>
);
STATIC_REQUIRE(
std::is_base_of_v<blocks::value_block_base, blocks::value_block<0>>
);
STATIC_REQUIRE(std::is_base_of_v<blocks::residual_block_base, blocks::residual_block<0>>);
STATIC_REQUIRE(std::is_base_of_v<blocks::value_block_base, blocks::value_block<0>>);
STATIC_REQUIRE(std::is_base_of_v<blocks::field, blocks::density>);
STATIC_REQUIRE(std::is_base_of_v<blocks::field, blocks::displacement>);
@@ -87,45 +70,19 @@ TEST_CASE(
STATIC_REQUIRE(std::is_base_of_v<blocks::field, blocks::enthalpy>);
STATIC_REQUIRE(std::is_base_of_v<blocks::term, blocks::density::mass>);
STATIC_REQUIRE(
std::is_base_of_v<blocks::term, blocks::displacement::geometry>
);
STATIC_REQUIRE(std::is_base_of_v<blocks::term, blocks::displacement::geometry>);
STATIC_REQUIRE(std::is_base_of_v<blocks::term, blocks::gravity::gradient>);
STATIC_REQUIRE(std::is_base_of_v<blocks::term, blocks::gravity::poisson>);
STATIC_REQUIRE(std::is_base_of_v<blocks::term, blocks::enthalpy::specific>);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::value_block_base, blocks::density::mass::value>
);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::residual_block_base, blocks::density::mass::residual>
);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::value_block_base, blocks::gravity::gradient::value>
);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::residual_block_base, blocks::gravity::gradient::residual>
);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::value_block_base, blocks::gravity::poisson::value>
);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::residual_block_base, blocks::gravity::poisson::residual>
);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::value_block_base, blocks::enthalpy::specific::value>
);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::residual_block_base, blocks::enthalpy::specific::residual>
);
STATIC_REQUIRE(std::is_base_of_v<blocks::value_block_base, blocks::density::mass::value>);
STATIC_REQUIRE(std::is_base_of_v<blocks::residual_block_base, blocks::density::mass::residual>);
STATIC_REQUIRE(std::is_base_of_v<blocks::value_block_base, blocks::gravity::gradient::value>);
STATIC_REQUIRE(std::is_base_of_v<blocks::residual_block_base, blocks::gravity::gradient::residual>);
STATIC_REQUIRE(std::is_base_of_v<blocks::value_block_base, blocks::gravity::poisson::value>);
STATIC_REQUIRE(std::is_base_of_v<blocks::residual_block_base, blocks::gravity::poisson::residual>);
STATIC_REQUIRE(std::is_base_of_v<blocks::value_block_base, blocks::enthalpy::specific::value>);
STATIC_REQUIRE(std::is_base_of_v<blocks::residual_block_base, blocks::enthalpy::specific::residual>);
STATIC_REQUIRE(std::is_empty_v<blocks::density>);
STATIC_REQUIRE(std::is_empty_v<blocks::displacement>);
@@ -136,41 +93,22 @@ TEST_CASE(
STATIC_REQUIRE(std::is_empty_v<blocks::gravity::poisson>);
STATIC_REQUIRE(std::is_empty_v<blocks::enthalpy::specific>);
STATIC_REQUIRE(
std::is_base_of_v<blocks::field, blocks::barotropic_constant>
);
STATIC_REQUIRE(std::is_base_of_v<blocks::field, blocks::barotropic_constant>);
STATIC_REQUIRE(std::is_base_of_v<blocks::term, blocks::barotropic_constant::mass_normalization>);
STATIC_REQUIRE(std::is_base_of_v<blocks::value_block_base, blocks::barotropic_constant::mass_normalization::value>);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::term, blocks::barotropic_constant::mass_normalization>
std::is_base_of_v<blocks::residual_block_base, blocks::barotropic_constant::mass_normalization::residual>
);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::value_block_base,
blocks::barotropic_constant::mass_normalization::value>
);
STATIC_REQUIRE(blocks::barotropic_constant::mass_normalization::value::static_block_size == 1);
STATIC_REQUIRE(
std::is_base_of_v<
blocks::residual_block_base,
blocks::barotropic_constant::mass_normalization::residual>
);
STATIC_REQUIRE(
blocks::barotropic_constant::mass_normalization::value::
static_block_size == 1
);
STATIC_REQUIRE(
blocks::barotropic_constant::mass_normalization::residual::
static_block_size == 1
);
STATIC_REQUIRE(blocks::barotropic_constant::mass_normalization::residual::static_block_size == 1);
STATIC_REQUIRE(std::is_empty_v<blocks::barotropic_constant>);
STATIC_REQUIRE(
std::is_empty_v<blocks::barotropic_constant::mass_normalization>
);
STATIC_REQUIRE(std::is_empty_v<blocks::barotropic_constant::mass_normalization>);
CHECK(true);
}
@@ -180,36 +118,19 @@ TEST_CASE(
tags::unit &tags::solver &tags::utils
) {
using list = blocks::type_list<
blocks::density::mass::value, blocks::displacement::geometry::value,
blocks::gravity::gradient::value, blocks::gravity::poisson::value>;
blocks::density::mass::value, blocks::displacement::geometry::value, blocks::gravity::gradient::value,
blocks::gravity::poisson::value>;
STATIC_REQUIRE(list::size == 4);
STATIC_REQUIRE(
blocks::type_index_v<blocks::density::mass::value, list> == 0
);
STATIC_REQUIRE(
blocks::type_index_v<blocks::displacement::geometry::value, list> == 1
);
STATIC_REQUIRE(
blocks::type_index_v<blocks::gravity::gradient::value, list> == 2
);
STATIC_REQUIRE(
blocks::type_index_v<blocks::gravity::poisson::value, list> == 3
);
STATIC_REQUIRE(blocks::type_index_v<blocks::density::mass::value, list> == 0);
STATIC_REQUIRE(blocks::type_index_v<blocks::displacement::geometry::value, list> == 1);
STATIC_REQUIRE(blocks::type_index_v<blocks::gravity::gradient::value, list> == 2);
STATIC_REQUIRE(blocks::type_index_v<blocks::gravity::poisson::value, list> == 3);
STATIC_REQUIRE(
std::is_same_v<type_at_t<0, list>, blocks::density::mass::value>
);
STATIC_REQUIRE(
std::is_same_v<
type_at_t<1, list>, blocks::displacement::geometry::value>
);
STATIC_REQUIRE(
std::is_same_v<type_at_t<2, list>, blocks::gravity::gradient::value>
);
STATIC_REQUIRE(
std::is_same_v<type_at_t<3, list>, blocks::gravity::poisson::value>
);
STATIC_REQUIRE(std::is_same_v<type_at_t<0, list>, blocks::density::mass::value>);
STATIC_REQUIRE(std::is_same_v<type_at_t<1, list>, blocks::displacement::geometry::value>);
STATIC_REQUIRE(std::is_same_v<type_at_t<2, list>, blocks::gravity::gradient::value>);
STATIC_REQUIRE(std::is_same_v<type_at_t<3, list>, blocks::gravity::poisson::value>);
CHECK(true);
}
@@ -218,53 +139,24 @@ TEST_CASE(
"Gravity Field Form Resolves Value And Residual Blocks",
tags::unit &tags::solver &tags::utils
) {
using form = blocks::gravity_field_form;
using form = blocks::gravity_field_form;
constexpr auto density_value =
blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_value =
blocks::get_value_block<form>(blocks::displacement_field.geometry_term);
constexpr auto gravity_gradient_value =
blocks::get_value_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_potential_value =
blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_residual =
blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual =
blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
constexpr auto density_value = blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_value = blocks::get_value_block<form>(blocks::displacement_field.geometry_term);
constexpr auto gravity_gradient_value = blocks::get_value_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_potential_value = blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_residual = blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual = blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
STATIC_REQUIRE(form::value_block_count == 4);
STATIC_REQUIRE(form::residual_block_count == 2);
STATIC_REQUIRE(
std::is_same_v<
std::remove_cv_t<decltype(density_value)>, blocks::value_block<0>>
);
STATIC_REQUIRE(
std::is_same_v<
std::remove_cv_t<decltype(displacement_value)>,
blocks::value_block<1>>
);
STATIC_REQUIRE(
std::is_same_v<
std::remove_cv_t<decltype(gravity_gradient_value)>,
blocks::value_block<2>>
);
STATIC_REQUIRE(
std::is_same_v<
std::remove_cv_t<decltype(gravity_potential_value)>,
blocks::value_block<3>>
);
STATIC_REQUIRE(
std::is_same_v<
std::remove_cv_t<decltype(gravity_gradient_residual)>,
blocks::residual_block<0>>
);
STATIC_REQUIRE(
std::is_same_v<
std::remove_cv_t<decltype(gravity_poisson_residual)>,
blocks::residual_block<1>>
);
STATIC_REQUIRE(std::is_same_v<std::remove_cv_t<decltype(density_value)>, blocks::value_block<0>>);
STATIC_REQUIRE(std::is_same_v<std::remove_cv_t<decltype(displacement_value)>, blocks::value_block<1>>);
STATIC_REQUIRE(std::is_same_v<std::remove_cv_t<decltype(gravity_gradient_value)>, blocks::value_block<2>>);
STATIC_REQUIRE(std::is_same_v<std::remove_cv_t<decltype(gravity_potential_value)>, blocks::value_block<3>>);
STATIC_REQUIRE(std::is_same_v<std::remove_cv_t<decltype(gravity_gradient_residual)>, blocks::residual_block<0>>);
STATIC_REQUIRE(std::is_same_v<std::remove_cv_t<decltype(gravity_poisson_residual)>, blocks::residual_block<1>>);
CHECK(static_cast<int>(density_value) == 0);
CHECK(static_cast<int>(displacement_value) == 1);
@@ -278,20 +170,14 @@ TEST_CASE(
"Resolved Blocks Implicitly Convert For MFEM Interfaces",
tags::unit &tags::solver &tags::utils
) {
using form = blocks::gravity_field_form;
using form = blocks::gravity_field_form;
constexpr auto density_value =
blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto gravity_potential_value =
blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_residual =
blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual =
blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
constexpr auto density_value = blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto gravity_potential_value = blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_residual = blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual = blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
auto consume_block_index = [](const int block_index) {
return block_index;
};
auto consume_block_index = [](const int block_index) { return block_index; };
CHECK(consume_block_index(density_value) == 0);
CHECK(consume_block_index(gravity_potential_value) == 3);
@@ -305,35 +191,21 @@ TEST_CASE(
) {
using reordered_form = blocks::block_form<
blocks::type_list<
blocks::gravity::poisson::value, blocks::gravity::gradient::value,
blocks::density::mass::value,
blocks::gravity::poisson::value, blocks::gravity::gradient::value, blocks::density::mass::value,
blocks::displacement::geometry::value>,
blocks::type_list<
blocks::gravity::poisson::residual,
blocks::gravity::gradient::residual>>;
blocks::type_list<blocks::gravity::poisson::residual, blocks::gravity::gradient::residual>>;
constexpr auto gravity_potential_value =
blocks::get_value_block<reordered_form>(
blocks::gravity_field.poisson_term
);
blocks::get_value_block<reordered_form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_value =
blocks::get_value_block<reordered_form>(
blocks::gravity_field.gradient_term
);
constexpr auto density_value = blocks::get_value_block<reordered_form>(
blocks::density_field.mass_term
);
constexpr auto displacement_value = blocks::get_value_block<reordered_form>(
blocks::displacement_field.geometry_term
);
blocks::get_value_block<reordered_form>(blocks::gravity_field.gradient_term);
constexpr auto density_value = blocks::get_value_block<reordered_form>(blocks::density_field.mass_term);
constexpr auto displacement_value =
blocks::get_value_block<reordered_form>(blocks::displacement_field.geometry_term);
constexpr auto gravity_poisson_residual =
blocks::get_residual_block<reordered_form>(
blocks::gravity_field.poisson_term
);
blocks::get_residual_block<reordered_form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_residual =
blocks::get_residual_block<reordered_form>(
blocks::gravity_field.gradient_term
);
blocks::get_residual_block<reordered_form>(blocks::gravity_field.gradient_term);
STATIC_REQUIRE(static_cast<int>(gravity_potential_value) == 0);
STATIC_REQUIRE(static_cast<int>(gravity_gradient_value) == 1);
@@ -355,18 +227,12 @@ TEST_CASE(
const std::array<int, form::residual_block_count> residual_sizes{23, 29};
const blocks::form_layout<form> layout(value_sizes, residual_sizes);
constexpr auto density_value =
blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_value =
blocks::get_value_block<form>(blocks::displacement_field.geometry_term);
constexpr auto gravity_gradient_value =
blocks::get_value_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_potential_value =
blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_residual =
blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual =
blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
constexpr auto density_value = blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_value = blocks::get_value_block<form>(blocks::displacement_field.geometry_term);
constexpr auto gravity_gradient_value = blocks::get_value_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_potential_value = blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_residual = blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual = blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
CHECK(layout.size(density_value) == 11);
CHECK(layout.size(displacement_value) == 13);
@@ -405,18 +271,12 @@ TEST_CASE(
const std::array<int, form::residual_block_count> residual_sizes{0, 7};
const blocks::form_layout<form> layout(value_sizes, residual_sizes);
constexpr auto density_value =
blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_value =
blocks::get_value_block<form>(blocks::displacement_field.geometry_term);
constexpr auto gravity_gradient_value =
blocks::get_value_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_potential_value =
blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_residual =
blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual =
blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
constexpr auto density_value = blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_value = blocks::get_value_block<form>(blocks::displacement_field.geometry_term);
constexpr auto gravity_gradient_value = blocks::get_value_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_potential_value = blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_residual = blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual = blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
CHECK(layout.size(density_value) == 3);
CHECK(layout.size(displacement_value) == 0);
@@ -446,18 +306,12 @@ TEST_CASE(
const std::array<int, form::residual_block_count> residual_sizes{13, 17};
const blocks::form_layout<form> layout(value_sizes, residual_sizes);
constexpr auto density_value =
blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_value =
blocks::get_value_block<form>(blocks::displacement_field.geometry_term);
constexpr auto gravity_gradient_value =
blocks::get_value_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_potential_value =
blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_residual =
blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual =
blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
constexpr auto density_value = blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_value = blocks::get_value_block<form>(blocks::displacement_field.geometry_term);
constexpr auto gravity_gradient_value = blocks::get_value_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_potential_value = blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto gravity_gradient_residual = blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual = blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
mfem::BlockVector values(layout.value_offsets());
mfem::BlockVector residuals(layout.residual_offsets());
@@ -504,24 +358,15 @@ TEST_CASE(
const std::array<int, form::residual_block_count> residual_sizes{13, 17};
const blocks::form_layout<form> layout(value_sizes, residual_sizes);
constexpr auto density_value =
blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto gravity_gradient_residual =
blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual =
blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
constexpr auto density_value = blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto gravity_gradient_residual = blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual = blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
mfem::DenseMatrix source_block(
layout.size(gravity_poisson_residual), layout.size(density_value)
);
mfem::DenseMatrix source_block(layout.size(gravity_poisson_residual), layout.size(density_value));
source_block = 1.0;
mfem::BlockOperator block_operator(
layout.residual_offsets(), layout.value_offsets()
);
block_operator.SetBlock(
gravity_poisson_residual, density_value, &source_block
);
mfem::BlockOperator block_operator(layout.residual_offsets(), layout.value_offsets());
block_operator.SetBlock(gravity_poisson_residual, density_value, &source_block);
mfem::BlockVector values(layout.value_offsets());
mfem::BlockVector residuals(layout.residual_offsets());
@@ -534,8 +379,7 @@ TEST_CASE(
CHECK(residuals.GetBlock(gravity_gradient_residual).Norml2() == 0.0);
const mfem::Vector &poisson_residual =
residuals.GetBlock(gravity_poisson_residual);
const mfem::Vector &poisson_residual = residuals.GetBlock(gravity_poisson_residual);
REQUIRE(poisson_residual.Size() == residual_sizes[1]);
for (int i = 0; i < poisson_residual.Size(); ++i) {
@@ -555,53 +399,19 @@ TEST_CASE(
STATIC_REQUIRE(blocks::gravity_jacobian_form::size == 2);
STATIC_REQUIRE(
std::is_same_v<
typename gradient_traits::residual,
blocks::gravity::gradient::residual>
);
STATIC_REQUIRE(std::is_same_v<typename gradient_traits::residual, blocks::gravity::gradient::residual>);
STATIC_REQUIRE(gradient_traits::value_count == 3);
STATIC_REQUIRE(
contains_type_v<
blocks::gravity::gradient::value, typename gradient_traits::values>
);
STATIC_REQUIRE(
contains_type_v<
blocks::gravity::poisson::value, typename gradient_traits::values>
);
STATIC_REQUIRE(
contains_type_v<
blocks::displacement::geometry::value,
typename gradient_traits::values>
);
STATIC_REQUIRE_FALSE(
contains_type_v<
blocks::density::mass::value, typename gradient_traits::values>
);
STATIC_REQUIRE(contains_type_v<blocks::gravity::gradient::value, typename gradient_traits::values>);
STATIC_REQUIRE(contains_type_v<blocks::gravity::poisson::value, typename gradient_traits::values>);
STATIC_REQUIRE(contains_type_v<blocks::displacement::geometry::value, typename gradient_traits::values>);
STATIC_REQUIRE_FALSE(contains_type_v<blocks::density::mass::value, typename gradient_traits::values>);
STATIC_REQUIRE(
std::is_same_v<
typename poisson_traits::residual,
blocks::gravity::poisson::residual>
);
STATIC_REQUIRE(std::is_same_v<typename poisson_traits::residual, blocks::gravity::poisson::residual>);
STATIC_REQUIRE(poisson_traits::value_count == 3);
STATIC_REQUIRE(
contains_type_v<
blocks::gravity::gradient::value, typename poisson_traits::values>
);
STATIC_REQUIRE(
contains_type_v<
blocks::density::mass::value, typename poisson_traits::values>
);
STATIC_REQUIRE(
contains_type_v<
blocks::displacement::geometry::value,
typename poisson_traits::values>
);
STATIC_REQUIRE_FALSE(
contains_type_v<
blocks::gravity::poisson::value, typename poisson_traits::values>
);
STATIC_REQUIRE(contains_type_v<blocks::gravity::gradient::value, typename poisson_traits::values>);
STATIC_REQUIRE(contains_type_v<blocks::density::mass::value, typename poisson_traits::values>);
STATIC_REQUIRE(contains_type_v<blocks::displacement::geometry::value, typename poisson_traits::values>);
STATIC_REQUIRE_FALSE(contains_type_v<blocks::gravity::poisson::value, typename poisson_traits::values>);
CHECK(true);
}
@@ -610,36 +420,23 @@ TEST_CASE(
"Barotropic Equilibrium Form Encodes The Agreed Row And Column Layouts",
tags::unit &tags::solver &tags::utils
) {
using form = blocks::barotropic_equilibrium_form;
using form = blocks::barotropic_equilibrium_form;
constexpr auto density_value =
blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_value =
blocks::get_value_block<form>(blocks::displacement_field.geometry_term);
constexpr auto gravity_gradient_value =
blocks::get_value_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_potential_value =
blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto enthalpy_value =
blocks::get_value_block<form>(blocks::enthalpy_field.specific_term);
constexpr auto barotropic_constant_value = blocks::get_value_block<form>(
blocks::barotropic_constant_field.mass_normalization_term
);
constexpr auto density_value = blocks::get_value_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_value = blocks::get_value_block<form>(blocks::displacement_field.geometry_term);
constexpr auto gravity_gradient_value = blocks::get_value_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_potential_value = blocks::get_value_block<form>(blocks::gravity_field.poisson_term);
constexpr auto enthalpy_value = blocks::get_value_block<form>(blocks::enthalpy_field.specific_term);
constexpr auto barotropic_constant_value =
blocks::get_value_block<form>(blocks::barotropic_constant_field.mass_normalization_term);
constexpr auto gravity_gradient_residual =
blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual =
blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
constexpr auto density_residual =
blocks::get_residual_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_residual = blocks::get_residual_block<form>(
blocks::displacement_field.geometry_term
);
constexpr auto enthalpy_residual =
blocks::get_residual_block<form>(blocks::enthalpy_field.specific_term);
constexpr auto mass_residual = blocks::get_residual_block<form>(
blocks::barotropic_constant_field.mass_normalization_term
);
constexpr auto gravity_gradient_residual = blocks::get_residual_block<form>(blocks::gravity_field.gradient_term);
constexpr auto gravity_poisson_residual = blocks::get_residual_block<form>(blocks::gravity_field.poisson_term);
constexpr auto density_residual = blocks::get_residual_block<form>(blocks::density_field.mass_term);
constexpr auto displacement_residual = blocks::get_residual_block<form>(blocks::displacement_field.geometry_term);
constexpr auto enthalpy_residual = blocks::get_residual_block<form>(blocks::enthalpy_field.specific_term);
constexpr auto mass_residual =
blocks::get_residual_block<form>(blocks::barotropic_constant_field.mass_normalization_term);
STATIC_REQUIRE(form::value_block_count == 6);
STATIC_REQUIRE(form::residual_block_count == 6);
@@ -678,48 +475,41 @@ TEST_CASE(
STATIC_REQUIRE(
row_has_exact_values_v<
gradient_row, blocks::gravity::gradient::value,
blocks::gravity::poisson::value,
gradient_row, blocks::gravity::gradient::value, blocks::gravity::poisson::value,
blocks::displacement::geometry::value>
);
STATIC_REQUIRE(
row_has_exact_values_v<
poisson_row, blocks::gravity::gradient::value,
blocks::density::mass::value, blocks::displacement::geometry::value>
);
STATIC_REQUIRE(
row_has_exact_values_v<
density_row, blocks::density::mass::value,
blocks::enthalpy::specific::value,
poisson_row, blocks::gravity::gradient::value, blocks::density::mass::value,
blocks::displacement::geometry::value>
);
STATIC_REQUIRE(
row_has_exact_values_v<
displacement_row, blocks::displacement::geometry::value,
blocks::enthalpy::specific::value>
);
STATIC_REQUIRE(
row_has_exact_values_v<
enthalpy_row, blocks::enthalpy::specific::value,
blocks::gravity::poisson::value,
blocks::displacement::geometry::value,
blocks::barotropic_constant::mass_normalization::value>
);
STATIC_REQUIRE(
row_has_exact_values_v<
mass_row, blocks::density::mass::value,
density_row, blocks::density::mass::value, blocks::enthalpy::specific::value,
blocks::displacement::geometry::value>
);
STATIC_REQUIRE(
row_has_exact_values_v<
displacement_row, blocks::density::mass::value, blocks::displacement::geometry::value,
blocks::gravity::gradient::value, blocks::enthalpy::specific::value>
);
STATIC_REQUIRE(
row_has_exact_values_v<
enthalpy_row, blocks::enthalpy::specific::value, blocks::gravity::poisson::value,
blocks::displacement::geometry::value, blocks::barotropic_constant::mass_normalization::value>
);
STATIC_REQUIRE(
row_has_exact_values_v<mass_row, blocks::density::mass::value, blocks::displacement::geometry::value>
);
STATIC_REQUIRE_FALSE(
blocks::has_jacobian_coupling_v<
blocks::displacement::geometry::residual,
blocks::gravity::poisson::value, jacobian>
blocks::displacement::geometry::residual, blocks::gravity::poisson::value, jacobian>
);
STATIC_REQUIRE_FALSE(
@@ -730,8 +520,7 @@ TEST_CASE(
STATIC_REQUIRE_FALSE(
blocks::has_jacobian_coupling_v<
blocks::barotropic_constant::mass_normalization::residual,
blocks::enthalpy::specific::value, jacobian>
blocks::barotropic_constant::mass_normalization::residual, blocks::enthalpy::specific::value, jacobian>
);
CHECK(true);
@@ -751,46 +540,36 @@ TEST_CASE(
using enthalpy_row = type_at_t<4, jacobian>;
using mass_row = type_at_t<5, jacobian>;
using missing_row = blocks::type_list<
gradient_row, poisson_row, density_row, displacement_row, enthalpy_row>;
using missing_row = blocks::type_list<gradient_row, poisson_row, density_row, displacement_row, enthalpy_row>;
using duplicate_row = blocks::type_list<
gradient_row, poisson_row, density_row, displacement_row, enthalpy_row,
enthalpy_row>;
using duplicate_row =
blocks::type_list<gradient_row, poisson_row, density_row, displacement_row, enthalpy_row, enthalpy_row>;
using reordered_rows = blocks::type_list<
poisson_row, gradient_row, density_row, displacement_row, enthalpy_row,
mass_row>;
using reordered_rows =
blocks::type_list<poisson_row, gradient_row, density_row, displacement_row, enthalpy_row, mass_row>;
using foreign_value_row = blocks::block_row<
blocks::enthalpy::specific::residual, blocks::enthalpy::specific::value,
blocks::gravity::poisson::value, blocks::displacement::geometry::value,
foreign_value>;
blocks::enthalpy::specific::residual, blocks::enthalpy::specific::value, blocks::gravity::poisson::value,
blocks::displacement::geometry::value, foreign_value>;
using foreign_value_jacobian = blocks::type_list<
gradient_row, poisson_row, density_row, displacement_row,
foreign_value_row, mass_row>;
using foreign_value_jacobian =
blocks::type_list<gradient_row, poisson_row, density_row, displacement_row, foreign_value_row, mass_row>;
using duplicate_value_row = blocks::block_row<
blocks::enthalpy::specific::residual, blocks::enthalpy::specific::value,
blocks::gravity::poisson::value, blocks::displacement::geometry::value,
blocks::barotropic_constant::mass_normalization::value,
blocks::enthalpy::specific::residual, blocks::enthalpy::specific::value, blocks::gravity::poisson::value,
blocks::displacement::geometry::value, blocks::barotropic_constant::mass_normalization::value,
blocks::barotropic_constant::mass_normalization::value>;
using duplicate_value_jacobian = blocks::type_list<
gradient_row, poisson_row, density_row, displacement_row,
duplicate_value_row, mass_row>;
using duplicate_value_jacobian =
blocks::type_list<gradient_row, poisson_row, density_row, displacement_row, duplicate_value_row, mass_row>;
using unknown_residual_row =
blocks::block_row<foreign_residual, blocks::density::mass::value>;
using unknown_residual_row = blocks::block_row<foreign_residual, blocks::density::mass::value>;
using unknown_residual_jacobian = blocks::type_list<
gradient_row, poisson_row, density_row, displacement_row, enthalpy_row,
unknown_residual_row>;
using unknown_residual_jacobian =
blocks::type_list<gradient_row, poisson_row, density_row, displacement_row, enthalpy_row, unknown_residual_row>;
using duplicate_value_form = blocks::block_form<
blocks::type_list<
blocks::density::mass::value, blocks::density::mass::value>,
blocks::type_list<blocks::density::mass::value, blocks::density::mass::value>,
blocks::type_list<blocks::density::mass::residual>>;
STATIC_REQUIRE(blocks::block_form_is_valid_v<form>);
@@ -804,17 +583,11 @@ TEST_CASE(
STATIC_REQUIRE_FALSE((blocks::valid_jacobian_form<form, reordered_rows>));
STATIC_REQUIRE_FALSE((
blocks::valid_jacobian_form<form, foreign_value_jacobian>
));
STATIC_REQUIRE_FALSE((blocks::valid_jacobian_form<form, foreign_value_jacobian>));
STATIC_REQUIRE_FALSE((
blocks::valid_jacobian_form<form, duplicate_value_jacobian>
));
STATIC_REQUIRE_FALSE((blocks::valid_jacobian_form<form, duplicate_value_jacobian>));
STATIC_REQUIRE_FALSE((
blocks::valid_jacobian_form<form, unknown_residual_jacobian>
));
STATIC_REQUIRE_FALSE((blocks::valid_jacobian_form<form, unknown_residual_jacobian>));
CHECK(true);
}
@@ -826,21 +599,17 @@ TEST_CASE(
using form = blocks::barotropic_equilibrium_form;
// Columns: [rho, d, g, Phi, h, C]
const std::array<int, form::value_block_count> value_sizes{11, 13, 17,
19, 23, 1};
const std::array<int, form::value_block_count> value_sizes{11, 13, 17, 19, 23, 1};
// Rows: [R_g, R_Phi, R_rho, R_d, R_h, R_M]
const std::array<int, form::residual_block_count> residual_sizes{17, 19, 11,
13, 23, 1};
const std::array<int, form::residual_block_count> residual_sizes{17, 19, 11, 13, 23, 1};
const blocks::form_layout<form> layout(value_sizes, residual_sizes);
constexpr auto constant_value = blocks::get_value_block<form>(
blocks::barotropic_constant_field.mass_normalization_term
);
constexpr auto mass_residual = blocks::get_residual_block<form>(
blocks::barotropic_constant_field.mass_normalization_term
);
constexpr auto constant_value =
blocks::get_value_block<form>(blocks::barotropic_constant_field.mass_normalization_term);
constexpr auto mass_residual =
blocks::get_residual_block<form>(blocks::barotropic_constant_field.mass_normalization_term);
CHECK(layout.size(constant_value) == 1);
CHECK(layout.size(mass_residual) == 1);
@@ -851,11 +620,7 @@ TEST_CASE(
CHECK(layout.value_offsets().Last() == 84);
CHECK(layout.residual_offsets().Last() == 84);
const std::array<int, form::value_block_count> invalid_value_sizes{11, 13,
17, 19,
23, 2};
const std::array<int, form::value_block_count> invalid_value_sizes{11, 13, 17, 19, 23, 2};
CHECK_THROWS(
blocks::form_layout<form>(invalid_value_sizes, residual_sizes)
);
CHECK_THROWS(blocks::form_layout<form>(invalid_value_sizes, residual_sizes));
}