Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:19:19

0001 /*******************************************************************************
0002  * Copyright (c) The JETSCAPE Collaboration, 2018
0003  *
0004  * Modular, task-based framework for simulating all aspects of heavy-ion collisions
0005  * 
0006  * For the list of contributors see AUTHORS.
0007  *
0008  * Report issues at https://github.com/JETSCAPE/JETSCAPE/issues
0009  *
0010  * or via email to bugs.jetscape@gmail.com
0011  *
0012  * Distributed under the GNU General Public License 3.0 (GPLv3 or later).
0013  * See COPYING for details.
0014  ******************************************************************************/
0015 
0016 #include "JetScapeTaskSupport.h"
0017 #include "JetScapeLogger.h"
0018 #include <stdlib.h>
0019 
0020 using namespace std;
0021 
0022 namespace Jetscape {
0023 
0024 // static member initialization
0025 JetScapeTaskSupport *JetScapeTaskSupport::m_pInstance = nullptr;
0026 shared_ptr<std::mt19937> JetScapeTaskSupport::one_for_all_ = nullptr;
0027 unsigned int JetScapeTaskSupport::random_seed_ = 0;
0028 bool JetScapeTaskSupport::initialized_ = false;
0029 bool JetScapeTaskSupport::one_generator_per_task_ = false;
0030 
0031 // ---------------------------------------------------------------------------
0032 JetScapeTaskSupport *JetScapeTaskSupport::Instance() {
0033   if (!m_pInstance) {
0034     m_pInstance = new JetScapeTaskSupport;
0035     VERBOSE(1) << "Created JetScapeTaskSupport Instance";
0036   }
0037   return m_pInstance;
0038 }
0039 
0040 // ---------------------------------------------------------------------------
0041 int JetScapeTaskSupport::RegisterTask() {
0042   VERBOSE(1) << "JetScapeTaskSupport::RegisterTask called, answering "
0043              << CurrentTaskNumber;
0044   CurrentTaskNumber++;
0045   return CurrentTaskNumber - 1;
0046 }
0047 
0048 // ---------------------------------------------------------------------------
0049 void JetScapeTaskSupport::ReadSeedFromXML() {
0050   VERBOSE(1) << "JetScapeTaskSupport::ReadSeedFromXML called. ";
0051 
0052   // xml limits us to unsigned int :-/ -- but so does 32 bits Mersenne Twist
0053   tinyxml2::XMLElement *RandomXmlDescription =
0054       JetScapeXML::Instance()->GetElement({"Random"});
0055   tinyxml2::XMLElement *xmle = 0;
0056   if (RandomXmlDescription) {
0057     xmle = RandomXmlDescription->FirstChildElement("seed");
0058     if (!xmle)
0059       throw std::runtime_error("Cannot parse xml");
0060     xmle->QueryUnsignedText(&random_seed_);
0061   } else {
0062     JSWARN << "No <Random> element found in xml, seeding to 0";
0063   }
0064 
0065   VERBOSE(7) << "Seeding JetScapeTaskSupport to " << random_seed_;
0066   if (random_seed_ == 0) {
0067     // random seed
0068     random_seed_ = std::chrono::system_clock::now().time_since_epoch().count();
0069     JSINFO << "JetScapeTaskSupport found seed 0, using one engine for all and "
0070               "reseeding to "
0071            << random_seed_;
0072     one_generator_per_task_ = false;
0073   } else {
0074     JSINFO << "JetScapeTaskSupport found seed " << random_seed_
0075            << ", using individual engines with seeds created from "
0076            << random_seed_;
0077     one_generator_per_task_ = true;
0078   }
0079 
0080   one_for_all_ = make_shared<std::mt19937>(random_seed_);
0081 
0082   // VERBOSE(7) << "Setting random seed for mt19937 to " << seed;
0083   // generator.seed(seed);
0084   // ZeroOneDistribution = uniform_real_distribution<double> { 0.0, 1.0 };
0085 
0086   initialized_ = true;
0087 }
0088 
0089 // ---------------------------------------------------------------------------
0090 shared_ptr<std::mt19937> JetScapeTaskSupport::GetMt19937Generator(int TaskId) {
0091   if (!initialized_) {
0092     JSWARN << "Trying to use JetScapeTaskSupport::GetMt19937Generator before "
0093               "initialization";
0094     throw std::runtime_error(
0095         "Trying to use JetScapeTaskSupport::GetMt19937Generator before "
0096         "initialization");
0097   }
0098 
0099   if (!one_for_all_) {
0100     throw std::runtime_error("generator not initialized?");
0101   }
0102 
0103   // In this case, we use our own engine to create a repeatable
0104   // sequence of seeds and hand over a properly seeded engine
0105   if (one_generator_per_task_) {
0106     if (random_seed_ == 0)
0107       throw std::runtime_error("This should never happen");
0108     // reseed to be on the safe side
0109     one_for_all_->seed(random_seed_);
0110     // Advance according to TaskId
0111     // Note that this method can be lied to.
0112     // Could design a safer interface but for now, trust the user
0113     one_for_all_->discard(TaskId);
0114     // And get the unique seed for this task
0115     unsigned int localseed = (*one_for_all_)();
0116     JSDEBUG << "Asked by " << TaskId
0117             << " for an individual generator, returning one seeded with "
0118             << localseed;
0119     return make_shared<std::mt19937>(localseed);
0120   }
0121 
0122   // this singleton owns the generator(s) and keeps them until deletion
0123   JSDEBUG << "Asked by " << TaskId
0124           << " for the static generator, returning one originally seeded with "
0125           << random_seed_;
0126   return one_for_all_;
0127 }
0128 
0129 // ---------------------------------------------------------------------------
0130 
0131 } // end namespace Jetscape