113 :
G4VTwistSurface(a), fTheta(0.), fPhi(0.), fDy1(0.), fDx1(0.), fDx2(0.),
114 fDy2(0.), fDx3(0.), fDx4(0.), fDz(0.), fAlph(0.), fTAlph(0.), fPhiTwist(0.),
115 fAngleSide(0.), fDx4plus2(0.), fDx4minus2(0.), fDx3plus1(0.), fDx3minus1(0.),
116 fDy2plus1(0.), fDy2minus1(0.), fa1md1(0.), fa2md2(0.), fdeltaX(0.),
199 G4bool IsParallel = false ;
200 G4bool IsConverged = false ;
243 G4bool tmpisvalid = false ;
245 std::vector<Intersection> xbuf ;
260 if ( std::fabs(p.
z()) <=
L )
267 *(v.
y()*std::cos(phi) - v.
x()*std::sin(phi))))
277 xbuf.push_back(xbuftmp) ;
286 areacode[0], isvalid[0],
287 0, validate, &gp, &gv);
334 G4cout <<
"coef = " << c[0] <<
" "
347 for (
G4int i = 0 ; i<num ; i++ )
352 G4cout <<
"Solution " << i <<
" : " << srd[i] <<
G4endl ;
354 phi = std::fmod(srd[i] , pihalf) ;
366 xbuf.push_back(xbuftmp) ;
369 G4cout <<
"solution " << i <<
" = " << phi <<
" , " << u <<
G4endl ;
384 for (
size_t k = 0 ; k<xbuf.size() ; ++k )
387 G4cout <<
"Solution " << k <<
" : "
388 <<
"reconstructed phiR = " << xbuf[k].phi
389 <<
", uR = " << xbuf[k].u <<
G4endl ;
395 IsConverged = false ;
397 for (
G4int i = 1 ; i<maxint ; ++i )
400 surfacenormal =
NormAng(phi,u) ;
403 deltaX = ( tmpxx - xxonsurface ).mag() ;
404 theta = std::fabs(std::acos(v*surfacenormal) - pihalf) ;
416 G4cout <<
"Step i = " << i <<
", distance = " << tmpdist
417 <<
", " << deltaX <<
G4endl ;
425 G4cout <<
"approximated phi = " << phi <<
", u = " << u <<
G4endl ;
428 if ( deltaX <= factor*ctol ) { IsConverged = true ; break ; }
432 if ( std::fabs(tmpdist)<ctol ) { tmpdist = 0 ; }
435 G4cout <<
"refined solution " << phi <<
" , " << u <<
G4endl ;
449 if (tmpdist >= 0) tmpisvalid =
true;
457 if (tmpdist >= 0) { tmpisvalid =
true; }
462 G4Exception(
"G4TwistTrapAlphaSide::DistanceToSurface()",
464 "Feature NOT implemented !");
476 xbuf[k].distance = tmpdist ;
477 xbuf[k].areacode = tmpareacode ;
478 xbuf[k].isvalid = tmpisvalid ;
497 G4int nxxtmp = xbuf.size() ;
499 if ( nxxtmp<2 || IsParallel )
515 xbuf.push_back(xbuftmp) ;
530 xbuf.push_back(xbuftmp) ;
532 for (
size_t k = nxxtmp ; k<xbuf.size() ; ++k )
536 G4cout <<
"Solution " << k <<
" : "
537 <<
"reconstructed phiR = " << xbuf[k].phi
538 <<
", uR = " << xbuf[k].u <<
G4endl ;
544 IsConverged = false ;
546 for (
G4int i = 1 ; i<maxint ; ++i )
549 surfacenormal =
NormAng(phi,u) ;
551 deltaX = ( tmpxx - xxonsurface ).mag();
552 theta = std::fabs(std::acos(v*surfacenormal) - pihalf);
563 G4cout <<
"Step i = " << i <<
", distance = " << tmpdist
564 <<
", " << deltaX <<
G4endl
565 <<
"X = " << tmpxx <<
G4endl ;
572 G4cout <<
"approximated phi = " << phi <<
", u = " << u <<
G4endl ;
575 if ( deltaX <= factor*ctol ) { IsConverged = true ; break ; }
579 if ( std::fabs(tmpdist)<ctol ) { tmpdist = 0; }
582 G4cout <<
"refined solution " << phi <<
" , " << u <<
G4endl ;
596 if (tmpdist >= 0) { tmpisvalid =
true; }
604 if (tmpdist >= 0) { tmpisvalid =
true; }
609 G4Exception(
"G4TwistedBoxSide::DistanceToSurface()",
611 "Feature NOT implemented !");
623 xbuf[k].distance = tmpdist ;
624 xbuf[k].areacode = tmpareacode ;
625 xbuf[k].isvalid = tmpisvalid ;
644 for (
size_t i = 0 ; i<xbuf.size() ; ++i )
646 distance[i] = xbuf[i].distance;
648 areacode[i] = xbuf[i].areacode ;
649 isvalid[i] = xbuf[i].isvalid ;
652 isvalid[i], nxx, validate, &gp, &gv);
654 G4cout <<
"element Nr. " << i
655 <<
", local Intersection = " << xbuf[i].xx
656 <<
", distance = " << xbuf[i].distance
657 <<
", u = " << xbuf[i].u
658 <<
", phi = " << xbuf[i].phi
659 <<
", isvalid = " << xbuf[i].isvalid
667 G4cout << nxx <<
" possible physical solutions found" <<
G4endl ;
668 for (
G4int k= 0 ; k< nxx ; k++ )
670 G4cout <<
"global intersection Point found: " << gxx[k] <<
G4endl ;
726 for (
G4int i = 1 ; i<20 ; ++i )
729 surfacenormal =
NormAng(phiR,uR) ;
731 deltaX = ( xx - xxonsurface ).mag() ;
734 G4cout <<
"i = " << i <<
", distance = " << distance[0]
735 <<
", " << deltaX <<
G4endl
736 <<
"X = " << xx <<
G4endl ;
743 if ( deltaX <= ctol ) { break ; }
750 if ( phiR > halfphi ) { phiR = halfphi ; }
751 if ( phiR < -halfphi ) { phiR = -halfphi ; }
752 if ( uR > uMax ) { uR = uMax ; }
753 if ( uR < -uMax ) { uR = -uMax ; }
756 distance[0] = ( p - xx ).mag() ;
757 if ( distance[0] <= ctol ) { distance[0] = 0 ; }
762 G4cout <<
"refined solution " << phiR <<
" , " << uR <<
" , " <<
G4endl ;
771 G4cout <<
"intersection Point found: " << gxx[0] <<
G4endl ;
801 G4cout <<
"GetAreaCode: yprime = " << yprime <<
G4endl ;
802 G4cout <<
"Intervall is " << fYAxisMin <<
" to " << fYAxisMax <<
G4endl ;
817 if (yprime < fYAxisMin + ctol)
820 if (yprime <= fYAxisMin - ctol) { isoutside =
true; }
823 else if (yprime > fYAxisMax - ctol)
826 if (yprime >= fYAxisMax + ctol) { isoutside =
true; }
840 if (xx.
z() <=
fAxisMin[zaxis] - ctol) { isoutside =
true; }
842 else if (xx.
z() >
fAxisMax[zaxis] - ctol)
850 if (xx.
z() >=
fAxisMax[zaxis] + ctol) { isoutside =
true; }
858 G4int tmpareacode = areacode & (~sInside);
859 areacode = tmpareacode;
871 if (yprime < fYAxisMin )
875 else if (yprime > fYAxisMax)
910 "Feature NOT implemented !");
980 "Method NOT implemented !");
998 direction = direction.
unit();
1004 direction = direction.
unit();
1010 direction = direction.
unit();
1016 direction = direction.
unit();
1025 "Feature NOT implemented !");
1053 /
fDy1 - 4*std::sin(phi)))
1055 /
fDy1 - 4*std::sin(phi)))
1056 + (std::fabs(4*std::cos(phi)
1058 * (std::fabs(4*std::cos(phi)
1118 for (
G4int i = 0 ; i<
n ; ++i )
1124 for (
G4int j = 0 ; j<k ; ++j )
1127 u = -b/2 +j*b/(k-1) ;
1130 xyz[nnode][0] = p.
x() ;
1131 xyz[nnode][1] = p.
y() ;
1132 xyz[nnode][2] = p.
z() ;
1134 if ( i<
n-1 && j<k-1 )
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
static constexpr double L
static constexpr double pi
G4bool DistanceSort(const Intersection &a, const Intersection &b)
G4bool EqualIntersection(const Intersection &a, const Intersection &b)
G4GLOB_DLL std::ostream G4cout
void set(double x, double y, double z)
HepRotation inverse() const
HepRotation & rotateZ(double delta)
G4int FindRoots(G4double *op, G4int degree, G4double *zeror, G4double *zeroi)
virtual G4double GetBoundaryMax(G4double phi)
virtual G4int GetAreaCode(const G4ThreeVector &xx, G4bool withTol=true)
virtual G4ThreeVector SurfacePoint(G4double phi, G4double u, G4bool isGlobal=false)
virtual G4int DistanceToSurface(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector gxx[], G4double distance[], G4int areacode[], G4bool isvalid[], EValidate validate=kValidateWithTol)
virtual G4double GetBoundaryMin(G4double phi)
virtual ~G4TwistTrapAlphaSide()
virtual void SetBoundaries()
G4TwistTrapAlphaSide(const G4String &name, G4double PhiTwist, G4double pDz, G4double pTheta, G4double pPhi, G4double pDy1, G4double pDx1, G4double pDx2, G4double pDy2, G4double pDx3, G4double pDx4, G4double pAlph, G4double AngleSide)
virtual G4ThreeVector GetNormal(const G4ThreeVector &xx, G4bool isGlobal=false)
G4ThreeVector ProjectPoint(const G4ThreeVector &p, G4bool isglobal=false)
virtual void GetFacets(G4int m, G4int n, G4double xyz[][3], G4int faces[][4], G4int iside)
void GetPhiUAtX(G4ThreeVector p, G4double &phi, G4double &u)
G4double GetValueB(G4double phi)
G4ThreeVector NormAng(G4double phi, G4double u)
virtual void SetCorners()
G4int GetAreacode(G4int i) const
G4double GetDistance(G4int i) const
G4bool IsValid(G4int i) const
void SetCurrentStatus(G4int i, G4ThreeVector &xx, G4double &dist, G4int &areacode, G4bool &isvalid, G4int nxx, EValidate validate, const G4ThreeVector *p, const G4ThreeVector *v=nullptr)
G4ThreeVector GetXX(G4int i) const
void ResetfDone(EValidate validate, const G4ThreeVector *p, const G4ThreeVector *v=nullptr)
static const G4int sC0Min1Min
static const G4int sC0Min1Max
G4double DistanceToPlane(const G4ThreeVector &p, const G4ThreeVector &x0, const G4ThreeVector &n0, G4ThreeVector &xx)
G4int GetNode(G4int i, G4int j, G4int m, G4int n, G4int iside)
static const G4int sOutside
G4ThreeVector ComputeGlobalDirection(const G4ThreeVector &lp) const
static const G4int sAxisMax
static const G4int sAxis0
G4int GetFace(G4int i, G4int j, G4int m, G4int n, G4int iside)
G4int GetEdgeVisibility(G4int i, G4int j, G4int m, G4int n, G4int number, G4int orientation)
G4ThreeVector ComputeLocalDirection(const G4ThreeVector &gp) const
static const G4int sAxisMin
static const G4int sC0Max1Max
static const G4int sAxis1
G4bool IsInside(G4int areacode, G4bool testbitmode=false) const
virtual void SetBoundary(const G4int &axiscode, const G4ThreeVector &direction, const G4ThreeVector &x0, const G4int &boundarytype)
G4ThreeVector ComputeLocalPoint(const G4ThreeVector &gp) const
void SetCorner(G4int areacode, G4double x, G4double y, G4double z)
G4ThreeVector GetCorner(G4int areacode) const
static const G4int sBoundary
static const G4int sAxisZ
G4bool IsOutside(G4int areacode) const
static const G4int sCorner
static const G4int sC0Max1Min
static const G4int sInside
CurrentStatus fCurStatWithV
static const G4int sAxisY
G4double DistanceToPlaneWithV(const G4ThreeVector &p, const G4ThreeVector &v, const G4ThreeVector &x0, const G4ThreeVector &n0, G4ThreeVector &xx)
G4ThreeVector ComputeGlobalPoint(const G4ThreeVector &lp) const
G4SurfCurNormal fCurrentNormal
static const G4double kInfinity
static double normal(HepRandomEngine *eptr)
const char * name(G4int ptype)