diff options
55 files changed, 5003 insertions, 2314 deletions
diff --git a/Docs/source/running_cpp/parameters.rst b/Docs/source/running_cpp/parameters.rst index 75d65deb9..a6fa558f1 100644 --- a/Docs/source/running_cpp/parameters.rst +++ b/Docs/source/running_cpp/parameters.rst @@ -558,36 +558,36 @@ Particle initialization * ``<species>.do_qed`` (`int`) optional (default `0`) If `<species>.do_qed = 0` all the QED effects are disabled for this species. If `<species>.do_qed = 1` QED effects can be enabled for this species (see below). - **Implementation of this feature is in progress. It requires `picsar` on the `QED` branch and to compile with QED=TRUE** + **This feature requires to compile with QED=TRUE** * ``<species>.do_qed_quantum_sync`` (`int`) optional (default `0`) It only works if `<species>.do_qed = 1`. Enables Quantum synchrotron emission for this species. Quantum synchrotron lookup table should be either generated or loaded from disk to enable this process (see "Lookup tables for QED modules" section below). `<species>` must be either an electron or a positron species. - **Implementation of this feature is in progress. It requires `picsar` on the `QED` branch and to compile with QED=TRUE** + **This feature requires to compile with QED=TRUE** * ``<species>.do_qed_breit_wheeler`` (`int`) optional (default `0`) It only works if `<species>.do_qed = 1`. Enables non-linear Breit-Wheeler process for this species. Breit-Wheeler lookup table should be either generated or loaded from disk to enable this process (see "Lookup tables for QED modules" section below). `<species>` must be a photon species. - **Implementation of this feature is in progress. It requires `picsar` on the `QED` branch and to compile with QED=TRUE** + **This feature requires to compile with QED=TRUE** * ``<species>.qed_quantum_sync_phot_product_species`` (`string`) If an electron or a positron species has the Quantum synchrotron process, a photon product species must be specified (the name of an existing photon species must be provided) - **Implementation of this feature is in progress. It requires `picsar` on the `QED` branch and to compile with QED=TRUE** + **This feature requires to compile with QED=TRUE** * ``<species>.qed_breit_wheeler_ele_product_species`` (`string`) If a photon species has the Breit-Wheeler process, an electron product species must be specified (the name of an existing electron species must be provided) - **Implementation of this feature is in progress. It requires `picsar` on the `QED` branch and to compile with QED=TRUE** + **This feature requires to compile with QED=TRUE** * ``<species>.qed_breit_wheeler_pos_product_species`` (`string`) If a photon species has the Breit-Wheeler process, a positron product species must be specified (the name of an existing positron species must be provided). - **Implementation of this feature is in progress. It requires `picsar` on the `QED` branch and to compile with QED=TRUE** + **This feature requires to compile with QED=TRUE** .. _running-cpp-parameters-laser: @@ -1725,23 +1725,22 @@ Reduced Diagnostics The separator between row values in the output file. The default separator is a whitespace. -Lookup tables and other settings for QED modules (implementation in progress) +Lookup tables and other settings for QED modules ----------------------------------------------------------------------------- Lookup tables store pre-computed values for functions used by the QED modules. -**Implementation of this feature is in progress. It requires `picsar` on the `QED` branch and to compile with QED=TRUE** +**This feature requires to compile with QED=TRUE (and also with QED_TABLE_GEN=TRUE for table generation) ** * ``qed_bw.lookup_table_mode`` (`string`) There are three options to prepare the lookup table required by the Breit-Wheeler module: - * ``dummy_builtin``: a built-in table is used (Warning: the quality of the table is very low, - so this option has to be used only for test purposes). + * ``builtin``: a built-in table is used (Warning: the table gives reasonable results but its resolution + is quite low). * ``generate``: a new table is generated. This option requires Boost math library (version >= 1.67) and to compile with QED_TABLE_GEN=TRUE. All - the following parameters must be specified: - - * ``qed_bw.chi_min`` (`float`): minimum chi parameter to be considered by the engine + the following parameters must be specified (table 1 is used to evolve the optical depth + of the photons, while table 2 is used for pair generation): * ``qed_bw.tab_dndt_chi_min`` (`float`): minimum chi parameter for lookup table 1 ( used for the evolution of the optical depth of the photons) @@ -1758,8 +1757,8 @@ Lookup tables store pre-computed values for functions used by the QED modules. * ``qed_bw.tab_pair_chi_how_many`` (`int`): number of points to be used for chi axis in lookup table 2 * ``qed_bw.tab_pair_frac_how_many`` (`int`): number of points to be used for the second axis in lookup table 2 - (the second axis is the ratio between the energy of the less energetic particle of the pair and the - energy of the photon). + (the second axis is the ratio between the quantum parameter of the less energetic particle of the pair and the + quantum parameter of the photon). * ``qed_bw.save_table_in`` (`string`): where to save the lookup table @@ -1771,14 +1770,13 @@ Lookup tables store pre-computed values for functions used by the QED modules. * ``qed_qs.lookup_table_mode`` (`string`) There are three options to prepare the lookup table required by the Quantum Synchrotron module: - * ``dummy_builtin``: a built-in table is used (Warning: the quality of the table is very low, - so this option has to be used only for test purposes). + * ``builtin``: a built-in table is used (Warning: the table gives reasonable results but its resolution + is quite low). * ``generate``: a new table is generated. This option requires Boost math library (version >= 1.67) and to compile with QED_TABLE_GEN=TRUE. All - the following parameters must be specified: - - * ``qed_qs.chi_min`` (`float`): minimum chi parameter to be considered by the engine + the following parameters must be specified (table 1 is used to evolve the optical depth + of the particles, while table 2 is used for photon emission): * ``qed_qs.tab_dndt_chi_min`` (`float`): minimum chi parameter for lookup table 1 ( used for the evolution of the optical depth of electrons and positrons) @@ -1794,8 +1792,11 @@ Lookup tables store pre-computed values for functions used by the QED modules. * ``qed_qs.tab_em_chi_how_many`` (`int`): number of points to be used for chi axis in lookup table 2 - * ``qed_qs.tab_em_prob_how_many`` (`int`): number of points to be used for the second axis in lookup table 2 - (the second axis is a cumulative probability). + * ``qed_qs.tab_em_frac_how_many`` (`int`): number of points to be used for the second axis in lookup table 2 + (the second axis is the ratio between the quantum parameter of the photon and the + quantum parameter of the charged particle). + + * ``qed_qs.tab_em_frac_min`` (`float`): minimum value to be considered for the second axis of lookup table 2 * ``qed_bw.save_table_in`` (`string`): where to save the lookup table @@ -1804,8 +1805,14 @@ Lookup tables store pre-computed values for functions used by the QED modules. * ``qed_qs.load_table_from`` (`string`): name of the lookup table file to read from. -* ``qed_qs.photon_creation_energy_threshold`` (`float`) optional (default `2*me*c^2`) - Energy threshold for photon particle creation in SI units. +* ``qed_bw.chi_min`` (`float`): minimum chi parameter to be considered by the Breit-Wheeler engine + (suggested value : 0.01) + +* ``qed_qs.chi_min`` (`float`): minimum chi parameter to be considered by the Quantum Synchrotron engine + (suggested value : 0.001) + +* ``qed_qs.photon_creation_energy_threshold`` (`float`) optional (default `2`) + Energy threshold for photon particle creation in `*me*c^2` units. * ``warpx.do_qed_schwinger`` (`bool`) optional (default `0`) If this is 1, Schwinger electron-positron pairs can be generated in vacuum in the cells where the EM field is high enough. diff --git a/Examples/Modules/qed/breit_wheeler/analysis.py b/Examples/Modules/qed/breit_wheeler/analysis.py new file mode 100755 index 000000000..280e8e2a8 --- /dev/null +++ b/Examples/Modules/qed/breit_wheeler/analysis.py @@ -0,0 +1,298 @@ +#! /usr/bin/env python + +# Copyright 2019 Luca Fedeli, Maxence Thevenet +# +# This file is part of WarpX. +# +# License: BSD-3-Clause-LBNL + +# -*- coding: utf-8 -*- + +import yt +import numpy as np +import sys +import scipy.special as spe +import scipy.integrate as integ +import scipy.stats as st +sys.path.insert(1, '../../../../warpx/Regression/Checksum/') +import checksumAPI + +import matplotlib.pyplot as plt + +# This script performs detailed checks of the Breit-Wheeler pair production process. +# Four populations of photons are initialized with different momenta in different +# directions in a background EM field (with non-zero components along each direction). +# Specifically the script checks that: +# +# - The expected number of generated pairs n_pairs is in agreement with theory +# (the maximum tolerated error is 5*sqrt(n_pairs) +# - The weight of the generated particles is equal to the weight of the photon +# - Momenta of the residual photons are still equal to the original momentum +# - The generated particles are emitted in the right direction +# - Total energy is conserved in each event +# - The energy distribution of the generated particles is in agreement with theory +# - The optical depths of the product species are correctly initialized (QED effects are +# enabled for product species too). +# +# More details on the theoretical formulas used in this script can be found in +# the Jupyter notebook picsar/src/multi_physics/QED_tests/validation/validation.ipynb +# +# References: +# 1) R. Duclous et al 2011 Plasma Phys. Control. Fusion 53 015009 +# 2) A. Gonoskov et al. 2015 Phys. Rev. E 92, 023305 +# 3) M. Lobet. PhD thesis "Effets radiatifs et d'electrodynamique +# quantique dans l'interaction laser-matiere ultra-relativiste" +# URL: https://tel.archives-ouvertes.fr/tel-01314224 + + +# Tolerances +tol = 1.e-8 +tol_red = 2.e-2 + +# Physical constants (from CODATA 2018, see: https://physics.nist.gov/cuu/Constants/index.html ) +me = 9.1093837015e-31 #electron mass +c = 299792458 #speed of light +hbar = 6.62607015e-34/(2*np.pi) #reduced Plank constant +fine_structure = 7.2973525693e-3 #fine structure constant +qe = 1.602176634e-19#elementary charge +E_s = (me**2 * c**3)/(qe * hbar) #Schwinger E field +B_s = E_s/c #Schwinger B field + +mec = me*c +mec2 = mec*c +#______________ + +# Initial parameters +spec_names_phot = ["p1", "p2", "p3", "p4"] +spec_names_ele = ["ele1", "ele2", "ele3", "ele4"] +spec_names_pos = ["pos1", "pos2", "pos3", "pos4"] +initial_momenta = [ + np.array([2000.0,0,0])*mec, + np.array([0.0,5000.0,0.0])*mec, + np.array([0.0,0.0,10000.0])*mec, + np.array([57735.02691896, 57735.02691896, 57735.02691896])*mec +] +initial_particle_number = 1048576 + +E_f = np.array([-2433321316961438., 973328526784575., 1459992790176863.]) +B_f = np.array([2857142.85714286, 4285714.28571428, 8571428.57142857]) + +NNS = [128,128,128,128] #bins for energy distribution comparison. +#______________ + +def calc_chi_gamma(p, E, B): + pnorm = np.linalg.norm(p) + v = c*(p/pnorm) + EpvvecB = E + np.cross(v,B) + vdotEoverc = np.dot(v,E)/c + ff = np.sqrt(np.dot(EpvvecB,EpvvecB) - np.dot(vdotEoverc,vdotEoverc)) + gamma_phot = pnorm/mec + return gamma_phot*ff/E_s + +#Auxiliary functions +@np.vectorize +def BW_inner(x): + return integ.quad(lambda s: np.sqrt(s)*spe.kv(1./3., 2./3. * s**(3./2.)), x, np.inf)[0] + +def BW_X(chi_phot, chi_ele): + div = (chi_ele*(chi_phot-chi_ele)) + div = np.where(np.logical_and(chi_phot > chi_ele, chi_ele != 0), div, 1.0); + res = np.where(np.logical_and(chi_phot > chi_ele, chi_ele != 0), np.power(chi_phot/div, 2./3.), np.inf) + return res + +def BW_F(chi_phot, chi_ele): + X = BW_X(chi_phot, chi_ele) + res = np.where(np.logical_or(chi_phot == chi_ele, chi_ele == 0), 0.0, + BW_inner(X) - (2.0 - chi_phot* X**(3./2.))*spe.kv(2./3., 2./3. * X**(3./2.)) ) + return res + +@np.vectorize +def BW_T(chi_phot): + coeff = 1./(np.pi * np.sqrt(3.) * (chi_phot**2)) + return coeff*integ.quad(lambda chi_ele: BW_F(chi_phot, chi_ele), 0, chi_phot)[0] + +def small_diff(vv, val): + if(val != 0.0): + return np.max(np.abs((vv - val)/val)) < tol + else: + return np.max(np.abs(vv)) < tol +#__________________ + +# Breit-Wheeler total and differential cross sections +def BW_dN_dt(chi_phot, gamma_phot): + coeff_BW = fine_structure * me*c**2/hbar + return coeff_BW*BW_T(chi_phot)*(chi_phot/gamma_phot) + +def BW_d2N_dt_dchi(chi_phot, gamma_phot, chi_ele): + coeff_BW = fine_structure * me*c**2/hbar + return coeff_BW*BW_F(chi_phot, chi_ele)*(gamma_phot/gamma_phot) +#__________________ + +# Get data for a species +def get_spec(ytdata, specname, is_photon): + px = ytdata[specname,"particle_momentum_x"].v + pz = ytdata[specname,"particle_momentum_z"].v + py = ytdata[specname,"particle_momentum_y"].v + + w = ytdata[specname,"particle_weighting"].v + + if (is_photon): + opt = ytdata[specname,"particle_optical_depth_BW"].v + else: + opt = ytdata[specname,"particle_optical_depth_QSR"].v + + return {"px" : px, "py" : py, "pz" : pz, "w" : w, "opt" : opt} + +# Individual tests + +def check_number_of_pairs(ytdataset, phot_name, ele_name, pos_name, chi_phot, gamma_phot, dt, particle_number): + dNBW_dt_theo = BW_dN_dt(chi_phot, gamma_phot) + expected_pairs = (1.-np.exp(-dNBW_dt_theo*dt))*particle_number + expected_pairs_tolerance = 5.0*np.sqrt(expected_pairs) + n_ele = ytdataset.particle_type_counts[ele_name] + n_pos = ytdataset.particle_type_counts[pos_name] + n_phot = ytdataset.particle_type_counts[phot_name] + n_lost = initial_particle_number-n_phot + assert((n_ele == n_pos) and (n_ele == n_lost)) + assert( np.abs(n_ele-expected_pairs) < expected_pairs_tolerance) + print(" [OK] generated pair number is within expectations") + return n_lost + +def check_weights(phot_data, ele_data, pos_data): + assert(np.all(phot_data["w"] == phot_data["w"][0])) + assert(np.all(ele_data["w"] == phot_data["w"][0])) + assert(np.all(pos_data["w"] == phot_data["w"][0])) + print(" [OK] particles weights are the expected ones") + +def check_momenta(phot_data, ele_data, pos_data, p0, p_ele, p_pos): + assert(small_diff(phot_data["px"], p0[0])) + assert(small_diff(phot_data["py"], p0[1])) + assert(small_diff(phot_data["pz"], p0[2])) + print(" [OK] residual photons still have initial momentum") + + pdir = p0/np.linalg.norm(p0) + assert(small_diff(ele_data["px"]/p_ele, pdir[0])) + assert(small_diff(ele_data["py"]/p_ele, pdir[1])) + assert(small_diff(ele_data["pz"]/p_ele, pdir[2])) + assert(small_diff(pos_data["px"]/p_pos, pdir[0])) + assert(small_diff(pos_data["py"]/p_pos, pdir[1])) + assert(small_diff(pos_data["pz"]/p_pos, pdir[2])) + print(" [OK] pairs move along the initial photon direction") + +def check_energy(energy_phot, energy_ele, energy_pos): + # Sorting the arrays is required because electrons and positrons are not + # necessarily dumped in the same order. + s_energy_ele = np.sort(energy_ele) + is_energy_pos = np.sort(energy_pos)[::-1] + product_energy = s_energy_ele + is_energy_pos + assert(small_diff(product_energy, energy_phot)) + print(" [OK] energy is conserved in each event") + +def check_opt_depths(phot_data, ele_data, pos_data): + data = (phot_data, ele_data, pos_data) + for dd in data: + loc, scale = st.expon.fit(dd["opt"]) + assert( np.abs(loc - 0) < tol_red ) + assert( np.abs(scale - 1) < tol_red ) + print(" [OK] optical depth distributions are still exponential") + +def check_energy_distrib(energy_ele, energy_pos, gamma_phot, + chi_phot, n_lost, NN, idx, do_plot=False): + gamma_min = 1.0001 + gamma_max = gamma_phot-1.0001 + h_gamma_ele, c_gamma = np.histogram(energy_ele/mec2, bins=NN, range=[gamma_min,gamma_max]) + h_gamma_pos, _ = np.histogram(energy_pos/mec2, bins=NN, range=[gamma_min,gamma_max]) + + cchi_part_min = chi_phot*(gamma_min - 1)/(gamma_phot - 2) + cchi_part_max = chi_phot*(gamma_max - 1)/(gamma_phot - 2) + + #Rudimentary integration over npoints for each bin + npoints= 20 + aux_chi = np.linspace(cchi_part_min, cchi_part_max, NN*npoints) + distrib = BW_d2N_dt_dchi(chi_phot, gamma_phot, aux_chi) + distrib = np.sum(distrib.reshape(-1, npoints),1) + distrib = n_lost*distrib/np.sum(distrib) + + if do_plot : + # Visual comparison of distributions + c_gamma_centered = 0.5*(c_gamma[1:]+c_gamma[:-1]) + plt.clf() + plt.xlabel("γ_particle") + plt.ylabel("N") + plt.title("χ_photon = {:f}".format(chi_phot)) + plt.plot(c_gamma_centered, distrib,label="theory") + plt.plot(c_gamma_centered, h_gamma_ele,label="BW electrons") + plt.plot(c_gamma_centered, h_gamma_pos,label="BW positrons") + plt.legend() + plt.savefig("case_{:d}".format(idx+1)) + + discr_ele = np.abs(h_gamma_ele-distrib) + discr_pos = np.abs(h_gamma_pos-distrib) + max_discr = 5.0 * np.sqrt(distrib) + assert(np.all(discr_ele < max_discr)) + assert(np.all(discr_pos < max_discr)) + print(" [OK] energy distribution is within expectations") + +#__________________ + +def check(): + filename_end = sys.argv[1] + data_set_end = yt.load(filename_end) + + sim_time = data_set_end.current_time.to_value() + all_data_end = data_set_end.all_data() + + for idx in range(4): + phot_name = spec_names_phot[idx] + ele_name = spec_names_ele[idx] + pos_name = spec_names_pos[idx] + p0 = initial_momenta[idx] + + p2_phot = p0[0]**2 + p0[1]**2 + p0[2]**2 + p_phot = np.sqrt(p2_phot) + energy_phot = p_phot*c + chi_phot = calc_chi_gamma(p0, E_f, B_f) + gamma_phot = np.linalg.norm(p0)/mec + + print("** Case {:d} **".format(idx+1)) + print(" initial momentum: ", p0) + print(" quantum parameter: {:f}".format(chi_phot)) + print(" normalized photon energy: {:f}".format(gamma_phot)) + print(" timestep: {:f} fs".format(sim_time*1e15)) + + phot_data = get_spec(all_data_end, phot_name, is_photon=True) + ele_data = get_spec(all_data_end, ele_name, is_photon=False) + pos_data = get_spec(all_data_end, pos_name, is_photon=False) + + p2_ele = ele_data["px"]**2 + ele_data["py"]**2 + ele_data["pz"]**2 + p_ele = np.sqrt(p2_ele) + energy_ele = np.sqrt(1.0 + p2_ele/mec**2 )*mec2 + p2_pos = pos_data["px"]**2 + pos_data["py"]**2 + pos_data["pz"]**2 + p_pos = np.sqrt(p2_pos) + energy_pos = np.sqrt(1.0 + p2_pos/mec**2 )*mec2 + + n_lost = check_number_of_pairs(data_set_end, + phot_name, ele_name, pos_name, + chi_phot, gamma_phot, sim_time, + initial_particle_number) + + check_weights(phot_data, ele_data, pos_data) + + check_momenta(phot_data, ele_data, pos_data, p0, p_ele, p_pos) + + check_energy(energy_phot, energy_ele, energy_pos) + + check_energy_distrib(energy_ele, energy_pos, gamma_phot, chi_phot, n_lost, NNS[idx], idx) + + check_opt_depths(phot_data, ele_data, pos_data) + + print("*************\n") + + test_name = filename_end[:-9] # Could also be os.path.split(os.getcwd())[1] + checksumAPI.evaluate_checksum(test_name, filename_end) + +def main(): + check() + +if __name__ == "__main__": + main() diff --git a/Examples/Modules/qed/breit_wheeler/analysis_2d_tau_init.py b/Examples/Modules/qed/breit_wheeler/analysis_2d_tau_init.py deleted file mode 100755 index d4b7666bd..000000000 --- a/Examples/Modules/qed/breit_wheeler/analysis_2d_tau_init.py +++ /dev/null @@ -1,50 +0,0 @@ -#! /usr/bin/env python - -# Copyright 2019 Luca Fedeli, Maxence Thevenet -# -# This file is part of WarpX. -# -# License: BSD-3-Clause-LBNL - -import yt -import numpy as np -import scipy.stats as st -import sys -sys.path.insert(1, '../../../../warpx/Regression/Checksum/') -import checksumAPI - -# This script checks if photons initialized with Breit Wheeler process enabled -# do actually have an exponentially distributed optical depth - -# Tolerance -tolerance_rel = 1e-2 - -def check(): - filename = sys.argv[1] - data_set = yt.load(filename) - - all_data = data_set.all_data() - res_tau = all_data["photons", 'particle_optical_depth_BW'] - - loc, scale = st.expon.fit(res_tau) - - # loc should be very close to 0, scale should be very close to 1 - - error_rel = np.abs(loc - 0) - print("error_rel for location: " + str(error_rel)) - print("tolerance_rel: " + str(tolerance_rel)) - assert( error_rel < tolerance_rel ) - - error_rel = np.abs(scale - 1) - print("error_rel for scale: " + str(error_rel)) - print("tolerance_rel: " + str(tolerance_rel)) - assert( error_rel < tolerance_rel ) - - test_name = filename[:-9] # Could also be os.path.split(os.getcwd())[1] - checksumAPI.evaluate_checksum(test_name, filename) - -def main(): - check() - -if __name__ == "__main__": - main() diff --git a/Examples/Modules/qed/breit_wheeler/analysis_3d_optical_depth_evolution.py b/Examples/Modules/qed/breit_wheeler/analysis_3d_optical_depth_evolution.py deleted file mode 100755 index 876b6eac4..000000000 --- a/Examples/Modules/qed/breit_wheeler/analysis_3d_optical_depth_evolution.py +++ /dev/null @@ -1,145 +0,0 @@ -#! /usr/bin/env python - -# Copyright 2019 Luca Fedeli, Maxence Thevenet -# -# This file is part of WarpX. -# -# License: BSD-3-Clause-LBNL - -# -*- coding: utf-8 -*- - -import yt -import numpy as np -import sys -import math as m -import scipy.special as spe -import scipy.integrate as integ -import scipy.stats as st -sys.path.insert(1, '../../../../warpx/Regression/Checksum/') -import checksumAPI - -# This script checks if the optical depth of photons undergoing the -# Breit Wheeler process behaves as expected. Four populations of photons -# are initialized with different momenta in a background EM field. The decrease -# of the optical depth (averaged for each population) is used to estimate the -# Breit Wheeler cross section, which is then compared with the theoretical -# formula. Relative discrepancy should be smaller than 2% -# -# References: -# 1) R. Duclous et al 2011 Plasma Phys. Control. Fusion 53 015009 -# 2) A. Gonoskov et al. 2015 Phys. Rev. E 92, 023305 -# 3) M. Lobet. PhD thesis "Effets radiatifs et d'electrodynamique -# quantique dans l'interaction laser-matiere ultra-relativiste" -# URL: https://tel.archives-ouvertes.fr/tel-01314224 - - -# Tolerance -tol = 7.e-2 - -# EM fields -E_f = np.array([-2433321316961438, 973328526784575, 1459992790176863]) -B_f = np.array([2857142.85714286, 4285714.28571428, 8571428.57142857]) - -# Physical constants -electron_mass = 9.10938356e-31 -elementary_charge = 1.6021766208e-19 -speed_of_light = 299792458 -reduced_plank = 1.054571800e-34 -vacuum_permittivity = 8.854187817e-12 -fine_structure_constant = 0.0072973525664 -classical_elec_radius = (1./4./np.pi/vacuum_permittivity)*( elementary_charge**2 / (electron_mass * speed_of_light**2)) -lambda_ref = 1.0e-6 -field_reference = 2.0 * np.pi * electron_mass*speed_of_light * speed_of_light / (elementary_charge*lambda_ref) -schwinger_field_SI = electron_mass**2 * speed_of_light**3/(reduced_plank*elementary_charge) -schwinger_field_norm = electron_mass*speed_of_light*lambda_ref/(2.0*reduced_plank*m.pi) -#______________ - -# Initial parameters -spec_names = ["p1", "p2", "p3", "p4"] -mec = electron_mass*speed_of_light -p_begin = { - "p1": np.array([2000.0,0,0])*mec, - "p2": np.array([0.0,5000.0,0.0])*mec, - "p3": np.array([0.0,0.0,10000.0])*mec, - "p4": np.array([57735.02691896, 57735.02691896, 57735.02691896])*mec -} -initial_particle_number = 16384 -#______________ - -def calc_chi_gamma(p, E, B): - p = p / electron_mass / speed_of_light - E = E / field_reference - B = B * speed_of_light / field_reference - gamma_phot = np.linalg.norm(p) - c = p/gamma_phot - loc_field = gamma_phot * np.linalg.norm( E - np.dot(c,E)*c + np.cross(c,B)) - return loc_field/schwinger_field_norm - -#Auxiliary functions -def X(chi_phot, chi_ele): - if (chi_phot > chi_ele and chi_ele != 0): - return np.power(chi_phot/(chi_ele*(chi_phot-chi_ele)), 2./3.) - else: - return 1.0e30 - -def T(chi_phot): - coeff = 1./(np.pi * np.sqrt(3.) * chi_phot * chi_phot) - inner = lambda x : integ.quad(lambda s: np.sqrt(s)*spe.kv(1./3., 2./3. * s**(3./2.)), x, np.inf)[0] - return integ.quad(lambda chi_ele: - coeff*(inner(X(chi_phot, chi_ele)) - - (2.0 - chi_phot*np.power(X(chi_phot, chi_ele), 3./2.))*spe.kv(2./3., 2./3. *X(chi_phot, chi_ele)**(3./2.)) ) - , 0, chi_phot)[0] -#__________________ - -# Breit-Wheeler total cross section -def dNBW_dt(chi_phot, energy_phot): - energy_phot = energy_phot/electron_mass/speed_of_light/speed_of_light - return ((electron_mass*(speed_of_light)**2)*fine_structure_constant/reduced_plank)*(chi_phot/energy_phot)*T(chi_phot) -#__________________ - -def check(): - filename_end = sys.argv[1] - data_set_end = yt.load(filename_end) - - sim_time = data_set_end.current_time.to_value() - all_data_end = data_set_end.all_data() - - for name in spec_names: - opt_depth = all_data_end[name, 'particle_optical_depth_BW'] - - #check that the distribution is still exponential with scale 1 and loc 0 - opt_depth_loc, opt_depth_scale = st.expon.fit(opt_depth) - exp_loc = 0.0 - exp_scale = 1.0 - loc_discrepancy = np.abs(opt_depth_loc-exp_loc) - scale_discrepancy = np.abs(opt_depth_scale-exp_scale) - print("tolerance_rel: " + str(tol)) - print("species " + name) - print("exp distrib loc tol = " + str(tol)) - print("exp distrib loc discrepancy = " + str(loc_discrepancy)) - assert(loc_discrepancy < tol) - print("exp distrib scale tol = " + str(tol)) - print("exp distrib scale discrepancy = " + str(scale_discrepancy/exp_scale)) - assert(scale_discrepancy/exp_scale < tol) - ### - - #check if number of lost photons is (n0* (1 - exp(-rate*t)) ) - dNBW_dt_theo = dNBW_dt( - calc_chi_gamma(p_begin[name], E_f, B_f), - np.linalg.norm(p_begin[name]*speed_of_light)) - exp_lost= initial_particle_number*(1.0 - np.exp(-dNBW_dt_theo*sim_time)) - lost = initial_particle_number-np.size(opt_depth) - discrepancy_lost = np.abs(exp_lost-lost) - print("lost fraction tol = " + str(tol)) - print("lost fraction discrepancy = " + str(discrepancy_lost/exp_lost)) - assert(discrepancy_lost/exp_lost < tol) - ### - - test_name = filename_end[:-9] # Could also be os.path.split(os.getcwd())[1] - checksumAPI.evaluate_checksum(test_name, filename_end) - -def main(): - check() - -if __name__ == "__main__": - main() diff --git a/Examples/Modules/qed/breit_wheeler/inputs_2d b/Examples/Modules/qed/breit_wheeler/inputs_2d new file mode 100644 index 000000000..2fa4690e1 --- /dev/null +++ b/Examples/Modules/qed/breit_wheeler/inputs_2d @@ -0,0 +1,266 @@ +################################# +####### GENERAL PARAMETERS ###### +################################# +max_step = 1 +amr.n_cell = 32 32 +amr.max_grid_size = 16 # maximum size of each AMReX box, used to decompose the domain +amr.blocking_factor = 8 # minimum size of each AMReX box, used to decompose the domain +geometry.coord_sys = 0 # 0: Cartesian +geometry.is_periodic = 1 1 1 # Is periodic? +geometry.prob_lo = -0.5e-6 -0.5e-6 # physical domain +geometry.prob_hi = 0.5e-6 0.5e-6 +amr.max_level = 0 # Maximum level in hierarchy (1 might be unstable, >1 is not supported) + +################################# +############ NUMERICS ########### +################################# +algo.current_deposition = esirkepov +algo.charge_deposition = standard +algo.field_gathering = energy-conserving +algo.particle_pusher = boris +interpolation.nox = 3 # Particle interpolation order. Must be the same in x, y, and z +interpolation.noy = 3 +interpolation.noz = 3 +warpx.verbose = 1 +warpx.do_dive_cleaning = 0 +warpx.use_filter = 1 +warpx.cfl = 1. # if 1., the time step is set to its CFL limit +warpx.do_pml = 1 # use Perfectly Matched Layer as boundary condition +warpx.serialize_ics = 1 + +################################# +############ PLASMA ############# +################################# +particles.species_names = p1 p2 p3 p4 ele1 ele2 ele3 ele4 pos1 pos2 pos3 pos4 dummy_phot +particles.photon_species = p1 p2 p3 p4 dummy_phot +################################# + +p1.species_type = "photon" +p1.injection_style = "NUniformPerCell" +p1.profile = "constant" +p1.num_particles_per_cell_each_dim = 32 32 +p1.density = 1e19 +p1.profile = "constant" +p1.momentum_distribution_type = "gaussian" +p1.ux_m = 2000.0 +##########QED#################### +p1.do_qed = 1 +p1.do_qed_breit_wheeler = 1 +p1.qed_breit_wheeler_ele_product_species = ele1 +p1.qed_breit_wheeler_pos_product_species = pos1 +################################# + +p2.species_type = "photon" +p2.injection_style = "NUniformPerCell" +p2.profile = "constant" +p2.num_particles_per_cell_each_dim = 32 32 +p2.density = 1e19 +p2.profile = "constant" +p2.momentum_distribution_type = "gaussian" +p2.uy_m = 5000.0 +##########QED#################### +p2.do_qed = 1 +p2.do_qed_breit_wheeler = 1 +p2.qed_breit_wheeler_ele_product_species = ele2 +p2.qed_breit_wheeler_pos_product_species = pos2 +################################# + +p3.species_type = "photon" +p3.injection_style = "NUniformPerCell" +p3.profile = "constant" +p3.num_particles_per_cell_each_dim = 32 32 +p3.density = 1e19 +p3.profile = "constant" +p3.momentum_distribution_type = "gaussian" +p3.uz_m = 10000.0 +##########QED#################### +p3.do_qed = 1 +p3.do_qed_breit_wheeler = 1 +p3.qed_breit_wheeler_ele_product_species = ele3 +p3.qed_breit_wheeler_pos_product_species = pos3 +################################# + +p4.species_type = "photon" +p4.injection_style = "NUniformPerCell" +p4.profile = "constant" +p4.num_particles_per_cell_each_dim = 32 32 +p4.density = 1e19 +p4.profile = "constant" +p4.momentum_distribution_type = "gaussian" +p4.ux_m = 57735.02691896 +p4.uy_m = 57735.02691896 +p4.uz_m = 57735.02691896 +##########QED#################### +p4.do_qed = 1 +p4.do_qed_breit_wheeler = 1 +p4.qed_breit_wheeler_ele_product_species = ele4 +p4.qed_breit_wheeler_pos_product_species = pos4 +################################# + +### PRODUCT SPECIES ### +ele1.species_type = "electron" +ele1.injection_style = nuniformpercell +ele1.num_particles_per_cell_each_dim = 0 0 +ele1.profile = constant +ele1.density = 0.0 +ele1.momentum_distribution_type = "gaussian" +ele1.do_not_push = 1 +ele1.do_qed = 1 +ele1.do_qed_quantum_sync = 1 +ele1.qed_quantum_sync_phot_product_species = dummy_phot + +ele2.species_type = "electron" +ele2.injection_style = nuniformpercell +ele2.num_particles_per_cell_each_dim = 1 1 +ele2.profile = constant +ele2.density = 0.0 +ele2.momentum_distribution_type = "gaussian" +ele2.do_not_push = 1 +ele2.do_qed = 1 +ele2.do_qed_quantum_sync = 1 +ele2.qed_quantum_sync_phot_product_species = dummy_phot + +ele3.species_type = "electron" +ele3.injection_style = nuniformpercell +ele3.num_particles_per_cell_each_dim = 1 1 +ele3.profile = constant +ele3.density = 0.0 +ele3.momentum_distribution_type = "gaussian" +ele3.do_not_push = 1 +ele3.do_qed = 1 +ele3.do_qed_quantum_sync = 1 +ele3.qed_quantum_sync_phot_product_species = dummy_phot + +ele4.species_type = "electron" +ele4.injection_style = nuniformpercell +ele4.num_particles_per_cell_each_dim = 1 1 +ele4.profile = constant +ele4.density = 0.0 +ele4.momentum_distribution_type = "gaussian" +ele4.do_not_push = 1 +ele4.do_qed = 1 +ele4.do_qed_quantum_sync = 1 +ele4.qed_quantum_sync_phot_product_species = dummy_phot + +pos1.species_type = "positron" +pos1.injection_style = nuniformpercell +pos1.num_particles_per_cell_each_dim = 0 0 +pos1.profile = constant +pos1.density = 0.0 +pos1.momentum_distribution_type = "gaussian" +pos1.do_not_push = 1 +pos1.do_qed = 1 +pos1.do_qed_quantum_sync = 1 +pos1.qed_quantum_sync_phot_product_species = dummy_phot + +pos2.species_type = "positron" +pos2.injection_style = nuniformpercell +pos2.num_particles_per_cell_each_dim = 0 0 +pos2.profile = constant +pos2.density = 0.0 +pos2.momentum_distribution_type = "gaussian" +pos2.do_not_push = 1 +pos2.do_qed = 1 +pos2.do_qed_quantum_sync = 1 +pos2.qed_quantum_sync_phot_product_species = dummy_phot + +pos3.species_type = "positron" +pos3.injection_style = nuniformpercell +pos3.num_particles_per_cell_each_dim = 0 0 +pos3.profile = constant +pos3.density = 0.0 +pos3.momentum_distribution_type = "gaussian" +pos3.do_not_push = 1 +pos3.do_qed = 1 +pos3.do_qed_quantum_sync = 1 +pos3.qed_quantum_sync_phot_product_species = dummy_phot + +pos4.species_type = "positron" +pos4.injection_style = nuniformpercell +pos4.num_particles_per_cell_each_dim = 0 0 +pos4.profile = constant +pos4.density = 0.0 +pos4.momentum_distribution_type = "gaussian" +pos4.do_not_push = 1 +pos4.do_qed = 1 +pos4.do_qed_quantum_sync = 1 +pos4.qed_quantum_sync_phot_product_species = dummy_phot + +dummy_phot.species_type = "photon" +dummy_phot.injection_style = nuniformpercell +dummy_phot.num_particles_per_cell_each_dim = 0 0 +dummy_phot.profile = constant +dummy_phot.density = 0.0 +dummy_phot.momentum_distribution_type = "gaussian" +dummy_phot.do_qed = 0 + +################################# + +##########QED TABLES#################### +qed_bw.chi_min = 0.001 + +qed_bw.lookup_table_mode = "builtin" + +#qed_bw.lookup_table_mode = "generate" +#qed_bw.tab_dndt_chi_min = 0.01 +#qed_bw.tab_dndt_chi_max = 1000.0 +#qed_bw.tab_dndt_how_many = 256 +#qed_bw.tab_pair_chi_min = 0.01 +#qed_bw.tab_pair_chi_max = 1000.0 +#qed_bw.tab_pair_chi_how_many = 256 +#qed_bw.tab_pair_frac_how_many = 256 +#qed_bw.save_table_in = "bw_table" + +#qed_bw.lookup_table_mode = "load" +#qed_bw.load_table_from = "bw_table" + +qed_qs.chi_min = 0.001 + +qed_qs.lookup_table_mode = "builtin" + +qed_qs.photon_creation_energy_threshold = 2 + +#qed_qs.lookup_table_mode = "generate" +#qed_qs.tab_dndt_chi_min = 0.001 +#qed_qs.tab_dndt_chi_max = 1000.0 +#qed_qs.tab_dndt_how_many = 256 +#qed_qs.tab_em_chi_min = 0.001 +#qed_qs.tab_em_frac_min = 1.0e-12 +#qed_qs.tab_em_chi_max = 1000.0 +#qed_qs.tab_em_chi_how_many = 256 +#qed_qs.tab_em_frac_how_many = 256 +#qed_qs.save_table_in = "qs_table" + +#qed_qs.lookup_table_mode = "load" +#qed_qs.load_table_from = "qs_table" +################################# + +### EXTERNAL E FIELD ### (3e15 * [-0.811107105653813 0.324442842261525 0.486664263392288] ) +particles.E_ext_particle_init_style = "constant" +particles.E_external_particle = -2433321316961438 973328526784575 1459992790176863 +#### + +### EXTERNAL B FIELD ### (1e7 * [0.28571429 0.42857143 0.85714286] ) +particles.B_ext_particle_init_style = "constant" +particles.B_external_particle = 2857142.85714286 4285714.28571428 8571428.57142857 +#### + +# Diagnostics +diagnostics.diags_names = diag1 +diag1.period = 1 +diag1.diag_type = Full +diag1.fields_to_plot = Ex +diag1.p1.variables = ux uy uz w +diag1.p2.variables = ux uy uz w +diag1.p3.variables = ux uy uz w +diag1.p4.variables = ux uy uz w + +diag1.ele1.variables = ux uy uz w +diag1.ele2.variables = ux uy uz w +diag1.ele3.variables = ux uy uz w +diag1.ele4.variables = ux uy uz w + +diag1.pos1.variables = ux uy uz w +diag1.pos2.variables = ux uy uz w +diag1.pos3.variables = ux uy uz w +diag1.pos4.variables = ux uy uz w diff --git a/Examples/Modules/qed/breit_wheeler/inputs_2d_tau_init b/Examples/Modules/qed/breit_wheeler/inputs_2d_tau_init deleted file mode 100644 index af77c97e0..000000000 --- a/Examples/Modules/qed/breit_wheeler/inputs_2d_tau_init +++ /dev/null @@ -1,107 +0,0 @@ -################################# -####### GENERAL PARAMETERS ###### -################################# -max_step = 1 -amr.n_cell = 128 128 -amr.max_grid_size = 128 # maximum size of each AMReX box, used to decompose the domain -amr.blocking_factor = 32 # minimum size of each AMReX box, used to decompose the domain -geometry.coord_sys = 0 # 0: Cartesian -geometry.is_periodic = 0 0 # Is periodic? -geometry.prob_lo = -32.e-6 -32.e-6 # physical domain -geometry.prob_hi = 32.e-6 32.e-6 -amr.max_level = 0 # Maximum level in hierarchy (1 might be unstable, >1 is not supported) - -################################# -############ NUMERICS ########### -################################# -algo.current_deposition = esirkepov -algo.charge_deposition = standard -algo.field_gathering = energy-conserving -algo.particle_pusher = boris -interpolation.nox = 3 # Particle interpolation order. Must be the same in x, y, and z -interpolation.noy = 3 -interpolation.noz = 3 -warpx.verbose = 1 -warpx.do_dive_cleaning = 0 -warpx.use_filter = 1 -warpx.cfl = 1. # if 1., the time step is set to its CFL limit -warpx.do_pml = 1 # use Perfectly Matched Layer as boundary condition -warpx.serialize_ics = 1 - -################################# -############ PLASMA ############# -################################# -particles.species_names = photons ele_bw pos_bw -particles.photon_species = photons -################################# - -photons.species_type = "photon" -photons.injection_style = "NUniformPerCell" -photons.profile = "constant" -photons.xmin = -30e-6 -photons.ymin = -30e-6 -photons.zmin = -30e-6 -photons.xmax = 30e-6 -photons.ymax = 30e-6 -photons.zmax = 30e-6 -photons.num_particles_per_cell_each_dim = 2 2 -photons.density = 1e19 -photons.profile = "constant" -photons.momentum_distribution_type = "gaussian" -photons.ux_m = 0.0 -photons.uy_m = 0.0 -photons.uz_m = 0.0 -photons.ux_th = 100. -photons.uy_th = 100. -photons.uz_th = 100. -##########QED#################### -photons.do_qed = 1 -photons.do_qed_breit_wheeler = 1 -photons.qed_breit_wheeler_ele_product_species = ele_bw -photons.qed_breit_wheeler_pos_product_species = pos_bw -################################# - -### PRODUCT SPECIES ### -ele_bw.species_type = "electron" -ele_bw.injection_style = nuniformpercell -ele_bw.num_particles_per_cell_each_dim = 1 1 -ele_bw.profile = constant -ele_bw.density = 0.0 -ele_bw.momentum_distribution_type = "gaussian" -ele_bw.xmin = 1 ## Ugly trick to avoid electrons at T=0 -ele_bw.xmax = -1 ## Ugly trick to avoid electrons at T=0 -ele_bw.do_qed = 0 - -pos_bw.species_type = "positron" -pos_bw.injection_style = nuniformpercell -pos_bw.num_particles_per_cell_each_dim = 1 1 -pos_bw.profile = constant -pos_bw.density = 0.0 -pos_bw.momentum_distribution_type = "gaussian" -pos_bw.xmin = 1 ## Ugly trick to avoid positrons at T=0 -pos_bw.xmax = -1 ## Ugly trick to avoid positrons at T=0 -pos_bw.do_qed = 0 -################################# - -#######QED ENGINE PARAMETERS##### -qed_bw.lookup_table_mode = "dummy_builtin" - -#qed_bw.lookup_table_mode = "generate" -#qed_bw.chi_min = 0.001 -#qed_bw.tab_dndt_chi_min = 0.1 -#qed_bw.tab_dndt_chi_max = 200 -#qed_bw.tab_dndt_how_many = 64 -#qed_bw.tab_pair_chi_min = 0.01 -#qed_bw.tab_pair_chi_max = 200 -#qed_bw.tab_pair_chi_how_many = 2 -#qed_bw.tab_pair_frac_how_many = 2 -#qed_bw.save_table_in = "bw_micro_table" - -#qed_bw.lookup_table_mode = "load" -#qed_bw.load_table_from = "bw_micro_table" -################################# - -# Diagnostics -diagnostics.diags_names = diag1 -diag1.period = 1 -diag1.diag_type = Full diff --git a/Examples/Modules/qed/breit_wheeler/inputs_3d b/Examples/Modules/qed/breit_wheeler/inputs_3d new file mode 100644 index 000000000..af479d706 --- /dev/null +++ b/Examples/Modules/qed/breit_wheeler/inputs_3d @@ -0,0 +1,266 @@ +################################# +####### GENERAL PARAMETERS ###### +################################# +max_step = 1 +amr.n_cell = 16 16 16 +amr.max_grid_size = 16 # maximum size of each AMReX box, used to decompose the domain +amr.blocking_factor = 8 # minimum size of each AMReX box, used to decompose the domain +geometry.coord_sys = 0 # 0: Cartesian +geometry.is_periodic = 1 1 1 # Is periodic? +geometry.prob_lo = -0.5e-6 -0.5e-6 -0.5e-6 # physical domain +geometry.prob_hi = 0.5e-6 0.5e-6 0.5e-6 +amr.max_level = 0 # Maximum level in hierarchy (1 might be unstable, >1 is not supported) + +################################# +############ NUMERICS ########### +################################# +algo.current_deposition = esirkepov +algo.charge_deposition = standard +algo.field_gathering = energy-conserving +algo.particle_pusher = boris +interpolation.nox = 3 # Particle interpolation order. Must be the same in x, y, and z +interpolation.noy = 3 +interpolation.noz = 3 +warpx.verbose = 1 +warpx.do_dive_cleaning = 0 +warpx.use_filter = 1 +warpx.cfl = 1. # if 1., the time step is set to its CFL limit +warpx.do_pml = 1 # use Perfectly Matched Layer as boundary condition +warpx.serialize_ics = 1 + +################################# +############ PLASMA ############# +################################# +particles.species_names = p1 p2 p3 p4 ele1 ele2 ele3 ele4 pos1 pos2 pos3 pos4 dummy_phot +particles.photon_species = p1 p2 p3 p4 dummy_phot +################################# + +p1.species_type = "photon" +p1.injection_style = "NUniformPerCell" +p1.profile = "constant" +p1.num_particles_per_cell_each_dim = 8 8 4 +p1.density = 1e19 +p1.profile = "constant" +p1.momentum_distribution_type = "gaussian" +p1.ux_m = 2000.0 +##########QED#################### +p1.do_qed = 1 +p1.do_qed_breit_wheeler = 1 +p1.qed_breit_wheeler_ele_product_species = ele1 +p1.qed_breit_wheeler_pos_product_species = pos1 +################################# + +p2.species_type = "photon" +p2.injection_style = "NUniformPerCell" +p2.profile = "constant" +p2.num_particles_per_cell_each_dim = 8 8 4 +p2.density = 1e19 +p2.profile = "constant" +p2.momentum_distribution_type = "gaussian" +p2.uy_m = 5000.0 +##########QED#################### +p2.do_qed = 1 +p2.do_qed_breit_wheeler = 1 +p2.qed_breit_wheeler_ele_product_species = ele2 +p2.qed_breit_wheeler_pos_product_species = pos2 +################################# + +p3.species_type = "photon" +p3.injection_style = "NUniformPerCell" +p3.profile = "constant" +p3.num_particles_per_cell_each_dim = 8 8 4 +p3.density = 1e19 +p3.profile = "constant" +p3.momentum_distribution_type = "gaussian" +p3.uz_m = 10000.0 +##########QED#################### +p3.do_qed = 1 +p3.do_qed_breit_wheeler = 1 +p3.qed_breit_wheeler_ele_product_species = ele3 +p3.qed_breit_wheeler_pos_product_species = pos3 +################################# + +p4.species_type = "photon" +p4.injection_style = "NUniformPerCell" +p4.profile = "constant" +p4.num_particles_per_cell_each_dim = 8 8 4 +p4.density = 1e19 +p4.profile = "constant" +p4.momentum_distribution_type = "gaussian" +p4.ux_m = 57735.02691896 +p4.uy_m = 57735.02691896 +p4.uz_m = 57735.02691896 +##########QED#################### +p4.do_qed = 1 +p4.do_qed_breit_wheeler = 1 +p4.qed_breit_wheeler_ele_product_species = ele4 +p4.qed_breit_wheeler_pos_product_species = pos4 +################################# + +### PRODUCT SPECIES ### +ele1.species_type = "electron" +ele1.injection_style = nuniformpercell +ele1.num_particles_per_cell_each_dim = 0 0 +ele1.profile = constant +ele1.density = 0.0 +ele1.momentum_distribution_type = "gaussian" +ele1.do_not_push = 1 +ele1.do_qed = 1 +ele1.do_qed_quantum_sync = 1 +ele1.qed_quantum_sync_phot_product_species = dummy_phot + +ele2.species_type = "electron" +ele2.injection_style = nuniformpercell +ele2.num_particles_per_cell_each_dim = 0 0 +ele2.profile = constant +ele2.density = 0.0 +ele2.momentum_distribution_type = "gaussian" +ele2.do_not_push = 1 +ele2.do_qed = 1 +ele2.do_qed_quantum_sync = 1 +ele2.qed_quantum_sync_phot_product_species = dummy_phot + +ele3.species_type = "electron" +ele3.injection_style = nuniformpercell +ele3.num_particles_per_cell_each_dim = 0 0 +ele3.profile = constant +ele3.density = 0.0 +ele3.momentum_distribution_type = "gaussian" +ele3.do_not_push = 1 +ele3.do_qed = 1 +ele3.do_qed_quantum_sync = 1 +ele3.qed_quantum_sync_phot_product_species = dummy_phot + +ele4.species_type = "electron" +ele4.injection_style = nuniformpercell +ele4.num_particles_per_cell_each_dim = 0 0 +ele4.profile = constant +ele4.density = 0.0 +ele4.momentum_distribution_type = "gaussian" +ele4.do_not_push = 1 +ele4.do_qed = 1 +ele4.do_qed_quantum_sync = 1 +ele4.qed_quantum_sync_phot_product_species = dummy_phot + +pos1.species_type = "positron" +pos1.injection_style = nuniformpercell +pos1.num_particles_per_cell_each_dim = 0 0 +pos1.profile = constant +pos1.density = 0.0 +pos1.momentum_distribution_type = "gaussian" +pos1.do_not_push = 1 +pos1.do_qed = 1 +pos1.do_qed_quantum_sync = 1 +pos1.qed_quantum_sync_phot_product_species = dummy_phot + +pos2.species_type = "positron" +pos2.injection_style = nuniformpercell +pos2.num_particles_per_cell_each_dim = 0 0 +pos2.profile = constant +pos2.density = 0.0 +pos2.momentum_distribution_type = "gaussian" +pos2.do_not_push = 1 +pos2.do_qed = 1 +pos2.do_qed_quantum_sync = 1 +pos2.qed_quantum_sync_phot_product_species = dummy_phot + +pos3.species_type = "positron" +pos3.injection_style = nuniformpercell +pos3.num_particles_per_cell_each_dim = 0 0 +pos3.profile = constant +pos3.density = 0.0 +pos3.momentum_distribution_type = "gaussian" +pos3.do_not_push = 1 +pos3.do_qed = 1 +pos3.do_qed_quantum_sync = 1 +pos3.qed_quantum_sync_phot_product_species = dummy_phot + +pos4.species_type = "positron" +pos4.injection_style = nuniformpercell +pos4.num_particles_per_cell_each_dim = 0 0 +pos4.profile = constant +pos4.density = 0.0 +pos4.momentum_distribution_type = "gaussian" +pos4.do_not_push = 1 +pos4.do_qed = 1 +pos4.do_qed_quantum_sync = 1 +pos4.qed_quantum_sync_phot_product_species = dummy_phot + +dummy_phot.species_type = "photon" +dummy_phot.injection_style = nuniformpercell +dummy_phot.num_particles_per_cell_each_dim = 0 0 +dummy_phot.profile = constant +dummy_phot.density = 0.0 +dummy_phot.momentum_distribution_type = "gaussian" +dummy_phot.do_qed = 0 + +################################# + +##########QED TABLES#################### +qed_bw.chi_min = 0.001 + +qed_bw.lookup_table_mode = "builtin" + +#qed_bw.lookup_table_mode = "generate" +#qed_bw.tab_dndt_chi_min = 0.01 +#qed_bw.tab_dndt_chi_max = 1000.0 +#qed_bw.tab_dndt_how_many = 256 +#qed_bw.tab_pair_chi_min = 0.01 +#qed_bw.tab_pair_chi_max = 1000.0 +#qed_bw.tab_pair_chi_how_many = 256 +#qed_bw.tab_pair_frac_how_many = 256 +#qed_bw.save_table_in = "bw_table" + +#qed_bw.lookup_table_mode = "load" +#qed_bw.load_table_from = "bw_table" + +qed_qs.chi_min = 0.001 + +qed_qs.lookup_table_mode = "builtin" + +qed_qs.photon_creation_energy_threshold = 2 + +#qed_qs.lookup_table_mode = "generate" +#qed_qs.tab_dndt_chi_min = 0.001 +#qed_qs.tab_dndt_chi_max = 1000.0 +#qed_qs.tab_dndt_how_many = 256 +#qed_qs.tab_em_chi_min = 0.001 +#qed_qs.tab_em_frac_min = 1.0e-12 +#qed_qs.tab_em_chi_max = 1000.0 +#qed_qs.tab_em_chi_how_many = 256 +#qed_qs.tab_em_frac_how_many = 256 +#qed_qs.save_table_in = "qs_table" + +#qed_qs.lookup_table_mode = "load" +#qed_qs.load_table_from = "qs_table" +################################# + +### EXTERNAL E FIELD ### (3e15 * [-0.811107105653813 0.324442842261525 0.486664263392288] ) +particles.E_ext_particle_init_style = "constant" +particles.E_external_particle = -2433321316961438 973328526784575 1459992790176863 +#### + +### EXTERNAL B FIELD ### (1e7 * [0.28571429 0.42857143 0.85714286] ) +particles.B_ext_particle_init_style = "constant" +particles.B_external_particle = 2857142.85714286 4285714.28571428 8571428.57142857 +#### + +# Diagnostics +diagnostics.diags_names = diag1 +diag1.period = 1 +diag1.diag_type = Full +diag1.fields_to_plot = Ex +diag1.p1.variables = ux uy uz w +diag1.p2.variables = ux uy uz w +diag1.p3.variables = ux uy uz w +diag1.p4.variables = ux uy uz w + +diag1.ele1.variables = ux uy uz w +diag1.ele2.variables = ux uy uz w +diag1.ele3.variables = ux uy uz w +diag1.ele4.variables = ux uy uz w + +diag1.pos1.variables = ux uy uz w +diag1.pos2.variables = ux uy uz w +diag1.pos3.variables = ux uy uz w +diag1.pos4.variables = ux uy uz w diff --git a/Examples/Modules/qed/breit_wheeler/inputs_3d_optical_depth_evolution b/Examples/Modules/qed/breit_wheeler/inputs_3d_optical_depth_evolution deleted file mode 100644 index db4ec895e..000000000 --- a/Examples/Modules/qed/breit_wheeler/inputs_3d_optical_depth_evolution +++ /dev/null @@ -1,200 +0,0 @@ -################################# -####### GENERAL PARAMETERS ###### -################################# -max_step = 5 -amr.n_cell = 32 32 16 -amr.max_grid_size = 32 # maximum size of each AMReX box, used to decompose the domain -amr.blocking_factor = 8 # minimum size of each AMReX box, used to decompose the domain -geometry.coord_sys = 0 # 0: Cartesian -geometry.is_periodic = 1 1 1 # Is periodic? -geometry.prob_lo = -0.5e-6 -0.5e-6 -0.25e-6 # physical domain -geometry.prob_hi = 0.5e-6 0.5e-6 0.25e-6 -amr.max_level = 0 # Maximum level in hierarchy (1 might be unstable, >1 is not supported) - -################################# -############ NUMERICS ########### -################################# -algo.current_deposition = esirkepov -algo.charge_deposition = standard -algo.field_gathering = energy-conserving -algo.particle_pusher = boris -interpolation.nox = 3 # Particle interpolation order. Must be the same in x, y, and z -interpolation.noy = 3 -interpolation.noz = 3 -warpx.verbose = 1 -warpx.do_dive_cleaning = 0 -warpx.use_filter = 1 -warpx.cfl = 1. # if 1., the time step is set to its CFL limit -warpx.do_pml = 1 # use Perfectly Matched Layer as boundary condition -warpx.serialize_ics = 1 - -################################# -############ PLASMA ############# -################################# -particles.species_names = p1 p2 p3 p4 ele_bw pos_bw -particles.photon_species = p1 p2 p3 p4 -################################# - -p1.species_type = "photon" -p1.injection_style = "NUniformPerCell" -p1.profile = "constant" -p1.xmin = -0.6e-6 -p1.ymin = -0.6e-6 -p1.zmin = -0.6e-6 -p1.xmax = 0.6e6 -p1.ymax = 0.6e6 -p1.zmax = 0.6e6 -p1.num_particles_per_cell_each_dim = 1 1 1 -p1.density = 1e19 -p1.profile = "constant" -p1.momentum_distribution_type = "gaussian" -p1.ux_m = 2000.0 -p1.uy_m = 0.0 -p1.uz_m = 0.0 -p1.ux_th = 0. -p1.uy_th = 0. -p1.uz_th = 0. -##########QED#################### -p1.do_qed = 1 -p1.do_qed_breit_wheeler = 1 -p1.qed_breit_wheeler_ele_product_species = ele_bw -p1.qed_breit_wheeler_pos_product_species = pos_bw -################################# - -p2.species_type = "photon" -p2.injection_style = "NUniformPerCell" -p2.profile = "constant" -p2.xmin = -0.6e-6 -p2.ymin = -0.6e-6 -p2.zmin = -0.6e-6 -p2.xmax = 0.6e6 -p2.ymax = 0.6e6 -p2.zmax = 0.6e6 -p2.num_particles_per_cell_each_dim = 1 1 1 -p2.density = 1e19 -p2.profile = "constant" -p2.momentum_distribution_type = "gaussian" -p2.ux_m = 0.0 -p2.uy_m = 5000.0 -p2.uz_m = 0.0 -p2.ux_th = 0. -p2.uy_th = 0. -p2.uz_th = 0. -##########QED#################### -p2.do_qed = 1 -p2.do_qed_breit_wheeler = 1 -p2.qed_breit_wheeler_ele_product_species = ele_bw -p2.qed_breit_wheeler_pos_product_species = pos_bw -################################# - -p3.species_type = "photon" -p3.injection_style = "NUniformPerCell" -p3.profile = "constant" -p3.xmin = -0.6e-6 -p3.ymin = -0.6e-6 -p3.zmin = -0.6e-6 -p3.xmax = 0.6e6 -p3.ymax = 0.6e6 -p3.zmax = 0.6e6 -p3.num_particles_per_cell_each_dim = 1 1 1 -p3.density = 1e19 -p3.profile = "constant" -p3.momentum_distribution_type = "gaussian" -p3.ux_m = 0.0 -p3.uy_m = 0.0 -p3.uz_m = 10000.0 -p3.ux_th = 0. -p3.uy_th = 0. -p3.uz_th = 0. -##########QED#################### -p3.do_qed = 1 -p3.do_qed_breit_wheeler = 1 -p3.qed_breit_wheeler_ele_product_species = ele_bw -p3.qed_breit_wheeler_pos_product_species = pos_bw -################################# - -p4.species_type = "photon" -p4.injection_style = "NUniformPerCell" -p4.profile = "constant" -p4.xmin = -0.6e-6 -p4.ymin = -0.6e-6 -p4.zmin = -0.6e-6 -p4.xmax = 0.6e6 -p4.ymax = 0.6e6 -p4.zmax = 0.6e6 -p4.num_particles_per_cell_each_dim = 1 1 1 -p4.density = 1e19 -p4.profile = "constant" -p4.momentum_distribution_type = "gaussian" -p4.ux_m = 57735.02691896 -p4.uy_m = 57735.02691896 -p4.uz_m = 57735.02691896 -p4.ux_th = 0. -p4.uy_th = 0. -p4.uz_th = 0. -##########QED#################### -p4.do_qed = 1 -p4.do_qed_breit_wheeler = 1 -p4.qed_breit_wheeler_ele_product_species = ele_bw -p4.qed_breit_wheeler_pos_product_species = pos_bw -################################# - -### PRODUCT SPECIES ### -ele_bw.species_type = "electron" -ele_bw.injection_style = nuniformpercell -ele_bw.num_particles_per_cell_each_dim = 1 1 -ele_bw.profile = constant -ele_bw.density = 0.0 -ele_bw.momentum_distribution_type = "gaussian" -ele_bw.xmin = 1 ## Ugly trick to avoid electrons at T=0 -ele_bw.xmax = -1 ## Ugly trick to avoid electrons at T=0 -ele_bw.do_qed = 0 - -pos_bw.species_type = "positron" -pos_bw.injection_style = nuniformpercell -pos_bw.num_particles_per_cell_each_dim = 1 1 -pos_bw.profile = constant -pos_bw.density = 0.0 -pos_bw.momentum_distribution_type = "gaussian" -pos_bw.xmin = 1 ## Ugly trick to avoid positrons at T=0 -pos_bw.xmax = -1 ## Ugly trick to avoid positrons at T=0 -pos_bw.do_qed = 0 -################################# - -##########QED TABLES#################### -qed_bw.lookup_table_mode = "dummy_builtin" - -#qed_bw.lookup_table_mode = "generate" -#qed_bw.chi_min = 0.001 -#qed_bw.tab_dndt_chi_min = 0.1 -#qed_bw.tab_dndt_chi_max = 200 -#qed_bw.tab_dndt_how_many = 64 -#qed_bw.tab_pair_chi_min = 0.01 -#qed_bw.tab_pair_chi_max = 200 -#qed_bw.tab_pair_chi_how_many = 2 -#qed_bw.tab_pair_frac_how_many = 2 -#qed_bw.save_table_in = "bw_micro_table" - -#qed_bw.lookup_table_mode = "load" -#qed_bw.load_table_from = "bw_micro_table" -################################# - -### EXTERNAL E FIELD ### (3e15 * [-0.811107105653813 0.324442842261525 0.486664263392288] ) -particles.E_ext_particle_init_style = "constant" -particles.E_external_particle = -2433321316961438 973328526784575 1459992790176863 -#### - -### EXTERNAL B FIELD ### (1e7 * [0.28571429 0.42857143 0.85714286] ) -particles.B_ext_particle_init_style = "constant" -particles.B_external_particle = 2857142.85714286 4285714.28571428 8571428.57142857 -#### - -# Diagnostics -diagnostics.diags_names = diag1 -diag1.period = 1 -diag1.diag_type = Full -diag1.fields_to_plot = Ex -diag1.p1.variables = ux uy uz -diag1.p2.variables = ux uy uz -diag1.p3.variables = ux uy uz -diag1.p4.variables = ux uy uz diff --git a/Examples/Modules/qed/quantum_synchrotron/analysis.py b/Examples/Modules/qed/quantum_synchrotron/analysis.py new file mode 100755 index 000000000..5c2f778a1 --- /dev/null +++ b/Examples/Modules/qed/quantum_synchrotron/analysis.py @@ -0,0 +1,298 @@ +#! /usr/bin/env python + +# Copyright 2019 Luca Fedeli, Maxence Thevenet +# +# This file is part of WarpX. +# +# License: BSD-3-Clause-LBNL + +# -*- coding: utf-8 -*- + +import yt +import numpy as np +import sys +import scipy.special as spe +import scipy.integrate as integ +import scipy.stats as st +sys.path.insert(1, '../../../../warpx/Regression/Checksum/') +import checksumAPI + +import matplotlib.pyplot as plt + +# This script performs detailed checks of the Quantum Synchrotron photon emission process. +# Two electron populations and two positron populations are initialized with different momenta in different +# directions in a background EM field (with non-zero components along each direction). +# Specifically the script checks that: +# +# - The expected number of generated photons n_phot is in agreement with theory. +# The maximum tolerated error is 5*sqrt(n_phot), except for the last 8 points, +# for which a higher tolerance is used (this is due to the fact that the resolution +# of the builtin table is quite limited). +# - The weight of the generated particles is equal to the weight of the photon +# - The generated particles are emitted in the right direction +# - The energy distribution of the generated particles is in agreement with theory +# - The optical depths of the product species are correctly initialized (QED effects are +# enabled for product species too). +# +# More details on the theoretical formulas used in this script can be found in +# the Jupyter notebook picsar/src/multi_physics/QED_tests/validation/validation.ipynb +# +# References: +# 1) R. Duclous et al 2011 Plasma Phys. Control. Fusion 53 015009 +# 2) A. Gonoskov et al. 2015 Phys. Rev. E 92, 023305 +# 3) M. Lobet. PhD thesis "Effets radiatifs et d'electrodynamique +# quantique dans l'interaction laser-matiere ultra-relativiste" +# URL: https://tel.archives-ouvertes.fr/tel-01314224 + + +# Tolerances +tol = 1.e-8 +tol_red = 1.e-2 + +# Physical constants (from CODATA 2018, see: https://physics.nist.gov/cuu/Constants/index.html ) +me = 9.1093837015e-31 #electron mass +c = 299792458 #speed of light +hbar = 6.62607015e-34/(2*np.pi) #reduced Plank constant +fine_structure = 7.2973525693e-3 #fine structure constant +qe = 1.602176634e-19#elementary charge +E_s = (me**2 * c**3)/(qe * hbar) #Schwinger E field +B_s = E_s/c #Schwinger B field + +mec = me*c +mec2 = mec*c +#______________ + +# Initial parameters +spec_names = ["p1", "p2", "p3", "p4"] +spec_names_phot = ["qsp_1", "qsp_2", "qsp_3", "qsp_4"] +initial_momenta = [ + np.array([10.0,0,0])*mec, + np.array([0.0,100.0,0.0])*mec, + np.array([0.0,0.0,1000.0])*mec, + np.array([5773.502691896, 5773.502691896, 5773.502691896])*mec +] +csign = [-1,-1,1,1] +initial_particle_number = 1048576 + +E_f = np.array([-2433321316961438., 973328526784575., 1459992790176863.]) +B_f = np.array([2857142.85714286, 4285714.28571428, 8571428.57142857]) + +NNS = [64,64,64,64] #bins for energy distribution comparison. +#______________ + +def calc_chi_part(p, E, B): + gamma_part = np.sqrt(1.0 + np.dot(p,p)/mec**2) + v = p/(gamma_part*me) + EpvvecB = E + np.cross(v,B) + vdotEoverc = np.dot(v,E)/c + ff = np.sqrt(np.dot(EpvvecB,EpvvecB) - np.dot(vdotEoverc,vdotEoverc)) + return gamma_part*ff/E_s + +#Auxiliary functions +@np.vectorize +def IC_inner_alternative(y): + ff = lambda x : np.exp(-y*(1+(4*x**2)/3)*np.sqrt(1+x*x/3))*(9+36*x**2 + 16*x**4)/(3 + 4*x**2)/np.sqrt(1+(x**2)/3) + return integ.quad(ff, 0, np.inf)[0]/np.sqrt(3) + +def IC_Y(chi_ele, xi): + div = (chi_ele*(1-xi)) + div = np.where(np.logical_and(xi < 1, chi_ele != 0), div, 1.0); + res = (2/3)*np.where(np.logical_and(xi < 1, chi_ele != 0), xi/div, np.inf) + return res + +def IC_S(chi_ele, xi): + Y = IC_Y(chi_ele, xi) + coeff = np.sqrt(3)/2.0/np.pi + first = IC_inner_alternative(Y) + div = np.where(xi == 1, 1.0, 1.0/(1-xi) ) + res = np.where(np.logical_or(xi == 1, xi == 0), 0.0, + coeff*xi*( first + (xi**2 * spe.kv(2./3.,Y)*div ) ) ) + return res + +def IC_SXI(chi_ele, xi): + div = np.where(xi != 0, xi, 1.0) + return np.where(xi != 0, IC_S(chi_ele, xi)/div, np.inf) + +@np.vectorize +def IC_G(chi_ele): + return integ.quad(lambda xi: IC_SXI(chi_ele, xi), 0, 1)[0] + +def small_diff(vv, val): + if(val != 0.0): + return np.max(np.abs((vv - val)/val)) < tol + else: + return np.max(np.abs(vv)) < tol + +def boris(pp, dt, charge_sign): + econst = 0.5*qe*dt*charge_sign/me + u = pp/(me) + u += econst*E_f + inv_gamma = 1/np.sqrt(1 + np.dot(u,u)/c**2) + t = econst*B_f*inv_gamma + s = 2*t/(1 + np.dot(t,t)) + u_p = u + np.cross(u,t) + u += np.cross(u_p, s) + u += econst*E_f + return u *me +#__________________ + +# Quantum Synchrotron total and differential cross sections +def QS_dN_dt(chi_ele, gamma_ele): + coeff_IC = (2./3.) * fine_structure * me*c**2/hbar + return coeff_IC*IC_G(chi_ele)/gamma_ele + +def QS_d2N_dt_dchi(chi, gamma_ele, chi_phot): + coeff_IC = (2./3.) * fine_structure * me*c**2/hbar + return coeff_IC*IC_S(chi, chi_phot/chi)/chi_phot/gamma_ele +#__________________ + +# Get data for a species +def get_spec(ytdata, specname, is_photon): + px = ytdata[specname,"particle_momentum_x"].v + pz = ytdata[specname,"particle_momentum_z"].v + py = ytdata[specname,"particle_momentum_y"].v + + w = ytdata[specname,"particle_weighting"].v + + if (is_photon): + opt = ytdata[specname,"particle_optical_depth_BW"].v + else: + opt = ytdata[specname,"particle_optical_depth_QSR"].v + + return {"px" : px, "py" : py, "pz" : pz, "w" : w, "opt" : opt} + +# Individual tests +def check_number_of_photons(ytdataset, part_name, phot_name, chi_part, gamma_part, dt, particle_number): + dNQS_dt_theo = QS_dN_dt(chi_part, gamma_part) + expected_photons = (1.-np.exp(-dNQS_dt_theo*dt))*particle_number + expected_photons_tolerance = 5.0*np.sqrt(expected_photons) + n_phot = ytdataset.particle_type_counts[phot_name] + assert( np.abs(n_phot-expected_photons) < expected_photons_tolerance) + print(" [OK] generated photons number is within expectations") + return n_phot + +def check_weights(part_data, phot_data): + assert(np.all(part_data["w"] == part_data["w"][0])) + assert(np.all(phot_data["w"] == part_data["w"][0])) + print(" [OK] particles weights are the expected ones") + +def check_momenta(phot_data, p_phot, p0): + pdir = p0/np.linalg.norm(p0) + assert(small_diff(phot_data["px"]/p_phot, pdir[0])) + assert(small_diff(phot_data["py"]/p_phot, pdir[1])) + assert(small_diff(phot_data["pz"]/p_phot, pdir[2])) + print(" [OK] photons move along the initial particle direction") + +def check_opt_depths(part_data, phot_data): + data = (part_data, phot_data) + for dd in data: + loc, scale = st.expon.fit(dd["opt"]) + assert( np.abs(loc - 0) < tol_red ) + assert( np.abs(scale - 1) < tol_red ) + print(" [OK] optical depth distributions are still exponential") + +def check_energy_distrib(gamma_phot, chi_part, + gamma_part, n_phot, NN, idx, do_plot=False): + gamma_phot_min = 1e-12*gamma_part + gamma_phot_max = gamma_part + h_log_gamma_phot, c_gamma_phot = np.histogram(gamma_phot, bins=np.logspace(np.log10(gamma_phot_min),np.log10(gamma_phot_max),NN+1)) + + cchi_phot_min = chi_part*(gamma_phot_min)/(gamma_part-1) + cchi_phot_max = chi_part*(gamma_phot_max)/(gamma_part-1) + + #Rudimentary integration over npoints for each bin + npoints= 20 + aux_chi = np.logspace(np.log10(cchi_phot_min),np.log10(cchi_phot_max), NN*npoints) + distrib = QS_d2N_dt_dchi(chi_part, gamma_part, aux_chi)*aux_chi + distrib = np.sum(distrib.reshape(-1, npoints),1) + distrib = n_phot*distrib/np.sum(distrib) + + if do_plot : + # Visual comparison of distributions + c_gamma_phot = np.exp(0.5*(np.log(c_gamma_phot[1:])+np.log(c_gamma_phot[:-1]))) + plt.clf() + + fig, (ax1, ax2) = plt.subplots(1, 2) + fig.suptitle("χ_particle = {:f}".format(chi_part)) + ax1.plot(c_gamma_phot, distrib,label="theory") + ax1.loglog(c_gamma_phot, h_log_gamma_phot,label="QSR photons") + ax1.set_xlim(1e-12*(gamma_part-1),gamma_part-1) + ax1.set_ylim(1,1e5) + ax2.plot(c_gamma_phot, distrib,label="theory") + ax2.semilogy(c_gamma_phot, h_log_gamma_phot,label="QSR photons") + ax2.set_ylim(1,1e5) + ax2.set_xlim(1e-12*(gamma_part-1),gamma_part-1) + ax1.set_xlabel("γ_photon") + ax1.set_xlabel("N") + ax2.set_xlabel("γ_photon") + ax2.set_xlabel("N") + plt.legend() + plt.savefig("case_{:d}".format(idx+1)) + + discr = np.abs(h_log_gamma_phot-distrib) + + max_discr = np.sqrt(distrib)*5.0 + # Use a higer tolerance for the last 8 points (this is due to limitations + # of the builtin table) + max_discr[-8:] *= 2.0 + assert(np.all( discr < max_discr )) + + print(" [OK] energy distribution is within expectations") + +#__________________ + +def check(): + filename_end = sys.argv[1] + data_set_end = yt.load(filename_end) + + sim_time = data_set_end.current_time.to_value() + all_data_end = data_set_end.all_data() + + for idx in range(4): + part_name = spec_names[idx] + phot_name = spec_names_phot[idx] + t_pi = initial_momenta[idx] + pm = boris(t_pi,-sim_time*0.5,csign[idx]) + p0 = boris(pm,sim_time*1.0,csign[idx]) + + p2_part = p0[0]**2 + p0[1]**2 + p0[2]**2 + energy_part = np.sqrt(mec2**2 + p2_part*c**2) + gamma_part = energy_part/mec2 + chi_part = calc_chi_part(p0, E_f, B_f) + + print("** Case {:d} **".format(idx+1)) + print(" initial momentum: ", t_pi) + print(" quantum parameter: {:f}".format(chi_part)) + print(" normalized particle energy: {:f}".format(gamma_part)) + print(" timestep: {:f} fs".format(sim_time*1e15)) + + part_data_final = get_spec(all_data_end, part_name, is_photon=False) + phot_data = get_spec(all_data_end, phot_name, is_photon=True) + + p_phot = np.sqrt(phot_data["px"]**2 + phot_data["py"]**2 + phot_data["pz"]**2) + energy_phot = p_phot*c + gamma_phot = energy_phot/mec2 + + n_phot = check_number_of_photons(data_set_end, + part_name, phot_name, + chi_part, gamma_part, sim_time, + initial_particle_number) + + check_weights(part_data_final, phot_data) + + check_momenta(phot_data, p_phot, p0) + + check_energy_distrib(gamma_phot, chi_part, gamma_part, n_phot, NNS[idx], idx) + + check_opt_depths(part_data_final, phot_data) + + print("*************\n") + + test_name = filename_end[:-9] # Could also be os.path.split(os.getcwd())[1] + checksumAPI.evaluate_checksum(test_name, filename_end) + +def main(): + check() + +if __name__ == "__main__": + main() diff --git a/Examples/Modules/qed/quantum_synchrotron/analysis_2d_tau_init.py b/Examples/Modules/qed/quantum_synchrotron/analysis_2d_tau_init.py deleted file mode 100755 index b21441fb7..000000000 --- a/Examples/Modules/qed/quantum_synchrotron/analysis_2d_tau_init.py +++ /dev/null @@ -1,60 +0,0 @@ -#! /usr/bin/env python - -# Copyright 2019 Luca Fedeli, Maxence Thevenet -# -# This file is part of WarpX. -# -# License: BSD-3-Clause-LBNL - -import yt -import numpy as np -import scipy.stats as st -import sys -sys.path.insert(1, '../../../../warpx/Regression/Checksum/') -import checksumAPI - -# This script checks if electrons and positrons initialized with -# Quantum Synchrotron process enabled -# do actually have an exponentially distributed optical depth - -# Tolerance -tolerance_rel = 1e-2 -print("tolerance_rel: " + str(tolerance_rel)) - -def check(): - filename = sys.argv[1] - data_set = yt.load(filename) - - all_data = data_set.all_data() - res_ele_tau = all_data["electrons", 'particle_optical_depth_QSR'] - res_pos_tau = all_data["positrons", 'particle_optical_depth_QSR'] - - loc_ele, scale_ele = st.expon.fit(res_ele_tau) - loc_pos, scale_pos = st.expon.fit(res_pos_tau) - - # loc should be very close to 0, scale should be very close to 1 - error_rel = np.abs(loc_ele - 0) - print("error_rel loc_ele: " + str(error_rel)) - assert( error_rel < tolerance_rel ) - - error_rel = np.abs(loc_pos - 0) - print("error_rel loc_pos: " + str(error_rel)) - assert( error_rel < tolerance_rel ) - - error_rel = np.abs(scale_ele - 1) - print("error_rel scale_ele: " + str(error_rel)) - assert( error_rel < tolerance_rel ) - - error_rel = np.abs(scale_pos - 1) - print("error_rel scale_pos: " + str(error_rel)) - assert( error_rel < tolerance_rel ) - - test_name = filename[:-9] # Could also be os.path.split(os.getcwd())[1] - checksumAPI.evaluate_checksum(test_name, filename) - -def main(): - check() - -if __name__ == "__main__": - main() - diff --git a/Examples/Modules/qed/quantum_synchrotron/inputs_2d b/Examples/Modules/qed/quantum_synchrotron/inputs_2d new file mode 100644 index 000000000..c57e04793 --- /dev/null +++ b/Examples/Modules/qed/quantum_synchrotron/inputs_2d @@ -0,0 +1,224 @@ +################################# +####### GENERAL PARAMETERS ###### +################################# +max_step = 1 +amr.n_cell = 32 32 +amr.max_grid_size = 16 # maximum size of each AMReX box, used to decompose the domain +amr.blocking_factor = 8 # minimum size of each AMReX box, used to decompose the domain +geometry.coord_sys = 0 # 0: Cartesian +geometry.is_periodic = 1 1 1 # Is periodic? +geometry.prob_lo = -0.25e-6 -0.25e-6 # physical domain +geometry.prob_hi = 0.25e-6 0.25e-6 +amr.max_level = 0 # Maximum level in hierarchy (1 might be unstable, >1 is not supported) + +################################# +############ NUMERICS ########### +################################# +algo.current_deposition = esirkepov +algo.charge_deposition = standard +algo.field_gathering = energy-conserving +algo.particle_pusher = boris +interpolation.nox = 3 # Particle interpolation order. Must be the same in x, y, and z +interpolation.noy = 3 +interpolation.noz = 3 +warpx.verbose = 1 +warpx.do_dive_cleaning = 0 +warpx.use_filter = 1 +warpx.cfl = 1. # if 1., the time step is set to its CFL limit +warpx.do_pml = 1 # use Perfectly Matched Layer as boundary condition +warpx.serialize_ics = 1 + +################################# +############ PLASMA ############# +################################# +particles.species_names = p1 p2 p3 p4 qsp_1 qsp_2 qsp_3 qsp_4 dummy_ele dummy_pos +particles.photon_species = qsp_1 qsp_2 qsp_3 qsp_4 +################################# + +p1.species_type = "electron" +p1.injection_style = "NUniformPerCell" +p1.profile = "constant" +p1.num_particles_per_cell_each_dim = 32 32 +p1.density = 1e1 +p1.profile = "constant" +p1.momentum_distribution_type = "gaussian" +p1.ux_m = 10.0 +##########QED#################### +p1.do_qed = 1 +p1.do_qed_quantum_sync = 1 +p1.qed_quantum_sync_phot_product_species = qsp_1 +################################# + +p2.species_type = "electron" +p2.injection_style = "NUniformPerCell" +p2.profile = "constant" +p2.num_particles_per_cell_each_dim = 32 32 +p2.density = 1e1 +p2.profile = "constant" +p2.momentum_distribution_type = "gaussian" +p2.uy_m = 100.0 +##########QED#################### +p2.do_qed = 1 +p2.do_qed_quantum_sync = 1 +p2.qed_quantum_sync_phot_product_species = qsp_2 +################################# + +p3.species_type = "positron" +p3.injection_style = "NUniformPerCell" +p3.profile = "constant" +p3.num_particles_per_cell_each_dim = 32 32 +p3.density = 1e1 +p3.profile = "constant" +p3.momentum_distribution_type = "gaussian" +p3.uz_m = 1000.0 +##########QED#################### +p3.do_qed = 1 +p3.do_qed_quantum_sync = 1 +p3.qed_quantum_sync_phot_product_species = qsp_3 +################################# + +p4.species_type = "positron" +p4.injection_style = "NUniformPerCell" +p4.profile = "constant" +p4.num_particles_per_cell_each_dim = 32 32 +p4.density = 1e1 +p4.profile = "constant" +p4.momentum_distribution_type = "gaussian" +p4.ux_m = 5773.502691896 +p4.uy_m = 5773.502691896 +p4.uz_m = 5773.502691896 +##########QED#################### +p4.do_qed = 1 +p4.do_qed_quantum_sync = 1 +p4.qed_quantum_sync_phot_product_species = qsp_4 +################################# + +### PRODUCT SPECIES ### +qsp_1.species_type = "photon" +qsp_1.injection_style = nuniformpercell +qsp_1.num_particles_per_cell_each_dim = 0 0 +qsp_1.profile = constant +qsp_1.density = 0.0 +qsp_1.momentum_distribution_type = "gaussian" +qsp_1.do_qed = 1 +qsp_1.do_qed_breit_wheeler = 1 +qsp_1.qed_breit_wheeler_ele_product_species = dummy_ele +qsp_1.qed_breit_wheeler_pos_product_species = dummy_pos + +qsp_2.species_type = "photon" +qsp_2.injection_style = nuniformpercell +qsp_2.num_particles_per_cell_each_dim = 0 0 +qsp_2.profile = constant +qsp_2.density = 0.0 +qsp_2.momentum_distribution_type = "gaussian" +qsp_2.do_qed = 1 +qsp_2.do_qed_breit_wheeler = 1 +qsp_2.qed_breit_wheeler_ele_product_species = dummy_ele +qsp_2.qed_breit_wheeler_pos_product_species = dummy_pos + +qsp_3.species_type = "photon" +qsp_3.injection_style = nuniformpercell +qsp_3.num_particles_per_cell_each_dim = 0 0 +qsp_3.profile = constant +qsp_3.density = 0.0 +qsp_3.momentum_distribution_type = "gaussian" +qsp_3.do_qed = 1 +qsp_3.do_qed_breit_wheeler = 1 +qsp_3.qed_breit_wheeler_ele_product_species = dummy_ele +qsp_3.qed_breit_wheeler_pos_product_species = dummy_pos + +qsp_4.species_type = "photon" +qsp_4.injection_style = nuniformpercell +qsp_4.num_particles_per_cell_each_dim = 0 0 +qsp_4.profile = constant +qsp_4.density = 0.0 +qsp_4.momentum_distribution_type = "gaussian" +qsp_4.do_qed = 1 +qsp_4.do_qed_breit_wheeler = 1 +qsp_4.qed_breit_wheeler_ele_product_species = dummy_ele +qsp_4.qed_breit_wheeler_pos_product_species = dummy_pos + +################################# + +dummy_ele.species_type = "electron" +dummy_ele.injection_style = nuniformpercell +dummy_ele.num_particles_per_cell_each_dim = 0 0 +dummy_ele.profile = constant +dummy_ele.density = 0.0 +dummy_ele.momentum_distribution_type = "gaussian" +dummy_ele.do_qed = 0 + +dummy_pos.species_type = "positron" +dummy_pos.injection_style = nuniformpercell +dummy_pos.num_particles_per_cell_each_dim = 0 0 +dummy_pos.profile = constant +dummy_pos.density = 0.0 +dummy_pos.momentum_distribution_type = "gaussian" +dummy_pos.do_qed = 0 + + +################################# + +##########QED TABLES#################### +qed_bw.chi_min = 0.001 + +qed_bw.lookup_table_mode = "builtin" + +#qed_bw.lookup_table_mode = "generate" +#qed_bw.tab_dndt_chi_min = 0.01 +#qed_bw.tab_dndt_chi_max = 1000.0 +#qed_bw.tab_dndt_how_many = 256 +#qed_bw.tab_pair_chi_min = 0.01 +#qed_bw.tab_pair_chi_max = 1000.0 +#qed_bw.tab_pair_chi_how_many = 256 +#qed_bw.tab_pair_frac_how_many = 256 +#qed_bw.save_table_in = "bw_table" + +#qed_bw.lookup_table_mode = "load" +#qed_bw.load_table_from = "bw_table" + +qed_qs.chi_min = 0.001 + +qed_qs.lookup_table_mode = "builtin" + +qed_qs.photon_creation_energy_threshold = 0.0 + +#qed_qs.lookup_table_mode = "generate" +#qed_qs.tab_dndt_chi_min = 0.001 +#qed_qs.tab_dndt_chi_max = 1000.0 +#qed_qs.tab_dndt_how_many = 256 +#qed_qs.tab_em_chi_min = 0.001 +#qed_qs.tab_em_frac_min = 1.0e-12 +#qed_qs.tab_em_chi_max = 1000.0 +#qed_qs.tab_em_chi_how_many = 256 +#qed_qs.tab_em_frac_how_many = 256 +#qed_qs.save_table_in = "qs_table" + +#qed_qs.lookup_table_mode = "load" +#qed_qs.load_table_from = "qs_table" +################################# + +### EXTERNAL E FIELD ### (3e15 * [-0.811107105653813 0.324442842261525 0.486664263392288] ) +particles.E_ext_particle_init_style = "constant" +particles.E_external_particle = -2433321316961438 973328526784575 1459992790176863 +#### + +### EXTERNAL B FIELD ### (1e7 * [0.28571429 0.42857143 0.85714286] ) +particles.B_ext_particle_init_style = "constant" +particles.B_external_particle = 2857142.85714286 4285714.28571428 8571428.57142857 +#### + +# Diagnostics +diagnostics.diags_names = diag1 +diag1.period = 1 +diag1.diag_type = Full +diag1.fields_to_plot = Ex +diag1.p1.variables = ux uy uz w +diag1.p2.variables = ux uy uz w +diag1.p3.variables = ux uy uz w +diag1.p4.variables = ux uy uz w + +diag1.qsp_1.variables = ux uy uz w +diag1.qsp_2.variables = ux uy uz w +diag1.qsp_3.variables = ux uy uz w +diag1.qsp_4.variables = ux uy uz w diff --git a/Examples/Modules/qed/quantum_synchrotron/inputs_2d_tau_init b/Examples/Modules/qed/quantum_synchrotron/inputs_2d_tau_init deleted file mode 100644 index a29adf287..000000000 --- a/Examples/Modules/qed/quantum_synchrotron/inputs_2d_tau_init +++ /dev/null @@ -1,122 +0,0 @@ -################################# -####### GENERAL PARAMETERS ###### -################################# -max_step = 1 -amr.n_cell = 128 128 -amr.max_grid_size = 128 # maximum size of each AMReX box, used to decompose the domain -amr.blocking_factor = 32 # minimum size of each AMReX box, used to decompose the domain -geometry.coord_sys = 0 # 0: Cartesian -geometry.is_periodic = 0 0 # Is periodic? -geometry.prob_lo = -32.e-6 -32.e-6 # physical domain -geometry.prob_hi = 32.e-6 32.e-6 -amr.max_level = 0 # Maximum level in hierarchy (1 might be unstable, >1 is not supported) - -################################# -############ NUMERICS ########### -################################# -algo.current_deposition = esirkepov -algo.charge_deposition = standard -algo.field_gathering = energy-conserving -algo.particle_pusher = boris -interpolation.nox = 3 # Particle interpolation order. Must be the same in x, y, and z -interpolation.noy = 3 -interpolation.noz = 3 -warpx.verbose = 1 -warpx.do_dive_cleaning = 0 -warpx.use_filter = 1 -warpx.cfl = 1. # if 1., the time step is set to its CFL limit -warpx.do_pml = 1 # use Perfectly Matched Layer as boundary condition -warpx.serialize_ics = 1 - - -################################# -############ PLASMA ############# -################################# -particles.species_names = electrons positrons qs_phot -particles.photon_species = qs_phot -################################# - -electrons.species_type = "electron" -electrons.injection_style = "NUniformPerCell" -electrons.profile = "constant" -electrons.xmin = -30e-6 -electrons.ymin = -30e-6 -electrons.zmin = -30e-6 -electrons.xmax = 30e-6 -electrons.ymax = 30e-6 -electrons.zmax = 30e-6 -electrons.num_particles_per_cell_each_dim = 2 2 -electrons.density = 1e19 -electrons.profile = "constant" -electrons.momentum_distribution_type = "gaussian" -electrons.ux_m = 0.0 -electrons.uy_m = 0.0 -electrons.uz_m = 0.0 -electrons.ux_th = 100. -electrons.uy_th = 100. -electrons.uz_th = 100. -##########QED#################### -electrons.do_qed = 1 -electrons.do_qed_quantum_sync = 1 -electrons.qed_quantum_sync_phot_product_species = qs_phot -################################# - -positrons.species_type = "positron" -positrons.injection_style = "NUniformPerCell" -positrons.profile = "constant" -positrons.xmin = -30e-6 -positrons.ymin = -30e-6 -positrons.zmin = -30e-6 -positrons.xmax = 30e-6 -positrons.ymax = 30e-6 -positrons.zmax = 30e-6 -positrons.num_particles_per_cell_each_dim = 2 2 -positrons.density = 1e19 -positrons.profile = "constant" -positrons.momentum_distribution_type = "gaussian" -positrons.ux_m = 0.0 -positrons.uy_m = 0.0 -positrons.uz_m = 0.0 -positrons.ux_th = 100. -positrons.uy_th = 100. -positrons.uz_th = 100. -##########QED#################### -positrons.do_qed = 1 -positrons.do_qed_quantum_sync = 1 -positrons.qed_quantum_sync_phot_product_species = qs_phot -################################# - -### PRODUCT SPECIES ### -qs_phot.species_type = "photon" -qs_phot.injection_style = nuniformpercell -qs_phot.num_particles_per_cell_each_dim = 1 1 -qs_phot.profile = constant -qs_phot.xmin = 1 ## Ugly trick to avoid photons at T=0 -qs_phot.xmax = -1 ## Ugly trick to avoid photons at T=0 -qs_phot.density = 0.0 -qs_phot.momentum_distribution_type = "gaussian" -################################# - -#######QED ENGINE PARAMETERS##### -qed_qs.lookup_table_mode = "dummy_builtin" -qed_qs.photon_creation_energy_threshold = 1.63742112993e-13 - -#qed_qs.lookup_table_mode = "generate" -#qed_qs.chi_min = 0.001 -#qed_qs.tab_dndt_chi_min = 0.001 -#qed_qs.tab_dndt_chi_max = 200 -#qed_qs.tab_dndt_how_many = 32 -#qed_qs.tab_em_chi_min = 0.001 -#qed_qs.tab_em_chi_max = 200 -#qed_qs.tab_em_chi_how_many = 2 -#qed_qs.tab_em_prob_how_many = 2 -#qed_qs.save_table_in = "qs_micro_table" - -#qed_qs.lookup_table_mode = "load" -#qed_qs.load_table_from = "qs_micro_table" -################################# - -# Diagnostics -diagnostics.diags_names = diag1 -diag1.period = 1 -diag1.diag_type = Full diff --git a/Examples/Modules/qed/quantum_synchrotron/inputs_3d b/Examples/Modules/qed/quantum_synchrotron/inputs_3d new file mode 100644 index 000000000..66670b4db --- /dev/null +++ b/Examples/Modules/qed/quantum_synchrotron/inputs_3d @@ -0,0 +1,224 @@ +################################# +####### GENERAL PARAMETERS ###### +################################# +max_step = 1 +amr.n_cell = 16 16 16 +amr.max_grid_size = 16 # maximum size of each AMReX box, used to decompose the domain +amr.blocking_factor = 8 # minimum size of each AMReX box, used to decompose the domain +geometry.coord_sys = 0 # 0: Cartesian +geometry.is_periodic = 1 1 1 # Is periodic? +geometry.prob_lo = -0.25e-6 -0.25e-6 -0.25e-6 # physical domain +geometry.prob_hi = 0.25e-6 0.25e-6 0.25e-6 +amr.max_level = 0 # Maximum level in hierarchy (1 might be unstable, >1 is not supported) + +################################# +############ NUMERICS ########### +################################# +algo.current_deposition = esirkepov +algo.charge_deposition = standard +algo.field_gathering = energy-conserving +algo.particle_pusher = boris +interpolation.nox = 3 # Particle interpolation order. Must be the same in x, y, and z +interpolation.noy = 3 +interpolation.noz = 3 +warpx.verbose = 1 +warpx.do_dive_cleaning = 0 +warpx.use_filter = 1 +warpx.cfl = 1. # if 1., the time step is set to its CFL limit +warpx.do_pml = 1 # use Perfectly Matched Layer as boundary condition +warpx.serialize_ics = 1 + +################################# +############ PLASMA ############# +################################# +particles.species_names = p1 p2 p3 p4 qsp_1 qsp_2 qsp_3 qsp_4 dummy_ele dummy_pos +particles.photon_species = qsp_1 qsp_2 qsp_3 qsp_4 +################################# + +p1.species_type = "electron" +p1.injection_style = "NUniformPerCell" +p1.profile = "constant" +p1.num_particles_per_cell_each_dim = 8 8 4 +p1.density = 1e1 +p1.profile = "constant" +p1.momentum_distribution_type = "gaussian" +p1.ux_m = 10.0 +##########QED#################### +p1.do_qed = 1 +p1.do_qed_quantum_sync = 1 +p1.qed_quantum_sync_phot_product_species = qsp_1 +################################# + +p2.species_type = "electron" +p2.injection_style = "NUniformPerCell" +p2.profile = "constant" +p2.num_particles_per_cell_each_dim = 8 8 4 +p2.density = 1e1 +p2.profile = "constant" +p2.momentum_distribution_type = "gaussian" +p2.uy_m = 100.0 +##########QED#################### +p2.do_qed = 1 +p2.do_qed_quantum_sync = 1 +p2.qed_quantum_sync_phot_product_species = qsp_2 +################################# + +p3.species_type = "positron" +p3.injection_style = "NUniformPerCell" +p3.profile = "constant" +p3.num_particles_per_cell_each_dim = 8 8 4 +p3.density = 1e1 +p3.profile = "constant" +p3.momentum_distribution_type = "gaussian" +p3.uz_m = 1000.0 +##########QED#################### +p3.do_qed = 1 +p3.do_qed_quantum_sync = 1 +p3.qed_quantum_sync_phot_product_species = qsp_3 +################################# + +p4.species_type = "positron" +p4.injection_style = "NUniformPerCell" +p4.profile = "constant" +p4.num_particles_per_cell_each_dim = 8 8 4 +p4.density = 1e1 +p4.profile = "constant" +p4.momentum_distribution_type = "gaussian" +p4.ux_m = 5773.502691896 +p4.uy_m = 5773.502691896 +p4.uz_m = 5773.502691896 +##########QED#################### +p4.do_qed = 1 +p4.do_qed_quantum_sync = 1 +p4.qed_quantum_sync_phot_product_species = qsp_4 +################################# + +### PRODUCT SPECIES ### +qsp_1.species_type = "photon" +qsp_1.injection_style = nuniformpercell +qsp_1.num_particles_per_cell_each_dim = 0 0 +qsp_1.profile = constant +qsp_1.density = 0.0 +qsp_1.momentum_distribution_type = "gaussian" +qsp_1.do_qed = 1 +qsp_1.do_qed_breit_wheeler = 1 +qsp_1.qed_breit_wheeler_ele_product_species = dummy_ele +qsp_1.qed_breit_wheeler_pos_product_species = dummy_pos + +qsp_2.species_type = "photon" +qsp_2.injection_style = nuniformpercell +qsp_2.num_particles_per_cell_each_dim = 0 0 +qsp_2.profile = constant +qsp_2.density = 0.0 +qsp_2.momentum_distribution_type = "gaussian" +qsp_2.do_qed = 1 +qsp_2.do_qed_breit_wheeler = 1 +qsp_2.qed_breit_wheeler_ele_product_species = dummy_ele +qsp_2.qed_breit_wheeler_pos_product_species = dummy_pos + +qsp_3.species_type = "photon" +qsp_3.injection_style = nuniformpercell +qsp_3.num_particles_per_cell_each_dim = 0 0 +qsp_3.profile = constant +qsp_3.density = 0.0 +qsp_3.momentum_distribution_type = "gaussian" +qsp_3.do_qed = 1 +qsp_3.do_qed_breit_wheeler = 1 +qsp_3.qed_breit_wheeler_ele_product_species = dummy_ele +qsp_3.qed_breit_wheeler_pos_product_species = dummy_pos + +qsp_4.species_type = "photon" +qsp_4.injection_style = nuniformpercell +qsp_4.num_particles_per_cell_each_dim = 0 0 +qsp_4.profile = constant +qsp_4.density = 0.0 +qsp_4.momentum_distribution_type = "gaussian" +qsp_4.do_qed = 1 +qsp_4.do_qed_breit_wheeler = 1 +qsp_4.qed_breit_wheeler_ele_product_species = dummy_ele +qsp_4.qed_breit_wheeler_pos_product_species = dummy_pos + +################################# + +dummy_ele.species_type = "electron" +dummy_ele.injection_style = nuniformpercell +dummy_ele.num_particles_per_cell_each_dim = 0 0 +dummy_ele.profile = constant +dummy_ele.density = 0.0 +dummy_ele.momentum_distribution_type = "gaussian" +dummy_ele.do_qed = 0 + +dummy_pos.species_type = "positron" +dummy_pos.injection_style = nuniformpercell +dummy_pos.num_particles_per_cell_each_dim = 0 0 +dummy_pos.profile = constant +dummy_pos.density = 0.0 +dummy_pos.momentum_distribution_type = "gaussian" +dummy_pos.do_qed = 0 + + +################################# + +##########QED TABLES#################### +qed_bw.chi_min = 0.001 + +qed_bw.lookup_table_mode = "builtin" + +#qed_bw.lookup_table_mode = "generate" +#qed_bw.tab_dndt_chi_min = 0.01 +#qed_bw.tab_dndt_chi_max = 1000.0 +#qed_bw.tab_dndt_how_many = 256 +#qed_bw.tab_pair_chi_min = 0.01 +#qed_bw.tab_pair_chi_max = 1000.0 +#qed_bw.tab_pair_chi_how_many = 256 +#qed_bw.tab_pair_frac_how_many = 256 +#qed_bw.save_table_in = "bw_table" + +#qed_bw.lookup_table_mode = "load" +#qed_bw.load_table_from = "bw_table" + +qed_qs.chi_min = 0.001 + +qed_qs.lookup_table_mode = "builtin" + +qed_qs.photon_creation_energy_threshold = 0.0 + +#qed_qs.lookup_table_mode = "generate" +#qed_qs.tab_dndt_chi_min = 0.001 +#qed_qs.tab_dndt_chi_max = 1000.0 +#qed_qs.tab_dndt_how_many = 256 +#qed_qs.tab_em_chi_min = 0.001 +#qed_qs.tab_em_frac_min = 1.0e-12 +#qed_qs.tab_em_chi_max = 1000.0 +#qed_qs.tab_em_chi_how_many = 256 +#qed_qs.tab_em_frac_how_many = 256 +#qed_qs.save_table_in = "qs_table" + +#qed_qs.lookup_table_mode = "load" +#qed_qs.load_table_from = "qs_table" +################################# + +### EXTERNAL E FIELD ### (3e15 * [-0.811107105653813 0.324442842261525 0.486664263392288] ) +particles.E_ext_particle_init_style = "constant" +particles.E_external_particle = -2433321316961438 973328526784575 1459992790176863 +#### + +### EXTERNAL B FIELD ### (1e7 * [0.28571429 0.42857143 0.85714286] ) +particles.B_ext_particle_init_style = "constant" +particles.B_external_particle = 2857142.85714286 4285714.28571428 8571428.57142857 +#### + +# Diagnostics +diagnostics.diags_names = diag1 +diag1.period = 1 +diag1.diag_type = Full +diag1.fields_to_plot = Ex +diag1.p1.variables = ux uy uz w +diag1.p2.variables = ux uy uz w +diag1.p3.variables = ux uy uz w +diag1.p4.variables = ux uy uz w + +diag1.qsp_1.variables = ux uy uz w +diag1.qsp_2.variables = ux uy uz w +diag1.qsp_3.variables = ux uy uz w +diag1.qsp_4.variables = ux uy uz w diff --git a/Examples/Modules/qed/schwinger/analysis_schwinger.py b/Examples/Modules/qed/schwinger/analysis_schwinger.py index f52512478..25dadeb42 100755 --- a/Examples/Modules/qed/schwinger/analysis_schwinger.py +++ b/Examples/Modules/qed/schwinger/analysis_schwinger.py @@ -21,9 +21,9 @@ import checksumAPI # define some parameters c = 299792458. -m_e = 9.10938356e-31 -e = 1.6021766208e-19 -hbar = 1.054571800e-34 +m_e = 9.1093837015e-31 +e =1.602176634e-19 +hbar = 1.054571817e-34 E_S = m_e**2*c**3/e/hbar # Schwinger field dV = (1.e-6)**3 # total simulation volume diff --git a/Regression/Checksum/benchmarks_json/qed_breit_wheeler_2d.json b/Regression/Checksum/benchmarks_json/qed_breit_wheeler_2d.json new file mode 100644 index 000000000..ac9292d03 --- /dev/null +++ b/Regression/Checksum/benchmarks_json/qed_breit_wheeler_2d.json @@ -0,0 +1,137 @@ +{ + "ele1": { + "particle_cpu": 47332.0, + "particle_id": 208304044359.0, + "particle_momentum_x": 2.58588597891772511344442318e-14, + "particle_momentum_y": 0.0, + "particle_momentum_z": 0.0, + "particle_optical_depth_QSR": 94696.4657961219345452263951301574707031250000, + "particle_position_x": 0.0236641383450765, + "particle_position_y": 0.02351792724609375, + "particle_weight": 900621.4141845703 + }, + "ele2": { + "particle_cpu": 6073.0, + "particle_id": 27130859500.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 8.1664154261955651619665085e-15, + "particle_momentum_z": 0.0, + "particle_optical_depth_QSR": 11835.1055475386856414843350648880004882812500, + "particle_position_x": 0.00300684326171875, + "particle_position_y": 0.00299909619140625, + "particle_weight": 114240.64636230469 + }, + "ele3": { + "particle_cpu": 63189.0, + "particle_id": 294193317389.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 0.0, + "particle_momentum_z": 1.725635030922431898577438009e-13, + "particle_optical_depth_QSR": 126207.2254516556131420657038688659667968750000, + "particle_position_x": 0.0316306396484375, + "particle_position_y": 0.03171556895151163, + "particle_weight": 1206226.3488769531 + }, + "ele4": { + "particle_cpu": 24210.0, + "particle_id": 117564341063.0, + "particle_momentum_x": 3.837082573229679014720902203e-13, + "particle_momentum_y": 3.837082573229679014720902203e-13, + "particle_momentum_z": 3.837082573229679014720902203e-13, + "particle_optical_depth_QSR": 48381.7888648896114318631589412689208984375000, + "particle_position_x": 0.012101709192233077, + "particle_position_y": 0.012111250324900506, + "particle_weight": 463647.84240722656 + }, + "lev=0": { + "Ex": 0.0 + }, + "p1": { + "particle_cpu": 476956.0, + "particle_id": 257854228043.0, + "particle_momentum_x": 5.211363201667322e-13, + "particle_momentum_y": 0.0, + "particle_momentum_z": 0.0, + "particle_optical_depth_BW": 955462.1120497078, + "particle_position_x": 0.23847986165492352, + "particle_position_y": 0.2386260727539063, + "particle_weight": 9099378.58581543 + }, + "p2": { + "particle_cpu": 518215.0, + "particle_id": 840692712768.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 1.4154340878946218e-12, + "particle_momentum_z": 0.0, + "particle_optical_depth_BW": 1035921.4604132524, + "particle_position_x": 0.25913715673828125, + "particle_position_y": 0.2591449038085938, + "particle_weight": 9885759.353637695 + }, + "p3": { + "particle_cpu": 461099.0, + "particle_id": 1246333912261.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 0.0, + "particle_momentum_z": 2.5181691242461693e-12, + "particle_optical_depth_BW": 921660.859376024, + "particle_position_x": 0.23051336035156236, + "particle_position_y": 0.23042843104848845, + "particle_weight": 8793773.651123047 + }, + "p4": { + "particle_cpu": 500078.0, + "particle_id": 1892252377690.0, + "particle_momentum_x": 1.576635368257434e-11, + "particle_momentum_y": 1.576635368257434e-11, + "particle_momentum_z": 1.576635368257434e-11, + "particle_optical_depth_BW": 999134.306723253, + "particle_position_x": 0.2500422908077668, + "particle_position_y": 0.2500327496750996, + "particle_weight": 9536352.157592773 + }, + "pos1": { + "particle_cpu": 47332.0, + "particle_id": 209418933440.0, + "particle_momentum_x": 2.57211643025628750267839636e-14, + "particle_momentum_y": 0.0, + "particle_momentum_z": 0.0, + "particle_optical_depth_QSR": 94624.9490281959297135472297668457031250000000, + "particle_position_x": 0.0236641383450765, + "particle_position_y": 0.02351792724609375, + "particle_weight": 900621.4141845703 + }, + "pos2": { + "particle_cpu": 6073.0, + "particle_id": 27148807905.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 8.1904553211236055771791308e-15, + "particle_momentum_z": 0.0, + "particle_optical_depth_QSR": 12091.3263468917793943546712398529052734375000, + "particle_position_x": 0.00300684326171875, + "particle_position_y": 0.00299909619140625, + "particle_weight": 114240.64636230469 + }, + "pos3": { + "particle_cpu": 63189.0, + "particle_id": 296193112041.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 0.0, + "particle_momentum_z": 1.728492728991635470350296701e-13, + "particle_optical_depth_QSR": 125934.2625277330371318385004997253417968750000, + "particle_position_x": 0.0316306396484375, + "particle_position_y": 0.03171556895151163, + "particle_weight": 1206226.3488769531 + }, + "pos4": { + "particle_cpu": 24210.0, + "particle_id": 117859832476.0, + "particle_momentum_x": 3.828359863812495493291348548e-13, + "particle_momentum_y": 3.828359863812495493291348548e-13, + "particle_momentum_z": 3.828359863812495493291348548e-13, + "particle_optical_depth_QSR": 48662.7616644648805959150195121765136718750000, + "particle_position_x": 0.012101709192233077, + "particle_position_y": 0.012111250324900506, + "particle_weight": 463647.84240722656 + } +} diff --git a/Regression/Checksum/benchmarks_json/qed_breit_wheeler_3d.json b/Regression/Checksum/benchmarks_json/qed_breit_wheeler_3d.json new file mode 100644 index 000000000..ab2ad86e3 --- /dev/null +++ b/Regression/Checksum/benchmarks_json/qed_breit_wheeler_3d.json @@ -0,0 +1,149 @@ +{ + "ele1": { + "particle_cpu": 75032.0, + "particle_id": 322639139372.0, + "particle_momentum_x": 4.09769068083714937569857114e-14, + "particle_momentum_y": 0.0, + "particle_momentum_z": 0.0, + "particle_optical_depth_QSR": 149795.7110893558128736913204193115234375000000, + "particle_position_x": 0.0374394067025573, + "particle_position_y": 0.03750066406250001, + "particle_position_z": 0.037341921875, + "particle_weight": 1.4289093017578123 + }, + "ele2": { + "particle_cpu": 9793.0, + "particle_id": 43961074159.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 1.32721307693240310365736405e-14, + "particle_momentum_z": 0.0, + "particle_optical_depth_QSR": 19478.5291867527776048518717288970947265625000, + "particle_position_x": 0.00487769140625, + "particle_position_y": 0.004883663375988306, + "particle_position_z": 0.0048729921874999995, + "particle_weight": 0.18597602844238278 + }, + "ele3": { + "particle_cpu": 99155.0, + "particle_id": 464694872011.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 0.0, + "particle_momentum_z": 2.711561853643428955125070802e-13, + "particle_optical_depth_QSR": 198435.0529202320321928709745407104492187500000, + "particle_position_x": 0.04959472265624999, + "particle_position_y": 0.049601199218749996, + "particle_position_z": 0.049660153352435205, + "particle_weight": 1.8931293487548826 + }, + "ele4": { + "particle_cpu": 39055.0, + "particle_id": 195883550491.0, + "particle_momentum_x": 6.190484920544669620800655761e-13, + "particle_momentum_y": 6.190484920544669620800655761e-13, + "particle_momentum_z": 6.190484920544669620800655761e-13, + "particle_optical_depth_QSR": 78514.9343421634548576548695564270019531250000, + "particle_position_x": 0.019598247395833334, + "particle_position_y": 0.019667958333333336, + "particle_position_z": 0.019563541666666667, + "particle_weight": 0.7489013671874999 + }, + "lev=0": { + "Ex": 0.0 + }, + "p1": { + "particle_cpu": 449256.0, + "particle_id": 235491419135.0, + "particle_momentum_x": 4.908804072906878e-13, + "particle_momentum_y": 0.0, + "particle_momentum_z": 0.0, + "particle_optical_depth_BW": 900178.7606581703, + "particle_position_x": 0.22470459329744272, + "particle_position_y": 0.2246433359375, + "particle_position_z": 0.22480207812499997, + "particle_weight": 8.571090698242186 + }, + "p2": { + "particle_cpu": 514495.0, + "particle_id": 809317053396.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 1.4051630807345168e-12, + "particle_momentum_z": 0.0, + "particle_optical_depth_BW": 1028419.7570255434, + "particle_position_x": 0.25726630859374994, + "particle_position_y": 0.2572603366240118, + "particle_position_z": 0.25727100781249995, + "particle_weight": 9.814023971557615 + }, + "p3": { + "particle_cpu": 425133.0, + "particle_id": 1114131389020.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 0.0, + "particle_momentum_z": 2.321468823070715e-12, + "particle_optical_depth_BW": 849662.7634565933, + "particle_position_x": 0.21254927734374993, + "particle_position_y": 0.21254280078124993, + "particle_position_z": 0.21248384664756478, + "particle_weight": 8.106870651245115 + }, + "p4": { + "particle_cpu": 485233.0, + "particle_id": 1779979854691.0, + "particle_momentum_x": 1.5294746941698488e-11, + "particle_momentum_y": 1.5294746941698488e-11, + "particle_momentum_z": 1.5294746941698488e-11, + "particle_optical_depth_BW": 969220.1746435867, + "particle_position_x": 0.2425457526041667, + "particle_position_y": 0.24247604166666667, + "particle_position_z": 0.24258045833333322, + "particle_weight": 9.251098632812498 + }, + "pos1": { + "particle_cpu": 75032.0, + "particle_id": 328251649436.0, + "particle_momentum_x": 4.08590066787212354571248997e-14, + "particle_momentum_y": 0.0, + "particle_momentum_z": 0.0, + "particle_optical_depth_QSR": 149619.0538811495061963796615600585937500000000, + "particle_position_x": 0.0374394067025573, + "particle_position_y": 0.03750066406250001, + "particle_position_z": 0.037341921875, + "particle_weight": 1.4289093017578123 + }, + "pos2": { + "particle_cpu": 9793.0, + "particle_id": 44056150976.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 1.33557460646864680765462173e-14, + "particle_momentum_z": 0.0, + "particle_optical_depth_QSR": 19267.4952943192693055607378482818603515625000, + "particle_position_x": 0.00487769140625, + "particle_position_y": 0.004883663375988306, + "particle_position_z": 0.0048729921874999995, + "particle_weight": 0.18597602844238278 + }, + "pos3": { + "particle_cpu": 99155.0, + "particle_id": 474546404744.0, + "particle_momentum_x": 0.0, + "particle_momentum_y": 0.0, + "particle_momentum_z": 2.709568803733161877263216213e-13, + "particle_optical_depth_QSR": 199114.2072337889694608747959136962890625000000, + "particle_position_x": 0.04959472265624999, + "particle_position_y": 0.049601199218749996, + "particle_position_z": 0.049660153352435205, + "particle_weight": 1.8931293487548826 + }, + "pos4": { + "particle_cpu": 39055.0, + "particle_id": 197425348561.0, + "particle_momentum_x": 6.191024913788928155183119361e-13, + "particle_momentum_y": 6.191024913788928155183119361e-13, + "particle_momentum_z": 6.191024913788928155183119361e-13, + "particle_optical_depth_QSR": 78364.7008082381944404914975166320800781250000, + "particle_position_x": 0.019598247395833334, + "particle_position_y": 0.019667958333333336, + "particle_position_z": 0.019563541666666667, + "particle_weight": 0.7489013671874999 + } +} diff --git a/Regression/Checksum/benchmarks_json/qed_breit_wheeler_opt_depth_evolution.json b/Regression/Checksum/benchmarks_json/qed_breit_wheeler_opt_depth_evolution.json deleted file mode 100644 index 2712d517f..000000000 --- a/Regression/Checksum/benchmarks_json/qed_breit_wheeler_opt_depth_evolution.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "ele_bw": { - "particle_cpu": 7868.0, - "particle_id": 646554824.0, - "particle_momentum_x": 2.5371833905509472e-14, - "particle_momentum_y": 2.390094592886486e-14, - "particle_momentum_z": 3.195830540752922e-14, - "particle_position_x": 0.0038628680559308396, - "particle_position_y": 0.0038691826866907985, - "particle_position_z": 0.0019396899450056522, - "particle_weight": 4.751892089843749 - }, - "lev=0": { - "Ex": 18418958.618769623 - }, - "p1": { - "particle_cpu": 5543.0, - "particle_id": 47499255.0, - "particle_momentum_x": 6.069752862017886e-15, - "particle_momentum_y": 0.0, - "particle_momentum_z": 0.0, - "particle_optical_depth_BW": 11151.849063257036, - "particle_position_x": 0.0027782891957751693, - "particle_position_y": 0.002784171875, - "particle_position_z": 0.0013972031249999998 - }, - "p2": { - "particle_cpu": 7827.0, - "particle_id": 199091206.0, - "particle_momentum_x": 0.0, - "particle_momentum_y": 2.1396793698330848e-14, - "particle_momentum_z": 0.0, - "particle_optical_depth_BW": 15965.491577214689, - "particle_position_x": 0.00392103125, - "particle_position_y": 0.003911447515877365, - "particle_position_z": 0.0019578749999999995 - }, - "p3": { - "particle_cpu": 4835.0, - "particle_id": 205936781.0, - "particle_momentum_x": 0.0, - "particle_momentum_y": 0.0, - "particle_momentum_z": 2.6612859552040087e-14, - "particle_optical_depth_BW": 9728.073455792824, - "particle_position_x": 0.002453390625, - "particle_position_y": 0.002459640625, - "particle_position_z": 0.0012191973174102994 - }, - "p4": { - "particle_cpu": 6696.0, - "particle_id": 397669037.0, - "particle_momentum_x": 2.118611807411617e-13, - "particle_momentum_y": 2.118611807411617e-13, - "particle_momentum_z": 2.118611807411617e-13, - "particle_optical_depth_BW": 13376.081619606364, - "particle_position_x": 0.003368619791666666, - "particle_position_y": 0.0033608489583333333, - "particle_position_z": 0.0016801197916666664 - }, - "pos_bw": { - "particle_cpu": 7868.0, - "particle_id": 648632397.0, - "particle_momentum_x": 2.5161516094347012e-14, - "particle_momentum_y": 2.4559377145598413e-14, - "particle_momentum_z": 3.330888308559405e-14, - "particle_position_x": 0.0038621659133009625, - "particle_position_y": 0.003867460692695544, - "particle_position_z": 0.0019361455637321736, - "particle_weight": 4.751892089843749 - } -}
\ No newline at end of file diff --git a/Regression/Checksum/benchmarks_json/qed_breit_wheeler_tau_init.json b/Regression/Checksum/benchmarks_json/qed_breit_wheeler_tau_init.json deleted file mode 100644 index 24663e19b..000000000 --- a/Regression/Checksum/benchmarks_json/qed_breit_wheeler_tau_init.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "lev=0": { - "Bx": 0.0, - "By": 0.0, - "Bz": 0.0, - "Ex": 0.0, - "Ey": 0.0, - "Ez": 0.0, - "jx": 0.0, - "jy": 0.0, - "jz": 0.0 - }, - "photons": { - "particle_cpu": 28800.0, - "particle_id": 897828480.0, - "particle_momentum_x": 1.257725971841766e-15, - "particle_momentum_y": 1.2533271477501288e-15, - "particle_momentum_z": 1.2567654312332688e-15, - "particle_optical_depth_BW": 57886.05893096988, - "particle_position_x": 0.8640051523469104, - "particle_position_y": 0.8640331757950863, - "particle_weight": 36000000000.0 - } -}
\ No newline at end of file diff --git a/Regression/Checksum/benchmarks_json/qed_quantum_sync_2d.json b/Regression/Checksum/benchmarks_json/qed_quantum_sync_2d.json new file mode 100644 index 000000000..671eab2a1 --- /dev/null +++ b/Regression/Checksum/benchmarks_json/qed_quantum_sync_2d.json @@ -0,0 +1,93 @@ +{ + "lev=0": { + "Ex": 2.4557665520375066e-13 + }, + "p1": { + "particle_cpu": 524288.0, + "particle_id": 283468365824.0, + "particle_momentum_x": 6.8967708469790264898971893e-15, + "particle_momentum_y": 4.6544555163678046641608873e-15, + "particle_momentum_z": 1.06978456723094022003418991e-14, + "particle_optical_depth_QSR": 1050156.6786004053428769111633300781250000000000, + "particle_position_x": 0.13107200000000005, + "particle_position_y": 0.13107200000000005, + "particle_weight": 2.4999999999999954e-12 + }, + "p2": { + "particle_cpu": 524288.0, + "particle_id": 850404048896.0, + "particle_momentum_x": 7.635368623237383502135230e-16, + "particle_momentum_y": 2.28415575523800556640511186e-14, + "particle_momentum_z": 3.9081460339209575333427882e-15, + "particle_optical_depth_QSR": 1047498.9017682682024314999580383300781250000000, + "particle_position_x": 0.13107200000000005, + "particle_position_y": 0.13107200000000002, + "particle_weight": 2.4999999999999954e-12 + }, + "p3": { + "particle_cpu": 524288.0, + "particle_id": 1417339731968.0, + "particle_momentum_x": 2.18668242584086149502629596e-14, + "particle_momentum_y": 1.15704338121745335946594339e-14, + "particle_momentum_z": 2.748648252185421483237385693e-13, + "particle_optical_depth_QSR": 1047320.3901455836603417992591857910156250000000, + "particle_position_x": 0.13107200000000008, + "particle_position_y": 0.13107199999999997, + "particle_weight": 2.4999999999999954e-12 + }, + "p4": { + "particle_cpu": 524288.0, + "particle_id": 1984275415040.0, + "particle_momentum_x": 1.5790004379896003355140614396e-12, + "particle_momentum_y": 1.5892318647516152626506462218e-12, + "particle_momentum_z": 1.5996357079880960792769882593e-12, + "particle_optical_depth_QSR": 1047445.3621248775161802768707275390625000000000, + "particle_position_x": 0.131072, + "particle_position_y": 0.131072, + "particle_weight": 2.4999999999999954e-12 + }, + "qsp_1": { + "particle_cpu": 113640.0, + "particle_id": 504148092945.0, + "particle_momentum_x": 7.9316153448628635737165e-18, + "particle_momentum_y": 2.8710553896582841054827e-18, + "particle_momentum_z": 8.5951416157507011308028e-18, + "particle_optical_depth_BW": 226981.5178113427245989441871643066406250000000, + "particle_position_x": 0.0284238987593396531805556293193149031140, + "particle_position_y": 0.0283669864186241772741059463669444085099, + "particle_weight": 0.0000000000005415463447570800359762889929 + }, + "qsp_2": { + "particle_cpu": 75577.0, + "particle_id": 350266079184.0, + "particle_momentum_x": 1.261872820684872434889e-19, + "particle_momentum_y": 6.92126883544961084394040e-17, + "particle_momentum_z": 5.5124803824458753990864e-18, + "particle_optical_depth_BW": 151587.5284573705284856259822845458984375000000, + "particle_position_x": 0.0189417864640534228115598125441465526819, + "particle_position_y": 0.0189437404606696974118662524233513977379, + "particle_weight": 0.0000000000003608798980712890230565097739 + }, + "qsp_3": { + "particle_cpu": 214525.0, + "particle_id": 1055977307234.0, + "particle_momentum_x": 7.893390443110882622852864e-16, + "particle_momentum_y": 4.022899725523587988963599e-16, + "particle_momentum_z": 2.00897967451482969460704614e-14, + "particle_optical_depth_BW": 428733.8518201413680799305438995361328125000000, + "particle_position_x": 0.0536690485208531978256196737220307113603, + "particle_position_y": 0.0537320477591076775536471643590630264953, + "particle_weight": 1.0237169265747073732665847163e-12 + }, + "qsp_4": { + "particle_cpu": 92827.0, + "particle_id": 485591963594.0, + "particle_momentum_x": 6.38012975324615379422793758e-14, + "particle_momentum_y": 6.40026551728551134797706892e-14, + "particle_momentum_z": 6.42086308151940342379244652e-14, + "particle_optical_depth_BW": 185825.2873240348708350211381912231445312500000, + "particle_position_x": 0.0232045216834043527276421059468702878803, + "particle_position_y": 0.0232208158701406250368215467005938990042, + "particle_weight": 4.430484771728514459905705423e-13 + } +} diff --git a/Regression/Checksum/benchmarks_json/qed_quantum_sync_3d.json b/Regression/Checksum/benchmarks_json/qed_quantum_sync_3d.json new file mode 100644 index 000000000..820694a7c --- /dev/null +++ b/Regression/Checksum/benchmarks_json/qed_quantum_sync_3d.json @@ -0,0 +1,101 @@ +{ + "lev=0": { + "Ex": 1.3099432828042958e-12 + }, + "p1": { + "particle_cpu": 524288.0, + "particle_id": 274878431232.0, + "particle_momentum_x": 9.7758873858556601265577378e-15, + "particle_momentum_y": 6.7491814272393665591042944e-15, + "particle_momentum_z": 1.71477994554173681559450222e-14, + "particle_optical_depth_QSR": 1049804.4301339467056095600128173828125000000000, + "particle_position_x": 0.13107199999999988, + "particle_position_y": 0.13107199999999986, + "particle_position_z": 0.13107200000000002, + "particle_weight": 1.2499999999999974e-18 + }, + "p2": { + "particle_cpu": 524288.0, + "particle_id": 824634245120.0, + "particle_momentum_x": 5.285246447726641013282976e-16, + "particle_momentum_y": 2.03260776355233874905821628e-14, + "particle_momentum_z": 7.1931656971580576683125466e-15, + "particle_optical_depth_QSR": 1047187.1483892769319936633110046386718750000000, + "particle_position_x": 0.13107199999999986, + "particle_position_y": 0.13107199999999994, + "particle_position_z": 0.131072, + "particle_weight": 1.2499999999999974e-18 + }, + "p3": { + "particle_cpu": 524288.0, + "particle_id": 1374390059008.0, + "particle_momentum_x": 3.47722762807363544779370064e-14, + "particle_momentum_y": 1.92479435301000680850724330e-14, + "particle_momentum_z": 2.715836966953134431892876796e-13, + "particle_optical_depth_QSR": 1047538.3340144035173580050468444824218750000000, + "particle_position_x": 0.13107199999999974, + "particle_position_y": 0.13107200000000008, + "particle_position_z": 0.13107199999999994, + "particle_weight": 1.2499999999999974e-18 + }, + "p4": { + "particle_cpu": 524288.0, + "particle_id": 1924145872896.0, + "particle_momentum_x": 1.5384447264927685411396454024e-12, + "particle_momentum_y": 1.5550384450950911129388361328e-12, + "particle_momentum_z": 1.5717828196787002757557403112e-12, + "particle_optical_depth_QSR": 1047538.7244381272466853260993957519531250000000, + "particle_position_x": 0.1310719999999999, + "particle_position_y": 0.1310720000000001, + "particle_position_z": 0.13107200000000005, + "particle_weight": 1.2499999999999974e-18 + }, + "qsp_1": { + "particle_cpu": 139805.0, + "particle_id": 606005192579.0, + "particle_momentum_x": 1.48199792997207174737118e-17, + "particle_momentum_y": 5.8972276571918738543742e-18, + "particle_momentum_z": 1.99276981360354362974353e-17, + "particle_optical_depth_BW": 279468.6734266423736698925495147705078125000000, + "particle_position_x": 0.0349323837710382584242907455518434289843, + "particle_position_y": 0.0349456659958360602025173591300699627027, + "particle_position_z": 0.0349613596100997389704012618949491297826, + "particle_weight": 3.333568572998047452078e-19 + }, + "qsp_2": { + "particle_cpu": 131684.0, + "particle_id": 607246582470.0, + "particle_momentum_x": 3.5707458764937662296484e-18, + "particle_momentum_y": 1.221476476409600044639063e-16, + "particle_momentum_z": 1.91987389872474352190967e-17, + "particle_optical_depth_BW": 263591.0839790093596093356609344482421875000000, + "particle_position_x": 0.032904736176992049889733493728272151202, + "particle_position_y": 0.0330043572259953385539255066305486252531, + "particle_position_z": 0.0329819361187009690850047149979218374938, + "particle_weight": 3.143310546875000280363e-19 + }, + "qsp_3": { + "particle_cpu": 300729.0, + "particle_id": 1513976629339.0, + "particle_momentum_x": 1.7928128884821719703095933e-15, + "particle_momentum_y": 9.340408950640840272122927e-16, + "particle_momentum_z": 2.83530122341059918144489386e-14, + "particle_optical_depth_BW": 600650.3304399864282459020614624023437500000000, + "particle_position_x": 0.0750897563442807225442265917081385850906, + "particle_position_y": 0.0751763824300837740777225803867622744292, + "particle_position_z": 0.0751542666431599948317909820616478100419, + "particle_weight": 7.164263725280753934436e-19 + }, + "qsp_4": { + "particle_cpu": 143505.0, + "particle_id": 785173536704.0, + "particle_momentum_x": 9.77033632739354423654078982e-14, + "particle_momentum_y": 9.82087398113350840453304285e-14, + "particle_momentum_z": 9.87240415385684092180580877e-14, + "particle_optical_depth_BW": 286503.0337664368562400341033935546875000000000, + "particle_position_x": 0.0357990571419779662898363881140539888293, + "particle_position_y": 0.0358748468909192846920674924149352591485, + "particle_position_z": 0.0358245955166236890176989504652738105506, + "particle_weight": 3.414738178253174363875e-19 + } +} diff --git a/Regression/Checksum/benchmarks_json/qed_quantum_sync_tau_init.json b/Regression/Checksum/benchmarks_json/qed_quantum_sync_tau_init.json deleted file mode 100644 index 61c33ab39..000000000 --- a/Regression/Checksum/benchmarks_json/qed_quantum_sync_tau_init.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "electrons": { - "particle_cpu": 28800.0, - "particle_id": 897828480.0, - "particle_momentum_x": 1.2577259718364536e-15, - "particle_momentum_y": 1.2533271477447635e-15, - "particle_momentum_z": 1.2567654312277259e-15, - "particle_optical_depth_QSR": 57886.05893096988, - "particle_position_x": 0.8640051455090565, - "particle_position_y": 0.8640331765233288, - "particle_weight": 36000000000.0 - }, - "lev=0": { - "Bx": 0.07184886279682517, - "By": 0.10667815989827657, - "Bz": 0.07109069834396708, - "Ex": 84573993.77188347, - "Ey": 82514926.82089016, - "Ez": 88699981.5687077, - "jx": 634967161798.5266, - "jy": 619508037314.5645, - "jz": 665944376473.1846 - }, - "positrons": { - "particle_cpu": 28800.0, - "particle_id": 2682046080.0, - "particle_momentum_x": 1.2564867705042074e-15, - "particle_momentum_y": 1.2522720470651854e-15, - "particle_momentum_z": 1.2506801884403616e-15, - "particle_optical_depth_QSR": 57542.97683982639, - "particle_position_x": 0.8641071175220609, - "particle_position_y": 0.863981764528814, - "particle_weight": 36000000000.0 - } -}
\ No newline at end of file diff --git a/Regression/Checksum/benchmarks_json/qed_schwinger2.json b/Regression/Checksum/benchmarks_json/qed_schwinger2.json index e2a524929..ff413ba4c 100644 --- a/Regression/Checksum/benchmarks_json/qed_schwinger2.json +++ b/Regression/Checksum/benchmarks_json/qed_schwinger2.json @@ -2,34 +2,34 @@ "ele_schwinger": { "particle_cpu": 1024.0, "particle_id": 1573888.0, - "particle_momentum_x": 1.253856079274937e-09, - "particle_momentum_y": 7.988412729587993e-11, - "particle_momentum_z": 2.8023147035854144e-10, + "particle_momentum_x": 1.2538560192562119145907523613836e-09, + "particle_momentum_y": 7.98841234718825980904544944075e-11, + "particle_momentum_z": 2.802314569448479707680714186416e-10, "particle_position_x": 0.0005120000000000001, "particle_position_y": 0.000512, "particle_position_z": 0.000512, - "particle_weight": 8.300975111485836e+19 + "particle_weight": 8.3009747141536481280e+19 }, "lev=0": { "Bx": 3439183579241.8213, "By": 1076561948990.9731, "Bz": 3760851107750.2676, - "Ex": 1.6138262991542088e+26, - "Ey": 1.0214830999058132e+25, - "Ez": 3.5684391886872975e+25, - "jx": 1.4539784582497718e+31, - "jy": 9.202945669400098e+29, - "jz": 3.214948145600786e+30 + "Ex": 1.61382622190626294479192064e+26, + "Ey": 1.0214830510117843745374208e+25, + "Ez": 3.5684390178813696941228032e+25, + "jx": 1.4539783886540389390252047859712e+31, + "jy": 9.20294522889443324046591655936e+29, + "jz": 3.214947991714962836023450533888e+30 }, "pos_schwinger": { "particle_cpu": 1024.0, "particle_id": 2622464.0, - "particle_momentum_x": 1.2705200005945566e-09, - "particle_momentum_y": 8.002632204675343e-11, - "particle_momentum_z": 2.8093193376686925e-10, + "particle_momentum_x": 1.2705199397782006324793234588533e-09, + "particle_momentum_y": 8.00263182163650910948918243636e-11, + "particle_momentum_z": 2.809319203195289649657045801174e-10, "particle_position_x": 0.0005120000000000001, "particle_position_y": 0.000512, "particle_position_z": 0.000512, - "particle_weight": 8.30097511148584e+19 + "particle_weight": 8.3009747141536481280e+19 } -}
\ No newline at end of file +} diff --git a/Regression/Checksum/benchmarks_json/qed_schwinger4.json b/Regression/Checksum/benchmarks_json/qed_schwinger4.json index b2276d547..1ea056920 100644 --- a/Regression/Checksum/benchmarks_json/qed_schwinger4.json +++ b/Regression/Checksum/benchmarks_json/qed_schwinger4.json @@ -3,33 +3,33 @@ "particle_cpu": 1024.0, "particle_id": 1573888.0, "particle_momentum_x": 6.569424596732217e-12, - "particle_momentum_y": 3.358784455760675e-27, + "particle_momentum_y": 3.3588025031324e-27, "particle_momentum_z": 5.121822174810324e-12, "particle_position_x": 0.0005120000000000001, "particle_position_y": 0.0005120000000000001, "particle_position_z": 0.0005119999999999999, - "particle_weight": 114054.59650147014 + "particle_weight": 114054.5697167885082308202981948852539062500000 }, "lev=0": { - "Bx": 1.4000444810733876, + "Bx": 1.4000605828203265268427912815241143107414, "By": 1707847966720000.0, - "Bz": 0.3684660869216436, - "Ex": 1316425744.6551433, + "Bz": 0.3684660435860281357811629732168512418866, + "Ex": 1316425589.8291716575622558593750000000000000000000, "Ey": 0.0, "Ez": 5.119999999998239e+23, - "jx": 195136858233472.38, + "jx": 195136835283257.5000000000000000000000000000000000000000, "jy": 0.0, - "jz": 1.5866782361655698e+16 + "jz": 1.5866778635486594e+16 }, "pos_schwinger": { "particle_cpu": 1024.0, "particle_id": 2622464.0, "particle_momentum_x": 6.569424596732212e-12, - "particle_momentum_y": 3.4619573459705485e-27, + "particle_momentum_y": 3.4619972045013e-27, "particle_momentum_z": 5.1218221748102914e-12, "particle_position_x": 0.0005120000000000001, "particle_position_y": 0.0005120000000000001, "particle_position_z": 0.000512, - "particle_weight": 114054.59650147012 + "particle_weight": 114054.5697167885227827355265617370605468750000 } -}
\ No newline at end of file +} diff --git a/Regression/WarpX-tests.ini b/Regression/WarpX-tests.ini index 2e8a82c8d..463c65927 100644 --- a/Regression/WarpX-tests.ini +++ b/Regression/WarpX-tests.ini @@ -1036,9 +1036,9 @@ compareParticles = 0 analysisRoutine = Examples/Tests/radiation_reaction/test_const_B_analytical/analysis_classicalRR.py tolerance = 1.e-14 -[qed_breit_wheeler_tau_init] +[qed_breit_wheeler_2d] buildDir = . -inputFile = Examples/Modules/qed/breit_wheeler/inputs_2d_tau_init +inputFile = Examples/Modules/qed/breit_wheeler/inputs_2d runtime_params = dim = 2 addToCompileString = QED=TRUE @@ -1050,12 +1050,12 @@ numthreads = 2 compileTest = 0 doVis = 0 compareParticles = 0 -analysisRoutine = Examples/Modules/qed/breit_wheeler/analysis_2d_tau_init.py +analysisRoutine = Examples/Modules/qed/breit_wheeler/analysis.py tolerance = 1.e-14 -[qed_breit_wheeler_opt_depth_evolution] +[qed_breit_wheeler_3d] buildDir = . -inputFile = Examples/Modules/qed/breit_wheeler/inputs_3d_optical_depth_evolution +inputFile = Examples/Modules/qed/breit_wheeler/inputs_3d runtime_params = dim = 3 addToCompileString = QED=TRUE @@ -1067,12 +1067,12 @@ numthreads = 1 compileTest = 0 doVis = 0 compareParticles = 0 -analysisRoutine = Examples/Modules/qed/breit_wheeler/analysis_3d_optical_depth_evolution.py +analysisRoutine = Examples/Modules/qed/breit_wheeler/analysis.py tolerance = 1.e-14 -[qed_quantum_sync_tau_init] +[qed_quantum_sync_2d] buildDir = . -inputFile = Examples/Modules/qed/quantum_synchrotron/inputs_2d_tau_init +inputFile = Examples/Modules/qed/quantum_synchrotron/inputs_2d runtime_params = dim = 2 addToCompileString = QED=TRUE @@ -1084,8 +1084,25 @@ numthreads = 2 compileTest = 0 doVis = 0 compareParticles = 0 -analysisRoutine = Examples/Modules/qed/quantum_synchrotron/analysis_2d_tau_init.py -tolerance = 2.e-15 +analysisRoutine = Examples/Modules/qed/quantum_synchrotron/analysis.py +tolerance = 1.e-14 + +[qed_quantum_sync_3d] +buildDir = . +inputFile = Examples/Modules/qed/quantum_synchrotron/inputs_3d +runtime_params = +dim = 3 +addToCompileString = QED=TRUE +restartTest = 0 +useMPI = 1 +numprocs = 2 +useOMP = 1 +numthreads = 2 +compileTest = 0 +doVis = 0 +compareParticles = 0 +analysisRoutine = Examples/Modules/qed/quantum_synchrotron/analysis.py +tolerance = 1.e-14 [qed_schwinger1] buildDir = . diff --git a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerDummyTable.H b/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerDummyTable.H deleted file mode 100644 index 95f65923e..000000000 --- a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerDummyTable.H +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright 2019 Luca Fedeli - * - * This file is part of WarpX. - * - * License: BSD-3-Clause-LBNL - */ -#ifndef WARPX_breit_wheeler_dummy_tables_h_ -#define WARPX_breit_wheeler_dummy_tables_h_ - -#include "BreitWheelerEngineInnards.H" - -#include <AMReX_REAL.H> - -#include <limits> -#include <vector> - -namespace QedUtils{ - -//A default mini-table used for test purposes -const struct //BreitWheelerEngineInnardsDummy -{ - picsar::multi_physics::breit_wheeler_engine_ctrl<amrex::Real> ctrl{ - 0.001, /*chi_phot_min*/ - 0.1, /*chi_phot_tdndt_min*/ - 200, /*chi_phot_tdndt_max*/ - 64, /*chi_phot_tdndt_how_many*/ - 0.01, /*chi_phot_tpair_min*/ - 200, /*chi_phot_tpair_max*/ - 2, /*chi_phot_tpair_how_many*/ - 2 /*chi_frac_tpair_how_many*/ - }; - std::vector<amrex::Real> TTfunc_coords{ - -2.302585093, -2.181935848, -2.061286602, -1.940637357, - -1.819988111, -1.699338866, -1.578689621, -1.458040375, - -1.33739113, -1.216741884, -1.096092639, -0.9754433937, - -0.8547941483, -0.7341449029, -0.6134956575, -0.4928464122, - -0.3721971668, -0.2515479214, -0.130898676, -0.01024943059, - 0.1103998148, 0.2310490602, 0.3516983056, 0.472347551, - 0.5929967964, 0.7136460417, 0.8342952871, 0.9549445325, - 1.075593778, 1.196243023, 1.316892269, 1.437541514, - 1.558190759, 1.678840005, 1.79948925, 1.920138496, - 2.040787741, 2.161436986, 2.282086232, 2.402735477, - 2.523384723, 2.644033968, 2.764683213, 2.885332459, - 3.005981704, 3.12663095, 3.247280195, 3.36792944, - 3.488578686, 3.609227931, 3.729877176, 3.850526422, - 3.971175667, 4.091824913, 4.212474158, 4.333123403, - 4.453772649, 4.574421894, 4.69507114, 4.815720385, - 4.93636963, 5.057018876, 5.177668121, 5.298317367 - }; - std::vector<amrex::Real> TTfunc_data{ - -32.75941722, -29.48929687, -26.5638705, -23.94401054, - -21.59504068, -19.48623016, -17.59034545, -15.88325289, - -14.34356639, -12.95233518, -11.69276696, -10.54998244, - -9.510797773, -8.563531596, -7.697833953, -6.90453462, - -6.175508601, -5.503556869, -4.882300625, -4.306087546, - -3.76990867, -3.269324729, -2.800400851, -2.359648711, - -1.943975268, -1.550637379, -1.177201596, -0.8215085915, - -0.4816416657, -0.1558988919, 0.1572315255, 0.4590930403, - 0.7508800304, 1.033654828, 1.308362775, 1.575845526, - 1.836852816, 2.092052851, 2.342041503, 2.587350441, - 2.828454313, 3.065777115, 3.299697807, 3.530555306, - 3.758652908, 3.984262221, 4.207626639, 4.428964367, - 4.648471027, 4.866321957, 5.082674363, 5.297669484, - 5.511434783, 5.724086013, 5.935728862, 6.146459973, - 6.356367276, 6.565529804, 6.774017335, 6.981890203, - 7.189199547, 7.395988084, 7.602291337, 7.808139168 - }; - std::vector<amrex::Real> cum_distrib_coords_1{ - -4.605170186, 5.298317367 - };//_____________________________ - std::vector<amrex::Real> cum_distrib_coords_2{ - 0, 0.5 - };//_____________________________ - std::vector<amrex::Real> cum_distrib_data{ - -std::numeric_limits<amrex::Real>::infinity(), - -0.6931471806, - -std::numeric_limits<amrex::Real>::infinity(), - -0.6931471806 - };//_____________________________ -} BreitWheelerEngineInnardsDummy; - -}; - -#endif // WARPX_breit_wheeler_dummy_tables_h_ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineInnards.H b/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineInnards.H deleted file mode 100644 index d6c644aa3..000000000 --- a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineInnards.H +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright 2019 Luca Fedeli - * - * This file is part of WarpX. - * - * License: BSD-3-Clause-LBNL - */ -#ifndef WARPX_breit_wheeler_engine_innards_h_ -#define WARPX_breit_wheeler_engine_innards_h_ - -#include "QedWrapperCommons.H" - -#include <AMReX_Gpu.H> - -//This includes only the definition of a simple datastructure -//used to control the Breit Wheeler engine. -#include <breit_wheeler_engine_ctrl.h> - -/** - * This structure holds all the parameters required to use the - * Breit Wheeler engine: a POD control structure and lookup - * tables data. - */ -struct BreitWheelerEngineInnards -{ - // Control parameters (a POD struct) - // ctrl contains several parameters: - // - chi_phot_min : the minium chi parameter to be - // considered by the engine - // - chi_phot_tdndt_min : minimun chi for sub-table 1 (1D) - // - chi_phot_tdndt_max : maximum chi for sub-table 1 (1D) - // - chi_phot_tdndt_how_many : how many points to use for sub-table 1 (1D) - // - chi_phot_tpair_min : minimun chi for sub-table 2 (1D) - // - chi_phot_tpair_max : maximum chi for sub-table 2 (1D) - // - chi_phot_tpair_how_many : how many points to use for chi for sub-table 2 (2D) - // - chi_frac_tpair_how_many : how many points to use for the second axis of sub-table 2 (2D) - picsar::multi_physics::breit_wheeler_engine_ctrl<amrex::Real> ctrl; - - //Lookup table data - //---sub-table 1 (1D) - amrex::Gpu::ManagedVector<amrex::Real> TTfunc_coords; - amrex::Gpu::ManagedVector<amrex::Real> TTfunc_data; - //--- - - //---sub-table 2 (2D) - amrex::Gpu::ManagedVector<amrex::Real> cum_distrib_coords_1; - amrex::Gpu::ManagedVector<amrex::Real> cum_distrib_coords_2; - amrex::Gpu::ManagedVector<amrex::Real> cum_distrib_data; - //______ -}; -//========================================================== - -#endif //WARPX_breit_wheeler_engine_innards_h_ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineTableBuilder.H b/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineTableBuilder.H deleted file mode 100644 index 98b0b17a4..000000000 --- a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineTableBuilder.H +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright 2019 Luca Fedeli - * - * This file is part of WarpX. - * - * License: BSD-3-Clause-LBNL - */ -#ifndef WARPX_breit_wheeler_engine_table_builder_h_ -#define WARPX_breit_wheeler_engine_table_builder_h_ - -#include "QedWrapperCommons.H" -#include "BreitWheelerEngineInnards.H" - -//This includes only the definition of a simple datastructure -//used to control the Breit Wheeler engine. -#include <breit_wheeler_engine_ctrl.h> - -/** - * A class which computes the lookup tables for the Breit Wheeler engine. - */ -class BreitWheelerEngineTableBuilder{ - public: - /** - * Computes the tables. - * @param[in] ctrl control parameters to generate the tables - * @param[out] innards structure holding both a copy of ctrl and lookup tables data - */ - void compute_table - (picsar::multi_physics::breit_wheeler_engine_ctrl<amrex::Real> ctrl, - BreitWheelerEngineInnards& innards) const; -}; - -#endif //WARPX_breit_wheeler_engine_table_builder_h_ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineTableBuilder.cpp b/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineTableBuilder.cpp deleted file mode 100644 index 5f3538079..000000000 --- a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineTableBuilder.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright 2019 Luca Fedeli - * - * This file is part of WarpX. - * - * License: BSD-3-Clause-LBNL - */ -#include "BreitWheelerEngineTableBuilder.H" - -//Include the full Breit Wheeler engine with table generation support -//(after some consistency tests). This requires to have a recent version -// of the Boost library. -#ifdef PXRMP_CORE_ONLY -# error The Table Builder is incompatible with PXRMP_CORE_ONLY -#endif - -#ifdef __PICSAR_MULTIPHYSICS_BREIT_WHEELER_ENGINE__ -# warning breit_wheeler_engine.hpp should not have been included before reaching this point. -#endif -#include <breit_wheeler_engine.hpp> -//_______________________________________________ - -//Some handy aliases -using PicsarBreitWheelerEngine = picsar::multi_physics:: - breit_wheeler_engine<amrex::Real, QedUtils::DummyStruct>; - -using PicsarBreitWheelerCtrl = - picsar::multi_physics::breit_wheeler_engine_ctrl<amrex::Real>; -//_______________________________________________ - -void -BreitWheelerEngineTableBuilder::compute_table - (PicsarBreitWheelerCtrl ctrl, - BreitWheelerEngineInnards& innards) const -{ - PicsarBreitWheelerEngine bw_engine( - std::move(QedUtils::DummyStruct()), 1.0, ctrl); - - bw_engine.compute_dN_dt_lookup_table(); - bw_engine.compute_cumulative_pair_table(); - - auto bw_innards_picsar = bw_engine.export_innards(); - - //Copy data in a GPU-friendly data-structure - innards.ctrl = bw_innards_picsar.bw_ctrl; - innards.TTfunc_coords.assign(bw_innards_picsar.TTfunc_table_coords_ptr, - bw_innards_picsar.TTfunc_table_coords_ptr + - bw_innards_picsar.TTfunc_table_coords_how_many); - innards.TTfunc_data.assign(bw_innards_picsar.TTfunc_table_data_ptr, - bw_innards_picsar.TTfunc_table_data_ptr + - bw_innards_picsar.TTfunc_table_data_how_many); - innards.cum_distrib_coords_1.assign( - bw_innards_picsar.cum_distrib_table_coords_1_ptr, - bw_innards_picsar.cum_distrib_table_coords_1_ptr + - bw_innards_picsar.cum_distrib_table_coords_1_how_many); - innards.cum_distrib_coords_2.assign( - bw_innards_picsar.cum_distrib_table_coords_2_ptr, - bw_innards_picsar.cum_distrib_table_coords_2_ptr + - bw_innards_picsar.cum_distrib_table_coords_2_how_many); - innards.cum_distrib_data.assign( - bw_innards_picsar.cum_distrib_table_data_ptr, - bw_innards_picsar.cum_distrib_table_data_ptr + - bw_innards_picsar.cum_distrib_table_data_how_many); - //____ -} diff --git a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.H b/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.H index 7056ac884..8c5c4299a 100644 --- a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.H +++ b/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.H @@ -8,39 +8,49 @@ #define WARPX_breit_wheeler_engine_wrapper_h_ #include "QedWrapperCommons.H" -#include "BreitWheelerEngineInnards.H" +#include "QedChiFunctions.H" +#include "Utils/WarpXConst.H" #include <AMReX_Array.H> #include <AMReX_Vector.H> #include <AMReX_Gpu.H> -//#define PXRMP_CORE_ONLY allows importing only the 'core functions' of the -//Breit Wheeler engine of the QED PICSAR library. -#define PXRMP_CORE_ONLY -#include <breit_wheeler_engine.hpp> - -//Lookup table building function is in a dedicated (optional) class to -//avoid including heavy dependencies if they are not needed. -#ifdef WARPX_QED_TABLE_GEN -# include "BreitWheelerEngineTableBuilder.H" -#endif +#include <physics/breit_wheeler/breit_wheeler_engine_tables.hpp> +#include <physics/breit_wheeler/breit_wheeler_engine_core.hpp> #include <string> +#include <vector> + +// Aliases ============================= +using BW_dndt_table_params = + picsar::multi_physics::phys::breit_wheeler:: + dndt_lookup_table_params<amrex::Real>; + +using BW_dndt_table = + picsar::multi_physics::phys::breit_wheeler:: + dndt_lookup_table< + amrex::Real, + amrex::Gpu::DeviceVector<amrex::Real>>; + +using BW_dndt_table_view = BW_dndt_table::view_type; + +using BW_pair_prod_table_params = + picsar::multi_physics::phys::breit_wheeler:: + pair_prod_lookup_table_params<amrex::Real>; -//Some handy aliases +using BW_pair_prod_table = + picsar::multi_physics::phys::breit_wheeler:: + pair_prod_lookup_table< + amrex::Real, + amrex::Gpu::DeviceVector<amrex::Real>>; -// The engine has two templated arguments: the numerical type -// and a random number generator. However, random numbers are not -// used to generate the lookup tables and the static member -// functions which are called in the functors do not use -// random numbers as well. Therefore, an empty "DummyStruct" -// can be passed as a template parameter. -using PicsarBreitWheelerEngine = picsar::multi_physics:: - breit_wheeler_engine<amrex::Real, QedUtils::DummyStruct>; +using BW_pair_prod_table_view = BW_pair_prod_table::view_type; -using PicsarBreitWheelerCtrl = - picsar::multi_physics::breit_wheeler_engine_ctrl<amrex::Real>; -//__________ +struct PicsarBreitWheelerCtrl +{ + BW_dndt_table_params dndt_params; + BW_pair_prod_table_params pair_prod_params; +}; // Functors ================================== @@ -70,9 +80,10 @@ public: AMREX_FORCE_INLINE amrex::Real operator() () const noexcept { + namespace pxr_bw = picsar::multi_physics::phys::breit_wheeler; + //A random number in [0,1) should be provided as an argument. - return PicsarBreitWheelerEngine:: - internal_get_optical_depth(amrex::Random()); + return pxr_bw::get_optical_depth(amrex::Random()); } }; //____________________________________________ @@ -85,71 +96,76 @@ class BreitWheelerEvolveOpticalDepth { public: - BreitWheelerEvolveOpticalDepth () = default; + /** + * Default constructor: it leaves the functor in a non-initialized state. + */ + BreitWheelerEvolveOpticalDepth (){} + /** - * Constructor acquires a reference to control parameters and - * lookup tables data. - * lookup_table uses non-owning vectors under the hood. So no new data - * allocations should be triggered on GPU + * Constructor to be used to initialize the functor. + * + * @param[in] table_view a view of a BW_dndt_table lookup table + * @param[in] bw_minimum_chi_phot the minimum quantum parameter to evolve the optical depth */ - BreitWheelerEvolveOpticalDepth(BreitWheelerEngineInnards& r_innards): - m_ctrl{r_innards.ctrl}, - m_TTfunc_size{r_innards.TTfunc_coords.size()}, - m_p_TTfunc_coords{r_innards.TTfunc_coords.dataPtr()}, - m_p_TTfunc_data{r_innards.TTfunc_data.dataPtr()} - {}; + BreitWheelerEvolveOpticalDepth ( + const BW_dndt_table_view table_view, + const amrex::ParticleReal bw_minimum_chi_phot): + m_table_view{table_view}, m_bw_minimum_chi_phot{bw_minimum_chi_phot}{}; /** * Evolves the optical depth. It can be used on GPU. - * @param[in] px,py,pz momentum components of the photon (SI units) + * If the quantum parameter parameter of the photon is + * < bw_minimum_chi_phot, the method returns immediately. + * The method returns also if the energy of the photon is insufficient + * to generate a pair. + * + * @param[in] ux,uy,uz gamma*v components of the photon. * @param[in] ex,ey,ez electric field components (SI units) * @param[in] bx,by,bz magnetic field components (SI units) * @param[in] dt timestep (SI units) - * @param[in,out] opt_depth optical depth of the photon. It is modified by the method. - * @return a flag which is 1 if optical depth becomes negative (i.e. a pair has to be generated). + * @param[in,out] opt_depth optical depth of the photon. + * @return a flag which is 1 if chi_phot was out of table */ - AMREX_GPU_HOST_DEVICE + AMREX_GPU_DEVICE AMREX_FORCE_INLINE int operator()( - amrex::Real px, amrex::Real py, amrex::Real pz, - amrex::Real ex, amrex::Real ey, amrex::Real ez, - amrex::Real bx, amrex::Real by, amrex::Real bz, - amrex::Real dt, amrex::Real& opt_depth) const noexcept + const amrex::Real ux, const amrex::Real uy, const amrex::Real uz, + const amrex::Real ex, const amrex::Real ey, const amrex::Real ez, + const amrex::Real bx, const amrex::Real by, const amrex::Real bz, + const amrex::Real dt, amrex::Real& opt_depth) const noexcept { - bool has_event_happened{false}; - - //the library provides the time (< dt) at which the event occurs, but this - //feature won't be used in WarpX for now. - amrex::Real unused_event_time{0.0}; - - PicsarBreitWheelerEngine:: - internal_evolve_opt_depth_and_determine_event( - px, py, pz, - ex, ey, ez, - bx, by, bz, - dt, opt_depth, - has_event_happened, unused_event_time, - m_dummy_lambda, - picsar::multi_physics::lookup_1d<amrex::Real>{ - m_TTfunc_size, - m_p_TTfunc_coords, - m_p_TTfunc_data}, - m_ctrl); - - return has_event_happened; + namespace pxr_m = picsar::multi_physics::math; + namespace pxr_p = picsar::multi_physics::phys; + namespace pxr_bw = picsar::multi_physics::phys::breit_wheeler; + + constexpr amrex::Real m_e = PhysConst::m_e; + const auto u_norm = std::sqrt(ux*ux + uy*uy + uz*uz); + const auto energy = u_norm*m_e*PhysConst::c; + + const auto chi_phot = QedUtils::chi_photon( + m_e*ux, m_e*uy, m_e*uz, ex, ey, ez, bx, by, bz); + + //Optical depth is not evolved for photons having less energy than what is + //required to generate a pair or a quantum parameter smaller than + //m_bw_minimum_chi_phot + const auto gamma_photon = u_norm/PhysConst::c; + if (gamma_photon < pxr_m::two<amrex::Real> || + chi_phot < m_bw_minimum_chi_phot) + return 0; + + const auto is_out = pxr_bw::evolve_optical_depth< + amrex::Real, + BW_dndt_table_view, + pxr_p::unit_system::SI>( + energy, chi_phot, dt, opt_depth, m_table_view); + + return is_out; } private: - //laser wavelength is not used with SI units - amrex::Real m_dummy_lambda{1.0}; - - PicsarBreitWheelerCtrl m_ctrl; - - //lookup table data - size_t m_TTfunc_size; - amrex::Real* m_p_TTfunc_coords; - amrex::Real* m_p_TTfunc_data; + BW_dndt_table_view m_table_view; + amrex::ParticleReal m_bw_minimum_chi_phot; }; /** @@ -159,85 +175,89 @@ private: class BreitWheelerGeneratePairs { public: + + /** + * Default constructor: it leaves the functor in a non-initialized state. + */ + BreitWheelerGeneratePairs (){} + /** * Constructor acquires pointers to control parameters and * lookup tables data. * lookup_table uses non-owning vectors under the hood. So no new data * allocations should be triggered on GPU + * + * @param[in] table_view a BW_pair_prod_table_view */ - BreitWheelerGeneratePairs( - BreitWheelerEngineInnards& r_innards): - m_ctrl{r_innards.ctrl}, - m_cum_distrib_coords_1_size{r_innards.cum_distrib_coords_1.size()}, - m_cum_distrib_coords_2_size{r_innards.cum_distrib_coords_2.size()}, - m_p_distrib_coords_1{r_innards.cum_distrib_coords_1.data()}, - m_p_distrib_coords_2{r_innards.cum_distrib_coords_2.data()}, - m_p_cum_distrib_data{r_innards.cum_distrib_data.data() - }{}; + BreitWheelerGeneratePairs (const BW_pair_prod_table_view table_view): + m_table_view{table_view}{}; /** - * Generates sampling (template parameter) pairs according to Breit Wheeler process. + * Generates pairs according to Breit Wheeler process. * It can be used on GPU. - * @param[in] px,py,pz momentum components of the photon (SI units) + * Warning: the energy of the photon must be > 2mec^2, but it is not checked + * in this method. + * + * @param[in] ux,uy,uz gamma*v components of the photon (SI units) * @param[in] ex,ey,ez electric field components (SI units) * @param[in] bx,by,bz magnetic field components (SI units) - * @param[in] weight of the photon (code units) - * @param[out] e_px,e_py,e_pz momenta of generated electrons. Each array should have size=sampling (SI units) - * @param[out] p_px,p_py,p_pz momenta of generated positrons. Each array should have size=sampling (SI units) - * @param[out] e_weight,p_weight weight of the generated particles Each array should have size=sampling (code units). + * @param[out] e_ux,e_uy,e_uz gamma*v components of generated electron (SI units) + * @param[out] p_ux,p_uy,p_uz gamma*v components of generated positron (SI units) + * @return a flag which is 1 if chi_photon was out of table */ - template <size_t sampling> - AMREX_GPU_HOST_DEVICE + AMREX_GPU_DEVICE AMREX_FORCE_INLINE - void operator()( - amrex::Real px, amrex::Real py, amrex::Real pz, - amrex::Real ex, amrex::Real ey, amrex::Real ez, - amrex::Real bx, amrex::Real by, amrex::Real bz, - amrex::Real weight, - amrex::Real* e_px, amrex::Real* e_py, amrex::Real* e_pz, - amrex::Real* p_px, amrex::Real* p_py, amrex::Real* p_pz, - amrex::Real* e_weight, amrex::Real* p_weight) const noexcept + int operator()( + const amrex::Real ux, const amrex::Real uy, const amrex::Real uz, + const amrex::Real ex, const amrex::Real ey, const amrex::Real ez, + const amrex::Real bx, const amrex::Real by, const amrex::Real bz, + amrex::Real& e_ux, amrex::Real& e_uy, amrex::Real& e_uz, + amrex::Real& p_ux, amrex::Real& p_uy, amrex::Real& p_uz) const noexcept { - //[sampling] random numbers are needed - picsar::multi_physics::picsar_array<amrex::Real, sampling> - rand_zero_one_minus_epsi; - for(auto& el : rand_zero_one_minus_epsi) el = amrex::Random(); - - const auto p_rand = rand_zero_one_minus_epsi.data(); - - PicsarBreitWheelerEngine:: - internal_generate_breit_wheeler_pairs( - px, py, pz, - ex, ey, ez, - bx, by, bz, - weight, sampling, - e_px, e_py, e_pz, - p_px, p_py, p_pz, - e_weight, p_weight, - m_dummy_lambda, - picsar::multi_physics::lookup_2d<amrex::Real>{ - m_cum_distrib_coords_1_size, - m_p_distrib_coords_1, - m_cum_distrib_coords_2_size, - m_p_distrib_coords_2, - m_p_cum_distrib_data - }, - m_ctrl, - p_rand); + using namespace amrex; + namespace pxr_m = picsar::multi_physics::math; + namespace pxr_p = picsar::multi_physics::phys; + namespace pxr_bw = picsar::multi_physics::phys::breit_wheeler; + + const auto rand_zero_one_minus_epsi = amrex::Random(); + + constexpr ParticleReal me = PhysConst::m_e; + constexpr ParticleReal one_over_me = 1._prt/me; + + // Particle momentum is stored as gamma * velocity. + // Convert to m * gamma * velocity + auto px = ux*me; + auto py = uy*me; + auto pz = uz*me; + + const auto chi_photon = QedUtils::chi_photon( + px, py, pz, ex, ey, ez, bx, by, bz); + + const auto momentum_photon = pxr_m::vec3<amrex::Real>{px, py, pz}; + auto momentum_ele = pxr_m::vec3<amrex::Real>(); + auto momentum_pos = pxr_m::vec3<amrex::Real>(); + + const auto is_out = pxr_bw::generate_breit_wheeler_pairs< + amrex::Real, + BW_pair_prod_table_view, + pxr_p::unit_system::SI>( + chi_photon, momentum_photon, + rand_zero_one_minus_epsi, + m_table_view, + momentum_ele, momentum_pos); + + e_ux = momentum_ele[0]*one_over_me; + e_uy = momentum_ele[1]*one_over_me; + e_uz = momentum_ele[2]*one_over_me; + p_ux = momentum_pos[0]*one_over_me; + p_uy = momentum_pos[1]*one_over_me; + p_uz = momentum_pos[2]*one_over_me; + + return is_out; } private: - //laser wavelenght is not used with SI units - const amrex::Real m_dummy_lambda{1.0}; - - const PicsarBreitWheelerCtrl m_ctrl; - - //lookup table data - size_t m_cum_distrib_coords_1_size; - size_t m_cum_distrib_coords_2_size; - amrex::Real* m_p_distrib_coords_1; - amrex::Real* m_p_distrib_coords_2; - amrex::Real* m_p_cum_distrib_data; + BW_pair_prod_table_view m_table_view; }; // Factory class ============================= @@ -256,17 +276,17 @@ public: /** * Builds the functor to initialize the optical depth */ - BreitWheelerGetOpticalDepth build_optical_depth_functor (); + BreitWheelerGetOpticalDepth build_optical_depth_functor () const; /** * Builds the functor to evolve the optical depth */ - BreitWheelerEvolveOpticalDepth build_evolve_functor (); + BreitWheelerEvolveOpticalDepth build_evolve_functor () const; /** * Builds the functor to generate the pairs */ - BreitWheelerGeneratePairs build_pair_functor (); + BreitWheelerGeneratePairs build_pair_functor () const; /** * Checks if the optical tables are properly initialized @@ -274,52 +294,62 @@ public: bool are_lookup_tables_initialized () const; /** - * Init lookup tables from raw binary data. - * @param[in] raw_data a Vector of char - * @return true if it succeeds, false if it cannot parse raw_data + * Export lookup tables data into a raw binary Vector + * + * @return the data in binary format. The Vector is empty if tables were + * not previously initialized. */ - bool init_lookup_tables_from_raw_data (const amrex::Vector<char>& raw_data); + std::vector<char> export_lookup_tables_data () const; /** - * Init lookup tables using built-in dummy tables - * for test purposes. + * Init lookup tables from raw binary data. + * + * @param[in] raw_data a vector of char + * @param[in] bw_minimum_chi_phot minimum chi parameter to evolve the optical depth of a photon + * @return true if it succeeds, false if it cannot parse raw_data */ - void init_dummy_tables(); + bool init_lookup_tables_from_raw_data ( + const std::vector<char>& raw_data, + const amrex::Real bw_minimum_chi_phot); /** - * Export lookup tables data into a raw binary Vector - * @return the data in binary format. The Vector is empty if tables were - * not previously initialized. + * Init lookup tables using built-in (low resolution) tables + * + * @param[in] bw_minimum_chi_phot minimum chi parameter to evolve the optical depth of a photon */ - amrex::Vector<char> export_lookup_tables_data () const; + void init_builtin_tables(const amrex::Real bw_minimum_chi_phot); /** * Computes the lookup tables. It does nothing unless WarpX is compiled with QED_TABLE_GEN=TRUE + * * @param[in] ctrl control params to generate the tables + * @param[in] bw_minimum_chi_phot minimum chi parameter to evolve the optical depth of a photon */ - void compute_lookup_tables (PicsarBreitWheelerCtrl ctrl); + void compute_lookup_tables (const PicsarBreitWheelerCtrl ctrl, + const amrex::Real bw_minimum_chi_phot); /** - * gets default (reasonable) values for the control parameters + * gets default values for the control parameters + * * @return default control params to generate the tables */ PicsarBreitWheelerCtrl get_default_ctrl() const; - /** - * returns a constant reference to the control parameters - * @return const reference to control parameters - */ - const PicsarBreitWheelerCtrl& get_ref_ctrl() const; + amrex::Real get_minimum_chi_phot() const; private: bool m_lookup_tables_initialized = false; - BreitWheelerEngineInnards m_innards; + //Variables to store the minimum chi parameters to enable + //Quantum Synchrotron process + amrex::Real m_bw_minimum_chi_phot; + + BW_dndt_table m_dndt_table; + BW_pair_prod_table m_pair_prod_table; + + void init_builtin_dndt_table(); + void init_builtin_pair_prod_table(); -//Table builing is available only if WarpX is compiled with QED_TABLE_GEN=TRUE -#ifdef WARPX_QED_TABLE_GEN - BreitWheelerEngineTableBuilder m_table_builder; -#endif }; diff --git a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp b/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp index e1eb55714..ffd260ec8 100644 --- a/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp +++ b/Source/Particles/ElementaryProcess/QEDInternals/BreitWheelerEngineWrapper.cpp @@ -6,14 +6,20 @@ */ #include "BreitWheelerEngineWrapper.H" -#include "QedTableParserHelperFunctions.H" -#include "BreitWheelerDummyTable.H" +#include <utils/serialization.hpp> + +//Functions needed to generate a new table +#ifdef WARPX_QED_TABLE_GEN +# include <physics/breit_wheeler/breit_wheeler_engine_tables_generator.hpp> +#endif #include <utility> +#include <vector> +#include <cstdint> using namespace std; -using namespace QedUtils; using namespace amrex; +namespace pxr_sr = picsar::multi_physics::utils::serialization; //This file provides a wrapper aroud the breit_wheeler engine //provided by the PICSAR library @@ -23,25 +29,26 @@ using namespace amrex; BreitWheelerEngine::BreitWheelerEngine (){} BreitWheelerGetOpticalDepth -BreitWheelerEngine::build_optical_depth_functor () +BreitWheelerEngine::build_optical_depth_functor () const { return BreitWheelerGetOpticalDepth(); } BreitWheelerEvolveOpticalDepth -BreitWheelerEngine::build_evolve_functor () +BreitWheelerEngine::build_evolve_functor () const { AMREX_ALWAYS_ASSERT(m_lookup_tables_initialized); - return BreitWheelerEvolveOpticalDepth(m_innards); + return BreitWheelerEvolveOpticalDepth(m_dndt_table.get_view(), + m_bw_minimum_chi_phot); } BreitWheelerGeneratePairs -BreitWheelerEngine::build_pair_functor () +BreitWheelerEngine::build_pair_functor () const { AMREX_ALWAYS_ASSERT(m_lookup_tables_initialized); - return BreitWheelerGeneratePairs(m_innards); + return BreitWheelerGeneratePairs(m_pair_prod_table.get_view()); } bool BreitWheelerEngine::are_lookup_tables_initialized () const @@ -51,150 +58,60 @@ bool BreitWheelerEngine::are_lookup_tables_initialized () const bool BreitWheelerEngine::init_lookup_tables_from_raw_data ( - const Vector<char>& raw_data) + const vector<char>& raw_data, + const amrex::Real bw_minimum_chi_phot) { - const char* p_data = raw_data.data(); - const char* const p_last = &raw_data.back(); - bool is_ok; - - //Header (control parameters) - tie(is_ok, m_innards.ctrl.chi_phot_min, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_phot_min)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_phot_tdndt_min, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_phot_tdndt_min)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_phot_tdndt_max, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_phot_tdndt_max)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_phot_tdndt_how_many, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_phot_tdndt_how_many)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_phot_tpair_min, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_phot_tpair_min)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_phot_tpair_max, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_phot_tpair_max)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_phot_tpair_how_many, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_phot_tpair_how_many)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_frac_tpair_how_many, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_frac_tpair_how_many)>( - p_data, p_last); - if(!is_ok) return false; - - //___________________________ - - //Data - Vector<Real> tndt_coords(m_innards.ctrl.chi_phot_tdndt_how_many); - Vector<Real> tndt_data(m_innards.ctrl.chi_phot_tdndt_how_many); - Vector<Real> cum_tab_coords1(m_innards.ctrl.chi_phot_tpair_how_many); - Vector<Real> cum_tab_coords2(m_innards.ctrl.chi_frac_tpair_how_many); - Vector<Real> cum_tab_data(m_innards.ctrl.chi_phot_tpair_how_many* - m_innards.ctrl.chi_frac_tpair_how_many); - - tie(is_ok, tndt_coords, p_data) = - parse_raw_data_vec<Real>( - p_data, tndt_coords.size(), p_last); - if(!is_ok) return false; - m_innards.TTfunc_coords.assign(tndt_coords.begin(), tndt_coords.end()); - - tie(is_ok, tndt_data, p_data) = - parse_raw_data_vec<Real>( - p_data, tndt_data.size(), p_last); - if(!is_ok) return false; - m_innards.TTfunc_data.assign(tndt_data.begin(), tndt_data.end()); - - tie(is_ok, cum_tab_coords1, p_data) = - parse_raw_data_vec<Real>( - p_data, cum_tab_coords1.size(), p_last); - if(!is_ok) return false; - m_innards.cum_distrib_coords_1.assign( - cum_tab_coords1.begin(), cum_tab_coords1.end()); - - tie(is_ok, cum_tab_coords2, p_data) = - parse_raw_data_vec<Real>( - p_data, cum_tab_coords2.size(), p_last); - if(!is_ok) return false; - m_innards.cum_distrib_coords_2.assign( - cum_tab_coords2.begin(), cum_tab_coords2.end()); - - tie(is_ok, cum_tab_data, p_data) = - parse_raw_data_vec<Real>( - p_data, cum_tab_data.size(), p_last); - if(!is_ok) return false; - m_innards.cum_distrib_data.assign( - cum_tab_data.begin(), cum_tab_data.end()); - - //___________________________ + auto raw_iter = raw_data.begin(); + const auto size_first = pxr_sr::get_out<uint64_t>(raw_iter); + if(size_first <= 0 || size_first >= raw_data.size() ) return false; + + const auto raw_dndt_table = vector<char>{ + raw_iter, raw_iter+size_first}; + + const auto raw_pair_prod_table = vector<char>{ + raw_iter+size_first, raw_data.end()}; + + m_dndt_table = BW_dndt_table{raw_dndt_table}; + m_pair_prod_table = BW_pair_prod_table{raw_pair_prod_table}; + + if (!m_dndt_table.is_init() || !m_pair_prod_table.is_init()) + return false; + + m_bw_minimum_chi_phot = bw_minimum_chi_phot; + + amrex::Gpu::synchronize(); + m_lookup_tables_initialized = true; return true; } -void BreitWheelerEngine::init_dummy_tables() +void BreitWheelerEngine::init_builtin_tables( + const amrex::Real bw_minimum_chi_phot) { - m_innards.ctrl = QedUtils::BreitWheelerEngineInnardsDummy.ctrl; - m_innards.TTfunc_coords.assign( - QedUtils::BreitWheelerEngineInnardsDummy.TTfunc_coords.begin(), - QedUtils::BreitWheelerEngineInnardsDummy.TTfunc_coords.end()); - m_innards.TTfunc_data.assign( - QedUtils::BreitWheelerEngineInnardsDummy.TTfunc_data.begin(), - QedUtils::BreitWheelerEngineInnardsDummy.TTfunc_data.end()); - m_innards.cum_distrib_coords_1.assign( - QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_coords_1.begin(), - QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_coords_1.end()); - m_innards.cum_distrib_coords_2.assign( - QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_coords_2.begin(), - QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_coords_2.end()); - m_innards.cum_distrib_data.assign( - QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_data.begin(), - QedUtils::BreitWheelerEngineInnardsDummy.cum_distrib_data.end()); + init_builtin_dndt_table(); + init_builtin_pair_prod_table(); + m_bw_minimum_chi_phot = bw_minimum_chi_phot; m_lookup_tables_initialized = true; } -Vector<char> BreitWheelerEngine::export_lookup_tables_data () const +vector<char> BreitWheelerEngine::export_lookup_tables_data () const { - Vector<char> res{}; - - if(!m_lookup_tables_initialized) - return res; - - add_data_to_vector_char(&m_innards.ctrl.chi_phot_min, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_phot_tdndt_min, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_phot_tdndt_max, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_phot_tdndt_how_many, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_phot_tpair_min, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_phot_tpair_max, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_phot_tpair_how_many, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_frac_tpair_how_many, 1, res); - - add_data_to_vector_char(m_innards.TTfunc_coords.data(), - m_innards.TTfunc_coords.size(), res); - add_data_to_vector_char(m_innards.TTfunc_data.data(), - m_innards.TTfunc_data.size(), res); - add_data_to_vector_char(m_innards.cum_distrib_coords_1.data(), - m_innards.cum_distrib_coords_1.size(), res); - add_data_to_vector_char(m_innards.cum_distrib_coords_2.data(), - m_innards.cum_distrib_coords_2.size(), res); - add_data_to_vector_char(m_innards.cum_distrib_data.data(), - m_innards.cum_distrib_data.size(), res); + if(!m_lookup_tables_initialized) + return vector<char>{}; + + const auto data_dndt = m_dndt_table.serialize(); + const auto data_pair_prod = m_pair_prod_table.serialize(); + + const uint64_t size_first = data_dndt.size(); + + vector<char> res{}; + pxr_sr::put_in(size_first, res); + for (const auto& tmp : data_dndt) + pxr_sr::put_in(tmp, res); + for (const auto& tmp : data_pair_prod) + pxr_sr::put_in(tmp, res); return res; } @@ -202,22 +119,1104 @@ Vector<char> BreitWheelerEngine::export_lookup_tables_data () const PicsarBreitWheelerCtrl BreitWheelerEngine::get_default_ctrl() const { - return PicsarBreitWheelerCtrl(); + namespace pxr_bw = picsar::multi_physics::phys::breit_wheeler; + return PicsarBreitWheelerCtrl{ + pxr_bw::default_dndt_lookup_table_params<amrex::Real>, + pxr_bw::default_pair_prod_lookup_table_params<amrex::Real> + }; } -const PicsarBreitWheelerCtrl& -BreitWheelerEngine::get_ref_ctrl() const +amrex::Real +BreitWheelerEngine::get_minimum_chi_phot() const { - return m_innards.ctrl; + return m_bw_minimum_chi_phot; } void BreitWheelerEngine::compute_lookup_tables ( - PicsarBreitWheelerCtrl ctrl) + PicsarBreitWheelerCtrl ctrl, + const amrex::Real bw_minimum_chi_phot) { #ifdef WARPX_QED_TABLE_GEN - m_table_builder.compute_table(ctrl, m_innards); + m_dndt_table = BW_dndt_table{ctrl.dndt_params}; + m_dndt_table.generate(true); //Progress bar is displayed + m_pair_prod_table = BW_pair_prod_table{ctrl.pair_prod_params}; + m_pair_prod_table.generate(true); //Progress bar is displayed + m_bw_minimum_chi_phot = bw_minimum_chi_phot; + + amrex::Gpu::synchronize(); + m_lookup_tables_initialized = true; +#else + amrex::Abort("WarpX was not compiled with table generation support!"); #endif } +void BreitWheelerEngine::init_builtin_dndt_table() +{ + BW_dndt_table_params dndt_params; + dndt_params.chi_phot_min = 0.02_rt; + dndt_params.chi_phot_max = 200.0_rt; + dndt_params.chi_phot_how_many = 64; + + const auto vals = amrex::Gpu::DeviceVector<amrex::Real>{ + -1.34808e+02_rt, -1.16674e+02_rt, -1.01006e+02_rt, -8.74694e+01_rt, + -7.57742e+01_rt, -6.56699e+01_rt, -5.69401e+01_rt, -4.93981e+01_rt, + -4.28821e+01_rt, -3.72529e+01_rt, -3.23897e+01_rt, -2.81885e+01_rt, + -2.45593e+01_rt, -2.14243e+01_rt, -1.87166e+01_rt, -1.63779e+01_rt, + -1.43584e+01_rt, -1.26145e+01_rt, -1.11091e+01_rt, -9.80975e+00_rt, + -8.68862e+00_rt, -7.72163e+00_rt, -6.88795e+00_rt, -6.16965e+00_rt, + -5.55120e+00_rt, -5.01921e+00_rt, -4.56210e+00_rt, -4.16989e+00_rt, + -3.83395e+00_rt, -3.54680e+00_rt, -3.30202e+00_rt, -3.09403e+00_rt, + -2.91801e+00_rt, -2.76980e+00_rt, -2.64579e+00_rt, -2.54287e+00_rt, + -2.45833e+00_rt, -2.38982e+00_rt, -2.33532e+00_rt, -2.29307e+00_rt, + -2.26152e+00_rt, -2.23935e+00_rt, -2.22540e+00_rt, -2.21867e+00_rt, + -2.21827e+00_rt, -2.22343e+00_rt, -2.23350e+00_rt, -2.24788e+00_rt, + -2.26607e+00_rt, -2.28761e+00_rt, -2.31212e+00_rt, -2.33926e+00_rt, + -2.36871e+00_rt, -2.40023e+00_rt, -2.43357e+00_rt, -2.46853e+00_rt, + -2.50493e+00_rt, -2.54261e+00_rt, -2.58143e+00_rt, -2.62127e+00_rt, + -2.66201e+00_rt, -2.70357e+00_rt, -2.74585e+00_rt, -2.78877e+00_rt}; + + amrex::Gpu::synchronize(); + + m_dndt_table = BW_dndt_table{dndt_params, vals}; +} + +void BreitWheelerEngine::init_builtin_pair_prod_table() +{ + BW_pair_prod_table_params pair_prod_params; + pair_prod_params.chi_phot_min = 0.02_rt; + pair_prod_params.chi_phot_max = 200.0_rt; + pair_prod_params.chi_phot_how_many = 64; + pair_prod_params.frac_how_many = 64; + + const auto vals = amrex::Gpu::DeviceVector<amrex::Real>{ + 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, 3.35120e-221_rt, + 1.13067e-188_rt, 2.14228e-163_rt, 3.39948e-143_rt, 1.09215e-126_rt, + 5.94019e-113_rt, 2.37985e-101_rt, 2.00771e-91_rt, 7.70540e-83_rt, + 2.39749e-75_rt, 9.40741e-69_rt, 6.56422e-63_rt, 1.06836e-57_rt, + 5.03881e-53_rt, 8.20929e-49_rt, 5.33414e-45_rt, 1.55651e-41_rt, + 2.25171e-38_rt, 1.75472e-35_rt, 7.90210e-33_rt, 2.18314e-30_rt, + 3.89470e-28_rt, 4.68899e-26_rt, 3.95815e-24_rt, 2.42185e-22_rt, + 1.10577e-20_rt, 3.86465e-19_rt, 1.05740e-17_rt, 2.31035e-16_rt, + 4.10266e-15_rt, 6.01463e-14_rt, 7.38207e-13_rt, 7.68074e-12_rt, + 6.85101e-11_rt, 5.29188e-10_rt, 3.57202e-09_rt, 2.12435e-08_rt, + 1.12141e-07_rt, 5.28995e-07_rt, 2.24354e-06_rt, 8.60245e-06_rt, + 2.99719e-05_rt, 9.53273e-05_rt, 2.77953e-04_rt, 7.45878e-04_rt, + 1.84871e-03_rt, 4.24642e-03_rt, 9.06751e-03_rt, 1.80527e-02_rt, + 3.36054e-02_rt, 5.86505e-02_rt, 9.62278e-02_rt, 1.48823e-01_rt, + 2.17569e-01_rt, 3.01546e-01_rt, 3.97478e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 4.96543e-229_rt, 1.61201e-191_rt, + 2.10361e-163_rt, 1.48853e-141_rt, 4.31513e-124_rt, 8.03657e-110_rt, + 6.02583e-98_rt, 6.48154e-88_rt, 2.47897e-79_rt, 6.56015e-72_rt, + 1.97905e-65_rt, 9.97097e-60_rt, 1.12913e-54_rt, 3.63334e-50_rt, + 4.00764e-46_rt, 1.76373e-42_rt, 3.50658e-39_rt, 3.48978e-36_rt, + 1.89363e-33_rt, 6.01935e-31_rt, 1.19104e-28_rt, 1.54482e-26_rt, + 1.37287e-24_rt, 8.68465e-23_rt, 4.04195e-21_rt, 1.42438e-19_rt, + 3.89736e-18_rt, 8.46436e-17_rt, 1.48776e-15_rt, 2.15299e-14_rt, + 2.60458e-13_rt, 2.66996e-12_rt, 2.34743e-11_rt, 1.78939e-10_rt, + 1.19414e-09_rt, 7.03769e-09_rt, 3.69190e-08_rt, 1.73618e-07_rt, + 7.36647e-07_rt, 2.83643e-06_rt, 9.96391e-06_rt, 3.20868e-05_rt, + 9.51418e-05_rt, 2.60801e-04_rt, 6.63347e-04_rt, 1.57087e-03_rt, + 3.47431e-03_rt, 7.19766e-03_rt, 1.40053e-02_rt, 2.56621e-02_rt, + 4.43869e-02_rt, 7.26462e-02_rt, 1.12767e-01_rt, 1.66410e-01_rt, + 2.34012e-01_rt, 3.14373e-01_rt, 4.04524e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, + 0.00000e+00_rt, 1.05570e-243_rt, 2.71557e-198_rt, 7.19045e-166_rt, + 1.44533e-141_rt, 1.11742e-122_rt, 1.39503e-107_rt, 3.03452e-95_rt, + 5.61714e-85_rt, 2.65318e-76_rt, 7.00707e-69_rt, 1.83945e-62_rt, + 7.38996e-57_rt, 6.32013e-52_rt, 1.48739e-47_rt, 1.17966e-43_rt, + 3.70790e-40_rt, 5.26675e-37_rt, 3.76381e-34_rt, 1.47876e-31_rt, + 3.43911e-29_rt, 5.03750e-27_rt, 4.89780e-25_rt, 3.30531e-23_rt, + 1.60870e-21_rt, 5.83599e-20_rt, 1.62380e-18_rt, 3.55242e-17_rt, + 6.24487e-16_rt, 8.99102e-15_rt, 1.07814e-13_rt, 1.09288e-12_rt, + 9.48909e-12_rt, 7.14037e-11_rt, 4.70552e-10_rt, 2.74127e-09_rt, + 1.42365e-08_rt, 6.64113e-08_rt, 2.80174e-07_rt, 1.07555e-06_rt, + 3.77812e-06_rt, 1.22054e-05_rt, 3.64294e-05_rt, 1.00878e-04_rt, + 2.60162e-04_rt, 6.27062e-04_rt, 1.41706e-03_rt, 3.01137e-03_rt, + 6.03424e-03_rt, 1.14306e-02_rt, 2.05179e-02_rt, 3.49780e-02_rt, + 5.67520e-02_rt, 8.78195e-02_rt, 1.29868e-01_rt, 1.83904e-01_rt, + 2.49888e-01_rt, 3.26495e-01_rt, 4.11098e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, + 7.26024e-270_rt, 5.56502e-211_rt, 9.89467e-172_rt, 1.05165e-143_rt, + 1.07452e-122_rt, 2.29464e-106_rt, 2.58816e-93_rt, 1.20441e-82_rt, + 9.10565e-74_rt, 2.88914e-66_rt, 7.57859e-60_rt, 2.70227e-54_rt, + 1.90184e-49_rt, 3.51404e-45_rt, 2.12810e-41_rt, 5.03275e-38_rt, + 5.34704e-35_rt, 2.85882e-32_rt, 8.43982e-30_rt, 1.48542e-27_rt, + 1.66142e-25_rt, 1.24599e-23_rt, 6.55645e-22_rt, 2.51605e-20_rt, + 7.27852e-19_rt, 1.63315e-17_rt, 2.91337e-16_rt, 4.22167e-15_rt, + 5.06352e-14_rt, 5.11048e-13_rt, 4.40374e-12_rt, 3.28180e-11_rt, + 2.13937e-10_rt, 1.23238e-09_rt, 6.33036e-09_rt, 2.92316e-08_rt, + 1.22231e-07_rt, 4.65857e-07_rt, 1.62791e-06_rt, 5.24366e-06_rt, + 1.56444e-05_rt, 4.34216e-05_rt, 1.12566e-04_rt, 2.73554e-04_rt, + 6.25248e-04_rt, 1.34820e-03_rt, 2.75018e-03_rt, 5.32098e-03_rt, + 9.78768e-03_rt, 1.71549e-02_rt, 2.87089e-02_rt, 4.59637e-02_rt, + 7.05331e-02_rt, 1.03927e-01_rt, 1.47294e-01_rt, 2.01146e-01_rt, + 2.65135e-01_rt, 3.37925e-01_rt, 4.17229e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, + 1.33696e-233_rt, 1.05001e-182_rt, 8.88418e-149_rt, 1.50181e-124_rt, + 2.18820e-106_rt, 2.87640e-92_rt, 5.55963e-81_rt, 9.33671e-72_rt, + 4.45389e-64_rt, 1.37058e-57_rt, 4.88856e-52_rt, 3.10614e-47_rt, + 4.85334e-43_rt, 2.38628e-39_rt, 4.47261e-36_rt, 3.71812e-33_rt, + 1.54748e-30_rt, 3.55680e-28_rt, 4.89187e-26_rt, 4.30188e-24_rt, + 2.55620e-22_rt, 1.07505e-20_rt, 3.32812e-19_rt, 7.84181e-18_rt, + 1.44715e-16_rt, 2.14389e-15_rt, 2.60471e-14_rt, 2.64398e-13_rt, + 2.27907e-12_rt, 1.69219e-11_rt, 1.09596e-10_rt, 6.26073e-10_rt, + 3.18581e-09_rt, 1.45679e-08_rt, 6.03332e-08_rt, 2.27904e-07_rt, + 7.90163e-07_rt, 2.52880e-06_rt, 7.50871e-06_rt, 2.07815e-05_rt, + 5.38356e-05_rt, 1.31037e-04_rt, 3.00711e-04_rt, 6.52692e-04_rt, + 1.34377e-03_rt, 2.63113e-03_rt, 4.91155e-03_rt, 8.76045e-03_rt, + 1.49612e-02_rt, 2.45118e-02_rt, 3.85956e-02_rt, 5.85053e-02_rt, + 8.55165e-02_rt, 1.20719e-01_rt, 1.64829e-01_rt, 2.18003e-01_rt, + 2.79711e-01_rt, 3.48679e-01_rt, 4.22943e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, 1.43228e-275_rt, + 2.90526e-202_rt, 2.85407e-158_rt, 6.08538e-129_rt, 5.37574e-108_rt, + 2.72332e-92_rt, 4.40352e-80_rt, 2.53579e-70_rt, 2.41452e-62_rt, + 1.05824e-55_rt, 4.33779e-50_rt, 2.75960e-45_rt, 3.95059e-41_rt, + 1.68168e-37_rt, 2.63427e-34_rt, 1.79233e-31_rt, 6.03771e-29_rt, + 1.11818e-26_rt, 1.23925e-24_rt, 8.80945e-23_rt, 4.25371e-21_rt, + 1.46338e-19_rt, 3.73368e-18_rt, 7.30873e-17_rt, 1.12985e-15_rt, + 1.41392e-14_rt, 1.46326e-13_rt, 1.27566e-12_rt, 9.52018e-12_rt, + 6.16825e-11_rt, 3.51273e-10_rt, 1.77753e-09_rt, 8.06971e-09_rt, + 3.31493e-08_rt, 1.24157e-07_rt, 4.26866e-07_rt, 1.35544e-06_rt, + 3.99674e-06_rt, 1.09977e-05_rt, 2.83656e-05_rt, 6.88522e-05_rt, + 1.57855e-04_rt, 3.42959e-04_rt, 7.08237e-04_rt, 1.39397e-03_rt, + 2.62155e-03_rt, 4.72160e-03_rt, 8.16139e-03_rt, 1.35653e-02_rt, + 2.17204e-02_rt, 3.35592e-02_rt, 5.01121e-02_rt, 7.24274e-02_rt, + 1.01462e-01_rt, 1.37952e-01_rt, 1.82280e-01_rt, 2.34366e-01_rt, + 2.93590e-01_rt, 3.58779e-01_rt, 4.28265e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, 1.51593e-238_rt, + 3.48684e-175_rt, 3.72191e-137_rt, 8.44188e-112_rt, 1.08918e-93_rt, + 4.14348e-80_rt, 1.49893e-69_rt, 4.14701e-61_rt, 3.30780e-54_rt, + 1.84292e-48_rt, 1.32364e-43_rt, 1.89875e-39_rt, 7.50022e-36_rt, + 1.03805e-32_rt, 6.05229e-30_rt, 1.71569e-27_rt, 2.64805e-25_rt, + 2.43622e-23_rt, 1.43764e-21_rt, 5.77804e-20_rt, 1.66200e-18_rt, + 3.56565e-17_rt, 5.90700e-16_rt, 7.78145e-15_rt, 8.35746e-14_rt, + 7.47669e-13_rt, 5.67517e-12_rt, 3.71387e-11_rt, 2.12468e-10_rt, + 1.07564e-09_rt, 4.87056e-09_rt, 1.99124e-08_rt, 7.41165e-08_rt, + 2.53026e-07_rt, 7.97501e-07_rt, 2.33436e-06_rt, 6.37912e-06_rt, + 1.63518e-05_rt, 3.94847e-05_rt, 9.01614e-05_rt, 1.95367e-04_rt, + 4.02983e-04_rt, 7.93547e-04_rt, 1.49569e-03_rt, 2.70473e-03_rt, + 4.70293e-03_rt, 7.87848e-03_rt, 1.27392e-02_rt, 1.99162e-02_rt, + 3.01520e-02_rt, 4.42696e-02_rt, 6.31203e-02_rt, 8.75113e-02_rt, + 1.18119e-01_rt, 1.55396e-01_rt, 1.99486e-01_rt, 2.50156e-01_rt, + 3.06761e-01_rt, 3.68251e-01_rt, 4.33220e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 0.00000e+00_rt, 1.49266e-206_rt, + 8.76968e-152_rt, 6.58450e-119_rt, 5.51350e-97_rt, 2.52491e-81_rt, + 1.40295e-69_rt, 1.90378e-60_rt, 3.82392e-53_rt, 3.57979e-47_rt, + 3.35629e-42_rt, 5.35264e-38_rt, 2.12010e-34_rt, 2.75294e-31_rt, + 1.44327e-28_rt, 3.58262e-26_rt, 4.76628e-24_rt, 3.74791e-22_rt, + 1.88382e-20_rt, 6.44864e-19_rt, 1.58345e-17_rt, 2.91116e-16_rt, + 4.15302e-15_rt, 4.73727e-14_rt, 4.43185e-13_rt, 3.47475e-12_rt, + 2.32589e-11_rt, 1.35057e-10_rt, 6.89789e-10_rt, 3.13627e-09_rt, + 1.28287e-08_rt, 4.76470e-08_rt, 1.62000e-07_rt, 5.07870e-07_rt, + 1.47750e-06_rt, 4.01156e-06_rt, 1.02170e-05_rt, 2.45213e-05_rt, + 5.56861e-05_rt, 1.20099e-04_rt, 2.46812e-04_rt, 4.84774e-04_rt, + 9.12525e-04_rt, 1.65029e-03_rt, 2.87391e-03_rt, 4.82923e-03_rt, + 7.84506e-03_rt, 1.23420e-02_rt, 1.88336e-02_rt, 2.79182e-02_rt, + 4.02565e-02_rt, 5.65371e-02_rt, 7.74272e-02_rt, 1.03514e-01_rt, + 1.35243e-01_rt, 1.72849e-01_rt, 2.16312e-01_rt, 2.65312e-01_rt, + 3.19222e-01_rt, 3.77120e-01_rt, 4.37832e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 1.58793e-273_rt, 6.61011e-179_rt, + 1.46284e-131_rt, 3.87939e-103_rt, 3.51382e-84_rt, 1.23011e-70_rt, + 1.77378e-60_rt, 1.41107e-52_rt, 2.93962e-46_rt, 4.32235e-41_rt, + 8.68976e-37_rt, 3.77603e-33_rt, 4.91941e-30_rt, 2.44280e-27_rt, + 5.53569e-25_rt, 6.57043e-23_rt, 4.54673e-21_rt, 1.99639e-19_rt, + 5.95176e-18_rt, 1.27267e-16_rt, 2.04147e-15_rt, 2.54936e-14_rt, + 2.55622e-13_rt, 2.11212e-12_rt, 1.47004e-11_rt, 8.78122e-11_rt, + 4.57466e-10_rt, 2.10737e-09_rt, 8.68763e-09_rt, 3.23866e-08_rt, + 1.10177e-07_rt, 3.44792e-07_rt, 9.99597e-07_rt, 2.70151e-06_rt, + 6.84404e-06_rt, 1.63337e-05_rt, 3.68843e-05_rt, 7.91224e-05_rt, + 1.61808e-04_rt, 3.16473e-04_rt, 5.93691e-04_rt, 1.07105e-03_rt, + 1.86257e-03_rt, 3.12902e-03_rt, 5.08803e-03_rt, 8.02264e-03_rt, + 1.22864e-02_rt, 1.83032e-02_rt, 2.65600e-02_rt, 3.75911e-02_rt, + 5.19532e-02_rt, 7.01924e-02_rt, 9.28038e-02_rt, 1.20187e-01_rt, + 1.52603e-01_rt, 1.90133e-01_rt, 2.32648e-01_rt, 2.79792e-01_rt, + 3.30980e-01_rt, 3.85415e-01_rt, 4.42123e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 8.41483e-237_rt, 5.13669e-155_rt, + 4.37898e-114_rt, 1.65375e-89_rt, 4.10179e-73_rt, 2.12988e-61_rt, + 1.30962e-52_rt, 8.98269e-46_rt, 2.64139e-40_rt, 7.84631e-36_rt, + 4.17035e-32_rt, 5.89256e-29_rt, 2.93719e-26_rt, 6.35624e-24_rt, + 6.97817e-22_rt, 4.37819e-20_rt, 1.72232e-18_rt, 4.57083e-17_rt, + 8.67713e-16_rt, 1.23555e-14_rt, 1.37184e-13_rt, 1.22642e-12_rt, + 9.06732e-12_rt, 5.66989e-11_rt, 3.05620e-10_rt, 1.44321e-09_rt, + 6.05407e-09_rt, 2.28311e-08_rt, 7.82116e-08_rt, 2.45582e-07_rt, + 7.12411e-07_rt, 1.92258e-06_rt, 4.85639e-06_rt, 1.15442e-05_rt, + 2.59492e-05_rt, 5.53927e-05_rt, 1.12722e-04_rt, 2.19423e-04_rt, + 4.09838e-04_rt, 7.36549e-04_rt, 1.27685e-03_rt, 2.14000e-03_rt, + 3.47470e-03_rt, 5.47600e-03_rt, 8.39063e-03_rt, 1.25195e-02_rt, + 1.82164e-02_rt, 2.58816e-02_rt, 3.59497e-02_rt, 4.88719e-02_rt, + 6.50927e-02_rt, 8.50218e-02_rt, 1.09003e-01_rt, 1.37286e-01_rt, + 1.69993e-01_rt, 2.07098e-01_rt, 2.48412e-01_rt, 2.93572e-01_rt, + 3.42050e-01_rt, 3.93165e-01_rt, 4.46113e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 4.55844e-205_rt, 2.27106e-134_rt, + 5.55927e-99_rt, 9.97211e-78_rt, 1.51108e-63_rt, 2.06349e-53_rt, + 8.30931e-46_rt, 6.85779e-40_rt, 3.71472e-35_rt, 2.77086e-31_rt, + 4.66556e-28_rt, 2.49733e-25_rt, 5.42730e-23_rt, 5.73037e-21_rt, + 3.36330e-19_rt, 1.21642e-17_rt, 2.93735e-16_rt, 5.04529e-15_rt, + 6.48460e-14_rt, 6.49787e-13_rt, 5.24973e-12_rt, 3.51590e-11_rt, + 1.99764e-10_rt, 9.81792e-10_rt, 4.24316e-09_rt, 1.63536e-08_rt, + 5.68862e-08_rt, 1.80455e-07_rt, 5.26740e-07_rt, 1.42588e-06_rt, + 3.60409e-06_rt, 8.55743e-06_rt, 1.91878e-05_rt, 4.08205e-05_rt, + 8.27388e-05_rt, 1.60372e-04_rt, 2.98248e-04_rt, 5.33760e-04_rt, + 9.21711e-04_rt, 1.53947e-03_rt, 2.49239e-03_rt, 3.91911e-03_rt, + 5.99602e-03_rt, 8.94020e-03_rt, 1.30102e-02_rt, 1.85040e-02_rt, + 2.57530e-02_rt, 3.51130e-02_rt, 4.69503e-02_rt, 6.16258e-02_rt, + 7.94746e-02_rt, 1.00785e-01_rt, 1.25778e-01_rt, 1.54584e-01_rt, + 1.87231e-01_rt, 2.23623e-01_rt, 2.63542e-01_rt, 3.06640e-01_rt, + 3.52450e-01_rt, 4.00398e-01_rt, 4.49822e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 1.20482e-177_rt, 1.57838e-116_rt, + 6.29271e-86_rt, 1.51798e-67_rt, 2.81107e-55_rt, 1.65577e-46_rt, + 6.32592e-40_rt, 8.37836e-35_rt, 1.05225e-30_rt, 2.37828e-27_rt, + 1.48323e-24_rt, 3.43190e-22_rt, 3.64024e-20_rt, 2.06740e-18_rt, + 7.06337e-17_rt, 1.58711e-15_rt, 2.51381e-14_rt, 2.96472e-13_rt, + 2.72023e-12_rt, 2.01198e-11_rt, 1.23499e-10_rt, 6.44398e-10_rt, + 2.91607e-09_rt, 1.16386e-08_rt, 4.15573e-08_rt, 1.34372e-07_rt, + 3.97561e-07_rt, 1.08599e-06_rt, 2.76028e-06_rt, 6.57236e-06_rt, + 1.47471e-05_rt, 3.13448e-05_rt, 6.34004e-05_rt, 1.22532e-04_rt, + 2.27096e-04_rt, 4.04916e-04_rt, 6.96571e-04_rt, 1.15913e-03_rt, + 1.87012e-03_rt, 2.93148e-03_rt, 4.47305e-03_rt, 6.65524e-03_rt, + 9.67030e-03_rt, 1.37419e-02_rt, 1.91225e-02_rt, 2.60882e-02_rt, + 3.49313e-02_rt, 4.59500e-02_rt, 5.94364e-02_rt, 7.56627e-02_rt, + 9.48661e-02_rt, 1.17234e-01_rt, 1.42889e-01_rt, 1.71879e-01_rt, + 2.04164e-01_rt, 2.39612e-01_rt, 2.77996e-01_rt, 3.18995e-01_rt, + 3.62205e-01_rt, 4.07143e-01_rt, 4.53269e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 0.00000e+00_rt, 5.99544e-154_rt, 4.14924e-101_rt, + 1.20684e-74_rt, 9.62151e-59_rt, 3.96369e-48_rt, 1.54418e-40_rt, + 7.71031e-35_rt, 2.10168e-30_rt, 7.46541e-27_rt, 6.01388e-24_rt, + 1.59000e-21_rt, 1.78233e-19_rt, 1.01722e-17_rt, 3.38066e-16_rt, + 7.23646e-15_rt, 1.07766e-13_rt, 1.18561e-12_rt, 1.01039e-11_rt, + 6.92812e-11_rt, 3.94155e-10_rt, 1.90798e-09_rt, 8.02357e-09_rt, + 2.98251e-08_rt, 9.94357e-08_rt, 3.01028e-07_rt, 8.36260e-07_rt, + 2.15109e-06_rt, 5.16335e-06_rt, 1.16436e-05_rt, 2.48126e-05_rt, + 5.02246e-05_rt, 9.70014e-05_rt, 1.79467e-04_rt, 3.19203e-04_rt, + 5.47500e-04_rt, 9.08129e-04_rt, 1.46030e-03_rt, 2.28159e-03_rt, + 3.47064e-03_rt, 5.14926e-03_rt, 7.46373e-03_rt, 1.05849e-02_rt, + 1.47071e-02_rt, 2.00450e-02_rt, 2.68295e-02_rt, 3.53013e-02_rt, + 4.57031e-02_rt, 5.82712e-02_rt, 7.32249e-02_rt, 9.07564e-02_rt, + 1.11020e-01_rt, 1.34124e-01_rt, 1.60119e-01_rt, 1.88994e-01_rt, + 2.20669e-01_rt, 2.54993e-01_rt, 2.91748e-01_rt, 3.30646e-01_rt, + 3.71339e-01_rt, 4.13428e-01_rt, 4.56472e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 3.09018e-270_rt, 1.80390e-133_rt, 8.80988e-88_rt, + 6.82879e-65_rt, 3.91287e-51_rt, 6.01679e-42_rt, 2.24300e-35_rt, + 1.93029e-30_rt, 1.34253e-26_rt, 1.60141e-23_rt, 5.29015e-21_rt, + 6.66294e-19_rt, 3.99298e-17_rt, 1.33392e-15_rt, 2.79016e-14_rt, + 3.98728e-13_rt, 4.16160e-12_rt, 3.34150e-11_rt, 2.15053e-10_rt, + 1.14642e-09_rt, 5.19866e-09_rt, 2.04954e-08_rt, 7.15253e-08_rt, + 2.24297e-07_rt, 6.40075e-07_rt, 1.68005e-06_rt, 4.09311e-06_rt, + 9.32854e-06_rt, 2.00230e-05_rt, 4.07133e-05_rt, 7.88211e-05_rt, + 1.45942e-04_rt, 2.59447e-04_rt, 4.44372e-04_rt, 7.35533e-04_rt, + 1.17976e-03_rt, 1.83811e-03_rt, 2.78792e-03_rt, 4.12440e-03_rt, + 5.96172e-03_rt, 8.43331e-03_rt, 1.16912e-02_rt, 1.59043e-02_rt, + 2.12556e-02_rt, 2.79383e-02_rt, 3.61506e-02_rt, 4.60903e-02_rt, + 5.79473e-02_rt, 7.18973e-02_rt, 8.80942e-02_rt, 1.06663e-01_rt, + 1.27692e-01_rt, 1.51229e-01_rt, 1.77275e-01_rt, 2.05781e-01_rt, + 2.36645e-01_rt, 2.69715e-01_rt, 3.04786e-01_rt, 3.41606e-01_rt, + 3.79881e-01_rt, 4.19280e-01_rt, 4.59446e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 5.35199e-234_rt, 8.99239e-116_rt, 2.90990e-76_rt, + 1.84101e-56_rt, 1.48341e-44_rt, 1.33146e-36_rt, 6.53485e-31_rt, + 1.23103e-26_rt, 2.63040e-23_rt, 1.22212e-20_rt, 1.86879e-18_rt, + 1.24017e-16_rt, 4.32619e-15_rt, 9.09794e-14_rt, 1.27546e-12_rt, + 1.28549e-11_rt, 9.86818e-11_rt, 6.03541e-10_rt, 3.04728e-09_rt, + 1.30681e-08_rt, 4.87097e-08_rt, 1.60813e-07_rt, 4.77647e-07_rt, + 1.29308e-06_rt, 3.22569e-06_rt, 7.48383e-06_rt, 1.62764e-05_rt, + 3.34090e-05_rt, 6.50994e-05_rt, 1.21031e-04_rt, 2.15646e-04_rt, + 3.69643e-04_rt, 6.11643e-04_rt, 9.79912e-04_rt, 1.52406e-03_rt, + 2.30657e-03_rt, 3.40403e-03_rt, 4.90794e-03_rt, 6.92498e-03_rt, + 9.57657e-03_rt, 1.29977e-02_rt, 1.73352e-02_rt, 2.27448e-02_rt, + 2.93879e-02_rt, 3.74277e-02_rt, 4.70243e-02_rt, 5.83301e-02_rt, + 7.14846e-02_rt, 8.66092e-02_rt, 1.03802e-01_rt, 1.23135e-01_rt, + 1.44647e-01_rt, 1.68343e-01_rt, 1.94190e-01_rt, 2.22119e-01_rt, + 2.52019e-01_rt, 2.83744e-01_rt, 3.17108e-01_rt, 3.51895e-01_rt, + 3.87858e-01_rt, 4.24726e-01_rt, 4.62208e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.10366e-202_rt, 1.77441e-100_rt, 2.63415e-66_rt, + 3.57775e-49_rt, 7.23954e-39_rt, 5.58144e-32_rt, 4.75140e-27_rt, + 2.40872e-23_rt, 1.85636e-20_rt, 3.81877e-18_rt, 3.00131e-16_rt, + 1.14488e-14_rt, 2.50208e-13_rt, 3.52728e-12_rt, 3.49933e-11_rt, + 2.60808e-10_rt, 1.53525e-09_rt, 7.42117e-09_rt, 3.03789e-08_rt, + 1.07940e-07_rt, 3.39608e-07_rt, 9.61749e-07_rt, 2.48489e-06_rt, + 5.92398e-06_rt, 1.31553e-05_rt, 2.74316e-05_rt, 5.40808e-05_rt, + 1.01397e-04_rt, 1.81718e-04_rt, 3.12656e-04_rt, 5.18437e-04_rt, + 8.31268e-04_rt, 1.29265e-03_rt, 1.95454e-03_rt, 2.88028e-03_rt, + 4.14512e-03_rt, 5.83644e-03_rt, 8.05333e-03_rt, 1.09058e-02_rt, + 1.45133e-02_rt, 1.90030e-02_rt, 2.45068e-02_rt, 3.11594e-02_rt, + 3.90942e-02_rt, 4.84403e-02_rt, 5.93190e-02_rt, 7.18397e-02_rt, + 8.60969e-02_rt, 1.02167e-01_rt, 1.20103e-01_rt, 1.39937e-01_rt, + 1.61673e-01_rt, 1.85287e-01_rt, 2.10728e-01_rt, 2.37914e-01_rt, + 2.66737e-01_rt, 2.97060e-01_rt, 3.28721e-01_rt, 3.61536e-01_rt, + 3.95300e-01_rt, 4.29789e-01_rt, 4.64771e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.26685e-175_rt, 2.94133e-87_rt, 1.06599e-57_rt, + 7.16756e-43_rt, 6.01109e-34_rt, 5.55779e-28_rt, 1.04131e-23_rt, + 1.69811e-20_rt, 5.42194e-18_rt, 5.51650e-16_rt, 2.43927e-14_rt, + 5.76631e-13_rt, 8.41263e-12_rt, 8.39366e-11_rt, 6.17584e-10_rt, + 3.54609e-09_rt, 1.65933e-08_rt, 6.54488e-08_rt, 2.23480e-07_rt, + 6.74877e-07_rt, 1.83390e-06_rt, 4.54829e-06_rt, 1.04169e-05_rt, + 2.22481e-05_rt, 4.46771e-05_rt, 8.49453e-05_rt, 1.53828e-04_rt, + 2.66678e-04_rt, 4.44534e-04_rt, 7.15225e-04_rt, 1.11441e-03_rt, + 1.68646e-03_rt, 2.48513e-03_rt, 3.57389e-03_rt, 5.02603e-03_rt, + 6.92425e-03_rt, 9.35997e-03_rt, 1.24322e-02_rt, 1.62459e-02_rt, + 2.09105e-02_rt, 2.65373e-02_rt, 3.32377e-02_rt, 4.11201e-02_rt, + 5.02877e-02_rt, 6.08358e-02_rt, 7.28492e-02_rt, 8.64000e-02_rt, + 1.01545e-01_rt, 1.18325e-01_rt, 1.36760e-01_rt, 1.56853e-01_rt, + 1.78584e-01_rt, 2.01912e-01_rt, 2.26777e-01_rt, 2.53095e-01_rt, + 2.80762e-01_rt, 3.09658e-01_rt, 3.39641e-01_rt, 3.70556e-01_rt, + 4.02235e-01_rt, 4.34495e-01_rt, 4.67149e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 3.06823e-152_rt, 7.84694e-76_rt, 2.94312e-50_rt, + 2.01640e-37_rt, 1.08049e-29_rt, 1.59848e-24_rt, 8.09748e-21_rt, + 4.95566e-18_rt, 7.38924e-16_rt, 4.09157e-14_rt, 1.10057e-12_rt, + 1.72052e-11_rt, 1.77014e-10_rt, 1.31001e-09_rt, 7.44426e-09_rt, + 3.41152e-08_rt, 1.30907e-07_rt, 4.33080e-07_rt, 1.26417e-06_rt, + 3.31680e-06_rt, 7.94014e-06_rt, 1.75580e-05_rt, 3.62307e-05_rt, + 7.03591e-05_rt, 1.29511e-04_rt, 2.27332e-04_rt, 3.82492e-04_rt, + 6.19605e-04_rt, 9.70054e-04_rt, 1.47267e-03_rt, 2.17418e-03_rt, + 3.12943e-03_rt, 4.40132e-03_rt, 6.06038e-03_rt, 8.18413e-03_rt, + 1.08561e-02_rt, 1.41646e-02_rt, 1.82011e-02_rt, 2.30590e-02_rt, + 2.88314e-02_rt, 3.56093e-02_rt, 4.34800e-02_rt, 5.25249e-02_rt, + 6.28178e-02_rt, 7.44230e-02_rt, 8.73941e-02_rt, 1.01772e-01_rt, + 1.17585e-01_rt, 1.34846e-01_rt, 1.53553e-01_rt, 1.73689e-01_rt, + 1.95219e-01_rt, 2.18095e-01_rt, 2.42252e-01_rt, 2.67610e-01_rt, + 2.94075e-01_rt, 3.21540e-01_rt, 3.49886e-01_rt, 3.78983e-01_rt, + 4.08691e-01_rt, 4.38866e-01_rt, 4.69354e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 4.95800e-132_rt, 5.90844e-66_rt, 7.98796e-44_rt, + 1.04041e-32_rt, 5.17752e-26_rt, 1.57228e-21_rt, 2.57237e-18_rt, + 6.74966e-16_rt, 5.21207e-14_rt, 1.70592e-12_rt, 2.98623e-11_rt, + 3.26542e-10_rt, 2.48412e-09_rt, 1.41997e-08_rt, 6.45408e-08_rt, + 2.43387e-07_rt, 7.86698e-07_rt, 2.23553e-06_rt, 5.69801e-06_rt, + 1.32378e-05_rt, 2.83996e-05_rt, 5.68658e-05_rt, 1.07218e-04_rt, + 1.91761e-04_rt, 3.27358e-04_rt, 5.36214e-04_rt, 8.46544e-04_rt, + 1.29309e-03_rt, 1.91741e-03_rt, 2.76798e-03_rt, 3.89998e-03_rt, + 5.37485e-03_rt, 7.25969e-03_rt, 9.62628e-03_rt, 1.25501e-02_rt, + 1.61089e-02_rt, 2.03818e-02_rt, 2.54473e-02_rt, 3.13823e-02_rt, + 3.82604e-02_rt, 4.61506e-02_rt, 5.51159e-02_rt, 6.52122e-02_rt, + 7.64871e-02_rt, 8.89788e-02_rt, 1.02716e-01_rt, 1.17715e-01_rt, + 1.33982e-01_rt, 1.51513e-01_rt, 1.70289e-01_rt, 1.90281e-01_rt, + 2.11449e-01_rt, 2.33740e-01_rt, 2.57091e-01_rt, 2.81428e-01_rt, + 3.06668e-01_rt, 3.32719e-01_rt, 3.59480e-01_rt, 3.86844e-01_rt, + 4.14698e-01_rt, 4.42924e-01_rt, 4.71399e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.44533e-114_rt, 2.04002e-57_rt, 2.92203e-38_rt, + 1.24009e-28_rt, 7.91692e-23_rt, 6.11998e-19_rt, 3.77057e-16_rt, + 4.75895e-14_rt, 2.08099e-12_rt, 4.32387e-11_rt, 5.22135e-10_rt, + 4.19201e-09_rt, 2.45648e-08_rt, 1.12319e-07_rt, 4.20867e-07_rt, + 1.34091e-06_rt, 3.73661e-06_rt, 9.30974e-06_rt, 2.11026e-05_rt, + 4.41295e-05_rt, 8.61053e-05_rt, 1.58221e-04_rt, 2.75907e-04_rt, + 4.59522e-04_rt, 7.34912e-04_rt, 1.13379e-03_rt, 1.69391e-03_rt, + 2.45902e-03_rt, 3.47858e-03_rt, 4.80725e-03_rt, 6.50424e-03_rt, + 8.63244e-03_rt, 1.12574e-02_rt, 1.44465e-02_rt, 1.82673e-02_rt, + 2.27868e-02_rt, 2.80705e-02_rt, 3.41806e-02_rt, 4.11754e-02_rt, + 4.91083e-02_rt, 5.80271e-02_rt, 6.79724e-02_rt, 7.89781e-02_rt, + 9.10699e-02_rt, 1.04265e-01_rt, 1.18573e-01_rt, 1.33994e-01_rt, + 1.50518e-01_rt, 1.68128e-01_rt, 1.86798e-01_rt, 2.06493e-01_rt, + 2.27168e-01_rt, 2.48773e-01_rt, 2.71249e-01_rt, 2.94530e-01_rt, + 3.18543e-01_rt, 3.43210e-01_rt, 3.68448e-01_rt, 3.94169e-01_rt, + 4.20281e-01_rt, 4.46688e-01_rt, 4.73294e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.79517e-99_rt, 4.91237e-50_rt, 1.89220e-33_rt, + 4.16777e-25_rt, 4.51239e-20_rt, 1.06937e-16_rt, 2.83302e-14_rt, + 1.89962e-12_rt, 5.08130e-11_rt, 7.12850e-10_rt, 6.24477e-09_rt, + 3.83849e-08_rt, 1.79496e-07_rt, 6.76626e-07_rt, 2.14545e-06_rt, + 5.90819e-06_rt, 1.44810e-05_rt, 3.21995e-05_rt, 6.59426e-05_rt, + 1.25896e-04_rt, 2.26284e-04_rt, 3.86005e-04_rt, 6.29103e-04_rt, + 9.85056e-04_rt, 1.48883e-03_rt, 2.18072e-03_rt, 3.10596e-03_rt, + 4.31421e-03_rt, 5.85876e-03_rt, 7.79575e-03_rt, 1.01832e-02_rt, + 1.30801e-02_rt, 1.65454e-02_rt, 2.06369e-02_rt, 2.54106e-02_rt, + 3.09194e-02_rt, 3.72129e-02_rt, 4.43359e-02_rt, 5.23287e-02_rt, + 6.12256e-02_rt, 7.10552e-02_rt, 8.18396e-02_rt, 9.35946e-02_rt, + 1.06329e-01_rt, 1.20045e-01_rt, 1.34737e-01_rt, 1.50394e-01_rt, + 1.66999e-01_rt, 1.84525e-01_rt, 2.02942e-01_rt, 2.22214e-01_rt, + 2.42297e-01_rt, 2.63144e-01_rt, 2.84700e-01_rt, 3.06910e-01_rt, + 3.29711e-01_rt, 3.53037e-01_rt, 3.76820e-01_rt, 4.00988e-01_rt, + 4.25466e-01_rt, 4.50180e-01_rt, 4.75050e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.99614e-86_rt, 1.18517e-43_rt, 2.74527e-29_rt, + 4.69191e-22_rt, 1.09641e-17_rt, 9.35339e-15_rt, 1.19488e-12_rt, + 4.63800e-11_rt, 8.11222e-10_rt, 8.10414e-09_rt, 5.37917e-08_rt, + 2.62460e-07_rt, 1.00976e-06_rt, 3.22103e-06_rt, 8.83961e-06_rt, + 2.14581e-05_rt, 4.70665e-05_rt, 9.48423e-05_rt, 1.77895e-04_rt, + 3.13887e-04_rt, 5.25459e-04_rt, 8.40437e-04_rt, 1.29179e-03_rt, + 1.91736e-03_rt, 2.75939e-03_rt, 3.86386e-03_rt, 5.27975e-03_rt, + 7.05813e-03_rt, 9.25132e-03_rt, 1.19119e-02_rt, 1.50919e-02_rt, + 1.88418e-02_rt, 2.32102e-02_rt, 2.82423e-02_rt, 3.39802e-02_rt, + 4.04618e-02_rt, 4.77204e-02_rt, 5.57847e-02_rt, 6.46781e-02_rt, + 7.44188e-02_rt, 8.50196e-02_rt, 9.64880e-02_rt, 1.08826e-01_rt, + 1.22030e-01_rt, 1.36091e-01_rt, 1.50996e-01_rt, 1.66726e-01_rt, + 1.83257e-01_rt, 2.00562e-01_rt, 2.18609e-01_rt, 2.37361e-01_rt, + 2.56778e-01_rt, 2.76817e-01_rt, 2.97432e-01_rt, 3.18573e-01_rt, + 3.40189e-01_rt, 3.62224e-01_rt, 3.84623e-01_rt, 4.07328e-01_rt, + 4.30279e-01_rt, 4.53416e-01_rt, 4.76677e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 3.77431e-75_rt, 3.91782e-38_rt, 1.09378e-25_rt, + 2.05310e-19_rt, 1.27532e-15_rt, 4.49930e-13_rt, 3.06002e-11_rt, + 7.40487e-10_rt, 8.97080e-09_rt, 6.68206e-08_rt, 3.48911e-07_rt, + 1.39420e-06_rt, 4.53089e-06_rt, 1.25092e-05_rt, 3.02964e-05_rt, + 6.59394e-05_rt, 1.31379e-04_rt, 2.43107e-04_rt, 4.22591e-04_rt, + 6.96427e-04_rt, 1.09621e-03_rt, 1.65813e-03_rt, 2.42244e-03_rt, + 3.43262e-03_rt, 4.73461e-03_rt, 6.37581e-03_rt, 8.40429e-03_rt, + 1.08678e-02_rt, 1.38130e-02_rt, 1.72847e-02_rt, 2.13252e-02_rt, + 2.59738e-02_rt, 3.12662e-02_rt, 3.72342e-02_rt, 4.39056e-02_rt, + 5.13035e-02_rt, 5.94468e-02_rt, 6.83497e-02_rt, 7.80219e-02_rt, + 8.84686e-02_rt, 9.96904e-02_rt, 1.11684e-01_rt, 1.24442e-01_rt, + 1.37952e-01_rt, 1.52199e-01_rt, 1.67164e-01_rt, 1.82824e-01_rt, + 1.99155e-01_rt, 2.16128e-01_rt, 2.33711e-01_rt, 2.51871e-01_rt, + 2.70572e-01_rt, 2.89776e-01_rt, 3.09443e-01_rt, 3.29532e-01_rt, + 3.49998e-01_rt, 3.70799e-01_rt, 3.91888e-01_rt, 4.13218e-01_rt, + 4.34743e-01_rt, 4.56414e-01_rt, 4.78182e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 2.11236e-65_rt, 2.32556e-33_rt, 1.42680e-22_rt, + 3.97114e-17_rt, 7.84976e-14_rt, 1.29110e-11_rt, 5.09207e-10_rt, + 8.19002e-09_rt, 7.22268e-08_rt, 4.17383e-07_rt, 1.77099e-06_rt, + 5.95385e-06_rt, 1.67202e-05_rt, 4.07382e-05_rt, 8.85495e-05_rt, + 1.75349e-04_rt, 3.21469e-04_rt, 5.52521e-04_rt, 8.99188e-04_rt, + 1.39672e-03_rt, 2.08420e-03_rt, 3.00366e-03_rt, 4.19911e-03_rt, + 5.71555e-03_rt, 7.59803e-03_rt, 9.89077e-03_rt, 1.26364e-02_rt, + 1.58752e-02_rt, 1.96447e-02_rt, 2.39791e-02_rt, 2.89089e-02_rt, + 3.44608e-02_rt, 4.06575e-02_rt, 4.75177e-02_rt, 5.50559e-02_rt, + 6.32824e-02_rt, 7.22038e-02_rt, 8.18227e-02_rt, 9.21382e-02_rt, + 1.03146e-01_rt, 1.14838e-01_rt, 1.27203e-01_rt, 1.40227e-01_rt, + 1.53895e-01_rt, 1.68186e-01_rt, 1.83080e-01_rt, 1.98553e-01_rt, + 2.14580e-01_rt, 2.31133e-01_rt, 2.48184e-01_rt, 2.65702e-01_rt, + 2.83656e-01_rt, 3.02014e-01_rt, 3.20741e-01_rt, 3.39803e-01_rt, + 3.59165e-01_rt, 3.78790e-01_rt, 3.98643e-01_rt, 4.18685e-01_rt, + 4.38880e-01_rt, 4.59190e-01_rt, 4.79576e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 5.64885e-57_rt, 3.13115e-29_rt, 7.09352e-20_rt, + 3.79397e-15_rt, 2.78788e-12_rt, 2.37089e-10_rt, 5.83808e-09_rt, + 6.59592e-08_rt, 4.42016e-07_rt, 2.05080e-06_rt, 7.27176e-06_rt, + 2.10524e-05_rt, 5.21029e-05_rt, 1.13928e-04_rt, 2.25496e-04_rt, + 4.11446e-04_rt, 7.01839e-04_rt, 1.13153e-03_rt, 1.73923e-03_rt, + 2.56646e-03_rt, 3.65640e-03_rt, 5.05278e-03_rt, 6.79885e-03_rt, + 8.93646e-03_rt, 1.15053e-02_rt, 1.45424e-02_rt, 1.80813e-02_rt, + 2.21521e-02_rt, 2.67812e-02_rt, 3.19909e-02_rt, 3.77995e-02_rt, + 4.42216e-02_rt, 5.12676e-02_rt, 5.89446e-02_rt, 6.72559e-02_rt, + 7.62016e-02_rt, 8.57786e-02_rt, 9.59811e-02_rt, 1.06800e-01_rt, + 1.18225e-01_rt, 1.30242e-01_rt, 1.42837e-01_rt, 1.55990e-01_rt, + 1.69685e-01_rt, 1.83900e-01_rt, 1.98614e-01_rt, 2.13804e-01_rt, + 2.29445e-01_rt, 2.45513e-01_rt, 2.61983e-01_rt, 2.78828e-01_rt, + 2.96021e-01_rt, 3.13534e-01_rt, 3.31340e-01_rt, 3.49410e-01_rt, + 3.67716e-01_rt, 3.86228e-01_rt, 4.04918e-01_rt, 4.23756e-01_rt, + 4.42713e-01_rt, 4.61759e-01_rt, 4.80865e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.09171e-49_rt, 1.17015e-25_rt, 1.53257e-17_rt, + 1.97065e-13_rt, 6.15660e-11_rt, 2.96033e-09_rt, 4.85087e-08_rt, + 4.03814e-07_rt, 2.13401e-06_rt, 8.18820e-06_rt, 2.48564e-05_rt, + 6.32274e-05_rt, 1.40265e-04_rt, 2.79269e-04_rt, 5.09674e-04_rt, + 8.66300e-04_rt, 1.38820e-03_rt, 2.11734e-03_rt, 3.09715e-03_rt, + 4.37128e-03_rt, 5.98236e-03_rt, 7.97107e-03_rt, 1.03753e-02_rt, + 1.32296e-02_rt, 1.65649e-02_rt, 2.04079e-02_rt, 2.47814e-02_rt, + 2.97039e-02_rt, 3.51902e-02_rt, 4.12509e-02_rt, 4.78932e-02_rt, + 5.51205e-02_rt, 6.29333e-02_rt, 7.13291e-02_rt, 8.03025e-02_rt, + 8.98461e-02_rt, 9.99498e-02_rt, 1.10602e-01_rt, 1.21789e-01_rt, + 1.33495e-01_rt, 1.45705e-01_rt, 1.58401e-01_rt, 1.71564e-01_rt, + 1.85175e-01_rt, 1.99214e-01_rt, 2.13660e-01_rt, 2.28491e-01_rt, + 2.43687e-01_rt, 2.59225e-01_rt, 2.75082e-01_rt, 2.91238e-01_rt, + 3.07668e-01_rt, 3.24350e-01_rt, 3.41261e-01_rt, 3.58379e-01_rt, + 3.75680e-01_rt, 3.93142e-01_rt, 4.10742e-01_rt, 4.28456e-01_rt, + 4.46262e-01_rt, 4.64136e-01_rt, 4.82057e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 2.17999e-43_rt, 1.44503e-22_rt, 1.61168e-15_rt, + 6.04581e-12_rt, 9.01779e-10_rt, 2.64847e-08_rt, 3.05151e-07_rt, + 1.95048e-06_rt, 8.39295e-06_rt, 2.73221e-05_rt, 7.25035e-05_rt, + 1.64880e-04_rt, 3.32701e-04_rt, 6.10751e-04_rt, 1.03895e-03_rt, + 1.66060e-03_rt, 2.52064e-03_rt, 3.66392e-03_rt, 5.13381e-03_rt, + 6.97107e-03_rt, 9.21300e-03_rt, 1.18928e-02_rt, 1.50395e-02_rt, + 1.86772e-02_rt, 2.28260e-02_rt, 2.75012e-02_rt, 3.27141e-02_rt, + 3.84722e-02_rt, 4.47790e-02_rt, 5.16352e-02_rt, 5.90381e-02_rt, + 6.69827e-02_rt, 7.54613e-02_rt, 8.44644e-02_rt, 9.39806e-02_rt, + 1.03997e-01_rt, 1.14500e-01_rt, 1.25473e-01_rt, 1.36901e-01_rt, + 1.48766e-01_rt, 1.61051e-01_rt, 1.73738e-01_rt, 1.86809e-01_rt, + 2.00245e-01_rt, 2.14027e-01_rt, 2.28137e-01_rt, 2.42554e-01_rt, + 2.57261e-01_rt, 2.72239e-01_rt, 2.87468e-01_rt, 3.02930e-01_rt, + 3.18607e-01_rt, 3.34479e-01_rt, 3.50529e-01_rt, 3.66738e-01_rt, + 3.83088e-01_rt, 3.99562e-01_rt, 4.16141e-01_rt, 4.32808e-01_rt, + 4.49545e-01_rt, 4.66334e-01_rt, 4.83158e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 6.12543e-38_rt, 6.85566e-20_rt, 9.09852e-14_rt, + 1.17683e-10_rt, 9.26345e-09_rt, 1.77633e-07_rt, 1.50917e-06_rt, + 7.67527e-06_rt, 2.76457e-05_rt, 7.80584e-05_rt, 1.84367e-04_rt, + 3.80484e-04_rt, 7.07218e-04_rt, 1.21002e-03_rt, 1.93657e-03_rt, + 2.93453e-03_rt, 4.24963e-03_rt, 5.92428e-03_rt, 7.99658e-03_rt, + 1.04997e-02_rt, 1.34615e-02_rt, 1.69048e-02_rt, 2.08471e-02_rt, + 2.53013e-02_rt, 3.02755e-02_rt, 3.57742e-02_rt, 4.17979e-02_rt, + 4.83441e-02_rt, 5.54072e-02_rt, 6.29794e-02_rt, 7.10509e-02_rt, + 7.96100e-02_rt, 8.86436e-02_rt, 9.81373e-02_rt, 1.08076e-01_rt, + 1.18444e-01_rt, 1.29224e-01_rt, 1.40401e-01_rt, 1.51955e-01_rt, + 1.63871e-01_rt, 1.76131e-01_rt, 1.88717e-01_rt, 2.01613e-01_rt, + 2.14801e-01_rt, 2.28264e-01_rt, 2.41986e-01_rt, 2.55951e-01_rt, + 2.70141e-01_rt, 2.84543e-01_rt, 2.99139e-01_rt, 3.13914e-01_rt, + 3.28855e-01_rt, 3.43945e-01_rt, 3.59170e-01_rt, 3.74517e-01_rt, + 3.89970e-01_rt, 4.05517e-01_rt, 4.21143e-01_rt, 4.36836e-01_rt, + 4.52581e-01_rt, 4.68365e-01_rt, 4.84176e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 3.16256e-33_rt, 1.42325e-17_rt, 3.00080e-12_rt, + 1.54610e-09_rt, 7.00286e-08_rt, 9.28729e-07_rt, 6.06220e-06_rt, + 2.52969e-05_rt, 7.81137e-05_rt, 1.94977e-04_rt, 4.16312e-04_rt, + 7.89827e-04_rt, 1.36715e-03_rt, 2.20057e-03_rt, 3.34031e-03_rt, + 4.83252e-03_rt, 6.71797e-03_rt, 9.03129e-03_rt, 1.18008e-02_rt, + 1.50485e-02_rt, 1.87904e-02_rt, 2.30372e-02_rt, 2.77946e-02_rt, + 3.30639e-02_rt, 3.88427e-02_rt, 4.51252e-02_rt, 5.19032e-02_rt, + 5.91659e-02_rt, 6.69010e-02_rt, 7.50945e-02_rt, 8.37314e-02_rt, + 9.27957e-02_rt, 1.02271e-01_rt, 1.12140e-01_rt, 1.22387e-01_rt, + 1.32993e-01_rt, 1.43941e-01_rt, 1.55215e-01_rt, 1.66797e-01_rt, + 1.78671e-01_rt, 1.90822e-01_rt, 2.03232e-01_rt, 2.15886e-01_rt, + 2.28770e-01_rt, 2.41869e-01_rt, 2.55168e-01_rt, 2.68655e-01_rt, + 2.82314e-01_rt, 2.96134e-01_rt, 3.10102e-01_rt, 3.24206e-01_rt, + 3.38434e-01_rt, 3.52773e-01_rt, 3.67214e-01_rt, 3.81745e-01_rt, + 3.96356e-01_rt, 4.11036e-01_rt, 4.25774e-01_rt, 4.40561e-01_rt, + 4.55387e-01_rt, 4.70242e-01_rt, 4.85116e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 3.77813e-29_rt, 1.44680e-15_rt, 6.22031e-11_rt, + 1.44615e-08_rt, 4.06135e-07_rt, 3.91507e-06_rt, 2.03425e-05_rt, + 7.15233e-05_rt, 1.93276e-04_rt, 4.33552e-04_rt, 8.48163e-04_rt, + 1.49588e-03_rt, 2.43410e-03_rt, 3.71562e-03_rt, 5.38660e-03_rt, + 7.48549e-03_rt, 1.00427e-02_rt, 1.30811e-02_rt, 1.66160e-02_rt, + 2.06565e-02_rt, 2.52060e-02_rt, 3.02631e-02_rt, 3.58223e-02_rt, + 4.18747e-02_rt, 4.84089e-02_rt, 5.54111e-02_rt, 6.28663e-02_rt, + 7.07580e-02_rt, 7.90688e-02_rt, 8.77809e-02_rt, 9.68763e-02_rt, + 1.06337e-01_rt, 1.16144e-01_rt, 1.26280e-01_rt, 1.36728e-01_rt, + 1.47470e-01_rt, 1.58490e-01_rt, 1.69771e-01_rt, 1.81297e-01_rt, + 1.93054e-01_rt, 2.05027e-01_rt, 2.17202e-01_rt, 2.29565e-01_rt, + 2.42104e-01_rt, 2.54806e-01_rt, 2.67660e-01_rt, 2.80655e-01_rt, + 2.93779e-01_rt, 3.07022e-01_rt, 3.20374e-01_rt, 3.33826e-01_rt, + 3.47369e-01_rt, 3.60993e-01_rt, 3.74691e-01_rt, 3.88454e-01_rt, + 4.02275e-01_rt, 4.16145e-01_rt, 4.30057e-01_rt, 4.44004e-01_rt, + 4.57979e-01_rt, 4.71975e-01_rt, 4.85984e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.27452e-25_rt, 7.93605e-14_rt, 8.63184e-10_rt, + 1.00847e-07_rt, 1.87306e-06_rt, 1.36999e-05_rt, 5.84249e-05_rt, + 1.77091e-04_rt, 4.26306e-04_rt, 8.71675e-04_rt, 1.58062e-03_rt, + 2.61657e-03_rt, 4.03518e-03_rt, 5.88232e-03_rt, 8.19354e-03_rt, + 1.09944e-02_rt, 1.43012e-02_rt, 1.81224e-02_rt, 2.24595e-02_rt, + 2.73084e-02_rt, 3.26606e-02_rt, 3.85039e-02_rt, 4.48233e-02_rt, + 5.16019e-02_rt, 5.88213e-02_rt, 6.64621e-02_rt, 7.45046e-02_rt, + 8.29285e-02_rt, 9.17139e-02_rt, 1.00841e-01_rt, 1.10290e-01_rt, + 1.20043e-01_rt, 1.30080e-01_rt, 1.40385e-01_rt, 1.50940e-01_rt, + 1.61729e-01_rt, 1.72737e-01_rt, 1.83949e-01_rt, 1.95351e-01_rt, + 2.06930e-01_rt, 2.18673e-01_rt, 2.30567e-01_rt, 2.42603e-01_rt, + 2.54769e-01_rt, 2.67055e-01_rt, 2.79452e-01_rt, 2.91951e-01_rt, + 3.04543e-01_rt, 3.17220e-01_rt, 3.29974e-01_rt, 3.42800e-01_rt, + 3.55688e-01_rt, 3.68635e-01_rt, 3.81632e-01_rt, 3.94674e-01_rt, + 4.07756e-01_rt, 4.20872e-01_rt, 4.34016e-01_rt, 4.47185e-01_rt, + 4.60372e-01_rt, 4.73574e-01_rt, 4.86785e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.44202e-22_rt, 2.55451e-12_rt, 8.46798e-09_rt, + 5.45600e-07_rt, 7.08563e-06_rt, 4.08072e-05_rt, 1.46658e-04_rt, + 3.90884e-04_rt, 8.51202e-04_rt, 1.60605e-03_rt, 2.72653e-03_rt, + 4.27184e-03_rt, 6.28755e-03_rt, 8.80575e-03_rt, 1.18463e-02_rt, + 1.54184e-02_rt, 1.95227e-02_rt, 2.41527e-02_rt, 2.92967e-02_rt, + 3.49387e-02_rt, 4.10601e-02_rt, 4.76399e-02_rt, 5.46561e-02_rt, + 6.20859e-02_rt, 6.99065e-02_rt, 7.80948e-02_rt, 8.66286e-02_rt, + 9.54859e-02_rt, 1.04646e-01_rt, 1.14088e-01_rt, 1.23792e-01_rt, + 1.33741e-01_rt, 1.43918e-01_rt, 1.54304e-01_rt, 1.64885e-01_rt, + 1.75647e-01_rt, 1.86575e-01_rt, 1.97657e-01_rt, 2.08880e-01_rt, + 2.20233e-01_rt, 2.31706e-01_rt, 2.43289e-01_rt, 2.54973e-01_rt, + 2.66748e-01_rt, 2.78608e-01_rt, 2.90545e-01_rt, 3.02551e-01_rt, + 3.14621e-01_rt, 3.26749e-01_rt, 3.38928e-01_rt, 3.51154e-01_rt, + 3.63422e-01_rt, 3.75728e-01_rt, 3.88066e-01_rt, 4.00434e-01_rt, + 4.12826e-01_rt, 4.25241e-01_rt, 4.37673e-01_rt, 4.50121e-01_rt, + 4.62580e-01_rt, 4.75049e-01_rt, 4.87523e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 6.34899e-20_rt, 5.18780e-11_rt, 6.15571e-08_rt, + 2.37013e-06_rt, 2.25825e-05_rt, 1.05734e-04_rt, 3.27625e-04_rt, + 7.81043e-04_rt, 1.55910e-03_rt, 2.74338e-03_rt, 4.39812e-03_rt, + 6.56886e-03_rt, 9.28382e-03_rt, 1.25563e-02_rt, 1.63876e-02_rt, + 2.07697e-02_rt, 2.56876e-02_rt, 3.11213e-02_rt, 3.70476e-02_rt, + 4.34410e-02_rt, 5.02751e-02_rt, 5.75228e-02_rt, 6.51575e-02_rt, + 7.31527e-02_rt, 8.14833e-02_rt, 9.01246e-02_rt, 9.90536e-02_rt, + 1.08248e-01_rt, 1.17687e-01_rt, 1.27352e-01_rt, 1.37223e-01_rt, + 1.47284e-01_rt, 1.57520e-01_rt, 1.67914e-01_rt, 1.78453e-01_rt, + 1.89125e-01_rt, 1.99918e-01_rt, 2.10821e-01_rt, 2.21824e-01_rt, + 2.32917e-01_rt, 2.44093e-01_rt, 2.55342e-01_rt, 2.66659e-01_rt, + 2.78036e-01_rt, 2.89468e-01_rt, 3.00948e-01_rt, 3.12472e-01_rt, + 3.24035e-01_rt, 3.35634e-01_rt, 3.47263e-01_rt, 3.58920e-01_rt, + 3.70601e-01_rt, 3.82304e-01_rt, 3.94025e-01_rt, 4.05762e-01_rt, + 4.17513e-01_rt, 4.29276e-01_rt, 4.41049e-01_rt, 4.52830e-01_rt, + 4.64617e-01_rt, 4.76409e-01_rt, 4.88204e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.23682e-17_rt, 7.07629e-10_rt, 3.45337e-07_rt, + 8.51604e-06_rt, 6.20521e-05_rt, 2.42815e-04_rt, 6.61580e-04_rt, + 1.43165e-03_rt, 2.64983e-03_rt, 4.38816e-03_rt, 6.69315e-03_rt, + 9.58883e-03_rt, 1.30811e-02_rt, 1.71623e-02_rt, 2.18148e-02_rt, + 2.70141e-02_rt, 3.27317e-02_rt, 3.89366e-02_rt, 4.55966e-02_rt, + 5.26795e-02_rt, 6.01537e-02_rt, 6.79886e-02_rt, 7.61550e-02_rt, + 8.46252e-02_rt, 9.33733e-02_rt, 1.02375e-01_rt, 1.11607e-01_rt, + 1.21049e-01_rt, 1.30681e-01_rt, 1.40485e-01_rt, 1.50445e-01_rt, + 1.60546e-01_rt, 1.70773e-01_rt, 1.81113e-01_rt, 1.91555e-01_rt, + 2.02089e-01_rt, 2.12704e-01_rt, 2.23391e-01_rt, 2.34143e-01_rt, + 2.44952e-01_rt, 2.55812e-01_rt, 2.66716e-01_rt, 2.77660e-01_rt, + 2.88637e-01_rt, 2.99645e-01_rt, 3.10678e-01_rt, 3.21734e-01_rt, + 3.32810e-01_rt, 3.43902e-01_rt, 3.55008e-01_rt, 3.66127e-01_rt, + 3.77255e-01_rt, 3.88392e-01_rt, 3.99537e-01_rt, 4.10687e-01_rt, + 4.21842e-01_rt, 4.33001e-01_rt, 4.44163e-01_rt, 4.55328e-01_rt, + 4.66494e-01_rt, 4.77662e-01_rt, 4.88831e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.19109e-15_rt, 6.84291e-09_rt, 1.54848e-06_rt, + 2.59650e-05_rt, 1.49964e-04_rt, 5.02268e-04_rt, 1.22395e-03_rt, + 2.43500e-03_rt, 4.22038e-03_rt, 6.62970e-03_rt, 9.68294e-03_rt, + 1.33777e-02_rt, 1.76958e-02_rt, 2.26088e-02_rt, 2.80820e-02_rt, + 3.40772e-02_rt, 4.05551e-02_rt, 4.74768e-02_rt, 5.48042e-02_rt, + 6.25010e-02_rt, 7.05331e-02_rt, 7.88685e-02_rt, 8.74775e-02_rt, + 9.63328e-02_rt, 1.05409e-01_rt, 1.14683e-01_rt, 1.24134e-01_rt, + 1.33743e-01_rt, 1.43491e-01_rt, 1.53363e-01_rt, 1.63345e-01_rt, + 1.73424e-01_rt, 1.83587e-01_rt, 1.93824e-01_rt, 2.04125e-01_rt, + 2.14482e-01_rt, 2.24887e-01_rt, 2.35333e-01_rt, 2.45813e-01_rt, + 2.56323e-01_rt, 2.66857e-01_rt, 2.77411e-01_rt, 2.87981e-01_rt, + 2.98564e-01_rt, 3.09157e-01_rt, 3.19757e-01_rt, 3.30363e-01_rt, + 3.40972e-01_rt, 3.51582e-01_rt, 3.62194e-01_rt, 3.72805e-01_rt, + 3.83415e-01_rt, 3.94024e-01_rt, 4.04631e-01_rt, 4.15235e-01_rt, + 4.25837e-01_rt, 4.36437e-01_rt, 4.47034e-01_rt, 4.57630e-01_rt, + 4.68224e-01_rt, 4.78817e-01_rt, 4.89409e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 6.24054e-14_rt, 4.91529e-08_rt, 5.72022e-06_rt, + 6.86778e-05_rt, 3.24283e-04_rt, 9.48942e-04_rt, 2.09875e-03_rt, + 3.88104e-03_rt, 6.35297e-03_rt, 9.53137e-03_rt, 1.34045e-02_rt, + 1.79422e-02_rt, 2.31033e-02_rt, 2.88412e-02_rt, 3.51073e-02_rt, + 4.18532e-02_rt, 4.90324e-02_rt, 5.66011e-02_rt, 6.45182e-02_rt, + 7.27460e-02_rt, 8.12500e-02_rt, 8.99985e-02_rt, 9.89631e-02_rt, + 1.08118e-01_rt, 1.17439e-01_rt, 1.26907e-01_rt, 1.36501e-01_rt, + 1.46205e-01_rt, 1.56004e-01_rt, 1.65883e-01_rt, 1.75832e-01_rt, + 1.85839e-01_rt, 1.95894e-01_rt, 2.05989e-01_rt, 2.16116e-01_rt, + 2.26268e-01_rt, 2.36440e-01_rt, 2.46627e-01_rt, 2.56824e-01_rt, + 2.67026e-01_rt, 2.77231e-01_rt, 2.87436e-01_rt, 2.97638e-01_rt, + 3.07836e-01_rt, 3.18027e-01_rt, 3.28210e-01_rt, 3.38385e-01_rt, + 3.48550e-01_rt, 3.58706e-01_rt, 3.68851e-01_rt, 3.78987e-01_rt, + 3.89112e-01_rt, 3.99228e-01_rt, 4.09334e-01_rt, 4.19431e-01_rt, + 4.29521e-01_rt, 4.39603e-01_rt, 4.49680e-01_rt, 4.59750e-01_rt, + 4.69817e-01_rt, 4.79880e-01_rt, 4.89940e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.93231e-12_rt, 2.73037e-07_rt, 1.78694e-05_rt, + 1.60620e-04_rt, 6.36814e-04_rt, 1.65732e-03_rt, 3.36918e-03_rt, + 5.84631e-03_rt, 9.10512e-03_rt, 1.31238e-02_rt, 1.78577e-02_rt, + 2.32510e-02_rt, 2.92429e-02_rt, 3.57726e-02_rt, 4.27817e-02_rt, + 5.02155e-02_rt, 5.80236e-02_rt, 6.61603e-02_rt, 7.45842e-02_rt, + 8.32580e-02_rt, 9.21486e-02_rt, 1.01226e-01_rt, 1.10465e-01_rt, + 1.19840e-01_rt, 1.29333e-01_rt, 1.38923e-01_rt, 1.48595e-01_rt, + 1.58334e-01_rt, 1.68127e-01_rt, 1.77965e-01_rt, 1.87835e-01_rt, + 1.97731e-01_rt, 2.07644e-01_rt, 2.17567e-01_rt, 2.27496e-01_rt, + 2.37425e-01_rt, 2.47350e-01_rt, 2.57267e-01_rt, 2.67173e-01_rt, + 2.77067e-01_rt, 2.86945e-01_rt, 2.96806e-01_rt, 3.06650e-01_rt, + 3.16474e-01_rt, 3.26280e-01_rt, 3.36065e-01_rt, 3.45830e-01_rt, + 3.55576e-01_rt, 3.65303e-01_rt, 3.75011e-01_rt, 3.84701e-01_rt, + 3.94374e-01_rt, 4.04031e-01_rt, 4.13672e-01_rt, 4.23300e-01_rt, + 4.32916e-01_rt, 4.42520e-01_rt, 4.52115e-01_rt, 4.61702e-01_rt, + 4.71282e-01_rt, 4.80858e-01_rt, 4.90430e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 3.79786e-11_rt, 1.21439e-06_rt, 4.82824e-05_rt, + 3.37662e-04_rt, 1.15028e-03_rt, 2.70359e-03_rt, 5.10744e-03_rt, + 8.38478e-03_rt, 1.25037e-02_rt, 1.74026e-02_rt, 2.30071e-02_rt, + 2.92397e-02_rt, 3.60251e-02_rt, 4.32929e-02_rt, 5.09793e-02_rt, + 5.90267e-02_rt, 6.73840e-02_rt, 7.60060e-02_rt, 8.48530e-02_rt, + 9.38900e-02_rt, 1.03086e-01_rt, 1.12415e-01_rt, 1.21853e-01_rt, + 1.31380e-01_rt, 1.40978e-01_rt, 1.50630e-01_rt, 1.60324e-01_rt, + 1.70049e-01_rt, 1.79792e-01_rt, 1.89547e-01_rt, 1.99304e-01_rt, + 2.09058e-01_rt, 2.18804e-01_rt, 2.28535e-01_rt, 2.38249e-01_rt, + 2.47942e-01_rt, 2.57611e-01_rt, 2.67255e-01_rt, 2.76871e-01_rt, + 2.86458e-01_rt, 2.96015e-01_rt, 3.05543e-01_rt, 3.15040e-01_rt, + 3.24507e-01_rt, 3.33944e-01_rt, 3.43351e-01_rt, 3.52730e-01_rt, + 3.62080e-01_rt, 3.71405e-01_rt, 3.80703e-01_rt, 3.89978e-01_rt, + 3.99229e-01_rt, 4.08460e-01_rt, 4.17671e-01_rt, 4.26864e-01_rt, + 4.36042e-01_rt, 4.45205e-01_rt, 4.54356e-01_rt, 4.63498e-01_rt, + 4.72630e-01_rt, 4.81757e-01_rt, 4.90880e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 5.03976e-10_rt, 4.45642e-06_rt, 1.15052e-04_rt, + 6.47172e-04_rt, 1.93239e-03_rt, 4.15645e-03_rt, 7.36609e-03_rt, + 1.15221e-02_rt, 1.65428e-02_rt, 2.23308e-02_rt, 2.87872e-02_rt, + 3.58187e-02_rt, 4.33409e-02_rt, 5.12788e-02_rt, 5.95667e-02_rt, + 6.81476e-02_rt, 7.69720e-02_rt, 8.59975e-02_rt, 9.51872e-02_rt, + 1.04510e-01_rt, 1.13938e-01_rt, 1.23448e-01_rt, 1.33020e-01_rt, + 1.42637e-01_rt, 1.52284e-01_rt, 1.61949e-01_rt, 1.71620e-01_rt, + 1.81288e-01_rt, 1.90946e-01_rt, 2.00586e-01_rt, 2.10205e-01_rt, + 2.19795e-01_rt, 2.29355e-01_rt, 2.38881e-01_rt, 2.48370e-01_rt, + 2.57821e-01_rt, 2.67232e-01_rt, 2.76602e-01_rt, 2.85931e-01_rt, + 2.95219e-01_rt, 3.04465e-01_rt, 3.13670e-01_rt, 3.22835e-01_rt, + 3.31961e-01_rt, 3.41048e-01_rt, 3.50099e-01_rt, 3.59113e-01_rt, + 3.68093e-01_rt, 3.77041e-01_rt, 3.85957e-01_rt, 3.94845e-01_rt, + 4.03706e-01_rt, 4.12541e-01_rt, 4.21354e-01_rt, 4.30145e-01_rt, + 4.38918e-01_rt, 4.47675e-01_rt, 4.56418e-01_rt, 4.65148e-01_rt, + 4.73870e-01_rt, 4.82584e-01_rt, 4.91293e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 4.76242e-09_rt, 1.38470e-05_rt, 2.45877e-04_rt, + 1.14480e-03_rt, 3.04803e-03_rt, 6.06887e-03_rt, 1.01723e-02_rt, + 1.52539e-02_rt, 2.11867e-02_rt, 2.78440e-02_rt, 3.51097e-02_rt, + 4.28814e-02_rt, 5.10706e-02_rt, 5.96018e-02_rt, 6.84111e-02_rt, + 7.74442e-02_rt, 8.66556e-02_rt, 9.60064e-02_rt, 1.05464e-01_rt, + 1.15002e-01_rt, 1.24595e-01_rt, 1.34225e-01_rt, 1.43875e-01_rt, + 1.53531e-01_rt, 1.63181e-01_rt, 1.72816e-01_rt, 1.82427e-01_rt, + 1.92008e-01_rt, 2.01552e-01_rt, 2.11056e-01_rt, 2.20516e-01_rt, + 2.29928e-01_rt, 2.39291e-01_rt, 2.48603e-01_rt, 2.57862e-01_rt, + 2.67069e-01_rt, 2.76224e-01_rt, 2.85325e-01_rt, 2.94374e-01_rt, + 3.03372e-01_rt, 3.12318e-01_rt, 3.21215e-01_rt, 3.30064e-01_rt, + 3.38867e-01_rt, 3.47624e-01_rt, 3.56338e-01_rt, 3.65011e-01_rt, + 3.73644e-01_rt, 3.82241e-01_rt, 3.90802e-01_rt, 3.99330e-01_rt, + 4.07828e-01_rt, 4.16298e-01_rt, 4.24742e-01_rt, 4.33163e-01_rt, + 4.41564e-01_rt, 4.49946e-01_rt, 4.58312e-01_rt, 4.66665e-01_rt, + 4.75008e-01_rt, 4.83343e-01_rt, 4.91673e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 3.35560e-08_rt, 3.72534e-05_rt, 4.78125e-04_rt, + 1.88884e-03_rt, 4.55138e-03_rt, 8.47206e-03_rt, 1.35259e-02_rt, + 1.95478e-02_rt, 2.63739e-02_rt, 3.38573e-02_rt, 4.18721e-02_rt, + 5.03127e-02_rt, 5.90915e-02_rt, 6.81360e-02_rt, 7.73863e-02_rt, + 8.67932e-02_rt, 9.63157e-02_rt, 1.05920e-01_rt, 1.15579e-01_rt, + 1.25268e-01_rt, 1.34970e-01_rt, 1.44667e-01_rt, 1.54348e-01_rt, + 1.64000e-01_rt, 1.73616e-01_rt, 1.83188e-01_rt, 1.92711e-01_rt, + 2.02180e-01_rt, 2.11590e-01_rt, 2.20941e-01_rt, 2.30229e-01_rt, + 2.39453e-01_rt, 2.48613e-01_rt, 2.57708e-01_rt, 2.66738e-01_rt, + 2.75704e-01_rt, 2.84606e-01_rt, 2.93446e-01_rt, 3.02224e-01_rt, + 3.10943e-01_rt, 3.19603e-01_rt, 3.28207e-01_rt, 3.36757e-01_rt, + 3.45254e-01_rt, 3.53701e-01_rt, 3.62100e-01_rt, 3.70454e-01_rt, + 3.78764e-01_rt, 3.87033e-01_rt, 3.95264e-01_rt, 4.03460e-01_rt, + 4.11622e-01_rt, 4.19754e-01_rt, 4.27858e-01_rt, 4.35938e-01_rt, + 4.43994e-01_rt, 4.52032e-01_rt, 4.60052e-01_rt, 4.68059e-01_rt, + 4.76054e-01_rt, 4.84041e-01_rt, 4.92022e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.83437e-07_rt, 8.84690e-05_rt, 8.56627e-04_rt, + 2.93343e-03_rt, 6.47963e-03_rt, 1.13727e-02_rt, 1.74006e-02_rt, + 2.43477e-02_rt, 3.20245e-02_rt, 4.02730e-02_rt, 4.89649e-02_rt, + 5.79966e-02_rt, 6.72849e-02_rt, 7.67632e-02_rt, 8.63775e-02_rt, + 9.60845e-02_rt, 1.05849e-01_rt, 1.15643e-01_rt, 1.25444e-01_rt, + 1.35231e-01_rt, 1.44992e-01_rt, 1.54713e-01_rt, 1.64385e-01_rt, + 1.74000e-01_rt, 1.83552e-01_rt, 1.93036e-01_rt, 2.02448e-01_rt, + 2.11787e-01_rt, 2.21050e-01_rt, 2.30236e-01_rt, 2.39345e-01_rt, + 2.48377e-01_rt, 2.57331e-01_rt, 2.66210e-01_rt, 2.75013e-01_rt, + 2.83743e-01_rt, 2.92401e-01_rt, 3.00988e-01_rt, 3.09507e-01_rt, + 3.17960e-01_rt, 3.26348e-01_rt, 3.34675e-01_rt, 3.42943e-01_rt, + 3.51154e-01_rt, 3.59310e-01_rt, 3.67415e-01_rt, 3.75470e-01_rt, + 3.83480e-01_rt, 3.91446e-01_rt, 3.99371e-01_rt, 4.07258e-01_rt, + 4.15111e-01_rt, 4.22931e-01_rt, 4.30721e-01_rt, 4.38486e-01_rt, + 4.46227e-01_rt, 4.53947e-01_rt, 4.61649e-01_rt, 4.69337e-01_rt, + 4.77013e-01_rt, 4.84680e-01_rt, 4.92342e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 8.05120e-07_rt, 1.88562e-04_rt, 1.42938e-03_rt, + 4.32199e-03_rt, 8.84910e-03_rt, 1.47535e-02_rt, 2.17477e-02_rt, + 2.95801e-02_rt, 3.80469e-02_rt, 4.69880e-02_rt, 5.62785e-02_rt, + 6.58213e-02_rt, 7.55404e-02_rt, 8.53767e-02_rt, 9.52835e-02_rt, + 1.05224e-01_rt, 1.15169e-01_rt, 1.25097e-01_rt, 1.34988e-01_rt, + 1.44829e-01_rt, 1.54608e-01_rt, 1.64317e-01_rt, 1.73949e-01_rt, + 1.83499e-01_rt, 1.92964e-01_rt, 2.02341e-01_rt, 2.11628e-01_rt, + 2.20825e-01_rt, 2.29931e-01_rt, 2.38947e-01_rt, 2.47873e-01_rt, + 2.56711e-01_rt, 2.65462e-01_rt, 2.74128e-01_rt, 2.82710e-01_rt, + 2.91212e-01_rt, 2.99634e-01_rt, 3.07980e-01_rt, 3.16252e-01_rt, + 3.24452e-01_rt, 3.32584e-01_rt, 3.40650e-01_rt, 3.48652e-01_rt, + 3.56595e-01_rt, 3.64480e-01_rt, 3.72310e-01_rt, 3.80089e-01_rt, + 3.87820e-01_rt, 3.95504e-01_rt, 4.03147e-01_rt, 4.10749e-01_rt, + 4.18315e-01_rt, 4.25848e-01_rt, 4.33350e-01_rt, 4.40825e-01_rt, + 4.48275e-01_rt, 4.55704e-01_rt, 4.63115e-01_rt, 4.70510e-01_rt, + 4.77893e-01_rt, 4.85267e-01_rt, 4.92635e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 2.92242e-06_rt, 3.65922e-04_rt, 2.24206e-03_rt, + 6.08232e-03_rt, 1.16544e-02_rt, 1.85759e-02_rt, 2.65021e-02_rt, + 3.51606e-02_rt, 4.43448e-02_rt, 5.38996e-02_rt, 6.37086e-02_rt, + 7.36840e-02_rt, 8.37593e-02_rt, 9.38837e-02_rt, 1.04018e-01_rt, + 1.14133e-01_rt, 1.24206e-01_rt, 1.34219e-01_rt, 1.44158e-01_rt, + 1.54014e-01_rt, 1.63779e-01_rt, 1.73447e-01_rt, 1.83015e-01_rt, + 1.92480e-01_rt, 2.01841e-01_rt, 2.11097e-01_rt, 2.20249e-01_rt, + 2.29296e-01_rt, 2.38241e-01_rt, 2.47084e-01_rt, 2.55827e-01_rt, + 2.64474e-01_rt, 2.73025e-01_rt, 2.81484e-01_rt, 2.89853e-01_rt, + 2.98135e-01_rt, 3.06333e-01_rt, 3.14449e-01_rt, 3.22487e-01_rt, + 3.30449e-01_rt, 3.38339e-01_rt, 3.46160e-01_rt, 3.53915e-01_rt, + 3.61607e-01_rt, 3.69240e-01_rt, 3.76815e-01_rt, 3.84338e-01_rt, + 3.91810e-01_rt, 3.99234e-01_rt, 4.06615e-01_rt, 4.13955e-01_rt, + 4.21258e-01_rt, 4.28526e-01_rt, 4.35762e-01_rt, 4.42971e-01_rt, + 4.50154e-01_rt, 4.57316e-01_rt, 4.64458e-01_rt, 4.71585e-01_rt, + 4.78700e-01_rt, 4.85805e-01_rt, 4.92904e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 8.99958e-06_rt, 6.54588e-04_rt, 3.33256e-03_rt, + 8.22390e-03_rt, 1.48698e-02_rt, 2.27846e-02_rt, 3.15873e-02_rt, + 4.09999e-02_rt, 5.08222e-02_rt, 6.09102e-02_rt, 7.11594e-02_rt, + 8.14935e-02_rt, 9.18562e-02_rt, 1.02206e-01_rt, 1.12511e-01_rt, + 1.22750e-01_rt, 1.32904e-01_rt, 1.42962e-01_rt, 1.52914e-01_rt, + 1.62754e-01_rt, 1.72479e-01_rt, 1.82084e-01_rt, 1.91570e-01_rt, + 2.00935e-01_rt, 2.10180e-01_rt, 2.19307e-01_rt, 2.28316e-01_rt, + 2.37211e-01_rt, 2.45992e-01_rt, 2.54663e-01_rt, 2.63227e-01_rt, + 2.71686e-01_rt, 2.80044e-01_rt, 2.88304e-01_rt, 2.96468e-01_rt, + 3.04541e-01_rt, 3.12525e-01_rt, 3.20424e-01_rt, 3.28241e-01_rt, + 3.35980e-01_rt, 3.43644e-01_rt, 3.51237e-01_rt, 3.58761e-01_rt, + 3.66220e-01_rt, 3.73617e-01_rt, 3.80957e-01_rt, 3.88241e-01_rt, + 3.95474e-01_rt, 4.02659e-01_rt, 4.09799e-01_rt, 4.16897e-01_rt, + 4.23957e-01_rt, 4.30981e-01_rt, 4.37974e-01_rt, 4.44938e-01_rt, + 4.51876e-01_rt, 4.58792e-01_rt, 4.65689e-01_rt, 4.72571e-01_rt, + 4.79439e-01_rt, 4.86298e-01_rt, 4.93151e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 2.40362e-05_rt, 1.09102e-03_rt, 4.72659e-03_rt, + 1.07377e-02_rt, 1.84532e-02_rt, 2.73132e-02_rt, 3.69221e-02_rt, + 4.70091e-02_rt, 5.73883e-02_rt, 6.79309e-02_rt, 7.85465e-02_rt, + 8.91714e-02_rt, 9.97598e-02_rt, 1.10279e-01_rt, 1.20706e-01_rt, + 1.31025e-01_rt, 1.41223e-01_rt, 1.51293e-01_rt, 1.61230e-01_rt, + 1.71030e-01_rt, 1.80694e-01_rt, 1.90220e-01_rt, 1.99610e-01_rt, + 2.08865e-01_rt, 2.17987e-01_rt, 2.26979e-01_rt, 2.35844e-01_rt, + 2.44584e-01_rt, 2.53204e-01_rt, 2.61706e-01_rt, 2.70095e-01_rt, + 2.78373e-01_rt, 2.86545e-01_rt, 2.94614e-01_rt, 3.02583e-01_rt, + 3.10458e-01_rt, 3.18240e-01_rt, 3.25935e-01_rt, 3.33545e-01_rt, + 3.41075e-01_rt, 3.48528e-01_rt, 3.55907e-01_rt, 3.63216e-01_rt, + 3.70459e-01_rt, 3.77639e-01_rt, 3.84760e-01_rt, 3.91825e-01_rt, + 3.98837e-01_rt, 4.05801e-01_rt, 4.12719e-01_rt, 4.19594e-01_rt, + 4.26431e-01_rt, 4.33232e-01_rt, 4.40000e-01_rt, 4.46740e-01_rt, + 4.53454e-01_rt, 4.60145e-01_rt, 4.66817e-01_rt, 4.73473e-01_rt, + 4.80116e-01_rt, 4.86749e-01_rt, 4.93376e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 5.67455e-05_rt, 1.70998e-03_rt, 6.43514e-03_rt, + 1.35980e-02_rt, 2.23497e-02_rt, 3.20889e-02_rt, 4.24247e-02_rt, + 5.31040e-02_rt, 6.39605e-02_rt, 7.48834e-02_rt, 8.57977e-02_rt, + 9.66524e-02_rt, 1.07412e-01_rt, 1.18054e-01_rt, 1.28561e-01_rt, + 1.38923e-01_rt, 1.49134e-01_rt, 1.59189e-01_rt, 1.69089e-01_rt, + 1.78831e-01_rt, 1.88419e-01_rt, 1.97854e-01_rt, 2.07139e-01_rt, + 2.16278e-01_rt, 2.25272e-01_rt, 2.34128e-01_rt, 2.42848e-01_rt, + 2.51436e-01_rt, 2.59897e-01_rt, 2.68236e-01_rt, 2.76455e-01_rt, + 2.84560e-01_rt, 2.92554e-01_rt, 3.00442e-01_rt, 3.08227e-01_rt, + 3.15914e-01_rt, 3.23508e-01_rt, 3.31011e-01_rt, 3.38428e-01_rt, + 3.45762e-01_rt, 3.53018e-01_rt, 3.60199e-01_rt, 3.67309e-01_rt, + 3.74352e-01_rt, 3.81331e-01_rt, 3.88250e-01_rt, 3.95112e-01_rt, + 4.01921e-01_rt, 4.08681e-01_rt, 4.15395e-01_rt, 4.22065e-01_rt, + 4.28697e-01_rt, 4.35293e-01_rt, 4.41856e-01_rt, 4.48390e-01_rt, + 4.54898e-01_rt, 4.61383e-01_rt, 4.67849e-01_rt, 4.74298e-01_rt, + 4.80735e-01_rt, 4.87162e-01_rt, 4.93583e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.20376e-04_rt, 2.54037e-03_rt, 8.45388e-03_rt, + 1.67654e-02_rt, 2.64972e-02_rt, 3.70377e-02_rt, 4.80170e-02_rt, + 5.92074e-02_rt, 7.04660e-02_rt, 8.17011e-02_rt, 9.28535e-02_rt, + 1.03885e-01_rt, 1.14770e-01_rt, 1.25493e-01_rt, 1.36045e-01_rt, + 1.46421e-01_rt, 1.56620e-01_rt, 1.66640e-01_rt, 1.76485e-01_rt, + 1.86156e-01_rt, 1.95657e-01_rt, 2.04993e-01_rt, 2.14168e-01_rt, + 2.23186e-01_rt, 2.32052e-01_rt, 2.40771e-01_rt, 2.49349e-01_rt, + 2.57789e-01_rt, 2.66096e-01_rt, 2.74276e-01_rt, 2.82334e-01_rt, + 2.90273e-01_rt, 2.98099e-01_rt, 3.05816e-01_rt, 3.13428e-01_rt, + 3.20940e-01_rt, 3.28355e-01_rt, 3.35680e-01_rt, 3.42916e-01_rt, + 3.50069e-01_rt, 3.57142e-01_rt, 3.64140e-01_rt, 3.71065e-01_rt, + 3.77923e-01_rt, 3.84716e-01_rt, 3.91449e-01_rt, 3.98125e-01_rt, + 4.04747e-01_rt, 4.11319e-01_rt, 4.17845e-01_rt, 4.24328e-01_rt, + 4.30772e-01_rt, 4.37179e-01_rt, 4.43554e-01_rt, 4.49899e-01_rt, + 4.56219e-01_rt, 4.62515e-01_rt, 4.68792e-01_rt, 4.75053e-01_rt, + 4.81301e-01_rt, 4.87540e-01_rt, 4.93771e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 2.32725e-04_rt, 3.60193e-03_rt, 1.07643e-02_rt, + 2.01911e-02_rt, 3.08302e-02_rt, 4.20879e-02_rt, 5.36273e-02_rt, + 6.52517e-02_rt, 7.68429e-02_rt, 8.83291e-02_rt, 9.96663e-02_rt, + 1.10828e-01_rt, 1.21798e-01_rt, 1.32570e-01_rt, 1.43139e-01_rt, + 1.53506e-01_rt, 1.63672e-01_rt, 1.73641e-01_rt, 1.83418e-01_rt, + 1.93008e-01_rt, 2.02416e-01_rt, 2.11648e-01_rt, 2.20710e-01_rt, + 2.29607e-01_rt, 2.38345e-01_rt, 2.46931e-01_rt, 2.55369e-01_rt, + 2.63666e-01_rt, 2.71826e-01_rt, 2.79855e-01_rt, 2.87759e-01_rt, + 2.95541e-01_rt, 3.03208e-01_rt, 3.10764e-01_rt, 3.18213e-01_rt, + 3.25561e-01_rt, 3.32811e-01_rt, 3.39969e-01_rt, 3.47038e-01_rt, + 3.54022e-01_rt, 3.60926e-01_rt, 3.67754e-01_rt, 3.74509e-01_rt, + 3.81196e-01_rt, 3.87818e-01_rt, 3.94380e-01_rt, 4.00884e-01_rt, + 4.07334e-01_rt, 4.13734e-01_rt, 4.20088e-01_rt, 4.26399e-01_rt, + 4.32670e-01_rt, 4.38905e-01_rt, 4.45107e-01_rt, 4.51280e-01_rt, + 4.57427e-01_rt, 4.63551e-01_rt, 4.69655e-01_rt, 4.75744e-01_rt, + 4.81819e-01_rt, 4.87885e-01_rt, 4.93944e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 4.15090e-04_rt, 4.90330e-03_rt, 1.33363e-02_rt, + 2.38205e-02_rt, 3.52837e-02_rt, 4.71726e-02_rt, 5.91921e-02_rt, + 7.11790e-02_rt, 8.30406e-02_rt, 9.47240e-02_rt, 1.06200e-01_rt, + 1.17453e-01_rt, 1.28476e-01_rt, 1.39268e-01_rt, 1.49832e-01_rt, + 1.60170e-01_rt, 1.70290e-01_rt, 1.80196e-01_rt, 1.89897e-01_rt, + 1.99399e-01_rt, 2.08709e-01_rt, 2.17835e-01_rt, 2.26783e-01_rt, + 2.35561e-01_rt, 2.44174e-01_rt, 2.52630e-01_rt, 2.60934e-01_rt, + 2.69093e-01_rt, 2.77113e-01_rt, 2.84999e-01_rt, 2.92756e-01_rt, + 3.00392e-01_rt, 3.07909e-01_rt, 3.15314e-01_rt, 3.22612e-01_rt, + 3.29806e-01_rt, 3.36903e-01_rt, 3.43906e-01_rt, 3.50819e-01_rt, + 3.57647e-01_rt, 3.64395e-01_rt, 3.71066e-01_rt, 3.77664e-01_rt, + 3.84194e-01_rt, 3.90659e-01_rt, 3.97062e-01_rt, 4.03409e-01_rt, + 4.09701e-01_rt, 4.15943e-01_rt, 4.22139e-01_rt, 4.28292e-01_rt, + 4.34405e-01_rt, 4.40483e-01_rt, 4.46527e-01_rt, 4.52542e-01_rt, + 4.58531e-01_rt, 4.64497e-01_rt, 4.70444e-01_rt, 4.76375e-01_rt, + 4.82292e-01_rt, 4.88200e-01_rt, 4.94102e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 6.90267e-04_rt, 6.44151e-03_rt, 1.61308e-02_rt, + 2.75971e-02_rt, 3.97962e-02_rt, 5.22323e-02_rt, 6.46571e-02_rt, + 7.69417e-02_rt, 8.90185e-02_rt, 1.00853e-01_rt, 1.12429e-01_rt, + 1.23741e-01_rt, 1.34790e-01_rt, 1.45581e-01_rt, 1.56120e-01_rt, + 1.66416e-01_rt, 1.76478e-01_rt, 1.86314e-01_rt, 1.95932e-01_rt, + 2.05343e-01_rt, 2.14554e-01_rt, 2.23573e-01_rt, 2.32410e-01_rt, + 2.41070e-01_rt, 2.49562e-01_rt, 2.57892e-01_rt, 2.66068e-01_rt, + 2.74096e-01_rt, 2.81983e-01_rt, 2.89733e-01_rt, 2.97354e-01_rt, + 3.04851e-01_rt, 3.12229e-01_rt, 3.19493e-01_rt, 3.26649e-01_rt, + 3.33702e-01_rt, 3.40655e-01_rt, 3.47515e-01_rt, 3.54284e-01_rt, + 3.60969e-01_rt, 3.67572e-01_rt, 3.74099e-01_rt, 3.80552e-01_rt, + 3.86937e-01_rt, 3.93257e-01_rt, 3.99516e-01_rt, 4.05718e-01_rt, + 4.11865e-01_rt, 4.17963e-01_rt, 4.24014e-01_rt, 4.30023e-01_rt, + 4.35991e-01_rt, 4.41924e-01_rt, 4.47824e-01_rt, 4.53695e-01_rt, + 4.59539e-01_rt, 4.65361e-01_rt, 4.71164e-01_rt, 4.76951e-01_rt, + 4.82724e-01_rt, 4.88488e-01_rt, 4.94246e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.07999e-03_rt, 8.20281e-03_rt, 1.91038e-02_rt, + 3.14654e-02_rt, 4.43117e-02_rt, 5.72152e-02_rt, 6.99770e-02_rt, + 8.25021e-02_rt, 9.47464e-02_rt, 1.06692e-01_rt, 1.18335e-01_rt, + 1.29679e-01_rt, 1.40733e-01_rt, 1.51505e-01_rt, 1.62007e-01_rt, + 1.72251e-01_rt, 1.82247e-01_rt, 1.92006e-01_rt, 2.01540e-01_rt, + 2.10857e-01_rt, 2.19969e-01_rt, 2.28884e-01_rt, 2.37610e-01_rt, + 2.46157e-01_rt, 2.54532e-01_rt, 2.62744e-01_rt, 2.70798e-01_rt, + 2.78702e-01_rt, 2.86463e-01_rt, 2.94086e-01_rt, 3.01579e-01_rt, + 3.08946e-01_rt, 3.16194e-01_rt, 3.23327e-01_rt, 3.30352e-01_rt, + 3.37272e-01_rt, 3.44094e-01_rt, 3.50821e-01_rt, 3.57458e-01_rt, + 3.64009e-01_rt, 3.70480e-01_rt, 3.76873e-01_rt, 3.83194e-01_rt, + 3.89446e-01_rt, 3.95633e-01_rt, 4.01759e-01_rt, 4.07828e-01_rt, + 4.13843e-01_rt, 4.19808e-01_rt, 4.25727e-01_rt, 4.31603e-01_rt, + 4.37440e-01_rt, 4.43240e-01_rt, 4.49008e-01_rt, 4.54747e-01_rt, + 4.60460e-01_rt, 4.66150e-01_rt, 4.71821e-01_rt, 4.77476e-01_rt, + 4.83118e-01_rt, 4.88751e-01_rt, 4.94377e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.60237e-03_rt, 1.01645e-02_rt, 2.22089e-02_rt, + 3.53733e-02_rt, 4.87807e-02_rt, 6.20782e-02_rt, 7.51161e-02_rt, + 8.78315e-02_rt, 1.00202e-01_rt, 1.12226e-01_rt, 1.23909e-01_rt, + 1.35265e-01_rt, 1.46305e-01_rt, 1.57046e-01_rt, 1.67501e-01_rt, + 1.77684e-01_rt, 1.87610e-01_rt, 1.97290e-01_rt, 2.06737e-01_rt, + 2.15962e-01_rt, 2.24975e-01_rt, 2.33788e-01_rt, 2.42409e-01_rt, + 2.50847e-01_rt, 2.59111e-01_rt, 2.67209e-01_rt, 2.75148e-01_rt, + 2.82935e-01_rt, 2.90578e-01_rt, 2.98083e-01_rt, 3.05456e-01_rt, + 3.12702e-01_rt, 3.19829e-01_rt, 3.26841e-01_rt, 3.33744e-01_rt, + 3.40543e-01_rt, 3.47242e-01_rt, 3.53846e-01_rt, 3.60361e-01_rt, + 3.66790e-01_rt, 3.73139e-01_rt, 3.79410e-01_rt, 3.85609e-01_rt, + 3.91739e-01_rt, 3.97804e-01_rt, 4.03808e-01_rt, 4.09755e-01_rt, + 4.15649e-01_rt, 4.21493e-01_rt, 4.27291e-01_rt, 4.33046e-01_rt, + 4.38762e-01_rt, 4.44442e-01_rt, 4.50089e-01_rt, 4.55707e-01_rt, + 4.61300e-01_rt, 4.66870e-01_rt, 4.72421e-01_rt, 4.77956e-01_rt, + 4.83478e-01_rt, 4.88991e-01_rt, 4.94497e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 2.26985e-03_rt, 1.22974e-02_rt, 2.53998e-02_rt, + 3.92737e-02_rt, 5.31612e-02_rt, 6.67863e-02_rt, 8.00466e-02_rt, + 9.29094e-02_rt, 1.05372e-01_rt, 1.17447e-01_rt, 1.29149e-01_rt, + 1.40498e-01_rt, 1.51513e-01_rt, 1.62211e-01_rt, 1.72612e-01_rt, + 1.82731e-01_rt, 1.92583e-01_rt, 2.02182e-01_rt, 2.11543e-01_rt, + 2.20677e-01_rt, 2.29596e-01_rt, 2.38310e-01_rt, 2.46830e-01_rt, + 2.55164e-01_rt, 2.63323e-01_rt, 2.71313e-01_rt, 2.79144e-01_rt, + 2.86822e-01_rt, 2.94354e-01_rt, 3.01748e-01_rt, 3.09009e-01_rt, + 3.16144e-01_rt, 3.23159e-01_rt, 3.30059e-01_rt, 3.36849e-01_rt, + 3.43535e-01_rt, 3.50121e-01_rt, 3.56613e-01_rt, 3.63016e-01_rt, + 3.69332e-01_rt, 3.75568e-01_rt, 3.81728e-01_rt, 3.87814e-01_rt, + 3.93833e-01_rt, 3.99786e-01_rt, 4.05679e-01_rt, 4.11515e-01_rt, + 4.17298e-01_rt, 4.23031e-01_rt, 4.28718e-01_rt, 4.34362e-01_rt, + 4.39968e-01_rt, 4.45537e-01_rt, 4.51075e-01_rt, 4.56583e-01_rt, + 4.62066e-01_rt, 4.67527e-01_rt, 4.72968e-01_rt, 4.78394e-01_rt, + 4.83806e-01_rt, 4.89209e-01_rt, 4.94606e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 3.08797e-03_rt, 1.45678e-02_rt, 2.86330e-02_rt, + 4.31255e-02_rt, 5.74186e-02_rt, 7.13124e-02_rt, 8.47486e-02_rt, + 9.77223e-02_rt, 1.10249e-01_rt, 1.22352e-01_rt, 1.34055e-01_rt, + 1.45385e-01_rt, 1.56364e-01_rt, 1.67014e-01_rt, 1.77355e-01_rt, + 1.87406e-01_rt, 1.97184e-01_rt, 2.06704e-01_rt, 2.15980e-01_rt, + 2.25025e-01_rt, 2.33852e-01_rt, 2.42472e-01_rt, 2.50895e-01_rt, + 2.59132e-01_rt, 2.67191e-01_rt, 2.75081e-01_rt, 2.82810e-01_rt, + 2.90386e-01_rt, 2.97816e-01_rt, 3.05106e-01_rt, 3.12264e-01_rt, + 3.19296e-01_rt, 3.26206e-01_rt, 3.33002e-01_rt, 3.39689e-01_rt, + 3.46271e-01_rt, 3.52754e-01_rt, 3.59142e-01_rt, 3.65441e-01_rt, + 3.71655e-01_rt, 3.77787e-01_rt, 3.83844e-01_rt, 3.89828e-01_rt, + 3.95744e-01_rt, 4.01595e-01_rt, 4.07386e-01_rt, 4.13120e-01_rt, + 4.18802e-01_rt, 4.24433e-01_rt, 4.30019e-01_rt, 4.35563e-01_rt, + 4.41068e-01_rt, 4.46537e-01_rt, 4.51974e-01_rt, 4.57382e-01_rt, + 4.62765e-01_rt, 4.68125e-01_rt, 4.73467e-01_rt, 4.78792e-01_rt, + 4.84105e-01_rt, 4.89409e-01_rt, 4.94706e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 4.05505e-03_rt, 1.69406e-02_rt, 3.18685e-02_rt, + 4.68937e-02_rt, 6.15255e-02_rt, 7.56363e-02_rt, 8.92090e-02_rt, + 1.02263e-01_rt, 1.14830e-01_rt, 1.26943e-01_rt, 1.38635e-01_rt, + 1.49935e-01_rt, 1.60871e-01_rt, 1.71468e-01_rt, 1.81747e-01_rt, + 1.91730e-01_rt, 2.01433e-01_rt, 2.10874e-01_rt, 2.20068e-01_rt, + 2.29028e-01_rt, 2.37767e-01_rt, 2.46298e-01_rt, 2.54630e-01_rt, + 2.62775e-01_rt, 2.70740e-01_rt, 2.78536e-01_rt, 2.86171e-01_rt, + 2.93651e-01_rt, 3.00986e-01_rt, 3.08180e-01_rt, 3.15242e-01_rt, + 3.22178e-01_rt, 3.28993e-01_rt, 3.35693e-01_rt, 3.42284e-01_rt, + 3.48770e-01_rt, 3.55158e-01_rt, 3.61451e-01_rt, 3.67655e-01_rt, + 3.73774e-01_rt, 3.79813e-01_rt, 3.85775e-01_rt, 3.91665e-01_rt, + 3.97487e-01_rt, 4.03245e-01_rt, 4.08943e-01_rt, 4.14584e-01_rt, + 4.20173e-01_rt, 4.25712e-01_rt, 4.31206e-01_rt, 4.36657e-01_rt, + 4.42070e-01_rt, 4.47448e-01_rt, 4.52793e-01_rt, 4.58110e-01_rt, + 4.63402e-01_rt, 4.68671e-01_rt, 4.73921e-01_rt, 4.79156e-01_rt, + 4.84378e-01_rt, 4.89590e-01_rt, 4.94797e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 5.16268e-03_rt, 1.93807e-02_rt, 3.50712e-02_rt, + 5.05499e-02_rt, 6.54611e-02_rt, 7.97445e-02_rt, 9.34202e-02_rt, + 1.06530e-01_rt, 1.19118e-01_rt, 1.31227e-01_rt, 1.42897e-01_rt, + 1.54160e-01_rt, 1.65049e-01_rt, 1.75589e-01_rt, 1.85806e-01_rt, + 1.95719e-01_rt, 2.05350e-01_rt, 2.14714e-01_rt, 2.23829e-01_rt, + 2.32708e-01_rt, 2.41364e-01_rt, 2.49810e-01_rt, 2.58057e-01_rt, + 2.66114e-01_rt, 2.73993e-01_rt, 2.81701e-01_rt, 2.89247e-01_rt, + 2.96640e-01_rt, 3.03885e-01_rt, 3.10992e-01_rt, 3.17965e-01_rt, + 3.24812e-01_rt, 3.31539e-01_rt, 3.38151e-01_rt, 3.44654e-01_rt, + 3.51053e-01_rt, 3.57353e-01_rt, 3.63559e-01_rt, 3.69676e-01_rt, + 3.75708e-01_rt, 3.81660e-01_rt, 3.87536e-01_rt, 3.93341e-01_rt, + 3.99077e-01_rt, 4.04750e-01_rt, 4.10362e-01_rt, 4.15919e-01_rt, + 4.21423e-01_rt, 4.26878e-01_rt, 4.32287e-01_rt, 4.37655e-01_rt, + 4.42984e-01_rt, 4.48278e-01_rt, 4.53540e-01_rt, 4.58773e-01_rt, + 4.63982e-01_rt, 4.69168e-01_rt, 4.74335e-01_rt, 4.79487e-01_rt, + 4.84626e-01_rt, 4.89756e-01_rt, 4.94880e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 6.39685e-03_rt, 2.18546e-02_rt, 3.82111e-02_rt, + 5.40718e-02_rt, 6.92104e-02_rt, 8.36286e-02_rt, 9.73795e-02_rt, + 1.10524e-01_rt, 1.23118e-01_rt, 1.35213e-01_rt, 1.46852e-01_rt, + 1.58074e-01_rt, 1.68912e-01_rt, 1.79395e-01_rt, 1.89548e-01_rt, + 1.99395e-01_rt, 2.08955e-01_rt, 2.18246e-01_rt, 2.27285e-01_rt, + 2.36086e-01_rt, 2.44664e-01_rt, 2.53030e-01_rt, 2.61197e-01_rt, + 2.69173e-01_rt, 2.76971e-01_rt, 2.84597e-01_rt, 2.92062e-01_rt, + 2.99372e-01_rt, 3.06536e-01_rt, 3.13561e-01_rt, 3.20453e-01_rt, + 3.27218e-01_rt, 3.33864e-01_rt, 3.40395e-01_rt, 3.46817e-01_rt, + 3.53135e-01_rt, 3.59355e-01_rt, 3.65481e-01_rt, 3.71519e-01_rt, + 3.77472e-01_rt, 3.83345e-01_rt, 3.89142e-01_rt, 3.94868e-01_rt, + 4.00526e-01_rt, 4.06121e-01_rt, 4.11656e-01_rt, 4.17135e-01_rt, + 4.22561e-01_rt, 4.27939e-01_rt, 4.33272e-01_rt, 4.38563e-01_rt, + 4.43816e-01_rt, 4.49033e-01_rt, 4.54219e-01_rt, 4.59377e-01_rt, + 4.64510e-01_rt, 4.69620e-01_rt, 4.74712e-01_rt, 4.79788e-01_rt, + 4.84852e-01_rt, 4.89907e-01_rt, 4.94955e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 7.73935e-03_rt, 2.43318e-02_rt, 4.12635e-02_rt, + 5.74425e-02_rt, 7.27638e-02_rt, 8.72850e-02_rt, 1.01088e-01_rt, + 1.14250e-01_rt, 1.26839e-01_rt, 1.38911e-01_rt, 1.50515e-01_rt, + 1.61692e-01_rt, 1.72478e-01_rt, 1.82903e-01_rt, 1.92995e-01_rt, + 2.02776e-01_rt, 2.12267e-01_rt, 2.21488e-01_rt, 2.30456e-01_rt, + 2.39184e-01_rt, 2.47688e-01_rt, 2.55980e-01_rt, 2.64071e-01_rt, + 2.71973e-01_rt, 2.79694e-01_rt, 2.87245e-01_rt, 2.94634e-01_rt, + 3.01869e-01_rt, 3.08958e-01_rt, 3.15907e-01_rt, 3.22724e-01_rt, + 3.29415e-01_rt, 3.35985e-01_rt, 3.42442e-01_rt, 3.48790e-01_rt, + 3.55035e-01_rt, 3.61181e-01_rt, 3.67234e-01_rt, 3.73199e-01_rt, + 3.79079e-01_rt, 3.84880e-01_rt, 3.90605e-01_rt, 3.96259e-01_rt, + 4.01846e-01_rt, 4.07370e-01_rt, 4.12834e-01_rt, 4.18242e-01_rt, + 4.23598e-01_rt, 4.28906e-01_rt, 4.34169e-01_rt, 4.39390e-01_rt, + 4.44573e-01_rt, 4.49722e-01_rt, 4.54838e-01_rt, 4.59927e-01_rt, + 4.64990e-01_rt, 4.70032e-01_rt, 4.75055e-01_rt, 4.80063e-01_rt, + 4.85058e-01_rt, 4.90044e-01_rt, 4.95023e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 9.16934e-03_rt, 2.67855e-02_rt, 4.42088e-02_rt, + 6.06502e-02_rt, 7.61162e-02_rt, 9.07138e-02_rt, 1.04550e-01_rt, + 1.17718e-01_rt, 1.30292e-01_rt, 1.42335e-01_rt, 1.53900e-01_rt, + 1.65031e-01_rt, 1.75764e-01_rt, 1.86132e-01_rt, 1.96163e-01_rt, + 2.05881e-01_rt, 2.15308e-01_rt, 2.24462e-01_rt, 2.33362e-01_rt, + 2.42022e-01_rt, 2.50457e-01_rt, 2.58679e-01_rt, 2.66701e-01_rt, + 2.74532e-01_rt, 2.82184e-01_rt, 2.89665e-01_rt, 2.96984e-01_rt, + 3.04149e-01_rt, 3.11168e-01_rt, 3.18048e-01_rt, 3.24796e-01_rt, + 3.31418e-01_rt, 3.37920e-01_rt, 3.44309e-01_rt, 3.50589e-01_rt, + 3.56766e-01_rt, 3.62845e-01_rt, 3.68832e-01_rt, 3.74729e-01_rt, + 3.80544e-01_rt, 3.86278e-01_rt, 3.91938e-01_rt, 3.97527e-01_rt, + 4.03048e-01_rt, 4.08507e-01_rt, 4.13906e-01_rt, 4.19250e-01_rt, + 4.24543e-01_rt, 4.29786e-01_rt, 4.34985e-01_rt, 4.40143e-01_rt, + 4.45263e-01_rt, 4.50348e-01_rt, 4.55402e-01_rt, 4.60427e-01_rt, + 4.65428e-01_rt, 4.70407e-01_rt, 4.75367e-01_rt, 4.80312e-01_rt, + 4.85245e-01_rt, 4.90168e-01_rt, 4.95086e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.06648e-02_rt, 2.91925e-02_rt, 4.70320e-02_rt, + 6.36874e-02_rt, 7.92659e-02_rt, 9.39181e-02_rt, 1.07773e-01_rt, + 1.20936e-01_rt, 1.33488e-01_rt, 1.45499e-01_rt, 1.57023e-01_rt, + 1.68106e-01_rt, 1.78787e-01_rt, 1.89099e-01_rt, 1.99072e-01_rt, + 2.08730e-01_rt, 2.18095e-01_rt, 2.27187e-01_rt, 2.36023e-01_rt, + 2.44619e-01_rt, 2.52990e-01_rt, 2.61147e-01_rt, 2.69104e-01_rt, + 2.76871e-01_rt, 2.84458e-01_rt, 2.91874e-01_rt, 2.99129e-01_rt, + 3.06230e-01_rt, 3.13185e-01_rt, 3.20001e-01_rt, 3.26686e-01_rt, + 3.33245e-01_rt, 3.39684e-01_rt, 3.46010e-01_rt, 3.52228e-01_rt, + 3.58344e-01_rt, 3.64361e-01_rt, 3.70286e-01_rt, 3.76124e-01_rt, + 3.81877e-01_rt, 3.87552e-01_rt, 3.93151e-01_rt, 3.98680e-01_rt, + 4.04143e-01_rt, 4.09542e-01_rt, 4.14883e-01_rt, 4.20168e-01_rt, + 4.25402e-01_rt, 4.30587e-01_rt, 4.35728e-01_rt, 4.40828e-01_rt, + 4.45890e-01_rt, 4.50918e-01_rt, 4.55914e-01_rt, 4.60882e-01_rt, + 4.65826e-01_rt, 4.70748e-01_rt, 4.75651e-01_rt, 4.80540e-01_rt, + 4.85415e-01_rt, 4.90282e-01_rt, 4.95143e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.22036e-02_rt, 3.15337e-02_rt, 4.97224e-02_rt, + 6.65502e-02_rt, 8.22144e-02_rt, 9.69035e-02_rt, 1.10765e-01_rt, + 1.23915e-01_rt, 1.36441e-01_rt, 1.48416e-01_rt, 1.59898e-01_rt, + 1.70933e-01_rt, 1.81564e-01_rt, 1.91823e-01_rt, 2.01740e-01_rt, + 2.11341e-01_rt, 2.20648e-01_rt, 2.29681e-01_rt, 2.38457e-01_rt, + 2.46994e-01_rt, 2.55304e-01_rt, 2.63402e-01_rt, 2.71299e-01_rt, + 2.79006e-01_rt, 2.86533e-01_rt, 2.93890e-01_rt, 3.01085e-01_rt, + 3.08127e-01_rt, 3.15024e-01_rt, 3.21782e-01_rt, 3.28408e-01_rt, + 3.34909e-01_rt, 3.41291e-01_rt, 3.47560e-01_rt, 3.53722e-01_rt, + 3.59780e-01_rt, 3.65742e-01_rt, 3.71611e-01_rt, 3.77393e-01_rt, + 3.83091e-01_rt, 3.88711e-01_rt, 3.94256e-01_rt, 3.99730e-01_rt, + 4.05139e-01_rt, 4.10484e-01_rt, 4.15771e-01_rt, 4.21003e-01_rt, + 4.26183e-01_rt, 4.31316e-01_rt, 4.36404e-01_rt, 4.41451e-01_rt, + 4.46461e-01_rt, 4.51436e-01_rt, 4.56380e-01_rt, 4.61296e-01_rt, + 4.66188e-01_rt, 4.71058e-01_rt, 4.75910e-01_rt, 4.80746e-01_rt, + 4.85570e-01_rt, 4.90385e-01_rt, 4.95194e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.37649e-02_rt, 3.37939e-02_rt, 5.22729e-02_rt, + 6.92381e-02_rt, 8.49658e-02_rt, 9.96773e-02_rt, 1.13537e-01_rt, + 1.26668e-01_rt, 1.39164e-01_rt, 1.51102e-01_rt, 1.62541e-01_rt, + 1.73530e-01_rt, 1.84111e-01_rt, 1.94319e-01_rt, 2.04184e-01_rt, + 2.13731e-01_rt, 2.22983e-01_rt, 2.31961e-01_rt, 2.40683e-01_rt, + 2.49163e-01_rt, 2.57418e-01_rt, 2.65461e-01_rt, 2.73302e-01_rt, + 2.80954e-01_rt, 2.88426e-01_rt, 2.95728e-01_rt, 3.02869e-01_rt, + 3.09857e-01_rt, 3.16700e-01_rt, 3.23404e-01_rt, 3.29977e-01_rt, + 3.36426e-01_rt, 3.42755e-01_rt, 3.48972e-01_rt, 3.55081e-01_rt, + 3.61089e-01_rt, 3.66999e-01_rt, 3.72817e-01_rt, 3.78548e-01_rt, + 3.84196e-01_rt, 3.89765e-01_rt, 3.95261e-01_rt, 4.00686e-01_rt, + 4.06045e-01_rt, 4.11341e-01_rt, 4.16579e-01_rt, 4.21762e-01_rt, + 4.26894e-01_rt, 4.31979e-01_rt, 4.37019e-01_rt, 4.42018e-01_rt, + 4.46980e-01_rt, 4.51907e-01_rt, 4.56804e-01_rt, 4.61673e-01_rt, + 4.66517e-01_rt, 4.71340e-01_rt, 4.76145e-01_rt, 4.80934e-01_rt, + 4.85711e-01_rt, 4.90479e-01_rt, 4.95241e-01_rt, 5.00000e-01_rt, + 0.00000e+00_rt, 1.53294e-02_rt, 3.59616e-02_rt, 5.46799e-02_rt, + 7.17528e-02_rt, 8.75258e-02_rt, 1.02248e-01_rt, 1.16098e-01_rt, + 1.29206e-01_rt, 1.41671e-01_rt, 1.53571e-01_rt, 1.64968e-01_rt, + 1.75913e-01_rt, 1.86446e-01_rt, 1.96606e-01_rt, 2.06420e-01_rt, + 2.15917e-01_rt, 2.25118e-01_rt, 2.34045e-01_rt, 2.42715e-01_rt, + 2.51144e-01_rt, 2.59348e-01_rt, 2.67339e-01_rt, 2.75129e-01_rt, + 2.82730e-01_rt, 2.90152e-01_rt, 2.97404e-01_rt, 3.04495e-01_rt, + 3.11433e-01_rt, 3.18226e-01_rt, 3.24882e-01_rt, 3.31406e-01_rt, + 3.37806e-01_rt, 3.44088e-01_rt, 3.50257e-01_rt, 3.56319e-01_rt, + 3.62279e-01_rt, 3.68143e-01_rt, 3.73914e-01_rt, 3.79599e-01_rt, + 3.85201e-01_rt, 3.90725e-01_rt, 3.96175e-01_rt, 4.01555e-01_rt, + 4.06869e-01_rt, 4.12121e-01_rt, 4.17314e-01_rt, 4.22453e-01_rt, + 4.27541e-01_rt, 4.32581e-01_rt, 4.37578e-01_rt, 4.42533e-01_rt, + 4.47452e-01_rt, 4.52336e-01_rt, 4.57189e-01_rt, 4.62015e-01_rt, + 4.66816e-01_rt, 4.71596e-01_rt, 4.76358e-01_rt, 4.81105e-01_rt, + 4.85839e-01_rt, 4.90564e-01_rt, 4.95284e-01_rt, 5.00000e-01_rt}; + + amrex::Gpu::synchronize(); + + m_pair_prod_table = BW_pair_prod_table{pair_prod_params, vals}; +} //============================================ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/CMakeLists.txt b/Source/Particles/ElementaryProcess/QEDInternals/CMakeLists.txt index 1bd803cde..e34659368 100644 --- a/Source/Particles/ElementaryProcess/QEDInternals/CMakeLists.txt +++ b/Source/Particles/ElementaryProcess/QEDInternals/CMakeLists.txt @@ -3,10 +3,3 @@ target_sources(WarpX BreitWheelerEngineWrapper.cpp QuantumSyncEngineWrapper.cpp ) - -#if(WARPX_QED_TABLE_GEN) -# target_sources(WarpX -# PRIVATE -# BreitWheelerEngineTableBuilder.cpp -# QuantumSyncEngineTableBuilder.cpp -#endif() diff --git a/Source/Particles/ElementaryProcess/QEDInternals/Make.package b/Source/Particles/ElementaryProcess/QEDInternals/Make.package index 432057e9e..1bd619d1c 100644 --- a/Source/Particles/ElementaryProcess/QEDInternals/Make.package +++ b/Source/Particles/ElementaryProcess/QEDInternals/Make.package @@ -1,9 +1,2 @@ CEXE_sources += BreitWheelerEngineWrapper.cpp CEXE_sources += QuantumSyncEngineWrapper.cpp - -#Table generation is enabled only if QED_TABLE_GEN is -#set to true -ifeq ($(QED_TABLE_GEN),TRUE) - CEXE_sources += BreitWheelerEngineTableBuilder.cpp - CEXE_sources += QuantumSyncEngineTableBuilder.cpp -endif diff --git a/Source/Particles/ElementaryProcess/QEDInternals/QedChiFunctions.H b/Source/Particles/ElementaryProcess/QEDInternals/QedChiFunctions.H index bdeb6df57..b6ac5c5e4 100644 --- a/Source/Particles/ElementaryProcess/QEDInternals/QedChiFunctions.H +++ b/Source/Particles/ElementaryProcess/QEDInternals/QedChiFunctions.H @@ -15,10 +15,7 @@ #include "QedWrapperCommons.H" -//#define PXRMP_CORE_ONLY allows importing only the 'core functions' of the -//QED library. -#define PXRMP_CORE_ONLY -#include <chi_functions.hpp> +#include <physics/chi_functions.hpp> namespace QedUtils{ /** @@ -32,14 +29,13 @@ namespace QedUtils{ AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real chi_photon( - amrex::Real px, amrex::Real py, amrex::Real pz, - amrex::Real ex, amrex::Real ey, amrex::Real ez, - amrex::Real bx, amrex::Real by, amrex::Real bz) + const amrex::Real px, const amrex::Real py, const amrex::Real pz, + const amrex::Real ex, const amrex::Real ey, const amrex::Real ez, + const amrex::Real bx, const amrex::Real by, const amrex::Real bz) { - //laser wavelength is unused if SI units are set - const amrex::Real dummy_lambda = 1.0; - return picsar::multi_physics::chi_photon( - px, py, pz, ex, ey, ez, bx, by, bz, dummy_lambda); + namespace pxr_p = picsar::multi_physics::phys; + return pxr_p::chi_photon<amrex::Real, pxr_p::unit_system::SI>( + px, py, pz, ex, ey, ez, bx, by, bz); } /** @@ -52,17 +48,16 @@ namespace QedUtils{ */ AMREX_GPU_DEVICE AMREX_FORCE_INLINE - amrex::Real chi_lepton( - amrex::Real px, amrex::Real py, amrex::Real pz, - amrex::Real ex, amrex::Real ey, amrex::Real ez, - amrex::Real bx, amrex::Real by, amrex::Real bz) + amrex::Real chi_ele_pos( + const amrex::Real px, const amrex::Real py, const amrex::Real pz, + const amrex::Real ex, const amrex::Real ey, const amrex::Real ez, + const amrex::Real bx, const amrex::Real by, const amrex::Real bz) { - //laser wavelength is unused if SI units are set - const amrex::Real dummy_lambda = 1.0; - return picsar::multi_physics::chi_lepton( - px, py, pz, ex, ey, ez, bx, by, bz, dummy_lambda); + namespace pxr_p = picsar::multi_physics::phys; + return pxr_p::chi_ele_pos<amrex::Real, pxr_p::unit_system::SI>( + px, py, pz, ex, ey, ez, bx, by, bz); } //_________ -}; +} #endif //WARPX_amrex_qed_chi_functions_h_ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/QedTableParserHelperFunctions.H b/Source/Particles/ElementaryProcess/QEDInternals/QedTableParserHelperFunctions.H deleted file mode 100644 index dd66f626f..000000000 --- a/Source/Particles/ElementaryProcess/QEDInternals/QedTableParserHelperFunctions.H +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright 2019 Luca Fedeli, Maxence Thevenet - * - * This file is part of WarpX. - * - * License: BSD-3-Clause-LBNL - */ -#ifndef WARPX_amrex_qed_table_parser_helper_functions_h_ -#define WARPX_amrex_qed_table_parser_helper_functions_h_ - -/** - * This header contains helper functions to safely extract data - * (e.g. integers, floating point numbers) from raw binary data - * (i.e. a char*) and to convert arrays into raw binary data. - */ - -#include <AMReX_Vector.H> -#include <tuple> - -namespace QedUtils{ - /** - * This function safely extracts an amrex::Vector<T> from raw binary data. - * T must be a simple datatype (e.g. an int, a float, a double...). - * - * @param[in] p_data a pointer to the binary stream - * @param[in] how_many how many T should be read from stream - * @param[in] p_last a pointer to the last element of the char* array - * @return {a tuple containing - * 1) flag (which is false if p_last is exceeded) - * 2) a Vector of T - * 3) a pointer to a new location of the binary data (after having read how_many T)} - */ - template <class T> - std::tuple<bool, amrex::Vector<T>, const char*>parse_raw_data_vec( - const char* p_data, size_t how_many, const char* const p_last) - { - amrex::Vector<T> res; - if(p_data + sizeof(T)*how_many > p_last) - return std::make_tuple(false, res, nullptr); - - auto r_data = reinterpret_cast<const T*>(p_data); - - res.assign(r_data, r_data + how_many); - - p_data += sizeof(T)*how_many; - return std::make_tuple(true, res, p_data); - } - - /** - * This function safely extracts a T from raw binary data. - * T must be a simple datatype (e.g. an int, a float, a double...). - * - * @param[in] p_data a pointer to the binary stream - * @param[in] p_last a pointer to the last element of the char* array - * @return {a tuple containing - * 1) flag (which is false if p_last is exceeded) - * 2) a T - * 3) a pointer to a new location of the binary data (after having read 1 T)} - */ - template <class T> - std::tuple<bool, T, const char*> parse_raw_data( - const char* p_data, const char* const p_last) - { - T res; - if(p_data + sizeof(T) > p_last) - return std::make_tuple(false, res, nullptr); - - auto r_data = reinterpret_cast<const T*>(p_data); - - res = *r_data; - - p_data += sizeof(T); - return std::make_tuple(true, res, p_data); - } - - /** - * This function converts a C-style array of T into - * a Vector<char> (i.e. raw binary data) and adds it - * to an existing Vector<char> passed by reference - * @param[in] p_data a pointer to the beginning of the array - * @param[in] how_many number of elements of type T in the array - * @param[in,out] raw_data data will be appended to this vector - */ - template <class T> - void add_data_to_vector_char ( - const T* p_data, size_t how_many, amrex::Vector<char>& raw_data) - { - raw_data.insert( - raw_data.end(), - reinterpret_cast<const char*>(p_data), - reinterpret_cast<const char*>(p_data) + - sizeof(T)*how_many - ); - } -}; - -#endif //WARPX_amrex_qed_table_parser_helper_functions_h_ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/QedWrapperCommons.H b/Source/Particles/ElementaryProcess/QEDInternals/QedWrapperCommons.H index 1d4500a81..75fc2fd79 100644 --- a/Source/Particles/ElementaryProcess/QEDInternals/QedWrapperCommons.H +++ b/Source/Particles/ElementaryProcess/QEDInternals/QedWrapperCommons.H @@ -8,35 +8,31 @@ #define WARPX_amrex_qed_wrapper_commons_h_ /** - * This header contains some common #define directives and a - * 'dummy' class used by the QED library wrappers and related + * This header contains some common #define directives + * used by the QED library wrappers and related * components. */ #include <AMReX_AmrCore.H> #include <AMReX_GpuQualifiers.H> +#include <AMReX_Extension.H> /** * PICSAR uses PXRMP_GPU to decorate methods which should be * compiled for GPU. The user has to set it to the right value * (AMREX_GPU_DEVICE in this case). - * PXRMP_WITH_SI_UNITS sets the library to use International - * System units. */ #define PXRMP_GPU AMREX_GPU_HOST_DEVICE -#define PXRMP_WITH_SI_UNITS //_________________________ /** - * A namespace called 'QedUtils' is used to encapsulate - * free functions (defined elsewhere) and an - * empty datastructure (DummyStruct), which is re-used by several - * components. + * PICSAR uses internally some specifiers analogous to + * AMREX_RESTRICT and AMREX_FORCE_INLINE. These definitions + * set the aformentioned specifiers to AMREX_RESTRICT and + * AMREX_FORCE_INLINE. */ -namespace QedUtils{ - struct DummyStruct{}; -}; +#define PXRMP_RESTRICT AMREX_RESTRICT +#define PXRMP_FORCE_INLINE AMREX_FORCE_INLINE //_________________________ - #endif //WARPX_amrex_qed_wrapper_commons_h_ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncDummyTable.H b/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncDummyTable.H deleted file mode 100644 index f34c521a3..000000000 --- a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncDummyTable.H +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright 2019 Luca Fedeli - * - * This file is part of WarpX. - * - * License: BSD-3-Clause-LBNL - */ -#ifndef WARPX_quantum_sync_dummy_tables_h_ -#define WARPX_quantum_sync_dummy_tables_h_ - -#include "QuantumSyncEngineInnards.H" - -#include <AMReX_REAL.H> -#include <AMReX_Gpu.H> - -#include <limits> - -namespace QedUtils{ - -//A default mini-table used for test purposes -const struct //QuantumSyncEngineInnardsDummy -{ - picsar::multi_physics::quantum_synchrotron_engine_ctrl<amrex::Real> ctrl{ - 0.001, /*chi_part_min*/ - 0.001, /*chi_part_tdndt_min*/ - 200, /*chi_part_tdndt_max*/ - 64, /*chi_part_tdndt_how_many*/ - 0.001, /*chi_part_tem_min*/ - 200, /*chi_part_tem_max*/ - 2, /*chi_part_tem_how_many*/ - 2 /*prob_tem_how_many*/ - }; - std::vector<amrex::Real> KKfunc_coords{ - -6.907755279, -6.714008094, -6.520260909, -6.326513724, - -6.13276654, -5.939019355, -5.74527217, -5.551524985, - -5.3577778, -5.164030615, -4.97028343, -4.776536246, - -4.582789061, -4.389041876, -4.195294691, -4.001547506, - -3.807800321, -3.614053137, -3.420305952, -3.226558767, - -3.032811582, -2.839064397, -2.645317212, -2.451570027, - -2.257822843, -2.064075658, -1.870328473, -1.676581288, - -1.482834103, -1.289086918, -1.095339733, -0.9015925486, - -0.7078453638, -0.5140981789, -0.3203509941, -0.1266038092, - 0.06714337561, 0.2608905605, 0.4546377453, 0.6483849302, - 0.842132115, 1.0358793, 1.229626485, 1.42337367, - 1.617120854, 1.810868039, 2.004615224, 2.198362409, - 2.392109594, 2.585856779, 2.779603964, 2.973351148, - 3.167098333, 3.360845518, 3.554592703, 3.748339888, - 3.942087073, 4.135834257, 4.329581442, 4.523328627, - 4.717075812, 4.910822997, 5.104570182, 5.298317367 - }; - std::vector<amrex::Real> KKfunc_data{ - -7.968431811, -7.639082211, -7.326295546, -7.02752527, - -6.740710773, -6.464172009, -6.196529608, -5.93664402 - -5.683568899, -5.436515162, -5.194823127, -4.957940775, - -4.725406674, -4.49683649, -4.2719122, -4.050373372, - -3.832009948, -3.616656119, -3.404184903, -3.194503151, - -2.987546751, -2.783275883, -2.581670257, -2.382724345, - -2.1864427, -1.992835514, -1.801914573, -1.613689793, - -1.428166439, -1.2453431, -1.065210351, -0.8877500928, - -0.7129353081, -0.5407301909, -0.3710904422, -0.2039636495, - -0.03928968527, 0.1229988926, 0.2829764221, 0.4407236701, - 0.5963272798, 0.7498791107, 0.9014754584, 1.051216164, - 1.199203636, 1.345541816, 1.490335133, 1.633687478, - 1.775701241, 1.916476434, 2.056109933, 2.194694829, - 2.332319922, 2.469069336, 2.605022252, 2.740252763, - 2.874829832, 3.008817314, 3.142273988, 3.27525366, - 3.407805563, 3.539975021, 3.671803889, 3.803330346 - };//_____________________________ - std::vector<amrex::Real> cum_distrib_coords_1{ - -6.907755279, 5.298317367 - };//_____________________________ - std::vector<amrex::Real> cum_distrib_coords_2{ - 0, 0.5 - };//_____________________________ - std::vector<amrex::Real> cum_distrib_data{ - -std::numeric_limits<amrex::Real>::infinity(), - -0.6931471806, - -std::numeric_limits<amrex::Real>::infinity(), - -0.6931471806 - };//_____________________________ -} QuantumSyncEngineInnardsDummy; - -}; - -#endif //WARPX_quantum_sync_dummy_tables_h_ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineInnards.H b/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineInnards.H deleted file mode 100644 index 64e67690a..000000000 --- a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineInnards.H +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright 2019 Luca Fedeli - * - * This file is part of WarpX. - * - * License: BSD-3-Clause-LBNL - */ -#ifndef WARPX_quantum_sync_engine_innards_h_ -#define WARPX_quantum_sync_engine_innards_h_ - -#include "QedWrapperCommons.H" - -#include <AMReX_Gpu.H> - -//This includes only the definition of a simple datastructure -//used to control the Quantum Synchrotron engine. -#include <quantum_sync_engine_ctrl.h> - -/** - * This structure holds all the parameters required to use the - * Quantum Synchrotron engine: a POD control structure and lookup - * tables data. - */ -struct QuantumSynchrotronEngineInnards -{ - // Control parameters (a POD struct) - // ctrl contains several parameters: - // - chi_part_min : the minium chi parameter to be - // considered by the engine - // - chi_part_tdndt_min : minimun chi for sub-table 1 (1D) - // - chi_part_tdndt_max : maximum chi for sub-table 1 (1D) - // - chi_part_tdndt_how_many : how many points to use for sub-table 1 (1D) - // - chi_part_tem_min : minimun chi for sub-table 2 (1D) - // - chi_part_tem_max : maximum chi for sub-table 2 (1D) - // - chi_part_tem_how_many : how many points to use for chi for sub-table 2 (2D) - // - prob_tem_how_many : how many points to use for the second axis of sub-table 2 (2D) - picsar::multi_physics::quantum_synchrotron_engine_ctrl<amrex::Real> ctrl; - - //Lookup table data - //---sub-table 1 (1D) - amrex::Gpu::ManagedDeviceVector<amrex::Real> KKfunc_coords; - amrex::Gpu::ManagedDeviceVector<amrex::Real> KKfunc_data; - //--- - - //---sub-table 2 (2D) - amrex::Gpu::ManagedVector<amrex::Real> cum_distrib_coords_1; - amrex::Gpu::ManagedVector<amrex::Real> cum_distrib_coords_2; - amrex::Gpu::ManagedVector<amrex::Real> cum_distrib_data; - //______ -}; -//========================================================== - -#endif //WARPX_quantum_sync_engine_innards_h_ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineTableBuilder.H b/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineTableBuilder.H deleted file mode 100644 index 16be2d5eb..000000000 --- a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineTableBuilder.H +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright 2019 Luca Fedeli - * - * This file is part of WarpX. - * - * License: BSD-3-Clause-LBNL - */ -#ifndef WARPX_quantum_sync_engine_table_builder_h_ -#define WARPX_quantum_sync_engine_table_builder_h_ - -#include "QedWrapperCommons.H" -#include "QuantumSyncEngineInnards.H" - -//This includes only the definition of a simple datastructure -//used to control the Quantum Synchrotron engine. -#include <quantum_sync_engine_ctrl.h> - -/** - * A class which computes the lookup tables for the Quantum Synchrotron engine. - */ -class QuantumSynchrotronEngineTableBuilder{ -public: - /** - * Computes the tables. - * @param[in] ctrl control parameters to generate the tables - * @param[out] innards structure holding both a copy of ctrl and lookup tables data - */ - void compute_table - (picsar::multi_physics::quantum_synchrotron_engine_ctrl<amrex::Real> ctrl, - QuantumSynchrotronEngineInnards& innards) const; -}; - -#endif //WARPX_quantum_sync_engine_table_builder_h_ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineTableBuilder.cpp b/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineTableBuilder.cpp deleted file mode 100644 index e9670aa7e..000000000 --- a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineTableBuilder.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright 2019 Luca Fedeli - * - * This file is part of WarpX. - * - * License: BSD-3-Clause-LBNL - */ -#include "QuantumSyncEngineTableBuilder.H" - -//Include the full Quantum Synchrotron engine with table generation support -//(after some consistency tests). This requires to have a recent version -// of the Boost library. -#ifdef PXRMP_CORE_ONLY -# error The Table Builder is incompatible with PXRMP_CORE_ONLY -#endif - -#ifdef __PICSAR_MULTIPHYSICS_BREIT_WHEELER_ENGINE__ -# warning quantum_sync_engine.hpp should not have been included before reaching this point. -#endif -#include <quantum_sync_engine.hpp> -//_______________________________________________ - -//Some handy aliases -using PicsarQuantumSynchrotronEngine = picsar::multi_physics:: - quantum_synchrotron_engine<amrex::Real, QedUtils::DummyStruct>; - -using PicsarQuantumSynchrotronCtrl = - picsar::multi_physics::quantum_synchrotron_engine_ctrl<amrex::Real>; -//_______________________________________________ - -void -QuantumSynchrotronEngineTableBuilder::compute_table - (PicsarQuantumSynchrotronCtrl ctrl, - QuantumSynchrotronEngineInnards& innards) const -{ - PicsarQuantumSynchrotronEngine qs_engine( - std::move(QedUtils::DummyStruct()), 1.0, ctrl); - - qs_engine.compute_dN_dt_lookup_table(); - qs_engine.compute_cumulative_phot_em_table(); - - auto qs_innards_picsar = qs_engine.export_innards(); - - //Copy data in a GPU-friendly data-structure - innards.ctrl = qs_innards_picsar.qs_ctrl; - innards.KKfunc_coords.assign(qs_innards_picsar.KKfunc_table_coords_ptr, - qs_innards_picsar.KKfunc_table_coords_ptr + - qs_innards_picsar.KKfunc_table_coords_how_many); - innards.KKfunc_data.assign(qs_innards_picsar.KKfunc_table_data_ptr, - qs_innards_picsar.KKfunc_table_data_ptr + - qs_innards_picsar.KKfunc_table_data_how_many); - innards.cum_distrib_coords_1.assign( - qs_innards_picsar.cum_distrib_table_coords_1_ptr, - qs_innards_picsar.cum_distrib_table_coords_1_ptr + - qs_innards_picsar.cum_distrib_table_coords_1_how_many); - innards.cum_distrib_coords_2.assign( - qs_innards_picsar.cum_distrib_table_coords_2_ptr, - qs_innards_picsar.cum_distrib_table_coords_2_ptr + - qs_innards_picsar.cum_distrib_table_coords_2_how_many); - innards.cum_distrib_data.assign( - qs_innards_picsar.cum_distrib_table_data_ptr, - qs_innards_picsar.cum_distrib_table_data_ptr + - qs_innards_picsar.cum_distrib_table_data_how_many); - //____ -} diff --git a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineWrapper.H b/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineWrapper.H index fe7d560cd..ece636aad 100644 --- a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineWrapper.H +++ b/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineWrapper.H @@ -8,39 +8,49 @@ #define WARPX_quantum_sync_engine_wrapper_h_ #include "QedWrapperCommons.H" -#include "QuantumSyncEngineInnards.H" +#include "QedChiFunctions.H" +#include "Utils/WarpXConst.H" #include <AMReX_Array.H> #include <AMReX_Vector.H> #include <AMReX_Gpu.H> -//#define PXRMP_CORE_ONLY allows importing only the 'core functions' of the -//Quantum Synchrotron engine of the QED PICSAR library. -#define PXRMP_CORE_ONLY -#include <quantum_sync_engine.hpp> - -//Lookup table building function is in a dedicated (optional) class to -//avoid including heavy dependencies if they are not needed. -#ifdef WARPX_QED_TABLE_GEN -# include "QuantumSyncEngineTableBuilder.H" -#endif +#include <physics/quantum_sync/quantum_sync_engine_tables.hpp> +#include <physics/quantum_sync/quantum_sync_engine_core.hpp> #include <string> +#include <vector> + +// Aliases ============================= +using QS_dndt_table_params = + picsar::multi_physics::phys::quantum_sync:: + dndt_lookup_table_params<amrex::Real>; + +using QS_dndt_table = + picsar::multi_physics::phys::quantum_sync:: + dndt_lookup_table< + amrex::Real, + amrex::Gpu::DeviceVector<amrex::Real>>; + +using QS_dndt_table_view = QS_dndt_table::view_type; + +using QS_phot_em_table_params = + picsar::multi_physics::phys::quantum_sync:: + photon_emission_lookup_table_params<amrex::Real>; -//Some handy aliases +using QS_phot_em_table = + picsar::multi_physics::phys::quantum_sync:: + photon_emission_lookup_table< + amrex::Real, + amrex::Gpu::DeviceVector<amrex::Real>>; -// The engine has two templated arguments: the numerical type -// and a random number generator. However, random numbers are not -// used to generate the lookup tables and the static member -// functions which are called in the functors do not use -// random numbers as well. Therefore, an empty "DummyStruct" -// can be passed as a template parameter. -using PicsarQuantumSynchrotronEngine = picsar::multi_physics:: - quantum_synchrotron_engine<amrex::Real, QedUtils::DummyStruct>; +using QS_phot_em_table_view = QS_phot_em_table::view_type; -using PicsarQuantumSynchrotronCtrl = - picsar::multi_physics::quantum_synchrotron_engine_ctrl<amrex::Real>; -//__________ +struct PicsarQuantumSyncCtrl +{ + QS_dndt_table_params dndt_params; + QS_phot_em_table_params phot_em_params; +}; // Functors ================================== @@ -70,9 +80,10 @@ public: AMREX_FORCE_INLINE amrex::Real operator() () const noexcept { + namespace pxr_qs = picsar::multi_physics::phys::quantum_sync; + //A random number in [0,1) should be provided as an argument. - return PicsarQuantumSynchrotronEngine:: - internal_get_optical_depth(amrex::Random()); + return pxr_qs::get_optical_depth(amrex::Random()); } }; //____________________________________________ @@ -85,154 +96,158 @@ class QuantumSynchrotronEvolveOpticalDepth { public: - QuantumSynchrotronEvolveOpticalDepth () = default; + /** + * Default constructor: it leaves the functor in a non-initialized state. + */ + QuantumSynchrotronEvolveOpticalDepth (){} /** - * Constructor acquires pointers to control parameters and - * lookup tables data. - * lookup_table uses non-owning vectors under the hood. So no new data - * allocations should be triggered on GPU + * Constructor to be used to initialize the functor. + * + * @param[in] table_view a view of a QS_dndt_table lookup table + * @param[in] qs_minimum_chi_part the minimum quantum parameter to evolve the optical depth */ - QuantumSynchrotronEvolveOpticalDepth( - QuantumSynchrotronEngineInnards& r_innards): - m_ctrl{r_innards.ctrl}, - m_KKfunc_size{r_innards.KKfunc_coords.size()}, - m_p_KKfunc_coords{r_innards.KKfunc_coords.dataPtr()}, - m_p_KKfunc_data{r_innards.KKfunc_data.dataPtr()} - {}; + QuantumSynchrotronEvolveOpticalDepth ( + const QS_dndt_table_view table_view, + const amrex::ParticleReal qs_minimum_chi_part): + m_table_view{table_view}, m_qs_minimum_chi_part{qs_minimum_chi_part}{}; /** * Evolves the optical depth. It can be used on GPU. - * @param[in] px,py,pz momentum components of the lepton (SI units) + * If the quantum parameter parameter of the particle is + * < qs_minimum_chi_part, the method returns immediately. + * + * @param[in] ux,uy,uz gamma*v components of the lepton. * @param[in] ex,ey,ez electric field components (SI units) * @param[in] bx,by,bz magnetic field components (SI units) * @param[in] dt timestep (SI units) - * @param[in,out] opt_depth optical depth of the lepton. It is modified by the method. - * @return a flag which is 1 if optical depth becomes negative (i.e. a photon has to be generated). + * @param[in,out] opt_depth optical depth of the particle. + * @return a flag which is 1 if chi_part was out of table. */ - AMREX_GPU_HOST_DEVICE + AMREX_GPU_DEVICE AMREX_FORCE_INLINE int operator()( - amrex::Real px, amrex::Real py, amrex::Real pz, - amrex::Real ex, amrex::Real ey, amrex::Real ez, - amrex::Real bx, amrex::Real by, amrex::Real bz, - amrex::Real dt, amrex::Real& opt_depth) const noexcept + const amrex::Real ux, const amrex::Real uy, const amrex::Real uz, + const amrex::Real ex, const amrex::Real ey, const amrex::Real ez, + const amrex::Real bx, const amrex::Real by, const amrex::Real bz, + const amrex::Real dt, amrex::Real& opt_depth) const noexcept { - bool has_event_happened{false}; - - //the library provides the time (< dt) at which the event occurs, but this - //feature won't be used in WarpX for now. - amrex::Real unused_event_time{0.0}; - - PicsarQuantumSynchrotronEngine:: - internal_evolve_opt_depth_and_determine_event( - px, py, pz, - ex, ey, ez, - bx, by, bz, - dt, opt_depth, - has_event_happened, unused_event_time, - m_dummy_lambda, - picsar::multi_physics::lookup_1d<amrex::Real>{ - m_KKfunc_size, - m_p_KKfunc_coords, - m_p_KKfunc_data}, - m_ctrl); - - return has_event_happened; - } + using namespace amrex::literals; + namespace pxr_p = picsar::multi_physics::phys; + namespace pxr_qs = picsar::multi_physics::phys::quantum_sync; -private: - //laser wavelength is not used with SI units - amrex::Real m_dummy_lambda{1.0}; + constexpr amrex::Real m_e = PhysConst::m_e; + constexpr amrex::Real inv_c2 = 1._rt/(PhysConst::c*PhysConst::c); + const amrex::Real gamma = std::sqrt(1._rt + (ux*ux + uy*uy + uz*uz)*inv_c2); + const auto energy = gamma*m_e*PhysConst::c*PhysConst::c; + + const auto chi_part = QedUtils::chi_ele_pos( + m_e*ux, m_e*uy, m_e*uz, ex, ey, ez, bx, by, bz); + + if (chi_part < m_qs_minimum_chi_part) + return 0; + + const auto is_out = pxr_qs::evolve_optical_depth< + amrex::Real, + QS_dndt_table_view, + pxr_p::unit_system::SI>( + energy, chi_part, dt, opt_depth, m_table_view); - PicsarQuantumSynchrotronCtrl m_ctrl; + return is_out; + } - //lookup table data - size_t m_KKfunc_size; - amrex::Real* m_p_KKfunc_coords; - amrex::Real* m_p_KKfunc_data; +private: + QS_dndt_table_view m_table_view; + amrex::ParticleReal m_qs_minimum_chi_part; }; /** * Functor to generate a photon via the Quantum Synchrotron process * and to update momentum accordingly */ -class QuantumSynchrotronGeneratePhotonAndUpdateMomentum +class QuantumSynchrotronPhotonEmission { public: + + /** + * Default constructor: it leaves the functor in a non-initialized state. + */ + QuantumSynchrotronPhotonEmission (){} + /** * Constructor acquires pointers to control parameters and * lookup tables data. * lookup_table uses non-owning vectors under the hood. So no new data * allocations should be triggered on GPU + * + * @param[in] table_view a view of a QS_phot_em_table lookup table */ - QuantumSynchrotronGeneratePhotonAndUpdateMomentum( - QuantumSynchrotronEngineInnards& r_innards): - m_ctrl{r_innards.ctrl}, - m_cum_distrib_coords_1_size{r_innards.cum_distrib_coords_1.size()}, - m_cum_distrib_coords_2_size{r_innards.cum_distrib_coords_2.size()}, - m_p_distrib_coords_1{r_innards.cum_distrib_coords_1.data()}, - m_p_distrib_coords_2{r_innards.cum_distrib_coords_2.data()}, - m_p_cum_distrib_data{r_innards.cum_distrib_data.data()} - {}; + QuantumSynchrotronPhotonEmission ( + const QS_phot_em_table_view table_view): + m_table_view{table_view}{}; /** - * Generates sampling (template parameter) photons according to Quantum Synchrotron process. + * Generates photons according to Quantum Synchrotron process. * It can be used on GPU. - * @param[in,out] px,py,pz momentum components of the lepton. They are modified (SI units) + * + * @param[in,out] ux,uy,uz gamma*v components of the lepton. They are modified (SI units) * @param[in] ex,ey,ez electric field components (SI units) * @param[in] bx,by,bz magnetic field components (SI units) - * @param[in] weight of the lepton (code units) - * @param[out] g_px,g_py,g_pz momenta of generated photons. Each array should have size=sampling (SI units) - * @param[out] g_weight weight of the generated photons. Array should have size=sampling (code units) + * @param[out] g_ux,g_uy,g_uz gamma*v components of the generated photon (SI units) + * @return a flag which is 1 if chi_photon was out of table */ - template <size_t sampling> - AMREX_GPU_HOST_DEVICE + AMREX_GPU_DEVICE AMREX_FORCE_INLINE - void operator()( - amrex::Real* px, amrex::Real* py, amrex::Real* pz, - amrex::Real ex, amrex::Real ey, amrex::Real ez, - amrex::Real bx, amrex::Real by, amrex::Real bz, - amrex::Real weight, - amrex::Real* g_px, amrex::Real* g_py, amrex::Real* g_pz, - amrex::Real* g_weight) const noexcept + bool operator()( + amrex::Real& ux, amrex::Real& uy, amrex::Real& uz, + const amrex::Real ex, const amrex::Real ey, const amrex::Real ez, + const amrex::Real bx, const amrex::Real by, const amrex::Real bz, + amrex::Real& g_ux, amrex::Real& g_uy, amrex::Real& g_uz) const noexcept { - //[sampling] random numbers are needed - amrex::GpuArray<amrex::Real, sampling> - rand_zero_one_minus_epsi; - for(auto& el : rand_zero_one_minus_epsi) el = amrex::Random(); - - PicsarQuantumSynchrotronEngine:: - internal_generate_photons_and_update_momentum( - *px, *py, *pz, - ex, ey, ez, - bx, by, bz, - weight, sampling, - g_px, g_py, g_pz, - g_weight, - m_dummy_lambda, - picsar::multi_physics::lookup_2d<amrex::Real>{ - m_cum_distrib_coords_1_size, - m_p_distrib_coords_1, - m_cum_distrib_coords_2_size, - m_p_distrib_coords_2, - m_p_cum_distrib_data}, - m_ctrl, - rand_zero_one_minus_epsi.data()); + using namespace amrex; + namespace pxr_m = picsar::multi_physics::math; + namespace pxr_p = picsar::multi_physics::phys; + namespace pxr_qs = picsar::multi_physics::phys::quantum_sync; + + const auto rand_zero_one_minus_epsi = amrex::Random(); + + constexpr ParticleReal me = PhysConst::m_e; + constexpr ParticleReal one_over_me = 1._prt/me; + + // Particle momentum is stored as gamma * velocity. + // Convert to m * gamma * velocity + auto px = ux*me; + auto py = uy*me; + auto pz = uz*me; + + const auto chi_particle = QedUtils::chi_ele_pos( + px, py, pz, ex, ey, ez, bx, by, bz); + + auto momentum_particle = pxr_m::vec3<amrex::Real>{px, py, pz}; + auto momentum_photon = pxr_m::vec3<amrex::Real>(); + + const auto is_out = pxr_qs::generate_photon_update_momentum< + amrex::Real, + QS_phot_em_table_view, + pxr_p::unit_system::SI>( + chi_particle, momentum_particle, + rand_zero_one_minus_epsi, + m_table_view, + momentum_photon); + + ux = momentum_particle[0]*one_over_me; + uy = momentum_particle[1]*one_over_me; + uz = momentum_particle[2]*one_over_me; + g_ux = momentum_photon[0]*one_over_me; + g_uy = momentum_photon[1]*one_over_me; + g_uz = momentum_photon[2]*one_over_me; + + return is_out; } private: - //laser wavelenght is not used with SI units - const amrex::Real m_dummy_lambda{1.0}; - - const PicsarQuantumSynchrotronCtrl m_ctrl; + QS_phot_em_table_view m_table_view; - //lookup table data - size_t m_cum_distrib_coords_1_size; - size_t m_cum_distrib_coords_2_size; - amrex::Real* m_p_distrib_coords_1; - amrex::Real* m_p_distrib_coords_2; - amrex::Real* m_p_cum_distrib_data; }; // Factory class ============================= @@ -261,7 +276,7 @@ public: /** * Builds the functor to generate photons */ - QuantumSynchrotronGeneratePhotonAndUpdateMomentum build_phot_em_functor (); + QuantumSynchrotronPhotonEmission build_phot_em_functor (); /** * Checks if the optical tables are properly initialized @@ -269,53 +284,60 @@ public: bool are_lookup_tables_initialized () const; /** - * Init lookup tables from raw binary data. - * @param[in] raw_data a Vector of char - * @return true if it succeeds, false if it cannot parse raw_data + * Export lookup tables data into a raw binary Vector + * + * @return the data in binary format. The Vector is empty if tables were + * not previously initialized. */ - bool init_lookup_tables_from_raw_data (const amrex::Vector<char>& raw_data); + std::vector<char> export_lookup_tables_data () const; /** - * Init lookup tables using built-in dummy tables - * for test purposes. + * Init lookup tables from raw binary data. + * + * @param[in] raw_data a vector of char + * @param[in] qs_minimum_chi_part minimum chi parameter to evolve the optical depth of a particle. + * @return true if it succeeds, false if it cannot parse raw_data */ - void init_dummy_tables(); + bool init_lookup_tables_from_raw_data (const std::vector<char>& raw_data, + const amrex::Real qs_minimum_chi_part); /** - * Export lookup tables data into a raw binary Vector - * @return the data in binary format. The Vector is empty if tables were - * not previously initialized. + * Init lookup tables using built-in (low resolution) tables + * + * @param[in] qs_minimum_chi_part minimum chi parameter to evolve the optical depth of a particle. */ - amrex::Vector<char> export_lookup_tables_data () const; + void init_builtin_tables(const amrex::Real qs_minimum_chi_part); /** * Computes the lookup tables. It does nothing unless WarpX is compiled with QED_TABLE_GEN=TRUE + * * @param[in] ctrl control params to generate the tables + * @param[in] qs_minimum_chi_part minimum chi parameter to evolve the optical depth of a particle. */ - void compute_lookup_tables (PicsarQuantumSynchrotronCtrl ctrl); + void compute_lookup_tables (PicsarQuantumSyncCtrl ctrl, + const amrex::Real qs_minimum_chi_part); /** - * gets default (reasonable) values for the control parameters + * gets default values for the control parameters + * * @return default control params to generate the tables */ - PicsarQuantumSynchrotronCtrl get_default_ctrl() const; + PicsarQuantumSyncCtrl get_default_ctrl() const; - /** - * returns a constant reference to the control parameters - * @return const reference to control parameters - */ - const PicsarQuantumSynchrotronCtrl& get_ref_ctrl() const; + amrex::Real get_minimum_chi_part() const; private: bool m_lookup_tables_initialized = false; - QuantumSynchrotronEngineInnards m_innards; + //Variables to store the minimum chi parameters to enable + //Quantum Synchrotron process + amrex::Real m_qs_minimum_chi_part; -//Table builing is available only if the libray is compiled with QED_TABLE_GEN=TRUE -#ifdef WARPX_QED_TABLE_GEN - QuantumSynchrotronEngineTableBuilder m_table_builder; -#endif + QS_dndt_table m_dndt_table; + QS_phot_em_table m_phot_em_table; + void init_builtin_dndt_table(); + void init_builtin_phot_em_table(); }; //============================================ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineWrapper.cpp b/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineWrapper.cpp index b185251d8..137c0d5bb 100644 --- a/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineWrapper.cpp +++ b/Source/Particles/ElementaryProcess/QEDInternals/QuantumSyncEngineWrapper.cpp @@ -6,14 +6,18 @@ */ #include "QuantumSyncEngineWrapper.H" -#include "QedTableParserHelperFunctions.H" -#include "QuantumSyncDummyTable.H" +//Functions needed to generate a new table +#ifdef WARPX_QED_TABLE_GEN +# include <physics/quantum_sync/quantum_sync_engine_tables_generator.hpp> +#endif #include <utility> +#include <vector> +#include <cstdint> using namespace std; -using namespace QedUtils; using namespace amrex; +namespace pxr_sr = picsar::multi_physics::utils::serialization; //This file provides a wrapper aroud the quantum_sync engine //provided by the PICSAR library @@ -32,14 +36,15 @@ QuantumSynchrotronEvolveOpticalDepth QuantumSynchrotronEngine::build_evolve_func { AMREX_ALWAYS_ASSERT(m_lookup_tables_initialized); - return QuantumSynchrotronEvolveOpticalDepth(m_innards); + return QuantumSynchrotronEvolveOpticalDepth(m_dndt_table.get_view(), + m_qs_minimum_chi_part); } -QuantumSynchrotronGeneratePhotonAndUpdateMomentum QuantumSynchrotronEngine::build_phot_em_functor () +QuantumSynchrotronPhotonEmission QuantumSynchrotronEngine::build_phot_em_functor () { AMREX_ALWAYS_ASSERT(m_lookup_tables_initialized); - return QuantumSynchrotronGeneratePhotonAndUpdateMomentum(m_innards); + return QuantumSynchrotronPhotonEmission(m_phot_em_table.get_view()); } @@ -50,173 +55,1170 @@ bool QuantumSynchrotronEngine::are_lookup_tables_initialized () const bool QuantumSynchrotronEngine::init_lookup_tables_from_raw_data ( - const Vector<char>& raw_data) + const vector<char>& raw_data, + const amrex::Real qs_minimum_chi_part) { - const char* p_data = raw_data.data(); - const char* const p_last = &raw_data.back(); - bool is_ok; - - //Header (control parameters) - tie(is_ok, m_innards.ctrl.chi_part_min, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_part_min)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_part_tdndt_min, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_part_tdndt_min)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_part_tdndt_max, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_part_tdndt_max)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_part_tdndt_how_many, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_part_tdndt_how_many)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_part_tem_min, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_part_tem_min)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_part_tem_max, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_part_tem_max)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.chi_part_tem_how_many, p_data) = - parse_raw_data<decltype(m_innards.ctrl.chi_part_tem_how_many)>( - p_data, p_last); - if(!is_ok) return false; - - tie(is_ok, m_innards.ctrl.prob_tem_how_many, p_data) = - parse_raw_data<decltype(m_innards.ctrl.prob_tem_how_many)>( - p_data, p_last); - if(!is_ok) return false; - - //___________________________ - - //Data - Vector<Real> tndt_coords(m_innards.ctrl.chi_part_tdndt_how_many); - Vector<Real> tndt_data(m_innards.ctrl.chi_part_tdndt_how_many); - Vector<Real> cum_tab_coords1(m_innards.ctrl.chi_part_tem_how_many); - Vector<Real> cum_tab_coords2(m_innards.ctrl.prob_tem_how_many); - Vector<Real> cum_tab_data(m_innards.ctrl.chi_part_tem_how_many* - m_innards.ctrl.prob_tem_how_many); - - tie(is_ok, tndt_coords, p_data) = - parse_raw_data_vec<Real>( - p_data, tndt_coords.size(), p_last); - if(!is_ok) return false; - m_innards.KKfunc_coords.assign(tndt_coords.begin(), tndt_coords.end()); - - tie(is_ok, tndt_data, p_data) = - parse_raw_data_vec<Real>( - p_data, tndt_data.size(), p_last); - if(!is_ok) return false; - m_innards.KKfunc_data.assign(tndt_data.begin(), tndt_data.end()); - - tie(is_ok, cum_tab_coords1, p_data) = - parse_raw_data_vec<Real>( - p_data, cum_tab_coords1.size(), p_last); - if(!is_ok) return false; - m_innards.cum_distrib_coords_1.assign( - cum_tab_coords1.begin(), cum_tab_coords1.end()); - - tie(is_ok, cum_tab_coords2, p_data) = - parse_raw_data_vec<Real>( - p_data, cum_tab_coords2.size(), p_last); - if(!is_ok) return false; - m_innards.cum_distrib_coords_2.assign( - cum_tab_coords2.begin(), cum_tab_coords2.end()); - - tie(is_ok, cum_tab_data, p_data) = - parse_raw_data_vec<Real>( - p_data, cum_tab_data.size(), p_last); - if(!is_ok) return false; - m_innards.cum_distrib_data.assign( - cum_tab_data.begin(), cum_tab_data.end()); - - //___________________________ + auto raw_iter = raw_data.begin(); + const auto size_first = pxr_sr::get_out<uint64_t>(raw_iter); + if(size_first <= 0 || size_first >= raw_data.size() ) return false; + + const auto raw_dndt_table = vector<char>{ + raw_iter, raw_iter+size_first}; + + const auto raw_phot_em_table = vector<char>{ + raw_iter+size_first, raw_data.end()}; + + m_dndt_table = QS_dndt_table{raw_dndt_table}; + m_phot_em_table = QS_phot_em_table{raw_phot_em_table}; + + if (!m_dndt_table.is_init() || !m_phot_em_table.is_init()) + return false; + + m_qs_minimum_chi_part = qs_minimum_chi_part; + + amrex::Gpu::synchronize(); + m_lookup_tables_initialized = true; return true; } -void QuantumSynchrotronEngine::init_dummy_tables() +void QuantumSynchrotronEngine::init_builtin_tables( + const amrex::Real qs_minimum_chi_part) { - m_innards.ctrl = QedUtils::QuantumSyncEngineInnardsDummy.ctrl; - m_innards.KKfunc_coords.assign( - QedUtils::QuantumSyncEngineInnardsDummy.KKfunc_coords.begin(), - QedUtils::QuantumSyncEngineInnardsDummy.KKfunc_coords.end()); - m_innards.KKfunc_data.assign( - QedUtils::QuantumSyncEngineInnardsDummy.KKfunc_data.begin(), - QedUtils::QuantumSyncEngineInnardsDummy.KKfunc_data.end()); - m_innards.cum_distrib_coords_1.assign( - QedUtils::QuantumSyncEngineInnardsDummy.cum_distrib_coords_1.begin(), - QedUtils::QuantumSyncEngineInnardsDummy.cum_distrib_coords_1.end()); - m_innards.cum_distrib_coords_2.assign( - QedUtils::QuantumSyncEngineInnardsDummy.cum_distrib_coords_2.begin(), - QedUtils::QuantumSyncEngineInnardsDummy.cum_distrib_coords_2.end()); - m_innards.cum_distrib_data.assign( - QedUtils::QuantumSyncEngineInnardsDummy.cum_distrib_data.begin(), - QedUtils::QuantumSyncEngineInnardsDummy.cum_distrib_data.end()); + init_builtin_dndt_table(); + init_builtin_phot_em_table(); + m_qs_minimum_chi_part = qs_minimum_chi_part; m_lookup_tables_initialized = true; } -Vector<char> QuantumSynchrotronEngine::export_lookup_tables_data () const +vector<char> QuantumSynchrotronEngine::export_lookup_tables_data () const { - Vector<char> res{}; - - if(!m_lookup_tables_initialized) - return res; - - add_data_to_vector_char(&m_innards.ctrl.chi_part_min, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_part_tdndt_min, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_part_tdndt_max, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_part_tdndt_how_many, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_part_tem_min, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_part_tem_max, 1, res); - add_data_to_vector_char(&m_innards.ctrl.chi_part_tem_how_many, 1, res); - add_data_to_vector_char(&m_innards.ctrl.prob_tem_how_many, 1, res); - - add_data_to_vector_char(m_innards.KKfunc_coords.data(), - m_innards.KKfunc_coords.size(), res); - add_data_to_vector_char(m_innards.KKfunc_data.data(), - m_innards.KKfunc_data.size(), res); - add_data_to_vector_char(m_innards.cum_distrib_coords_1.data(), - m_innards.cum_distrib_coords_1.size(), res); - add_data_to_vector_char(m_innards.cum_distrib_coords_2.data(), - m_innards.cum_distrib_coords_2.size(), res); - add_data_to_vector_char(m_innards.cum_distrib_data.data(), - m_innards.cum_distrib_data.size(), res); + if(!m_lookup_tables_initialized) + return vector<char>{}; + + const auto data_dndt = m_dndt_table.serialize(); + const auto data_phot_em = m_phot_em_table.serialize(); + + const uint64_t size_first = data_dndt.size(); + + vector<char> res{}; + pxr_sr::put_in(size_first, res); + for (const auto& tmp : data_dndt) + pxr_sr::put_in(tmp, res); + for (const auto& tmp : data_phot_em) + pxr_sr::put_in(tmp, res); return res; } -PicsarQuantumSynchrotronCtrl +PicsarQuantumSyncCtrl QuantumSynchrotronEngine::get_default_ctrl() const { - return PicsarQuantumSynchrotronCtrl(); + namespace pxr_qs = picsar::multi_physics::phys::quantum_sync; + return PicsarQuantumSyncCtrl{ + pxr_qs::default_dndt_lookup_table_params<amrex::Real>, + pxr_qs::default_photon_emission_lookup_table_params<amrex::Real> + }; } -const PicsarQuantumSynchrotronCtrl& -QuantumSynchrotronEngine::get_ref_ctrl() const +amrex::Real +QuantumSynchrotronEngine::get_minimum_chi_part() const { - return m_innards.ctrl; + return m_qs_minimum_chi_part; } void QuantumSynchrotronEngine::compute_lookup_tables ( - PicsarQuantumSynchrotronCtrl ctrl) + PicsarQuantumSyncCtrl ctrl, + const amrex::Real qs_minimum_chi_part) { #ifdef WARPX_QED_TABLE_GEN - m_table_builder.compute_table(ctrl, m_innards); + m_dndt_table = QS_dndt_table{ctrl.dndt_params}; + m_dndt_table.generate(true); //Progress bar is displayed + m_phot_em_table = QS_phot_em_table{ctrl.phot_em_params}; + m_phot_em_table.generate(true); //Progress bar is displayed + m_qs_minimum_chi_part = qs_minimum_chi_part; + + amrex::Gpu::synchronize(); + m_lookup_tables_initialized = true; +#else + amrex::Abort("WarpX was not compiled with table generation support!"); #endif } +void QuantumSynchrotronEngine::init_builtin_dndt_table() +{ + QS_dndt_table_params dndt_params; + dndt_params.chi_part_min = 1.0e-3_rt; + dndt_params.chi_part_max = 200.0_rt; + dndt_params.chi_part_how_many = 64; + + + const auto vals = amrex::Gpu::DeviceVector<amrex::Real>{ + -6.13623e+00_rt, -5.94268e+00_rt, -5.74917e+00_rt, -5.55571e+00_rt, + -5.36231e+00_rt, -5.16898e+00_rt, -4.97575e+00_rt, -4.78262e+00_rt, + -4.58961e+00_rt, -4.39677e+00_rt, -4.20410e+00_rt, -4.01166e+00_rt, + -3.81948e+00_rt, -3.62762e+00_rt, -3.43612e+00_rt, -3.24506e+00_rt, + -3.05451e+00_rt, -2.86456e+00_rt, -2.67529e+00_rt, -2.48681e+00_rt, + -2.29924e+00_rt, -2.11267e+00_rt, -1.92724e+00_rt, -1.74307e+00_rt, + -1.56028e+00_rt, -1.37897e+00_rt, -1.19927e+00_rt, -1.02127e+00_rt, + -8.45055e-01_rt, -6.70705e-01_rt, -4.98281e-01_rt, -3.27829e-01_rt, + -1.59381e-01_rt, 7.04180e-03_rt, 1.71434e-01_rt, 3.33803e-01_rt, + 4.94165e-01_rt, 6.52549e-01_rt, 8.08994e-01_rt, 9.63549e-01_rt, + 1.11627e+00_rt, 1.26722e+00_rt, 1.41648e+00_rt, 1.56411e+00_rt, + 1.71020e+00_rt, 1.85484e+00_rt, 1.99811e+00_rt, 2.14009e+00_rt, + 2.28088e+00_rt, 2.42056e+00_rt, 2.55922e+00_rt, 2.69694e+00_rt, + 2.83379e+00_rt, 2.96984e+00_rt, 3.10518e+00_rt, 3.23987e+00_rt, + 3.37396e+00_rt, 3.50752e+00_rt, 3.64060e+00_rt, 3.77324e+00_rt, + 3.90549e+00_rt, 4.03740e+00_rt, 4.16899e+00_rt, 4.30031e+00_rt}; + + amrex::Gpu::synchronize(); + + m_dndt_table = QS_dndt_table{dndt_params, vals}; +} + + +void QuantumSynchrotronEngine::init_builtin_phot_em_table() +{ + QS_phot_em_table_params phot_em_params; + phot_em_params.chi_part_min = 1.0e-3_rt; + phot_em_params.chi_part_max = 200.0_rt; + phot_em_params.frac_min = 1.0e-12_rt; + phot_em_params.chi_part_how_many = 64; + phot_em_params.frac_how_many = 64; + + +const auto vals = amrex::Gpu::DeviceVector<amrex::Real>{ +-6.83368e+00_rt, -6.68749e+00_rt, -6.54129e+00_rt, -6.39510e+00_rt, +-6.24890e+00_rt, -6.10271e+00_rt, -5.95651e+00_rt, -5.81031e+00_rt, +-5.66412e+00_rt, -5.51792e+00_rt, -5.37173e+00_rt, -5.22554e+00_rt, +-5.07934e+00_rt, -4.93315e+00_rt, -4.78696e+00_rt, -4.64076e+00_rt, +-4.49457e+00_rt, -4.34839e+00_rt, -4.20220e+00_rt, -4.05602e+00_rt, +-3.90984e+00_rt, -3.76367e+00_rt, -3.61751e+00_rt, -3.47136e+00_rt, +-3.32522e+00_rt, -3.17911e+00_rt, -3.03302e+00_rt, -2.88697e+00_rt, +-2.74097e+00_rt, -2.59504e+00_rt, -2.44919e+00_rt, -2.30347e+00_rt, +-2.15790e+00_rt, -2.01255e+00_rt, -1.86749e+00_rt, -1.72282e+00_rt, +-1.57867e+00_rt, -1.43521e+00_rt, -1.29270e+00_rt, -1.15146e+00_rt, +-1.01194e+00_rt, -8.74744e-01_rt, -7.40699e-01_rt, -6.10940e-01_rt, +-4.87011e-01_rt, -3.70993e-01_rt, -2.65630e-01_rt, -1.74333e-01_rt, +-1.00881e-01_rt, -4.84058e-02_rt, -1.74572e-02_rt, -4.04316e-03_rt, +-4.68433e-04_rt, -1.82946e-05_rt, -1.28390e-07_rt, -7.14633e-11_rt, +-1.32240e-11_rt, -1.32236e-11_rt, -1.32236e-11_rt, -1.32236e-11_rt, +-1.32236e-11_rt, -1.32236e-11_rt, -1.32236e-11_rt, 0.00000e+00_rt, +-6.89807e+00_rt, -6.75188e+00_rt, -6.60568e+00_rt, -6.45948e+00_rt, +-6.31329e+00_rt, -6.16709e+00_rt, -6.02090e+00_rt, -5.87470e+00_rt, +-5.72851e+00_rt, -5.58231e+00_rt, -5.43612e+00_rt, -5.28992e+00_rt, +-5.14373e+00_rt, -4.99753e+00_rt, -4.85134e+00_rt, -4.70515e+00_rt, +-4.55896e+00_rt, -4.41277e+00_rt, -4.26658e+00_rt, -4.12040e+00_rt, +-3.97422e+00_rt, -3.82804e+00_rt, -3.68188e+00_rt, -3.53572e+00_rt, +-3.38958e+00_rt, -3.24346e+00_rt, -3.09736e+00_rt, -2.95129e+00_rt, +-2.80526e+00_rt, -2.65930e+00_rt, -2.51341e+00_rt, -2.36763e+00_rt, +-2.22199e+00_rt, -2.07654e+00_rt, -1.93134e+00_rt, -1.78648e+00_rt, +-1.64208e+00_rt, -1.49829e+00_rt, -1.35533e+00_rt, -1.21348e+00_rt, +-1.07314e+00_rt, -9.34824e-01_rt, -7.99268e-01_rt, -6.67454e-01_rt, +-5.40730e-01_rt, -4.20925e-01_rt, -3.10479e-01_rt, -2.12523e-01_rt, +-1.30747e-01_rt, -6.87573e-02_rt, -2.85300e-02_rt, -8.21443e-03_rt, +-1.33651e-03_rt, -8.87127e-05_rt, -1.42937e-06_rt, -2.40958e-09_rt, +-2.41052e-12_rt, -2.30649e-12_rt, -2.30649e-12_rt, -2.30649e-12_rt, +-2.30649e-12_rt, -2.30649e-12_rt, -2.30649e-12_rt, 0.00000e+00_rt, +-6.96242e+00_rt, -6.81622e+00_rt, -6.67002e+00_rt, -6.52383e+00_rt, +-6.37763e+00_rt, -6.23144e+00_rt, -6.08524e+00_rt, -5.93905e+00_rt, +-5.79285e+00_rt, -5.64665e+00_rt, -5.50046e+00_rt, -5.35427e+00_rt, +-5.20807e+00_rt, -5.06188e+00_rt, -4.91568e+00_rt, -4.76949e+00_rt, +-4.62330e+00_rt, -4.47711e+00_rt, -4.33092e+00_rt, -4.18474e+00_rt, +-4.03856e+00_rt, -3.89238e+00_rt, -3.74621e+00_rt, -3.60005e+00_rt, +-3.45390e+00_rt, -3.30777e+00_rt, -3.16165e+00_rt, -3.01557e+00_rt, +-2.86953e+00_rt, -2.72353e+00_rt, -2.57761e+00_rt, -2.43178e+00_rt, +-2.28607e+00_rt, -2.14053e+00_rt, -1.99521e+00_rt, -1.85018e+00_rt, +-1.70556e+00_rt, -1.56148e+00_rt, -1.41813e+00_rt, -1.27574e+00_rt, +-1.13468e+00_rt, -9.95396e-01_rt, -8.58520e-01_rt, -7.24912e-01_rt, +-5.95749e-01_rt, -4.72630e-01_rt, -3.57712e-01_rt, -2.53820e-01_rt, +-1.64441e-01_rt, -9.33509e-02_rt, -4.35013e-02_rt, -1.49849e-02_rt, +-3.22456e-03_rt, -3.31351e-04_rt, -1.05911e-05_rt, -5.25639e-08_rt, +-1.48073e-11_rt, -2.08211e-12_rt, -2.08211e-12_rt, -2.08211e-12_rt, +-2.08211e-12_rt, -2.08211e-12_rt, -2.08211e-12_rt, 0.00000e+00_rt, +-7.02671e+00_rt, -6.88051e+00_rt, -6.73432e+00_rt, -6.58812e+00_rt, +-6.44193e+00_rt, -6.29573e+00_rt, -6.14954e+00_rt, -6.00334e+00_rt, +-5.85714e+00_rt, -5.71095e+00_rt, -5.56475e+00_rt, -5.41856e+00_rt, +-5.27236e+00_rt, -5.12617e+00_rt, -4.97998e+00_rt, -4.83378e+00_rt, +-4.68759e+00_rt, -4.54140e+00_rt, -4.39521e+00_rt, -4.24903e+00_rt, +-4.10284e+00_rt, -3.95666e+00_rt, -3.81049e+00_rt, -3.66433e+00_rt, +-3.51817e+00_rt, -3.37203e+00_rt, -3.22591e+00_rt, -3.07981e+00_rt, +-2.93375e+00_rt, -2.78773e+00_rt, -2.64177e+00_rt, -2.49590e+00_rt, +-2.35013e+00_rt, -2.20451e+00_rt, -2.05908e+00_rt, -1.91392e+00_rt, +-1.76911e+00_rt, -1.62477e+00_rt, -1.48106e+00_rt, -1.33822e+00_rt, +-1.19652e+00_rt, -1.05638e+00_rt, -9.18354e-01_rt, -7.83181e-01_rt, +-6.51887e-01_rt, -5.25873e-01_rt, -4.07032e-01_rt, -2.97887e-01_rt, +-2.01651e-01_rt, -1.22060e-01_rt, -6.26329e-02_rt, -2.50149e-02_rt, +-6.77615e-03_rt, -9.98061e-04_rt, -5.61030e-05_rt, -6.78360e-07_rt, +-6.88729e-10_rt, -9.53426e-12_rt, -9.52349e-12_rt, -9.52349e-12_rt, +-9.52349e-12_rt, -9.52349e-12_rt, -9.52349e-12_rt, 0.00000e+00_rt, +-7.09094e+00_rt, -6.94475e+00_rt, -6.79855e+00_rt, -6.65236e+00_rt, +-6.50616e+00_rt, -6.35997e+00_rt, -6.21377e+00_rt, -6.06757e+00_rt, +-5.92138e+00_rt, -5.77518e+00_rt, -5.62899e+00_rt, -5.48279e+00_rt, +-5.33660e+00_rt, -5.19040e+00_rt, -5.04421e+00_rt, -4.89802e+00_rt, +-4.75182e+00_rt, -4.60563e+00_rt, -4.45944e+00_rt, -4.31326e+00_rt, +-4.16707e+00_rt, -4.02089e+00_rt, -3.87471e+00_rt, -3.72855e+00_rt, +-3.58239e+00_rt, -3.43624e+00_rt, -3.29011e+00_rt, -3.14400e+00_rt, +-2.99792e+00_rt, -2.85188e+00_rt, -2.70589e+00_rt, -2.55998e+00_rt, +-2.41416e+00_rt, -2.26847e+00_rt, -2.12295e+00_rt, -1.97766e+00_rt, +-1.83268e+00_rt, -1.68811e+00_rt, -1.54410e+00_rt, -1.40085e+00_rt, +-1.25860e+00_rt, -1.11772e+00_rt, -9.78681e-01_rt, -8.42140e-01_rt, +-7.08987e-01_rt, -5.80444e-01_rt, -4.58170e-01_rt, -3.44398e-01_rt, +-2.42039e-01_rt, -1.54649e-01_rt, -8.59929e-02_rt, -3.88131e-02_rt, +-1.27086e-02_rt, -2.51783e-03_rt, -2.25371e-04_rt, -5.67634e-06_rt, +-1.83116e-08_rt, -7.44138e-12_rt, -5.50848e-12_rt, -5.50848e-12_rt, +-5.50848e-12_rt, -5.50848e-12_rt, -5.50848e-12_rt, 0.00000e+00_rt, +-7.15510e+00_rt, -7.00891e+00_rt, -6.86271e+00_rt, -6.71652e+00_rt, +-6.57032e+00_rt, -6.42413e+00_rt, -6.27793e+00_rt, -6.13173e+00_rt, +-5.98554e+00_rt, -5.83934e+00_rt, -5.69315e+00_rt, -5.54695e+00_rt, +-5.40076e+00_rt, -5.25456e+00_rt, -5.10837e+00_rt, -4.96218e+00_rt, +-4.81598e+00_rt, -4.66979e+00_rt, -4.52360e+00_rt, -4.37741e+00_rt, +-4.23123e+00_rt, -4.08504e+00_rt, -3.93887e+00_rt, -3.79269e+00_rt, +-3.64653e+00_rt, -3.50038e+00_rt, -3.35424e+00_rt, -3.20812e+00_rt, +-3.06202e+00_rt, -2.91597e+00_rt, -2.76995e+00_rt, -2.62400e+00_rt, +-2.47814e+00_rt, -2.33239e+00_rt, -2.18679e+00_rt, -2.04139e+00_rt, +-1.89626e+00_rt, -1.75149e+00_rt, -1.60722e+00_rt, -1.46360e+00_rt, +-1.32087e+00_rt, -1.17934e+00_rt, -1.03942e+00_rt, -9.01681e-01_rt, +-7.66906e-01_rt, -6.36155e-01_rt, -5.10880e-01_rt, -3.93046e-01_rt, +-2.85258e-01_rt, -1.90814e-01_rt, -1.13487e-01_rt, -5.66916e-02_rt, +-2.17036e-02_rt, -5.48859e-03_rt, -7.20753e-04_rt, -3.32360e-05_rt, +-2.81000e-07_rt, -1.48662e-10_rt, -7.22000e-12_rt, -7.21945e-12_rt, +-7.21945e-12_rt, -7.21945e-12_rt, -7.21945e-12_rt, 0.00000e+00_rt, +-7.21918e+00_rt, -7.07298e+00_rt, -6.92678e+00_rt, -6.78059e+00_rt, +-6.63439e+00_rt, -6.48820e+00_rt, -6.34200e+00_rt, -6.19581e+00_rt, +-6.04961e+00_rt, -5.90341e+00_rt, -5.75722e+00_rt, -5.61102e+00_rt, +-5.46483e+00_rt, -5.31863e+00_rt, -5.17244e+00_rt, -5.02625e+00_rt, +-4.88005e+00_rt, -4.73386e+00_rt, -4.58767e+00_rt, -4.44148e+00_rt, +-4.29529e+00_rt, -4.14911e+00_rt, -4.00293e+00_rt, -3.85675e+00_rt, +-3.71059e+00_rt, -3.56443e+00_rt, -3.41828e+00_rt, -3.27215e+00_rt, +-3.12605e+00_rt, -2.97997e+00_rt, -2.83394e+00_rt, -2.68796e+00_rt, +-2.54205e+00_rt, -2.39625e+00_rt, -2.25057e+00_rt, -2.10508e+00_rt, +-1.95982e+00_rt, -1.81488e+00_rt, -1.67037e+00_rt, -1.52644e+00_rt, +-1.38329e+00_rt, -1.24118e+00_rt, -1.10049e+00_rt, -9.61708e-01_rt, +-8.25515e-01_rt, -6.92837e-01_rt, -5.64941e-01_rt, -4.43549e-01_rt, +-3.30974e-01_rt, -2.30216e-01_rt, -1.44899e-01_rt, -7.87630e-02_rt, +-3.43106e-02_rt, -1.06083e-02_rt, -1.91011e-03_rt, -1.44988e-04_rt, +-2.71228e-06_rt, -4.95880e-09_rt, -1.54320e-11_rt, -1.52724e-11_rt, +-1.52724e-11_rt, -1.52724e-11_rt, -1.52724e-11_rt, 0.00000e+00_rt, +-7.28314e+00_rt, -7.13695e+00_rt, -6.99075e+00_rt, -6.84455e+00_rt, +-6.69836e+00_rt, -6.55216e+00_rt, -6.40597e+00_rt, -6.25977e+00_rt, +-6.11358e+00_rt, -5.96738e+00_rt, -5.82118e+00_rt, -5.67499e+00_rt, +-5.52879e+00_rt, -5.38260e+00_rt, -5.23640e+00_rt, -5.09021e+00_rt, +-4.94402e+00_rt, -4.79782e+00_rt, -4.65163e+00_rt, -4.50544e+00_rt, +-4.35925e+00_rt, -4.21307e+00_rt, -4.06689e+00_rt, -3.92071e+00_rt, +-3.77454e+00_rt, -3.62837e+00_rt, -3.48222e+00_rt, -3.33609e+00_rt, +-3.18997e+00_rt, -3.04388e+00_rt, -2.89783e+00_rt, -2.75182e+00_rt, +-2.60588e+00_rt, -2.46003e+00_rt, -2.31429e+00_rt, -2.16871e+00_rt, +-2.02334e+00_rt, -1.87825e+00_rt, -1.73353e+00_rt, -1.58933e+00_rt, +-1.44580e+00_rt, -1.30319e+00_rt, -1.16182e+00_rt, -1.02213e+00_rt, +-8.84697e-01_rt, -7.50336e-01_rt, -6.20152e-01_rt, -4.95651e-01_rt, +-3.78870e-01_rt, -2.72504e-01_rt, -1.79934e-01_rt, -1.04967e-01_rt, +-5.08903e-02_rt, -1.85694e-02_rt, -4.33586e-03_rt, -4.96245e-04_rt, +-1.78626e-05_rt, -9.39993e-08_rt, -2.60318e-11_rt, -8.32656e-12_rt, +-8.32656e-12_rt, -8.32656e-12_rt, -8.32656e-12_rt, 0.00000e+00_rt, +-7.34698e+00_rt, -7.20078e+00_rt, -7.05459e+00_rt, -6.90839e+00_rt, +-6.76220e+00_rt, -6.61600e+00_rt, -6.46980e+00_rt, -6.32361e+00_rt, +-6.17741e+00_rt, -6.03122e+00_rt, -5.88502e+00_rt, -5.73883e+00_rt, +-5.59263e+00_rt, -5.44644e+00_rt, -5.30024e+00_rt, -5.15405e+00_rt, +-5.00785e+00_rt, -4.86166e+00_rt, -4.71547e+00_rt, -4.56928e+00_rt, +-4.42309e+00_rt, -4.27690e+00_rt, -4.13072e+00_rt, -3.98454e+00_rt, +-3.83836e+00_rt, -3.69220e+00_rt, -3.54604e+00_rt, -3.39989e+00_rt, +-3.25377e+00_rt, -3.10767e+00_rt, -2.96159e+00_rt, -2.81557e+00_rt, +-2.66959e+00_rt, -2.52370e+00_rt, -2.37791e+00_rt, -2.23225e+00_rt, +-2.08678e+00_rt, -1.94155e+00_rt, -1.79666e+00_rt, -1.65221e+00_rt, +-1.50836e+00_rt, -1.36532e+00_rt, -1.22336e+00_rt, -1.08286e+00_rt, +-9.44344e-01_rt, -8.08515e-01_rt, -6.76333e-01_rt, -5.49115e-01_rt, +-4.28649e-01_rt, -3.17331e-01_rt, -2.18253e-01_rt, -1.35109e-01_rt, +-7.16006e-02_rt, -2.99558e-02_rt, -8.66338e-03_rt, -1.39061e-03_rt, +-8.58450e-05_rt, -1.08211e-06_rt, -8.81213e-10_rt, -9.14124e-12_rt, +-9.13691e-12_rt, -9.13691e-12_rt, -9.13691e-12_rt, 0.00000e+00_rt, +-7.41066e+00_rt, -7.26447e+00_rt, -7.11827e+00_rt, -6.97207e+00_rt, +-6.82588e+00_rt, -6.67968e+00_rt, -6.53349e+00_rt, -6.38729e+00_rt, +-6.24109e+00_rt, -6.09490e+00_rt, -5.94870e+00_rt, -5.80251e+00_rt, +-5.65631e+00_rt, -5.51012e+00_rt, -5.36392e+00_rt, -5.21773e+00_rt, +-5.07153e+00_rt, -4.92534e+00_rt, -4.77915e+00_rt, -4.63296e+00_rt, +-4.48677e+00_rt, -4.34058e+00_rt, -4.19439e+00_rt, -4.04821e+00_rt, +-3.90204e+00_rt, -3.75586e+00_rt, -3.60970e+00_rt, -3.46355e+00_rt, +-3.31742e+00_rt, -3.17130e+00_rt, -3.02522e+00_rt, -2.87917e+00_rt, +-2.73317e+00_rt, -2.58724e+00_rt, -2.44140e+00_rt, -2.29568e+00_rt, +-2.15012e+00_rt, -2.00477e+00_rt, -1.85972e+00_rt, -1.71506e+00_rt, +-1.57092e+00_rt, -1.42749e+00_rt, -1.28501e+00_rt, -1.14382e+00_rt, +-1.00436e+00_rt, -8.67244e-01_rt, -7.33318e-01_rt, -6.03728e-01_rt, +-4.80039e-01_rt, -3.64367e-01_rt, -2.59499e-01_rt, -1.68904e-01_rt, +-9.64162e-02_rt, -4.51735e-02_rt, -1.55832e-02_rt, -3.30468e-03_rt, +-3.18182e-04_rt, -8.23951e-06_rt, -2.20029e-08_rt, -9.32820e-12_rt, +-8.44891e-12_rt, -8.44891e-12_rt, -8.44891e-12_rt, 0.00000e+00_rt, +-7.47416e+00_rt, -7.32796e+00_rt, -7.18177e+00_rt, -7.03557e+00_rt, +-6.88938e+00_rt, -6.74318e+00_rt, -6.59698e+00_rt, -6.45079e+00_rt, +-6.30459e+00_rt, -6.15840e+00_rt, -6.01220e+00_rt, -5.86601e+00_rt, +-5.71981e+00_rt, -5.57362e+00_rt, -5.42742e+00_rt, -5.28123e+00_rt, +-5.13503e+00_rt, -4.98884e+00_rt, -4.84264e+00_rt, -4.69645e+00_rt, +-4.55026e+00_rt, -4.40407e+00_rt, -4.25789e+00_rt, -4.11170e+00_rt, +-3.96552e+00_rt, -3.81935e+00_rt, -3.67318e+00_rt, -3.52703e+00_rt, +-3.38089e+00_rt, -3.23476e+00_rt, -3.08866e+00_rt, -2.94260e+00_rt, +-2.79657e+00_rt, -2.65061e+00_rt, -2.50473e+00_rt, -2.35895e+00_rt, +-2.21331e+00_rt, -2.06786e+00_rt, -1.92267e+00_rt, -1.77782e+00_rt, +-1.63344e+00_rt, -1.48967e+00_rt, -1.34674e+00_rt, -1.20493e+00_rt, +-1.06464e+00_rt, -9.26404e-01_rt, -7.90955e-01_rt, -6.59295e-01_rt, +-5.32790e-01_rt, -4.13301e-01_rt, -3.03311e-01_rt, -2.06012e-01_rt, +-1.25166e-01_rt, -6.44255e-02_rt, -2.57044e-02_rt, -6.85590e-03_rt, +-9.51994e-04_rt, -4.46223e-05_rt, -3.19559e-07_rt, -7.43913e-11_rt, +-3.27816e-12_rt, -3.27816e-12_rt, -3.27816e-12_rt, 0.00000e+00_rt, +-7.53744e+00_rt, -7.39124e+00_rt, -7.24504e+00_rt, -7.09885e+00_rt, +-6.95265e+00_rt, -6.80646e+00_rt, -6.66026e+00_rt, -6.51407e+00_rt, +-6.36787e+00_rt, -6.22167e+00_rt, -6.07548e+00_rt, -5.92928e+00_rt, +-5.78309e+00_rt, -5.63689e+00_rt, -5.49070e+00_rt, -5.34450e+00_rt, +-5.19831e+00_rt, -5.05211e+00_rt, -4.90592e+00_rt, -4.75973e+00_rt, +-4.61354e+00_rt, -4.46735e+00_rt, -4.32116e+00_rt, -4.17497e+00_rt, +-4.02879e+00_rt, -3.88262e+00_rt, -3.73645e+00_rt, -3.59029e+00_rt, +-3.44414e+00_rt, -3.29801e+00_rt, -3.15189e+00_rt, -3.00581e+00_rt, +-2.85977e+00_rt, -2.71378e+00_rt, -2.56785e+00_rt, -2.42203e+00_rt, +-2.27632e+00_rt, -2.13078e+00_rt, -1.98547e+00_rt, -1.84046e+00_rt, +-1.69585e+00_rt, -1.55179e+00_rt, -1.40846e+00_rt, -1.26611e+00_rt, +-1.12510e+00_rt, -9.85880e-01_rt, -8.49102e-01_rt, -7.15634e-01_rt, +-5.86670e-01_rt, -4.63841e-01_rt, -3.49344e-01_rt, -2.46067e-01_rt, +-1.57574e-01_rt, -8.77228e-02_rt, -3.94737e-02_rt, -1.27172e-02_rt, +-2.38737e-03_rt, -1.82476e-04_rt, -2.94710e-06_rt, -2.70147e-09_rt, +-3.03868e-12_rt, -3.03213e-12_rt, -3.03213e-12_rt, 0.00000e+00_rt, +-7.60045e+00_rt, -7.45425e+00_rt, -7.30806e+00_rt, -7.16186e+00_rt, +-7.01567e+00_rt, -6.86947e+00_rt, -6.72328e+00_rt, -6.57708e+00_rt, +-6.43088e+00_rt, -6.28469e+00_rt, -6.13849e+00_rt, -5.99230e+00_rt, +-5.84610e+00_rt, -5.69991e+00_rt, -5.55371e+00_rt, -5.40752e+00_rt, +-5.26132e+00_rt, -5.11513e+00_rt, -4.96893e+00_rt, -4.82274e+00_rt, +-4.67655e+00_rt, -4.53036e+00_rt, -4.38417e+00_rt, -4.23798e+00_rt, +-4.09180e+00_rt, -3.94562e+00_rt, -3.79945e+00_rt, -3.65328e+00_rt, +-3.50713e+00_rt, -3.36099e+00_rt, -3.21487e+00_rt, -3.06877e+00_rt, +-2.92271e+00_rt, -2.77669e+00_rt, -2.63074e+00_rt, -2.48486e+00_rt, +-2.33910e+00_rt, -2.19348e+00_rt, -2.04806e+00_rt, -1.90291e+00_rt, +-1.75811e+00_rt, -1.61378e+00_rt, -1.47010e+00_rt, -1.32729e+00_rt, +-1.18564e+00_rt, -1.04556e+00_rt, -9.07623e-01_rt, -7.72576e-01_rt, +-6.41466e-01_rt, -5.15718e-01_rt, -3.97268e-01_rt, -2.88696e-01_rt, +-1.93301e-01_rt, -1.14918e-01_rt, -5.71378e-02_rt, -2.15106e-02_rt, +-5.17615e-03_rt, -5.91934e-04_rt, -1.86877e-05_rt, -5.48948e-08_rt, +-9.48919e-12_rt, -8.28793e-12_rt, -8.28793e-12_rt, 0.00000e+00_rt, +-7.66315e+00_rt, -7.51696e+00_rt, -7.37076e+00_rt, -7.22456e+00_rt, +-7.07837e+00_rt, -6.93217e+00_rt, -6.78598e+00_rt, -6.63978e+00_rt, +-6.49359e+00_rt, -6.34739e+00_rt, -6.20119e+00_rt, -6.05500e+00_rt, +-5.90880e+00_rt, -5.76261e+00_rt, -5.61641e+00_rt, -5.47022e+00_rt, +-5.32402e+00_rt, -5.17783e+00_rt, -5.03163e+00_rt, -4.88544e+00_rt, +-4.73925e+00_rt, -4.59306e+00_rt, -4.44687e+00_rt, -4.30068e+00_rt, +-4.15450e+00_rt, -4.00831e+00_rt, -3.86214e+00_rt, -3.71597e+00_rt, +-3.56981e+00_rt, -3.42366e+00_rt, -3.27753e+00_rt, -3.13143e+00_rt, +-2.98535e+00_rt, -2.83931e+00_rt, -2.69332e+00_rt, -2.54741e+00_rt, +-2.40159e+00_rt, -2.25591e+00_rt, -2.11039e+00_rt, -1.96511e+00_rt, +-1.82014e+00_rt, -1.67559e+00_rt, -1.53160e+00_rt, -1.38838e+00_rt, +-1.24617e+00_rt, -1.10535e+00_rt, -9.66389e-01_rt, -8.29963e-01_rt, +-6.96980e-01_rt, -5.68682e-01_rt, -4.46770e-01_rt, -3.33534e-01_rt, +-2.31969e-01_rt, -1.45746e-01_rt, -7.87448e-02_rt, -3.37167e-02_rt, +-9.95408e-03_rt, -1.58635e-03_rt, -8.70168e-05_rt, -6.67831e-07_rt, +-9.66782e-11_rt, -7.57749e-12_rt, -7.57749e-12_rt, 0.00000e+00_rt, +-7.72548e+00_rt, -7.57929e+00_rt, -7.43309e+00_rt, -7.28690e+00_rt, +-7.14070e+00_rt, -6.99450e+00_rt, -6.84831e+00_rt, -6.70211e+00_rt, +-6.55592e+00_rt, -6.40972e+00_rt, -6.26352e+00_rt, -6.11733e+00_rt, +-5.97113e+00_rt, -5.82494e+00_rt, -5.67874e+00_rt, -5.53255e+00_rt, +-5.38635e+00_rt, -5.24016e+00_rt, -5.09396e+00_rt, -4.94777e+00_rt, +-4.80158e+00_rt, -4.65539e+00_rt, -4.50920e+00_rt, -4.36301e+00_rt, +-4.21682e+00_rt, -4.07064e+00_rt, -3.92446e+00_rt, -3.77829e+00_rt, +-3.63212e+00_rt, -3.48597e+00_rt, -3.33983e+00_rt, -3.19371e+00_rt, +-3.04762e+00_rt, -2.90156e+00_rt, -2.75555e+00_rt, -2.60961e+00_rt, +-2.46374e+00_rt, -2.31800e+00_rt, -2.17240e+00_rt, -2.02701e+00_rt, +-1.88189e+00_rt, -1.73714e+00_rt, -1.59288e+00_rt, -1.44929e+00_rt, +-1.30660e+00_rt, -1.16512e+00_rt, -1.02527e+00_rt, -8.87642e-01_rt, +-7.53022e-01_rt, -6.22499e-01_rt, -4.97561e-01_rt, -3.80228e-01_rt, +-2.73191e-01_rt, -1.79866e-01_rt, -1.04173e-01_rt, -4.96236e-02_rt, +-1.73398e-02_rt, -3.63192e-03_rt, -3.14100e-04_rt, -5.32039e-06_rt, +-3.17026e-09_rt, -2.22048e-11_rt, -2.22045e-11_rt, 0.00000e+00_rt, +-7.78738e+00_rt, -7.64118e+00_rt, -7.49499e+00_rt, -7.34879e+00_rt, +-7.20259e+00_rt, -7.05640e+00_rt, -6.91020e+00_rt, -6.76401e+00_rt, +-6.61781e+00_rt, -6.47162e+00_rt, -6.32542e+00_rt, -6.17922e+00_rt, +-6.03303e+00_rt, -5.88683e+00_rt, -5.74064e+00_rt, -5.59444e+00_rt, +-5.44825e+00_rt, -5.30205e+00_rt, -5.15586e+00_rt, -5.00966e+00_rt, +-4.86347e+00_rt, -4.71728e+00_rt, -4.57109e+00_rt, -4.42490e+00_rt, +-4.27871e+00_rt, -4.13253e+00_rt, -3.98635e+00_rt, -3.84017e+00_rt, +-3.69400e+00_rt, -3.54785e+00_rt, -3.40170e+00_rt, -3.25557e+00_rt, +-3.10947e+00_rt, -2.96339e+00_rt, -2.81736e+00_rt, -2.67138e+00_rt, +-2.52548e+00_rt, -2.37968e+00_rt, -2.23401e+00_rt, -2.08852e+00_rt, +-1.94327e+00_rt, -1.79834e+00_rt, -1.65385e+00_rt, -1.50995e+00_rt, +-1.36683e+00_rt, -1.22477e+00_rt, -1.08414e+00_rt, -9.45461e-01_rt, +-8.09413e-01_rt, -6.76947e-01_rt, -5.49366e-01_rt, -4.28446e-01_rt, +-3.16580e-01_rt, -2.16891e-01_rt, -1.33169e-01_rt, -6.93177e-02_rt, +-2.78380e-02_rt, -7.30271e-03_rt, -9.19046e-04_rt, -2.98964e-05_rt, +-6.03839e-08_rt, -1.53989e-11_rt, -1.52887e-11_rt, 0.00000e+00_rt, +-7.84876e+00_rt, -7.70257e+00_rt, -7.55637e+00_rt, -7.41017e+00_rt, +-7.26398e+00_rt, -7.11778e+00_rt, -6.97159e+00_rt, -6.82539e+00_rt, +-6.67920e+00_rt, -6.53300e+00_rt, -6.38680e+00_rt, -6.24061e+00_rt, +-6.09441e+00_rt, -5.94822e+00_rt, -5.80202e+00_rt, -5.65583e+00_rt, +-5.50963e+00_rt, -5.36344e+00_rt, -5.21724e+00_rt, -5.07105e+00_rt, +-4.92485e+00_rt, -4.77866e+00_rt, -4.63247e+00_rt, -4.48628e+00_rt, +-4.34009e+00_rt, -4.19391e+00_rt, -4.04772e+00_rt, -3.90155e+00_rt, +-3.75538e+00_rt, -3.60921e+00_rt, -3.46306e+00_rt, -3.31693e+00_rt, +-3.17081e+00_rt, -3.02472e+00_rt, -2.87867e+00_rt, -2.73266e+00_rt, +-2.58673e+00_rt, -2.44087e+00_rt, -2.29514e+00_rt, -2.14957e+00_rt, +-2.00420e+00_rt, -1.85912e+00_rt, -1.71442e+00_rt, -1.57024e+00_rt, +-1.42675e+00_rt, -1.28418e+00_rt, -1.14288e+00_rt, -1.00328e+00_rt, +-8.65978e-01_rt, -7.31817e-01_rt, -6.01928e-01_rt, -4.77871e-01_rt, +-3.61762e-01_rt, -2.56416e-01_rt, -1.65391e-01_rt, -9.27046e-02_rt, +-4.17753e-02_rt, -1.31925e-02_rt, -2.26148e-03_rt, -1.25980e-04_rt, +-6.99647e-07_rt, -1.03404e-11_rt, 0.00000e+00_rt, 0.00000e+00_rt, +-7.90955e+00_rt, -7.76336e+00_rt, -7.61716e+00_rt, -7.47096e+00_rt, +-7.32477e+00_rt, -7.17857e+00_rt, -7.03238e+00_rt, -6.88618e+00_rt, +-6.73999e+00_rt, -6.59379e+00_rt, -6.44759e+00_rt, -6.30140e+00_rt, +-6.15520e+00_rt, -6.00901e+00_rt, -5.86281e+00_rt, -5.71662e+00_rt, +-5.57042e+00_rt, -5.42423e+00_rt, -5.27803e+00_rt, -5.13184e+00_rt, +-4.98564e+00_rt, -4.83945e+00_rt, -4.69326e+00_rt, -4.54707e+00_rt, +-4.40088e+00_rt, -4.25469e+00_rt, -4.10851e+00_rt, -3.96233e+00_rt, +-3.81615e+00_rt, -3.66999e+00_rt, -3.52383e+00_rt, -3.37769e+00_rt, +-3.23156e+00_rt, -3.08546e+00_rt, -2.93939e+00_rt, -2.79336e+00_rt, +-2.64739e+00_rt, -2.50150e+00_rt, -2.35571e+00_rt, -2.21006e+00_rt, +-2.06460e+00_rt, -1.91938e+00_rt, -1.77450e+00_rt, -1.63007e+00_rt, +-1.48625e+00_rt, -1.34325e+00_rt, -1.20135e+00_rt, -1.06094e+00_rt, +-9.22547e-01_rt, -7.86905e-01_rt, -6.55002e-01_rt, -5.28204e-01_rt, +-4.08376e-01_rt, -2.98032e-01_rt, -2.00444e-01_rt, -1.19547e-01_rt, +-5.92784e-02_rt, -2.18163e-02_rt, -4.82406e-03_rt, -4.18699e-04_rt, +-5.35426e-06_rt, -5.59711e-10_rt, 0.00000e+00_rt, 0.00000e+00_rt, +-7.96965e+00_rt, -7.82346e+00_rt, -7.67726e+00_rt, -7.53107e+00_rt, +-7.38487e+00_rt, -7.23867e+00_rt, -7.09248e+00_rt, -6.94628e+00_rt, +-6.80009e+00_rt, -6.65389e+00_rt, -6.50770e+00_rt, -6.36150e+00_rt, +-6.21530e+00_rt, -6.06911e+00_rt, -5.92291e+00_rt, -5.77672e+00_rt, +-5.63052e+00_rt, -5.48433e+00_rt, -5.33813e+00_rt, -5.19194e+00_rt, +-5.04574e+00_rt, -4.89955e+00_rt, -4.75336e+00_rt, -4.60717e+00_rt, +-4.46098e+00_rt, -4.31479e+00_rt, -4.16860e+00_rt, -4.02242e+00_rt, +-3.87624e+00_rt, -3.73007e+00_rt, -3.58391e+00_rt, -3.43776e+00_rt, +-3.29163e+00_rt, -3.14552e+00_rt, -2.99943e+00_rt, -2.85338e+00_rt, +-2.70739e+00_rt, -2.56146e+00_rt, -2.41562e+00_rt, -2.26990e+00_rt, +-2.12435e+00_rt, -1.97902e+00_rt, -1.83398e+00_rt, -1.68933e+00_rt, +-1.54522e+00_rt, -1.40183e+00_rt, -1.25941e+00_rt, -1.11829e+00_rt, +-9.78952e-01_rt, -8.42015e-01_rt, -7.08354e-01_rt, -5.79163e-01_rt, +-4.56081e-01_rt, -3.41341e-01_rt, -2.37906e-01_rt, -1.49508e-01_rt, +-8.02862e-02_rt, -3.35354e-02_rt, -9.14653e-03_rt, -1.14413e-03_rt, +-2.91028e-05_rt, -1.37503e-08_rt, 0.00000e+00_rt, 0.00000e+00_rt, +-8.02897e+00_rt, -7.88277e+00_rt, -7.73657e+00_rt, -7.59038e+00_rt, +-7.44418e+00_rt, -7.29799e+00_rt, -7.15179e+00_rt, -7.00560e+00_rt, +-6.85940e+00_rt, -6.71320e+00_rt, -6.56701e+00_rt, -6.42081e+00_rt, +-6.27462e+00_rt, -6.12842e+00_rt, -5.98223e+00_rt, -5.83603e+00_rt, +-5.68983e+00_rt, -5.54364e+00_rt, -5.39744e+00_rt, -5.25125e+00_rt, +-5.10506e+00_rt, -4.95886e+00_rt, -4.81267e+00_rt, -4.66648e+00_rt, +-4.52029e+00_rt, -4.37410e+00_rt, -4.22791e+00_rt, -4.08173e+00_rt, +-3.93555e+00_rt, -3.78937e+00_rt, -3.64321e+00_rt, -3.49705e+00_rt, +-3.35091e+00_rt, -3.20479e+00_rt, -3.05869e+00_rt, -2.91262e+00_rt, +-2.76660e+00_rt, -2.62064e+00_rt, -2.47476e+00_rt, -2.32899e+00_rt, +-2.18336e+00_rt, -2.03792e+00_rt, -1.89274e+00_rt, -1.74791e+00_rt, +-1.60355e+00_rt, -1.45981e+00_rt, -1.31693e+00_rt, -1.17520e+00_rt, +-1.03502e+00_rt, -8.96956e-01_rt, -7.61760e-01_rt, -6.30479e-01_rt, +-5.04555e-01_rt, -3.85958e-01_rt, -2.77349e-01_rt, -1.82185e-01_rt, +-1.04585e-01_rt, -4.85205e-02_rt, -1.57346e-02_rt, -2.66015e-03_rt, +-1.19304e-04_rt, -1.95626e-07_rt, 0.00000e+00_rt, 0.00000e+00_rt, +-8.08738e+00_rt, -7.94118e+00_rt, -7.79499e+00_rt, -7.64879e+00_rt, +-7.50260e+00_rt, -7.35640e+00_rt, -7.21020e+00_rt, -7.06401e+00_rt, +-6.91781e+00_rt, -6.77162e+00_rt, -6.62542e+00_rt, -6.47922e+00_rt, +-6.33303e+00_rt, -6.18683e+00_rt, -6.04064e+00_rt, -5.89444e+00_rt, +-5.74825e+00_rt, -5.60205e+00_rt, -5.45586e+00_rt, -5.30966e+00_rt, +-5.16347e+00_rt, -5.01727e+00_rt, -4.87108e+00_rt, -4.72489e+00_rt, +-4.57870e+00_rt, -4.43251e+00_rt, -4.28632e+00_rt, -4.14013e+00_rt, +-3.99395e+00_rt, -3.84778e+00_rt, -3.70161e+00_rt, -3.55545e+00_rt, +-3.40930e+00_rt, -3.26317e+00_rt, -3.11706e+00_rt, -2.97098e+00_rt, +-2.82493e+00_rt, -2.67894e+00_rt, -2.53302e+00_rt, -2.38720e+00_rt, +-2.24150e+00_rt, -2.09597e+00_rt, -1.95067e+00_rt, -1.80567e+00_rt, +-1.66109e+00_rt, -1.51706e+00_rt, -1.37378e+00_rt, -1.23150e+00_rt, +-1.09060e+00_rt, -9.51540e-01_rt, -8.15002e-01_rt, -6.81898e-01_rt, +-5.53491e-01_rt, -4.31519e-01_rt, -3.18353e-01_rt, -2.17146e-01_rt, +-1.31847e-01_rt, -6.67538e-02_rt, -2.49772e-02_rt, -5.41331e-03_rt, +-3.87555e-04_rt, -1.77093e-06_rt, 0.00000e+00_rt, 0.00000e+00_rt, +-8.14478e+00_rt, -7.99858e+00_rt, -7.85239e+00_rt, -7.70619e+00_rt, +-7.55999e+00_rt, -7.41380e+00_rt, -7.26760e+00_rt, -7.12141e+00_rt, +-6.97521e+00_rt, -6.82901e+00_rt, -6.68282e+00_rt, -6.53662e+00_rt, +-6.39043e+00_rt, -6.24423e+00_rt, -6.09804e+00_rt, -5.95184e+00_rt, +-5.80564e+00_rt, -5.65945e+00_rt, -5.51325e+00_rt, -5.36706e+00_rt, +-5.22086e+00_rt, -5.07467e+00_rt, -4.92848e+00_rt, -4.78228e+00_rt, +-4.63609e+00_rt, -4.48990e+00_rt, -4.34371e+00_rt, -4.19753e+00_rt, +-4.05134e+00_rt, -3.90517e+00_rt, -3.75899e+00_rt, -3.61283e+00_rt, +-3.46667e+00_rt, -3.32053e+00_rt, -3.17441e+00_rt, -3.02832e+00_rt, +-2.88226e+00_rt, -2.73624e+00_rt, -2.59029e+00_rt, -2.44442e+00_rt, +-2.29866e+00_rt, -2.15305e+00_rt, -2.00764e+00_rt, -1.86250e+00_rt, +-1.71772e+00_rt, -1.57343e+00_rt, -1.42980e+00_rt, -1.28705e+00_rt, +-1.14550e+00_rt, -1.00558e+00_rt, -8.67872e-01_rt, -7.33176e-01_rt, +-6.02602e-01_rt, -4.77680e-01_rt, -3.60513e-01_rt, -2.53947e-01_rt, +-1.61676e-01_rt, -8.80563e-02_rt, -3.70951e-02_rt, -9.86840e-03_rt, +-1.03910e-03_rt, -1.10564e-05_rt, -9.50173e-12_rt, 0.00000e+00_rt, +-8.20104e+00_rt, -8.05484e+00_rt, -7.90865e+00_rt, -7.76245e+00_rt, +-7.61626e+00_rt, -7.47006e+00_rt, -7.32387e+00_rt, -7.17767e+00_rt, +-7.03147e+00_rt, -6.88528e+00_rt, -6.73908e+00_rt, -6.59289e+00_rt, +-6.44669e+00_rt, -6.30049e+00_rt, -6.15430e+00_rt, -6.00810e+00_rt, +-5.86191e+00_rt, -5.71571e+00_rt, -5.56952e+00_rt, -5.42332e+00_rt, +-5.27713e+00_rt, -5.13093e+00_rt, -4.98474e+00_rt, -4.83855e+00_rt, +-4.69235e+00_rt, -4.54616e+00_rt, -4.39997e+00_rt, -4.25379e+00_rt, +-4.10760e+00_rt, -3.96142e+00_rt, -3.81525e+00_rt, -3.66908e+00_rt, +-3.52292e+00_rt, -3.37677e+00_rt, -3.23064e+00_rt, -3.08453e+00_rt, +-2.93846e+00_rt, -2.79242e+00_rt, -2.64644e+00_rt, -2.50053e+00_rt, +-2.35472e+00_rt, -2.20904e+00_rt, -2.06353e+00_rt, -1.91826e+00_rt, +-1.77331e+00_rt, -1.62879e+00_rt, -1.48485e+00_rt, -1.34169e+00_rt, +-1.19958e+00_rt, -1.05890e+00_rt, -9.20170e-01_rt, -7.84083e-01_rt, +-6.51617e-01_rt, -5.24118e-01_rt, -4.03448e-01_rt, -2.92155e-01_rt, +-1.93635e-01_rt, -1.12128e-01_rt, -5.21283e-02_rt, -1.64271e-02_rt, +-2.37796e-03_rt, -5.08169e-05_rt, -6.19466e-10_rt, 0.00000e+00_rt, +-8.25605e+00_rt, -8.10985e+00_rt, -7.96366e+00_rt, -7.81746e+00_rt, +-7.67126e+00_rt, -7.52507e+00_rt, -7.37887e+00_rt, -7.23268e+00_rt, +-7.08648e+00_rt, -6.94029e+00_rt, -6.79409e+00_rt, -6.64789e+00_rt, +-6.50170e+00_rt, -6.35550e+00_rt, -6.20931e+00_rt, -6.06311e+00_rt, +-5.91692e+00_rt, -5.77072e+00_rt, -5.62452e+00_rt, -5.47833e+00_rt, +-5.33213e+00_rt, -5.18594e+00_rt, -5.03975e+00_rt, -4.89355e+00_rt, +-4.74736e+00_rt, -4.60117e+00_rt, -4.45498e+00_rt, -4.30879e+00_rt, +-4.16260e+00_rt, -4.01642e+00_rt, -3.87024e+00_rt, -3.72407e+00_rt, +-3.57791e+00_rt, -3.43175e+00_rt, -3.28562e+00_rt, -3.13950e+00_rt, +-2.99341e+00_rt, -2.84735e+00_rt, -2.70134e+00_rt, -2.55540e+00_rt, +-2.40954e+00_rt, -2.26380e+00_rt, -2.11821e+00_rt, -1.97283e+00_rt, +-1.82773e+00_rt, -1.68301e+00_rt, -1.53880e+00_rt, -1.39527e+00_rt, +-1.25267e+00_rt, -1.11133e+00_rt, -9.71702e-01_rt, -8.34400e-01_rt, +-7.00282e-01_rt, -5.70534e-01_rt, -4.46800e-01_rt, -3.31354e-01_rt, +-2.27280e-01_rt, -1.38590e-01_rt, -6.99533e-02_rt, -2.53641e-02_rt, +-4.77509e-03_rt, -1.81428e-04_rt, -1.40005e-08_rt, 0.00000e+00_rt, +-8.30968e+00_rt, -8.16348e+00_rt, -8.01729e+00_rt, -7.87109e+00_rt, +-7.72490e+00_rt, -7.57870e+00_rt, -7.43250e+00_rt, -7.28631e+00_rt, +-7.14011e+00_rt, -6.99392e+00_rt, -6.84772e+00_rt, -6.70152e+00_rt, +-6.55533e+00_rt, -6.40913e+00_rt, -6.26294e+00_rt, -6.11674e+00_rt, +-5.97055e+00_rt, -5.82435e+00_rt, -5.67816e+00_rt, -5.53196e+00_rt, +-5.38576e+00_rt, -5.23957e+00_rt, -5.09338e+00_rt, -4.94718e+00_rt, +-4.80099e+00_rt, -4.65480e+00_rt, -4.50861e+00_rt, -4.36242e+00_rt, +-4.21623e+00_rt, -4.07005e+00_rt, -3.92387e+00_rt, -3.77769e+00_rt, +-3.63152e+00_rt, -3.48537e+00_rt, -3.33922e+00_rt, -3.19309e+00_rt, +-3.04699e+00_rt, -2.90092e+00_rt, -2.75489e+00_rt, -2.60891e+00_rt, +-2.46301e+00_rt, -2.31722e+00_rt, -2.17155e+00_rt, -2.02608e+00_rt, +-1.88085e+00_rt, -1.73595e+00_rt, -1.59150e+00_rt, -1.44765e+00_rt, +-1.30462e+00_rt, -1.16270e+00_rt, -1.02229e+00_rt, -8.83923e-01_rt, +-7.48362e-01_rt, -6.16650e-01_rt, -4.90241e-01_rt, -3.71154e-01_rt, +-2.62173e-01_rt, -1.67019e-01_rt, -9.03181e-02_rt, -3.67951e-02_rt, +-8.60747e-03_rt, -5.25902e-04_rt, -1.83903e-07_rt, 0.00000e+00_rt, +-8.36182e+00_rt, -8.21562e+00_rt, -8.06943e+00_rt, -7.92323e+00_rt, +-7.77703e+00_rt, -7.63084e+00_rt, -7.48464e+00_rt, -7.33845e+00_rt, +-7.19225e+00_rt, -7.04606e+00_rt, -6.89986e+00_rt, -6.75366e+00_rt, +-6.60747e+00_rt, -6.46127e+00_rt, -6.31508e+00_rt, -6.16888e+00_rt, +-6.02269e+00_rt, -5.87649e+00_rt, -5.73029e+00_rt, -5.58410e+00_rt, +-5.43790e+00_rt, -5.29171e+00_rt, -5.14551e+00_rt, -4.99932e+00_rt, +-4.85313e+00_rt, -4.70693e+00_rt, -4.56074e+00_rt, -4.41455e+00_rt, +-4.26836e+00_rt, -4.12218e+00_rt, -3.97600e+00_rt, -3.82982e+00_rt, +-3.68365e+00_rt, -3.53749e+00_rt, -3.39134e+00_rt, -3.24520e+00_rt, +-3.09908e+00_rt, -2.95300e+00_rt, -2.80695e+00_rt, -2.66095e+00_rt, +-2.51501e+00_rt, -2.36917e+00_rt, -2.22344e+00_rt, -2.07788e+00_rt, +-1.93253e+00_rt, -1.78748e+00_rt, -1.64282e+00_rt, -1.49869e+00_rt, +-1.35529e+00_rt, -1.21286e+00_rt, -1.07176e+00_rt, -9.32463e-01_rt, +-7.95642e-01_rt, -6.62215e-01_rt, -5.33469e-01_rt, -4.11198e-01_rt, +-2.97898e-01_rt, -1.96981e-01_rt, -1.12883e-01_rt, -5.06787e-02_rt, +-1.41908e-02_rt, -1.28359e-03_rt, -1.56011e-06_rt, 0.00000e+00_rt, +-8.41236e+00_rt, -8.26616e+00_rt, -8.11996e+00_rt, -7.97377e+00_rt, +-7.82757e+00_rt, -7.68138e+00_rt, -7.53518e+00_rt, -7.38899e+00_rt, +-7.24279e+00_rt, -7.09659e+00_rt, -6.95040e+00_rt, -6.80420e+00_rt, +-6.65801e+00_rt, -6.51181e+00_rt, -6.36561e+00_rt, -6.21942e+00_rt, +-6.07322e+00_rt, -5.92703e+00_rt, -5.78083e+00_rt, -5.63464e+00_rt, +-5.48844e+00_rt, -5.34225e+00_rt, -5.19605e+00_rt, -5.04986e+00_rt, +-4.90366e+00_rt, -4.75747e+00_rt, -4.61128e+00_rt, -4.46509e+00_rt, +-4.31890e+00_rt, -4.17271e+00_rt, -4.02653e+00_rt, -3.88035e+00_rt, +-3.73417e+00_rt, -3.58801e+00_rt, -3.44185e+00_rt, -3.29571e+00_rt, +-3.14958e+00_rt, -3.00348e+00_rt, -2.85742e+00_rt, -2.71139e+00_rt, +-2.56543e+00_rt, -2.41954e+00_rt, -2.27376e+00_rt, -2.12812e+00_rt, +-1.98267e+00_rt, -1.83748e+00_rt, -1.69264e+00_rt, -1.54827e+00_rt, +-1.40453e+00_rt, -1.26166e+00_rt, -1.11995e+00_rt, -9.79846e-01_rt, +-8.41924e-01_rt, -7.07000e-01_rt, -5.76214e-01_rt, -4.51160e-01_rt, +-3.34072e-01_rt, -2.28051e-01_rt, -1.37260e-01_rt, -6.68403e-02_rt, +-2.17291e-02_rt, -2.71824e-03_rt, -9.23596e-06_rt, 0.00000e+00_rt, +-8.46119e+00_rt, -8.31500e+00_rt, -8.16880e+00_rt, -8.02261e+00_rt, +-7.87641e+00_rt, -7.73021e+00_rt, -7.58402e+00_rt, -7.43782e+00_rt, +-7.29163e+00_rt, -7.14543e+00_rt, -6.99923e+00_rt, -6.85304e+00_rt, +-6.70684e+00_rt, -6.56065e+00_rt, -6.41445e+00_rt, -6.26826e+00_rt, +-6.12206e+00_rt, -5.97586e+00_rt, -5.82967e+00_rt, -5.68347e+00_rt, +-5.53728e+00_rt, -5.39108e+00_rt, -5.24489e+00_rt, -5.09869e+00_rt, +-4.95250e+00_rt, -4.80631e+00_rt, -4.66011e+00_rt, -4.51392e+00_rt, +-4.36773e+00_rt, -4.22154e+00_rt, -4.07536e+00_rt, -3.92918e+00_rt, +-3.78300e+00_rt, -3.63683e+00_rt, -3.49067e+00_rt, -3.34452e+00_rt, +-3.19839e+00_rt, -3.05228e+00_rt, -2.90619e+00_rt, -2.76015e+00_rt, +-2.61415e+00_rt, -2.46823e+00_rt, -2.32240e+00_rt, -2.17669e+00_rt, +-2.03116e+00_rt, -1.88585e+00_rt, -1.74084e+00_rt, -1.59626e+00_rt, +-1.45223e+00_rt, -1.30897e+00_rt, -1.16674e+00_rt, -1.02592e+00_rt, +-8.87032e-01_rt, -7.50800e-01_rt, -6.18233e-01_rt, -4.90749e-01_rt, +-3.70346e-01_rt, -2.59826e-01_rt, -1.63042e-01_rt, -8.50082e-02_rt, +-3.12914e-02_rt, -5.11928e-03_rt, -4.06448e-05_rt, 0.00000e+00_rt, +-8.50824e+00_rt, -8.36205e+00_rt, -8.21585e+00_rt, -8.06965e+00_rt, +-7.92346e+00_rt, -7.77726e+00_rt, -7.63107e+00_rt, -7.48487e+00_rt, +-7.33868e+00_rt, -7.19248e+00_rt, -7.04628e+00_rt, -6.90009e+00_rt, +-6.75389e+00_rt, -6.60770e+00_rt, -6.46150e+00_rt, -6.31530e+00_rt, +-6.16911e+00_rt, -6.02291e+00_rt, -5.87672e+00_rt, -5.73052e+00_rt, +-5.58433e+00_rt, -5.43813e+00_rt, -5.29194e+00_rt, -5.14574e+00_rt, +-4.99955e+00_rt, -4.85335e+00_rt, -4.70716e+00_rt, -4.56097e+00_rt, +-4.41478e+00_rt, -4.26859e+00_rt, -4.12240e+00_rt, -3.97622e+00_rt, +-3.83004e+00_rt, -3.68387e+00_rt, -3.53770e+00_rt, -3.39155e+00_rt, +-3.24541e+00_rt, -3.09928e+00_rt, -2.95319e+00_rt, -2.80712e+00_rt, +-2.66111e+00_rt, -2.51515e+00_rt, -2.36928e+00_rt, -2.22351e+00_rt, +-2.07790e+00_rt, -1.93248e+00_rt, -1.78734e+00_rt, -1.64256e+00_rt, +-1.49828e+00_rt, -1.35467e+00_rt, -1.21198e+00_rt, -1.07054e+00_rt, +-9.30813e-01_rt, -7.93438e-01_rt, -6.59315e-01_rt, -5.29710e-01_rt, +-4.06408e-01_rt, -2.91936e-01_rt, -1.89828e-01_rt, -1.04850e-01_rt, +-4.28169e-02_rt, -8.74979e-03_rt, -1.40043e-04_rt, 0.00000e+00_rt, +-8.55343e+00_rt, -8.40723e+00_rt, -8.26104e+00_rt, -8.11484e+00_rt, +-7.96864e+00_rt, -7.82245e+00_rt, -7.67625e+00_rt, -7.53006e+00_rt, +-7.38386e+00_rt, -7.23766e+00_rt, -7.09147e+00_rt, -6.94527e+00_rt, +-6.79908e+00_rt, -6.65288e+00_rt, -6.50668e+00_rt, -6.36049e+00_rt, +-6.21429e+00_rt, -6.06810e+00_rt, -5.92190e+00_rt, -5.77571e+00_rt, +-5.62951e+00_rt, -5.48332e+00_rt, -5.33712e+00_rt, -5.19093e+00_rt, +-5.04473e+00_rt, -4.89854e+00_rt, -4.75234e+00_rt, -4.60615e+00_rt, +-4.45996e+00_rt, -4.31377e+00_rt, -4.16758e+00_rt, -4.02140e+00_rt, +-3.87522e+00_rt, -3.72904e+00_rt, -3.58287e+00_rt, -3.43671e+00_rt, +-3.29057e+00_rt, -3.14443e+00_rt, -2.99833e+00_rt, -2.85225e+00_rt, +-2.70621e+00_rt, -2.56022e+00_rt, -2.41431e+00_rt, -2.26849e+00_rt, +-2.12281e+00_rt, -1.97730e+00_rt, -1.83204e+00_rt, -1.68709e+00_rt, +-1.54259e+00_rt, -1.39868e+00_rt, -1.25559e+00_rt, -1.11360e+00_rt, +-9.73133e-01_rt, -8.34759e-01_rt, -6.99278e-01_rt, -5.67819e-01_rt, +-4.41985e-01_rt, -3.24052e-01_rt, -2.17240e-01_rt, -1.26006e-01_rt, +-5.61371e-02_rt, -1.38001e-02_rt, -3.94274e-04_rt, 0.00000e+00_rt, +-8.59669e+00_rt, -8.45049e+00_rt, -8.30429e+00_rt, -8.15810e+00_rt, +-8.01190e+00_rt, -7.86571e+00_rt, -7.71951e+00_rt, -7.57332e+00_rt, +-7.42712e+00_rt, -7.28092e+00_rt, -7.13473e+00_rt, -6.98853e+00_rt, +-6.84234e+00_rt, -6.69614e+00_rt, -6.54994e+00_rt, -6.40375e+00_rt, +-6.25755e+00_rt, -6.11136e+00_rt, -5.96516e+00_rt, -5.81897e+00_rt, +-5.67277e+00_rt, -5.52657e+00_rt, -5.38038e+00_rt, -5.23418e+00_rt, +-5.08799e+00_rt, -4.94180e+00_rt, -4.79560e+00_rt, -4.64941e+00_rt, +-4.50322e+00_rt, -4.35703e+00_rt, -4.21084e+00_rt, -4.06465e+00_rt, +-3.91847e+00_rt, -3.77229e+00_rt, -3.62612e+00_rt, -3.47996e+00_rt, +-3.33380e+00_rt, -3.18766e+00_rt, -3.04154e+00_rt, -2.89545e+00_rt, +-2.74939e+00_rt, -2.60338e+00_rt, -2.45744e+00_rt, -2.31158e+00_rt, +-2.16583e+00_rt, -2.02024e+00_rt, -1.87487e+00_rt, -1.72978e+00_rt, +-1.58508e+00_rt, -1.44091e+00_rt, -1.29746e+00_rt, -1.15499e+00_rt, +-1.01388e+00_rt, -8.74633e-01_rt, -7.37964e-01_rt, -6.04888e-01_rt, +-4.76843e-01_rt, -3.55882e-01_rt, -2.44931e-01_rt, -1.48114e-01_rt, +-7.10067e-02_rt, -2.03603e-02_rt, -9.39472e-04_rt, 0.00000e+00_rt, +-8.63797e+00_rt, -8.49178e+00_rt, -8.34558e+00_rt, -8.19939e+00_rt, +-8.05319e+00_rt, -7.90699e+00_rt, -7.76080e+00_rt, -7.61460e+00_rt, +-7.46841e+00_rt, -7.32221e+00_rt, -7.17602e+00_rt, -7.02982e+00_rt, +-6.88362e+00_rt, -6.73743e+00_rt, -6.59123e+00_rt, -6.44504e+00_rt, +-6.29884e+00_rt, -6.15264e+00_rt, -6.00645e+00_rt, -5.86025e+00_rt, +-5.71406e+00_rt, -5.56786e+00_rt, -5.42167e+00_rt, -5.27547e+00_rt, +-5.12928e+00_rt, -4.98308e+00_rt, -4.83689e+00_rt, -4.69070e+00_rt, +-4.54450e+00_rt, -4.39831e+00_rt, -4.25212e+00_rt, -4.10594e+00_rt, +-3.95975e+00_rt, -3.81357e+00_rt, -3.66740e+00_rt, -3.52123e+00_rt, +-3.37507e+00_rt, -3.22892e+00_rt, -3.08280e+00_rt, -2.93669e+00_rt, +-2.79062e+00_rt, -2.64458e+00_rt, -2.49861e+00_rt, -2.35271e+00_rt, +-2.20691e+00_rt, -2.06125e+00_rt, -1.91578e+00_rt, -1.77056e+00_rt, +-1.62569e+00_rt, -1.48129e+00_rt, -1.33753e+00_rt, -1.19464e+00_rt, +-1.05297e+00_rt, -9.12953e-01_rt, -7.75246e-01_rt, -6.40757e-01_rt, +-5.10782e-01_rt, -3.87174e-01_rt, -2.72594e-01_rt, -1.70827e-01_rt, +-8.71357e-02_rt, -2.84153e-02_rt, -1.95018e-03_rt, 0.00000e+00_rt, +-8.67726e+00_rt, -8.53106e+00_rt, -8.38486e+00_rt, -8.23867e+00_rt, +-8.09247e+00_rt, -7.94628e+00_rt, -7.80008e+00_rt, -7.65389e+00_rt, +-7.50769e+00_rt, -7.36149e+00_rt, -7.21530e+00_rt, -7.06910e+00_rt, +-6.92291e+00_rt, -6.77671e+00_rt, -6.63051e+00_rt, -6.48432e+00_rt, +-6.33812e+00_rt, -6.19193e+00_rt, -6.04573e+00_rt, -5.89954e+00_rt, +-5.75334e+00_rt, -5.60714e+00_rt, -5.46095e+00_rt, -5.31475e+00_rt, +-5.16856e+00_rt, -5.02236e+00_rt, -4.87617e+00_rt, -4.72998e+00_rt, +-4.58378e+00_rt, -4.43759e+00_rt, -4.29140e+00_rt, -4.14521e+00_rt, +-3.99903e+00_rt, -3.85285e+00_rt, -3.70667e+00_rt, -3.56050e+00_rt, +-3.41433e+00_rt, -3.26818e+00_rt, -3.12205e+00_rt, -2.97593e+00_rt, +-2.82984e+00_rt, -2.68379e+00_rt, -2.53779e+00_rt, -2.39185e+00_rt, +-2.24601e+00_rt, -2.10029e+00_rt, -1.95473e+00_rt, -1.80940e+00_rt, +-1.66438e+00_rt, -1.51978e+00_rt, -1.37574e+00_rt, -1.23249e+00_rt, +-1.09032e+00_rt, -9.49633e-01_rt, -8.11019e-01_rt, -6.75295e-01_rt, +-5.43634e-01_rt, -4.17716e-01_rt, -2.99957e-01_rt, -1.93826e-01_rt, +-1.04216e-01_rt, -3.78569e-02_rt, -3.61159e-03_rt, 0.00000e+00_rt, +-8.71451e+00_rt, -8.56832e+00_rt, -8.42212e+00_rt, -8.27593e+00_rt, +-8.12973e+00_rt, -7.98354e+00_rt, -7.83734e+00_rt, -7.69114e+00_rt, +-7.54495e+00_rt, -7.39875e+00_rt, -7.25256e+00_rt, -7.10636e+00_rt, +-6.96016e+00_rt, -6.81397e+00_rt, -6.66777e+00_rt, -6.52158e+00_rt, +-6.37538e+00_rt, -6.22918e+00_rt, -6.08299e+00_rt, -5.93679e+00_rt, +-5.79060e+00_rt, -5.64440e+00_rt, -5.49821e+00_rt, -5.35201e+00_rt, +-5.20582e+00_rt, -5.05962e+00_rt, -4.91343e+00_rt, -4.76723e+00_rt, +-4.62104e+00_rt, -4.47485e+00_rt, -4.32866e+00_rt, -4.18247e+00_rt, +-4.03628e+00_rt, -3.89010e+00_rt, -3.74392e+00_rt, -3.59774e+00_rt, +-3.45158e+00_rt, -3.30542e+00_rt, -3.15928e+00_rt, -3.01315e+00_rt, +-2.86705e+00_rt, -2.72098e+00_rt, -2.57496e+00_rt, -2.42899e+00_rt, +-2.28311e+00_rt, -2.13733e+00_rt, -1.99170e+00_rt, -1.84627e+00_rt, +-1.70112e+00_rt, -1.55633e+00_rt, -1.41206e+00_rt, -1.26849e+00_rt, +-1.12588e+00_rt, -9.84610e-01_rt, -8.45201e-01_rt, -7.08398e-01_rt, +-5.75265e-01_rt, -4.47328e-01_rt, -3.26792e-01_rt, -2.16825e-01_rt, +-1.21941e-01_rt, -4.85071e-02_rt, -6.08473e-03_rt, 0.00000e+00_rt, +-8.74974e+00_rt, -8.60355e+00_rt, -8.45735e+00_rt, -8.31115e+00_rt, +-8.16496e+00_rt, -8.01876e+00_rt, -7.87257e+00_rt, -7.72637e+00_rt, +-7.58018e+00_rt, -7.43398e+00_rt, -7.28778e+00_rt, -7.14159e+00_rt, +-6.99539e+00_rt, -6.84920e+00_rt, -6.70300e+00_rt, -6.55680e+00_rt, +-6.41061e+00_rt, -6.26441e+00_rt, -6.11822e+00_rt, -5.97202e+00_rt, +-5.82583e+00_rt, -5.67963e+00_rt, -5.53343e+00_rt, -5.38724e+00_rt, +-5.24104e+00_rt, -5.09485e+00_rt, -4.94865e+00_rt, -4.80246e+00_rt, +-4.65627e+00_rt, -4.51007e+00_rt, -4.36388e+00_rt, -4.21769e+00_rt, +-4.07151e+00_rt, -3.92532e+00_rt, -3.77914e+00_rt, -3.63296e+00_rt, +-3.48679e+00_rt, -3.34063e+00_rt, -3.19448e+00_rt, -3.04835e+00_rt, +-2.90223e+00_rt, -2.75615e+00_rt, -2.61010e+00_rt, -2.46411e+00_rt, +-2.31819e+00_rt, -2.17237e+00_rt, -2.02667e+00_rt, -1.88116e+00_rt, +-1.73589e+00_rt, -1.59095e+00_rt, -1.44646e+00_rt, -1.30261e+00_rt, +-1.15962e+00_rt, -1.01784e+00_rt, -8.77732e-01_rt, -7.39986e-01_rt, +-6.05565e-01_rt, -4.75867e-01_rt, -3.52903e-01_rt, -2.39575e-01_rt, +-1.40023e-01_rt, -6.01435e-02_rt, -9.47701e-03_rt, 0.00000e+00_rt, +-8.78295e+00_rt, -8.63675e+00_rt, -8.49055e+00_rt, -8.34436e+00_rt, +-8.19816e+00_rt, -8.05197e+00_rt, -7.90577e+00_rt, -7.75957e+00_rt, +-7.61338e+00_rt, -7.46718e+00_rt, -7.32099e+00_rt, -7.17479e+00_rt, +-7.02860e+00_rt, -6.88240e+00_rt, -6.73620e+00_rt, -6.59001e+00_rt, +-6.44381e+00_rt, -6.29762e+00_rt, -6.15142e+00_rt, -6.00522e+00_rt, +-5.85903e+00_rt, -5.71283e+00_rt, -5.56664e+00_rt, -5.42044e+00_rt, +-5.27425e+00_rt, -5.12805e+00_rt, -4.98186e+00_rt, -4.83566e+00_rt, +-4.68947e+00_rt, -4.54328e+00_rt, -4.39708e+00_rt, -4.25089e+00_rt, +-4.10470e+00_rt, -3.95852e+00_rt, -3.81233e+00_rt, -3.66616e+00_rt, +-3.51998e+00_rt, -3.37382e+00_rt, -3.22766e+00_rt, -3.08152e+00_rt, +-2.93540e+00_rt, -2.78930e+00_rt, -2.64324e+00_rt, -2.49722e+00_rt, +-2.35127e+00_rt, -2.20540e+00_rt, -2.05965e+00_rt, -1.91406e+00_rt, +-1.76869e+00_rt, -1.62361e+00_rt, -1.47894e+00_rt, -1.33484e+00_rt, +-1.19152e+00_rt, -1.04928e+00_rt, -9.08571e-01_rt, -7.69999e-01_rt, +-6.34454e-01_rt, -5.03216e-01_rt, -3.78133e-01_rt, -2.61864e-01_rt, +-1.58201e-01_rt, -7.25228e-02_rt, -1.38263e-02_rt, 0.00000e+00_rt, +-8.81414e+00_rt, -8.66795e+00_rt, -8.52175e+00_rt, -8.37556e+00_rt, +-8.22936e+00_rt, -8.08316e+00_rt, -7.93697e+00_rt, -7.79077e+00_rt, +-7.64458e+00_rt, -7.49838e+00_rt, -7.35218e+00_rt, -7.20599e+00_rt, +-7.05979e+00_rt, -6.91360e+00_rt, -6.76740e+00_rt, -6.62121e+00_rt, +-6.47501e+00_rt, -6.32881e+00_rt, -6.18262e+00_rt, -6.03642e+00_rt, +-5.89023e+00_rt, -5.74403e+00_rt, -5.59783e+00_rt, -5.45164e+00_rt, +-5.30544e+00_rt, -5.15925e+00_rt, -5.01305e+00_rt, -4.86686e+00_rt, +-4.72067e+00_rt, -4.57447e+00_rt, -4.42828e+00_rt, -4.28209e+00_rt, +-4.13590e+00_rt, -3.98971e+00_rt, -3.84353e+00_rt, -3.69735e+00_rt, +-3.55117e+00_rt, -3.40500e+00_rt, -3.25884e+00_rt, -3.11269e+00_rt, +-2.96656e+00_rt, -2.82045e+00_rt, -2.67438e+00_rt, -2.52834e+00_rt, +-2.38236e+00_rt, -2.23645e+00_rt, -2.09065e+00_rt, -1.94500e+00_rt, +-1.79953e+00_rt, -1.65433e+00_rt, -1.50951e+00_rt, -1.36518e+00_rt, +-1.22157e+00_rt, -1.07894e+00_rt, -9.37694e-01_rt, -7.98399e-01_rt, +-6.61871e-01_rt, -5.29289e-01_rt, -4.02354e-01_rt, -2.83515e-01_rt, +-1.76243e-01_rt, -8.54001e-02_rt, -1.90999e-02_rt, 0.00000e+00_rt, +-8.84336e+00_rt, -8.69717e+00_rt, -8.55097e+00_rt, -8.40477e+00_rt, +-8.25858e+00_rt, -8.11238e+00_rt, -7.96619e+00_rt, -7.81999e+00_rt, +-7.67380e+00_rt, -7.52760e+00_rt, -7.38140e+00_rt, -7.23521e+00_rt, +-7.08901e+00_rt, -6.94282e+00_rt, -6.79662e+00_rt, -6.65042e+00_rt, +-6.50423e+00_rt, -6.35803e+00_rt, -6.21184e+00_rt, -6.06564e+00_rt, +-5.91945e+00_rt, -5.77325e+00_rt, -5.62705e+00_rt, -5.48086e+00_rt, +-5.33466e+00_rt, -5.18847e+00_rt, -5.04227e+00_rt, -4.89608e+00_rt, +-4.74988e+00_rt, -4.60369e+00_rt, -4.45750e+00_rt, -4.31131e+00_rt, +-4.16512e+00_rt, -4.01893e+00_rt, -3.87274e+00_rt, -3.72656e+00_rt, +-3.58038e+00_rt, -3.43421e+00_rt, -3.28804e+00_rt, -3.14189e+00_rt, +-2.99575e+00_rt, -2.84963e+00_rt, -2.70354e+00_rt, -2.55749e+00_rt, +-2.41148e+00_rt, -2.26554e+00_rt, -2.11970e+00_rt, -1.97398e+00_rt, +-1.82844e+00_rt, -1.68314e+00_rt, -1.53817e+00_rt, -1.39365e+00_rt, +-1.24978e+00_rt, -1.10681e+00_rt, -9.65094e-01_rt, -8.25166e-01_rt, +-6.87778e-01_rt, -5.54020e-01_rt, -4.25469e-01_rt, -3.04385e-01_rt, +-1.93953e-01_rt, -9.85428e-02_rt, -2.52054e-02_rt, 0.00000e+00_rt, +-8.87064e+00_rt, -8.72445e+00_rt, -8.57825e+00_rt, -8.43206e+00_rt, +-8.28586e+00_rt, -8.13966e+00_rt, -7.99347e+00_rt, -7.84727e+00_rt, +-7.70108e+00_rt, -7.55488e+00_rt, -7.40868e+00_rt, -7.26249e+00_rt, +-7.11629e+00_rt, -6.97010e+00_rt, -6.82390e+00_rt, -6.67770e+00_rt, +-6.53151e+00_rt, -6.38531e+00_rt, -6.23912e+00_rt, -6.09292e+00_rt, +-5.94673e+00_rt, -5.80053e+00_rt, -5.65433e+00_rt, -5.50814e+00_rt, +-5.36194e+00_rt, -5.21575e+00_rt, -5.06955e+00_rt, -4.92336e+00_rt, +-4.77716e+00_rt, -4.63097e+00_rt, -4.48478e+00_rt, -4.33858e+00_rt, +-4.19239e+00_rt, -4.04620e+00_rt, -3.90002e+00_rt, -3.75383e+00_rt, +-3.60765e+00_rt, -3.46148e+00_rt, -3.31531e+00_rt, -3.16915e+00_rt, +-3.02301e+00_rt, -2.87688e+00_rt, -2.73077e+00_rt, -2.58470e+00_rt, +-2.43868e+00_rt, -2.29271e+00_rt, -2.14683e+00_rt, -2.00106e+00_rt, +-1.85545e+00_rt, -1.71005e+00_rt, -1.56496e+00_rt, -1.42028e+00_rt, +-1.27618e+00_rt, -1.13290e+00_rt, -9.90777e-01_rt, -8.50295e-01_rt, +-7.12155e-01_rt, -5.77370e-01_rt, -4.47406e-01_rt, -3.24362e-01_rt, +-2.11168e-01_rt, -1.11740e-01_rt, -3.20077e-02_rt, 0.00000e+00_rt, +-8.89603e+00_rt, -8.74984e+00_rt, -8.60364e+00_rt, -8.45745e+00_rt, +-8.31125e+00_rt, -8.16505e+00_rt, -8.01886e+00_rt, -7.87266e+00_rt, +-7.72647e+00_rt, -7.58027e+00_rt, -7.43407e+00_rt, -7.28788e+00_rt, +-7.14168e+00_rt, -6.99549e+00_rt, -6.84929e+00_rt, -6.70309e+00_rt, +-6.55690e+00_rt, -6.41070e+00_rt, -6.26451e+00_rt, -6.11831e+00_rt, +-5.97212e+00_rt, -5.82592e+00_rt, -5.67972e+00_rt, -5.53353e+00_rt, +-5.38733e+00_rt, -5.24114e+00_rt, -5.09494e+00_rt, -4.94875e+00_rt, +-4.80255e+00_rt, -4.65636e+00_rt, -4.51017e+00_rt, -4.36397e+00_rt, +-4.21778e+00_rt, -4.07159e+00_rt, -3.92540e+00_rt, -3.77922e+00_rt, +-3.63303e+00_rt, -3.48686e+00_rt, -3.34069e+00_rt, -3.19452e+00_rt, +-3.04837e+00_rt, -2.90224e+00_rt, -2.75612e+00_rt, -2.61004e+00_rt, +-2.46399e+00_rt, -2.31800e+00_rt, -2.17209e+00_rt, -2.02627e+00_rt, +-1.88060e+00_rt, -1.73512e+00_rt, -1.58992e+00_rt, -1.44509e+00_rt, +-1.30079e+00_rt, -1.15725e+00_rt, -1.01477e+00_rt, -8.73798e-01_rt, +-7.34999e-01_rt, -5.99315e-01_rt, -4.68118e-01_rt, -3.43362e-01_rt, +-2.27755e-01_rt, -1.24807e-01_rt, -3.93469e-02_rt, 0.00000e+00_rt, +-8.91959e+00_rt, -8.77339e+00_rt, -8.62720e+00_rt, -8.48100e+00_rt, +-8.33481e+00_rt, -8.18861e+00_rt, -8.04241e+00_rt, -7.89622e+00_rt, +-7.75002e+00_rt, -7.60383e+00_rt, -7.45763e+00_rt, -7.31143e+00_rt, +-7.16524e+00_rt, -7.01904e+00_rt, -6.87285e+00_rt, -6.72665e+00_rt, +-6.58046e+00_rt, -6.43426e+00_rt, -6.28806e+00_rt, -6.14187e+00_rt, +-5.99567e+00_rt, -5.84948e+00_rt, -5.70328e+00_rt, -5.55709e+00_rt, +-5.41089e+00_rt, -5.26469e+00_rt, -5.11850e+00_rt, -4.97230e+00_rt, +-4.82611e+00_rt, -4.67991e+00_rt, -4.53372e+00_rt, -4.38753e+00_rt, +-4.24134e+00_rt, -4.09514e+00_rt, -3.94896e+00_rt, -3.80277e+00_rt, +-3.65658e+00_rt, -3.51040e+00_rt, -3.36423e+00_rt, -3.21806e+00_rt, +-3.07191e+00_rt, -2.92577e+00_rt, -2.77964e+00_rt, -2.63355e+00_rt, +-2.48748e+00_rt, -2.34147e+00_rt, -2.19553e+00_rt, -2.04967e+00_rt, +-1.90394e+00_rt, -1.75840e+00_rt, -1.61309e+00_rt, -1.46814e+00_rt, +-1.32367e+00_rt, -1.17989e+00_rt, -1.03709e+00_rt, -8.95699e-01_rt, +-7.56322e-01_rt, -6.19852e-01_rt, -4.87576e-01_rt, -3.61326e-01_rt, +-2.43612e-01_rt, -1.37588e-01_rt, -4.70555e-02_rt, 0.00000e+00_rt, +-8.94138e+00_rt, -8.79518e+00_rt, -8.64898e+00_rt, -8.50279e+00_rt, +-8.35659e+00_rt, -8.21040e+00_rt, -8.06420e+00_rt, -7.91801e+00_rt, +-7.77181e+00_rt, -7.62561e+00_rt, -7.47942e+00_rt, -7.33322e+00_rt, +-7.18703e+00_rt, -7.04083e+00_rt, -6.89463e+00_rt, -6.74844e+00_rt, +-6.60224e+00_rt, -6.45605e+00_rt, -6.30985e+00_rt, -6.16366e+00_rt, +-6.01746e+00_rt, -5.87126e+00_rt, -5.72507e+00_rt, -5.57887e+00_rt, +-5.43268e+00_rt, -5.28648e+00_rt, -5.14029e+00_rt, -4.99409e+00_rt, +-4.84790e+00_rt, -4.70170e+00_rt, -4.55551e+00_rt, -4.40931e+00_rt, +-4.26312e+00_rt, -4.11693e+00_rt, -3.97074e+00_rt, -3.82455e+00_rt, +-3.67837e+00_rt, -3.53218e+00_rt, -3.38601e+00_rt, -3.23984e+00_rt, +-3.09368e+00_rt, -2.94753e+00_rt, -2.80140e+00_rt, -2.65529e+00_rt, +-2.50921e+00_rt, -2.36318e+00_rt, -2.21721e+00_rt, -2.07132e+00_rt, +-1.92555e+00_rt, -1.77993e+00_rt, -1.63455e+00_rt, -1.48948e+00_rt, +-1.34486e+00_rt, -1.20087e+00_rt, -1.05780e+00_rt, -9.16033e-01_rt, +-7.76151e-01_rt, -6.38993e-01_rt, -5.05773e-01_rt, -3.78216e-01_rt, +-2.58665e-01_rt, -1.49958e-01_rt, -5.49705e-02_rt, 0.00000e+00_rt, +-8.96147e+00_rt, -8.81527e+00_rt, -8.66907e+00_rt, -8.52288e+00_rt, +-8.37668e+00_rt, -8.23049e+00_rt, -8.08429e+00_rt, -7.93809e+00_rt, +-7.79190e+00_rt, -7.64570e+00_rt, -7.49951e+00_rt, -7.35331e+00_rt, +-7.20712e+00_rt, -7.06092e+00_rt, -6.91472e+00_rt, -6.76853e+00_rt, +-6.62233e+00_rt, -6.47614e+00_rt, -6.32994e+00_rt, -6.18374e+00_rt, +-6.03755e+00_rt, -5.89135e+00_rt, -5.74516e+00_rt, -5.59896e+00_rt, +-5.45277e+00_rt, -5.30657e+00_rt, -5.16037e+00_rt, -5.01418e+00_rt, +-4.86798e+00_rt, -4.72179e+00_rt, -4.57560e+00_rt, -4.42940e+00_rt, +-4.28321e+00_rt, -4.13702e+00_rt, -3.99083e+00_rt, -3.84464e+00_rt, +-3.69845e+00_rt, -3.55227e+00_rt, -3.40609e+00_rt, -3.25992e+00_rt, +-3.11375e+00_rt, -2.96760e+00_rt, -2.82146e+00_rt, -2.67534e+00_rt, +-2.52925e+00_rt, -2.38320e+00_rt, -2.23721e+00_rt, -2.09129e+00_rt, +-1.94547e+00_rt, -1.79981e+00_rt, -1.65434e+00_rt, -1.50918e+00_rt, +-1.36442e+00_rt, -1.22026e+00_rt, -1.07694e+00_rt, -9.34847e-01_rt, +-7.94522e-01_rt, -6.56761e-01_rt, -5.22715e-01_rt, -3.94018e-01_rt, +-2.72862e-01_rt, -1.61817e-01_rt, -6.29425e-02_rt, 0.00000e+00_rt, +-8.97993e+00_rt, -8.83374e+00_rt, -8.68754e+00_rt, -8.54135e+00_rt, +-8.39515e+00_rt, -8.24895e+00_rt, -8.10276e+00_rt, -7.95656e+00_rt, +-7.81037e+00_rt, -7.66417e+00_rt, -7.51797e+00_rt, -7.37178e+00_rt, +-7.22558e+00_rt, -7.07939e+00_rt, -6.93319e+00_rt, -6.78700e+00_rt, +-6.64080e+00_rt, -6.49460e+00_rt, -6.34841e+00_rt, -6.20221e+00_rt, +-6.05602e+00_rt, -5.90982e+00_rt, -5.76362e+00_rt, -5.61743e+00_rt, +-5.47123e+00_rt, -5.32504e+00_rt, -5.17884e+00_rt, -5.03265e+00_rt, +-4.88645e+00_rt, -4.74026e+00_rt, -4.59406e+00_rt, -4.44787e+00_rt, +-4.30168e+00_rt, -4.15548e+00_rt, -4.00929e+00_rt, -3.86310e+00_rt, +-3.71691e+00_rt, -3.57073e+00_rt, -3.42455e+00_rt, -3.27837e+00_rt, +-3.13220e+00_rt, -2.98605e+00_rt, -2.83990e+00_rt, -2.69378e+00_rt, +-2.54768e+00_rt, -2.40161e+00_rt, -2.25560e+00_rt, -2.10965e+00_rt, +-1.96380e+00_rt, -1.81808e+00_rt, -1.67256e+00_rt, -1.52730e+00_rt, +-1.38243e+00_rt, -1.23810e+00_rt, -1.09458e+00_rt, -9.52195e-01_rt, +-8.11482e-01_rt, -6.73192e-01_rt, -5.38425e-01_rt, -4.08729e-01_rt, +-2.86173e-01_rt, -1.73092e-01_rt, -7.08416e-02_rt, 0.00000e+00_rt, +-8.99686e+00_rt, -8.85067e+00_rt, -8.70447e+00_rt, -8.55827e+00_rt, +-8.41208e+00_rt, -8.26588e+00_rt, -8.11969e+00_rt, -7.97349e+00_rt, +-7.82729e+00_rt, -7.68110e+00_rt, -7.53490e+00_rt, -7.38871e+00_rt, +-7.24251e+00_rt, -7.09631e+00_rt, -6.95012e+00_rt, -6.80392e+00_rt, +-6.65773e+00_rt, -6.51153e+00_rt, -6.36534e+00_rt, -6.21914e+00_rt, +-6.07294e+00_rt, -5.92675e+00_rt, -5.78055e+00_rt, -5.63436e+00_rt, +-5.48816e+00_rt, -5.34197e+00_rt, -5.19577e+00_rt, -5.04957e+00_rt, +-4.90338e+00_rt, -4.75718e+00_rt, -4.61099e+00_rt, -4.46480e+00_rt, +-4.31860e+00_rt, -4.17241e+00_rt, -4.02622e+00_rt, -3.88003e+00_rt, +-3.73384e+00_rt, -3.58765e+00_rt, -3.44147e+00_rt, -3.29529e+00_rt, +-3.14912e+00_rt, -3.00296e+00_rt, -2.85681e+00_rt, -2.71067e+00_rt, +-2.56456e+00_rt, -2.41849e+00_rt, -2.27245e+00_rt, -2.12648e+00_rt, +-1.98060e+00_rt, -1.83484e+00_rt, -1.68926e+00_rt, -1.54392e+00_rt, +-1.39895e+00_rt, -1.25449e+00_rt, -1.11077e+00_rt, -9.68140e-01_rt, +-8.27086e-01_rt, -6.88334e-01_rt, -5.52934e-01_rt, -4.22365e-01_rt, +-2.98586e-01_rt, -1.83733e-01_rt, -7.85591e-02_rt, 0.00000e+00_rt, +-9.01233e+00_rt, -8.86614e+00_rt, -8.71994e+00_rt, -8.57375e+00_rt, +-8.42755e+00_rt, -8.28135e+00_rt, -8.13516e+00_rt, -7.98896e+00_rt, +-7.84277e+00_rt, -7.69657e+00_rt, -7.55037e+00_rt, -7.40418e+00_rt, +-7.25798e+00_rt, -7.11179e+00_rt, -6.96559e+00_rt, -6.81939e+00_rt, +-6.67320e+00_rt, -6.52700e+00_rt, -6.38081e+00_rt, -6.23461e+00_rt, +-6.08842e+00_rt, -5.94222e+00_rt, -5.79602e+00_rt, -5.64983e+00_rt, +-5.50363e+00_rt, -5.35744e+00_rt, -5.21124e+00_rt, -5.06505e+00_rt, +-4.91885e+00_rt, -4.77266e+00_rt, -4.62646e+00_rt, -4.48027e+00_rt, +-4.33407e+00_rt, -4.18788e+00_rt, -4.04169e+00_rt, -3.89550e+00_rt, +-3.74931e+00_rt, -3.60312e+00_rt, -3.45694e+00_rt, -3.31076e+00_rt, +-3.16458e+00_rt, -3.01842e+00_rt, -2.87226e+00_rt, -2.72612e+00_rt, +-2.58000e+00_rt, -2.43391e+00_rt, -2.28786e+00_rt, -2.14187e+00_rt, +-1.99596e+00_rt, -1.85017e+00_rt, -1.70453e+00_rt, -1.55913e+00_rt, +-1.41406e+00_rt, -1.26948e+00_rt, -1.12560e+00_rt, -9.82749e-01_rt, +-8.41396e-01_rt, -7.02238e-01_rt, -5.66284e-01_rt, -4.34952e-01_rt, +-3.10105e-01_rt, -1.93707e-01_rt, -8.60082e-02_rt, 0.00000e+00_rt, +-9.02644e+00_rt, -8.88024e+00_rt, -8.73404e+00_rt, -8.58785e+00_rt, +-8.44165e+00_rt, -8.29546e+00_rt, -8.14926e+00_rt, -8.00306e+00_rt, +-7.85687e+00_rt, -7.71067e+00_rt, -7.56448e+00_rt, -7.41828e+00_rt, +-7.27209e+00_rt, -7.12589e+00_rt, -6.97969e+00_rt, -6.83350e+00_rt, +-6.68730e+00_rt, -6.54111e+00_rt, -6.39491e+00_rt, -6.24871e+00_rt, +-6.10252e+00_rt, -5.95632e+00_rt, -5.81013e+00_rt, -5.66393e+00_rt, +-5.51774e+00_rt, -5.37154e+00_rt, -5.22534e+00_rt, -5.07915e+00_rt, +-4.93295e+00_rt, -4.78676e+00_rt, -4.64056e+00_rt, -4.49437e+00_rt, +-4.34817e+00_rt, -4.20198e+00_rt, -4.05579e+00_rt, -3.90960e+00_rt, +-3.76341e+00_rt, -3.61722e+00_rt, -3.47103e+00_rt, -3.32485e+00_rt, +-3.17867e+00_rt, -3.03251e+00_rt, -2.88635e+00_rt, -2.74020e+00_rt, +-2.59407e+00_rt, -2.44798e+00_rt, -2.30191e+00_rt, -2.15590e+00_rt, +-2.00997e+00_rt, -1.86414e+00_rt, -1.71846e+00_rt, -1.57300e+00_rt, +-1.42785e+00_rt, -1.28316e+00_rt, -1.13914e+00_rt, -9.96094e-01_rt, +-8.54478e-01_rt, -7.14965e-01_rt, -5.78526e-01_rt, -4.46526e-01_rt, +-3.20745e-01_rt, -2.03002e-01_rt, -9.31232e-02_rt, 0.00000e+00_rt, +-9.03926e+00_rt, -8.89306e+00_rt, -8.74686e+00_rt, -8.60067e+00_rt, +-8.45447e+00_rt, -8.30828e+00_rt, -8.16208e+00_rt, -8.01589e+00_rt, +-7.86969e+00_rt, -7.72349e+00_rt, -7.57730e+00_rt, -7.43110e+00_rt, +-7.28491e+00_rt, -7.13871e+00_rt, -6.99251e+00_rt, -6.84632e+00_rt, +-6.70012e+00_rt, -6.55393e+00_rt, -6.40773e+00_rt, -6.26153e+00_rt, +-6.11534e+00_rt, -5.96914e+00_rt, -5.82295e+00_rt, -5.67675e+00_rt, +-5.53056e+00_rt, -5.38436e+00_rt, -5.23816e+00_rt, -5.09197e+00_rt, +-4.94577e+00_rt, -4.79958e+00_rt, -4.65338e+00_rt, -4.50719e+00_rt, +-4.36099e+00_rt, -4.21480e+00_rt, -4.06861e+00_rt, -3.92241e+00_rt, +-3.77622e+00_rt, -3.63004e+00_rt, -3.48385e+00_rt, -3.33767e+00_rt, +-3.19149e+00_rt, -3.04532e+00_rt, -2.89915e+00_rt, -2.75300e+00_rt, +-2.60687e+00_rt, -2.46076e+00_rt, -2.31469e+00_rt, -2.16866e+00_rt, +-2.02270e+00_rt, -1.87684e+00_rt, -1.73113e+00_rt, -1.58561e+00_rt, +-1.44040e+00_rt, -1.29562e+00_rt, -1.15147e+00_rt, -1.00825e+00_rt, +-8.66403e-01_rt, -7.26578e-01_rt, -5.89713e-01_rt, -4.57128e-01_rt, +-3.30531e-01_rt, -2.11616e-01_rt, -9.98571e-02_rt, 0.00000e+00_rt, +-9.05088e+00_rt, -8.90469e+00_rt, -8.75849e+00_rt, -8.61229e+00_rt, +-8.46610e+00_rt, -8.31990e+00_rt, -8.17371e+00_rt, -8.02751e+00_rt, +-7.88132e+00_rt, -7.73512e+00_rt, -7.58892e+00_rt, -7.44273e+00_rt, +-7.29653e+00_rt, -7.15034e+00_rt, -7.00414e+00_rt, -6.85794e+00_rt, +-6.71175e+00_rt, -6.56555e+00_rt, -6.41936e+00_rt, -6.27316e+00_rt, +-6.12696e+00_rt, -5.98077e+00_rt, -5.83457e+00_rt, -5.68838e+00_rt, +-5.54218e+00_rt, -5.39599e+00_rt, -5.24979e+00_rt, -5.10359e+00_rt, +-4.95740e+00_rt, -4.81120e+00_rt, -4.66501e+00_rt, -4.51881e+00_rt, +-4.37262e+00_rt, -4.22643e+00_rt, -4.08023e+00_rt, -3.93404e+00_rt, +-3.78785e+00_rt, -3.64166e+00_rt, -3.49547e+00_rt, -3.34929e+00_rt, +-3.20311e+00_rt, -3.05693e+00_rt, -2.91077e+00_rt, -2.76461e+00_rt, +-2.61847e+00_rt, -2.47236e+00_rt, -2.32627e+00_rt, -2.18023e+00_rt, +-2.03425e+00_rt, -1.88837e+00_rt, -1.74262e+00_rt, -1.59706e+00_rt, +-1.45178e+00_rt, -1.30692e+00_rt, -1.16266e+00_rt, -1.01929e+00_rt, +-8.77243e-01_rt, -7.37144e-01_rt, -5.99906e-01_rt, -4.66808e-01_rt, +-3.39497e-01_rt, -2.19560e-01_rt, -1.06179e-01_rt, 0.00000e+00_rt, +-9.06140e+00_rt, -8.91520e+00_rt, -8.76901e+00_rt, -8.62281e+00_rt, +-8.47662e+00_rt, -8.33042e+00_rt, -8.18422e+00_rt, -8.03803e+00_rt, +-7.89183e+00_rt, -7.74564e+00_rt, -7.59944e+00_rt, -7.45324e+00_rt, +-7.30705e+00_rt, -7.16085e+00_rt, -7.01466e+00_rt, -6.86846e+00_rt, +-6.72227e+00_rt, -6.57607e+00_rt, -6.42987e+00_rt, -6.28368e+00_rt, +-6.13748e+00_rt, -5.99129e+00_rt, -5.84509e+00_rt, -5.69889e+00_rt, +-5.55270e+00_rt, -5.40650e+00_rt, -5.26031e+00_rt, -5.11411e+00_rt, +-4.96792e+00_rt, -4.82172e+00_rt, -4.67553e+00_rt, -4.52933e+00_rt, +-4.38314e+00_rt, -4.23694e+00_rt, -4.09075e+00_rt, -3.94455e+00_rt, +-3.79836e+00_rt, -3.65217e+00_rt, -3.50598e+00_rt, -3.35980e+00_rt, +-3.21362e+00_rt, -3.06744e+00_rt, -2.92127e+00_rt, -2.77511e+00_rt, +-2.62897e+00_rt, -2.48285e+00_rt, -2.33675e+00_rt, -2.19070e+00_rt, +-2.04471e+00_rt, -1.89880e+00_rt, -1.75302e+00_rt, -1.60742e+00_rt, +-1.46209e+00_rt, -1.31715e+00_rt, -1.17279e+00_rt, -1.02929e+00_rt, +-8.87070e-01_rt, -7.46731e-01_rt, -6.09166e-01_rt, -4.75619e-01_rt, +-3.47682e-01_rt, -2.26853e-01_rt, -1.12073e-01_rt, 0.00000e+00_rt, +-9.07089e+00_rt, -8.92470e+00_rt, -8.77850e+00_rt, -8.63230e+00_rt, +-8.48611e+00_rt, -8.33991e+00_rt, -8.19372e+00_rt, -8.04752e+00_rt, +-7.90133e+00_rt, -7.75513e+00_rt, -7.60893e+00_rt, -7.46274e+00_rt, +-7.31654e+00_rt, -7.17035e+00_rt, -7.02415e+00_rt, -6.87795e+00_rt, +-6.73176e+00_rt, -6.58556e+00_rt, -6.43937e+00_rt, -6.29317e+00_rt, +-6.14697e+00_rt, -6.00078e+00_rt, -5.85458e+00_rt, -5.70839e+00_rt, +-5.56219e+00_rt, -5.41600e+00_rt, -5.26980e+00_rt, -5.12360e+00_rt, +-4.97741e+00_rt, -4.83121e+00_rt, -4.68502e+00_rt, -4.53882e+00_rt, +-4.39263e+00_rt, -4.24643e+00_rt, -4.10024e+00_rt, -3.95405e+00_rt, +-3.80785e+00_rt, -3.66166e+00_rt, -3.51547e+00_rt, -3.36929e+00_rt, +-3.22310e+00_rt, -3.07693e+00_rt, -2.93075e+00_rt, -2.78459e+00_rt, +-2.63844e+00_rt, -2.49231e+00_rt, -2.34621e+00_rt, -2.20015e+00_rt, +-2.05414e+00_rt, -1.90821e+00_rt, -1.76241e+00_rt, -1.61677e+00_rt, +-1.47139e+00_rt, -1.32639e+00_rt, -1.18195e+00_rt, -1.03834e+00_rt, +-8.95956e-01_rt, -7.55406e-01_rt, -6.17555e-01_rt, -4.83614e-01_rt, +-3.55130e-01_rt, -2.33523e-01_rt, -1.17533e-01_rt, 0.00000e+00_rt, +-9.07944e+00_rt, -8.93325e+00_rt, -8.78705e+00_rt, -8.64085e+00_rt, +-8.49466e+00_rt, -8.34846e+00_rt, -8.20227e+00_rt, -8.05607e+00_rt, +-7.90988e+00_rt, -7.76368e+00_rt, -7.61748e+00_rt, -7.47129e+00_rt, +-7.32509e+00_rt, -7.17890e+00_rt, -7.03270e+00_rt, -6.88650e+00_rt, +-6.74031e+00_rt, -6.59411e+00_rt, -6.44792e+00_rt, -6.30172e+00_rt, +-6.15552e+00_rt, -6.00933e+00_rt, -5.86313e+00_rt, -5.71694e+00_rt, +-5.57074e+00_rt, -5.42455e+00_rt, -5.27835e+00_rt, -5.13215e+00_rt, +-4.98596e+00_rt, -4.83976e+00_rt, -4.69357e+00_rt, -4.54737e+00_rt, +-4.40118e+00_rt, -4.25498e+00_rt, -4.10879e+00_rt, -3.96260e+00_rt, +-3.81640e+00_rt, -3.67021e+00_rt, -3.52402e+00_rt, -3.37783e+00_rt, +-3.23165e+00_rt, -3.08547e+00_rt, -2.93930e+00_rt, -2.79313e+00_rt, +-2.64698e+00_rt, -2.50084e+00_rt, -2.35473e+00_rt, -2.20866e+00_rt, +-2.06264e+00_rt, -1.91670e+00_rt, -1.77087e+00_rt, -1.62520e+00_rt, +-1.47978e+00_rt, -1.33472e+00_rt, -1.19020e+00_rt, -1.04649e+00_rt, +-9.03973e-01_rt, -7.63238e-01_rt, -6.25135e-01_rt, -4.90849e-01_rt, +-3.61886e-01_rt, -2.39599e-01_rt, -1.22564e-01_rt, 0.00000e+00_rt, +-9.08713e+00_rt, -8.94093e+00_rt, -8.79474e+00_rt, -8.64854e+00_rt, +-8.50234e+00_rt, -8.35615e+00_rt, -8.20995e+00_rt, -8.06376e+00_rt, +-7.91756e+00_rt, -7.77136e+00_rt, -7.62517e+00_rt, -7.47897e+00_rt, +-7.33278e+00_rt, -7.18658e+00_rt, -7.04038e+00_rt, -6.89419e+00_rt, +-6.74799e+00_rt, -6.60180e+00_rt, -6.45560e+00_rt, -6.30941e+00_rt, +-6.16321e+00_rt, -6.01701e+00_rt, -5.87082e+00_rt, -5.72462e+00_rt, +-5.57843e+00_rt, -5.43223e+00_rt, -5.28603e+00_rt, -5.13984e+00_rt, +-4.99364e+00_rt, -4.84745e+00_rt, -4.70125e+00_rt, -4.55506e+00_rt, +-4.40886e+00_rt, -4.26267e+00_rt, -4.11647e+00_rt, -3.97028e+00_rt, +-3.82409e+00_rt, -3.67789e+00_rt, -3.53170e+00_rt, -3.38552e+00_rt, +-3.23933e+00_rt, -3.09315e+00_rt, -2.94697e+00_rt, -2.80080e+00_rt, +-2.65465e+00_rt, -2.50851e+00_rt, -2.36239e+00_rt, -2.21631e+00_rt, +-2.07028e+00_rt, -1.92432e+00_rt, -1.77847e+00_rt, -1.63278e+00_rt, +-1.48732e+00_rt, -1.34221e+00_rt, -1.19763e+00_rt, -1.05383e+00_rt, +-9.11190e-01_rt, -7.70293e-01_rt, -6.31969e-01_rt, -4.97380e-01_rt, +-3.67997e-01_rt, -2.45116e-01_rt, -1.27177e-01_rt, 0.00000e+00_rt, +-9.09402e+00_rt, -8.94783e+00_rt, -8.80163e+00_rt, -8.65543e+00_rt, +-8.50924e+00_rt, -8.36304e+00_rt, -8.21685e+00_rt, -8.07065e+00_rt, +-7.92445e+00_rt, -7.77826e+00_rt, -7.63206e+00_rt, -7.48587e+00_rt, +-7.33967e+00_rt, -7.19347e+00_rt, -7.04728e+00_rt, -6.90108e+00_rt, +-6.75489e+00_rt, -6.60869e+00_rt, -6.46250e+00_rt, -6.31630e+00_rt, +-6.17010e+00_rt, -6.02391e+00_rt, -5.87771e+00_rt, -5.73152e+00_rt, +-5.58532e+00_rt, -5.43912e+00_rt, -5.29293e+00_rt, -5.14673e+00_rt, +-5.00054e+00_rt, -4.85434e+00_rt, -4.70815e+00_rt, -4.56195e+00_rt, +-4.41576e+00_rt, -4.26956e+00_rt, -4.12337e+00_rt, -3.97717e+00_rt, +-3.83098e+00_rt, -3.68479e+00_rt, -3.53860e+00_rt, -3.39241e+00_rt, +-3.24622e+00_rt, -3.10004e+00_rt, -2.95386e+00_rt, -2.80769e+00_rt, +-2.66153e+00_rt, -2.51539e+00_rt, -2.36927e+00_rt, -2.22318e+00_rt, +-2.07714e+00_rt, -1.93116e+00_rt, -1.78529e+00_rt, -1.63958e+00_rt, +-1.49409e+00_rt, -1.34894e+00_rt, -1.20430e+00_rt, -1.06041e+00_rt, +-9.17673e-01_rt, -7.76634e-01_rt, -6.38116e-01_rt, -5.03261e-01_rt, +-3.73511e-01_rt, -2.50110e-01_rt, -1.31387e-01_rt, 0.00000e+00_rt, +-9.10020e+00_rt, -8.95400e+00_rt, -8.80780e+00_rt, -8.66161e+00_rt, +-8.51541e+00_rt, -8.36922e+00_rt, -8.22302e+00_rt, -8.07682e+00_rt, +-7.93063e+00_rt, -7.78443e+00_rt, -7.63824e+00_rt, -7.49204e+00_rt, +-7.34585e+00_rt, -7.19965e+00_rt, -7.05345e+00_rt, -6.90726e+00_rt, +-6.76106e+00_rt, -6.61487e+00_rt, -6.46867e+00_rt, -6.32247e+00_rt, +-6.17628e+00_rt, -6.03008e+00_rt, -5.88389e+00_rt, -5.73769e+00_rt, +-5.59149e+00_rt, -5.44530e+00_rt, -5.29910e+00_rt, -5.15291e+00_rt, +-5.00671e+00_rt, -4.86052e+00_rt, -4.71432e+00_rt, -4.56813e+00_rt, +-4.42193e+00_rt, -4.27574e+00_rt, -4.12954e+00_rt, -3.98335e+00_rt, +-3.83715e+00_rt, -3.69096e+00_rt, -3.54477e+00_rt, -3.39858e+00_rt, +-3.25239e+00_rt, -3.10621e+00_rt, -2.96003e+00_rt, -2.81386e+00_rt, +-2.66769e+00_rt, -2.52155e+00_rt, -2.37542e+00_rt, -2.22933e+00_rt, +-2.08327e+00_rt, -1.93729e+00_rt, -1.79141e+00_rt, -1.64567e+00_rt, +-1.50015e+00_rt, -1.35496e+00_rt, -1.21027e+00_rt, -1.06632e+00_rt, +-9.23486e-01_rt, -7.82322e-01_rt, -6.43634e-01_rt, -5.08546e-01_rt, +-3.78473e-01_rt, -2.54618e-01_rt, -1.35215e-01_rt, 0.00000e+00_rt, +-9.10572e+00_rt, -8.95952e+00_rt, -8.81333e+00_rt, -8.66713e+00_rt, +-8.52093e+00_rt, -8.37474e+00_rt, -8.22854e+00_rt, -8.08235e+00_rt, +-7.93615e+00_rt, -7.78995e+00_rt, -7.64376e+00_rt, -7.49756e+00_rt, +-7.35137e+00_rt, -7.20517e+00_rt, -7.05897e+00_rt, -6.91278e+00_rt, +-6.76658e+00_rt, -6.62039e+00_rt, -6.47419e+00_rt, -6.32799e+00_rt, +-6.18180e+00_rt, -6.03560e+00_rt, -5.88941e+00_rt, -5.74321e+00_rt, +-5.59702e+00_rt, -5.45082e+00_rt, -5.30462e+00_rt, -5.15843e+00_rt, +-5.01223e+00_rt, -4.86604e+00_rt, -4.71984e+00_rt, -4.57365e+00_rt, +-4.42745e+00_rt, -4.28126e+00_rt, -4.13506e+00_rt, -3.98887e+00_rt, +-3.84267e+00_rt, -3.69648e+00_rt, -3.55029e+00_rt, -3.40410e+00_rt, +-3.25791e+00_rt, -3.11172e+00_rt, -2.96554e+00_rt, -2.81937e+00_rt, +-2.67321e+00_rt, -2.52706e+00_rt, -2.38092e+00_rt, -2.23482e+00_rt, +-2.08877e+00_rt, -1.94277e+00_rt, -1.79687e+00_rt, -1.65112e+00_rt, +-1.50557e+00_rt, -1.36035e+00_rt, -1.21562e+00_rt, -1.07160e+00_rt, +-9.28689e-01_rt, -7.87415e-01_rt, -6.48578e-01_rt, -5.13286e-01_rt, +-3.82930e-01_rt, -2.58677e-01_rt, -1.38684e-01_rt, 0.00000e+00_rt, +-9.11065e+00_rt, -8.96445e+00_rt, -8.81825e+00_rt, -8.67206e+00_rt, +-8.52586e+00_rt, -8.37967e+00_rt, -8.23347e+00_rt, -8.08727e+00_rt, +-7.94108e+00_rt, -7.79488e+00_rt, -7.64869e+00_rt, -7.50249e+00_rt, +-7.35629e+00_rt, -7.21010e+00_rt, -7.06390e+00_rt, -6.91771e+00_rt, +-6.77151e+00_rt, -6.62531e+00_rt, -6.47912e+00_rt, -6.33292e+00_rt, +-6.18673e+00_rt, -6.04053e+00_rt, -5.89434e+00_rt, -5.74814e+00_rt, +-5.60194e+00_rt, -5.45575e+00_rt, -5.30955e+00_rt, -5.16336e+00_rt, +-5.01716e+00_rt, -4.87096e+00_rt, -4.72477e+00_rt, -4.57857e+00_rt, +-4.43238e+00_rt, -4.28618e+00_rt, -4.13999e+00_rt, -3.99379e+00_rt, +-3.84760e+00_rt, -3.70141e+00_rt, -3.55521e+00_rt, -3.40902e+00_rt, +-3.26283e+00_rt, -3.11665e+00_rt, -2.97047e+00_rt, -2.82429e+00_rt, +-2.67813e+00_rt, -2.53197e+00_rt, -2.38584e+00_rt, -2.23973e+00_rt, +-2.09367e+00_rt, -1.94766e+00_rt, -1.80175e+00_rt, -1.65598e+00_rt, +-1.51042e+00_rt, -1.36517e+00_rt, -1.22039e+00_rt, -1.07633e+00_rt, +-9.33339e-01_rt, -7.91968e-01_rt, -6.53000e-01_rt, -5.17528e-01_rt, +-3.86924e-01_rt, -2.62323e-01_rt, -1.41817e-01_rt, 0.00000e+00_rt, +-9.11504e+00_rt, -8.96884e+00_rt, -8.82265e+00_rt, -8.67645e+00_rt, +-8.53025e+00_rt, -8.38406e+00_rt, -8.23786e+00_rt, -8.09167e+00_rt, +-7.94547e+00_rt, -7.79928e+00_rt, -7.65308e+00_rt, -7.50688e+00_rt, +-7.36069e+00_rt, -7.21449e+00_rt, -7.06830e+00_rt, -6.92210e+00_rt, +-6.77590e+00_rt, -6.62971e+00_rt, -6.48351e+00_rt, -6.33732e+00_rt, +-6.19112e+00_rt, -6.04492e+00_rt, -5.89873e+00_rt, -5.75253e+00_rt, +-5.60634e+00_rt, -5.46014e+00_rt, -5.31395e+00_rt, -5.16775e+00_rt, +-5.02155e+00_rt, -4.87536e+00_rt, -4.72916e+00_rt, -4.58297e+00_rt, +-4.43677e+00_rt, -4.29058e+00_rt, -4.14438e+00_rt, -3.99819e+00_rt, +-3.85199e+00_rt, -3.70580e+00_rt, -3.55961e+00_rt, -3.41342e+00_rt, +-3.26723e+00_rt, -3.12104e+00_rt, -2.97486e+00_rt, -2.82868e+00_rt, +-2.68251e+00_rt, -2.53636e+00_rt, -2.39022e+00_rt, -2.24411e+00_rt, +-2.09804e+00_rt, -1.95203e+00_rt, -1.80610e+00_rt, -1.66032e+00_rt, +-1.51474e+00_rt, -1.36946e+00_rt, -1.22465e+00_rt, -1.08054e+00_rt, +-9.37487e-01_rt, -7.96032e-01_rt, -6.56948e-01_rt, -5.21319e-01_rt, +-3.90498e-01_rt, -2.65591e-01_rt, -1.44639e-01_rt, 0.00000e+00_rt, +-9.11895e+00_rt, -8.97275e+00_rt, -8.82656e+00_rt, -8.68036e+00_rt, +-8.53417e+00_rt, -8.38797e+00_rt, -8.24177e+00_rt, -8.09558e+00_rt, +-7.94938e+00_rt, -7.80319e+00_rt, -7.65699e+00_rt, -7.51079e+00_rt, +-7.36460e+00_rt, -7.21840e+00_rt, -7.07221e+00_rt, -6.92601e+00_rt, +-6.77982e+00_rt, -6.63362e+00_rt, -6.48742e+00_rt, -6.34123e+00_rt, +-6.19503e+00_rt, -6.04884e+00_rt, -5.90264e+00_rt, -5.75644e+00_rt, +-5.61025e+00_rt, -5.46405e+00_rt, -5.31786e+00_rt, -5.17166e+00_rt, +-5.02547e+00_rt, -4.87927e+00_rt, -4.73307e+00_rt, -4.58688e+00_rt, +-4.44068e+00_rt, -4.29449e+00_rt, -4.14829e+00_rt, -4.00210e+00_rt, +-3.85590e+00_rt, -3.70971e+00_rt, -3.56352e+00_rt, -3.41733e+00_rt, +-3.27114e+00_rt, -3.12495e+00_rt, -2.97876e+00_rt, -2.83259e+00_rt, +-2.68642e+00_rt, -2.54026e+00_rt, -2.39412e+00_rt, -2.24800e+00_rt, +-2.10193e+00_rt, -1.95591e+00_rt, -1.80998e+00_rt, -1.66418e+00_rt, +-1.51858e+00_rt, -1.37328e+00_rt, -1.22844e+00_rt, -1.08429e+00_rt, +-9.41184e-01_rt, -7.99654e-01_rt, -6.60469e-01_rt, -5.24702e-01_rt, +-3.93689e-01_rt, -2.68515e-01_rt, -1.47175e-01_rt, 0.00000e+00_rt, +-9.12243e+00_rt, -8.97623e+00_rt, -8.83004e+00_rt, -8.68384e+00_rt, +-8.53764e+00_rt, -8.39145e+00_rt, -8.24525e+00_rt, -8.09906e+00_rt, +-7.95286e+00_rt, -7.80666e+00_rt, -7.66047e+00_rt, -7.51427e+00_rt, +-7.36808e+00_rt, -7.22188e+00_rt, -7.07569e+00_rt, -6.92949e+00_rt, +-6.78329e+00_rt, -6.63710e+00_rt, -6.49090e+00_rt, -6.34471e+00_rt, +-6.19851e+00_rt, -6.05231e+00_rt, -5.90612e+00_rt, -5.75992e+00_rt, +-5.61373e+00_rt, -5.46753e+00_rt, -5.32133e+00_rt, -5.17514e+00_rt, +-5.02894e+00_rt, -4.88275e+00_rt, -4.73655e+00_rt, -4.59036e+00_rt, +-4.44416e+00_rt, -4.29797e+00_rt, -4.15177e+00_rt, -4.00558e+00_rt, +-3.85938e+00_rt, -3.71319e+00_rt, -3.56699e+00_rt, -3.42080e+00_rt, +-3.27461e+00_rt, -3.12842e+00_rt, -2.98224e+00_rt, -2.83606e+00_rt, +-2.68989e+00_rt, -2.54373e+00_rt, -2.39759e+00_rt, -2.25147e+00_rt, +-2.10539e+00_rt, -1.95936e+00_rt, -1.81343e+00_rt, -1.66762e+00_rt, +-1.52200e+00_rt, -1.37668e+00_rt, -1.23181e+00_rt, -1.08763e+00_rt, +-9.44473e-01_rt, -8.02878e-01_rt, -6.63604e-01_rt, -5.27715e-01_rt, +-3.96535e-01_rt, -2.71126e-01_rt, -1.49447e-01_rt, 0.00000e+00_rt, +-9.12552e+00_rt, -8.97932e+00_rt, -8.83313e+00_rt, -8.68693e+00_rt, +-8.54073e+00_rt, -8.39454e+00_rt, -8.24834e+00_rt, -8.10215e+00_rt, +-7.95595e+00_rt, -7.80975e+00_rt, -7.66356e+00_rt, -7.51736e+00_rt, +-7.37117e+00_rt, -7.22497e+00_rt, -7.07877e+00_rt, -6.93258e+00_rt, +-6.78638e+00_rt, -6.64019e+00_rt, -6.49399e+00_rt, -6.34780e+00_rt, +-6.20160e+00_rt, -6.05540e+00_rt, -5.90921e+00_rt, -5.76301e+00_rt, +-5.61682e+00_rt, -5.47062e+00_rt, -5.32442e+00_rt, -5.17823e+00_rt, +-5.03203e+00_rt, -4.88584e+00_rt, -4.73964e+00_rt, -4.59345e+00_rt, +-4.44725e+00_rt, -4.30105e+00_rt, -4.15486e+00_rt, -4.00866e+00_rt, +-3.86247e+00_rt, -3.71628e+00_rt, -3.57008e+00_rt, -3.42389e+00_rt, +-3.27770e+00_rt, -3.13151e+00_rt, -2.98533e+00_rt, -2.83915e+00_rt, +-2.69297e+00_rt, -2.54681e+00_rt, -2.40067e+00_rt, -2.25455e+00_rt, +-2.10846e+00_rt, -1.96243e+00_rt, -1.81649e+00_rt, -1.67067e+00_rt, +-1.52504e+00_rt, -1.37970e+00_rt, -1.23481e+00_rt, -1.09059e+00_rt, +-9.47396e-01_rt, -8.05743e-01_rt, -6.66391e-01_rt, -5.30396e-01_rt, +-3.99069e-01_rt, -2.73455e-01_rt, -1.51480e-01_rt, 0.00000e+00_rt, +-9.12826e+00_rt, -8.98206e+00_rt, -8.83587e+00_rt, -8.68967e+00_rt, +-8.54348e+00_rt, -8.39728e+00_rt, -8.25108e+00_rt, -8.10489e+00_rt, +-7.95869e+00_rt, -7.81250e+00_rt, -7.66630e+00_rt, -7.52010e+00_rt, +-7.37391e+00_rt, -7.22771e+00_rt, -7.08152e+00_rt, -6.93532e+00_rt, +-6.78912e+00_rt, -6.64293e+00_rt, -6.49673e+00_rt, -6.35054e+00_rt, +-6.20434e+00_rt, -6.05814e+00_rt, -5.91195e+00_rt, -5.76575e+00_rt, +-5.61956e+00_rt, -5.47336e+00_rt, -5.32717e+00_rt, -5.18097e+00_rt, +-5.03477e+00_rt, -4.88858e+00_rt, -4.74238e+00_rt, -4.59619e+00_rt, +-4.44999e+00_rt, -4.30380e+00_rt, -4.15760e+00_rt, -4.01141e+00_rt, +-3.86521e+00_rt, -3.71902e+00_rt, -3.57282e+00_rt, -3.42663e+00_rt, +-3.28044e+00_rt, -3.13425e+00_rt, -2.98807e+00_rt, -2.84188e+00_rt, +-2.69571e+00_rt, -2.54955e+00_rt, -2.40340e+00_rt, -2.25728e+00_rt, +-2.11119e+00_rt, -1.96515e+00_rt, -1.81920e+00_rt, -1.67337e+00_rt, +-1.52773e+00_rt, -1.38238e+00_rt, -1.23747e+00_rt, -1.09322e+00_rt, +-9.49991e-01_rt, -8.08288e-01_rt, -6.68868e-01_rt, -5.32779e-01_rt, +-4.01323e-01_rt, -2.75528e-01_rt, -1.53296e-01_rt, 0.00000e+00_rt, +-9.13069e+00_rt, -8.98449e+00_rt, -8.83830e+00_rt, -8.69210e+00_rt, +-8.54591e+00_rt, -8.39971e+00_rt, -8.25351e+00_rt, -8.10732e+00_rt, +-7.96112e+00_rt, -7.81493e+00_rt, -7.66873e+00_rt, -7.52253e+00_rt, +-7.37634e+00_rt, -7.23014e+00_rt, -7.08395e+00_rt, -6.93775e+00_rt, +-6.79155e+00_rt, -6.64536e+00_rt, -6.49916e+00_rt, -6.35297e+00_rt, +-6.20677e+00_rt, -6.06058e+00_rt, -5.91438e+00_rt, -5.76818e+00_rt, +-5.62199e+00_rt, -5.47579e+00_rt, -5.32960e+00_rt, -5.18340e+00_rt, +-5.03720e+00_rt, -4.89101e+00_rt, -4.74481e+00_rt, -4.59862e+00_rt, +-4.45242e+00_rt, -4.30623e+00_rt, -4.16003e+00_rt, -4.01384e+00_rt, +-3.86764e+00_rt, -3.72145e+00_rt, -3.57525e+00_rt, -3.42906e+00_rt, +-3.28287e+00_rt, -3.13668e+00_rt, -2.99049e+00_rt, -2.84431e+00_rt, +-2.69814e+00_rt, -2.55197e+00_rt, -2.40582e+00_rt, -2.25970e+00_rt, +-2.11361e+00_rt, -1.96757e+00_rt, -1.82161e+00_rt, -1.67577e+00_rt, +-1.53013e+00_rt, -1.38476e+00_rt, -1.23983e+00_rt, -1.09556e+00_rt, +-9.52293e-01_rt, -8.10546e-01_rt, -6.71065e-01_rt, -5.34894e-01_rt, +-4.03325e-01_rt, -2.77372e-01_rt, -1.54914e-01_rt, 0.00000e+00_rt, +-9.13284e+00_rt, -8.98665e+00_rt, -8.84045e+00_rt, -8.69425e+00_rt, +-8.54806e+00_rt, -8.40186e+00_rt, -8.25567e+00_rt, -8.10947e+00_rt, +-7.96327e+00_rt, -7.81708e+00_rt, -7.67088e+00_rt, -7.52469e+00_rt, +-7.37849e+00_rt, -7.23229e+00_rt, -7.08610e+00_rt, -6.93990e+00_rt, +-6.79371e+00_rt, -6.64751e+00_rt, -6.50132e+00_rt, -6.35512e+00_rt, +-6.20892e+00_rt, -6.06273e+00_rt, -5.91653e+00_rt, -5.77034e+00_rt, +-5.62414e+00_rt, -5.47794e+00_rt, -5.33175e+00_rt, -5.18555e+00_rt, +-5.03936e+00_rt, -4.89316e+00_rt, -4.74697e+00_rt, -4.60077e+00_rt, +-4.45457e+00_rt, -4.30838e+00_rt, -4.16218e+00_rt, -4.01599e+00_rt, +-3.86979e+00_rt, -3.72360e+00_rt, -3.57740e+00_rt, -3.43121e+00_rt, +-3.28502e+00_rt, -3.13883e+00_rt, -2.99264e+00_rt, -2.84646e+00_rt, +-2.70029e+00_rt, -2.55412e+00_rt, -2.40797e+00_rt, -2.26184e+00_rt, +-2.11575e+00_rt, -1.96971e+00_rt, -1.82374e+00_rt, -1.67790e+00_rt, +-1.53224e+00_rt, -1.38687e+00_rt, -1.24192e+00_rt, -1.09763e+00_rt, +-9.54333e-01_rt, -8.12547e-01_rt, -6.73013e-01_rt, -5.36770e-01_rt, +-4.05101e-01_rt, -2.79009e-01_rt, -1.56354e-01_rt, 0.00000e+00_rt}; + + amrex::Gpu::synchronize(); + + m_phot_em_table = QS_phot_em_table{phot_em_params, vals}; +} + //============================================ diff --git a/Source/Particles/ElementaryProcess/QEDInternals/SchwingerProcessWrapper.H b/Source/Particles/ElementaryProcess/QEDInternals/SchwingerProcessWrapper.H index 46960fa00..910ea5e1d 100644 --- a/Source/Particles/ElementaryProcess/QEDInternals/SchwingerProcessWrapper.H +++ b/Source/Particles/ElementaryProcess/QEDInternals/SchwingerProcessWrapper.H @@ -10,10 +10,7 @@ #include "QedWrapperCommons.H" -//#define PXRMP_CORE_ONLY allows importing only the 'core functions' of the -//Schwinger process engine of the QED PICSAR library. -#define PXRMP_CORE_ONLY -#include <schwinger_pair_engine.hpp> +#include <physics/schwinger/schwinger_pair_engine_core.hpp> #include <AMReX_Random.H> #include <cmath> @@ -22,7 +19,8 @@ * the number of Schwinger pairs created at a given timestep and in a given * cell as a function of the EM field in that cell. * - * @param[in] dVdt Volume of the cell multiplied by temporal step. + * @param[in] dV Volume of the cell. + * @param[in] dt temporal step. * @param[in] Ex x-component of the electric field on the cell. * @param[in] Ey y-component of the electric field on the cell. * @param[in] Ez z-component of the electric field on the cell. @@ -33,33 +31,30 @@ * pairs is below this parameter, a Poisson distribution is used * to draw the number of created pairs. Otherwise a Gaussian * distribution is used. + * @return the number of pairs generated via the Schwinger process */ -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real -getSchwingerProductionNumber (const amrex::Real dVdt, +AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE +amrex::Real +getSchwingerProductionNumber (const amrex::Real dV, const amrex::Real dt, const amrex::Real Ex, const amrex::Real Ey, const amrex::Real Ez, const amrex::Real Bx, const amrex::Real By, const amrex::Real Bz, const amrex::Real PoissonToGaussianThreshold) { using namespace amrex; - using namespace picsar::multi_physics; + namespace pxr_p = picsar::multi_physics::phys; + namespace pxr_sh = picsar::multi_physics::phys::schwinger; - //If SI units are used, PICSAR QED does not use a reference length. - // However, a "lambda" parameter must still be passed to some functions. - const auto dummy_lambda = 1._rt; - - const auto expectedPairNumber = dVdt * - schwinger_pair_engine<Real,QedUtils::DummyStruct>:: - internal_compute_schwinger_pair_production_rate( - Ex, Ey, Ez, Bx, By, Bz, dummy_lambda); + const auto expectedPairNumber = + pxr_sh::expected_pair_number<amrex::Real, pxr_p::unit_system::SI>( + Ex, Ey, Ez, Bx, By, Bz, dV, dt); if (expectedPairNumber <= PoissonToGaussianThreshold) { - return RandomPoisson(expectedPairNumber); - } - else { - const auto numpairs = RandomNormal(expectedPairNumber,sqrt(expectedPairNumber)); + return amrex::RandomPoisson(expectedPairNumber); + } else { + const auto numpairs = + amrex::RandomNormal(expectedPairNumber,sqrt(expectedPairNumber)); return numpairs > 0._rt ? numpairs : 0._rt; } - } #endif // WARPX_schwinger_process_wrapper_h_ diff --git a/Source/Particles/ElementaryProcess/QEDPairGeneration.H b/Source/Particles/ElementaryProcess/QEDPairGeneration.H index 45e71a583..e90b2e5c3 100644 --- a/Source/Particles/ElementaryProcess/QEDPairGeneration.H +++ b/Source/Particles/ElementaryProcess/QEDPairGeneration.H @@ -106,14 +106,6 @@ public: { using namespace amrex; - constexpr ParticleReal me = PhysConst::m_e; - constexpr ParticleReal one_over_me = 1._prt/me; - - const ParticleReal w = src.m_rdata[PIdx::w][i_src]; - const ParticleReal ux = src.m_rdata[PIdx::ux][i_src]; - const ParticleReal uy = src.m_rdata[PIdx::uy][i_src]; - const ParticleReal uz = src.m_rdata[PIdx::uz][i_src]; - // gather E and B amrex::ParticleReal xp, yp, zp; m_get_position(i_src, xp, yp, zp); @@ -130,43 +122,26 @@ public: m_dx_arr, m_xyzmin_arr, m_lo, m_n_rz_azimuthal_modes, m_nox, m_galerkin_interpolation); - const auto px = ux*me; - const auto py = uy*me; - const auto pz = uz*me; - - auto e_w = 0.0_rt; - auto p_w = 0.0_rt; - auto e_px = 0.0_rt; - auto e_py = 0.0_rt; - auto e_pz = 0.0_rt; - auto p_px = 0.0_rt; - auto p_py = 0.0_rt; - auto p_pz = 0.0_rt; - //Despite the names of the variables, positrons and electrons //can be exchanged, since the physical process is completely //symmetric with respect to this exchange. - m_generate_functor.operator()<1>( - px, py, pz, + const auto& ux = src.m_rdata[PIdx::ux][i_src]; + const auto& uy = src.m_rdata[PIdx::uy][i_src]; + const auto& uz = src.m_rdata[PIdx::uz][i_src]; + auto& e_ux = dst1.m_rdata[PIdx::ux][i_dst1]; + auto& e_uy = dst1.m_rdata[PIdx::uy][i_dst1]; + auto& e_uz = dst1.m_rdata[PIdx::uz][i_dst1]; + auto& p_ux = dst2.m_rdata[PIdx::ux][i_dst2]; + auto& p_uy = dst2.m_rdata[PIdx::uy][i_dst2]; + auto& p_uz = dst2.m_rdata[PIdx::uz][i_dst2]; + m_generate_functor( + ux, uy, uz, ex, ey, ez, bx, by, bz, - w, - &e_px, &e_py, &e_pz, - &p_px, &p_py, &p_pz, - &e_w, &p_w); - - dst1.m_rdata[PIdx::w][i_dst1] = e_w; - dst1.m_rdata[PIdx::ux][i_dst1] = e_px*one_over_me; - dst1.m_rdata[PIdx::uy][i_dst1] = e_py*one_over_me; - dst1.m_rdata[PIdx::uz][i_dst1] = e_pz*one_over_me; - - dst2.m_rdata[PIdx::w][i_dst2] = p_w; - dst2.m_rdata[PIdx::ux][i_dst2] = p_px*one_over_me; - dst2.m_rdata[PIdx::uy][i_dst2] = p_py*one_over_me; - dst2.m_rdata[PIdx::uz][i_dst2] = p_pz*one_over_me; + e_ux, e_uy, e_uz, + p_ux, p_uy, p_uz); src.m_aos[i_src].id() = -1; //destroy photon after pair generation - } private: diff --git a/Source/Particles/ElementaryProcess/QEDPhotonEmission.H b/Source/Particles/ElementaryProcess/QEDPhotonEmission.H index 73cd87b0b..b11f9f4f4 100644 --- a/Source/Particles/ElementaryProcess/QEDPhotonEmission.H +++ b/Source/Particles/ElementaryProcess/QEDPhotonEmission.H @@ -15,6 +15,8 @@ #include "Particles/Pusher/GetAndSetPosition.H" #include "QEDInternals/QuantumSyncEngineWrapper.H" +#include <limits> + /** @file * * This file contains the implementation of the elementary process @@ -86,7 +88,7 @@ public: PhotonEmissionTransformFunc ( QuantumSynchrotronGetOpticalDepth opt_depth_functor, int const opt_depth_runtime_comp, - QuantumSynchrotronGeneratePhotonAndUpdateMomentum const emission_functor, + QuantumSynchrotronPhotonEmission const emission_functor, const WarpXParIter& a_pti, int lev, int ngE, amrex::FArrayBox const& exfab, amrex::FArrayBox const& eyfab, @@ -112,14 +114,6 @@ public: { using namespace amrex; - constexpr ParticleReal me = PhysConst::m_e; - constexpr ParticleReal one_over_me = 1._prt/me; - - const ParticleReal w = src.m_rdata[PIdx::w][i_src]; - const ParticleReal ux = src.m_rdata[PIdx::ux][i_src]; - const ParticleReal uy = src.m_rdata[PIdx::uy][i_src]; - const ParticleReal uz = src.m_rdata[PIdx::uz][i_src]; - // gather E and B amrex::ParticleReal xp, yp, zp; m_get_position(i_src, xp, yp, zp); @@ -136,34 +130,17 @@ public: m_dx_arr, m_xyzmin_arr, m_lo, m_n_rz_azimuthal_modes, m_nox, m_galerkin_interpolation); - // Particle momentum is stored as gamma * velocity. - // Convert to m * gamma * velocity before applying the emission functor. - auto px = ux*me; - auto py = uy*me; - auto pz = uz*me; - - auto g_w = 0.0_rt; - auto g_px = 0.0_rt; - auto g_py = 0.0_rt; - auto g_pz = 0.0_rt; - - m_emission_functor.operator()<1>( - &px, &py, &pz, + auto& ux = src.m_rdata[PIdx::ux][i_src]; + auto& uy = src.m_rdata[PIdx::uy][i_src]; + auto& uz = src.m_rdata[PIdx::uz][i_src]; + auto& g_ux = dst.m_rdata[PIdx::ux][i_dst]; + auto& g_uy = dst.m_rdata[PIdx::uy][i_dst]; + auto& g_uz = dst.m_rdata[PIdx::uz][i_dst]; + m_emission_functor( + ux, uy, uz, ex, ey, ez, bx, by, bz, - w, - &g_px, &g_py, &g_pz, - &g_w); - - // Then convert back to WarpX convention. - src.m_rdata[PIdx::ux][i_src] = px*one_over_me; - src.m_rdata[PIdx::uy][i_src] = py*one_over_me; - src.m_rdata[PIdx::uz][i_src] = pz*one_over_me; - - dst.m_rdata[PIdx::w][i_dst] = g_w; - dst.m_rdata[PIdx::ux][i_dst] = g_px*one_over_me; - dst.m_rdata[PIdx::uy][i_dst] = g_py*one_over_me; - dst.m_rdata[PIdx::uz][i_dst] = g_pz*one_over_me; + g_ux, g_uy, g_uz); //Initialize the optical depth component of the source species. src.m_runtime_rdata[m_opt_depth_runtime_comp][i_src] = @@ -173,10 +150,12 @@ public: private: const QuantumSynchrotronGetOpticalDepth m_opt_depth_functor; /*!< A copy of the functor to initialize the optical depth of the source species. */ - const QuantumSynchrotronGeneratePhotonAndUpdateMomentum - m_emission_functor; /*!< A copy of the functor to generate photons. It contains only pointers to the lookup tables.*/ + const int m_opt_depth_runtime_comp = 0; /*!< Index of the optical depth component of source species*/ + const QuantumSynchrotronPhotonEmission + m_emission_functor; /*!< A copy of the functor to generate photons. It contains only pointers to the lookup tables.*/ + GetParticlePosition m_get_position; GetExternalEField m_get_externalE; GetExternalBField m_get_externalB; @@ -209,6 +188,8 @@ private: /** * \brief Free function to call to remove immediately * low energy photons by setting their ID to -1. +* Photons with extremely small energy are removed regardless of +* the value of the energy_threshold * * @tparam PTile particle tile type * @param[in,out] ptile a particle tile @@ -230,7 +211,9 @@ void cleanLowEnergyPhotons( const auto p_uz = soa.GetRealData(PIdx::uz).data() + old_size; //The square of the energy threshold - const auto energy_threshold2 = energy_threshold*energy_threshold; + const auto energy_threshold2 = std::max( + energy_threshold*energy_threshold, + std::numeric_limits<amrex::ParticleReal>::min()); amrex::ParallelFor(num_added, [=] AMREX_GPU_DEVICE (int ip) noexcept { diff --git a/Source/Particles/ElementaryProcess/QEDPhotonEmission.cpp b/Source/Particles/ElementaryProcess/QEDPhotonEmission.cpp index eb7ef074b..97c64f62a 100644 --- a/Source/Particles/ElementaryProcess/QEDPhotonEmission.cpp +++ b/Source/Particles/ElementaryProcess/QEDPhotonEmission.cpp @@ -12,7 +12,7 @@ PhotonEmissionTransformFunc:: PhotonEmissionTransformFunc (QuantumSynchrotronGetOpticalDepth opt_depth_functor, int const opt_depth_runtime_comp, - QuantumSynchrotronGeneratePhotonAndUpdateMomentum const emission_functor, + QuantumSynchrotronPhotonEmission const emission_functor, const WarpXParIter& a_pti, int lev, int ngE, amrex::FArrayBox const& exfab, amrex::FArrayBox const& eyfab, diff --git a/Source/Particles/ElementaryProcess/QEDSchwingerProcess.H b/Source/Particles/ElementaryProcess/QEDSchwingerProcess.H index 7f39e8ed6..76d1ee6db 100644 --- a/Source/Particles/ElementaryProcess/QEDSchwingerProcess.H +++ b/Source/Particles/ElementaryProcess/QEDSchwingerProcess.H @@ -17,7 +17,8 @@ struct SchwingerFilterFunc { const int m_threshold_poisson_gaussian; - const amrex::Real m_dVdt; + const amrex::Real m_dV; + const amrex::Real m_dt; /** Get the number of created pairs in a given cell at a given timestep. * @@ -40,7 +41,7 @@ struct SchwingerFilterFunc const auto& arrBy = src_FABs[4]; const auto& arrBz = src_FABs[5]; - return getSchwingerProductionNumber( m_dVdt, + return getSchwingerProductionNumber( m_dV, m_dt, arrEx(i,j,k),arrEy(i,j,k),arrEz(i,j,k), arrBx(i,j,k),arrBy(i,j,k),arrBz(i,j,k), m_threshold_poisson_gaussian); diff --git a/Source/Particles/Gather/ScaleFields.H b/Source/Particles/Gather/ScaleFields.H index ee9533554..cf96ec2c1 100644 --- a/Source/Particles/Gather/ScaleFields.H +++ b/Source/Particles/Gather/ScaleFields.H @@ -41,7 +41,7 @@ struct ScaleFields { using namespace amrex::literals; - if (not m_do_scale) return; + if (m_do_scale != 0.0_rt) return; // Scale the fields of particles about to cross the injection plane. // This only approximates what should be happening. The particles diff --git a/Source/Particles/MultiParticleContainer.H b/Source/Particles/MultiParticleContainer.H index 50e736a97..7eba64f30 100644 --- a/Source/Particles/MultiParticleContainer.H +++ b/Source/Particles/MultiParticleContainer.H @@ -316,9 +316,13 @@ protected: int m_nspecies_breit_wheeler = 0; //________ + static constexpr auto m_default_quantum_sync_photon_creation_energy_threshold = + static_cast<amrex::ParticleReal>( + 2.0 * PhysConst::m_e * PhysConst::c * PhysConst::c ); /*!< Default value of the energy threshold for photon creation in Quantum Synchrotron process.*/ + + amrex::ParticleReal m_quantum_sync_photon_creation_energy_threshold = - static_cast<amrex::ParticleReal>( - 2.0 * PhysConst::m_e * PhysConst::c * PhysConst::c ); /*!< Energy threshold for photon creation in Quantum Synchrotron process.*/ + m_default_quantum_sync_photon_creation_energy_threshold; /*!< Energy threshold for photon creation in Quantum Synchrotron process.*/ /** * Returns the number of species having Quantum Synchrotron process enabled diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp index a866ae3a0..cb47755f7 100644 --- a/Source/Particles/MultiParticleContainer.cpp +++ b/Source/Particles/MultiParticleContainer.cpp @@ -24,7 +24,7 @@ #include <limits> #include <algorithm> #include <string> - +#include <vector> using namespace amrex; @@ -756,7 +756,9 @@ void MultiParticleContainer::InitQuantumSync () //If specified, use a user-defined energy threshold for photon creaction ParticleReal temp; + constexpr auto mec2 = PhysConst::c * PhysConst::c * PhysConst::m_e; if(pp.query("photon_creation_energy_threshold", temp)){ + temp *= mec2; m_quantum_sync_photon_creation_energy_threshold = temp; } else{ @@ -764,6 +766,13 @@ void MultiParticleContainer::InitQuantumSync () " for photon energy creaction threshold \n" ; } + // qs_minimum_chi_part is the minimum chi parameter to be + // considered for Synchrotron emission. If a lepton has chi < chi_min, + // the optical depth is not evolved and photon generation is ignored + amrex::Real qs_minimum_chi_part; + pp.get("chi_min", qs_minimum_chi_part); + + pp.query("lookup_table_mode", lookup_table_mode); if(lookup_table_mode.empty()){ amrex::Abort("Quantum Synchrotron table mode should be provided"); @@ -787,11 +796,12 @@ void MultiParticleContainer::InitQuantumSync () Vector<char> table_data; ParallelDescriptor::ReadAndBcastFile(load_table_name, table_data); ParallelDescriptor::Barrier(); - m_shr_p_qs_engine->init_lookup_tables_from_raw_data(table_data); + m_shr_p_qs_engine->init_lookup_tables_from_raw_data(table_data, + qs_minimum_chi_part); } - else if(lookup_table_mode == "dummy_builtin"){ - amrex::Print() << "Built-in Quantum Synchrotron dummy table will be used. \n" ; - m_shr_p_qs_engine->init_dummy_tables(); + else if(lookup_table_mode == "builtin"){ + amrex::Print() << "Built-in Quantum Synchrotron table will be used. \n" ; + m_shr_p_qs_engine->init_builtin_tables(qs_minimum_chi_part); } else{ amrex::Abort("Unknown Quantum Synchrotron table mode"); @@ -806,6 +816,14 @@ void MultiParticleContainer::InitBreitWheeler () { std::string lookup_table_mode; ParmParse pp("qed_bw"); + + // bw_minimum_chi_phot is the minimum chi parameter to be + // considered for pair production. If a photon has chi < chi_min, + // the optical depth is not evolved and photon generation is ignored + amrex::Real bw_minimum_chi_part; + if(!pp.query("chi_min", bw_minimum_chi_part)) + amrex::Abort("qed_bw.chi_min should be provided!"); + pp.query("lookup_table_mode", lookup_table_mode); if(lookup_table_mode.empty()){ amrex::Abort("Breit Wheeler table mode should be provided"); @@ -829,11 +847,12 @@ void MultiParticleContainer::InitBreitWheeler () Vector<char> table_data; ParallelDescriptor::ReadAndBcastFile(load_table_name, table_data); ParallelDescriptor::Barrier(); - m_shr_p_bw_engine->init_lookup_tables_from_raw_data(table_data); + m_shr_p_bw_engine->init_lookup_tables_from_raw_data( + table_data, bw_minimum_chi_part); } - else if(lookup_table_mode == "dummy_builtin"){ - amrex::Print() << "Built-in Breit Wheeler dummy table will be used. \n" ; - m_shr_p_bw_engine->init_dummy_tables(); + else if(lookup_table_mode == "builtin"){ + amrex::Print() << "Built-in Breit Wheeler table will be used. \n" ; + m_shr_p_bw_engine->init_builtin_tables(bw_minimum_chi_part); } else{ amrex::Abort("Unknown Breit Wheeler table mode"); @@ -853,15 +872,14 @@ MultiParticleContainer::QuantumSyncGenerateTable () if(table_name.empty()) amrex::Abort("qed_qs.save_table_in should be provided!"); - if(ParallelDescriptor::IOProcessor()){ - PicsarQuantumSynchrotronCtrl ctrl; - int t_int; + // qs_minimum_chi_part is the minimum chi parameter to be + // considered for Synchrotron emission. If a lepton has chi < chi_min, + // the optical depth is not evolved and photon generation is ignored + amrex::Real qs_minimum_chi_part; + pp.get("chi_min", qs_minimum_chi_part); - // Engine paramenter: chi_part_min is the minium chi parameter to be - // considered by the engine. If a lepton has chi < chi_part_min, - // the optical depth is not evolved and photon generation is ignored - if(!pp.query("chi_min", ctrl.chi_part_min)) - amrex::Abort("qed_qs.chi_min should be provided!"); + if(ParallelDescriptor::IOProcessor()){ + PicsarQuantumSyncCtrl ctrl; //==Table parameters== @@ -869,20 +887,16 @@ MultiParticleContainer::QuantumSyncGenerateTable () //These parameters are used to pre-compute a function //which appears in the evolution of the optical depth - //Minimun chi for the table. If a lepton has chi < chi_part_tdndt_min, - //chi is considered as it were equal to chi_part_tdndt_min - if(!pp.query("tab_dndt_chi_min", ctrl.chi_part_tdndt_min)) - amrex::Abort("qed_qs.tab_dndt_chi_min should be provided!"); + //Minimun chi for the table. If a lepton has chi < tab_dndt_chi_min, + //chi is considered as if it were equal to tab_dndt_chi_min + pp.get("tab_dndt_chi_min", ctrl.dndt_params.chi_part_min); - //Maximum chi for the table. If a lepton has chi > chi_part_tdndt_max, - //chi is considered as it were equal to chi_part_tdndt_max - if(!pp.query("tab_dndt_chi_max", ctrl.chi_part_tdndt_max)) - amrex::Abort("qed_qs.tab_dndt_chi_max should be provided!"); + //Maximum chi for the table. If a lepton has chi > tab_dndt_chi_max, + //chi is considered as if it were equal to tab_dndt_chi_max + pp.get("tab_dndt_chi_max", ctrl.dndt_params.chi_part_max); //How many points should be used for chi in the table - if(!pp.query("tab_dndt_how_many", t_int)) - amrex::Abort("qed_qs.tab_dndt_how_many should be provided!"); - ctrl.chi_part_tdndt_how_many = t_int; + pp.get("tab_dndt_how_many", ctrl.dndt_params.chi_part_how_many); //------ //--- sub-table 2 (2D) @@ -890,32 +904,31 @@ MultiParticleContainer::QuantumSyncGenerateTable () //which is used to extract the properties of the generated //photons. - //Minimun chi for the table. If a lepton has chi < chi_part_tem_min, - //chi is considered as it were equal to chi_part_tem_min - if(!pp.query("tab_em_chi_min", ctrl.chi_part_tem_min)) - amrex::Abort("qed_qs.tab_em_chi_min should be provided!"); + //Minimun chi for the table. If a lepton has chi < tab_em_chi_min, + //chi is considered as if it were equal to tab_em_chi_min + pp.get("tab_em_chi_min", ctrl.phot_em_params.chi_part_min); - //Maximum chi for the table. If a lepton has chi > chi_part_tem_max, - //chi is considered as it were equal to chi_part_tem_max - if(!pp.query("tab_em_chi_max", ctrl.chi_part_tem_max)) - amrex::Abort("qed_qs.tab_em_chi_max should be provided!"); + //Maximum chi for the table. If a lepton has chi > tab_em_chi_max, + //chi is considered as if it were equal to tab_em_chi_max + pp.get("tab_em_chi_max", ctrl.phot_em_params.chi_part_max); //How many points should be used for chi in the table - if(!pp.query("tab_em_chi_how_many", t_int)) - amrex::Abort("qed_qs.tab_em_chi_how_many should be provided!"); - ctrl.chi_part_tem_how_many = t_int; - - //The other axis of the table is a cumulative probability distribution - //(corresponding to different energies of the generated particles) - //This parameter is the number of different points to consider - if(!pp.query("tab_em_prob_how_many", t_int)) - amrex::Abort("qed_qs.tab_em_prob_how_many should be provided!"); - ctrl.prob_tem_how_many = t_int; + pp.get("tab_em_chi_how_many", ctrl.phot_em_params.chi_part_how_many); + + //The other axis of the table is the ratio between the quantum + //parameter of the emitted photon and the quantum parameter of the + //lepton. This parameter is the minimum ratio to consider for the table. + pp.get("tab_em_frac_min", ctrl.phot_em_params.frac_min); + + //This parameter is the number of different points to consider for the second + //axis + pp.get("tab_em_frac_how_many", ctrl.phot_em_params.frac_how_many); //==================== - m_shr_p_qs_engine->compute_lookup_tables(ctrl); + m_shr_p_qs_engine->compute_lookup_tables(ctrl, qs_minimum_chi_part); + const auto data = m_shr_p_qs_engine->export_lookup_tables_data(); WarpXUtilIO::WriteBinaryDataOnFile(table_name, - m_shr_p_qs_engine->export_lookup_tables_data()); + Vector<char>{data.begin(), data.end()}); } ParallelDescriptor::Barrier(); @@ -926,7 +939,8 @@ MultiParticleContainer::QuantumSyncGenerateTable () //No need to initialize from raw data for the processor that //has just generated the table if(!ParallelDescriptor::IOProcessor()){ - m_shr_p_qs_engine->init_lookup_tables_from_raw_data(table_data); + m_shr_p_qs_engine->init_lookup_tables_from_raw_data( + table_data, qs_minimum_chi_part); } } @@ -939,15 +953,14 @@ MultiParticleContainer::BreitWheelerGenerateTable () if(table_name.empty()) amrex::Abort("qed_bw.save_table_in should be provided!"); + // bw_minimum_chi_phot is the minimum chi parameter to be + // considered for pair production. If a photon has chi < chi_min, + // the optical depth is not evolved and photon generation is ignored + amrex::Real bw_minimum_chi_part; + pp.get("chi_min", bw_minimum_chi_part); + if(ParallelDescriptor::IOProcessor()){ PicsarBreitWheelerCtrl ctrl; - int t_int; - - // Engine paramenter: chi_phot_min is the minium chi parameter to be - // considered by the engine. If a photon has chi < chi_phot_min, - // the optical depth is not evolved and pair generation is ignored - if(!pp.query("chi_min", ctrl.chi_phot_min)) - amrex::Abort("qed_bw.chi_min should be provided!"); //==Table parameters== @@ -955,20 +968,16 @@ MultiParticleContainer::BreitWheelerGenerateTable () //These parameters are used to pre-compute a function //which appears in the evolution of the optical depth - //Minimun chi for the table. If a photon has chi < chi_phot_tdndt_min, + //Minimun chi for the table. If a photon has chi < tab_dndt_chi_min, //an analytical approximation is used. - if(!pp.query("tab_dndt_chi_min", ctrl.chi_phot_tdndt_min)) - amrex::Abort("qed_bw.tab_dndt_chi_min should be provided!"); + pp.get("tab_dndt_chi_min", ctrl.dndt_params.chi_phot_min); - //Maximum chi for the table. If a photon has chi > chi_phot_tdndt_min, + //Maximum chi for the table. If a photon has chi > tab_dndt_chi_max, //an analytical approximation is used. - if(!pp.query("tab_dndt_chi_max", ctrl.chi_phot_tdndt_max)) - amrex::Abort("qed_bw.tab_dndt_chi_max should be provided!"); + pp.get("tab_dndt_chi_max", ctrl.dndt_params.chi_phot_max); //How many points should be used for chi in the table - if(!pp.query("tab_dndt_how_many", t_int)) - amrex::Abort("qed_bw.tab_dndt_how_many should be provided!"); - ctrl.chi_phot_tdndt_how_many = t_int; + pp.get("tab_dndt_how_many", ctrl.dndt_params.chi_phot_how_many); //------ //--- sub-table 2 (2D) @@ -976,32 +985,27 @@ MultiParticleContainer::BreitWheelerGenerateTable () //which is used to extract the properties of the generated //particles. - //Minimun chi for the table. If a photon has chi < chi_phot_tpair_min + //Minimun chi for the table. If a photon has chi < tab_pair_chi_min //chi is considered as it were equal to chi_phot_tpair_min - if(!pp.query("tab_pair_chi_min", ctrl.chi_phot_tpair_min)) - amrex::Abort("qed_bw.tab_pair_chi_min should be provided!"); + pp.get("tab_pair_chi_min", ctrl.pair_prod_params.chi_phot_min); - //Maximum chi for the table. If a photon has chi > chi_phot_tpair_max + //Maximum chi for the table. If a photon has chi > tab_pair_chi_max //chi is considered as it were equal to chi_phot_tpair_max - if(!pp.query("tab_pair_chi_max", ctrl.chi_phot_tpair_max)) - amrex::Abort("qed_bw.tab_pair_chi_max should be provided!"); + pp.get("tab_pair_chi_max", ctrl.pair_prod_params.chi_phot_max); //How many points should be used for chi in the table - if(!pp.query("tab_pair_chi_how_many", t_int)) - amrex::Abort("qed_bw.tab_pair_chi_how_many should be provided!"); - ctrl.chi_phot_tpair_how_many = t_int; + pp.get("tab_pair_chi_how_many", ctrl.pair_prod_params.chi_phot_how_many); //The other axis of the table is the fraction of the initial energy //'taken away' by the most energetic particle of the pair. //This parameter is the number of different fractions to consider - if(!pp.query("tab_pair_frac_how_many", t_int)) - amrex::Abort("qed_bw.tab_pair_frac_how_many should be provided!"); - ctrl.chi_frac_tpair_how_many = t_int; + pp.get("tab_pair_frac_how_many", ctrl.pair_prod_params.frac_how_many); //==================== - m_shr_p_bw_engine->compute_lookup_tables(ctrl); + m_shr_p_bw_engine->compute_lookup_tables(ctrl, bw_minimum_chi_part); + const auto data = m_shr_p_bw_engine->export_lookup_tables_data(); WarpXUtilIO::WriteBinaryDataOnFile(table_name, - m_shr_p_bw_engine->export_lookup_tables_data()); + Vector<char>{data.begin(), data.end()}); } ParallelDescriptor::Barrier(); @@ -1012,7 +1016,8 @@ MultiParticleContainer::BreitWheelerGenerateTable () //No need to initialize from raw data for the processor that //has just generated the table if(!ParallelDescriptor::IOProcessor()){ - m_shr_p_bw_engine->init_lookup_tables_from_raw_data(table_data); + m_shr_p_bw_engine->init_lookup_tables_from_raw_data( + table_data, bw_minimum_chi_part); } } @@ -1039,21 +1044,20 @@ MultiParticleContainer::doQEDSchwinger () amrex::Abort("Schwinger process not implemented in rz geometry"); #endif -#ifdef AMREX_USE_FLOAT - amrex::Abort("Schwinger process not implemented in single precision"); -#endif - -// Get cell volume multiplied by temporal step. In 2D the transverse size is +// Get cell volume. In 2D the transverse size is // chosen by the user in the input file. amrex::Geometry const & geom = warpx.Geom(level_0); #if (AMREX_SPACEDIM == 2) - const auto dVdt = geom.CellSize(0) * geom.CellSize(1) - * m_qed_schwinger_y_size * warpx.getdt(level_0); + const auto dV = geom.CellSize(0) * geom.CellSize(1) + * m_qed_schwinger_y_size; #elif (AMREX_SPACEDIM == 3) - const auto dVdt = geom.CellSize(0) * geom.CellSize(1) - * geom.CellSize(2) * warpx.getdt(level_0); + const auto dV = geom.CellSize(0) * geom.CellSize(1) + * geom.CellSize(2); #endif + // Get the temporal step + const auto dt = warpx.getdt(level_0); + auto& pc_product_ele = allcontainers[m_qed_schwinger_ele_product]; auto& pc_product_pos = @@ -1100,7 +1104,8 @@ MultiParticleContainer::doQEDSchwinger () const auto np_pos_dst = dst_pos_tile.numParticles(); const auto Filter = SchwingerFilterFunc{ - m_qed_schwinger_threshold_poisson_gaussian,dVdt}; + m_qed_schwinger_threshold_poisson_gaussian, + dV, dt}; const SmartCreateFactory create_factory_ele(*pc_product_ele); const SmartCreateFactory create_factory_pos(*pc_product_pos); diff --git a/Source/Particles/ParticleCreation/SmartCreate.H b/Source/Particles/ParticleCreation/SmartCreate.H index b75553e58..638a38302 100644 --- a/Source/Particles/ParticleCreation/SmartCreate.H +++ b/Source/Particles/ParticleCreation/SmartCreate.H @@ -13,6 +13,7 @@ #include <AMReX_AmrCore.H> #include <AMReX_GpuContainers.H> #include <AMReX_ParallelDescriptor.H> +#include <AMReX.H> /** * \brief This is a functor for performing a "smart create" that works @@ -50,6 +51,7 @@ struct SmartCreate prt.m_aos[i_prt].pos(2) = z; #elif (AMREX_SPACEDIM == 2) prt.m_aos[i_prt].pos(1) = z; + amrex::ignore_unused(y); #endif prt.m_aos[i_prt].cpu() = cpu; diff --git a/Source/Particles/PhotonParticleContainer.cpp b/Source/Particles/PhotonParticleContainer.cpp index 8a18fbf70..760264317 100644 --- a/Source/Particles/PhotonParticleContainer.cpp +++ b/Source/Particles/PhotonParticleContainer.cpp @@ -102,8 +102,6 @@ PhotonParticleContainer::PushPX (WarpXParIter& pti, ParticleReal* const AMREX_RESTRICT uz = attribs[PIdx::uz].dataPtr(); #ifdef WARPX_QED - AMREX_ASSERT(has_breit_wheeler()); - BreitWheelerEvolveOpticalDepth evolve_opt; amrex::Real* AMREX_RESTRICT p_optical_depth_BW = nullptr; const bool local_has_breit_wheeler = has_breit_wheeler(); @@ -183,12 +181,8 @@ PhotonParticleContainer::PushPX (WarpXParIter& pti, #ifdef WARPX_QED if (local_has_breit_wheeler) { - const ParticleReal px = me * ux[i]; - const ParticleReal py = me * uy[i]; - const ParticleReal pz = me * uz[i]; - - bool has_event_happened = evolve_opt(px, py, pz, Exp, Eyp, Ezp, Bxp, Byp, Bzp, - dt, p_optical_depth_BW[i]); + evolve_opt(ux[i], uy[i], uz[i], Exp, Eyp, Ezp, Bxp, Byp, Bzp, + dt, p_optical_depth_BW[i]); } #endif @@ -212,8 +206,7 @@ PhotonParticleContainer::Evolve (int lev, Real t, Real dt, DtType /*a_dt_type*/) { // This does gather, push and depose. - // Push and depose have been re-written for photon, - // so they do not do anything. + // Push and depose have been re-written for photons PhysicalParticleContainer::Evolve (lev, Ex, Ey, Ez, Bx, By, Bz, diff --git a/Source/Particles/PhysicalParticleContainer.H b/Source/Particles/PhysicalParticleContainer.H index 3be0c3396..30105ddcb 100644 --- a/Source/Particles/PhysicalParticleContainer.H +++ b/Source/Particles/PhysicalParticleContainer.H @@ -360,7 +360,6 @@ protected: // A smart pointer to an instance of a Breit Wheeler engine [photons only!] std::shared_ptr<BreitWheelerEngine> m_shr_p_bw_engine; - #endif }; diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp index 36a2ea292..b71ff2920 100644 --- a/Source/Particles/PhysicalParticleContainer.cpp +++ b/Source/Particles/PhysicalParticleContainer.cpp @@ -717,8 +717,8 @@ PhysicalParticleContainer::AddPlasma (int lev, RealBox part_realbox) #ifdef WARPX_QED //Pointer to the optical depth component - amrex::Real* p_optical_depth_QSR; - amrex::Real* p_optical_depth_BW; + amrex::Real* p_optical_depth_QSR = nullptr; + amrex::Real* p_optical_depth_BW = nullptr; // If a QED effect is enabled, the corresponding optical depth // has to be initialized @@ -1853,7 +1853,7 @@ PhysicalParticleContainer::PushPX (WarpXParIter& pti, #ifdef WARPX_QED const auto do_sync = m_do_qed_quantum_sync; amrex::Real t_chi_max = 0.0; - if (do_sync) t_chi_max = m_shr_p_qs_engine->get_ref_ctrl().chi_part_min; + if (do_sync) t_chi_max = m_shr_p_qs_engine->get_minimum_chi_part(); QuantumSynchrotronEvolveOpticalDepth evolve_opt; amrex::ParticleReal* AMREX_RESTRICT p_optical_depth_QSR = nullptr; @@ -1889,19 +1889,6 @@ PhysicalParticleContainer::PushPX (WarpXParIter& pti, scaleFields(xp, yp, zp, Exp, Eyp, Ezp, Bxp, Byp, Bzp); -#ifdef WARPX_QED - if (local_has_quantum_sync) { - const ParticleReal px = m * ux[ip]; - const ParticleReal py = m * uy[ip]; - const ParticleReal pz = m * uz[ip]; - - bool has_event_happened = evolve_opt(px, py, pz, - Exp, Eyp, Ezp, - Bxp, Byp, Bzp, - dt, p_optical_depth_QSR[ip]); - } -#endif - doParticlePush(getPosition, setPosition, copyAttribs, ip, ux[ip+offset], uy[ip+offset], uz[ip+offset], Exp, Eyp, Ezp, Bxp, Byp, Bzp, @@ -1912,6 +1899,15 @@ PhysicalParticleContainer::PushPX (WarpXParIter& pti, t_chi_max, #endif dt); + +#ifdef WARPX_QED + if (local_has_quantum_sync) { + evolve_opt(ux[ip], uy[ip], uz[ip], + Exp, Eyp, Ezp,Bxp, Byp, Bzp, + dt, p_optical_depth_QSR[ip]); + } +#endif + }); } diff --git a/Source/Particles/Pusher/PushSelector.H b/Source/Particles/Pusher/PushSelector.H index 149342b74..bd469b51b 100644 --- a/Source/Particles/Pusher/PushSelector.H +++ b/Source/Particles/Pusher/PushSelector.H @@ -69,7 +69,7 @@ void doParticlePush(const GetParticlePosition& GetPosition, if (do_crr) { #ifdef WARPX_QED if (do_sync) { - auto chi = QedUtils::chi_lepton(m*ux, m*uy, m*uz, + auto chi = QedUtils::chi_ele_pos(m*ux, m*uy, m*uz, Ex, Ey, Ez, Bx, By, Bz); if (chi < t_chi_max) { diff --git a/run_test.sh b/run_test.sh index e344e607f..428f21517 100755 --- a/run_test.sh +++ b/run_test.sh @@ -51,7 +51,7 @@ echo "cd $PWD" git clone --branch development https://github.com/AMReX-Codes/amrex.git # Use QED brach for QED tests if [ "${WARPX_CI_QED}" = "TRUE" ]; then - git clone --branch QED https://github.com/ECP-WarpX/picsar.git + git clone --branch development https://github.com/ECP-WarpX/picsar.git else git clone --branch development https://github.com/ECP-WarpX/picsar.git fi |