-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathPositrons.cc
96 lines (73 loc) · 3.92 KB
/
Positrons.cc
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
//Positrons.cc - Basic, non-interactive module for handling positrons.
//
//Programming notes:
// -Do not make items here "const", because they will not show up when loading.
// -Avoid using macro variables here because they will be obliterated during loading.
// -Wrap dynamically-loaded code with extern "C", otherwise C++ compilation will mangle function names, etc.
//
// From man page for dlsym/dlopen: For running some 'initialization' code prior to finishing loading:
// "Instead, libraries should export routines using the __attribute__((constructor)) and __attribute__((destructor)) function attributes. See the gcc info pages for
// information on these. Constructor routines are executed before dlopen() returns, and destructor routines are executed before dlclose() returns."
// ---for instance, we can use this to seed a random number generator with a random seed. However, in order to pass in a specific seed (and pass that seed to the library)
// we need to define an explicitly callable initialization function. In general, these libraries should have both so that we can quickly adjust behaviour if desired.
//
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <cmath>
#include "./Misc.h"
#include "./Constants.h"
#include "./Structs.h"
#ifdef __cplusplus
extern "C" {
#endif
std::string MODULE_NAME(__FILE__);
std::string FILE_TYPE("PARTICLE");
std::string PARTICLE_TYPE("POSITRON");
bool VERBOSE = false;
//const double positron_mass = 0.510998910;
//const double positron_charge = 1.0;
#ifdef __GNUG__
__attribute__((constructor)) static void init_on_dynamic_load(void){
//Do something automatic here.
if(VERBOSE) FUNCINFO("Loaded lib_positrons.so");
return;
}
__attribute__((destructor)) static void cleanup_on_dynamic_unload(void){
//Cleanup memory (if needed) automatically here.
if(VERBOSE) FUNCINFO("Closed lib_positrons.so");
return;
}
#else
#warning Being compiled with non-gcc compiler. Unable to use gcc-specific function declarations like 'attribute.' Proceed at your own risk!
#endif
void toggle_verbosity(bool in){
VERBOSE = in;
return;
}
//Overloaded base particle class. Relies on polymorphism with base_particle to be used for dynamic linking!
class Positron : public base_particle {
public:
//Constructors.
// Signature of base_particle mega-constructor:
// const unsigned char &type_in, const double &mass_in, const double &charge_in, const double &energy_in, const vec4<double> &X_in, const vec4<double> &U_in
Positron() : base_particle(Particletype::Positron, positron_mass, positron_charge, 0 ) { }
Positron(const vec4<double> &X_in, const vec4<double> &U_in) : base_particle(Particletype::Positron, positron_mass, positron_charge, 0, X_in, U_in) { }
Positron(const double &energy_in, const vec4<double> &X_in, const vec4<double> &U_in) : base_particle(Particletype::Positron, positron_mass, positron_charge, energy_in, X_in, U_in) { }
//Overloaded methods.
virtual double get_energy(void) const { return energy; }
virtual void set_energy(const double &ein){ energy = ein; }
virtual double get_speed(void) const { return sqrt(1.0 - pow(mass/energy,2.0)); }
};
//This is a factory function which lets us create objects on the heap when we dynamically load.
std::unique_ptr<base_particle> particle_factory(const double &energy_in, const vec3<double> &position, const vec3<double> &orientation){
// vec4<double> position4(0.0, position);
// vec4<double> momentum4(1.0, orientation);
// return new Positron(energy_in, position4, momentum4);
// return new Positron(energy_in, vec4<double>(0.0, position), vec4<double>(1.0, orientation));
return std::move( std::unique_ptr<base_particle>( new Positron(energy_in, vec4<double>(0.0, position), vec4<double>(1.0, orientation)) ));
}
#ifdef __cplusplus
}
#endif