Volumes.hpp
Go to the documentation of this file.
1//===========================================================================
2//
3// File: Volumes.hpp
4//
5// Created: Mon Jun 22 15:46:32 2009
6//
7// Author(s): Jan B Thomassen <jbt@sintef.no>
8//
9// $Date$
10//
11// $Revision$
12//
13//===========================================================================
14
15/*
16 Copyright 2009, 2010 SINTEF ICT, Applied Mathematics.
17 Copyright 2009, 2010 Statoil ASA.
18
19 This file is part of The Open Porous Media project (OPM).
20
21 OPM is free software: you can redistribute it and/or modify
22 it under the terms of the GNU General Public License as published by
23 the Free Software Foundation, either version 3 of the License, or
24 (at your option) any later version.
25
26 OPM is distributed in the hope that it will be useful,
27 but WITHOUT ANY WARRANTY; without even the implied warranty of
28 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29 GNU General Public License for more details.
30
31 You should have received a copy of the GNU General Public License
32 along with OPM. If not, see <http://www.gnu.org/licenses/>.
33*/
34
35#ifndef OPM_VOLUMES_HEADER
36#define OPM_VOLUMES_HEADER
37
38#include <numeric>
39
40// Warning suppression for Dune includes.
42
43#include <dune/common/version.hh>
44#include <dune/common/math.hh>
45#include <dune/common/fvector.hh>
46
48
49namespace Dune
50{
51
57 template <typename T>
58 FieldVector<T, 3> cross(const FieldVector<T, 3>& a, const FieldVector<T, 3>& b)
59 {
60 FieldVector<T, 3> res;
61 res[0] = a[1]*b[2] - a[2]*b[1];
62 res[1] = a[2]*b[0] - a[0]*b[2];
63 res[2] = a[0]*b[1] - a[1]*b[0];
64 return res;
65 }
66
72 template <class Vector>
73 typename Vector::field_type inner(const Vector& a, const Vector& b)
74 {
75 return std::inner_product(a.begin(), a.end(), b.begin(), typename Vector::field_type());
76 }
77
81 template<typename T, template <typename, int> class Point>
82 inline T determinantOf(const Point<T, 2>* a)
83 {
84 return a[0][0] * a[1][1] - a[1][0] * a[0][1];
85 }
86
87
91 template<typename T, template <typename, int> class Point>
92 inline T determinantOf(const Point<T, 3>* a)
93 {
94 return
95 a[0][0] * (a[1][1] * a[2][2] - a[2][1] * a[1][2]) -
96 a[0][1] * (a[1][0] * a[2][2] - a[2][0] * a[1][2]) +
97 a[0][2] * (a[1][0] * a[2][1] - a[2][0] * a[1][1]);
98 }
99
100
103 template<typename T, template <typename, int> class Point, int Dim>
104 inline T simplex_volume(const Point<T, Dim>* a)
105 {
106 Point<T, Dim> tmp[Dim];
107 for (int i = 0; i < Dim; ++i) {
108 tmp[i] = a[i+1] - a[i];
109 }
110
111 return determinantOf(tmp) / double(factorial(Dim));
112 // determinant / factorial
113 }
114
115
118 template <typename T, template <typename, int> class Point>
119 inline T area(const Point<T, 2>* c)
120 { return simplex_volume(c); }
121
122
125 template <typename T, template <typename, int> class Point>
126 inline T area(const Point<T, 3>* c)
127 {
128 // Using the one-half cross product rule
129 Point<T, 3> d0 = c[1] - c[0];
130 Point<T, 3> d1 = c[2] - c[0];
131 Point<T, 3> crossprod = cross(d0,d1);
132 return 0.5 * crossprod.two_norm();
133 }
134
135
137 template <typename T, template <typename, int> class Point>
138 inline T volume(const Point<T, 3>* c)
139 { return simplex_volume(c); }
140
141
144 template <typename T, template <typename, int> class Point>
145 T signed_area(const Point<T, 3>* c, const Point<T, 3>& normal)
146 {
147 // Using the one-half cross product rule
148 Point<T, 3> d0 = c[1] - c[0];
149 Point<T, 3> d1 = c[2] - c[0];
150 Point<T, 3> crossprod = cross(d0, d1);
151 if (inner(crossprod, normal) > 0) {
152 return 0.5 * crossprod.two_norm();
153 } else {
154 return -0.5 * crossprod.two_norm();
155 }
156 }
157
158
159} // namespace Dune
160
161
162
163#endif // OPM_VOLUMES_HEADER
The namespace Dune is the main namespace for all Dune code.
Definition: common/CartesianIndexMapper.hpp:10
T area(const Point< T, 2 > *c)
Definition: Volumes.hpp:119
FieldVector< T, 3 > cross(const FieldVector< T, 3 > &a, const FieldVector< T, 3 > &b)
Definition: Volumes.hpp:58
T volume(const Point< T, 3 > *c)
Computes the volume of a 3D simplex (embedded i 3D space).
Definition: Volumes.hpp:138
T determinantOf(const Point< T, 2 > *a)
Definition: Volumes.hpp:82
T simplex_volume(const Point< T, Dim > *a)
Definition: Volumes.hpp:104
Vector::field_type inner(const Vector &a, const Vector &b)
Definition: Volumes.hpp:73
T signed_area(const Point< T, 3 > *c, const Point< T, 3 > &normal)
Definition: Volumes.hpp:145
Dune::FieldVector< double, 3 > Vector
Definition: cpgrid/GridHelpers.hpp:385
double b(const Dune::FieldVector< ct, dimworld > &, double)
Definition: transportproblem2.hh:25