28 #include "triSurface.H"
47 label totalTriangles = 0;
55 surface.hasVolumeType()
70 surface.getVolumeType(pts, vTypes);
72 referenceVolumeTypes[
s] = vTypes[0];
76 <<
" surface " << surface.name()
80 if (isA<triSurface>(surface))
82 const triSurface&
triSurf = refCast<const triSurface>(surface);
86 Info<<
" Checking " << surface.name() <<
endl;
113 Info<<
" has " << nBaffles <<
" baffles out of "
116 totalTriangles +=
triSurf.size();
120 Info<<
" Sum of all the surface normals (if near zero, surface is"
121 <<
" probably closed):" <<
nl
122 <<
" Note: Does not include baffle surfaces in calculation" <<
nl
123 <<
" Sum = " <<
sum/(totalTriangles + SMALL) <<
nl
124 <<
" mag(Sum) = " <<
mag(
sum)/(totalTriangles + SMALL)
132 const dictionary& featureDict,
133 const word& surfaceName,
138 featureDict.lookupOrDefault<word>(
"featureMethod",
"none");
140 if (featureMethod ==
"extendedFeatureEdgeMesh")
142 fileName feMeshName(featureDict.lookup(
"extendedFeatureEdgeMesh"));
144 Info<<
" features: " << feMeshName <<
endl;
149 new extendedFeatureEdgeMesh
154 runTime_.time().constant(),
155 "extendedFeatureEdgeMesh",
165 else if (featureMethod ==
"extractFeatures")
167 const searchableSurface& surface = allGeometry_[surfaces_[surfI]];
169 Info<<
" features: " << surface.name()
170 <<
" of type " << surface.type()
171 <<
", id: " << featureIndex <<
endl;
173 autoPtr<searchableSurfaceFeatures> ssFeatures
178 if (ssFeatures().hasFeatures())
183 ssFeatures().features()
191 << surface.name() <<
" of type "
192 << surface.type() <<
" does not have features"
196 else if (featureMethod ==
"none")
203 <<
"No valid featureMethod found for surface " << surfaceName
204 <<
nl <<
"Use \"extendedFeatureEdgeMesh\" "
205 <<
"or \"extractFeatures\"."
212 const dictionary& featureDict,
213 const word& surfaceName,
218 featureDict.lookupOrDefault<word>(
"featureMethod",
"none");
220 if (featureMethod ==
"extendedFeatureEdgeMesh")
222 fileName feMeshName(featureDict.lookup(
"extendedFeatureEdgeMesh"));
224 Info<<
" features: " << feMeshName <<
", id: " << featureIndex
230 new extendedFeatureEdgeMesh
235 runTime_.time().constant(),
236 "extendedFeatureEdgeMesh",
246 else if (featureMethod ==
"none")
253 <<
"No valid featureMethod found for surface " << surfaceName
254 <<
nl <<
"Use \"extendedFeatureEdgeMesh\" "
255 <<
"or \"extractFeatures\"."
267 const searchableSurfaces& allGeometry,
268 const dictionary& surfaceConformationDict
273 allGeometry_(allGeometry),
275 locationInMesh_(surfaceConformationDict.
lookup(
"locationInMesh")),
277 allGeometryToSurfaces_(),
278 normalVolumeTypes_(),
284 referenceVolumeTypes_(0)
286 const dictionary& surfacesDict
288 surfaceConformationDict.subDict(
"geometryToConformTo")
291 const dictionary& additionalFeaturesDict
293 surfaceConformationDict.subDict(
"additionalFeatures")
302 forAll(allGeometry.names(), geomI)
304 const word& geomName = allGeometry_.names()[geomI];
306 if (surfacesDict.found(geomName))
312 const label nAddFeat = additionalFeaturesDict.size();
314 Info<<
nl <<
"Reading geometryToConformTo" <<
endl;
316 allGeometryToSurfaces_.setSize(allGeometry_.size(), -1);
318 normalVolumeTypes_.setSize(surfI);
319 surfaces_.setSize(surfI);
320 surfZones_.setSize(surfI);
323 features_.setSize(surfI + nAddFeat);
327 regionOffset_.setSize(surfI, 0);
329 PtrList<dictionary> globalPatchInfo(surfI);
334 HashSet<word> unmatchedKeys(surfacesDict.toc());
337 forAll(allGeometry_.names(), geomI)
339 const word& geomName = allGeometry_.names()[geomI];
341 const entry* ePtr = surfacesDict.lookupEntryPtr(geomName,
false,
true);
345 const dictionary&
dict = ePtr->dict();
346 unmatchedKeys.
erase(ePtr->keyword());
348 surfaces_[surfI] = geomI;
350 const searchableSurface& surface = allGeometry_[surfaces_[surfI]];
355 surfZones_.set(surfI,
new surfaceZonesInfo(surface,
dict));
358 allGeometryToSurfaces_[surfaces_[surfI]] = surfI;
363 allGeometry_.regionNames()[surfaces_[surfI]];
365 patchNames_.
append(regionNames);
367 globalVolumeTypes[surfI] =
379 if (!globalVolumeTypes[surfI])
381 if (!surface.hasVolumeType())
384 <<
"Non-baffle surface "
386 <<
" does not allow inside/outside queries."
387 <<
" This usually is an error." <<
endl;
409 const wordList& rNames = surface.regions();
413 const dictionary& regionsDict =
dict.
subDict(
"regions");
424 const dictionary& regionDict = regionsDict.subDict
429 if (regionDict.found(
"patchInfo"))
431 regionPatchInfo[surfI].insert
434 regionDict.subDict(
"patchInfo").clone()
438 regionVolumeTypes[surfI].insert
443 regionDict.lookupOrDefault<word>
451 readFeatures(regionDict,
regionName, featureI);
461 if (unmatchedKeys.size() > 0)
466 ) <<
"Not all entries in conformationSurfaces dictionary were used."
467 <<
" The following entries were not used : "
468 << unmatchedKeys.sortedToc()
478 regionOffset_[surfI] = nRegions;
480 const searchableSurface& surface = allGeometry_[surfaces_[surfI]];
481 nRegions += surface.regions().size();
485 patchInfo_.setSize(nRegions);
486 normalVolumeTypes_.setSize(nRegions);
490 const searchableSurface& surface = allGeometry_[surfaces_[surfI]];
492 label nRegions = surface.regions().size();
495 for (
label i = 0; i < nRegions; i++)
497 label globalRegionI = regionOffset_[surfI] + i;
498 normalVolumeTypes_[globalRegionI] = globalVolumeTypes[surfI];
499 if (globalPatchInfo.set(surfI))
504 globalPatchInfo[surfI].clone()
511 label globalRegionI = regionOffset_[surfI] + iter.key();
513 normalVolumeTypes_[globalRegionI] =
514 regionVolumeTypes[surfI][iter.key()];
517 const Map<autoPtr<dictionary> >& localInfo = regionPatchInfo[surfI];
520 label globalRegionI = regionOffset_[surfI] + iter.key();
522 patchInfo_.set(globalRegionI, iter()().clone());
528 if (!additionalFeaturesDict.empty())
530 Info<<
nl <<
"Reading additionalFeatures" <<
endl;
535 word featureName = iter().keyword();
539 const dictionary& featureSubDict
541 additionalFeaturesDict.subDict(featureName)
544 readFeatures(featureSubDict, featureName, featureI);
548 features_.setSize(featureI);
550 globalBounds_ = treeBoundBox
559 vector newSpan = 1
e-4*globalBounds_.span();
561 globalBounds_.min() -= newSpan;
562 globalBounds_.max() += newSpan;
568 referenceVolumeTypes_.setSize
575 <<
"Testing for locationInMesh " << locationInMesh_ <<
endl;
577 hasBoundedVolume(referenceVolumeTypes_);
581 Info<<
"Names = " << allGeometry_.names() <<
endl;
582 Info<<
"Surfaces = " << surfaces_ <<
endl;
583 Info<<
"AllGeom to Surfaces = " << allGeometryToSurfaces_ <<
endl;
584 Info<<
"Volume types = " << normalVolumeTypes_ <<
endl;
585 Info<<
"Patch names = " << patchNames_ <<
endl;
586 Info<<
"Region Offset = " << regionOffset_ <<
endl;
590 Info<< features_[fI].name() <<
endl;
608 if (allGeometry_[surfaces_[
s]].overlaps(bb))
623 return wellInside(samplePts,
scalarField(samplePts.size(), 0.0));
629 const point& samplePt
641 return wellOutside(samplePts,
scalarField(samplePts.size(), 0.0));
647 const point& samplePt
659 const bool testForInside
675 const searchableSurface& surface(allGeometry_[surfaces_[
s]]);
677 const label regionI = regionOffset_[
s];
681 surface.getVolumeType(samplePts, surfaceVolumeTests[
s]);
690 Field<bool> insideOutsidePoint(samplePts.size(), testForInside);
714 insideOutsidePoint[i] =
false;
721 const label regionI = regionOffset_[
s];
728 const searchableSurface& surface(allGeometry_[surfaces_[
s]]);
732 !surface.hasVolumeType()
740 surface.findNearest(sample, nearestDistSqr, info);
742 vector hitDir = info[0].rawPoint() - samplePts[i];
743 hitDir /=
mag(hitDir) + SMALL;
748 findSurfaceNearestIntersection
751 info[0].rawPoint() - 1
e-3*
mag(hitDir)*hitDir,
756 if (surfHit.hit() && hitSurface != surfaces_[
s])
766 normalVolumeTypes_[regionI]
770 insideOutsidePoint[i] = !testForInside;
778 normalVolumeTypes_[regionI]
782 insideOutsidePoint[i] = !testForInside;
789 return insideOutsidePoint;
799 return wellInOutSide(samplePts, testDistSqr,
true);
805 const point& samplePt,
819 return wellInOutSide(samplePts, testDistSqr,
false);
825 const point& samplePt,
852 return hitInfo[0].hit();
877 surfHit = hitInfo[0];
885 hitSurface = surfaces_[hitSurfaces[0]];
911 surfHit = hitInfo[0];
913 hitSurface.setSize(hitSurfaces[0].size());
915 forAll(hitSurfaces[0], surfI)
921 hitSurface[surfI] = surfaces_[hitSurfaces[0][surfI]];
951 surfHit = hitInfoStart[0];
959 hitSurface = surfaces_[hitSurfacesStart[0]];
967 scalar nearestDistSqr,
985 surfHit = surfaceHits[0];
993 hitSurface = surfaces_[hitSurfaces[0]];
1018 if (surfaceHits[i].hit())
1024 hitSurfaces[i] = surfaces_[hitSurfaces[i]];
1032 const point& sample,
1033 scalar nearestDistSqr,
1039 scalar minDistSqr = nearestDistSqr;
1044 features_[testI].nearestFeaturePoint
1053 minDistSqr =
magSqr(hitInfo.hitPoint()- sample);
1063 const point& sample,
1064 scalar nearestDistSqr,
1083 edgeHit = edgeHits[0];
1084 featureHit = featuresHit[0];
1097 featuresHit.setSize(
samples.size());
1099 edgeHits.setSize(
samples.size());
1107 features_[testI].nearestFeatureEdge
1117 if (hitInfo[pointI].hit())
1119 minDistSqr[pointI] =
magSqr
1121 hitInfo[pointI].hitPoint()
1124 edgeHits[pointI] = hitInfo[pointI];
1125 featuresHit[pointI] = testI;
1134 const point& sample,
1135 scalar nearestDistSqr,
1151 features_[testI].nearestFeatureEdgeByType
1161 if (hitInfo[typeI].hit())
1163 minDistSqr[typeI] =
magSqr(hitInfo[typeI].hitPoint() - sample);
1164 edgeHits[typeI] = hitInfo[typeI];
1165 featuresHit[typeI] = testI;
1174 const point& sample,
1175 const scalar searchRadiusSqr,
1190 features_[testI].allNearestFeatureEdges
1197 bool anyHit =
false;
1200 if (hitInfo[hitI].hit())
1208 edgeHitsByFeature.append(hitInfo);
1209 featuresHit.append(testI);
1217 OFstream ftStr(runTime_.time().path()/prefix +
"_allFeatures.obj");
1219 Pout<<
nl <<
"Writing all features to " << ftStr.name() <<
endl;
1225 const extendedFeatureEdgeMesh& fEM(features_[i]);
1229 ftStr <<
"g " << fEM.name() <<
endl;
1233 const edge&
e = eds[j];
1237 ftStr <<
"l " << verti-1 <<
' ' << verti <<
endl;
1252 findSurfaceAnyIntersection(ptA, ptB, surfHit, hitSurface);
1254 return getPatchID(hitSurface, surfHit);
1263 findSurfaceNearest(pt,
sqr(GREAT), surfHit, hitSurface);
1265 return getPatchID(hitSurface, surfHit);
1271 const label hitSurface,
1282 allGeometry_[hitSurface].getRegion
1288 const label patchID =
1290 + regionOffset_[allGeometryToSurfaces_[hitSurface]];
1299 const label hitSurface,
1303 const label patchID = getPatchID(hitSurface, surfHit);
1310 return normalVolumeTypes_[patchID];
1316 const label hitSurface,
1321 allGeometry_[hitSurface].getNormal(surfHit,
normal);
1323 const label patchID = regionOffset_[allGeometryToSurfaces_[hitSurface]];