28 #ifndef LENOIR_SALLES_2012_HPP_INCLUDED
29 #define LENOIR_SALLES_2012_HPP_INCLUDED
34 #include "../core/integral_operator.hpp"
36 #include <boost/math/constants/constants.hpp>
48 template <
class TestField,
class TrialField>
51 typename std::enable_if<
52 std::is_same<typename get_formalism<TestField, TrialField>::type, formalism::general>::value &&
53 std::is_same<typename TrialField::lset_t, tria_1_shape_set>::value &&
54 std::is_same<typename TrialField::nset_t, tria_0_shape_set>::value &&
55 std::is_same<typename TestField::nset_t, tria_0_shape_set>::value
68 template <
class scalar_t>
75 auto const &
C = elem.get_coords();
76 unsigned const N = tria_1_elem::num_nodes;
78 for (
unsigned i = 0; i < N; ++i)
81 auto b =
C.col((i+1)%N);
82 auto c =
C.col((i+2)%N);
84 auto unit_d = d / d.norm();
85 auto x = (a-b).dot(unit_d)*unit_d + b;
86 gamma[i] = (x-a).norm();
87 sminus[i] = (x-b).dot(unit_d);
88 splus[i] = (x-c).dot(unit_d);
99 template <
class result_t>
107 using namespace boost::math::double_constants;
109 unsigned const N = tria_1_elem::num_nodes;
110 auto const &elem = trial_field.
get_elem();
113 double gamma[N], splus[N], sminus[N];
114 gamma_splus_sminus(elem, gamma, splus, sminus);
117 auto S = elem.get_normal().norm()/2.0;
120 for (
unsigned i = 0; i < N; ++i)
121 result(0,0) -= gamma[i] * (
122 std::asinh<double>(splus[i]/gamma[i]) - std::asinh<double>(sminus[i]/gamma[i])
125 result(0,0) *= 2.0/3.0 * S / (4.0*pi);