/home/runner/work/kynema/kynema/kynema/src/math/gl_quadrature.hpp Source File

Kynema API: /home/runner/work/kynema/kynema/kynema/src/math/gl_quadrature.hpp Source File
Kynema API
A flexible multibody structural dynamics code for wind turbines
Loading...
Searching...
No Matches
gl_quadrature.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cmath>
4#include <numbers>
5#include <stdexcept>
6#include <vector>
7
8namespace kynema::math {
9
10inline std::vector<double> GetGlLocations(size_t order) {
11 switch (order) {
12 case 1UL:
13 return std::vector{0.};
14 case 2UL:
15 return std::vector{-std::numbers::inv_sqrt3, std::numbers::inv_sqrt3};
16 case 3UL:
17 return std::vector{-std::sqrt(3. / 5.), 0., std::sqrt(3. / 5.)};
18 case 4UL:
19 return std::vector{
20 -std::sqrt((3. / 7.) + ((2. / 7.) * std::sqrt(6. / 5.))),
21 -std::sqrt((3. / 7.) - ((2. / 7.) * std::sqrt(6. / 5.))),
22 std::sqrt((3. / 7.) - ((2. / 7.) * std::sqrt(6. / 5.))),
23 std::sqrt((3. / 7.) + ((2. / 7.) * std::sqrt(6. / 5.)))
24 };
25 case 5UL:
26 return std::vector{
27 -(1. / 3.) * std::sqrt(5. + (2. * std::sqrt(10. / 7.))),
28 -(1. / 3.) * std::sqrt(5. - (2. * std::sqrt(10. / 7.))), 0.,
29 (1. / 3.) * std::sqrt(5. - (2. * std::sqrt(10. / 7.))),
30 (1. / 3.) * std::sqrt(5. + (2. * std::sqrt(10. / 7.)))
31 };
32 case 6UL:
33 return std::vector{-0.9324695142031520501, -0.6612093864662644815,
34 -0.2386191860831969325, 0.2386191860831969325,
35 0.6612093864662644815, 0.9324695142031520501};
36 case 7UL:
37 return std::vector{-0.9491079123427585, -0.7415311855993945, -0.4058451513773972, 0.,
38 0.4058451513773972, 0.7415311855993945, 0.9491079123427585};
39 case 8UL:
40 return std::vector{-0.9602898564975362872, -0.796666477413626728, -0.5255324099163289908,
41 -0.1834346424956497801, 0.1834346424956497801, 0.5255324099163289908,
42 0.796666477413626728, 0.9602898564975362872};
43 case 9UL:
44 return std::vector{-0.9681602395076261,
45 -0.8360311073266358,
46 -0.6133714327005904,
47 -0.3242534234038089,
48 0.,
49 0.3242534234038089,
50 0.6133714327005904,
51 0.8360311073266358,
52 0.9681602395076261};
53 case 10UL:
54 return std::vector{
55 -0.973906528517172, -0.8650633666889761, -0.6794095682990245, // NOLINT
56 -0.4333953941292472, -0.1488743389816312, 0.1488743389816312, // NOLINT
57 0.4333953941292472, 0.6794095682990245, 0.8650633666889761, // NOLINT
58 0.973906528517172 // NOLINT
59 };
60 case 11UL:
61 return std::vector{-0.9782286581460570, -0.8870625997680953, -0.7301520055740494,
62 -0.5190961292068118, -0.2695431559523449, 0.,
63 0.2695431559523449, 0.5190961292068118, 0.7301520055740494,
64 0.8870625997680953, 0.9782286581460570};
65 case 12UL:
66 return std::vector{-0.9815606342467192436, -0.9041172563704749088,
67 -0.7699026741943046925, -0.5873179542866174829,
68 -0.3678314989981801841, -0.1252334085114689133,
69 0.1252334085114689133, 0.3678314989981801841,
70 0.5873179542866174829, 0.7699026741943046925,
71 0.9041172563704749088, 0.9815606342467192436};
72 case 13UL:
73 return std::vector{
74 -0.9841830547185881,
75 -0.9175983992229779,
76 -0.8015780907333099,
77 -0.6423493394403402,
78 -0.4484927510364469,
79 -0.2304583159551348,
80 0.,
81 0.2304583159551348,
82 0.4484927510364469,
83 0.6423493394403402,
84 0.8015780907333099,
85 0.9175983992229779,
86 0.9841830547185881
87 };
88 case 14UL:
89 return std::vector{-0.9862838086968123141, -0.928434883663573518,
90 -0.8272013150697650197, -0.6872929048116854789, // NOLINT
91 -0.5152486363581540996, -0.3191123689278897446, // NOLINT
92 -0.1080549487073436538, 0.1080549487073436538, // NOLINT
93 0.3191123689278897446, 0.5152486363581540996, // NOLINT
94 0.6872929048116854789, 0.8272013150697650197,
95 0.928434883663573518, 0.9862838086968123141};
96 case 15UL:
97 return std::vector{
98 -0.9879925180204854, -0.9372733924007059, -0.8482065834104272, -0.7244177313601700,
99 -0.5709721726085388, -0.3941513470775634, -0.2011940939974345, 0.,
100 0.2011940939974345, 0.3941513470775634, 0.5709721726085388, 0.7244177313601700,
101 0.8482065834104272, 0.9372733924007059, 0.9879925180204854
102 };
103 case 16UL:
104 return std::vector{-0.9894009349916499, -0.9445750230732326, -0.8656312023878318,
105 -0.755404408355003, -0.6178762444026438, -0.45801677765722737,
106 -0.2816035507792589, -0.09501250983763744, 0.09501250983763744,
107 0.2816035507792589, 0.45801677765722737, 0.6178762444026438,
108 0.755404408355003, 0.8656312023878318, 0.9445750230732326,
109 0.9894009349916499};
110 case 17UL:
111 return std::vector{-0.9905754753144174, -0.9506755217687677, -0.8802391537269859,
112 -0.7815140038968014, -0.6576711592166907, -0.5126905370864769,
113 -0.3512317634538763, -0.17848418149584785, 0.0,
114 0.17848418149584785, 0.3512317634538763, 0.5126905370864769,
115 0.6576711592166907, 0.7815140038968014, 0.8802391537269859,
116 0.9506755217687677, 0.9905754753144174};
117 case 18UL:
118 return std::vector{-0.991565168420931, -0.9558239495713978, -0.8926024664975557,
119 -0.8037049589725231, -0.6916870430603532, -0.5597708310739475,
120 -0.41175116146284263, -0.2518862256915055, -0.08477501304173529,
121 0.08477501304173529, 0.2518862256915055, 0.41175116146284263,
122 0.5597708310739475, 0.6916870430603532, 0.8037049589725231,
123 0.8926024664975557, 0.9558239495713978, 0.991565168420931};
124 case 19UL:
125 return std::vector{-0.9924068438435844, -0.96020815213483,
126 -0.9031559036148179, -0.8227146565371428,
127 -0.7209661773352294, -0.600545304661681,
128 -0.46457074137596094, -0.31656409996362983,
129 -0.16035864564022537, 0.0,
130 0.16035864564022537, 0.31656409996362983,
131 0.46457074137596094, 0.600545304661681,
132 0.7209661773352294, 0.8227146565371428,
133 0.9031559036148179, 0.96020815213483,
134 0.9924068438435844};
135 case 20UL:
136 return std::vector{-0.993128599185095, -0.9639719272779138, -0.912234428251326,
137 -0.8391169718222188, -0.7463319064601508, -0.636053680726515,
138 -0.5108670019508271, -0.37370608871541955, -0.22778585114164507,
139 -0.07652652113349734, 0.07652652113349734, 0.22778585114164507,
140 0.37370608871541955, 0.5108670019508271, 0.636053680726515,
141 0.7463319064601508, 0.8391169718222188, 0.912234428251326,
142 0.9639719272779138, 0.993128599185095};
143 case 100UL:
144 return std::vector{
145 -0.9997137267734413, -0.9984919506395958, -0.9962951347331251,
146 -0.9931249370374434, -0.9889843952429918, -0.983877540706057,
147 -0.9778093584869183, -0.9707857757637064, -0.9628136542558156,
148 -0.9539007829254917, -0.944055870136256, -0.9332885350430795,
149 -0.921609298145334, -0.9090295709825297, -0.895561644970727,
150 -0.8812186793850184, -0.8660146884971647, -0.8499645278795913,
151 -0.8330838798884008, -0.8153892383391762, -0.7968978923903145,
152 -0.7776279096494955, -0.7575981185197072, -0.7368280898020207,
153 -0.7153381175730564, -0.693149199355802, -0.670283015603141, // NOLINT
154 -0.6467619085141293, -0.6226088602037078, -0.5978474702471788,
155 -0.5725019326213812, -0.5465970120650941, -0.520158019881763,
156 -0.49321078920819095, -0.46578164977335806, -0.4378974021720315,
157 -0.40958529167830154, -0.38087298162462996, -0.35178852637242175,
158 -0.32236034390052914, -0.292617188038472, -0.2625881203715035,
159 -0.23230248184497396, -0.201789864095736, -0.17108008053860327,
160 -0.14020313723611397, -0.10918920358006111, -0.07806858281343663,
161 -0.046871682421591634, -0.015628984421543084, 0.015628984421543084,
162 0.046871682421591634, 0.07806858281343663, 0.10918920358006111,
163 0.14020313723611397, 0.17108008053860327, 0.201789864095736,
164 0.23230248184497396, 0.2625881203715035, 0.292617188038472,
165 0.32236034390052914, 0.35178852637242175, 0.38087298162462996,
166 0.40958529167830154, 0.4378974021720315, 0.46578164977335806,
167 0.49321078920819095, 0.520158019881763, 0.5465970120650941,
168 0.5725019326213812, 0.5978474702471788, 0.6226088602037078,
169 0.6467619085141293, 0.670283015603141, 0.693149199355802, // NOLINT
170 0.7153381175730564, 0.7368280898020207, 0.7575981185197072,
171 0.7776279096494955, 0.7968978923903145, 0.8153892383391762,
172 0.8330838798884008, 0.8499645278795913, 0.8660146884971647,
173 0.8812186793850184, 0.895561644970727, 0.9090295709825297,
174 0.921609298145334, 0.9332885350430795, 0.944055870136256,
175 0.9539007829254917, 0.9628136542558156, 0.9707857757637064,
176 0.9778093584869183, 0.983877540706057, 0.9889843952429918,
177 0.9931249370374434, 0.9962951347331251, 0.9984919506395958,
178 0.9997137267734413
179 };
180 default:
181 throw std::runtime_error("Supported orders are 1 - 20");
182 }
183}
184
185inline std::vector<double> GetGlWeights(size_t order) {
186 switch (order) {
187 case 1UL:
188 return std::vector{2.};
189 case 2UL:
190 return std::vector{1., 1.};
191 case 3UL:
192 return std::vector{5. / 9., 8. / 9., 5. / 9.};
193 case 4UL:
194 return std::vector{
195 (18. - std::sqrt(30.)) / 36., (18. + std::sqrt(30.)) / 36.,
196 (18. + std::sqrt(30.)) / 36., (18. - std::sqrt(30.)) / 36.
197 };
198 case 5UL:
199 return std::vector{
200 (322. - 13. * std::sqrt(70.)) / 900., (322. + 13. * std::sqrt(70.)) / 900.,
201 128. / 225., (322. + 13. * std::sqrt(70.)) / 900.,
202 (322. - 13. * std::sqrt(70.)) / 900.
203 };
204 case 6UL:
205 return std::vector{0.1713244923791703844, 0.3607615730481385508, 0.4679139345726910371,
206 0.4679139345726910371, 0.3607615730481385508, 0.1713244923791703844};
207 case 7UL:
208 return std::vector{0.1294849661688697, 0.2797053914892766, 0.3818300505051189,
209 0.4179591836734694, 0.3818300505051189, 0.2797053914892766,
210 0.1294849661688697};
211 case 8UL:
212 return std::vector{0.1012285362903762309, 0.2223810344533744821, 0.3137066458778872136,
213 0.3626837833783619902, 0.3626837833783619902, 0.3137066458778872136,
214 0.2223810344533744821, 0.1012285362903762309};
215 case 9UL:
216 return std::vector{0.0812743883615744, 0.1806481606948574, 0.2606106964029354,
217 0.3123470770400029, 0.3302393550012598, 0.3123470770400029,
218 0.2606106964029354, 0.1806481606948574, 0.0812743883615744};
219 case 10UL:
220 return std::vector{0.06667134430868793, 0.1494513491504942, 0.2190863625159827,
221 0.2692667193099965, 0.2955242247147527, 0.2955242247147527,
222 0.2692667193099965, 0.2190863625159827, 0.1494513491504942,
223 0.06667134430868793};
224 case 11UL:
225 return std::vector{0.0556685671161737, 0.1255803694649046, 0.1862902109277343,
226 0.2331937645919905, 0.2628045445102467, 0.2729250867779006,
227 0.2628045445102467, 0.2331937645919905, 0.1862902109277343,
228 0.1255803694649046, 0.0556685671161737};
229 case 12UL:
230 return std::vector{0.04717533638651186939, 0.1069393259953183295,
231 0.1600783285433463876, 0.2031674267230659803,
232 0.2334925365383547224, 0.2491470458134028843,
233 0.2491470458134028843, 0.2334925365383547224,
234 0.2031674267230659803, 0.1600783285433463876,
235 0.1069393259953183295, 0.04717533638651186939};
236 case 13UL:
237 return std::vector{0.0404840047653159, 0.0921214998377284, 0.1388735102197872,
238 0.1781459807619457, 0.2078160475368885, 0.2262831802628972,
239 0.2325515532308739, 0.2262831802628972, 0.2078160475368885,
240 0.1781459807619457, 0.1388735102197872, 0.0921214998377284,
241 0.0404840047653159};
242 case 14UL:
243 return std::vector{0.03511946033175197823, 0.08015808715976011078, 0.1215185706879031435,
244 0.1572031671581935464, 0.185538397477937822, 0.2051984637212956875,
245 0.2152638534631578227, 0.2152638534631578227, 0.2051984637212956875,
246 0.185538397477937822, 0.1572031671581935464, 0.1215185706879031435,
247 0.08015808715976011078, 0.03511946033175197823};
248 case 15UL:
249 return std::vector{0.0307532419961173, 0.0703660474881081, 0.1071592204671719,
250 0.1395706779261543, 0.1662692058169939, 0.1861610000155622,
251 0.1984314853271116, 0.2025782419255613, 0.1984314853271116,
252 0.1861610000155622, 0.1662692058169939, 0.1395706779261543,
253 0.1071592204671719, 0.0703660474881081, 0.0307532419961173};
254 case 16UL:
255 return std::vector{0.027152459411754176, 0.062253523938647456, 0.0951585116824926,
256 0.12462897125553407, 0.1495959888165767, 0.16915651939500265,
257 0.18260341504492364, 0.18945061045506864, 0.18945061045506864,
258 0.18260341504492364, 0.16915651939500265, 0.1495959888165767,
259 0.12462897125553407, 0.0951585116824926, 0.062253523938647456,
260 0.027152459411754176};
261 case 17UL:
262 return std::vector{0.02414830286854758, 0.05545952937398796, 0.08503614831717912,
263 0.11188384719340397, 0.1351363684685255, 0.15404576107681026,
264 0.1680041021564499, 0.17656270536699253, 0.17944647035620653,
265 0.17656270536699253, 0.1680041021564499, 0.15404576107681026,
266 0.1351363684685255, 0.11188384719340397, 0.08503614831717912,
267 0.05545952937398796, 0.02414830286854758};
268 case 18UL:
269 return std::vector{0.021616013526481497, 0.049714548894969394, 0.07642573025488957,
270 0.10094204410628728, 0.1225552067114787, 0.14064291467065093,
271 0.15468467512626555, 0.16427648374583304, 0.1691423829631439,
272 0.1691423829631439, 0.16427648374583304, 0.15468467512626555,
273 0.14064291467065093, 0.1225552067114787, 0.10094204410628728,
274 0.07642573025488957, 0.049714548894969394, 0.021616013526481497};
275 case 19UL:
276 return std::vector{0.01946178822972652, 0.04481422676569959, 0.06904454273764117,
277 0.09149002162244999, 0.111566645547334, 0.12875396253933621,
278 0.14260670217360646, 0.15276604206585961, 0.15896884339395434,
279 0.16105444984878362, 0.15896884339395434, 0.15276604206585961,
280 0.14260670217360646, 0.12875396253933621, 0.111566645547334,
281 0.09149002162244999, 0.06904454273764117, 0.04481422676569959,
282 0.01946178822972652};
283 case 20UL:
284 return std::vector{0.017614007139150893, 0.040601429800386446, 0.06267204833410879,
285 0.08327674157670471, 0.1019301198172407, 0.1181945319615186,
286 0.1316886384491769, 0.1420961093183824, 0.14917298647260424,
287 0.15275338713072628, 0.15275338713072628, 0.14917298647260424,
288 0.1420961093183824, 0.1316886384491769, 0.1181945319615186,
289 0.1019301198172407, 0.08327674157670471, 0.06267204833410879,
290 0.040601429800386446, 0.017614007139150893};
291 case 100UL:
292 return std::vector{0.0007346344905072278, 0.0017093926535173846, 0.0026839253715533677,
293 0.0036559612013274284, 0.004624450063421983, 0.005588428003865369,
294 0.00654694845084484, 0.007499073255463917, 0.008443871469668723,
295 0.009380419653694416, 0.010307802574868973, 0.011225114023186138,
296 0.012131457662979225, 0.013025947892971705, 0.01390771070371871,
297 0.014775884527441366, 0.01562962107754569, 0.016468086176144956,
298 0.017290460568323576, 0.018095940722128372, 0.018883739613374844,
299 0.019653087494435423, 0.020403232646209492, 0.021133442112527462,
300 0.021843002416247488, 0.02253122025633618, 0.023197423185254033,
301 0.023840960265968176, 0.024461202707957062, 0.025057544481579572,
302 0.02562940291020816, 0.026176219239545735, 0.026697459183571044,
303 0.027192613446576898, 0.027661198220792355, 0.028102755659101225,
304 0.02851685432239509, 0.028903089601125198, 0.029261084110638252,
305 0.029590488059912677, 0.029890979593332794, 0.03016226510516914,
306 0.030404079526454842, 0.030616186583980465, 0.03079837903115257,
307 0.030950478850490973, 0.031072337427566554, 0.031163835696209896,
308 0.031224884254849358, 0.031255423453863354, 0.031255423453863354,
309 0.031224884254849358, 0.031163835696209896, 0.031072337427566554,
310 0.030950478850490973, 0.03079837903115257, 0.030616186583980465,
311 0.030404079526454842, 0.03016226510516914, 0.029890979593332794,
312 0.029590488059912677, 0.029261084110638252, 0.028903089601125198,
313 0.02851685432239509, 0.028102755659101225, 0.027661198220792355,
314 0.027192613446576898, 0.026697459183571044, 0.026176219239545735,
315 0.02562940291020816, 0.025057544481579572, 0.024461202707957062,
316 0.023840960265968176, 0.023197423185254033, 0.02253122025633618,
317 0.021843002416247488, 0.021133442112527462, 0.020403232646209492,
318 0.019653087494435423, 0.018883739613374844, 0.018095940722128372,
319 0.017290460568323576, 0.016468086176144956, 0.01562962107754569,
320 0.014775884527441366, 0.01390771070371871, 0.013025947892971705,
321 0.012131457662979225, 0.011225114023186138, 0.010307802574868973,
322 0.009380419653694416, 0.008443871469668723, 0.007499073255463917,
323 0.00654694845084484, 0.005588428003865369, 0.004624450063421983,
324 0.0036559612013274284, 0.0026839253715533677, 0.0017093926535173846,
325 0.0007346344905072278};
326
327 default:
328 throw std::runtime_error("Supported Orders are 1 - 20");
329 }
330}
331
332} // namespace kynema::math
Definition gl_quadrature.hpp:8
std::vector< double > GetGlWeights(size_t order)
Definition gl_quadrature.hpp:185
std::vector< double > GetGlLocations(size_t order)
Definition gl_quadrature.hpp:10