46 displacementInterpolationMotionSolver,
52 displacementMotionSolver,
53 displacementInterpolationMotionSolver,
58 const word GlobalIOList<Tuple2<scalar, vector>>::typeName
67 void Foam::displacementInterpolationMotionSolver::calcInterpolation()
72 List<Pair<word>> faceZoneToTable
80 displacements_.
setSize(fZones.size());
84 const word& zoneName = faceZoneToTable[i][0];
85 label zoneI = fZones.findZoneID(zoneName);
90 <<
"Cannot find zone " << zoneName <<
endl
91 <<
"Valid zones are " << fZones.names()
95 const word& tableName = faceZoneToTable[i][1];
97 GlobalIOList<Tuple2<scalar, vector>> table
112 times_[zoneI].
setSize(table.size());
113 displacements_[zoneI].
setSize(table.size());
117 times_[zoneI][j] = table[j].first();
118 displacements_[zoneI][j] = table[j].second();
131 SortableList<scalar> zoneCoordinates(2*faceZoneToTable.size());
133 forAll(faceZoneToTable, i)
135 const word& zoneName = faceZoneToTable[i][0];
136 const faceZone& fz = fZones[zoneName];
138 scalar minCoord = VGREAT;
139 scalar maxCoord = -VGREAT;
141 forAll(fz().meshPoints(), localI)
143 label pointi = fz().meshPoints()[localI];
144 const scalar coord =
points0()[pointi][dir];
145 minCoord =
min(minCoord, coord);
146 maxCoord =
max(maxCoord, coord);
149 zoneCoordinates[2*i] =
returnReduce(minCoord, minOp<scalar>());
150 zoneCoordinates[2*i+1] =
returnReduce(maxCoord, maxOp<scalar>());
154 Pout<<
"direction " << dir <<
" : "
155 <<
"zone " << zoneName
156 <<
" ranges from coordinate " << zoneCoordinates[2*i]
157 <<
" to " << zoneCoordinates[2*i+1]
161 zoneCoordinates.sort();
164 zoneCoordinates[0] -= SMALL;
165 zoneCoordinates.last() += SMALL;
170 scalar minCoord =
gMin(meshCoords);
171 scalar maxCoord =
gMax(meshCoords);
175 Pout<<
"direction " << dir <<
" : "
176 <<
"mesh ranges from coordinate " << minCoord <<
" to "
184 labelList& rangeZone = rangeToZone_[dir];
186 List<scalarField>& rangeWeights = rangeToWeights_[dir];
189 rangeZone.setSize(zoneCoordinates.size());
192 if (minCoord < zoneCoordinates[0])
194 label sz = rangeZone.size();
195 rangeToCoord.setSize(sz+1);
196 rangeZone.setSize(sz+1);
197 rangeToCoord[rangeI] = minCoord-SMALL;
198 rangeZone[rangeI] = -1;
202 Pout<<
"direction " << dir <<
" : "
203 <<
"range " << rangeI <<
" at coordinate "
204 << rangeToCoord[rangeI] <<
" from min of mesh "
205 << rangeZone[rangeI] <<
endl;
209 forAll(zoneCoordinates, i)
211 rangeToCoord[rangeI] = zoneCoordinates[i];
212 rangeZone[rangeI] = zoneCoordinates.indices()[i]/2;
216 Pout<<
"direction " << dir <<
" : "
217 <<
"range " << rangeI <<
" at coordinate "
218 << rangeToCoord[rangeI]
219 <<
" from zone " << rangeZone[rangeI] <<
endl;
223 if (maxCoord > zoneCoordinates.last())
225 label sz = rangeToCoord.size();
226 rangeToCoord.setSize(sz+1);
227 rangeZone.setSize(sz+1);
228 rangeToCoord[sz] = maxCoord+SMALL;
233 Pout<<
"direction " << dir <<
" : "
234 <<
"range " << rangeI <<
" at coordinate "
235 << rangeToCoord[sz] <<
" from max of mesh "
236 << rangeZone[sz] <<
endl;
247 forAll(meshCoords, pointi)
249 label rangeI =
findLower(rangeToCoord, meshCoords[pointi]);
251 if (rangeI == -1 || rangeI == rangeToCoord.size()-1)
254 <<
"Did not find point " <<
points0()[pointi]
255 <<
" coordinate " << meshCoords[pointi]
256 <<
" in ranges " << rangeToCoord
259 nRangePoints[rangeI]++;
264 for (label rangeI = 0; rangeI < rangeToCoord.size()-1; rangeI++)
267 Pout<<
"direction " << dir <<
" : "
268 <<
"range from " << rangeToCoord[rangeI]
269 <<
" to " << rangeToCoord[rangeI+1]
270 <<
" contains " << nRangePoints[rangeI]
271 <<
" points." <<
endl;
276 rangePoints.setSize(nRangePoints.size());
277 rangeWeights.setSize(nRangePoints.size());
278 forAll(rangePoints, rangeI)
280 rangePoints[rangeI].setSize(nRangePoints[rangeI]);
281 rangeWeights[rangeI].setSize(nRangePoints[rangeI]);
284 forAll(meshCoords, pointi)
286 label rangeI =
findLower(rangeToCoord, meshCoords[pointi]);
287 label&
nPoints = nRangePoints[rangeI];
288 rangePoints[rangeI][
nPoints] = pointi;
289 rangeWeights[rangeI][
nPoints] =
290 (meshCoords[pointi]-rangeToCoord[rangeI])
291 / (rangeToCoord[rangeI+1]-rangeToCoord[rangeI]);
300 Foam::displacementInterpolationMotionSolver::
301 displacementInterpolationMotionSolver
313 Foam::displacementInterpolationMotionSolver::
314 displacementInterpolationMotionSolver
336 <<
"The number of points in the mesh seems to have changed." <<
endl
337 <<
"In constant/polyMesh there are " <<
points0().size()
338 <<
" points; in the current mesh there are " <<
mesh().
nPoints()
349 if (times_[zoneI].size())
353 mesh().time().value(),
355 displacements_[zoneI]
361 Pout<<
"Zone displacements:" << zoneDisp <<
endl;
368 const labelList& rangeZone = rangeToZone_[dir];
372 for (label rangeI = 0; rangeI < rangeZone.size()-1; rangeI++)
374 const labelList& rPoints = rangePoints[rangeI];
375 const scalarField& rWeights = rangeWeights[rangeI];
378 label minZoneI = rangeZone[rangeI];
381 scalar minDisp = (minZoneI == -1 ? 0.0 : zoneDisp[minZoneI][dir]);
382 label maxZoneI = rangeZone[rangeI+1];
385 scalar maxDisp = (maxZoneI == -1 ? 0.0 : zoneDisp[maxZoneI][dir]);
389 label pointi = rPoints[i];
390 scalar w = rWeights[i];
392 curPoints[pointi][dir] += (1.0-w)*minDisp+w*maxDisp;