Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implementation of nonlinear diffusion acceleration #209

Merged
merged 22 commits into from
Feb 5, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
39c5f5e
Added initializer that resets system at each call.
jsrehak Jan 12, 2021
b684e87
Added overload to BuildInitializer to specify type.
jsrehak Jan 25, 2021
00241b2
Added use_nda_ to framework parameters struct.
jsrehak Jan 20, 2021
a360d64
Added check for NDA usage to FrameworkValidator, requires angular flu…
jsrehak Jan 20, 2021
0b2b108
Removed deprecated Parse function from FrameworkValidator.
jsrehak Jan 21, 2021
3913253
Added problem::EquationType::DriftDiffusion.
jsrehak Jan 21, 2021
bd4ef59
Added NDA struct for required NDA data from higher order solve.
jsrehak Jan 21, 2021
b731c95
Added DriftDiffusion framework building.
jsrehak Jan 21, 2021
31b1224
Added storage of AngularFlux to SAAF when using NDA and no reflective…
jsrehak Feb 4, 2021
1ac7ad2
Moved expectation setting in tests for framework helper to their own …
jsrehak Jan 21, 2021
d1e55e8
Added interface to FrameworkHelper.
jsrehak Jan 21, 2021
fad9518
Added option to add subroutine FrameworkHelper to FrameworkHelper.
jsrehak Jan 21, 2021
b5561ea
Added testing and implementation of NDA building to FrameworkHelper.
jsrehak Jan 22, 2021
737448d
Added framework level to framework parameters, set new output filenam…
jsrehak Jan 26, 2021
f267580
Added Exposed message indication that a subroutine is running to Oute…
jsrehak Jan 26, 2021
5309ad0
added multi-slab test problem
jsrehak Feb 1, 2021
21aa398
Added rayleigh quotient version of multi_slab
jsrehak Feb 2, 2021
b187993
Added newline to the end of string announcing start and finish of sub…
jsrehak Feb 5, 2021
20862b4
Added missing expectations to FrameworkHelper::BadMaterialMapping.
jsrehak Feb 5, 2021
91840ff
Added missing virtual d'tor to FrameworkHelperI.
jsrehak Feb 5, 2021
50d9e44
added coverage threshold of 95% to codecov.yml
jsrehak Feb 5, 2021
dff320f
added multi-slab test problem using rayleigh and nda
jsrehak Feb 5, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added benchmarks/picca_2016/multi_slab/material_a
Binary file not shown.
Binary file added benchmarks/picca_2016/multi_slab/material_b
Binary file not shown.
1 change: 1 addition & 0 deletions benchmarks/picca_2016/multi_slab/multi_slab.material_map
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
21 changes: 21 additions & 0 deletions benchmarks/picca_2016/multi_slab/multi_slab.prm
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
set problem dimension = 1
set transport model = saaf
set number of groups = 1
set angular quadrature name = gauss_legendre
set angular quadrature order = 4
set do eigenvalue calculations = true
set reflective boundary names =

set x, y, z max values of boundary locations = 21
set number of cells for x, y, z directions = 21
set uniform refinements = 4
set number of materials = 2

set finite element polynomial degree = 1

set output file name base = multi_slab

subsection material ID map
set material id file name map = 0: material_a, 1: material_b
set material id file name = multi_slab.material_map
end
22 changes: 22 additions & 0 deletions benchmarks/picca_2016/multi_slab/multi_slab_rayleigh.prm
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
set problem dimension = 1
set transport model = saaf
set number of groups = 1
set angular quadrature name = gauss_legendre
set angular quadrature order = 4
set do eigenvalue calculations = true
set reflective boundary names =

set x, y, z max values of boundary locations = 21
set number of cells for x, y, z directions = 21
set uniform refinements = 4
set number of materials = 2

set finite element polynomial degree = 1
set k_effective updater type = rayleigh quotient

set output file name base = multi_slab_rayleigh

