version 3.11-dev
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
fluidmatrixinteraction.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//
14#ifndef DUMUX_MATERIAL_FLUIDMATRIX_INTERACTIONS_FLUIDMATRIX_INTERACTION_HH
15#define DUMUX_MATERIAL_FLUIDMATRIX_INTERACTIONS_FLUIDMATRIX_INTERACTION_HH
16
17#include <type_traits>
18#include <utility>
19
20namespace Dumux {
21
27template<class... Laws>
28struct FluidMatrixInteraction : public Laws...
29{
30 explicit FluidMatrixInteraction(Laws&&... laws) : Laws(std::forward<Laws>(laws))... {}
31};
32
39template<class... Laws>
40auto makeFluidMatrixInteraction(Laws&&... laws)
41{
42 return FluidMatrixInteraction(wrap(std::forward<Laws>(laws))...);
43}
44
45} // end namespace Dumux
46
47namespace Dumux::FluidMatrix {
48
54template<class A, template<class> class Wrapper>
55struct Adapter
56{
57 template<class T, std::enable_if_t<std::is_same_v<A, std::decay_t<T>>, int> = 0>
58 friend auto wrap(T&& t) { return Wrapper(std::forward<T>(t)); }
59};
60
65template<class T>
66class PcKrSw
67{
68public:
69 using Scalar = typename std::decay_t<T>::Scalar;
70
71 using PcKrSwType = T;
72
73 explicit PcKrSw(T&& impl) : impl_(std::forward<T>(impl)) {}
74
75 Scalar pc(const Scalar sw) const { return impl_.pc(sw); }
76 Scalar dpc_dsw(const Scalar sw) const { return impl_.dpc_dsw(sw); }
77 Scalar endPointPc() const { return impl_.endPointPc(); }
78 Scalar sw(const Scalar pc) const { return impl_.sw(pc); }
79 Scalar dsw_dpc(const Scalar pc) const { return impl_.dsw_dpc(pc); }
80 Scalar krw(const Scalar sw) const { return impl_.krw(sw); }
81 Scalar dkrw_dsw(const Scalar sw) const { return impl_.dkrw_dsw(sw); }
82 Scalar krn(const Scalar sw) const { return impl_.krn(sw); }
83 Scalar dkrn_dsw(const Scalar sw) const { return impl_.dkrn_dsw(sw); }
84
85 const T& pcSwCurve() const { return impl_; }
86 const T& krSwCurve() const { return impl_; }
87
88private:
89 T impl_;
90};
91
98template<typename T>
100
105template<class T>
107{
108public:
109 using Scalar = typename std::decay_t<T>::Scalar;
110
111 explicit MultiPhasePcKrSw(T&& impl) : impl_(std::forward<T>(impl)) {}
112
113 template<class FS>
114 auto capillaryPressures(const FS& fs, int wp) const { return impl_.capillaryPressures(fs, wp); }
115 template<class FS>
116 auto relativePermeabilities(const FS& fs, int wp) const { return impl_.relativePermeabilities(fs, wp); }
117
118 const T& multiPhasePcKrS() const { return impl_; }
119
120private:
121 T impl_;
122};
123
130template<typename T>
132
137template<class T>
139{
140 using Scalar = typename std::decay_t<T>::Scalar;
141 using value_type = T;
142
143 using PcKrSwType = T;
144
145 explicit ThreePhasePcKrSw(T&& impl) : impl_(std::forward<T>(impl)) {}
146
147 Scalar pcgw(const Scalar sw, const Scalar sn) const { return impl_.pcgw(sw, sn); }
148 Scalar pcnw(const Scalar sw, const Scalar sn) const { return impl_.pcnw(sw, sn); }
149 Scalar pcgn(const Scalar sw, const Scalar sn) const { return impl_.pcgn(sw, sn); }
150 Scalar pcAlpha(const Scalar sw, const Scalar sn) const { return impl_.pcAlpha(sw, sn); }
151
152 Scalar krw(const Scalar sw, const Scalar sn) const { return impl_.krw(sw, sn); }
153 Scalar krn(const Scalar sw, const Scalar sn) const { return impl_.krn(sw, sn); }
154 Scalar krg(const Scalar sw, const Scalar sn) const { return impl_.krn(sw, sn); }
155 Scalar kr(const int phaseIdx, const Scalar sw, const Scalar sn) const { return impl_.kr(phaseIdx, sw, sn); }
156
157 const T& pcSwCurve() const { return impl_; }
158 const T& krSwCurve() const { return impl_; }
159private:
160 T impl_;
161};
162
169template<typename T>
171
176template<class T>
178{
179public:
180 explicit WettingNonwettingInterfacialAreaPcSw(T&& impl) : impl_(std::forward<T>(impl)) {}
181 const T& wettingNonwettingInterface() const { return impl_; }
182private:
183 T impl_;
184};
185
192template<typename T>
194
199template<class T>
201{
202public:
203 explicit WettingSolidInterfacialAreaPcSw(T&& impl) : impl_(std::forward<T>(impl)) {}
204 const T& wettingSolidInterface() const { return impl_; }
205private:
206 T impl_;
207};
208
215template<typename T>
217
222template<class T>
224{
225public:
226 explicit NonwettingSolidInterfacialAreaPcSw(T&& impl) : impl_(std::forward<T>(impl)) {}
227 const T& nonwettingSolidInterface() const { return impl_; }
228private:
229 T impl_;
230};
231
238template<typename T>
240
241
246template<class T>
248{
249public:
250 using value_type = T;
251
252 explicit Adsorption(T&& impl) : impl_(std::forward<T>(impl)) {}
253 const T& adsorptionModel() const { return impl_; }
254private:
255 T impl_;
256};
257
264template<typename T>
266
267} // end namespace Dumux::FluidMatrix
268
269#endif
Wrapper type for adsorption laws.
Definition: fluidmatrixinteraction.hh:248
T value_type
Definition: fluidmatrixinteraction.hh:250
Adsorption(T &&impl)
Definition: fluidmatrixinteraction.hh:252
const T & adsorptionModel() const
Definition: fluidmatrixinteraction.hh:253
Wrapper type for multiphase interface laws providing pc-S and kr-S rules.
Definition: fluidmatrixinteraction.hh:107
auto relativePermeabilities(const FS &fs, int wp) const
Definition: fluidmatrixinteraction.hh:116
MultiPhasePcKrSw(T &&impl)
Definition: fluidmatrixinteraction.hh:111
const T & multiPhasePcKrS() const
Definition: fluidmatrixinteraction.hh:118
auto capillaryPressures(const FS &fs, int wp) const
Definition: fluidmatrixinteraction.hh:114
typename std::decay_t< T >::Scalar Scalar
Definition: fluidmatrixinteraction.hh:109
Wrapper type for laws providing rules for the nonwetting-solid interfacial area.
Definition: fluidmatrixinteraction.hh:224
const T & nonwettingSolidInterface() const
Definition: fluidmatrixinteraction.hh:227
NonwettingSolidInterfacialAreaPcSw(T &&impl)
Definition: fluidmatrixinteraction.hh:226
Wrapper type for laws providing pc-Sw and kr-Sw rules.
Definition: fluidmatrixinteraction.hh:67
const T & krSwCurve() const
Definition: fluidmatrixinteraction.hh:86
Scalar krn(const Scalar sw) const
Definition: fluidmatrixinteraction.hh:82
Scalar pc(const Scalar sw) const
Definition: fluidmatrixinteraction.hh:75
PcKrSw(T &&impl)
Definition: fluidmatrixinteraction.hh:73
Scalar dsw_dpc(const Scalar pc) const
Definition: fluidmatrixinteraction.hh:79
Scalar sw(const Scalar pc) const
Definition: fluidmatrixinteraction.hh:78
Scalar dpc_dsw(const Scalar sw) const
Definition: fluidmatrixinteraction.hh:76
Scalar krw(const Scalar sw) const
Definition: fluidmatrixinteraction.hh:80
T PcKrSwType
Definition: fluidmatrixinteraction.hh:71
typename std::decay_t< T >::Scalar Scalar
Definition: fluidmatrixinteraction.hh:69
Scalar dkrn_dsw(const Scalar sw) const
Definition: fluidmatrixinteraction.hh:83
const T & pcSwCurve() const
Definition: fluidmatrixinteraction.hh:85
Scalar dkrw_dsw(const Scalar sw) const
Definition: fluidmatrixinteraction.hh:81
Scalar endPointPc() const
Definition: fluidmatrixinteraction.hh:77
Wrapper type for laws providing rules for the wetting-nonwetting interfacial area.
Definition: fluidmatrixinteraction.hh:178
const T & wettingNonwettingInterface() const
Definition: fluidmatrixinteraction.hh:181
WettingNonwettingInterfacialAreaPcSw(T &&impl)
Definition: fluidmatrixinteraction.hh:180
Wrapper type for laws providing rules for the wetting-solid interfacial area.
Definition: fluidmatrixinteraction.hh:201
WettingSolidInterfacialAreaPcSw(T &&impl)
Definition: fluidmatrixinteraction.hh:203
const T & wettingSolidInterface() const
Definition: fluidmatrixinteraction.hh:204
PcKrSw(T &&) -> PcKrSw< T >
Deduction guide for the PcKrSw class. Makes sure that PcKrSw stores a copy of T if the constructor is...
NonwettingSolidInterfacialAreaPcSw(T &&) -> NonwettingSolidInterfacialAreaPcSw< T >
Deduction guide for the NonwettingSolidInterfacialAreaPcSw class. Makes sure that NonwettingSolidInte...
WettingSolidInterfacialAreaPcSw(T &&) -> WettingSolidInterfacialAreaPcSw< T >
Deduction guide for the WettingSolidInterfacialAreaPcSw class. Makes sure that WettingSolidInterfacia...
ThreePhasePcKrSw(T &&) -> ThreePhasePcKrSw< T >
Deduction guide for the ThreePhasePcKrSw class. Makes sure that ThreePhasePcKrSw stores a copy of T i...
Adsorption(T &&) -> Adsorption< T >
Deduction guide for the Adsorption class. Makes sure that Adsorption stores a copy of T if the constr...
auto makeFluidMatrixInteraction(Laws &&... laws)
Helper function to create an FluidMatrixInteraction object containing an arbitrary number of fluid ma...
Definition: fluidmatrixinteraction.hh:40
MultiPhasePcKrSw(T &&) -> MultiPhasePcKrSw< T >
Deduction guide for the MultiPhasePcKrSw class. Makes sure that MultiPhasePcKrSw stores a copy of T i...
WettingNonwettingInterfacialAreaPcSw(T &&) -> WettingNonwettingInterfacialAreaPcSw< T >
Deduction guide for the WettingNonwettingInterfacialAreaPcSw class. Makes sure that WettingNonwetting...
Definition: brookscorey.hh:23
Definition: adapt.hh:17
Adapter to inherit from, allowing the inheriting class to be wrapped by the makeFluidMatrixInteractio...
Definition: fluidmatrixinteraction.hh:56
friend auto wrap(T &&t)
Definition: fluidmatrixinteraction.hh:58
Wrapper type for 3p interface laws providing pc-S and kr-S rules.
Definition: fluidmatrixinteraction.hh:139
Scalar kr(const int phaseIdx, const Scalar sw, const Scalar sn) const
Definition: fluidmatrixinteraction.hh:155
Scalar krw(const Scalar sw, const Scalar sn) const
Definition: fluidmatrixinteraction.hh:152
Scalar krg(const Scalar sw, const Scalar sn) const
Definition: fluidmatrixinteraction.hh:154
const T & krSwCurve() const
Definition: fluidmatrixinteraction.hh:158
T value_type
Definition: fluidmatrixinteraction.hh:141
ThreePhasePcKrSw(T &&impl)
Definition: fluidmatrixinteraction.hh:145
T PcKrSwType
Definition: fluidmatrixinteraction.hh:143
Scalar pcgn(const Scalar sw, const Scalar sn) const
Definition: fluidmatrixinteraction.hh:149
typename std::decay_t< T >::Scalar Scalar
Definition: fluidmatrixinteraction.hh:140
Scalar krn(const Scalar sw, const Scalar sn) const
Definition: fluidmatrixinteraction.hh:153
Scalar pcgw(const Scalar sw, const Scalar sn) const
Definition: fluidmatrixinteraction.hh:147
Scalar pcnw(const Scalar sw, const Scalar sn) const
Definition: fluidmatrixinteraction.hh:148
Scalar pcAlpha(const Scalar sw, const Scalar sn) const
Definition: fluidmatrixinteraction.hh:150
const T & pcSwCurve() const
Definition: fluidmatrixinteraction.hh:157
Wrapper type to combine an arbitrary number of different laws for fluid-matrix interaction (e....
Definition: fluidmatrixinteraction.hh:29
FluidMatrixInteraction(Laws &&... laws)
Definition: fluidmatrixinteraction.hh:30