39 template<
class ZoneType,
class MeshType>
49 template<
class ZoneType,
class MeshType>
55 <<
"zone map already calculated"
63 const PtrList<ZoneType>& zones = *
this;
65 for (
const ZoneType& zn : zones)
67 nObjects += zn.size();
70 zoneMapPtr_.reset(
new Map<label>(2*nObjects));
71 auto& zm = *zoneMapPtr_;
78 for (
const ZoneType& zn : zones)
82 for (
const label idx : labels)
84 zm.insert(idx, zonei);
93 template<
class ZoneType,
class MeshType>
99 return !groupIDsPtr_->empty();
102 const PtrList<ZoneType>& zones = *
this;
104 for (
const ZoneType& zn : zones)
106 if (!zn.inGroups().empty())
116 template<
class ZoneType,
class MeshType>
124 groupIDsPtr_.reset(
new HashTable<labelList>(16));
125 auto& groupLookup = *groupIDsPtr_;
127 const PtrList<ZoneType>& zones = *
this;
131 const wordList& groups = zones[zonei].inGroups();
133 for (
const word& groupName : groups)
135 groupLookup(groupName).
append(zonei);
142 if (groupLookup.erase(zones[zonei].name()))
145 <<
"Removed group '" << zones[zonei].name()
146 <<
"' which clashes with zone " << zonei
147 <<
" of the same name."
154 template<
class ZoneType,
class MeshType>
159 readOpt() == IOobject::MUST_READ
160 || readOpt() == IOobject::MUST_READ_IF_MODIFIED
161 || (readOpt() == IOobject::READ_IF_PRESENT && headerOk())
165 warnNoRereading<ZoneMesh<ZoneType, MeshType>>();
167 PtrList<ZoneType>& zones = *
this;
170 Istream& is = readStream(typeName);
172 PtrList<entry> patchEntries(is);
173 zones.resize(patchEntries.size());
182 patchEntries[zonei].keyword(),
183 patchEntries[zonei].
dict(),
205 template<
class ZoneType,
class MeshType>
220 template<
class ZoneType,
class MeshType>
224 const MeshType&
mesh,
237 template<
class ZoneType,
class MeshType>
241 const MeshType&
mesh,
257 zones.
set(zonei, pzm[zonei].clone(*this).ptr());
265 template<
class ZoneType,
class MeshType>
274 template<
class ZoneType,
class MeshType>
287 template<
class ZoneType,
class MeshType>
290 const label objectIndex
293 return zoneMap().lookup(objectIndex, -1);
297 template<
class ZoneType,
class MeshType>
304 template<
class ZoneType,
class MeshType>
311 template<
class ZoneType,
class MeshType>
321 template<
class ZoneType,
class MeshType>
332 template<
class ZoneType,
class MeshType>
342 template<
class ZoneType,
class MeshType>
355 template<
class ZoneType,
class MeshType>
369 template<
class ZoneType,
class MeshType>
372 const wordRe& matcher,
382 const bool checkGroups = (useGroups && this->hasGroupIDs());
388 ids.resize(2*this->size());
391 if (matcher.isPattern())
395 const auto& groupLookup = groupZoneIDs();
398 if (matcher.match(iter.key()))
401 ids.insert(iter.val());
426 else if (checkGroups)
428 const auto iter = groupZoneIDs().cfind(matcher);
433 ids.insert(iter.val());
438 return ids.sortedToc();
442 template<
class ZoneType,
class MeshType>
445 const wordRes& matcher,
453 else if (matcher.size() == 1)
455 return this->indices(matcher.first(), useGroups);
461 if (useGroups && this->hasGroupIDs())
463 ids.resize(2*this->size());
465 const auto& groupLookup = groupZoneIDs();
468 if (matcher.match(iter.key()))
471 ids.insert(iter.val());
485 return ids.sortedToc();
489 template<
class ZoneType,
class MeshType>
503 template<
class ZoneType,
class MeshType>
506 const wordRes& matcher
517 template<
class ZoneType,
class MeshType>
523 if (zoneName.empty())
533 <<
"Zone named " << zoneName <<
" not found. "
534 <<
"List of available zone names: " <<
names() <<
endl;
537 if (disallowGenericZones != 0)
539 auto& zm =
const_cast<ZoneMesh<ZoneType, MeshType>&
>(*this);
542 Info<<
"Creating dummy zone " << zoneName <<
endl;
543 zm.append(
new ZoneType(zoneName, zoneId, zm));
551 template<
class ZoneType,
class MeshType>
557 if (zoneName.empty())
562 const PtrList<ZoneType>& zones = *
this;
564 for (
auto iter = zones.begin(); iter != zones.end(); ++iter)
566 const ZoneType* ptr = iter.get();
568 if (ptr && zoneName == ptr->name())
575 if (disallowGenericZones != 0)
577 auto& zm =
const_cast<ZoneMesh<ZoneType, MeshType>&
>(*this);
579 Info<<
"Creating dummy zone " << zoneName <<
endl;
580 zm.append(
new ZoneType(zoneName, zm.size(), zm));
587 template<
class ZoneType,
class MeshType>
593 return const_cast<ZoneType*
>(this->cfindZone(zoneName));
597 template<
class ZoneType,
class MeshType>
605 for (
const label zonei : zoneIds)
608 if (zonei < 0 || zonei >= this->size())
611 << ZoneType::typeName <<
" "
612 << zonei <<
" out of range [0," << this->size() <<
")"
619 static_cast<const labelList&
>(this->
operator[](zonei))
627 template<
class ZoneType,
class MeshType>
630 const wordRe& matcher,
635 return this->selection(this->indices(matcher, useGroups));
639 template<
class ZoneType,
class MeshType>
642 const wordRes& matcher,
647 return this->selection(this->indices(matcher, useGroups));
651 template<
class ZoneType,
class MeshType>
660 return *groupIDsPtr_;
664 template<
class ZoneType,
class MeshType>
667 const word& groupName,
671 groupIDsPtr_.clear();
675 boolList doneZone(zones.size(),
false);
678 for (
const label zonei :
zoneIDs)
680 zones[zonei].inGroups().appendUniq(groupName);
681 doneZone[zonei] =
true;
687 if (!doneZone[zonei])
689 wordList& groups = zones[zonei].inGroups();
691 if (groups.found(groupName))
696 if (groups[i] != groupName)
698 groups[newi++] = groups[i];
708 template<
class ZoneType,
class MeshType>
712 groupIDsPtr_.clear();
714 PtrList<ZoneType>& zones = *
this;
716 for (ZoneType& zn : zones)
718 zn.clearAddressing();
723 template<
class ZoneType,
class MeshType>
731 template<
class ZoneType,
class MeshType>
737 bool hasError =
false;
741 for (
const ZoneType& zn : zones)
743 hasError |= zn.checkDefinition(report);
750 template<
class ZoneType,
class MeshType>
756 if (!Pstream::parRun())
761 const PtrList<ZoneType>& zones = *
this;
763 bool hasError =
false;
766 List<wordList> allNames(Pstream::nProcs());
767 allNames[Pstream::myProcNo()] = this->
names();
768 Pstream::gatherList(allNames);
769 Pstream::scatterList(allNames);
771 List<wordList> allTypes(Pstream::nProcs());
772 allTypes[Pstream::myProcNo()] = this->types();
773 Pstream::gatherList(allTypes);
774 Pstream::scatterList(allTypes);
778 for (label proci = 1; proci < allNames.size(); ++proci)
782 (allNames[proci] != allNames[0])
783 || (allTypes[proci] != allTypes[0])
788 if (
debug || (report && Pstream::master()))
790 Info<<
" ***Inconsistent zones across processors, "
791 "processor 0 has zone names:" << allNames[0]
792 <<
" zone types:" << allTypes[0]
793 <<
" processor " << proci <<
" has zone names:"
795 <<
" zone types:" << allTypes[proci]
804 for (
const ZoneType& zn : zones)
806 if (zn.checkParallelSync(
false))
810 if (
debug || (report && Pstream::master()))
812 Info<<
" ***Zone " << zn.name()
813 <<
" of type " << zn.type()
814 <<
" is not correctly synchronised"
815 <<
" across coupled boundaries."
816 <<
" (coupled faces are either not both"
817 <<
" present in set or have same flipmap)" <<
endl;
827 template<
class ZoneType,
class MeshType>
830 PtrList<ZoneType>& zones = *
this;
832 for (ZoneType& zn : zones)
839 template<
class ZoneType,
class MeshType>
843 if (zoneNames.empty())
845 this->removeMetaData();
850 meta.
set(
"names", zoneNames);
855 template<
class ZoneType,
class MeshType>
865 template<
class ZoneType,
class MeshType>
871 const label zonei = findZoneID(zoneName);
876 <<
"Zone named " << zoneName <<
" not found." <<
nl
877 <<
"Available zone names: " <<
names() <<
endl
881 return operator[](zonei);
885 template<
class ZoneType,
class MeshType>
891 const label zonei = findZoneID(zoneName);
896 <<
"Zone named " << zoneName <<
" not found." <<
nl
897 <<
"Available zone names: " <<
names() <<
endl
901 return operator[](zonei);
905 template<
class ZoneType,
class MeshType>
908 const word& zoneName,
912 ZoneType* ptr = findZone(zoneName);
914 const bool existing =
bool(ptr);
918 ptr =
new ZoneType(zoneName, this->size(), *
this);
924 Info<< ZoneType::typeName <<
' ' << zoneName
925 <<
" (" << (existing ?
"existing" :
"new")
926 <<
" at index " << ptr->index() <<
')'
936 template<
class ZoneType,
class MeshType>
940 const ZoneMesh<ZoneType, MeshType>& zones
943 const label sz = zones.size();
947 os << sz <<
nl << token::BEGIN_LIST;
949 for (label i=0; i < sz; ++i)
951 zones[i].writeDict(
os);
954 os << token::END_LIST;
958 os << sz << token::BEGIN_LIST << token::END_LIST;