aboutsummaryrefslogtreecommitdiff
path: root/Examples/Tests/initial_distribution
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/Tests/initial_distribution')
-rwxr-xr-xExamples/Tests/initial_distribution/analysis_distribution.py77
-rw-r--r--Examples/Tests/initial_distribution/inputs88
2 files changed, 163 insertions, 2 deletions
diff --git a/Examples/Tests/initial_distribution/analysis_distribution.py b/Examples/Tests/initial_distribution/analysis_distribution.py
index 3da4cf423..d43ced2bb 100755
--- a/Examples/Tests/initial_distribution/analysis_distribution.py
+++ b/Examples/Tests/initial_distribution/analysis_distribution.py
@@ -12,6 +12,8 @@
# 3 denotes maxwell-juttner distribution.
# 4 denotes gaussian position distribution.
# 5 denotes maxwell-juttner distribution w/ spatially varying temperature
+# 6 denotes maxwell-boltzmann distribution w/ constant velocity
+# 7 denotes maxwell-boltzmann distribution w/ spatially-varying velocity
# The distribution is obtained through reduced diagnostic ParticleHistogram.
import numpy as np
@@ -180,5 +182,80 @@ print('Maxwell-Juttner parser temperature difference:', f5_error)
assert(f5_error < tolerance)
+#==============================================
+# maxwell-boltzmann with constant bulk velocity
+#==============================================
+
+# load data
+bin_value_g, bin_data_g = read_reduced_diags_histogram("h6.txt")[2:]
+bin_value_uy, bin_data_uy = read_reduced_diags_histogram("h6uy.txt")[2:]
+
+# Expected values for beta and u = beta*gamma
+beta_const = 0.2
+g_const = 1. / np.sqrt(1. - beta_const * beta_const)
+uy_const = beta_const * g_const
+g_bin_size = 0.004
+g_bin_min = 1.
+uy_bin_size = 0.04
+uy_bin_min = -1.
+V = 8.0 # volume in m^3
+n = 1.0e21 # number density in 1/m^3
+
+f_g = np.zeros_like(bin_value_g)
+i_g = int(np.floor((g_const - g_bin_min) / g_bin_size))
+f_g[i_g] = n * V
+f_peak = np.amax(f_g)
+
+f_uy = np.zeros_like(bin_value_uy)
+i_uy = int(np.floor((-uy_const - uy_bin_min) / uy_bin_size))
+f_uy[i_uy] = n * V
+
+f6_error = np.sum(np.abs(f_g - bin_data_g) + np.abs(f_uy - bin_data_uy)) \
+ / bin_value_g.size / f_peak
+
+print('Maxwell-Boltzmann constant velocity difference:', f6_error)
+
+assert(f6_error < tolerance)
+
+#============================================
+# maxwell-boltzmann with parser bulk velocity
+#============================================
+
+# load data
+bin_value_g, bin_data_g = read_reduced_diags_histogram("h7.txt")[2:]
+bin_value_uy, bin_data_uy_neg = read_reduced_diags_histogram("h7uy_neg.txt")[2:]
+bin_data_uy_pos = read_reduced_diags_histogram("h7uy_pos.txt")[3]
+
+# Expected values for beta and u = beta*gamma
+beta_const = 0.2
+g_const = 1. / np.sqrt(1. - beta_const * beta_const)
+uy_const = beta_const * g_const
+g_bin_size = 0.004
+g_bin_min = 1.
+uy_bin_size = 0.04
+uy_bin_min = -1.
+V = 8.0 # volume in m^3
+n = 1.0e21 # number density in 1/m^3
+
+f_g = np.zeros_like(bin_value_g)
+i_g = int(np.floor((g_const - g_bin_min) / g_bin_size))
+f_g[i_g] = n * V
+f_peak = np.amax(f_g)
+
+f_uy_neg = np.zeros_like(bin_value_uy)
+i_uy_neg = int(np.floor((uy_const - uy_bin_min) / uy_bin_size))
+f_uy_neg[i_uy_neg] = n * V / 2.
+
+f_uy_pos = np.zeros_like(bin_value_uy)
+i_uy_pos = int(np.floor((-uy_const - uy_bin_min) / uy_bin_size))
+f_uy_pos[i_uy_pos] = n * V / 2.
+
+f7_error = np.sum(np.abs(f_g - bin_data_g) + np.abs(f_uy_pos - bin_data_uy_pos) \
+ + np.abs(f_uy_neg - bin_data_uy_neg)) / bin_value_g.size / f_peak
+
+print('Maxwell-Boltzmann parser velocity difference:', f7_error)
+
+assert(f7_error < tolerance)
+
test_name = filename[:-9] # Could also be os.path.split(os.getcwd())[1]
checksumAPI.evaluate_checksum(test_name, filename)
diff --git a/Examples/Tests/initial_distribution/inputs b/Examples/Tests/initial_distribution/inputs
index 0b47249df..d301c5751 100644
--- a/Examples/Tests/initial_distribution/inputs
+++ b/Examples/Tests/initial_distribution/inputs
@@ -29,7 +29,7 @@ algo.particle_shape = 1
#################################
############ PLASMA #############
#################################
-particles.species_names = gaussian maxwell_boltzmann maxwell_juttner beam maxwell_juttner_parser
+particles.species_names = gaussian maxwell_boltzmann maxwell_juttner beam maxwell_juttner_parser velocity_constant velocity_parser
particles.rigid_injected_species = beam
gaussian.charge = -q_e
@@ -93,6 +93,32 @@ maxwell_juttner_parser.momentum_distribution_type = "maxwell_juttner"
maxwell_juttner_parser.theta_distribution_type = "parser"
maxwell_juttner_parser.theta_function(x,y,z) = "1.0 + heaviside(x,0)"
+velocity_constant.charge = -q_e
+velocity_constant.mass = m_e
+velocity_constant.injection_style = "NRandomPerCell"
+velocity_constant.num_particles_per_cell = 1000
+velocity_constant.profile = constant
+velocity_constant.density = 1.0e21
+velocity_constant.momentum_distribution_type = "maxwell_boltzmann"
+velocity_constant.theta_distribution_type = "constant"
+velocity_constant.theta = 1e-9
+velocity_constant.beta_distribution_type = "constant"
+velocity_constant.beta = 0.2
+velocity_constant.bulk_vel_dir = -y
+
+velocity_parser.charge = -q_e
+velocity_parser.mass = m_e
+velocity_parser.injection_style = "NRandomPerCell"
+velocity_parser.num_particles_per_cell = 1000
+velocity_parser.profile = constant
+velocity_parser.density = 1.0e21
+velocity_parser.momentum_distribution_type = "maxwell_boltzmann"
+velocity_parser.theta_distribution_type = "constant"
+velocity_parser.theta = 1e-9
+velocity_parser.beta_distribution_type = "parser"
+velocity_parser.beta_function(x,y,z) = "-0.2 + 0.4 * heaviside(z,0)"
+velocity_parser.bulk_vel_dir = -y
+
#################################
########## DIAGNOSTIC ###########
#################################
@@ -101,7 +127,9 @@ maxwell_juttner_parser.theta_function(x,y,z) = "1.0 + heaviside(x,0)"
# 3 for maxwell-juttner with constant temperature
# 4 for beam
# 5 for maxwell-juttner with parser function temperature
-warpx.reduced_diags_names = h1x h1y h1z h2x h2y h2z h3 h3_filtered h4x h4y h4z bmmntr h5_neg h5_pos
+# 6 for maxwell-boltzmann with constant velocity
+# 7 for maxwell-boltzmann with parser velocity
+warpx.reduced_diags_names = h1x h1y h1z h2x h2y h2z h3 h3_filtered h4x h4y h4z bmmntr h5_neg h5_pos h6 h6uy h7 h7uy_pos h7uy_neg
h1x.type = ParticleHistogram
h1x.intervals = 1
@@ -223,6 +251,62 @@ h5_pos.bin_max = 12.0
h5_pos.histogram_function(t,x,y,z,ux,uy,uz) = "sqrt(1.0 + ux*ux + uy*uy + uz*uz)"
h5_pos.filter_function(t,x,y,z,ux,uy,uz) = "x > 0.0"
+h5_pos.type = ParticleHistogram
+h5_pos.intervals = 1
+h5_pos.path = "./"
+h5_pos.species = maxwell_juttner_parser
+h5_pos.bin_number = 50
+h5_pos.bin_min = 1.0
+h5_pos.bin_max = 12.0
+h5_pos.histogram_function(t,x,y,z,ux,uy,uz) = "sqrt(1.0 + ux*ux + uy*uy + uz*uz)"
+h5_pos.filter_function(t,x,y,z,ux,uy,uz) = "x > 0.0"
+
+h6.type = ParticleHistogram
+h6.intervals = 1
+h6.path = "./"
+h6.species = velocity_constant
+h6.bin_number = 50
+h6.bin_min = 1.0
+h6.bin_max = 1.2
+h6.histogram_function(t,x,y,z,ux,uy,uz) = "sqrt(1.0 + ux*ux + uy*uy + uz*uz)"
+
+h6uy.type = ParticleHistogram
+h6uy.intervals = 1
+h6uy.path = "./"
+h6uy.species = velocity_constant
+h6uy.bin_number = 50
+h6uy.bin_min = -1.0
+h6uy.bin_max = 1.0
+h6uy.histogram_function(t,x,y,z,ux,uy,uz) = "uy"
+
+h7.type = ParticleHistogram
+h7.intervals = 1
+h7.path = "./"
+h7.species = velocity_parser
+h7.bin_number = 50
+h7.bin_min = 1.0
+h7.bin_max = 1.2
+h7.histogram_function(t,x,y,z,ux,uy,uz) = "sqrt(1.0 + ux*ux + uy*uy + uz*uz)"
+
+h7uy_pos.type = ParticleHistogram
+h7uy_pos.intervals = 1
+h7uy_pos.path = "./"
+h7uy_pos.species = velocity_parser
+h7uy_pos.bin_number = 50
+h7uy_pos.bin_min = -1.0
+h7uy_pos.bin_max = 1.0
+h7uy_pos.histogram_function(t,x,y,z,ux,uy,uz) = "uy"
+h7uy_pos.filter_function(t,x,y,z,ux,uy,uz) = "z > 0.0"
+
+h7uy_neg.type = ParticleHistogram
+h7uy_neg.intervals = 1
+h7uy_neg.path = "./"
+h7uy_neg.species = velocity_parser
+h7uy_neg.bin_number = 50
+h7uy_neg.bin_min = -1.0
+h7uy_neg.bin_max = 1.0
+h7uy_neg.histogram_function(t,x,y,z,ux,uy,uz) = "uy"
+h7uy_neg.filter_function(t,x,y,z,ux,uy,uz) = "z < 0.0"
# our little beam monitor
bmmntr.type = BeamRelevant