33 void Foam::meshToMesh0::calculateInverseDistanceWeights()
const
38 <<
"Calculating inverse distance weighting factors" <<
endl;
41 if (inverseDistanceWeightsPtr_)
44 <<
"weighting factors already calculated"
59 forAll(cellAddressing_, celli)
61 if (cellAddressing_[celli] != -1)
63 const vector& target = centreTo[celli];
64 scalar m =
mag(target - centreFrom[cellAddressing_[celli]]);
66 const labelList& neighbours = cc[cellAddressing_[celli]];
70 label directCelli = -1;
71 if (m < directHitTol || neighbours.empty())
79 scalar nm =
mag(target - centreFrom[neighbours[ni]]);
80 if (nm < directHitTol)
82 directCelli = neighbours[ni];
89 if (directCelli != -1)
92 invDistCoeffs[directCelli].setSize(1);
93 invDistCoeffs[directCelli][0] = 1.0;
94 V_ += fromMesh_.
V()[cellAddressing_[directCelli]];
98 invDistCoeffs[celli].setSize(neighbours.size() + 1);
102 scalar invDist = 1.0/m;
103 invDistCoeffs[celli][0] = invDist;
104 scalar sumInvDist = invDist;
109 invDist = 1.0/
mag(target - centreFrom[neighbours[ni]]);
110 invDistCoeffs[celli][ni + 1] = invDist;
111 sumInvDist += invDist;
115 forAll(invDistCoeffs[celli], i)
117 invDistCoeffs[celli][i] /= sumInvDist;
122 invDistCoeffs[celli][0]
123 *fromMesh_.
V()[cellAddressing_[celli]];
124 for (
label i = 1; i < invDistCoeffs[celli].size(); i++)
127 invDistCoeffs[celli][i]*fromMesh_.
V()[neighbours[i-1]];
135 void Foam::meshToMesh0::calculateInverseVolumeWeights()
const
140 <<
"Calculating inverse volume weighting factors" <<
endl;
143 if (inverseVolumeWeightsPtr_)
146 <<
"weighting factors already calculated"
158 tetOverlapVolume overlapEngine;
162 const labelList& overlapCells = cellToCell[celli];
164 if (overlapCells.size() > 0)
166 invVolCoeffs[celli].
setSize(overlapCells.size());
170 label cellFrom = overlapCells[j];
171 treeBoundBox bbFromMesh
176 fromMesh_.cellPoints()[cellFrom]
180 scalar v = overlapEngine.cellCellOverlapVolumeMinDecomp
189 invVolCoeffs[celli][j] = v/toMesh_.V()[celli];
198 void Foam::meshToMesh0::calculateCellToCellAddressing()
const
203 <<
"Calculating cell to cell addressing" <<
endl;
206 if (cellToCellAddressingPtr_)
209 <<
"addressing already calculated"
216 tetOverlapVolume overlapEngine;
218 cellToCellAddressingPtr_ =
new labelListList(toMesh_.nCells());
225 overlapEngine.overlappingCells(fromMesh_, toMesh_, iTo);
226 if (overLapCells.size() > 0)
228 cellToCell[iTo].
setSize(overLapCells.size());
231 cellToCell[iTo][j] = overLapCells[j];
232 V_ += fromMesh_.V()[overLapCells[j]];
242 if (!inverseDistanceWeightsPtr_)
244 calculateInverseDistanceWeights();
247 return *inverseDistanceWeightsPtr_;
253 if (!inverseVolumeWeightsPtr_)
255 calculateInverseVolumeWeights();
258 return *inverseVolumeWeightsPtr_;
264 if (!cellToCellAddressingPtr_)
266 calculateCellToCellAddressing();
269 return *cellToCellAddressingPtr_;