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();
99 "Specify single or multiple fields to reconstruct (all by default)."
100 " Eg, 'T' or '(p T U \"alpha.*\")'"
102 argList::addBoolOption
105 "Skip reconstructing fields"
107 argList::addOptionCompat(
"no-fields", {
"noFields", 2106});
112 "Specify single or multiple lagrangian fields to reconstruct"
115 " - Positions are always included."
117 argList::addBoolOption
120 "Skip reconstructing lagrangian positions and fields"
122 argList::addOptionCompat(
"no-lagrangian", {
"noLagrangian", 2106});
124 argList::addBoolOption
127 "Skip reconstructing cellSets, faceSets, pointSets"
129 argList::addOptionCompat(
"no-sets", {
"noSets", 2106});
131 argList::addBoolOption
134 "Only reconstruct new times (i.e. that do not exist already)"
141 const bool doFields = !
args.
found(
"no-fields");
142 wordRes selectedFields;
150 Info<<
"Skipping reconstructing fields";
153 Info<<
". Ignore -fields option";
159 const bool doFiniteArea = !
args.
found(
"no-finite-area");
162 Info<<
"Skipping reconstructing finiteArea mesh/fields"
167 const bool doLagrangian = !
args.
found(
"no-lagrangian");
168 wordRes selectedLagrangianFields;
174 "lagrangianFields", selectedLagrangianFields
179 Info<<
"Skipping reconstructing lagrangian positions/fields";
182 Info<<
". Ignore -lagrangianFields option";
188 const bool doReconstructSets = !
args.
found(
"no-sets");
190 if (!doReconstructSets)
192 Info<<
"Skipping reconstructing cellSets, faceSets and pointSets"
196 const bool newTimes =
args.
found(
"newTimes");
207 <<
"No regions specified or detected."
210 else if (
regionNames[0] == polyMesh::defaultRegion)
227 <<
"No processor* directories found"
232 const_cast<fileOperation&
>(
fileHandler()).setNProcs(nProcs);
235 PtrList<Time> databases(nProcs);
244 Time::controlDictName,
255 databases[0].times(),
266 if (timeDirs.empty())
277 masterTimeDirs =
runTime.times();
279 wordHashSet masterTimeDirSet(2*masterTimeDirs.size());
280 for (
const instant& t : masterTimeDirs)
282 masterTimeDirSet.insert(t.name());
289 databases[proci].setTime(
runTime);
303 Info<<
"\n\nReconstructing fields" <<
nl
311 && haveAllTimes(masterTimeDirSet, timeDirs)
315 <<
" since already have all times"
334 processorMeshes procMeshes(databases,
regionName);
344 if (newTimes && masterTimeDirSet.found(timeDirs[timei].name()))
346 Info<<
"Skipping time " << timeDirs[timei].name()
353 runTime.setTime(timeDirs[timei], timei);
360 databases[proci].setTime(timeDirs[timei], timei);
364 fvMesh::readUpdateState meshStat =
mesh.readUpdate();
366 fvMesh::readUpdateState procStat = procMeshes.readUpdate();
368 if (procStat == fvMesh::POINTS_MOVED)
372 procMeshes.reconstructPoints(
mesh);
374 else if (meshStat != procStat)
377 <<
"readUpdate for the reconstructed mesh:"
379 <<
"readUpdate for the processor meshes :"
381 <<
"These should be equal or your addressing"
382 <<
" might be incorrect."
383 <<
" Please check your time directories for any "
384 <<
"mesh directories." <<
endl;
391 procMeshes.meshes()[0],
392 databases[0].timeName()
398 Info<<
"Reconstructing FV fields" <<
nl <<
endl;
400 fvFieldReconstructor reconstructor
404 procMeshes.faceProcAddressing(),
405 procMeshes.cellProcAddressing(),
406 procMeshes.boundaryProcAddressing()
409 reconstructor.reconstructFvVolumeInternalFields<scalar>
414 reconstructor.reconstructFvVolumeInternalFields<
vector>
424 reconstructor.reconstructFvVolumeInternalFields<
symmTensor>
429 reconstructor.reconstructFvVolumeInternalFields<
tensor>
435 reconstructor.reconstructFvVolumeFields<scalar>
440 reconstructor.reconstructFvVolumeFields<
vector>
450 reconstructor.reconstructFvVolumeFields<
symmTensor>
455 reconstructor.reconstructFvVolumeFields<
tensor>
461 reconstructor.reconstructFvSurfaceFields<scalar>
466 reconstructor.reconstructFvSurfaceFields<
vector>
476 reconstructor.reconstructFvSurfaceFields<
symmTensor>
481 reconstructor.reconstructFvSurfaceFields<
tensor>
487 if (reconstructor.nReconstructed() == 0)
495 Info<<
"Reconstructing point fields" <<
nl <<
endl;
498 PtrList<pointMesh> pMeshes(procMeshes.meshes().size());
505 new pointMesh(procMeshes.meshes()[proci])
509 pointFieldReconstructor reconstructor
513 procMeshes.pointProcAddressing(),
514 procMeshes.boundaryProcAddressing()
517 reconstructor.reconstructFields<scalar>
522 reconstructor.reconstructFields<
vector>
537 reconstructor.reconstructFields<
tensor>
543 if (reconstructor.nReconstructed() == 0)
559 HashTable<IOobjectList> allCloudObjects;
563 fileName lagrangianDir
567 databases[proci].timePath()
574 if (!lagrangianDir.empty())
583 for (
const fileName& cloudDir : cloudDirs)
587 if (!allCloudObjects.found(cloudDir))
590 IOobjectList localObjs
592 procMeshes.meshes()[proci],
593 databases[proci].timeName(),
594 cloud::prefix/cloudDir
599 localObjs.found(
"coordinates")
600 || localObjs.found(
"positions")
603 allCloudObjects.insert(cloudDir, localObjs);
610 if (allCloudObjects.size())
612 lagrangianReconstructor reconstructor
616 procMeshes.faceProcAddressing(),
617 procMeshes.cellProcAddressing()
626 const IOobjectList& cloudObjs = iter.val();
628 Info<<
"Reconstructing lagrangian fields for cloud "
631 reconstructor.reconstructPositions(
cloudName);
633 reconstructor.reconstructFields<label>
637 selectedLagrangianFields
639 reconstructor.reconstructFieldFields<label>
643 selectedLagrangianFields
646 reconstructor.reconstructFields<scalar>
650 selectedLagrangianFields
652 reconstructor.reconstructFieldFields<scalar>
656 selectedLagrangianFields
659 reconstructor.reconstructFields<
vector>
663 selectedLagrangianFields
665 reconstructor.reconstructFieldFields<
vector>
669 selectedLagrangianFields
676 selectedLagrangianFields
682 selectedLagrangianFields
689 selectedLagrangianFields
691 reconstructor.reconstructFieldFields<
symmTensor>
695 selectedLagrangianFields
698 reconstructor.reconstructFields<
tensor>
702 selectedLagrangianFields
704 reconstructor.reconstructFieldFields<
tensor>
708 selectedLagrangianFields
726 objects.lookupClass(areaScalarField::typeName).size()
727 || objects.lookupClass(areaVectorField::typeName).size()
728 || objects.lookupClass(areaSphericalTensorField::typeName).size()
729 || objects.lookupClass(areaSymmTensorField::typeName).size()
730 || objects.lookupClass(areaTensorField::typeName).size()
731 || objects.lookupClass(edgeScalarField::typeName).size()
734 Info <<
"Reconstructing FA fields" <<
nl <<
endl;
738 processorFaMeshes procFaMeshes(procMeshes.meshes());
740 faFieldReconstructor reconstructor
743 procFaMeshes.meshes(),
744 procFaMeshes.edgeProcAddressing(),
745 procFaMeshes.faceProcAddressing(),
746 procFaMeshes.boundaryProcAddressing()
749 reconstructor.reconstructFaAreaFields<scalar>(objects);
750 reconstructor.reconstructFaAreaFields<
vector>(objects);
752 reconstructor.reconstructFaAreaFields<
symmTensor>(objects);
753 reconstructor.reconstructFaAreaFields<
tensor>(objects);
755 reconstructor.reconstructFaEdgeFields<scalar>(objects);
762 if (doReconstructSets)
765 HashTable<label> cSetNames;
766 HashTable<label> fSetNames;
767 HashTable<label> pSetNames;
769 forAll(procMeshes.meshes(), proci)
771 const fvMesh& procMesh = procMeshes.meshes()[proci];
781 polyMesh::meshSubDir/
"sets"
784 IOobjectList cSets(objects.lookupClass(cellSet::typeName));
787 cSetNames.insert(iter.key(), cSetNames.size());
790 IOobjectList fSets(objects.lookupClass(faceSet::typeName));
793 fSetNames.insert(iter.key(), fSetNames.size());
795 IOobjectList pSets(objects.lookupClass(pointSet::typeName));
798 pSetNames.insert(iter.key(), pSetNames.size());
802 if (cSetNames.size() || fSetNames.size() || pSetNames.size())
805 PtrList<cellSet> cellSets(cSetNames.size());
806 PtrList<faceSet> faceSets(fSetNames.size());
807 PtrList<pointSet> pointSets(pSetNames.size());
809 Info<<
"Reconstructing sets:" <<
endl;
810 if (cSetNames.size())
813 << cSetNames.sortedToc() <<
endl;
815 if (fSetNames.size())
818 << fSetNames.sortedToc() <<
endl;
820 if (pSetNames.size())
823 << pSetNames.sortedToc() <<
endl;
827 forAll(procMeshes.meshes(), proci)
829 const fvMesh& procMesh = procMeshes.meshes()[proci];
835 polyMesh::meshSubDir/
"sets"
840 procMeshes.cellProcAddressing()[proci];
844 objects.lookupClass(cellSet::typeName)
850 const cellSet procSet(*iter());
851 label setI = cSetNames[iter.key()];
852 if (!cellSets.set(setI))
865 cellSet& cSet = cellSets[setI];
866 cSet.instance() =
runTime.timeName();
868 for (
const label celli : procSet)
870 cSet.insert(cellMap[celli]);
876 procMeshes.faceProcAddressing()[proci];
880 objects.lookupClass(faceSet::typeName)
886 const faceSet procSet(*iter());
887 label setI = fSetNames[iter.key()];
888 if (!faceSets.set(setI))
901 faceSet& fSet = faceSets[setI];
902 fSet.instance() =
runTime.timeName();
904 for (
const label facei : procSet)
911 procMeshes.pointProcAddressing()[proci];
915 objects.lookupClass(pointSet::typeName)
920 const pointSet propSet(*iter());
921 label setI = pSetNames[iter.key()];
922 if (!pointSets.set(setI))
935 pointSet& pSet = pointSets[setI];
936 pSet.instance() =
runTime.timeName();
938 for (
const label pointi : propSet)
940 pSet.insert(pointMap[pointi]);
947 for (
const auto&
set : cellSets)
951 for (
const auto&
set : faceSets)
955 for (
const auto&
set : pointSets)
964 PtrList<hexRef8Data> procData(procMeshes.meshes().size());
966 forAll(procMeshes.meshes(), procI)
968 const fvMesh& procMesh = procMeshes.meshes()[procI];
978 procMesh.time().timeName(),
979 polyMesh::meshSubDir,
981 IOobject::READ_IF_PRESENT,
991 const PtrList<labelIOList>& cellAddr =
992 procMeshes.cellProcAddressing();
994 UPtrList<const labelList> cellMaps(cellAddr.size());
997 cellMaps.set(i, &cellAddr[i]);
1000 const PtrList<labelIOList>& pointAddr =
1001 procMeshes.pointProcAddressing();
1003 UPtrList<const labelList> pointMaps(pointAddr.size());
1006 pointMaps.set(i, &pointAddr[i]);
1009 UPtrList<const hexRef8Data> procRefs(procData.size());
1012 procRefs.set(i, &procData[i]);
1020 mesh.time().timeName(),
1021 polyMesh::meshSubDir,
1037 PtrList<hexRef8Data> procData(procMeshes.meshes().size());
1039 forAll(procMeshes.meshes(), procI)
1041 const fvMesh& procMesh = procMeshes.meshes()[procI];
1051 procMesh.time().timeName(),
1052 polyMesh::meshSubDir,
1054 IOobject::READ_IF_PRESENT,
1064 const PtrList<labelIOList>& cellAddr =
1065 procMeshes.cellProcAddressing();
1067 UPtrList<const labelList> cellMaps(cellAddr.size());
1070 cellMaps.set(i, &cellAddr[i]);
1073 const PtrList<labelIOList>& pointAddr =
1074 procMeshes.pointProcAddressing();
1076 UPtrList<const labelList> pointMaps(pointAddr.size());
1079 pointMaps.set(i, &pointAddr[i]);
1082 UPtrList<const hexRef8Data> procRefs(procData.size());
1085 procRefs.set(i, &procData[i]);
1093 mesh.time().timeName(),
1094 polyMesh::meshSubDir,
1109 fileName uniformDir0
1113 databases[0].timePath()/
regionDir/
"uniform"
1125 if (regioni == 0 &&
regionDir != word::null)
1127 fileName uniformDir0
1131 databases[0].timePath()/
"uniform"