diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C index 1068ea0096..d5f76f5af2 100644 --- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C +++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C @@ -32,20 +32,28 @@ License // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // template -Foam::label Foam::FacePostProcessing::applyToFace +void Foam::FacePostProcessing::applyToFace ( - const label faceI + const label faceIn, + label& zoneI, + label& faceI ) const { - forAll(fZone_, i) - { - if (fZone_[i] == faceI) - { - return i; - } - } + const faceZoneMesh& fzm = this->owner().mesh().faceZones(); - return -1; + forAll(faceZoneIDs_, i) + { + const faceZone& fz = fzm[faceZoneIDs_[i]]; + forAll(fz, j) + { + if (fz[j] == faceIn) + { + zoneI = i; + faceI = j; + return; + } + } + } } @@ -53,6 +61,7 @@ template void Foam::FacePostProcessing::write() { const fvMesh& mesh = this->owner().mesh(); + const faceZoneMesh& fzm = this->owner().mesh().faceZones(); const scalar dt = this->owner().time().deltaTValue(); totalTime_ += dt; @@ -60,133 +69,159 @@ void Foam::FacePostProcessing::write() const scalar alpha = (totalTime_ - dt)/totalTime_; const scalar beta = dt/totalTime_; - massTotal_ += mass_; - - massFlux_ = alpha*massFlux_ + beta*mass_/dt; + forAll(faceZoneIDs_, zoneI) + { + massTotal_[zoneI] += mass_[zoneI]; + massFlux_[zoneI] = alpha*massFlux_[zoneI] + beta*mass_[zoneI]/dt; + } const label procI = Pstream::myProcNo(); - scalarListList allProcMass(Pstream::nProcs()); - allProcMass[procI] = massTotal_; - Pstream::gatherList(allProcMass); - scalarField allMass - ( - ListListOps::combine - ( - allProcMass, accessOp() - ) - ); + Info<< "particleFaceFlux output:" << nl; - scalarListList allProcMassFlux(Pstream::nProcs()); - allProcMassFlux[procI] = massFlux_; - Pstream::gatherList(allProcMassFlux); - scalarField allMassFlux - ( - ListListOps::combine - ( - allProcMassFlux, accessOp() - ) - ); + List zoneMassTotal(mass_.size()); + forAll(zoneMassTotal, zoneI) + { + scalarListList allProcMass(Pstream::nProcs()); + allProcMass[procI] = massTotal_[zoneI]; + Pstream::gatherList(allProcMass); + zoneMassTotal[zoneI] = + ListListOps::combine + ( + allProcMass, accessOp() + ); - Info<< "particleFaceFlux output:" << nl - << " total mass = " << sum(allMass) << nl - << " average mass flux = " << sum(allMassFlux) << nl << endl; + const word& zoneName = fzm[faceZoneIDs_[zoneI]].name(); + Info<< " " << zoneName << " total mass = " + << sum(zoneMassTotal[zoneI]) << nl; + } + + List zoneMassFlux(massFlux_.size()); + forAll(zoneMassFlux, zoneI) + { + scalarListList allProcMassFlux(Pstream::nProcs()); + allProcMassFlux[procI] = massFlux_[zoneI]; + Pstream::gatherList(allProcMassFlux); + zoneMassFlux[zoneI] = + ListListOps::combine + ( + allProcMassFlux, accessOp() + ); + + const word& zoneName = fzm[faceZoneIDs_[zoneI]].name(); + Info<< " " << zoneName << " average mass flux = " + << sum(zoneMassFlux[zoneI]) << nl; + } + + Info<< endl; if (surfaceFormat_ != "none") { - labelList pointToGlobal; - labelList uniqueMeshPointLabels; - autoPtr globalPointsPtr = - mesh.globalData().mergePoints - ( - fZone_().meshPoints(), - fZone_().meshPointMap(), - pointToGlobal, - uniqueMeshPointLabels - ); + fileName outputDir = mesh.time().path(); - pointField uniquePoints(mesh.points(), uniqueMeshPointLabels); - List allProcPoints(Pstream::nProcs()); - allProcPoints[procI] = uniquePoints; - Pstream::gatherList(allProcPoints); - - faceList faces(fZone_().localFaces()); - forAll(faces, i) + if (Pstream::parRun()) { - inplaceRenumber(pointToGlobal, faces[i]); + // Put in undecomposed case (Note: gives problems for + // distributed data running) + outputDir = + outputDir/".."/"postProcessing"/cloud::prefix/ + this->owner().name()/mesh.time().timeName(); } - List allProcFaces(Pstream::nProcs()); - allProcFaces[procI] = faces; - Pstream::gatherList(allProcFaces); - - if (Pstream::master()) + else { - pointField allPoints - ( - ListListOps::combine + outputDir = + outputDir/"postProcessing"/cloud::prefix/ + this->owner().name()/mesh.time().timeName(); + } + + forAll(faceZoneIDs_, zoneI) + { + const faceZone& fZone = fzm[faceZoneIDs_[zoneI]]; + + labelList pointToGlobal; + labelList uniqueMeshPointLabels; + autoPtr globalPointsPtr = + mesh.globalData().mergePoints ( - allProcPoints, accessOp() - ) - ); + fZone().meshPoints(), + fZone().meshPointMap(), + pointToGlobal, + uniqueMeshPointLabels + ); - faceList allFaces - ( - ListListOps::combine + pointField uniquePoints(mesh.points(), uniqueMeshPointLabels); + List allProcPoints(Pstream::nProcs()); + allProcPoints[procI] = uniquePoints; + Pstream::gatherList(allProcPoints); + + faceList faces(fZone().localFaces()); + forAll(faces, i) + { + inplaceRenumber(pointToGlobal, faces[i]); + } + List allProcFaces(Pstream::nProcs()); + allProcFaces[procI] = faces; + Pstream::gatherList(allProcFaces); + + if (Pstream::master()) + { + pointField allPoints ( - allProcFaces, accessOp() - ) - ); + ListListOps::combine + ( + allProcPoints, accessOp() + ) + ); - fileName outputDir = mesh.time().path(); + faceList allFaces + ( + ListListOps::combine + ( + allProcFaces, accessOp() + ) + ); - if (Pstream::parRun()) - { - // Put in undecomposed case (Note: gives problems for - // distributed data running) - outputDir = - outputDir/".."/"postProcessing"/cloud::prefix/ - this->owner().name()/mesh.time().timeName(); + autoPtr writer(surfaceWriter::New(surfaceFormat_)); + writer->write + ( + outputDir, + fZone.name(), + allPoints, + allFaces, + "massTotal", + zoneMassTotal[zoneI], + false + ); + + writer->write + ( + outputDir, + fZone.name(), + allPoints, + allFaces, + "massFlux", + zoneMassFlux[zoneI], + false + ); } - else - { - outputDir = - outputDir/"postProcessing"/cloud::prefix/ - this->owner().name()/mesh.time().timeName(); - } - - autoPtr writer(surfaceWriter::New(surfaceFormat_)); - writer->write - ( - outputDir, - "massTotal", - allPoints, - allFaces, - "massTotal", - allMass, - false - ); - writer->write - ( - outputDir, - "massFlux", - allPoints, - allFaces, - "massFlux", - allMassFlux, - false - ); } } if (resetOnWrite_) { - massFlux_ = 0.0; + forAll(faceZoneIDs_, zoneI) + { + massFlux_[zoneI] = 0.0; + } totalTime_ = 0.0; } - mass_ = 0.0; + forAll(mass_, zoneI) + { + mass_[zoneI] = 0.0; + } // writeProperties(); } @@ -202,7 +237,7 @@ Foam::FacePostProcessing::FacePostProcessing ) : CloudFunctionObject(dict, owner, typeName), - fZone_(owner.mesh().faceZones()[this->coeffDict().lookup("faceZone")]), + faceZoneIDs_(), surfaceFormat_(this->coeffDict().lookup("surfaceFormat")), resetOnWrite_(this->coeffDict().lookup("resetOnWrite")), totalTime_(0.0), @@ -210,15 +245,32 @@ Foam::FacePostProcessing::FacePostProcessing massTotal_(), massFlux_() { - label allFaces = returnReduce(fZone_().size(), sumOp()); - Info<< " Number of faces = " << allFaces << endl; + wordList faceZoneNames(this->coeffDict().lookup("faceZones")); + mass_.setSize(faceZoneNames.size()); + massTotal_.setSize(faceZoneNames.size()); + massFlux_.setSize(faceZoneNames.size()); - mass_.setSize(fZone_.size(), 0.0); + DynamicList