ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4VIntegrationDriver.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4VIntegrationDriver.hh
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 // G4VIntegrationDriver
27 //
28 // Class description:
29 //
30 // Abstract base class for 'driver' classes which are responsible for
31 // undertaking integration of an state given an equation of motion and
32 // within acceptable error bound(s).
33 //
34 // Different integration methods are meant to be provided via this
35 // common interface, and can span the original type (explicit Runge Kutta
36 // methods), enhanced RK methods and alternatives such as the
37 // Bulirsch-Stoer and multi-step methods.
38 //
39 // The drivers' key mission is to insure that the error is below set values.
40 
41 // Author: Dmitry Sorokin, Google Summer of Code 2017
42 // Supervision: John Apostolakis, CERN
43 // --------------------------------------------------------------------
44 #ifndef G4VINTEGRATION_DRIVER_HH
45 #define G4VINTEGRATION_DRIVER_HH
46 
47 #include "G4Types.hh"
48 #include "G4FieldTrack.hh"
50 
52 {
53  public:
54 
55  virtual ~G4VIntegrationDriver() = default;
56 
58  G4double hstep,
59  G4double eps,
60  G4double chordDistance) = 0;
61 
62  virtual G4bool AccurateAdvance(G4FieldTrack& track,
63  G4double hstep,
64  G4double eps, // Requested y_err/hstep
65  G4double hinitial = 0) = 0;
66 
67  virtual void SetEquationOfMotion(G4EquationOfMotion* equation) = 0;
69 
70  virtual void RenewStepperAndAdjust(G4MagIntegratorStepper* pItsStepper);
71  // Method for compatibility -- relevant only for G4MagIntegratorDriver
72 
73  virtual void SetVerboseLevel(G4int level) = 0;
74  virtual G4int GetVerboseLevel() const = 0;
75 
76  virtual void OnComputeStep() = 0;
77 
78  virtual void OnStartTracking() = 0;
79 
80  public: // without description
81 
82  //[[deprecated("will be removed")]]
83  virtual G4bool QuickAdvance(G4FieldTrack& /*track*/, // INOUT
84  const G4double /*dydx*/[],
85  G4double /*hstep*/,
86  G4double& /*dchord_step*/,
87  G4double& /*dyerr*/) { return false; }
88 
89  //[[deprecated("will be removed")]]
90  virtual void GetDerivatives(const G4FieldTrack& track,
91  G4double dydx[]) const = 0;
92 
93  //[[deprecated("will be removed")]]
94  virtual void GetDerivatives(const G4FieldTrack& track,
95  G4double dydx[],
96  G4double field[]) const = 0;
97 
98  //[[deprecated("use GetEquationOfMotion() instead of GetStepper()->GetEquationOfMotion()")]]
99  virtual const G4MagIntegratorStepper* GetStepper() const = 0;
100  virtual G4MagIntegratorStepper* GetStepper() = 0;
101 
102  //[[deprecated("will be removed")]]
103  virtual G4double ComputeNewStepSize(G4double errMaxNorm, // normalised error
104  G4double hstepCurrent) = 0;
105  // Taking the last step's normalised error, calculate
106  // a step size for the next step.
107  // Do not limit the next step's size within a factor of the current one.
108 
109  virtual G4bool DoesReIntegrate() = 0;
110  // Whether the driver implementates re-integration
111  // - original Integration driver will re-start and re-calculate interval => yes
112  // - Interpolation Driver does not recalculate (it interpolates)
113  // Basically answer: does this driver *Recalculate* when AccurateAdvance is called ?
114  protected:
115 
116  static constexpr G4double max_stepping_increase = 5;
117  static constexpr G4double max_stepping_decrease = 0.1;
118 };
119 
120 #endif