Execute the complete PIC time integration loop.
52 {
53
54 std::cout << " -> Running the simulation ..." << std::endl;
55
56
57 double source_flux_avg = m_interface->load_scalar<double>("solve.particles.source_flux");
58 double initial_energy = m_interface->load_scalar<double>("solve.particles.init_energy");
59
60 double p_ce = m_interface->load_scalar<double>("solve.collisions.prob_ce");
61 double p_ag = m_interface->load_scalar<double>("solve.collisions.prob_ag");
62
63 double energy_max = m_interface->load_scalar<double>("discretization.energy.max");
64
65
66
67 double dt = m_time[1] - m_time[0];
68 std::poisson_distribution<int> pois(source_flux_avg * dt / m_particles->m_weight);
69 double N_emit;
70
71
72 std::cout << "[0] Solving initial Laplace " << std::endl;
73 Eigen::VectorXd rho = Eigen::VectorXd::Zero(m_cellnumber+1);
74 Eigen::VectorXd phi = m_poisson->solve_potential(rho);
75 Eigen::VectorXd efield = m_poisson->solve_efield(phi);
76 Eigen::VectorXd energies = Eigen::VectorXd::Zero(m_bins);
77 Eigen::Vector4d fluxes = Eigen::Vector4d::Zero(4);
78 m_phi.row(0) = phi.transpose();
79 m_efield.row(0) = efield.transpose();
80
81
82 for (int i = 1; i < m_timesteps; i++) {
83
84 std::cout << "["<< i << "] Solving timestep " << std::endl;
85
86
87 N_emit = pois(m_rng);
88 m_particles->emit(
89 N_emit, 0, dt, initial_energy,
90 m_poisson->m_nodes, efield, m_rng
91 );
92
93 m_particles->push_leapfrog(dt, m_poisson->m_nodes, efield);
94
95 fluxes = m_particles->fluxes(m_poisson->m_cap_xpos, m_rng, p_ce, p_ag);
96 energies = m_particles->energy_distribution(m_bins, energy_max);
97
98 rho = m_particles->deposit_charge(m_poisson->m_nodes, m_poisson->m_dx);
99
100 phi = m_poisson->solve_potential(rho);
101 efield = m_poisson->solve_efield(phi);
102
103
104 m_rho.row(i) = rho.transpose();
105 m_phi.row(i) = phi.transpose();
106 m_efield.row(i) = efield.transpose();
107 m_fluxes.row(i) = fluxes.transpose();
108 m_energy_dist.row(i) = energies.transpose();
109
110 }
111
112 std::cout << " Finished simulation run " << std::endl;
113};