subsection material ID map
set material id file name map = 0: material_a, 1: material_b
set material id file name = multi_slab.material_map
end
23 changes: 23 additions & 0 deletions benchmarks/picca_2016/multi_slab/multi_slab_rayleigh_nda.prm
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
set problem dimension = 1
set transport model = saaf
set number of groups = 1
set angular quadrature name = gauss_legendre
set angular quadrature order = 4
set do eigenvalue calculations = true
set reflective boundary names =

set x, y, z max values of boundary locations = 21
set number of cells for x, y, z directions = 21
set uniform refinements = 4
set number of materials = 2

set finite element polynomial degree = 1
set k_effective updater type = rayleigh quotient

set output file name base = multi_slab_rayleigh
set do nda = true

subsection material ID map
set material id file name map = 0: material_a, 1: material_b
set material id file name = multi_slab.material_map
end
8 changes: 8 additions & 0 deletions codecov.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
coverage:
status:
project:
default:
target: 95%
patch:
default:
target: 95%
ignore:
- "**/tests/*"
- "**/BART/inc/**/*"
2 changes: 1 addition & 1 deletion src/domain/definition.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
#include "domain/definition_i.h"
#include "domain/finite_element/finite_element_i.h"
#include "domain/mesh/mesh_i.h"
#include "problem/parameter_types.h"
#include "problem/parameter_types.hpp"
#include "system/system_types.h"

