1 #ifndef __SIMULATION_STATISTICS_H__
2 #define __SIMULATION_STATISTICS_H__
5 #include <boost/array.hpp>
6 #include <boost/circular_buffer.hpp>
7 #include <boost/multi_array.hpp>
9 #include "./CollisionRecord.h"
10 #include "../Constants/AtomicProperties.h"
11 #include "../InfoStruct/InfoStruct.h"
12 #include "../Math/Functions.h"
13 #include "../Units/Units.h"
14 #include "../Vector/Vector.hpp"
16 namespace MDSimulation
22 typedef boost::multi_array<double, 2> Real2d;
23 typedef boost::multi_array<double, 1> Real1d;
24 typedef boost::multi_array<int, 2> Int2d;
25 typedef boost::multi_array<int, 1> Int1d;
27 typedef boost::multi_array<DoubleVector, 2> Vector2d;
31 const int CollisionNum;
39 double MaxCollisionEnergy;
45 double KineticEnergyPerAtom;
51 Int1d TotalAtomsPerBin;
58 Real2d VelocitySquaredPerBin;
60 Real2d RadialVelocityPerBin;
65 Real2d ThermalVelocitySquared;
85 template <
typename Iter>
86 void ComputeStatistics(Iter begin,
const Iter end,
const double radius);
88 template <
typename Stream>
89 void WriteCollisions(Stream& stream)
const;
91 template <
typename Writer>
92 void WriteStatistics(Writer& writer)
const;
98 template <
typename Writer>
99 void WriteTemperature(Writer& writer,
const int bin)
const;
101 template <
typename Writer>
102 void WriteVelocity(Writer& writer,
const int bin)
const;
104 template <
typename Writer>
105 void WriteIonization(Writer& writer,
const int bin)
const;
107 template <
typename Writer>
108 void WritePercentage(Writer& writer,
const int bin)
const;
110 template <
typename Writer>
111 void WriteMaxTemperature(Writer& writer,
const int bin)
const;
113 template <
typename Writer>
114 void WriteKineticEnergy(Writer& writer,
const int bin)
const;
116 template <
typename Writer>
117 void WriteEnergyCoM(Writer& writer,
const int bin)
const;
120 template <
typename Iter>
121 void Statistics::ComputeStatistics(
128 CurrentRadius = radius;
130 for (Iter particle = begin; particle != end; ++particle)
133 const int type = particle->Type;
134 const double v2 = dot(particle->Velocity, particle->Velocity);
137 KineticEnergyPerAtom += 0.5 * Info.AtomicMass[type] * v2;
140 const double r = norm2(particle->Position);
143 int bin = int(r * (
double) Bins / radius);
144 bin = std::min(bin, Bins - 1);
150 AtomsPerBin[type][bin]++;
153 TotalAtomsPerBin[bin]++;
156 ChargePerBin[type][bin] += particle->Charge;
159 VelocitySquaredPerBin[type][bin] += v2;
162 RadialVelocityPerBin[type][bin] +=
163 dot(particle->Position, particle->Velocity) / r;
165 VelocityCoM[type][bin] += particle->Velocity;
168 for (
int bin = 0; bin < Bins; ++bin)
172 VelocityCoM[type][bin] /= AtomsPerBin[type][bin];
176 for (Iter particle = begin; particle != end; ++particle)
178 const int type = particle->Type;
181 const double r = norm2(particle->Position);
184 int bin = int(r * (
double) Bins / radius);
185 bin = std::min(bin, Bins - 1);
187 const DoubleVector vCoM(particle->Velocity - VelocityCoM[type][bin]);
188 ThermalVelocitySquared[type][bin] += dot(vCoM, vCoM);
191 for (
int bin = 0; bin < Bins; ++bin)
195 if (AtomsPerBin[type][bin] > 0)
197 const double radial =
198 RadialVelocityPerBin[type][bin] / AtomsPerBin[type][bin];
199 const double squared =
200 VelocitySquaredPerBin[type][bin] / AtomsPerBin[type][bin];
203 const double temperature =
204 Info.AtomicMass[type] / 3.0 * (squared - Sqr(radial));
213 template <
typename Stream>
214 void Statistics::WriteCollisions(Stream& stream)
const
218 stream << it->Time * Units::T <<
','
219 << it->Position[0] * Units::L <<
','
220 << it->Position[1] * Units::L <<
','
221 << it->Position[2] * Units::L <<
','
222 << it->DeltaV * Units::L / Units::T <<
','
223 << it->Energy * Units::Energy <<
','
224 << it->Distance * Units::L <<
','
226 << it->Type2 <<
'\n';
230 template <
typename Writer>
231 void Statistics::WriteTemperature(Writer& writer,
const int bin)
const
233 writer.String(
"temperature");
234 writer.StartObject();
239 writer.String(type_name.c_str());
240 if (AtomsPerBin[type][bin] > 0)
243 const double temperature =
244 Units::Temperature * Info.AtomicMass[type] / 3.0
245 * (VelocitySquaredPerBin[type][bin] / AtomsPerBin[type][bin]
246 - Sqr(RadialVelocityPerBin[type][bin] / AtomsPerBin[type][bin]));
248 writer.Double(temperature);
258 template <
typename Writer>
259 void Statistics::WriteVelocity(Writer& writer,
const int bin)
const
261 writer.String(
"velocity");
262 writer.StartObject();
267 writer.String(type_name.c_str());
268 if (AtomsPerBin[type][bin] > 0)
270 const double velocity =
271 RadialVelocityPerBin[type][bin] / AtomsPerBin[type][bin];
272 writer.Double(velocity * Units::L / Units::T);
282 template <
typename Writer>
283 void Statistics::WriteIonization(Writer& writer,
const int bin)
const
285 writer.String(
"ionization");
286 writer.StartObject();
291 writer.String(type_name.c_str());
292 if (AtomsPerBin[type][bin] > 0)
294 writer.Double(
double(ChargePerBin[type][bin]) / AtomsPerBin[type][bin]);
304 template <
typename Writer>
305 void Statistics::WritePercentage(Writer& writer,
const int bin)
const
307 writer.String(
"percentage");
308 writer.StartObject();
313 writer.String(type_name.c_str());
314 if (AtomsPerBin[type][bin] > 0)
316 writer.Double((
double) AtomsPerBin[type][bin] / (
double) TotalAtomsPerBin[bin]);
326 template <
typename Writer>
327 void Statistics::WriteMaxTemperature(Writer& writer,
const int bin)
const
329 writer.String(
"max_temperature");
330 writer.StartObject();
335 writer.String(type_name.c_str());
341 template <
typename Writer>
342 void Statistics::WriteKineticEnergy(Writer& writer,
const int bin)
const
344 writer.String(
"kinetic_energy");
345 writer.StartObject();
350 writer.String(type_name.c_str());
351 if (AtomsPerBin[type][bin] > 0)
354 0.5 * Info.AtomicMass[type] * VelocitySquaredPerBin[type][bin];
355 writer.Double(ke * Units::Energy);
365 template <
typename Writer>
366 void Statistics::WriteEnergyCoM(Writer& writer,
const int bin)
const
368 writer.String(
"kinetic_energy_com");
369 writer.StartObject();
375 writer.String(type_name.c_str());
376 if (AtomsPerBin[type][bin] > 0)
378 const double thermal =
379 0.5 * Info.AtomicMass[type] * ThermalVelocitySquared[type][bin];
380 writer.Double(thermal * Units::Energy);
390 template <
typename Writer>
391 void Statistics::WriteStatistics(Writer& writer)
const
394 for (
int bin = 0; bin < Bins; ++bin)
397 const double volume = Info.ConeSolidAngle / 3.0
398 * Pow3(CurrentRadius / Bins * Units::L)
399 * (Pow3(bin + 1) - Pow3(bin));
401 const double density = TotalAtomsPerBin[bin] / volume;
403 writer.StartObject();
405 const double radius = (bin + 0.5) * CurrentRadius * Units::L / Bins;
406 writer.String(
"r"), writer.Double(radius);
407 writer.String(
"n"), writer.Double(TotalAtomsPerBin[bin]);
408 writer.String(
"density"), writer.Double(density);
411 this->WriteTemperature(writer, bin);
412 this->WriteVelocity(writer, bin);
413 this->WriteIonization(writer, bin);
414 this->WritePercentage(writer, bin);
415 this->WriteMaxTemperature(writer, bin);
416 this->WriteKineticEnergy(writer, bin);
417 this->WriteEnergyCoM(writer, bin);
424 writer.String(
"FusionRate"); writer.Uint64((uint64_t)
FusionRate);
425 writer.String(
"MaxCollisionEnergy");
426 writer.Double(MaxCollisionEnergy * Units::M * Sqr(Units::L / Units::T));
428 writer.String(
"CollisionEnergies");
429 writer.StartObject();
433 const std::pair<int, int>& key = it->first;
434 const double energy = it->second;
439 writer.String(key_name.c_str());
440 writer.Double(energy * Units::Energy);
unsigned long long TotalCollisions
number of collision events
Definition: Statistics.h:33
unsigned long long TotalCellCrossings
number of cell crossing events
Definition: Statistics.h:34
unsigned long long TotalConeBoundaryCollisions
number of boundary collisions
Definition: Statistics.h:36
std::map< std::pair< int, int >, double > MaxCollisionEnergySpecies
Largest collision energy by the types of collision partners.
Definition: Statistics.h:42
double CollisionDistanceQuantile(const double p)
Given a probability p, compute the quantile that corresponds to that probability. ...
Definition: Statistics.cpp:81
tvmet::Vector< double, 3UL > DoubleVector
Vector type for representing particle positions and velocities as double precision floating point val...
Definition: Vector.hpp:23
Real2d MaxTemperature
Max temp at each bin.
Definition: Statistics.h:62
Definition: Statistics.h:18
double FusionRate
number of fusions that have occurred
Definition: Statistics.h:38
Definition: CollisionRecord.h:8
boost::circular_buffer< CollisionRecord > Collisions
Collision records.
Definition: Statistics.h:48
const int ELEMENT_TYPES
The number of different particle types in the simulation.
Definition: AtomicProperties.h:22
Defines the structure used to hold the configurable constants of the simulation.
Definition: InfoStruct.h:36
const std::string ELEMENT_NAMES[ELEMENT_TYPES]
The names of the elements.
Definition: AtomicProperties.h:28
unsigned long long TotalWallCollisions
number of wall collision events
Definition: Statistics.h:35