2 // ********************************************************************
 
    3 // * License and Disclaimer                                           *
 
    5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
 
    6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
 
    7 // * conditions of the Geant4 Software License,  included in the file *
 
    8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
 
    9 // * include a list of copyright holders.                             *
 
   11 // * Neither the authors of this software system, nor their employing *
 
   12 // * institutes,nor the agencies providing financial support for this *
 
   13 // * work  make  any representation or  warranty, express or implied, *
 
   14 // * regarding  this  software system or assume any liability for its *
 
   15 // * use.  Please see the license in the file  LICENSE  and URL above *
 
   16 // * for the full disclaimer and the limitation of liability.         *
 
   18 // * This  code  implementation is the result of  the  scientific and *
 
   19 // * technical work of the GEANT4 collaboration.                      *
 
   20 // * By using,  copying,  modifying or  distributing the software (or *
 
   21 // * any work based  on the software)  you  agree  to acknowledge its *
 
   22 // * use  in  resulting  scientific  publications,  and indicate your *
 
   23 // * acceptance of all terms of the Geant4 Software license.          *
 
   24 // ********************************************************************
 
   27 // $Id: G4Cons.icc 100820 2016-11-02 15:18:48Z gcosmo $
 
   29 // --------------------------------------------------------------------
 
   30 // GEANT 4 inline definitions file
 
   34 // Implementation of inline methods of G4Cons
 
   35 // --------------------------------------------------------------------
 
   38 G4double G4Cons::GetInnerRadiusMinusZ() const
 
   44 G4double G4Cons::GetOuterRadiusMinusZ() const
 
   50 G4double G4Cons::GetInnerRadiusPlusZ() const
 
   56 G4double G4Cons::GetOuterRadiusPlusZ() const
 
   62 G4double G4Cons::GetZHalfLength() const
 
   68 G4double G4Cons::GetStartPhiAngle() const
 
   74 G4double G4Cons::GetDeltaPhiAngle() const
 
   80 G4double G4Cons::GetSinStartPhi() const
 
   86 G4double G4Cons::GetCosStartPhi() const
 
   92 G4double G4Cons::GetSinEndPhi() const
 
   98 G4double G4Cons::GetCosEndPhi() const
 
  104 void G4Cons::Initialize()
 
  108   fRebuildPolyhedron = true;
 
  112 void G4Cons::InitializeTrigonometry()
 
  114   G4double hDPhi = 0.5*fDPhi;                       // half delta phi
 
  115   G4double cPhi  = fSPhi + hDPhi; 
 
  116   G4double ePhi  = fSPhi + fDPhi;
 
  118   sinCPhi    = std::sin(cPhi);
 
  119   cosCPhi    = std::cos(cPhi);
 
  120   cosHDPhiIT = std::cos(hDPhi - 0.5*kAngTolerance); // inner/outer tol half dphi
 
  121   cosHDPhiOT = std::cos(hDPhi + 0.5*kAngTolerance);
 
  122   sinSPhi = std::sin(fSPhi);
 
  123   cosSPhi = std::cos(fSPhi);
 
  124   sinEPhi = std::sin(ePhi);
 
  125   cosEPhi = std::cos(ePhi);
 
  128 inline void G4Cons::CheckSPhiAngle(G4double sPhi)
 
  130   // Ensure fSphi in 0-2PI or -2PI-0 range if shape crosses 0
 
  134     fSPhi = CLHEP::twopi - std::fmod(std::fabs(sPhi),CLHEP::twopi);
 
  138     fSPhi = std::fmod(sPhi,CLHEP::twopi) ;
 
  140   if ( fSPhi+fDPhi > CLHEP::twopi )
 
  142     fSPhi -= CLHEP::twopi ;
 
  146 inline void G4Cons::CheckDPhiAngle(G4double dPhi)
 
  149   if ( dPhi >= CLHEP::twopi-kAngTolerance*0.5 )
 
  156     fPhiFullCone = false;
 
  163       std::ostringstream message;
 
  164       message << "Invalid dphi." << G4endl
 
  165               << "Negative or zero delta-Phi (" << dPhi << ") in solid: "
 
  167       G4Exception("G4Cons::CheckDPhiAngle()", "GeomSolids0002",
 
  168                   FatalException, message);
 
  173 inline void G4Cons::CheckPhiAngles(G4double sPhi, G4double dPhi)
 
  175   CheckDPhiAngle(dPhi);
 
  176   if ( (fDPhi<CLHEP::twopi) && (sPhi) ) { CheckSPhiAngle(sPhi); }
 
  177   InitializeTrigonometry();
 
  181 void G4Cons::SetInnerRadiusMinusZ( G4double Rmin1 )
 
  188 void G4Cons::SetOuterRadiusMinusZ( G4double Rmax1 )
 
  195 void G4Cons::SetInnerRadiusPlusZ ( G4double Rmin2 )
 
  202 void G4Cons::SetOuterRadiusPlusZ ( G4double Rmax2 )
 
  209 void G4Cons::SetZHalfLength ( G4double newDz )
 
  216 void G4Cons::SetStartPhiAngle ( G4double newSPhi, G4bool compute )
 
  218   // Flag 'compute' can be used to explicitely avoid recomputation of
 
  219   // trigonometry in case SetDeltaPhiAngle() is invoked afterwards
 
  221   CheckSPhiAngle(newSPhi);
 
  222   fPhiFullCone = false;
 
  223   if (compute)  { InitializeTrigonometry(); }
 
  227 void G4Cons::SetDeltaPhiAngle ( G4double newDPhi )
 
  229   CheckPhiAngles(fSPhi, newDPhi);
 
  233 // Old access methods ...
 
  236 G4double G4Cons::GetRmin1() const
 
  238   return GetInnerRadiusMinusZ();
 
  242 G4double G4Cons::GetRmax1() const
 
  244   return GetOuterRadiusMinusZ();
 
  248 G4double G4Cons::GetRmin2() const
 
  250   return GetInnerRadiusPlusZ();
 
  254 G4double G4Cons::GetRmax2() const
 
  256   return GetOuterRadiusPlusZ();
 
  260 G4double G4Cons::GetDz() const
 
  262   return GetZHalfLength();
 
  266 G4double G4Cons::GetSPhi() const
 
  268   return GetStartPhiAngle();
 
  272 G4double G4Cons::GetDPhi() const
 
  274   return GetDeltaPhiAngle();
 
  278 G4double G4Cons::GetCubicVolume()
 
  280   if(fCubicVolume != 0.) {;}
 
  283     G4double Rmean, rMean, deltaR, deltar;
 
  285     Rmean  = 0.5*(fRmax1+fRmax2);
 
  286     deltaR = fRmax1-fRmax2;
 
  288     rMean  = 0.5*(fRmin1+fRmin2);
 
  289     deltar = fRmin1-fRmin2;
 
  290     fCubicVolume = fDPhi*fDz*(Rmean*Rmean-rMean*rMean
 
  291                             +(deltaR*deltaR-deltar*deltar)/12); 
 
  297 G4double G4Cons::GetSurfaceArea()
 
  299   if(fSurfaceArea != 0.) {;}
 
  302     G4double mmin, mmax, dmin, dmax;
 
  304     mmin= (fRmin1+fRmin2)*0.5;
 
  305     mmax= (fRmax1+fRmax2)*0.5;
 
  306     dmin= (fRmin2-fRmin1);
 
  307     dmax= (fRmax2-fRmax1);
 
  309     fSurfaceArea = fDPhi*( mmin * std::sqrt(dmin*dmin+4*fDz*fDz)
 
  310                          + mmax * std::sqrt(dmax*dmax+4*fDz*fDz)
 
  311                          + 0.5*(fRmax1*fRmax1-fRmin1*fRmin1
 
  312                                +fRmax2*fRmax2-fRmin2*fRmin2 ));
 
  315       fSurfaceArea = fSurfaceArea+4*fDz*(mmax-mmin);