Skip to content

Commit 16cd5da

Browse files
committed
replaced spectral laplacian by finite-difference one
1 parent fc76844 commit 16cd5da

File tree

2 files changed

+27
-29
lines changed

2 files changed

+27
-29
lines changed

axiprop/simulation/inline_methods.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,35 @@
22
from numba import jit, prange
33
from scipy.constants import e, m_e, c
44

5-
@jit(nopython=True, cache=True, parallel=True)
65
def wake_kernel_integrate(kernel_t, delta_n, k_p, xi_ax):
76
dxi = xi_ax[1] - xi_ax[0]
8-
for it in prange(1, xi_ax.size):
7+
for it in range(1, xi_ax.size):
98
xi = xi_ax[it]
109
delta_n[it] = dxi * np.sum(
1110
kernel_t[:it] * np.sin( k_p * (xi - xi_ax[:it, None]) ),
1211
axis=0
1312
)
1413
return delta_n
1514

15+
def laplacian_fd(A, xi_ax, r_ax):
16+
r_inv = 1.0 / r_ax
17+
dxi_inv = 1.0 / ( xi_ax[1] - xi_ax[0] )
18+
dxi2_inv = dxi_inv * dxi_inv
19+
dr_inv = 1.0 / ( r_ax[1] - r_ax[0] )
20+
dr2_inv = dr_inv * dr_inv
21+
22+
nabla2_A = np.zeros_like(A)
23+
24+
nabla2_A[1:-1, 1:-1] = \
25+
dxi2_inv * (A[2:, 1:-1] - 2* A[1:-1, 1:-1] + A[:-2, 1:-1]) \
26+
+ dr2_inv * (A[1:-1, 2:] - 2* A[1:-1, 1:-1] + A[1:-1, :-2,]) \
27+
+ r_inv[None, 1:-1] * 0.5 * dr_inv * (A[1:-1, 2:] - A[1:-1, :-2] )
28+
29+
nabla2_A[:,0] = nabla2_A[:,1]
30+
31+
return nabla2_A
32+
33+
1634
@jit(nopython=True, cache=True)
1735
def get_ADK_probability(E_fld, dt, adk_power, \
1836
adk_prefactor, adk_exp_prefactor):

axiprop/simulation/plasma.py

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from .inline_methods import get_plasma_ADK_ref
1313
from .inline_methods import get_OFI_heating
1414
from .inline_methods import wake_kernel_integrate
15+
from .inline_methods import laplacian_fd
1516

1617
r_e = e**2 / m_e / c**2 / 4 / pi /epsilon_0
1718
mc_m2 = 1. / ( m_e * c )**2
@@ -123,46 +124,25 @@ def get_density(self, E_ft ):
123124
sim = self.sim
124125
prop = self.sim.prop
125126
n_pe = self.n_pe
127+
xi_ax = c * ScalarFieldEnvelope(*sim.EnvArgs).t
128+
r_ax = prop.r_new
126129
k_p = np.sqrt( 4 * np.pi * r_e * n_pe )
127130

128-
# normalized vector potential
131+
# get normalized vector potential
129132
A_ft = -1j * prop.omega_inv * e_mc * E_ft
130133
A_ft *= (prop.kz[:, None]>0.0)
131134

132-
# from frequency to time
135+
# bring from frequency to time domain
133136
A_obj = ScalarFieldEnvelope(*sim.EnvArgs)
134137
A_obj.t += sim.dt_shift
135138
A_obj.t_loc += sim.dt_shift
136139
A_t = A_obj.import_field_ft(A_ft).Field
137140

138141
# cycle-averaged square of normalized vector potential
139-
A2_t = 0.5 * np.astype( np.abs(A_t)**2, A_t.dtype )
140-
141-
# from time to frequency
142-
A2_obj = ScalarFieldEnvelope(*sim.EnvArgs)
143-
A2_obj.t += sim.dt_shift
144-
A2_obj.t_loc += sim.dt_shift
145-
A2_ft = A2_obj.import_field(A2_t).Field_ft
146-
147-
# transverse spectral transform
148-
A2_ts = prop.perform_transfer_TST( A2_ft )
149-
150-
# wakefield kernel (spectral calculation of Laplacian)
151-
k_env = ScalarFieldEnvelope(*sim.EnvArgs).k_freq_base
152-
laplacian_ts = -( k_env[:, None]**2 + prop.kr[None,:]**2 )
153-
laplacian_ts = prop.bcknd.to_device(laplacian_ts)
154-
155-
kernel_ts = 0.5 / k_p * laplacian_ts * A2_ts
156-
kernel_ft = prop.perform_iTST_transfer(kernel_ts)
157-
158-
kernel_obj = ScalarFieldEnvelope(*sim.EnvArgs)
159-
kernel_obj.t += sim.dt_shift
160-
kernel_obj.t_loc += sim.dt_shift
161-
kernel_t = kernel_obj.import_field_ft(kernel_ft).Field
162-
kernel_t = np.abs(kernel_t)
142+
A2_t = 0.5 * np.abs(A_t)**2
143+
kernel_t = 0.5 / k_p * laplacian_fd(A2_t, xi_ax, r_ax)
163144

164145
# do the integral
165-
xi_ax = c * kernel_obj.t.copy()
166146
delta_n = np.zeros_like(kernel_t)
167147
delta_n = wake_kernel_integrate(kernel_t, delta_n, k_p, xi_ax)
168148

0 commit comments

Comments
 (0)