OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
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 namespace tanhderiv {
38 
39 struct my_f_params {
40  double a;
41  double s0;
42  double lambdaleft;
43  double lambdaright;
44  double r;
45  int n;
46 };
47 
48 double 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 
66 double 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 }
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