52 G4int noIntegrationVariables,
55 fLastStepLength(0.), fAuxStepper(0)
57 const G4int numberOfVariables = noIntegrationVariables;
58 G4cout <<
"G4TsitourasRK45 constructor called." <<
G4endl;
60 ak2 =
new G4double[numberOfVariables] ;
61 ak3 =
new G4double[numberOfVariables] ;
62 ak4 =
new G4double[numberOfVariables] ;
63 ak5 =
new G4double[numberOfVariables] ;
64 ak6 =
new G4double[numberOfVariables] ;
65 ak7 =
new G4double[numberOfVariables] ;
66 ak8 =
new G4double[numberOfVariables] ;
78 fLastInitialVector =
new G4double[numberOfVariables] ;
79 fLastFinalVector =
new G4double[numberOfVariables] ;
81 fLastDyDx =
new G4double[numberOfVariables];
83 fMidVector =
new G4double[numberOfVariables];
84 fMidError =
new G4double[numberOfVariables];
108 delete[] fLastInitialVector;
109 delete[] fLastFinalVector;
140 b31 = -0.00848065549235698854 ,
141 b32 = 0.335480655492356989 ,
143 b41 = 2.89715305710549343 ,
144 b42 = -6.35944848997507484 ,
145 b43 = 4.36229543286958141 ,
147 b51 = 5.325864828439257,
148 b52 = -11.748883564062828,
149 b53 = 7.49553934288983621 ,
150 b54 = -0.09249506636175525,
152 b61 = 5.8614554429464200,
153 b62 = -12.9209693178471093 ,
154 b63 = 8.1593678985761586 ,
155 b64 = -0.071584973281400997,
156 b65 = -0.0282690503940683829,
159 b71 = 0.0964607668180652295 ,
161 b73 = 0.479889650414499575,
162 b74 = 1.37900857410374189,
163 b75 = -3.2900695154360807,
164 b76 = 2.32471052409977398,
174 dc1 = 0.0935237485818927066 - b71 ,
175 dc2 = 0.00865288314156636761 - b72,
176 dc3 = 0.492893099131431868 - b73 ,
177 dc4 = 1.14023541226785810 - b74 ,
178 dc5 = - 2.3291801924393646 - b75,
179 dc6 = 1.56887504931661552 - b76 ,
193 yOut[7] = yTemp[7] = yIn[7];
196 for(i=0;i<numberOfVariables;i++)
204 for(i=0;i<numberOfVariables;i++)
206 yTemp[i] = yIn[i] + b21*Step*dydx[i] ;
210 for(i=0;i<numberOfVariables;i++)
212 yTemp[i] = yIn[i] + Step*(b31*dydx[i] + b32*ak2[i]) ;
216 for(i=0;i<numberOfVariables;i++)
218 yTemp[i] = yIn[i] + Step*(b41*dydx[i] + b42*ak2[i] + b43*ak3[i]) ;
222 for(i=0;i<numberOfVariables;i++)
224 yTemp[i] = yIn[i] + Step*(b51*dydx[i] + b52*ak2[i] + b53*ak3[i] +
229 for(i=0;i<numberOfVariables;i++)
231 yTemp[i] = yIn[i] + Step*(b61*dydx[i] + b62*ak2[i] + b63*ak3[i] +
232 b64*ak4[i] + b65*ak5[i]) ;
236 for(i=0;i<numberOfVariables;i++)
238 yOut[i] = yIn[i] + Step*(b71*dydx[i] + b72*ak2[i] + b73*ak3[i] +
239 b74*ak4[i] + b75*ak5[i] + b76*ak6[i]);
244 for(i=0;i<numberOfVariables;i++)
246 yErr[i] = Step*(dc1*dydx[i] + dc2*ak2[i] + dc3*ak3[i] + dc4*ak4[i] +
247 dc5*ak5[i] + dc6*ak6[i] + dc7*ak7[i] ) ;
250 fLastInitialVector[i] = yIn[i] ;
251 fLastFinalVector[i] = yOut[i];
252 fLastDyDx[i] = dydx[i];
255 fLastStepLength = Step;
269 G4double bf1, bf2, bf3, bf4, bf5, bf6, bf7;
276 for(
int i=0;i<numberOfVariables;i++)
286 bf1 = -1.0530884977290216*tau*(tau - 1.3299890189751412)*(tau_2 -
287 1.4364028541716351*tau + 0.7139816917074209),
288 bf2 = 0.1017*tau_2*(tau_2 - 2.1966568338249754*tau +
290 bf3 = 2.490627285651252793*tau_2*(tau_2 - 2.38535645472061657*tau
291 + 1.57803468208092486) ,
292 bf4 = -16.54810288924490272*(tau - 1.21712927295533244)*
293 (tau - 0.61620406037800089)*tau_2,
294 bf5 = 47.37952196281928122*(tau - 1.203071208372362603)*
295 (tau - 0.658047292653547382)*tau_2,
296 bf6 = -34.87065786149660974*(tau - 1.2)*(tau -
297 0.666666666666666667)*tau_2,
298 bf7 = 2.5*(tau - 1.0)*(tau - 0.6)*tau_2;
301 for(
int i=0; i<numberOfVariables; i++){
302 yOut[i] = yIn[i] + Step*( bf1*dydx[i] + bf2*ak2[i] + bf3*ak3[i] + bf4*ak4[i]
303 + bf5*ak5[i] + bf6*ak6[i] + bf7*ak7[i] ) ;
316 fLastInitialVector[1], fLastInitialVector[2]);
318 fLastFinalVector[1], fLastFinalVector[2]);
322 fAuxStepper->
Stepper( fLastInitialVector, fLastDyDx, 0.5 * fLastStepLength,
323 fMidVector, fMidError );
325 midPoint =
G4ThreeVector( fMidVector[0], fMidVector[1], fMidVector[2]);
331 if (initialPoint != finalPoint)
334 distChord = distLine;
338 distChord = (midPoint-initialPoint).mag();
CLHEP::Hep3Vector G4ThreeVector
G4double DistChord() const
static G4double Distline(const G4ThreeVector &OtherPnt, const G4ThreeVector &LinePntA, const G4ThreeVector &LinePntB)
G4int GetNumberOfVariables() const
void Stepper(const G4double y[], const G4double dydx[], G4double h, G4double yout[], G4double yerr[])
G4GLOB_DLL std::ostream G4cout
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4int GetNumberOfStateVariables() const
void RightHandSide(const double y[], double dydx[])
G4TsitourasRK45(G4EquationOfMotion *EqRhs, G4int numberOfVariables=6, G4bool primary=true)
void SetupInterpolation()
void Interpolate(const G4double yInput[], const G4double dydx[], const G4double Step, G4double yOut[], G4double tau)