diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C index 05bc2e2814..7b7ca07052 100644 --- a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C +++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C @@ -735,7 +735,7 @@ bool Foam::noiseModel::read(const dictionary& dict) ); } - Info<< nl << endl; + Info<< endl; return true; } diff --git a/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C index fc3fc74ac5..2554c52219 100644 --- a/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C +++ b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C @@ -74,7 +74,8 @@ void pointNoise::processData const Function1Types::CSV& data ) { - Info<< "Reading data file " << data.fName() << endl; + Info<< "Reading data file: " + << fileObr_.time().relativePath(data.fName()) << endl; const word fNameBase(data.fName().stem()); diff --git a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C index aaa0b2d03c..b5ed3794a1 100644 --- a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C +++ b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C @@ -28,6 +28,7 @@ License #include "surfaceNoise.H" #include "surfaceReader.H" #include "surfaceWriter.H" +#include "globalIndex.H" #include "argList.H" #include "addToRunTimeSelectionTable.H" @@ -47,7 +48,8 @@ addToRunTimeSelectionTable(noiseModel, surfaceNoise, dictionary); void surfaceNoise::initialise(const fileName& fName) { - Info<< "Reading data file " << fName << endl; + Info<< "Reading data file: " + << fileObr_.time().relativePath(fName) << endl; instantList allTimes; label nAvailableTimes = 0; @@ -107,7 +109,8 @@ void surfaceNoise::initialise(const fileName& fName) // Read the surface geometry // Note: hard-coded to read mesh from first time index const meshedSurface& surf = readerPtr_->geometry(0); - nFace_ = surf.nFaces(); + + nFaces_ = surf.nFaces(); } Pstream::broadcasts @@ -115,14 +118,14 @@ void surfaceNoise::initialise(const fileName& fName) UPstream::worldComm, times_, deltaT_, - nFace_ + nFaces_ ); } void surfaceNoise::readSurfaceData ( - const labelList& procFaceOffset, + const globalIndex& procFaceAddr, List& pData ) { @@ -131,12 +134,23 @@ void surfaceNoise::readSurfaceData // surface face. In serial mode, this results in all pressure data being // loaded into memory (!) - Info << "Reading pressure data" << endl; + const label nLocalFace = procFaceAddr.localSize(); + + // Complete pressure time history data for subset of faces + pData.resize_nocopy(nLocalFace); + const label nTimes = times_.size(); + for (scalarField& pf : pData) + { + pf.resize_nocopy(nTimes); + } + + Info<< "Reading pressure data" << endl; + + // Master only + scalarField allData; if (Pstream::parRun()) { - PstreamBuffers pBufs(Pstream::commsTypes::nonBlocking); - // Procedure: // 1. Master processor reads pressure data for all faces for all times // 2. Master sends each processor a subset of faces @@ -144,96 +158,89 @@ void surfaceNoise::readSurfaceData // of faces // Note: reading all data on master to avoid potential NFS problems... - const label myProcI = Pstream::myProcNo(); - const label nLocalFace = - procFaceOffset[myProcI + 1] - procFaceOffset[myProcI]; + scalarField scratch; - // Complete pressure time history data for subset of faces - pData.setSize(nLocalFace); - const label nTimes = times_.size(); - for (scalarField& pf : pData) + if (!useBroadcast_) { - pf.setSize(nTimes); + scratch.resize(nLocalFace); } - // Read and send data - forAll(times_, i) + // Read data and send to sub-ranks + forAll(times_, timei) { - pBufs.clear(); + const label fileTimeIndex = timei + startTimeIndex_; if (Pstream::master()) { - label timeI = i + startTimeIndex_; - - Info<< " time: " << times_[i] << endl; + Info<< " time: " << times_[timei] << endl; // Read pressure at all faces for time timeI - scalarField p(readerPtr_->field(timeI, pIndex_, scalar(0))); - - // Apply conversions - p *= rhoRef_; - - // Send subset of faces to each processor - for (const int procI : Pstream::allProcs()) - { - label face0 = procFaceOffset[procI]; - label nLocalFace = - procFaceOffset[procI + 1] - procFaceOffset[procI]; - - UOPstream toProc(procI, pBufs); - toProc << SubList(p, nLocalFace, face0); - } + allData = readerPtr_->field(fileTimeIndex, pIndex_, scalar(0)); } - pBufs.finishedScatters(); - - // Receive data from the master - UIPstream fromProc(Pstream::masterNo(), pBufs); - scalarList pSlice(fromProc); - - forAll(pSlice, faceI) + if (useBroadcast_) { - pData[faceI][i] = pSlice[faceI]; + Pstream::broadcast(allData); + } + else + { + procFaceAddr.scatter + ( + allData, + scratch, + UPstream::msgType(), + commType_, + UPstream::worldComm + ); } - } - forAll(pData, faceI) - { - pData[faceI] -= average(pData[faceI]); + scalarField::subField procData = + ( + useBroadcast_ + ? allData.slice(procFaceAddr.range()) + : scratch.slice(0, nLocalFace) + ); + + // Apply conversions + procData *= rhoRef_; + + // Transcribe this time snapshot (transpose) + forAll(procData, facei) + { + pData[facei][timei] = procData[facei]; + } } } else { - const label nLocalFace = procFaceOffset[0]; - - pData.setSize(nLocalFace); - for (scalarField& pf : pData) + // Read data - no sub-ranks + forAll(times_, timei) { - pf.setSize(times_.size()); - } + const label fileTimeIndex = timei + startTimeIndex_; - forAll(times_, i) - { - label timeI = i + startTimeIndex_; + Info<< " time: " << times_[timei] << endl; - Info<< " time: " << times_[i] << endl; - scalarField p(readerPtr_->field(timeI, pIndex_, scalar(0))); + allData = readerPtr_->field(fileTimeIndex, pIndex_, scalar(0)); + + auto& procData = allData; // Apply conversions - p *= rhoRef_; + procData *= rhoRef_; - forAll(p, faceI) + // Transcribe this time snapshot (transpose) + forAll(procData, facei) { - pData[faceI][i] = p[faceI]; + pData[facei][timei] = procData[facei]; } } - - forAll(pData, faceI) - { - pData[faceI] -= average(pData[faceI]); - } } + forAll(pData, facei) + { + pData[facei] -= average(pData[facei]); + } + + Info<< "Read " << returnReduce(pData.size(), sumOp