// Back from cpp-edge to patch-edge data forAll(patchEdges, i) { label patchEdgeI = patchEdges[i]; label coupledEdgeI = coupledEdges[i]; if (cppEdgeData[coupledEdgeI] != labelPair(labelMax, labelMax)) { const labelPair& data = cppEdgeData[coupledEdgeI]; if (sameEdgeOrientation[i] == cppOrientation[coupledEdgeI]) { allEdgeData[patchEdgeI] = data; } else { allEdgeData[patchEdgeI] = labelPair(data[1], data[0]); } if (!isChangedEdge[patchEdgeI]) { changedEdges.append(patchEdgeI); isChangedEdge[patchEdgeI] = true; } } }
void Foam::DelaunayMesh<Triangulation>::sortFaces ( faceList& faces, labelList& owner, labelList& neighbour ) const { // Upper triangular order: // + owner is sorted in ascending cell order // + within each block of equal value for owner, neighbour is sorted in // ascending cell order. // + faces sorted to correspond // e.g. // owner | neighbour // 0 | 2 // 0 | 23 // 0 | 71 // 1 | 23 // 1 | 24 // 1 | 91 List<labelPair> ownerNeighbourPair(owner.size()); forAll(ownerNeighbourPair, oNI) { ownerNeighbourPair[oNI] = labelPair(owner[oNI], neighbour[oNI]); }
LabelPair firstLexicalOutputLabelPairTpl(Arc const* a) const { StateIdContainer const& tails = a->tails_; for (StateIdContainer::const_iterator i = tails.begin(), e = tails.end(); i != e; ++i) { LabelPair const pair = labelPair(*i); if (output(pair).isLexical()) return pair; } return kNullLabelPair; }
// Synchronise edges void Foam::createShellMesh::syncEdges ( const globalMeshData& globalData, const labelList& patchEdges, const labelList& coupledEdges, const PackedBoolList& sameEdgeOrientation, const bool syncNonCollocated, PackedBoolList& isChangedEdge, DynamicList<label>& changedEdges, labelPairList& allEdgeData ) { const mapDistribute& map = globalData.globalEdgeSlavesMap(); const PackedBoolList& cppOrientation = globalData.globalEdgeOrientation(); // Convert patch-edge data into cpp-edge data labelPairList cppEdgeData ( map.constructSize(), labelPair(labelMax, labelMax) ); forAll(patchEdges, i) { label patchEdgeI = patchEdges[i]; label coupledEdgeI = coupledEdges[i]; if (isChangedEdge[patchEdgeI]) { const labelPair& data = allEdgeData[patchEdgeI]; // Patch-edge data needs to be converted into coupled-edge data // (optionally flipped) and consistent in orientation with // other coupled edge (optionally flipped) if (sameEdgeOrientation[i] == cppOrientation[coupledEdgeI]) { cppEdgeData[coupledEdgeI] = data; } else { cppEdgeData[coupledEdgeI] = labelPair(data[1], data[0]); } } }
void Foam::ParticleTracks<CloudType>::postFace(const parcelType& p) { if ( this->owner().solution().output() || this->owner().solution().transient() ) { if (!cloudPtr_.valid()) { cloudPtr_.reset ( this->owner().cloneBare(this->owner().name() + "Tracks").ptr() ); } hitTableType::iterator iter = faceHitCounter_.find(labelPair(p.origProc(), p.origId())); label localI = -1; if (iter != faceHitCounter_.end()) { iter()++; localI = iter(); } else { localI = 1; faceHitCounter_.insert(labelPair(p.origProc(), p.origId()), localI); } label nSamples = floor(localI/trackInterval_); if ((localI % trackInterval_ == 0) && (nSamples < maxSamples_)) { cloudPtr_->append ( static_cast<parcelType*>(p.clone(this->owner().mesh()).ptr()) ); } } }
void Foam::externalDisplacementMeshMover::updateMesh(const mapPolyMesh& mpm) { // Renumber baffles DynamicList<labelPair> newBaffles(baffles_.size()); forAll(baffles_, i) { label f0 = mpm.reverseFaceMap()[baffles_[i].first()]; label f1 = mpm.reverseFaceMap()[baffles_[i].second()]; if (f0 >= 0 && f1 >= 0) { newBaffles.append(labelPair(f0, f1)); } }
Foam::List<Foam::labelPair> Foam::mapDistribute::schedule ( const labelListList& subMap, const labelListList& constructMap ) { // Communications: send and receive processor List<labelPair> allComms; { HashSet<labelPair, labelPair::Hash<> > commsSet(Pstream::nProcs()); // Find what communication is required forAll(subMap, procI) { if (procI != Pstream::myProcNo()) { if (subMap[procI].size()) { // I need to send to procI commsSet.insert(labelPair(Pstream::myProcNo(), procI)); } if (constructMap[procI].size()) { // I need to receive from procI commsSet.insert(labelPair(procI, Pstream::myProcNo())); } } } allComms = commsSet.toc(); } // Reduce if (Pstream::master()) { // Receive and merge for ( int slave=Pstream::firstSlave(); slave<=Pstream::lastSlave(); slave++ ) { IPstream fromSlave(Pstream::scheduled, slave); List<labelPair> nbrData(fromSlave); forAll(nbrData, i) { if (findIndex(allComms, nbrData[i]) == -1) { label sz = allComms.size(); allComms.setSize(sz+1); allComms[sz] = nbrData[i]; } } } // Send back for ( int slave=Pstream::firstSlave(); slave<=Pstream::lastSlave(); slave++ ) { OPstream toSlave(Pstream::scheduled, slave); toSlave << allComms; } } else { {
/** non-special terminal (i.e. lexical) label on input or output */ virtual bool hasLexicalLabel(StateId state) const { LabelPair pair(labelPair(state)); return pair.first.isLexical() || pair.second.isLexical(); }
/// \return albelPair(state) but output will be NoSymbol if outputLabelFollowsInput(state) virtual LabelPair labelPairOptionalOutput(StateId state) const { return outputLabelFollowsInput() ? LabelPair(inputLabel(state), NoSymbol) : labelPair(state); }
Foam::processorGAMGInterface::processorGAMGInterface ( const label index, const lduInterfacePtrsList& coarseInterfaces, const lduInterface& fineInterface, const labelField& localRestrictAddressing, const labelField& neighbourRestrictAddressing, const label fineLevelIndex, const label coarseComm ) : GAMGInterface ( index, coarseInterfaces ), comm_(coarseComm), myProcNo_(refCast<const processorLduInterface>(fineInterface).myProcNo()), neighbProcNo_ ( refCast<const processorLduInterface>(fineInterface).neighbProcNo() ), forwardT_(refCast<const processorLduInterface>(fineInterface).forwardT()), tag_(refCast<const processorLduInterface>(fineInterface).tag()) { // From coarse face to coarse cell DynamicList<label> dynFaceCells(localRestrictAddressing.size()); // From fine face to coarse face DynamicList<label> dynFaceRestrictAddressing ( localRestrictAddressing.size() ); // From coarse cell pair to coarse face HashTable<label, labelPair, labelPair::Hash<> > cellsToCoarseFace ( 2*localRestrictAddressing.size() ); forAll(localRestrictAddressing, ffi) { labelPair cellPair; // Do switching on master/slave indexes based on the owner/neighbour of // the processor index such that both sides get the same answer. if (myProcNo() < neighbProcNo()) { // Master side cellPair = labelPair ( localRestrictAddressing[ffi], neighbourRestrictAddressing[ffi] ); } else { // Slave side cellPair = labelPair ( neighbourRestrictAddressing[ffi], localRestrictAddressing[ffi] ); } HashTable<label, labelPair, labelPair::Hash<> >::const_iterator fnd = cellsToCoarseFace.find(cellPair); if (fnd == cellsToCoarseFace.end()) { // New coarse face label coarseI = dynFaceCells.size(); dynFaceRestrictAddressing.append(coarseI); dynFaceCells.append(localRestrictAddressing[ffi]); cellsToCoarseFace.insert(cellPair, coarseI); } else { // Already have coarse face dynFaceRestrictAddressing.append(fnd()); } }