Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / mesh / cfMesh / utilities / smoothers / geometry / meshSurfaceOptimizer / meshSurfaceOptimizerOptimizePoint.C
blob851655bf03d2f8abdec2c10c03634a8f06c238de
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | cfMesh: A library for mesh generation
4    \\    /   O peration     |
5     \\  /    A nd           | Author: Franjo Juretic (franjo.juretic@c-fields.com)
6      \\/     M anipulation  | Copyright (C) Creative Fields, Ltd.
7 -------------------------------------------------------------------------------
8 License
9     This file is part of cfMesh.
11     cfMesh is free software; you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation; either version 3 of the License, or (at your
14     option) any later version.
16     cfMesh is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with cfMesh.  If not, see <http://www.gnu.org/licenses/>.
24 Description
26 \*---------------------------------------------------------------------------*/
28 #include "demandDrivenData.H"
29 #include "meshSurfaceOptimizer.H"
30 #include "meshSurfaceEngineModifier.H"
31 #include "meshOctree.H"
32 #include "triangle.H"
33 #include "plane.H"
34 #include "surfaceOptimizer.H"
36 //#define DEBUGSmooth
38 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
40 namespace Foam
43 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
45 void meshSurfaceOptimizer::nodeDisplacementLaplacian
47     const label bpI,
48     const bool transformIntoPlane
49 ) const
51     if( vertexType_[bpI] & LOCKED )
52         return;
54     const point newP = newPositionLaplacian(bpI, transformIntoPlane);
56     meshSurfaceEngineModifier surfaceModifier(surfaceEngine_);
57     surfaceModifier.moveBoundaryVertex(bpI, newP);
60 void meshSurfaceOptimizer::nodeDisplacementLaplacianFC
62     const label bpI,
63     const bool transformIntoPlane
64 ) const
66     if( vertexType_[bpI] & LOCKED )
67         return;
69     const point newP = newPositionLaplacianFC(bpI, transformIntoPlane);
71     meshSurfaceEngineModifier surfaceModifier(surfaceEngine_);
72     surfaceModifier.moveBoundaryVertex(bpI, newP);
75 void meshSurfaceOptimizer::nodeDisplacementSurfaceOptimizer
77     const label bpI,
78     const scalar tol
81     if( vertexType_[bpI] & LOCKED )
82         return;
84     const pointFieldPMG& points = surfaceEngine_.points();
85     const labelList& bPoints = surfaceEngine_.boundaryPoints();
87     # ifdef DEBUGSmooth
88     Info << "Smoothing boundary node " << bpI << endl;
89     Info << "Node label in the mesh is " << bPoints[bpI] << endl;
90     Info << "Point coordinates " << points[bPoints[bpI]] << endl;
91     # endif
93     //- project vertices onto the plane
94     const vector& pNormal = surfaceEngine_.pointNormals()[bpI];
95     if( magSqr(pNormal) < VSMALL )
96         return;
98     const plane pl(points[bPoints[bpI]], pNormal);
100     DynList<point> pts;
101     DynList<triFace> trias;
102     vector vecX, vecY;
103     if( !transformIntoPlane(bpI, pl, vecX, vecY, pts, trias) )
104     {
105         Warning << "Cannot transform into plane" << endl;
106         return;
107     }
109     surfaceOptimizer so(pts, trias);
110     point newPoint = so.optimizePoint(tol);
112     const point newP
113     (
114         points[bPoints[bpI]] +
115         vecX * newPoint.x() +
116         vecY * newPoint.y()
117     );
119     meshSurfaceEngineModifier sm(surfaceEngine_);
120     sm.moveBoundaryVertex(bpI, newP);
123 void meshSurfaceOptimizer::edgeNodeDisplacement(const label bpI) const
125     if( vertexType_[bpI] & LOCKED )
126         return;
128     const pointFieldPMG& points = surfaceEngine_.points();
129     const labelList& bPoints = surfaceEngine_.boundaryPoints();
131     const point pos = newEdgePositionLaplacian(bpI);
132     const point newP = 0.5 * (pos + points[bPoints[bpI]]);
134     # ifdef DEBUGSearch
135     Info << "New position for point is " << newP << endl;
136     # endif
138     meshSurfaceEngineModifier(surfaceEngine_).moveBoundaryVertex(bpI, newP);
141 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
143 } // End namespace Foam
145 // ************************************************************************* //