25#ifndef DUMUX_POINTSOURCEDATA_HH
26#define DUMUX_POINTSOURCEDATA_HH
29#include <unordered_map>
30#include <dune/common/fvector.hh>
41template<
class MDTraits>
44 using Scalar =
typename MDTraits::Scalar;
45 using ShapeValues =
typename std::vector<Dune::FieldVector<Scalar, 1> >;
48 using BulkTypeTag =
typename MDTraits::template SubDomain<0>::TypeTag;
49 using LowDimTypeTag =
typename MDTraits::template SubDomain<1>::TypeTag;
64 const std::vector<std::size_t>& cornerIndices,
67 bulkElementIdx_ = eIdx;
68 bulkCornerIndices_ = cornerIndices;
69 bulkShapeValues_ = shapeValues;
73 const std::vector<std::size_t>& cornerIndices,
76 lowDimElementIdx_ = eIdx;
77 lowDimCornerIndices_ = cornerIndices;
78 lowDimShapeValues_ = shapeValues;
84 bulkElementIdx_ = eIdx;
90 lowDimElementIdx_ = eIdx;
95 BulkPrimaryVariables bulkPriVars(0.0);
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];
111 LowDimPrimaryVariables lowDimPriVars(0.0);
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];
122 return lowDimPriVars;
126 {
return lowDimElementIdx_; }
129 {
return bulkElementIdx_; }
132 ShapeValues bulkShapeValues_, lowDimShapeValues_;
133 std::vector<std::size_t> bulkCornerIndices_, lowDimCornerIndices_;
134 std::size_t lowDimElementIdx_;
135 std::size_t bulkElementIdx_;
147template<
class MDTraits>
151 using Scalar =
typename MDTraits::Scalar;
152 using ShapeValues =
typename std::vector<Dune::FieldVector<Scalar, 1> >;
155 using BulkTypeTag =
typename MDTraits::template SubDomain<0>::TypeTag;
156 using LowDimTypeTag =
typename MDTraits::template SubDomain<1>::TypeTag;
177 BulkPrimaryVariables bulkPriVars(sol[0]);
179 if (enableBulkCircleInterpolation_)
185 assert(circleCornerIndices_.size() == circleShapeValues_.size());
187 Scalar weightSum = 0.0;
188 for (std::size_t j = 0; j < circleStencil_.size(); ++j)
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];
197 priVars *= circleIpWeight_[j];
198 weightSum += circleIpWeight_[j];
199 bulkPriVars += priVars;
201 bulkPriVars /= weightSum;
205 Scalar weightSum = 0.0;
206 for (std::size_t j = 0; j < circleStencil_.size(); ++j)
208 for (std::size_t priVarIdx = 0; priVarIdx < bulkPriVars.size(); ++priVarIdx)
209 bulkPriVars[priVarIdx] += sol[circleStencil_[j]][priVarIdx]*circleIpWeight_[j];
211 weightSum += circleIpWeight_[j];
213 bulkPriVars /= weightSum;
224 const std::unordered_map<std::size_t, ShapeValues>& circleShapeValues,
225 const std::vector<Scalar>& circleIpWeight,
228 circleCornerIndices_ = circleCornerIndices;
229 circleShapeValues_ = circleShapeValues;
230 circleIpWeight_ = circleIpWeight;
232 enableBulkCircleInterpolation_ =
true;
239 circleIpWeight_ = circleIpWeight;
241 enableBulkCircleInterpolation_ =
true;
246 return circleStencil_;
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_;
The available discretization methods in Dumux.
make the local view function available whenever we use the grid geometry
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.