12 #include "CLHEP/Units/SystemOfUnits.h"
15 #include "G4AtlasRK4.hh"
16 #include "G4BogackiShampine23.hh"
17 #include "G4BogackiShampine45.hh"
18 #include "G4CashKarpRKF45.hh"
19 #include "G4ClassicalRK4.hh"
20 #include "G4DoLoMcPriRK34.hh"
21 #include "G4DormandPrince745.hh"
22 #include "G4DormandPrinceRK56.hh"
23 #include "G4DormandPrinceRK78.hh"
24 #include "G4FieldManager.hh"
25 #include "G4HelixExplicitEuler.hh"
26 #include "G4HelixImplicitEuler.hh"
27 #include "G4HelixSimpleRunge.hh"
28 #include "G4NystromRK4.hh"
29 #include "G4RK547FEq1.hh"
30 #include "G4RK547FEq2.hh"
31 #include "G4RK547FEq3.hh"
32 #include "G4RKG3_Stepper.hh"
33 #include "G4TsitourasRK45.hh"
36 #include "G4ChordFinder.hh"
37 #include "G4IntegrationDriver.hh"
38 #include "G4Mag_UsualEqRhs.hh"
39 #include "G4MagIntegratorStepper.hh"
40 #include "G4VIntegrationDriver.hh"
53 const std::string&
name,
71 ATH_MSG_DEBUG(
"Field disabled. Not retrieving G4 field svc.");
77 return StatusCode::SUCCESS;
80 #if G4VERSION_NUMBER >= 1040
85 G4FieldManagerToolBase::createDriverAndStepper(
const std::string&
name, G4MagneticField*
field)
const
88 G4Mag_EqRhs* eqRhs(
nullptr);
92 ATH_MSG_INFO(
"Configuring alternative equation of motion using " <<
98 eqRhs =
new G4Mag_UsualEqRhs(
field);
102 G4VIntegrationDriver*
driver =
nullptr;
103 if (
name==
"HelixImplicitEuler") {
104 G4HelixImplicitEuler* stepper =
new G4HelixImplicitEuler(eqRhs);
105 driver =
new G4IntegrationDriver<G4HelixImplicitEuler>(
106 m_minStep, stepper, stepper->GetNumberOfVariables());
107 }
else if (
name==
"HelixSimpleRunge") {
108 G4HelixSimpleRunge* stepper =
new G4HelixSimpleRunge(eqRhs);
109 driver =
new G4IntegrationDriver<G4HelixSimpleRunge>(
110 m_minStep, stepper, stepper->GetNumberOfVariables());
111 }
else if (
name==
"HelixExplicitEuler") {
112 G4HelixExplicitEuler* stepper =
new G4HelixExplicitEuler(eqRhs);
113 driver =
new G4IntegrationDriver<G4HelixExplicitEuler>(
114 m_minStep, stepper, stepper->GetNumberOfVariables());
115 }
else if (
name==
"NystromRK4") {
116 G4NystromRK4* stepper =
new G4NystromRK4(eqRhs);
117 driver =
new G4IntegrationDriver<G4NystromRK4>(
118 m_minStep, stepper, stepper->GetNumberOfVariables());
119 }
else if (
name==
"ClassicalRK4") {
120 G4ClassicalRK4* stepper =
new G4ClassicalRK4(eqRhs);
121 driver =
new G4IntegrationDriver<G4ClassicalRK4>(
122 m_minStep, stepper, stepper->GetNumberOfVariables());
123 }
else if (
name==
"AtlasRK4") {
124 G4AtlasRK4* stepper =
new G4AtlasRK4(eqRhs);
125 driver =
new G4IntegrationDriver<G4AtlasRK4>(
126 m_minStep, stepper, stepper->GetNumberOfVariables());
127 }
else if (
name==
"BogackiShampine23") {
128 G4BogackiShampine23* stepper =
new G4BogackiShampine23(eqRhs);
129 driver =
new G4IntegrationDriver<G4BogackiShampine23>(
130 m_minStep, stepper, stepper->GetNumberOfVariables());
131 }
else if (
name==
"BogackiShampine45") {
132 G4BogackiShampine45* stepper =
new G4BogackiShampine45(eqRhs);
133 driver =
new G4IntegrationDriver<G4BogackiShampine45>(
134 m_minStep, stepper, stepper->GetNumberOfVariables());
135 }
else if (
name==
"CashKarpRKF45") {
136 G4CashKarpRKF45* stepper =
new G4CashKarpRKF45(eqRhs);
137 driver =
new G4IntegrationDriver<G4CashKarpRKF45>(
138 m_minStep, stepper, stepper->GetNumberOfVariables());
139 }
else if (
name==
"DoLoMcPriRK34") {
140 G4DoLoMcPriRK34* stepper =
new G4DoLoMcPriRK34(eqRhs);
141 driver =
new G4IntegrationDriver<G4DoLoMcPriRK34>(
142 m_minStep, stepper, stepper->GetNumberOfVariables());
143 }
else if (
name==
"DormandPrince745") {
144 G4DormandPrince745* stepper =
new G4DormandPrince745(eqRhs);
145 driver =
new G4IntegrationDriver<G4DormandPrince745>(
146 m_minStep, stepper, stepper->GetNumberOfVariables());
147 }
else if (
name==
"DormandPrinceRK56") {
148 G4DormandPrinceRK56* stepper =
new G4DormandPrinceRK56(eqRhs);
149 driver =
new G4IntegrationDriver<G4DormandPrinceRK56>(
150 m_minStep, stepper, stepper->GetNumberOfVariables());
151 }
else if (
name==
"DormandPrinceRK78") {
152 G4DormandPrinceRK78* stepper =
new G4DormandPrinceRK78(eqRhs);
153 driver =
new G4IntegrationDriver<G4DormandPrinceRK78>(
154 m_minStep, stepper, stepper->GetNumberOfVariables());
155 }
else if (
name==
"RK547FEq1") {
156 G4RK547FEq1* stepper =
new G4RK547FEq1(eqRhs);
157 driver =
new G4IntegrationDriver<G4RK547FEq1>(
158 m_minStep, stepper, stepper->GetNumberOfVariables());
159 }
else if (
name==
"RK547FEq2") {
160 G4RK547FEq2* stepper =
new G4RK547FEq2(eqRhs);
161 driver =
new G4IntegrationDriver<G4RK547FEq2>(
162 m_minStep, stepper, stepper->GetNumberOfVariables());
163 }
else if (
name==
"RK547FEq3") {
164 G4RK547FEq3* stepper =
new G4RK547FEq3(eqRhs);
165 driver =
new G4IntegrationDriver<G4RK547FEq3>(
166 m_minStep, stepper, stepper->GetNumberOfVariables());
167 }
else if (
name==
"RKG3_Stepper") {
168 G4RKG3_Stepper* stepper =
new G4RKG3_Stepper(eqRhs);
169 driver =
new G4IntegrationDriver<G4RKG3_Stepper>(
170 m_minStep, stepper, stepper->GetNumberOfVariables());
171 }
else if (
name==
"TsitourasRK45") {
172 G4TsitourasRK45* stepper =
new G4TsitourasRK45(eqRhs);
173 driver =
new G4IntegrationDriver<G4TsitourasRK45>(
174 m_minStep, stepper, stepper->GetNumberOfVariables());
177 G4NystromRK4* stepper =
new G4NystromRK4(eqRhs);
178 driver =
new G4IntegrationDriver<G4NystromRK4>(
179 m_minStep, stepper, stepper->GetNumberOfVariables());
185 #if G4VERSION_NUMBER < 1040
189 G4MagIntegratorStepper*
193 G4Mag_EqRhs* eqRhs(
nullptr);
197 ATH_MSG_INFO(
"Configuring alternative equation of motion using " <<
203 eqRhs =
new G4Mag_UsualEqRhs(
field);
210 if (
name==
"HelixImplicitEuler")
return new G4HelixImplicitEuler(eqRhs);
211 else if (
name==
"HelixSimpleRunge")
return new G4HelixSimpleRunge(eqRhs);
212 else if (
name==
"HelixExplicitEuler")
return new G4HelixExplicitEuler(eqRhs);
213 else if (
name==
"NystromRK4")
return new G4NystromRK4(eqRhs);
214 else if (
name==
"ClassicalRK4")
return new G4ClassicalRK4(eqRhs);
215 else if (
name==
"AtlasRK4")
return new G4AtlasRK4(eqRhs);
216 else if (
name==
"BogackiShampine23")
return new G4BogackiShampine23(eqRhs);
217 else if (
name==
"BogackiShampine45")
return new G4BogackiShampine45(eqRhs);
218 else if (
name==
"CashKarpRKF45")
return new G4CashKarpRKF45(eqRhs);
219 else if (
name==
"DoLoMcPriRK34")
return new G4DoLoMcPriRK34(eqRhs);
220 else if (
name==
"DormandPrince745")
return new G4DormandPrince745(eqRhs);
221 else if (
name==
"DormandPrinceRK56")
return new G4DormandPrinceRK56(eqRhs);
222 else if (
name==
"DormandPrinceRK78")
return new G4DormandPrinceRK78(eqRhs);
223 else if (
name==
"RK547FEq1")
return new G4RK547FEq1(eqRhs);
224 else if (
name==
"RK547FEq2")
return new G4RK547FEq2(eqRhs);
225 else if (
name==
"RK547FEq3")
return new G4RK547FEq3(eqRhs);
226 else if (
name==
"RKG3_Stepper")
return new G4RKG3_Stepper(eqRhs);
227 else if (
name==
"TsitourasRK45")
return new G4TsitourasRK45(eqRhs);
230 return new G4NystromRK4(eqRhs);
247 auto minEps_actual =
m_minEps > 0 ?
m_minEps.value() : fieldMgr->GetMinimumEpsilonStep();
248 auto maxEps_actual =
m_maxEps > 0 ?
m_maxEps.value() : fieldMgr->GetMaximumEpsilonStep();
252 ATH_MSG_ERROR(
"setFieldParameters received NULL field mgr!");
253 return StatusCode::FAILURE;
255 return StatusCode::SUCCESS;