Geant4 Cross Reference |
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 // 26 /// \file exoticphysics/monopole/src/G4MonopoleEquation.cc 27 /// \brief Implementation of the G4MonopoleEquation class 28 // 29 // 30 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 // 33 // 34 // class G4MonopoleEquation 35 // 36 // Class description: 37 // 38 // 39 // This is the standard right-hand side for equation of motion. 40 // 41 // The only case another is required is when using a moving reference 42 // frame ... or extending the class to include additional Forces, 43 // eg an electric field 44 // 45 // 10.11.98 V.Grichine 46 // 47 // 30.04.10 S.Burdin (modified to use for the monopole trajectories). 48 // 49 // 15.06.10 B.Bozsogi (replaced the hardcoded magnetic charge with 50 // the one passed by G4MonopoleTransportation) 51 // +workaround to pass the electric charge. 52 // 53 // 12.07.10 S.Burdin (added equations for the electric charges) 54 // ------------------------------------------------------------------- 55 56 #include "G4MonopoleEquation.hh" 57 58 #include "G4PhysicalConstants.hh" 59 #include "G4SystemOfUnits.hh" 60 #include "globals.hh" 61 62 #include <iomanip> 63 64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 65 66 G4MonopoleEquation::G4MonopoleEquation(G4MagneticField* emField) : G4EquationOfMotion(emField) 67 { 68 G4cout << "G4MonopoleEquation::G4MonopoleEquation" << G4endl; 69 } 70 71 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 72 73 G4MonopoleEquation::~G4MonopoleEquation() {} 74 75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 76 77 void G4MonopoleEquation::SetChargeMomentumMass(G4ChargeState particleChargeState, 78 G4double, // momentum, 79 G4double particleMass) 80 { 81 G4double particleMagneticCharge = particleChargeState.MagneticCharge(); 82 G4double particleElectricCharge = particleChargeState.GetCharge(); 83 84 // fElCharge = particleElectricCharge; 85 fElCharge = eplus * particleElectricCharge * c_light; 86 87 fMagCharge = eplus * particleMagneticCharge * c_light; 88 89 // G4cout << " G4MonopoleEquation: ElectricCharge=" << particleElectricCharge 90 // << "; MagneticCharge=" << particleMagneticCharge 91 // << G4endl; 92 93 fMassCof = particleMass * particleMass; 94 } 95 96 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 97 98 void G4MonopoleEquation::EvaluateRhsGivenB(const G4double y[], const G4double Field[], 99 G4double dydx[]) const 100 { 101 // Components of y: 102 // 0-2 dr/ds, 103 // 3-5 dp/ds - momentum derivatives 104 105 G4double pSquared = y[3] * y[3] + y[4] * y[4] + y[5] * y[5]; 106 107 G4double Energy = std::sqrt(pSquared + fMassCof); 108 109 G4double pModuleInverse = 1.0 / std::sqrt(pSquared); 110 111 G4double inverse_velocity = Energy * pModuleInverse / c_light; 112 113 G4double cofEl = fElCharge * pModuleInverse; 114 G4double cofMag = fMagCharge * Energy * pModuleInverse; 115 116 dydx[0] = y[3] * pModuleInverse; 117 dydx[1] = y[4] * pModuleInverse; 118 dydx[2] = y[5] * pModuleInverse; 119 120 // G4double magCharge = twopi * hbar_Planck / (eplus * mu0); 121 // magnetic charge in SI units A*m convention 122 // see http://en.wikipedia.org/wiki/Magnetic_monopole 123 // G4cout << "Magnetic charge: " << magCharge << G4endl; 124 // dp/ds = dp/dt * dt/ds = dp/dt / v = Force / velocity 125 // dydx[3] = fMagCharge * Field[0] * inverse_velocity * c_light; 126 // multiplied by c_light to convert to MeV/mm 127 // dydx[4] = fMagCharge * Field[1] * inverse_velocity * c_light; 128 // dydx[5] = fMagCharge * Field[2] * inverse_velocity * c_light; 129 130 dydx[3] = cofMag * Field[0] + cofEl * (y[4] * Field[2] - y[5] * Field[1]); 131 dydx[4] = cofMag * Field[1] + cofEl * (y[5] * Field[0] - y[3] * Field[2]); 132 dydx[5] = cofMag * Field[2] + cofEl * (y[3] * Field[1] - y[4] * Field[0]); 133 134 // G4cout << std::setprecision(5)<< "E=" << Energy 135 // << "; p="<< 1/pModuleInverse 136 // << "; mC="<< magCharge 137 // <<"; x=" << y[0] 138 // <<"; y=" << y[1] 139 // <<"; z=" << y[2] 140 // <<"; dydx[3]=" << dydx[3] 141 // <<"; dydx[4]=" << dydx[4] 142 // <<"; dydx[5]=" << dydx[5] 143 // << G4endl; 144 145 dydx[6] = 0.; // not used 146 147 // Lab Time of flight 148 dydx[7] = inverse_velocity; 149 return; 150 } 151 152 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 153