64 const G4int G4NeutronInelasticXS::amin[] = {
66 0, 0, 6, 0,10,12,14,16, 0, 0,
67 0, 0, 0,28, 0, 0, 0,36, 0,40,
68 0, 0, 0, 0, 0,54, 0,58,63,64,
69 0,70, 0, 0, 0, 0, 0, 0, 0,90,
70 0, 0, 0, 0, 0, 0,107,106, 0,112,
71 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
72 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
73 0, 0, 0,180, 0, 0, 0, 0, 0, 0,
74 0,204, 0, 0, 0, 0, 0, 0, 0, 0,
76 const G4int G4NeutronInelasticXS::amax[] = {
78 0, 0, 7, 0,11,13,15,18, 0, 0,
79 0, 0, 0,30, 0, 0, 0,40, 0,48,
80 0, 0, 0, 0, 0,58, 0,64,65,70,
81 0,76, 0, 0, 0, 0, 0, 0, 0,96,
82 0, 0, 0, 0, 0, 0,109,116, 0,124,
83 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
84 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
85 0, 0, 0,186, 0, 0, 0, 0, 0, 0,
86 0,208, 0, 0, 0, 0, 0, 0, 0, 0,
89 G4double G4NeutronInelasticXS::coeff[] = {1.0};
99 G4cout <<
"G4NeutronInelasticXS::G4NeutronInelasticXS Initialise for Z < "
113 if(isMaster) {
delete data;
data = 0; }
118 outFile <<
"G4NeutronInelasticXS calculates the neutron inelastic scattering\n"
119 <<
"cross section on nuclei using data from the high precision\n"
120 <<
"neutron database. These data are simplified and smoothed over\n"
121 <<
"the resonance region in order to reduce CPU time.\n"
122 <<
"G4NeutronInelasticXS is valid for energies up to 20 MeV, for\n"
123 <<
"nuclei through U.\n";
149 else if(Z < 1) { Z = 1; }
160 pv =
data->GetElementData(Z);
161 if(!pv) {
return xs; }
165 if(ekin <= e1) {
return xs; }
170 xs = pv->
Value(ekin);
180 G4cout <<
"ekin= " << ekin <<
", XSinel= " << xs <<
G4endl;
192 else if(Z < 1) { Z = 1; }
210 pv =
data->GetElementData(Z);
214 if(pv && amin[Z] > 0 && A >= amin[Z] && A <= amax[Z]) {
215 pv =
data->GetComponentDataByIndex(Z, A - amin[Z]);
216 if(pv && ekin > pv->
Energy(0)) { xs = pv->
Value(ekin); }
245 for (j = 0; j<
nIso; ++j) {
246 sum += abundVector[j];
248 iso = (*isoVector)[j];
255 if(!
data->GetElementData(Z)) { Initialise(Z); }
256 size_t nn = temp.size();
257 if(nn < nIso) { temp.resize(nIso, 0.); }
259 for (j=0; j<
nIso; ++j) {
262 sum += abundVector[j]*IsoCrossSection(kinEnergy, Z,
263 (*isoVector)[j]->GetN());
267 for (j = 0; j<
nIso; ++j) {
269 iso = (*isoVector)[j];
282 G4cout <<
"G4NeutronInelasticXS::BuildPhysicsTable for "
288 <<
" only neutron is allowed";
289 G4Exception(
"G4NeutronInelasticXS::BuildPhysicsTable(..)",
"had012",
297 data->SetName(
"NeutronInelastic");
306 char* path = getenv(
"G4NEUTRONXSDATA");
315 for(
size_t i=0; i<numOfElm; ++i) {
321 if(!(
data->GetElementData(Z))) {
322 Initialise(Z, dynParticle, path);
334 if(
data->GetElementData(Z) || Z < 1 || Z >=
MAXZINEL) {
return; }
335 const char* path =
p;
339 path = getenv(
"G4NEUTRONXSDATA");
341 G4Exception(
"G4NeutronInelasticXS::Initialise(..)",
"had013",
343 "Environment variable G4NEUTRONXSDATA is not defined");
356 std::ostringstream ost;
357 ost << path <<
"/inelast" <<
Z ;
359 data->InitialiseForElement(Z, v);
367 size_t nmax = (size_t)(amax[Z]-amin[Z]+1);
368 data->InitialiseForComponent(Z, nmax);
370 for(
G4int A=amin[Z]; A<=amax[
Z]; ++
A) {
371 std::ostringstream ost1;
372 ost1 << path <<
"/inelast" << Z <<
"_" <<
A;
374 data->AddComponent(Z, A, v1);
390 if(sig2 > 0.) { coeff[
Z] = sig1/sig2; }
391 if(!dp) {
delete dynParticle; }
395 G4NeutronInelasticXS::RetrieveVector(std::ostringstream& ost,
G4bool warn)
398 std::ifstream filein(ost.str().c_str());
402 ed <<
"Data file <" << ost.str().c_str()
403 <<
"> is not opened!";
404 G4Exception(
"G4NeutronInelasticXS::RetrieveVector(..)",
"had014",
409 G4cout <<
"File " << ost.str()
410 <<
" is opened by G4NeutronInelasticXS" <<
G4endl;
416 ed <<
"Data file <" << ost.str().c_str()
417 <<
"> is not retrieved!";
418 G4Exception(
"G4NeutronInelasticXS::RetrieveVector(..)",
"had015",
virtual ~G4NeutronInelasticXS()
size_t GetNumberOfIsotopes() const
G4double GetMaxEnergy() const
std::vector< G4Isotope * > G4IsotopeVector
std::ostringstream G4ExceptionDescription
G4double GetKineticEnergy() const
CLHEP::Hep3Vector G4ThreeVector
virtual G4bool IsIsoApplicable(const G4DynamicParticle *, G4int Z, G4int A, const G4Element *, const G4Material *)
size_t GetVectorLength() const
G4double GetInelasticGlauberGribovXsc()
static G4NistManager * Instance()
const G4String & GetParticleName() const
G4double GetIsoCrossSection(const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso=0, const G4Element *elm=0, const G4Material *mat=0)
const XML_Char const XML_Char * data
virtual G4double GetElementCrossSection(const G4DynamicParticle *, G4int Z, const G4Material *mat=0)
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
static size_t GetNumberOfElements()
virtual G4bool Retrieve(std::ifstream &fIn, G4bool ascii) final
G4double * GetRelativeAbundanceVector() const
virtual G4double GetIsoCrossSection(const G4DynamicParticle *, G4int Z, G4int A, const G4Isotope *iso, const G4Element *elm, const G4Material *mat)
static G4Neutron * Neutron()
G4double Energy(size_t index) const
G4double Value(G4double theEnergy, size_t &lastidx) const
void SetKineticEnergy(G4double aEnergy)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
static const G4double emax
G4IsotopeVector * GetIsotopeVector() const
#define G4_DECLARE_XS_FACTORY(cross_section)
virtual void CrossSectionDescription(std::ostream &) const
virtual G4bool IsElementApplicable(const G4DynamicParticle *, G4int Z, const G4Material *)
virtual G4Isotope * SelectIsotope(const G4Element *, G4double kinEnergy)
G4double GetHadronNucleonXscPDG(const G4DynamicParticle *, const G4ParticleDefinition *)
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
std::vector< G4Element * > G4ElementTable
static G4ElementTable * GetElementTable()
G4double GetInelasticHadronNucleonXsc()