If such an intersection exists, this method calculates the intersection point of the true path of the particle with the surface of the current volume (or of one of its daughters). Should use lateral displacement as measure of convergence.
122{
123
124 const char* MethodName= "G4MultiLevelLocator::EstimateIntersectionPoint()";
125
126 G4bool found_approximate_intersection =
false;
127 G4bool there_is_no_intersection =
false;
128
129 G4FieldTrack CurrentA_PointVelocity = CurveStartPointVelocity;
130 G4FieldTrack CurrentB_PointVelocity = CurveEndPointVelocity;
132 G4bool validNormalAtE =
false;
134
135 G4FieldTrack ApproxIntersecPointV(CurveEndPointVelocity);
136 G4bool validIntersectP=
true;
138 G4bool last_AF_intersection =
false;
139
142
143 G4bool first_section =
true;
144 recalculatedEndPoint = false;
145 G4bool restoredFullEndpoint =
false;
146
147 unsigned int substep_no = 0;
148
149
151
152#ifdef G4DEBUG_FIELD
153 unsigned int trigger_substepno_print = 0;
154 const G4double tolerance = 1.0e-8 * CLHEP::mm;
155 unsigned int biggest_depth = 0;
156
157#endif
158
159
160
161 static G4ThreadLocal G4LocatorChangeLogger endChangeA(
"StartPointA"),
162 endChangeB("EndPointB"), recApproxPoint("ApproxPoint"),
163 pointH_logger("Trial points 'E': position, normal");
164 unsigned int eventCount = 0;
165
167 {
168
169 endChangeA.clear();
170 endChangeB.clear();
171 recApproxPoint.clear();
172 pointH_logger.clear();
173
174
175 ++eventCount;
177 eventCount, CurrentA_PointVelocity );
179 eventCount, CurrentB_PointVelocity );
180 }
181
182
183
184
185
186
187
188
189
190
191
192 const G4int param_substeps = 5;
193
195
196 G4bool Second_half =
false;
197
198
199
200
201
202
203
204 unsigned int depth = 0;
205 ++fNumCalls;
206
208
210 {
212 substep_no, eventCount,
213 G4FieldTrack( CurrentE_Point,0.,NormalAtEntry,0.,
215 #if (G4DEBUG_FIELD>1)
216 G4ThreeVector StartPosition = CurveStartPointVelocity.GetPosition();
217 if( (TrialPoint - StartPosition).mag2() <
sqr(tolerance))
218 {
220 tolerance, fNumCalls);
221 }
222 #endif
223 }
224
225
226
227
228
229 *ptrInterMedFT[0] = CurveEndPointVelocity;
230 for ( auto idepth=1; idepth<max_depth+1; ++idepth )
231 {
232 *ptrInterMedFT[idepth] = CurveStartPointVelocity;
233 }
234
235
236
237 G4bool fin_section_depth[max_depth];
238 for (bool & idepth : fin_section_depth)
239 {
240 idepth = true;
241 }
242
243
244 G4FieldTrack SubStart_PointVelocity = CurveStartPointVelocity;
245
246 do
247 {
248 unsigned int substep_no_p = 0;
249 G4bool sub_final_section =
false;
250
251 SubStart_PointVelocity = CurrentA_PointVelocity;
252
253 do
254 {
257
258#ifdef G4DEBUG_FIELD
262 G4double distAB = (Point_B - Point_A).mag();
264 {
265 G4cerr <<
"ERROR> (Start) Point A coincides with or has gone past (end) point B"
266 <<
"MLL: iters = " << substep_no <<
G4endl;
268 G4cerr <<
" Difference = " << distAB - curv_lenAB
269 <<
" exceeds limit of relative dist (10*epsilon)= " << 10*
fiEpsilonStep
272 G4cerr <<
" Len A, B = " << lenA <<
" " << lenB <<
G4endl
273 <<
" Position A: " << Point_A <<
G4endl
274 <<
" Position B: " << Point_B <<
G4endl;
276
277
279 {
281 }
282 }
283
284 if( !validIntersectP )
285 {
287 errmsg << "Assertion FAILURE - invalid (stale) Interection point. Substep: "
288 << substep_no <<
" call: " << fNumCalls <<
G4endl;
290 {
292 }
293 G4Exception(
"G4MultiLevelLocator::EstimateIntersectionPoint",
"GeomNav0004",
295 }
296#endif
297
298
299
300
303 CurrentB_PointVelocity,
304 CurrentE_Point,
306
307
308#ifdef G4DEBUG_FIELD
310 substep_no, eventCount, ApproxIntersecPointV ) );
312 G4double checkVsEnd= lenB - lenIntsc;
313
314 if( lenIntsc > lenB )
315 {
316 std::ostringstream errmsg;
317 errmsg.precision(17);
319 G4double ratioTol = std::fabs(ratio) / tolerance;
320 errmsg <<
"Intermediate F point is past end B point" <<
G4endl
321 <<
" l( intersection ) = " << lenIntsc <<
G4endl
322 <<
" l( endpoint ) = " << lenB <<
G4endl;
323 errmsg.precision(8);
324 errmsg <<
" l_end - l_inters = " << checkVsEnd <<
G4endl
325 <<
" / l_end = " << ratio <<
G4endl
326 <<
" ratio / tolerance = " << ratioTol <<
G4endl;
327 if( ratioTol < 1.0 )
329 else
331 }
332#endif
333
334 G4ThreeVector CurrentF_Point= ApproxIntersecPointV.GetPosition();
335
336
337
338
339 G4ThreeVector ChordEF_Vector = CurrentF_Point - CurrentE_Point;
340
341 G4ThreeVector NewMomentumDir = ApproxIntersecPointV.GetMomentumDir();
342 G4double MomDir_dot_Norm = NewMomentumDir.
dot( NormalAtEntry );
343
344#ifdef G4DEBUG_FIELD
346 {
350 MomDir_dot_ABchord = (1.0 / ABchord_length)
351 * NewMomentumDir.
dot( ChordAB );
353 ChordEF_Vector, NewMomentumDir, NormalAtEntry, validNormalAtE );
354 G4cout <<
" dot( MomentumDir, ABchord_unit ) = "
355 << MomDir_dot_ABchord <<
G4endl;
356 }
357#endif
359 ( MomDir_dot_Norm >= 0.0 )
360 || (! validNormalAtE );
364 {
365 found_approximate_intersection = true;
366
367
368
369 IntersectedOrRecalculatedFT = ApproxIntersecPointV;
370 IntersectedOrRecalculatedFT.SetPosition( CurrentE_Point );
371
373 {
374
375
377 G4ThreeVector MomentumDir=ApproxIntersecPointV.GetMomentumDirection();
379 CurrentE_Point, CurrentF_Point, MomentumDir,
380 last_AF_intersection, IP, NewSafety,
381 previousSafety, previousSftOrigin );
382 if ( goodCorrection )
383 {
384 IntersectedOrRecalculatedFT = ApproxIntersecPointV;
385 IntersectedOrRecalculatedFT.SetPosition(IP);
386 }
387 }
388
389
390
391
392
393
394 }
395 else
396 {
397
398
399
400
401
403
406 G4bool Intersects_FB =
false;
408 NewSafety, previousSafety,
409 previousSftOrigin,
410 stepLengthAF,
411 PointG );
412 last_AF_intersection = Intersects_AF;
413 if( Intersects_AF )
414 {
415
416
417 CurrentB_PointVelocity = ApproxIntersecPointV;
418 CurrentE_Point = PointG;
419
420 validIntersectP = true;
421
424 validNormalAtE = validNormalLast;
425
426
427
428 fin_section_depth[depth] = false;
429
431 {
432 ++eventCount;
433 endChangeB.push_back(
435 substep_no, eventCount, CurrentB_PointVelocity) );
436 }
437#ifdef G4VERBOSE
439 {
440 G4cout <<
"G4PiF::LI> Investigating intermediate point"
441 << " at s=" << ApproxIntersecPointV.GetCurveLength()
442 << " on way to full s="
443 << CurveEndPointVelocity.GetCurveLength() <<
G4endl;
444 }
445#endif
446 }
447 else
448 {
449
450
451
452
454
457
458
459
460
462 NewSafety, previousSafety,
463 previousSftOrigin,
464 stepLengthFB,
465 PointH );
466 if( Intersects_FB )
467 {
468
469
470
471
472
473
474
475
476
477
478
479
480 CurrentA_PointVelocity = ApproxIntersecPointV;
481 CurrentE_Point = PointH;
482
483 validIntersectP = true;
484
487 validNormalAtE = validNormalH;
488
490 {
491 ++eventCount;
492 endChangeA.push_back(
494 substep_no, eventCount, CurrentA_PointVelocity) );
495 G4FieldTrack intersectH_pn('0');
496
497 intersectH_pn.SetPosition( PointH );
498 intersectH_pn.SetMomentum( NormalAtEntry );
500 substep_no, eventCount, intersectH_pn );
501 }
502 }
503 else
504 {
505 validIntersectP = false;
506 if( fin_section_depth[depth] )
507 {
508
509
510
511
512
513
514
515
516 if( ((Second_half)&&(depth==0)) || (first_section) )
517 {
518 there_is_no_intersection = true;
519 }
520 else
521 {
522
523
524 substep_no_p = param_substeps+2;
525
526
527
528 Second_half = true;
529 sub_final_section = true;
530 }
531 }
532 else
533 {
534 CurrentA_PointVelocity = CurrentB_PointVelocity;
535 CurrentB_PointVelocity = (depth==0) ? CurveEndPointVelocity
536 : *ptrInterMedFT[depth] ;
537 SubStart_PointVelocity = CurrentA_PointVelocity;
538 restoredFullEndpoint = true;
539
540 validIntersectP = false;
541
543 {
544 ++eventCount;
545 endChangeA.push_back(
546 G4LocatorChangeRecord(
548 substep_no, eventCount, CurrentA_PointVelocity) );
549 endChangeB.push_back(
550 G4LocatorChangeRecord (
552 substep_no, eventCount, CurrentB_PointVelocity) );
553 }
554 }
555 }
556 }
557
558 G4int errorEndPt = 0;
559
560 G4bool recalculatedB=
false;
561 if( driverReIntegrates )
562 {
563 G4FieldTrack RevisedB_FT = CurrentB_PointVelocity;
565 CurrentB_PointVelocity,
566 RevisedB_FT,
567 errorEndPt );
568 if( recalculatedB )
569 {
570 CurrentB_PointVelocity = RevisedB_FT;
571
572
573
574
575
576
577 if ( (fin_section_depth[depth])
578 &&( first_section || ((Second_half)&&(depth==0)) ) )
579 {
580 recalculatedEndPoint = true;
581 IntersectedOrRecalculatedFT = RevisedB_FT;
582
583 }
584
585
586
587
588
589 }
591 {
592 ++eventCount;
593 endChangeB.push_back(
595 substep_no, eventCount, RevisedB_FT ) );
596 }
597 }
598 else
599 {
602 {
603 errorEndPt = 2;
604 }
605 }
606
607 if( errorEndPt > 1 )
608 {
609 std::ostringstream errmsg;
610
612 CurveStartPointVelocity, CurveEndPointVelocity,
614 CurrentA_PointVelocity, CurrentB_PointVelocity,
615 SubStart_PointVelocity, CurrentE_Point,
616 ApproxIntersecPointV, substep_no, substep_no_p, depth);
617
619 {
621 }
622
623 errmsg <<
G4endl <<
" * Location: " << MethodName
624 <<
"- After EndIf(Intersects_AF)" <<
G4endl;
625 errmsg << " * Bool flags: Recalculated = " << recalculatedB
626 << " Intersects_AF = " << Intersects_AF
627 <<
" Intersects_FB = " << Intersects_FB <<
G4endl;
628 errmsg <<
" * Number of calls to MLL:EIP= " << fNumCalls <<
G4endl;
630 }
631 if( restoredFullEndpoint )
632 {
633 fin_section_depth[depth] = restoredFullEndpoint;
634 restoredFullEndpoint = false;
635 }
636 }
637
638
639#ifdef G4DEBUG_FIELD
640 if( trigger_substepno_print == 0)
641 {
642 trigger_substepno_print= fWarnSteps - 20;
643 }
644
645 if( substep_no >= trigger_substepno_print )
646 {
647 G4cout <<
"Difficulty in converging in " << MethodName
648 <<
" Substep no = " << substep_no <<
G4endl;
649 if( substep_no == trigger_substepno_print )
650 {
652 printStatus( CurveStartPointVelocity, CurveEndPointVelocity,
653 -1.0, NewSafety, 0 );
656 } else {
657 G4cout <<
" ** For more information enable 'check mode' in G4MultiLevelLocator "
658 <<
"-- (it saves and can output change records) " <<
G4endl;
659 }
660 }
662 printStatus( CurrentA_PointVelocity, CurrentA_PointVelocity,
663 -1.0, NewSafety, substep_no-1 );
665 printStatus( CurrentA_PointVelocity, CurrentB_PointVelocity,
666 -1.0, NewSafety, substep_no );
667 }
668#endif
669 ++substep_no;
670 ++substep_no_p;
671
672 } while ( ( ! found_approximate_intersection )
673 && ( ! there_is_no_intersection )
674 && validIntersectP
675 && ( substep_no_p <= param_substeps) );
676
677
678 if( (!found_approximate_intersection) && (!there_is_no_intersection) )
679 {
684
686
687
688
689
690 if( (did_len < fraction_done*all_len)
691 && (depth<max_depth) && (!sub_final_section) )
692 {
693#ifdef G4DEBUG_FIELD
695 biggest_depth = std::max(depth, biggest_depth);
696 ++numSplits;
697#endif
698 Second_half = false;
699 ++depth;
700 first_section = false;
701
702 G4double Sub_len = (all_len-did_len)/(2.);
703 G4FieldTrack midPoint = CurrentA_PointVelocity;
705 integrDriver->AccurateAdvance(midPoint, Sub_len,
fiEpsilonStep);
706
707 ++fNumAdvanceTrials;
708 if( fullAdvance ) { ++fNumAdvanceFull; }
709
712
713 const G4double adequateFraction = (1.0-CLHEP::perThousand);
714 G4bool goodAdvance = (lenAchieved >= adequateFraction * Sub_len);
715 if ( goodAdvance ) { ++fNumAdvanceGood; }
716
717#ifdef G4DEBUG_FIELD
718 else
719 {
720 G4cout <<
"MLL> AdvanceChordLimited not full at depth=" << depth
721 << " total length achieved = " << lenAchieved << " of "
722 << Sub_len << " fraction= ";
723 if (Sub_len != 0.0 ) {
G4cout << lenAchieved / Sub_len; }
724 else {
G4cout <<
"DivByZero"; }
725 G4cout <<
" Good-enough fraction = " << adequateFraction;
726 G4cout <<
" Number of call to mll = " << fNumCalls
727 << " iteration " << substep_no
728 <<
" inner = " << substep_no_p <<
G4endl;
730 G4cout <<
" State at start is = " << CurrentA_PointVelocity
732 <<
" at end (midpoint)= " << midPoint <<
G4endl;
734
735 G4EquationOfMotion *equation = integrDriver->GetEquationOfMotion();
736 ReportFieldValue( CurrentA_PointVelocity, "start", equation );
737 ReportFieldValue( midPoint, "midPoint", equation );
738 G4cout <<
" Original Start = "
739 << CurveStartPointVelocity <<
G4endl;
740 G4cout <<
" Original End = "
741 << CurveEndPointVelocity <<
G4endl;
742 G4cout <<
" Original TrialPoint = "
744 G4cout <<
" (this is STRICT mode) "
745 << " num Splits= " << numSplits;
747 }
748#endif
749
750 *ptrInterMedFT[depth] = midPoint;
751 CurrentB_PointVelocity = midPoint;
752
754 {
755 ++eventCount;
756 endChangeB.push_back(
758 substep_no, eventCount, midPoint) );
759 }
760
761
762
763 SubStart_PointVelocity = CurrentA_PointVelocity;
764
765
766
769
773 NewSafety, previousSafety,
774 previousSftOrigin, distAB,
775 PointGe);
776 if( Intersects_AB )
777 {
778 last_AF_intersection = Intersects_AB;
779 CurrentE_Point = PointGe;
780 fin_section_depth[depth] = true;
781
782 validIntersectP = true;
783
786 validNormalAtE = validNormalAB;
787 }
788 else
789 {
790
791
792
793 Second_half = true;
794
795 validIntersectP= false;
796 }
797 }
798
799 G4bool unfinished = Second_half;
800 while ( unfinished && (depth>0) )
801 {
802
803
804
805
806
807 SubStart_PointVelocity = *ptrInterMedFT[depth];
808 CurrentA_PointVelocity = *ptrInterMedFT[depth];
809 CurrentB_PointVelocity = *ptrInterMedFT[depth-1];
810
812 {
813 ++eventCount;
815 substep_no, eventCount, CurrentA_PointVelocity);
816 endChangeA.push_back( chngPop_a );
818 substep_no, eventCount, CurrentB_PointVelocity);
819 endChangeB.push_back( chngPop_b );
820 }
821
822
823
824
825 G4int errorEndPt = -1;
826 G4bool recalculatedB=
false;
827 if( driverReIntegrates )
828 {
829
830
831
832 G4FieldTrack RevisedEndPointFT = CurrentB_PointVelocity;
833 recalculatedB =
835 CurrentB_PointVelocity,
836 RevisedEndPointFT,
837 errorEndPt );
838 if( recalculatedB )
839 {
840 CurrentB_PointVelocity = RevisedEndPointFT;
841
842 if ( depth == 1 )
843 {
844 recalculatedEndPoint = true;
845 IntersectedOrRecalculatedFT = RevisedEndPointFT;
846
847 }
848 }
849 else
850 {
853 {
854 errorEndPt = 2;
855 }
856 }
857
859 {
860 ++eventCount;
861 endChangeB.push_back(
863 substep_no, eventCount, RevisedEndPointFT));
864 }
865 }
866 if( errorEndPt > 1 )
867 {
868 std::ostringstream errmsg;
870 CurveStartPointVelocity, CurveEndPointVelocity,
872 CurrentA_PointVelocity, CurrentB_PointVelocity,
873 SubStart_PointVelocity, CurrentE_Point,
874 ApproxIntersecPointV, substep_no, substep_no_p, depth);
875 errmsg <<
" * Location: " << MethodName <<
"- Second-Half" <<
G4endl;
876 errmsg <<
" * Recalculated = " << recalculatedB <<
G4endl;
878 }
879
885 previousSafety,
886 previousSftOrigin, distAB,
887 PointGi);
888 if( Intersects_AB )
889 {
890 last_AF_intersection = Intersects_AB;
891 CurrentE_Point = PointGi;
892
893 validIntersectP = true;
895 }
896 else
897 {
898 validIntersectP = false;
899 if( depth == 1)
900 {
901 there_is_no_intersection = true;
902 }
903 }
904 depth--;
905 fin_section_depth[depth] = true;
906 unfinished = !validIntersectP;
907 }
908#ifdef G4DEBUG_FIELD
909 if( ! ( validIntersectP || there_is_no_intersection ) )
910 {
911
912 G4cout <<
"MLL - WARNING Potential FAILURE: Conditions not met!"
914 <<
" Depth = " << depth <<
G4endl
915 <<
" Num Substeps= " << substep_no <<
G4endl;
916 G4cout <<
" Found intersection= " << found_approximate_intersection
920 CurveStartPointVelocity, CurveEndPointVelocity,
921 substep_no, CurrentA_PointVelocity,
922 CurrentB_PointVelocity,
923 NewSafety, depth );
925 }
926#endif
927 }
928
929 assert( validIntersectP || there_is_no_intersection
930 || found_approximate_intersection);
931
932 } while ( ( ! found_approximate_intersection )
933 && ( ! there_is_no_intersection )
934 && ( substep_no <= fMaxSteps) );
935
936 if( substep_no > max_no_seen )
937 {
938 max_no_seen = substep_no;
939#ifdef G4DEBUG_FIELD
940 if( max_no_seen > fWarnSteps )
941 {
942 trigger_substepno_print = max_no_seen-20;
943 }
944#endif
945 }
946
947 if( !there_is_no_intersection && !found_approximate_intersection )
948 {
949 if( substep_no >= fMaxSteps)
950 {
951
952
953 recalculatedEndPoint = true;
954 IntersectedOrRecalculatedFT = CurrentA_PointVelocity;
955 found_approximate_intersection = false;
956
957 std::ostringstream message;
959 message << "Convergence is requiring too many substeps: "
960 << substep_no << " ( limit = "<< fMaxSteps << ")"
962 <<
" Abandoning effort to intersect. " <<
G4endl <<
G4endl;
963 message << " Number of calls to MLL: " << fNumCalls;
964 message <<
" iteration = " << substep_no <<
G4endl <<
G4endl;
965
966 message.precision( 12 );
968 G4double full_len = CurveEndPointVelocity.GetCurveLength();
969 message << " Undertaken only length: " << done_len
970 <<
" out of " << full_len <<
" required." <<
G4endl
971 << " Remaining length = " << full_len - done_len;
972
973 message <<
" Start and end-point of requested Step:" <<
G4endl;
974 printStatus( CurveStartPointVelocity, CurveEndPointVelocity,
975 -1.0, NewSafety, 0, message, -1 );
976 message <<
" Start and end-point of current Sub-Step:" <<
G4endl;
977 printStatus( CurrentA_PointVelocity, CurrentA_PointVelocity,
978 -1.0, NewSafety, substep_no-1, message, -1 );
979 printStatus( CurrentA_PointVelocity, CurrentB_PointVelocity,
980 -1.0, NewSafety, substep_no, message, -1 );
981
983 }
984 else if( substep_no >= fWarnSteps)
985 {
986 std::ostringstream message;
987 message << "Many substeps while trying to locate intersection."
989 << " Undertaken length: "
991 <<
" - Needed: " << substep_no <<
" substeps." <<
G4endl
992 << " Warning number = " << fWarnSteps
993 << " and maximum substeps = " << fMaxSteps;
995 }
996 }
997
998 return (!there_is_no_intersection) && found_approximate_intersection;
999
1000}
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4GLOB_DLL std::ostream G4cerr
G4GLOB_DLL std::ostream G4cout
double dot(const Hep3Vector &) const
G4FieldTrack ApproxCurvePointV(const G4FieldTrack &curveAPointVelocity, const G4FieldTrack &curveBPointVelocity, const G4ThreeVector ¤tEPoint, G4double epsStep)
G4VIntegrationDriver * GetIntegrationDriver()
G4double GetCurveLength() const
G4ThreeVector GetPosition() const
G4double GetRestMass() const
static std::ostream & ReportEndChanges(std::ostream &os, const G4LocatorChangeLogger &startA, const G4LocatorChangeLogger &endB)
static std::ostream & ReportEndChanges(std::ostream &os, const std::vector< G4LocatorChangeRecord > &startA, const std::vector< G4LocatorChangeRecord > &endB)
virtual void LocateGlobalPointWithinVolume(const G4ThreeVector &position)
virtual G4bool DoesReIntegrate() const =0
G4double fiDeltaIntersection
G4Navigator * GetNavigatorFor()
G4ChordFinder * GetChordFinderFor()
G4ThreeVector GetSurfaceNormal(const G4ThreeVector &CurrentInt_Point, G4bool &validNormal)
static void printStatus(const G4FieldTrack &startFT, const G4FieldTrack ¤tFT, G4double requestStep, G4double safety, G4int stepNum, std::ostream &oss, G4int verboseLevel)
void ReportTrialStep(G4int step_no, const G4ThreeVector &ChordAB_v, const G4ThreeVector &ChordEF_v, const G4ThreeVector &NewMomentumDir, const G4ThreeVector &NormalAtEntry, G4bool validNormal)
G4bool IntersectChord(const G4ThreeVector &StartPointA, const G4ThreeVector &EndPointB, G4double &NewSafety, G4double &PreviousSafety, G4ThreeVector &PreviousSftOrigin, G4double &LinearStepLength, G4ThreeVector &IntersectionPoint, G4bool *calledNavigator=nullptr)
G4bool CheckAndReEstimateEndpoint(const G4FieldTrack &CurrentStartA, const G4FieldTrack &EstimatedEndB, G4FieldTrack &RevisedEndPoint, G4int &errorCode)
void ReportProgress(std::ostream &oss, const G4FieldTrack &StartPointVel, const G4FieldTrack &EndPointVel, G4int substep_no, const G4FieldTrack &A_PtVel, const G4FieldTrack &B_PtVel, G4double safetyLast, G4int depth=-1)
G4double GetEpsilonStepFor()
void ReportImmediateHit(const char *MethodName, const G4ThreeVector &StartPosition, const G4ThreeVector &TrialPoint, G4double tolerance, unsigned long int numCalls)
G4bool GetAdjustementOfFoundIntersection()
G4bool AdjustmentOfFoundIntersection(const G4ThreeVector &A, const G4ThreeVector &CurrentE_Point, const G4ThreeVector &CurrentF_Point, const G4ThreeVector &MomentumDir, const G4bool IntersectAF, G4ThreeVector &IntersectionPoint, G4double &NewSafety, G4double &fPrevSafety, G4ThreeVector &fPrevSftOrigin)
void ReportReversedPoints(std::ostringstream &ossMsg, const G4FieldTrack &StartPointVel, const G4FieldTrack &EndPointVel, G4double NewSafety, G4double epsStep, const G4FieldTrack &CurrentA_PointVelocity, const G4FieldTrack &CurrentB_PointVelocity, const G4FieldTrack &SubStart_PointVelocity, const G4ThreeVector &CurrentE_Point, const G4FieldTrack &ApproxIntersecPointV, G4int sbstp_no, G4int sbstp_no_p, G4int depth)