00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #define INCLXX_IN_GEANT4_MODE 1
00034
00035 #include "globals.hh"
00036
00044 #ifndef G4INCLNDFMODIFIEDHARMONICOSCILLATOR_HH_
00045 #define G4INCLNDFMODIFIEDHARMONICOSCILLATOR_HH_
00046
00047 #include "G4INCLIFunction1D.hh"
00048 #include <cmath>
00049 #include <algorithm>
00050
00051 namespace G4INCL {
00052
00053 namespace NuclearDensityFunctions {
00054
00055 class ModifiedHarmonicOscillatorRP : public IFunction1D {
00056 public:
00057 ModifiedHarmonicOscillatorRP(G4double radiusParameter, G4double maximumRadius, G4double diffusenessParameter) :
00058 IFunction1D(0., maximumRadius),
00059 theRadiusParameter(radiusParameter),
00060 theDiffusenessParameter(diffusenessParameter)
00061 {}
00062
00063 inline G4double operator()(const G4double r) const {
00064 const G4double arg = std::pow((r/theDiffusenessParameter),2);
00065 return std::max(0., -2.0* r*r *arg * (theRadiusParameter - 1.0 - theRadiusParameter*arg)*std::exp(-arg));
00066 }
00067
00068 inline G4double getRadiusParameter() { return theRadiusParameter; };
00069 inline G4double getDiffusenessParameter() { return theDiffusenessParameter; };
00070
00071 inline void setRadiusParameter(G4double r) { theRadiusParameter = r; };
00072 inline void setDiffusenessParameter(G4double a) { theDiffusenessParameter = a; };
00073
00074 protected:
00075 G4double theRadiusParameter, theDiffusenessParameter;
00076 };
00077
00078 class ModifiedHarmonicOscillator : public IFunction1D {
00079 public:
00080 ModifiedHarmonicOscillator(G4double radiusParameter, G4double maximumRadius, G4double diffusenessParameter) :
00081 IFunction1D(0., maximumRadius),
00082 theRadiusParameter(radiusParameter),
00083 theDiffusenessParameter(diffusenessParameter),
00084 normalisation(2./((theDiffusenessParameter+theRadiusParameter)*std::pow(theDiffusenessParameter,2.)))
00085 {}
00086
00087 inline G4double operator()(const G4double r) const {
00088 const G4double arg = std::pow((r/theDiffusenessParameter),2);
00089 return normalisation * r * arg
00090 * (theDiffusenessParameter + theRadiusParameter * (arg - 1.) )
00091 * std::exp(-arg);
00092 }
00093
00094 inline G4double getRadiusParameter() { return theRadiusParameter; };
00095 inline G4double getDiffusenessParameter() { return theDiffusenessParameter; };
00096
00097 inline void setRadiusParameter(G4double r) { theRadiusParameter = r; };
00098 inline void setDiffusenessParameter(G4double a) { theDiffusenessParameter = a; };
00099
00100 protected:
00101 G4double theRadiusParameter, theDiffusenessParameter;
00102 const G4double normalisation;
00103 };
00104
00105 }
00106
00107 }
00108
00109 #endif // G4INCLNDFMODIFIEDHARMONICOSCILLATOR_HH_
00110