/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright held by original author \\/ 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 Author Zeljko Tukovic, FSB Zagreb. All rights reserved \*----------------------------------------------------------------------------*/ #include "pointHistory.H" #include "addToRunTimeSelectionTable.H" #include "volFields.H" #include "pointFields.H" #include "boundBox.H" #include "fluidSolidInterface.H" #include "OStringStream.H" #include "IStringStream.H" #include "IOmanip.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // namespace Foam { defineTypeNameAndDebug(pointHistory, 0); addToRunTimeSelectionTable ( functionObject, pointHistory, dictionary ); } // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // bool Foam::pointHistory::writeData() { const fvMesh& mesh = time_.lookupObject(polyMesh::defaultRegion); // vector deflection = vector::zero; // vector velocity = vector::zero; // if (processor_ == Pstream::myProcNo()) // { // if (mesh.foundObject("fsiProperties")) // { // const fluidSolidInterface& fsi = // mesh.lookupObject("fsiProperties"); // deflection = fsi.stress().pointD()[historyPointID_]; // if (writeVelocity_) // { // velocity = fsi.stress().pointU(historyPointID_); // } // } // else // { // deflection = mesh.points()[historyPointID_] - refHistoryPoint_; // if (mesh.foundObject("pointD")) // { // const pointVectorField& pointU = // mesh.lookupObject("pointD"); // deflection = pointU[historyPointID_]; // } // else if (mesh.foundObject("pointU")) // { // const pointVectorField& pointU = // mesh.lookupObject("pointU"); // deflection = pointU[historyPointID_]; // } // } // } // reduce(deflection, sumOp()); // reduce(velocity, sumOp()); if (Pstream::master()) { historyFilePtr_() << setprecision(12); historyFilePtr_() << time_.time().value() << tab << deflection.x() << tab << deflection.y() << tab << deflection.z(); // if (writeVelocity_) // { // historyFilePtr_() // << tab << velocity.x() << tab // << velocity.y() << tab << velocity.z(); // } historyFilePtr_() << endl; } return true; } // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::pointHistory::pointHistory ( const word& name, const Time& t, const dictionary& dict ) : functionObject(name), name_(name), time_(t), regionName_(polyMesh::defaultRegion), // historyPointID_(-1), // refHistoryPoint_(dict.lookup("refHistoryPoint")), // writeVelocity_(false), // processor_(-1), historyFilePtr_(NULL) { Info << "Creating " << this->name() << " function object." << endl; // if (Pstream::parRun()) // { // FatalErrorIn("pointHistory::pointHistory(...)") // << "pointHistory objec function " // << "is not implemented for parallel run" // << abort(FatalError); // } if (dict.found("region")) { dict.lookup("region") >> regionName_; } // if (dict.found("historyPointID")) // { // dict.lookup("historyPointID") >> historyPointID_; // } // if (dict.found("writeVelocity")) // { // dict.lookup("writeVelocity") >> writeVelocity_; // } const fvMesh& mesh = time_.lookupObject(regionName_); // const vectorField& points = mesh.points(); // List minDist(Pstream::nProcs(), GREAT); // if (historyPointID_ == -1) // { // forAll(points, pointI) // { // scalar dist = mag(refHistoryPoint_ - points[pointI]); // if (dist < minDist[Pstream::myProcNo()]) // { // minDist[Pstream::myProcNo()] = dist; // historyPointID_ = pointI; // } // } // } // Pstream::gatherList(minDist); // Pstream::scatterList(minDist); // processor_ = -1; // scalar min = GREAT; // forAll(minDist, procI) // { // if (minDist[procI] < min) // { // min = minDist[procI]; // processor_ = procI; // } // } // if (processor_ == Pstream::myProcNo()) // { // Pout << "History point ID: " << historyPointID_ << endl; // Pout << "History point coordinates: " // << points[historyPointID_] << endl; // Pout << "Reference point coordinates: " << refHistoryPoint_ << endl; // } // Create history file if not already created if (historyFilePtr_.empty()) { // File update if (Pstream::master()) { fileName historyDir; word startTimeName = time_.timeName(mesh.time().startTime().value()); if (Pstream::parRun()) { // Put in undecomposed case (Note: gives problems for // distributed data running) historyDir = time_.path()/".."/"history"/startTimeName; } else { historyDir = time_.path()/"history"/startTimeName; } // Create directory if does not exist. mkDir(historyDir); // Open new file at start up OStringStream FileName; FileName() << "point_" << historyPointID_ << ".dat"; historyFilePtr_.reset ( new OFstream(historyDir/word(FileName.str())) ); // historyFilePtr_.reset(new OFstream(historyDir/"point.dat")); // Add headers to output data if (historyFilePtr_.valid()) { historyFilePtr_() << "# Time" << tab << "X" << tab << "Y" << tab << "Z"; if (writeVelocity_) { historyFilePtr_() << tab << "Vx" << tab << "Vy" << tab << "Vz"; } historyFilePtr_() << endl; } } } } // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // bool Foam::pointHistory::start() { return writeData(); } bool Foam::pointHistory::execute() { return writeData(); } bool Foam::pointHistory::read(const dictionary& dict) { if (dict.found("region")) { dict.lookup("region") >> regionName_; } return true; } // ************************************************************************* //