44
55#include " OutputFieldsDefault.h"
66#include " psc_config.hxx"
7+ #include " include/boundary_injector.hxx"
78#include " input_params.hxx"
89#include " kg/include/kg/VecRange.hxx"
910
@@ -169,12 +170,13 @@ Grid_t* setupGrid()
169170 {0 , 0 , 0 }, // location of lower corner
170171 {n_patches_x, y_mult * n_patches_y, n_patches_z}}; // n patches
171172
172- auto BND_FLD_Y = mirror_domain ? BND_FLD_PERIODIC : BND_FLD_CONDUCTING_WALL ;
173- auto BND_PRT_Y = mirror_domain ? BND_PRT_PERIODIC : BND_PRT_REFLECTING ;
174- auto bc = psc::grid::BC {{BND_FLD_PERIODIC , BND_FLD_Y , BND_FLD_PERIODIC },
175- {BND_FLD_PERIODIC , BND_FLD_Y , BND_FLD_PERIODIC },
176- {BND_PRT_PERIODIC , BND_PRT_Y , BND_PRT_PERIODIC },
177- {BND_PRT_PERIODIC , BND_PRT_Y , BND_PRT_PERIODIC }};
173+ auto BND_FLD_Y_UPPER = mirror_domain ? BND_FLD_OPEN : BND_FLD_CONDUCTING_WALL ;
174+ auto BND_PRT_Y_UPPER = mirror_domain ? BND_PRT_OPEN : BND_PRT_REFLECTING ;
175+ auto bc =
176+ psc::grid::BC {{BND_FLD_PERIODIC , BND_FLD_OPEN , BND_FLD_PERIODIC },
177+ {BND_FLD_PERIODIC , BND_FLD_Y_UPPER , BND_FLD_PERIODIC },
178+ {BND_PRT_PERIODIC , BND_PRT_OPEN , BND_PRT_PERIODIC },
179+ {BND_PRT_PERIODIC , BND_PRT_Y_UPPER , BND_PRT_PERIODIC }};
178180
179181 auto kinds = Grid_t::Kinds (NR_KINDS );
180182 kinds[KIND_ELECTRON ] = {-1.0 , electron_mass, " e" };
@@ -200,6 +202,7 @@ void initializeParticles(Balance& balance, Grid_t*& grid_ptr, Mparticles& mprts)
200202{
201203 SetupParticles<Mparticles> setup_particles (*grid_ptr);
202204 setup_particles.centerer = centering::Centerer (centering::CC );
205+ setup_particles.random_offsets = true ;
203206 setup_particles.initial_momentum_gamma_correction = true ;
204207
205208 auto init_np = [&](int kind, Double3 crd, int p, Int3 idx,
@@ -727,6 +730,22 @@ static void run(int argc, char** argv)
727730 int oute_interval = -100 ;
728731 DiagEnergies<Mparticles, MfieldsState> oute{grid.comm (), oute_interval};
729732
733+ auto ion_injector =
734+ BoundaryInjector<ParticleGeneratorMaxwellian, PscConfig::PushParticles>(
735+ ParticleGeneratorMaxwellian (
736+ KIND_ION , grid.kinds [KIND_ION ],
737+ {v_upstream_x, v_upstream_y, v_upstream_z},
738+ {ion_temperature, ion_temperature, ion_temperature}, true ),
739+ grid);
740+ auto electron_injector =
741+ BoundaryInjector<ParticleGeneratorMaxwellian, PscConfig::PushParticles>(
742+ ParticleGeneratorMaxwellian (
743+ KIND_ELECTRON , grid.kinds [KIND_ELECTRON ],
744+ {v_upstream_x, v_upstream_y, v_upstream_z},
745+ {electron_temperature, electron_temperature, electron_temperature},
746+ true ),
747+ grid);
748+
730749 // ----------------------------------------------------------------------
731750 // set up initial conditions
732751
@@ -741,10 +760,18 @@ static void run(int argc, char** argv)
741760
742761 psc.add_gauss_corrector (&marder);
743762
763+ double gamma = 1 / sqrt (1 - sqr (v_upstream_y));
764+ psc.bndf .background_e =
765+ -gamma * Double3{0 , v_upstream_y, 0 }.cross ({b_x, b_y, b_z});
766+ psc.bndf .background_h = {b_x * gamma, b_y, b_z * gamma};
767+
744768 psc.add_diagnostic (&outf);
745769 psc.add_diagnostic (&outp);
746770 psc.add_diagnostic (&oute);
747771
772+ psc.add_injector (&ion_injector);
773+ psc.add_injector (&electron_injector);
774+
748775 psc.integrate ();
749776}
750777
0 commit comments