101 #include "readFields.H" 115 const PtrList<fvMesh>& procMeshList,
118 PtrList<labelIOList>& procAddressingList
121 const fvMesh& procMesh = procMeshList[proci];
123 if (!procAddressingList.set(proci))
125 procAddressingList.set
133 procMesh.facesInstance(),
143 return procAddressingList[proci];
147 void decomposeUniform
149 const bool copyUniform,
150 const domainDecomposition& mesh,
151 const Time& processorDb,
155 const Time& runTime = mesh.
time();
158 const fileName uniformDir(regionDir/
"uniform");
162 Info<<
"Detected additional non-decomposed files in " 163 << runTime.timePath()/uniformDir
166 const fileName timePath =
169 if (copyUniform || mesh.distributed())
175 runTime.timePath()/uniformDir,
183 string parentPath = string(
"..")/
"..";
187 parentPath = parentPath/
"..";
190 fileName currentDir(
cwd());
197 parentPath/runTime.timeName()/uniformDir,
211 int main(
int argc,
char *argv[])
215 "decompose a mesh and fields of a case for parallel execution" 224 "write cell distribution as a labelList - for use with 'manual' " 225 "decomposition method or as a volScalarField for post-processing." 230 "Copy \a 0 directory to processor* rather than decompose the fields" 235 "copy any uniform/ directories too" 240 "use existing geometry decomposition and convert fields only" 245 "skip decomposing cellSets, faceSets, pointSets" 250 "remove existing processor*/ subdirs before decomposing the geometry" 255 "only decompose geometry if the number of domains has changed" 261 "dictionary file name",
262 "specify alternative decomposition dictionary" 279 const word
dictName(
"decomposeParDict");
288 dictPath =
args[
"dict"];
298 <<
"Specified -dict " <<
args[
"dict"] <<
" but neither " 318 <<
"Cannot force the decomposition of a single region" 322 Info<<
"Removing " << nProcs
323 <<
" existing processor directories" <<
endl;
331 fileName::Type::DIRECTORY
336 const fileName& d = dirs[diri];
339 if (d.find(
"processors") == 0)
348 if (d.find(
"processor") == 0)
351 fileName num(d.substr(9));
363 else if (nProcs && !region && !decomposeFieldsOnly)
366 <<
"Case is already decomposed with " << nProcs
367 <<
" domains, use the -force option or manually" <<
nl 368 <<
"remove processor directories before decomposing. e.g.," 370 <<
" rm -rf " << runTime.path().c_str() <<
"/processor*" 377 forAll(regionNames, regioni)
379 const word& regionName = regionNames[regioni];
382 Info<<
"\n\nDecomposing mesh " << regionName <<
nl <<
endl;
394 runTime.time().system(),
405 IOobject::MUST_READ_IF_MODIFIED,
412 const label nDomains =
416 const_cast<fileOperation&
>(
fileHandler()).setNProcs(nDomains);
418 if (decomposeFieldsOnly)
421 if (nProcs != nDomains)
424 <<
"Specified -fields, but the case was decomposed with " 425 << nProcs <<
" domains" 427 <<
"instead of " << nDomains
428 <<
" domains as specified in " <<
dictName 435 if (ifRequiredDecomposition && nProcs == nDomains)
438 decomposeFieldsOnly =
true;
439 Info<<
"Using existing processor directories" <<
nl;
444 domainDecomposition
mesh 459 if (!decomposeFieldsOnly)
463 mesh.writeDecomposition(decomposeSets);
467 const labelList& procIds = mesh.cellToProc();
476 mesh.facesInstance(),
484 cellDecomposition.write();
486 Info<<
nl <<
"Wrote decomposition to " 487 << cellDecomposition.objectPath()
488 <<
" for use in manual decomposition." <<
endl;
507 cellDist[celli] = procIds[celli];
512 Info<<
nl <<
"Wrote decomposition as volScalarField to " 513 << cellDist.name() <<
" for use in postprocessing." 524 fileName prevTimePath;
525 for (
label proci = 0; proci < mesh.nProcs(); proci++)
533 processorDb.setTime(runTime);
538 const fileName timePath
545 processorDb.timeName(),
552 if (timePath != prevTimePath)
554 Info<<
"Processor " << proci
555 <<
": copying " << runTime.timePath() <<
nl 556 <<
" to " << timePath <<
endl;
559 prevTimePath = timePath;
570 PtrList<Time> processorDbList(mesh.nProcs());
571 PtrList<fvMesh> procMeshList(mesh.nProcs());
572 PtrList<labelIOList> faceProcAddressingList(mesh.nProcs());
573 PtrList<labelIOList> cellProcAddressingList(mesh.nProcs());
574 PtrList<labelIOList> boundaryProcAddressingList(mesh.nProcs());
575 PtrList<fvFieldDecomposer> fieldDecomposerList(mesh.nProcs());
576 PtrList<dimFieldDecomposer> dimFieldDecomposerList(mesh.nProcs());
577 PtrList<labelIOList> pointProcAddressingList(mesh.nProcs());
578 PtrList<pointFieldDecomposer> pointFieldDecomposerList
587 runTime.setTime(times[timeI], timeI);
589 Info<<
"Time = " << runTime.timeName() <<
endl;
592 IOobjectList objects(mesh, runTime.timeName());
597 PtrList<volScalarField> volScalarFields;
599 PtrList<volVectorField> volVectorFields;
601 PtrList<volSphericalTensorField> volSphericalTensorFields;
602 readFields(mesh, objects, volSphericalTensorFields);
603 PtrList<volSymmTensorField> volSymmTensorFields;
604 readFields(mesh, objects, volSymmTensorFields);
605 PtrList<volTensorField> volTensorFields;
611 PtrList<DimensionedField<scalar, volMesh>> dimScalarFields;
613 PtrList<DimensionedField<vector, volMesh>> dimVectorFields;
615 PtrList<DimensionedField<sphericalTensor, volMesh>>
616 dimSphericalTensorFields;
617 readFields(mesh, objects, dimSphericalTensorFields);
618 PtrList<DimensionedField<symmTensor, volMesh>>
620 readFields(mesh, objects, dimSymmTensorFields);
621 PtrList<DimensionedField<tensor, volMesh>> dimTensorFields;
627 PtrList<surfaceScalarField> surfaceScalarFields;
628 readFields(mesh, objects, surfaceScalarFields);
629 PtrList<surfaceVectorField> surfaceVectorFields;
630 readFields(mesh, objects, surfaceVectorFields);
631 PtrList<surfaceSphericalTensorField>
632 surfaceSphericalTensorFields;
633 readFields(mesh, objects, surfaceSphericalTensorFields);
634 PtrList<surfaceSymmTensorField> surfaceSymmTensorFields;
635 readFields(mesh, objects, surfaceSymmTensorFields);
636 PtrList<surfaceTensorField> surfaceTensorFields;
637 readFields(mesh, objects, surfaceTensorFields);
644 PtrList<pointScalarField> pointScalarFields;
645 readFields(pMesh, objects, pointScalarFields);
646 PtrList<pointVectorField> pointVectorFields;
647 readFields(pMesh, objects, pointVectorFields);
648 PtrList<pointSphericalTensorField> pointSphericalTensorFields;
649 readFields(pMesh, objects, pointSphericalTensorFields);
650 PtrList<pointSymmTensorField> pointSymmTensorFields;
651 readFields(pMesh, objects, pointSymmTensorFields);
652 PtrList<pointTensorField> pointTensorFields;
653 readFields(pMesh, objects, pointTensorFields);
669 PtrList<Cloud<indexedParticle>> lagrangianPositions
674 PtrList<List<SLList<indexedParticle*>*>> cellParticles
679 PtrList<PtrList<labelIOField>> lagrangianLabelFields
683 PtrList<PtrList<labelFieldCompactIOField>>
684 lagrangianLabelFieldFields
688 PtrList<PtrList<scalarIOField>> lagrangianScalarFields
692 PtrList<PtrList<scalarFieldCompactIOField>>
693 lagrangianScalarFieldFields
697 PtrList<PtrList<vectorIOField>> lagrangianVectorFields
701 PtrList<PtrList<vectorFieldCompactIOField>>
702 lagrangianVectorFieldFields
706 PtrList<PtrList<sphericalTensorIOField>>
707 lagrangianSphericalTensorFields
711 PtrList<PtrList<sphericalTensorFieldCompactIOField>>
712 lagrangianSphericalTensorFieldFields(cloudDirs.size());
713 PtrList<PtrList<symmTensorIOField>> lagrangianSymmTensorFields
717 PtrList<PtrList<symmTensorFieldCompactIOField>>
718 lagrangianSymmTensorFieldFields
722 PtrList<PtrList<tensorIOField>> lagrangianTensorFields
726 PtrList<PtrList<tensorFieldCompactIOField>>
727 lagrangianTensorFieldFields
736 IOobjectList sprayObjs
746 IOobject* positionsPtr = sprayObjs.lookup
756 Info<<
"Identified lagrangian data set: " 757 << cloudDirs[i] <<
endl;
759 lagrangianPositions.set
762 new Cloud<indexedParticle>
777 new List<SLList<indexedParticle*>*>
780 static_cast<SLList<indexedParticle*>*
>(
nullptr)
788 Cloud<indexedParticle>,
789 lagrangianPositions[cloudI],
793 iter().index() = i++;
795 label celli = iter().cell();
798 if (celli < 0 || celli >= mesh.nCells())
801 <<
"Illegal cell number " << celli
802 <<
" for particle with index " 805 << iter().position() <<
nl 806 <<
"Cell number should be between 0 and " 807 << mesh.nCells()-1 <<
nl 808 <<
"On this mesh the particle should" 810 << mesh.findCell(iter().position())
814 if (!cellParticles[cloudI][celli])
816 cellParticles[cloudI][celli] =
817 new SLList<indexedParticle*>();
820 cellParticles[cloudI][celli]->append(&iter());
826 IOobjectList lagrangianObjects
840 lagrangianLabelFields
847 lagrangianLabelFieldFields
854 lagrangianScalarFields
861 lagrangianScalarFieldFields
868 lagrangianVectorFields
875 lagrangianVectorFieldFields
882 lagrangianSphericalTensorFields
889 lagrangianSphericalTensorFieldFields
896 lagrangianSymmTensorFields
903 lagrangianSymmTensorFieldFields
910 lagrangianTensorFields
917 lagrangianTensorFieldFields
924 lagrangianPositions.setSize(cloudI);
925 cellParticles.setSize(cloudI);
926 lagrangianLabelFields.setSize(cloudI);
927 lagrangianLabelFieldFields.setSize(cloudI);
928 lagrangianScalarFields.setSize(cloudI);
929 lagrangianScalarFieldFields.setSize(cloudI);
930 lagrangianVectorFields.setSize(cloudI);
931 lagrangianVectorFieldFields.setSize(cloudI);
932 lagrangianSphericalTensorFields.setSize(cloudI);
933 lagrangianSphericalTensorFieldFields.setSize(cloudI);
934 lagrangianSymmTensorFields.setSize(cloudI);
935 lagrangianSymmTensorFieldFields.setSize(cloudI);
936 lagrangianTensorFields.setSize(cloudI);
937 lagrangianTensorFieldFields.setSize(cloudI);
942 for (
label proci = 0; proci < mesh.nProcs(); proci++)
944 Info<<
"Processor " << proci <<
": field transfer" <<
endl;
948 if (!processorDbList.set(proci))
958 /fileName(word(
"processor") +
name(proci))
962 Time& processorDb = processorDbList[proci];
965 processorDb.setTime(runTime);
968 if (!procMeshList.set(proci))
978 processorDb.timeName(),
984 const fvMesh& procMesh = procMeshList[proci];
986 const labelIOList& faceProcAddressing = procAddressing
990 "faceProcAddressing",
991 faceProcAddressingList
994 const labelIOList& cellProcAddressing = procAddressing
998 "cellProcAddressing",
999 cellProcAddressingList
1002 const labelIOList& boundaryProcAddressing = procAddressing
1006 "boundaryProcAddressing",
1007 boundaryProcAddressingList
1013 if (!fieldDecomposerList.set(proci))
1015 fieldDecomposerList.set
1018 new fvFieldDecomposer
1024 boundaryProcAddressing
1028 const fvFieldDecomposer& fieldDecomposer =
1029 fieldDecomposerList[proci];
1031 fieldDecomposer.decomposeFields(volScalarFields);
1032 fieldDecomposer.decomposeFields(volVectorFields);
1033 fieldDecomposer.decomposeFields
1035 volSphericalTensorFields
1037 fieldDecomposer.decomposeFields(volSymmTensorFields);
1038 fieldDecomposer.decomposeFields(volTensorFields);
1040 fieldDecomposer.decomposeFields(surfaceScalarFields);
1041 fieldDecomposer.decomposeFields(surfaceVectorFields);
1042 fieldDecomposer.decomposeFields
1044 surfaceSphericalTensorFields
1046 fieldDecomposer.decomposeFields
1048 surfaceSymmTensorFields
1050 fieldDecomposer.decomposeFields(surfaceTensorFields);
1052 if (times.size() == 1)
1055 fieldDecomposerList.set(proci,
nullptr);
1061 if (!dimFieldDecomposerList.set(proci))
1063 dimFieldDecomposerList.set
1066 new dimFieldDecomposer
1075 const dimFieldDecomposer& dimDecomposer =
1076 dimFieldDecomposerList[proci];
1078 dimDecomposer.decomposeFields(dimScalarFields);
1079 dimDecomposer.decomposeFields(dimVectorFields);
1080 dimDecomposer.decomposeFields(dimSphericalTensorFields);
1081 dimDecomposer.decomposeFields(dimSymmTensorFields);
1082 dimDecomposer.decomposeFields(dimTensorFields);
1084 if (times.size() == 1)
1086 dimFieldDecomposerList.set(proci,
nullptr);
1094 pointScalarFields.size()
1095 || pointVectorFields.size()
1096 || pointSphericalTensorFields.size()
1097 || pointSymmTensorFields.size()
1098 || pointTensorFields.size()
1101 const labelIOList& pointProcAddressing = procAddressing
1105 "pointProcAddressing",
1106 pointProcAddressingList
1111 if (!pointFieldDecomposerList.set(proci))
1113 pointFieldDecomposerList.set
1116 new pointFieldDecomposer
1120 pointProcAddressing,
1121 boundaryProcAddressing
1125 const pointFieldDecomposer& pointDecomposer =
1126 pointFieldDecomposerList[proci];
1128 pointDecomposer.decomposeFields(pointScalarFields);
1129 pointDecomposer.decomposeFields(pointVectorFields);
1130 pointDecomposer.decomposeFields
1132 pointSphericalTensorFields
1134 pointDecomposer.decomposeFields(pointSymmTensorFields);
1135 pointDecomposer.decomposeFields(pointTensorFields);
1138 if (times.size() == 1)
1140 pointProcAddressingList.set(proci,
nullptr);
1141 pointFieldDecomposerList.set(proci,
nullptr);
1147 forAll(lagrangianPositions, cloudI)
1149 if (lagrangianPositions[cloudI].size())
1151 lagrangianFieldDecomposer fieldDecomposer
1158 lagrangianPositions[cloudI],
1159 cellParticles[cloudI]
1164 fieldDecomposer.decomposeFields
1167 lagrangianLabelFields[cloudI]
1169 fieldDecomposer.decomposeFieldFields
1172 lagrangianLabelFieldFields[cloudI]
1174 fieldDecomposer.decomposeFields
1177 lagrangianScalarFields[cloudI]
1179 fieldDecomposer.decomposeFieldFields
1182 lagrangianScalarFieldFields[cloudI]
1184 fieldDecomposer.decomposeFields
1187 lagrangianVectorFields[cloudI]
1189 fieldDecomposer.decomposeFieldFields
1192 lagrangianVectorFieldFields[cloudI]
1194 fieldDecomposer.decomposeFields
1197 lagrangianSphericalTensorFields[cloudI]
1199 fieldDecomposer.decomposeFieldFields
1202 lagrangianSphericalTensorFieldFields[cloudI]
1204 fieldDecomposer.decomposeFields
1207 lagrangianSymmTensorFields[cloudI]
1209 fieldDecomposer.decomposeFieldFields
1212 lagrangianSymmTensorFieldFields[cloudI]
1214 fieldDecomposer.decomposeFields
1217 lagrangianTensorFields[cloudI]
1219 fieldDecomposer.decomposeFieldFields
1222 lagrangianTensorFieldFields[cloudI]
1230 decomposeUniform(copyUniform, mesh, processorDb, regionDir);
1234 if (regionNames.size() > 1 && regioni == 0)
1236 decomposeUniform(copyUniform, mesh, processorDb);
1242 if (times.size() == 1)
1244 boundaryProcAddressingList.set(proci,
nullptr);
1245 cellProcAddressingList.set(proci,
nullptr);
1246 faceProcAddressingList.set(proci,
nullptr);
1247 procMeshList.set(proci,
nullptr);
1248 processorDbList.set(proci,
nullptr);
List< instant > instantList
List of instants.
#define forAll(list, i)
Loop across all elements in list.
virtual bool rmDir(const fileName &) const =0
Remove a directory and its contents.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
errorManipArg< error, int > exit(error &err, const int errNo=1)
void readFields(const typename GeoFieldType::Mesh &mesh, const IOobjectList &objects, const HashSet< word > &selectedFields, LIFOStack< regIOobject *> &storedObjects)
Read the selected GeometricFields of the specified type.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
const fileName & rootPath() const
Return root path.
#define forAllIter(Container, container, iter)
Iterate across all elements in the container object of type.
static const fileName null
An empty fileName.
bool exists(IOobject &io) const
Does ioobject exist. Is either a directory (empty name()) or.
Ostream & endl(Ostream &os)
Add newline and flush stream.
bool optionFound(const word &opt) const
Return true if the named option is found.
#define forAllReverse(list, i)
Reverse loop across all elements in list.
bool chDir(const fileName &dir)
Change the current directory to the one given and return true,.
static void noParallel()
Remove the parallel options.
static const pointMesh & New(const polyMesh &mesh)
GeometricField< scalar, fvPatchField, volMesh > volScalarField
static void readFieldFields(const label cloudI, const IOobjectList &lagrangianObjects, PtrList< PtrList< CompactIOField< Field< Type >, Type >> > &lagrangianFields)
Functions used by OpenFOAM that are specific to POSIX compliant operating systems and need to be repl...
const word & regionDir(const word ®ionName)
bool read(const char *, int32_t &)
stressControl lookup("compactNormalStress") >> compactNormalStress
virtual bool ln(const fileName &src, const fileName &dst) const =0
Create a softlink. dst should not exist. Returns true if.
bool isDir(const fileName &, const bool followLink=true)
Does the name exist as a DIRECTORY in the file system?
static void addOption(const word &opt, const string ¶m="", const string &usage="")
Add to an option to validOptions with usage information.
static const word null
An empty word.
List< label > labelList
A List of labels.
const word dictName("particleTrackDict")
static instantList selectIfPresent(Time &runTime, const argList &args)
If any time option provided return the set of times (as select0)
virtual fileName filePath(const bool checkGlobal, const IOobject &, const word &typeName) const =0
Search for an object. checkGlobal : also check undecomposed case.
const fileOperation & fileHandler()
Get current file handler.
static word controlDictName
The default control dictionary name (normally "controlDict")
label readLabel(Istream &is)
virtual bool cp(const fileName &src, const fileName &dst, const bool followLink=true) const =0
Copy, recursively if necessary, the source to the destination.
const fileName & caseName() const
Return case name (parallel run) or global case (serial run)
bool isFile(const fileName &, const bool checkGzip=true, const bool followLink=true)
Does the name exist as a FILE in the file system?
static const word prefix
The prefix to local: lagrangian.
word name(const complex &)
Return a string representation of a complex.
IOobject dictIO(dictName, runTime.constant(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE)
virtual void flush() const
Forcibly wait until all output done. Flush any cached data.
List< word > wordList
A List of words.
virtual label nProcs(const fileName &dir, const fileName &local="") const
Get number of processor directories/results. Used for e.g.
const dimensionSet dimless(0, 0, 0, 0, 0, 0, 0)
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
const Time & time() const
Return time.
fileName cwd()
Return current working directory path name.
fileNameList readDir(const fileName &, const fileName::Type=fileName::FILE, const bool filtergz=true, const bool followLink=true)
Read a directory and return the entries as a string list.
static void addBoolOption(const word &opt, const string &usage="")
Add to a bool option to validOptions with usage information.
static void addNote(const string &)
Add extra notes for the usage information.
static void readFields(const label cloudI, const IOobjectList &lagrangianObjects, PtrList< PtrList< IOField< Type >>> &lagrangianFields)
Foam::argList args(argc, argv)
List< fileName > fileNameList
A List of fileNames.
fileName objectPath() const
Return complete path + object name.
wordList selectRegionNames(const argList &args, const Time &runTime)
bool exists(const fileName &, const bool checkGzip=true, const bool followLink=true)
Does the name exist (as DIRECTORY or FILE) in the file system?
static void addOptions(const bool constant=true, const bool withZero=false)
Add the options handled by timeSelector to argList::validOptions.
IOList< label > labelIOList
Label container classes.