Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // particle_hp -- source file 27 // J.P. Wellisch, Nov-1996 28 // A prototype of the low energy neutron trans 29 // 30 // T.Koi 02-08-06 Modified Harmonise to resolv 31 // 32 // P. Arce, June-2014 Conversion neutron_hp to 33 // V. Ivanchenko July-2023 converted back capt 34 // 35 #include "G4ParticleHPElementData.hh" 36 37 G4ParticleHPElementData::G4ParticleHPElementDa 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::~G4ParticleHPElementD 49 { 50 delete theFissionData; 51 delete theCaptureData; 52 delete theElasticData; 53 delete theInelasticData; 54 delete[] theIsotopeWiseData; 55 } 56 57 void G4ParticleHPElementData::Init(G4Element* 58 G4ParticleD 59 const char* 60 { 61 auto nIso = (G4int)theElement->GetNumberOfIs 62 auto Z = theElement->GetZasInt(); 63 const std::size_t dsize = nIso > 0 ? nIso : 64 theIsotopeWiseData = new G4ParticleHPIsoData 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->GetRelativeAbu 70 UpdateData(A, Z, M, i1, frac, projectile, 71 } 72 //theElasticData->ThinOut(precision); 73 //if (projectile == G4Neutron::Neutron()) th 74 75 //theCaptureData->ThinOut(precision); 76 //theFissionData->ThinOut(precision); 77 } 78 79 void G4ParticleHPElementData::UpdateData(G4int 80 G4dou 81 G4Par 82 const 83 { 84 // Reads in the Data, using G4ParticleHPIsoD 85 theIsotopeWiseData[index].Init(A, Z, M, abun 86 87 theBuffer = theIsotopeWiseData[index].MakeEl 88 Harmonise(theElasticData, theBuffer); 89 delete theBuffer; 90 91 theBuffer = theIsotopeWiseData[index].MakeIn 92 Harmonise(theInelasticData, theBuffer); 93 delete theBuffer; 94 95 theBuffer = theIsotopeWiseData[index].MakeCa 96 Harmonise(theCaptureData, theBuffer); 97 delete theBuffer; 98 99 theBuffer = theIsotopeWiseData[index].MakeFi 100 Harmonise(theFissionData, theBuffer); 101 delete theBuffer; 102 } 103 104 void G4ParticleHPElementData::Harmonise(G4Part 105 { 106 if (theNew == nullptr) { 107 return; 108 } 109 G4int s_tmp = 0, n = 0, m_tmp = 0; 110 auto theMerge = new G4ParticleHPVector(theSt 111 while (theStore->GetEnergy(s_tmp) < theNew-> 112 && s_tmp < theStore->GetVectorLength( 113 { 114 theMerge->SetData(m_tmp++, theStore->GetEn 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()) / 123 { 124 if (active->GetEnergy(a) <= passive->GetEn 125 theMerge->SetData(m_tmp, active->GetEner 126 G4double x = theMerge->GetEnergy(m_tmp); 127 G4double y = std::max(0., passive->GetXs 128 theMerge->SetData(m_tmp, x, theMerge->Ge 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()) // L 142 { 143 theMerge->SetData(m_tmp++, active->GetEner 144 ++a; 145 } 146 while (p != passive->GetVectorLength()) // 147 { 148 G4double x = passive->GetEnergy(p); 149 G4double y = std::max(0., active->GetXsec( 150 theMerge->SetData(m_tmp++, x, passive->Get 151 ++p; 152 } 153 delete theStore; 154 theStore = theMerge; 155 } 156 157 G4ParticleHPVector* 158 G4ParticleHPElementData::MakePhysicsVector(G4E 159 G4P 160 G4P 161 cha 162 { 163 Init(theElement, projectile, dataDirVariable 164 return GetData(theSet); 165 } 166 167 G4ParticleHPVector* 168 G4ParticleHPElementData::MakePhysicsVector(G4E 169 G4P 170 G4N 171 cha 172 { 173 Init(theElement, projectile, dataDirVariable 174 return GetData(theSet); 175 } 176 177 G4ParticleHPVector* 178 G4ParticleHPElementData::MakePhysicsVector(G4E 179 G4P 180 G4P 181 cha 182 { 183 Init(theElement, projectile, dataDirVariable 184 return GetData(theSet); 185 } 186 G4ParticleHPVector* 187 G4ParticleHPElementData::MakePhysicsVector(G4E 188 G4P 189 G4P 190 cha 191 { 192 Init(theElement, projectile, dataDirVariable 193 return GetData(theSet); 194 } 195