Commit 0d892704 authored by andy's avatar andy
Browse files

ENH: Added log file support to particle face post-processing

parent 2d08289f
......@@ -52,7 +52,47 @@ void Foam::FacePostProcessing<CloudType>::applyToFace
faceI = j;
return;
}
}
}
}
}
template<class CloudType>
void Foam::FacePostProcessing<CloudType>::makeLogFile
(
const word& zoneName,
const label zoneI,
const label nFaces,
const scalar totArea
)
{
// Create the output file if not already created
if (log_)
{
if (debug)
{
Info<< "Creating output file." << endl;
}
if (Pstream::master())
{
// Create directory if does not exist
mkDir(outputDir_);
// Open new file at start up
outputFilePtr_.set
(
zoneI,
new OFstream(outputDir_/(type() + '_' + zoneName + ".dat"))
);
outputFilePtr_[zoneI]
<< "# Source : " << type() << nl
<< "# Face zone : " << zoneName << nl
<< "# Faces : " << nFaces << nl
<< "# Area : " << totArea << nl
<< "# Time" << tab << "mass" << tab << "massFlux" << endl;
}
}
}
......@@ -61,8 +101,9 @@ template<class CloudType>
void Foam::FacePostProcessing<CloudType>::write()
{
const fvMesh& mesh = this->owner().mesh();
const faceZoneMesh& fzm = this->owner().mesh().faceZones();
const scalar dt = this->owner().time().deltaTValue();
const Time& time = mesh.time();
const faceZoneMesh& fzm = mesh.faceZones();
const scalar dt = time.deltaTValue();
totalTime_ += dt;
......@@ -80,8 +121,11 @@ void Foam::FacePostProcessing<CloudType>::write()
Info<< "particleFaceFlux output:" << nl;
List<scalarField> zoneMassTotal(mass_.size());
forAll(zoneMassTotal, zoneI)
List<scalarField> zoneMassFlux(massFlux_.size());
forAll(faceZoneIDs_, zoneI)
{
const word& zoneName = fzm[faceZoneIDs_[zoneI]].name();
scalarListList allProcMass(Pstream::nProcs());
allProcMass[procI] = massTotal_[zoneI];
Pstream::gatherList(allProcMass);
......@@ -90,15 +134,8 @@ void Foam::FacePostProcessing<CloudType>::write()
(
allProcMass, accessOp<scalarList>()
);
const scalar sumMassTotal = sum(zoneMassTotal[zoneI]);
const word& zoneName = fzm[faceZoneIDs_[zoneI]].name();
Info<< " " << zoneName << " total mass = "
<< sum(zoneMassTotal[zoneI]) << nl;
}
List<scalarField> zoneMassFlux(massFlux_.size());
forAll(zoneMassFlux, zoneI)
{
scalarListList allProcMassFlux(Pstream::nProcs());
allProcMassFlux[procI] = massFlux_[zoneI];
Pstream::gatherList(allProcMassFlux);
......@@ -107,10 +144,19 @@ void Foam::FacePostProcessing<CloudType>::write()
(
allProcMassFlux, accessOp<scalarList>()
);
const scalar sumMassFlux = sum(zoneMassFlux[zoneI]);
const word& zoneName = fzm[faceZoneIDs_[zoneI]].name();
Info<< " " << zoneName << " average mass flux = "
<< sum(zoneMassFlux[zoneI]) << nl;
Info<< " " << zoneName
<< ": total mass = " << sumMassTotal
<< "; average mass flux = " << sumMassFlux
<< nl;
if (outputFilePtr_.set(zoneI))
{
OFstream& os = outputFilePtr_[zoneI];
os << time.timeName() << token::TAB << sumMassTotal << token::TAB
<< sumMassFlux<< endl;
}
}
Info<< endl;
......@@ -125,14 +171,12 @@ void Foam::FacePostProcessing<CloudType>::write()
// Put in undecomposed case (Note: gives problems for
// distributed data running)
outputDir =
outputDir/".."/"postProcessing"/cloud::prefix/
this->owner().name()/mesh.time().timeName();
outputDir/".."/"postProcessing"/cloud::prefix/time.timeName();
}
else
{
outputDir =
outputDir/"postProcessing"/cloud::prefix/
this->owner().name()/mesh.time().timeName();
outputDir/"postProcessing"/cloud::prefix/time.timeName();
}
forAll(faceZoneIDs_, zoneI)
......@@ -247,15 +291,36 @@ Foam::FacePostProcessing<CloudType>::FacePostProcessing
totalTime_(0.0),
mass_(),
massTotal_(),
massFlux_()
massFlux_(),
log_(this->coeffDict().lookup("log")),
outputFilePtr_(),
outputDir_(owner.mesh().time().path())
{
wordList faceZoneNames(this->coeffDict().lookup("faceZones"));
mass_.setSize(faceZoneNames.size());
massTotal_.setSize(faceZoneNames.size());
massFlux_.setSize(faceZoneNames.size());
outputFilePtr_.setSize(faceZoneNames.size());
if (Pstream::parRun())
{
// Put in undecomposed case (Note: gives problems for
// distributed data running)
outputDir_ =
outputDir_/".."/"postProcessing"/cloud::prefix/
owner.name()/owner.mesh().time().timeName();
}
else
{
outputDir_ =
outputDir_/"postProcessing"/cloud::prefix/
owner.name()/owner.mesh().time().timeName();
}
DynamicList<label> zoneIDs;
const faceZoneMesh& fzm = owner.mesh().faceZones();
const surfaceScalarField& magSf = owner.mesh().magSf();
forAll(faceZoneNames, i)
{
const word& zoneName = faceZoneNames[i];
......@@ -269,6 +334,15 @@ Foam::FacePostProcessing<CloudType>::FacePostProcessing
massTotal_[i].setSize(nFaces, 0.0);
massFlux_[i].setSize(nFaces, 0.0);
Info<< " " << zoneName << " faces: " << nFaces;
scalar totArea = 0.0;
forAll(fz, j)
{
totArea += magSf[fz[j]];
}
totArea = returnReduce(totArea, sumOp<scalar>());
makeLogFile(zoneName, i, nFaces, totArea);
}
}
......@@ -291,7 +365,10 @@ Foam::FacePostProcessing<CloudType>::FacePostProcessing
totalTime_(pff.totalTime_),
mass_(pff.mass_),
massTotal_(pff.massTotal_),
massFlux_(pff.massFlux_)
massFlux_(pff.massFlux_),
log_(pff.log_),
outputFilePtr_(),
outputDir_(pff.outputDir_)
{}
......
......@@ -85,9 +85,27 @@ class FacePostProcessing
//- Mass flux storage
List<scalarField> massFlux_;
//- Flag to indicate whether data should be written to file
Switch log_;
//- Output file pointer per zone
PtrList<OFstream> outputFilePtr_;
//- Output directory
fileName outputDir_;
// Private Member Functions
//- Helper function to create log files
void makeLogFile
(
const word& zoneName,
const label zoneI,
const label nFaces,
const scalar totArea
);
//- Return index into storage lists if valid zone and face
void applyToFace
(
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment