diff options
author | 2022-03-10 13:21:32 -0800 | |
---|---|---|
committer | 2022-03-10 13:21:32 -0800 | |
commit | 96cefab7f9ad96159908f49bdf788ff8ad6f7ac3 (patch) | |
tree | ccb018ec45979b55e63e5f63a775360d36ed1eab /Source/Particles/Collision | |
parent | da837aaffd1d2fbce14a6bea4a3a38331a56df72 (diff) | |
download | WarpX-96cefab7f9ad96159908f49bdf788ff8ad6f7ac3.tar.gz WarpX-96cefab7f9ad96159908f49bdf788ff8ad6f7ac3.tar.zst WarpX-96cefab7f9ad96159908f49bdf788ff8ad6f7ac3.zip |
Clean up the use of ndt for collisions (#2944)
* Clean up the use of ndt for collisions
* Update BackgroundStopping to match changes
Diffstat (limited to 'Source/Particles/Collision')
8 files changed, 24 insertions, 28 deletions
diff --git a/Source/Particles/Collision/BackgroundMCC/BackgroundMCCCollision.H b/Source/Particles/Collision/BackgroundMCC/BackgroundMCCCollision.H index ff447c407..e4ad27d04 100644 --- a/Source/Particles/Collision/BackgroundMCC/BackgroundMCCCollision.H +++ b/Source/Particles/Collision/BackgroundMCC/BackgroundMCCCollision.H @@ -32,10 +32,11 @@ public: /** Perform the collisions * * @param cur_time Current time + * @param dt Time step size * @param mypc Container of species involved * */ - void doCollisions (amrex::Real cur_time, MultiParticleContainer* mypc) override; + void doCollisions (amrex::Real cur_time, amrex::Real dt, MultiParticleContainer* mypc) override; /** Perform particle conserving MCC collisions within a tile * diff --git a/Source/Particles/Collision/BackgroundMCC/BackgroundMCCCollision.cpp b/Source/Particles/Collision/BackgroundMCC/BackgroundMCCCollision.cpp index 615fb9418..a7cc00be5 100644 --- a/Source/Particles/Collision/BackgroundMCC/BackgroundMCCCollision.cpp +++ b/Source/Particles/Collision/BackgroundMCC/BackgroundMCCCollision.cpp @@ -181,14 +181,11 @@ BackgroundMCCCollision::get_nu_max(amrex::Vector<MCCProcess> const& mcc_processe } void -BackgroundMCCCollision::doCollisions (amrex::Real cur_time, MultiParticleContainer* mypc) +BackgroundMCCCollision::doCollisions (amrex::Real cur_time, amrex::Real dt, MultiParticleContainer* mypc) { WARPX_PROFILE("BackgroundMCCCollision::doCollisions()"); using namespace amrex::literals; - const amrex::Real dt = WarpX::GetInstance().getdt(0); - if ( int(std::floor(cur_time/dt)) % m_ndt != 0 ) return; - auto& species1 = mypc->GetParticleContainerFromName(m_species_names[0]); // this is a very ugly hack to have species2 be a reference and be // defined in the scope of doCollisions @@ -205,7 +202,7 @@ BackgroundMCCCollision::doCollisions (amrex::Real cur_time, MultiParticleContain m_nu_max = get_nu_max(m_scattering_processes); // calculate total collision probability - auto coll_n = m_nu_max * m_ndt * dt; + auto coll_n = m_nu_max * dt; m_total_collision_prob = 1.0_rt - std::exp(-coll_n); // dt has to be small enough that a linear expansion of the collision @@ -220,7 +217,7 @@ BackgroundMCCCollision::doCollisions (amrex::Real cur_time, MultiParticleContain m_nu_max_ioniz = get_nu_max(m_ionization_processes); // calculate total ionization probability - auto coll_n_ioniz = m_nu_max_ioniz * m_ndt * dt; + auto coll_n_ioniz = m_nu_max_ioniz * dt; m_total_collision_prob_ioniz = 1.0_rt - std::exp(-coll_n_ioniz); WARPX_ALWAYS_ASSERT_WITH_MESSAGE(coll_n_ioniz < 0.1_rt, diff --git a/Source/Particles/Collision/BackgroundStopping/BackgroundStopping.H b/Source/Particles/Collision/BackgroundStopping/BackgroundStopping.H index 698943918..56538102f 100644 --- a/Source/Particles/Collision/BackgroundStopping/BackgroundStopping.H +++ b/Source/Particles/Collision/BackgroundStopping/BackgroundStopping.H @@ -31,10 +31,11 @@ public: /** Perform the stopping calculation * * @param cur_time Current time + * @param dt Time step size * @param mypc Container of species involved * */ - void doCollisions (amrex::Real cur_time, MultiParticleContainer* mypc) override; + void doCollisions (amrex::Real cur_time, amrex::Real dt, MultiParticleContainer* mypc) override; /** Perform the stopping calculation within a tile for stopping on electrons * diff --git a/Source/Particles/Collision/BackgroundStopping/BackgroundStopping.cpp b/Source/Particles/Collision/BackgroundStopping/BackgroundStopping.cpp index dd51a3d0d..a970c490f 100644 --- a/Source/Particles/Collision/BackgroundStopping/BackgroundStopping.cpp +++ b/Source/Particles/Collision/BackgroundStopping/BackgroundStopping.cpp @@ -75,16 +75,11 @@ BackgroundStopping::BackgroundStopping (std::string const collision_name) } void -BackgroundStopping::doCollisions (amrex::Real cur_time, MultiParticleContainer* mypc) +BackgroundStopping::doCollisions (amrex::Real cur_time, amrex::Real dt, MultiParticleContainer* mypc) { WARPX_PROFILE("BackgroundStopping::doCollisions()"); using namespace amrex::literals; - // Note that the lowest level time step is used for all levels since the - // collision operation will be done only once per step at the lowest level. - const amrex::Real dt = WarpX::GetInstance().getdt(0) * m_ndt; - if (int(std::floor(cur_time/dt)) % m_ndt != 0) return; - auto& species = mypc->GetParticleContainerFromName(m_species_names[0]); amrex::Real species_mass = species.getMass(); amrex::Real species_charge = species.getCharge(); diff --git a/Source/Particles/Collision/BinaryCollision/BinaryCollision.H b/Source/Particles/Collision/BinaryCollision/BinaryCollision.H index 217547cf9..fd33c0ff4 100644 --- a/Source/Particles/Collision/BinaryCollision/BinaryCollision.H +++ b/Source/Particles/Collision/BinaryCollision/BinaryCollision.H @@ -107,13 +107,12 @@ public: /** Perform the collisions * * @param cur_time Current time + * @param dt Time step size * @param mypc Container of species involved * */ - void doCollisions (amrex::Real cur_time, MultiParticleContainer* mypc) override + void doCollisions (amrex::Real /*cur_time*/, amrex::Real dt, MultiParticleContainer* mypc) override { - const amrex::Real dt = WarpX::GetInstance().getdt(0); - if ( int(std::floor(cur_time/dt)) % m_ndt != 0 ) return; auto& species1 = mypc->GetParticleContainerFromName(m_species_names[0]); auto& species2 = mypc->GetParticleContainerFromName(m_species_names[1]); @@ -178,7 +177,7 @@ public: } amrex::Real wt = amrex::second(); - doCollisionsWithinTile( lev, mfi, species1, species2, product_species_vector, + doCollisionsWithinTile( dt, lev, mfi, species1, species2, product_species_vector, copy_species1_data, copy_species2_data); if (cost && WarpX::load_balance_costs_update_algo == LoadBalanceCostsUpdateAlgo::Timers) @@ -203,7 +202,7 @@ public: * */ void doCollisionsWithinTile ( - int const lev, amrex::MFIter const& mfi, + amrex::Real dt, int const lev, amrex::MFIter const& mfi, WarpXParticleContainer& species_1, WarpXParticleContainer& species_2, amrex::Vector<WarpXParticleContainer*> product_species_vector, @@ -212,7 +211,6 @@ public: using namespace ParticleUtils; using namespace amrex::literals; - int const ndt = m_ndt; CollisionFunctorType binary_collision_functor = m_binary_collision_functor; const bool have_product_species = m_have_product_species; @@ -255,7 +253,6 @@ public: ParticleType * AMREX_RESTRICT particle_ptr_1 = ptile_1.GetArrayOfStructs()().data(); - const amrex::Real dt = WarpX::GetInstance().getdt(lev); amrex::Geometry const& geom = WarpX::GetInstance().Geom(lev); #if defined WARPX_DIM_1D_Z auto dV = geom.CellSize(0); @@ -350,7 +347,7 @@ public: cell_half_1, cell_stop_1, indices_1, indices_1, soa_1, soa_1, get_position_1, get_position_1, - q1, q1, m1, m1, dt*ndt, dV, + q1, q1, m1, m1, dt, dV, cell_start_pair, p_mask, p_pair_indices_1, p_pair_indices_2, p_pair_reaction_weight, engine ); } @@ -406,7 +403,6 @@ public: ParticleType * AMREX_RESTRICT particle_ptr_2 = ptile_2.GetArrayOfStructs()().data(); - const amrex::Real dt = WarpX::GetInstance().getdt(lev); amrex::Geometry const& geom = WarpX::GetInstance().Geom(lev); #if defined WARPX_DIM_1D_Z auto dV = geom.CellSize(0); @@ -511,7 +507,7 @@ public: cell_start_1, cell_stop_1, cell_start_2, cell_stop_2, indices_1, indices_2, soa_1, soa_2, get_position_1, get_position_2, - q1, q2, m1, m2, dt*ndt, dV, + q1, q2, m1, m2, dt, dV, cell_start_pair, p_mask, p_pair_indices_1, p_pair_indices_2, p_pair_reaction_weight, engine ); } diff --git a/Source/Particles/Collision/CollisionBase.H b/Source/Particles/Collision/CollisionBase.H index 3d79857e0..517f5e414 100644 --- a/Source/Particles/Collision/CollisionBase.H +++ b/Source/Particles/Collision/CollisionBase.H @@ -20,13 +20,16 @@ public: CollisionBase (std::string collision_name); - virtual void doCollisions (amrex::Real /*cur_time*/, MultiParticleContainer* /*mypc*/ ){} + virtual void doCollisions (amrex::Real /*cur_time*/, amrex::Real /*dt*/, MultiParticleContainer* /*mypc*/ ){} CollisionBase(CollisionBase const &) = delete; CollisionBase(CollisionBase &&) = delete; CollisionBase & operator=(CollisionBase const &) = delete; virtual ~CollisionBase() = default; + + int get_ndt() {return m_ndt;} + protected: amrex::Vector<std::string> m_species_names; diff --git a/Source/Particles/Collision/CollisionHandler.H b/Source/Particles/Collision/CollisionHandler.H index 41a7a0696..7adc15dec 100644 --- a/Source/Particles/Collision/CollisionHandler.H +++ b/Source/Particles/Collision/CollisionHandler.H @@ -26,7 +26,7 @@ public: CollisionHandler (MultiParticleContainer const * const mypc); /* Perform all of the collisions */ - void doCollisions (amrex::Real cur_time, MultiParticleContainer* mypc); + void doCollisions (amrex::Real cur_time, amrex::Real dt, MultiParticleContainer* mypc); private: diff --git a/Source/Particles/Collision/CollisionHandler.cpp b/Source/Particles/Collision/CollisionHandler.cpp index 0c5304823..cc8d8eb4a 100644 --- a/Source/Particles/Collision/CollisionHandler.cpp +++ b/Source/Particles/Collision/CollisionHandler.cpp @@ -71,11 +71,14 @@ CollisionHandler::CollisionHandler(MultiParticleContainer const * const mypc) * @param mypc MultiParticleContainer calling this method * */ -void CollisionHandler::doCollisions ( amrex::Real cur_time, MultiParticleContainer* mypc) +void CollisionHandler::doCollisions ( amrex::Real cur_time, amrex::Real dt, MultiParticleContainer* mypc) { for (auto& collision : allcollisions) { - collision->doCollisions(cur_time, mypc); + int const ndt = collision->get_ndt(); + if ( int(std::floor(cur_time/dt)) % ndt == 0 ) { + collision->doCollisions(cur_time, dt*ndt, mypc); + } } } |