70 for (
const instant& t : timeDirs)
72 if (!masterTimeDirSet.found(t.name()))
81 int main(
int argc,
char *argv[])
85 "Reconstruct fields of a parallel case"
90 timeSelector::addOptions(
true,
true);
91 argList::noParallel();
93 argList::addBoolOption
96 "Operate on all regions in regionProperties"
102 "Specify single or multiple fields to reconstruct (all by default)."
103 " Eg, 'T' or '(p T U \"alpha.*\")'"
105 argList::addBoolOption
108 "Skip reconstructing fields"
114 "Specify single or multiple lagrangian fields to reconstruct"
117 " - Positions are always included."
119 argList::addBoolOption
122 "Skip reconstructing lagrangian positions and fields"
125 argList::addBoolOption
128 "Skip reconstructing cellSets, faceSets, pointSets"
130 argList::addBoolOption
133 "Only reconstruct new times (i.e. that do not exist already)"
140 wordRes selectedFields;
143 const bool doFields = !
args.
found(
"noFields");
147 Info<<
"Skipping reconstructing fields"
151 wordRes selectedLagrangianFields;
154 "lagrangianFields", selectedLagrangianFields
157 const bool doLagrangian = !
args.
found(
"noLagrangian");
161 Info<<
"Skipping reconstructing lagrangian positions and fields"
165 const bool doReconstructSets = !
args.
found(
"noSets");
167 if (!doReconstructSets)
169 Info<<
"Skipping reconstructing cellSets, faceSets and pointSets"
173 const bool newTimes =
args.
found(
"newTimes");
174 const bool allRegions =
args.
found(
"allRegions");
180 regionNames = regionProperties(
runTime).names();
181 regionDirs = regionNames;
183 Info<<
"Reconstructing all regions in regionProperties" <<
nl
188 regionNames.resize(1, fvMesh::defaultRegion);
189 regionDirs.resize(1, word::null);
193 regionDirs.first() = regionNames.first();
204 <<
"No processor* directories found"
209 const_cast<fileOperation&
>(
fileHandler()).setNProcs(nProcs);
212 PtrList<Time> databases(nProcs);
221 Time::controlDictName,
232 databases[0].times(),
243 if (timeDirs.empty())
254 masterTimeDirs =
runTime.times();
256 wordHashSet masterTimeDirSet(2*masterTimeDirs.size());
257 for (
const instant& t : masterTimeDirs)
259 masterTimeDirSet.
insert(t.name());
266 databases[proci].setTime(
runTime);
270 forAll(regionNames, regioni)
272 const word&
regionName = regionNames[regioni];
273 const word& regionDir = regionDirs[regioni];
281 && regionNames.size() == 1
282 && regionDirs[0].empty()
283 && haveAllTimes(masterTimeDirSet, timeDirs)
287 <<
" since already have all times"
306 processorMeshes procMeshes(databases,
regionName);
316 if (newTimes && masterTimeDirSet.found(timeDirs[timei].name()))
318 Info<<
"Skipping time " << timeDirs[timei].name()
325 runTime.setTime(timeDirs[timei], timei);
332 databases[proci].setTime(timeDirs[timei], timei);
336 fvMesh::readUpdateState meshStat =
mesh.readUpdate();
338 fvMesh::readUpdateState procStat = procMeshes.readUpdate();
340 if (procStat == fvMesh::POINTS_MOVED)
344 procMeshes.reconstructPoints(
mesh);
346 else if (meshStat != procStat)
349 <<
"readUpdate for the reconstructed mesh:"
351 <<
"readUpdate for the processor meshes :"
353 <<
"These should be equal or your addressing"
354 <<
" might be incorrect."
355 <<
" Please check your time directories for any "
356 <<
"mesh directories." <<
endl;
363 procMeshes.meshes()[0],
364 databases[0].timeName()
370 Info<<
"Reconstructing FV fields" <<
nl <<
endl;
372 fvFieldReconstructor reconstructor
376 procMeshes.faceProcAddressing(),
377 procMeshes.cellProcAddressing(),
378 procMeshes.boundaryProcAddressing()
381 reconstructor.reconstructFvVolumeInternalFields<scalar>
386 reconstructor.reconstructFvVolumeInternalFields<
vector>
396 reconstructor.reconstructFvVolumeInternalFields<
symmTensor>
401 reconstructor.reconstructFvVolumeInternalFields<
tensor>
407 reconstructor.reconstructFvVolumeFields<scalar>
412 reconstructor.reconstructFvVolumeFields<
vector>
422 reconstructor.reconstructFvVolumeFields<
symmTensor>
427 reconstructor.reconstructFvVolumeFields<
tensor>
433 reconstructor.reconstructFvSurfaceFields<scalar>
438 reconstructor.reconstructFvSurfaceFields<
vector>
448 reconstructor.reconstructFvSurfaceFields<
symmTensor>
453 reconstructor.reconstructFvSurfaceFields<
tensor>
459 if (reconstructor.nReconstructed() == 0)
467 Info<<
"Reconstructing point fields" <<
nl <<
endl;
470 PtrList<pointMesh> pMeshes(procMeshes.meshes().size());
477 new pointMesh(procMeshes.meshes()[proci])
481 pointFieldReconstructor reconstructor
485 procMeshes.pointProcAddressing(),
486 procMeshes.boundaryProcAddressing()
489 reconstructor.reconstructFields<scalar>
494 reconstructor.reconstructFields<
vector>
509 reconstructor.reconstructFields<
tensor>
515 if (reconstructor.nReconstructed() == 0)
531 HashTable<IOobjectList> allCloudObjects;
535 fileName lagrangianDir
539 databases[proci].timePath()
546 if (!lagrangianDir.empty())
555 for (
const fileName& cloudDir : cloudDirs)
559 if (!allCloudObjects.found(cloudDir))
562 IOobjectList localObjs
564 procMeshes.meshes()[proci],
565 databases[proci].timeName(),
566 cloud::prefix/cloudDir
571 localObjs.found(
"coordinates")
572 || localObjs.found(
"positions")
575 allCloudObjects.insert(cloudDir, localObjs);
582 if (allCloudObjects.size())
584 lagrangianReconstructor reconstructor
588 procMeshes.faceProcAddressing(),
589 procMeshes.cellProcAddressing()
598 const IOobjectList& cloudObjs = iter.val();
600 Info<<
"Reconstructing lagrangian fields for cloud "
603 reconstructor.reconstructPositions(
cloudName);
605 reconstructor.reconstructFields<label>
609 selectedLagrangianFields
611 reconstructor.reconstructFieldFields<label>
615 selectedLagrangianFields
618 reconstructor.reconstructFields<scalar>
622 selectedLagrangianFields
624 reconstructor.reconstructFieldFields<scalar>
628 selectedLagrangianFields
631 reconstructor.reconstructFields<
vector>
635 selectedLagrangianFields
637 reconstructor.reconstructFieldFields<
vector>
641 selectedLagrangianFields
648 selectedLagrangianFields
654 selectedLagrangianFields
661 selectedLagrangianFields
663 reconstructor.reconstructFieldFields<
symmTensor>
667 selectedLagrangianFields
670 reconstructor.reconstructFields<
tensor>
674 selectedLagrangianFields
676 reconstructor.reconstructFieldFields<
tensor>
680 selectedLagrangianFields
695 objects.lookupClass(areaScalarField::typeName).size()
696 || objects.lookupClass(areaVectorField::typeName).size()
697 || objects.lookupClass(areaSphericalTensorField::typeName).size()
698 || objects.lookupClass(areaSymmTensorField::typeName).size()
699 || objects.lookupClass(areaTensorField::typeName).size()
700 || objects.lookupClass(edgeScalarField::typeName).size()
703 Info <<
"Reconstructing FA fields" <<
nl <<
endl;
707 processorFaMeshes procFaMeshes(procMeshes.meshes());
709 faFieldReconstructor reconstructor
712 procFaMeshes.meshes(),
713 procFaMeshes.edgeProcAddressing(),
714 procFaMeshes.faceProcAddressing(),
715 procFaMeshes.boundaryProcAddressing()
718 reconstructor.reconstructFaAreaFields<scalar>(objects);
719 reconstructor.reconstructFaAreaFields<
vector>(objects);
721 reconstructor.reconstructFaAreaFields<
symmTensor>(objects);
722 reconstructor.reconstructFaAreaFields<
tensor>(objects);
724 reconstructor.reconstructFaEdgeFields<scalar>(objects);
731 if (doReconstructSets)
734 HashTable<label> cSetNames;
735 HashTable<label> fSetNames;
736 HashTable<label> pSetNames;
738 forAll(procMeshes.meshes(), proci)
740 const fvMesh& procMesh = procMeshes.meshes()[proci];
750 polyMesh::meshSubDir/
"sets"
753 IOobjectList cSets(objects.lookupClass(cellSet::typeName));
756 cSetNames.insert(iter.key(), cSetNames.size());
759 IOobjectList fSets(objects.lookupClass(faceSet::typeName));
762 fSetNames.insert(iter.key(), fSetNames.size());
764 IOobjectList pSets(objects.lookupClass(pointSet::typeName));
767 pSetNames.insert(iter.key(), pSetNames.size());
771 if (cSetNames.size() || fSetNames.size() || pSetNames.size())
774 PtrList<cellSet> cellSets(cSetNames.size());
775 PtrList<faceSet> faceSets(fSetNames.size());
776 PtrList<pointSet> pointSets(pSetNames.size());
778 Info<<
"Reconstructing sets:" <<
endl;
779 if (cSetNames.size())
782 << cSetNames.sortedToc() <<
endl;
784 if (fSetNames.size())
787 << fSetNames.sortedToc() <<
endl;
789 if (pSetNames.size())
792 << pSetNames.sortedToc() <<
endl;
796 forAll(procMeshes.meshes(), proci)
798 const fvMesh& procMesh = procMeshes.meshes()[proci];
804 polyMesh::meshSubDir/
"sets"
809 procMeshes.cellProcAddressing()[proci];
813 objects.lookupClass(cellSet::typeName)
819 const cellSet procSet(*iter());
820 label setI = cSetNames[iter.key()];
821 if (!cellSets.set(setI))
834 cellSet& cSet = cellSets[setI];
835 cSet.instance() =
runTime.timeName();
837 for (
const label celli : procSet)
839 cSet.insert(cellMap[celli]);
845 procMeshes.faceProcAddressing()[proci];
849 objects.lookupClass(faceSet::typeName)
855 const faceSet procSet(*iter());
856 label setI = fSetNames[iter.key()];
857 if (!faceSets.set(setI))
870 faceSet& fSet = faceSets[setI];
871 fSet.instance() =
runTime.timeName();
873 for (
const label facei : procSet)
880 procMeshes.pointProcAddressing()[proci];
884 objects.lookupClass(pointSet::typeName)
889 const pointSet propSet(*iter());
890 label setI = pSetNames[iter.key()];
891 if (!pointSets.set(setI))
904 pointSet& pSet = pointSets[setI];
905 pSet.instance() =
runTime.timeName();
907 for (
const label pointi : propSet)
909 pSet.insert(pointMap[pointi]);
916 for (
const auto& set : cellSets)
920 for (
const auto& set : faceSets)
924 for (
const auto& set : pointSets)
933 PtrList<hexRef8Data> procData(procMeshes.meshes().size());
935 forAll(procMeshes.meshes(), procI)
937 const fvMesh& procMesh = procMeshes.meshes()[procI];
947 procMesh.time().timeName(),
948 polyMesh::meshSubDir,
950 IOobject::READ_IF_PRESENT,
960 const PtrList<labelIOList>& cellAddr =
961 procMeshes.cellProcAddressing();
963 UPtrList<const labelList> cellMaps(cellAddr.size());
966 cellMaps.set(i, &cellAddr[i]);
969 const PtrList<labelIOList>& pointAddr =
970 procMeshes.pointProcAddressing();
972 UPtrList<const labelList> pointMaps(pointAddr.size());
975 pointMaps.set(i, &pointAddr[i]);
978 UPtrList<const hexRef8Data> procRefs(procData.size());
981 procRefs.set(i, &procData[i]);
989 mesh.time().timeName(),
990 polyMesh::meshSubDir,
1006 PtrList<hexRef8Data> procData(procMeshes.meshes().size());
1008 forAll(procMeshes.meshes(), procI)
1010 const fvMesh& procMesh = procMeshes.meshes()[procI];
1020 procMesh.time().timeName(),
1021 polyMesh::meshSubDir,
1023 IOobject::READ_IF_PRESENT,
1033 const PtrList<labelIOList>& cellAddr =
1034 procMeshes.cellProcAddressing();
1036 UPtrList<const labelList> cellMaps(cellAddr.size());
1039 cellMaps.set(i, &cellAddr[i]);
1042 const PtrList<labelIOList>& pointAddr =
1043 procMeshes.pointProcAddressing();
1045 UPtrList<const labelList> pointMaps(pointAddr.size());
1048 pointMaps.set(i, &pointAddr[i]);
1051 UPtrList<const hexRef8Data> procRefs(procData.size());
1054 procRefs.set(i, &procData[i]);
1062 mesh.time().timeName(),
1063 polyMesh::meshSubDir,
1078 fileName uniformDir0
1082 databases[0].timePath()/regionDir/
"uniform"
1094 if (regioni == 0 && regionDir != word::null)
1096 fileName uniformDir0
1100 databases[0].timePath()/
"uniform"