mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-12-28 03:37:59 +00:00
357 lines
8.7 KiB
C
357 lines
8.7 KiB
C
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
|
\\/ M anipulation |
|
|
-------------------------------------------------------------------------------
|
|
License
|
|
This file is part of OpenFOAM.
|
|
|
|
OpenFOAM is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by the
|
|
Free Software Foundation; either version 2 of the License, or (at your
|
|
option) any later version.
|
|
|
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with OpenFOAM; if not, write to the Free Software Foundation,
|
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#include "linearValveFvMesh.H"
|
|
#include "Time.H"
|
|
#include "slidingInterface.H"
|
|
#include "mapPolyMesh.H"
|
|
#include "polyTopoChange.H"
|
|
#include "addToRunTimeSelectionTable.H"
|
|
|
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
|
|
namespace Foam
|
|
{
|
|
defineTypeNameAndDebug(linearValveFvMesh, 0);
|
|
|
|
addToRunTimeSelectionTable(topoChangerFvMesh, linearValveFvMesh, IOobject);
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
|
|
void Foam::linearValveFvMesh::addZonesAndModifiers()
|
|
{
|
|
// Add zones and modifiers for motion action
|
|
|
|
if
|
|
(
|
|
pointZones().size()
|
|
|| faceZones().size()
|
|
|| cellZones().size()
|
|
|| topoChanger_.size()
|
|
)
|
|
{
|
|
Info<< "void linearValveFvMesh::addZonesAndModifiers() : "
|
|
<< "Zones and modifiers already present. Skipping."
|
|
<< endl;
|
|
|
|
return;
|
|
}
|
|
|
|
Info<< "Time = " << time().timeName() << endl
|
|
<< "Adding zones and modifiers to the mesh" << endl;
|
|
|
|
// Add zones
|
|
List<pointZone*> pz(1);
|
|
|
|
// Add an empty zone for cut points
|
|
|
|
pz[0] = new pointZone
|
|
(
|
|
"cutPointZone",
|
|
labelList(0),
|
|
0,
|
|
pointZones()
|
|
);
|
|
|
|
|
|
// Do face zones for slider
|
|
|
|
List<faceZone*> fz(3);
|
|
|
|
// Inner slider
|
|
const word innerSliderName(motionDict_.subDict("slider").lookup("inside"));
|
|
const polyPatch& innerSlider =
|
|
boundaryMesh()[boundaryMesh().findPatchID(innerSliderName)];
|
|
|
|
labelList isf(innerSlider.size());
|
|
|
|
forAll (isf, i)
|
|
{
|
|
isf[i] = innerSlider.start() + i;
|
|
}
|
|
|
|
fz[0] = new faceZone
|
|
(
|
|
"insideSliderZone",
|
|
isf,
|
|
boolList(innerSlider.size(), false),
|
|
0,
|
|
faceZones()
|
|
);
|
|
|
|
// Outer slider
|
|
const word outerSliderName(motionDict_.subDict("slider").lookup("outside"));
|
|
const polyPatch& outerSlider =
|
|
boundaryMesh()[boundaryMesh().findPatchID(outerSliderName)];
|
|
|
|
labelList osf(outerSlider.size());
|
|
|
|
forAll (osf, i)
|
|
{
|
|
osf[i] = outerSlider.start() + i;
|
|
}
|
|
|
|
fz[1] = new faceZone
|
|
(
|
|
"outsideSliderZone",
|
|
osf,
|
|
boolList(outerSlider.size(), false),
|
|
1,
|
|
faceZones()
|
|
);
|
|
|
|
// Add empty zone for cut faces
|
|
fz[2] = new faceZone
|
|
(
|
|
"cutFaceZone",
|
|
labelList(0),
|
|
boolList(0, false),
|
|
2,
|
|
faceZones()
|
|
);
|
|
|
|
List<cellZone*> cz(0);
|
|
|
|
Info << "Adding point, face and cell zones" << endl;
|
|
addZones(pz, fz, cz);
|
|
|
|
// Add a topology modifier
|
|
Info << "Adding topology modifiers" << endl;
|
|
topoChanger_.setSize(1);
|
|
topoChanger_.set
|
|
(
|
|
0,
|
|
new slidingInterface
|
|
(
|
|
"mixerSlider",
|
|
0,
|
|
topoChanger_,
|
|
outerSliderName + "Zone",
|
|
innerSliderName + "Zone",
|
|
"cutPointZone",
|
|
"cutFaceZone",
|
|
outerSliderName,
|
|
innerSliderName,
|
|
slidingInterface::INTEGRAL,
|
|
true // Attach-detach action
|
|
)
|
|
);
|
|
topoChanger_.writeOpt() = IOobject::AUTO_WRITE;
|
|
|
|
// Write mesh
|
|
write();
|
|
}
|
|
|
|
|
|
void Foam::linearValveFvMesh::makeSlidersDead()
|
|
{
|
|
const polyTopoChanger& topoChanges = topoChanger_;
|
|
|
|
// Enable layering
|
|
forAll (topoChanges, modI)
|
|
{
|
|
if (isA<slidingInterface>(topoChanges[modI]))
|
|
{
|
|
topoChanges[modI].disable();
|
|
}
|
|
else
|
|
{
|
|
FatalErrorIn("void Foam::linearValveFvMesh::makeSlidersDead()")
|
|
<< "Don't know what to do with mesh modifier "
|
|
<< modI << " of type " << topoChanges[modI].type()
|
|
<< abort(FatalError);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Foam::linearValveFvMesh::makeSlidersLive()
|
|
{
|
|
const polyTopoChanger& topoChanges = topoChanger_;
|
|
|
|
// Enable sliding interface
|
|
forAll (topoChanges, modI)
|
|
{
|
|
if (isA<slidingInterface>(topoChanges[modI]))
|
|
{
|
|
topoChanges[modI].enable();
|
|
}
|
|
else
|
|
{
|
|
FatalErrorIn("void Foam::linearValveFvMesh::makeLayersLive()")
|
|
<< "Don't know what to do with mesh modifier "
|
|
<< modI << " of type " << topoChanges[modI].type()
|
|
<< abort(FatalError);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
bool Foam::linearValveFvMesh::attached() const
|
|
{
|
|
const polyTopoChanger& topoChanges = topoChanger_;
|
|
|
|
bool result = false;
|
|
|
|
forAll (topoChanges, modI)
|
|
{
|
|
if (isA<slidingInterface>(topoChanges[modI]))
|
|
{
|
|
result =
|
|
result
|
|
|| refCast<const slidingInterface>(topoChanges[modI]).attached();
|
|
}
|
|
}
|
|
|
|
// Check thal all sliders are in sync (debug only)
|
|
forAll (topoChanges, modI)
|
|
{
|
|
if (isA<slidingInterface>(topoChanges[modI]))
|
|
{
|
|
if
|
|
(
|
|
result
|
|
!= refCast<const slidingInterface>(topoChanges[modI]).attached()
|
|
)
|
|
{
|
|
FatalErrorIn("bool linearValveFvMesh::attached() const")
|
|
<< "Slider " << modI << " named " << topoChanges[modI].name()
|
|
<< " out of sync: Should be" << result
|
|
<< abort(FatalError);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (result)
|
|
{
|
|
Info << "linearValveFvMesh: attached!" << endl;
|
|
}
|
|
else
|
|
{
|
|
Info << "linearValveFvMesh: detached!" << endl;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
|
|
// Construct from components
|
|
Foam::linearValveFvMesh::linearValveFvMesh(const IOobject& io)
|
|
:
|
|
topoChangerFvMesh(io),
|
|
motionDict_
|
|
(
|
|
IOdictionary
|
|
(
|
|
IOobject
|
|
(
|
|
"dynamicMeshDict",
|
|
time().constant(),
|
|
*this,
|
|
IOobject::MUST_READ,
|
|
IOobject::NO_WRITE
|
|
)
|
|
).subDict(typeName + "Coeffs")
|
|
),
|
|
msPtr_(motionSolver::New(*this))
|
|
{
|
|
addZonesAndModifiers();
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
|
|
Foam::linearValveFvMesh::~linearValveFvMesh()
|
|
{}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
|
|
void Foam::linearValveFvMesh::update()
|
|
{
|
|
// Detaching the interface
|
|
if (attached())
|
|
{
|
|
Info << "Decoupling sliding interfaces" << endl;
|
|
makeSlidersLive();
|
|
|
|
// Changing topology by hand
|
|
resetMorph();
|
|
setMorphTimeIndex(3*time().timeIndex());
|
|
updateMesh();
|
|
|
|
msPtr_->updateMesh();
|
|
}
|
|
else
|
|
{
|
|
Info << "Sliding interfaces decoupled" << endl;
|
|
}
|
|
|
|
// Perform mesh motion
|
|
makeSlidersDead();
|
|
|
|
// Changing topology by hand
|
|
resetMorph();
|
|
setMorphTimeIndex(3*time().timeIndex() + 1);
|
|
updateMesh();
|
|
|
|
msPtr_->updateMesh();
|
|
|
|
if (topoChangeMap.valid())
|
|
{
|
|
if (topoChangeMap().hasMotionPoints())
|
|
{
|
|
Info << "Topology change; executing pre-motion" << endl;
|
|
movePoints(topoChangeMap().preMotionPoints());
|
|
}
|
|
}
|
|
|
|
// Solve for motion
|
|
msPtr_->solve();
|
|
|
|
movePoints(msPtr_->curPoints());
|
|
|
|
// Attach the interface
|
|
Info << "Coupling sliding interfaces" << endl;
|
|
makeSlidersLive();
|
|
resetMorph();
|
|
setMorphTimeIndex(3*time().timeIndex() + 2);
|
|
updateMesh();
|
|
|
|
Info << "Moving points post slider attach" << endl;
|
|
|
|
msPtr_->updateMesh();
|
|
|
|
Info << "Sliding interfaces coupled: " << attached() << endl;
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|