namespace bart {
Expand Down
2 changes: 1 addition & 1 deletion src/domain/definition_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include <deal.II/lac/vector.h>

#include "domain/domain_types.h"
#include "problem/parameter_types.h"
#include "problem/parameter_types.hpp"
#include "system/system_types.h"
#include "utility/has_description.h"

Expand Down
2 changes: 1 addition & 1 deletion src/domain/finite_element/finite_element_gaussian.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include <memory>

#include "domain/finite_element/finite_element.h"
#include "problem/parameter_types.h"
#include "problem/parameter_types.hpp"

namespace bart {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include <deal.II/fe/fe_values.h>
#include <gtest/gtest.h>

#include "problem/parameter_types.h"
#include "problem/parameter_types.hpp"
#include "finite_element_test.hpp"
#include "test_helpers/gmock_wrapper.h"

Expand Down
2 changes: 1 addition & 1 deletion src/domain/mesh/mesh_cartesian.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#include <deal.II/base/utilities.h>

#include "domain/mesh/factory.hpp"
#include "problem/parameter_types.h"
#include "problem/parameter_types.hpp"

namespace bart::domain::mesh {

Expand Down
2 changes: 1 addition & 1 deletion src/domain/mesh/tests/mesh_cartesian_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

#include <deal.II/base/point.h>
#include <deal.II/grid/tria.h>
#include <problem/parameter_types.h>
#include <problem/parameter_types.hpp>

#include "test_helpers/test_helper_functions.h"
#include "test_helpers/gmock_wrapper.h"
Expand Down
2 changes: 1 addition & 1 deletion src/domain/tests/definition_mock.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include <deal.II/lac/vector.h>

#include "domain/definition_i.h"
#include "problem/parameter_types.h"
#include "problem/parameter_types.hpp"

#include "test_helpers/gmock_wrapper.h"

Expand Down
2 changes: 1 addition & 1 deletion src/domain/tests/definition_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
#include "test_helpers/gmock_wrapper.h"
#include "domain/mesh/tests/mesh_mock.h"
#include "domain/finite_element/tests/finite_element_mock.h"
#include "problem/parameter_types.h"
#include "problem/parameter_types.hpp"

namespace {

Expand Down
2 changes: 1 addition & 1 deletion src/formulation/updater/diffusion_updater.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
#include "formulation/updater/scattering_source_updater_i.h"
#include "formulation/updater/fission_source_updater_i.h"
#include "quadrature/quadrature_set_i.h"
#include "problem/parameter_types.h"
#include "problem/parameter_types.hpp"
#include "utility/has_description.h"

namespace bart {
Expand Down
2 changes: 1 addition & 1 deletion src/formulation/updater/saaf_updater.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include "formulation/updater/scattering_source_updater_i.h"
#include "formulation/updater/fission_source_updater_i.h"
#include "quadrature/quadrature_set_i.h"
#include "problem/parameter_types.h"
#include "problem/parameter_types.hpp"
#include "system/solution/solution_types.h"
#include "utility/has_description.h"

Expand Down
2 changes: 1 addition & 1 deletion src/formulation/updater/tests/updater_tests.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#include "test_helpers/gmock_wrapper.h"
#include "test_helpers/test_helper_functions.h"
#include "test_helpers/dealii_test_domain.h"
#include "problem/parameter_types.h"
#include "problem/parameter_types.hpp"

namespace bart {

Expand Down
20 changes: 17 additions & 3 deletions src/framework/builder/framework_builder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@

// Iteration classes
#include "iteration/initializer/initialize_fixed_terms_once.h"
#include "iteration/initializer/initialize_fixed_terms_reset_moments.hpp"
#include "iteration/group/group_solve_iteration.h"
#include "iteration/group/group_source_iteration.h"
#include "iteration/outer/outer_power_iteration.hpp"
Expand Down Expand Up @@ -350,18 +351,31 @@ auto FrameworkBuilder<dim>::BuildGroupSolution(const int n_angles) -> std::uniqu
template<int dim>
auto FrameworkBuilder<dim>::BuildInitializer(const std::shared_ptr<FixedTermUpdater>& updater_ptr,
const int total_groups,
const int total_angles) -> std::unique_ptr<Initializer> {
const int total_angles,
const InitializerName implementation) -> std::unique_ptr<Initializer> {
ReportBuildingComponant("Initializer");

std::unique_ptr<Initializer> return_ptr = nullptr;

using InitializeOnceType = iteration::initializer::InitializeFixedTermsOnce;
if (implementation == InitializerName::kInitializeFixedTermsOnce) {
using InitializeOnceType = iteration::initializer::InitializeFixedTermsOnce;
return_ptr = std::move(std::make_unique<InitializeOnceType>(updater_ptr, total_groups, total_angles));
} else if (implementation == InitializerName::kInitializeFixedTermsAndResetMoments) {
using InitializeAndResetMoments = iteration::initializer::InitializeFixedTermsResetMoments;
return_ptr = std::move(std::make_unique<InitializeAndResetMoments>(updater_ptr, total_groups, total_angles));
}

return_ptr = std::move(std::make_unique<InitializeOnceType>(updater_ptr, total_groups, total_angles));
ReportBuildSuccess(return_ptr->description());
return return_ptr;
}

template<int dim>
auto FrameworkBuilder<dim>::BuildInitializer(const std::shared_ptr<FixedTermUpdater>& updater_ptr,
const int total_groups,
const int total_angles) -> std::unique_ptr<Initializer> {
return BuildInitializer(updater_ptr, total_groups, total_angles, InitializerName::kInitializeFixedTermsOnce);
}

template<int dim>
auto FrameworkBuilder<dim>::BuildKEffectiveUpdater() -> std::unique_ptr<KEffectiveUpdater> {
using ReturnType = eigenvalue::k_effective::UpdaterViaRayleighQuotient;
Expand Down
5 changes: 5 additions & 0 deletions src/framework/builder/framework_builder.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class FrameworkBuilder : public data_port::StatusDataPort, public FrameworkBuild

using typename FrameworkBuilderI<dim>::DiffusionFormulationImpl;
using typename FrameworkBuilderI<dim>::MomentCalculatorImpl;
using typename FrameworkBuilderI<dim>::InitializerName;

using typename FrameworkBuilderI<dim>::ColorStatusPair;
using typename FrameworkBuilderI<dim>::ColorStatusInstrument;
Expand Down Expand Up @@ -100,6 +101,10 @@ class FrameworkBuilder : public data_port::StatusDataPort, public FrameworkBuild
[[nodiscard]] auto BuildInitializer(const std::shared_ptr<FixedTermUpdater>&,
const int total_groups,
const int total_angles) -> std::unique_ptr<Initializer> override;
[[nodiscard]] auto BuildInitializer(const std::shared_ptr<FixedTermUpdater>&,
const int total_groups,
const int total_angles,
const InitializerName) -> std::unique_ptr<Initializer> override;
[[nodiscard]] auto BuildKEffectiveUpdater() -> std::unique_ptr<KEffectiveUpdater> override;
[[nodiscard]] auto BuildKEffectiveUpdater(
const std::shared_ptr<FiniteElement>&,
Expand Down
8 changes: 7 additions & 1 deletion src/framework/builder/framework_builder_i.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,11 @@
#include "iteration/group/group_solve_iteration_i.h"
#include "iteration/outer/outer_iteration_i.hpp"
#include "iteration/subroutine/subroutine_i.hpp"
#include "iteration/initializer/factory.hpp"
#include "quadrature/calculators/spherical_harmonic_moments_i.h"
#include "quadrature/calculators/angular_flux_integrator_i.hpp"
#include "quadrature/quadrature_set_i.h"
#include "problem/parameter_types.h"
#include "problem/parameter_types.hpp"
#include "solver/group/single_group_solver_i.h"
#include "system/moments/spherical_harmonic_i.h"
#include "system/moments/spherical_harmonic_types.h"
Expand Down Expand Up @@ -79,6 +80,7 @@ class FrameworkBuilderI {

// Implementation specifiers
using DiffusionFormulationImpl = formulation::DiffusionFormulationImpl;
using InitializerName = iteration::initializer::InitializerName;
using MomentCalculatorImpl = quadrature::MomentCalculatorImpl;
using SubroutineName = iteration::subroutine::SubroutineName;

Expand Down Expand Up @@ -126,6 +128,10 @@ class FrameworkBuilderI {
virtual auto BuildInitializer(const std::shared_ptr<FixedTermUpdater>&,
const int total_groups,
const int total_angles) -> std::unique_ptr<Initializer> = 0;
virtual auto BuildInitializer(const std::shared_ptr<FixedTermUpdater>&,
const int total_groups,
const int total_angles,
const InitializerName) -> std::unique_ptr<Initializer> = 0;
virtual auto BuildKEffectiveUpdater() -> std::unique_ptr<KEffectiveUpdater> = 0;
virtual auto BuildKEffectiveUpdater(
const std::shared_ptr<FiniteElement>&,
Expand Down
22 changes: 3 additions & 19 deletions src/framework/builder/framework_validator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,26 +32,10 @@ auto FrameworkValidator::Parse(const framework::FrameworkParameters parameters)
}

// Check for required angular solution storage
if (!parameters.reflective_boundaries.empty() &&
parameters.equation_type == problem::EquationType::kSelfAdjointAngularFlux) {
needed_parts_.insert(FrameworkPart::AngularSolutionStorage);
}
}

void FrameworkValidator::Parse(const problem::ParametersI& to_parse) {
needed_parts_ = {FrameworkPart::ScatteringSourceUpdate};
if (to_parse.IsEigenvalueProblem())
needed_parts_.insert(FrameworkPart::FissionSourceUpdate);

const auto reflective_boundary = to_parse.ReflectiveBoundary();
bool has_reflective = std::any_of(
reflective_boundary.begin(),
reflective_boundary.end(),
[](std::pair<problem::Boundary, bool> pair){ return pair.second; });

if (has_reflective &&
to_parse.TransportModel() == problem::EquationType::kSelfAdjointAngularFlux) {
if (const bool equation_type_is_saaf{ parameters.equation_type == problem::EquationType::kSelfAdjointAngularFlux};
parameters.use_nda_ || (!parameters.reflective_boundaries.empty() && equation_type_is_saaf)) {
needed_parts_.insert(FrameworkPart::AngularSolutionStorage);
if (parameters.use_nda_) AssertThrow(equation_type_is_saaf, dealii::ExcMessage("NDA requires angular solve"))
}
}

Expand Down
1 change: 0 additions & 1 deletion src/framework/builder/framework_validator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class FrameworkValidator : public FrameworkValidatorI,
public:
auto AddPart(const FrameworkPart to_add) -> FrameworkValidator& override;
auto Parse(const framework::FrameworkParameters) -> void override;
auto Parse(const problem::ParametersI& to_parse) -> void override;
auto ReportValidation() -> void override;

[[nodiscard]] auto HasNeededParts() const -> bool override { return needed_parts_.size() > 0; }
Expand Down
1 change: 0 additions & 1 deletion src/framework/builder/framework_validator_i.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ class FrameworkValidatorI {
virtual ~FrameworkValidatorI() = default;
virtual auto AddPart(const FrameworkPart to_add) -> FrameworkValidatorI& = 0;
virtual auto Parse(const framework::FrameworkParameters) -> void = 0;
virtual auto Parse(const problem::ParametersI& to_parse) -> void = 0;
virtual auto ReportValidation() -> void = 0;

virtual auto HasNeededParts() const -> bool = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include "solver/group/single_group_solver.h"
#include "system/solution/mpi_group_angular_solution.h"
#include "iteration/initializer/initialize_fixed_terms_once.h"
#include "iteration/initializer/initialize_fixed_terms_reset_moments.hpp"
#include "iteration/group/group_source_iteration.h"
#include "iteration/subroutine/get_scalar_flux_from_framework.hpp"
#include "system/system_types.h"
Expand Down Expand Up @@ -877,9 +878,9 @@ TYPED_TEST(FrameworkBuilderIntegrationTest, BuildSystem) {
class FrameworkBuilderIntegrationNonDimTest
: public FrameworkBuilderIntegrationTest<bart::testing::OneD> {};

TEST_F(FrameworkBuilderIntegrationNonDimTest, BuildInitializer) {
auto fixed_updater_ptr =
std::make_shared<formulation::updater::FixedUpdaterMock>();
TEST_F(FrameworkBuilderIntegrationNonDimTest, BuildDefaultInitializer) {
using InitializerName = iteration::initializer::InitializerName;
auto fixed_updater_ptr = std::make_shared<formulation::updater::FixedUpdaterMock>();

using ExpectedType = iteration::initializer::InitializeFixedTermsOnce;
const int total_groups = bart::test_helpers::RandomDouble(1, 10);
Expand All @@ -895,4 +896,42 @@ TEST_F(FrameworkBuilderIntegrationNonDimTest, BuildInitializer) {
EXPECT_EQ(dynamic_ptr->total_groups(), total_groups);
}

TEST_F(FrameworkBuilderIntegrationNonDimTest, BuildInitializerFixedOnceSpecified) {
using InitializerName = iteration::initializer::InitializerName;
auto fixed_updater_ptr = std::make_shared<formulation::updater::FixedUpdaterMock>();

using ExpectedType = iteration::initializer::InitializeFixedTermsOnce;
const int total_groups = bart::test_helpers::RandomDouble(1, 10);
const int total_angles = total_groups + 1;

auto initializer_ptr = this->test_builder_ptr_->BuildInitializer(fixed_updater_ptr,
total_groups,
total_angles,
InitializerName::kInitializeFixedTermsOnce);
auto dynamic_ptr = dynamic_cast<ExpectedType*>(initializer_ptr.get());
ASSERT_NE(initializer_ptr, nullptr);
ASSERT_NE(dynamic_ptr, nullptr);
EXPECT_EQ(dynamic_ptr->total_angles(), total_angles);
EXPECT_EQ(dynamic_ptr->total_groups(), total_groups);
}

TEST_F(FrameworkBuilderIntegrationNonDimTest, BuildInitializerResetMoments) {
using InitializerName = iteration::initializer::InitializerName;
auto fixed_updater_ptr = std::make_shared<formulation::updater::FixedUpdaterMock>();

using ExpectedType = iteration::initializer::InitializeFixedTermsResetMoments;
const int total_groups = bart::test_helpers::RandomDouble(1, 10);
const int total_angles = total_groups + 1;

auto initializer_ptr = this->test_builder_ptr_->BuildInitializer(fixed_updater_ptr,
total_groups,
total_angles,
InitializerName::kInitializeFixedTermsAndResetMoments);
auto dynamic_ptr = dynamic_cast<ExpectedType*>(initializer_ptr.get());
ASSERT_NE(initializer_ptr, nullptr);
ASSERT_NE(dynamic_ptr, nullptr);
EXPECT_EQ(dynamic_ptr->total_angles(), total_angles);
EXPECT_EQ(dynamic_ptr->total_groups(), total_groups);
}

} // namespace
Loading