void Foam::cellShapeControlMesh::distribute ( const backgroundMeshDecomposition& decomposition ) { DynamicList<Foam::point> points(number_of_vertices()); DynamicList<scalar> sizes(number_of_vertices()); DynamicList<tensor> alignments(number_of_vertices()); DynamicList<Vb> farPts(8); for ( Finite_vertices_iterator vit = finite_vertices_begin(); vit != finite_vertices_end(); ++vit ) { if (vit->real()) { points.append(topoint(vit->point())); sizes.append(vit->targetCellSize()); alignments.append(vit->alignment()); } else if (vit->farPoint()) { farPts.append ( Vb ( vit->point(), -1, Vb::vtFar, Pstream::myProcNo() ) ); farPts.last().targetCellSize() = vit->targetCellSize(); farPts.last().alignment() = vit->alignment(); } } autoPtr<mapDistribute> mapDist = DistributedDelaunayMesh<CellSizeDelaunay>::distribute ( decomposition, points ); mapDist().distribute(sizes); mapDist().distribute(alignments); // Reset the entire tessellation DelaunayMesh<CellSizeDelaunay>::reset(); // Internal points have to be inserted first DynamicList<Vb> verticesToInsert(points.size()); forAll(farPts, ptI) { verticesToInsert.append(farPts[ptI]); }
Foam::cellShapeControlMesh::cellShapeControlMesh(const Time& runTime) : DistributedDelaunayMesh<CellSizeDelaunay> ( runTime, meshSubDir ), runTime_(runTime), defaultCellSize_(0.0) { if (this->vertexCount()) { fvMesh mesh ( IOobject ( meshSubDir, runTime.timeName(), runTime, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE ) ); if (mesh.nPoints() == this->vertexCount()) { pointScalarField sizes ( IOobject ( "sizes", runTime.timeName(), meshSubDir, runTime, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE, false ), pointMesh::New(mesh) ); triadIOField alignments ( IOobject ( "alignments", mesh.time().timeName(), meshSubDir, mesh.time(), IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE, false ) ); if ( sizes.size() == this->vertexCount() && alignments.size() == this->vertexCount() ) { for ( Finite_vertices_iterator vit = finite_vertices_begin(); vit != finite_vertices_end(); ++vit ) { vit->targetCellSize() = sizes[vit->index()]; vit->alignment() = alignments[vit->index()]; } } else { FatalErrorInFunction << "Cell size point field is not the same size as the " << "mesh." << abort(FatalError); } } } }