109 ElementMapper elemMapper(gridView_, Dune::mcmgElementLayout());
110 unsigned numElements = elemMapper.size();
121 weightsProd_.clear();
124 if (num_threads == 1) {
125 weightsAvg_.reserve(numElements * 3 * 1.05);
126 weightsProd_.reserve(numElements * 3 * 1.05);
127 distance_.reserve(numElements * 3 * 1.05);
128 faceNormal_.reserve(numElements * 3 * 1.05);
130 weightsAvgBoundary_.clear();
131 weightsProdBoundary_.clear();
132 distanceBoundary_.clear();
133 faceNormalBoundary_.clear();
136 centroids_cache_.resize(gridView_.size(0));
137 for (
const auto& elem : elements(gridView_)) {
138 const unsigned elemIdx = elemMapper.index(elem);
139 centroids_cache_[elemIdx] = centroids_(elemIdx);
143 ThreadSafeMapBuilder weightsAvgMap(weightsAvg_, num_threads, MapBuilderInsertionMode::Insert_Or_Assign);
144 ThreadSafeMapBuilder weightsProdMap(weightsProd_, num_threads, MapBuilderInsertionMode::Insert_Or_Assign);
145 ThreadSafeMapBuilder distanceMap(distance_, num_threads, MapBuilderInsertionMode::Insert_Or_Assign);
146 ThreadSafeMapBuilder faceNormalMap(faceNormal_, num_threads, MapBuilderInsertionMode::Insert_Or_Assign);
148 ThreadSafeMapBuilder weightsAvgBoundaryMap(weightsAvgBoundary_, num_threads, MapBuilderInsertionMode::Insert_Or_Assign);
149 ThreadSafeMapBuilder weightsProdBoundaryMap(weightsProdBoundary_, num_threads, MapBuilderInsertionMode::Insert_Or_Assign);
150 ThreadSafeMapBuilder distanceBoundaryMap(distanceBoundary_, num_threads, MapBuilderInsertionMode::Insert_Or_Assign);
151 ThreadSafeMapBuilder faceNormalBoundaryMap(faceNormalBoundary_, num_threads, MapBuilderInsertionMode::Insert_Or_Assign);
154#pragma omp parallel for
157 for (
const auto& chunk : ElementChunks(gridView_, Dune::Partitions::all, num_threads)) {
158 for (
const auto& elem : chunk) {
162 DimVector faceNormal;
165 inside.elemIdx = elemMapper.index(elem);
166 inside.cartElemIdx = lookUpCartesianData_.
167 template getFieldPropCartesianIdx<Grid>(inside.elemIdx);
170 unsigned boundaryIsIdx = 0;
171 for (
const auto& intersection : intersections(gridView_, elem)) {
173 if (intersection.boundary()) {
175 const auto& geometry = intersection.geometry();
176 inside.faceCenter = geometry.center();
177 faceNormal = intersection.centerUnitOuterNormal();
180 const auto index_pair = std::make_pair(inside.elemIdx, boundaryIsIdx);
182 distanceBoundaryMap.insert_or_assign(index_pair, distBound);
184 Scalar weightsAvgBound = 1.0;
185 Scalar weightsProdBound = 0.0;
186 weightsAvgBoundaryMap.insert_or_assign(index_pair, weightsAvgBound);
187 weightsProdBoundaryMap.insert_or_assign(index_pair, weightsProdBound);
189 faceNormalBoundaryMap.insert_or_assign(index_pair, faceNormal);
196 if (!intersection.neighbor()) {
202 const auto& outsideElem = intersection.outside();
203 outside.elemIdx = elemMapper.index(outsideElem);
204 outside.cartElemIdx = lookUpCartesianData_.
205 template getFieldPropCartesianIdx<Grid>(outside.elemIdx);
208 if (std::tie(inside.cartElemIdx, inside.elemIdx) > std::tie(outside.cartElemIdx, outside.elemIdx)) {
213 inside.faceIdx = intersection.indexInInside();
214 outside.faceIdx = intersection.indexInOutside();
217 if (inside.faceIdx == -1) {
218 const auto id = details::isIdTPSA(inside.elemIdx, outside.elemIdx);
219 weightsAvgMap.insert_or_assign(
id, 0.0);
220 distanceMap.insert_or_assign(
id, 0.0);
221 faceNormalMap.insert_or_assign(
id, DimVector{0.0, 0.0, 0.0});
227 typename std::is_same<Grid, Dune::CpGrid>::type isCpGrid;
235 const auto id = details::isIdTPSA(inside.elemIdx, outside.elemIdx);
238 distanceMap.insert_or_assign(
id, dist_in + dist_out);
240 Scalar weight_in =
computeWeight_(dist_in, sModulus_[inside.elemIdx]);
241 Scalar weight_out =
computeWeight_(dist_out, sModulus_[outside.elemIdx]);
242 Scalar weightsAvg = weight_in / (weight_in + weight_out);
243 Scalar weightsProd = weight_in * weight_out;
244 weightsAvgMap.insert_or_assign(
id, weightsAvg);
245 weightsProdMap.insert_or_assign(
id, weightsProd);
247 faceNormalMap.insert_or_assign(
id, faceNormal);
253 centroids_cache_.clear();
256#pragma omp parallel sections
262 weightsAvgMap.finalize();
266 weightsProdMap.finalize();
270 distanceMap.finalize();
274 faceNormalMap.finalize();
278 weightsAvgBoundaryMap.finalize();
282 weightsProdBoundaryMap.finalize();
286 distanceBoundaryMap.finalize();
290 faceNormalBoundaryMap.finalize();
555 unsigned numElem = gridView_.size(0);
556 sModulus_.resize(numElem);
558 const auto& fp = eclState_.fieldProps();
559 std::vector<double> sModulusData;
560 if (fp.has_double(
"SMODULUS")) {
561 sModulusData = this->lookUpData_.assignFieldPropsDoubleOnLeaf(fp,
"SMODULUS");
563 else if (fp.has_double(
"YMODULE") && fp.has_double(
"LAME")) {
565 const std::vector<double>& ymodulus = this->lookUpData_.assignFieldPropsDoubleOnLeaf(fp,
"YMODULE");
566 const std::vector<double>& lameParam = this->lookUpData_.assignFieldPropsDoubleOnLeaf(fp,
"LAME");
567 sModulusData.resize(numElem);
568 for (std::size_t i = 0; i < sModulusData.size(); ++i) {
569 const double r = std::sqrt(ymodulus[i] * ymodulus[i] + 9 * lameParam[i] * lameParam[i]
570 + 2 * ymodulus[i] * lameParam[i]);
571 sModulusData[i] = (ymodulus[i] - 3 * lameParam[i] + r) / 4.0;
574 else if (fp.has_double(
"YMODULE") && fp.has_double(
"PRATIO")) {
575 const std::vector<double>& ymodulus = this->lookUpData_.assignFieldPropsDoubleOnLeaf(fp,
"YMODULE");
576 const std::vector<double>& pratio = this->lookUpData_.assignFieldPropsDoubleOnLeaf(fp,
"PRATIO");
577 sModulusData.resize(numElem);
578 for (std::size_t i = 0; i < sModulusData.size(); ++i) {
579 sModulusData[i] = ymodulus[i] / (2 * (1 + pratio[i]));
582 else if (fp.has_double(
"LAME") && fp.has_double(
"PRATIO")) {
583 const std::vector<double>& lameParam = this->lookUpData_.assignFieldPropsDoubleOnLeaf(fp,
"LAME");
584 const std::vector<double>& pratio = this->lookUpData_.assignFieldPropsDoubleOnLeaf(fp,
"PRATIO");
585 sModulusData.resize(numElem);
586 for (std::size_t i = 0; i < sModulusData.size(); ++i) {
587 sModulusData[i] = lameParam[i] * (1 - 2 * pratio[i]) / (2 * pratio[i]);
591 throw std::logic_error(
"Cannot read shear modulus data from ecl state, SMODULUS keyword missing, "
592 "and one of the following keyword pairs are missing for conversion: "
593 "(YMODULE, LAME), (YMODULE, PRATIO) and (LAME, PRATIO)!");
597 for (std::size_t dofIdx = 0; dofIdx < numElem; ++ dofIdx) {
598 sModulus_[dofIdx] = sModulusData[dofIdx];