86 fTAlph = std::tan(fAlph) ;
92 fDx4plus2 = fDx4 + fDx2 ;
93 fDx4minus2 = fDx4 - fDx2 ;
94 fDx3plus1 = fDx3 + fDx1 ;
95 fDx3minus1 = fDx3 - fDx1 ;
96 fDy2plus1 = fDy2 + fDy1 ;
97 fDy2minus1 = fDy2 - fDy1 ;
99 fa1md1 = 2*fDx2 - 2*fDx1 ;
100 fa2md2 = 2*fDx4 - 2*fDx3 ;
102 fPhiTwist = PhiTwist ;
103 fAngleSide = AngleSide ;
105 fdeltaX = 2 * fDz * std::tan(fTheta) * std::cos(fPhi);
107 fdeltaY = 2 * fDz * std::tan(fTheta) * std::sin(fPhi);
125 :
G4VTwistSurface(a), fTheta(0.), fPhi(0.), fDy1(0.), fDx1(0.), fDx2(0.),
126 fDy2(0.), fDx3(0.), fDx4(0.), fDz(0.), fAlph(0.), fTAlph(0.), fPhiTwist(0.),
127 fAngleSide(0.), fDx4plus2(0.), fDx4minus2(0.), fDx3plus1(0.), fDx3minus1(0.),
128 fDy2plus1(0.), fDy2minus1(0.), fa1md1(0.), fa2md2(0.), fdeltaX(0.),
175 GetPhiUAtX(xx,phi,u) ;
209 static const G4double pihalf = pi/2 ;
211 G4bool IsParallel = false ;
212 G4bool IsConverged = false ;
233 distance[j] = kInfinity;
236 gxx[j].
set(kInfinity, kInfinity, kInfinity);
255 G4bool tmpisvalid = false ;
257 std::vector<Intersection> xbuf ;
264 G4double phixz = fPhiTwist * ( p.
x() * v.
z() - p.
z() * v.
x() ) ;
265 G4double phiyz = fPhiTwist * ( p.
y() * v.
z() - p.
z() * v.
y() ) ;
272 if ( std::fabs(p.
z()) <= L )
274 phi = p.
z() * fPhiTwist / L ;
275 u = (fDy1*(4*(-(fdeltaY*phi*v.
x()) + fPhiTwist*p.
y()*v.
x()
276 + fdeltaX*phi*v.
y() - fPhiTwist*p.
x()*v.
y())
277 + ((fDx3plus1 + fDx4plus2)*fPhiTwist
278 + 2*(fDx3minus1 + fDx4minus2)*phi)
279 *(v.
y()*std::cos(phi) - v.
x()*std::sin(phi))))
280 /(fPhiTwist*(4*fDy1* v.
x() - (fa1md1 + 4*fDy1*fTAlph)*v.
y())
281 *std::cos(phi) + fPhiTwist*(fa1md1*v.
x()
282 + 4*fDy1*(fTAlph*v.
x() + v.
y()))*std::sin(phi));
289 xbuf.push_back(xbuftmp) ;
293 distance[0] = kInfinity;
294 gxx[0].
set(kInfinity,kInfinity,kInfinity);
298 areacode[0], isvalid[0],
299 0, validate, &gp, &gv);
310 fDy1*(-4*phixz + 4*fTAlph*phiyz
311 + (fDx3plus1 + fDx4plus2)*fPhiTwist*v.
z())) ;
313 fDy1*(4*fDy1*(phiyz + 2*fDz*v.
x() + fTAlph*(phixz - 2*fDz*v.
y()))
314 - 2*fDy1*(2*fdeltaX + fDx3minus1 + fDx4minus2
315 - 2*fdeltaY*fTAlph)*v.
z()
316 + fa1md1*(phixz - 2*fDz*v.
y() + fdeltaY*v.
z()));
318 fDy1*(fa1md1*(-5*phiyz - 24*fDz*v.
x() + 12*fdeltaX*v.
z()) +
319 fDy1*(20*phixz - 4*(5*fTAlph*phiyz + 24*fDz*fTAlph*v.
x()
320 + 24*fDz*v.
y()) + (48*fdeltaY + (fDx3plus1 + fDx4plus2)
321 *fPhiTwist + 48*fdeltaX*fTAlph)*v.
z()));
323 fDy1*(fa1md1*(phixz - 10*fDz*v.
y() + 5*fdeltaY*v.
z())
324 + 2*fDy1*(2*phiyz + 20*fDz*v.
x()
325 + (-10*fdeltaX + fDx3minus1 + fDx4minus2)*v.
z()
326 + 2*fTAlph*(phixz - 10*fDz*v.
y() + 5*fdeltaY*v.
z())));
328 fDy1*(-(fa1md1*(phiyz + 100*fDz*v.
x() - 50*fdeltaX*v.
z()))
329 + fDy1*(4*phixz - 400*fDz*v.
y()
330 + (200*fdeltaY - (fDx3plus1 + fDx4plus2)*fPhiTwist)*v.
z()
331 - 4*fTAlph*(phiyz + 100*fDz*v.
x() - 50*fdeltaX*v.
z())));
333 fDy1*(4*fDy1*(7*fTAlph*phixz + 7*phiyz - 6*fDz*v.
x() + 6*fDz*fTAlph*v.
y())
334 + 6*fDy1*(2*fdeltaX+fDx3minus1+fDx4minus2-2*fdeltaY*fTAlph)*v.
z()
335 + fa1md1*(7*phixz + 6*fDz*v.
y() - 3*fdeltaY*v.
z()));
337 fDy1*(fa1md1*(-9*phiyz - 56*fDz*v.
x() + 28*fdeltaX*v.
z())
338 + 4*fDy1*(9*phixz - 9*fTAlph*phiyz - 56*fDz*fTAlph*v.
x()
339 - 56*fDz*v.
y() + 28*(fdeltaY + fdeltaX*fTAlph)*v.
z()));
341 fDy1*(fa1md1*(2*fDz*v.
y() - fdeltaY*v.
z())
342 + fDy1*(-8*fDz*v.
x() + 8*fDz*fTAlph*v.
y()
343 + 4*fdeltaX*v.
z() - 4*fdeltaY*fTAlph*v.
z()));
346 G4cout <<
"coef = " << c[0] <<
" "
359 for (
register int i = 0 ; i<num ; i++ )
364 G4cout <<
"Solution " << i <<
" : " << srd[i] <<
G4endl ;
366 phi = std::fmod(srd[i] , pihalf) ;
367 u = (fDy1*(4*(phiyz + 2*fDz*phi*v.
y() - fdeltaY*phi*v.
z())
368 - ((fDx3plus1 + fDx4plus2)*fPhiTwist
369 + 2*(fDx3minus1 + fDx4minus2)*phi)*v.
z()*std::sin(phi)))
370 /(fPhiTwist*v.
z()*(4*fDy1*std::cos(phi)
371 + (fa1md1 + 4*fDy1*fTAlph)*std::sin(phi)));
378 xbuf.push_back(xbuftmp) ;
381 G4cout <<
"solution " << i <<
" = " << phi <<
" , " << u <<
G4endl ;
396 for (
register size_t k = 0 ; k<xbuf.size() ; k++ )
399 G4cout <<
"Solution " << k <<
" : "
400 <<
"reconstructed phiR = " << xbuf[k].phi
401 <<
", uR = " << xbuf[k].u <<
G4endl ;
407 IsConverged = false ;
409 for (
register int i = 1 ; i<maxint ; i++ )
411 xxonsurface = SurfacePoint(phi,u) ;
412 surfacenormal = NormAng(phi,u) ;
415 deltaX = ( tmpxx - xxonsurface ).mag() ;
416 theta = std::fabs(std::acos(v*surfacenormal) - pihalf) ;
428 G4cout <<
"Step i = " << i <<
", distance = " << tmpdist
429 <<
", " << deltaX <<
G4endl ;
433 GetPhiUAtX(tmpxx, phi, u) ;
437 G4cout <<
"approximated phi = " << phi <<
", u = " << u <<
G4endl ;
440 if ( deltaX <= factor*ctol ) { IsConverged = true ; break ; }
444 if ( std::fabs(tmpdist)<ctol ) { tmpdist = 0 ; }
447 G4cout <<
"refined solution " << phi <<
" , " << u <<
G4endl ;
458 tmpareacode = GetAreaCode(tmpxx);
461 if (tmpdist >= 0) tmpisvalid =
true;
466 tmpareacode = GetAreaCode(tmpxx,
false);
469 if (tmpdist >= 0) { tmpisvalid =
true; }
474 G4Exception(
"G4TwistTrapAlphaSide::DistanceToSurface()",
476 "Feature NOT implemented !");
488 xbuf[k].distance = tmpdist ;
489 xbuf[k].areacode = tmpareacode ;
490 xbuf[k].isvalid = tmpisvalid ;
509 G4int nxxtmp = xbuf.size() ;
511 if ( nxxtmp<2 || IsParallel )
527 xbuf.push_back(xbuftmp) ;
542 xbuf.push_back(xbuftmp) ;
544 for (
register size_t k = nxxtmp ; k<xbuf.size() ; k++ )
548 G4cout <<
"Solution " << k <<
" : "
549 <<
"reconstructed phiR = " << xbuf[k].phi
550 <<
", uR = " << xbuf[k].u <<
G4endl ;
556 IsConverged = false ;
558 for (
register int i = 1 ; i<maxint ; i++ )
560 xxonsurface = SurfacePoint(phi,u) ;
561 surfacenormal = NormAng(phi,u) ;
563 deltaX = ( tmpxx - xxonsurface ).mag();
564 theta = std::fabs(std::acos(v*surfacenormal) - pihalf);
575 G4cout <<
"Step i = " << i <<
", distance = " << tmpdist
576 <<
", " << deltaX <<
G4endl
577 <<
"X = " << tmpxx <<
G4endl ;
580 GetPhiUAtX(tmpxx, phi, u) ;
584 G4cout <<
"approximated phi = " << phi <<
", u = " << u <<
G4endl ;
587 if ( deltaX <= factor*ctol ) { IsConverged = true ; break ; }
591 if ( std::fabs(tmpdist)<ctol ) { tmpdist = 0; }
594 G4cout <<
"refined solution " << phi <<
" , " << u <<
G4endl ;
605 tmpareacode = GetAreaCode(tmpxx);
608 if (tmpdist >= 0) { tmpisvalid =
true; }
613 tmpareacode = GetAreaCode(tmpxx,
false);
616 if (tmpdist >= 0) { tmpisvalid =
true; }
621 G4Exception(
"G4TwistedBoxSide::DistanceToSurface()",
623 "Feature NOT implemented !");
635 xbuf[k].distance = tmpdist ;
636 xbuf[k].areacode = tmpareacode ;
637 xbuf[k].isvalid = tmpisvalid ;
656 for (
register size_t i = 0 ; i<xbuf.size() ; i++ )
658 distance[i] = xbuf[i].distance;
660 areacode[i] = xbuf[i].areacode ;
661 isvalid[i] = xbuf[i].isvalid ;
664 isvalid[i], nxx, validate, &gp, &gv);
666 G4cout <<
"element Nr. " << i
667 <<
", local Intersection = " << xbuf[i].xx
668 <<
", distance = " << xbuf[i].distance
669 <<
", u = " << xbuf[i].u
670 <<
", phi = " << xbuf[i].phi
671 <<
", isvalid = " << xbuf[i].isvalid
679 G4cout << nxx <<
" possible physical solutions found" <<
G4endl ;
680 for (
G4int k= 0 ; k< nxx ; k++ )
682 G4cout <<
"global intersection Point found: " << gxx[k] <<
G4endl ;
719 distance[i] = kInfinity;
721 gxx[i].
set(kInfinity, kInfinity, kInfinity);
738 for (
register int i = 1 ; i<20 ; i++ )
740 xxonsurface = SurfacePoint(phiR,uR) ;
741 surfacenormal = NormAng(phiR,uR) ;
743 deltaX = ( xx - xxonsurface ).mag() ;
746 G4cout <<
"i = " << i <<
", distance = " << distance[0]
747 <<
", " << deltaX <<
G4endl
748 <<
"X = " << xx <<
G4endl ;
753 GetPhiUAtX(xx, phiR, uR) ;
755 if ( deltaX <= ctol ) { break ; }
760 uMax = GetBoundaryMax(phiR) ;
762 if ( phiR > halfphi ) { phiR = halfphi ; }
763 if ( phiR < -halfphi ) { phiR = -halfphi ; }
764 if ( uR > uMax ) { uR = uMax ; }
765 if ( uR < -uMax ) { uR = -uMax ; }
767 xxonsurface = SurfacePoint(phiR,uR) ;
768 distance[0] = ( p - xx ).mag() ;
769 if ( distance[0] <= ctol ) { distance[0] = 0 ; }
774 G4cout <<
"refined solution " << phiR <<
" , " << uR <<
" , " <<
G4endl ;
783 G4cout <<
"intersection Point found: " << gxx[0] <<
G4endl ;
806 GetPhiUAtX(xx, phi,yprime ) ;
808 G4double fYAxisMax = GetBoundaryMax(phi) ;
809 G4double fYAxisMin = GetBoundaryMin(phi) ;
813 G4cout <<
"GetAreaCode: yprime = " << yprime <<
G4endl ;
814 G4cout <<
"Intervall is " << fYAxisMin <<
" to " << fYAxisMax <<
G4endl ;
829 if (yprime < fYAxisMin + ctol)
832 if (yprime <= fYAxisMin - ctol) { isoutside =
true; }
835 else if (yprime > fYAxisMax - ctol)
838 if (yprime >= fYAxisMax + ctol) { isoutside =
true; }
852 if (xx.
z() <=
fAxisMin[zaxis] - ctol) { isoutside =
true; }
854 else if (xx.
z() >
fAxisMax[zaxis] - ctol)
862 if (xx.
z() >=
fAxisMax[zaxis] + ctol) { isoutside =
true; }
870 G4int tmpareacode = areacode & (~sInside);
871 areacode = tmpareacode;
883 if (yprime < fYAxisMin )
887 else if (yprime > fYAxisMax)
922 "Feature NOT implemented !");
930void G4TwistTrapAlphaSide::SetCorners()
942 x = -fdeltaX/2. + (fDx1 - fDy1*fTAlph)*std::cos(fPhiTwist/2.)
943 - fDy1*std::sin(fPhiTwist/2.);
944 y = -fdeltaY/2. - fDy1*std::cos(fPhiTwist/2.)
945 + (-fDx1 + fDy1*fTAlph)*std::sin(fPhiTwist/2.);
954 x = -fdeltaX/2. + (fDx2 + fDy1*fTAlph)*std::cos(fPhiTwist/2.)
955 + fDy1*std::sin(fPhiTwist/2.);
956 y = -fdeltaY/2. + fDy1*std::cos(fPhiTwist/2.)
957 - (fDx2 + fDy1*fTAlph)*std::sin(fPhiTwist/2.);
966 x = fdeltaX/2. + (fDx4 + fDy2*fTAlph)*std::cos(fPhiTwist/2.)
967 - fDy2*std::sin(fPhiTwist/2.);
968 y = fdeltaY/2. + fDy2*std::cos(fPhiTwist/2.)
969 + (fDx4 + fDy2*fTAlph)*std::sin(fPhiTwist/2.);
977 x = fdeltaX/2. + (fDx3 - fDy2*fTAlph)*std::cos(fPhiTwist/2.)
978 + fDy2*std::sin(fPhiTwist/2.) ;
979 y = fdeltaY/2. - fDy2*std::cos(fPhiTwist/2.)
980 + (fDx3 - fDy2*fTAlph)*std::sin(fPhiTwist/2.) ;
992 "Method NOT implemented !");
999void G4TwistTrapAlphaSide::SetBoundaries()
1010 direction = direction.
unit();
1016 direction = direction.
unit();
1022 direction = direction.
unit();
1028 direction = direction.
unit();
1037 "Feature NOT implemented !");
1053 phi = p.
z()/(2*fDz)*fPhiTwist ;
1054 u = (fPhiTwist*(2*fDx1*fDx1 - 2*fDx2*fDx2 - fa1md1*(fDx3 + fDx4)
1055 - 4*(fDx3plus1 + fDx4plus2)*fDy1*fTAlph)
1056 - 2*(2*fDx1*fDx1 - 2*fDx2*fDx2 + fa1md1*(fDx3 + fDx4)
1057 + 4*(fDx3minus1 + fDx4minus2)*fDy1*fTAlph)*phi
1058 - 4*(fa1md1*(fdeltaX*phi - fPhiTwist*p.
x())
1059 + 4*fDy1*(fdeltaY*phi + fdeltaX*fTAlph*phi
1060 - fPhiTwist*(fTAlph*p.
x() + p.
y())))*std::cos(phi)
1061 - 4*(fa1md1*fdeltaY*phi - 4*fdeltaX*fDy1*phi
1062 + 4*fdeltaY*fDy1*fTAlph*phi + 4*fDy1*fPhiTwist*p.
x()
1063 - fPhiTwist*(fa1md1 + 4*fDy1*fTAlph)*p.
y())*std::sin(phi))
1064 /(fDy1* fPhiTwist*((std::fabs(((fa1md1 + 4*fDy1*fTAlph)*std::cos(phi))
1065 /fDy1 - 4*std::sin(phi)))
1066 *(std::fabs(((fa1md1 + 4*fDy1*fTAlph)*std::cos(phi))
1067 /fDy1 - 4*std::sin(phi)))
1068 + (std::fabs(4*std::cos(phi)
1069 + ((fa1md1 + 4*fDy1*fTAlph)*std::sin(phi))/fDy1))
1070 * (std::fabs(4*std::cos(phi)
1071 + ((fa1md1 + 4*fDy1*fTAlph)*std::sin(phi))/fDy1)))) ;
1095 GetPhiUAtX( tmpp, phi, u ) ;
1130 for (
register int i = 0 ; i<
n ; i++ )
1132 z = -fDz+i*(2.*fDz)/(n-1) ;
1133 phi = z*fPhiTwist/(2*fDz) ;
1134 b = GetValueB(phi) ;
1136 for (
register int j = 0 ; j<k ; j++ )
1138 nnode =
GetNode(i,j,k,n,iside) ;
1139 u = -b/2 +j*b/(k-1) ;
1140 p = SurfacePoint(phi,u,
true) ;
1142 xyz[nnode][0] = p.
x() ;
1143 xyz[nnode][1] = p.
y() ;
1144 xyz[nnode][2] = p.
z() ;
1146 if ( i<n-1 && j<k-1 )
1148 nface =
GetFace(i,j,k,n,iside) ;
1150 * (
GetNode(i ,j ,k,n,iside)+1) ;
1152 * (
GetNode(i ,j+1,k,n,iside)+1) ;
1154 * (
GetNode(i+1,j+1,k,n,iside)+1) ;
1156 * (
GetNode(i+1,j ,k,n,iside)+1) ;
G4bool DistanceSort(const Intersection &a, const Intersection &b)
G4bool EqualIntersection(const Intersection &a, const Intersection &b)
G4DLLIMPORT 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 G4int DistanceToSurface(const G4ThreeVector &gp, const G4ThreeVector &gv, G4ThreeVector gxx[], G4double distance[], G4int areacode[], G4bool isvalid[], EValidate validate=kValidateWithTol)
virtual ~G4TwistTrapAlphaSide()
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)
G4int GetAreacode(G4int i) const
G4double GetDistance(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=0)
G4bool IsValid(G4int i) const
G4ThreeVector GetXX(G4int i) const
void ResetfDone(EValidate validate, const G4ThreeVector *p, const G4ThreeVector *v=0)
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
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)