80{
82#ifdef NDEBUG
83 G4bool const overlapChecking = false;
84#else
85 G4bool const overlapChecking = true;
86#endif
87
88
89
90
91 const G4double worldSize = 40.0 *
inch;
93 worldSize,
94 worldSize,
95 worldSize);
99 solidWorld->GetName());
100
105 logicalWorld,
106 logicalWorld->GetName(),
107 NULL,
108 false,
109 0,
110 overlapChecking);
111
112
113
114
115 const G4double floorH = 30.0 *
inch;
116 const G4ThreeVector floorPosition(0.0, 0.0, 0.0);
118 worldSize,
119 worldSize,
120 floorH * 0.5);
124 solidFloor->GetName());
125
126 position.set(0.0, 0.0, -floorH * 0.5);
129 logicalFloor,
130 logicalFloor->GetName(),
131 logicalWorld,
132 false,
133 0,
134 overlapChecking);
135
136
137
138
139 const G4double tankWallThickness = 0.25 *
inch;
140 const G4double tankOR = 18.0 *
inch;
141 const G4double tankH = 39.0 *
inch;
144 0.0,
145 tankOR,
146 tankH * 0.5,
147 0.0 * deg,
148 360.0 * deg);
152 solidTank->GetName());
153
154 position.set(0.0, 0.0, tankH * 0.5);
157 logicalTank,
158 logicalTank->GetName(),
159 logicalWorld,
160 false,
161 0,
162 overlapChecking);
163
164 const G4double tankAirH = 3.0 *
inch;
165 G4Tubs*
const solidTankAir
167 0.0,
168 tankOR - tankWallThickness,
169 tankAirH * 0.5,
170 0.0 * deg,
171 360.0 * deg);
175 solidTankAir->GetName());
176
177 position.set(0.0, 0.0, (tankH - tankAirH) * 0.5);
180 logicalTankAir,
181 logicalTankAir->GetName(),
182 logicalTank,
183 false,
184 0,
185 overlapChecking);
186
187 const G4double tankH2OH = (tankH - (tankAirH + tankWallThickness));
188 G4Tubs*
const solidTankH2O
190 0.0,
191 tankOR - tankWallThickness,
192 tankH2OH * 0.5,
193 0.0 * deg,
194 360.0 * deg);
198 solidTankH2O->GetName());
199
200 const G4double centerOfH2O = (tankH - tankH2OH) * 0.5 - tankAirH;
201 position.set(0.0, 0.0, centerOfH2O);
204 logicalTankH2O,
205 logicalTankH2O->GetName(),
206 logicalTank,
207 false,
208 0,
209 overlapChecking);
210
211
212
213
214 const G4double plateX = 3.0 *
inch;
215 const G4double plateY = 0.08 *
inch;
216 const G4double plateZ = 26.0 *
inch;
217 const G4double meatX = 2.75 *
inch;
218 const G4double meatY = 0.04 *
inch;
219 const G4double meatZ = 24.0 *
inch;
220 const G4double xSpacing = 5.0 *
inch;
221 const G4double ySpacing = 0.3 *
inch;
222 const G4double plateRadius = 12.0 *
inch;
223
224 G4Box*
const solidPlate
225 =
new G4Box(
"Plate_Cladding",
226 plateX * 0.5,
227 plateY * 0.5,
228 plateZ * 0.5);
232 solidPlate->GetName());
233
234 G4Box*
const solidMeat
235 =
new G4Box(
"Plate_Meat",
236 meatX * 0.5,
237 meatY * 0.5,
238 meatZ * 0.5);
242 solidMeat->GetName());
243
247 logicalMeat,
248 logicalMeat->GetName(),
249 logicalPlate,
250 false,
251 0,
252 overlapChecking);
253
254
255 bool placeMe;
256
259 for(double x = 0.0;
260 x <= plateRadius;
261 x += xSpacing)
262 {
263
264 for(double y = 0.0;
265 y <= plateRadius;
266 y += ySpacing)
267 {
268 placeMe = false;
269
270
271 if(std::sqrt(x * x + y * y) < plateRadius)
272 {
273
274
275 if(std::sqrt(x * x + y * y) > 1.0 *
inch)
276 {
277 placeMe = true;
278 }
279 }
280
281 if(placeMe)
282 {
284 y,
285 logicalPlate,
286 logicalTankH2O);
288 -y,
289 logicalPlate,
290 logicalTankH2O);
291 if(x > 0.0)
292 {
294 y,
295 logicalPlate,
296 logicalTankH2O);
298 -y,
299 logicalPlate,
300 logicalTankH2O);
301 }
302 }
303 }
304 }
305 G4cout <<
fCopyNumber <<
" plates were added to the subcritical assembly"
306 << G4endl;
307
308
309
310
311
312
313
314 const G4double sourceH = 2 *
inch;
315 const G4double sourceR = 0.2 *
inch;
317 =
new G4Tubs(
"NeutronSource",
318 0.0,
319 sourceR,
320 sourceH * 0.5,
321 0.0 * deg,
322 360.0 * deg);
326 solidSource->GetName());
327
331 logicalSource,
332 logicalSource->GetName(),
333 logicalTankH2O,
334 false,
335 0,
336 overlapChecking);
337
338
339
340
341 const G4double polyS = 3.0 *
inch;
342 const G4double polyH = 18.0 *
inch;
343 G4Box*
const solidPoly
345 polyS,
346 polyS,
347 polyH);
351 solidPoly->GetName());
352
353 G4double radiusToPolyCenter = (tankOR / std::sqrt(2.0)) + std::sqrt(2.0) * polyS;
354 position.set(-radiusToPolyCenter, radiusToPolyCenter, polyH);
357 logicalPoly,
358 logicalPoly->GetName(),
359 logicalWorld,
360 false,
361 0,
362 overlapChecking);
363
364 G4double shellR = 0.3 *
inch;
365 G4double shellH = 6.5 *
inch;
367 =
new G4Tubs(
"Detector_Shell",
368 0.0,
369 shellR,
370 shellH * 0.5,
371 0.0 * deg,
372 360.0 * deg);
376 solidShell->GetName());
377
381 logicalShell,
382 logicalShell->GetName(),
383 logicalPoly,
384 false,
385 0,
386 overlapChecking);
387
388 G4double BF3R = 0.2 *
inch;
389 G4double BF3H = 6.0 *
inch;
391 =
new G4Tubs(
"Detector_BF3_Core",
392 0.0,
393 BF3R,
394 BF3H * 0.5,
395 0.0 * deg,
396 360.0 * deg);
400 solidBF3->GetName());
401
405 logicalBF3,
406 logicalBF3->GetName(),
407 logicalShell,
408 false,
409 0,
410 overlapChecking);
411
412 return physicalWorld;
413}
static const G4double inch
G4Material * fStainlessSteel
G4Material * fPolyethylene
void PlaceFuelPlate(double x, double y, G4LogicalVolume *const myLogicalVolume, G4LogicalVolume *const parentLogicalVolume)