Foam::dimensionedScalar Foam::engineTime::pistonDisplacement() const { return dimensionedScalar ( "pistonDisplacement", dimLength, pistonPosition(theta() - deltaTheta()) - pistonPosition().value() ); }
Foam::dimensionedScalar Foam::engineTime::pistonPosition() const { return dimensionedScalar ( "pistonPosition", dimLength, pistonPosition(theta()) ); }
void Foam::thoboisMesh::addZonesAndModifiers() { // Add the zones and mesh modifiers to operate piston motion if ( pointZones().size() > 0 && faceZones().size() > 0 && topoChanger_.size() > 0 ) { Info<< "Time = " << engTime().theta() << endl; Info<< "void Foam::thoboisMesh::addZonesAndModifiers() : " << "Zones and modifiers already present. Skipping." << endl; setVirtualPositions(); checkAndCalculate(); Info << "Point zones found = " << pointZones().size() << endl; Info << "Face zones found = " << faceZones().size() << endl; Info << "Cell zones found = " << cellZones().size() << endl; return; } else { pointZones().setSize(0); faceZones().setSize(0); cellZones().setSize(0); topoChanger_.setSize(0); } Info << "checkAndCalculate()" << endl; checkAndCalculate(); Info<< "Time = " << engTime().theta() << endl << "Adding zones to the engine mesh" << endl; /* Point zones 1) Piston points */ DynamicList<pointZone*> pz; /* Face zones 1) Piston layer faces */ DynamicList<faceZone*> fz; /* */ DynamicList<cellZone*> cz; label nPointZones = 0; label nFaceZones = 0; label nCellZones = 0; /* Adding the following faces zones: 1: pistonLayerFaces nv: movingFaces nv: staticFaces nv: detachFaces Adding the following point zones: 1: pistonPoints nv: movingValvePoints nv: staticValvePoints */ # include "addPistonFacesPointZonesThoboisMesh.H" //# include "addAttachDetachFacesThoboisMesh.H" Info<< "Adding " << nPointZones << " point, " << nFaceZones << " face zones and " << nCellZones << " cell zones" << endl; # include "addValveFaceZonesThoboisMesh.H" pz.setSize(nPointZones); Info << "setSize pz" << endl; fz.setSize(nFaceZones); Info << "setSize fz" << endl; cz.setSize(nCellZones); Info << "setSize cz" << endl; addZones(pz, fz, cz); # include "addMeshModifiersThoboisMesh.H" // Calculating the virtual positions of piston and valves setVirtualPositions(); // Write mesh and modifiers topoChanger_.writeOpt() = IOobject::AUTO_WRITE; write(); Info << "virtualPistonPosition = " << virtualPistonPosition() << endl; Info << "piston position = " << pistonPosition() << endl; }
void Foam::verticalValves::checkAndCalculate() { label pistonIndex = -1; bool foundPiston = false; label linerIndex = -1; bool foundLiner = false; label cylinderHeadIndex = -1; bool foundCylinderHead = false; forAll(boundary(), i) { if (boundary()[i].name() == "piston") { pistonIndex = i; foundPiston = true; } else if (boundary()[i].name() == "liner") { linerIndex = i; foundLiner = true; } else if (boundary()[i].name() == "cylinderHead") { cylinderHeadIndex = i; foundCylinderHead = true; } } reduce(foundPiston, orOp<bool>()); reduce(foundLiner, orOp<bool>()); reduce(foundCylinderHead, orOp<bool>()); if (!foundPiston) { FatalErrorIn("Foam::verticalValves::checkAndCalculate()") << " : cannot find piston patch" << abort(FatalError); } if (!foundLiner) { FatalErrorIn("Foam::verticalValves::checkAndCalculate()") << " : cannot find liner patch" << abort(FatalError); } if (!foundCylinderHead) { FatalErrorIn("Foam::verticalValves::checkAndCalculate()") << " : cannot find cylinderHead patch" << exit(FatalError); } { if (linerIndex != -1) { pistonPosition() = max(boundary()[pistonIndex].patch().localPoints()).z(); } reduce(pistonPosition(), minOp<scalar>()); if (cylinderHeadIndex != -1) { deckHeight() = min ( boundary()[cylinderHeadIndex].patch().localPoints() ).z(); } reduce(deckHeight(), minOp<scalar>()); Info<< "deckHeight: " << deckHeight() << nl << "piston position: " << pistonPosition() << endl; } }
bool Foam::twoStrokeEngine::update() { // Detaching the interface if (attached()) { Info << "Decoupling sliding interfaces" << endl; makeSlidersLive(); // Changing topology by hand autoPtr<mapPolyMesh> topoChangeMap5 = topoChanger_.changeMesh(); if (topoChangeMap5->hasMotionPoints() && topoChangeMap5->morphing()) { Info << "Topology change; executing pre-motion after " << "sliding detach" << endl; movePoints(topoChangeMap5->preMotionPoints()); } Info << "sliding interfaces successfully decoupled!!!" << endl; } else { Info << "Sliding interfaces decoupled" << endl; } Info << "Executing layer action" << endl; // Piston Layering makeLayersLive(); // Changing topology by hand // /* Tommaso, 23/5/2008 // Find piston mesh modifier const label pistonLayerID = topoChanger_.findModifierID("pistonLayer"); if (pistonLayerID < 0) { FatalErrorIn("void engineFvMesh::moveAndMorph()") << "Piston modifier not found." << abort(FatalError); } scalar minLayerThickness = piston().minLayer(); scalar deltaZ = engTime().pistonDisplacement().value(); virtualPistonPosition() += deltaZ; Info << "virtualPistonPosition = " << virtualPistonPosition() << ", deckHeight = " << deckHeight() << ", pistonPosition = " << pistonPosition() << endl; if (realDeformation()) { // Dectivate piston layer Info << "Mesh deformation mode" << endl; topoChanger_[pistonLayerID].disable(); } else { // Activate piston layer Info << "Piston layering mode" << endl; topoChanger_[pistonLayerID].enable(); } // Changing topology by hand autoPtr<mapPolyMesh> topoChangeMap = topoChanger_.changeMesh(); // Work array for new points position. pointField newPoints = allPoints(); const pointField& refPoints = allPoints(); if (topoChangeMap->morphing()) { if (topoChangeMap->hasMotionPoints()) { Info<< "Topology change; executing pre-motion after " << "dynamic layering" << endl; movePoints(topoChangeMap->preMotionPoints()); newPoints = topoChangeMap->preMotionPoints(); } setV0(); resetMotion(); } // Reset the position of layered interfaces boolList scaleDisp(nPoints(), true); boolList pistonPoint(newPoints.size(), false); boolList headPoint(newPoints.size(), false); // Make a list of piston and head points. HJ, 2/Dec/2009 labelList pistonPoints; labelList headPoints; { label pistonCellIndex = cellZones().findZoneID("pistonCells"); if (pistonCellIndex < 0) { FatalErrorIn("bool twoStrokeEngine::update()") << "Cannot find cell zone pistonCells" << abort(FatalError); } const labelList& pistonCells = cellZones()[pistonCellIndex]; label headCellIndex = cellZones().findZoneID("headCells"); if (headCellIndex < 0) { FatalErrorIn("bool twoStrokeEngine::update()") << "Cannot find cell zone headCells" << abort(FatalError); } const labelList& headCells = cellZones()[headCellIndex]; const labelListList& cp = cellPoints(); boolList count(newPoints.size(), false); forAll (pistonCells, cellI) { const labelList& curCellPoints = cp[pistonCells[cellI]]; forAll (curCellPoints, i) { count[curCellPoints[i]] = true; } } // Count the points label nCounted = 0; forAll (count, pointI) { if (count[pointI] == true) { nCounted++; } } pistonPoints.setSize(nCounted); // Collect the points nCounted = 0; forAll (count, pointI) { if (count[pointI] == true) { pistonPoints[nCounted] = pointI; nCounted++; } } // Repeat for head points count = false; forAll (headCells, cellI) { const labelList& curCellPoints = cp[pistonCells[cellI]]; forAll (curCellPoints, i) { count[curCellPoints[i]] = true; } } // Count the points nCounted = 0; forAll (count, pointI) { if (count[pointI] == true) { nCounted++; } } headPoints.setSize(nCounted); // Collect the points nCounted = 0; forAll (count, pointI) { if (count[pointI] == true) { headPoints[nCounted] = pointI; nCounted++; } } } label nScaled = nPoints(); // label pistonPtsIndex = pointZones().findZoneID("pistonPoints"); // const labelList& pistonPoints = pointZones()[pistonPtsIndex]; // label headPtsIndex = pointZones().findZoneID("headPoints"); // const labelList& headPoints = pointZones()[headPtsIndex]; const scalarField& movingPointsM = movingPointsMask(); forAll(pistonPoints, i) { label pointI = pistonPoints[i]; pistonPoint[pointI] = true; point& p = newPoints[pointI]; if (p.z() < pistonPosition() - 1.0e-6) { scaleDisp[pointI] = false; nScaled--; } }