43 namespace functionObjects
59 static void writeList(Ostream&
os,
const string& header,
const UList<T>&
L)
62 os << header.c_str() <<
nl;
86 const fileName& commsDir,
87 const word& regionGroupName,
88 const wordRe& groupName
103 void Foam::functionObjects::externalCoupled::readColumns
106 const label nColumns,
107 autoPtr<IFstream>& masterFilePtr,
108 List<scalarField>& data
112 const globalIndex globalFaces(globalIndex::gatherOnly{}, nRows);
114 PstreamBuffers pBufs;
119 auto& ifile = masterFilePtr();
125 List<scalarField>
values(nColumns);
128 const label procNRows = globalFaces.localSize(proci);
132 values[columni].setSize(procNRows);
135 for (label rowi = 0; rowi < procNRows; ++rowi)
143 <<
"Trying to read data for processor " << proci
145 <<
". Does your file have as many rows as there are" 146 <<
" patch faces (" << globalFaces.totalSize()
152 while (line.empty() || line[0] ==
'#');
154 ISpanStream isstr(line);
156 for (label columni = 0; columni < nColumns; ++columni)
158 isstr >>
values[columni][rowi];
163 UOPstream toProc(proci, pBufs);
167 pBufs.finishedScatters();
175 void Foam::functionObjects::externalCoupled::readLines
178 autoPtr<IFstream>& masterFilePtr,
183 const globalIndex globalFaces(globalIndex::gatherOnly{}, nRows);
185 PstreamBuffers pBufs;
190 auto& ifile = masterFilePtr();
196 const label procNRows = globalFaces.localSize(proci);
198 UOPstream toProc(proci, pBufs);
200 for (label rowi = 0; rowi < procNRows; ++rowi)
208 <<
"Trying to read data for processor " << proci
210 <<
". Does your file have as many rows as there are" 211 <<
" patch faces (" << globalFaces.totalSize()
217 while (line.empty() || line[0] ==
'#');
225 pBufs.finishedScatters();
232 for (label rowi = 0; rowi < nRows; ++rowi)
234 string line(fromMaster);
267 osPointsPtr() <<
"// Group: " << groupName <<
endl;
268 osFacesPtr() <<
"// Group: " << groupName <<
endl;
270 Info<< typeName <<
": writing geometry to " << dir <<
endl;
275 DynamicList<face> allFaces;
284 mesh.boundaryMesh().patchSet
292 const polyPatch&
p =
mesh.boundaryMesh()[patchi];
294 mesh.globalData().mergePoints
305 collectedPoints[proci] =
pointField(
mesh.points(), uniquePointIDs);
309 faceList& patchFaces = collectedFaces[proci];
310 patchFaces =
p.localFaces();
311 for (
auto&
f : patchFaces)
324 allPoints.append(collectedPoints[proci]);
325 allFaces.append(collectedFaces[proci]);
328 Info<< typeName <<
": mesh " <<
mesh.name()
329 <<
", patch " <<
p.name()
330 <<
": writing " <<
allPoints.size() <<
" points to " 331 << osPointsPtr().name() <<
nl 332 << typeName <<
": mesh " <<
mesh.name()
333 <<
", patch " <<
p.name()
334 <<
": writing " << allFaces.size() <<
" faces to " 335 << osFacesPtr().name() <<
endl;
338 const string entryHeader =
339 patchKey +
' ' +
mesh.name() +
' ' +
p.name();
342 writeList(osFacesPtr(), entryHeader, allFaces);
380 void Foam::functionObjects::externalCoupled::checkOrder
389 <<
"regionNames " <<
regionNames <<
" not in alphabetical order :" 395 void Foam::functionObjects::externalCoupled::initCoupling()
397 if (initialisedCoupling_)
403 forAll(regionGroupNames_, regioni)
405 const word& compName = regionGroupNames_[regioni];
415 const labelList& groups = regionToGroups_[compName];
417 for (
const label groupi : groups)
419 const wordRe& groupName = groupNames_[groupi];
421 bool geomExists =
false;
424 fileName dir(groupDir(commDirectory(), compName, groupName));
428 ||
isFile(dir/
"patchFaces");
449 initialisedCoupling_ =
true;
453 void Foam::functionObjects::externalCoupled::performCoupling()
466 const auto action = waitForSlave();
478 lastTrigger_ = time_.timeIndex();
483 action != time_.stopAt()
484 && action != Time::stopAtControls::saUnknown
487 Info<<
type() <<
": slave requested action " 490 time_.stopAt(action);
508 initialisedCoupling_(false)
526 !initialisedCoupling_
527 || (time_.timeIndex() >= lastTrigger_ + calcFrequency_)
572 for (
const entry& dEntry : allRegionsDict)
574 if (!dEntry.isDict())
577 <<
"Regions must be specified in dictionary format" 581 const wordRe regionGroupName(dEntry.keyword());
591 regionGroupNames_.append(compositeName(
regionNames));
594 for (
const entry& dEntry : regionDict)
596 if (!dEntry.isDict())
599 <<
"Regions must be specified in dictionary format" 603 const wordRe groupName(dEntry.keyword());
606 const label nGroups = groupNames_.size();
610 auto fnd = regionToGroups_.find(regionGroupNames_.last());
613 fnd().append(nGroups);
617 regionToGroups_.insert
619 regionGroupNames_.last(),
623 groupNames_.append(groupName);
630 Info<<
type() <<
": Communicating with regions:" <<
endl;
631 for (
const word& compName : regionGroupNames_)
634 const labelList& groups = regionToGroups_[compName];
635 for (
const label groupi : groups)
637 const wordRe& groupName = groupNames_[groupi];
639 Info<<
indent <<
"patchGroup: " << groupName <<
"\t" 642 <<
indent <<
"Reading fields: " 643 << groupReadFields_[groupi]
645 <<
indent <<
"Writing fields: " 646 << groupWriteFields_[groupi]
659 for (
const word& compName : regionGroupNames_)
661 const labelList& groups = regionToGroups_[compName];
662 for (
const label groupi : groups)
664 const wordRe& groupName = groupNames_[groupi];
666 fileName dir(groupDir(commDirectory(), compName, groupName));
670 Log <<
type() <<
": creating communications directory " 684 forAll(regionGroupNames_, regioni)
686 const word& compName = regionGroupNames_[regioni];
696 const labelList& groups = regionToGroups_[compName];
698 for (
const label groupi : groups)
700 const wordRe& groupName = groupNames_[groupi];
701 const wordList& fieldNames = groupReadFields_[groupi];
703 for (
const word& fieldName : fieldNames)
707 readData<scalar>(
meshes, groupName, fieldName)
708 || readData<vector>(
meshes, groupName, fieldName)
709 || readData<sphericalTensor>(
meshes, groupName, fieldName)
710 || readData<symmTensor>(
meshes, groupName, fieldName)
711 || readData<tensor>(
meshes, groupName, fieldName)
717 <<
"Field " << fieldName <<
" in regions " << compName
718 <<
" was not found." <<
endl;
728 forAll(regionGroupNames_, regioni)
730 const word& compName = regionGroupNames_[regioni];
740 const labelList& groups = regionToGroups_[compName];
742 for (
const label groupi : groups)
744 const wordRe& groupName = groupNames_[groupi];
745 const wordList& fieldNames = groupWriteFields_[groupi];
747 for (
const word& fieldName : fieldNames)
751 writeData<scalar>(
meshes, groupName, fieldName)
752 || writeData<vector>(
meshes, groupName, fieldName)
753 || writeData<sphericalTensor>(
meshes, groupName, fieldName)
754 || writeData<symmTensor>(
meshes, groupName, fieldName)
755 || writeData<tensor>(
meshes, groupName, fieldName)
761 <<
"Field " << fieldName <<
" in regions " << compName
762 <<
" was not found." <<
endl;
777 Log <<
type() <<
": removing data files written by master" <<
nl;
779 for (
const word& compName : regionGroupNames_)
781 const labelList& groups = regionToGroups_[compName];
782 for (
const label groupi : groups)
784 const wordRe& groupName = groupNames_[groupi];
785 const wordList& fieldNames = groupReadFields_[groupi];
787 for (
const word& fieldName : fieldNames)
791 groupDir(commDirectory(), compName, groupName)
807 Log <<
type() <<
": removing data files written by slave" <<
nl;
809 for (
const word& compName : regionGroupNames_)
811 const labelList& groups = regionToGroups_[compName];
812 for (
const label groupi : groups)
814 const wordRe& groupName = groupNames_[groupi];
815 const wordList& fieldNames = groupReadFields_[groupi];
817 for (
const word& fieldName : fieldNames)
821 groupDir(commDirectory(), compName, groupName)
static word validate(const std::string &s, const bool prefix=false)
Construct validated word (no invalid characters).
virtual bool end()
Called when Time::run() determines that the time-loop exits.
const labelList patchIDs(pbm.indices(polyPatchNames, true))
virtual bool read(const dictionary &dict)
Read and set the function object if its data have changed.
defineTypeNameAndDebug(ObukhovLength, 0)
Encapsulates the logic for coordinating between OpenFOAM and an external application.
virtual bool write()
Write, currently a no-op.
Input/output streams with (internal or external) character storage.
A class for handling file names.
Ostream & indent(Ostream &os)
Indent stream.
virtual bool execute()
Called at each ++ or += of the time-loop.
bool slaveFirst() const
External application provides initial values.
errorManipArg< error, int > exit(error &err, const int errNo=1)
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
A list of keyword definitions, which are a keyword followed by a number of values (eg...
const vector L(dict.get< vector >("L"))
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
labelList sortedOrder(const UList< T > &input)
Return the (stable) sort order for the list.
const word & regionName() const
The mesh region name or word::null if polyMesh::defaultRegion.
static rangeType allProcs(const label communicator=worldComm)
Range of process indices for all processes.
Output to file stream as an OSstream, normally using std::ofstream for the actual output...
constexpr char nl
The newline '\n' character (0x0a)
Ostream & endl(Ostream &os)
Add newline and flush stream.
static void gatherList(const UList< commsStruct > &comms, UList< T > &values, const int tag, const label comm)
Gather data, but keep individual values separate. Uses the specified communication schedule...
static string patchKey
Name of patch key, e.g. '// Patch:' when looking for start of patch data.
Begin list [isseparator].
static void writeGeometry(const UPtrList< const fvMesh > &meshes, const fileName &commsDir, const wordRe &groupName)
Write geometry for the group as region/patch.
static const Enum< stopAtControls > stopAtControlNames
Names for stopAtControls.
Operations on lists of strings.
static int myProcNo(const label communicator=worldComm)
Rank of this process in the communicator (starting from masterNo()). Can be negative if the process i...
virtual void removeDataSlave() const
Remove data files written by slave (external code)
Class to control time during OpenFOAM simulations that is also the top-level objectRegistry.
Macros for easy insertion into run-time selection tables.
externalCoupled(const word &name, const Time &runTime, const dictionary &dict)
Construct given time and dictionary.
static void broadcast(Type &value, const label comm=UPstream::worldComm)
Broadcast content (contiguous or non-contiguous) to all communicator ranks. Does nothing in non-paral...
#define forAll(list, i)
Loop across all elements in list.
void reset(T *p=nullptr) noexcept
Delete managed object and set to new given pointer.
bool isDir(const fileName &name, const bool followLink=true)
Does the name exist as a DIRECTORY in the file system?
virtual bool end()
Called when Time::run() determines that the time-loop exits.
List< face > faceList
List of faces.
List< T > values(const HashTable< T, Key, Hash > &tbl, const bool doSort=false)
List of values from HashTable, optionally sorted.
Functions used by OpenFOAM that are specific to POSIX compliant operating systems and need to be repl...
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
static label nProcs(const label communicator=worldComm)
Number of ranks in parallel run (for given communicator). It is 1 for serial run. ...
vectorField pointField
pointField is a vectorField.
bool mkDir(const fileName &pathName, mode_t mode=0777)
Make a directory and return an error if it could not be created.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
labelList identity(const label len, label start=0)
Return an identity map of the given length with (map[i] == i), works like std::iota() but returning a...
void readFields(const typename GeoFieldType::Mesh &mesh, const IOobjectList &objects, const NameMatchPredicate &selectedFields, DynamicList< regIOobject *> &storedObjects)
Read the selected GeometricFields of the templated type and store on the objectRegistry.
A class for handling words, derived from Foam::string.
static labelList matching(const wordRe &select, const UList< StringType > &input, const bool invert=false)
Determine the list indices for all matches.
static constexpr int masterNo() noexcept
Relative rank for the master process - is always 0.
label size() const noexcept
The number of entries in the list.
static MinMax< T > ge(const T &minVal)
A semi-infinite range from minVal to the type max.
Foam::PtrList< Foam::fvMesh > meshes(regionNames.size())
static const word null
An empty word.
enum Time::stopAtControls useMaster(const bool wait=false) const
Create lock file to indicate that OpenFOAM is in charge.
virtual void removeDataMaster() const
Remove data files written by master (OpenFOAM)
A list of pointers to objects of type <T>, without allocation/deallocation management of the pointers...
errorManip< error > abort(error &err)
const T * set(const label i) const
Return const pointer to element (can be nullptr), or nullptr for out-of-range access (ie...
virtual void writeDataMaster() const
Write data files (all regions, all fields) from master (OpenFOAM)
A wordRe is a Foam::word, but can contain a regular expression for matching words or strings...
void writeFields(const fvMesh &mesh, const wordHashSet &selectedFields, const bool writeFaceFields)
bool readDict(const dictionary &dict)
Read communication settings from dictionary.
void writeList(vtk::formatter &fmt, const UList< uint8_t > &values)
Write a list of uint8_t values.
Reads fields from the time directories and adds them to the mesh database for further post-processing...
OBJstream os(runTime.globalPath()/outputName)
addToRunTimeSelectionTable(functionObject, ObukhovLength, dictionary)
Ostream & decrIndent(Ostream &os)
Decrement the indent level.
virtual void readDataMaster()
Read data files (all regions, all fields) on master (OpenFOAM)
bool isFile(const fileName &name, const bool checkGzip=true, const bool followLink=true)
Does the name exist as a FILE in the file system?
List< word > wordList
List of word.
void inplaceRenumber(const labelUList &oldToNew, IntListType &input)
Inplace renumber the values within a list.
static word compositeName(const wordList &)
Create single name by appending words (in sorted order), separated by '_'.
#define WarningInFunction
Report a warning using Foam::Warning.
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
virtual bool read(const dictionary &dict)
Read and set the function object if its data have changed.
Mesh data needed to do the Finite Volume discretisation.
static bool master(const label communicator=worldComm)
True if process corresponds to the master rank in the communicator.
messageStream Info
Information stream (stdout output on master, null elsewhere)
Pointer management similar to std::unique_ptr, with some additional methods and type checking...
List< label > labelList
A List of labels.
Ostream & incrIndent(Ostream &os)
Increment the indent level.
A class for handling character strings derived from std::string.
Virtual base class for function objects with a reference to Time.
A keyword and a list of tokens is an 'entry'.
A class representing the concept of 1 (one) that can be used to avoid manipulating objects known to b...
bool rm(const fileName &file)
Remove a file (or its gz equivalent), returning true if successful.
IOerror FatalIOError
Error stream (stdout output on all processes), with additional 'FOAM FATAL IO ERROR' header text and ...