void Foam::mapNearestMethod::calculateAddressing ( labelListList& srcToTgtCellAddr, scalarListList& srcToTgtCellWght, labelListList& tgtToSrcCellAddr, scalarListList& tgtToSrcCellWght, const label srcSeedI, const label tgtSeedI, const labelList& srcCellIDs, boolList& mapFlag, label& startSeedI ) { List<DynamicList<label>> srcToTgt(src_.nCells()); List<DynamicList<label>> tgtToSrc(tgt_.nCells()); const scalarField& srcVc = src_.cellVolumes(); const scalarField& tgtVc = tgt_.cellVolumes(); { label srcCelli = srcSeedI; label tgtCelli = tgtSeedI; do { // find nearest tgt cell findNearestCell(src_, tgt_, srcCelli, tgtCelli); // store src/tgt cell pair srcToTgt[srcCelli].append(tgtCelli); tgtToSrc[tgtCelli].append(srcCelli); // mark source cell srcCelli and tgtCelli as matched mapFlag[srcCelli] = false; // accumulate intersection volume V_ += srcVc[srcCelli]; // find new source cell setNextNearestCells ( startSeedI, srcCelli, tgtCelli, mapFlag, srcCellIDs ); } while (srcCelli >= 0); } // for the case of multiple source cells per target cell, select the // nearest source cell only and discard the others const vectorField& srcCc = src_.cellCentres(); const vectorField& tgtCc = tgt_.cellCentres(); forAll(tgtToSrc, targetCelli) { if (tgtToSrc[targetCelli].size() > 1) { const vector& tgtC = tgtCc[targetCelli]; DynamicList<label>& srcCells = tgtToSrc[targetCelli]; label srcCelli = srcCells[0]; scalar d = magSqr(tgtC - srcCc[srcCelli]); for (label i = 1; i < srcCells.size(); i++) { label srcI = srcCells[i]; scalar dNew = magSqr(tgtC - srcCc[srcI]); if (dNew < d) { d = dNew; srcCelli = srcI; } } srcCells.clear(); srcCells.append(srcCelli); } } // If there are more target cells than source cells, some target cells // might not yet be mapped forAll(tgtToSrc, tgtCelli) { if (tgtToSrc[tgtCelli].empty()) { label srcCelli = findMappedSrcCell(tgtCelli, tgtToSrc); findNearestCell(tgt_, src_, tgtCelli, srcCelli); tgtToSrc[tgtCelli].append(srcCelli); } } // transfer addressing into persistent storage forAll(srcToTgtCellAddr, i) { srcToTgtCellWght[i] = scalarList(srcToTgt[i].size(), srcVc[i]); srcToTgtCellAddr[i].transfer(srcToTgt[i]); }
fz[2] = new faceZone ( "cutFaceZone", labelList(0), boolList(0, false), 2, faceZones() ); List<cellZone*> cz(1); // Mark every cell with its topological region regionSplit rs(*this); // Get the region of the cell containing the origin. label originRegion = rs[findNearestCell(rotatingRegionMarker_)]; labelList movingCells(nCells()); label nMovingCells = 0; forAll(rs, cellI) { if (rs[cellI] == originRegion) { movingCells[nMovingCells] = cellI; nMovingCells++; } } movingCells.setSize(nMovingCells); Info << "Number of cells in the moving region: " << nMovingCells << endl;