diff --git a/CHANGELOG.md b/CHANGELOG.md index 496998179e0b5d9158c0c2f058abaddba41273ab..0e91d76c92abe09f34ee163c1e4ed5c0c3b2f955 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ be evaluated with the function values provided in the same order as the names wh ### Immediate interface changes not allowing/requiring a deprecation period: - __Newton__: The Newton solver no longer supports linear solvers without a `norm` interface when computing the resisual norm is required. The linear solvers available in Dumux all have such an interface. +- __MultiDomain__: The MDTraits are now required to state the LocalResidual type in the Subdomain policy (see multidomain/traits.hh). This only affects users that created their own MDTraits and don't use the default MDTraits. ### Deprecated properties/classes/functions/files, to be removed after 3.8: diff --git a/dumux/assembly/cvfelocalassembler.hh b/dumux/assembly/cvfelocalassembler.hh index e6bcf1fbe82e10e7e41b918431a5f1641633cdc2..a057f660c233821e51004631582e23f99f760954 100644 --- a/dumux/assembly/cvfelocalassembler.hh +++ b/dumux/assembly/cvfelocalassembler.hh @@ -326,7 +326,7 @@ class CVFELocalAssembler<TypeTag, Assembler, DiffMethod::numeric, /*implicit=*/t public: - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; + using LocalResidual = typename ParentType::LocalResidual; using ElementResidualVector = typename LocalResidual::ElementResidualVector; using ParentType::ParentType; @@ -475,7 +475,7 @@ class CVFELocalAssembler<TypeTag, Assembler, DiffMethod::numeric, /*implicit=*/f public: - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; + using LocalResidual = typename ParentType::LocalResidual; using ElementResidualVector = typename LocalResidual::ElementResidualVector; using ParentType::ParentType; @@ -584,7 +584,7 @@ class CVFELocalAssembler<TypeTag, Assembler, DiffMethod::analytic, /*implicit=*/ public: - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; + using LocalResidual = typename ParentType::LocalResidual; using ElementResidualVector = typename LocalResidual::ElementResidualVector; using ParentType::ParentType; @@ -704,7 +704,7 @@ class CVFELocalAssembler<TypeTag, Assembler, DiffMethod::analytic, /*implicit=*/ public: - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; + using LocalResidual = typename ParentType::LocalResidual; using ElementResidualVector = typename LocalResidual::ElementResidualVector; using ParentType::ParentType; diff --git a/dumux/assembly/fclocalassembler.hh b/dumux/assembly/fclocalassembler.hh index 54c0ec0bef130818c309720cce3c2dfe9c9606f2..10a9ce1408b5f0437e99082dfdf96fc87ec2cc8a 100644 --- a/dumux/assembly/fclocalassembler.hh +++ b/dumux/assembly/fclocalassembler.hh @@ -313,7 +313,7 @@ class FaceCenteredLocalAssembler<TypeTag, Assembler, DiffMethod::numeric, /*impl public: - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; + using LocalResidual = typename ParentType::LocalResidual; using ElementResidualVector = typename LocalResidual::ElementResidualVector; using ParentType::ParentType; @@ -521,7 +521,7 @@ class FaceCenteredLocalAssembler<TypeTag, Assembler, DiffMethod::numeric, /*impl enum { numEq = GetPropType<TypeTag, Properties::ModelTraits>::numEq() }; public: - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; + using LocalResidual = typename ParentType::LocalResidual; using ElementResidualVector = typename LocalResidual::ElementResidualVector; using ParentType::ParentType; @@ -633,7 +633,7 @@ class FaceCenteredLocalAssembler<TypeTag, Assembler, DiffMethod::analytic, /*imp enum { numEq = GetPropType<TypeTag, Properties::ModelTraits>::numEq() }; public: - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; + using LocalResidual = typename ParentType::LocalResidual; using ElementResidualVector = typename LocalResidual::ElementResidualVector; using ParentType::ParentType; @@ -756,7 +756,7 @@ class FaceCenteredLocalAssembler<TypeTag, Assembler, DiffMethod::analytic, /*imp enum { numEq = GetPropType<TypeTag, Properties::ModelTraits>::numEq() }; public: - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; + using LocalResidual = typename ParentType::LocalResidual; using ElementResidualVector = typename LocalResidual::ElementResidualVector; using ParentType::ParentType; diff --git a/dumux/assembly/fvlocalassemblerbase.hh b/dumux/assembly/fvlocalassemblerbase.hh index c26cec659124d9742dea2d8c631b5d6deb0933d8..51790248bc09fdd65cac3558228c79dd5a5167f3 100644 --- a/dumux/assembly/fvlocalassemblerbase.hh +++ b/dumux/assembly/fvlocalassemblerbase.hh @@ -52,7 +52,7 @@ class FVLocalAssemblerBase static constexpr auto numEq = GetPropType<TypeTag, Properties::ModelTraits>::numEq(); public: - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; + using LocalResidual = std::decay_t<decltype(std::declval<Assembler>().localResidual())>; using ElementResidualVector = typename LocalResidual::ElementResidualVector; /*! diff --git a/dumux/geomechanics/poroelastic/couplingmanager.hh b/dumux/geomechanics/poroelastic/couplingmanager.hh index bfcf73137d7fa48dd5fa5a2feab397c87758c0ac..4d1da76a8d8ada5536a5e0515f03b413b114c394 100644 --- a/dumux/geomechanics/poroelastic/couplingmanager.hh +++ b/dumux/geomechanics/poroelastic/couplingmanager.hh @@ -47,7 +47,6 @@ class PoroMechanicsCouplingManager : public virtual CouplingManager< MDTraits > // further types specific to the sub-problems template<std::size_t id> using Scalar = GetPropType<SubDomainTypeTag<id>, Properties::Scalar>; template<std::size_t id> using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>; - template<std::size_t id> using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>; template<std::size_t id> using GridVariables = GetPropType<SubDomainTypeTag<id>, Properties::GridVariables>; template<std::size_t id> using PrimaryVariables = typename GridVariables<id>::PrimaryVariables; template<std::size_t id> using GridVolumeVariables = typename GridVariables<id>::GridVolumeVariables; @@ -293,11 +292,10 @@ public: * and the storage term here. */ template< class PMFlowLocalAssembler > - typename LocalResidual<PMFlowId>::ElementResidualVector - evalCouplingResidual(Dune::index_constant<PMFlowId> pmFlowDomainId, - const PMFlowLocalAssembler& pmFlowLocalAssembler, - Dune::index_constant<PoroMechId> poroMechDomainId, - GridIndexType<PoroMechId> dofIdxGlobalJ) + auto evalCouplingResidual(Dune::index_constant<PMFlowId> pmFlowDomainId, + const PMFlowLocalAssembler& pmFlowLocalAssembler, + Dune::index_constant<PoroMechId> poroMechDomainId, + GridIndexType<PoroMechId> dofIdxGlobalJ) { auto res = pmFlowLocalAssembler.localResidual().evalFluxAndSource(pmFlowLocalAssembler.element(), pmFlowLocalAssembler.fvGeometry(), @@ -322,11 +320,10 @@ public: * the fluxes as well as the source term here. */ template< class PoroMechLocalAssembler > - typename LocalResidual<PoroMechId>::ElementResidualVector - evalCouplingResidual(Dune::index_constant<PoroMechId> poroMechDomainId, - const PoroMechLocalAssembler& poroMechLocalAssembler, - Dune::index_constant<PMFlowId> pmFlowDomainId, - GridIndexType<PMFlowId> dofIdxGlobalJ) + auto evalCouplingResidual(Dune::index_constant<PoroMechId> poroMechDomainId, + const PoroMechLocalAssembler& poroMechLocalAssembler, + Dune::index_constant<PMFlowId> pmFlowDomainId, + GridIndexType<PMFlowId> dofIdxGlobalJ) { return poroMechLocalAssembler.localResidual().evalFluxAndSource(poroMechLocalAssembler.element(), poroMechLocalAssembler.fvGeometry(), diff --git a/dumux/multidomain/assemblerview.hh b/dumux/multidomain/assemblerview.hh new file mode 100644 index 0000000000000000000000000000000000000000..c6ff03bbdaad90c2b3a30986111009ee4cacefc4 --- /dev/null +++ b/dumux/multidomain/assemblerview.hh @@ -0,0 +1,66 @@ +// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- +// vi: set et ts=4 sw=4 sts=4: +// +// SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder +// SPDX-License-Identifier: GPL-3.0-or-later +// +/*! + * \file + * \ingroup MultiDomain + * \ingroup Assembly + * \brief Subdomain-specific views on multidomain assemblers. + */ +#ifndef DUMUX_MULTIDOMAIN_ASSEMBLER_VIEW_HH +#define DUMUX_MULTIDOMAIN_ASSEMBLER_VIEW_HH + +namespace Dumux { + +/*! + * \ingroup MultiDomain + * \ingroup Assembly + * \brief Subdomain-specific view on a multidomain assembler. + * Allows retrieval of sub-domain specific objects w/o passing a domain id. + * \todo This is not necessarily fv-specifiv (could be in other header). + * \todo Can we get rid of some of the interfaces? + */ +template<typename MDAssembler, std::size_t domainId> +class MultiDomainAssemblerSubDomainView +{ + static constexpr Dune::index_constant<domainId> myId{}; + +public: + using CouplingManager = typename MDAssembler::CouplingManager; + using SolutionVector = typename MDAssembler::SolutionVector; + + MultiDomainAssemblerSubDomainView(MDAssembler& assembler, Dune::index_constant<domainId>) + : assembler_{assembler} + {} + + template<std::size_t i> + auto localResidual(Dune::index_constant<i> id) const { return assembler_.localResidual(id); } + auto localResidual() const { return assembler_.localResidual(myId); } + + template<std::size_t i> + const auto& problem(Dune::index_constant<i> id) const { return assembler_.problem(id); } + const auto& problem() const { return assembler_.problem(myId); } + + template<std::size_t i> + const auto& gridGeometry(Dune::index_constant<i> id) const { return assembler_.gridGeometry(id); } + const auto& gridGeometry() const { return assembler_.gridGeometry(myId); } + + template<std::size_t i> + const auto& gridVariables(Dune::index_constant<i> id) const { return assembler_.gridVariables(id); } + const auto& gridVariables() const { return assembler_.gridVariables(myId); } + + const auto& prevSol() const { return assembler_.prevSol(); } + bool isStationaryProblem() const { return assembler_.isStationaryProblem(); } + + static constexpr bool isImplicit() { return MDAssembler::isImplicit(); } + +private: + MDAssembler& assembler_; +}; + +} // end namespace Dumux + +#endif diff --git a/dumux/multidomain/facet/box/couplingmanager.hh b/dumux/multidomain/facet/box/couplingmanager.hh index 2e79e1f8b8161a436910f29037f9cd5fb3861bdf..dbfe8ab4d49885239991fe0d65b2fe73b24b44b1 100644 --- a/dumux/multidomain/facet/box/couplingmanager.hh +++ b/dumux/multidomain/facet/box/couplingmanager.hh @@ -55,7 +55,7 @@ class FacetCouplingManager<MDTraits, CouplingMapper, bulkDomainId, lowDimDomainI template<std::size_t id> using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>; template<std::size_t id> using NumEqVector = Dumux::NumEqVector<PrimaryVariables<id>>; template<std::size_t id> using ElementBoundaryTypes = GetPropType<SubDomainTypeTag<id>, Properties::ElementBoundaryTypes>; - template<std::size_t id> using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>; + template<std::size_t id> using LocalResidual = typename MDTraits::template SubDomain<id>::LocalResidual; template<std::size_t id> using GridGeometry = GetPropType<SubDomainTypeTag<id>, Properties::GridGeometry>; template<std::size_t id> using FVElementGeometry = typename GridGeometry<id>::LocalView; diff --git a/dumux/multidomain/facet/cellcentered/mpfa/couplingmanager.hh b/dumux/multidomain/facet/cellcentered/mpfa/couplingmanager.hh index 056e342116a4b4d28358c2533f3edac61fe56e51..4421089b69198fe753561a490dcb1c2e6c7690fa 100644 --- a/dumux/multidomain/facet/cellcentered/mpfa/couplingmanager.hh +++ b/dumux/multidomain/facet/cellcentered/mpfa/couplingmanager.hh @@ -65,7 +65,7 @@ class FacetCouplingManager<MDTraits, CouplingMapper, bulkDomainId, lowDimDomainI template<std::size_t id> using GridView = typename GridGeometry<id>::GridView; template<std::size_t id> using GridIndexType = typename IndexTraits< GridView<id> >::GridIndex; template<std::size_t id> using Element = typename GridView<id>::template Codim<0>::Entity; - template<std::size_t id> using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>; + template<std::size_t id> using LocalResidual = typename MDTraits::template SubDomain<id>::LocalResidual; template<std::size_t id> using GridVariables = GetPropType<SubDomainTypeTag<id>, Properties::GridVariables>; template<std::size_t id> using GridVolumeVariables = typename GridVariables<id>::GridVolumeVariables; diff --git a/dumux/multidomain/facet/cellcentered/tpfa/couplingmanager.hh b/dumux/multidomain/facet/cellcentered/tpfa/couplingmanager.hh index 362d5156c853d4c60d096e37f60b98512df6779c..fc9a2f2fe5c948d4a1133b2a251267b9f356c3fe 100644 --- a/dumux/multidomain/facet/cellcentered/tpfa/couplingmanager.hh +++ b/dumux/multidomain/facet/cellcentered/tpfa/couplingmanager.hh @@ -55,7 +55,7 @@ class FacetCouplingManager<MDTraits, CouplingMapper, bulkDomainId, lowDimDomainI template<std::size_t id> using PrimaryVariables = GetPropType<SubDomainTypeTag<id>, Properties::PrimaryVariables>; template<std::size_t id> using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>; template<std::size_t id> using NumEqVector = Dumux::NumEqVector<PrimaryVariables<id>>; - template<std::size_t id> using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>; + template<std::size_t id> using LocalResidual = typename MDTraits::template SubDomain<id>::LocalResidual; template<std::size_t id> using GridGeometry = GetPropType<SubDomainTypeTag<id>, Properties::GridGeometry>; template<std::size_t id> using FVElementGeometry = typename GridGeometry<id>::LocalView; diff --git a/dumux/multidomain/facet/couplingmanager.hh b/dumux/multidomain/facet/couplingmanager.hh index 8bfbc9a0298e6368eff8cd21176c22cc37813d55..da7122e8981caa33df4f93ff149aa42ee4c78adf 100644 --- a/dumux/multidomain/facet/couplingmanager.hh +++ b/dumux/multidomain/facet/couplingmanager.hh @@ -118,7 +118,6 @@ class FacetCouplingThreeDomainManager template<std::size_t id> using SubDomainTypeTag = typename MDTraits::template SubDomain<id>::TypeTag; // further types specific to the sub-problems - template<std::size_t id> using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>; template<std::size_t id> using PrimaryVariables = GetPropType<SubDomainTypeTag<id>, Properties::PrimaryVariables>; template<std::size_t id> using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>; @@ -257,13 +256,13 @@ public: std::size_t j, class LocalAssembler, std::enable_if_t<((i==bulkId && j==edgeId) || ((i==edgeId && j==bulkId))), int> = 0> - typename LocalResidual<i>::ElementResidualVector + typename LocalAssembler::LocalResidual::ElementResidualVector evalCouplingResidual(Dune::index_constant<i> domainI, const LocalAssembler& localAssembler, Dune::index_constant<j> domainJ, GridIndexType<j> dofIdxGlobalJ) { - typename LocalResidual<i>::ElementResidualVector res(1); + typename LocalAssembler::LocalResidual::ElementResidualVector res(1); res = 0.0; return res; } diff --git a/dumux/multidomain/fvassembler.hh b/dumux/multidomain/fvassembler.hh index 95b0800280a61677c51a508fb26a23ca33f0e294..d619eba11fb582f843cf271c32a461b85de1afb7 100644 --- a/dumux/multidomain/fvassembler.hh +++ b/dumux/multidomain/fvassembler.hh @@ -36,6 +36,7 @@ #include "subdomaincvfelocalassembler.hh" #include "subdomainstaggeredlocalassembler.hh" #include "subdomainfclocalassembler.hh" +#include "assemblerview.hh" #include <dumux/discretization/method.hh> @@ -124,37 +125,40 @@ private: using TimeLoop = TimeLoopBase<Scalar>; using ThisType = MultiDomainFVAssembler<MDTraits, CouplingManager, diffMethod, isImplicit()>; + template<std::size_t id> + using SubDomainAssemblerView = MultiDomainAssemblerSubDomainView<ThisType, id>; + template<class DiscretizationMethod, std::size_t id> struct SubDomainAssemblerType; template<std::size_t id> struct SubDomainAssemblerType<DiscretizationMethods::CCTpfa, id> { - using type = SubDomainCCLocalAssembler<id, SubDomainTypeTag<id>, ThisType, diffMethod, isImplicit()>; + using type = SubDomainCCLocalAssembler<id, SubDomainTypeTag<id>, SubDomainAssemblerView<id>, diffMethod, isImplicit()>; }; template<std::size_t id> struct SubDomainAssemblerType<DiscretizationMethods::CCMpfa, id> { - using type = SubDomainCCLocalAssembler<id, SubDomainTypeTag<id>, ThisType, diffMethod, isImplicit()>; + using type = SubDomainCCLocalAssembler<id, SubDomainTypeTag<id>, SubDomainAssemblerView<id>, diffMethod, isImplicit()>; }; template<std::size_t id, class DM> struct SubDomainAssemblerType<DiscretizationMethods::CVFE<DM>, id> { - using type = SubDomainCVFELocalAssembler<id, SubDomainTypeTag<id>, ThisType, diffMethod, isImplicit()>; + using type = SubDomainCVFELocalAssembler<id, SubDomainTypeTag<id>, SubDomainAssemblerView<id>, diffMethod, isImplicit()>; }; template<std::size_t id> struct SubDomainAssemblerType<DiscretizationMethods::Staggered, id> { - using type = SubDomainStaggeredLocalAssembler<id, SubDomainTypeTag<id>, ThisType, diffMethod, isImplicit()>; + using type = SubDomainStaggeredLocalAssembler<id, SubDomainTypeTag<id>, SubDomainAssemblerView<id>, diffMethod, isImplicit()>; }; template<std::size_t id> struct SubDomainAssemblerType<DiscretizationMethods::FCStaggered, id> { - using type = SubDomainFaceCenteredLocalAssembler<id, SubDomainTypeTag<id>, ThisType, diffMethod, isImplicit()>; + using type = SubDomainFaceCenteredLocalAssembler<id, SubDomainTypeTag<id>, SubDomainAssemblerView<id>, diffMethod, isImplicit()>; }; template<std::size_t id> @@ -501,7 +505,8 @@ private: { assemble_(domainId, [&](const auto& element) { - SubDomainAssembler<i> subDomainAssembler(*this, element, curSol, *couplingManager_); + MultiDomainAssemblerSubDomainView view{*this, domainId}; + SubDomainAssembler<i> subDomainAssembler(view, element, curSol, *couplingManager_); subDomainAssembler.assembleJacobianAndResidual(jacRow, subRes, gridVariablesTuple_); }); } @@ -512,7 +517,8 @@ private: { assemble_(domainId, [&](const auto& element) { - SubDomainAssembler<i> subDomainAssembler(*this, element, curSol, *couplingManager_); + MultiDomainAssemblerSubDomainView view{*this, domainId}; + SubDomainAssembler<i> subDomainAssembler(view, element, curSol, *couplingManager_); subDomainAssembler.assembleResidual(subRes); }); } diff --git a/dumux/multidomain/staggeredtraits.hh b/dumux/multidomain/staggeredtraits.hh index 3272c30c5126117e369ddcc8b5480878d186ae26..7645a47ae8b13d3f89990a7423490c7d4a8c237d 100644 --- a/dumux/multidomain/staggeredtraits.hh +++ b/dumux/multidomain/staggeredtraits.hh @@ -190,6 +190,7 @@ public: using Index = Dune::index_constant<id>; using TypeTag = SubDomainTypeTag<id>; using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>; + using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>; using GridGeometry = typename Detail::Staggered::SubDomainFVGridGeometryImpl<SubDomainTypeTag, id>::type; using GridVariables = typename Detail::Staggered::SubDomainGridVariablesImpl<SubDomainTypeTag, id>::type; using SolutionVector = typename Detail::Staggered::SubDomainSolutionVectorImpl<SubDomainTypeTag, id>::type; diff --git a/dumux/multidomain/subdomaincclocalassembler.hh b/dumux/multidomain/subdomaincclocalassembler.hh index 4cbba1046346530e25651a0c5de3d4a450714cb9..c03e85604e66c05b7974cde4412c578f312db9f9 100644 --- a/dumux/multidomain/subdomaincclocalassembler.hh +++ b/dumux/multidomain/subdomaincclocalassembler.hh @@ -76,7 +76,7 @@ public: //! export the domain id of this sub-domain static constexpr auto domainId = typename Dune::index_constant<id>(); //! the local residual type of this domain - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; + using LocalResidual = typename ParentType::LocalResidual; //! pull up constructor of parent class using ParentType::ParentType; diff --git a/dumux/multidomain/subdomainstaggeredlocalassembler.hh b/dumux/multidomain/subdomainstaggeredlocalassembler.hh index aab6fdf4e96127b3f4311cb92ca03b05cc47b8f8..2618653cd06254c8c3b2745835eb8abe696232fc 100644 --- a/dumux/multidomain/subdomainstaggeredlocalassembler.hh +++ b/dumux/multidomain/subdomainstaggeredlocalassembler.hh @@ -47,7 +47,6 @@ class SubDomainStaggeredLocalAssemblerBase : public FVLocalAssemblerBase<TypeTag using ParentType = FVLocalAssemblerBase<TypeTag, Assembler,Implementation, isImplicit>; using Problem = GetPropType<TypeTag, Properties::Problem>; - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; using SolutionVector = typename Assembler::SolutionVector; using GridVariables = GetPropType<TypeTag, Properties::GridVariables>; @@ -56,8 +55,8 @@ class SubDomainStaggeredLocalAssemblerBase : public FVLocalAssemblerBase<TypeTag using Scalar = typename GridVariables::Scalar; using ElementFaceVariables = typename GetPropType<TypeTag, Properties::GridFaceVariables>::LocalView; - using CellCenterResidualValue = typename LocalResidual::CellCenterResidualValue; - using FaceResidualValue = typename LocalResidual::FaceResidualValue; + using CellCenterResidualValue = typename ParentType::LocalResidual::CellCenterResidualValue; + using FaceResidualValue = typename ParentType::LocalResidual::FaceResidualValue; using GridGeometry = typename GridVariables::GridGeometry; using FVElementGeometry = typename GridGeometry::LocalView; @@ -471,9 +470,8 @@ class SubDomainStaggeredLocalAssembler<id, TypeTag, Assembler, DiffMethod::numer using ThisType = SubDomainStaggeredLocalAssembler<id, TypeTag, Assembler, DiffMethod::numeric, /*implicit=*/true>; using ParentType = SubDomainStaggeredLocalAssemblerImplicitBase<id, TypeTag, Assembler, ThisType>; using Scalar = GetPropType<TypeTag, Properties::Scalar>; - using LocalResidual = GetPropType<TypeTag, Properties::LocalResidual>; - using CellCenterResidualValue = typename LocalResidual::CellCenterResidualValue; - using FaceResidualValue = typename LocalResidual::FaceResidualValue; + using CellCenterResidualValue = typename ParentType::LocalResidual::CellCenterResidualValue; + using FaceResidualValue = typename ParentType::LocalResidual::FaceResidualValue; using Element = typename GetPropType<TypeTag, Properties::GridGeometry>::GridView::template Codim<0>::Entity; using GridFaceVariables = GetPropType<TypeTag, Properties::GridFaceVariables>; using ElementFaceVariables = typename GetPropType<TypeTag, Properties::GridFaceVariables>::LocalView; diff --git a/dumux/multidomain/traits.hh b/dumux/multidomain/traits.hh index a29dc0bbec15646f33cb019132570c1159c52483..4980f209bbf491d08aff189fa81f6daa1188879c 100644 --- a/dumux/multidomain/traits.hh +++ b/dumux/multidomain/traits.hh @@ -175,7 +175,8 @@ public: using Grid = GetPropType<SubDomainTypeTag<id>, Properties::Grid>; using GridGeometry = GetPropType<SubDomainTypeTag<id>, Properties::GridGeometry>; using Problem = GetPropType<SubDomainTypeTag<id>, Properties::Problem>; - using GridVariables =GetPropType<SubDomainTypeTag<id>, Properties::GridVariables>; + using GridVariables = GetPropType<SubDomainTypeTag<id>, Properties::GridVariables>; + using LocalResidual = GetPropType<SubDomainTypeTag<id>, Properties::LocalResidual>; using IOFields = GetPropType<SubDomainTypeTag<id>, Properties::IOFields>; using SolutionVector = GetPropType<SubDomainTypeTag<id>, Properties::SolutionVector>; using ResidualVector = typename Detail::NativeDuneVectorType<SolutionVector>::type;