version 3.10-dev
doubleexpintegrationconstants.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6// SPDX-FileCopyrightInfo: Copyright John D. Cook
7// SPDX-License-Identifier: BSD-2-Clause
8// Modified after the original version at
9// https://www.codeproject.com/Articles/31550/Fast-Numerical-Integration licensed under
10// BSD-2-Clause. All Changes are licensed under GPL-3.0-or-later.
11//
12/*****************************************************************************
13 * This version is modified after the original version by John D. Cook *
14 * see https://www.codeproject.com/ *
15 * Articles/31550/Fast-Numerical-Integration *
16 * which is licensed under BSD-2-clause, which reads as follows: *
17 * Copyright John D. Cook *
18 * *
19 * Redistribution and use in source and binary forms, with or without *
20 * modification, are permitted provided that the following *
21 * conditions are met: *
22 * 1. Redistributions of source code must retain the above *
23 * copyright notice, this list of conditions *
24 and the following disclaimer. *
25 * 2. Redistributions in binary form must reproduce the above *
26 * copyright notice, this list of conditions *
27 * and the following disclaimer *
28 * in the documentation and/or other materials *
29 * provided with the distribution. *
30 * *
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT *
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *
34 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE *
35 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, *
36 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE *
38 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
39 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, *
40 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE *
41 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, *
42 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
43 * *
44 *****************************************************************************/
50#ifndef DUMUX_COMMON_DOUBLEEXP_INTEGRATION_CONSTANTS_HH
51#define DUMUX_COMMON_DOUBLEEXP_INTEGRATION_CONSTANTS_HH
52
53/*
54The double exponential rule is based on the observation that the trapezoid rule converges
55very rapidly for functions on the entire real line that go to zero like exp( - exp(t) ).
56The change of variables x = tanh( pi sinh(t) /2) transforms an integral over [-1, 1]
57into an integral with integrand suited to the double exponential rule.
58
59The transformed integral is infinite, but we truncate the domain of integration to [-3, 3].
60The limit '3' was chosen for two reasons: for t = 3, the transformed x values
61are nearly equal to 1 for 12 or more significant figures. Also, for t = 3, the
62smallest weights are 12 orders of magnitude smaller than the largest weights; setting
63the cutoff larger than 3 would not have a significant impact on the integral value
64unless there is a strong singularity at one of the end points.
65
66The change of variables x(t) is an odd function, i.e. x(-t) = -x(t), and so we need only
67store the positive x values. Also, the derivative w(t) = x'(t) is even, i.e. w(-t) = w(t),
68and so we need only store the weights corresponding to positive values of x.
69
70The integration first applies the trapezoid rule to [-3, 3] in steps of size 1.
71Then it subsequently cuts the step size in half each time, comparing the results.
72Integration stops when subsequent iterations are close enough together or the maximum
73integration points have been used.
74By cutting h in half, the previous integral can be reused; we only need evaluate the
75integrand at the newly added points.
76
77Finally, note that we're not strictly using the trapezoid rule: we don't treat the
78end points differently. This is because we assume the values at the ends of the interval
79hardly matter due to the rapid decay of the integrand.
80
81All values below were calculated with Mathematica.
82*/
83
84namespace Dumux {
85
87{
88 // 1st layer abcissas: transformed 0, 1, 2, 3
89 0.00000000000000000000,
90 0.95136796407274694573,
91 0.99997747719246159286,
92 0.99999999999995705839,
93 // 2nd layer abcissas: transformed 1/2, 3/2, 5/2
94 0.67427149224843582608,
95 0.99751485645722438683,
96 0.99999998887566488198,
97 // 3rd layer abcissas: transformed 1/4, 3/4, ...
98 0.37720973816403417379,
99 0.85956905868989663517,
100 0.98704056050737689169,
101 0.99968826402835320905,
102 0.99999920473711471266,
103 0.99999999995285644818,
104 // 4th layer abcissas: transformed 1/8, 3/8, ...
105 0.19435700332493543161,
106 0.53914670538796776905,
107 0.78060743898320029925,
108 0.91487926326457461091,
109 0.97396686819567744856,
110 0.99405550663140214329,
111 0.99906519645578584642,
112 0.99990938469514399984,
113 0.99999531604122052843,
114 0.99999989278161241838,
115 0.99999999914270509218,
116 0.99999999999823216531,
117 // 5th layer abcissa: transformed 1/16, 3/16, ...
118 0.097923885287832333262,
119 0.28787993274271591456,
120 0.46125354393958570440,
121 0.61027365750063894488,
122 0.73101803479256151149,
123 0.82331700550640237006,
124 0.88989140278426019808,
125 0.93516085752198468323,
126 0.96411216422354729193,
127 0.98145482667733517003,
128 0.99112699244169880223,
129 0.99610866543750854254,
130 0.99845420876769773751,
131 0.99945143443527460584,
132 0.99982882207287494166,
133 0.99995387100562796075,
134 0.99998948201481850361,
135 0.99999801714059543208,
136 0.99999969889415261122,
137 0.99999996423908091534,
138 0.99999999678719909830,
139 0.99999999978973286224,
140 0.99999999999039393352,
141 0.99999999999970809734,
142 // 6th layer abcissas: transformed 1/32, 3/32, ...
143 0.049055967305077886315,
144 0.14641798429058794053,
145 0.24156631953888365838,
146 0.33314226457763809244,
147 0.41995211127844715849,
148 0.50101338937930910152,
149 0.57558449063515165995,
150 0.64317675898520470128,
151 0.70355000514714201566,
152 0.75669390863372994941,
153 0.80279874134324126576,
154 0.84221924635075686382,
155 0.87543539763040867837,
156 0.90301328151357387064,
157 0.92556863406861266645,
158 0.94373478605275715685,
159 0.95813602271021369012,
160 0.96936673289691733517,
161 0.97797623518666497298,
162 0.98445883116743083087,
163 0.98924843109013389601,
164 0.99271699719682728538,
165 0.99517602615532735426,
166 0.99688031812819187372,
167 0.99803333631543375402,
168 0.99879353429880589929,
169 0.99928111192179195541,
170 0.99958475035151758732,
171 0.99976797159956083506,
172 0.99987486504878034648,
173 0.99993501992508242369,
174 0.99996759306794345976,
175 0.99998451990227082442,
176 0.99999293787666288565,
177 0.99999693244919035751,
178 0.99999873547186590954,
179 0.99999950700571943689,
180 0.99999981889371276701,
181 0.99999993755407837378,
182 0.99999997987450320175,
183 0.99999999396413420165,
184 0.99999999832336194826,
185 0.99999999957078777261,
186 0.99999999989927772326,
187 0.99999999997845533741,
188 0.99999999999582460688,
189 0.99999999999927152627,
190 0.99999999999988636130,
191 // 7th layer abcissas: transformed 1/64, 3/64, ...
192 0.024539763574649160379,
193 0.073525122985671294475,
194 0.12222912220155764235,
195 0.17046797238201051811,
196 0.21806347346971200463,
197 0.26484507658344795046,
198 0.31065178055284596083,
199 0.35533382516507453330,
200 0.39875415046723775644,
201 0.44078959903390086627,
202 0.48133184611690504422,
203 0.52028805069123015958,
204 0.55758122826077823080,
205 0.59315035359195315880,
206 0.62695020805104287950,
207 0.65895099174335012438,
208 0.68913772506166767176,
209 0.71750946748732412721,
210 0.74407838354734739913,
211 0.76886868676824658459,
212 0.79191549237614211447,
213 0.81326360850297385168,
214 0.83296629391941087564,
215 0.85108400798784873261,
216 0.86768317577564598669,
217 0.88283498824466895513,
218 0.89661425428007602579,
219 0.90909831816302043511,
220 0.92036605303195280235,
221 0.93049693799715340631,
222 0.93957022393327475539,
223 0.94766419061515309734,
224 0.95485549580502268541,
225 0.96121861515111640753,
226 0.96682537031235585284,
227 0.97174454156548730892,
228 0.97604156025657673933,
229 0.97977827580061576265,
230 0.98301279148110110558,
231 0.98579936302528343597,
232 0.98818835380074264243,
233 0.99022624046752774694,
234 0.99195566300267761562,
235 0.99341551316926403900,
236 0.99464105571251119672,
237 0.99566407681695316965,
238 0.99651305464025377317,
239 0.99721334704346870224,
240 0.99778739195890653083,
241 0.99825491617199629344,
242 0.99863314864067747762,
243 0.99893703483351217373,
244 0.99917944893488591716,
245 0.99937140114093768690,
246 0.99952223765121720422,
247 0.99963983134560036519,
248 0.99973076151980848263,
249 0.99980048143113838630,
250 0.99985347277311141171,
251 0.99989338654759256426,
252 0.99992317012928932869,
253 0.99994518061445869309,
254 0.99996128480785666613,
255 0.99997294642523223656,
256 0.99998130127012072679,
257 0.99998722128200062811,
258 0.99999136844834487344,
259 0.99999423962761663478,
260 0.99999620334716617675,
261 0.99999752962380516793,
262 0.99999841381096473542,
263 0.99999899541068996962,
264 0.99999937270733536947,
265 0.99999961398855024275,
266 0.99999976602333243312,
267 0.99999986037121459941,
268 0.99999991800479471056,
269 0.99999995264266446185,
270 0.99999997311323594362,
271 0.99999998500307631173,
272 0.99999999178645609907,
273 0.99999999558563361584,
274 0.99999999767323673790,
275 0.99999999879798350040,
276 0.99999999939177687583,
277 0.99999999969875436925,
278 0.99999999985405611550,
279 0.99999999993088839501,
280 0.99999999996803321674,
281 0.99999999998556879008,
282 0.99999999999364632387,
283 0.99999999999727404948,
284 0.99999999999886126543,
285 0.99999999999953722654,
286 0.99999999999981720098,
287 0.99999999999992987953
288}; // end abcissas
289
291{
292 // First layer weights
293 1.5707963267948966192,
294 0.230022394514788685,
295 0.00026620051375271690866,
296 1.3581784274539090834e-12,
297 // 2nd layer weights
298 0.96597657941230114801,
299 0.018343166989927842087,
300 2.1431204556943039358e-7,
301 // 3rd layer weights
302 1.3896147592472563229,
303 0.53107827542805397476,
304 0.076385743570832304188,
305 0.0029025177479013135936,
306 0.000011983701363170720047,
307 1.1631165814255782766e-9,
308 // 4th layer weights
309 1.5232837186347052132,
310 1.1934630258491569639,
311 0.73743784836154784136,
312 0.36046141846934367417,
313 0.13742210773316772341,
314 0.039175005493600779072,
315 0.0077426010260642407123,
316 0.00094994680428346871691,
317 0.000062482559240744082891,
318 1.8263320593710659699e-6,
319 1.8687282268736410132e-8,
320 4.9378538776631926964e-11,
321 // 5th layer weights
322 1.5587733555333301451,
323 1.466014426716965781,
324 1.297475750424977998,
325 1.0816349854900704074,
326 0.85017285645662006895,
327 0.63040513516474369106,
328 0.44083323627385823707,
329 0.290240679312454185,
330 0.17932441211072829296,
331 0.10343215422333290062,
332 0.055289683742240583845,
333 0.027133510013712003219,
334 0.012083543599157953493,
335 0.0048162981439284630173,
336 0.0016908739981426396472,
337 0.00051339382406790336017,
338 0.00013205234125609974879,
339 0.000028110164327940134749,
340 4.8237182032615502124e-6,
341 6.4777566035929719908e-7,
342 6.5835185127183396672e-8,
343 4.8760060974240625869e-9,
344 2.5216347918530148572e-10,
345 8.6759314149796046502e-12,
346 // 6th layer weights
347 1.5677814313072218572,
348 1.5438811161769592204,
349 1.4972262225410362896,
350 1.4300083548722996676,
351 1.3452788847662516615,
352 1.2467012074518577048,
353 1.1382722433763053734,
354 1.0240449331118114483,
355 0.90787937915489531693,
356 0.79324270082051671787,
357 0.68306851634426375464,
358 0.57967810308778764708,
359 0.48475809121475539287,
360 0.39938474152571713515,
361 0.32408253961152890402,
362 0.258904639514053516,
363 0.20352399885860174519,
364 0.15732620348436615027,
365 0.11949741128869592428,
366 0.089103139240941462841,
367 0.065155533432536205042,
368 0.046668208054846613644,
369 0.032698732726609031113,
370 0.022379471063648476483,
371 0.014937835096050129696,
372 0.0097072237393916892692,
373 0.0061300376320830301252,
374 0.0037542509774318343023,
375 0.0022250827064786427022,
376 0.0012733279447082382027,
377 0.0007018595156842422708,
378 0.00037166693621677760301,
379 0.00018856442976700318572,
380 0.000091390817490710122732,
381 0.000042183183841757600604,
382 0.000018481813599879217116,
383 7.6595758525203162562e-6,
384 2.9916615878138787094e-6,
385 1.0968835125901264732e-6,
386 3.7595411862360630091e-7,
387 1.1992442782902770219e-7,
388 3.5434777171421953043e-8,
389 9.6498888961089633609e-9,
390 2.4091773256475940779e-9,
391 5.482835779709497755e-10,
392 1.1306055347494680536e-10,
393 2.0989335404511469109e-11,
394 3.4841937670261059685e-12,
395 // 7th layer weights
396 1.5700420292795931467,
397 1.5640214037732320999,
398 1.5520531698454121192,
399 1.5342817381543034316,
400 1.5109197230741697127,
401 1.48224329788553807,
402 1.4485862549613225916,
403 1.4103329714462590129,
404 1.3679105116808964881,
405 1.3217801174437728579,
406 1.2724283455378627082,
407 1.2203581095793582207,
408 1.1660798699324345766,
409 1.1101031939653403796,
410 1.0529288799552666556,
411 0.99504180404613271514,
412 0.93690461274566793366,
413 0.87895234555278212039,
414 0.82158803526696470334,
415 0.7651792989089561367,
416 0.71005590120546898385,
417 0.65650824613162753076,
418 0.60478673057840362158,
419 0.55510187800363350959,
420 0.5076251588319080997,
421 0.4624903980553677613,
422 0.41979566844501548066,
423 0.37960556938665160999,
424 0.3419537959230168323,
425 0.30684590941791694932,
426 0.27426222968906810637,
427 0.24416077786983990868,
428 0.21648020911729617038,
429 0.19114268413342749532,
430 0.16805663794826916233,
431 0.14711941325785693248,
432 0.12821973363120098675,
433 0.11123999898874453035,
434 0.096058391865189467849,
435 0.082550788110701737654,
436 0.070592469906866999352,
437 0.060059642358636300319,
438 0.05083075757257047107,
439 0.042787652157725676034,
440 0.035816505604196436523,
441 0.029808628117310126969,
442 0.024661087314753282511,
443 0.020277183817500123926,
444 0.016566786254247575375,
445 0.013446536605285730674,
446 0.010839937168255907211,
447 0.0086773307495391815854,
448 0.0068957859690660035329,
449 0.0054388997976239984331,
450 0.0042565295990178580165,
451 0.0033044669940348302363,
452 0.0025440657675291729678,
453 0.0019418357759843675814,
454 0.0014690143599429791058,
455 0.0011011261134519383862,
456 0.00081754101332469493115,
457 0.00060103987991147422573,
458 0.00043739495615911687786,
459 0.00031497209186021200274,
460 0.00022435965205008549104,
461 0.00015802788400701191949,
462 0.00011002112846666697224,
463 0.000075683996586201477788,
464 0.000051421497447658802092,
465 0.0000344921247593431977,
466 0.000022832118109036146591,
467 0.000014908514031870608449,
468 9.5981941283784710776e-6,
469 6.0899100320949039256e-6,
470 3.8061983264644899045e-6,
471 2.3421667208528096843e-6,
472 1.4183067155493917523e-6,
473 8.4473756384859863469e-7,
474 4.9458288702754198508e-7,
475 2.8449923659159806339e-7,
476 1.6069394579076224911e-7,
477 8.9071395140242387124e-8,
478 4.8420950198072369669e-8,
479 2.579956822953589238e-8,
480 1.3464645522302038796e-8,
481 6.8784610955899001111e-9,
482 3.4371856744650090511e-9,
483 1.6788897682161906807e-9,
484 8.0099784479729665356e-10,
485 3.7299501843052790038e-10,
486 1.6939457789411646876e-10,
487 7.4967397573818224522e-11,
488 3.230446433325236576e-11,
489 1.3542512912336274432e-11,
490 5.5182369468174885821e-12,
491 2.1835922099233609052e-12
492}; // end weights
493
494} // end namespace Dumux
495
496#endif
Definition: adapt.hh:17
constexpr double doubleExponentialIntegrationWeights[]
Definition: doubleexpintegrationconstants.hh:290
constexpr double doubleExponentialIntegrationAbcissas[]
Definition: doubleexpintegrationconstants.hh:86