GCC Code Coverage Report


Directory: ../../../builds/dumux-repositories/
File: dumux/dumux/porousmediumflow/fluxvariablescache.hh
Date: 2025-04-12 19:19:20
Exec Total Coverage
Lines: 14 14 100.0%
Functions: 0 0 -%
Branches: 44 53 83.0%

Line Branch Exec Source
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 //
7 /*!
8 * \file
9 * \ingroup PorousmediumflowModels
10 * \brief Base class for the flux variables.
11 */
12 #ifndef DUMUX_POROUSMEDIUM_FLUXVARIABLESCACHE_HH
13 #define DUMUX_POROUSMEDIUM_FLUXVARIABLESCACHE_HH
14
15 #include <dumux/common/properties.hh>
16 #include <dumux/discretization/method.hh>
17 #include <dumux/flux/fluxvariablescaching.hh>
18 #include <dumux/discretization/cvfe/fluxvariablescache.hh>
19
20 namespace Dumux {
21
22 // forward declaration
23 template<class TypeTag, class DiscretizationMethod>
24 class PorousMediumFluxVariablesCacheImplementation;
25
26 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
27 //! The cache is dependent on the active physical processes (advection, diffusion, heat conduction)
28 //! For each type of process there is a base cache storing the data required to compute the respective fluxes
29 //! Specializations of the overall cache are provided for combinations of processes
30 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
31
32 /*!
33 * \ingroup PorousmediumflowModels
34 * \brief The flux variables cache classes for porous media.
35 *
36 * Store data required for flux calculation. For each type of physical process (advection, diffusion, heat conduction)
37 * there is a base cache storing the data required to compute the respective fluxes. Specializations of the overall
38 * cache class are provided for different combinations of processes.
39 */
40 template<class TypeTag>
41 using PorousMediumFluxVariablesCache = PorousMediumFluxVariablesCacheImplementation<TypeTag, typename GetPropType<TypeTag, Properties::GridGeometry>::DiscretizationMethod>;
42
43 //! We only store discretization-related quantities for control-volume finite element methods. Thus, we need no
44 //! physics-dependent specialization and simply inherit from the physics-independent implementation.
45 template<class TypeTag, class DM>
46
0/7
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 1 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
38509254 class PorousMediumFluxVariablesCacheImplementation<TypeTag, DiscretizationMethods::CVFE<DM>>
47 : public CVFEFluxVariablesCache<GetPropType<TypeTag, Properties::Scalar>, GetPropType<TypeTag, Properties::GridGeometry>>
48 {
49 public:
50 //! export type used for scalar values
51 using Scalar = GetPropType<TypeTag, Properties::Scalar>;
52 };
53
54 // the following classes choose the cache type: empty if the law disabled and the law's cache if it's enabled
55 // if advections is disabled the advection type is still instantiated if we use std::conditional_t and has to be a full type
56 // in order to prevent that instead of std::conditional_t we use this helper type is only dependent on the advection type
57 // if advection is enabled otherwise its an empty cache type
58 template<class TypeTag, bool EnableAdvection> class AdvectionCacheChooser : public FluxVariablesCaching::EmptyAdvectionCache {};
59 3776 template<class TypeTag> class AdvectionCacheChooser<TypeTag, true> : public GetPropType<TypeTag, Properties::AdvectionType>::Cache {};
60 template<class TypeTag, bool EnableMolecularDiffusion> class DiffusionCacheChooser : public FluxVariablesCaching::EmptyDiffusionCache {};
61 template<class TypeTag> class DiffusionCacheChooser<TypeTag, true> : public GetPropType<TypeTag, Properties::MolecularDiffusionType>::Cache {};
62 template<class TypeTag, bool EnableEnergyBalance> class EnergyCacheChooser : public FluxVariablesCaching::EmptyHeatConductionCache {};
63 template<class TypeTag> class EnergyCacheChooser<TypeTag, true> : public GetPropType<TypeTag, Properties::HeatConductionType>::Cache {};
64
65
66 // specialization for the cell centered tpfa method
67 template<class TypeTag>
68 3776 class PorousMediumFluxVariablesCacheImplementation<TypeTag, DiscretizationMethods::CCTpfa>
69 : public AdvectionCacheChooser<TypeTag, GetPropType<TypeTag, Properties::ModelTraits>::enableAdvection()>
70 , public DiffusionCacheChooser<TypeTag, GetPropType<TypeTag, Properties::ModelTraits>::enableMolecularDiffusion()>
71 , public EnergyCacheChooser<TypeTag, GetPropType<TypeTag, Properties::ModelTraits>::enableEnergyBalance()>
72 {
73 public:
74 //! export type used for scalar values
75 using Scalar = GetPropType<TypeTag, Properties::Scalar>;
76 };
77
78 //! Specialization of the flux variables cache for the cell centered finite volume mpfa scheme.
79 //! Stores data which is commonly used by all the different types of processes.
80 template<class TypeTag>
81 76089920 class PorousMediumFluxVariablesCacheImplementation<TypeTag, DiscretizationMethods::CCMpfa>
82 : public AdvectionCacheChooser<TypeTag, GetPropType<TypeTag, Properties::ModelTraits>::enableAdvection()>
83 , public DiffusionCacheChooser<TypeTag, GetPropType<TypeTag, Properties::ModelTraits>::enableMolecularDiffusion()>
84 , public EnergyCacheChooser<TypeTag, GetPropType<TypeTag, Properties::ModelTraits>::enableEnergyBalance()>
85 {
86 using GridIndexType = typename GetPropType<TypeTag, Properties::GridGeometry>::GridView::IndexSet::IndexType;
87
88 using MpfaHelper = typename GetPropType<TypeTag, Properties::GridGeometry>::MpfaHelper;
89 static constexpr bool considerSecondary = MpfaHelper::considerSecondaryIVs();
90 public:
91 //! export type used for scalar values
92 using Scalar = GetPropType<TypeTag, Properties::Scalar>;
93
94 //! Returns whether or not this cache has been updated
95
11/12
✓ Branch 0 taken 11001895 times.
✓ Branch 1 taken 13140635 times.
✓ Branch 2 taken 10917944 times.
✓ Branch 3 taken 70728568 times.
✓ Branch 4 taken 14010149 times.
✓ Branch 5 taken 125217653 times.
✓ Branch 6 taken 1781529 times.
✓ Branch 7 taken 102476937 times.
✓ Branch 8 taken 3628006 times.
✓ Branch 9 taken 27586898 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 242864 times.
380733078 bool isUpdated() const { return isUpdated_; }
96
97 //! Returns whether or not this cache is associated with a secondary interaction volume
98 //! Specialization for deactivated secondary interaction volumes
99 template< bool doSecondary = considerSecondary, std::enable_if_t<!doSecondary, int> = 0>
100 constexpr bool usesSecondaryIv() const { return false; }
101
102 //! Returns whether or not this cache is associated with a secondary interaction volume
103 //! Specialization for activated secondary interaction volumes
104 template< bool doSecondary = considerSecondary, std::enable_if_t<doSecondary, int> = 0>
105
4/4
✓ Branch 0 taken 120080 times.
✓ Branch 1 taken 3532800 times.
✓ Branch 2 taken 120080 times.
✓ Branch 3 taken 3532800 times.
7305760 bool usesSecondaryIv() const { return usesSecondaryIv_; }
106
107 //! Returns the index of the iv (this scvf is embedded in) in its container
108
1/2
✓ Branch 1 taken 121 times.
✗ Branch 2 not taken.
32630254 GridIndexType ivIndexInContainer() const { return ivIndexInContainer_; }
109 //! Returns interaction volume-local face index
110
6/6
✓ Branch 0 taken 143663769 times.
✓ Branch 1 taken 147417829 times.
✓ Branch 2 taken 6751926 times.
✓ Branch 3 taken 6167102 times.
✓ Branch 4 taken 5419480 times.
✓ Branch 5 taken 4951208 times.
892525364 unsigned int ivLocalFaceIndex() const { return ivLocalFaceIdx_; }
111 //! Returns index of the face among "outside" faces of iv-local "positive" face
112
6/6
✓ Branch 0 taken 143663769 times.
✓ Branch 1 taken 147417829 times.
✓ Branch 2 taken 6749926 times.
✓ Branch 3 taken 6167102 times.
✓ Branch 4 taken 5419480 times.
✓ Branch 5 taken 4951208 times.
892523364 unsigned int indexInOutsideFaces() const { return idxInOutsideFaces_; }
113
114 //! Sets the update status. When set to true, consecutive updates will be skipped
115
4/4
✓ Branch 0 taken 13254458 times.
✓ Branch 1 taken 17342694 times.
✓ Branch 2 taken 68631250 times.
✓ Branch 3 taken 67581854 times.
703798590 void setUpdateStatus(bool status) { isUpdated_ = status; }
116 //! Sets if this cache is associated with a secondary iv
117
4/4
✓ Branch 0 taken 13254458 times.
✓ Branch 1 taken 17342694 times.
✓ Branch 2 taken 68631250 times.
✓ Branch 3 taken 67581854 times.
380733078 void setSecondaryIvUsage(bool status) { usesSecondaryIv_ = status; }
118 //! Sets the index of the iv (this scvf is embedded in) in its container
119
4/4
✓ Branch 0 taken 13254458 times.
✓ Branch 1 taken 17342694 times.
✓ Branch 2 taken 68631250 times.
✓ Branch 3 taken 67581854 times.
380733078 void setIvIndexInContainer(GridIndexType ivIndex) { ivIndexInContainer_ = ivIndex; }
120 //! Sets the iv-local face index
121
4/4
✓ Branch 0 taken 13254458 times.
✓ Branch 1 taken 17342694 times.
✓ Branch 2 taken 68631250 times.
✓ Branch 3 taken 67581854 times.
380733078 void setIvLocalFaceIndex(unsigned int idx) { ivLocalFaceIdx_ = idx; }
122 //! Sets the index of the face among the "positive" face's outside scvfs
123 81885708 void setIndexInOutsideFaces(unsigned int idx) { idxInOutsideFaces_ = idx; }
124
125 private:
126
127 bool isUpdated_ = false; // returns true if cache has been fully updated
128 bool usesSecondaryIv_ = false; // returns true if scvf is embedded in secondary interaction volume
129
130 GridIndexType ivIndexInContainer_; // index of the iv (this scvf is embedded in) in its container
131 unsigned int ivLocalFaceIdx_; // the interaction volume-local face index of this scvf
132 unsigned int idxInOutsideFaces_; // index of scvf among outside scvfs of iv-local "positive" face (only surface grids)
133 };
134
135 } // end namespace Dumux
136
137 #endif
138