Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // particle_hp -- source file 27 // J.P. Wellisch, Nov-1996 28 // A prototype of the low energy neutron transport model. 29 // 30 // T.Koi 02-08-06 Modified Harmonise to resolve x-section trouble at high-end. 31 // 32 // P. Arce, June-2014 Conversion neutron_hp to particle_hp 33 // V. Ivanchenko July-2023 converted back capture 34 // 35 #include "G4ParticleHPElementData.hh" 36 37 G4ParticleHPElementData::G4ParticleHPElementData() 38 { 39 precision = 0.02; 40 theFissionData = new G4ParticleHPVector; 41 theCaptureData = new G4ParticleHPVector; 42 theElasticData = new G4ParticleHPVector; 43 theInelasticData = new G4ParticleHPVector; 44 theIsotopeWiseData = nullptr; 45 theBuffer = nullptr; 46 } 47 48 G4ParticleHPElementData::~G4ParticleHPElementData() 49 { 50 delete theFissionData; 51 delete theCaptureData; 52 delete theElasticData; 53 delete theInelasticData; 54 delete[] theIsotopeWiseData; 55 } 56 57 void G4ParticleHPElementData::Init(G4Element* theElement, 58 G4ParticleDefinition* projectile, 59 const char* dataDirVariable) 60 { 61 auto nIso = (G4int)theElement->GetNumberOfIsotopes(); 62 auto Z = theElement->GetZasInt(); 63 const std::size_t dsize = nIso > 0 ? nIso : 1; 64 theIsotopeWiseData = new G4ParticleHPIsoData[dsize]; 65 66 for (G4int i1 = 0; i1 < nIso; ++i1) { 67 G4int A = theElement->GetIsotope(i1)->GetN(); 68 G4int M = theElement->GetIsotope(i1)->Getm(); 69 G4double frac = theElement->GetRelativeAbundanceVector()[i1] / CLHEP::perCent; 70 UpdateData(A, Z, M, i1, frac, projectile, dataDirVariable); 71 } 72 //theElasticData->ThinOut(precision); 73 //if (projectile == G4Neutron::Neutron()) theInelasticData->ThinOut(precision); 74 75 //theCaptureData->ThinOut(precision); 76 //theFissionData->ThinOut(precision); 77 } 78 79 void G4ParticleHPElementData::UpdateData(G4int A, G4int Z, G4int M, G4int index, 80 G4double abundance, 81 G4ParticleDefinition* projectile, 82 const char* dataDirVariable) 83 { 84 // Reads in the Data, using G4ParticleHPIsoData[], and its Init 85 theIsotopeWiseData[index].Init(A, Z, M, abundance, projectile, dataDirVariable); 86 87 theBuffer = theIsotopeWiseData[index].MakeElasticData(); 88 Harmonise(theElasticData, theBuffer); 89 delete theBuffer; 90 91 theBuffer = theIsotopeWiseData[index].MakeInelasticData(); 92 Harmonise(theInelasticData, theBuffer); 93 delete theBuffer; 94 95 theBuffer = theIsotopeWiseData[index].MakeCaptureData(); 96 Harmonise(theCaptureData, theBuffer); 97 delete theBuffer; 98 99 theBuffer = theIsotopeWiseData[index].MakeFissionData(); 100 Harmonise(theFissionData, theBuffer); 101 delete theBuffer; 102 } 103 104 void G4ParticleHPElementData::Harmonise(G4ParticleHPVector*& theStore, G4ParticleHPVector* theNew) 105 { 106 if (theNew == nullptr) { 107 return; 108 } 109 G4int s_tmp = 0, n = 0, m_tmp = 0; 110 auto theMerge = new G4ParticleHPVector(theStore->GetVectorLength()); 111 while (theStore->GetEnergy(s_tmp) < theNew->GetEnergy(0) 112 && s_tmp < theStore->GetVectorLength()) // Loop checking, 11.05.2015, T. Koi 113 { 114 theMerge->SetData(m_tmp++, theStore->GetEnergy(s_tmp), theStore->GetXsec(s_tmp)); 115 ++s_tmp; 116 } 117 G4ParticleHPVector* active = theStore; 118 G4ParticleHPVector* passive = theNew; 119 G4ParticleHPVector* tmp; 120 G4int a = s_tmp, p = n, t; 121 while (a < active->GetVectorLength() 122 && p < passive->GetVectorLength()) // Loop checking, 11.05.2015, T. Koi 123 { 124 if (active->GetEnergy(a) <= passive->GetEnergy(p)) { 125 theMerge->SetData(m_tmp, active->GetEnergy(a), active->GetXsec(a)); 126 G4double x = theMerge->GetEnergy(m_tmp); 127 G4double y = std::max(0., passive->GetXsec(x)); 128 theMerge->SetData(m_tmp, x, theMerge->GetXsec(m_tmp) + y); 129 ++m_tmp; 130 ++a; 131 } 132 else { 133 tmp = active; 134 t = a; 135 active = passive; 136 a = p; 137 passive = tmp; 138 p = t; 139 } 140 } 141 while (a != active->GetVectorLength()) // Loop checking, 11.05.2015, T. Koi 142 { 143 theMerge->SetData(m_tmp++, active->GetEnergy(a), active->GetXsec(a)); 144 ++a; 145 } 146 while (p != passive->GetVectorLength()) // Loop checking, 11.05.2015, T. Koi 147 { 148 G4double x = passive->GetEnergy(p); 149 G4double y = std::max(0., active->GetXsec(x)); 150 theMerge->SetData(m_tmp++, x, passive->GetXsec(p) + y); 151 ++p; 152 } 153 delete theStore; 154 theStore = theMerge; 155 } 156 157 G4ParticleHPVector* 158 G4ParticleHPElementData::MakePhysicsVector(G4Element* theElement, 159 G4ParticleDefinition* projectile, 160 G4ParticleHPFissionData* theSet, 161 char* dataDirVariable) 162 { 163 Init(theElement, projectile, dataDirVariable); 164 return GetData(theSet); 165 } 166 167 G4ParticleHPVector* 168 G4ParticleHPElementData::MakePhysicsVector(G4Element* theElement, 169 G4ParticleDefinition* projectile, 170 G4NeutronHPCaptureData* theSet, 171 char* dataDirVariable) 172 { 173 Init(theElement, projectile, dataDirVariable); 174 return GetData(theSet); 175 } 176 177 G4ParticleHPVector* 178 G4ParticleHPElementData::MakePhysicsVector(G4Element* theElement, 179 G4ParticleDefinition* projectile, 180 G4ParticleHPElasticData* theSet, 181 char* dataDirVariable) 182 { 183 Init(theElement, projectile, dataDirVariable); 184 return GetData(theSet); 185 } 186 G4ParticleHPVector* 187 G4ParticleHPElementData::MakePhysicsVector(G4Element* theElement, 188 G4ParticleDefinition* projectile, 189 G4ParticleHPInelasticData* theSet, 190 char* dataDirVariable) 191 { 192 Init(theElement, projectile, dataDirVariable); 193 return GetData(theSet); 194 } 195