Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/Hipace.H
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "utils/MultiBuffer.H"
#include "diagnostics/Diagnostic.H"
#include "diagnostics/OpenPMDWriter.H"
#include "particles/collisions/Collision.H"

#include <AMReX_AmrCore.H>
#ifdef AMREX_USE_LINEAR_SOLVERS
Expand Down Expand Up @@ -360,6 +361,9 @@ private:
/** Vector of binary collisions */
amrex::Vector< CoulombCollision > m_all_collisions;

amrex::Vector<std::string> m_collision_names2;
amrex::Vector<Collision> m_all_collisions2;

void InitDiagnostics (const int step, const amrex::Real time, const bool is_last_step);
void FillFieldDiagnostics (const int current_N_level, int islice);
void FillBeamDiagnostics (const int step, const amrex::Real time, const bool is_last_step);
Expand Down
10 changes: 10 additions & 0 deletions src/Hipace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,12 @@ Hipace::ReadParameters ()
"be specified via 'hipace.background_density_SI'");
}

queryWithParser(pph, "collisions2", m_collision_names2);
for (int i = 0; i != m_collision_names2.size(); ++i) {
m_all_collisions2.emplace_back(Collision());
m_all_collisions2.back().ReadParameters(m_multi_plasma.m_names, m_collision_names2[i]);
}

// external fields applied to the grid
amrex::Array<std::string, 5> field_str = {"0", "0", "0", "0", "0"};
m_use_grid_external_fields = queryWithParser(pph, "grid_external_fields(x,y,z,t)", field_str);
Expand Down Expand Up @@ -840,6 +846,10 @@ Hipace::SolveOneSlice (int islice, int step, bool is_first_step, bool is_last_st
// collisions for plasmas and beams
doCoulombCollision();

for (auto& collision : m_all_collisions2) {
collision.doCollision(0, m_slice_geom[0], m_multi_plasma);
}

// get minimum beam uz after push
m_adaptive_time_step.GatherMinUzSlice(m_multi_beam, false);

Expand Down
1 change: 1 addition & 0 deletions src/particles/collisions/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@
target_sources(HiPACE
PRIVATE
CoulombCollision.cpp
Collision.cpp
)
100 changes: 100 additions & 0 deletions src/particles/collisions/Collision.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#ifndef HIPACE_COLLISION_H_
#define HIPACE_COLLISION_H_

#include "particles/plasma/MultiPlasma.H"

#include <AMReX.H>

#include <string>

/**
* \brief This class handles Coulomb collisions between 2 particle species
* (can be plasma-plasma or beam-plasma, the species can be the same)
*/
class Collision
{
std::string m_inout_species1_name = "";
std::string m_inout_species2_name = "";
std::string m_out_species3_name = "";
std::string m_collision_type = "";
bool m_has_collision_product = false;
amrex::Gpu::Buffer<amrex::Real> m_crosssection_data;

public:

/** Read parameters from the input file */
void ReadParameters (
const std::vector<std::string>& plasma_species_names,
std::string const collision_name);

/**
* \param[in] lev MR level
* \param[in] geom corresponding geometry object
* \param[in,out] multi_plasma all plasmas
**/
void doCollision (
int lev, const amrex::Geometry& geom,
MultiPlasma& multi_plasma);

/**
* \param[in] lev MR level
* \param[in] geom corresponding geometry object
* \param[in,out] multi_plasma all plasmas
* \param[in] collision_function return if a pair of particles collides
* \param[in] ionizaiton_function initialize product particle
**/
template <class F, class G>
void doCollisionImp (
int lev, const amrex::Geometry& geom,
MultiPlasma& multi_plasma,
F const& collision_function,
G const& ionizaiton_function);

/**
* \param[in] lev MR level
* \param[in] geom corresponding geometry object
* \param[in,out] multi_plasma all plasmas
* \param[in] collision_function return if a pair of particles collides
* \param[in] ionizaiton_function initialize product particle
**/
template <class F, class G>
void doCollisionImpSameSpecies (
int lev, const amrex::Geometry& geom,
MultiPlasma& multi_plasma,
F const& collision_function,
G const& ionizaiton_function);

/**
* \param[in] lev MR level
* \param[in] geom corresponding geometry object
* \param[in,out] multi_plasma all plasmas
* \param[in] collision_function return if a pair of particles collides
* \param[in] ionizaiton_function initialize product particle
**/
template <class F, class G>
void doCollisionImpDifferentSpecies (
int lev, const amrex::Geometry& geom,
MultiPlasma& multi_plasma,
F const& collision_function,
G const& ionizaiton_function);

/**
* \param[in] lev MR level
* \param[in] geom corresponding geometry object
* \param[in,out] multi_plasma all plasmas
**/
void doCollisionA (
int lev, const amrex::Geometry& geom,
MultiPlasma& multi_plasma);

/**
* \param[in] lev MR level
* \param[in] geom corresponding geometry object
* \param[in,out] multi_plasma all plasmas
**/
void doCollisionB (
int lev, const amrex::Geometry& geom,
MultiPlasma& multi_plasma);
};

#endif // HIPACE_COLLISION_H_
Loading
Loading