41 searchableSurfaceCollection,
50 void Foam::searchableSurfaceCollection::findNearest
54 List<pointIndexHit>& nearestInfo,
59 nearestInfo.setSize(samples.size());
61 nearestSurf.setSize(samples.size());
64 List<pointIndexHit> hitInfo(samples.size());
66 const scalarField localMinDistSqr(samples.size(), GREAT);
70 subGeom_[surfI].findNearest
74 transform_[surfI].localPosition(samples),
83 if (hitInfo[pointI].hit())
87 point globalPt = transform_[surfI].globalPosition
91 hitInfo[pointI].rawPoint(),
96 scalar distSqr =
magSqr(globalPt - samples[pointI]);
98 if (distSqr < minDistSqr[pointI])
100 minDistSqr[pointI] = distSqr;
101 nearestInfo[pointI].setPoint(globalPt);
102 nearestInfo[pointI].setHit();
103 nearestInfo[pointI].setIndex
105 hitInfo[pointI].index()
106 + indexOffset_[surfI]
108 nearestSurf[pointI] = surfI;
118 void Foam::searchableSurfaceCollection::sortHits
120 const List<pointIndexHit>& info,
121 List<List<pointIndexHit> >& surfInfo,
130 if (info[pointI].hit())
132 label index = info[pointI].index();
133 label surfI =
findLower(indexOffset_, index+1);
139 surfInfo.setSize(subGeom_.size());
141 infoMap.setSize(subGeom_.size());
145 surfInfo[surfI].setSize(nHits[surfI]);
146 infoMap[surfI].setSize(nHits[surfI]);
152 if (info[pointI].hit())
154 label index = info[pointI].index();
155 label surfI =
findLower(indexOffset_, index+1);
159 label localI = nHits[surfI]++;
163 info[pointI].rawPoint(),
164 index-indexOffset_[surfI]
166 infoMap[surfI][localI] = pointI;
174 Foam::searchableSurfaceCollection::searchableSurfaceCollection
181 instance_(dict.
size()),
183 transform_(dict.
size()),
184 subGeom_(dict.
size()),
185 mergeSubRegions_(dict.
lookup(
"mergeSubRegions")),
186 indexOffset_(dict.
size()+1)
191 label startIndex = 0;
194 if (dict.
isDict(iter().keyword()))
196 instance_[surfI] = iter().keyword();
200 scale_[surfI] = subDict.
lookup(
"scale");
211 const word subGeomName(subDict.
lookup(
"surface"));
220 if (s.size() != s.globalSize())
224 "searchableSurfaceCollection::searchableSurfaceCollection"
225 "(const IOobject&, const dictionary&)"
226 ) <<
"Cannot use a distributed surface in a collection."
230 subGeom_.set(surfI, &const_cast<searchableSurface&>(s));
232 indexOffset_[surfI] = startIndex;
233 startIndex += subGeom_[surfI].size();
235 Info<<
" instance : " << instance_[surfI] <<
endl;
236 Info<<
" surface : " << s.name() <<
endl;
237 Info<<
" scale : " << scale_[surfI] <<
endl;
238 Info<<
" coordsys : " << transform_[surfI] <<
endl;
243 indexOffset_[surfI] = startIndex;
245 instance_.setSize(surfI);
246 scale_.setSize(surfI);
247 transform_.setSize(surfI);
248 subGeom_.setSize(surfI);
249 indexOffset_.setSize(surfI+1);
263 if (regions_.size() == 0)
265 regionOffset_.
setSize(subGeom_.size());
270 regionOffset_[surfI] = allRegions.
size();
272 if (mergeSubRegions_)
279 const wordList& subRegions = subGeom_[surfI].regions();
283 allRegions.
append(instance_[surfI] +
"_" + subRegions[i]);
287 regions_.transfer(allRegions.
shrink());
295 return indexOffset_[indexOffset_.size()-1];
309 const pointField subCoords = subGeom_[surfI].coordinates();
313 coords[coordI++] = transform_[surfI].globalPosition
328 void Foam::searchableSurfaceCollection::findNearest
369 transform_[surfI].localPosition
379 transform_[surfI].localPosition
386 subGeom_[surfI].findLine(e0, e1, hitInfo);
390 if (hitInfo[pointI].hit())
393 nearest[pointI] = transform_[surfI].globalPosition
397 hitInfo[pointI].rawPoint(),
401 info[pointI] = hitInfo[pointI];
402 info[pointI].rawPoint() = nearest[pointI];
403 info[pointI].setIndex
405 hitInfo[pointI].index()
406 + indexOffset_[surfI]
418 if (info[pointI].hit())
420 vector n(end[pointI] - start[pointI]);
421 scalar magN =
mag(n);
427 scalar s = ((info[pointI].rawPoint()-start[pointI])&n);
433 "searchableSurfaceCollection::findLine(..)"
434 ) <<
"point:" << info[pointI]
436 <<
" outside vector "
437 <<
" start:" << start[pointI]
438 <<
" end:" << end[pointI]
456 findLine(start, end, info);
469 findLine(start, end, nearestInfo);
474 if (nearestInfo[pointI].hit())
477 info[pointI][0] = nearestInfo[pointI];
481 info[pointI].
clear();
493 if (subGeom_.size() == 0)
495 else if (subGeom_.size() == 1)
497 if (mergeSubRegions_)
500 region = regionOffset_[0];
504 subGeom_[0].getRegion(info, region);
515 sortHits(info, surfInfo, infoMap);
522 if (mergeSubRegions_)
530 region[map[i]] = regionOffset_[surfI];
539 subGeom_[surfI].getRegion(surfInfo[surfI], surfRegion);
544 region[map[i]] = regionOffset_[surfI] + surfRegion[i];
558 if (subGeom_.size() == 0)
560 else if (subGeom_.size() == 1)
562 subGeom_[0].getNormal(info, normal);
572 sortHits(info, surfInfo, infoMap);
580 subGeom_[surfI].getNormal(surfInfo[surfI], surfNormal);
585 normal[map[i]] = surfNormal[i];
600 "searchableSurfaceCollection::getVolumeType(const pointField&"
601 ", List<volumeType>&) const"
602 ) <<
"Volume type not supported for collection."
610 const bool keepNonLocal,
630 subGeom_[surfI].distribute
645 subGeom_[surfI].setField
647 static_cast<const labelList&>
652 subGeom_[surfI].size(),
667 if (subGeom_.size() == 0)
669 else if (subGeom_.size() == 1)
671 subGeom_[0].getField(info, values);
681 sortHits(info, surfInfo, infoMap);
687 subGeom_[surfI].getField(surfInfo[surfI], surfValues);
689 if (surfValues.
size())
697 values[map[i]] = surfValues[i];