Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
XPhononDownconversionProcess.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
28 //
29 // $Id$
30 //
31 
33 
34 #include "G4Step.hh"
35 #include "G4VParticleChange.hh"
36 #include "Randomize.hh"
37 #include "G4RandomDirection.hh"
38 
39 #include "XTPhononFast.hh"
40 #include "XTPhononSlow.hh"
41 #include "XLPhonon.hh"
42 #include <cmath>
43 
45 
47 #include "G4Navigator.hh"
48 #include "G4SystemOfUnits.hh"
49 #include "XLatticeManager3.hh"
50 
51 #include "G4PhysicalConstants.hh"
52 
53 
54 
56 : G4VDiscreteProcess(aName)
57 {
58  if (verboseLevel>1) {
59  G4cout << GetProcessName() << " is created "<< G4endl;
60  }
61  Lattice=0;
62 
63 }
64 
65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
66 
67 
69 {
70 
71 }
72 
73 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
74 
75 
77 : G4VDiscreteProcess(right)
78 {;}
79 
80 G4double
82  const G4Track& aTrack, G4double /*previousStepSize*/, G4ForceCondition* condition )
83 {
84  //Determines mean free path for longitudinal phonons to split
85 
86  //Get pointer to lattice manager singleton and use it to find the
87  //XPhysicalLattice object for current volume
89  Lattice = LM->GetXPhysicalLattice(aTrack.GetVolume());
90 
91  G4double A=Lattice->GetAnhDecConstant();
92  G4double h=6.626068e-34*m2*kg/s; //Schroedinger's constant
93  G4double E= aTrack.GetKineticEnergy();
94 
95  //Calculate mean free path for anh. decay
96  G4double mfp = 1/((E/h)*(E/h)*(E/h)*(E/h)*(E/h)*A)*aTrack.GetVelocity();
97 
98  *condition = NotForced;
99  return mfp;
100 }
101 
102 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
103 
104 
105 
106 
109  const G4Step&)
110 {
111 
112  aParticleChange.Initialize(aTrack);
113 
114  //Get pointer to lattice manager singleton and use it to find the
115  //XPhysicalLattice object for current volume
117  Lattice = LM->GetXPhysicalLattice(aTrack.GetVolume());
118 
119  //Obtain dynamical constants from this volume's lattice
120  fBeta=Lattice->GetBeta();
121  fGamma=Lattice->GetGamma();
122  fLambda=Lattice->GetLambda();
123  fMu=Lattice->GetMu();
124 
125  //Destroy the parent phonon and create the daughter phonons.
126  //74% chance that daughter phonons are both transverse: call MakeTTSecondaries
127  //26% Transverse and Longitudinal: call MakeLTSecondaries
128  if(G4UniformRand()>0.740) MakeLTSecondaries(aTrack); else MakeTTSecondaries(aTrack);
131 
132  return &aParticleChange;
133 }
134 
135 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
136 
137 
138 
140 {
141  //Only L-phonons decay
142  return (&aPD==XLPhonon::PhononDefinition());
143 }
144 
145 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
146 
147 
148 inline double XPhononDownconversionProcess::GetLTDecayProb(double d, double x){
149  //probability density of energy distribution of L'-phonon in L->L'+T process
150  //d=delta= ratio of group velocities vl/vt and x is the fraction of energy in the longitudinal mode, i.e. x=EL'/EL
151  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));
152 }
153 
154 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
155 
156 
157 inline double XPhononDownconversionProcess::GetTTDecayProb(double d, double x){
158  //probability density of energy distribution of T-phonon in L->T+T process
159 
160  //dynamic constants from Tamura, PRL31, 1985
161  G4double A = 0.5*(1-d*d)*(fBeta+fLambda+(1+d*d)*(fGamma+fMu));
162  G4double B = fBeta+fLambda+2*d*d*(fGamma+fMu);
163  G4double C = fBeta + fLambda + 2*(fGamma+fMu);
164  G4double D = (1-d*d)*(2*fBeta+4*fGamma+fLambda+3*fMu);
165 
166  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)));
167 }
168 
169 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
170 
171 
172 inline double XPhononDownconversionProcess::MakeLDeviation(double d, double x){
173  //change in L'-phonon propagation direction after decay
174 
175  return std::acos((1+(x*x)-((d*d)*(1-x)*(1-x)))/(2*x));
176  //return 0;
177 }
178 
179 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
180 
181 
182 inline double XPhononDownconversionProcess::MakeTDeviation(double d, double x){
183  //change in T-phonon propagation direction after decay (L->L+T process)
184 
185  return std::acos((1-x*x+d*d*(1-x)*(1-x))/(2*d*(1-x)));
186  //return 0;
187 }
188 
189 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
190 
191 
192 inline double XPhononDownconversionProcess::MakeTTDeviation(double d, double x){
193  //change in T-phonon propagation direction after decay (L->T+T process)
194 
195  return std::acos((1-d*d*(1-x)*(1-x)+d*d*x*x)/(2*d*x));
196 }
197 
198 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
199 
200 
201 void XPhononDownconversionProcess::MakeTTSecondaries(const G4Track& aTrack){
202  //Generate daughter phonons from L->T+T process
203 
204  //d is the velocity ratio vL/vT
205  G4double d=1.6338;
206  G4double upperBound=(1+(1/d))/2;
207  G4double lowerBound=(1-(1/d))/2;
208 
209  //Use MC method to generate point from distribution:
210  //if a random point on the energy-probability plane is
211  //smaller that the curve of the probability density,
212  //then accept that point.
213  //x=fraction of parent phonon energy in first T phonon
214  G4double x = d*(G4UniformRand()*(upperBound-lowerBound)+lowerBound);
215  G4double p = 1.5*G4UniformRand();
216  while(!(p<GetTTDecayProb(d, x))){
217  x=d*(G4UniformRand()*(upperBound-lowerBound)+lowerBound);
218  p=1.5*G4UniformRand();
219  }
220  x=x/d;
221 
222  //using energy fraction x to calculate daughter phonon directions
223  G4double theta1=MakeTTDeviation(d, (x));
224  G4double theta2=MakeTTDeviation(d, (1-x));
225  G4ThreeVector dir1=((XPhononTrackInformation*)(aTrack.GetUserInformation()))->GetK();
226  G4ThreeVector dir2=dir1;
228 
229  //while(dir1.cross(ran)==0) ran=G4RandomDirection();
230  //dir1 = dir1.rotate(dir1.cross(ran),theta1);
231  //dir2 = dir2.rotate(dir2.cross(ran),-theta2);
232  G4double ph=G4UniformRand()*2*pi;
233  dir1 = dir1.rotate(dir1.orthogonal(),theta1).rotate(dir1, ph);
234  dir2 = dir2.rotate(dir2.orthogonal(),-theta2).rotate(dir2,ph);
235 
237  G4double E=aTrack.GetKineticEnergy();
238  G4Track* sec1;
239  G4Track* sec2;
240 
241  G4double probST = Lattice->GetSTDOS()/(Lattice->GetSTDOS()+Lattice->GetFTDOS());
242 
243  //First secondary:Make FT or ST phonon, probability density is funciton of eqn of state
244  int polarization1;
245  if(G4UniformRand()<probST){ // DOS_slow / (DOS_slow+DOS_fast) = 0.59345 according to ModeDensity.m
246  polarization1 = 1;
247  sec1 = new G4Track(new G4DynamicParticle(XTPhononSlow::PhononDefinition(),Lattice->MapKtoVDir(1,dir1), x*E),aTrack.GetGlobalTime(), aTrack.GetPosition() );
248  }else{
249  polarization1 = 2;
250  sec1 = new G4Track(new G4DynamicParticle(XTPhononFast::PhononDefinition(),Lattice->MapKtoVDir(2,dir1), x*E),aTrack.GetGlobalTime(), aTrack.GetPosition() );
251  }
252 
253  //Second secondary:Make FT or ST phonon, probability density is funciton of eqn of state
254  int polarization2;
255  if(G4UniformRand()<probST){ // DOS_slow / (DOS_slow+DOS_fast) = 0.59345 according to ModeDensity.m
256  polarization2 = 1;
257  sec2 = new G4Track(new G4DynamicParticle(XTPhononSlow::PhononDefinition(),Lattice->MapKtoVDir(1,dir2), (1-x)*E),aTrack.GetGlobalTime(), aTrack.GetPosition() );
258  }else{
259  polarization2 = 2;
260  sec2 = new G4Track(new G4DynamicParticle(XTPhononFast::PhononDefinition(),Lattice->MapKtoVDir(2,dir2), (1-x)*E),aTrack.GetGlobalTime(), aTrack.GetPosition() );
261  }
262 
263  //Set the k-vectors for the two secondaries and add them to the process
265  sec1->SetVelocity(Lattice->MapKtoV(polarization1, dir1)*m/s);
266  sec1->UseGivenVelocity(true);
267 
269  sec2->SetVelocity(Lattice->MapKtoV(polarization2, dir2)*m/s);
270  sec2->UseGivenVelocity(true);
271 
274 
275 
276 }
277 
278 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
279 
280 
281 void XPhononDownconversionProcess::MakeLTSecondaries(const G4Track& aTrack){
282 
283  //d is the velocity ratio vL/v
284  G4double d=1.6338;
285  G4double upperBound=1;
286  G4double lowerBound=(d-1)/(d+1);
287 
288  //Use MC method to generate point from distribution:
289  //if a random point on the energy-probability plane is
290  //smaller that the curve of the probability density,
291  //then accept that point.
292  //x=fraction of parent phonon energy in L phonon
293  G4double x =(G4UniformRand()*(upperBound-lowerBound)+lowerBound);
294  G4double p = 4.0*G4UniformRand();
295  while(!(p<GetLTDecayProb(d, x))){
296  x=(G4UniformRand()*(upperBound-lowerBound)+lowerBound);
297  p=4.0*G4UniformRand(); //4.0 is about the max in the probability density function
298  }
299 
300  //using energy fraction x to calculate daughter phonon directions
301  G4double thetaL=MakeLDeviation(d, x);
302  G4double thetaT=MakeTDeviation(d, x);;
303  G4ThreeVector dir1=((XPhononTrackInformation*)(aTrack.GetUserInformation()))->GetK();
304  G4ThreeVector dir2=dir1;
305 
306  G4double ph=G4UniformRand()*2*pi;
307  dir1 = dir1.rotate(dir1.orthogonal(),thetaL).rotate(dir1, ph);
308  dir2 = dir2.rotate(dir2.orthogonal(),-thetaT).rotate(dir2,ph);
309 
310 
311 
313  G4double E=aTrack.GetKineticEnergy();
314 
315  G4Track* sec1 = new G4Track(new G4DynamicParticle(XLPhonon::PhononDefinition(),Lattice->MapKtoVDir(0,dir1), x*E),aTrack.GetGlobalTime(), aTrack.GetPosition() );
316 
317  G4Track* sec2;
318 
319  //Make FT or ST phonon, probability density is funciton of eqn of state
320  G4double probST = Lattice->GetSTDOS()/(Lattice->GetSTDOS()+Lattice->GetFTDOS());
321  int polarization;
322  if(G4UniformRand()<probST){ // DOS_slow / (DOS_slow+DOS_fast) = 0.59345 according to ModeDensity.m
323 
324  sec2 = new G4Track(new G4DynamicParticle(XTPhononSlow::PhononDefinition(),Lattice->MapKtoVDir(1,dir2), (1-x)*E),aTrack.GetGlobalTime(), aTrack.GetPosition() );
325  polarization = 1;
326 
327  }else{
328 
329  sec2 = new G4Track(new G4DynamicParticle(XTPhononFast::PhononDefinition(),Lattice->MapKtoVDir(2,dir2), (1-x)*E),aTrack.GetGlobalTime(), aTrack.GetPosition() );
330  polarization = 2;
331 
332  }
333 
335  sec1->SetVelocity(Lattice->MapKtoV(0, dir1)*m/s);
336  sec1->UseGivenVelocity(true);
337 
338  sec2->SetUserInformation(new XPhononTrackInformation(dir2));
339  sec2->SetVelocity(Lattice->MapKtoV(polarization, dir2)*m/s);
340  sec2->UseGivenVelocity(true);
341 
344 
345 
346 }
347 
348 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
349