Path: blob/devel/ElmerGUI/netgen/libsrc/gprim/geomfuncs.cpp
3206 views
#include <mystdlib.h>12#include <myadt.hpp>3#include <gprim.hpp>45namespace netgen6{78/*9// template <>10inline void CalcInverse (const Mat<2,2> & m, Mat<2,2> & inv)11{12double det = m(0,0) * m(1,1) - m(0,1) * m(1,0);13if (det == 0)14{15inv = 0;16return;17}1819double idet = 1.0 / det;20inv(0,0) = idet * m(1,1);21inv(0,1) = -idet * m(0,1);22inv(1,0) = -idet * m(1,0);23inv(1,1) = idet * m(0,0);24}25*/26272829// template <>30void CalcInverse (const Mat<3,3> & m, Mat<3,3> & inv)31{32double det = Det (m);33if (det == 0)34{35inv = 0;36return;37}3839double idet = 1.0 / det;40inv(0,0) = idet * (m(1,1) * m(2,2) - m(1,2) * m(2,1));41inv(1,0) = -idet * (m(1,0) * m(2,2) - m(1,2) * m(2,0));42inv(2,0) = idet * (m(1,0) * m(2,1) - m(1,1) * m(2,0));4344inv(0,1) = -idet * (m(0,1) * m(2,2) - m(0,2) * m(2,1));45inv(1,1) = idet * (m(0,0) * m(2,2) - m(0,2) * m(2,0));46inv(2,1) = -idet * (m(0,0) * m(2,1) - m(0,1) * m(2,0));4748inv(0,2) = idet * (m(0,1) * m(1,2) - m(0,2) * m(1,1));49inv(1,2) = -idet * (m(0,0) * m(1,2) - m(0,2) * m(1,0));50inv(2,2) = idet * (m(0,0) * m(1,1) - m(0,1) * m(1,0));51}5253/*54// template <>55void CalcInverse (const Mat<2,3> & m, Mat<3,2> & inv)56{57Mat<2,2> a = m * Trans (m);58Mat<2,2> ainv;59CalcInverse (a, ainv);60inv = Trans (m) * ainv;61}62*/63646566double Det (const Mat<2,2> & m)67{68return m(0,0) * m(1,1) - m(0,1) * m(1,0);69}7071double Det (const Mat<3,3> & m)72{73return74m(0,0) * m(1,1) * m(2,2)75+ m(1,0) * m(2,1) * m(0,2)76+ m(2,0) * m(0,1) * m(1,2)77- m(0,0) * m(2,1) * m(1,2)78- m(1,0) * m(0,1) * m(2,2)79- m(2,0) * m(1,1) * m(0,2);80}818283void EigenValues (const Mat<3,3> & m, Vec<3> & ev)84{85const double pi = 3.141592;86double a, b, c, d;87double p, q;88double arg;8990a = -1.;91b = m(0,0) + m(1,1) + m(2,2);92c = -( m(0,0)*m(2,2) + m(1,1)*m(2,2) + m(0,0)*m(1,1) - sqr(m(0,1)) - sqr(m(0,2)) - sqr(m(1,2)) );93d = Det (m);94p = 3.*a*c - sqr(b);95q = 27.*sqr(a)*d - 9.*a*b*c + 2.*sqr(b)*b;969798arg = acos((-q/2)/sqrt(-(p*p*p)));99100101ev(0) = (2. * sqrt(-p) * cos(arg/3.) - b) / 3.*a;102ev(1) = (-2. * sqrt(-p) * cos(arg/3.+pi/3) - b) / 3.*a;103ev(2) = (-2. * sqrt(-p) * cos(arg/3.-pi/3)- b) / 3.*a;104105106107}108109110}111112113