Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OpenFOAM / primitives / Tensor2D / tensor2D / tensor2D.C
blob941ad593324637e165eb49a5908c81ff5fba9551
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2010 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
13     the Free Software Foundation, either version 3 of the License, or
14     (at your 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, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "tensor2D.H"
28 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
30 namespace Foam
33 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
35 template<>
36 const char* const tensor2D::typeName = "tensor2D";
38 template<>
39 const char* tensor2D::componentNames[] =
41     "xx", "xy",
42     "yx", "yy"
45 template<>
46 const tensor2D tensor2D::zero
48     0, 0,
49     0, 0
52 template<>
53 const tensor2D tensor2D::one
55     1, 1,
56     1, 1
59 template<>
60 const tensor2D tensor2D::max
62     VGREAT, VGREAT,
63     VGREAT, VGREAT
66 template<>
67 const tensor2D tensor2D::min
69     -VGREAT, -VGREAT,
70     -VGREAT, -VGREAT
74 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
76 // Return eigenvalues in ascending order of absolute values
77 vector2D eigenValues(const tensor2D& t)
79     scalar i = 0;
80     scalar ii = 0;
82     if (mag(t.xy()) < SMALL && mag(t.yx()) < SMALL)
83     {
84         i = t.xx();
85         ii = t.yy();
86     }
87     else
88     {
89         scalar mb = t.xx() + t.yy();
90         scalar c = t.xx()*t.yy() - t.xy()*t.yx();
92         // If there is a zero root
93         if (mag(c) < SMALL)
94         {
95             i = 0;
96             ii = mb;
97         }
98         else
99         {
100             scalar disc = sqr(mb) - 4*c;
102             if (disc > 0)
103             {
104                 scalar q = sqrt(disc);
106                 i = 0.5*(mb - q);
107                 ii = 0.5*(mb + q);
108             }
109             else
110             {
111                 FatalErrorIn("eigenValues(const tensor2D&)")
112                     << "zero and complex eigenvalues in tensor2D: " << t
113                     << abort(FatalError);
114             }
115         }
116     }
118     // Sort the eigenvalues into ascending order
119     if (mag(i) > mag(ii))
120     {
121         Swap(i, ii);
122     }
124     return vector2D(i, ii);
128 vector2D eigenVector(const tensor2D& t, const scalar lambda)
130     if (lambda < SMALL)
131     {
132         return vector2D::zero;
133     }
135     if (mag(t.xy()) < SMALL && mag(t.yx()) < SMALL)
136     {
137         if (lambda > min(t.xx(), t.yy()))
138         {
139             return vector2D(1, 0);
140         }
141         else
142         {
143             return vector2D(0, 1);
144         }
145     }
146     else if (mag(t.xy()) < SMALL)
147     {
148         return vector2D(lambda - t.yy(), t.yx());
149     }
150     else
151     {
152         return vector2D(t.xy(), lambda - t.yy());
153     }
157 tensor2D eigenVectors(const tensor2D& t)
159     vector2D evals(eigenValues(t));
161     tensor2D evs
162     (
163         eigenVector(t, evals.x()),
164         eigenVector(t, evals.y())
165     );
167     return evs;
171 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
173 } // End namespace Foam
175 // ************************************************************************* //