184 static const G4double pihalf = pi/2 ;
187 G4bool IsParallel = false ;
188 G4bool IsConverged = false ;
209 distance[j] = kInfinity;
212 gxx[j].
set(kInfinity, kInfinity, kInfinity);
230 G4bool tmpisvalid = false ;
232 std::vector<Intersection> xbuf ;
233 Intersection xbuftmp ;
239 G4double phixz = fPhiTwist * ( p.
x() * v.
z() - p.
z() * v.
x() ) ;
240 G4double phiyz = fPhiTwist * ( p.
y() * v.
z() - p.
z() * v.
y() ) ;
247 if ( std::fabs(p.
z()) <= L )
249 phi = p.
z() * fPhiTwist / L ;
250 u = (fDy1*(4*(-(fdeltaY*phi*v.
x()) + fPhiTwist*p.
y()*v.
x()
251 + fdeltaX*phi*v.
y() - fPhiTwist*p.
x()*v.
y())
252 + ((fDx3plus1 + fDx4plus2)*fPhiTwist
253 + 2*(fDx3minus1 + fDx4minus2)*phi)
254 *(v.
y()*std::cos(phi) - v.
x()*std::sin(phi))))
255 /(fPhiTwist*(4*fDy1* v.
x() - (fa1md1 + 4*fDy1*fTAlph)*v.
y())
256 *std::cos(phi) + fPhiTwist*(fa1md1*v.
x()
257 + 4*fDy1*(fTAlph*v.
x() + v.
y()))*std::sin(phi));
261 xbuftmp.distance = kInfinity ;
262 xbuftmp.isvalid = false ;
264 xbuf.push_back(xbuftmp) ;
268 distance[0] = kInfinity;
269 gxx[0].
set(kInfinity,kInfinity,kInfinity);
273 areacode[0], isvalid[0],
274 0, validate, &gp, &gv);
285 fDy1*(-4*phixz + 4*fTAlph*phiyz
286 + (fDx3plus1 + fDx4plus2)*fPhiTwist*v.
z())) ;
288 fDy1*(4*fDy1*(phiyz + 2*fDz*v.
x() + fTAlph*(phixz - 2*fDz*v.
y()))
289 - 2*fDy1*(2*fdeltaX + fDx3minus1 + fDx4minus2
290 - 2*fdeltaY*fTAlph)*v.
z()
291 + fa1md1*(phixz - 2*fDz*v.
y() + fdeltaY*v.
z()));
293 fDy1*(fa1md1*(-5*phiyz - 24*fDz*v.
x() + 12*fdeltaX*v.
z()) +
294 fDy1*(20*phixz - 4*(5*fTAlph*phiyz + 24*fDz*fTAlph*v.
x()
295 + 24*fDz*v.
y()) + (48*fdeltaY + (fDx3plus1 + fDx4plus2)
296 *fPhiTwist + 48*fdeltaX*fTAlph)*v.
z()));
298 fDy1*(fa1md1*(phixz - 10*fDz*v.
y() + 5*fdeltaY*v.
z())
299 + 2*fDy1*(2*phiyz + 20*fDz*v.
x()
300 + (-10*fdeltaX + fDx3minus1 + fDx4minus2)*v.
z()
301 + 2*fTAlph*(phixz - 10*fDz*v.
y() + 5*fdeltaY*v.
z())));
303 fDy1*(-(fa1md1*(phiyz + 100*fDz*v.
x() - 50*fdeltaX*v.
z()))
304 + fDy1*(4*phixz - 400*fDz*v.
y()
305 + (200*fdeltaY - (fDx3plus1 + fDx4plus2)*fPhiTwist)*v.
z()
306 - 4*fTAlph*(phiyz + 100*fDz*v.
x() - 50*fdeltaX*v.
z())));
308 fDy1*(4*fDy1*(7*fTAlph*phixz + 7*phiyz - 6*fDz*v.
x() + 6*fDz*fTAlph*v.
y())
309 + 6*fDy1*(2*fdeltaX+fDx3minus1+fDx4minus2-2*fdeltaY*fTAlph)*v.
z()
310 + fa1md1*(7*phixz + 6*fDz*v.
y() - 3*fdeltaY*v.
z()));
312 fDy1*(fa1md1*(-9*phiyz - 56*fDz*v.
x() + 28*fdeltaX*v.
z())
313 + 4*fDy1*(9*phixz - 9*fTAlph*phiyz - 56*fDz*fTAlph*v.
x()
314 - 56*fDz*v.
y() + 28*(fdeltaY + fdeltaX*fTAlph)*v.
z()));
316 fDy1*(fa1md1*(2*fDz*v.
y() - fdeltaY*v.
z())
317 + fDy1*(-8*fDz*v.
x() + 8*fDz*fTAlph*v.
y()
318 + 4*fdeltaX*v.
z() - 4*fdeltaY*fTAlph*v.
z()));
321 G4cout <<
"coef = " << c[0] <<
" "
334 for (
G4int i = 0 ; i<num ; i++ )
339 G4cout <<
"Solution " << i <<
" : " << srd[i] <<
G4endl ;
341 phi = std::fmod(srd[i] , pihalf) ;
342 u = (fDy1*(4*(phiyz + 2*fDz*phi*v.
y() - fdeltaY*phi*v.
z())
343 - ((fDx3plus1 + fDx4plus2)*fPhiTwist
344 + 2*(fDx3minus1 + fDx4minus2)*phi)*v.
z()*std::sin(phi)))
345 /(fPhiTwist*v.
z()*(4*fDy1*std::cos(phi)
346 + (fa1md1 + 4*fDy1*fTAlph)*std::sin(phi)));
350 xbuftmp.distance = kInfinity ;
351 xbuftmp.isvalid = false ;
353 xbuf.push_back(xbuftmp) ;
356 G4cout <<
"solution " << i <<
" = " << phi <<
" , " << u <<
G4endl ;
362 nxx = (
G4int)xbuf.size() ;
371 for (
auto & k : xbuf)
374 G4cout <<
"Solution " << k <<
" : "
375 <<
"reconstructed phiR = " << xbuf[k].phi
376 <<
", uR = " << xbuf[k].u <<
G4endl ;
382 IsConverged = false ;
384 for (
G4int i = 1 ; i<maxint ; ++i )
386 xxonsurface = SurfacePoint(phi,u) ;
387 surfacenormal = NormAng(phi,u) ;
390 deltaX = ( tmpxx - xxonsurface ).mag() ;
391 theta = std::fabs(std::acos(v*surfacenormal) - pihalf) ;
403 G4cout <<
"Step i = " << i <<
", distance = " << tmpdist
404 <<
", " << deltaX <<
G4endl ;
408 GetPhiUAtX(tmpxx, phi, u) ;
412 G4cout <<
"approximated phi = " << phi <<
", u = " << u <<
G4endl ;
415 if ( deltaX <= factor*ctol ) { IsConverged = true ; break ; }
419 if ( std::fabs(tmpdist)<ctol ) { tmpdist = 0 ; }
422 G4cout <<
"refined solution " << phi <<
" , " << u <<
G4endl ;
433 tmpareacode = GetAreaCode(tmpxx);
436 if (tmpdist >= 0) { tmpisvalid =
true; }
441 tmpareacode = GetAreaCode(tmpxx,
false);
444 if (tmpdist >= 0) { tmpisvalid =
true; }
449 G4Exception(
"G4TwistTrapAlphaSide::DistanceToSurface()",
451 "Feature NOT implemented !");
463 k.distance = tmpdist ;
464 k.areacode = tmpareacode ;
465 k.isvalid = tmpisvalid ;
469 std::sort(xbuf.begin() , xbuf.end(), DistanceSort ) ;
478 xbuf.erase( std::unique(xbuf.begin(), xbuf.end() , EqualIntersection ),
484 auto nxxtmp = (
G4int)xbuf.size() ;
486 if ( nxxtmp<2 || IsParallel )
499 xbuftmp.distance = kInfinity ;
500 xbuftmp.isvalid = false ;
502 xbuf.push_back(xbuftmp) ;
514 xbuftmp.distance = kInfinity ;
515 xbuftmp.isvalid = false ;
517 xbuf.push_back(xbuftmp) ;
519 for ( std::size_t k = nxxtmp ; k<xbuf.size() ; ++k )
523 G4cout <<
"Solution " << k <<
" : "
524 <<
"reconstructed phiR = " << xbuf[k].phi
525 <<
", uR = " << xbuf[k].u <<
G4endl ;
531 IsConverged = false ;
533 for (
G4int i = 1 ; i<maxint ; ++i )
535 xxonsurface = SurfacePoint(phi,u) ;
536 surfacenormal = NormAng(phi,u) ;
538 deltaX = ( tmpxx - xxonsurface ).mag();
539 theta = std::fabs(std::acos(v*surfacenormal) - pihalf);
550 G4cout <<
"Step i = " << i <<
", distance = " << tmpdist
551 <<
", " << deltaX <<
G4endl
552 <<
"X = " << tmpxx <<
G4endl ;
555 GetPhiUAtX(tmpxx, phi, u) ;
559 G4cout <<
"approximated phi = " << phi <<
", u = " << u <<
G4endl ;
562 if ( deltaX <= factor*ctol ) { IsConverged = true ; break ; }
566 if ( std::fabs(tmpdist)<ctol ) { tmpdist = 0; }
569 G4cout <<
"refined solution " << phi <<
" , " << u <<
G4endl ;
580 tmpareacode = GetAreaCode(tmpxx);
583 if (tmpdist >= 0) { tmpisvalid =
true; }
588 tmpareacode = GetAreaCode(tmpxx,
false);
591 if (tmpdist >= 0) { tmpisvalid =
true; }
596 G4Exception(
"G4TwistedBoxSide::DistanceToSurface()",
598 "Feature NOT implemented !");
610 xbuf[k].distance = tmpdist ;
611 xbuf[k].areacode = tmpareacode ;
612 xbuf[k].isvalid = tmpisvalid ;
618 std::sort(xbuf.begin() , xbuf.end(), DistanceSort ) ;
621 xbuf.erase( std::unique(xbuf.begin(), xbuf.end() , EqualIntersection ) ,
629 nxx = (
G4int)xbuf.size() ;
631 for (
G4int i = 0 ; i<(
G4int)xbuf.size() ; ++i )
633 distance[i] = xbuf[i].distance;
635 areacode[i] = xbuf[i].areacode ;
636 isvalid[i] = xbuf[i].isvalid ;
638 fCurStatWithV.SetCurrentStatus(i, gxx[i], distance[i], areacode[i],
639 isvalid[i], nxx, validate, &gp, &gv);
641 G4cout <<
"element Nr. " << i
642 <<
", local Intersection = " << xbuf[i].xx
643 <<
", distance = " << xbuf[i].distance
644 <<
", u = " << xbuf[i].u
645 <<
", phi = " << xbuf[i].phi
646 <<
", isvalid = " << xbuf[i].isvalid
654 G4cout << nxx <<
" possible physical solutions found" <<
G4endl ;
655 for (
G4int k= 0 ; k< nxx ; k++ )
657 G4cout <<
"global intersection Point found: " << gxx[k] <<
G4endl ;
685 distance[i] =
fCurStat.GetDistance(i);
686 areacode[i] =
fCurStat.GetAreacode(i);
694 distance[i] = kInfinity;
696 gxx[i].
set(kInfinity, kInfinity, kInfinity);
712 for (
G4int i = 1 ; i<20 ; ++i )
714 xxonsurface = SurfacePoint(phiR,uR) ;
715 surfacenormal = NormAng(phiR,uR) ;
717 deltaX = ( xx - xxonsurface ).mag() ;
720 G4cout <<
"i = " << i <<
", distance = " << distance[0]
721 <<
", " << deltaX <<
G4endl
722 <<
"X = " << xx <<
G4endl ;
727 GetPhiUAtX(xx, phiR, uR) ;
729 if ( deltaX <= ctol ) { break ; }
734 uMax = GetBoundaryMax(phiR) ;
736 if ( phiR > halfphi ) { phiR = halfphi ; }
737 if ( phiR < -halfphi ) { phiR = -halfphi ; }
738 if ( uR > uMax ) { uR = uMax ; }
739 if ( uR < -uMax ) { uR = -uMax ; }
741 xxonsurface = SurfacePoint(phiR,uR) ;
742 distance[0] = ( p - xx ).mag() ;
743 if ( distance[0] <= ctol ) { distance[0] = 0 ; }
748 G4cout <<
"refined solution " << phiR <<
" , " << uR <<
" , " <<
G4endl ;
757 G4cout <<
"intersection Point found: " << gxx[0] <<
G4endl ;
761 fCurStat.SetCurrentStatus(0, gxx[0], distance[0], areacode[0],