Geant4  10.02.p03
G4PhononDownconversion Class Reference

#include <G4PhononDownconversion.hh>

Inheritance diagram for G4PhononDownconversion:
Collaboration diagram for G4PhononDownconversion:

Public Member Functions

 G4PhononDownconversion (const G4String &processName="phononDownconversion")
 
virtual ~G4PhononDownconversion ()
 
virtual G4VParticleChange * PostStepDoIt (const G4Track &, const G4Step &)
 
virtual G4bool IsApplicable (const G4ParticleDefinition &)
 
- Public Member Functions inherited from G4VPhononProcess
 G4VPhononProcess (const G4String &processName)
 
virtual ~G4VPhononProcess ()
 
virtual void StartTracking (G4Track *track)
 
virtual void EndTracking ()
 
- Public Member Functions inherited from G4VDiscreteProcess
 G4VDiscreteProcess (const G4String &, G4ProcessType aType=fNotDefined)
 
 G4VDiscreteProcess (G4VDiscreteProcess &)
 
virtual ~G4VDiscreteProcess ()
 
virtual G4double PostStepGetPhysicalInteractionLength (const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
 
virtual G4double AlongStepGetPhysicalInteractionLength (const G4Track &, G4double, G4double, G4double &, G4GPILSelection *)
 
virtual G4double AtRestGetPhysicalInteractionLength (const G4Track &, G4ForceCondition *)
 
virtual G4VParticleChange * AtRestDoIt (const G4Track &, const G4Step &)
 
virtual G4VParticleChange * AlongStepDoIt (const G4Track &, const G4Step &)
 
- Public Member Functions inherited from G4VProcess
 G4VProcess (const G4String &aName="NoName", G4ProcessType aType=fNotDefined)
 
 G4VProcess (const G4VProcess &right)
 
virtual ~G4VProcess ()
 
G4int operator== (const G4VProcess &right) const
 
G4int operator!= (const G4VProcess &right) const
 
G4double GetCurrentInteractionLength () const
 
void SetPILfactor (G4double value)
 
G4double GetPILfactor () const
 
G4double AlongStepGPIL (const G4Track &track, G4double previousStepSize, G4double currentMinimumStep, G4double &proposedSafety, G4GPILSelection *selection)
 
G4double AtRestGPIL (const G4Track &track, G4ForceCondition *condition)
 
G4double PostStepGPIL (const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
 
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
 
virtual void PreparePhysicsTable (const G4ParticleDefinition &)
 
virtual G4bool StorePhysicsTable (const G4ParticleDefinition *, const G4String &, G4bool)
 
virtual G4bool RetrievePhysicsTable (const G4ParticleDefinition *, const G4String &, G4bool)
 
const G4StringGetPhysicsTableFileName (const G4ParticleDefinition *, const G4String &directory, const G4String &tableName, G4bool ascii=false)
 
const G4StringGetProcessName () const
 
G4ProcessType GetProcessType () const
 
void SetProcessType (G4ProcessType)
 
G4int GetProcessSubType () const
 
void SetProcessSubType (G4int)
 
virtual void SetProcessManager (const G4ProcessManager *)
 
virtual const G4ProcessManagerGetProcessManager ()
 
virtual void ResetNumberOfInteractionLengthLeft ()
 
G4double GetNumberOfInteractionLengthLeft () const
 
G4double GetTotalNumberOfInteractionLengthTraversed () const
 
G4bool isAtRestDoItIsEnabled () const
 
G4bool isAlongStepDoItIsEnabled () const
 
G4bool isPostStepDoItIsEnabled () const
 
virtual void DumpInfo () const
 
void SetVerboseLevel (G4int value)
 
G4int GetVerboseLevel () const
 
virtual void SetMasterProcess (G4VProcess *masterP)
 
const G4VProcessGetMasterProcess () const
 
virtual void BuildWorkerPhysicsTable (const G4ParticleDefinition &part)
 
virtual void PrepareWorkerPhysicsTable (const G4ParticleDefinition &)
 

Protected Member Functions

virtual G4double GetMeanFreePath (const G4Track &, G4double, G4ForceCondition *)
 
- Protected Member Functions inherited from G4VPhononProcess
virtual G4int GetPolarization (const G4Track &track) const
 
virtual G4int GetPolarization (const G4Track *track) const
 
virtual G4int ChoosePolarization (G4double Ldos, G4double STdos, G4double FTdos) const
 
virtual G4Track * CreateSecondary (G4int polarization, const G4ThreeVector &K, G4double energy) const
 
- Protected Member Functions inherited from G4VProcess
void SubtractNumberOfInteractionLengthLeft (G4double previousStepSize)
 
void ClearNumberOfInteractionLengthLeft ()
 

Private Member Functions

G4double GetLTDecayProb (G4double, G4double) const
 
G4double GetTTDecayProb (G4double, G4double) const
 
G4double MakeLDeviation (G4double, G4double) const
 
G4double MakeTTDeviation (G4double, G4double) const
 
G4double MakeTDeviation (G4double, G4double) const
 
void MakeTTSecondaries (const G4Track &)
 
void MakeLTSecondaries (const G4Track &)
 
 G4PhononDownconversion (G4PhononDownconversion &)
 
G4PhononDownconversionoperator= (const G4PhononDownconversion &right)
 

Private Attributes

G4double fBeta
 
G4double fGamma
 
G4double fLambda
 
G4double fMu
 

Additional Inherited Members

- Static Public Member Functions inherited from G4VProcess
static const G4StringGetProcessTypeName (G4ProcessType)
 
- Protected Attributes inherited from G4VPhononProcess
G4PhononTrackMaptrackKmap
 
const G4LatticePhysicaltheLattice
 
- Protected Attributes inherited from G4VProcess
const G4ProcessManageraProcessManager
 
G4VParticleChange * pParticleChange
 
G4ParticleChange aParticleChange
 
G4double theNumberOfInteractionLengthLeft
 
G4double currentInteractionLength
 
G4double theInitialNumberOfInteractionLength
 
G4String theProcessName
 
G4String thePhysicsTableFileName
 
G4ProcessType theProcessType
 
G4int theProcessSubType
 
G4double thePILfactor
 
G4bool enableAtRestDoIt
 
G4bool enableAlongStepDoIt
 
G4bool enablePostStepDoIt
 
G4int verboseLevel
 

Detailed Description

Definition at line 36 of file G4PhononDownconversion.hh.

Constructor & Destructor Documentation

◆ G4PhononDownconversion() [1/2]

G4PhononDownconversion::G4PhononDownconversion ( const G4String processName = "phononDownconversion")

Definition at line 51 of file G4PhononDownconversion.cc.

◆ ~G4PhononDownconversion()

G4PhononDownconversion::~G4PhononDownconversion ( )
virtual

Definition at line 54 of file G4PhononDownconversion.cc.

54 {;}

◆ G4PhononDownconversion() [2/2]

G4PhononDownconversion::G4PhononDownconversion ( G4PhononDownconversion )
private

Member Function Documentation

◆ GetLTDecayProb()

G4double G4PhononDownconversion::GetLTDecayProb ( G4double  d,
G4double  x 
) const
private

Definition at line 111 of file G4PhononDownconversion.cc.

111  {
112  //d=delta= ratio of group velocities vl/vt and x is the fraction of energy in the longitudinal mode, i.e. x=EL'/EL
113  return (1/(x*x))*(1-x*x)*(1-x*x)*((1+x)*(1+x)-d*d*((1-x)*(1-x)))*(1+x*x-d*d*(1-x)*(1-x))*(1+x*x-d*d*(1-x)*(1-x));
114 }
Float_t d
Here is the caller graph for this function:

◆ GetMeanFreePath()

G4double G4PhononDownconversion::GetMeanFreePath ( const G4Track &  aTrack,
G4double  ,
G4ForceCondition *  condition 
)
protectedvirtual

Implements G4VDiscreteProcess.

Definition at line 58 of file G4PhononDownconversion.cc.

60  {
61  //Determines mean free path for longitudinal phonons to split
63  G4double Eoverh = aTrack.GetKineticEnergy()/h_Planck;
64 
65  //Calculate mean free path for anh. decay
66  G4double mfp = aTrack.GetVelocity()/(Eoverh*Eoverh*Eoverh*Eoverh*Eoverh*A);
67 
68  if (verboseLevel > 1)
69  G4cout << "G4PhononDownconversion::GetMeanFreePath = " << mfp << G4endl;
70 
71  *condition = NotForced;
72  return mfp;
73 }
G4double condition(const G4ErrorSymMatrix &m)
const G4LatticePhysical * theLattice
G4int verboseLevel
Definition: G4VProcess.hh:368
float h_Planck
Definition: hepunit.py:263
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
G4double GetAnhDecConstant() const
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:

◆ GetTTDecayProb()

G4double G4PhononDownconversion::GetTTDecayProb ( G4double  d,
G4double  x 
) const
private

Definition at line 119 of file G4PhononDownconversion.cc.

119  {
120  //dynamic constants from Tamura, PRL31, 1985
121  G4double A = 0.5*(1-d*d)*(fBeta+fLambda+(1+d*d)*(fGamma+fMu));
122  G4double B = fBeta+fLambda+2*d*d*(fGamma+fMu);
123  G4double C = fBeta + fLambda + 2*(fGamma+fMu);
124  G4double D = (1-d*d)*(2*fBeta+4*fGamma+fLambda+3*fMu);
125 
126  return (A+B*d*x-B*x*x)*(A+B*d*x-B*x*x)+(C*x*(d-x)-D/(d-x)*(x-d-(1-d*d)/(4*x)))*(C*x*(d-x)-D/(d-x)*(x-d-(1-d*d)/(4*x)));
127 }
Float_t d
double C(double temp)
double A(double temperature)
double D(double temp)
double G4double
Definition: G4Types.hh:76
Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsApplicable()

G4bool G4PhononDownconversion::IsApplicable ( const G4ParticleDefinition aPD)
virtual

Reimplemented from G4VPhononProcess.

Definition at line 102 of file G4PhononDownconversion.cc.

102  {
103  //Only L-phonons decay
104  return (&aPD==G4PhononLong::PhononDefinition());
105 }
static G4PhononLong * PhononDefinition()
Definition: G4PhononLong.cc:74
Here is the call graph for this function:

◆ MakeLDeviation()

G4double G4PhononDownconversion::MakeLDeviation ( G4double  d,
G4double  x 
) const
private

Definition at line 132 of file G4PhononDownconversion.cc.

132  {
133  //change in L'-phonon propagation direction after decay
134 
135  return std::acos((1+(x*x)-((d*d)*(1-x)*(1-x)))/(2*x));
136 }
Float_t d
Here is the caller graph for this function:

◆ MakeLTSecondaries()

void G4PhononDownconversion::MakeLTSecondaries ( const G4Track &  aTrack)
private

Definition at line 217 of file G4PhononDownconversion.cc.

217  {
218  //d is the velocity ratio vL/v
219  G4double d=1.6338;
220  G4double upperBound=1;
221  G4double lowerBound=(d-1)/(d+1);
222 
223  //Use MC method to generate point from distribution:
224  //if a random point on the energy-probability plane is
225  //smaller that the curve of the probability density,
226  //then accept that point.
227  //x=fraction of parent phonon energy in L phonon
228  G4double x = G4UniformRand()*(upperBound-lowerBound) + lowerBound;
229  G4double p = 4.0*G4UniformRand();
230  while(p >= GetLTDecayProb(d, x)) {
231  x = G4UniformRand()*(upperBound-lowerBound) + lowerBound;
232  p = 4.0*G4UniformRand(); //4.0 is about the max in the PDF
233  }
234 
235  //using energy fraction x to calculate daughter phonon directions
236  G4double thetaL=MakeLDeviation(d, x);
237  G4double thetaT=MakeTDeviation(d, x); // FIXME: Should be 1-x?
238  G4ThreeVector dir1=trackKmap->GetK(aTrack);
239  G4ThreeVector dir2=dir1;
240 
242  dir1 = dir1.rotate(dir1.orthogonal(),thetaL).rotate(dir1, ph);
243  dir2 = dir2.rotate(dir2.orthogonal(),-thetaT).rotate(dir2,ph);
244 
245  G4double E=aTrack.GetKineticEnergy();
246  G4double Esec1 = x*E, Esec2 = E-Esec1;
247 
248  // First secondary is longitudnal
249  G4int polarization1 = G4PhononPolarization::Long;
250 
251  // Make FT or ST phonon (0. means no longitudinal)
252  G4int polarization2 = ChoosePolarization(0., theLattice->GetSTDOS(),
253  theLattice->GetFTDOS());
254 
255  // Construct the secondaries and set their wavevectors
256  G4Track* sec1 = CreateSecondary(polarization1, dir1, Esec1);
257  G4Track* sec2 = CreateSecondary(polarization2, dir2, Esec2);
258 
259  aParticleChange.SetNumberOfSecondaries(2);
260  aParticleChange.AddSecondary(sec1);
261  aParticleChange.AddSecondary(sec2);
262 }
G4double GetFTDOS() const
const G4LatticePhysical * theLattice
Float_t d
G4double GetLTDecayProb(G4double, G4double) const
int G4int
Definition: G4Types.hh:78
virtual G4int ChoosePolarization(G4double Ldos, G4double STdos, G4double FTdos) const
G4PhononTrackMap * trackKmap
#define G4UniformRand()
Definition: Randomize.hh:97
const G4ThreeVector & GetK(const G4Track *track) const
static const double twopi
Definition: G4SIunits.hh:75
virtual G4Track * CreateSecondary(G4int polarization, const G4ThreeVector &K, G4double energy) const
Hep3Vector orthogonal() const
G4double MakeLDeviation(G4double, G4double) const
G4double GetSTDOS() const
G4double MakeTDeviation(G4double, G4double) const
G4ParticleChange aParticleChange
Definition: G4VProcess.hh:289
double G4double
Definition: G4Types.hh:76
Hep3Vector & rotate(double, const Hep3Vector &)
Definition: ThreeVectorR.cc:28
Here is the call graph for this function:
Here is the caller graph for this function:

◆ MakeTDeviation()

G4double G4PhononDownconversion::MakeTDeviation ( G4double  d,
G4double  x 
) const
private

Definition at line 141 of file G4PhononDownconversion.cc.

141  {
142  //change in T-phonon propagation direction after decay (L->L+T process)
143 
144  return std::acos((1-x*x+d*d*(1-x)*(1-x))/(2*d*(1-x)));
145 }
Float_t d
Here is the caller graph for this function:

◆ MakeTTDeviation()

G4double G4PhononDownconversion::MakeTTDeviation ( G4double  d,
G4double  x 
) const
private

Definition at line 150 of file G4PhononDownconversion.cc.

150  {
151  //change in T-phonon propagation direction after decay (L->T+T process)
152 
153  return std::acos((1-d*d*(1-x)*(1-x)+d*d*x*x)/(2*d*x));
154 }
Float_t d
Here is the caller graph for this function:

◆ MakeTTSecondaries()

void G4PhononDownconversion::MakeTTSecondaries ( const G4Track &  aTrack)
private

Definition at line 161 of file G4PhononDownconversion.cc.

161  {
162  //d is the velocity ratio vL/vT
163  G4double d=1.6338;
164  G4double upperBound=(1+(1/d))/2;
165  G4double lowerBound=(1-(1/d))/2;
166 
167  //Use MC method to generate point from distribution:
168  //if a random point on the energy-probability plane is
169  //smaller that the curve of the probability density,
170  //then accept that point.
171  //x=fraction of parent phonon energy in first T phonon
172  G4double x = G4UniformRand()*(upperBound-lowerBound) + lowerBound;
173  G4double p = 1.5*G4UniformRand();
174  while(p >= GetTTDecayProb(d, x*d)) {
175  x = G4UniformRand()*(upperBound-lowerBound) + lowerBound;
176  p = 1.5*G4UniformRand();
177  }
178 
179  //using energy fraction x to calculate daughter phonon directions
180  G4double theta1=MakeTTDeviation(d, x);
181  G4double theta2=MakeTTDeviation(d, 1-x);
182  G4ThreeVector dir1=trackKmap->GetK(aTrack);
183  G4ThreeVector dir2=dir1;
184 
185  // FIXME: These extra randoms change timing and causting outputs of example!
186  G4ThreeVector ran = G4RandomDirection(); // FIXME: Drop this line
187 
189  dir1 = dir1.rotate(dir1.orthogonal(),theta1).rotate(dir1, ph);
190  dir2 = dir2.rotate(dir2.orthogonal(),-theta2).rotate(dir2,ph);
191 
192  G4double E=aTrack.GetKineticEnergy();
193  G4double Esec1 = x*E, Esec2 = E-Esec1;
194 
195  // Make FT or ST phonon (0. means no longitudinal)
196  G4int polarization1 = ChoosePolarization(0., theLattice->GetSTDOS(),
197  theLattice->GetFTDOS());
198 
199  // Make FT or ST phonon (0. means no longitudinal)
200  G4int polarization2 = ChoosePolarization(0., theLattice->GetSTDOS(),
201  theLattice->GetFTDOS());
202 
203  // Construct the secondaries and set their wavevectors
204  G4Track* sec1 = CreateSecondary(polarization1, dir1, Esec1);
205  G4Track* sec2 = CreateSecondary(polarization2, dir2, Esec2);
206 
207  aParticleChange.SetNumberOfSecondaries(2);
208  aParticleChange.AddSecondary(sec1);
209  aParticleChange.AddSecondary(sec2);
210 }
G4double GetFTDOS() const
const G4LatticePhysical * theLattice
Float_t d
G4double MakeTTDeviation(G4double, G4double) const
G4double GetTTDecayProb(G4double, G4double) const
G4ThreeVector G4RandomDirection()
int G4int
Definition: G4Types.hh:78
virtual G4int ChoosePolarization(G4double Ldos, G4double STdos, G4double FTdos) const
G4PhononTrackMap * trackKmap
#define G4UniformRand()
Definition: Randomize.hh:97
const G4ThreeVector & GetK(const G4Track *track) const
static const double twopi
Definition: G4SIunits.hh:75
virtual G4Track * CreateSecondary(G4int polarization, const G4ThreeVector &K, G4double energy) const
Hep3Vector orthogonal() const
G4double GetSTDOS() const
G4ParticleChange aParticleChange
Definition: G4VProcess.hh:289
double G4double
Definition: G4Types.hh:76
Hep3Vector & rotate(double, const Hep3Vector &)
Definition: ThreeVectorR.cc:28
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator=()

G4PhononDownconversion& G4PhononDownconversion::operator= ( const G4PhononDownconversion right)
private

◆ PostStepDoIt()

G4VParticleChange * G4PhononDownconversion::PostStepDoIt ( const G4Track &  aTrack,
const G4Step &   
)
virtual

Reimplemented from G4VDiscreteProcess.

Definition at line 78 of file G4PhononDownconversion.cc.

79  {
80  aParticleChange.Initialize(aTrack);
81 
82  //Obtain dynamical constants from this volume's lattice
86  fMu=theLattice->GetMu();
87 
88  //Destroy the parent phonon and create the daughter phonons.
89  //74% chance that daughter phonons are both transverse
90  //26% Transverse and Longitudinal
91  if (G4UniformRand()>0.740) MakeLTSecondaries(aTrack);
92  else MakeTTSecondaries(aTrack);
93 
94  aParticleChange.ProposeEnergy(0.);
95  aParticleChange.ProposeTrackStatus(fStopAndKill);
96 
97  return &aParticleChange;
98 }
const G4LatticePhysical * theLattice
void MakeTTSecondaries(const G4Track &)
void MakeLTSecondaries(const G4Track &)
G4double GetLambda() const
#define G4UniformRand()
Definition: Randomize.hh:97
G4double GetGamma() const
G4double GetMu() const
G4ParticleChange aParticleChange
Definition: G4VProcess.hh:289
G4double GetBeta() const
Here is the call graph for this function:

Member Data Documentation

◆ fBeta

G4double G4PhononDownconversion::fBeta
private

Definition at line 60 of file G4PhononDownconversion.hh.

◆ fGamma

G4double G4PhononDownconversion::fGamma
private

Definition at line 60 of file G4PhononDownconversion.hh.

◆ fLambda

G4double G4PhononDownconversion::fLambda
private

Definition at line 60 of file G4PhononDownconversion.hh.

◆ fMu

G4double G4PhononDownconversion::fMu
private

Definition at line 60 of file G4PhononDownconversion.hh.


The documentation for this class was generated from the following files: