OPAL (Object Oriented Parallel Accelerator Library) 2022.1
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
37namespace tanhderiv {
38
40 double a;
41 double s0;
42 double lambdaleft;
44 double r;
45 int n;
46};
47
48double my_f (double x, void *p) {
49 struct my_f_params *params = (struct my_f_params *)p;
50 gsl_complex z = gsl_complex_add(gsl_complex_rect(params->a, 0),
51 gsl_complex_polar(params->r, x));
52 gsl_complex z1 = gsl_complex_div(gsl_complex_add(z,
53 gsl_complex_rect(params->s0, 0)),
54 gsl_complex_rect(params->lambdaleft, 0));
55 gsl_complex z2 = gsl_complex_div(gsl_complex_sub(z,
56 gsl_complex_rect(params->s0, 0)),
57 gsl_complex_rect(params->lambdaright, 0));
58 gsl_complex func = gsl_complex_div(gsl_complex_sub(gsl_complex_tanh(z1),
59 gsl_complex_tanh(z2)),
60 gsl_complex_rect(2, 0));
61 func = gsl_complex_mul(func, gsl_complex_polar(1, -params->n * x));
62 return gsl_sf_fact(params->n) * GSL_REAL(func)
63 / (2 * M_PI * gsl_sf_pow_int(params->r, params->n));
64}
65
66double integrate(const double &a,
67 const double &s0,
68 const double &lambdaleft,
69 const double &lambdaright,
70 const int &n) {
71 gsl_function F;
72 double radius = gsl_hypot(a - 2, lambdaright * M_PI / 2) - 0.01;
73 double radius2 = gsl_hypot(a + 2, lambdaleft * M_PI / 2) - 0.01;
74 if (radius > radius2) radius = radius2;
75 struct my_f_params params = {a, s0, lambdaleft, lambdaright, radius, n};
76 F.function = &my_f;
77 F.params = &params;
78 gsl_integration_workspace *w = gsl_integration_workspace_alloc(100);
79 double error = gsl_sf_pow_int(10, -12);
80 double *result = new double;
81 double *abserr = new double;
82 gsl_set_error_handler_off();
83 int status = gsl_integration_qag(&F, 0, 2 * M_PI, 0, error,
84 100, 6, w, result, abserr);
85 gsl_integration_workspace_free(w);
86 double finalResult = *result;
87 delete result;
88 delete abserr;
89 if (status) {
90 return 0;
91 }
92 else return finalResult;
93}
94
95}
std::complex< double > a
double my_f(double x, void *p)
Definition: tanhDeriv.cpp:48
double integrate(const double &a, const double &s0, const double &lambdaleft, const double &lambdaright, const int &n)
Definition: tanhDeriv.cpp:66