3.2-git
DUNE for Multi-{Phase, Component, Scale, Physics, ...} flow and transport in porous media
pointsourcedata.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 * See the file COPYING for full copying permissions. *
5 * *
6 * This program is free software: you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation, either version 3 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
18 *****************************************************************************/
25#ifndef DUMUX_POINTSOURCEDATA_HH
26#define DUMUX_POINTSOURCEDATA_HH
27
28#include <vector>
29#include <unordered_map>
30#include <dune/common/fvector.hh>
33
34namespace Dumux {
35
41template<class MDTraits>
43{
44 using Scalar = typename MDTraits::Scalar;
45 using ShapeValues = typename std::vector<Dune::FieldVector<Scalar, 1> >;
46
47 // obtain the type tags of the sub problems
48 using BulkTypeTag = typename MDTraits::template SubDomain<0>::TypeTag;
49 using LowDimTypeTag = typename MDTraits::template SubDomain<1>::TypeTag;
50
53
56
57 enum {
60 };
61
62public:
63 void addBulkInterpolation(const ShapeValues& shapeValues,
64 const std::vector<std::size_t>& cornerIndices,
65 std::size_t eIdx)
66 {
67 bulkElementIdx_ = eIdx;
68 bulkCornerIndices_ = cornerIndices;
69 bulkShapeValues_ = shapeValues;
70 }
71
72 void addLowDimInterpolation(const ShapeValues& shapeValues,
73 const std::vector<std::size_t>& cornerIndices,
74 std::size_t eIdx)
75 {
76 lowDimElementIdx_ = eIdx;
77 lowDimCornerIndices_ = cornerIndices;
78 lowDimShapeValues_ = shapeValues;
79 }
80
81 void addBulkInterpolation(std::size_t eIdx)
82 {
83 assert(!bulkIsBox);
84 bulkElementIdx_ = eIdx;
85 }
86
87 void addLowDimInterpolation(std::size_t eIdx)
88 {
89 assert(!lowDimIsBox);
90 lowDimElementIdx_ = eIdx;
91 }
92
93 BulkPrimaryVariables interpolateBulk(const BulkSolutionVector& sol)
94 {
95 BulkPrimaryVariables bulkPriVars(0.0);
96 if (bulkIsBox)
97 {
98 for (std::size_t i = 0; i < bulkCornerIndices_.size(); ++i)
99 for (std::size_t priVarIdx = 0; priVarIdx < bulkPriVars.size(); ++priVarIdx)
100 bulkPriVars[priVarIdx] += sol[bulkCornerIndices_[i]][priVarIdx]*bulkShapeValues_[i];
101 }
102 else
103 {
104 bulkPriVars = sol[bulkElementIdx()];
105 }
106 return bulkPriVars;
107 }
108
109 LowDimPrimaryVariables interpolateLowDim(const LowDimSolutionVector& sol)
110 {
111 LowDimPrimaryVariables lowDimPriVars(0.0);
112 if (lowDimIsBox)
113 {
114 for (std::size_t i = 0; i < lowDimCornerIndices_.size(); ++i)
115 for (std::size_t priVarIdx = 0; priVarIdx < lowDimPriVars.size(); ++priVarIdx)
116 lowDimPriVars[priVarIdx] += sol[lowDimCornerIndices_[i]][priVarIdx]*lowDimShapeValues_[i];
117 }
118 else
119 {
120 lowDimPriVars = sol[lowDimElementIdx()];
121 }
122 return lowDimPriVars;
123 }
124
125 std::size_t lowDimElementIdx() const
126 { return lowDimElementIdx_; }
127
128 std::size_t bulkElementIdx() const
129 { return bulkElementIdx_; }
130
131private:
132 ShapeValues bulkShapeValues_, lowDimShapeValues_;
133 std::vector<std::size_t> bulkCornerIndices_, lowDimCornerIndices_;
134 std::size_t lowDimElementIdx_;
135 std::size_t bulkElementIdx_;
136};
137
147template<class MDTraits>
149{
151 using Scalar = typename MDTraits::Scalar;
152 using ShapeValues = typename std::vector<Dune::FieldVector<Scalar, 1> >;
153
154 // obtain the type tags of the sub problems
155 using BulkTypeTag = typename MDTraits::template SubDomain<0>::TypeTag;
156 using LowDimTypeTag = typename MDTraits::template SubDomain<1>::TypeTag;
157
160
163
164 enum {
167 };
168
169public:
170 PointSourceDataCircleAverage() : enableBulkCircleInterpolation_(false) {}
171
172 BulkPrimaryVariables interpolateBulk(const BulkSolutionVector& sol)
173 {
174 // bulk interpolation on the circle is only enabled for source in the
175 // lower dimensional domain if we use a circle distributed bulk sources
176 // (see coupling manager circle sources)
177 BulkPrimaryVariables bulkPriVars(sol[0]);
178 bulkPriVars = 0.0;
179 if (enableBulkCircleInterpolation_)
180 {
181 // compute the average of the bulk privars over the circle around the integration point
182 // this computes $\bar{p} = \frac{1}{2\pi R} int_0^2*\pi p R \text{d}\theta.
183 if (bulkIsBox)
184 {
185 assert(circleCornerIndices_.size() == circleShapeValues_.size());
186
187 Scalar weightSum = 0.0;
188 for (std::size_t j = 0; j < circleStencil_.size(); ++j)
189 {
190 BulkPrimaryVariables priVars(0.0);
191 const auto& cornerIndices = circleCornerIndices_[circleStencil_[j]];
192 const auto& shapeValues = circleShapeValues_[circleStencil_[j]];
193 for (std::size_t i = 0; i < cornerIndices.size(); ++i)
194 for (std::size_t priVarIdx = 0; priVarIdx < priVars.size(); ++priVarIdx)
195 priVars[priVarIdx] += sol[cornerIndices[i]][priVarIdx]*shapeValues[i];
196 // multiply with weight and add
197 priVars *= circleIpWeight_[j];
198 weightSum += circleIpWeight_[j];
199 bulkPriVars += priVars;
200 }
201 bulkPriVars /= weightSum;
202 }
203 else
204 {
205 Scalar weightSum = 0.0;
206 for (std::size_t j = 0; j < circleStencil_.size(); ++j)
207 {
208 for (std::size_t priVarIdx = 0; priVarIdx < bulkPriVars.size(); ++priVarIdx)
209 bulkPriVars[priVarIdx] += sol[circleStencil_[j]][priVarIdx]*circleIpWeight_[j];
210
211 weightSum += circleIpWeight_[j];
212 }
213 bulkPriVars /= weightSum;
214 }
215 return bulkPriVars;
216 }
217 else
218 {
219 return ParentType::interpolateBulk(sol);
220 }
221 }
222
223 void addCircleInterpolation(const std::unordered_map<std::size_t, std::vector<std::size_t> >& circleCornerIndices,
224 const std::unordered_map<std::size_t, ShapeValues>& circleShapeValues,
225 const std::vector<Scalar>& circleIpWeight,
226 const std::vector<std::size_t>& circleStencil)
227 {
228 circleCornerIndices_ = circleCornerIndices;
229 circleShapeValues_ = circleShapeValues;
230 circleIpWeight_ = circleIpWeight;
231 circleStencil_ = circleStencil;
232 enableBulkCircleInterpolation_ = true;
233
234 }
235
236 void addCircleInterpolation(const std::vector<Scalar>& circleIpWeight,
237 const std::vector<std::size_t>& circleStencil)
238 {
239 circleIpWeight_ = circleIpWeight;
240 circleStencil_ = circleStencil;
241 enableBulkCircleInterpolation_ = true;
242 }
243
244 const std::vector<std::size_t>& circleStencil()
245 {
246 return circleStencil_;
247 }
248
249private:
250 std::unordered_map<std::size_t, std::vector<std::size_t> > circleCornerIndices_;
251 std::unordered_map<std::size_t, ShapeValues> circleShapeValues_;
252 std::vector<Scalar> circleIpWeight_;
253 std::vector<std::size_t> circleStencil_;
254 bool enableBulkCircleInterpolation_;
255};
256
257} // end namespace Dumux
258
259#endif
The available discretization methods in Dumux.
Definition: adapt.hh:29
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:149
A point source data class used for integration in multidimension models.
Definition: pointsourcedata.hh:43
LowDimPrimaryVariables interpolateLowDim(const LowDimSolutionVector &sol)
Definition: pointsourcedata.hh:109
void addLowDimInterpolation(const ShapeValues &shapeValues, const std::vector< std::size_t > &cornerIndices, std::size_t eIdx)
Definition: pointsourcedata.hh:72
std::size_t bulkElementIdx() const
Definition: pointsourcedata.hh:128
void addLowDimInterpolation(std::size_t eIdx)
Definition: pointsourcedata.hh:87
void addBulkInterpolation(std::size_t eIdx)
Definition: pointsourcedata.hh:81
BulkPrimaryVariables interpolateBulk(const BulkSolutionVector &sol)
Definition: pointsourcedata.hh:93
void addBulkInterpolation(const ShapeValues &shapeValues, const std::vector< std::size_t > &cornerIndices, std::size_t eIdx)
Definition: pointsourcedata.hh:63
std::size_t lowDimElementIdx() const
Definition: pointsourcedata.hh:125
A point source data class used for integration in multidimension models.
Definition: pointsourcedata.hh:149
const std::vector< std::size_t > & circleStencil()
Definition: pointsourcedata.hh:244
void addCircleInterpolation(const std::unordered_map< std::size_t, std::vector< std::size_t > > &circleCornerIndices, const std::unordered_map< std::size_t, ShapeValues > &circleShapeValues, const std::vector< Scalar > &circleIpWeight, const std::vector< std::size_t > &circleStencil)
Definition: pointsourcedata.hh:223
PointSourceDataCircleAverage()
Definition: pointsourcedata.hh:170
BulkPrimaryVariables interpolateBulk(const BulkSolutionVector &sol)
Definition: pointsourcedata.hh:172
void addCircleInterpolation(const std::vector< Scalar > &circleIpWeight, const std::vector< std::size_t > &circleStencil)
Definition: pointsourcedata.hh:236
Declares all properties used in Dumux.