Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4TwistedTrd.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
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. *
10// * *
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. *
17// * *
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// ********************************************************************
25//
26// G4TwistedTrd
27//
28// Author: Oliver Link (CERN), 18.03.2005 - Created
29// --------------------------------------------------------------------
30
31#include "G4TwistedTrd.hh"
32#include "G4SystemOfUnits.hh"
33#include "G4Polyhedron.hh"
34#include "G4AutoLock.hh"
35
36namespace
37{
38 G4Mutex twtrdMutex = G4MUTEX_INITIALIZER;
39}
40
41
42//=====================================================================
43//* Constructor -------------------------------------------------------
44
46 G4double pDx1,
47 G4double pDx2,
48 G4double pDy1,
49 G4double pDy2,
50 G4double pDz,
51 G4double pPhiTwist )
52 : G4VTwistedFaceted( pName, pPhiTwist,pDz,0.,0.,
53 pDy1, pDx1, pDx1, pDy2, pDx2, pDx2,0.)
54{
55}
56
57//=====================================================================
58// Fake default constructor - sets only member data and allocates memory
59// for usage restricted to object persistency.
60
63{
64}
65
66//=====================================================================
67//* Copy constructor --------------------------------------------------
68
74
75//=====================================================================
76//* Assignment operator -----------------------------------------------
77
79{
80 // Check assignment to self
81 //
82 if (this == &rhs) { return *this; }
83
84 // Copy base class data
85 //
88
89 return *this;
90}
91
92//=====================================================================
93//* StreamInfo --------------------------------------------------------
94
95std::ostream& G4TwistedTrd::StreamInfo(std::ostream& os) const
96{
97 //
98 // Stream object contents to an output stream
99 //
100 os << "-----------------------------------------------------------\n"
101 << " *** Dump for solid - " << GetName() << " ***\n"
102 << " ===================================================\n"
103 << " Solid type: G4TwistedTrd\n"
104 << " Parameters: \n"
105 << " pDx1 = " << GetX1HalfLength()/cm << " cm" << G4endl
106 << " pDx2 = " << GetX2HalfLength()/cm << " cm" << G4endl
107 << " pDy1 = " << GetY1HalfLength()/cm << " cm" << G4endl
108 << " pDy2 = " << GetY2HalfLength()/cm << " cm" << G4endl
109 << " pDz = " << GetZHalfLength()/cm << " cm" << G4endl
110 << " pPhiTwist = " << GetPhiTwist()/degree << " deg" << G4endl
111 << "-----------------------------------------------------------\n";
112
113 return os;
114}
115
116//=====================================================================
117//* GetEntityType -----------------------------------------------------
118
120{
121 return {"G4TwistedTrd"};
122}
123
124//=====================================================================
125//* Clone -------------------------------------------------------------
126
128{
129 return new G4TwistedTrd(*this);
130}
131
132//=====================================================================
133//* GetCubicVolume ----------------------------------------------------
134
136{
137 if (fCubicVolume == 0)
138 {
139 G4AutoLock l(&twtrdMutex);
144 G4double h = 2.*GetZHalfLength();
145 fCubicVolume = h*((x1 + x2)*(y1 + y2) + (x2 - x1)*(y2 - y1)/3.);
146 l.unlock();
147 }
148 return fCubicVolume;
149}
150
151//=====================================================================
152//* GetSurfaceArea ----------------------------------------------------
153
155{
156 if (fSurfaceArea == 0)
157 {
158 G4AutoLock l(&twtrdMutex);
159 G4double ang = GetPhiTwist();
164 G4double h = 2.*GetZHalfLength();
165 G4double hh = h*h;
166 G4double delX = x2 - x1;
167 G4double delY = y2 - y1;
168 if (ang == 0.)
169 {
170 G4double hx = std::sqrt(delY*delY + hh);
171 G4double hy = std::sqrt(delX*delX + hh);
172 return fSurfaceArea =
173 2.*(x1 + x2)*hx + 2.*(y1 + y2)*hy + 4.*(x1*y1 + x2*y2);
174 }
175
176 // compute area of x-faces
177 G4double U1, U2, V1, V2;
178 G4double areaX = 0.;
179 U1 = delY + x1*ang;
180 U2 = delY + x2*ang;
181 V1 = delY - x1*ang;
182 V2 = delY - x2*ang;
183 if (std::abs(delX) < kCarTolerance) // case x1 == x2
184 {
185 areaX = (U1*std::sqrt(hh + U1*U1) + hh*std::asinh(U1/h) -
186 V1*std::sqrt(hh + V1*V1) - hh*std::asinh(V1/h))/ang;
187 }
188 else
189 {
190 // U contribution
191 areaX += ((hh + U2*U2)*std::sqrt(hh + U2*U2) -
192 (hh + U1*U1)*std::sqrt(hh + U1*U1))/3.
193 + hh*(U2*std::asinh(U2/h) - U1*std::asinh(U1/h))
194 - hh*(std::sqrt(hh + U2*U2) - std::sqrt(hh + U1*U1));
195 // V contribution
196 areaX += ((hh + V2*V2)*std::sqrt(hh + V2*V2) -
197 (hh + V1*V1)*std::sqrt(hh + V1*V1))/3.
198 + hh*(V2*std::asinh(V2/h) - V1*std::asinh(V1/h))
199 - hh*(std::sqrt(hh + V2*V2) - std::sqrt(hh + V1*V1));
200 areaX /= delX*ang*ang;
201 }
202
203 // compute area of y-faces
204 G4double areaY = 0.;
205 U1 = delX + y1*ang;
206 U2 = delX + y2*ang;
207 V1 = delX - y1*ang;
208 V2 = delX - y2*ang;
209 if (std::abs(delY) < kCarTolerance) // case y1 == y2
210 {
211 areaY = (U1*std::sqrt(hh + U1*U1) + hh*std::asinh(U1/h) -
212 V1*std::sqrt(hh + V1*V1) - hh*std::asinh(V1/h))/ang;
213 }
214 else
215 {
216 // U contribution
217 areaY += ((hh + U2*U2)*std::sqrt(hh + U2*U2) -
218 (hh + U1*U1)*std::sqrt(hh + U1*U1))/3.
219 + hh*(U2*std::asinh(U2/h) - U1*std::asinh(U1/h))
220 - hh*(std::sqrt(hh + U2*U2) - std::sqrt(hh + U1*U1));
221 // V contribution
222 areaY += ((hh + V2*V2)*std::sqrt(hh + V2*V2) -
223 (hh + V1*V1)*std::sqrt(hh + V1*V1))/3.
224 + hh*(V2*std::asinh(V2/h) - V1*std::asinh(V1/h))
225 - hh*(std::sqrt(hh + V2*V2) - std::sqrt(hh + V1*V1));
226 areaY /= delY*ang*ang;
227 }
228 fSurfaceArea = areaX + areaY + 4.*(x1*y1 + x2*y2);
229 l.unlock();
230 }
231 return fSurfaceArea;
232}
G4TemplateAutoLock< G4Mutex > G4AutoLock
#define G4MUTEX_INITIALIZER
std::mutex G4Mutex
double G4double
Definition G4Types.hh:83
G4String G4GeometryType
Definition G4VSolid.hh:70
#define G4endl
Definition G4ios.hh:67
G4TwistedTrd & operator=(const G4TwistedTrd &rhs)
G4TwistedTrd(const G4String &pName, G4double pDx1, G4double pDx2, G4double pDy1, G4double pDy2, G4double pDz, G4double pPhiTwist)
G4double GetX2HalfLength() const
G4double GetY2HalfLength() const
G4double GetCubicVolume() override
G4double GetSurfaceArea() override
G4double GetY1HalfLength() const
G4double GetZHalfLength() const
G4VSolid * Clone() const override
G4GeometryType GetEntityType() const override
G4double GetPhiTwist() const
std::ostream & StreamInfo(std::ostream &os) const override
G4double GetX1HalfLength() const
G4String GetName() const
G4VSolid(const G4String &name)
Definition G4VSolid.cc:59
G4double kCarTolerance
Definition G4VSolid.hh:418
G4Polyhedron * GetPolyhedron() const override
G4VTwistedFaceted & operator=(const G4VTwistedFaceted &rhs)
G4Polyhedron * fpPolyhedron
G4VTwistedFaceted(const G4String &pname, G4double PhiTwist, G4double pDz, G4double pTheta, G4double pPhi, G4double pDy1, G4double pDx1, G4double pDx2, G4double pDy2, G4double pDx3, G4double pDx4, G4double pAlph)
#define V1(a, b, c)
#define V2(a, b, c)