initial commit for version 1.5.x patch release
[OpenFOAM-1.5.x.git] / src / lagrangian / molecularDynamics / molecule / moleculeCloud / moleculeCloudTestEdgeEdgeDistance.C
blobc12e795f6e50f6fd96689a60c71ec7bc6084f661
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2008 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM 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 2 of the License, or (at your
14     option) any later version.
16     OpenFOAM 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 OpenFOAM; if not, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*----------------------------------------------------------------------------*/
27 #include "moleculeCloud.H"
29 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
31 bool Foam::moleculeCloud::testEdgeEdgeDistance
33     const edge& eI,
34     const edge& eJ
35 ) const
37     const vector& eJs(mesh_.points()[eJ.start()]);
38     const vector& eJe(mesh_.points()[eJ.end()]);
40     return testEdgeEdgeDistance(eI, eJs, eJe);
43 bool Foam::moleculeCloud::testEdgeEdgeDistance
45     const edge& eI,
46     const vector& eJs,
47     const vector& eJe
48 ) const
50     vector a(eI.vec(mesh_.points()));
51     vector b(eJe - eJs);
53     const vector& eIs(mesh_.points()[eI.start()]);
55     vector c(eJs - eIs);
57     vector crossab = a ^ b;
58     scalar magCrossSqr = magSqr(crossab);
60     if (magCrossSqr > VSMALL)
61     {
62         // If the edges are parallel then a point-face
63         // search will pick them up
65         scalar s = ((c ^ b) & crossab)/magCrossSqr;
66         scalar t = ((c ^ a) & crossab)/magCrossSqr;
68         // Check for end points outside of range 0..1
69         // If the closest point is outside this range
70         // a point-face search will have found it.
72         return
73         (
74             s >= 0
75          && s <= 1
76          && t >= 0
77          && t <= 1
78          && magSqr(eIs + a*s - eJs - b*t) <= pairPotentials_.rCutMaxSqr()
79         );
80     }
82     return false;
86 // ************************************************************************* //