1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 2004-2010 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
11 OpenFOAM is free software: you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "linearValveLayersFvMesh.H"
28 #include "slidingInterface.H"
29 #include "layerAdditionRemoval.H"
30 #include "pointField.H"
31 #include "mapPolyMesh.H"
32 #include "polyTopoChange.H"
33 #include "addToRunTimeSelectionTable.H"
35 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
39 defineTypeNameAndDebug(linearValveLayersFvMesh, 0);
40 addToRunTimeSelectionTable
43 linearValveLayersFvMesh,
49 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
51 void Foam::linearValveLayersFvMesh::addZonesAndModifiers()
53 // Add zones and modifiers for motion action
60 || topoChanger_.size()
63 Info<< "void linearValveLayersFvMesh::addZonesAndModifiers() : "
64 << "Zones and modifiers already present. Skipping."
70 Info<< "Time = " << time().timeName() << endl
71 << "Adding zones and modifiers to the mesh" << endl;
74 List<pointZone*> pz(1);
75 List<faceZone*> fz(4);
76 List<cellZone*> cz(0);
79 // Add an empty zone for cut points
90 // Do face zones for slider
93 const word innerSliderName(motionDict_.subDict("slider").lookup("inside"));
94 const polyPatch& innerSlider = boundaryMesh()[innerSliderName];
96 labelList isf(innerSlider.size());
100 isf[i] = innerSlider.start() + i;
107 boolList(innerSlider.size(), false),
113 const word outerSliderName(motionDict_.subDict("slider").lookup("outside"));
114 const polyPatch& outerSlider = boundaryMesh()[outerSliderName];
116 labelList osf(outerSlider.size());
120 osf[i] = outerSlider.start() + i;
127 boolList(outerSlider.size(), false),
132 // Add empty zone for cut faces
142 // Add face zone for layer addition
143 const word layerPatchName
145 motionDict_.subDict("layer").lookup("patch")
148 const polyPatch& layerPatch = boundaryMesh()[layerPatchName];
150 labelList lpf(layerPatch.size());
154 lpf[i] = layerPatch.start() + i;
161 boolList(layerPatch.size(), true),
167 Info<< "Adding point and face zones" << endl;
168 addZones(pz, fz, cz);
170 // Add a topology modifier
172 List<polyMeshModifier*> tm(2);
174 tm[0] = new slidingInterface
179 outerSliderName + "Zone",
180 innerSliderName + "Zone",
185 slidingInterface::INTEGRAL,
186 true // Attach-detach action
190 new layerAdditionRemoval
198 motionDict_.subDict("layer").lookup("minThickness")
202 motionDict_.subDict("layer").lookup("maxThickness")
207 Info<< "Adding topology modifiers" << endl;
208 addTopologyModifiers(tm);
215 void Foam::linearValveLayersFvMesh::makeLayersLive()
217 const polyTopoChanger& topoChanges = topoChanger_;
220 forAll(topoChanges, modI)
222 if (isA<layerAdditionRemoval>(topoChanges[modI]))
224 topoChanges[modI].enable();
226 else if (isA<slidingInterface>(topoChanges[modI]))
228 topoChanges[modI].disable();
232 FatalErrorIn("void linearValveLayersFvMesh::makeLayersLive()")
233 << "Don't know what to do with mesh modifier "
234 << modI << " of type " << topoChanges[modI].type()
235 << abort(FatalError);
241 void Foam::linearValveLayersFvMesh::makeSlidersLive()
243 const polyTopoChanger& topoChanges = topoChanger_;
245 // Enable sliding interface
246 forAll(topoChanges, modI)
248 if (isA<layerAdditionRemoval>(topoChanges[modI]))
250 topoChanges[modI].disable();
252 else if (isA<slidingInterface>(topoChanges[modI]))
254 topoChanges[modI].enable();
258 FatalErrorIn("void linearValveLayersFvMesh::makeLayersLive()")
259 << "Don't know what to do with mesh modifier "
260 << modI << " of type " << topoChanges[modI].type()
261 << abort(FatalError);
267 bool Foam::linearValveLayersFvMesh::attached() const
269 const polyTopoChanger& topoChanges = topoChanger_;
273 forAll(topoChanges, modI)
275 if (isA<slidingInterface>(topoChanges[modI]))
279 || refCast<const slidingInterface>(topoChanges[modI]).attached();
283 // Check thal all sliders are in sync (debug only)
284 forAll(topoChanges, modI)
286 if (isA<slidingInterface>(topoChanges[modI]))
291 != refCast<const slidingInterface>(topoChanges[modI]).attached()
294 FatalErrorIn("bool linearValveLayersFvMesh::attached() const")
295 << "Slider " << modI << " named "
296 << topoChanges[modI].name()
297 << " out of sync: Should be" << result
298 << abort(FatalError);
307 Foam::tmp<Foam::pointField> Foam::linearValveLayersFvMesh::newPoints() const
309 tmp<pointField> tnewPoints
311 new pointField(points())
314 pointField& np = tnewPoints();
316 const word layerPatchName
318 motionDict_.subDict("layer").lookup("patch")
321 const polyPatch& layerPatch = boundaryMesh()[layerPatchName];
323 const labelList& patchPoints = layerPatch.meshPoints();
327 motionDict_.lookup("pistonVelocity")
330 forAll(patchPoints, ppI)
332 np[patchPoints[ppI]] += vel*time().deltaTValue();
340 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
342 // Construct from components
343 Foam::linearValveLayersFvMesh::linearValveLayersFvMesh(const IOobject& io)
345 topoChangerFvMesh(io),
355 IOobject::MUST_READ_IF_MODIFIED,
359 ).subDict(typeName + "Coeffs")
362 addZonesAndModifiers();
366 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
368 Foam::linearValveLayersFvMesh::~linearValveLayersFvMesh()
371 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
373 void Foam::linearValveLayersFvMesh::update()
375 // Detaching the interface
378 Info<< "Decoupling sliding interfaces" << endl;
383 setMorphTimeIndex(3*time().timeIndex());
388 Info<< "Sliding interfaces decoupled" << endl;
391 // Perform layer action and mesh motion
396 setMorphTimeIndex(3*time().timeIndex() + 1);
399 if (topoChangeMap.valid())
401 if (topoChangeMap().hasMotionPoints())
403 Info<< "Topology change; executing pre-motion" << endl;
404 movePoints(topoChangeMap().preMotionPoints());
409 movePoints(newPoints());
411 // Attach the interface
412 Info<< "Coupling sliding interfaces" << endl;
417 setMorphTimeIndex(3*time().timeIndex() + 2);
420 Info<< "Moving points post slider attach" << endl;
421 // const pointField p = allPoints();
424 Info<< "Sliding interfaces coupled: " << attached() << endl;
428 // ************************************************************************* //