This repository has been archived on 2023-11-20. You can view files and clone it, but cannot push or open issues or pull requests.
foam-extend4.1-coherent-io/applications/solvers/solidMechanics/elasticNonLinULSolidFoam/moveMeshLeastSquares.H

116 lines
2.8 KiB
C
Raw Normal View History

2012-09-11 15:42:55 +00:00
//--------------------------------------------------//
//- move mesh
//--------------------------------------------------//
{
//Info << "Moving mesh using least squares interpolation" << endl;
2012-09-11 15:42:55 +00:00
leastSquaresVolPointInterpolation pointInterpolation(mesh);
2012-09-11 15:42:55 +00:00
// Create point mesh
pointMesh pMesh(mesh);
//pointMesh pMesh(mesh);
2012-09-11 15:42:55 +00:00
wordList types
(
pMesh.boundary().size(),
calculatedFvPatchVectorField::typeName
);
2012-09-11 15:42:55 +00:00
pointVectorField pointDU
(
IOobject
(
"pointDU",
runTime.timeName(),
mesh
2012-09-11 15:42:55 +00:00
),
pMesh,
dimensionedVector("zero", dimLength, vector::zero),
types
);
pointInterpolation.interpolate(DU, pointDU);
2012-09-11 15:42:55 +00:00
//pointDU.write();
const vectorField& pointDUI = pointDU.internalField();
2012-09-11 15:42:55 +00:00
//- Move mesh
//vectorField newPoints = mesh.allPoints();
pointVectorField newPoints
(
IOobject
(
"newPoints",
runTime.timeName(),
mesh
),
pMesh,
dimensionedVector("zero", dimLength, vector::zero)
//mesh.allPoints()
);
newPoints.internalField() = mesh.allPoints();
2012-09-11 15:42:55 +00:00
// note: allPoints will have more points than pointDU
// if there are globalFaceZones
2012-09-11 15:42:55 +00:00
forAll (pointDUI, pointI)
{
2012-09-11 15:42:55 +00:00
newPoints[pointI] += pointDUI[pointI];
}
// Correct symmetryPlane points
forAll(mesh.boundaryMesh(), patchI)
{
if (isA<symmetryPolyPatch>(mesh.boundaryMesh()[patchI]))
{
const labelList& meshPoints =
mesh.boundaryMesh()[patchI].meshPoints();
2012-09-11 15:42:55 +00:00
vector avgN =
gAverage(mesh.boundaryMesh()[patchI].pointNormals());
vector i(1, 0, 0);
vector j(0, 1, 0);
vector k(0, 0, 1);
if (mag(avgN&i) > 0.95)
{
forAll(meshPoints, pI)
{
newPoints[meshPoints[pI]].x() = 0;
}
}
else if (mag(avgN&j) > 0.95)
{
forAll(meshPoints, pI)
{
newPoints[meshPoints[pI]].y() = 0;
}
}
else if (mag(avgN&k) > 0.95)
{
forAll(meshPoints, pI)
{
newPoints[meshPoints[pI]].z() = 0;
}
}
}
}
# include "calcUnusedNewPoints.H"
// // now we make sure processor patches are exactly the same
// newPoints.correctBoundaryConditions();
2012-09-11 15:42:55 +00:00
twoDPointCorrector twoDCorrector(mesh);
twoDCorrector.correctPoints(newPoints);
mesh.movePoints(newPoints);
mesh.V00();
mesh.moving(false);
// Update n
n = mesh.Sf()/mesh.magSf();
}