version 3.11-dev
Loading...
Searching...
No Matches
boundaryfluxintegral.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
12#ifndef DUMUX_ASSEMBLY_BOUNDARY_FLUX_INTEGRAL_HH
13#define DUMUX_ASSEMBLY_BOUNDARY_FLUX_INTEGRAL_HH
14
17#include <dumux/common/typetraits/localdofs_.hh>
19
20namespace Dumux::Experimental {
21
33template<class ResidualVector, class Problem, Concepts::FVElementDiscretization ElementDiscretization,
34 class ElementVariables, class BoundaryTypes>
35void addFVBoundaryFluxIntegral(ResidualVector& residual,
36 const Problem& problem,
37 const ElementDiscretization& elemDisc,
38 const ElementVariables& elemVars,
39 const typename ElementDiscretization::SubControlVolumeFace& scvf,
40 const BoundaryTypes& bcTypes)
41{
42 using BoundaryFluxes = typename Problem::Traits::NumEqVector;
43 BoundaryFluxes boundaryFlux(0.0);
44 for (const auto& qpData : Dumux::CVFE::quadratureRule(elemDisc, scvf))
45 boundaryFlux += qpData.weight() * problem.boundaryFlux(elemDisc, elemVars, qpData.ipData());
46
47 const auto& insideScv = elemDisc.scv(scvf.insideScvIdx());
48 boundaryFlux *= elemVars[insideScv].extrusionFactor();
49
50 for (int eqIdx = 0; eqIdx < BoundaryFluxes::dimension; ++eqIdx)
51 if (bcTypes.isFluxBoundary(eqIdx))
52 residual[insideScv.localDofIndex()][eqIdx] += boundaryFlux[eqIdx];
53}
54
66template<class ResidualVector, class Problem, class ElementDiscretization,
67 class ElementVariables, class BoundaryTypes>
68void addFEBoundaryFluxIntegral(ResidualVector& residual,
69 const Problem& problem,
70 const ElementDiscretization& elemDisc,
71 const ElementVariables& elemVars,
72 const typename ElementDiscretization::BoundaryFace& boundaryFace,
73 const BoundaryTypes& bcTypes)
74{
75 using BoundaryFluxes = typename Problem::Traits::NumEqVector;
76
77 for (const auto& qpData : Dumux::CVFE::quadratureRule(elemDisc, boundaryFace))
78 {
79 const auto& ipData = qpData.ipData();
80 const auto& ipCache = cache(elemVars, ipData);
81 const BoundaryFluxes boundaryFlux = qpData.weight() * problem.boundaryFlux(elemDisc, elemVars, ipData);
82 const auto& shapeValues = ipCache.shapeValues();
83
84 for (const auto& localDof : nonCVLocalDofs(elemDisc))
85 for (int eqIdx = 0; eqIdx < BoundaryFluxes::dimension; ++eqIdx)
86 if (bcTypes.isFluxBoundary(eqIdx))
87 residual[localDof.index()][eqIdx] += shapeValues[localDof.index()] * boundaryFlux[eqIdx];
88 }
89}
90
91} // namespace Dumux::Experimental
92
93#endif // DUMUX_ASSEMBLY_BOUNDARY_FLUX_INTEGRAL_HH
Class to specify the type of a boundary.
Definition common/boundarytypes.hh:26
Base class for all standard finite volume or finite element problems.
Definition common/problem.hh:39
NumEqVector boundaryFlux(const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const FaceIpData &faceIpData) const
Evaluate the boundary conditions for a neumann boundary segment.
Definition common/problem.hh:186
Concept for finite-volume discretizations.
Definition concepts.hh:26
Concepts for discretization types.
void addFVBoundaryFluxIntegral(ResidualVector &residual, const Problem &problem, const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const typename ElementDiscretization::SubControlVolumeFace &scvf, const BoundaryTypes &bcTypes)
Adds boundary flux contributions to the residual for a single FV sub-control volume face.
Definition boundaryfluxintegral.hh:35
void addFEBoundaryFluxIntegral(ResidualVector &residual, const Problem &problem, const ElementDiscretization &elemDisc, const ElementVariables &elemVars, const typename ElementDiscretization::BoundaryFace &boundaryFace, const BoundaryTypes &bcTypes)
Adds boundary flux contributions to the residual related to FE discretization.
Definition boundaryfluxintegral.hh:68
Class representing dofs on elements for control-volume finite element schemes.
auto quadratureRule(const FVElementGeometry &fvGeometry, const typename FVElementGeometry::SubControlVolume &scv, QuadratureRules::MidpointQuadrature)
Midpoint quadrature for scv.
Definition quadraturerules.hh:159
Definition assembly/assembler.hh:44
Quadrature rules over sub-control volumes and sub-control volume faces.
Problem::NumEqVector NumEqVector
Definition common/problem.hh:59