101 #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" 224 "operate on all regions in regionProperties" 229 "write cell distribution as a labelList - for use with 'manual' " 230 "decomposition method or as a volScalarField for post-processing." 235 "Copy \a 0 directory to processor* rather than decompose the fields" 240 "copy any uniform/ directories too" 245 "use existing geometry decomposition and convert fields only" 250 "skip decomposing cellSets, faceSets, pointSets" 255 "remove existing processor*/ subdirs before decomposing the geometry" 260 "only decompose geometry if the number of domains has changed" 266 "dictionary file name",
267 "specify alternative decomposition dictionary" 284 const word
dictName(
"decomposeParDict");
294 dictPath =
args[
"dict"];
315 Info<<
"Decomposing all regions in regionProperties" <<
nl <<
endl;
316 regionProperties
rp(runTime);
322 if (
findIndex(regionNames, regions[i]) == -1)
324 regionNames.append(regions[i]);
328 regionDirs = regionNames;
335 regionNames =
wordList(1, regionName);
336 regionDirs = regionNames;
347 forAll(regionNames, regioni)
349 const word& regionName = regionNames[regioni];
350 const word& regionDir = regionDirs[regioni];
352 Info<<
"\n\nDecomposing mesh " << regionName <<
nl <<
endl;
367 runTime.time().system(),
374 ).lookup(
"numberOfSubdomains")
377 if (decomposeFieldsOnly)
380 if (nProcs != nDomains)
383 <<
"Specified -fields, but the case was decomposed with " 384 << nProcs <<
" domains" 386 <<
"instead of " << nDomains
387 <<
" domains as specified in " <<
dictName 394 bool procDirsProblem =
true;
396 if (ifRequiredDecomposition && nProcs == nDomains)
399 decomposeFieldsOnly =
true;
400 procDirsProblem =
false;
401 forceOverwrite =
false;
403 Info<<
"Using existing processor directories" <<
nl;
408 Info<<
"Removing " << nProcs
409 <<
" existing processor directories" <<
endl;
412 const fileName procDir(runTime.path()/word(
"processors"));
420 for (
label proci = nProcs-1; proci >= 0; --proci)
422 const fileName procDir
424 runTime.path()/(word(
"processor") +
name(proci))
433 procDirsProblem =
false;
439 <<
"Case is already decomposed with " << nProcs
440 <<
" domains, use the -force option or manually" <<
nl 441 <<
"remove processor directories before decomposing. e.g.," 443 <<
" rm -rf " << runTime.path().c_str() <<
"/processor*" 450 domainDecomposition
mesh 465 if (!decomposeFieldsOnly)
473 mesh.decomposeMesh(dictPath);
475 mesh.writeDecomposition(decomposeSets);
479 const labelList& procIds = mesh.cellToProc();
488 mesh.facesInstance(),
496 cellDecomposition.write();
498 Info<<
nl <<
"Wrote decomposition to " 499 << cellDecomposition.objectPath()
500 <<
" for use in manual decomposition." <<
endl;
519 cellDist[celli] = procIds[celli];
524 Info<<
nl <<
"Wrote decomposition as volScalarField to " 525 << cellDist.name() <<
" for use in postprocessing." 537 fileName prevTimePath;
538 for (
label proci = 0; proci < mesh.nProcs(); proci++)
546 processorDb.setTime(runTime);
551 const fileName timePath
558 processorDb.timeName(),
565 if (timePath != prevTimePath)
567 Info<<
"Processor " << proci
568 <<
": copying " << runTime.timePath() <<
nl 569 <<
" to " << timePath <<
endl;
572 prevTimePath = timePath;
583 PtrList<Time> processorDbList(mesh.nProcs());
584 PtrList<fvMesh> procMeshList(mesh.nProcs());
585 PtrList<labelIOList> faceProcAddressingList(mesh.nProcs());
586 PtrList<labelIOList> cellProcAddressingList(mesh.nProcs());
587 PtrList<labelIOList> boundaryProcAddressingList(mesh.nProcs());
588 PtrList<fvFieldDecomposer> fieldDecomposerList(mesh.nProcs());
589 PtrList<dimFieldDecomposer> dimFieldDecomposerList(mesh.nProcs());
590 PtrList<labelIOList> pointProcAddressingList(mesh.nProcs());
591 PtrList<pointFieldDecomposer> pointFieldDecomposerList
600 runTime.setTime(times[timeI], timeI);
602 Info<<
"Time = " << runTime.timeName() <<
endl;
605 IOobjectList objects(mesh, runTime.timeName());
610 PtrList<volScalarField> volScalarFields;
612 PtrList<volVectorField> volVectorFields;
614 PtrList<volSphericalTensorField> volSphericalTensorFields;
615 readFields(mesh, objects, volSphericalTensorFields);
616 PtrList<volSymmTensorField> volSymmTensorFields;
617 readFields(mesh, objects, volSymmTensorFields);
618 PtrList<volTensorField> volTensorFields;
624 PtrList<DimensionedField<scalar, volMesh>> dimScalarFields;
626 PtrList<DimensionedField<vector, volMesh>> dimVectorFields;
628 PtrList<DimensionedField<sphericalTensor, volMesh>>
629 dimSphericalTensorFields;
630 readFields(mesh, objects, dimSphericalTensorFields);
631 PtrList<DimensionedField<symmTensor, volMesh>>
633 readFields(mesh, objects, dimSymmTensorFields);
634 PtrList<DimensionedField<tensor, volMesh>> dimTensorFields;
640 PtrList<surfaceScalarField> surfaceScalarFields;
641 readFields(mesh, objects, surfaceScalarFields);
642 PtrList<surfaceVectorField> surfaceVectorFields;
643 readFields(mesh, objects, surfaceVectorFields);
644 PtrList<surfaceSphericalTensorField>
645 surfaceSphericalTensorFields;
646 readFields(mesh, objects, surfaceSphericalTensorFields);
647 PtrList<surfaceSymmTensorField> surfaceSymmTensorFields;
648 readFields(mesh, objects, surfaceSymmTensorFields);
649 PtrList<surfaceTensorField> surfaceTensorFields;
650 readFields(mesh, objects, surfaceTensorFields);
657 PtrList<pointScalarField> pointScalarFields;
658 readFields(pMesh, objects, pointScalarFields);
659 PtrList<pointVectorField> pointVectorFields;
660 readFields(pMesh, objects, pointVectorFields);
661 PtrList<pointSphericalTensorField> pointSphericalTensorFields;
662 readFields(pMesh, objects, pointSphericalTensorFields);
663 PtrList<pointSymmTensorField> pointSymmTensorFields;
664 readFields(pMesh, objects, pointSymmTensorFields);
665 PtrList<pointTensorField> pointTensorFields;
666 readFields(pMesh, objects, pointTensorFields);
682 PtrList<Cloud<indexedParticle>> lagrangianPositions
687 PtrList<List<SLList<indexedParticle*>*>> cellParticles
692 PtrList<PtrList<labelIOField>> lagrangianLabelFields
696 PtrList<PtrList<labelFieldCompactIOField>>
697 lagrangianLabelFieldFields
701 PtrList<PtrList<scalarIOField>> lagrangianScalarFields
705 PtrList<PtrList<scalarFieldCompactIOField>>
706 lagrangianScalarFieldFields
710 PtrList<PtrList<vectorIOField>> lagrangianVectorFields
714 PtrList<PtrList<vectorFieldCompactIOField>>
715 lagrangianVectorFieldFields
719 PtrList<PtrList<sphericalTensorIOField>>
720 lagrangianSphericalTensorFields
724 PtrList<PtrList<sphericalTensorFieldCompactIOField>>
725 lagrangianSphericalTensorFieldFields(cloudDirs.size());
726 PtrList<PtrList<symmTensorIOField>> lagrangianSymmTensorFields
730 PtrList<PtrList<symmTensorFieldCompactIOField>>
731 lagrangianSymmTensorFieldFields
735 PtrList<PtrList<tensorIOField>> lagrangianTensorFields
739 PtrList<PtrList<tensorFieldCompactIOField>>
740 lagrangianTensorFieldFields
749 IOobjectList sprayObjs
759 IOobject* positionsPtr = sprayObjs.lookup
769 Info<<
"Identified lagrangian data set: " 770 << cloudDirs[i] <<
endl;
772 lagrangianPositions.set
775 new Cloud<indexedParticle>
790 new List<SLList<indexedParticle*>*>
793 static_cast<SLList<indexedParticle*>*
>(
nullptr)
801 Cloud<indexedParticle>,
802 lagrangianPositions[cloudI],
806 iter().index() = i++;
808 label celli = iter().cell();
811 if (celli < 0 || celli >= mesh.nCells())
814 <<
"Illegal cell number " << celli
815 <<
" for particle with index " 818 << iter().position() <<
nl 819 <<
"Cell number should be between 0 and " 820 << mesh.nCells()-1 <<
nl 821 <<
"On this mesh the particle should" 823 << mesh.findCell(iter().position())
827 if (!cellParticles[cloudI][celli])
829 cellParticles[cloudI][celli] =
830 new SLList<indexedParticle*>();
833 cellParticles[cloudI][celli]->append(&iter());
839 IOobjectList lagrangianObjects
853 lagrangianLabelFields
860 lagrangianLabelFieldFields
867 lagrangianScalarFields
874 lagrangianScalarFieldFields
881 lagrangianVectorFields
888 lagrangianVectorFieldFields
895 lagrangianSphericalTensorFields
902 lagrangianSphericalTensorFieldFields
909 lagrangianSymmTensorFields
916 lagrangianSymmTensorFieldFields
923 lagrangianTensorFields
930 lagrangianTensorFieldFields
937 lagrangianPositions.setSize(cloudI);
938 cellParticles.setSize(cloudI);
939 lagrangianLabelFields.setSize(cloudI);
940 lagrangianLabelFieldFields.setSize(cloudI);
941 lagrangianScalarFields.setSize(cloudI);
942 lagrangianScalarFieldFields.setSize(cloudI);
943 lagrangianVectorFields.setSize(cloudI);
944 lagrangianVectorFieldFields.setSize(cloudI);
945 lagrangianSphericalTensorFields.setSize(cloudI);
946 lagrangianSphericalTensorFieldFields.setSize(cloudI);
947 lagrangianSymmTensorFields.setSize(cloudI);
948 lagrangianSymmTensorFieldFields.setSize(cloudI);
949 lagrangianTensorFields.setSize(cloudI);
950 lagrangianTensorFieldFields.setSize(cloudI);
955 for (
label proci = 0; proci < mesh.nProcs(); proci++)
957 Info<<
"Processor " << proci <<
": field transfer" <<
endl;
961 if (!processorDbList.set(proci))
971 /fileName(word(
"processor") +
name(proci))
975 Time& processorDb = processorDbList[proci];
978 processorDb.setTime(runTime);
981 if (!procMeshList.set(proci))
991 processorDb.timeName(),
997 const fvMesh& procMesh = procMeshList[proci];
999 const labelIOList& faceProcAddressing = procAddressing
1003 "faceProcAddressing",
1004 faceProcAddressingList
1007 const labelIOList& cellProcAddressing = procAddressing
1011 "cellProcAddressing",
1012 cellProcAddressingList
1015 const labelIOList& boundaryProcAddressing = procAddressing
1019 "boundaryProcAddressing",
1020 boundaryProcAddressingList
1026 if (!fieldDecomposerList.set(proci))
1028 fieldDecomposerList.set
1031 new fvFieldDecomposer
1037 boundaryProcAddressing
1041 const fvFieldDecomposer& fieldDecomposer =
1042 fieldDecomposerList[proci];
1044 fieldDecomposer.decomposeFields(volScalarFields);
1045 fieldDecomposer.decomposeFields(volVectorFields);
1046 fieldDecomposer.decomposeFields
1048 volSphericalTensorFields
1050 fieldDecomposer.decomposeFields(volSymmTensorFields);
1051 fieldDecomposer.decomposeFields(volTensorFields);
1053 fieldDecomposer.decomposeFields(surfaceScalarFields);
1054 fieldDecomposer.decomposeFields(surfaceVectorFields);
1055 fieldDecomposer.decomposeFields
1057 surfaceSphericalTensorFields
1059 fieldDecomposer.decomposeFields
1061 surfaceSymmTensorFields
1063 fieldDecomposer.decomposeFields(surfaceTensorFields);
1065 if (times.size() == 1)
1068 fieldDecomposerList.set(proci,
nullptr);
1074 if (!dimFieldDecomposerList.set(proci))
1076 dimFieldDecomposerList.set
1079 new dimFieldDecomposer
1088 const dimFieldDecomposer& dimDecomposer =
1089 dimFieldDecomposerList[proci];
1091 dimDecomposer.decomposeFields(dimScalarFields);
1092 dimDecomposer.decomposeFields(dimVectorFields);
1093 dimDecomposer.decomposeFields(dimSphericalTensorFields);
1094 dimDecomposer.decomposeFields(dimSymmTensorFields);
1095 dimDecomposer.decomposeFields(dimTensorFields);
1097 if (times.size() == 1)
1099 dimFieldDecomposerList.set(proci,
nullptr);
1107 pointScalarFields.size()
1108 || pointVectorFields.size()
1109 || pointSphericalTensorFields.size()
1110 || pointSymmTensorFields.size()
1111 || pointTensorFields.size()
1114 const labelIOList& pointProcAddressing = procAddressing
1118 "pointProcAddressing",
1119 pointProcAddressingList
1124 if (!pointFieldDecomposerList.set(proci))
1126 pointFieldDecomposerList.set
1129 new pointFieldDecomposer
1133 pointProcAddressing,
1134 boundaryProcAddressing
1138 const pointFieldDecomposer& pointDecomposer =
1139 pointFieldDecomposerList[proci];
1141 pointDecomposer.decomposeFields(pointScalarFields);
1142 pointDecomposer.decomposeFields(pointVectorFields);
1143 pointDecomposer.decomposeFields
1145 pointSphericalTensorFields
1147 pointDecomposer.decomposeFields(pointSymmTensorFields);
1148 pointDecomposer.decomposeFields(pointTensorFields);
1151 if (times.size() == 1)
1153 pointProcAddressingList.set(proci,
nullptr);
1154 pointFieldDecomposerList.set(proci,
nullptr);
1160 forAll(lagrangianPositions, cloudI)
1162 if (lagrangianPositions[cloudI].size())
1164 lagrangianFieldDecomposer fieldDecomposer
1171 lagrangianPositions[cloudI],
1172 cellParticles[cloudI]
1177 fieldDecomposer.decomposeFields
1180 lagrangianLabelFields[cloudI]
1182 fieldDecomposer.decomposeFieldFields
1185 lagrangianLabelFieldFields[cloudI]
1187 fieldDecomposer.decomposeFields
1190 lagrangianScalarFields[cloudI]
1192 fieldDecomposer.decomposeFieldFields
1195 lagrangianScalarFieldFields[cloudI]
1197 fieldDecomposer.decomposeFields
1200 lagrangianVectorFields[cloudI]
1202 fieldDecomposer.decomposeFieldFields
1205 lagrangianVectorFieldFields[cloudI]
1207 fieldDecomposer.decomposeFields
1210 lagrangianSphericalTensorFields[cloudI]
1212 fieldDecomposer.decomposeFieldFields
1215 lagrangianSphericalTensorFieldFields[cloudI]
1217 fieldDecomposer.decomposeFields
1220 lagrangianSymmTensorFields[cloudI]
1222 fieldDecomposer.decomposeFieldFields
1225 lagrangianSymmTensorFieldFields[cloudI]
1227 fieldDecomposer.decomposeFields
1230 lagrangianTensorFields[cloudI]
1232 fieldDecomposer.decomposeFieldFields
1235 lagrangianTensorFieldFields[cloudI]
1243 decomposeUniform(copyUniform, mesh, processorDb, regionDir);
1247 if (regionNames.size() > 1 && regioni == 0)
1249 decomposeUniform(copyUniform, mesh, processorDb);
1255 if (times.size() == 1)
1257 boundaryProcAddressingList.set(proci,
nullptr);
1258 cellProcAddressingList.set(proci,
nullptr);
1259 faceProcAddressingList.set(proci,
nullptr);
1260 procMeshList.set(proci,
nullptr);
1261 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 dirctory 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 word defaultRegion
Return the default region name.
Ostream & endl(Ostream &os)
Add newline and flush stream.
bool optionFound(const word &opt) const
Return true if the named option is found.
bool chDir(const fileName &dir)
Change the current directory to the one given and return true,.
static void noParallel()
Remove the parallel options.
bool optionReadIfPresent(const word &opt, T &) const
Read a value from the named option if present.
static const pointMesh & New(const polyMesh &mesh)
virtual bool exists(const fileName &, const bool checkGzip=true, const bool followLink=true) const =0
Does the name exist (as DIRECTORY or FILE) in the file system?
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...
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?
regionProperties rp(runTime)
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")
forAllConstIter(PtrDictionary< phaseModel >, mixture.phases(), phase)
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)
static const word prefix
The prefix to local: lagrangian.
label findIndex(const ListType &, typename ListType::const_reference, const label start=0)
Find first occurence of given element and return index,.
word name(const complex &)
Return a string representation of a complex.
static float maxThreadFileBufferSize
Max size of thread buffer size. This is the overall size of.
fileName path() const
Return the path to the caseName.
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.
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.