ENH: forces - updated writing of data to file

This commit is contained in:
andy 2013-07-26 15:24:28 +01:00
parent 0de6c01a7c
commit a82d85791f
2 changed files with 173 additions and 101 deletions

View File

@ -45,22 +45,88 @@ defineTypeNameAndDebug(forces, 0);
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
void Foam::forces::writeFileHeader(const label i)
Foam::wordList Foam::forces::createFileNames(const dictionary& dict) const
{
file()
<< "# Time" << tab
<< "forces(pressure, viscous, porous) "
<< "moment(pressure, viscous, porous)";
DynamicList<word> names(1);
if (localSystem_)
const word forceType(dict.lookup("type"));
if (dict.found("binData"))
{
file()
<< tab
<< "local forces(pressure, viscous, porous) "
<< "local moment(pressure, viscous, porous)";
const dictionary& binDict(dict.subDict("binData"));
label nb = readLabel(binDict.lookup("nBin"));
if (nb > 0)
{
names.append(forceType + "_bins");
}
}
file()<< endl;
names.append(forceType);
return names;
}
void Foam::forces::writeFileHeader(const label i)
{
if (i == 0)
{
// force data
file(i)
<< "# Time" << tab
<< "forces(pressure,viscous,porous) "
<< "moment(pressure,viscous,porous)";
if (localSystem_)
{
file(i)
<< tab
<< "localForces(pressure,viscous,porous) "
<< "localMoments(pressure,viscous,porous)";
}
}
else if (i == 1)
{
// bin data
file(i)
<< "# bins : " << nBin_ << nl
<< "# start : " << binMin_ << nl
<< "# delta : " << binDx_ << nl
<< "# direction : " << binDir_ << nl
<< "# Time";
for (label j = 0; j < nBin_; j++)
{
const word jn = Foam::name(j);
file(i)
<< tab
<< "forces" << jn << "(pressure,viscous,porous) "
<< "moment" << jn << "(pressure,viscous,porous)";
}
if (localSystem_)
{
for (label j = 0; j < nBin_; j++)
{
const word jn = Foam::name(j);
file(i)
<< tab
<< "localForces" << jn << "(pressure,viscous,porous) "
<< "localMoments" << jn << "(pressure,viscous,porous)";
}
}
}
else
{
FatalErrorIn("void Foam::forces::writeFileHeader(const label)")
<< "Unhandled file index: " << i
<< abort(FatalError);
}
file(i)<< endl;
}
@ -249,26 +315,67 @@ void Foam::forces::applyBins
}
void Foam::forces::writeBins() const
void Foam::forces::writeForces()
{
if (log_)
{
Info<< type() << " output:" << nl
<< " forces(pressure,viscous,porous) = ("
<< sum(force_[0]) << ","
<< sum(force_[1]) << ","
<< sum(force_[2]) << ")" << nl
<< " moment(pressure,viscous,porous) = ("
<< sum(moment_[0]) << ","
<< sum(moment_[1]) << ","
<< sum(moment_[2]) << ")"
<< nl;
}
file(0) << obr_.time().value() << tab
<< "("
<< sum(force_[0]) << ","
<< sum(force_[1]) << ","
<< sum(force_[2])
<< ") "
<< "("
<< sum(moment_[0]) << ","
<< sum(moment_[1]) << ","
<< sum(moment_[2])
<< ")"
<< endl;
if (localSystem_)
{
vectorField localForceN(coordSys_.localVector(force_[0]));
vectorField localForceT(coordSys_.localVector(force_[1]));
vectorField localForceP(coordSys_.localVector(force_[2]));
vectorField localMomentN(coordSys_.localVector(moment_[0]));
vectorField localMomentT(coordSys_.localVector(moment_[1]));
vectorField localMomentP(coordSys_.localVector(moment_[2]));
file(0) << obr_.time().value() << tab
<< "("
<< sum(localForceN) << ","
<< sum(localForceT) << ","
<< sum(localForceP)
<< ") "
<< "("
<< sum(localMomentN) << ","
<< sum(localMomentT) << ","
<< sum(localMomentP)
<< ")"
<< endl;
}
}
void Foam::forces::writeBins()
{
if (nBin_ == 1)
{
return;
}
autoPtr<writer<vector> > binWriterPtr(writer<vector>::New(binFormat_));
coordSet axis("forces", "distance", binPoints_, mag(binPoints_));
fileName forcesDir = baseTimeDir();
mkDir(forcesDir);
if (log_)
{
Info<< " Writing bins to " << forcesDir << endl;
}
wordList fieldNames(IStringStream("(pressure viscous porous)")());
List<Field<vector> > f(force_);
List<Field<vector> > m(moment_);
@ -286,43 +393,50 @@ void Foam::forces::writeBins() const
}
}
OFstream osForce(forcesDir/"force_bins");
binWriterPtr->write(axis, fieldNames, f, osForce);
OFstream osMoment(forcesDir/"moment_bins");
binWriterPtr->write(axis, fieldNames, m, osMoment);
file(1) << obr_.time().value();
forAll(f[0], i)
{
file(1)
<< tab
<< "(" << f[0][i] << "," << f[1][i] << "," << f[2][i] << ") "
<< "(" << m[0][i] << "," << m[1][i] << "," << m[2][i] << ")";
}
if (localSystem_)
{
List<Field<vector> > localForce(3);
List<Field<vector> > localMoment(3);
localForce[0] = coordSys_.localVector(force_[0]);
localForce[1] = coordSys_.localVector(force_[1]);
localForce[2] = coordSys_.localVector(force_[2]);
localMoment[0] = coordSys_.localVector(moment_[0]);
localMoment[1] = coordSys_.localVector(moment_[1]);
localMoment[2] = coordSys_.localVector(moment_[2]);
List<Field<vector> > lf(3);
List<Field<vector> > lm(3);
lf[0] = coordSys_.localVector(force_[0]);
lf[1] = coordSys_.localVector(force_[1]);
lf[2] = coordSys_.localVector(force_[2]);
lm[0] = coordSys_.localVector(moment_[0]);
lm[1] = coordSys_.localVector(moment_[1]);
lm[2] = coordSys_.localVector(moment_[2]);
if (binCumulative_)
{
for (label i = 1; i < localForce[0].size(); i++)
for (label i = 1; i < lf[0].size(); i++)
{
localForce[0][i] += localForce[0][i-1];
localForce[1][i] += localForce[1][i-1];
localForce[2][i] += localForce[2][i-1];
localMoment[0][i] += localMoment[0][i-1];
localMoment[1][i] += localMoment[1][i-1];
localMoment[2][i] += localMoment[2][i-1];
lf[0][i] += lf[0][i-1];
lf[1][i] += lf[1][i-1];
lf[2][i] += lf[2][i-1];
lm[0][i] += lm[0][i-1];
lm[1][i] += lm[1][i-1];
lm[2][i] += lm[2][i-1];
}
}
OFstream osLocalForce(forcesDir/"force_local");
binWriterPtr->write(axis, fieldNames, localForce, osLocalForce);
OFstream osLocalMoment(forcesDir/"moment_local");
binWriterPtr->write(axis, fieldNames, localMoment, osLocalMoment);
forAll(lf[0], i)
{
file(1)
<< tab
<< "(" << lf[0][i] << "," << lf[1][i] << "," << lf[2][i] << ") "
<< "(" << lm[0][i] << "," << lm[1][i] << "," << lm[2][i] << ")";
}
}
file(1) << endl;
}
@ -336,7 +450,7 @@ Foam::forces::forces
const bool loadFromFiles
)
:
functionObjectFile(obr, name, word(dict.lookup("type"))),
functionObjectFile(obr, name, createFileNames(dict)),
name_(name),
obr_(obr),
active_(true),
@ -642,55 +756,7 @@ void Foam::forces::write()
{
functionObjectFile::write();
if (log_)
{
Info<< type() << " output:" << nl
<< " forces(pressure,viscous,porous) = ("
<< sum(force_[0]) << ","
<< sum(force_[1]) << ","
<< sum(force_[2]) << ")" << nl
<< " moment(pressure,viscous,porous) = ("
<< sum(moment_[0]) << ","
<< sum(moment_[1]) << ","
<< sum(moment_[2]) << ")"
<< nl;
}
file() << obr_.time().value() << tab
<< "("
<< sum(force_[0]) << ","
<< sum(force_[1]) << ","
<< sum(force_[2])
<< ") "
<< "("
<< sum(moment_[0]) << ","
<< sum(moment_[1]) << ","
<< sum(moment_[2])
<< ")"
<< endl;
if (localSystem_)
{
vectorField localForceN(coordSys_.localVector(force_[0]));
vectorField localForceT(coordSys_.localVector(force_[1]));
vectorField localForceP(coordSys_.localVector(force_[2]));
vectorField localMomentN(coordSys_.localVector(moment_[0]));
vectorField localMomentT(coordSys_.localVector(moment_[1]));
vectorField localMomentP(coordSys_.localVector(moment_[2]));
file() << obr_.time().value() << tab
<< "("
<< sum(localForceN) << ","
<< sum(localForceT) << ","
<< sum(localForceP)
<< ") "
<< "("
<< sum(localMomentN) << ","
<< sum(localMomentT) << ","
<< sum(localMomentP)
<< ")"
<< endl;
}
writeForces();
writeBins();

View File

@ -218,6 +218,9 @@ protected:
// Protected Member Functions
//- Create file names for forces and bins
wordList createFileNames(const dictionary& dict) const;
//- Output file header information
virtual void writeFileHeader(const label i);
@ -244,8 +247,11 @@ protected:
const vectorField& d
);
//- Helper function to write force data
void writeForces();
//- Helper function to write bin data
void writeBins() const;
void writeBins();
//- Disallow default bitwise copy construct
forces(const forces&);