mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH:autoSnapDriver: added support for facezones
This commit is contained in:
@ -722,10 +722,15 @@ void Foam::autoSnapDriver::preSmoothPatch
|
|||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
const_cast<Time&>(mesh.time())++;
|
const_cast<Time&>(mesh.time())++;
|
||||||
Pout<< "Writing patch smoothed mesh to time " << meshRefiner_.timeName()
|
Pout<< "Writing patch smoothed mesh to time "
|
||||||
<< endl;
|
<< meshRefiner_.timeName() << '.' << endl;
|
||||||
|
meshRefiner_.write
|
||||||
mesh.write();
|
(
|
||||||
|
debug,
|
||||||
|
mesh.time().path()/meshRefiner_.timeName()
|
||||||
|
);
|
||||||
|
Pout<< "Dumped mesh in = "
|
||||||
|
<< mesh.time().cpuTimeIncrement() << " s\n" << nl << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
Info<< "Patch points smoothed in = "
|
Info<< "Patch points smoothed in = "
|
||||||
@ -956,25 +961,6 @@ Foam::vectorField Foam::autoSnapDriver::calcNearestSurface
|
|||||||
vector(GREAT, GREAT, GREAT) // null value (note: cannot use VGREAT)
|
vector(GREAT, GREAT, GREAT) // null value (note: cannot use VGREAT)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
// Check for displacement being outwards.
|
|
||||||
outwardsDisplacement(pp, patchDisp);
|
|
||||||
|
|
||||||
// Set initial distribution of displacement field (on patches) from
|
|
||||||
// patchDisp and make displacement consistent with b.c. on displacement
|
|
||||||
// pointVectorField.
|
|
||||||
meshMover.setDisplacement(patchDisp);
|
|
||||||
|
|
||||||
if (debug)
|
|
||||||
{
|
|
||||||
dumpMove
|
|
||||||
(
|
|
||||||
mesh.time().path()/"patchDisplacement.obj",
|
|
||||||
pp.localPoints(),
|
|
||||||
pp.localPoints() + patchDisp
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return patchDisp;
|
return patchDisp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1128,8 +1114,8 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::autoSnapDriver::repatchToSurface
|
|||||||
indirectPrimitivePatch& pp = ppPtr();
|
indirectPrimitivePatch& pp = ppPtr();
|
||||||
|
|
||||||
// Divide surfaces into zoned and unzoned
|
// Divide surfaces into zoned and unzoned
|
||||||
labelList zonedSurfaces = meshRefiner_.surfaces().getNamedSurfaces();
|
labelList zonedSurfaces = surfaces.getNamedSurfaces();
|
||||||
labelList unzonedSurfaces = meshRefiner_.surfaces().getUnnamedSurfaces();
|
labelList unzonedSurfaces = surfaces.getUnnamedSurfaces();
|
||||||
|
|
||||||
|
|
||||||
// Faces that do not move
|
// Faces that do not move
|
||||||
@ -1344,19 +1330,6 @@ void Foam::autoSnapDriver::doSnap
|
|||||||
// Pre-smooth patch vertices (so before determining nearest)
|
// Pre-smooth patch vertices (so before determining nearest)
|
||||||
preSmoothPatch(snapParams, nInitErrors, baffles, meshMover);
|
preSmoothPatch(snapParams, nInitErrors, baffles, meshMover);
|
||||||
|
|
||||||
if (debug)
|
|
||||||
{
|
|
||||||
Pout<< "Writing patch smoothed mesh to time "
|
|
||||||
<< meshRefiner_.timeName() << '.' << endl;
|
|
||||||
meshRefiner_.write
|
|
||||||
(
|
|
||||||
debug,
|
|
||||||
mesh.time().path()/meshRefiner_.timeName()
|
|
||||||
);
|
|
||||||
Pout<< "Dumped mesh in = "
|
|
||||||
<< mesh.time().cpuTimeIncrement() << " s\n" << nl << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for (label iter = 0; iter < nFeatIter; iter++)
|
for (label iter = 0; iter < nFeatIter; iter++)
|
||||||
{
|
{
|
||||||
@ -1382,6 +1355,15 @@ void Foam::autoSnapDriver::doSnap
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for displacement being outwards.
|
||||||
|
outwardsDisplacement(ppPtr(), disp);
|
||||||
|
|
||||||
|
// Set initial distribution of displacement field (on patches)
|
||||||
|
// from patchDisp and make displacement consistent with b.c.
|
||||||
|
// on displacement pointVectorField.
|
||||||
|
meshMover.setDisplacement(disp);
|
||||||
|
|
||||||
|
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::OBJINTERSECTIONS)
|
||||||
{
|
{
|
||||||
dumpMove
|
dumpMove
|
||||||
@ -1467,7 +1449,7 @@ void Foam::autoSnapDriver::doSnap
|
|||||||
meshRefiner_.write
|
meshRefiner_.write
|
||||||
(
|
(
|
||||||
debug,
|
debug,
|
||||||
mesh.time().path()/meshRefiner_.timeName()
|
meshRefiner_.timeName()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -117,12 +117,12 @@ class autoSnapDriver
|
|||||||
const List<pointConstraint>& constraints,
|
const List<pointConstraint>& constraints,
|
||||||
vectorField& disp
|
vectorField& disp
|
||||||
) const;
|
) const;
|
||||||
void calcNearest
|
//void calcNearest
|
||||||
(
|
//(
|
||||||
const pointField& points,
|
// const pointField& points,
|
||||||
vectorField& disp,
|
// vectorField& disp,
|
||||||
vectorField& surfaceNormal
|
// vectorField& surfaceNormal
|
||||||
) const;
|
//) const;
|
||||||
void calcNearestFace
|
void calcNearestFace
|
||||||
(
|
(
|
||||||
const label iter,
|
const label iter,
|
||||||
|
|||||||
@ -135,63 +135,6 @@ void Foam::autoSnapDriver::smoothAndConstrain
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::autoSnapDriver::calcNearest
|
|
||||||
(
|
|
||||||
const pointField& points,
|
|
||||||
vectorField& disp,
|
|
||||||
vectorField& surfaceNormal
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
const refinementSurfaces& surfaces = meshRefiner_.surfaces();
|
|
||||||
|
|
||||||
// Displacement and orientation per pp face.
|
|
||||||
disp.setSize(points.size());
|
|
||||||
disp = vector::zero;
|
|
||||||
surfaceNormal.setSize(points.size());
|
|
||||||
surfaceNormal = vector::zero;
|
|
||||||
|
|
||||||
{
|
|
||||||
// Divide surfaces into zoned and unzoned
|
|
||||||
labelList zonedSurfaces =
|
|
||||||
meshRefiner_.surfaces().getNamedSurfaces();
|
|
||||||
labelList unzonedSurfaces =
|
|
||||||
meshRefiner_.surfaces().getUnnamedSurfaces();
|
|
||||||
|
|
||||||
{
|
|
||||||
List<pointIndexHit> hitInfo;
|
|
||||||
labelList hitSurface;
|
|
||||||
labelList hitRegion;
|
|
||||||
surfaces.findNearestRegion
|
|
||||||
(
|
|
||||||
unzonedSurfaces,
|
|
||||||
points,
|
|
||||||
sqr(scalarField(points.size(), GREAT)),// sqr of attract dist
|
|
||||||
hitSurface,
|
|
||||||
hitInfo,
|
|
||||||
hitRegion,
|
|
||||||
surfaceNormal
|
|
||||||
);
|
|
||||||
|
|
||||||
forAll(hitInfo, i)
|
|
||||||
{
|
|
||||||
if (hitInfo[i].hit())
|
|
||||||
{
|
|
||||||
disp[i] =
|
|
||||||
hitInfo[i].hitPoint()
|
|
||||||
- points[i];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
WarningIn("calcNearest(..)")
|
|
||||||
<< "Did not hit anything from face:" << i
|
|
||||||
<< " at:" << points[i] << endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::autoSnapDriver::calcNearestFace
|
void Foam::autoSnapDriver::calcNearestFace
|
||||||
(
|
(
|
||||||
const label iter,
|
const label iter,
|
||||||
@ -202,6 +145,7 @@ void Foam::autoSnapDriver::calcNearestFace
|
|||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
const fvMesh& mesh = meshRefiner_.mesh();
|
const fvMesh& mesh = meshRefiner_.mesh();
|
||||||
|
const refinementSurfaces& surfaces = meshRefiner_.surfaces();
|
||||||
|
|
||||||
// Displacement and orientation per pp face.
|
// Displacement and orientation per pp face.
|
||||||
faceDisp.setSize(pp.size());
|
faceDisp.setSize(pp.size());
|
||||||
@ -209,7 +153,148 @@ void Foam::autoSnapDriver::calcNearestFace
|
|||||||
faceSurfaceNormal.setSize(pp.size());
|
faceSurfaceNormal.setSize(pp.size());
|
||||||
faceSurfaceNormal = vector::zero;
|
faceSurfaceNormal = vector::zero;
|
||||||
|
|
||||||
calcNearest(pp.faceCentres(), faceDisp, faceSurfaceNormal);
|
// Divide surfaces into zoned and unzoned
|
||||||
|
labelList zonedSurfaces = surfaces.getNamedSurfaces();
|
||||||
|
labelList unzonedSurfaces = surfaces.getUnnamedSurfaces();
|
||||||
|
|
||||||
|
// Per pp face the current surface snapped to
|
||||||
|
labelList snapSurf(pp.size(), -1);
|
||||||
|
|
||||||
|
|
||||||
|
// Do zoned surfaces
|
||||||
|
// ~~~~~~~~~~~~~~~~~
|
||||||
|
// Zoned faces only attract to corresponding surface
|
||||||
|
|
||||||
|
// Extract faces per zone
|
||||||
|
const wordList& faceZoneNames = surfaces.faceZoneNames();
|
||||||
|
|
||||||
|
forAll(zonedSurfaces, i)
|
||||||
|
{
|
||||||
|
label zoneSurfI = zonedSurfaces[i];
|
||||||
|
|
||||||
|
// Get indices of faces on pp that are also in zone
|
||||||
|
label zoneI = mesh.faceZones().findZoneID(faceZoneNames[zoneSurfI]);
|
||||||
|
if (zoneI == -1)
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"autoSnapDriver::calcNearestFace(..)"
|
||||||
|
) << "Problem. Cannot find zone " << faceZoneNames[zoneSurfI]
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
const faceZone& fZone = mesh.faceZones()[zoneI];
|
||||||
|
PackedBoolList isZonedFace(mesh.nFaces());
|
||||||
|
forAll(fZone, i)
|
||||||
|
{
|
||||||
|
isZonedFace[fZone[i]] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
DynamicList<label> ppFaces(fZone.size());
|
||||||
|
DynamicList<label> meshFaces(fZone.size());
|
||||||
|
forAll(pp.addressing(), i)
|
||||||
|
{
|
||||||
|
if (isZonedFace[pp.addressing()[i]])
|
||||||
|
{
|
||||||
|
snapSurf[i] = zoneSurfI;
|
||||||
|
ppFaces.append(i);
|
||||||
|
meshFaces.append(pp.addressing()[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Pout<< "For faceZone " << fZone.name()
|
||||||
|
// << " found " << ppFaces.size() << " out of " << pp.size()
|
||||||
|
// << endl;
|
||||||
|
|
||||||
|
pointField fc
|
||||||
|
(
|
||||||
|
indirectPrimitivePatch
|
||||||
|
(
|
||||||
|
IndirectList<face>(mesh.faces(), meshFaces),
|
||||||
|
mesh.points()
|
||||||
|
).faceCentres()
|
||||||
|
);
|
||||||
|
|
||||||
|
List<pointIndexHit> hitInfo;
|
||||||
|
labelList hitSurface;
|
||||||
|
labelList hitRegion;
|
||||||
|
vectorField hitNormal;
|
||||||
|
surfaces.findNearestRegion
|
||||||
|
(
|
||||||
|
labelList(1, zoneSurfI),
|
||||||
|
fc,
|
||||||
|
sqr(scalarField(fc.size(), GREAT)),// sqr of attract dist
|
||||||
|
hitSurface,
|
||||||
|
hitInfo,
|
||||||
|
hitRegion,
|
||||||
|
hitNormal
|
||||||
|
);
|
||||||
|
|
||||||
|
forAll(hitInfo, hitI)
|
||||||
|
{
|
||||||
|
if (hitInfo[hitI].hit())
|
||||||
|
{
|
||||||
|
label faceI = ppFaces[hitI];
|
||||||
|
faceDisp[faceI] = hitInfo[hitI].hitPoint() - fc[hitI];
|
||||||
|
faceSurfaceNormal[faceI] = hitNormal[hitI];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Do unzoned surfaces
|
||||||
|
// ~~~~~~~~~~~~~~~~~~~
|
||||||
|
// Unzoned faces attract to any unzoned surface
|
||||||
|
|
||||||
|
DynamicList<label> ppFaces(pp.size());
|
||||||
|
DynamicList<label> meshFaces(pp.size());
|
||||||
|
forAll(pp.addressing(), i)
|
||||||
|
{
|
||||||
|
if (snapSurf[i] == -1)
|
||||||
|
{
|
||||||
|
ppFaces.append(i);
|
||||||
|
meshFaces.append(pp.addressing()[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Pout<< "Found " << ppFaces.size() << " unzoned faces out of " << pp.size()
|
||||||
|
// << endl;
|
||||||
|
|
||||||
|
pointField fc
|
||||||
|
(
|
||||||
|
indirectPrimitivePatch
|
||||||
|
(
|
||||||
|
IndirectList<face>(mesh.faces(), meshFaces),
|
||||||
|
mesh.points()
|
||||||
|
).faceCentres()
|
||||||
|
);
|
||||||
|
|
||||||
|
List<pointIndexHit> hitInfo;
|
||||||
|
labelList hitSurface;
|
||||||
|
labelList hitRegion;
|
||||||
|
vectorField hitNormal;
|
||||||
|
surfaces.findNearestRegion
|
||||||
|
(
|
||||||
|
unzonedSurfaces,
|
||||||
|
fc,
|
||||||
|
sqr(scalarField(fc.size(), GREAT)),// sqr of attract dist
|
||||||
|
hitSurface,
|
||||||
|
hitInfo,
|
||||||
|
hitRegion,
|
||||||
|
hitNormal
|
||||||
|
);
|
||||||
|
|
||||||
|
forAll(hitInfo, hitI)
|
||||||
|
{
|
||||||
|
if (hitInfo[hitI].hit())
|
||||||
|
{
|
||||||
|
label faceI = ppFaces[hitI];
|
||||||
|
faceDisp[faceI] = hitInfo[hitI].hitPoint() - fc[hitI];
|
||||||
|
faceSurfaceNormal[faceI] = hitNormal[hitI];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Determine rotation
|
||||||
|
// ~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
// Determine rotation axis
|
// Determine rotation axis
|
||||||
faceRotation.setSize(pp.size());
|
faceRotation.setSize(pp.size());
|
||||||
@ -243,104 +328,6 @@ void Foam::autoSnapDriver::calcNearestFace
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Foam::autoSnapDriver::interpolateFaceToPoint
|
|
||||||
(
|
|
||||||
const label iter,
|
|
||||||
const indirectPrimitivePatch& pp,
|
|
||||||
const vectorField& faceSurfaceNormal,
|
|
||||||
const vectorField& faceDisp,
|
|
||||||
const vectorField& faceRotation,
|
|
||||||
|
|
||||||
vectorField& patchDisp,
|
|
||||||
vectorField& patchRotationDisp
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
const fvMesh& mesh = meshRefiner_.mesh();
|
|
||||||
|
|
||||||
// Displacement due to normal snapping
|
|
||||||
patchDisp.setSize(pp.nPoints());
|
|
||||||
patchDisp = vector::zero;
|
|
||||||
// Displacement due to rotation
|
|
||||||
patchRotationDisp.setSize(pp.nPoints());
|
|
||||||
patchRotationDisp = vector::zero;
|
|
||||||
|
|
||||||
|
|
||||||
// Unweighted interpolation
|
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
labelList nPatchDisp(pp.nPoints(), 0.0);
|
|
||||||
|
|
||||||
forAll(pp, faceI)
|
|
||||||
{
|
|
||||||
const face& f = pp.localFaces()[faceI];
|
|
||||||
const point& fc = pp.faceCentres()[faceI];
|
|
||||||
|
|
||||||
forAll(f, fp)
|
|
||||||
{
|
|
||||||
label pointI = f[fp];
|
|
||||||
const point& pt = pp.localPoints()[pointI];
|
|
||||||
|
|
||||||
patchDisp[pointI] += faceDisp[faceI];
|
|
||||||
patchRotationDisp[pointI] += (faceRotation[faceI]^(pt-fc));
|
|
||||||
nPatchDisp[pointI]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
syncTools::syncPointList
|
|
||||||
(
|
|
||||||
mesh,
|
|
||||||
pp.meshPoints(),
|
|
||||||
patchDisp,
|
|
||||||
plusEqOp<vector>(),
|
|
||||||
vector::zero,
|
|
||||||
mapDistribute::transform()
|
|
||||||
);
|
|
||||||
syncTools::syncPointList
|
|
||||||
(
|
|
||||||
mesh,
|
|
||||||
pp.meshPoints(),
|
|
||||||
patchRotationDisp,
|
|
||||||
plusEqOp<vector>(),
|
|
||||||
vector::zero,
|
|
||||||
mapDistribute::transform()
|
|
||||||
);
|
|
||||||
syncTools::syncPointList
|
|
||||||
(
|
|
||||||
mesh,
|
|
||||||
pp.meshPoints(),
|
|
||||||
nPatchDisp,
|
|
||||||
plusEqOp<label>(),
|
|
||||||
0,
|
|
||||||
mapDistribute::transform()
|
|
||||||
);
|
|
||||||
|
|
||||||
forAll(patchDisp, pointI)
|
|
||||||
{
|
|
||||||
patchDisp[pointI] /= nPatchDisp[pointI];
|
|
||||||
patchRotationDisp[pointI] /= nPatchDisp[pointI];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
|
||||||
{
|
|
||||||
dumpMove
|
|
||||||
(
|
|
||||||
mesh.time().path()
|
|
||||||
/ "patchDisp_" + name(iter) + ".obj",
|
|
||||||
pp.localPoints(),
|
|
||||||
pp.localPoints() + patchDisp
|
|
||||||
);
|
|
||||||
dumpMove
|
|
||||||
(
|
|
||||||
mesh.time().path()
|
|
||||||
/ "patchRotationDisp_" + name(iter) + ".obj",
|
|
||||||
pp.localPoints(),
|
|
||||||
pp.localPoints() + patchRotationDisp
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Gets passed in offset to nearest point on feature edge. Calculates
|
// Gets passed in offset to nearest point on feature edge. Calculates
|
||||||
// if the point has a different number of faces on either side of the feature
|
// if the point has a different number of faces on either side of the feature
|
||||||
// and if so attracts the point to that non-dominant plane.
|
// and if so attracts the point to that non-dominant plane.
|
||||||
@ -500,8 +487,6 @@ void Foam::autoSnapDriver::binFeatureFaces
|
|||||||
|
|
||||||
const label pointI,
|
const label pointI,
|
||||||
|
|
||||||
// const vectorField& faceSurfaceNormal,
|
|
||||||
// const vectorField& faceDisp,
|
|
||||||
const List<List<point> >& pointFaceNormals,
|
const List<List<point> >& pointFaceNormals,
|
||||||
const List<List<point> >& pointFaceDisp,
|
const List<List<point> >& pointFaceDisp,
|
||||||
const List<List<point> >& pointFaceCentres,
|
const List<List<point> >& pointFaceCentres,
|
||||||
@ -547,9 +532,6 @@ void Foam::autoSnapDriver::featureAttractionUsingReconstruction
|
|||||||
const indirectPrimitivePatch& pp,
|
const indirectPrimitivePatch& pp,
|
||||||
const scalarField& snapDist,
|
const scalarField& snapDist,
|
||||||
|
|
||||||
//const vectorField& faceSurfaceNormal,
|
|
||||||
//const vectorField& faceDisp,
|
|
||||||
//const vectorField& faceRotation,
|
|
||||||
const List<List<point> >& pointFaceNormals,
|
const List<List<point> >& pointFaceNormals,
|
||||||
const List<List<point> >& pointFaceDisp,
|
const List<List<point> >& pointFaceDisp,
|
||||||
const List<List<point> >& pointFaceCentres,
|
const List<List<point> >& pointFaceCentres,
|
||||||
@ -609,8 +591,6 @@ void Foam::autoSnapDriver::featureAttractionUsingReconstruction
|
|||||||
snapDist,
|
snapDist,
|
||||||
pointI,
|
pointI,
|
||||||
|
|
||||||
//faceSurfaceNormal,
|
|
||||||
//faceDisp,
|
|
||||||
pointFaceNormals,
|
pointFaceNormals,
|
||||||
pointFaceDisp,
|
pointFaceDisp,
|
||||||
pointFaceCentres,
|
pointFaceCentres,
|
||||||
@ -741,9 +721,6 @@ void Foam::autoSnapDriver::determineAllFeatures
|
|||||||
const indirectPrimitivePatch& pp,
|
const indirectPrimitivePatch& pp,
|
||||||
const scalarField& snapDist,
|
const scalarField& snapDist,
|
||||||
|
|
||||||
//const vectorField& faceSurfaceNormal,
|
|
||||||
//const vectorField& faceDisp,
|
|
||||||
//const vectorField& faceRotation,
|
|
||||||
const List<List<point> >& pointFaceNormals,
|
const List<List<point> >& pointFaceNormals,
|
||||||
const List<List<point> >& pointFaceDisp,
|
const List<List<point> >& pointFaceDisp,
|
||||||
const List<List<point> >& pointFaceCentres,
|
const List<List<point> >& pointFaceCentres,
|
||||||
@ -1778,33 +1755,8 @@ Foam::vectorField Foam::autoSnapDriver::calcNearestSurfaceFeature
|
|||||||
faceRotation
|
faceRotation
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
// Start off with nearest point on surface.
|
||||||
// Interpolate face-wise data to points
|
vectorField patchDisp = nearestDisp;
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
// Displacement due to snapping of face centres
|
|
||||||
pointField patchDisp(localPoints.size(), vector::zero);
|
|
||||||
// Displacement due to rotation
|
|
||||||
pointField patchRotationDisp(localPoints.size(), vector::zero);
|
|
||||||
|
|
||||||
interpolateFaceToPoint
|
|
||||||
(
|
|
||||||
iter,
|
|
||||||
pp,
|
|
||||||
faceSurfaceNormal,
|
|
||||||
faceDisp,
|
|
||||||
faceRotation,
|
|
||||||
|
|
||||||
patchDisp,
|
|
||||||
patchRotationDisp
|
|
||||||
);
|
|
||||||
|
|
||||||
// Override patchDisp with exact nearest
|
|
||||||
{
|
|
||||||
pointField pointSurfaceNormal;
|
|
||||||
calcNearest(pp.localPoints(), patchDisp, pointSurfaceNormal);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Collect (possibly remote) face-wise data on coupled points.
|
// Collect (possibly remote) face-wise data on coupled points.
|
||||||
@ -1818,7 +1770,6 @@ Foam::vectorField Foam::autoSnapDriver::calcNearestSurfaceFeature
|
|||||||
|
|
||||||
List<List<point> > pointFaceNormals(pp.nPoints());
|
List<List<point> > pointFaceNormals(pp.nPoints());
|
||||||
List<List<point> > pointFaceDisp(pp.nPoints());
|
List<List<point> > pointFaceDisp(pp.nPoints());
|
||||||
List<List<point> > pointFaceRotation(pp.nPoints());
|
|
||||||
List<List<point> > pointFaceCentres(pp.nPoints());
|
List<List<point> > pointFaceCentres(pp.nPoints());
|
||||||
|
|
||||||
// Fill local data
|
// Fill local data
|
||||||
@ -1829,15 +1780,12 @@ Foam::vectorField Foam::autoSnapDriver::calcNearestSurfaceFeature
|
|||||||
pNormals.setSize(pFaces.size());
|
pNormals.setSize(pFaces.size());
|
||||||
List<point>& pDisp = pointFaceDisp[pointI];
|
List<point>& pDisp = pointFaceDisp[pointI];
|
||||||
pDisp.setSize(pFaces.size());
|
pDisp.setSize(pFaces.size());
|
||||||
List<point>& pRot = pointFaceRotation[pointI];
|
|
||||||
pRot.setSize(pFaces.size());
|
|
||||||
List<point>& pFc = pointFaceCentres[pointI];
|
List<point>& pFc = pointFaceCentres[pointI];
|
||||||
pFc.setSize(pFaces.size());
|
pFc.setSize(pFaces.size());
|
||||||
forAll(pFaces, i)
|
forAll(pFaces, i)
|
||||||
{
|
{
|
||||||
pNormals[i] = faceSurfaceNormal[pFaces[i]];
|
pNormals[i] = faceSurfaceNormal[pFaces[i]];
|
||||||
pDisp[i] = faceDisp[pFaces[i]];
|
pDisp[i] = faceDisp[pFaces[i]];
|
||||||
pRot[i] = faceRotation[pFaces[i]];
|
|
||||||
pFc[i] = pp.faceCentres()[pFaces[i]];
|
pFc[i] = pp.faceCentres()[pFaces[i]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1861,15 +1809,6 @@ Foam::vectorField Foam::autoSnapDriver::calcNearestSurfaceFeature
|
|||||||
listTransform()
|
listTransform()
|
||||||
);
|
);
|
||||||
syncTools::syncPointList
|
syncTools::syncPointList
|
||||||
(
|
|
||||||
mesh,
|
|
||||||
pp.meshPoints(),
|
|
||||||
pointFaceRotation,
|
|
||||||
listPlusEqOp(),
|
|
||||||
List<point>(),
|
|
||||||
listTransform()
|
|
||||||
);
|
|
||||||
syncTools::syncPointList
|
|
||||||
(
|
(
|
||||||
mesh,
|
mesh,
|
||||||
pp.meshPoints(),
|
pp.meshPoints(),
|
||||||
@ -1881,60 +1820,6 @@ Foam::vectorField Foam::autoSnapDriver::calcNearestSurfaceFeature
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//XXXXXXX
|
|
||||||
// // Indices of pp points that are coupled
|
|
||||||
// labelList coupledPointLabels(pp.nPoints());
|
|
||||||
// // Corresponding coupled point index
|
|
||||||
// labelList coupledPointAddr(pp.nPoints());
|
|
||||||
// {
|
|
||||||
// label coupledI = 0;
|
|
||||||
// forAll(pp.meshPoints(), pointI)
|
|
||||||
// {
|
|
||||||
// label meshPointI = pp.meshPoints()[pointI];
|
|
||||||
// Map<label>::const_iterator fnd = coupledPatchMP.find(meshPointI);
|
|
||||||
// if (fnd != coupledPatchMP.end())
|
|
||||||
// {
|
|
||||||
// coupledPointLabels[coupledI] = pointI;
|
|
||||||
// coupledPointAddr[coupledI] = fnd();
|
|
||||||
// coupledI++;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// coupledPointLabels.setSize(coupledI);
|
|
||||||
// coupledPointAddr.setSize(coupledI);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// List<List<point> > pointFaceNormals(map.constructSize());
|
|
||||||
// List<List<point> > pointFaceDisp(map.constructSize());
|
|
||||||
// List<List<point> > pointFaceRotation(map.constructSize());
|
|
||||||
// List<List<point> > pointFaceCentres(map.constructSize());
|
|
||||||
//
|
|
||||||
// // Collect local data.
|
|
||||||
// forAll(coupledPointLabels, coupledI)
|
|
||||||
// {
|
|
||||||
// label pointI = coupledPointLabels[coupledI];
|
|
||||||
// label coupledPointI = coupledPointAddr[coupledI];
|
|
||||||
// const labelList& pFaces = pp.pointFaces()[pointI];
|
|
||||||
// List<point>& pNormals = pointFaceNormals[coupledPointI];
|
|
||||||
// pNormals.setSize(pFaces.size());
|
|
||||||
// List<point>& pDisp = pointFaceDisp[coupledPointI];
|
|
||||||
// pDisp.setSize(pFaces.size());
|
|
||||||
// List<point>& pRot = pointFaceRotation[coupledPointI];
|
|
||||||
// pRot.setSize(pFaces.size());
|
|
||||||
// List<point>& pFc = pointFaceCentres[coupledPointI];
|
|
||||||
// pFc.setSize(pFaces.size());
|
|
||||||
// forAll(pFaces, i)
|
|
||||||
// {
|
|
||||||
// pNormals[i] = faceSurfaceNormal[pFaces[i]];
|
|
||||||
// pDisp[i] = pointFaceDisp[pFaces[i]];
|
|
||||||
// pRot[i] = pointFaceRotation[pFaces[i]];
|
|
||||||
// pFc[i] = pp.faceCentres()[pFaces[i]];
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // Pull remote data into local slots
|
|
||||||
//XXXXXXX
|
|
||||||
|
|
||||||
|
|
||||||
// Nearest feature
|
// Nearest feature
|
||||||
vectorField patchAttraction(localPoints.size(), vector::zero);
|
vectorField patchAttraction(localPoints.size(), vector::zero);
|
||||||
// Constraints at feature
|
// Constraints at feature
|
||||||
@ -1973,9 +1858,6 @@ Foam::vectorField Foam::autoSnapDriver::calcNearestSurfaceFeature
|
|||||||
<< " linear : max:" << gMax(patchDisp)
|
<< " linear : max:" << gMax(patchDisp)
|
||||||
<< " avg:" << gAverage(patchDisp)
|
<< " avg:" << gAverage(patchDisp)
|
||||||
<< endl
|
<< endl
|
||||||
<< " rotation : max:" << gMax(patchRotationDisp)
|
|
||||||
<< " avg:" << gAverage(patchRotationDisp)
|
|
||||||
<< endl
|
|
||||||
<< " feature : max:" << gMax(patchAttraction)
|
<< " feature : max:" << gMax(patchAttraction)
|
||||||
<< " avg:" << gAverage(patchAttraction)
|
<< " avg:" << gAverage(patchAttraction)
|
||||||
<< endl;
|
<< endl;
|
||||||
@ -1985,20 +1867,13 @@ Foam::vectorField Foam::autoSnapDriver::calcNearestSurfaceFeature
|
|||||||
// - patchDisp : point movement to go to nearest point on surface
|
// - patchDisp : point movement to go to nearest point on surface
|
||||||
// (either direct or through interpolation of
|
// (either direct or through interpolation of
|
||||||
// face nearest)
|
// face nearest)
|
||||||
// - patchRotationDisp : point movement to align face normal with surface.
|
|
||||||
//
|
|
||||||
// - patchAttraction : direct attraction to features
|
// - patchAttraction : direct attraction to features
|
||||||
// - patchConstraints : type of features
|
// - patchConstraints : type of features
|
||||||
|
|
||||||
// Use any combination of patchDisp, patchRotationDisp and direct feature
|
// Use any combination of patchDisp and direct feature
|
||||||
// attraction.
|
// attraction.
|
||||||
|
|
||||||
|
|
||||||
// Bit of patchRotation
|
|
||||||
//patchDisp = 0.3*patchRotationDisp+0.7*patchDisp;
|
|
||||||
// Disable patchRotationDisp
|
|
||||||
patchRotationDisp = vector::zero;
|
|
||||||
|
|
||||||
// Mix with direct feature attraction
|
// Mix with direct feature attraction
|
||||||
forAll(patchConstraints, pointI)
|
forAll(patchConstraints, pointI)
|
||||||
{
|
{
|
||||||
@ -2017,13 +1892,6 @@ Foam::vectorField Foam::autoSnapDriver::calcNearestSurfaceFeature
|
|||||||
// pp.localPoints(),
|
// pp.localPoints(),
|
||||||
// pp.localPoints() + patchDisp
|
// pp.localPoints() + patchDisp
|
||||||
//);
|
//);
|
||||||
//dumpMove
|
|
||||||
//(
|
|
||||||
// mesh.time().path()
|
|
||||||
// / "rotationPatchDisp_" + name(iter) + ".obj",
|
|
||||||
// pp.localPoints(),
|
|
||||||
// pp.localPoints() + patchRotationDisp
|
|
||||||
//);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -2130,15 +1998,6 @@ Foam::vectorField Foam::autoSnapDriver::calcNearestSurfaceFeature
|
|||||||
vector(GREAT, GREAT, GREAT) // null value (note: cannot use VGREAT)
|
vector(GREAT, GREAT, GREAT) // null value (note: cannot use VGREAT)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
// Check for displacement being outwards.
|
|
||||||
outwardsDisplacement(pp, patchDisp);
|
|
||||||
|
|
||||||
// Set initial distribution of displacement field (on patches) from
|
|
||||||
// patchDisp and make displacement consistent with b.c. on displacement
|
|
||||||
// pointVectorField.
|
|
||||||
meshMover.setDisplacement(patchDisp);
|
|
||||||
|
|
||||||
return patchDisp;
|
return patchDisp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -349,10 +349,32 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo
|
|||||||
|
|
||||||
faceCombiner.updateMesh(map);
|
faceCombiner.updateMesh(map);
|
||||||
|
|
||||||
updateMesh(map, labelList(0));
|
// Get the kept faces that need to be recalculated.
|
||||||
|
// Merging two boundary faces might shift the cell centre
|
||||||
|
// (unless the faces are absolutely planar)
|
||||||
|
labelHashSet retestFaces(6*allFaceSets.size());
|
||||||
|
|
||||||
|
forAll(allFaceSets, setI)
|
||||||
|
{
|
||||||
|
label oldMasterI = allFaceSets[setI][0];
|
||||||
|
|
||||||
|
label faceI = map().reverseFaceMap()[oldMasterI];
|
||||||
|
|
||||||
|
// faceI is always uncoupled boundary face
|
||||||
|
const cell& cFaces = mesh_.cells()[mesh_.faceOwner()[faceI]];
|
||||||
|
|
||||||
|
forAll(cFaces, i)
|
||||||
|
{
|
||||||
|
retestFaces.insert(cFaces[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateMesh(map, retestFaces.toc());
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
|
// Check sync
|
||||||
|
checkData();
|
||||||
|
|
||||||
Pout<< "Writing initial merged-faces mesh to time "
|
Pout<< "Writing initial merged-faces mesh to time "
|
||||||
<< timeName() << nl << endl;
|
<< timeName() << nl << endl;
|
||||||
write();
|
write();
|
||||||
@ -529,11 +551,30 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo
|
|||||||
inplaceMapKey(map().reverseFaceMap(), restoredFaces);
|
inplaceMapKey(map().reverseFaceMap(), restoredFaces);
|
||||||
inplaceMapKey(map().reverseCellMap(), restoredCells);
|
inplaceMapKey(map().reverseCellMap(), restoredCells);
|
||||||
|
|
||||||
|
|
||||||
|
// Get the kept faces that need to be recalculated.
|
||||||
|
// Merging two boundary faces might shift the cell centre
|
||||||
|
// (unless the faces are absolutely planar)
|
||||||
|
labelHashSet retestFaces(6*restoredFaces.size());
|
||||||
|
|
||||||
|
forAll(restoredFaces, setI)
|
||||||
|
{
|
||||||
|
label faceI = restoredFaces[setI];
|
||||||
|
// faceI is always uncoupled boundary face
|
||||||
|
const cell& cFaces = mesh_.cells()[mesh_.faceOwner()[faceI]];
|
||||||
|
|
||||||
|
forAll(cFaces, i)
|
||||||
|
{
|
||||||
|
retestFaces.insert(cFaces[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Experimental:restore all points/face/cells in maps
|
// Experimental:restore all points/face/cells in maps
|
||||||
updateMesh
|
updateMesh
|
||||||
(
|
(
|
||||||
map,
|
map,
|
||||||
labelList(0), // changedFaces
|
retestFaces.toc(),
|
||||||
restoredPoints,
|
restoredPoints,
|
||||||
restoredFaces,
|
restoredFaces,
|
||||||
restoredCells
|
restoredCells
|
||||||
@ -541,6 +582,9 @@ Foam::label Foam::meshRefinement::mergePatchFacesUndo
|
|||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
|
// Check sync
|
||||||
|
checkData();
|
||||||
|
|
||||||
Pout<< "Writing merged-faces mesh to time "
|
Pout<< "Writing merged-faces mesh to time "
|
||||||
<< timeName() << nl << endl;
|
<< timeName() << nl << endl;
|
||||||
write();
|
write();
|
||||||
|
|||||||
Reference in New Issue
Block a user