OPAL (Object Oriented Parallel Accelerator Library) 2024.2
OPAL
tanhDeriv.cpp
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018, Martin Duy Tat
3 * All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 * 1. Redistributions of source code must retain the above copyright notice,
7 * this list of conditions and the following disclaimer.
8 * 2. Redistributions in binary form must reproduce the above copyright notice,
9 * this list of conditions and the following disclaimer in the documentation
10 * and/or other materials provided with the distribution.
11 * 3. Neither the name of STFC nor the names of its contributors may be used to
12 * endorse or promote products derived from this software without specific
13 * prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#include <gsl/gsl_integration.h>
29#include <gsl/gsl_complex.h>
30#include <gsl/gsl_complex_math.h>
31#include <gsl/gsl_sf_pow_int.h>
32#include <gsl/gsl_math.h>
33#include <gsl/gsl_errno.h>
34#include <gsl/gsl_sf_gamma.h>
35#include "tanhDeriv.h"
36
37#include <Physics/Physics.h>
38
39namespace tanhderiv {
40
42 double a;
43 double s0;
44 double lambdaleft;
46 double r;
47 int n;
48};
49
50double my_f (double x, void *p) {
51 struct my_f_params *params = (struct my_f_params *)p;
52 gsl_complex z = gsl_complex_add(gsl_complex_rect(params->a, 0),
53 gsl_complex_polar(params->r, x));
54 gsl_complex z1 = gsl_complex_div(gsl_complex_add(z,
55 gsl_complex_rect(params->s0, 0)),
56 gsl_complex_rect(params->lambdaleft, 0));
57 gsl_complex z2 = gsl_complex_div(gsl_complex_sub(z,
58 gsl_complex_rect(params->s0, 0)),
59 gsl_complex_rect(params->lambdaright, 0));
60 gsl_complex func = gsl_complex_div(gsl_complex_sub(gsl_complex_tanh(z1),
61 gsl_complex_tanh(z2)),
62 gsl_complex_rect(2, 0));
63 func = gsl_complex_mul(func, gsl_complex_polar(1, -params->n * x));
64 return gsl_sf_fact(params->n) * GSL_REAL(func)
65 / (Physics::two_pi * gsl_sf_pow_int(params->r, params->n));
66}
67
68double integrate(const double &a,
69 const double &s0,
70 const double &lambdaleft,
71 const double &lambdaright,
72 const int &n) {
73 gsl_function F;
74 double radius = gsl_hypot(a - 2, lambdaright * Physics::pi / 2) - 0.01;
75 double radius2 = gsl_hypot(a + 2, lambdaleft * Physics::pi / 2) - 0.01;
76 if (radius > radius2) radius = radius2;
77 my_f_params params = {a, s0, lambdaleft, lambdaright, radius, n};
78 F.function = &my_f;
79 F.params = &params;
80 gsl_integration_workspace *w = gsl_integration_workspace_alloc(100);
81 double error = gsl_sf_pow_int(10, -12);
82 double result;
83 double abserr;
84 gsl_set_error_handler_off();
85 int status = gsl_integration_qag(&F, 0, Physics::two_pi, 0, error,
86 100, GSL_INTEG_GAUSS61, w, &result, &abserr);
87 gsl_integration_workspace_free(w);
88 if (status) {
89 return result = 0.0;
90 }
91 return result;
92}
93
94}
std::complex< double > a
double my_f(double x, void *p)
Definition tanhDeriv.cpp:50
double integrate(const double &a, const double &s0, const double &lambdaleft, const double &lambdaright, const int &n)
Definition tanhDeriv.cpp:68
constexpr double two_pi
The value of.
Definition Physics.h:33
constexpr double pi
The value of.
Definition Physics.h:30