Skip to content
Snippets Groups Projects
Commit d3962073 authored by Tobias Leibner's avatar Tobias Leibner
Browse files

[momentmodels] fix 2d checkerboard

parent 28e5bc5f
No related branches found
No related tags found
No related merge requests found
Pipeline #38670 failed
...@@ -41,6 +41,7 @@ public: ...@@ -41,6 +41,7 @@ public:
using BoundaryValueType = InitialValueType; using BoundaryValueType = InitialValueType;
using MatrixType = typename Dune::DynamicMatrix<RangeFieldType>; using MatrixType = typename Dune::DynamicMatrix<RangeFieldType>;
using DomainType = typename InitialValueType::DomainType; using DomainType = typename InitialValueType::DomainType;
using BasisDomainType = typename MomentBasis::DomainType;
using StateType = typename FluxType::StateType; using StateType = typename FluxType::StateType;
using RangeReturnType = typename InitialValueType::RangeReturnType; using RangeReturnType = typename InitialValueType::RangeReturnType;
using DynamicRangeType = Dune::DynamicVector<RangeFieldType>; using DynamicRangeType = Dune::DynamicVector<RangeFieldType>;
......
...@@ -38,6 +38,7 @@ public: ...@@ -38,6 +38,7 @@ public:
using BaseType::dimFlux; using BaseType::dimFlux;
using BaseType::dimRange; using BaseType::dimRange;
using BaseType::dimRangeCols; using BaseType::dimRangeCols;
using typename BaseType::BasisDomainType;
using typename BaseType::DomainFieldType; using typename BaseType::DomainFieldType;
using typename BaseType::DomainType; using typename BaseType::DomainType;
using typename BaseType::GenericFluxFunctionType; using typename BaseType::GenericFluxFunctionType;
...@@ -57,7 +58,8 @@ public: ...@@ -57,7 +58,8 @@ public:
using DynamicFluxJacobianRangeType = typename FluxType::LocalFunctionType::DynamicJacobianRangeType; using DynamicFluxJacobianRangeType = typename FluxType::LocalFunctionType::DynamicJacobianRangeType;
using GenericScalarFunctionType = XT::Functions::GenericFunction<dimFlux, 1, 1, RangeFieldType>; using GenericScalarFunctionType = XT::Functions::GenericFunction<dimFlux, 1, 1, RangeFieldType>;
using ConstantScalarFunctionType = XT::Functions::ConstantFunction<dimFlux, 1, 1, RangeFieldType>; using ConstantScalarFunctionType = XT::Functions::ConstantFunction<dimFlux, 1, 1, RangeFieldType>;
using BoundaryDistributionType = std::function<std::function<RangeFieldType(const DomainType&)>(const DomainType&)>; using BoundaryDistributionType =
std::function<std::function<RangeFieldType(const BasisDomainType&)>(const DomainType&)>;
using BaseType::default_boundary_cfg; using BaseType::default_boundary_cfg;
using BaseType::default_grid_cfg; using BaseType::default_grid_cfg;
...@@ -126,26 +128,26 @@ public: ...@@ -126,26 +128,26 @@ public:
const auto M_T = basis_functions_.mass_matrix(); // mass matrix is symmetric const auto M_T = basis_functions_.mass_matrix(); // mass matrix is symmetric
// solve // solve
DynamicVector<RangeFieldType> tmp_row(M_T.N(), 0.); DynamicVector<RangeFieldType> tmp_row(M_T.N(), 0.);
for (size_t dd = 0; dd < dimDomain; ++dd) { for (size_t dd = 0; dd < dimFlux; ++dd) {
for (size_t ii = 0; ii < M_T.N(); ++ii) { for (size_t ii = 0; ii < M_T.N(); ++ii) {
solve(M_T, tmp_row, A[dd][ii], basis_functions_); solve(M_T, tmp_row, A[dd][ii], basis_functions_);
A[dd][ii] = tmp_row; A[dd][ii] = tmp_row;
} }
} }
auto order_func = [](const XT::Common::Parameter&) -> int { return 1; }; auto order_func = [](const XT::Common::Parameter&) -> int { return 1; };
DynamicVector<XT::LA::CommonDenseMatrix<RangeFieldType>> A_la(dimDomain); DynamicVector<XT::LA::CommonDenseMatrix<RangeFieldType>> A_la(dimFlux);
for (size_t dd = 0; dd < dimDomain; ++dd) for (size_t dd = 0; dd < dimFlux; ++dd)
A_la[dd] = A[dd]; A_la[dd] = A[dd];
auto eval_func = auto eval_func =
[A_la](const DomainType&, const StateType& u, DynamicFluxRangeType& ret, const XT::Common::Parameter&) { [A_la](const DomainType&, const StateType& u, DynamicFluxRangeType& ret, const XT::Common::Parameter&) {
for (size_t dd = 0; dd < dimDomain; ++dd) { for (size_t dd = 0; dd < dimFlux; ++dd) {
auto row_view = ret[dd]; auto row_view = ret[dd];
A_la[dd].mv(u, row_view); A_la[dd].mv(u, row_view);
} }
}; };
auto jacobian_func = auto jacobian_func =
[A_la](const DomainType&, const StateType&, DynamicFluxJacobianRangeType& ret, const XT::Common::Parameter&) { [A_la](const DomainType&, const StateType&, DynamicFluxJacobianRangeType& ret, const XT::Common::Parameter&) {
for (size_t dd = 0; dd < dimDomain; ++dd) for (size_t dd = 0; dd < dimFlux; ++dd)
ret[dd] = A_la[dd]; ret[dd] = A_la[dd];
}; };
return std::make_unique<GenericFluxFunctionType>(order_func, return std::make_unique<GenericFluxFunctionType>(order_func,
...@@ -177,7 +179,7 @@ public: ...@@ -177,7 +179,7 @@ public:
virtual BoundaryDistributionType boundary_distribution() const virtual BoundaryDistributionType boundary_distribution() const
{ {
return [this](const DomainType&) { return [this](const DomainType&) { return this->psi_vac_; }; }; return [this](const DomainType&) { return [this](const BasisDomainType&) { return this->psi_vac_; }; };
} }
RangeReturnType RangeReturnType
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment