aboutsummaryrefslogtreecommitdiff
path: root/Examples/Tests/btd_rz/analysis_BTD_laser_antenna.py
blob: e2f174d6e29cfc6fbcd7ba566afe3d99937d9e0a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/env python3

# Copyright 2022
# Authors: Revathi Jambunathan, Remi Lehe
#
# This tests checks the backtransformed diagnostics by emitting a laser
# (with the antenna) in the boosted-frame and then checking that the
# fields recorded by the backtransformed diagnostics have the right amplitude,
# wavelength, and envelope (i.e. gaussian envelope with the right duration.

import os
import sys

import numpy as np
from openpmd_viewer import OpenPMDTimeSeries
from scipy.constants import c, e, m_e
from scipy.optimize import curve_fit

sys.path.insert(1, '../../../../warpx/Regression/Checksum/')
import checksumAPI


def gaussian_laser( z, a0, z0_phase, z0_prop, ctau, lambda0 ):
    """
    Returns a Gaussian laser profile
    """
    k0 = 2*np.pi/lambda0
    E0 = a0*m_e*c**2*k0/e
    return( E0*np.exp( - (z-z0_prop)**2/ctau**2 ) \
                *np.cos( k0*(z-z0_phase) ) )

# Fit the on-axis profile to extract the phase (a.k.a. CEP)
def fit_function(z, z0_phase):
    return( gaussian_laser( z, a0, z0_phase,
                            z0_b+Lprop_b, ctau0, lambda0 ) )

plotfile = sys.argv[1]

# The values must be consistent with the values provided in the simulation input
t_current = 80e-15   # Time of the snapshot1
c = 299792458;
z0_antenna = -1.e-6  # position of laser
lambda0 = 0.8e-6     # wavelength of the signal
tau0 = 10e-15        # duration of the signal
ctau0 = tau0 * c
a0 = 15              # amplitude
t_peak = 20e-15      # Time at which laser reaches its peak
Lprop_b = c*t_current
z0_b = z0_antenna - c * t_peak

ts = OpenPMDTimeSeries('./diags/back_rz')
Ex, info = ts.get_field('E', 'x', iteration=1, slice_across='r')

fit_result = curve_fit( fit_function, info.z, Ex,
                        p0=np.array([z0_b+Lprop_b]) )
z0_fit = fit_result[0]

Ex_fit = gaussian_laser( info.z, a0, z0_fit, z0_b+Lprop_b, ctau0, lambda0)

## Check that the a0 agrees within 5% of the predicted value
assert np.allclose( Ex, Ex_fit, atol=0.18*Ex.max() )

# Checksum regression analysis
test_name = os.path.split(os.getcwd())[1]
checksumAPI.evaluate_checksum(test_name, plotfile)