20 int find_cell_index(
const Eigen::VectorXd& node_pos,
double x)
const;
21 Eigen::VectorXd get_kinetic_energies()
const;
57 Particles(
int N,
double q,
double m,
double w);
65 double interp_linear(
const Eigen::VectorXd& x_nodes,
const Eigen::VectorXd& E_nodes,
double x);
79 int N,
double xpos,
double dt,
double energy_eV,
80 const Eigen::VectorXd& node_pos,
const Eigen::VectorXd& efield, std::mt19937& rng);
89 void push_leapfrog(
double dt,
const Eigen::VectorXd& node_pos,
const Eigen::VectorXd& efield);
113 Eigen::Vector4d
fluxes(
const Eigen::Vector4d& el_pos,
125 const Eigen::VectorXd& dx)
const;
128 Eigen::VectorXd energy_distribution(
int n_bins,
double W_max)
const;
Particles()=default
Default constructor, creates an empty particle set.
Eigen::Vector4d fluxes(const Eigen::Vector4d &el_pos, std::mt19937 &rng, double p_ce, double p_ag)
Compute absorbed particle fluxes on four electrodes.
Eigen::VectorXd deposit_charge(const Eigen::VectorXd &node_pos, const Eigen::VectorXd &dx) const
Deposit particle charge onto grid nodes (CIC scheme).
double m_weight
Superparticle statistical weight.
void emit(int N, double xpos, double dt, double energy_eV, const Eigen::VectorXd &node_pos, const Eigen::VectorXd &efield, std::mt19937 &rng)
Emit N particles at position xpos with Maxwellian velocity distribution.
void resize(int N)
Resize particle arrays to contain N superparticles.
Eigen::VectorXd m_positions
Particle positions (1D).
void push_leapfrog(double dt, const Eigen::VectorXd &node_pos, const Eigen::VectorXd &efield)
Advance particles using leapfrog (velocity half-step scheme).
double m_mass
Mass of a single physical particle (kg).
double m_charge
Charge of a single physical particle (C).
Eigen::VectorXd m_pos_prev
Previous positions for boundary‐crossing detection.
Eigen::VectorXd m_vel_half
Half-step velocities for leapfrog integration.