ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4FSALIntegrationDriver.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4FSALIntegrationDriver.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 // G4FSALIntegrationDriver
27 //
28 // Class description:
29 //
30 // Driver class which controls the integration error of a Runge-Kutta stepper
31 
32 // Created: D.Sorokin, 2017
33 // --------------------------------------------------------------------
34 #ifndef G4FSALINTEGRATIONDRIVER_HH
35 #define G4FSALINTEGRATIONDRIVER_HH
36 
37 #include "G4RKIntegrationDriver.hh"
38 #include "G4ChordFinderDelegate.hh"
39 
40 template <class T>
42  : public G4RKIntegrationDriver<T> ,
43  public G4ChordFinderDelegate<G4FSALIntegrationDriver<T>>
44 {
45  public:
46 
48  T* stepper,
49  G4int numberOfComponents = 6,
50  G4int statisticsVerbosity = 1);
51 
52  virtual ~G4FSALIntegrationDriver() override;
53 
56 
58  G4double hstep,
59  G4double eps,
60  G4double chordDistance) override;
61 
62  virtual void OnStartTracking() override
63  {
65  }
66 
67  virtual void OnComputeStep() override {}
68 
69  virtual G4bool DoesReIntegrate() override { return true; }
70 
71  virtual G4bool AccurateAdvance( G4FieldTrack& track,
72  G4double hstep,
73  G4double eps, // Requested y_err/hstep
74  G4double hinitial = 0.0) override;
75  // Integrates ODE from current s (s=s0) to s=s0+h with accuracy eps.
76  // On output track is replaced by value at end of interval.
77  // The concept is similar to the odeint routine from NRC p.721-722.
78 
79  virtual G4bool QuickAdvance( G4FieldTrack& fieldTrack,
80  const G4double dydx[],
81  G4double hstep,
82  G4double& dchord_step,
83  G4double& dyerr) override;
84  // QuickAdvance just tries one Step - it does not ensure accuracy.
85 
86  virtual void SetVerboseLevel(G4int newLevel) override;
87  virtual G4int GetVerboseLevel() const override;
88 
89  // Accessors
90 
91  G4double GetMinimumStep() const;
92  void SetMinimumStep(G4double newval);
93 
94  void OneGoodStep(G4double y[], // InOut
95  G4double dydx[],
96  G4double& curveLength,
97  G4double htry,
98  G4double eps,
99  G4double& hdid,
100  G4double& hnext);
101  // This takes one Step that is of size htry, or as large
102  // as possible while satisfying the accuracy criterion of:
103  // yerr < eps * |y_end-y_start|
104 
106  void SetSmallestFraction(G4double val);
107 
108  protected:
109 
111 
112  private:
113 
114  void CheckStep(const G4ThreeVector& posIn,
115  const G4ThreeVector& posOut,
116  G4double hdid);
117 
119  // Minimum Step allowed in a Step (in absolute units)
120 
122  // Smallest fraction of (existing) curve length - in relative units
123  // below this fraction the current step will be the last
124  // Expected range: smaller than 0.1 * epsilon and bigger than 5e-13
125  // ( Note: this range is not enforced. )
126 
128  // Verbosity level for printing (debug, ..)
129  // Could be varied during tracking - to help identify issues
130 
135 
138 };
139 
140 #include "G4FSALIntegrationDriver.icc"
141 
142 #endif