FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
simplex_scalar_factory.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8// includes, FEAT
9#include <kernel/cubature/scalar/driver_factory.hpp>
10#include <kernel/cubature/rule.hpp>
11
12namespace FEAT
13{
14 namespace Cubature
15 {
16 template<typename ScalarDriver_>
18 {
19 public:
21
22 public:
23 template<typename Weight_, typename Coord_, typename Point_>
24 static void create(
25 Rule<Shape::Simplex<1>, Weight_, Coord_, Point_>& rule,
26 const Scalar::Rule<Weight_, Coord_>& scalar_rule)
27 {
28 int num_points = scalar_rule.get_num_points();
29#ifdef FEAT_CUBATURE_SCALAR_PREFIX
30 rule = Rule<Shape::Simplex<1>, Weight_, Coord_, Point_>(num_points, "scalar:" + scalar_rule.get_name());
31#else
32 rule = Rule<Shape::Simplex<1>, Weight_, Coord_, Point_>(num_points, scalar_rule.get_name());
33#endif // FEAT_CUBATURE_SCALAR_PREFIX
34 for(int i(0); i < num_points; ++i)
35 {
36 rule.get_weight(i) = scalar_rule.get_weight(i) * Weight_(0.5);
37 rule.get_coord(i, 0) = (scalar_rule.get_coord(i) + Coord_(1)) * Coord_(0.5);
38 }
39 }
40
41 template<typename Weight_, typename Coord_, typename Point_>
42 static bool create(Rule<Shape::Simplex<1>, Weight_, Coord_, Point_>& rule, const String& name)
43 {
44 typedef Scalar::Rule<Weight_, Coord_> ScalarRuleType;
45
46#ifdef FEAT_CUBATURE_SCALAR_PREFIX
47 // try to find a colon within the string
48 String::size_type k = name.find_first_of(':');
49 if(k == name.npos)
50 return false;
51
52 // extract substrings until the colon
53 String head(name.substr(0, k));
54 String tail(name.substr(k + 1));
55
56 // check head - this is the name of the formula
57 if(head.trim().compare_no_case("scalar") != 0)
58 return false;
59
60 // call scalar factory to create the scalar rule
61 ScalarRuleType scalar_rule;
62 if(!ScalarFactoryType::create(scalar_rule, tail.trim()))
63 return false;
64#else
65 // call scalar factory to create the scalar rule
66 ScalarRuleType scalar_rule;
67 if(!ScalarFactoryType::create(scalar_rule, name))
68 return false;
69#endif // FEAT_CUBATURE_SCALAR_PREFIX
70
71 // convert scalar rule
72 create(rule, scalar_rule);
73 return true;
74 }
75
76 static String name()
77 {
78#ifdef FEAT_CUBATURE_SCALAR_PREFIX
79 return "scalar:" + ScalarFactoryType::name();
80#else
81 return ScalarFactoryType::name();
82#endif // FEAT_CUBATURE_SCALAR_PREFIX
83 }
84
85 template<typename Functor_>
86 static void alias(Functor_& functor)
87 {
88#ifdef FEAT_CUBATURE_SCALAR_PREFIX
89 AliasScalarPrefixFunctor<Functor_> prefix_functor(functor);
90 ScalarFactoryType::alias(prefix_functor);
91#else
92 ScalarFactoryType::alias(functor);
93#endif // FEAT_CUBATURE_SCALAR_PREFIX
94 }
95
97 private:
98#ifdef FEAT_CUBATURE_SCALAR_PREFIX
99 template<typename Functor_>
100 class AliasScalarPrefixFunctor
101 {
102 private:
103 Functor_& _functor;
104
105 public:
106 explicit AliasScalarPrefixFunctor(Functor_& functor) :
107 _functor(functor)
108 {
109 }
110
111 void alias(const String& name)
112 {
113 _functor.alias("scalar:" + name);
114 }
115
116 void alias(const String& name, int num_points)
117 {
118 _functor.alias("scalar:" + name, num_points);
119 }
120 };
121#endif // FEAT_CUBATURE_SCALAR_PREFIX
123 };
124
125 template<
126 typename ScalarDriver_,
127 bool variadic_ = ScalarDriver_::variadic>
128 class SimplexScalarFactory DOXY({});
129
130 template<typename ScalarDriver_>
131 class SimplexScalarFactory<ScalarDriver_, false> :
132 public SimplexScalarFactoryBase<ScalarDriver_>
133 {
134 public:
138 static constexpr bool variadic = false;
139 static constexpr int num_points = ScalarFactoryType::num_points;
140
141 public:
143 {
144 }
145
146 using BaseClass::create;
147
148 template<typename Weight_, typename Coord_, typename Point_>
149 static void create(Rule<Shape::Simplex<1>, Weight_, Coord_, Point_>& rule)
150 {
151 // call scalar factory to create the scalar rule
153 ScalarFactoryType::create(scalar_rule);
154
155 // convert scalar rule
156 create(rule, scalar_rule);
157 }
158 };
159
160 template<typename ScalarDriver_>
161 class SimplexScalarFactory<ScalarDriver_, true> :
162 public SimplexScalarFactoryBase<ScalarDriver_>
163 {
164 public:
168 static constexpr bool variadic = true;
169 static constexpr int min_points = ScalarFactoryType::min_points;
170 static constexpr int max_points = ScalarFactoryType::max_points;
171
172 protected:
173 int _num_points;
174
175 public:
176 explicit SimplexScalarFactory(int num_points) :
177 _num_points(num_points)
178 {
179 }
180
181 using BaseClass::create;
182
183 template<typename Weight_, typename Coord_, typename Point_>
184 void create(Rule<Shape::Simplex<1>, Weight_, Coord_, Point_>& rule)
185 {
186 create(rule, _num_points);
187 }
188
189 template<typename Weight_, typename Coord_, typename Point_>
190 static void create(Rule<Shape::Simplex<1>, Weight_, Coord_, Point_>& rule, int num_points)
191 {
192 // call scalar factory to create the scalar rule
194 ScalarFactoryType::create(scalar_rule, num_points);
195
196 // convert scalar rule
197 create(rule, scalar_rule);
198 }
199 };
200 } // namespace Cubature
201} // namespace FEAT
Cubature Rule class template.
Definition: rule.hpp:38
Scalar Cubature Driver-Factory class template.
Scalar Cubature Rule class template.
Definition: rule.hpp:39
String class implementation.
Definition: string.hpp:46
int compare_no_case(const String &other) const
Compares two strings without regard to case.
Definition: string.hpp:679
String trim(const String &charset) const
Trims the string.
Definition: string.hpp:327
FEAT namespace.
Definition: adjactor.hpp:12
Simplex shape tag struct template.
Definition: shape.hpp:44