~njansson/dolfin/hpc

« back to all changes in this revision

Viewing changes to src/kernel/grid/Tetrahedron.cpp

  • Committer: logg
  • Date: 2003-02-06 14:40:25 UTC
  • Revision ID: devnull@localhost-20030206144025-bmqurqq95f073l40
Tailorized "2003-02-06 08:40:24 by logg"
Fixes...

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
// Copyright (C) 2002 Johan Hoffman and Anders Logg.
2
2
// Licensed under the GNU GPL Version 2.
3
3
 
 
4
#include <dolfin/Node.h>
 
5
#include <dolfin/Point.h>
4
6
#include <dolfin/Cell.h>
5
7
#include <dolfin/Tetrahedron.h>
6
8
 
7
9
using namespace dolfin;
8
10
 
9
11
//-----------------------------------------------------------------------------
10
 
int Tetrahedron::noNodes()
 
12
int Tetrahedron::noNodes() const
11
13
{
12
14
  return 4;
13
15
}
14
16
//-----------------------------------------------------------------------------
15
 
int Tetrahedron::noEdges()
 
17
int Tetrahedron::noEdges() const
16
18
{
17
19
  return 6;
18
20
}
19
21
//-----------------------------------------------------------------------------
20
 
int Tetrahedron::noFaces()
 
22
int Tetrahedron::noFaces() const
21
23
{
22
24
  return 4;
23
25
}
24
26
//-----------------------------------------------------------------------------
25
 
int Tetrahedron::noBoundaries()
 
27
int Tetrahedron::noBound() const
26
28
{
27
29
  return noFaces();
28
30
}
29
31
//-----------------------------------------------------------------------------
30
 
Cell::Type Tetrahedron::type()
 
32
Cell::Type Tetrahedron::type() const
31
33
{
32
34
  return Cell::TETRAHEDRON;
33
35
}
34
36
//-----------------------------------------------------------------------------
35
 
/*
36
 
real Tetrahedron::ComputeVolume(Grid *grid)
37
 
{
38
 
  // Get the coordinates
39
 
  Point *A = nodes[0]->GetCoord();
40
 
  Point *B = nodes[1]->GetCoord();
41
 
  Point *C = nodes[2]->GetCoord();
42
 
  Point *D = nodes[3]->GetCoord();
43
 
 
44
 
  // Make sure we get full precision
45
 
  real x1, x2, x3, x4, y1, y2, y3, y4, z1, z2, z3, z4;
46
 
 
47
 
  x1 = real(A->x); y1 = real(A->y); z1 = real(A->z);
48
 
  x2 = real(B->x); y2 = real(B->y); z2 = real(B->z);
49
 
  x3 = real(C->x); y3 = real(C->y); z3 = real(C->z);
50
 
  x4 = real(D->x); y4 = real(D->y); z4 = real(D->z);
51
 
 
52
 
  // Formula for volume from http://mathworld.wolfram.com
53
 
  real v = ( x1 * ( y2*z3 + y4*z2 + y3*z4 - y3*z2 - y2*z4 - y4*z3 ) -
54
 
                                 x2 * ( y1*z3 + y4*z1 + y3*z4 - y3*z1 - y1*z4 - y4*z3 ) +
55
 
                                 x3 * ( y1*z2 + y4*z1 + y2*z4 - y2*z1 - y1*z4 - y4*z2 ) -
56
 
                                 x4 * ( y1*z2 + y2*z3 + y3*z1 - y2*z1 - y3*z2 - y1*z3 ) );
57
 
  
58
 
  //display->Message(0,"A = (%f,%f,%f)\nB = (%f,%f,%f)\nC = (%f,%f,%f)\nD = (%f,%f,%f)\n",
59
 
  //                                             x1,y1,z1,
60
 
  //                                             x2,y2,z2,
61
 
  //                                             x3,y3,z3,
62
 
  //                                             x4,y4,z4);
63
 
  
64
 
  v = ( v >= 0.0 ? v : -v );
65
 
  
66
 
  return ( v );
67
 
}
68
 
//-----------------------------------------------------------------------------
69
 
real Tetrahedron::ComputeCircumRadius(Grid *grid)
70
 
{
71
 
  // Compute volume
72
 
  real volume = ComputeVolume(grid);
73
 
 
74
 
  // Compute radius
75
 
  real radius = ComputeCircumRadius(grid,volume);
76
 
 
77
 
  //display->Message(0,"v = %f R = %f",volume,radius);
78
 
  
79
 
  // Return radius
80
 
  return ( radius );
81
 
}
82
 
//-----------------------------------------------------------------------------
83
 
real Tetrahedron::ComputeCircumRadius(Grid *grid, real volume)
84
 
{
85
 
  // Get the coordinates
86
 
  Point *A = nodes[0]->GetCoord();
87
 
  Point *B = nodes[1]->GetCoord();
88
 
  Point *C = nodes[2]->GetCoord();
89
 
  Point *D = nodes[3]->GetCoord();
90
 
  
91
 
  // Compute side lengths
92
 
  real a  = B->Distance(*C);
93
 
  real b  = A->Distance(*C);
94
 
  real c  = A->Distance(*B);
95
 
  real aa = A->Distance(*D);
96
 
  real bb = B->Distance(*D);
97
 
  real cc = C->Distance(*D);
98
 
  
99
 
  // Compute "area" of triangle with strange side lengths
100
 
  real l1   = a*aa;
101
 
  real l2   = b*bb;
102
 
  real l3   = c*cc;
103
 
  real s    = 0.5*(l1+l2+l3);
104
 
  real area = sqrt(s*(s-l1)*(s-l2)*(s-l3));
105
 
 
106
 
  // Formula for radius from http://mathworld.wolfram.com
107
 
  real R = area/(6.0*volume);
108
 
 
109
 
  return ( R );
110
 
}
111
 
*/
112
 
//-----------------------------------------------------------------------------
113
 
bool Tetrahedron::neighbor(ShortList<Node *> &cn, Cell &cell)
 
37
bool Tetrahedron::neighbor(ShortList<Node *> &cn, Cell &cell) const
114
38
{
115
39
  // Two tetrahedrons are neighbors if they have a common face or if they are
116
40
  // the same tetrahedron, i.e. if they have 3 or 4 common nodes.