2#include "math/libfunc.h"
17 return std::sinh(
y) /
y;
24#pragma acc routine seq
29 static_assert(1 <= N && N <= 7,
"1 <= N <= 7 is violated.");
32#pragma acc routine seq
33template <
int N,
class T>
38 constexpr int M = N - 1;
41 constexpr T c[][2][3] = {
42 {{1./1 , 53./396 , 551./166320 },{1.,-13./396 , 5./11088 }},
43 {{1./3 ,211./8580 ,2647./6486480 },{1.,-15./572 ,17./61776 }},
44 {{1./15 ,271./81900 , 7./171600 },{1.,-17./780 ,19./102960}},
45 {{1./105 ,113./321300 ,1889./551350800 },{1.,-19./1020, 7./53040 }},
46 {{1./945 , 83./2686068 ,7789./31426995600 },{1.,-21./1292,23./232560}},
47 {{1./10395 ,499./215675460 ,3461./219988969200},{1.,-23./1596,25./325584}},
48 {{1./135135,197./1305404100, 409./459976935600},{1.,-25./1932, 3./48944 }}};
50 return (c[M][0][0] + x2 * (c[M][0][1] + x2 * c[M][0][2]))
51 / (c[M][1][0] + x2 * (c[M][1][1] + x2 * c[M][1][2]));
54#pragma acc routine seq
55template <
int N,
class T>
60 constexpr int M = N - 1;
62 constexpr T c[][5] = {
63 {1. / 1 , 1. / 6 , 1. / 20, 1. / 42 , 1. / 72 },
64 {1. / 3 , 1. / 10, 1. / 28, 1. / 54 , 1. / 88 },
65 {1. / 15 , 1. / 14, 1. / 36, 1. / 66 , 1. / 104},
66 {1. / 105 , 1. / 18, 1. / 44, 1. / 78 , 1. / 120},
67 {1. / 945 , 1. / 22, 1. / 52, 1. / 90 , 1. / 136},
68 {1. / 10395 , 1. / 26, 1. / 60, 1. / 102, 1. / 152},
69 {1. / 135135, 1. / 30, 1. / 68, 1. / 114, 1. / 168}};
70 return c[M][0]*(1+x2*c[M][1]*(1+x2*c[M][2]*(1+x2*c[M][3]*(1+x2*c[M][4]))));
74#pragma acc routine seq
75template <
int N,
class T>
79 return fsinhcTaylor<N>(x2);
83#pragma acc routine seq
89 cy = d * (d * (d * (d * (d * (d + 21) + 210) + 1260) + 4725) + 10395)
92 cz = d * (d * (d * (d * (d * (d - 21) + 210) - 1260) + 4725) - 10395)
94 return (cy *
y + cz *
z) / (2 * d13);
97#pragma acc routine seq
103 cy = d * (d * (d * (d * (d + 15) + 105) + 420) + 945) + 945;
104 cz = d * (d * (d * (d * (d - 15) + 105) - 420) + 945) - 945;
105 return (cy *
y + cz *
z) / (2 * d11);
108#pragma acc routine seq
114 cy = d * (d * (d * (d + 10) + 45) + 105) + 105;
116 cz = d * (d * (d * (d - 10) + 45) - 105) + 105;
117 return (cy *
y + cz *
z) / (2 * d9);
120#pragma acc routine seq
126 cy = d * (d * (d + 6) + 15) + 15;
127 cz = d * (d * (d - 6) + 15) - 15;
128 return (cy *
y + cz *
z) / (2 * d7);
131#pragma acc routine seq
137 cy = (d + 3) * d + 3;
139 cz = (d - 3) * d + 3;
140 return (cy *
y + cz *
z) / (2 * d5);
143#pragma acc routine seq
151 return (cy *
y + cz *
z) / (2 * d3);
154#pragma acc routine seq
162 return (cy *
y + cz *
z) / (2 * d);
165#pragma acc routine seq
166template <
int N,
class T>
172 constexpr int M = N - 1;
198 double epsd[] = {0.28, 0.33, 0.37, 0.40, 0.43, 0.46, 0.49};
199 float epsfl[] = {0.92, 1.06, 1.19, 1.30, 1.40, 1.49, 1.58};
200 T absd, eps, expmd, exppd;
201 if CONSTEXPR (
sizeof(T) ==
sizeof(
float)) {
202 absd = fabsf(d), eps = epsfl[M];
203 expmd = expf(-d), exppd = expf(+d);
205 absd = fabs(d), eps = epsd[M];
206 expmd = exp(-d), exppd = exp(+d);
210 T d3, d5, d7, d9, d11, d13;
216 f1d = fsinhcSeries<1>(d2);
224 f2d = fsinhcSeries<2>(d2);
232 f3d = fsinhcSeries<3>(d2);
241 f4d = fsinhcSeries<4>(d2);
249 f5d = fsinhcSeries<5>(d2);
257 f6d = fsinhcSeries<6>(d2);
261 d13 = d3 * d3 * d3 * d4;
265 f7d = fsinhcSeries<7>(d2);
273#pragma acc routine seq
278 T f2d, f3d, f4d, f5d, f6d, f7d;
279 fsinhcImpl<1, T>(d, f1d, f2d, f3d, f4d, f5d, f6d, f7d);
282#pragma acc routine seq
287 T f3d, f4d, f5d, f6d, f7d;
288 fsinhcImpl<2, T>(d, f1d, f2d, f3d, f4d, f5d, f6d, f7d);
291#pragma acc routine seq
296 T f4d, f5d, f6d, f7d;
297 fsinhcImpl<3, T>(d, f1d, f2d, f3d, f4d, f5d, f6d, f7d);
300#pragma acc routine seq
307 fsinhcImpl<4, T>(d, f1d, f2d, f3d, f4d, f5d, f6d, f7d);
310#pragma acc routine seq
317 fsinhcImpl<5, T>(d, f1d, f2d, f3d, f4d, f5d, f6d, f7d);
320#pragma acc routine seq
327 fsinhcImpl<6, T>(d, f1d, f2d, f3d, f4d, f5d, f6d, f7d);
330#pragma acc routine seq
336 fsinhcImpl<7, T>(d, f1d, f2d, f3d, f4d, f5d, f6d, f7d);
#define SEQ_CUDA
Definition: acc/seqdef.h:12
#define restrict
Definition: macro.h:51
#define CONSTEXPR
Definition: macro.h:61
real * z
Current coordinates used in energy evaluation and neighbor lists.
real * x
Number of the trajectory frames.
real * y
Current coordinates used in energy evaluation and neighbor lists.
__device__ void fsinhc5(T d, T &__restrict__ f1d, T &__restrict__ f2d, T &__restrict__ f3d, T &__restrict__ f4d, T &__restrict__ f5d)
Definition: sinhc.h:313
__device__ void fsinhc2(T d, T &__restrict__ f1d, T &__restrict__ f2d)
Definition: sinhc.h:285
__device__ void fsinhc7(T d, T &__restrict__ f1d, T &__restrict__ f2d, T &__restrict__ f3d, T &__restrict__ f4d, T &__restrict__ f5d, T &__restrict__ f6d, T &__restrict__ f7d)
Definition: sinhc.h:333
__device__ void fsinhc1(T d, T &__restrict__ f1d)
Definition: sinhc.h:276
__device__ void fsinhc3(T d, T &__restrict__ f1d, T &__restrict__ f2d, T &__restrict__ f3d)
Definition: sinhc.h:294
T sinhc(T x)
Definition: sinhc.h:11
__device__ void fsinhc4(T d, T &__restrict__ f1d, T &__restrict__ f2d, T &__restrict__ f3d, T &__restrict__ f4d)
Definition: sinhc.h:303
__device__ void fsinhc6(T d, T &__restrict__ f1d, T &__restrict__ f2d, T &__restrict__ f3d, T &__restrict__ f4d, T &__restrict__ f5d, T &__restrict__ f6d)
Definition: sinhc.h:323
__device__ T fsinhcTaylor(T x2)
Definition: sinhc.h:57
__device__ T fsinhcPade44(T x2)
Definition: sinhc.h:35
__device__ T fsinhcSeries(T x2)
Definition: sinhc.h:77
__device__ T fsinhcAnalyt1(T d, T y, T z)
Definition: sinhc.h:157
__device__ T fsinhcAnalyt7(T d, T d13, T y, T z)
Definition: sinhc.h:86
__device__ void fsinhcImpl(T d, T &__restrict__ f1d, T &__restrict__ f2d, T &__restrict__ f3d, T &__restrict__ f4d, T &__restrict__ f5d, T &__restrict__ f6d, T &__restrict__ f7d)
Definition: sinhc.h:168
__device__ T fsinhcAnalyt4(T d, T d7, T y, T z)
Definition: sinhc.h:123
__device__ T fsinhcAnalyt6(T d, T d11, T y, T z)
Definition: sinhc.h:100
__device__ void fsinhcCheck()
Definition: sinhc.h:27
__device__ T fsinhcAnalyt3(T d, T d5, T y, T z)
Definition: sinhc.h:134
__device__ T fsinhcAnalyt5(T d, T d9, T y, T z)
Definition: sinhc.h:111
__device__ T fsinhcAnalyt2(T d, T d3, T y, T z)
Definition: sinhc.h:146