aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Docs/source/usage/parameters.rst7
-rw-r--r--Examples/Tests/Langmuir/inputs_2d_multi_rt10
-rw-r--r--Examples/Tests/Langmuir/inputs_2d_multi_rz_rt12
-rw-r--r--Examples/Tests/Langmuir/inputs_3d_multi_rt10
-rw-r--r--Regression/Checksum/benchmarks_json/Langmuir_multi.json30
-rw-r--r--Regression/Checksum/benchmarks_json/Langmuir_multi_2d_nodal.json24
-rw-r--r--Regression/Checksum/benchmarks_json/Langmuir_multi_nodal.json30
-rw-r--r--Regression/Checksum/benchmarks_json/Langmuir_multi_psatd.json30
-rw-r--r--Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_current_correction.json26
-rw-r--r--Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_current_correction_nodal.json30
-rw-r--r--Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_momentum_conserving.json28
-rw-r--r--Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_nodal.json26
-rw-r--r--Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_single_precision.json38
-rw-r--r--Source/Utils/WarpXUtil.cpp14
14 files changed, 168 insertions, 147 deletions
diff --git a/Docs/source/usage/parameters.rst b/Docs/source/usage/parameters.rst
index 7c33722f8..faee944e7 100644
--- a/Docs/source/usage/parameters.rst
+++ b/Docs/source/usage/parameters.rst
@@ -328,13 +328,16 @@ User-defined constants
Users can define their own constants in the input file.
These constants can be used for any parameter that consists in one real number.
-User-defined constants can contain only letters, numbers and the character ``_``.
+User-defined constant names can contain only letters, numbers and the character ``_``.
The name of each constant has to begin with a letter. The following names are used
by WarpX, and cannot be used as user-defined constants: ``x``, ``y``, ``z``, ``X``, ``Y``, ``t``.
-For example, parameters ``a0`` and ``z_plateau`` can be specified with:
+The values of the constants can include the predefined WarpX constants listed above as well as other user-defined constants.
+For example:
* ``my_constants.a0 = 3.0``
* ``my_constants.z_plateau = 150.e-6``
+* ``my_constants.n0 = 1.e22``
+* ``my_constants.wp = sqrt(n0*q_e**2/(epsilon0*m_e))``
Coordinates
^^^^^^^^^^^
diff --git a/Examples/Tests/Langmuir/inputs_2d_multi_rt b/Examples/Tests/Langmuir/inputs_2d_multi_rt
index c1712d867..95078dc1c 100644
--- a/Examples/Tests/Langmuir/inputs_2d_multi_rt
+++ b/Examples/Tests/Langmuir/inputs_2d_multi_rt
@@ -36,8 +36,10 @@ warpx.cfl = 1.0
# Parameters for the plasma wave
my_constants.epsilon = 0.01
-my_constants.kp = 376357.71524190728
-my_constants.k = 314159.2653589793
+my_constants.n0 = 2.e24 # electron and positron densities, #/m^3
+my_constants.wp = sqrt(2.*n0*q_e**2/(epsilon0*m_e)) # plasma frequency
+my_constants.kp = wp/clight # plasma wavenumber
+my_constants.k = 2.*pi/20.e-6 # perturbation wavenumber
# Note: kp is calculated in SI for a density of 4e24 (i.e. 2e24 electrons + 2e24 positrons)
# k is calculated so as to have 2 periods within the 40e-6 wide box.
@@ -56,7 +58,7 @@ electrons.zmin = -20.e-6
electrons.zmax = 20.e-6
electrons.profile = constant
-electrons.density = 2.e24 # number of electrons per m^3
+electrons.density = n0 # number of electrons per m^3
electrons.momentum_distribution_type = parse_momentum_function
electrons.momentum_function_ux(x,y,z) = "epsilon * k/kp * sin(k*x) * cos(k*y) * cos(k*z)"
electrons.momentum_function_uy(x,y,z) = "epsilon * k/kp * cos(k*x) * sin(k*y) * cos(k*z)"
@@ -74,7 +76,7 @@ positrons.zmin = -20.e-6
positrons.zmax = 20.e-6
positrons.profile = constant
-positrons.density = 2.e24 # number of positrons per m^3
+positrons.density = n0 # number of positrons per m^3
positrons.momentum_distribution_type = parse_momentum_function
positrons.momentum_function_ux(x,y,z) = "-epsilon * k/kp * sin(k*x) * cos(k*y) * cos(k*z)"
positrons.momentum_function_uy(x,y,z) = "-epsilon * k/kp * cos(k*x) * sin(k*y) * cos(k*z)"
diff --git a/Examples/Tests/Langmuir/inputs_2d_multi_rz_rt b/Examples/Tests/Langmuir/inputs_2d_multi_rz_rt
index 63f67dceb..9fff59e4a 100644
--- a/Examples/Tests/Langmuir/inputs_2d_multi_rz_rt
+++ b/Examples/Tests/Langmuir/inputs_2d_multi_rz_rt
@@ -40,9 +40,11 @@ warpx.do_dive_cleaning = 1
# Parameters for the plasma wave
my_constants.epsilon = 0.01
-my_constants.kp = 266125.0928256017
-my_constants.k0 = 314159.2653589793
-my_constants.w0 = 5.e-6
+my_constants.n0 = 2.e24 # electron density, #/m^3
+my_constants.wp = sqrt(n0*q_e**2/(epsilon0*m_e)) # plasma frequency
+my_constants.kp = wp/clight # plasma wavenumber
+my_constants.k0 = 2.*pi/20.e-6 # longitudianl perturbation wavenumber
+my_constants.w0 = 5.e-6 # transverse perturbation length
# Note: kp is calculated in SI for a density of 2e24
# k0 is calculated so as to have 2 periods within the 40e-6 wide box.
@@ -59,7 +61,7 @@ electrons.zmin = -20.e-6
electrons.zmax = +20.e-6
electrons.profile = constant
-electrons.density = 2.e24 # number of electrons per m^3
+electrons.density = n0 # number of electrons per m^3
electrons.momentum_distribution_type = parse_momentum_function
electrons.momentum_function_ux(x,y,z) = "epsilon/kp*2*x/w0**2*exp(-(x**2+y**2)/w0**2)*sin(k0*z)"
electrons.momentum_function_uy(x,y,z) = "epsilon/kp*2*y/w0**2*exp(-(x**2+y**2)/w0**2)*sin(k0*z)"
@@ -76,7 +78,7 @@ ions.zmin = -20.e-6
ions.zmax = +20.e-6
ions.profile = constant
-ions.density = 2.e24 # number of ions per m^3
+ions.density = n0 # number of ions per m^3
ions.momentum_distribution_type = constant
ions.ux = 0.
ions.uy = 0.
diff --git a/Examples/Tests/Langmuir/inputs_3d_multi_rt b/Examples/Tests/Langmuir/inputs_3d_multi_rt
index a65dd89f3..34b221ad4 100644
--- a/Examples/Tests/Langmuir/inputs_3d_multi_rt
+++ b/Examples/Tests/Langmuir/inputs_3d_multi_rt
@@ -37,8 +37,10 @@ warpx.cfl = 1.0
# Parameters for the plasma wave
my_constants.epsilon = 0.01
-my_constants.kp = 376357.71524190728
-my_constants.k = 314159.2653589793
+my_constants.n0 = 2.e24 # electron and positron densities, #/m^3
+my_constants.wp = sqrt(2.*n0*q_e**2/(epsilon0*m_e)) # plasma frequency
+my_constants.kp = wp/clight # plasma wavenumber
+my_constants.k = 2.*pi/20.e-6 # perturbation wavenumber
# Note: kp is calculated in SI for a density of 4e24 (i.e. 2e24 electrons + 2e24 positrons)
# k is calculated so as to have 2 periods within the 40e-6 wide box.
@@ -57,7 +59,7 @@ electrons.zmin = -20.e-6
electrons.zmax = 20.e-6
electrons.profile = constant
-electrons.density = 2.e24 # number of electrons per m^3
+electrons.density = n0 # number of electrons per m^3
electrons.momentum_distribution_type = parse_momentum_function
electrons.momentum_function_ux(x,y,z) = "epsilon * k/kp * sin(k*x) * cos(k*y) * cos(k*z)"
electrons.momentum_function_uy(x,y,z) = "epsilon * k/kp * cos(k*x) * sin(k*y) * cos(k*z)"
@@ -75,7 +77,7 @@ positrons.zmin = -20.e-6
positrons.zmax = 20.e-6
positrons.profile = constant
-positrons.density = 2.e24 # number of positrons per m^3
+positrons.density = n0 # number of positrons per m^3
positrons.momentum_distribution_type = parse_momentum_function
positrons.momentum_function_ux(x,y,z) = "-epsilon * k/kp * sin(k*x) * cos(k*y) * cos(k*z)"
positrons.momentum_function_uy(x,y,z) = "-epsilon * k/kp * cos(k*x) * sin(k*y) * cos(k*z)"
diff --git a/Regression/Checksum/benchmarks_json/Langmuir_multi.json b/Regression/Checksum/benchmarks_json/Langmuir_multi.json
index 61ae10535..444aa16f7 100644
--- a/Regression/Checksum/benchmarks_json/Langmuir_multi.json
+++ b/Regression/Checksum/benchmarks_json/Langmuir_multi.json
@@ -2,31 +2,31 @@
"electrons": {
"particle_cpu": 131072.0,
"particle_id": 18862440448.0,
- "particle_momentum_x": 9.638052142962566e-20,
+ "particle_momentum_x": 9.638052135794968e-20,
"particle_position_x": 2.6214400000000015,
"particle_position_y": 2.621440000000001,
- "particle_position_z": 2.6214400000000007,
+ "particle_position_z": 2.621439999999999,
"particle_weight": 128000000000.00002
},
"lev=0": {
- "Bx": 12.117994152442217,
- "By": 12.117994153638133,
- "Bz": 12.117994153639632,
- "Ex": 84779179148604.16,
- "Ey": 84779179148604.05,
- "Ez": 84779179148604.05,
- "jx": 6.087467475688619e+16,
- "jy": 6.087467475688316e+16,
- "jz": 6.087467475688315e+16,
+ "Bx": 12.117994126642934,
+ "By": 12.117994123978939,
+ "Bz": 12.117994123975555,
+ "Ex": 84779179085495.8,
+ "Ey": 84779179085494.25,
+ "Ez": 84779179085494.25,
+ "jx": 6.0874674711604136e+16,
+ "jy": 6.087467471160617e+16,
+ "jz": 6.087467471160617e+16,
"part_per_cell": 524288.0,
- "rho": 702984843.3445112
+ "rho": 702984842.8211379
},
"positrons": {
"particle_cpu": 131072.0,
"particle_id": 56518901760.0,
- "particle_momentum_z": 9.638052142962866e-20,
+ "particle_momentum_z": 9.638052135795131e-20,
"particle_position_x": 2.6214400000000015,
"particle_position_y": 2.621440000000001,
- "particle_position_z": 2.6214400000000007
+ "particle_position_z": 2.621439999999999
}
-}
+} \ No newline at end of file
diff --git a/Regression/Checksum/benchmarks_json/Langmuir_multi_2d_nodal.json b/Regression/Checksum/benchmarks_json/Langmuir_multi_2d_nodal.json
index d3927b2ab..e48a125e6 100644
--- a/Regression/Checksum/benchmarks_json/Langmuir_multi_2d_nodal.json
+++ b/Regression/Checksum/benchmarks_json/Langmuir_multi_2d_nodal.json
@@ -2,32 +2,32 @@
"electrons": {
"particle_cpu": 32768.0,
"particle_id": 1123057664.0,
- "particle_momentum_x": 5.668407425899705e-20,
+ "particle_momentum_x": 5.668407421680403e-20,
"particle_momentum_y": 0.0,
- "particle_momentum_z": 5.668407425899706e-20,
+ "particle_momentum_z": 5.668407421680403e-20,
"particle_position_x": 0.65536,
- "particle_position_y": 0.6553599999999999,
+ "particle_position_y": 0.65536,
"particle_weight": 3200000000000000.5
},
"lev=0": {
"Bx": 0.0,
- "By": 5.724715078011613,
+ "By": 5.7247150652267145,
"Bz": 0.0,
- "Ex": 3747060683403.881,
+ "Ex": 3747060680620.4976,
"Ey": 0.0,
- "Ez": 3747060683403.8833,
- "jx": 1.0088447956385268e+16,
+ "Ez": 3747060680620.5044,
+ "jx": 1.0088447948876688e+16,
"jy": 0.0,
- "jz": 1.0088447956385268e+16
+ "jz": 1.0088447948876688e+16
},
"positrons": {
"particle_cpu": 32768.0,
"particle_id": 3371204608.0,
- "particle_momentum_x": 5.668407425899705e-20,
+ "particle_momentum_x": 5.668407421680403e-20,
"particle_momentum_y": 0.0,
- "particle_momentum_z": 5.668407425899706e-20,
- "particle_position_x": 0.6553599999999999,
- "particle_position_y": 0.6553599999999999,
+ "particle_momentum_z": 5.668407421680403e-20,
+ "particle_position_x": 0.65536,
+ "particle_position_y": 0.65536,
"particle_weight": 3200000000000000.5
}
} \ No newline at end of file
diff --git a/Regression/Checksum/benchmarks_json/Langmuir_multi_nodal.json b/Regression/Checksum/benchmarks_json/Langmuir_multi_nodal.json
index 5f86c2cb2..c2339189e 100644
--- a/Regression/Checksum/benchmarks_json/Langmuir_multi_nodal.json
+++ b/Regression/Checksum/benchmarks_json/Langmuir_multi_nodal.json
@@ -2,31 +2,31 @@
"electrons": {
"particle_cpu": 131072.0,
"particle_id": 18862440448.0,
- "particle_momentum_x": 9.320505028112314e-20,
+ "particle_momentum_x": 9.320505021180255e-20,
"particle_position_x": 2.6214400000000015,
"particle_position_y": 2.621440000000001,
- "particle_position_z": 2.6214399999999998,
+ "particle_position_z": 2.62144,
"particle_weight": 128000000000.00002
},
"lev=0": {
- "Bx": 17.67689485265927,
- "By": 17.676894852670383,
- "Bz": 17.67689485267166,
- "Ex": 86079763548288.75,
- "Ey": 86079763548288.78,
- "Ez": 86079763548288.78,
- "jx": 5.803381905407021e+16,
- "jy": 5.803381905407015e+16,
- "jz": 5.803381905407016e+16,
+ "Bx": 17.676894813109854,
+ "By": 17.676894813153126,
+ "Bz": 17.676894813151755,
+ "Ex": 86079763484213.75,
+ "Ey": 86079763484213.8,
+ "Ez": 86079763484213.8,
+ "jx": 5.8033819010902744e+16,
+ "jy": 5.803381901090282e+16,
+ "jz": 5.80338190109028e+16,
"part_per_cell": 524288.0,
- "rho": 720713352.6087718
+ "rho": 720713352.0721645
},
"positrons": {
"particle_cpu": 131072.0,
"particle_id": 56518901760.0,
- "particle_momentum_z": 9.320505028112306e-20,
+ "particle_momentum_z": 9.320505021180262e-20,
"particle_position_x": 2.6214400000000015,
"particle_position_y": 2.621440000000001,
- "particle_position_z": 2.6214399999999998
+ "particle_position_z": 2.62144
}
-}
+} \ No newline at end of file
diff --git a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd.json b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd.json
index ef1a83eee..f8c6b22ed 100644
--- a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd.json
+++ b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd.json
@@ -2,31 +2,31 @@
"electrons": {
"particle_cpu": 131072.0,
"particle_id": 18862440448.0,
- "particle_momentum_x": 9.638052096688673e-20,
+ "particle_momentum_x": 9.638052089521077e-20,
"particle_position_x": 2.621440000001177,
"particle_position_y": 2.6214400000011775,
- "particle_position_z": 2.6214399999999998,
+ "particle_position_z": 2.6214399999999993,
"particle_weight": 128000000000.00002
},
"lev=0": {
- "Bx": 11.927039871438884,
- "By": 11.92703987044596,
- "Bz": 11.929384183262627,
- "Ex": 84779189387324.25,
- "Ey": 84779189387324.56,
- "Ez": 84779185961806.78,
- "jx": 6.087467490676277e+16,
- "jy": 6.08746749067624e+16,
- "jz": 6.087467421885045e+16,
+ "Bx": 11.927039845227213,
+ "By": 11.927039844199939,
+ "Bz": 11.929384159260351,
+ "Ex": 84779189324213.69,
+ "Ey": 84779189324214.39,
+ "Ez": 84779185898697.1,
+ "jx": 6.087467486148589e+16,
+ "jy": 6.0874674861486456e+16,
+ "jz": 6.087467417357445e+16,
"part_per_cell": 524288.0,
- "rho": 702985675.5592988
+ "rho": 702985675.035942
},
"positrons": {
"particle_cpu": 131072.0,
"particle_id": 56518901760.0,
- "particle_momentum_z": 9.638051962153948e-20,
+ "particle_momentum_z": 9.638051954986328e-20,
"particle_position_x": 2.621440000001177,
- "particle_position_y": 2.621440000001178,
- "particle_position_z": 2.6214399999999998
+ "particle_position_y": 2.6214400000011775,
+ "particle_position_z": 2.6214399999999993
}
} \ No newline at end of file
diff --git a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_current_correction.json b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_current_correction.json
index 96141ff12..1d2c101f4 100644
--- a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_current_correction.json
+++ b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_current_correction.json
@@ -2,30 +2,30 @@
"electrons": {
"particle_cpu": 0.0,
"particle_id": 37409652736.0,
- "particle_momentum_x": 9.585443568545559e-20,
+ "particle_momentum_x": 9.585443561416955e-20,
"particle_position_x": 2.6214400000000015,
"particle_position_y": 2.621440000000001,
"particle_position_z": 2.6214400000000007,
"particle_weight": 128000000000.00002
},
"lev=0": {
- "Bx": 11.867039048376148,
- "By": 11.86703905304863,
- "Bz": 11.867039053065115,
- "Ex": 85001549508327.53,
- "Ey": 85001549508324.97,
- "Ez": 85001549508324.9,
- "divE": 7.97321190060971e+19,
- "jx": 6.039975332058763e+16,
- "jy": 6.039975332058887e+16,
- "jz": 6.039975332058881e+16,
+ "Bx": 11.867039021156515,
+ "By": 11.867039023030747,
+ "Bz": 11.86703902301321,
+ "Ex": 85001549445049.31,
+ "Ey": 85001549445049.1,
+ "Ez": 85001549445049.03,
+ "divE": 7.973211894673711e+19,
+ "jx": 6.039975327566508e+16,
+ "jy": 6.0399753275670344e+16,
+ "jz": 6.0399753275670344e+16,
"part_per_cell": 524288.0,
- "rho": 705963156.3925041
+ "rho": 705963155.8669195
},
"positrons": {
"particle_cpu": 0.0,
"particle_id": 112722575360.0,
- "particle_momentum_z": 9.585443568545593e-20,
+ "particle_momentum_z": 9.585443561417127e-20,
"particle_position_x": 2.6214400000000015,
"particle_position_y": 2.621440000000001,
"particle_position_z": 2.6214400000000007
diff --git a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_current_correction_nodal.json b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_current_correction_nodal.json
index 19891e707..3e1b882b3 100644
--- a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_current_correction_nodal.json
+++ b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_current_correction_nodal.json
@@ -2,32 +2,32 @@
"electrons": {
"particle_cpu": 0.0,
"particle_id": 37409652736.0,
- "particle_momentum_x": 9.427560635869364e-20,
+ "particle_momentum_x": 9.427560628857219e-20,
"particle_position_x": 2.6214400000000015,
"particle_position_y": 2.621440000000001,
- "particle_position_z": 2.6214399999999998,
+ "particle_position_z": 2.6214400000000007,
"particle_weight": 128000000000.00002
},
"lev=0": {
- "Bx": 17.49996248979552,
- "By": 17.499962489807935,
- "Bz": 17.499962489796665,
- "Ex": 85654801346583.62,
- "Ey": 85654801346583.34,
- "Ez": 85654801346583.31,
- "divE": 8.073511509609898e+19,
- "jx": 5.898369391324192e+16,
- "jy": 5.898369391324414e+16,
- "jz": 5.898369391324419e+16,
+ "Bx": 17.499962450597717,
+ "By": 17.49996245066815,
+ "Bz": 17.49996245067805,
+ "Ex": 85654801282823.56,
+ "Ey": 85654801282823.42,
+ "Ez": 85654801282823.39,
+ "divE": 8.073511503598928e+19,
+ "jx": 5.898369386936786e+16,
+ "jy": 5.898369386936582e+16,
+ "jz": 5.898369386936586e+16,
"part_per_cell": 524288.0,
- "rho": 714843872.1488855
+ "rho": 714843871.6166623
},
"positrons": {
"particle_cpu": 0.0,
"particle_id": 112722575360.0,
- "particle_momentum_z": 9.427560635869377e-20,
+ "particle_momentum_z": 9.4275606288572e-20,
"particle_position_x": 2.6214400000000015,
"particle_position_y": 2.621440000000001,
- "particle_position_z": 2.6214399999999998
+ "particle_position_z": 2.6214400000000007
}
} \ No newline at end of file
diff --git a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_momentum_conserving.json b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_momentum_conserving.json
index a84855a06..c7fc7f4bc 100644
--- a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_momentum_conserving.json
+++ b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_momentum_conserving.json
@@ -2,31 +2,31 @@
"electrons": {
"particle_cpu": 131072.0,
"particle_id": 18862440448.0,
- "particle_momentum_x": 9.320946076473149e-20,
+ "particle_momentum_x": 9.320946069540143e-20,
"particle_position_x": 2.621440000001092,
"particle_position_y": 2.621440000001092,
- "particle_position_z": 2.62144,
+ "particle_position_z": 2.6214400000000007,
"particle_weight": 128000000000.00002
},
"lev=0": {
- "Bx": 15.08683235643132,
- "By": 15.086832354582613,
- "Bz": 15.08865435829179,
- "Ex": 86081132569285.61,
- "Ey": 86081132569285.25,
- "Ez": 86081129790492.31,
- "jx": 5.859963709146216e+16,
- "jy": 5.859963709146176e+16,
- "jz": 5.859963721500062e+16,
+ "Bx": 15.086832321576074,
+ "By": 15.086832322078731,
+ "Bz": 15.088654326228205,
+ "Ex": 86081132505207.28,
+ "Ey": 86081132505207.11,
+ "Ez": 86081129726414.66,
+ "jx": 5.859963704786842e+16,
+ "jy": 5.859963704786908e+16,
+ "jz": 5.85996371714085e+16,
"part_per_cell": 524288.0,
- "rho": 720713532.3806039
+ "rho": 720713531.8440464
},
"positrons": {
"particle_cpu": 131072.0,
"particle_id": 56518901760.0,
- "particle_momentum_z": 9.320946065812051e-20,
+ "particle_momentum_z": 9.320946058879026e-20,
"particle_position_x": 2.621440000001092,
"particle_position_y": 2.621440000001092,
- "particle_position_z": 2.62144
+ "particle_position_z": 2.6214400000000007
}
} \ No newline at end of file
diff --git a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_nodal.json b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_nodal.json
index 8ca75b994..f8dcc43c1 100644
--- a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_nodal.json
+++ b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_nodal.json
@@ -2,29 +2,29 @@
"electrons": {
"particle_cpu": 131072.0,
"particle_id": 18862440448.0,
- "particle_momentum_x": 9.320515831688772e-20,
+ "particle_momentum_x": 9.320515824756692e-20,
"particle_position_x": 2.6214400000000015,
"particle_position_y": 2.621440000000001,
- "particle_position_z": 2.62144,
+ "particle_position_z": 2.6214400000000007,
"particle_weight": 128000000000.00002
},
"lev=0": {
- "Bx": 17.31887367426522,
- "By": 17.318873674232954,
- "Bz": 17.31887367425445,
- "Ex": 86079988606567.34,
- "Ey": 86079988606567.34,
- "Ez": 86079988606567.33,
- "jx": 5.803387776443088e+16,
- "jy": 5.8033877764430856e+16,
- "jz": 5.803387776443085e+16,
+ "Bx": 17.318873635475775,
+ "By": 17.31887363546676,
+ "Bz": 17.31887363550675,
+ "Ex": 86079988542491.8,
+ "Ey": 86079988542491.78,
+ "Ez": 86079988542491.77,
+ "jx": 5.8033877721263256e+16,
+ "jy": 5.803387772126333e+16,
+ "jz": 5.803387772126333e+16,
"part_per_cell": 524288.0,
- "rho": 720717033.3443888
+ "rho": 720717032.8077942
},
"positrons": {
"particle_cpu": 131072.0,
"particle_id": 56518901760.0,
- "particle_momentum_z": 9.32051583168877e-20,
+ "particle_momentum_z": 9.320515824756704e-20,
"particle_position_x": 2.6214400000000015,
"particle_position_y": 2.621440000000001,
"particle_position_z": 2.62144
diff --git a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_single_precision.json b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_single_precision.json
index 01725b78a..963a7ded3 100644
--- a/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_single_precision.json
+++ b/Regression/Checksum/benchmarks_json/Langmuir_multi_psatd_single_precision.json
@@ -2,31 +2,31 @@
"electrons": {
"particle_cpu": 131072.0,
"particle_id": 18270519296.0,
- "particle_momentum_x": 9.638059683620202e-20,
- "particle_position_x": 2.621439944060171,
- "particle_position_y": 2.621439958565901,
- "particle_position_z": 2.6214399583572003,
+ "particle_momentum_x": 9.638206108462784e-20,
+ "particle_position_x": 2.621439946144335,
+ "particle_position_y": 2.6214399605720473,
+ "particle_position_z": 2.6214399608165024,
"particle_weight": 127999991808.0
},
"lev=0": {
- "Bx": 11.964658553650342,
- "By": 11.956726736527793,
- "Bz": 11.95014436974827,
- "Ex": 84779240882468.25,
- "Ey": 84779250043081.5,
- "Ez": 84779193731798.38,
- "jx": 6.087472048294362e+16,
- "jy": 6.087472925954458e+16,
- "jz": 6.087475294828256e+16,
+ "Bx": 11.942729428141796,
+ "By": 11.947761789089679,
+ "Bz": 11.942489514683562,
+ "Ex": 84780606024507.0,
+ "Ey": 84780616397484.88,
+ "Ez": 84780559670537.38,
+ "jx": 6.087564613231104e+16,
+ "jy": 6.087565743692762e+16,
+ "jz": 6.087567343856218e+16,
"part_per_cell": 524288.0,
- "rho": 702981186.7929688
+ "rho": 702987811.1679688
},
"positrons": {
"particle_cpu": 131072.0,
"particle_id": 54811295744.0,
- "particle_momentum_z": 9.638064035895123e-20,
- "particle_position_x": 2.6214399439650435,
- "particle_position_y": 2.621439958525343,
- "particle_position_z": 2.621439958409354
+ "particle_momentum_z": 9.638209718562555e-20,
+ "particle_position_x": 2.6214399461232745,
+ "particle_position_y": 2.621439960570399,
+ "particle_position_z": 2.621439960792145
}
-}
+} \ No newline at end of file
diff --git a/Source/Utils/WarpXUtil.cpp b/Source/Utils/WarpXUtil.cpp
index 622a0256e..ae62eb0ca 100644
--- a/Source/Utils/WarpXUtil.cpp
+++ b/Source/Utils/WarpXUtil.cpp
@@ -14,6 +14,8 @@
#include <cmath>
#include <fstream>
+#include <set>
+#include <string>
using namespace amrex;
@@ -193,6 +195,10 @@ void Store_parserString(const amrex::ParmParse& pp, std::string query_string,
WarpXParser makeParser (std::string const& parse_function, std::vector<std::string> const& varnames)
{
+ // Since queryWithParser recursively calls this routine, keep track of symbols
+ // in case an infinite recursion is found (a symbol's value depending on itself).
+ static std::set<std::string> recursive_symbols;
+
WarpXParser parser(parse_function);
parser.registerVariables(varnames);
ParmParse pp_my_constants("my_constants");
@@ -200,7 +206,13 @@ WarpXParser makeParser (std::string const& parse_function, std::vector<std::stri
for (auto const& v : varnames) symbols.erase(v.c_str());
for (auto it = symbols.begin(); it != symbols.end(); ) {
Real v;
- if (pp_my_constants.query(it->c_str(), v)) {
+
+ WarpXUtilMsg::AlwaysAssert(recursive_symbols.count(*it)==0, "Expressions contains recursive symbol "+*it);
+ recursive_symbols.insert(*it);
+ const bool is_input = queryWithParser(pp_my_constants, it->c_str(), v);
+ recursive_symbols.erase(*it);
+
+ if (is_input) {
parser.setConstant(*it, v);
it = symbols.erase(it);
} else if (std::strcmp(it->c_str(), "q_e") == 0) {