19#include "BDSTunnelFactoryBase.hh"
20#include "BDSTunnelFactoryElliptical.hh"
21#include "BDSTunnelInfo.hh"
25#include "G4CutTubs.hh"
26#include "G4EllipticalTube.hh"
27#include "G4IntersectionSolid.hh"
28#include "G4LogicalVolume.hh"
29#include "G4SubtractionSolid.hh"
30#include "G4ThreeVector.hh"
32#include "G4UnionSolid.hh"
41BDSTunnelFactoryElliptical::BDSTunnelFactoryElliptical()
46 G4double tunnelThickness,
47 G4double tunnelSoilThickness,
48 G4Material* tunnelMaterial,
49 G4Material* tunnelSoilMaterial,
51 G4double tunnelFloorOffset,
61 tunnelSoilMaterial, tunnelFloorOffset, tunnel1, tunnel2);
64 G4VSolid* tunnelOuterSolid =
new G4EllipticalTube(name +
"_tunnel_outer_solid",
65 tunnel1 + tunnelThickness,
66 tunnel2 + tunnelThickness,
69 G4VSolid* tunnelInnerSolid =
new G4EllipticalTube(name +
"_tunnel_outer_solid",
75 allSolids.insert(tunnelOuterSolid);
76 allSolids.insert(tunnelInnerSolid);
78 tunnelSolid =
new G4SubtractionSolid(name +
"_tunnel_solid",
83 G4double soil1R = tunnel1 + tunnelThickness +
lengthSafety;
84 G4double soil2R = tunnel2 + tunnelThickness +
lengthSafety;
86 G4double soilOuterRadius = std::max(soil1R, soil2R) + tunnelSoilThickness;
88 G4VSolid* soilOuterSolid =
new G4Tubs(name +
"_soil_outer_solid",
95 G4VSolid* soilInnerSolid =
new G4EllipticalTube(name +
"_soil_outer_solid",
101 allSolids.insert(soilOuterSolid);
102 allSolids.insert(soilInnerSolid);
104 soilSolid =
new G4SubtractionSolid(name +
"_soil_solid",
108 G4double containerXRadius = soil1R + tunnelSoilThickness +
lengthSafety;
109 G4double containerYRadius = soil2R + tunnelSoilThickness +
lengthSafety;
114 G4double floorBoxRadius = 1.5 * std::max(tunnel1,tunnel2);
115 G4double floorBoxDisplacement = tunnelFloorOffset + floorBoxRadius +
lengthSafety;
117 G4VSolid* floorEllipse =
new G4EllipticalTube(name +
"_floor_ellipse_solid",
122 G4VSolid* floorBox =
new G4Box(name +
"_floor_box_solid",
129 allSolids.insert(floorEllipse);
130 allSolids.insert(floorBox);
132 floorSolid =
new G4IntersectionSolid(name +
"_floor_solid",
136 G4ThreeVector(0,-floorBoxDisplacement,0));
144 G4VSolid* floorContainerEllipse =
new G4EllipticalTube(name +
"_floor_cont_ell_solid",
153 G4double floorBoxContDisp = floorBoxDisplacement -
lengthSafety;
154 G4VSolid* floorContainerSolid =
new G4IntersectionSolid(name +
"_floor_cont_solid",
155 floorContainerEllipse,
158 G4ThreeVector(0,-floorBoxContDisp,0));
160 G4VSolid* tunnelContainerSolidOuter =
new G4Tubs(name +
"_tunnel_cont_solid_outer",
167 G4VSolid* tunnelContainerSolidInner =
new G4EllipticalTube(name +
"_tunnel_cont_solid_inner",
172 G4VSolid* tunnelContainerSolid =
new G4SubtractionSolid(name +
"_tunnel_cont_solid",
173 tunnelContainerSolidOuter,
174 tunnelContainerSolidInner);
177 allSolids.insert(floorContainerEllipse);
178 allSolids.insert(floorContainerSolid);
179 allSolids.insert(tunnelContainerSolidOuter);
180 allSolids.insert(tunnelContainerSolidInner);
181 allSolids.insert(tunnelContainerSolid);
183 containerSolid =
new G4UnionSolid(name +
"_container_solid",
184 tunnelContainerSolid,
185 floorContainerSolid);
190 G4VSolid* tunnelContainerSolidOuter =
new G4Tubs(name +
"_tunnel_cont_solid_outer",
197 G4VSolid* tunnelContainerSolidInner =
new G4EllipticalTube(name +
"_tunnel_cont_solid_inner",
203 allSolids.insert(tunnelContainerSolidOuter);
204 allSolids.insert(tunnelContainerSolidInner);
206 containerSolid =
new G4SubtractionSolid(name +
"_tunnel_cont_solid",
207 tunnelContainerSolidOuter,
208 tunnelContainerSolidInner);
211 CommonConstruction(name, tunnelMaterial, tunnelSoilMaterial, length, containerXRadius, containerYRadius, visible);
213 return tunnelSection;
219 G4ThreeVector inputFace,
220 G4ThreeVector outputFace,
221 G4double tunnelThickness,
222 G4double tunnelSoilThickness,
223 G4Material* tunnelMaterial,
224 G4Material* tunnelSoilMaterial,
226 G4double tunnelFloorOffset,
236 tunnelSoilMaterial, tunnelFloorOffset, tunnel1, tunnel2);
241 G4double intersectionRadius = ( std::max(tunnel1,tunnel2) + tunnelThickness + tunnelSoilThickness ) * 3;
242 G4VSolid* faceSolid =
new G4CutTubs(name +
"_face_intersection_solid",
253 G4VSolid* tunnelOuterSolid =
new G4EllipticalTube(name +
"_tunnel_outer_solid",
254 tunnel1 + tunnelThickness,
255 tunnel2 + tunnelThickness,
258 G4VSolid* tunnelInnerSolid =
new G4EllipticalTube(name +
"_tunnel_outer_solid",
263 G4VSolid* tunnelSolidUnAngled =
new G4SubtractionSolid(name +
"_tunnel_square_solid",
268 allSolids.insert(faceSolid);
269 allSolids.insert(tunnelOuterSolid);
270 allSolids.insert(tunnelInnerSolid);
271 allSolids.insert(tunnelSolidUnAngled);
274 tunnelSolid =
new G4IntersectionSolid(name +
"_tunnel_solid",
279 G4double soil1R = tunnel1 + tunnelThickness +
lengthSafety;
280 G4double soil2R = tunnel2 + tunnelThickness +
lengthSafety;
282 G4double soilOuterRadius = std::max(soil1R, soil2R) + tunnelSoilThickness;
284 G4VSolid* soilOuterSolid =
new G4Tubs(name +
"_soil_outer_solid",
291 G4VSolid* soilInnerSolid =
new G4EllipticalTube(name +
"_soil_outer_solid",
296 G4VSolid* soilSolidUnAngled =
new G4SubtractionSolid(name +
"_soil_square_solid",
301 allSolids.insert(soilOuterSolid);
302 allSolids.insert(soilInnerSolid);
303 allSolids.insert(soilSolidUnAngled);
305 soilSolid =
new G4IntersectionSolid(name +
"_soil_soild",
309 G4double containerXRadius = soil1R + tunnelSoilThickness +
lengthSafety;
310 G4double containerYRadius = soil2R + tunnelSoilThickness +
lengthSafety;
316 G4double floorBoxRadius = 1.5 * std::max(tunnel1,tunnel2);
317 G4double floorBoxDisplacement = tunnelFloorOffset + floorBoxRadius +
lengthSafety;
319 G4VSolid* floorEllipse =
new G4EllipticalTube(name +
"_floor_ellipse_solid",
327 G4VSolid* floorEllipseAngled =
new G4IntersectionSolid(name +
"_floor_ell_angled_solid",
331 G4VSolid* floorBox =
new G4Box(name +
"_floor_box_solid",
338 allSolids.insert(floorEllipse);
339 allSolids.insert(floorBox);
341 floorSolid =
new G4IntersectionSolid(name +
"_floor_solid",
345 G4ThreeVector(0,-floorBoxDisplacement,0));
348 G4VSolid* floorContainerEllAng =
new G4EllipticalTube(name +
"_floor_cont_ell_solid",
354 G4VSolid* floorContainerEllipseAngled =
new G4IntersectionSolid(name +
"+floor_cont_ell_ang_solid",
355 floorContainerEllAng,
360 G4double floorBoxContDisp = floorBoxDisplacement -
lengthSafety;
361 G4VSolid* floorContainerSolid =
new G4IntersectionSolid(name +
"_floor_cont_solid",
362 floorContainerEllipseAngled,
365 G4ThreeVector(0,-floorBoxContDisp,0));
367 G4VSolid* tunnelContainerOuterSquare =
new G4Tubs(name +
"_tunnel_cont_solid_outer",
374 G4VSolid* tunnelContainerSolidOuterAngled =
new G4IntersectionSolid(name +
"_tunnel_cont_out_ang_solid",
375 tunnelContainerOuterSquare,
378 G4VSolid* tunnelContainerSolidInner =
new G4EllipticalTube(name +
"_tunnel_cont_solid_inner",
383 G4VSolid* tunnelContainerSolid =
new G4SubtractionSolid(name +
"_tunnel_cont_solid",
384 tunnelContainerSolidOuterAngled,
385 tunnelContainerSolidInner);
388 allSolids.insert(floorContainerEllAng);
389 allSolids.insert(floorContainerEllipseAngled);
390 allSolids.insert(floorContainerSolid);
391 allSolids.insert(tunnelContainerOuterSquare);
392 allSolids.insert(tunnelContainerSolidOuterAngled);
393 allSolids.insert(tunnelContainerSolidInner);
394 allSolids.insert(tunnelContainerSolid);
396 containerSolid =
new G4UnionSolid(name +
"_container_solid",
397 tunnelContainerSolid,
398 floorContainerSolid);
403 G4VSolid* tunnelContainerOuterSquare =
new G4Tubs(name +
"_tunnel_cont_solid_outer",
410 G4VSolid* tunnelContainerSolidOuterAngled =
new G4IntersectionSolid(name +
"_tunnel_cont_out_ang_solid",
411 tunnelContainerOuterSquare,
414 G4VSolid* tunnelContainerSolidInner =
new G4EllipticalTube(name +
"_tunnel_cont_solid_inner",
420 allSolids.insert(tunnelContainerOuterSquare);
421 allSolids.insert(tunnelContainerSolidOuterAngled);
422 allSolids.insert(tunnelContainerSolidInner);
424 containerSolid =
new G4SubtractionSolid(name +
"_tunnel_cont_solid",
425 tunnelContainerSolidOuterAngled,
426 tunnelContainerSolidInner);
429 CommonConstruction(name, tunnelMaterial, tunnelSoilMaterial, length, containerXRadius,
430 containerYRadius, visible);
432 return tunnelSection;
437 G4double& tunnelThickness,
438 G4double& tunnelSoilThickness,
439 G4Material*& tunnelMaterial,
440 G4Material*& tunnelSoilMaterial,
441 G4double& tunnelFloorOffset,
447 if (tunnelFloorOffset < 1e-10)
448 {tunnelFloorOffset = defaultModel->floorOffset;}
451 {tunnel1 = defaultModel->
aper1;}
454 {tunnel2 = defaultModel->
aper2;}
const G4String name
Const protected member variable that may not be changed by derived classes.
G4double lengthSafety
Cache of global constants variable.
void CommontTestInputParameters(G4double &length, G4double &tunnelThickness, G4double &tunnelSoilThickness, G4Material *&tunnelMaterial, G4Material *&tunnelSoilMaterial)
virtual BDSTunnelSection * CreateTunnelSection(G4String name, G4double length, G4double tunnelThickness, G4double tunnelSoilThickness, G4Material *tunnelMaterial, G4Material *tunnelSoilMaterial, G4bool tunnelFloor, G4double tunnelFloorOffset, G4double tunnel1, G4double tunnel2, G4bool visible)
Create a tunnel section with flat input and output faces.
virtual BDSTunnelSection * CreateTunnelSectionAngled(G4String name, G4double length, G4ThreeVector inputFace, G4ThreeVector outputFace, G4double tunnelThickness, G4double tunnelSoilThickness, G4Material *tunnelMaterial, G4Material *tunnelSoilMaterial, G4bool tunnelFloor, G4double tunnelFloorOffset, G4double tunnel1, G4double tunnel2, G4bool visible)
Create a tunnel section with an angled input and output face.
void TestInputParameters(G4double &length, G4double &tunnelThickness, G4double &tunnelSoilThickness, G4Material *&tunnelMaterial, G4Material *&tunnelSoildMaterial, G4double &tunnelFloorOffset, G4double &tunnel1, G4double &tunnel2)
functions below here are private to this particular factory
G4double aper2
Tunnel aperture / shape parameter 2.
G4double aper1
Tunnel aperture / shape parameter 1.
Class that represents a section of tunnel.