From 52c2fef49a4b36a6d4c2a9b33ed8e9b01d29d070 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Wed, 21 Feb 2024 09:12:36 -0800 Subject: [PATCH 01/13] Exchange guard cells for electrostatic solver --- Source/Evolve/WarpXEvolve.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Evolve/WarpXEvolve.cpp b/Source/Evolve/WarpXEvolve.cpp index b062501ed1b..6ae9b0c3303 100644 --- a/Source/Evolve/WarpXEvolve.cpp +++ b/Source/Evolve/WarpXEvolve.cpp @@ -140,13 +140,13 @@ WarpX::Evolve (int numsteps) is_synchronized = false; } else { + // E and B are up-to-date inside the domain only + FillBoundaryE(guard_cells.ng_FieldGather); + FillBoundaryB(guard_cells.ng_FieldGather); + if (electrostatic_solver_id == ElectrostaticSolverAlgo::None) { // Beyond one step, we have E^{n} and B^{n}. // Particles have p^{n-1/2} and x^{n}. - - // E and B are up-to-date inside the domain only - FillBoundaryE(guard_cells.ng_FieldGather); - FillBoundaryB(guard_cells.ng_FieldGather); // E and B: enough guard cells to update Aux or call Field Gather in fp and cp // Need to update Aux on lower levels, to interpolate to higher levels. if (fft_do_time_averaging) From 4e861ffcd8c40fe03f64729d5606c742020c0890 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Thu, 22 Feb 2024 11:22:27 -0800 Subject: [PATCH 02/13] Update calls to fillboundary --- Source/Evolve/WarpXEvolve.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Source/Evolve/WarpXEvolve.cpp b/Source/Evolve/WarpXEvolve.cpp index 6ae9b0c3303..dd6acfd2694 100644 --- a/Source/Evolve/WarpXEvolve.cpp +++ b/Source/Evolve/WarpXEvolve.cpp @@ -122,12 +122,12 @@ WarpX::Evolve (int numsteps) // At the beginning, we have B^{n} and E^{n}. // Particles have p^{n} and x^{n}. // is_synchronized is true. + if (is_synchronized) { - if (electrostatic_solver_id == ElectrostaticSolverAlgo::None) { - // Not called at each iteration, so exchange all guard cells - FillBoundaryE(guard_cells.ng_alloc_EB); - FillBoundaryB(guard_cells.ng_alloc_EB); - } + // Not called at each iteration, so exchange all guard cells + FillBoundaryE(guard_cells.ng_alloc_EB); + FillBoundaryB(guard_cells.ng_alloc_EB); + UpdateAuxilaryData(); FillBoundaryAux(guard_cells.ng_UpdateAux); // on first step, push p by -0.5*dt @@ -140,15 +140,15 @@ WarpX::Evolve (int numsteps) is_synchronized = false; } else { + // Beyond one step, we have E^{n} and B^{n}. + // Particles have p^{n-1/2} and x^{n}. + // E and B: enough guard cells to update Aux or call Field Gather in fp and cp + // Need to update Aux on lower levels, to interpolate to higher levels. + // E and B are up-to-date inside the domain only FillBoundaryE(guard_cells.ng_FieldGather); FillBoundaryB(guard_cells.ng_FieldGather); - if (electrostatic_solver_id == ElectrostaticSolverAlgo::None) { - // Beyond one step, we have E^{n} and B^{n}. - // Particles have p^{n-1/2} and x^{n}. - // E and B: enough guard cells to update Aux or call Field Gather in fp and cp - // Need to update Aux on lower levels, to interpolate to higher levels. if (fft_do_time_averaging) { FillBoundaryE_avg(guard_cells.ng_FieldGather); From e9bd679d1bded7d9d4c7a0ad45b71e4a4be99b95 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Thu, 22 Feb 2024 11:28:09 -0800 Subject: [PATCH 03/13] Update checksums --- .../benchmarks_json/BeamBeamCollision.json | 142 +++++++++--------- .../benchmarks_json/ElectrostaticSphere.json | 20 +-- .../ElectrostaticSphereLabFrame.json | 20 +-- .../ElectrostaticSphereRZ.json | 18 +-- 4 files changed, 100 insertions(+), 100 deletions(-) diff --git a/Regression/Checksum/benchmarks_json/BeamBeamCollision.json b/Regression/Checksum/benchmarks_json/BeamBeamCollision.json index 16c27055ab5..4ce56c3396f 100644 --- a/Regression/Checksum/benchmarks_json/BeamBeamCollision.json +++ b/Regression/Checksum/benchmarks_json/BeamBeamCollision.json @@ -1,96 +1,96 @@ { "lev=0": { - "Bx": 971135657171.612, - "By": 971078812454.5405, - "Bz": 20140193.235893946, - "Ex": 2.9111756162943966e+20, - "Ey": 2.9113725115697712e+20, - "Ez": 1.0213536367191107e+17, - "rho_beam1": 7.970337929028706e+16, - "rho_beam2": 7.969213804851568e+16, - "rho_ele1": 343600677331163.7, - "rho_ele2": 302746939366837.25, - "rho_pos1": 333855946230626.06, - "rho_pos2": 310879461124837.44 + "Bx": 970657510366.6864, + "By": 970616084291.5999, + "Bz": 31811647.29794056, + "Ex": 2.9101079830039894e+20, + "Ey": 2.910225438740697e+20, + "Ez": 1.1018420662438138e+17, + "rho_beam1": 7.969589429008706e+16, + "rho_beam2": 7.969261694011082e+16, + "rho_ele1": 279363066610949.88, + "rho_ele2": 292455027283658.0, + "rho_pos1": 273997102368327.72, + "rho_pos2": 298708381895174.56 }, "beam1": { - "particle_opticalDepthQSR": 104909.59461909423, - "particle_position_x": 0.001500222221634118, - "particle_position_y": 0.0015002445303035634, - "particle_position_z": 0.0049656251227976015, - "particle_momentum_x": 6.205341799808723e-15, - "particle_momentum_y": 6.1592257603817594e-15, - "particle_momentum_z": 6.806886719670214e-12, - "particle_weight": 635949610.5135971 + "particle_opticalDepthQSR": 104854.22747624305, + "particle_position_x": 0.0015002152500249873, + "particle_position_y": 0.0015002253859733158, + "particle_position_z": 0.004965616008291195, + "particle_momentum_x": 6.2081697907558685e-15, + "particle_momentum_y": 6.164185849396337e-15, + "particle_momentum_z": 6.806919536239073e-12, + "particle_weight": 635894928.7801809 }, "beam2": { - "particle_opticalDepthQSR": 104164.848014815, - "particle_position_x": 0.0015001011957527532, - "particle_position_y": 0.001500139975740741, - "particle_position_z": 0.004965479176845744, - "particle_momentum_x": 6.200690794877584e-15, - "particle_momentum_y": 6.186048913459861e-15, - "particle_momentum_z": 6.7990490255176515e-12, - "particle_weight": 635863144.251134 + "particle_opticalDepthQSR": 104157.85227862887, + "particle_position_x": 0.0015001338731474294, + "particle_position_y": 0.001500167865236725, + "particle_position_z": 0.00496550130257822, + "particle_momentum_x": 6.2031995430331934e-15, + "particle_momentum_y": 6.191531863356078e-15, + "particle_momentum_z": 6.798687778588033e-12, + "particle_weight": 635866821.9486864 }, "ele1": { - "particle_opticalDepthQSR": 435.73003117907257, - "particle_position_x": 4.882183530045367e-06, - "particle_position_y": 4.841391483672882e-06, - "particle_position_z": 1.8449175055560687e-05, - "particle_momentum_x": 5.6656608489971696e-18, - "particle_momentum_y": 5.724425295258085e-18, - "particle_momentum_z": 2.6277553331470036e-15, - "particle_weight": 2696555.9200674472 + "particle_opticalDepthQSR": 415.4233136407406, + "particle_position_x": 5.201917659689756e-06, + "particle_position_y": 5.415911616605382e-06, + "particle_position_z": 1.8769582519669507e-05, + "particle_momentum_x": 5.340952924836118e-18, + "particle_momentum_y": 5.312106463182331e-18, + "particle_momentum_z": 2.497080119419264e-15, + "particle_weight": 2212854.7954354063 }, "ele2": { - "particle_opticalDepthQSR": 340.82229684726735, - "particle_position_x": 5.233059654483856e-06, - "particle_position_y": 4.781569085220371e-06, - "particle_position_z": 1.6293559425324337e-05, - "particle_momentum_x": 4.802611971470525e-18, - "particle_momentum_y": 4.3556825243407754e-18, - "particle_momentum_z": 2.41587659230925e-15, - "particle_weight": 2481137.860727036 + "particle_opticalDepthQSR": 343.6271504974385, + "particle_position_x": 5.069499404254441e-06, + "particle_position_y": 4.9784428929938295e-06, + "particle_position_z": 1.5997841288017043e-05, + "particle_momentum_x": 4.325950783622351e-18, + "particle_momentum_y": 4.430236938400823e-18, + "particle_momentum_z": 2.3963313190107694e-15, + "particle_weight": 2286822.0996145885 }, "pho1": { - "particle_opticalDepthBW": 9894.64959724129, - "particle_position_x": 0.00014191369823397644, - "particle_position_y": 0.00014347545392717968, - "particle_position_z": 0.00047442826029322116, + "particle_opticalDepthBW": 9940.462808278058, + "particle_position_x": 0.00014218014815359236, + "particle_position_y": 0.00014291255568525175, + "particle_position_z": 0.00047390476392745334, "particle_momentum_x": 0.0, "particle_momentum_y": 0.0, "particle_momentum_z": 0.0, - "particle_weight": 61063948.68610941 + "particle_weight": 60889585.379570425 }, "pho2": { - "particle_opticalDepthBW": 10292.1955840901, - "particle_position_x": 0.00014731892710321073, - "particle_position_y": 0.00014515617182809124, - "particle_position_z": 0.00048756513452074315, + "particle_opticalDepthBW": 10198.933815345803, + "particle_position_x": 0.00014600338610231154, + "particle_position_y": 0.0001444771956245457, + "particle_position_z": 0.000485925175367835, "particle_momentum_x": 0.0, "particle_momentum_y": 0.0, "particle_momentum_z": 0.0, - "particle_weight": 62299636.622087024 + "particle_weight": 62224982.69315678 }, "pos1": { - "particle_opticalDepthQSR": 387.7441392212553, - "particle_position_x": 5.1462880118803425e-06, - "particle_position_y": 5.2613832293016684e-06, - "particle_position_z": 1.7054223425917483e-05, - "particle_momentum_x": 4.6437665862693495e-18, - "particle_momentum_y": 4.761862836969051e-18, - "particle_momentum_z": 2.3776996599289627e-15, - "particle_weight": 2625121.7841375084 + "particle_opticalDepthQSR": 347.54338674919927, + "particle_position_x": 5.442659316755965e-06, + "particle_position_y": 5.696400704419894e-06, + "particle_position_z": 1.7277943178953278e-05, + "particle_momentum_x": 4.987153690397687e-18, + "particle_momentum_y": 5.0670082836356395e-18, + "particle_momentum_z": 2.8306668750564056e-15, + "particle_weight": 2201346.0495983944 }, "pos2": { - "particle_opticalDepthQSR": 361.943365907597, - "particle_position_x": 4.969019565031149e-06, - "particle_position_y": 4.361394970806125e-06, - "particle_position_z": 1.7413304358612675e-05, - "particle_momentum_x": 5.6348322786528905e-18, - "particle_momentum_y": 4.8171439953214205e-18, - "particle_momentum_z": 2.1937254860708963e-15, - "particle_weight": 2529794.7740602638 + "particle_opticalDepthQSR": 366.6684925040943, + "particle_position_x": 4.80202239993873e-06, + "particle_position_y": 4.65180957168951e-06, + "particle_position_z": 1.7239832169488648e-05, + "particle_momentum_x": 5.287204173391292e-18, + "particle_momentum_y": 5.0342118518185026e-18, + "particle_momentum_z": 2.50117311575147e-15, + "particle_weight": 2340285.7906044484 } -} +} \ No newline at end of file diff --git a/Regression/Checksum/benchmarks_json/ElectrostaticSphere.json b/Regression/Checksum/benchmarks_json/ElectrostaticSphere.json index 2d26136cc5e..4e9bde52a78 100644 --- a/Regression/Checksum/benchmarks_json/ElectrostaticSphere.json +++ b/Regression/Checksum/benchmarks_json/ElectrostaticSphere.json @@ -1,17 +1,17 @@ { "lev=0": { - "Ex": 6.504757806138167, - "Ey": 6.504757806138166, - "Ez": 6.501489620648247, - "rho": 2.60925680083338e-10 + "Ex": 6.504803536004636, + "Ey": 6.504803536004637, + "Ez": 6.504803536004637, + "rho": 2.609256800833379e-10 }, "electron": { - "particle_momentum_x": 1.0083594348819436e-23, - "particle_momentum_y": 1.0083594348819436e-23, - "particle_momentum_z": 1.0159789930728084e-23, - "particle_position_x": 518.4112403470117, - "particle_position_y": 518.4112403470117, - "particle_position_z": 520.2110302538686, + "particle_momentum_x": 1.0084159184928337e-23, + "particle_momentum_y": 1.008415918492834e-23, + "particle_momentum_z": 1.0084159184928338e-23, + "particle_position_x": 518.418176976446, + "particle_position_y": 518.4181769764461, + "particle_position_z": 518.418176976446, "particle_weight": 6212.501525878906 } } diff --git a/Regression/Checksum/benchmarks_json/ElectrostaticSphereLabFrame.json b/Regression/Checksum/benchmarks_json/ElectrostaticSphereLabFrame.json index d46a8cfcda4..648e805c938 100644 --- a/Regression/Checksum/benchmarks_json/ElectrostaticSphereLabFrame.json +++ b/Regression/Checksum/benchmarks_json/ElectrostaticSphereLabFrame.json @@ -1,17 +1,17 @@ { "lev=0": { - "Ex": 6.504586436288052, - "Ey": 6.504586436288051, - "Ez": 6.501896077968277, - "rho": 2.6092568008333797e-10 + "Ex": 6.504631859055906, + "Ey": 6.504631859055904, + "Ez": 6.504631859055904, + "rho": 2.609256800833379e-10 }, "electron": { - "particle_momentum_x": 9.881704085619681e-24, - "particle_momentum_y": 9.881704085619682e-24, - "particle_momentum_z": 9.969862126470096e-24, - "particle_position_x": 513.5147715983729, - "particle_position_y": 513.5147715983729, - "particle_position_z": 515.4187595183639, + "particle_momentum_x": 9.882423407883042e-24, + "particle_momentum_y": 9.882423407883041e-24, + "particle_momentum_z": 9.882423407883041e-24, + "particle_position_x": 513.522905933945, + "particle_position_y": 513.522905933945, + "particle_position_z": 513.522905933945, "particle_weight": 6212.501525878906 } } diff --git a/Regression/Checksum/benchmarks_json/ElectrostaticSphereRZ.json b/Regression/Checksum/benchmarks_json/ElectrostaticSphereRZ.json index 038ea5a6449..a94e8a4cd0b 100644 --- a/Regression/Checksum/benchmarks_json/ElectrostaticSphereRZ.json +++ b/Regression/Checksum/benchmarks_json/ElectrostaticSphereRZ.json @@ -1,17 +1,17 @@ { "lev=0": { - "Er": 0.11588932103656224, + "Er": 0.11588944816311227, "Et": 0.0, - "Ez": 0.11483033274834441, - "rho": 9.716216490680392e-12 + "Ez": 0.11492556391155323, + "rho": 9.71614990653583e-12 }, "electron": { - "particle_momentum_x": 4.54997005723341e-25, - "particle_momentum_y": 4.434893182689167e-25, - "particle_momentum_z": 6.989989085028144e-25, - "particle_position_x": 35.73642348640023, - "particle_position_y": 35.69851886414351, + "particle_momentum_x": 4.550172089304043e-25, + "particle_momentum_y": 4.435063230214811e-25, + "particle_momentum_z": 6.953391709067729e-25, + "particle_position_x": 35.73677703655427, + "particle_position_y": 35.61000307679542, "particle_theta": 823.0413054971611, "particle_weight": 6406.017620347038 } -} +} \ No newline at end of file From 0297e741876bd50239863fa73a9a6dc4c54b5c30 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Thu, 22 Feb 2024 14:38:44 -0800 Subject: [PATCH 04/13] Add automated test --- .../analysis.py | 38 ++++++++ .../inputs_2d_electrostatic | 90 +++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100755 Examples/Tests/energy_conserving_thermal_plasma/analysis.py create mode 100644 Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic diff --git a/Examples/Tests/energy_conserving_thermal_plasma/analysis.py b/Examples/Tests/energy_conserving_thermal_plasma/analysis.py new file mode 100755 index 00000000000..ae7ce84c8b8 --- /dev/null +++ b/Examples/Tests/energy_conserving_thermal_plasma/analysis.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 + +# Copyright 2024, Remi Lehe +# +# This file is part of WarpX. +# +# License: BSD-3-Clause-LBNL + +# This script tests the conservation of energy for a thermal plasma with periodic boundary. +# Here, we use energy-converving gather and an electrostatic solver. The energy +# is not expected to be exactly conserved, but it is expected to be better conserved +# than other gathering scheme. This tests checks that the energy does not increase by +# more than 0.3% over the duration of the simulatoin. + +import os +import sys + +import numpy as np +import yt + +sys.path.insert(1, '../../../../warpx/Regression/Checksum/') +import checksumAPI +# this will be the name of the plot file +fn = sys.argv[1] + +# Get energy as a function of time, from reduced diagnostics +EFdata = np.genfromtxt('./diags/reducedfiles/EF.txt') # Field energy +EPdata = np.genfromtxt('./diags/reducedfiles/EP.txt') # Particle energy +field_energy = EFdata[:,2] +particle_energy = EPdata[:,2] +E = field_energy + particle_energy +print(abs(E-E[0])/E[0]) +# Check that the energy is conserved to 0.3% +assert np.all( abs(E-E[0])/E[0] < 0.003 ) + +# Checksum test +test_name = os.path.split(os.getcwd())[1] +checksumAPI.evaluate_checksum(test_name, fn, rtol=checksum_rtol) diff --git a/Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic b/Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic new file mode 100644 index 00000000000..ed77e7f01e6 --- /dev/null +++ b/Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic @@ -0,0 +1,90 @@ +################################# +####### GENERAL PARAMETERS ###### +################################# +max_step = 500 +amr.n_cell = 8 8 +amr.max_level = 0 +geometry.dims = 2 + +warpx.do_electrostatic = labframe +algo.field_gathering = energy-conserving +algo.particle_shape = 2 +warpx.use_filter = 0 + +################################# +############ CONSTANTS ############# +################################# + +my_constants.n0 = 1.e30 # plasma densirty, m^-3 +my_constants.Ti = 100. # ion temperature, eV +my_constants.Te = 100. # electron temperature, eV +my_constants.wpe = q_e*sqrt(n0/(m_e*epsilon0)) # electron plasma frequency, radians/s +my_constants.de0 = clight/wpe # skin depth, m +my_constants.dt = ( 0.2 )/wpe # time step size, s +warpx.const_dt = dt +################################# +####### GENERAL PARAMETERS ###### +################################# + +geometry.dims = 2 +geometry.prob_lo = 0.0 0.0 +geometry.prob_hi = 10.*de0 10.*de0 +boundary.field_lo = periodic periodic +boundary.field_hi = periodic periodic +boundary.particle_lo = periodic periodic +boundary.particle_hi = periodic periodic + +################################# +####### Boundary condition ###### +################################# +boundary.field_lo = periodic periodic +boundary.field_hi = periodic periodic + +################################# +############ NUMERICS ########### +################################# +warpx.serialize_initial_conditions = 1 +warpx.verbose = 1 + +################################# +############ PLASMA ############# +################################# +particles.species_names = electrons protons + +electrons.species_type = electron +electrons.injection_style = "NUniformPerCell" +electrons.num_particles_per_cell_each_dim = 2 2 +electrons.profile = constant +electrons.density = n0 +electrons.momentum_distribution_type = gaussian +electrons.ux_th = sqrt(Te*q_e/m_e)/clight +electrons.uy_th = sqrt(Te*q_e/m_e)/clight +electrons.uz_th = sqrt(Te*q_e/m_e)/clight +electrons.xmin = 0 +electrons.xmax = 10.*de0 +electrons.zmin = 0 +electrons.zmax =10.*de0 + +protons.species_type = proton +protons.injection_style = "NUniformPerCell" +protons.num_particles_per_cell_each_dim = 2 2 +protons.profile = constant +protons.density = n0 +protons.momentum_distribution_type = gaussian +protons.ux_th = sqrt(Ti*q_e/m_p)/clight +protons.uy_th = sqrt(Ti*q_e/m_p)/clight +protons.uz_th = sqrt(Ti*q_e/m_p)/clight +protons.xmin = 0 +protons.xmax = 10.*de0 +protons.zmin = 0 +protons.zmax =10.*de0 + +diagnostics.diags_names = diag1 +diag1.intervals = 500 +diag1.diag_type = Full + +warpx.reduced_diags_names = EP EF +EP.type = ParticleEnergy +EP.intervals = 100 +EF.type = FieldEnergy +EF.intervals =100 From 84a4d8562e61c09df587deaf2d1772782d20ca02 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Thu, 22 Feb 2024 14:40:37 -0800 Subject: [PATCH 05/13] Update benchmark --- .../benchmarks_json/BeamBeamCollision.json | 140 +++++++++--------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/Regression/Checksum/benchmarks_json/BeamBeamCollision.json b/Regression/Checksum/benchmarks_json/BeamBeamCollision.json index 4ce56c3396f..693faf43882 100644 --- a/Regression/Checksum/benchmarks_json/BeamBeamCollision.json +++ b/Regression/Checksum/benchmarks_json/BeamBeamCollision.json @@ -1,96 +1,96 @@ { "lev=0": { - "Bx": 970657510366.6864, - "By": 970616084291.5999, - "Bz": 31811647.29794056, - "Ex": 2.9101079830039894e+20, - "Ey": 2.910225438740697e+20, - "Ez": 1.1018420662438138e+17, - "rho_beam1": 7.969589429008706e+16, - "rho_beam2": 7.969261694011082e+16, - "rho_ele1": 279363066610949.88, - "rho_ele2": 292455027283658.0, - "rho_pos1": 273997102368327.72, - "rho_pos2": 298708381895174.56 + "Bx": 970573570349.2142, + "By": 970493693614.8823, + "Bz": 18743533.08373785, + "Ex": 2.9100804648817213e+20, + "Ey": 2.910188719414779e+20, + "Ez": 1.309938057448976e+17, + "rho_beam1": 7.969171294602906e+16, + "rho_beam2": 7.969079911431987e+16, + "rho_ele1": 234837475722889.97, + "rho_ele2": 277285508564124.12, + "rho_pos1": 229824415763789.62, + "rho_pos2": 286513388076434.4 }, "beam1": { - "particle_opticalDepthQSR": 104854.22747624305, - "particle_position_x": 0.0015002152500249873, - "particle_position_y": 0.0015002253859733158, - "particle_position_z": 0.004965616008291195, - "particle_momentum_x": 6.2081697907558685e-15, - "particle_momentum_y": 6.164185849396337e-15, - "particle_momentum_z": 6.806919536239073e-12, - "particle_weight": 635894928.7801809 + "particle_opticalDepthQSR": 104947.58821047074, + "particle_position_x": 0.0015001846430437182, + "particle_position_y": 0.0015002200838688795, + "particle_position_z": 0.004965556992831605, + "particle_momentum_x": 6.207861637949496e-15, + "particle_momentum_y": 6.16591876835476e-15, + "particle_momentum_z": 6.806755306915448e-12, + "particle_weight": 635859587.7915188 }, "beam2": { - "particle_opticalDepthQSR": 104157.85227862887, - "particle_position_x": 0.0015001338731474294, - "particle_position_y": 0.001500167865236725, - "particle_position_z": 0.00496550130257822, - "particle_momentum_x": 6.2031995430331934e-15, - "particle_momentum_y": 6.191531863356078e-15, - "particle_momentum_z": 6.798687778588033e-12, - "particle_weight": 635866821.9486864 + "particle_opticalDepthQSR": 104180.42997257302, + "particle_position_x": 0.0015001132145418016, + "particle_position_y": 0.001500162338878405, + "particle_position_z": 0.004965528365042041, + "particle_momentum_x": 6.201791193788119e-15, + "particle_momentum_y": 6.188946480983165e-15, + "particle_momentum_z": 6.796967564632488e-12, + "particle_weight": 635853166.1373858 }, "ele1": { - "particle_opticalDepthQSR": 415.4233136407406, - "particle_position_x": 5.201917659689756e-06, - "particle_position_y": 5.415911616605382e-06, - "particle_position_z": 1.8769582519669507e-05, - "particle_momentum_x": 5.340952924836118e-18, - "particle_momentum_y": 5.312106463182331e-18, - "particle_momentum_z": 2.497080119419264e-15, - "particle_weight": 2212854.7954354063 + "particle_opticalDepthQSR": 385.3959944370225, + "particle_position_x": 5.063867198487091e-06, + "particle_position_y": 5.323267522706671e-06, + "particle_position_z": 1.81974337459613e-05, + "particle_momentum_x": 5.220808698440275e-18, + "particle_momentum_y": 5.2833645967924376e-18, + "particle_momentum_z": 2.4960852396311436e-15, + "particle_weight": 1883777.3071500752 }, "ele2": { - "particle_opticalDepthQSR": 343.6271504974385, - "particle_position_x": 5.069499404254441e-06, - "particle_position_y": 4.9784428929938295e-06, - "particle_position_z": 1.5997841288017043e-05, - "particle_momentum_x": 4.325950783622351e-18, - "particle_momentum_y": 4.430236938400823e-18, - "particle_momentum_z": 2.3963313190107694e-15, - "particle_weight": 2286822.0996145885 + "particle_opticalDepthQSR": 391.0032239817431, + "particle_position_x": 5.442400321293304e-06, + "particle_position_y": 5.3621200149906786e-06, + "particle_position_z": 1.716649458876156e-05, + "particle_momentum_x": 4.7056270741663116e-18, + "particle_momentum_y": 4.414438514376292e-18, + "particle_momentum_z": 2.3816287305827113e-15, + "particle_weight": 2255238.1204111334 }, "pho1": { - "particle_opticalDepthBW": 9940.462808278058, - "particle_position_x": 0.00014218014815359236, - "particle_position_y": 0.00014291255568525175, - "particle_position_z": 0.00047390476392745334, + "particle_opticalDepthBW": 9912.332305353064, + "particle_position_x": 0.0001424857999095925, + "particle_position_y": 0.00014366766674682975, + "particle_position_z": 0.0004764478273708734, "particle_momentum_x": 0.0, "particle_momentum_y": 0.0, "particle_momentum_z": 0.0, - "particle_weight": 60889585.379570425 + "particle_weight": 61671336.44071695 }, "pho2": { - "particle_opticalDepthBW": 10198.933815345803, - "particle_position_x": 0.00014600338610231154, - "particle_position_y": 0.0001444771956245457, - "particle_position_z": 0.000485925175367835, + "particle_opticalDepthBW": 10361.142481614075, + "particle_position_x": 0.00014718841339786984, + "particle_position_y": 0.00014538267635727008, + "particle_position_z": 0.00048768591004702896, "particle_momentum_x": 0.0, "particle_momentum_y": 0.0, "particle_momentum_z": 0.0, - "particle_weight": 62224982.69315678 + "particle_weight": 61889405.34553001 }, "pos1": { - "particle_opticalDepthQSR": 347.54338674919927, - "particle_position_x": 5.442659316755965e-06, - "particle_position_y": 5.696400704419894e-06, - "particle_position_z": 1.7277943178953278e-05, - "particle_momentum_x": 4.987153690397687e-18, - "particle_momentum_y": 5.0670082836356395e-18, - "particle_momentum_z": 2.8306668750564056e-15, - "particle_weight": 2201346.0495983944 + "particle_opticalDepthQSR": 343.0370605565725, + "particle_position_x": 5.41949101836001e-06, + "particle_position_y": 5.5292865311090835e-06, + "particle_position_z": 1.7063207973991194e-05, + "particle_momentum_x": 4.76704175252458e-18, + "particle_momentum_y": 5.049007427826035e-18, + "particle_momentum_z": 2.533578387785534e-15, + "particle_weight": 1821809.4309160584 }, "pos2": { - "particle_opticalDepthQSR": 366.6684925040943, - "particle_position_x": 4.80202239993873e-06, - "particle_position_y": 4.65180957168951e-06, - "particle_position_z": 1.7239832169488648e-05, - "particle_momentum_x": 5.287204173391292e-18, - "particle_momentum_y": 5.0342118518185026e-18, - "particle_momentum_z": 2.50117311575147e-15, - "particle_weight": 2340285.7906044484 + "particle_opticalDepthQSR": 390.0211924195479, + "particle_position_x": 5.053169658257247e-06, + "particle_position_y": 5.039302796539821e-06, + "particle_position_z": 1.8526669235892217e-05, + "particle_momentum_x": 5.755216173987019e-18, + "particle_momentum_y": 5.056618594918483e-18, + "particle_momentum_z": 2.52324147594341e-15, + "particle_weight": 2328558.5523011778 } } \ No newline at end of file From 1802ce8f8a069f81600488a113ef9d06c28a1ad5 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Thu, 22 Feb 2024 14:46:34 -0800 Subject: [PATCH 06/13] Add automated test for energy conservation --- .../EnergyConservingThermalPlasma.json | 29 +++++++++++++++++++ Regression/WarpX-tests.ini | 16 ++++++++++ 2 files changed, 45 insertions(+) create mode 100644 Regression/Checksum/benchmarks_json/EnergyConservingThermalPlasma.json diff --git a/Regression/Checksum/benchmarks_json/EnergyConservingThermalPlasma.json b/Regression/Checksum/benchmarks_json/EnergyConservingThermalPlasma.json new file mode 100644 index 00000000000..91cf1225ce3 --- /dev/null +++ b/Regression/Checksum/benchmarks_json/EnergyConservingThermalPlasma.json @@ -0,0 +1,29 @@ +{ + "electrons": { + "particle_momentum_x": 7.261458159320679e-22, + "particle_momentum_y": 7.291814341196144e-22, + "particle_momentum_z": 7.597118915907896e-22, + "particle_position_x": 6.622192192980071e-06, + "particle_position_y": 6.725927457001655e-06, + "particle_weight": 2823958719279159.5 + }, + "lev=0": { + "Bx": 0.0, + "By": 0.0, + "Bz": 0.0, + "Ex": 15799365073529.691, + "Ey": 0.0, + "Ez": 15104394248696.58, + "jx": 5.334685437804499e+18, + "jy": 4.0836522633767813e+18, + "jz": 5.896189440230493e+18 + }, + "protons": { + "particle_momentum_x": 3.211480673491126e-20, + "particle_momentum_y": 3.410019236383268e-20, + "particle_momentum_z": 3.06565056891683e-20, + "particle_position_x": 6.802704662084178e-06, + "particle_position_y": 6.798505413146967e-06, + "particle_weight": 2823958719279159.5 + } +} \ No newline at end of file diff --git a/Regression/WarpX-tests.ini b/Regression/WarpX-tests.ini index 08c3a4bb805..da21e3793e9 100644 --- a/Regression/WarpX-tests.ini +++ b/Regression/WarpX-tests.ini @@ -4627,3 +4627,19 @@ compileTest = 0 doVis = 0 compareParticles = 1 analysisRoutine = Examples/Tests/Implicit/analysis_1d.py + +[EnergyConservingThermalPlasma] +buildDir = . +inputFile = Examples/Tests/Implicit/inputs_2d_electrostatic +dim = 2 +addToCompileString = +cmakeSetupOpts = -DWarpX_DIMS=2 +restartTest = 0 +useMPI = 1 +numprocs = 2 +useOMP = 0 +numthreads = 1 +compileTest = 0 +doVis = 0 +compareParticles = 1 +analysisRoutine = Examples/Tests/Implicit/analysis.py From 39eca5e7874ebed82e21c395782a5b8c3790a882 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 22 Feb 2024 22:47:15 +0000 Subject: [PATCH 07/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- Examples/Tests/energy_conserving_thermal_plasma/analysis.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Examples/Tests/energy_conserving_thermal_plasma/analysis.py b/Examples/Tests/energy_conserving_thermal_plasma/analysis.py index ae7ce84c8b8..2caed9c4a04 100755 --- a/Examples/Tests/energy_conserving_thermal_plasma/analysis.py +++ b/Examples/Tests/energy_conserving_thermal_plasma/analysis.py @@ -20,6 +20,7 @@ sys.path.insert(1, '../../../../warpx/Regression/Checksum/') import checksumAPI + # this will be the name of the plot file fn = sys.argv[1] From f9743ba9f735f4e5fcb5f6748090962a8243aec5 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Thu, 22 Feb 2024 15:13:27 -0800 Subject: [PATCH 08/13] Update Examples/Tests/energy_conserving_thermal_plasma/analysis.py --- Examples/Tests/energy_conserving_thermal_plasma/analysis.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Examples/Tests/energy_conserving_thermal_plasma/analysis.py b/Examples/Tests/energy_conserving_thermal_plasma/analysis.py index 2caed9c4a04..aaa581f6f4b 100755 --- a/Examples/Tests/energy_conserving_thermal_plasma/analysis.py +++ b/Examples/Tests/energy_conserving_thermal_plasma/analysis.py @@ -16,7 +16,6 @@ import sys import numpy as np -import yt sys.path.insert(1, '../../../../warpx/Regression/Checksum/') import checksumAPI From 5ddb8b2b47af5951532a797fb9cb1b677ea5fc7c Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Fri, 23 Feb 2024 06:50:27 -0800 Subject: [PATCH 09/13] Update Regression/WarpX-tests.ini --- Regression/WarpX-tests.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Regression/WarpX-tests.ini b/Regression/WarpX-tests.ini index da21e3793e9..ee3751c2f85 100644 --- a/Regression/WarpX-tests.ini +++ b/Regression/WarpX-tests.ini @@ -4630,7 +4630,7 @@ analysisRoutine = Examples/Tests/Implicit/analysis_1d.py [EnergyConservingThermalPlasma] buildDir = . -inputFile = Examples/Tests/Implicit/inputs_2d_electrostatic +inputFile = Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic dim = 2 addToCompileString = cmakeSetupOpts = -DWarpX_DIMS=2 From a6515737c8c4c88b7705e1d824bee20815538dcc Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Fri, 23 Feb 2024 07:02:33 -0800 Subject: [PATCH 10/13] Fix automated test --- Examples/Tests/energy_conserving_thermal_plasma/analysis.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Examples/Tests/energy_conserving_thermal_plasma/analysis.py b/Examples/Tests/energy_conserving_thermal_plasma/analysis.py index aaa581f6f4b..43e9b6d9822 100755 --- a/Examples/Tests/energy_conserving_thermal_plasma/analysis.py +++ b/Examples/Tests/energy_conserving_thermal_plasma/analysis.py @@ -35,4 +35,4 @@ # Checksum test test_name = os.path.split(os.getcwd())[1] -checksumAPI.evaluate_checksum(test_name, fn, rtol=checksum_rtol) +checksumAPI.evaluate_checksum(test_name, fn) From 709d56c9990b20ef5649cdd0d5a093b021546a7f Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Fri, 23 Feb 2024 10:16:24 -0800 Subject: [PATCH 11/13] Update benchmarks --- .../EnergyConservingThermalPlasma.json | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Regression/Checksum/benchmarks_json/EnergyConservingThermalPlasma.json b/Regression/Checksum/benchmarks_json/EnergyConservingThermalPlasma.json index 91cf1225ce3..3451ac42a9f 100644 --- a/Regression/Checksum/benchmarks_json/EnergyConservingThermalPlasma.json +++ b/Regression/Checksum/benchmarks_json/EnergyConservingThermalPlasma.json @@ -1,29 +1,29 @@ { - "electrons": { - "particle_momentum_x": 7.261458159320679e-22, - "particle_momentum_y": 7.291814341196144e-22, - "particle_momentum_z": 7.597118915907896e-22, - "particle_position_x": 6.622192192980071e-06, - "particle_position_y": 6.725927457001655e-06, - "particle_weight": 2823958719279159.5 - }, "lev=0": { "Bx": 0.0, "By": 0.0, "Bz": 0.0, - "Ex": 15799365073529.691, + "Ex": 14828575131693.746, "Ey": 0.0, - "Ez": 15104394248696.58, - "jx": 5.334685437804499e+18, - "jy": 4.0836522633767813e+18, - "jz": 5.896189440230493e+18 + "Ez": 15137612614715.773, + "jx": 5.572707185530917e+18, + "jy": 7.091118076558307e+18, + "jz": 6.668532755465409e+18 }, "protons": { - "particle_momentum_x": 3.211480673491126e-20, - "particle_momentum_y": 3.410019236383268e-20, - "particle_momentum_z": 3.06565056891683e-20, - "particle_position_x": 6.802704662084178e-06, - "particle_position_y": 6.798505413146967e-06, + "particle_momentum_x": 3.187482462935171e-20, + "particle_momentum_y": 3.397549094666928e-20, + "particle_momentum_z": 3.300591612645518e-20, + "particle_position_x": 6.8052980975094785e-06, + "particle_position_y": 6.8011432612301085e-06, + "particle_weight": 2823958719279159.5 + }, + "electrons": { + "particle_momentum_x": 7.610483420803999e-22, + "particle_momentum_y": 8.024587481438078e-22, + "particle_momentum_z": 8.138108658606551e-22, + "particle_position_x": 6.8822971884226895e-06, + "particle_position_y": 6.8608357509110685e-06, "particle_weight": 2823958719279159.5 } } \ No newline at end of file From fd74826d23b484def5c9a3290e71abe7407b8b1b Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Tue, 27 Feb 2024 09:04:03 -0800 Subject: [PATCH 12/13] Apply suggestions from code review Co-authored-by: Luca Fedeli --- .../inputs_2d_electrostatic | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic b/Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic index ed77e7f01e6..8a83a9d9aac 100644 --- a/Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic +++ b/Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic @@ -15,7 +15,7 @@ warpx.use_filter = 0 ############ CONSTANTS ############# ################################# -my_constants.n0 = 1.e30 # plasma densirty, m^-3 +my_constants.n0 = 1.e30 # plasma density, m^-3 my_constants.Ti = 100. # ion temperature, eV my_constants.Te = 100. # electron temperature, eV my_constants.wpe = q_e*sqrt(n0/(m_e*epsilon0)) # electron plasma frequency, radians/s @@ -29,16 +29,14 @@ warpx.const_dt = dt geometry.dims = 2 geometry.prob_lo = 0.0 0.0 geometry.prob_hi = 10.*de0 10.*de0 -boundary.field_lo = periodic periodic -boundary.field_hi = periodic periodic -boundary.particle_lo = periodic periodic -boundary.particle_hi = periodic periodic ################################# -####### Boundary condition ###### +###### BOUNDARY CONDITIONS ###### ################################# boundary.field_lo = periodic periodic boundary.field_hi = periodic periodic +boundary.particle_lo = periodic periodic +boundary.particle_hi = periodic periodic ################################# ############ NUMERICS ########### From f6ab9638354ebe1e88bed3c1501985d20fc7ef41 Mon Sep 17 00:00:00 2001 From: Remi Lehe Date: Tue, 27 Feb 2024 09:11:24 -0800 Subject: [PATCH 13/13] Update input script --- .../inputs_2d_electrostatic | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic b/Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic index 8a83a9d9aac..dab1b77db50 100644 --- a/Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic +++ b/Examples/Tests/energy_conserving_thermal_plasma/inputs_2d_electrostatic @@ -14,7 +14,6 @@ warpx.use_filter = 0 ################################# ############ CONSTANTS ############# ################################# - my_constants.n0 = 1.e30 # plasma density, m^-3 my_constants.Ti = 100. # ion temperature, eV my_constants.Te = 100. # electron temperature, eV @@ -22,13 +21,15 @@ my_constants.wpe = q_e*sqrt(n0/(m_e*epsilon0)) # electron plasma frequency, rad my_constants.de0 = clight/wpe # skin depth, m my_constants.dt = ( 0.2 )/wpe # time step size, s warpx.const_dt = dt + ################################# ####### GENERAL PARAMETERS ###### ################################# - geometry.dims = 2 geometry.prob_lo = 0.0 0.0 geometry.prob_hi = 10.*de0 10.*de0 +warpx.serialize_initial_conditions = 1 +warpx.verbose = 1 ################################# ###### BOUNDARY CONDITIONS ###### @@ -38,12 +39,6 @@ boundary.field_hi = periodic periodic boundary.particle_lo = periodic periodic boundary.particle_hi = periodic periodic -################################# -############ NUMERICS ########### -################################# -warpx.serialize_initial_conditions = 1 -warpx.verbose = 1 - ################################# ############ PLASMA ############# #################################