45 G4double tunnelThickness,
46 G4double tunnelSoilThickness,
47 G4Material* tunnelMaterial,
48 G4Material* tunnelSoilMaterial,
50 G4double tunnelFloorOffset,
60 tunnelSoilMaterial, tunnelFloorOffset, tunnel1, tunnel2);
63 G4VSolid* tunnelOuterSolid =
new G4EllipticalTube(name +
"_tunnel_outer_solid",
64 tunnel1 + tunnelThickness,
65 tunnel2 + tunnelThickness,
68 G4VSolid* tunnelInnerSolid =
new G4EllipticalTube(name +
"_tunnel_outer_solid",
74 allSolids.insert(tunnelOuterSolid);
75 allSolids.insert(tunnelInnerSolid);
77 tunnelSolid =
new G4SubtractionSolid(name +
"_tunnel_solid",
82 G4double soil1R = tunnel1 + tunnelThickness +
lengthSafety;
83 G4double soil2R = tunnel2 + tunnelThickness +
lengthSafety;
85 G4double soilOuterRadius = std::max(soil1R, soil2R) + tunnelSoilThickness;
87 G4VSolid* soilOuterSolid =
new G4Tubs(name +
"_soil_outer_solid",
94 G4VSolid* soilInnerSolid =
new G4EllipticalTube(name +
"_soil_outer_solid",
100 allSolids.insert(soilOuterSolid);
101 allSolids.insert(soilInnerSolid);
103 soilSolid =
new G4SubtractionSolid(name +
"_soil_solid",
107 G4double containerXRadius = soil1R + tunnelSoilThickness +
lengthSafety;
108 G4double containerYRadius = soil2R + tunnelSoilThickness +
lengthSafety;
113 G4double floorBoxRadius = 1.5 * std::max(tunnel1,tunnel2);
114 G4double floorBoxDisplacement = tunnelFloorOffset + floorBoxRadius +
lengthSafety;
116 G4VSolid* floorEllipse =
new G4EllipticalTube(name +
"_floor_ellipse_solid",
121 G4VSolid* floorBox =
new G4Box(name +
"_floor_box_solid",
128 allSolids.insert(floorEllipse);
129 allSolids.insert(floorBox);
131 floorSolid =
new G4IntersectionSolid(name +
"_floor_solid",
135 G4ThreeVector(0,-floorBoxDisplacement,0));
143 G4VSolid* floorContainerEllipse =
new G4EllipticalTube(name +
"_floor_cont_ell_solid",
152 G4double floorBoxContDisp = floorBoxDisplacement -
lengthSafety;
153 G4VSolid* floorContainerSolid =
new G4IntersectionSolid(name +
"_floor_cont_solid",
154 floorContainerEllipse,
157 G4ThreeVector(0,-floorBoxContDisp,0));
159 G4VSolid* tunnelContainerSolidOuter =
new G4Tubs(name +
"_tunnel_cont_solid_outer",
166 G4VSolid* tunnelContainerSolidInner =
new G4EllipticalTube(name +
"_tunnel_cont_solid_inner",
171 G4VSolid* tunnelContainerSolid =
new G4SubtractionSolid(name +
"_tunnel_cont_solid",
172 tunnelContainerSolidOuter,
173 tunnelContainerSolidInner);
176 allSolids.insert(floorContainerEllipse);
177 allSolids.insert(floorContainerSolid);
178 allSolids.insert(tunnelContainerSolidOuter);
179 allSolids.insert(tunnelContainerSolidInner);
180 allSolids.insert(tunnelContainerSolid);
182 containerSolid =
new G4UnionSolid(name +
"_container_solid",
183 tunnelContainerSolid,
184 floorContainerSolid);
189 G4VSolid* tunnelContainerSolidOuter =
new G4Tubs(name +
"_tunnel_cont_solid_outer",
196 G4VSolid* tunnelContainerSolidInner =
new G4EllipticalTube(name +
"_tunnel_cont_solid_inner",
202 allSolids.insert(tunnelContainerSolidOuter);
203 allSolids.insert(tunnelContainerSolidInner);
205 containerSolid =
new G4SubtractionSolid(name +
"_tunnel_cont_solid",
206 tunnelContainerSolidOuter,
207 tunnelContainerSolidInner);
210 CommonConstruction(name, tunnelMaterial, tunnelSoilMaterial, length, containerXRadius, containerYRadius, visible);
212 return tunnelSection;
218 G4ThreeVector inputFace,
219 G4ThreeVector outputFace,
220 G4double tunnelThickness,
221 G4double tunnelSoilThickness,
222 G4Material* tunnelMaterial,
223 G4Material* tunnelSoilMaterial,
225 G4double tunnelFloorOffset,
235 tunnelSoilMaterial, tunnelFloorOffset, tunnel1, tunnel2);
240 G4double intersectionRadius = ( std::max(tunnel1,tunnel2) + tunnelThickness + tunnelSoilThickness ) * 3;
241 G4VSolid* faceSolid =
new G4CutTubs(name +
"_face_intersection_solid",
252 G4VSolid* tunnelOuterSolid =
new G4EllipticalTube(name +
"_tunnel_outer_solid",
253 tunnel1 + tunnelThickness,
254 tunnel2 + tunnelThickness,
257 G4VSolid* tunnelInnerSolid =
new G4EllipticalTube(name +
"_tunnel_outer_solid",
262 G4VSolid* tunnelSolidUnAngled =
new G4SubtractionSolid(name +
"_tunnel_square_solid",
267 allSolids.insert(faceSolid);
268 allSolids.insert(tunnelOuterSolid);
269 allSolids.insert(tunnelInnerSolid);
270 allSolids.insert(tunnelSolidUnAngled);
273 tunnelSolid =
new G4IntersectionSolid(name +
"_tunnel_solid",
278 G4double soil1R = tunnel1 + tunnelThickness +
lengthSafety;
279 G4double soil2R = tunnel2 + tunnelThickness +
lengthSafety;
281 G4double soilOuterRadius = std::max(soil1R, soil2R) + tunnelSoilThickness;
283 G4VSolid* soilOuterSolid =
new G4Tubs(name +
"_soil_outer_solid",
290 G4VSolid* soilInnerSolid =
new G4EllipticalTube(name +
"_soil_outer_solid",
295 G4VSolid* soilSolidUnAngled =
new G4SubtractionSolid(name +
"_soil_square_solid",
300 allSolids.insert(soilOuterSolid);
301 allSolids.insert(soilInnerSolid);
302 allSolids.insert(soilSolidUnAngled);
304 soilSolid =
new G4IntersectionSolid(name +
"_soil_soild",
308 G4double containerXRadius = soil1R + tunnelSoilThickness +
lengthSafety;
309 G4double containerYRadius = soil2R + tunnelSoilThickness +
lengthSafety;
315 G4double floorBoxRadius = 1.5 * std::max(tunnel1,tunnel2);
316 G4double floorBoxDisplacement = tunnelFloorOffset + floorBoxRadius +
lengthSafety;
318 G4VSolid* floorEllipse =
new G4EllipticalTube(name +
"_floor_ellipse_solid",
326 G4VSolid* floorEllipseAngled =
new G4IntersectionSolid(name +
"_floor_ell_angled_solid",
330 G4VSolid* floorBox =
new G4Box(name +
"_floor_box_solid",
337 allSolids.insert(floorEllipse);
338 allSolids.insert(floorBox);
340 floorSolid =
new G4IntersectionSolid(name +
"_floor_solid",
344 G4ThreeVector(0,-floorBoxDisplacement,0));
347 G4VSolid* floorContainerEllAng =
new G4EllipticalTube(name +
"_floor_cont_ell_solid",
353 G4VSolid* floorContainerEllipseAngled =
new G4IntersectionSolid(name +
"+floor_cont_ell_ang_solid",
354 floorContainerEllAng,
359 G4double floorBoxContDisp = floorBoxDisplacement -
lengthSafety;
360 G4VSolid* floorContainerSolid =
new G4IntersectionSolid(name +
"_floor_cont_solid",
361 floorContainerEllipseAngled,
364 G4ThreeVector(0,-floorBoxContDisp,0));
366 G4VSolid* tunnelContainerOuterSquare =
new G4Tubs(name +
"_tunnel_cont_solid_outer",
373 G4VSolid* tunnelContainerSolidOuterAngled =
new G4IntersectionSolid(name +
"_tunnel_cont_out_ang_solid",
374 tunnelContainerOuterSquare,
377 G4VSolid* tunnelContainerSolidInner =
new G4EllipticalTube(name +
"_tunnel_cont_solid_inner",
382 G4VSolid* tunnelContainerSolid =
new G4SubtractionSolid(name +
"_tunnel_cont_solid",
383 tunnelContainerSolidOuterAngled,
384 tunnelContainerSolidInner);
387 allSolids.insert(floorContainerEllAng);
388 allSolids.insert(floorContainerEllipseAngled);
389 allSolids.insert(floorContainerSolid);
390 allSolids.insert(tunnelContainerOuterSquare);
391 allSolids.insert(tunnelContainerSolidOuterAngled);
392 allSolids.insert(tunnelContainerSolidInner);
393 allSolids.insert(tunnelContainerSolid);
395 containerSolid =
new G4UnionSolid(name +
"_container_solid",
396 tunnelContainerSolid,
397 floorContainerSolid);
402 G4VSolid* tunnelContainerOuterSquare =
new G4Tubs(name +
"_tunnel_cont_solid_outer",
409 G4VSolid* tunnelContainerSolidOuterAngled =
new G4IntersectionSolid(name +
"_tunnel_cont_out_ang_solid",
410 tunnelContainerOuterSquare,
413 G4VSolid* tunnelContainerSolidInner =
new G4EllipticalTube(name +
"_tunnel_cont_solid_inner",
419 allSolids.insert(tunnelContainerOuterSquare);
420 allSolids.insert(tunnelContainerSolidOuterAngled);
421 allSolids.insert(tunnelContainerSolidInner);
423 containerSolid =
new G4SubtractionSolid(name +
"_tunnel_cont_solid",
424 tunnelContainerSolidOuterAngled,
425 tunnelContainerSolidInner);
428 CommonConstruction(name, tunnelMaterial, tunnelSoilMaterial, length, containerXRadius,
429 containerYRadius, visible);
431 return tunnelSection;