diff --git a/dumux/implicit/cellcentered/localresidual.hh b/dumux/implicit/cellcentered/localresidual.hh index c9e0b970b9ac76e3f7b0568949a70dfd7af3a5e8..0d04f04f67c2957fe5702bb548ba3dda3aa4883b 100644 --- a/dumux/implicit/cellcentered/localresidual.hh +++ b/dumux/implicit/cellcentered/localresidual.hh @@ -53,7 +53,7 @@ class CCLocalResidual : public ImplicitLocalResidual<TypeTag> enum { constantBC = GET_PROP_VALUE(TypeTag, ConstantBoundaryConditions) }; - enum { enableVolVarsCache = GET_PROP_VALUE(TypeTag, EnableVolumeVariablesCache) }; + enum { enableVolVarsCache = GET_PROP_VALUE(TypeTag, EnableGlobalVolumeVariablesCache) }; typedef typename GridView::template Codim<0>::Entity Element; typedef typename GET_PROP_TYPE(TypeTag, PrimaryVariables) PrimaryVariables; @@ -70,23 +70,44 @@ public: protected: + void evalFluxes_() + { + // calculate the mass flux over the scv faces + const auto& fvGeometry = this->fvGeometry_(); + for (const auto& scvf : fvGeometry.scvfs()) + { + this->residual_[0] += this->asImp_().computeFlux_(scvf); + } + } + PrimaryVariables computeFlux_(const SubControlVolumeFace &scvf) { if (!scvf.boundary() /*TODO: || GET_PROP_VALUE(TypeTag, BoundaryReconstruction)*/) return this->asImp_().computeFlux(scvf); else - return this->asImp_().evalBoundary_(scvf); + return PrimaryVariables(0.0); + } - PrimaryVariables evalBoundary_(const SubControlVolumeFace &scvf) + void evalBoundary_() { - PrimaryVariables flux = evalBoundaryFluxes_(scvf); + const auto& fvGeometry = this->fvGeometry_(); + + for (const auto& scvf : fvGeometry.scvfs()) + { + if (scvf.boundary()) + this->residual_[0] += evalBoundaryFluxes_(scvf); + } // additionally treat mixed D/N conditions in a strong sense if (this->bcTypes_().hasDirichlet()) - this->asImp_().evalDirichlet_(flux, scvf); - - return flux; + { + for (const auto& scvf : fvGeometry.scvfs()) + { + if (scvf.boundary()) + this->asImp_().evalDirichlet_(scvf); + } + } } /*! @@ -99,11 +120,11 @@ protected: // evaluate the Neumann conditions at the boundary face PrimaryVariables flux(0); - if (bcTypes.hasNeumann()) + if (bcTypes.hasNeumann() /*TODO: && !GET_PROP_VALUE(TypeTag, BoundaryReconstruction)*/) flux += this->asImp_().evalNeumannSegment_(scvf, bcTypes); // TODO: evaluate the outflow conditions at the boundary face - //if (bcTypes.hasOutflow()) + //if (bcTypes.hasOutflow() /*TODO: && !GET_PROP_VALUE(TypeTag, BoundaryReconstruction)*/) // flux += this->asImp_().evalOutflowSegment_(&intersection, bcTypes); // evaluate the pure Dirichlet conditions at the boundary face @@ -117,12 +138,12 @@ protected: * \brief Evaluate Dirichlet conditions on faces that have mixed * Dirichlet/Neumann boundary conditions. */ - void evalDirichlet_(PrimaryVariables &flux, const SubControlVolumeFace &scvf) + void evalDirichlet_(const SubControlVolumeFace &scvf) { BoundaryTypes bcTypes = this->problem_().boundaryTypes(this->element_(), scvf); if (bcTypes.hasDirichlet() && bcTypes.hasNeumann()) - this->asImp_().evalDirichletSegmentMixed_(flux, scvf, bcTypes); + this->asImp_().evalDirichletSegmentMixed_(scvf, bcTypes); } /*! @@ -240,8 +261,7 @@ protected: * \brief Treat Dirichlet boundary conditions in a strong sense for a * single intersection that has mixed D/N boundary conditions */ - void evalDirichletSegmentMixed_(PrimaryVariables &flux, - const SubControlVolumeFace &scvf, + void evalDirichletSegmentMixed_(const SubControlVolumeFace &scvf, const BoundaryTypes &bcTypes) { // temporary vector to store the Dirichlet values @@ -257,7 +277,6 @@ protected: { auto pvIdx = bcTypes.eqToDirichletIndex(eqIdx); this->residual_[0][eqIdx] = priVars[pvIdx] - dirichletValues[pvIdx]; - flux[eqIdx] = 0; } } }