-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy patheimpact.cpp
More file actions
63 lines (49 loc) · 2.11 KB
/
eimpact.cpp
File metadata and controls
63 lines (49 loc) · 2.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "Matrix.hpp"
#include "PhysicsConstants.hpp"
#include "Scattering.hpp"
#include <fstream>
#include <iostream>
#include <string>
const std::string usage_text{R"(
Calculates electron-impact ionisation cross-section.
Usage:
Takes input directly from command line.
First argument is file containing Kion.
(File generated by ampsci in 'mat' format, assumed to be in atomic units).
e.g.,
./eimpact K_Xe_v_6_hp_orth_mat.txt > sigma_e_Xe.txt
sigma_e_Xe.txt will contain the cross-section, ready for plotting.
)"};
//==============================================================================
//==============================================================================
//==============================================================================
int main(int argc, char *argv[]) {
// read input filename from command line:
const std::string in_filename = argc > 1 ? argv[1] : "";
if (in_filename.empty()) {
std::cout << "Error: No file given (pass as command-line arg)\n";
std::cout << usage_text;
return 1;
}
// Read in Kion (and Energy/momentum grids)
const auto [E_grid, q_grid, Kion] = Scattering::read_in_Kion(in_filename);
// Check formats correct:
assert(E_grid.size() == Kion.rows() && "Input file must be in valid format");
assert(q_grid.size() == Kion.cols() && "Input file must be in valid format");
// Calculate sig(E) for e-e impact ionisation, in atomic units
const auto sig_impact = Scattering::sigtot(Kion, E_grid, q_grid);
// Sanity check:
assert(sig_impact.size() == E_grid.size());
// Convert units: energy to keV, and sigma to cm^2
using namespace VectorOverloads;
const auto E_keV = E_grid * Physics::Conversions::E_to_keV;
constexpr auto a02 = Physics::Constants::aB_cm * Physics::Constants::aB_cm;
const auto sigma_cm2 = sig_impact * a02;
std::cout
<< "# outputs sigma(E), where E is incident electron energy (in keV), "
"and sigma is the total ionisation cross-section, in cm^2\n";
std::cout << "E(keV) sigma(cm^2)";
for (std::size_t i = 0; i < sig_impact.size(); ++i) {
std::cout << E_keV[i] << " " << sigma_cm2[i] << "\n";
}
}