-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtracks.cpp
More file actions
119 lines (90 loc) · 3.21 KB
/
tracks.cpp
File metadata and controls
119 lines (90 loc) · 3.21 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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include <fstream>
#include "MerlinVersion.h"
#include "settings.h"
#include "accelerator_sim.h"
#include "TrackingOutputASCII.h"
#include "ParticleTracker.h"
#include "SymplecticIntegrators.h"
#include "ProtonBunch.h"
#include "NANCheckProcess.h"
using namespace std;
using namespace ParticleTracking;
int main(int argc, char** argv)
{
cout << merlin_version_info();
cout << "Loss map" << endl;
string settings_file;
if (argc >= 2)
{
settings_file = argv[1];
}else
{
cout << "Please give settings file" << endl;
return 1;
}
Settings settings(settings_file);
settings.parse_arguments(argc, argv);
cout << "Settings:" << endl;
string run_name = settings[ "run_name" ];
cout << "run_name = " << run_name << endl;
const string log_dir = settings.get("log_dir", "logs/");
const string input_data_dir = settings.get("input_data_dir", "commondata/");
const string result_dir = settings.get("result_dir", "results/");
cout << "log_dir = " << log_dir << endl;
cout << "input_data_dir = " << input_data_dir << endl;
cout << "result_dir = " << result_dir << endl;
string start_element = settings["start_element"];
cout << "start_element = " << start_element << endl;
const string tracking_integrator = settings.get("tracking_integrator", "symplectic");
cout << "tracking_integrator = " << tracking_integrator << endl;
auto accsim = std::make_unique<AcceleratorSim>(&settings);
const string particle_type = settings.get("particle", "p");
cout << "particle = " << particle_type << endl;
unique_ptr<ProtonBunch> myBunch;
myBunch = make_unique<ProtonBunch>(accsim->beam_momentum, 1);
accsim->build_lattice();
accsim->set_start_element(start_element);
AcceleratorModel::RingIterator bline = accsim->model->GetRing(accsim->start_element_number);
ParticleTracker* tracker = new ParticleTracker(bline,myBunch.get());
tracker->SetLogStream(std::cout);
if (tracking_integrator == "symplectic")
{
tracker->SetIntegratorSet(new ParticleTracking::SYMPLECTIC::StdISet());
}
else if (tracking_integrator == "transport")
{
tracker->SetIntegratorSet(new ParticleTracking::TRANSPORT::StdISet());
}
else if (tracking_integrator == "thinlens")
{
tracker->SetIntegratorSet(new ParticleTracking::THIN_LENS::StdISet());
}
else
{
cerr << "Unknown tracking_integrator:" << tracking_integrator <<endl;
exit(1);
}
auto nancheck = new NANCheckProcess;
nancheck->SetDetailed(1);
nancheck->SetHaltNAN(1);
tracker->AddProcess(nancheck);
string trackoutasciifile = result_dir+ "/merlin_track_"+run_name+".txt";
auto trackoutascii = new TrackingOutputASCII(trackoutasciifile);
trackoutascii->output_all = true;
tracker->SetOutput(trackoutascii);
cout << "Wrote: " << trackoutasciifile << endl;
Particle p(0);
p.x() = settings.get_double("x", 0);
p.xp() = settings.get_double("xp", 0);
p.y() = settings.get_double("y", 0);
p.yp() = settings.get_double("yp", 0);
p.ct() = settings.get_double("ct", 0);
p.dp() = settings.get_double("dp", 0);
cout << "Initial particle: " << p << endl;
myBunch->AddParticle(p);
cout << "Tracking" << endl;
tracker->Track(myBunch.get());
cout << "Final particle: " << *(myBunch->begin()) << endl;
cout << "Finished.\tParticle number: " << myBunch->size() << endl;
}