diff options
29 files changed, 73 insertions, 22 deletions
diff --git a/Docs/source/usage/parameters.rst b/Docs/source/usage/parameters.rst index 80e012c5d..024f6e35e 100644 --- a/Docs/source/usage/parameters.rst +++ b/Docs/source/usage/parameters.rst @@ -1156,11 +1156,15 @@ Numerics and algorithms and the Courant-Friedrichs-Lewy (CFL) limit. (e.g. for `warpx.cfl=1`, the timestep will be exactly equal to the CFL limit.) -* ``warpx.use_filter`` (`0 or 1`) - Whether to smooth the charge and currents on the mesh, after depositing - them from the macroparticles. This uses a bilinear filter - (see the :ref:`filtering section <theory-pic-filter>`). - When using the RZ spectral solver, the filtering is done in k-space. +* ``warpx.use_filter`` (`0` or `1`; default: `1`, except for RZ FDTD) + Whether to smooth the charge and currents on the mesh, after depositing them from the macro-particles. + This uses a bilinear filter (see the :ref:`filtering section <theory-pic-filter>`). + The default is `1` in all cases, except for simulations in RZ geometry using the FDTD solver. + With the RZ PSATD solver, the filtering is done in :math:`k`-space. + + .. warning:: + + Known bug: filter currently not working with FDTD solver in RZ geometry (see https://github.com/ECP-WarpX/WarpX/issues/1943). * ``warpx.filter_npass_each_dir`` (`3 int`) optional (default `1 1 1`) Number of passes along each direction for the bilinear filter. diff --git a/Examples/Modules/RigidInjection/inputs_2d_LabFrame b/Examples/Modules/RigidInjection/inputs_2d_LabFrame index be71eb81b..a444b9954 100644 --- a/Examples/Modules/RigidInjection/inputs_2d_LabFrame +++ b/Examples/Modules/RigidInjection/inputs_2d_LabFrame @@ -13,6 +13,7 @@ warpx.do_moving_window = 1 warpx.moving_window_dir = z warpx.moving_window_v = 1.0 # in units of the speed of light warpx.serialize_ics = 1 +warpx.use_filter = 0 # Order of particle shape factors algo.particle_shape = 1 diff --git a/Examples/Modules/dive_cleaning/inputs_3d b/Examples/Modules/dive_cleaning/inputs_3d index 173e8e468..92b34539a 100644 --- a/Examples/Modules/dive_cleaning/inputs_3d +++ b/Examples/Modules/dive_cleaning/inputs_3d @@ -10,6 +10,7 @@ geometry.prob_hi = 50.e-6 50.e-6 50.e-6 warpx.do_dive_cleaning = 1 warpx.do_pml = 1 +warpx.use_filter = 0 # Order of particle shape factors algo.particle_shape = 1 diff --git a/Examples/Modules/gaussian_beam/PICMI_inputs_gaussian_beam.py b/Examples/Modules/gaussian_beam/PICMI_inputs_gaussian_beam.py index d4b5369c7..4d3e00687 100644 --- a/Examples/Modules/gaussian_beam/PICMI_inputs_gaussian_beam.py +++ b/Examples/Modules/gaussian_beam/PICMI_inputs_gaussian_beam.py @@ -60,7 +60,8 @@ part_diag1 = picmi.ParticleDiagnostic(name = 'diag1', sim = picmi.Simulation(solver = solver, max_steps = 10, verbose = 1, - warpx_current_deposition_algo = 'direct') + warpx_current_deposition_algo = 'direct', + warpx_use_filter = 0) sim.add_species(electrons, layout=picmi.PseudoRandomLayout(n_macroparticles=number_sim_particles)) sim.add_species(protons, layout=picmi.PseudoRandomLayout(n_macroparticles=number_sim_particles)) diff --git a/Examples/Modules/ionization/inputs_2d_bf_rt b/Examples/Modules/ionization/inputs_2d_bf_rt index e29022889..f1572da10 100644 --- a/Examples/Modules/ionization/inputs_2d_bf_rt +++ b/Examples/Modules/ionization/inputs_2d_bf_rt @@ -16,6 +16,7 @@ warpx.moving_window_dir = z warpx.moving_window_v = 1.0 warpx.gamma_boost = 2. warpx.boost_direction = z +warpx.use_filter = 0 # Order of particle shape factors algo.particle_shape = 1 diff --git a/Examples/Modules/ionization/inputs_2d_rt b/Examples/Modules/ionization/inputs_2d_rt index 8244093c8..60402eae9 100644 --- a/Examples/Modules/ionization/inputs_2d_rt +++ b/Examples/Modules/ionization/inputs_2d_rt @@ -11,6 +11,7 @@ amr.max_level = 0 algo.maxwell_solver = ckc warpx.do_pml = 1 warpx.cfl = .999 +warpx.use_filter = 0 # Order of particle shape factors algo.particle_shape = 1 diff --git a/Examples/Modules/laser_injection/inputs_2d_rt b/Examples/Modules/laser_injection/inputs_2d_rt index 714409e17..294d0f15d 100644 --- a/Examples/Modules/laser_injection/inputs_2d_rt +++ b/Examples/Modules/laser_injection/inputs_2d_rt @@ -24,6 +24,7 @@ warpx.verbose = 1 # Algorithms algo.current_deposition = esirkepov +warpx.use_filter = 0 # CFL warpx.cfl = 1.0 diff --git a/Examples/Modules/laser_injection/inputs_3d_rt b/Examples/Modules/laser_injection/inputs_3d_rt index f3612079b..d2c9ee17a 100644 --- a/Examples/Modules/laser_injection/inputs_3d_rt +++ b/Examples/Modules/laser_injection/inputs_3d_rt @@ -24,6 +24,7 @@ warpx.verbose = 1 # Algorithms warpx.do_pml = 0 +warpx.use_filter = 0 # CFL warpx.cfl = 1.0 diff --git a/Examples/Modules/qed/schwinger/inputs_3d_schwinger b/Examples/Modules/qed/schwinger/inputs_3d_schwinger index aaa53af9b..fb1b98286 100644 --- a/Examples/Modules/qed/schwinger/inputs_3d_schwinger +++ b/Examples/Modules/qed/schwinger/inputs_3d_schwinger @@ -22,6 +22,7 @@ warpx.verbose = 1 warpx.cfl = 1. # if 1., the time step is set to its CFL limit warpx.do_pml = 0 # use Perfectly Matched Layer as boundary condition warpx.serialize_ics = 1 +warpx.use_filter = 0 # Order of particle shape factors algo.particle_shape = 1 diff --git a/Examples/Physics_applications/laser_acceleration/PICMI_inputs_laser_acceleration.py b/Examples/Physics_applications/laser_acceleration/PICMI_inputs_laser_acceleration.py index 089d51ff5..903c4f9c4 100755 --- a/Examples/Physics_applications/laser_acceleration/PICMI_inputs_laser_acceleration.py +++ b/Examples/Physics_applications/laser_acceleration/PICMI_inputs_laser_acceleration.py @@ -123,7 +123,8 @@ part_diag1 = picmi.ParticleDiagnostic(name = 'diag1', sim = picmi.Simulation(solver = solver, max_steps = max_steps, verbose = 1, - warpx_current_deposition_algo = 'esirkepov') + warpx_current_deposition_algo = 'esirkepov', + warpx_use_filter = 0) sim.add_species(electrons, layout=picmi.GriddedLayout(grid=grid, n_macroparticle_per_cell=number_per_cell_each_dim)) diff --git a/Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration.py b/Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration.py index adb795322..33b93c890 100644 --- a/Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration.py +++ b/Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration.py @@ -48,7 +48,8 @@ plasma = picmi.Species(particle_type='electron', name='plasma', initial_distribu sim = picmi.Simulation(solver = solver, max_steps = max_steps, verbose = 1, - warpx_current_deposition_algo = 'esirkepov') + warpx_current_deposition_algo = 'esirkepov', + warpx_use_filter = 0) sim.add_species(beam, layout=picmi.GriddedLayout(grid=grid, n_macroparticle_per_cell=number_per_cell_each_dim)) sim.add_species(plasma, layout=picmi.GriddedLayout(grid=grid, n_macroparticle_per_cell=number_per_cell_each_dim)) diff --git a/Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration_mr.py b/Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration_mr.py index a26416dbc..8ea29032d 100644 --- a/Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration_mr.py +++ b/Examples/Physics_applications/plasma_acceleration/PICMI_inputs_plasma_acceleration_mr.py @@ -54,7 +54,8 @@ plasma = picmi.Species(particle_type='electron', name='plasma', initial_distribu sim = picmi.Simulation(solver = solver, max_steps = 2, verbose = 1, - warpx_current_deposition_algo = 'esirkepov') + warpx_current_deposition_algo = 'esirkepov', + warpx_use_filter = 0) sim.add_species(beam, layout=picmi.GriddedLayout(grid=grid, n_macroparticle_per_cell=number_per_cell_each_dim)) sim.add_species(plasma, layout=picmi.GriddedLayout(grid=grid, n_macroparticle_per_cell=number_per_cell_each_dim)) diff --git a/Examples/Physics_applications/uniform_plasma/inputs_2d b/Examples/Physics_applications/uniform_plasma/inputs_2d index 7988df031..a3bd0d3a8 100644 --- a/Examples/Physics_applications/uniform_plasma/inputs_2d +++ b/Examples/Physics_applications/uniform_plasma/inputs_2d @@ -17,6 +17,7 @@ geometry.prob_hi = 20.e-6 20.e-6 warpx.serialize_ics = 1 warpx.verbose = 1 warpx.cfl = 1.0 +warpx.use_filter = 0 # Order of particle shape factors algo.particle_shape = 1 diff --git a/Examples/Tests/ElectrostaticDirichletBC/inputs_2d b/Examples/Tests/ElectrostaticDirichletBC/inputs_2d index 43705a527..7057c9258 100644 --- a/Examples/Tests/ElectrostaticDirichletBC/inputs_2d +++ b/Examples/Tests/ElectrostaticDirichletBC/inputs_2d @@ -3,6 +3,7 @@ warpx.verbose = 0 warpx.const_dt = 7.5e-10 warpx.do_electrostatic = labframe warpx.self_fields_required_precision = 1e-06 +warpx.use_filter = 0 amr.n_cell = 64 8 amr.max_grid_size = 32 amr.max_level = 0 diff --git a/Examples/Tests/ElectrostaticSphere/inputs_rz b/Examples/Tests/ElectrostaticSphere/inputs_rz index d9c8feca6..6634fa3f5 100644 --- a/Examples/Tests/ElectrostaticSphere/inputs_rz +++ b/Examples/Tests/ElectrostaticSphere/inputs_rz @@ -10,6 +10,7 @@ geometry.prob_hi = 0.5 0.5 warpx.do_pml = 0 warpx.const_dt = 1e-6 warpx.do_electrostatic = labframe +warpx.use_filter = 0 particles.species_names = electron diff --git a/Examples/Tests/Langmuir/PICMI_inputs_langmuir2d.py b/Examples/Tests/Langmuir/PICMI_inputs_langmuir2d.py index 5f81ab33c..a8b1c5ef2 100644 --- a/Examples/Tests/Langmuir/PICMI_inputs_langmuir2d.py +++ b/Examples/Tests/Langmuir/PICMI_inputs_langmuir2d.py @@ -79,7 +79,8 @@ part_diag1 = picmi.ParticleDiagnostic(name = 'diag1', sim = picmi.Simulation(solver = solver, max_steps = max_steps, verbose = 1, - warpx_current_deposition_algo = 'direct') + warpx_current_deposition_algo = 'direct', + warpx_use_filter = 0) sim.add_species(electrons, layout = picmi.GriddedLayout(n_macroparticle_per_cell=number_per_cell_each_dim, grid=grid)) diff --git a/Examples/Tests/Langmuir/PICMI_inputs_langmuir_rz_multimode_analyze.py b/Examples/Tests/Langmuir/PICMI_inputs_langmuir_rz_multimode_analyze.py index 112862ce6..16a3f0575 100644 --- a/Examples/Tests/Langmuir/PICMI_inputs_langmuir_rz_multimode_analyze.py +++ b/Examples/Tests/Langmuir/PICMI_inputs_langmuir_rz_multimode_analyze.py @@ -118,7 +118,8 @@ sim = picmi.Simulation(solver = solver, verbose = 1, warpx_current_deposition_algo = 'esirkepov', warpx_field_gathering_algo = 'energy-conserving', - warpx_particle_pusher_algo = 'boris') + warpx_particle_pusher_algo = 'boris', + warpx_use_filter = 0) sim.add_species(electrons, layout=picmi.GriddedLayout(n_macroparticle_per_cell=[2,16,2], grid=grid)) sim.add_species(protons, layout=picmi.GriddedLayout(n_macroparticle_per_cell=[2,16,2], grid=grid)) diff --git a/Examples/Tests/Langmuir/inputs_2d_multi_rt b/Examples/Tests/Langmuir/inputs_2d_multi_rt index 91eb0c345..35b8c9fac 100644 --- a/Examples/Tests/Langmuir/inputs_2d_multi_rt +++ b/Examples/Tests/Langmuir/inputs_2d_multi_rt @@ -25,6 +25,7 @@ warpx.verbose = 1 # Algorithms algo.field_gathering = energy-conserving warpx.do_pml = 0 +warpx.use_filter = 0 # Order of particle shape factors algo.particle_shape = 1 diff --git a/Examples/Tests/Langmuir/inputs_2d_multi_rz_rt b/Examples/Tests/Langmuir/inputs_2d_multi_rz_rt index 78e0a3694..f133cdcb7 100644 --- a/Examples/Tests/Langmuir/inputs_2d_multi_rz_rt +++ b/Examples/Tests/Langmuir/inputs_2d_multi_rz_rt @@ -27,6 +27,7 @@ warpx.verbose = 1 warpx.do_pml = 0 algo.field_gathering = energy-conserving algo.current_deposition = esirkepov +warpx.use_filter = 0 # Order of particle shape factors algo.particle_shape = 1 diff --git a/Examples/Tests/Langmuir/inputs_3d_multi_rt b/Examples/Tests/Langmuir/inputs_3d_multi_rt index 16bceeb43..4d08a2a43 100644 --- a/Examples/Tests/Langmuir/inputs_3d_multi_rt +++ b/Examples/Tests/Langmuir/inputs_3d_multi_rt @@ -26,6 +26,7 @@ warpx.verbose = 1 algo.current_deposition = esirkepov algo.field_gathering = energy-conserving warpx.do_pml = 0 +warpx.use_filter = 0 # Order of particle shape factors algo.particle_shape = 1 diff --git a/Examples/Tests/Larmor/inputs_2d_mr b/Examples/Tests/Larmor/inputs_2d_mr index 9fa5157a9..7431180d6 100644 --- a/Examples/Tests/Larmor/inputs_2d_mr +++ b/Examples/Tests/Larmor/inputs_2d_mr @@ -34,6 +34,7 @@ particles.B_external_particle = 0.0 0.00078110417851950768 0.0 warpx.verbose = 1 # Algorithms +warpx.use_filter = 0 # CFL warpx.cfl = 1.0 diff --git a/Examples/Tests/PML/inputs_2d b/Examples/Tests/PML/inputs_2d index d4d84f7aa..3284e98fd 100644 --- a/Examples/Tests/PML/inputs_2d +++ b/Examples/Tests/PML/inputs_2d @@ -21,9 +21,9 @@ geometry.prob_hi = 30.e-6 120.e-6 warpx.verbose = 1 # Algorithms - warpx.cfl = 1.0 warpx.do_pml = 1 +warpx.use_filter = 0 warpx.do_moving_window = 0 # warpx.moving_window_dir = z diff --git a/Examples/Tests/SilverMueller/inputs_2d_x b/Examples/Tests/SilverMueller/inputs_2d_x index 431315421..708fcd0fe 100644 --- a/Examples/Tests/SilverMueller/inputs_2d_x +++ b/Examples/Tests/SilverMueller/inputs_2d_x @@ -21,10 +21,10 @@ geometry.prob_hi = 20.e-6 40.e-6 warpx.verbose = 1 # Algorithms - warpx.cfl = 1.0 warpx.do_pml = 0 warpx.do_silver_mueller = 1 +warpx.use_filter = 0 warpx.do_moving_window = 0 # warpx.moving_window_dir = z diff --git a/Examples/Tests/SilverMueller/inputs_2d_z b/Examples/Tests/SilverMueller/inputs_2d_z index 266423ad7..e14f35ecf 100644 --- a/Examples/Tests/SilverMueller/inputs_2d_z +++ b/Examples/Tests/SilverMueller/inputs_2d_z @@ -21,10 +21,10 @@ geometry.prob_hi = 40.e-6 20.e-6 warpx.verbose = 1 # Algorithms - warpx.cfl = 1.0 warpx.do_pml = 0 warpx.do_silver_mueller = 1 +warpx.use_filter = 0 warpx.do_moving_window = 0 # warpx.moving_window_dir = z diff --git a/Examples/Tests/SilverMueller/inputs_rz_z b/Examples/Tests/SilverMueller/inputs_rz_z index ccb10d528..1b4e846b0 100644 --- a/Examples/Tests/SilverMueller/inputs_rz_z +++ b/Examples/Tests/SilverMueller/inputs_rz_z @@ -22,10 +22,10 @@ warpx.verbose = 1 warpx.n_rz_azimuthal_modes = 2 # Algorithms - warpx.cfl = 1.0 warpx.do_pml = 0 warpx.do_silver_mueller = 1 +warpx.use_filter = 0 warpx.do_moving_window = 0 diff --git a/Examples/Tests/initial_distribution/inputs b/Examples/Tests/initial_distribution/inputs index 50999b3ea..cb12f251f 100644 --- a/Examples/Tests/initial_distribution/inputs +++ b/Examples/Tests/initial_distribution/inputs @@ -17,6 +17,7 @@ warpx.do_pml = 0 ################################# warpx.verbose = 1 warpx.cfl = 1.e-8 +warpx.use_filter = 0 # Order of particle shape factors algo.particle_shape = 1 diff --git a/Examples/Tests/laser_on_fine/inputs_2d b/Examples/Tests/laser_on_fine/inputs_2d index b8ae4e2d2..e973c126e 100644 --- a/Examples/Tests/laser_on_fine/inputs_2d +++ b/Examples/Tests/laser_on_fine/inputs_2d @@ -34,6 +34,7 @@ warpx.verbose = 1 algo.current_deposition = esirkepov algo.charge_deposition = standard algo.field_gathering = energy-conserving +warpx.use_filter = 0 # CFL warpx.cfl = 1.0 diff --git a/Source/Diagnostics/ComputeDiagFunctors/RhoFunctor.cpp b/Source/Diagnostics/ComputeDiagFunctors/RhoFunctor.cpp index e8d7828cb..26d99f4a9 100644 --- a/Source/Diagnostics/ComputeDiagFunctors/RhoFunctor.cpp +++ b/Source/Diagnostics/ComputeDiagFunctors/RhoFunctor.cpp @@ -4,6 +4,7 @@ #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD) #include "FieldSolver/SpectralSolver/SpectralFieldData.H" #include "FieldSolver/SpectralSolver/SpectralSolverRZ.H" + #include "Utils/WarpXAlgorithmSelection.H" #endif #include "Particles/MultiParticleContainer.H" #include "Particles/WarpXParticleContainer.H" @@ -54,11 +55,15 @@ RhoFunctor::operator() ( amrex::MultiFab& mf_dst, const int dcomp, const int /*i #if (defined WARPX_DIM_RZ) && (defined WARPX_USE_PSATD) using IdxAvg = SpectralFieldIndexTimeAveraging; - if (WarpX::use_kspace_filter) { - auto & solver = warpx.get_spectral_solver_fp(m_lev); - solver.ForwardTransform(m_lev, *rho, IdxAvg::rho_new); - solver.ApplyFilter(IdxAvg::rho_new); - solver.BackwardTransform(m_lev, *rho, IdxAvg::rho_new); + // Apply k-space filtering when using the PSATD solver + if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) + { + if (WarpX::use_kspace_filter) { + auto & solver = warpx.get_spectral_solver_fp(m_lev); + solver.ForwardTransform(m_lev, *rho, IdxAvg::rho_new); + solver.ApplyFilter(IdxAvg::rho_new); + solver.BackwardTransform(m_lev, *rho, IdxAvg::rho_new); + } } #endif diff --git a/Source/WarpX.cpp b/Source/WarpX.cpp index 927feb900..21cc5e4db 100644 --- a/Source/WarpX.cpp +++ b/Source/WarpX.cpp @@ -142,8 +142,8 @@ int WarpX::current_centering_noz = 2; bool WarpX::use_fdtd_nci_corr = false; bool WarpX::galerkin_interpolation = true; -bool WarpX::use_filter = false; -bool WarpX::use_kspace_filter = false; +bool WarpX::use_filter = true; +bool WarpX::use_kspace_filter = true; bool WarpX::use_filter_compensation = false; bool WarpX::serialize_ics = false; @@ -556,6 +556,12 @@ WarpX::ReadParameters () pp_warpx.query("n_buffer", n_buffer); pp_warpx.query("const_dt", const_dt); + // Filter currently not working with FDTD solver in RZ geometry: turn OFF by default + // (see https://github.com/ECP-WarpX/WarpX/issues/1943) +#ifdef WARPX_DIM_RZ + if (WarpX::maxwell_solver_id != MaxwellSolverAlgo::PSATD) WarpX::use_filter = false; +#endif + // Read filter and fill IntVect filter_npass_each_dir with // proper size for AMREX_SPACEDIM pp_warpx.query("use_filter", use_filter); @@ -568,12 +574,26 @@ WarpX::ReadParameters () filter_npass_each_dir[2] = parse_filter_npass_each_dir[2]; #endif + // TODO When k-space filtering will be implemented also for Cartesian geometries, + // this code block will have to be applied in all cases (remove #ifdef condition) #ifdef WARPX_DIM_RZ if (WarpX::maxwell_solver_id == MaxwellSolverAlgo::PSATD) { // With RZ spectral, only use k-space filtering use_kspace_filter = use_filter; use_filter = false; } + else // FDTD + { + // Filter currently not working with FDTD solver in RZ geometry + // (see https://github.com/ECP-WarpX/WarpX/issues/1943) + if (use_filter) + { + amrex::Print() << "\nWARNING:" + << "\nFilter currently not working with FDTD solver in RZ geometry:" + << "\nwe recommend setting warpx.use_filter = 0 in the input file.\n" + << std::endl; + } + } #endif pp_warpx.query("num_mirrors", num_mirrors); |