54 const HashSet<word>& masterTimeDirSet,
61 if (!masterTimeDirSet.found(
timeDirs[timeI].name()))
70 int main(
int argc,
char *argv[])
74 "Reconstruct fields of a parallel case"
79 timeSelector::addOptions(
true,
true);
80 argList::noParallel();
82 argList::addBoolOption
85 "operate on all regions in regionProperties"
91 "specify a list of fields to be reconstructed. Eg, '(U T p)' - "
92 "regular expressions not currently supported"
98 "specify a list of lagrangian fields to be reconstructed. Eg, '(U d)' -"
99 "regular expressions not currently supported, "
100 "positions always included."
102 argList::addBoolOption
105 "skip reconstructing lagrangian positions and fields"
107 argList::addBoolOption
110 "skip reconstructing cellSets, faceSets, pointSets"
112 argList::addBoolOption
115 "only reconstruct new times (i.e. that do not exist already)"
121 HashSet<word> selectedFields;
131 Info<<
"Skipping reconstructing lagrangian positions and fields"
138 if (noReconstructSets)
140 Info<<
"Skipping reconstructing cellSets, faceSets and pointSets"
145 HashSet<word> selectedLagrangianFields;
151 <<
"Cannot specify noLagrangian and lagrangianFields "
152 <<
"options together."
174 <<
"No processor* directories found"
179 PtrList<Time> databases(nProcs);
188 Time::controlDictName,
199 databases[0].times(),
213 <<
"No times selected"
222 masterTimeDirs = runTime.times();
224 HashSet<word> masterTimeDirSet(2*masterTimeDirs.size());
227 masterTimeDirSet.insert(masterTimeDirs[i].
name());
234 databases[procI].setTime(runTime);
242 Info<<
"Reconstructing for all regions in regionProperties" <<
nl
244 regionProperties rp(runTime);
250 if (
findIndex(regionNames, regions[i]) == -1)
252 regionNames.append(regions[i]);
256 regionDirs = regionNames;
264 regionDirs = regionNames;
268 regionNames =
wordList(1, fvMesh::defaultRegion);
269 regionDirs =
wordList(1, word::null);
274 forAll(regionNames, regionI)
276 const word&
regionName = regionNames[regionI];
277 const word& regionDir = regionDirs[regionI];
285 && regionNames.size() == 1
286 && regionDirs[0].empty()
291 <<
" since already have all times"
310 processorMeshes procMeshes(databases,
regionName);
315 #include "checkFaceAddressingComp.H"
320 if (newTimes && masterTimeDirSet.found(
timeDirs[timeI].name()))
329 runTime.setTime(
timeDirs[timeI], timeI);
336 databases[procI].setTime(
timeDirs[timeI], timeI);
340 fvMesh::readUpdateState meshStat =
mesh.readUpdate();
342 fvMesh::readUpdateState procStat = procMeshes.readUpdate();
344 if (procStat == fvMesh::POINTS_MOVED)
348 procMeshes.reconstructPoints(
mesh);
350 else if (meshStat != procStat)
353 <<
"readUpdate for the reconstructed mesh:"
355 <<
"readUpdate for the processor meshes :"
357 <<
"These should be equal or your addressing"
358 <<
" might be incorrect."
359 <<
" Please check your time directories for any "
360 <<
"mesh directories." <<
endl;
367 procMeshes.meshes()[0],
368 databases[0].timeName()
373 Info<<
"Reconstructing FV fields" <<
nl <<
endl;
375 fvFieldReconstructor fvReconstructor
379 procMeshes.faceProcAddressing(),
380 procMeshes.cellProcAddressing(),
381 procMeshes.boundaryProcAddressing()
384 fvReconstructor.reconstructFvVolumeInternalFields<scalar>
389 fvReconstructor.reconstructFvVolumeInternalFields<
vector>
394 fvReconstructor.reconstructFvVolumeInternalFields
400 fvReconstructor.reconstructFvVolumeInternalFields<
symmTensor>
405 fvReconstructor.reconstructFvVolumeInternalFields<
tensor>
411 fvReconstructor.reconstructFvVolumeFields<scalar>
416 fvReconstructor.reconstructFvVolumeFields<
vector>
426 fvReconstructor.reconstructFvVolumeFields<
symmTensor>
431 fvReconstructor.reconstructFvVolumeFields<
tensor>
437 fvReconstructor.reconstructFvSurfaceFields<scalar>
442 fvReconstructor.reconstructFvSurfaceFields<
vector>
452 fvReconstructor.reconstructFvSurfaceFields<
symmTensor>
457 fvReconstructor.reconstructFvSurfaceFields<
tensor>
463 if (fvReconstructor.nReconstructed() == 0)
470 Info<<
"Reconstructing point fields" <<
nl <<
endl;
473 PtrList<pointMesh> pMeshes(procMeshes.meshes().size());
480 new pointMesh(procMeshes.meshes()[procI])
484 pointFieldReconstructor pointReconstructor
488 procMeshes.pointProcAddressing(),
489 procMeshes.boundaryProcAddressing()
492 pointReconstructor.reconstructFields<scalar>
497 pointReconstructor.reconstructFields<
vector>
507 pointReconstructor.reconstructFields<
symmTensor>
512 pointReconstructor.reconstructFields<
tensor>
518 if (pointReconstructor.nReconstructed() == 0)
534 HashTable<IOobjectList> cloudObjects;
542 databases[procI].timePath()
553 HashTable<IOobjectList>::const_iterator iter =
554 cloudObjects.find(cloudDirs[i]);
556 if (iter == cloudObjects.end())
559 IOobjectList sprayObjs
561 procMeshes.meshes()[procI],
562 databases[procI].timeName(),
563 cloud::prefix/cloudDirs[i]
566 IOobject* positionsPtr =
567 sprayObjs.lookup(word(
"positions"));
571 cloudObjects.insert(cloudDirs[i], sprayObjs);
578 if (cloudObjects.size())
583 const word
cloudName = string::validate<word>
589 const IOobjectList& sprayObjs = iter();
591 Info<<
"Reconstructing lagrangian fields for cloud "
599 procMeshes.faceProcAddressing(),
600 procMeshes.cellProcAddressing()
602 reconstructLagrangianFields<label>
608 selectedLagrangianFields
610 reconstructLagrangianFieldFields<label>
616 selectedLagrangianFields
618 reconstructLagrangianFields<scalar>
624 selectedLagrangianFields
626 reconstructLagrangianFieldFields<scalar>
632 selectedLagrangianFields
634 reconstructLagrangianFields<vector>
640 selectedLagrangianFields
642 reconstructLagrangianFieldFields<vector>
648 selectedLagrangianFields
650 reconstructLagrangianFields<sphericalTensor>
656 selectedLagrangianFields
658 reconstructLagrangianFieldFields<sphericalTensor>
664 selectedLagrangianFields
666 reconstructLagrangianFields<symmTensor>
672 selectedLagrangianFields
674 reconstructLagrangianFieldFields<symmTensor>
680 selectedLagrangianFields
682 reconstructLagrangianFields<tensor>
688 selectedLagrangianFields
690 reconstructLagrangianFieldFields<tensor>
696 selectedLagrangianFields
707 if (!noReconstructSets)
710 HashTable<label> cSetNames;
711 HashTable<label> fSetNames;
712 HashTable<label> pSetNames;
714 forAll(procMeshes.meshes(), procI)
716 const fvMesh& procMesh = procMeshes.meshes()[procI];
726 polyMesh::meshSubDir/
"sets"
729 IOobjectList cSets(objects.lookupClass(cellSet::typeName));
732 cSetNames.insert(iter.key(), cSetNames.size());
735 IOobjectList fSets(objects.lookupClass(faceSet::typeName));
738 fSetNames.insert(iter.key(), fSetNames.size());
740 IOobjectList pSets(objects.lookupClass(pointSet::typeName));
743 pSetNames.insert(iter.key(), pSetNames.size());
748 PtrList<cellSet> cellSets(cSetNames.size());
749 PtrList<faceSet> faceSets(fSetNames.size());
750 PtrList<pointSet> pointSets(pSetNames.size());
752 Info<<
"Reconstructing sets:" <<
endl;
753 if (cSetNames.size())
755 Info<<
" cellSets " << cSetNames.sortedToc() <<
endl;
757 if (fSetNames.size())
759 Info<<
" faceSets " << fSetNames.sortedToc() <<
endl;
761 if (pSetNames.size())
763 Info<<
" pointSets " << pSetNames.sortedToc() <<
endl;
767 forAll(procMeshes.meshes(), procI)
769 const fvMesh& procMesh = procMeshes.meshes()[procI];
775 polyMesh::meshSubDir/
"sets"
780 procMeshes.cellProcAddressing()[procI];
782 IOobjectList cSets(objects.lookupClass(cellSet::typeName));
786 const cellSet procSet(*iter());
787 label setI = cSetNames[iter.key()];
788 if (!cellSets.set(setI))
793 new cellSet(
mesh, iter.key(), procSet.size())
796 cellSet& cSet = cellSets[setI];
797 cSet.instance() = runTime.timeName();
801 cSet.insert(cellMap[iter.key()]);
807 procMeshes.faceProcAddressing()[procI];
809 IOobjectList fSets(objects.lookupClass(faceSet::typeName));
813 const faceSet procSet(*iter());
814 label setI = fSetNames[iter.key()];
815 if (!faceSets.set(setI))
820 new faceSet(
mesh, iter.key(), procSet.size())
823 faceSet& fSet = faceSets[setI];
824 fSet.instance() = runTime.timeName();
833 procMeshes.pointProcAddressing()[procI];
835 IOobjectList pSets(objects.lookupClass(pointSet::typeName));
839 const pointSet propSet(*iter());
840 label setI = pSetNames[iter.key()];
841 if (!pointSets.set(setI))
846 new pointSet(
mesh, iter.key(), propSet.size())
849 pointSet& pSet = pointSets[setI];
850 pSet.instance() = runTime.timeName();
854 pSet.insert(pointMap[iter.key()]);
870 pointSets[i].write();
877 PtrList<hexRef8Data> procData(procMeshes.meshes().size());
879 forAll(procMeshes.meshes(), procI)
881 const fvMesh& procMesh = procMeshes.meshes()[procI];
891 procMesh.time().timeName(),
892 polyMesh::meshSubDir,
894 IOobject::READ_IF_PRESENT,
904 const PtrList<labelIOList>& cellAddr =
905 procMeshes.cellProcAddressing();
907 UPtrList<const labelList> cellMaps(cellAddr.size());
910 cellMaps.set(i, &cellAddr[i]);
913 const PtrList<labelIOList>& pointAddr =
914 procMeshes.pointProcAddressing();
916 UPtrList<const labelList> pointMaps(pointAddr.size());
919 pointMaps.set(i, &pointAddr[i]);
922 UPtrList<const hexRef8Data> procRefs(procData.size());
925 procRefs.set(i, &procData[i]);
933 mesh.time().timeName(),
934 polyMesh::meshSubDir,
952 runTime.setTime(
timeDirs[timeI], timeI);
953 databases[0].setTime(
timeDirs[timeI], timeI);
955 fileName uniformDir0 = databases[0].timePath()/
"uniform";
956 if (
isDir(uniformDir0))
958 cp(uniformDir0, runTime.timePath());