114 const fvMesh& procMesh = procMeshList[procI];
116 if (!procAddressingList.
set(procI))
118 procAddressingList.
set
136 return procAddressingList[procI];
141 int main(
int argc,
char *argv[])
145 "decompose a mesh and fields of a case for parallel execution"
148 argList::noParallel();
153 "read decomposePar dictionary from specified location"
156 argList::addBoolOption
159 "operate on all regions in regionProperties"
161 argList::addBoolOption
164 "write cell distribution as a labelList - for use with 'manual' "
165 "decomposition method or as a volScalarField for post-processing."
167 argList::addBoolOption
170 "copy any uniform/ directories too"
172 argList::addBoolOption
175 "use existing geometry decomposition and convert fields only"
177 argList::addBoolOption
180 "skip decomposing cellSets, faceSets, pointSets"
182 argList::addBoolOption
185 "remove existing processor*/ subdirs before decomposing the geometry"
187 argList::addBoolOption
190 "only decompose geometry if the number of domains has changed"
194 timeSelector::addOptions(
true,
false);
216 if (
isDir(decompDictFile))
218 decompDictFile = decompDictFile/
"decomposeParDict";
227 Info<<
"Decomposing all regions in regionProperties" <<
nl <<
endl;
234 if (
findIndex(regionNames, regions[i]) == -1)
236 regionNames.
append(regions[i]);
240 regionDirs = regionNames;
248 regionDirs = regionNames;
252 regionNames =
wordList(1, fvMesh::defaultRegion);
253 regionDirs =
wordList(1, word::null);
259 forAll(regionNames, regionI)
262 const word& regionDir = regionDirs[regionI];
274 / (
word(
"processor") +
name(nProcs))
277 / polyMesh::meshSubDir
291 decompositionModel::selectIO
296 runTime.time().system(),
299 IOobject::MUST_READ_IF_MODIFIED,
307 char const *
const numberOfSubdomainsTag =
"numberOfSubdomains";
312 Info<<
"Overriding decomposeParDict.numberOfSubdomains = " << nDomains <<
nl <<
endl;
313 decomposeParDict.
set(numberOfSubdomainsTag, nDomains);
314 decomposeParDict.regIOobject::write();
323 if (decomposeFieldsOnly)
326 if (nProcs != nDomains)
329 <<
"Specified -fields, but the case was decomposed with "
330 << nProcs <<
" domains"
332 <<
"instead of " << nDomains
333 <<
" domains as specified in decomposeParDict" <<
nl
339 bool procDirsProblem =
true;
341 if (ifRequiredDecomposition && nProcs == nDomains)
344 decomposeFieldsOnly =
true;
345 procDirsProblem =
false;
346 forceOverwrite =
false;
348 Info<<
"Using existing processor directories" <<
nl;
353 Info<<
"Removing " << nProcs
354 <<
" existing processor directories" <<
endl;
358 for (
label procI = nProcs-1; procI >= 0; --procI)
362 runTime.path()/(
word(
"processor") +
name(procI))
368 procDirsProblem =
false;
374 <<
"Case is already decomposed with " << nProcs
375 <<
" domains, use the -force option or manually" <<
nl
376 <<
"remove processor directories before decomposing. e.g.,"
378 <<
" rm -rf " << runTime.path().c_str() <<
"/processor*"
400 if (!decomposeFieldsOnly)
402 mesh.decomposeMesh();
404 mesh.writeDecomposition(decomposeSets);
425 cellDecomposition.
write();
427 Info<<
nl <<
"Wrote decomposition to "
429 <<
" for use in manual decomposition." <<
endl;
444 zeroGradientFvPatchScalarField::typeName
449 cellDist[celli] = procIds[celli];
454 Info<<
nl <<
"Wrote decomposition as volScalarField to "
455 << cellDist.name() <<
" for use in postprocessing."
481 runTime.setTime(times[timeI], timeI);
483 Info<<
"Time = " << runTime.timeName() <<
endl;
510 dimSphericalTensorFields;
537 readFields(pMesh, objects, pointScalarFields,
false);
539 readFields(pMesh, objects, pointVectorFields,
false);
541 readFields(pMesh, objects, pointSphericalTensorFields,
false);
543 readFields(pMesh, objects, pointSymmTensorFields,
false);
545 readFields(pMesh, objects, pointTensorFields,
false);
553 readDir(runTime.timePath()/cloud::prefix, fileName::DIRECTORY)
572 lagrangianLabelFieldFields
581 lagrangianScalarFieldFields
590 lagrangianVectorFieldFields
595 lagrangianSphericalTensorFields
600 lagrangianSphericalTensorFieldFields(cloudDirs.
size());
606 lagrangianSymmTensorFieldFields
615 lagrangianTensorFieldFields
628 cloud::prefix/cloudDirs[i],
641 Info<<
"Identified lagrangian data set: " << cloudDirs[i]
644 lagrangianPositions.
set
674 lagrangianPositions[cloudI],
678 iter().index() = i++;
680 label celli = iter().cell();
686 <<
"Illegal cell number " << celli
687 <<
" for particle with index " << iter().index()
688 <<
" at position " << iter().position() <<
nl
689 <<
"Cell number should be between 0 and "
691 <<
"On this mesh the particle should"
697 if (!cellParticles[cloudI][celli])
699 cellParticles[cloudI][celli] =
703 cellParticles[cloudI][celli]->
append(&iter());
713 cloud::prefix/cloudDirs[cloudI],
723 lagrangianLabelFields
726 lagrangianFieldDecomposer::readFieldFields
730 lagrangianLabelFieldFields
737 lagrangianScalarFields
740 lagrangianFieldDecomposer::readFieldFields
744 lagrangianScalarFieldFields
751 lagrangianVectorFields
754 lagrangianFieldDecomposer::readFieldFields
758 lagrangianVectorFieldFields
765 lagrangianSphericalTensorFields
768 lagrangianFieldDecomposer::readFieldFields
772 lagrangianSphericalTensorFieldFields
779 lagrangianSymmTensorFields
782 lagrangianFieldDecomposer::readFieldFields
786 lagrangianSymmTensorFieldFields
793 lagrangianTensorFields
796 lagrangianFieldDecomposer::readFieldFields
800 lagrangianTensorFieldFields
807 lagrangianPositions.
setSize(cloudI);
809 lagrangianLabelFields.
setSize(cloudI);
810 lagrangianLabelFieldFields.
setSize(cloudI);
811 lagrangianScalarFields.
setSize(cloudI);
812 lagrangianScalarFieldFields.
setSize(cloudI);
813 lagrangianVectorFields.
setSize(cloudI);
814 lagrangianVectorFieldFields.
setSize(cloudI);
815 lagrangianSphericalTensorFields.
setSize(cloudI);
816 lagrangianSphericalTensorFieldFields.
setSize(cloudI);
817 lagrangianSymmTensorFields.
setSize(cloudI);
818 lagrangianSymmTensorFieldFields.
setSize(cloudI);
819 lagrangianTensorFields.
setSize(cloudI);
820 lagrangianTensorFieldFields.
setSize(cloudI);
826 if (
isDir(runTime.timePath()/uniformDir))
828 Info<<
"Detected additional non-decomposed files in "
829 << runTime.timePath()/uniformDir
840 for (
label procI = 0; procI <
mesh.nProcs(); procI++)
842 Info<<
"Processor " << procI <<
": field transfer" <<
endl;
846 if (!processorDbList.
set(procI))
853 Time::controlDictName,
860 Time& processorDb = processorDbList[procI];
866 if (!procMeshList.
set(procI))
882 const fvMesh& procMesh = procMeshList[procI];
888 "faceProcAddressing",
889 faceProcAddressingList
896 "cellProcAddressing",
897 cellProcAddressingList
904 "boundaryProcAddressing",
905 boundaryProcAddressingList
911 if (!fieldDecomposerList.
set(procI))
913 fieldDecomposerList.
set
922 boundaryProcAddressing
927 fieldDecomposerList[procI];
939 surfaceSphericalTensorFields
944 if (times.
size() == 1)
947 fieldDecomposerList.
set(procI, NULL);
953 if (!dimFieldDecomposerList.
set(procI))
955 dimFieldDecomposerList.
set
968 dimFieldDecomposerList[procI];
976 if (times.
size() == 1)
978 dimFieldDecomposerList.
set(procI, NULL);
986 pointScalarFields.
size()
987 || pointVectorFields.
size()
988 || pointSphericalTensorFields.
size()
989 || pointSymmTensorFields.
size()
990 || pointTensorFields.
size()
997 "pointProcAddressing",
998 pointProcAddressingList
1003 if (!pointFieldDecomposerList.
set(procI))
1005 pointFieldDecomposerList.
set
1012 pointProcAddressing,
1013 boundaryProcAddressing
1018 pointFieldDecomposerList[procI];
1027 if (times.
size() == 1)
1029 pointProcAddressingList.
set(procI, NULL);
1030 pointFieldDecomposerList.
set(procI, NULL);
1036 forAll(lagrangianPositions, cloudI)
1038 if (lagrangianPositions[cloudI].size())
1047 lagrangianPositions[cloudI],
1048 cellParticles[cloudI]
1056 lagrangianLabelFields[cloudI]
1061 lagrangianLabelFieldFields[cloudI]
1066 lagrangianScalarFields[cloudI]
1071 lagrangianScalarFieldFields[cloudI]
1076 lagrangianVectorFields[cloudI]
1081 lagrangianVectorFieldFields[cloudI]
1086 lagrangianSphericalTensorFields[cloudI]
1091 lagrangianSphericalTensorFieldFields[cloudI]
1096 lagrangianSymmTensorFields[cloudI]
1101 lagrangianSymmTensorFieldFields[cloudI]
1106 lagrangianTensorFields[cloudI]
1111 lagrangianTensorFieldFields[cloudI]
1119 if (uniformDir.size())
1123 if (copyUniform ||
mesh.distributed())
1127 runTime.timePath()/uniformDir,
1134 const string parentPath =
string(
"..")/
"..";
1140 parentPath/runTime.timeName()/uniformDir,
1152 if (times.
size() == 1)
1154 boundaryProcAddressingList.
set(procI, NULL);
1155 cellProcAddressingList.
set(procI, NULL);
1156 faceProcAddressingList.
set(procI, NULL);
1157 procMeshList.
set(procI, NULL);
1158 processorDbList.
set(procI, NULL);