Line data Source code
1 : // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2 : // SPDX-License-Identifier: Apache-2.0
3 :
4 : #ifndef PALACE_UTILS_EXCITATIONS_HPP
5 : #define PALACE_UTILS_EXCITATIONS_HPP
6 :
7 : #include <cmath>
8 :
9 : namespace palace::excitations
10 : {
11 :
12 : //
13 : // Define temporal excitation functions for transient simulations.
14 : //
15 :
16 : inline double pulse_sinusoidal(double t, double omega, double t0)
17 : {
18 : // g(t) = sin(ω*(t-t0))
19 0 : return std::sin(omega * (t - t0));
20 : }
21 :
22 : inline double dpulse_sinusoidal(double t, double omega, double t0)
23 : {
24 : // g(t) = sin(ω*(t-t0))
25 0 : return omega * std::cos(omega * (t - t0));
26 : }
27 :
28 : inline double pulse_gaussian(double t, double tau, double t0)
29 : {
30 : // g(t) = exp(-0.5*(t-t0)²/τ²)
31 0 : double ts = t - t0;
32 0 : return std::exp(-0.5 * ts * ts / (tau * tau));
33 : }
34 :
35 : inline double dpulse_gaussian(double t, double tau, double t0)
36 : {
37 : // g(t) = exp(-0.5*(t-t0)²/τ²)
38 0 : double ootau2 = 1.0 / (tau * tau);
39 0 : double ts = t - t0;
40 0 : return -ts * ootau2 * std::exp(-0.5 * ts * ts * ootau2);
41 : }
42 :
43 : inline double pulse_gaussian_diff(double t, double tau, double t0)
44 : {
45 : // g(t) = -(t-t0)/τ²*exp(-0.5*(t-t0)²/τ²)
46 0 : double ootau2 = 1.0 / (tau * tau);
47 0 : double ts = t - t0;
48 0 : return -ts * ootau2 * std::exp(-0.5 * ts * ts * ootau2);
49 : }
50 :
51 0 : inline double dpulse_gaussian_diff(double t, double tau, double t0)
52 : {
53 : // g(t) = -(t-t0)/τ²*exp(-0.5*(t-t0)²/τ²)
54 0 : double ootau2 = 1.0 / (tau * tau);
55 0 : double ts = t - t0;
56 0 : double ts2 = ts * ts;
57 0 : return -ootau2 * (1.0 - ts2 * ootau2) * std::exp(-0.5 * ts2 * ootau2);
58 : }
59 :
60 0 : inline double pulse_gaussian_mod(double t, double omega, double tau, double t0)
61 : {
62 : // g(t) = sin(ω*(t-t0))*exp(-0.5*(t-t0)²/τ²)
63 0 : double ts = t - t0;
64 0 : return std::sin(omega * ts) * std::exp(-0.5 * ts * ts / (tau * tau));
65 : }
66 :
67 0 : inline double dpulse_gaussian_mod(double t, double omega, double tau, double t0)
68 : {
69 : // g(t) = sin(ω*(t-t0))*exp(-0.5*(t-t0)²/τ²)
70 0 : double ootau2 = 1.0 / (tau * tau);
71 0 : double ts = t - t0;
72 0 : return (-ts * ootau2 * std::sin(omega * ts) + omega * std::cos(omega * ts)) *
73 0 : std::exp(-0.5 * ts * ts * ootau2);
74 : }
75 :
76 : inline double pulse_ramp(double t, double tau, double t0)
77 : {
78 : // g(t) = 0, t <= t0
79 : // (t-t0)/τ, t0 < t <= τ
80 : // 1, t > τ+t0
81 0 : return (t <= t0) ? 0.0 : ((t - t0 >= tau) ? 1.0 : (t - t0) / tau);
82 : }
83 :
84 : inline double dpulse_ramp(double t, double tau, double t0)
85 : {
86 : // g(t) = 0, t <= t0
87 : // (t-t0)/τ, t0 < t <= τ
88 : // 1, t > τ
89 0 : return (t <= t0) ? 0.0 : ((t - t0 >= tau) ? 0.0 : 1.0 / tau);
90 : }
91 :
92 : inline double pulse_smootherstep(double t, double tau, double t0)
93 : {
94 : // g(t) = 0, t <= t0
95 : // 6*((t-t0)/τ)⁵-15*((t-t0)/τ)⁴+10*((t-t0)/τ)³, t0 < t <= τ+t0
96 : // 1, t > τ+t0
97 0 : double ts = (t <= t0) ? 0.0 : ((t - t0 >= tau) ? 1.0 : (t - t0) / tau);
98 0 : double ts2 = ts * ts;
99 0 : return ts * ts2 * (6.0 * ts2 - 15.0 * ts + 10.0);
100 : }
101 :
102 : inline double dpulse_smootherstep(double t, double tau, double t0)
103 : {
104 : // g(t) = 0, t <= t0
105 : // 6*((t-t0)/τ)⁵-15*((t-t0)/τ)⁴+10*((t-t0)/τ)³, t0 < t <= τ
106 : // 1, t > τ
107 0 : double ts = (t <= t0) ? 0.0 : ((t - t0 >= tau) ? 1.0 : (t - t0) / tau);
108 0 : double ts2 = ts * ts;
109 0 : return ts2 / tau * (30.0 * ts2 - 60.0 * ts + 30.0);
110 : }
111 :
112 : } // namespace palace::excitations
113 :
114 : #endif // PALACE_UTILS_EXCITATIONS_HPP
|