84 : fParameters(parameters), fG4Field(field), fLogicalVolume(lv)
91 if (fLogicalVolume ==
nullptr)
100 G4bool overwriteDaughtersField =
true;
102 fLogicalVolume->SetFieldManager(fFieldManager, overwriteDaughtersField);
120G4Field* G4FieldSetup::CreateCachedField(
130 if (magField ==
nullptr)
133 "G4FieldSetup::CreateCachedField:",
"GeomFieldParameters0001",
149 G4MagneticField* magField =
nullptr;
152 magField =
dynamic_cast<G4MagneticField*
>(fG4Field);
153 if (magField ==
nullptr)
156 "G4FieldSetup::CreateEquation:",
"GeomFieldParameters0001",
158 "The field type must be set explicitly for other than magnetic field.");
164 G4ElectroMagneticField* elMagField =
nullptr;
167 elMagField =
dynamic_cast<G4ElectroMagneticField*
>(fG4Field);
168 if (elMagField ==
nullptr)
171 "G4FieldSetup::CreateEquation:",
"GeomFieldParameters0001",
173 "The field type must be set explicitly for other than magnetic field.");
182 return new G4Mag_UsualEqRhs(magField);
186 return new G4Mag_SpinEqRhs(magField);
190 return new G4EqMagElectricField(elMagField);
194 return new G4EqEMFieldWithSpin(elMagField);
198 return new G4EqEMFieldWithEDM(elMagField);
206 "G4FieldSetup::CreateEquation:",
"GeomFieldParameters0001",
208 "Only magnetic and electromagnetic field can be constructed with G4FieldBuilder.");
218 "G4FieldSetup::CreateEquation:",
"GeomFieldParameters0001",
230 auto eqRhs =
dynamic_cast<G4Mag_EqRhs*
>(equation);
234 "G4FieldSetup::CreateStepper:",
"GeomFieldParameters0001",
236 "The stepper type requires equation of motion of G4Mag_EqRhs type.");
243 return new G4BogackiShampine23(equation);
247 return new G4BogackiShampine45(equation);
251 return new G4CashKarpRKF45(equation);
255 return new G4ClassicalRK4(equation);
259 return new G4DoLoMcPriRK34(equation);
263 return new G4DormandPrince745(equation);
267 return new G4DormandPrinceRK56(equation);
271 return new G4DormandPrinceRK78(equation);
275 return new G4ExplicitEuler(equation);
279 return new G4ImplicitEuler(equation);
283 return new G4SimpleHeum(equation);
287 return new G4SimpleRunge(equation);
291 return new G4TsitourasRK45(equation);
295 return new G4ConstRK4(eqRhs);
299 return new G4ExactHelixStepper(eqRhs);
303 return new G4HelixExplicitEuler(eqRhs);
307 return new G4HelixHeum(eqRhs);
311 return new G4HelixImplicitEuler(eqRhs);
315 return new G4HelixMixedStepper(eqRhs);
319 return new G4HelixSimpleRunge(eqRhs);
323 return new G4NystromRK4(eqRhs);
327 return new G4RKG3_Stepper(eqRhs);
340 "G4FieldSetup::CreateStepper:",
"GeomFieldParameters0001",
347 "G4FieldSetup::CreateStepper:",
"GeomFieldParameters0001",
362 return new G4FSALIntegrationDriver<G4RK547FEq1>(
363 minStep,
new G4RK547FEq1(equation));
366 return new G4FSALIntegrationDriver<G4RK547FEq2>(
367 minStep,
new G4RK547FEq2(equation));
370 return new G4FSALIntegrationDriver<G4RK547FEq3>(
371 minStep,
new G4RK547FEq3(equation));
375 "G4FieldSetup::CreateFSALStepperAndDriver",
"GeomFieldParameters0001",
382void G4FieldSetup::CreateCachedField()
385 fG4Field = CreateCachedField(fParameters, fG4Field);
389void G4FieldSetup::CreateStepper()
394 fEquation = fParameters.GetUserEquationOfMotion();
400 fEquation = CreateEquation(fParameters.GetEquationType());
402 fEquation->SetFieldObj(fG4Field);
408 fStepper = fParameters.GetUserStepper();
410 else if (fParameters.GetStepperType() >=
kRK547FEq1)
417 fDriver = CreateFSALStepperAndDriver(
418 fEquation, fParameters.GetStepperType(), fParameters.GetMinimumStep());
419 if (fDriver !=
nullptr)
421 fStepper = fDriver->GetStepper();
429 fStepper = CreateStepper(fEquation, fParameters.GetStepperType());
434void G4FieldSetup::CreateChordFinder()
437 if (fParameters.GetFieldType() ==
kMagnetic)
439 if (fDriver !=
nullptr)
441 fChordFinder =
new G4ChordFinder(fDriver);
446 fChordFinder =
new G4ChordFinder(
static_cast<G4MagneticField*
>(fG4Field),
447 fParameters.GetMinimumStep(), fStepper);
449 fChordFinder->SetDeltaChord(fParameters.GetDeltaChord());
453 auto intDriver =
new G4MagInt_Driver(
454 fParameters.GetMinimumStep(), fStepper, fStepper->GetNumberOfVariables());
455 if (intDriver !=
nullptr)
458 fChordFinder =
new G4ChordFinder(intDriver);
464void G4FieldSetup::UpdateFieldManager()
466 fFieldManager->SetChordFinder(fChordFinder);
467 fFieldManager->SetDetectorField(fG4Field);
469 fFieldManager->SetMinimumEpsilonStep(fParameters.GetMinimumEpsilonStep());
470 fFieldManager->SetMaximumEpsilonStep(fParameters.GetMaximumEpsilonStep());
471 fFieldManager->SetDeltaOneStep(fParameters.GetDeltaOneStep());
472 fFieldManager->SetDeltaIntersection(fParameters.GetDeltaIntersection());
484 fChordFinder =
nullptr;
486 if (fG4Field ==
nullptr)
495 fChordFinder =
nullptr;
496 fFieldManager->SetChordFinder(fChordFinder);
497 fFieldManager->SetDetectorField(fG4Field);
507 if (fG4Field ==
nullptr)
516 UpdateFieldManager();
522 if (verboseLevel == 0) {
return; }
525 auto isCachedMagneticField = (fParameters.GetConstDistance() > 0.);
526 if (fLogicalVolume ==
nullptr)
528 fieldType =
"Global";
532 fieldType =
"Local (in ";
533 fieldType.append(fLogicalVolume->GetName());
534 fieldType.append(
")");
536 if (isCachedMagneticField)
538 fieldType.append(
" cached");
541 G4cout << fieldType <<
" field " << about <<
" with stepper ";
545 if (verboseLevel > 1)
547 fParameters.PrintParameters();
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4EquationType
G4EquationType defines the types of equations of motion of a particle in a field in Geant4.
@ kUserEquation
User defined equation of motion.
@ kElectroMagnetic
electromagnetic field
@ kMagnetic
magnetic field
G4StepperType
G4StepperType defines the available integrator of particle's equation of motion in Geant4.
@ kRKG3Stepper
G4RKG3_Stepper.
@ kHelixSimpleRunge
G4HelixSimpleRunge.
@ kNystromRK4
G4NystromRK4.
@ kDormandPrince745
G4DormandPrince745.
@ kCashKarpRKF45
G4CashKarpRKF45.
@ kDormandPrinceRK78
G4DormandPrinceRK78.
@ kSimpleRunge
G4SimpleRunge.
@ kHelixImplicitEuler
G4HelixImplicitEuler.
@ kUserStepper
User defined stepper.
@ kDoLoMcPriRK34
G4DoLoMcPriRK34.
@ kSimpleHeum
G4SimpleHeum.
@ kHelixExplicitEuler
G4HelixExplicitEuler.
@ kDormandPrinceRK56
G4DormandPrinceRK56.
@ kTDormandPrince45
G4TDormandPrince45.
@ kTsitourasRK45
G4TsitourasRK45.
@ kImplicitEuler
G4ImplicitEuler.
@ kExactHelixStepper
G4ExactHelixStepper.
@ kHelixMixedStepper
G4HelixMixedStepper.
@ kBogackiShampine45
G4BogackiShampine45.
@ kExplicitEuler
G4ExplicitEuler.
@ kTCashKarpRKF45
G4TCashKarpRKF45.
@ kBogackiShampine23
G4BogackiShampine23.
@ kClassicalRK4
G4ClassicalRK4.
@ kTMagErrorStepper
G4TMagErrorStepper.
G4GLOB_DLL std::ostream G4cout
G4EquationOfMotion is the abstract base class for the right hand size of the equation of motion of a ...
G4FieldManager is a manager (store) for a pointer to the Field subclass that describes the field of a...
static G4FieldManager * GetGlobalFieldManager()
G4FieldParameters defines the type of equation of motion of a particle in a field and the integration...
G4double GetConstDistance() const
static G4String StepperTypeName(G4StepperType stepper)
static G4String FieldTypeName(G4FieldType field)
G4FieldSetupMessenger is a messenger class that defines commands for G4FieldSetup.
void PrintInfo(G4int verboseLevel, const G4String &about="created")
G4Field is the abstract class for any kind of field. It allows any kind of field (vector,...
G4LogicalVolume represents a leaf node or unpositioned subtree in the geometry hierarchy....
G4MagIntegratorStepper is an abstract base class for integrator of particle's equation of motion,...