102 #include "readFields.H" 116 const PtrList<fvMesh>& procMeshList,
119 PtrList<labelIOList>& procAddressingList
122 const fvMesh& procMesh = procMeshList[proci];
124 if (!procAddressingList.set(proci))
126 procAddressingList.set
134 procMesh.facesInstance(),
144 return procAddressingList[proci];
148 void decomposeUniform
150 const bool copyUniform,
151 const domainDecomposition& mesh,
152 const Time& processorDb,
156 const Time& runTime = mesh.
time();
159 const fileName uniformDir(regionDir/
"uniform");
163 Info<<
"Detected additional non-decomposed files in " 164 << runTime.timePath()/uniformDir
167 const fileName timePath =
170 if (copyUniform || mesh.distributed())
176 runTime.timePath()/uniformDir,
184 string parentPath = string(
"..")/
"..";
188 parentPath = parentPath/
"..";
191 fileName currentDir(
cwd());
198 parentPath/runTime.timeName()/uniformDir,
212 int main(
int argc,
char *argv[])
216 "decompose a mesh and fields of a case for parallel execution" 226 "write cell distribution as a labelList - for use with 'manual' " 227 "decomposition method or as a volScalarField for post-processing." 232 "Copy \a 0 directory to processor* rather than decompose the fields" 237 "copy any uniform/ directories too" 242 "use existing geometry decomposition and convert fields only" 247 "opposite of -fields; only decompose geometry" 252 "skip decomposing cellSets, faceSets, pointSets" 257 "remove existing processor*/ subdirs before decomposing the geometry" 262 "only decompose geometry if the number of domains has changed" 280 const word
dictName(
"decomposeParDict");
283 if (decomposeGeomOnly)
285 Info<<
"Skipping decomposing fields" 288 if (decomposeFieldsOnly || copyZero)
291 <<
"Cannot combine geometry-only decomposition (-noFields)" 292 <<
" with field decomposition (-noFields or -copyZero)" 315 <<
"Cannot force the decomposition of a single region" 319 Info<<
"Removing " << nProcs
320 <<
" existing processor directories" <<
endl;
333 const fileName& d = dirs[diri];
336 if (d.find(
"processors") == 0)
345 if (d.find(
"processor") == 0)
348 fileName num(d.substr(9));
360 else if (nProcs && !region && !decomposeFieldsOnly)
363 <<
"Case is already decomposed with " << nProcs
364 <<
" domains, use the -force option or manually" <<
nl 365 <<
"remove processor directories before decomposing. e.g.," 367 <<
" rm -rf " << runTime.path().c_str() <<
"/processor*" 374 forAll(regionNames, regioni)
376 const word& regionName = regionNames[regioni];
379 Info<<
"\n\nDecomposing mesh " << regionName <<
nl <<
endl;
385 const IOobject dictIO
392 const label nDomains =
393 IOdictionary(dictIO).lookup<
label>(
"numberOfSubdomains");
396 const_cast<fileOperation&
>(
fileHandler()).setNProcs(nDomains);
398 if (decomposeFieldsOnly)
401 if (nProcs != nDomains)
404 <<
"Specified -fields, but the case was decomposed with " 405 << nProcs <<
" domains" 407 <<
"instead of " << nDomains
408 <<
" domains as specified in " <<
dictName 415 if (ifRequiredDecomposition && nProcs == nDomains)
418 decomposeFieldsOnly =
true;
419 Info<<
"Using existing processor directories" <<
nl;
424 domainDecomposition
mesh 439 if (!decomposeFieldsOnly)
441 mesh.decomposeMesh(dictIO.objectPath());
443 mesh.writeDecomposition(decomposeSets);
447 const labelList& procIds = mesh.cellToProc();
456 mesh.facesInstance(),
464 cellDecomposition.write();
466 Info<<
nl <<
"Wrote decomposition to " 467 << cellDecomposition.localObjectPath()
468 <<
" for use in manual decomposition." <<
endl;
487 cellDist[celli] = procIds[celli];
492 Info<<
nl <<
"Wrote decomposition as volScalarField to " 493 << cellDist.name() <<
" for use in postprocessing." 504 fileName prevTimePath;
505 for (
label proci = 0; proci < mesh.nProcs(); proci++)
513 processorDb.setTime(runTime);
518 const fileName timePath
525 processorDb.timeName(),
532 if (timePath != prevTimePath)
534 Info<<
"Processor " << proci
535 <<
": copying " << runTime.timePath() <<
nl 536 <<
" to " << timePath <<
endl;
539 prevTimePath = timePath;
544 else if (!decomposeGeomOnly)
550 PtrList<Time> processorDbList(mesh.nProcs());
551 PtrList<fvMesh> procMeshList(mesh.nProcs());
552 PtrList<labelIOList> faceProcAddressingList(mesh.nProcs());
553 PtrList<labelIOList> cellProcAddressingList(mesh.nProcs());
554 PtrList<labelIOList> boundaryProcAddressingList(mesh.nProcs());
555 PtrList<fvFieldDecomposer> fieldDecomposerList(mesh.nProcs());
556 PtrList<dimFieldDecomposer> dimFieldDecomposerList(mesh.nProcs());
557 PtrList<labelIOList> pointProcAddressingList(mesh.nProcs());
558 PtrList<pointFieldDecomposer> pointFieldDecomposerList
567 runTime.setTime(times[timeI], timeI);
569 Info<<
"Time = " << runTime.timeName() <<
endl;
572 IOobjectList
objects(mesh, runTime.timeName());
577 PtrList<volScalarField> volScalarFields;
579 PtrList<volVectorField> volVectorFields;
581 PtrList<volSphericalTensorField> volSphericalTensorFields;
583 PtrList<volSymmTensorField> volSymmTensorFields;
585 PtrList<volTensorField> volTensorFields;
591 PtrList<DimensionedField<scalar, volMesh>> dimScalarFields;
593 PtrList<DimensionedField<vector, volMesh>> dimVectorFields;
595 PtrList<DimensionedField<sphericalTensor, volMesh>>
596 dimSphericalTensorFields;
598 PtrList<DimensionedField<symmTensor, volMesh>>
601 PtrList<DimensionedField<tensor, volMesh>> dimTensorFields;
607 PtrList<surfaceScalarField> surfaceScalarFields;
609 PtrList<surfaceVectorField> surfaceVectorFields;
611 PtrList<surfaceSphericalTensorField>
612 surfaceSphericalTensorFields;
614 PtrList<surfaceSymmTensorField> surfaceSymmTensorFields;
616 PtrList<surfaceTensorField> surfaceTensorFields;
624 PtrList<pointScalarField> pointScalarFields;
626 PtrList<pointVectorField> pointVectorFields;
628 PtrList<pointSphericalTensorField> pointSphericalTensorFields;
630 PtrList<pointSymmTensorField> pointSymmTensorFields;
632 PtrList<pointTensorField> pointTensorFields;
649 PtrList<Cloud<indexedParticle>> lagrangianPositions
654 PtrList<List<SLList<indexedParticle*>*>> cellParticles
659 PtrList<PtrList<labelIOField>> lagrangianLabelFields
663 PtrList<PtrList<labelFieldCompactIOField>>
664 lagrangianLabelFieldFields
668 PtrList<PtrList<scalarIOField>> lagrangianScalarFields
672 PtrList<PtrList<scalarFieldCompactIOField>>
673 lagrangianScalarFieldFields
677 PtrList<PtrList<vectorIOField>> lagrangianVectorFields
681 PtrList<PtrList<vectorFieldCompactIOField>>
682 lagrangianVectorFieldFields
686 PtrList<PtrList<sphericalTensorIOField>>
687 lagrangianSphericalTensorFields
691 PtrList<PtrList<sphericalTensorFieldCompactIOField>>
692 lagrangianSphericalTensorFieldFields(cloudDirs.size());
693 PtrList<PtrList<symmTensorIOField>> lagrangianSymmTensorFields
697 PtrList<PtrList<symmTensorFieldCompactIOField>>
698 lagrangianSymmTensorFieldFields
702 PtrList<PtrList<tensorIOField>> lagrangianTensorFields
706 PtrList<PtrList<tensorFieldCompactIOField>>
707 lagrangianTensorFieldFields
716 IOobjectList sprayObjs
726 IOobject* positionsPtr = sprayObjs.lookup
736 Info<<
"Identified lagrangian data set: " 737 << cloudDirs[i] <<
endl;
739 lagrangianPositions.set
742 new Cloud<indexedParticle>
757 new List<SLList<indexedParticle*>*>
760 static_cast<SLList<indexedParticle*>*
>(
nullptr)
768 Cloud<indexedParticle>,
769 lagrangianPositions[cloudI],
773 iter().index() = i++;
775 label celli = iter().cell();
778 if (celli < 0 || celli >= mesh.nCells())
781 <<
"Illegal cell number " << celli
782 <<
" for particle with index " 785 << iter().position() <<
nl 786 <<
"Cell number should be between 0 and " 787 << mesh.nCells()-1 <<
nl 788 <<
"On this mesh the particle should" 790 << mesh.findCell(iter().position())
794 if (!cellParticles[cloudI][celli])
796 cellParticles[cloudI][celli] =
797 new SLList<indexedParticle*>();
800 cellParticles[cloudI][celli]->append(&iter());
806 IOobjectList lagrangianObjects
820 lagrangianLabelFields
827 lagrangianLabelFieldFields
834 lagrangianScalarFields
841 lagrangianScalarFieldFields
848 lagrangianVectorFields
855 lagrangianVectorFieldFields
862 lagrangianSphericalTensorFields
869 lagrangianSphericalTensorFieldFields
876 lagrangianSymmTensorFields
883 lagrangianSymmTensorFieldFields
890 lagrangianTensorFields
897 lagrangianTensorFieldFields
904 lagrangianPositions.setSize(cloudI);
905 cellParticles.setSize(cloudI);
906 lagrangianLabelFields.setSize(cloudI);
907 lagrangianLabelFieldFields.setSize(cloudI);
908 lagrangianScalarFields.setSize(cloudI);
909 lagrangianScalarFieldFields.setSize(cloudI);
910 lagrangianVectorFields.setSize(cloudI);
911 lagrangianVectorFieldFields.setSize(cloudI);
912 lagrangianSphericalTensorFields.setSize(cloudI);
913 lagrangianSphericalTensorFieldFields.setSize(cloudI);
914 lagrangianSymmTensorFields.setSize(cloudI);
915 lagrangianSymmTensorFieldFields.setSize(cloudI);
916 lagrangianTensorFields.setSize(cloudI);
917 lagrangianTensorFieldFields.setSize(cloudI);
922 for (
label proci = 0; proci < mesh.nProcs(); proci++)
924 Info<<
"Processor " << proci <<
": field transfer" <<
endl;
928 if (!processorDbList.set(proci))
938 /fileName(word(
"processor") +
name(proci))
942 Time& processorDb = processorDbList[proci];
945 processorDb.setTime(runTime);
948 if (!procMeshList.set(proci))
958 processorDb.timeName(),
964 const fvMesh& procMesh = procMeshList[proci];
966 const labelIOList& faceProcAddressing = procAddressing
970 "faceProcAddressing",
971 faceProcAddressingList
974 const labelIOList& cellProcAddressing = procAddressing
978 "cellProcAddressing",
979 cellProcAddressingList
982 const labelIOList& boundaryProcAddressing = procAddressing
986 "boundaryProcAddressing",
987 boundaryProcAddressingList
993 if (!fieldDecomposerList.set(proci))
995 fieldDecomposerList.set
998 new fvFieldDecomposer
1004 boundaryProcAddressing
1008 const fvFieldDecomposer& fieldDecomposer =
1009 fieldDecomposerList[proci];
1011 fieldDecomposer.decomposeFields(volScalarFields);
1012 fieldDecomposer.decomposeFields(volVectorFields);
1013 fieldDecomposer.decomposeFields
1015 volSphericalTensorFields
1017 fieldDecomposer.decomposeFields(volSymmTensorFields);
1018 fieldDecomposer.decomposeFields(volTensorFields);
1020 fieldDecomposer.decomposeFields(surfaceScalarFields);
1021 fieldDecomposer.decomposeFields(surfaceVectorFields);
1022 fieldDecomposer.decomposeFields
1024 surfaceSphericalTensorFields
1026 fieldDecomposer.decomposeFields
1028 surfaceSymmTensorFields
1030 fieldDecomposer.decomposeFields(surfaceTensorFields);
1032 if (times.size() == 1)
1035 fieldDecomposerList.set(proci,
nullptr);
1041 if (!dimFieldDecomposerList.set(proci))
1043 dimFieldDecomposerList.set
1046 new dimFieldDecomposer
1055 const dimFieldDecomposer& dimDecomposer =
1056 dimFieldDecomposerList[proci];
1058 dimDecomposer.decomposeFields(dimScalarFields);
1059 dimDecomposer.decomposeFields(dimVectorFields);
1060 dimDecomposer.decomposeFields(dimSphericalTensorFields);
1061 dimDecomposer.decomposeFields(dimSymmTensorFields);
1062 dimDecomposer.decomposeFields(dimTensorFields);
1064 if (times.size() == 1)
1066 dimFieldDecomposerList.set(proci,
nullptr);
1074 pointScalarFields.size()
1075 || pointVectorFields.size()
1076 || pointSphericalTensorFields.size()
1077 || pointSymmTensorFields.size()
1078 || pointTensorFields.size()
1081 const labelIOList& pointProcAddressing = procAddressing
1085 "pointProcAddressing",
1086 pointProcAddressingList
1091 if (!pointFieldDecomposerList.set(proci))
1093 pointFieldDecomposerList.set
1096 new pointFieldDecomposer
1100 pointProcAddressing,
1101 boundaryProcAddressing
1105 const pointFieldDecomposer& pointDecomposer =
1106 pointFieldDecomposerList[proci];
1108 pointDecomposer.decomposeFields(pointScalarFields);
1109 pointDecomposer.decomposeFields(pointVectorFields);
1110 pointDecomposer.decomposeFields
1112 pointSphericalTensorFields
1114 pointDecomposer.decomposeFields(pointSymmTensorFields);
1115 pointDecomposer.decomposeFields(pointTensorFields);
1118 if (times.size() == 1)
1120 pointProcAddressingList.set(proci,
nullptr);
1121 pointFieldDecomposerList.set(proci,
nullptr);
1127 forAll(lagrangianPositions, cloudI)
1129 if (lagrangianPositions[cloudI].size())
1131 lagrangianFieldDecomposer fieldDecomposer
1138 lagrangianPositions[cloudI],
1139 cellParticles[cloudI]
1144 fieldDecomposer.decomposeFields
1147 lagrangianLabelFields[cloudI]
1149 fieldDecomposer.decomposeFieldFields
1152 lagrangianLabelFieldFields[cloudI]
1154 fieldDecomposer.decomposeFields
1157 lagrangianScalarFields[cloudI]
1159 fieldDecomposer.decomposeFieldFields
1162 lagrangianScalarFieldFields[cloudI]
1164 fieldDecomposer.decomposeFields
1167 lagrangianVectorFields[cloudI]
1169 fieldDecomposer.decomposeFieldFields
1172 lagrangianVectorFieldFields[cloudI]
1174 fieldDecomposer.decomposeFields
1177 lagrangianSphericalTensorFields[cloudI]
1179 fieldDecomposer.decomposeFieldFields
1182 lagrangianSphericalTensorFieldFields[cloudI]
1184 fieldDecomposer.decomposeFields
1187 lagrangianSymmTensorFields[cloudI]
1189 fieldDecomposer.decomposeFieldFields
1192 lagrangianSymmTensorFieldFields[cloudI]
1194 fieldDecomposer.decomposeFields
1197 lagrangianTensorFields[cloudI]
1199 fieldDecomposer.decomposeFieldFields
1202 lagrangianTensorFieldFields[cloudI]
1210 decomposeUniform(copyUniform, mesh, processorDb, regionDir);
1214 if (regionNames.size() > 1 && regioni == 0)
1216 decomposeUniform(copyUniform, mesh, processorDb);
1222 if (times.size() == 1)
1224 boundaryProcAddressingList.set(proci,
nullptr);
1225 cellProcAddressingList.set(proci,
nullptr);
1226 faceProcAddressingList.set(proci,
nullptr);
1227 procMeshList.set(proci,
nullptr);
1228 processorDbList.set(proci,
nullptr);
List< instant > instantList
List of instants.
bool exists(const fileName &, const bool checkVariants=true, const bool followLink=true)
Does the name exist (as directory or file) in the file system?
#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.
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.
const dimensionSet dimless
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 &)
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 const word null
An empty word.
List< label > labelList
A List of labels.
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.
fileNameList readDir(const fileName &, const fileType=fileType::file, const bool filterVariants=true, const bool followLink=true)
Read a directory and return the entries as a string list.
static word controlDictName
The default control dictionary name (normally "controlDict")
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)
static const word prefix
The prefix to local: lagrangian.
static pointMesh & New(polyMesh &mesh)
word name(const complex &)
Return a string representation of a complex.
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.
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
const Time & time() const
Return time.
fileName cwd()
Return current working directory path name.
IOobject systemDictIO(const word &dictName, const argList &args, const objectRegistry &ob, const word ®ionName=polyMesh::defaultRegion)
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.
wordList selectRegionNames(const argList &args, const Time &runTime)
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.
const word dictName("noiseDict")