78 #include "domainDecomposition.H"
94 #include "readFields.H"
95 #include "dimFieldDecomposer.H"
97 #include "pointFieldDecomposer.H"
98 #include "lagrangianFieldDecomposer.H"
105 const PtrList<fvMesh>& procMeshList,
108 PtrList<labelIOList>& procAddressingList
111 const fvMesh& procMesh = procMeshList[procI];
113 if (!procAddressingList.set(procI))
115 procAddressingList.set
123 procMesh.facesInstance(),
133 return procAddressingList[procI];
138 int main(
int argc,
char *argv[])
142 "decompose a mesh and fields of a case for parallel execution"
145 argList::noParallel();
150 "read decomposePar dictionary from specified location"
153 argList::addBoolOption
156 "operate on all regions in regionProperties"
158 argList::addBoolOption
161 "write cell distribution as a labelList - for use with 'manual' "
162 "decomposition method or as a volScalarField for post-processing."
164 argList::addBoolOption
167 "copy any uniform/ directories too"
169 argList::addBoolOption
172 "use existing geometry decomposition and convert fields only"
174 argList::addBoolOption
177 "skip decomposing cellSets, faceSets, pointSets"
179 argList::addBoolOption
182 "remove existing processor*/ subdirs before decomposing the geometry"
184 argList::addBoolOption
187 "only decompose geometry if the number of domains has changed"
191 timeSelector::addOptions(
true,
false);
210 fileName decompDictFile;
213 if (
isDir(decompDictFile))
215 decompDictFile = decompDictFile/
"decomposeParDict";
224 Info<<
"Decomposing all regions in regionProperties" <<
nl <<
endl;
225 regionProperties rp(runTime);
231 if (
findIndex(regionNames, regions[i]) == -1)
233 regionNames.append(regions[i]);
237 regionDirs = regionNames;
245 regionDirs = regionNames;
249 regionNames =
wordList(1, fvMesh::defaultRegion);
250 regionDirs =
wordList(1, word::null);
256 forAll(regionNames, regionI)
258 const word&
regionName = regionNames[regionI];
259 const word& regionDir = regionDirs[regionI];
271 / (word(
"processor") +
name(nProcs))
274 / polyMesh::meshSubDir
287 decompositionModel::selectIO
292 runTime.time().system(),
295 IOobject::MUST_READ_IF_MODIFIED,
302 ).lookup(
"numberOfSubdomains")
305 if (decomposeFieldsOnly)
308 if (nProcs != nDomains)
311 <<
"Specified -fields, but the case was decomposed with "
312 << nProcs <<
" domains"
314 <<
"instead of " << nDomains
315 <<
" domains as specified in decomposeParDict" <<
nl
321 bool procDirsProblem =
true;
323 if (ifRequiredDecomposition && nProcs == nDomains)
326 decomposeFieldsOnly =
true;
327 procDirsProblem =
false;
328 forceOverwrite =
false;
330 Info<<
"Using existing processor directories" <<
nl;
335 Info<<
"Removing " << nProcs
336 <<
" existing processor directories" <<
endl;
340 for (
label procI = nProcs-1; procI >= 0; --procI)
344 runTime.path()/(word(
"processor") +
name(procI))
350 procDirsProblem =
false;
356 <<
"Case is already decomposed with " << nProcs
357 <<
" domains, use the -force option or manually" <<
nl
358 <<
"remove processor directories before decomposing. e.g.,"
360 <<
" rm -rf " << runTime.path().c_str() <<
"/processor*"
367 domainDecomposition
mesh
382 if (!decomposeFieldsOnly)
384 mesh.decomposeMesh();
386 mesh.writeDecomposition(decomposeSets);
399 mesh.facesInstance(),
407 cellDecomposition.write();
409 Info<<
nl <<
"Wrote decomposition to "
410 << cellDecomposition.objectPath()
411 <<
" for use in manual decomposition." <<
endl;
426 zeroGradientFvPatchScalarField::typeName
431 cellDist[celli] = procIds[celli];
436 Info<<
nl <<
"Wrote decomposition as volScalarField to "
437 << cellDist.name() <<
" for use in postprocessing."
448 PtrList<Time> processorDbList(
mesh.nProcs());
449 PtrList<fvMesh> procMeshList(
mesh.nProcs());
450 PtrList<labelIOList> faceProcAddressingList(
mesh.nProcs());
451 PtrList<labelIOList> cellProcAddressingList(
mesh.nProcs());
452 PtrList<labelIOList> boundaryProcAddressingList(
mesh.nProcs());
453 PtrList<fvFieldDecomposer> fieldDecomposerList(
mesh.nProcs());
454 PtrList<dimFieldDecomposer> dimFieldDecomposerList(
mesh.nProcs());
455 PtrList<labelIOList> pointProcAddressingList(
mesh.nProcs());
456 PtrList<pointFieldDecomposer> pointFieldDecomposerList(
mesh.nProcs());
463 runTime.setTime(times[timeI], timeI);
465 Info<<
"Time = " << runTime.timeName() <<
endl;
468 IOobjectList objects(
mesh, runTime.timeName());
473 PtrList<volScalarField> volScalarFields;
475 PtrList<volVectorField> volVectorFields;
477 PtrList<volSphericalTensorField> volSphericalTensorFields;
479 PtrList<volSymmTensorField> volSymmTensorFields;
481 PtrList<volTensorField> volTensorFields;
487 PtrList<DimensionedField<scalar, volMesh> > dimScalarFields;
489 PtrList<DimensionedField<vector, volMesh> > dimVectorFields;
491 PtrList<DimensionedField<sphericalTensor, volMesh> >
492 dimSphericalTensorFields;
494 PtrList<DimensionedField<symmTensor, volMesh> > dimSymmTensorFields;
496 PtrList<DimensionedField<tensor, volMesh> > dimTensorFields;
502 PtrList<surfaceScalarField> surfaceScalarFields;
504 PtrList<surfaceVectorField> surfaceVectorFields;
506 PtrList<surfaceSphericalTensorField> surfaceSphericalTensorFields;
508 PtrList<surfaceSymmTensorField> surfaceSymmTensorFields;
510 PtrList<surfaceTensorField> surfaceTensorFields;
518 PtrList<pointScalarField> pointScalarFields;
519 readFields(pMesh, objects, pointScalarFields,
false);
520 PtrList<pointVectorField> pointVectorFields;
521 readFields(pMesh, objects, pointVectorFields,
false);
522 PtrList<pointSphericalTensorField> pointSphericalTensorFields;
523 readFields(pMesh, objects, pointSphericalTensorFields,
false);
524 PtrList<pointSymmTensorField> pointSymmTensorFields;
525 readFields(pMesh, objects, pointSymmTensorFields,
false);
526 PtrList<pointTensorField> pointTensorFields;
527 readFields(pMesh, objects, pointTensorFields,
false);
535 readDir(runTime.timePath()/cloud::prefix, fileName::DIRECTORY)
539 PtrList<Cloud<indexedParticle> > lagrangianPositions
544 PtrList< List<SLList<indexedParticle*>*> > cellParticles
549 PtrList<PtrList<labelIOField> > lagrangianLabelFields
553 PtrList<PtrList<labelFieldCompactIOField> >
554 lagrangianLabelFieldFields
558 PtrList<PtrList<scalarIOField> > lagrangianScalarFields
562 PtrList<PtrList<scalarFieldCompactIOField> >
563 lagrangianScalarFieldFields
567 PtrList<PtrList<vectorIOField> > lagrangianVectorFields
571 PtrList<PtrList<vectorFieldCompactIOField> >
572 lagrangianVectorFieldFields
576 PtrList<PtrList<sphericalTensorIOField> >
577 lagrangianSphericalTensorFields
581 PtrList<PtrList<sphericalTensorFieldCompactIOField> >
582 lagrangianSphericalTensorFieldFields(cloudDirs.size());
583 PtrList<PtrList<symmTensorIOField> > lagrangianSymmTensorFields
587 PtrList<PtrList<symmTensorFieldCompactIOField> >
588 lagrangianSymmTensorFieldFields
592 PtrList<PtrList<tensorIOField> > lagrangianTensorFields
596 PtrList<PtrList<tensorFieldCompactIOField> >
597 lagrangianTensorFieldFields
606 IOobjectList sprayObjs
610 cloud::prefix/cloudDirs[i],
616 IOobject* positionsPtr = sprayObjs.lookup(word(
"positions"));
623 Info<<
"Identified lagrangian data set: " << cloudDirs[i]
626 lagrangianPositions.set
629 new Cloud<indexedParticle>
644 new List<SLList<indexedParticle*>*>
647 static_cast<SLList<indexedParticle*>*
>(NULL)
655 Cloud<indexedParticle>,
656 lagrangianPositions[cloudI],
660 iter().index() = i++;
662 label celli = iter().cell();
665 if (celli < 0 || celli >=
mesh.nCells())
668 <<
"Illegal cell number " << celli
669 <<
" for particle with index " << iter().index()
670 <<
" at position " << iter().position() <<
nl
671 <<
"Cell number should be between 0 and "
673 <<
"On this mesh the particle should"
675 <<
mesh.findCell(iter().position())
679 if (!cellParticles[cloudI][celli])
681 cellParticles[cloudI][celli] =
682 new SLList<indexedParticle*>();
685 cellParticles[cloudI][celli]->append(&iter());
691 IOobjectList lagrangianObjects
695 cloud::prefix/cloudDirs[cloudI],
705 lagrangianLabelFields
708 lagrangianFieldDecomposer::readFieldFields
712 lagrangianLabelFieldFields
719 lagrangianScalarFields
722 lagrangianFieldDecomposer::readFieldFields
726 lagrangianScalarFieldFields
733 lagrangianVectorFields
736 lagrangianFieldDecomposer::readFieldFields
740 lagrangianVectorFieldFields
747 lagrangianSphericalTensorFields
750 lagrangianFieldDecomposer::readFieldFields
754 lagrangianSphericalTensorFieldFields
761 lagrangianSymmTensorFields
764 lagrangianFieldDecomposer::readFieldFields
768 lagrangianSymmTensorFieldFields
775 lagrangianTensorFields
778 lagrangianFieldDecomposer::readFieldFields
782 lagrangianTensorFieldFields
789 lagrangianPositions.setSize(cloudI);
790 cellParticles.setSize(cloudI);
791 lagrangianLabelFields.setSize(cloudI);
792 lagrangianLabelFieldFields.setSize(cloudI);
793 lagrangianScalarFields.setSize(cloudI);
794 lagrangianScalarFieldFields.setSize(cloudI);
795 lagrangianVectorFields.setSize(cloudI);
796 lagrangianVectorFieldFields.setSize(cloudI);
797 lagrangianSphericalTensorFields.setSize(cloudI);
798 lagrangianSphericalTensorFieldFields.setSize(cloudI);
799 lagrangianSymmTensorFields.setSize(cloudI);
800 lagrangianSymmTensorFieldFields.setSize(cloudI);
801 lagrangianTensorFields.setSize(cloudI);
802 lagrangianTensorFieldFields.setSize(cloudI);
806 fileName uniformDir(
"uniform");
808 if (
isDir(runTime.timePath()/uniformDir))
810 Info<<
"Detected additional non-decomposed files in "
811 << runTime.timePath()/uniformDir
822 for (
label procI = 0; procI <
mesh.nProcs(); procI++)
824 Info<<
"Processor " << procI <<
": field transfer" <<
endl;
828 if (!processorDbList.set(procI))
835 Time::controlDictName,
838 /fileName(word(
"processor") +
name(procI))
842 Time& processorDb = processorDbList[procI];
845 processorDb.setTime(runTime);
848 if (!procMeshList.set(procI))
858 processorDb.timeName(),
864 const fvMesh& procMesh = procMeshList[procI];
870 "faceProcAddressing",
871 faceProcAddressingList
878 "cellProcAddressing",
879 cellProcAddressingList
886 "boundaryProcAddressing",
887 boundaryProcAddressingList
893 if (!fieldDecomposerList.set(procI))
895 fieldDecomposerList.set
898 new fvFieldDecomposer
904 boundaryProcAddressing
908 const fvFieldDecomposer& fieldDecomposer =
909 fieldDecomposerList[procI];
911 fieldDecomposer.decomposeFields(volScalarFields);
912 fieldDecomposer.decomposeFields(volVectorFields);
913 fieldDecomposer.decomposeFields(volSphericalTensorFields);
914 fieldDecomposer.decomposeFields(volSymmTensorFields);
915 fieldDecomposer.decomposeFields(volTensorFields);
917 fieldDecomposer.decomposeFields(surfaceScalarFields);
918 fieldDecomposer.decomposeFields(surfaceVectorFields);
919 fieldDecomposer.decomposeFields
921 surfaceSphericalTensorFields
923 fieldDecomposer.decomposeFields(surfaceSymmTensorFields);
924 fieldDecomposer.decomposeFields(surfaceTensorFields);
926 if (times.size() == 1)
929 fieldDecomposerList.set(procI, NULL);
935 if (!dimFieldDecomposerList.set(procI))
937 dimFieldDecomposerList.set
940 new dimFieldDecomposer
949 const dimFieldDecomposer& dimDecomposer =
950 dimFieldDecomposerList[procI];
952 dimDecomposer.decomposeFields(dimScalarFields);
953 dimDecomposer.decomposeFields(dimVectorFields);
954 dimDecomposer.decomposeFields(dimSphericalTensorFields);
955 dimDecomposer.decomposeFields(dimSymmTensorFields);
956 dimDecomposer.decomposeFields(dimTensorFields);
958 if (times.size() == 1)
960 dimFieldDecomposerList.set(procI, NULL);
968 pointScalarFields.size()
969 || pointVectorFields.size()
970 || pointSphericalTensorFields.size()
971 || pointSymmTensorFields.size()
972 || pointTensorFields.size()
979 "pointProcAddressing",
980 pointProcAddressingList
985 if (!pointFieldDecomposerList.set(procI))
987 pointFieldDecomposerList.set
990 new pointFieldDecomposer
995 boundaryProcAddressing
999 const pointFieldDecomposer& pointDecomposer =
1000 pointFieldDecomposerList[procI];
1002 pointDecomposer.decomposeFields(pointScalarFields);
1003 pointDecomposer.decomposeFields(pointVectorFields);
1004 pointDecomposer.decomposeFields(pointSphericalTensorFields);
1005 pointDecomposer.decomposeFields(pointSymmTensorFields);
1006 pointDecomposer.decomposeFields(pointTensorFields);
1009 if (times.size() == 1)
1011 pointProcAddressingList.set(procI, NULL);
1012 pointFieldDecomposerList.set(procI, NULL);
1018 forAll(lagrangianPositions, cloudI)
1020 if (lagrangianPositions[cloudI].size())
1022 lagrangianFieldDecomposer fieldDecomposer
1029 lagrangianPositions[cloudI],
1030 cellParticles[cloudI]
1035 fieldDecomposer.decomposeFields
1038 lagrangianLabelFields[cloudI]
1040 fieldDecomposer.decomposeFieldFields
1043 lagrangianLabelFieldFields[cloudI]
1045 fieldDecomposer.decomposeFields
1048 lagrangianScalarFields[cloudI]
1050 fieldDecomposer.decomposeFieldFields
1053 lagrangianScalarFieldFields[cloudI]
1055 fieldDecomposer.decomposeFields
1058 lagrangianVectorFields[cloudI]
1060 fieldDecomposer.decomposeFieldFields
1063 lagrangianVectorFieldFields[cloudI]
1065 fieldDecomposer.decomposeFields
1068 lagrangianSphericalTensorFields[cloudI]
1070 fieldDecomposer.decomposeFieldFields
1073 lagrangianSphericalTensorFieldFields[cloudI]
1075 fieldDecomposer.decomposeFields
1078 lagrangianSymmTensorFields[cloudI]
1080 fieldDecomposer.decomposeFieldFields
1083 lagrangianSymmTensorFieldFields[cloudI]
1085 fieldDecomposer.decomposeFields
1088 lagrangianTensorFields[cloudI]
1090 fieldDecomposer.decomposeFieldFields
1093 lagrangianTensorFieldFields[cloudI]
1101 if (uniformDir.size())
1103 const fileName timePath = processorDb.timePath();
1105 if (copyUniform ||
mesh.distributed())
1109 runTime.timePath()/uniformDir,
1116 const string parentPath = string(
"..")/
"..";
1118 fileName currentDir(
cwd());
1122 parentPath/runTime.timeName()/uniformDir,
1134 if (times.size() == 1)
1136 boundaryProcAddressingList.set(procI, NULL);
1137 cellProcAddressingList.set(procI, NULL);
1138 faceProcAddressingList.set(procI, NULL);
1139 procMeshList.set(procI, NULL);
1140 processorDbList.set(procI, NULL);