196 static const G4double pihalf = pi/2 ;
199 G4bool IsParallel = false ;
200 G4bool IsConverged = false ;
221 distance[i] = kInfinity;
224 gxx[i].
set(kInfinity, kInfinity, kInfinity);
242 G4bool tmpisvalid = false ;
244 std::vector<Intersection> xbuf ;
245 Intersection xbuftmp ;
251 G4double phixz = fPhiTwist * ( p.
x() * v.
z() - p.
z() * v.
x() ) ;
252 G4double phiyz = fPhiTwist * ( p.
y() * v.
z() - p.
z() * v.
y() ) ;
258 if ( (std::fabs(p.
z()) <= L) && (fPhiTwist != 0.0) )
260 phi = p.
z() * fPhiTwist / L ;
262 q = (2.* fPhiTwist*((v.
x() - fTAlph*v.
y())*std::cos(phi)
263 + (fTAlph*v.
x() + v.
y())*std::sin(phi)));
267 u = (2*(-(fdeltaY*phi*v.
x()) + fPhiTwist*p.
y()*v.
x()
268 + fdeltaX*phi*v.
y() - fPhiTwist*p.
x()*v.
y())
269 + (fDx4plus2*fPhiTwist + 2*fDx4minus2*phi)
270 * (v.
y()*std::cos(phi) - v.
x()*std::sin(phi))) / q;
275 xbuftmp.distance = kInfinity ;
276 xbuftmp.isvalid = false ;
278 xbuf.push_back(xbuftmp) ;
282 distance[0] = kInfinity;
283 gxx[0].
set(kInfinity,kInfinity,kInfinity);
287 areacode[0], isvalid[0],
288 0, validate, &gp, &gv);
297 c[7] = -14400*(-2*phixz + 2*fTAlph*phiyz + fDx4plus2*fPhiTwist*v.
z()) ;
298 c[6] = 28800*(phiyz + 2*fDz*v.
x() - (fdeltaX + fDx4minus2)*v.
z() + fTAlph*(phixz - 2*fDz*v.
y() + fdeltaY*v.
z())) ;
299 c[5] = -1200*(10*phixz - 48*fDz*v.
y() + 24*fdeltaY*v.
z() + fDx4plus2*fPhiTwist*v.
z() - 2*fTAlph*(5*phiyz + 24*fDz*v.
x() - 12*fdeltaX*v.
z())) ;
300 c[4] = -2400*(phiyz + 10*fDz*v.
x() - 5*fdeltaX*v.
z() + fDx4minus2*v.
z() + fTAlph*(phixz - 10*fDz*v.
y() + 5*fdeltaY*v.
z())) ;
301 c[3] = 24*(2*phixz - 200*fDz*v.
y() + 100*fdeltaY*v.
z() - fDx4plus2*fPhiTwist*v.
z() - 2*fTAlph*(phiyz + 100*fDz*v.
x() - 50*fdeltaX*v.
z())) ;
302 c[2] = -16*(7*fTAlph* phixz + 7*phiyz - 6*fDz*v.
x() + 6*fDz*fTAlph*v.
y() + 3*(fdeltaX + fDx4minus2 - fdeltaY*fTAlph)*v.
z()) ;
303 c[1] = 4*(9*phixz - 9*fTAlph*phiyz - 56*fDz*fTAlph*v.
x() - 56*fDz*v.
y() + 28*(fdeltaY + fdeltaX*fTAlph)*v.
z()) ;
304 c[0] = 36*(2* fDz*(v.
x() - fTAlph*v.
y()) - fdeltaX*v.
z() + fdeltaY*fTAlph*v.
z()) ;
307 G4cout <<
"coef = " << c[0] <<
" "
320 for (
G4int i = 0 ; i<num ; ++i )
322 if ( (si[i]==0.0) && (fPhiTwist != 0.0) )
325 G4cout <<
"Solution " << i <<
" : " << srd[i] <<
G4endl ;
327 phi = std::fmod(srd[i], pihalf) ;
329 u = (2*phiyz + 4*fDz*phi*v.
y() - 2*fdeltaY*phi*v.
z()
330 - fDx4plus2*fPhiTwist*v.
z()*std::sin(phi)
331 - 2*fDx4minus2*phi*v.
z()*std::sin(phi))
332 /(2*fPhiTwist*v.
z()*std::cos(phi)
333 + 2*fPhiTwist*fTAlph*v.
z()*std::sin(phi)) ;
338 xbuftmp.distance = kInfinity ;
339 xbuftmp.isvalid = false ;
341 xbuf.push_back(xbuftmp) ;
344 G4cout <<
"solution " << i <<
" = " << phi <<
" , " << u <<
G4endl ;
351 nxx = (
G4int)xbuf.size() ;
362 for (
auto & k : xbuf)
365 G4cout <<
"Solution " << k <<
" : "
366 <<
"reconstructed phiR = " << xbuf[k].phi
367 <<
", uR = " << xbuf[k].u <<
G4endl ;
373 IsConverged = false ;
375 for (
G4int i = 1 ; i<maxint ; ++i )
377 xxonsurface = SurfacePoint(phi,u) ;
378 surfacenormal = NormAng(phi,u) ;
380 deltaX = ( tmpxx - xxonsurface ).mag() ;
381 theta = std::fabs(std::acos(v*surfacenormal) - pihalf) ;
393 G4cout <<
"Step i = " << i <<
", distance = " << tmpdist <<
", " << deltaX <<
G4endl ;
397 GetPhiUAtX(tmpxx, phi, u) ;
400 G4cout <<
"approximated phi = " << phi <<
", u = " << u <<
G4endl ;
403 if ( deltaX <= factor*ctol ) { IsConverged = true ; break ; }
407 if ( std::fabs(tmpdist)<ctol ) { tmpdist = 0. ; }
410 G4cout <<
"refined solution " << phi <<
" , " << u <<
G4endl ;
421 tmpareacode = GetAreaCode(tmpxx);
424 if (tmpdist >= 0) { tmpisvalid =
true; }
429 tmpareacode = GetAreaCode(tmpxx,
false);
432 if (tmpdist >= 0) { tmpisvalid =
true; }
439 "Feature NOT implemented !");
450 k.distance = tmpdist ;
451 k.areacode = tmpareacode ;
452 k.isvalid = tmpisvalid ;
456 std::sort(xbuf.begin() , xbuf.end(), DistanceSort ) ;
464 xbuf.erase(std::unique(xbuf.begin(),xbuf.end(),EqualIntersection),xbuf.end());
468 auto nxxtmp = (
G4int)xbuf.size() ;
470 if ( nxxtmp<2 || IsParallel )
482 xbuftmp.distance = kInfinity ;
483 xbuftmp.isvalid = false ;
485 xbuf.push_back(xbuftmp) ;
497 xbuftmp.distance = kInfinity ;
498 xbuftmp.isvalid = false ;
500 xbuf.push_back(xbuftmp) ;
502 for ( std::size_t k = nxxtmp ; k<xbuf.size() ; ++k )
505 G4cout <<
"Solution " << k <<
" : "
506 <<
"reconstructed phiR = " << xbuf[k].phi
507 <<
", uR = " << xbuf[k].u <<
G4endl ;
513 IsConverged = false ;
515 for (
G4int i = 1 ; i<maxint ; ++i )
517 xxonsurface = SurfacePoint(phi,u) ;
518 surfacenormal = NormAng(phi,u) ;
520 deltaX = ( tmpxx - xxonsurface ).mag() ;
521 theta = std::fabs(std::acos(v*surfacenormal) - pihalf) ;
532 G4cout <<
"Step i = " << i <<
", distance = "
533 << tmpdist <<
", " << deltaX <<
G4endl ;
537 GetPhiUAtX(tmpxx, phi, u) ;
541 G4cout <<
"approximated phi = " << phi <<
", u = " << u <<
G4endl ;
544 if ( deltaX <= factor*ctol ) { IsConverged = true ; break ; }
548 if ( std::fabs(tmpdist)<ctol ) { tmpdist = 0. ; }
551 G4cout <<
"refined solution " << phi <<
" , " << u <<
G4endl ;
562 tmpareacode = GetAreaCode(tmpxx);
565 if (tmpdist >= 0) { tmpisvalid =
true; }
570 tmpareacode = GetAreaCode(tmpxx,
false);
573 if (tmpdist >= 0) { tmpisvalid =
true; }
578 G4Exception(
"G4TwistedBoxSide::DistanceToSurface()",
580 "Feature NOT implemented !");
591 xbuf[k].distance = tmpdist ;
592 xbuf[k].areacode = tmpareacode ;
593 xbuf[k].isvalid = tmpisvalid ;
598 std::sort(xbuf.begin() , xbuf.end(), DistanceSort ) ;
601 xbuf.erase(std::unique(xbuf.begin(),xbuf.end(),EqualIntersection),xbuf.end());
608 nxx = (
G4int)xbuf.size() ;
610 for (
G4int i = 0 ; i<(
G4int)xbuf.size() ; ++i )
612 distance[i] = xbuf[i].distance;
614 areacode[i] = xbuf[i].areacode ;
615 isvalid[i] = xbuf[i].isvalid ;
617 fCurStatWithV.SetCurrentStatus(i, gxx[i], distance[i], areacode[i],
618 isvalid[i], nxx, validate, &gp, &gv);
621 G4cout <<
"element Nr. " << i
622 <<
", local Intersection = " << xbuf[i].xx
623 <<
", distance = " << xbuf[i].distance
624 <<
", u = " << xbuf[i].u
625 <<
", phi = " << xbuf[i].phi
626 <<
", isvalid = " << xbuf[i].isvalid
634 G4cout << nxx <<
" possible physical solutions found" <<
G4endl ;
635 for (
G4int k= 0 ; k< nxx ; ++k )
637 G4cout <<
"global intersection Point found: " << gxx[k] <<
G4endl ;
663 distance[i] =
fCurStat.GetDistance(i);
664 areacode[i] =
fCurStat.GetAreacode(i);
672 distance[i] = kInfinity;
674 gxx[i].
set(kInfinity, kInfinity, kInfinity);
690 for (
G4int i = 1 ; i<maxint ; ++i )
692 xxonsurface = SurfacePoint(phiR,uR) ;
693 surfacenormal = NormAng(phiR,uR) ;
695 deltaX = ( xx - xxonsurface ).mag() ;
698 G4cout <<
"i = " << i <<
", distance = " << distance[0]
699 <<
", " << deltaX <<
G4endl ;
704 GetPhiUAtX(xx, phiR, uR) ;
706 if ( deltaX <= ctol ) { break ; }
712 G4double uMax = GetBoundaryMax(phiR) ;
714 if ( phiR > halfphi ) { phiR = halfphi ; }
715 if ( phiR < -halfphi ) { phiR = -halfphi ; }
716 if ( uR > uMax ) { uR = uMax ; }
717 if ( uR < -uMax ) { uR = -uMax ; }
719 xxonsurface = SurfacePoint(phiR,uR) ;
720 distance[0] = ( p - xx ).mag() ;
721 if ( distance[0] <= ctol ) { distance[0] = 0 ; }
726 G4cout <<
"refined solution " << phiR <<
" , " << uR <<
" , " <<
G4endl ;
735 G4cout <<
"intersection Point found: " << gxx[0] <<
G4endl ;
739 fCurStat.SetCurrentStatus(0, gxx[0], distance[0], areacode[0],