Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // G4RK547FEq2 implementation 27 // 28 // The Butcher table of the Higham & Hall 5(4) 29 // 30 // 0 | 31 // 2/13 | 2/13 32 // 2/13 | 3/52 9/52 33 // 5/9 | 12955/26244 -15925/8748 1 34 // 3/4 | -10383/52480 13923/10496 - 35 // 1 | 1403/7236 -429/268 7 36 // 1 | 181/2700 0 6 37 //-------------------------------------------- 38 // 181/2700 0 6 39 // 11377/154575 0 3 40 // 41 // Author: Dmitry Sorokin, Google Summer of Co 42 // Supervision: John Apostolakis, CERN 43 // ------------------------------------------- 44 45 #include "G4RK547FEq2.hh" 46 #include "G4LineSection.hh" 47 #include "G4FieldUtils.hh" 48 49 using namespace field_utils; 50 51 G4RK547FEq2::G4RK547FEq2(G4EquationOfMotion* E 52 : G4MagIntegratorStepper(EqRhs, integrationV 53 { 54 } 55 56 void G4RK547FEq2::makeStep( const G4double yIn 57 const G4double dyd 58 const G4double hst 59 G4double yOu 60 G4double* dy 61 G4double* yE 62 { 63 G4double yTemp[G4FieldTrack::ncompSVEC]; 64 for (G4int i=GetNumberOfVariables(); i<Get 65 { 66 yOutput[i] = yTemp[i] = yInput[i]; 67 } 68 69 G4double ak2[G4FieldTrack::ncompSVEC], 70 ak3[G4FieldTrack::ncompSVEC], 71 ak4[G4FieldTrack::ncompSVEC], 72 ak5[G4FieldTrack::ncompSVEC], 73 ak6[G4FieldTrack::ncompSVEC]; 74 75 const G4double b21 = 2./13., 76 b31 = 3./52., b32 = 9./52., 77 b41 = 12955./26244., b42 = 78 b43 = 12350./6561., 79 b51 = -10383./52480., b52 = 80 b53 = -176553./199424., 81 b61 = 1403./7236., b62 = -4 82 b64 = -7884./8911., b65 83 b71 = 181./2700., b72 = 0., 84 b74 = 19683./106400., b 85 b76 = 67./800.; 86 87 const G4double dc1 = b71 - 11377./154575., 88 dc2 = b72 - 0., 89 dc3 = b73 - 35378291./10572 90 dc4 = b74 - 343359./1522850 91 dc5 = b75 - 535952./1947645 92 dc6 = b76 - 134./17175., 93 dc7 = 0. - 1./12.; 94 95 // RightHandSide(yInput, dydx); 96 for(G4int i = 0; i < GetNumberOfVariables( 97 { 98 yTemp[i] = yInput[i] + hstep * b21 * dyd 99 } 100 101 RightHandSide(yTemp, ak2); 102 for(G4int i = 0; i < GetNumberOfVariables( 103 { 104 yTemp[i] = yInput[i] + hstep * (b31 * dy 105 } 106 107 RightHandSide(yTemp, ak3); 108 for(G4int i = 0;i < GetNumberOfVariables() 109 { 110 yTemp[i] = yInput[i] + hstep * (b41 * dy 111 b43 * ak 112 } 113 114 RightHandSide(yTemp, ak4); 115 for(G4int i = 0; i < GetNumberOfVariables( 116 { 117 yTemp[i] = yInput[i] + hstep * (b51 * dy 118 b53 * ak 119 } 120 121 RightHandSide(yTemp, ak5); 122 for(G4int i = 0; i < GetNumberOfVariables( 123 { 124 yTemp[i] = yInput[i] + hstep * (b61 * dy 125 b63 * ak 126 b65 * ak 127 } 128 129 RightHandSide(yTemp, ak6); 130 for(G4int i = 0; i < GetNumberOfVariables( 131 { 132 yOutput[i] = yInput[i] + hstep * (b71 * 133 b73 * 134 b75 * 135 } 136 if ((dydxOutput != nullptr) && (yError != 137 { 138 RightHandSide(yOutput, dydxOutput); 139 for(G4int i = 0; i < GetNumberOfVariab 140 { 141 yError[i] = hstep * (dc1 * dydx[i] + 142 dc4 * ak4[i] + 143 dc7 * dydxOutpu 144 } 145 } 146 } 147 148 void G4RK547FEq2::Stepper( const G4double yInp 149 const G4double dydx 150 G4double hste 151 G4double yOut 152 G4double yErr 153 { 154 copy(fyIn, yInput); 155 copy(fdydx, dydx); 156 fhstep = hstep; 157 158 makeStep(fyIn, fdydx, fhstep, fyOut, fdydx 159 160 copy(yOutput, fyOut); 161 } 162 163 void G4RK547FEq2::Stepper( const G4double yInp 164 const G4double dydx 165 G4double hste 166 G4double yOut 167 G4double yErr 168 G4double dydx 169 { 170 copy(fyIn, yInput); 171 copy(fdydx, dydx); 172 fhstep = hstep; 173 174 makeStep(fyIn, fdydx, fhstep, fyOut, fdydx 175 176 copy(yOutput, fyOut); 177 copy(dydxOutput, fdydxOut); 178 } 179 180 G4double G4RK547FEq2::DistChord() const 181 { 182 G4double yMid[G4FieldTrack::ncompSVEC]; 183 makeStep(fyIn, fdydx, fhstep / 2., yMid); 184 185 const G4ThreeVector begin = makeVector(fyI 186 const G4ThreeVector mid = makeVector(yMid, 187 const G4ThreeVector end = makeVector(fyOut 188 189 return G4LineSection::Distline(mid, begin, 190 } 191