26 const bf::path &output_path) {
49 const std::string modus_chooser = config.read({
"General",
"Modus"});
50 logg[
LExperiment].debug() <<
"Modus for this calculation: " << modus_chooser;
52 if (modus_chooser ==
"Box") {
53 return make_unique<Experiment<BoxModus>>(config, output_path);
54 }
else if (modus_chooser ==
"List") {
55 return make_unique<Experiment<ListModus>>(config, output_path);
56 }
else if (modus_chooser ==
"Collider") {
57 return make_unique<Experiment<ColliderModus>>(config, output_path);
58 }
else if (modus_chooser ==
"Sphere") {
59 return make_unique<Experiment<SphereModus>>(config, output_path);
61 throw InvalidModusRequest(
"Invalid Modus (" + modus_chooser +
62 ") requested from ExperimentBase::create.");
331 const int ntest = config.
take({
"General",
"Testparticles"}, 1);
333 throw std::invalid_argument(
"Testparticle number should be positive!");
336 const std::string modus_chooser = config.
take({
"General",
"Modus"});
343 const double dt = config.
take({
"General",
"Delta_Time"}, 1.);
344 const double t_end = config.
read({
"General",
"End_Time"});
347 std::unique_ptr<Clock> output_clock =
nullptr;
348 if (config.
has_value({
"Output",
"Output_Times"})) {
349 if (config.
has_value({
"Output",
"Output_Interval"})) {
350 throw std::invalid_argument(
351 "Please specify either Output_Interval or Output_Times");
353 std::vector<double> output_times = config.
take({
"Output",
"Output_Times"});
356 output_times.push_back(t_end + 1.);
357 output_clock = make_unique<CustomClock>(output_times);
359 const double output_dt = config.
take({
"Output",
"Output_Interval"}, t_end);
360 output_clock = make_unique<UniformClock>(0.0, output_dt);
365 if (config[
"Output"].has_value({
"Photons"}) &&
366 (!config.
has_value({
"Collision_Term",
"Photons"}))) {
367 throw std::invalid_argument(
368 "Photon output is enabled although photon production is disabled. "
369 "Photon production can be configured in the \"Photon\" subsection "
370 "of the \"Collision_Term\".");
374 bool missing_output_2to2 =
false;
375 bool missing_output_brems =
false;
376 if (!(config[
"Output"].has_value({
"Photons"}))) {
377 if (config.
has_value({
"Collision_Term",
"Photons",
"2to2_Scatterings"})) {
378 missing_output_2to2 =
379 config.
read({
"Collision_Term",
"Photons",
"2to2_Scatterings"});
381 if (config.
has_value({
"Collision_Term",
"Photons",
"Bremsstrahlung"})) {
382 missing_output_brems =
383 config.
read({
"Collision_Term",
"Photons",
"Bremsstrahlung"});
386 if (missing_output_2to2 || missing_output_brems) {
387 throw std::invalid_argument(
388 "Photon output is disabled although photon production is enabled. "
389 "Please enable the photon output.");
395 if (config[
"Output"].has_value({
"Dileptons"}) &&
396 (!config.
has_value({
"Collision_Term",
"Dileptons"}))) {
397 throw std::invalid_argument(
398 "Dilepton output is enabled although dilepton production is disabled. "
399 "Dilepton production can be configured in the \"Dileptons\" subsection "
400 "of the \"Collision_Term\".");
404 bool missing_output_decays =
false;
405 if (!(config[
"Output"].has_value({
"Dileptons"}))) {
406 if (config.
has_value({
"Collision_Term",
"Dileptons",
"Decays"})) {
407 missing_output_decays =
408 config.
read({
"Collision_Term",
"Dileptons",
"Decays"});
411 if (missing_output_decays) {
412 throw std::invalid_argument(
413 "Dilepton output is disabled although dilepton production is "
415 "Please enable the dilepton output.");
419 auto config_coll = config[
"Collision_Term"];
422 const double low_snn_cut =
423 config_coll.
take({
"Elastic_NN_Cutoff_Sqrts"}, 1.98);
426 if (proton && pion &&
427 low_snn_cut > proton->mass() + proton->mass() + pion->mass()) {
428 logg[
LExperiment].warn(
"The cut-off should be below the threshold energy",
429 " of the process: NN to NNpi");
431 const bool potential_affect_threshold =
432 config.
take({
"Lattice",
"Potentials_Affect_Thresholds"},
false);
433 return {make_unique<UniformClock>(0.0, dt),
434 std::move(output_clock),
436 config.
take({
"General",
"Gaussian_Sigma"}, 1.),
437 config.
take({
"General",
"Gauss_Cutoff_In_Sigma"}, 4.),
438 config_coll.take({
"Two_to_One"},
true),
440 config_coll.take({
"Strings"}, modus_chooser !=
"Box"),
441 config_coll.take({
"Use_AQM"},
true),
442 config_coll.take({
"Resonance_Lifetime_Modifier"}, 1.),
443 config_coll.take({
"Strings_with_Probability"},
true),
446 potential_affect_threshold};
450 uint64_t scatterings_this_interval,
454 double E_mean_field_initial) {
455 const SystemTimeSpan elapsed_seconds = SystemClock::now() - time_start;
458 const QuantumNumbers difference = current_values - conserved_initial;
462 const double current_energy =
464 const double energy_per_part =
465 (particles.
size() > 0)
466 ? (current_energy + E_mean_field - E_mean_field_initial) /
470 std::ostringstream ss;
472 ss << field<7, 3> << time
474 << field<11, 3> << current_energy
476 << field<11, 3> << E_mean_field
478 << field<12, 3> << current_energy + E_mean_field
480 << field<12, 6> << energy_per_part;
482 if (particles.
size() == 0) {
483 ss << field<13, 6> <<
"N/A";
485 ss << field<13, 6> << (difference.
momentum().
x0()
486 + E_mean_field - E_mean_field_initial)
489 ss << field<14, 3> << scatterings_this_interval
490 << field<10, 3> << particles.
size()
491 << field<9, 3> << elapsed_seconds;
501 const double V_cell = (jmu_B_lat.
cell_sizes())[0] *
505 double E_mean_field = 0.0;
506 double density_mean = 0.0;
507 double density_variance = 0.0;
522 <<
"\nSymmetry energy is not included in the mean field calculation."
538 double C1GeV = (potentials.
skyrme_a()) / 1000.0;
539 double C2GeV = (potentials.
skyrme_b()) / 1000.0;
548 int number_of_nodes = 0;
549 double lattice_mean_field_total = 0.0;
551 for (
auto &node : jmu_B_lat) {
554 double nB = node.density();
556 const double j0 = node.jmu_net().x0();
559 density_variance += j0 * j0;
569 double mean_field_contribution_1 =
571 double mean_field_contribution_2 =
574 lattice_mean_field_total +=
575 V_cell * (mean_field_contribution_1 + mean_field_contribution_2);
579 density_mean = density_mean / number_of_nodes;
580 density_variance = density_variance / number_of_nodes;
581 double density_scaled_variance =
582 sqrt(density_variance - density_mean * density_mean) / density_mean;
585 <<
"\n\t\t\t\t\t density mean = " << density_mean;
587 <<
"\n\t\t\t\t\t density scaled variance = " << density_scaled_variance;
589 <<
"\n\t\t\t\t\t total mean_field = "
590 << lattice_mean_field_total * parameters.
testparticles <<
"\n";
597 E_mean_field = lattice_mean_field_total * parameters.
testparticles;