Adding cfMesh-v1.0 into the repository
[foam-extend-3.2.git] / src / meshLibrary / utilities / smoothers / geometry / meshSurfaceOptimizer / meshSurfaceOptimizerOptimizePoint.C
blobd14549851bdc6cc761966b38dba01a63bceded15
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     const point newP = newPositionLaplacian(bpI, transformIntoPlane);
53     meshSurfaceEngineModifier surfaceModifier(surfaceEngine_);
54     surfaceModifier.moveBoundaryVertex(bpI, newP);
57 void meshSurfaceOptimizer::nodeDisplacementLaplacianFC  
59     const label bpI,
60     const bool transformIntoPlane
61 ) const
63     const point newP = newPositionLaplacianFC(bpI, transformIntoPlane);
65     meshSurfaceEngineModifier surfaceModifier(surfaceEngine_);
66     surfaceModifier.moveBoundaryVertex(bpI, newP);
69 void meshSurfaceOptimizer::nodeDisplacementSurfaceOptimizer
71     const label bpI,
72     const scalar tol
75     const pointFieldPMG& points = surfaceEngine_.points();
76     const labelList& bPoints = surfaceEngine_.boundaryPoints();
77     
78     # ifdef DEBUGSmooth
79     Info << "Smoothing boundary node " << bpI << endl;
80     Info << "Node label in the mesh is " << bPoints[bpI] << endl;
81     Info << "Point coordinates " << points[bPoints[bpI]] << endl;
82     # endif
83     
84     //- project vertices onto the plane
85     const vector& pNormal = surfaceEngine_.pointNormals()[bpI];
86     if( magSqr(pNormal) < VSMALL )
87         return;
89     const plane pl(points[bPoints[bpI]], pNormal);
91     DynList<point> pts;
92     DynList<triFace> trias;
93     vector vecX, vecY;
94     if( !transformIntoPlane(bpI, pl, vecX, vecY, pts, trias) )
95     {
96         Warning << "Cannot transform into plane" << endl;
97         return;
98     }
100     surfaceOptimizer so(pts, trias);
101     point newPoint = so.optimizePoint(tol);
102     
103     const point newP
104     (
105         points[bPoints[bpI]] +
106         vecX * newPoint.x() +
107         vecY * newPoint.y()
108     );
109     
110     meshSurfaceEngineModifier sm(surfaceEngine_);
111     sm.moveBoundaryVertex(bpI, newP);
114 void meshSurfaceOptimizer::edgeNodeDisplacement(const label bpI) const
116     const pointFieldPMG& points = surfaceEngine_.points();
117     const labelList& bPoints = surfaceEngine_.boundaryPoints();
118     
119     const point pos = newEdgePositionLaplacian(bpI);
120     const point newP = 0.5 * (pos + points[bPoints[bpI]]);
122     # ifdef DEBUGSearch
123     Info << "New position for point is " << newP << endl;
124     # endif
125         
126     meshSurfaceEngineModifier(surfaceEngine_).moveBoundaryVertex(bpI, newP);
129 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
131 } // End namespace Foam
133 // ************************************************************************* //