Geant4 Cross Reference |
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 // 27 // 28 // 29 // class G4TransportationLogger Implementation 30 // 31 // Author: J. Apostolakis, June 2018 32 // 33 // -------------------------------------------------------------------- 34 35 #include <iomanip> 36 37 #include "G4SystemOfUnits.hh" 38 #include "G4TransportationLogger.hh" 39 #include "G4Track.hh" 40 #include "G4Step.hh" 41 42 G4TransportationLogger::G4TransportationLogger(const G4String& className, 43 G4int verbosity) 44 : fClassName(className), fVerbose(verbosity), 45 fThldWarningEnergy(0.), fThldImportantEnergy(0.), fThldTrials(0) 46 { 47 } 48 49 G4TransportationLogger::G4TransportationLogger(const char* className, 50 G4int verbosity) 51 : fClassName(className), fVerbose(verbosity), 52 fThldWarningEnergy(0.), fThldImportantEnergy(0.), fThldTrials(0) 53 { 54 } 55 56 G4TransportationLogger::~G4TransportationLogger() 57 { 58 } 59 60 // ******************************************************************** 61 // SetThresholds 62 // ******************************************************************** 63 void G4TransportationLogger:: 64 SetThresholds( G4double newEnWarn, G4double importantEnergy, 65 G4int newMaxTrials ) 66 { 67 SetThresholdWarningEnergy( newEnWarn ); 68 SetThresholdImportantEnergy( importantEnergy ); 69 SetThresholdTrials(newMaxTrials ); 70 } 71 72 ///////////////////////////////////////////////////////////////////////////// 73 // 74 void 75 G4TransportationLogger::ReportLooperThresholds( const char* className ) 76 { 77 G4cout << className << ": Current values for thresholds related to " 78 << " the killing of looping tracks: " << G4endl 79 << " Warning Energy = " << GetThresholdWarningEnergy() / CLHEP::MeV << " MeV " 80 << " ( below this tracks are killed without warning ) " << G4endl 81 << " Important Energy = " << GetThresholdImportantEnergy() / CLHEP::MeV 82 << " ( above this tracks are given multiple chances ) " << G4endl 83 << " Extra Trials = " << GetThresholdTrials() 84 << " 'important' tracks, i.e. those above 'important' energy " 85 << G4endl; 86 } 87 88 // ******************************************************************** 89 // ReportLoopingTrack 90 // ******************************************************************** 91 // 92 void G4TransportationLogger::ReportLoopingTrack( const G4Track & track, 93 const G4Step & stepData, 94 G4int numTrials, 95 G4long noCalls, 96 const char* methodName 97 ) const 98 { 99 static std::atomic<unsigned int> numAdviceExcessSteps(0); 100 constexpr double gramPerCm3 = gram / ( centimeter * centimeter * centimeter ) ; 101 std::ostringstream msg; 102 auto preStepPt= stepData.GetPreStepPoint(); 103 auto preStepEn= preStepPt ? preStepPt->GetKineticEnergy() / MeV : -1.0 ; 104 msg << " Transportation is killing track that is looping or stuck. " << G4endl 105 << " Track is " 106 << track.GetParticleDefinition()->GetParticleName() 107 << " and has " << track.GetKineticEnergy() / MeV 108 << " MeV energy ( pre-Step = " << preStepEn << " ) " << G4endl; 109 msg << " momentum = " << track.GetMomentum() << " mag= " << track.GetMomentum().mag() 110 << G4endl 111 << " position = " << track.GetPosition(); 112 auto physVolume= track.GetVolume(); 113 auto material= physVolume->GetLogicalVolume()->GetMaterial(); 114 msg << " is in volume '" << physVolume->GetName() << "', "; 115 if( material ) 116 { 117 msg << " its material is '" << material->GetName() << "'"; 118 msg << " with density = " << material->GetDensity() / gramPerCm3 119 << " g/cm^3 "; 120 } 121 else 122 { 123 msg << " unable to obtain material information (including density.) "; 124 } 125 msg << G4endl; 126 msg << " Total number of Steps by this track: " << track.GetCurrentStepNumber() 127 << G4endl 128 << " Length of this step = " << stepData.GetStepLength() / mm << " mm " 129 << G4endl 130 << " Number of propagation trials = " << numTrials 131 << " ( vs maximum = " << GetThresholdTrials() << " for 'important' particles ) " 132 << G4endl; 133 134 if (noCalls) 135 msg << " ( Number of *calls* of Transport/AlongStepDoIt = " << noCalls << " )" << G4endl; 136 137 const G4int numPrints= 5; 138 if( numAdviceExcessSteps++ < numPrints ) 139 { 140 msg << " =============== Recommendations / advice ====================" << G4endl; 141 msg << " Recommendations to address this issue (Transport-001-ExcessSteps)" << G4endl; 142 msg << " This warning is controlled by the SetThresholdWarningEnergy " 143 << " method of G4Transportation. " << G4endl 144 << " Current value of 'warning' threshold= " 145 << GetThresholdWarningEnergy() / MeV << " MeV " << G4endl; 146 msg << " - If 'unimportant' particles (with energy low enough not to matter in your " 147 << " application, then increase its value. " << G4endl; 148 msg << " - If particles of high-enough energy to be important are being " 149 << " killed, you can " << G4endl 150 << " a) Increase the trial steps using the method SetThresholdTrials(). " 151 << " Particles above the 'important' threshold " << G4endl 152 << " will be given this many 'chances'." 153 << " The default value was 10, and the current value is " << GetThresholdTrials() 154 << G4endl 155 << " b) Increase the energy which you consider 'important' (above this they are" 156 << " killed only after extra trials), using the method SetThresholdImportantEnergy() " << G4endl 157 << " Note: this can incur a potentially high cost in extra simulation time " 158 << " if more tracks require very large number of integration steps . " << G4endl 159 << " c) investigate alternative integration methods " << G4endl 160 << " e.g. Helical methods for uniform or almost uniform fields" 161 << " or else higher order RK methods such as DormandPrince78 " 162 << G4endl; 163 msg << " This information is provided " << numPrints << " times. Current count: " 164 << numAdviceExcessSteps << " / " << numPrints << G4endl; 165 msg << " =============================================================" << G4endl; 166 } 167 const G4String fullMethodName= fClassName + "::" + methodName; 168 G4Exception( fullMethodName, "Transport-001-ExcessSteps", JustWarning, msg); 169 } 170