42 #ifndef G4NuclNuclDiffuseElastic_h
43 #define G4NuclNuclDiffuseElastic_h 1
73 void BuildAngleTable();
81 void SetHEModelLowLimit(
G4double value);
83 void SetQModelLowLimit(
G4double value);
85 void SetLowestEnergyLimit(
G4double value);
87 void SetRecoilKinEnergyLimit(
G4double value);
218 void CalculateCoulombPhaseZero();
220 void CalculateRutherfordAnglePar();
312 std::vector<G4PhysicsTable*> fAngleBank;
314 std::vector<G4double> fElementNumberVector;
315 std::vector<G4String> fElementNameVector;
364 lowEnergyRecoilLimit =
value;
369 plabLowLimit =
value;
374 lowEnergyLimitHE =
value;
379 lowEnergyLimitQ =
value;
384 lowestEnergyLimit =
value;
398 if( std::fabs(x) < 0.01 )
400 df = 1./(1. + x/f2 + x*x/
f3 + x*x*x/
f4);
418 if( std::fabs(x) < 0.01 )
422 result = 2. - x2 + x2*x2/6.;
426 result = BesselJone(x)/
x;
441 fBeta = a/std::sqrt(1+a*a);
453 fZommerfeld = CLHEP::fine_structure_const*Z1*Z2/beta;
467 G4double zn = 1.77*k*std::pow(Z,-1./3.)*CLHEP::Bohr_radius;
480 G4double r0 = 1.*CLHEP::fermi, radius;
483 r0 *= fNuclearRadiusCof;
500 radius = r0*std::pow(A, 1./3.);
514 G4double sinHalfTheta = std::sin(0.5*theta);
515 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
516 G4double beta = CalculateParticleBeta( particle, momentum);
518 G4double n = CalculateZommerfeld( beta, z, Z );
519 G4double am = CalculateAm( momentum, n, Z);
523 G4double xsc = ch2/((sinHalfTheta2+am)*(sinHalfTheta2+am));
534 G4double sinHalfTheta = std::sin(0.5*theta);
535 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
537 G4double ch2 = fRutherfordRatio*fRutherfordRatio;
539 G4double xsc = ch2/(sinHalfTheta2+fAm)/(sinHalfTheta2+fAm);
551 G4double beta = CalculateParticleBeta( particle, momentum);
554 G4double n = CalculateZommerfeld( beta, z, Z );
556 G4double am = CalculateAm( momentum, n, Z);
560 G4cout<<
"k*Bohr_radius = "<<k*CLHEP::Bohr_radius<<
G4endl;
563 G4double xsc = ch2*CLHEP::pi/(am +am*am);
582 G4double beta = CalculateParticleBeta( particle, momentum);
585 G4double n = CalculateZommerfeld( beta, z, Z );
587 G4double am = CalculateAm( momentum, n, Z);
595 G4double xsc = ch2*CLHEP::twopi*(c1-c2)/((1 - c1 + am)*(1 - c2 + am));
618 result += 1./z1 - 1./z3 +1./z5 -1./z7;
633 tmp = t*exp(-z*z-1.26551223+t*(1.00002368+t*(0.37409196+t*(0.09678418+
634 t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+
635 t*(-0.82215223+t*0.17087277)))))))));
637 if( x >= 0.) result = 1. -
tmp;
638 else result = 1. +
tmp;
649 G4complex erfcz = 1. - GetErfComp( z, nMax);
659 G4complex erfcz = 1. - GetErfSer( z, nMax);
681 G4complex erfcz = 1. - GetErfComp( miz, nMax);
693 G4complex erfcz = 1. - GetErfSer( miz, nMax);
720 for( n = 1; n <= nMax; n++)
730 sum *= 2.*std::exp(-z*z)/std::sqrt(CLHEP::pi);
741 result = std::exp(x*x-fReZ*fReZ);
742 result *= std::cos(2.*x*fReZ);
752 result = std::exp(x*x-fReZ*fReZ);
753 result *= std::sin(2.*x*fReZ);
796 G4double sinHalfTheta = std::sin(0.5*theta);
797 G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
798 sinHalfTheta2 += fAm;
800 G4double order = 2.*fCoulombPhase0 - fZommerfeld*std::log(sinHalfTheta2);
804 ca *= -fZommerfeld/(2.*fWaveVector*sinHalfTheta2);
816 G4double out = ca.real()*ca.real() + ca.imag()*ca.imag();
831 fCoulombPhase0 = gammalog.imag();
844 return gammalog.imag();
855 fHalfRutThetaTg = fZommerfeld/fProfileLambda;
856 fRutherfordTheta = 2.*std::atan(fHalfRutThetaTg);
857 fHalfRutThetaTg2 = fHalfRutThetaTg*fHalfRutThetaTg;
868 G4double dTheta = fRutherfordTheta - theta;
871 if(std::abs(dTheta) < 0.001) result = fProfileAlpha*fProfileDelta;
874 argument = fProfileDelta*dTheta;
875 result = CLHEP::pi*argument*std::exp(fProfileAlpha*argument);
876 result /= std::sinh(CLHEP::pi*argument);
889 G4double dTheta = fRutherfordTheta + theta;
890 G4double argument = fProfileDelta*dTheta;
892 G4double result = CLHEP::pi*argument*std::exp(fProfileAlpha*argument);
893 result /= std::sinh(CLHEP::pi*argument);
905 G4double dTheta = fRutherfordTheta - theta;
908 if(std::abs(dTheta) < 0.001) result = 1.;
911 argument = fProfileDelta*dTheta;
912 result = CLHEP::pi*argument;
913 result /= std::sinh(result);
924 G4double twosigma = 2.*fCoulombPhase0;
925 twosigma -= fZommerfeld*std::log(fHalfRutThetaTg2/(1.+fHalfRutThetaTg2));
926 twosigma += fRutherfordTheta*fZommerfeld/fHalfRutThetaTg - CLHEP::halfpi;
927 twosigma -= fProfileLambda*theta - 0.25*CLHEP::pi;
929 twosigma *= fCofPhase;
942 G4double twosigma = 2.*fCoulombPhase0;
943 twosigma -= fZommerfeld*std::log(fHalfRutThetaTg2/(1.+fHalfRutThetaTg2));
944 twosigma += fRutherfordTheta*fZommerfeld/fHalfRutThetaTg - CLHEP::halfpi;
945 twosigma += fProfileLambda*theta - 0.25*CLHEP::pi;
947 twosigma *= fCofPhase;
961 G4double kappa = std::sqrt(0.5*fProfileLambda/std::sin(theta)/CLHEP::pi);
963 out *= ProfileFar(theta);
964 out *= PhaseFar(theta);
976 G4complex out = AmplitudeNear(theta) + fCofFar*AmplitudeFar(theta);
989 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1000 G4double sinThetaR = 2.*fHalfRutThetaTg/(1. + fHalfRutThetaTg2);
1001 G4double dTheta = 0.5*(theta - fRutherfordTheta);
1002 G4double sindTheta = std::sin(dTheta);
1004 G4double order = std::sqrt(fProfileLambda/sinThetaR/CLHEP::pi)*2.*sindTheta;
1006 G4double cosFresnel = 0.5 - GetCint(order);
1007 G4double sinFresnel = 0.5 - GetSint(order);
1009 G4double out = 0.5*( cosFresnel*cosFresnel + sinFresnel*sinFresnel );
1020 G4double ratio = GetRatioGen(theta);
1021 G4double ruthXsc = GetRutherfordXsc(theta);
1033 G4double xsc = GetFresnelDiffuseXsc(theta);
1044 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1056 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1067 G4double mod2 = out.real()*out.real() + out.imag()*out.imag();
1079 G4double Elab = std::sqrt ( mp * mp + Plab * Plab );
1080 G4double sMand = mp*mp + mt*mt + 2*Elab*mt ;
G4double GetCoulombIntegralXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z, G4double theta1, G4double theta2)
G4double CalculateNuclearRad(G4double A)
G4double Legendre96(T &typeT, F f, G4double a, G4double b)
G4complex GetErfcComp(G4complex z, G4int nMax)
void SetProfileLambda(G4double pl)
void SetNuclearRadiusCof(G4double r)
G4double AmplitudeSimMod2(G4double theta)
G4double GetExpSin(G4double x)
G4double CalculateAm(G4double momentum, G4double n, G4double Z)
G4double GetCofAlphaMax()
void SetCofAlphaCoulomb(G4double pa)
G4double DampFactor(G4double z)
void SetProfileDelta(G4double pd)
G4double GetExpCos(G4double x)
G4double G4NeutronHPJENDLHEData::G4double result
G4complex PhaseNear(G4double theta)
G4complex CoulombAmplitude(G4double theta)
G4double GetErf(G4double x)
G4double GetRatioSim(G4double theta)
G4double GetCoulombElasticXsc(const G4ParticleDefinition *particle, G4double theta, G4double momentum, G4double Z)
void CalculateCoulombPhaseZero()
G4double CalculateParticleBeta(const G4ParticleDefinition *particle, G4double momentum)
G4double GetCoulombTotalXsc(const G4ParticleDefinition *particle, G4double momentum, G4double Z)
G4double Profile(G4double theta)
G4double GetSinHaPit2(G4double t)
G4complex GammaLogB2n(G4complex xx)
void SetEtaRatio(G4double pa)
void SetPlabLowLimit(G4double value)
G4double CalculateCoulombPhase(G4int n)
std::complex< G4double > G4complex
G4GLOB_DLL std::ostream G4cout
void SetCofDelta(G4double pa)
void CalculateRutherfordAnglePar()
void SetRecoilKinEnergyLimit(G4double value)
void SetLowestEnergyLimit(G4double value)
G4double CoulombAmplitudeMod2(G4double theta)
void SetCofAlphaMax(G4double pa)
G4double GetRutherfordXsc(G4double theta)
G4complex TestErfcInt(G4complex z)
void SetHEModelLowLimit(G4double value)
G4double GetCofAlphaCoulomb()
G4double GetFresnelDiffuseXsc(G4double theta)
void SetProfileAlpha(G4double pa)
G4double GetProfileLambda()
G4double CalculateZommerfeld(G4double beta, G4double Z1, G4double Z2)
G4double GetPDGMass() const
void SetQModelLowLimit(G4double value)
G4double ProfileNear(G4double theta)
G4double GetFresnelIntegrandXsc(G4double alpha)
void SetCofPhase(G4double pa)
G4complex GetErfcSer(G4complex z, G4int nMax)
G4double AmplitudeMod2(G4double theta)
G4complex GetErfcInt(G4complex z)
G4complex Amplitude(G4double theta)
void SetCofLambda(G4double pa)
const XML_Char int const XML_Char * value
G4complex AmplitudeFar(G4double theta)
G4double CalcMandelstamS(const G4double mp, const G4double mt, const G4double Plab)
G4double AmplitudeGGMod2(G4double theta)
G4complex TestErfcComp(G4complex z, G4int nMax)
G4double GetCosHaPit2(G4double t)
G4double GetPDGCharge() const
G4double GetSint(G4double x)
G4double AmplitudeGlaMod2(G4double theta)
void SetCofFar(G4double pa)
G4complex PhaseFar(G4double theta)
G4double GetNuclearRadius()
G4double ProfileFar(G4double theta)
G4complex GetErfSer(G4complex z, G4int nMax)
G4complex TestErfcSer(G4complex z, G4int nMax)
G4double GetCint(G4double x)
void SetCofAlpha(G4double pa)
G4double BesselOneByArg(G4double z)