OpenMD 3.2
Molecular Dynamics in the Open
Loading...
Searching...
No Matches
GaussianTriangleQuadrature.hpp
1// Note that this code is mostly from the Drake project: https://drake.mit.edu/
2// and is governed by their BSD 3-Clause license:
3// https://github.com/RobotLocomotion/drake/blob/master/LICENSE.TXT
4// Only minor modifications have been made to make it work in OpenMD.
5
6#ifndef MATH_INTEGRATION_GAUSSIANTRIANGLEQUADRATURERULE_HPP
7#define MATH_INTEGRATION_GAUSSIANTRIANGLEQUADRATURERULE_HPP
8
9#include <stdexcept>
10#include <vector>
11
12#include "math/integration/TriangleQuadratureRule.hpp"
13
14namespace OpenMD {
15
16 class GaussianTriangleQuadratureRule final : public TriangleQuadratureRule {
17 public:
18 /// Constructs the Gaussian quadrature rule of the specified order, which
19 /// must be between 1 and 5.
20 explicit GaussianTriangleQuadratureRule(int order) : order_(order) {
21 assert(order >= 1);
22 if (order > 5) {
23 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
24 "GaussianTriangleQuadrature does not implement a %d point "
25 "algorithm\n",
26 order);
27 painCave.isFatal = 1;
28 ;
29 simError();
30 }
31 SetWeightsAndQuadraturePoints();
32 }
33
34 private:
35 // Sets the weights and quadrature points depending on the order of the
36 // quadrature rule. Weights and quadrature points for the rational numbers
37 // were taken from pp. 8-9 of:
38 // http://math2.uncc.edu/~shaodeng/TEACHING/math5172/Lectures/Lect_15.PDF
39 // Weights and quadrature points for decimal numbers were taken from p. 1140
40 // of:
41 // D. A. Dunavant. High degree efficient symmetrical Gaussian quadrature
42 // rules for the triangle. Intl. J. Num. Meth. Eng. pp. 1129-1148, 1985.
43 void SetWeightsAndQuadraturePoints() {
44 switch (order_) {
45 case 1:
46 weights_.resize(1);
47 quadrature_points_.resize(1);
48 weights_[0] = 1.0;
49 quadrature_points_[0] = Vector2d(1.0 / 3.0, 1.0 / 3.0);
50 break;
51
52 case 2:
53 weights_.resize(3);
54 quadrature_points_.resize(3);
55 weights_[0] = weights_[1] = weights_[2] = 1.0 / 3.0;
56 quadrature_points_[0] = Vector2d(1.0 / 6.0, 1.0 / 6.0);
57 quadrature_points_[1] = Vector2d(1.0 / 6.0, 2.0 / 3.0);
58 quadrature_points_[2] = Vector2d(2.0 / 3.0, 1.0 / 6.0);
59 break;
60
61 case 3:
62 weights_.resize(4);
63 quadrature_points_.resize(4);
64 weights_[0] = -27.0 / 48.0;
65 weights_[1] = weights_[2] = weights_[3] = 25.0 / 48.0;
66 quadrature_points_[0] = Vector2d(1.0 / 3.0, 1.0 / 3.0);
67 quadrature_points_[1] = Vector2d(1.0 / 5.0, 1.0 / 5.0);
68 quadrature_points_[2] = Vector2d(1.0 / 5.0, 3.0 / 5.0);
69 quadrature_points_[3] = Vector2d(3.0 / 5.0, 1.0 / 5.0);
70 break;
71
72 case 4:
73 weights_.resize(6);
74 quadrature_points_.resize(6);
75 weights_[0] = weights_[1] = weights_[2] = 0.223381589678011;
76 weights_[3] = weights_[4] = weights_[5] = 0.109951743655322;
77 quadrature_points_[0] = Vector2d(0.445948490915965, 0.445948490915965);
78 quadrature_points_[1] = Vector2d(0.445948490915965, 0.108103018168070);
79 quadrature_points_[2] = Vector2d(0.108103018168070, 0.445948490915965);
80 quadrature_points_[3] = Vector2d(0.091576213509771, 0.091576213509771);
81 quadrature_points_[4] = Vector2d(0.091576213509771, 0.816847572980459);
82 quadrature_points_[5] = Vector2d(0.816847572980459, 0.091576213509771);
83 break;
84
85 case 5:
86 weights_.resize(7);
87 quadrature_points_.resize(7);
88 weights_[0] = 0.225;
89 weights_[1] = weights_[2] = weights_[3] = 0.132394152788506;
90 weights_[4] = weights_[5] = weights_[6] = 0.125939180544827;
91 quadrature_points_[0] = Vector2d(1.0 / 3.0, 1.0 / 3.0);
92 quadrature_points_[1] = Vector2d(0.470142064105115, 0.470142064105115);
93 quadrature_points_[2] = Vector2d(0.470142064105115, 0.059715871789770);
94 quadrature_points_[3] = Vector2d(0.059715871789770, 0.470142064105115);
95 quadrature_points_[4] = Vector2d(0.101286507323456, 0.101286507323456);
96 quadrature_points_[5] = Vector2d(0.101286507323456, 0.797426985353087);
97 quadrature_points_[6] = Vector2d(0.797426985353087, 0.101286507323456);
98 break;
99
100 default:
101 snprintf(painCave.errMsg, MAX_SIM_ERROR_MSG_LENGTH,
102 "GaussianTriangleQuadrature does not implement a %d point "
103 "algorithm\n",
104 order_);
105 painCave.isFatal = 1;
106 ;
107 simError();
108 }
109 }
110
111 int do_order() const final { return order_; }
112
113 const std::vector<RealType>& do_weights() const final { return weights_; }
114
115 const std::vector<Vector2d>& do_quadrature_points() const final {
116 return quadrature_points_;
117 }
118
119 const int order_ {-1};
120 std::vector<RealType> weights_;
121 std::vector<Vector2d> quadrature_points_;
122 };
123
124} // namespace OpenMD
125#endif
GaussianTriangleQuadratureRule(int order)
Constructs the Gaussian quadrature rule of the specified order, which must be between 1 and 5.
int order() const
Returns the order of this rule.
virtual int do_order() const =0
Derived classes shall return the order (>= 1) of this rule.
virtual const std::vector< Vector2d > & do_quadrature_points() const =0
Derived classes shall return the vector of quadrature points. Each of these Vector2d objects represen...
virtual const std::vector< RealType > & do_weights() const =0
Derived classes shall return the vector of weights. The sum of all weights must equal 1....
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.