32 template<
class Triangulation,
class Type>
35 const Triangulation&
mesh,
36 const Field<Type>&
field
39 tmp<Field<Type>> tNewField(
new Field<Type>(
field.size()));
40 Field<Type>& newField = tNewField.ref();
47 typename Triangulation::Finite_vertices_iterator vit =
48 mesh.finite_vertices_begin();
49 vit !=
mesh.finite_vertices_end();
61 newField.resize(added);
67 template<
class Triangulation>
70 const Triangulation&
mesh,
74 globalIndex globalIndexing(
mesh.vertexCount());
76 DynamicList<label> dynIndices(
mesh.vertexCount()/10);
80 typename Triangulation::Finite_vertices_iterator vit =
81 mesh.finite_vertices_begin();
82 vit !=
mesh.finite_vertices_end();
90 globalIndexing.toGlobal(vit->procIndex(), vit->index())
95 indices.transfer(dynIndices);
97 List<Map<label>> compactMap;
107 template<
class Triangulation>
110 const Triangulation&
mesh,
114 pointPoints.setSize(
mesh.vertexCount());
116 globalIndex globalIndexing(
mesh.vertexCount());
120 typename Triangulation::Finite_vertices_iterator vit =
121 mesh.finite_vertices_begin();
122 vit !=
mesh.finite_vertices_end();
131 std::list<typename Triangulation::Vertex_handle> adjVerts;
132 mesh.finite_adjacent_vertices(vit, std::back_inserter(adjVerts));
134 DynamicList<label> indices(adjVerts.size());
138 typename std::list<typename Triangulation::Vertex_handle>::
139 const_iterator adjVertI = adjVerts.begin();
140 adjVertI != adjVerts.end();
144 typename Triangulation::Vertex_handle vh = *adjVertI;
150 globalIndexing.toGlobal(vh->procIndex(), vh->index())
155 pointPoints[vit->index()].transfer(indices);
158 List<Map<label>> compactMap;
168 template<
class Triangulation>
171 const Triangulation&
mesh
174 tmp<triadField> tAlignments
182 typename Triangulation::Finite_vertices_iterator vit =
183 mesh.finite_vertices_begin();
184 vit !=
mesh.finite_vertices_end();
193 alignments[vit->index()] = vit->alignment();
200 template<
class Triangulation>
203 const Triangulation&
mesh
206 tmp<pointField> tPoints
214 typename Triangulation::Finite_vertices_iterator vit =
215 mesh.finite_vertices_begin();
216 vit !=
mesh.finite_vertices_end();
232 void Foam::smoothAlignmentSolver::applyBoundaryConditions
234 const triad& fixedAlignment,
240 forAll(fixedAlignment, dirI)
242 if (fixedAlignment.set(dirI))
250 forAll(fixedAlignment, dirI)
252 if (fixedAlignment.set(dirI))
254 t.align(fixedAlignment[dirI]);
258 else if (nFixed == 2)
260 forAll(fixedAlignment, dirI)
262 if (fixedAlignment.set(dirI))
264 t[dirI] = fixedAlignment[dirI];
274 else if (nFixed == 3)
276 forAll(fixedAlignment, dirI)
278 if (fixedAlignment.set(dirI))
280 t[dirI] = fixedAlignment[dirI];
289 Foam::smoothAlignmentSolver::smoothAlignmentSolver(cellShapeControlMesh&
mesh)
305 const label maxSmoothingIterations
308 scalar minResidual = 0;
311 autoPtr<mapDistribute> meshDistributor = buildMap
317 triadField alignments(buildAlignmentField(mesh_));
325 CellSizeDelaunay::Finite_vertices_iterator vit =
326 mesh_.finite_vertices_begin();
327 vit != mesh_.finite_vertices_end();
333 fixedAlignments[vit->index()] = vit->alignment();
340 for (label iter = 0; iter < maxSmoothingIterations; iter++)
342 Info<<
"Iteration " << iter;
344 meshDistributor().distribute(
points);
345 meshDistributor().distribute(fixedAlignments);
346 meshDistributor().distribute(alignments);
354 const labelList& pPoints = pointPoints[pI];
361 triad& newTriad = triadAv[pI];
363 forAll(pPoints, adjPointi)
365 const label adjPointIndex = pPoints[adjPointi];
369 triad tmpTriad = alignments[adjPointIndex];
373 if (tmpTriad.set(dir))
375 tmpTriad[dir] *= 1.0/(dist + SMALL);
379 newTriad += tmpTriad;
386 const triad& oldTriad = alignments[pI];
387 triad& newTriad = triadAv[pI];
389 newTriad.normalize();
390 newTriad.orthogonalize();
393 const triad& fixedAlignment = fixedAlignments[pI];
395 applyBoundaryConditions
401 newTriad = newTriad.sortxyz();
410 && !fixedAlignment.set(dir)
413 residual +=
diff(oldTriad, newTriad);
417 alignments[pI] = newTriad;
420 reduce(residual, sumOp<scalar>());
422 Info<<
", Residual = "
427 if (iter > 0 && residual <= minResidual)
433 meshDistributor().distribute(alignments);
437 CellSizeDelaunay::Finite_vertices_iterator vit =
438 mesh_.finite_vertices_begin();
439 vit != mesh_.finite_vertices_end();
445 vit->alignment() = alignments[vit->index()];
450 autoPtr<mapDistribute> referredDistributor = buildReferredMap
456 alignments.setSize(mesh_.vertexCount());
457 referredDistributor().distribute(alignments);
462 CellSizeDelaunay::Finite_vertices_iterator vit =
463 mesh_.finite_vertices_begin();
464 vit != mesh_.finite_vertices_end();
470 vit->alignment() = alignments[referredPoints[referredI++]];