// Last edited on 2011-05-31 20:25:13 by stolfilocal // Models of Fukushima Daiichi Unit #1 and its parts. // All sizes and coordinates in meters. // X axis points East, Y North, Z up. #include "un1_dimensions.inc" #include "un1_pressure_vessel.inc" #include "un1_drywell_and_shroud.inc" #include "un1_service_pools.inc" #macro un1_whole(CB,CD,CR,CF,cw,dw,sw,uw,pw) // Whole building with reactor, contaiment, etc. // Origin is at SW corner of "mid" block, OP level. // {CB} = cutting object for building and ground (rel building origin). // {CD} = cutting object for drywell and torus (rel reactor axis, OP level). // {CR} = cutting object for reactor vessel (rel. vessel center). // {CF} = cutting object for fuel (rel. fuel center). // {cw} = water level in core. // {dw} = water level in drywell. // {sw} = water level in suppression torus. // {uw} = water level in shroud cavity. // {pw} = water level in spent-fuel pool. union{ object{ un1_building_structure(CB) } object{ un1_ground(CB) } union{ object{ un1_containment_vessel(CD,dw,sw,uw) } object{ un1_pressure_vessel_support(CD) } object{ un1_pressure_vessel(CR,CF,cw,1,1,1) translate un1_rpv_Z*z } translate un1_reactor_axis } } #end #macro un1_containment_whole(CD,CR,CF,cw,dw,sw) // Containment vessel (drywell+torus+surgepipes) with reactor vessel // and supporting concrete tube. // {CD} = cutting object for drywell and torus (rel reactor axis, OP level). // {CR} = cutting object for reactor vessel (rel. vessel center). // {CF} = cutting object for fuel (rel. fuel center). // {cw} = water level in core. // {dw} = water level in drywell. // {sw} = water level in suppression torus. // Origin is on reactor axis, OP level. #local uw = 0.000; // Water level in shroud pool. union{ object{ un1_containment_vessel(CD,dw,sw,uw) } object{ un1_pressure_vessel_support(CD) } object{ un1_pressure_vessel(CR,CF,cw,1,1,1) translate un1_rpv_Z*z } } #end #macro un1_drywell_and_shroud_enclosure(C) // The concrete around the drywell, with the cavity excavated. // Origin is reactor axis at OP height. intersection{ object{ C } difference{ union{ un1_shroud_enclosure_massive() un1_drywell_enclosure_massive() } object{ un1_drywell_cavity() } object{ un1_shroud_cavity() } object{ un1_surge_pipe_cavities() } } texture{ tx_concrete } } #end #macro un1_building_structure(C) // Main structural parts of the building, including // the concrete parts (except the reactor vessel support) // and roof (including steel support). // Origin is at SW corner of "mid" block, basement level. intersection{ object{ C } difference{ union{ object{ un1_building_massive() } object{ un1_building_exterior_paint() } } object{ un1_containment_vessel_cavity() } object{ un1_spent_fuel_pool_shape(0) } object{ un1_dryer_storage_pool_shape(0) } object{ un1_cask_loading_pool_shape(0) } object{ un1_elevator_well_cavity(0) } object{ un1_hydraulics_storey_rooms() } object{ un1_steampipes_storey_rooms() } object{ un1_hvac_storey_rooms() } object{ un1_cooling_storey_rooms() } object{ un1_demineralizer_storey_rooms() } object{ un1_condenser_storey_rooms() } object{ un1_service_storey_rooms() } object{ un1_roof_storey_rooms() } // More later } texture{ tx_concrete } } #end #macro un1_building_massive() // The concrete outline of the building, including the service area, // with all internal spaces filled with concrete. // Origin at SW corner of "mid" block, OP level. #local base_lo_corner = < 0, 0, un1_building_lo_Z >; #local base_hi_corner = base_lo_corner + un1_building_base_size; #local body_lo_corner = < 0, 0, un1_building_lo_Z >; #local body_hi_corner = body_lo_corner + un1_building_body_size; union{ box{ base_lo_corner + epsv, base_hi_corner - epsv } box{ body_lo_corner + 2*epsv, body_hi_corner - 2*epsv } } #end #macro un1_building_exterior_paint() // The exerior paint of the building, // Origin at SW corner of "mid" block, OP level. #local T = un1_exterior_paint_thk; #local base_lo_corner = < 0, 0, un1_ground_Z >; #local base_hi_corner = < 0, 0, un1_building_lo_Z > + un1_building_base_size; #local body_lo_corner = < 0, 0, un1_ground_Z >; #local body_hi_corner = < 0, 0, un1_building_lo_Z > + un1_building_body_size; difference{ union{ box{ base_lo_corner - + epsv, base_hi_corner + - epsv } box{ body_lo_corner - + 2*epsv, body_hi_corner + - 2*epsv } } union{ box{ base_lo_corner - epsv, base_hi_corner + epsv } box{ body_lo_corner - 2*epsv, body_hi_corner + 2*epsv } } texture{ tx_exterior_paint } } #end #macro un1_containment_vessel(C,dw,sw,uw) // Containment vessel (drywell+torus+surgepipes). intersection{ object{C} union{ object{ un1_drywell_steel_wall() } object{ un1_shroud() translate un1_shroud_Z*z } object{ un1_torus_steel_wall() } object{ un1_inner_torus_steel_wall() } object{ un1_surge_pipes() } // Add stuff inside torus. // Add water. } } #end #macro un1_containment_vessel_cavity() // The cavity in the concrete structute // that houses the containment vessel // (drywell+torus+shroud). // Origin at SW uilding corner, OP height. union{ union{ object{ un1_shroud_cavity() } object{ un1_drywell_cavity() } object{ un1_surge_pipe_cavities() } translate un1_reactor_axis } object{ un1_torus_storey_rooms() } } #end #macro un1_torus_steel_wall() // The suppression chamber torus. // Orgin at OP on reactor axis. #local R = un1_torus_major_rad; #local r = un1_torus_minor_rad; #local T = un1_torus_thk; #local ctr_Z = un1_torus_ctr_Z; // Z of center of supression torus. difference{ difference{ torus{ R, r + eps } torus{ R, r - T + eps } rotate 90*x translate ctr_Z*z } object{ un1_surge_pipe_punchers() } texture{ tx_enamel_green } } #end #macro un1_inner_torus_steel_wall() // The inner torus inside the suppression chamber torus. // Orgin at OP on reactor axis. #local R = un1_inner_torus_major_rad; #local r = un1_inner_torus_minor_rad; #local T = un1_inner_torus_thk; #local ctr_Z = un1_surge_pipe_bot_ref_Z; // Z of center of discharge hole. difference{ difference{ torus{ R, r + eps } torus{ R, r - T + eps } rotate 90*x translate ctr_Z*z } object{ un1_surge_pipe_punchers() } texture{ tx_enamel_lemon } } #end #macro un1_torus_storey_rooms() // Cavity where the torus sits. // Orgin at SW corner of "mid" block, OP level. #local lo_X = un1_torus_storey_W_wall_thk; #local hi_X = un1_building_base_size.x - un1_torus_storey_E_wall_thk; #local lo_Y = un1_torus_storey_S_wall_thk; #local hi_Y = un1_building_base_size.y - un1_torus_storey_N_wall_thk; #local lo_Z = un1_torus_storey_floor_Z; // Z of bottom of cavity. #local hi_Z = un1_torus_storey_ceiling_Z; // Z of top of cavity. difference{ box{ < lo_X, lo_Y, lo_Z > - epsv, < hi_X, hi_Y, hi_Z > + epsv } object{ un1_drywell_enclosure_massive() translate un1_reactor_axis } bounded_by{ box{ < lo_X, lo_Y, lo_Z > - 2*epsv, < hi_X, hi_Y, hi_Z > + 2*epsv } } } #end #macro un1_surge_pipes() // Metal wall and trimmings for the eight pipes between drywell and torus. // Orgin at reactor axis, OP level. #local pipe = object{ un1_surge_pipe() } union{ #local k = 0; #while (k < 8) #local turn = (k + 0.5)*45; object{ pipe rotate turn*z } #local k = k + 1; #end texture{ tx_enamel_lemon } bounded_by{ object{ un1_pipes_bounder(pipe) } } } #end #macro un1_surge_pipe_punchers() // Excavator to make the holes in drywell and torus for the eight {un1_surge_pipes}. // Orgin at reactor axis, OP level. #local pipe_puncher = object{ un1_surge_pipe_puncher() } union{ #local k = 0; #while (k < 8) #local turn = (k + 0.5)*45; object{ pipe_puncher rotate turn*z } #local k = k + 1; #end bounded_by{ object{ un1_pipes_bounder(pipe_puncher) } } } #end #macro un1_surge_pipe_cavities() // Excavator for tunnels to accomodate the eight {un1_surge_pipes}. // Orgin at reactor axis, OP level. #local pipe_cav = object{ un1_surge_pipe_cavity() } union{ #local k = 0; #while (k < 8) #local turn = (k + 0.5)*45; object{ pipe_cav rotate turn*z } #local k = k + 1; #end bounded_by{ object{ un1_pipes_bounder(pipe_cav) } } } #end #macro un1_pipes_bounder(pipe) #local minv = min_extent(pipe); #local maxv = max_extent(pipe); #local R = 1.1*maxv.x; cylinder{ < 0, 0, minv.z - 10*eps >, < 0, 0, maxv.z + 10*eps >, R + 10*eps } #end #macro un1_surge_pipe() // Metal wall and trimmings for one pipe between drywell and torus. // Orgin at reactor axis, OP level. // Pipe axis is on the XZ plane. #local T = un1_surge_pipe_thk; // Thickness of surge pipe. #local dw_sph_ctr_Z = un1_drywell_sphere_ctr_Z; // Z of center of drywell sphere. #local dw_sph_R = un1_drywell_sphere_rad; // Outer radius of drywell sphere. #local dw_T = un1_drywell_thk; // Thickness of drywell wall. difference{ union{ object{ un1_surge_pipe_sleeve() } object{ un1_surge_pipe_shape(-eps,-eps,0) } } object{ un1_surge_pipe_shape(-T+eps,0.300,0) } } #end #macro un1_surge_pipe_sleeve() // A sleeve that fits on a surge pipe inside the drywell, // without the opening. #local dw_sph_ctr_Z = un1_drywell_sphere_ctr_Z; // Z of center of drywell sphere. #local dw_sph_R = un1_drywell_sphere_rad; // Outer radius of drywell sphere. #local sleeve_R = un1_surge_pipe_sleeve_rad; #local top_X = un1_surge_pipe_sleeve_top_X; #local top_Z = un1_surge_pipe_sleeve_top_Z; #local dX = top_X; #local dZ = dw_sph_ctr_Z - top_Z; #local top_D = sqrt(dX*dX + dZ*dZ); // Distance from sphere center to top of sleeve. #local tilt = degrees(atan2(dX,dZ)); debug_coord("sleeve tilt", tilt) #local lo_ctr = -dw_sph_R*z; #local hi_ctr = -top_D*z; intersection{ sphere{ <0,0,0>, dw_sph_R-2*eps } cylinder{ lo_ctr - eps*z, hi_ctr - eps*z, sleeve_R-eps } bounded_by{ cylinder{ lo_ctr - 2*eps*z, hi_ctr, sleeve_R } } rotate -tilt*y translate dw_sph_ctr_Z*z } #end #macro un1_surge_pipe_puncher() // Excavator to make a hole in drywell and torus for one {un1_surge_pipe}. // Orgin at reactor axis, OP level. // Assumes that the pipe axis is on the XZ plane. #local T = un1_surge_pipe_thk; // Thickness of surge pipe metal wall. object{ un1_surge_pipe_shape(-T+2*eps,0.400,0) } #end #macro un1_surge_pipe_cavity() // Excavator for tunnel to accomodate {un1_surge_pipe}. // Orgin at reactor axis, OP level. // Assumes that the pipe axis is on the XZ plane. object{ un1_surge_pipe_shape(+eps,0.500,1) } #end #macro un1_surge_pipe_shape(soff,eoff,niche) // A macro that gnerates the basic shape of a surge pipe, // with specified surface offset {soff} and open end offset {eoff}. // If {niche>0}, also adds a squarish niche (for concrete excavation). // Used to make punchers, holes in concrete and metal, // and the two surfaces of the pipe itself. // Orgin at reactor axis, OP level. // Assumes that the pipe axis is on the XZ plane. // Assuming pipe axis is Z axis: #local cap_Z = un1_surge_pipe_cap_Z; // Z of bottom cap center. #local cap_H = un1_surge_pipe_cap_H; // Height of bottom cap. #local cap_R = un1_surge_pipe_cap_rad; // Radius of bottom cap and cylinder. #local cone_lo_Z = un1_surge_pipe_cone_lo_Z; // Low Z of radius transition. #local cone_hi_Z = un1_surge_pipe_cone_hi_Z; // High Z of radius transition. #local top_Z = un1_surge_pipe_top_Z; // Nominal Z of top end of pipe. #local top_R = un1_surge_pipe_top_rad; // Radius of top cylinder. #local belw_lo_Z = un1_surge_pipe_bellows_lo_Z; // Low Z of bellows joint. #local belw_hi_Z = un1_surge_pipe_bellows_hi_Z; // High Z of bellows joint. #local belw_R = un1_surge_pipe_bellows_rad; // Outer radius of bellows joint. #local nich_lo_Z = belw_lo_Z - 0.500; // Z of start of bellows niche. #local nich_hi_Z = un1_surge_pipe_niche_back_Z; // Z of back wall of bellows niche. #local nich_R = un1_surge_pipe_niche_rad; // Z of back wall of bellows niche. // Assuming pipe is tilted, origin on reactor axis, OP height: #local bot_ref_X = un1_surge_pipe_bot_ref_X; // X of center of discharge hole. #local bot_ref_Z = un1_surge_pipe_bot_ref_Z; // Z of center of discharge hole. #local top_ref_X = un1_surge_pipe_top_ref_X; // X of center of mouth inside drywell. #local top_ref_Z = un1_surge_pipe_top_ref_Z; // Z of center of mouth inside drywell. #local cap_scZ = (cap_H + soff)/(cap_R + soff); // Z scale factor for cap. #local dX = top_ref_X - bot_ref_X; #local dZ = top_ref_Z - bot_ref_Z; #local tilt = degrees(atan2(dX,dZ)); // Tilt from vertical. #local max_R = max(top_R,belw_R); #if (niche > 0) #local max_R = max(max_R,1.5*nich_R); #end debug_coord("surge pipe tilt", tilt) union{ sphere{ <0,0,0>, cap_R+soff scale <1,1,cap_scZ> translate cap_Z*z } cylinder{ (cap_Z-eps)*z, (cone_lo_Z+eps)*z, cap_R+soff } cone{ cone_lo_Z*z, cap_R+soff, cone_hi_Z*z, top_R+soff } cylinder{ (cone_hi_Z-eps)*z, (top_Z+eoff)*z, top_R+soff } cylinder{ (belw_lo_Z-soff)*z, (belw_hi_Z+soff)*z, belw_R+soff } #if (niche > 0) // !!! Niche is actually squarish, fix. cylinder{ (nich_lo_Z-soff)*z, (nich_hi_Z+soff)*z, nich_R+soff } #end bounded_by{ cylinder{ (cap_Z-cap_H-soff-eps)*z, (top_Z+eoff+eps)*z, max_R+eps } } rotate tilt*y translate < bot_ref_X, 0, bot_ref_Z > } #end #macro un1_pressure_vessel_support(C) // The concrete sructure inside the drywell that supports // the rector pressure vessel. // Origin at OP on reactor axis. #local T = un1_drywell_thk; // Thickness of drywell wall. #local spZ = un1_drywell_sphere_ctr_Z; // Z of drywell sphere center. #local inR = un1_drywell_sphere_rad - T; // Inner radius of drywell sphere. #local ftZ = un1_drywell_floor_Z; // Z of concrete floor inside drywell. #local fcZ = spZ - ftZ; // Z dist from floor to sphere center. #local ftR = sqrt(spZ*spZ - fcZ*fcZ); // Radius of floor. #local sphere_ctr = < 0, 0, spZ >; // Center of drywell sphere. #local floor_ctr = <0,0,ftZ>; // Center of top of concrete floor inside drywell. #local base_ctr = sphere_ctr - inR*z; // Bottommost point of drywell. #local lo_in_rad = un1_rpv_supp_lo_in_rad; // Bottom inner radius of RPV support. #local lo_ot_rad = un1_rpv_supp_lo_ot_rad; // Bottom outer radius of RPV support. #local md1_in_Z = un1_rpv_supp_md1_in_Z; // Bottom Z of inner radius transition. #local md2_in_Z = un1_rpv_supp_md2_in_Z; // Top Z of inner radius transition. #local md3_in_Z = un1_rpv_Z; // Top Z of RPV support shoulder. #local md_ot_Z = un1_rpv_supp_md_ot_Z; // Z of outer radius transition. #local md_in_rad = un1_rpv_supp_md_in_rad; // Inner radius of RPV support shoulder. #local hi_in_rad = un1_rpv_supp_hi_in_rad; // Top inner radius of RPV support. #local hi_ot_rad = un1_rpv_supp_hi_ot_rad; // Top outer radius of RPV support. #local hi_Z = un1_rpv_supp_hi_Z; // Top of RPV support. #local md_cyl_ctr = < 0, 0, md_ot_Z >; #local hi_cyl_ctr = < 0, 0, hi_Z >; #local lo_cone_ctr = < 0, 0, md1_in_Z >; #local hi_cone_ctr = < 0, 0, md2_in_Z >; #local hi_seat_ctr = < 0, 0, md3_in_Z >; // Z of top of RPV seat in shoulder. #local seat_rad = un1_rpv_body_rad; // Radius of RPV seat (= RPV bottom rad). intersection{ object{ C } union{ // The floor inside the drywell: intersection{ cylinder{ base_ctr, floor_ctr - eps*z, ftR + eps } sphere{ sphere_ctr, inR - eps } } // The supporting tube: difference{ union{ cylinder{ floor_ctr - 3*eps*z, md_cyl_ctr - eps*z, lo_ot_rad - eps } cylinder{ md_cyl_ctr - 2*eps*z, hi_cyl_ctr - eps*z, hi_ot_rad - eps } } union{ cylinder{ base_ctr - 5*eps*z, lo_cone_ctr + eps*z, lo_in_rad + eps } cone{ lo_cone_ctr - eps*z, lo_in_rad + eps, hi_cone_ctr + eps*z, md_in_rad + eps } cylinder{ hi_cone_ctr - eps*z, hi_seat_ctr, md_in_rad + eps } sphere{ hi_seat_ctr, seat_rad + eps } cylinder{ hi_seat_ctr - eps*z, hi_cyl_ctr + 5*eps*z, hi_in_rad + eps } } } } texture{ tx_concrete } bounded_by{ union{ cylinder{ base_ctr, floor_ctr, ftR + eps } cylinder{ floor_ctr, hi_cyl_ctr, lo_ot_rad + eps } } } } #end #macro un1_hydraulics_storey_rooms() // Origin at building SW corner of "mid" block and OP ref level. #local lo_X = 0 + un1_hydraulics_storey_W_wall_thk; #local md1_X = un1_hydraulics_storey_md1_X; #local md2_X = un1_hydraulics_storey_md2_X; #local hi_X = un1_building_body_size.x - un1_hydraulics_storey_E_wall_thk; #local lo_Y = 0 + un1_hydraulics_storey_S_wall_thk; #local hi_Y = un1_building_body_size.y - un1_hydraulics_storey_N_wall_thk; #local lo_Z = un1_hydraulics_storey_lo_Z; #local ws_hi_Z = un1_hydraulics_storey_ws_hi_Z; #local md_hi_Z = un1_hydraulics_storey_md_hi_Z; #local es_hi_Z = un1_hydraulics_storey_es_hi_Z; #local hi_Z = max(ws_hi_Z,max(md_hi_Z,es_hi_Z)); difference{ union{ box{ < lo_X, lo_Y, lo_Z > - epsv, < md1_X, hi_Y, ws_hi_Z > + epsv } box{ < md1_X, lo_Y, lo_Z > - epsv, < md2_X, hi_Y, md_hi_Z > + epsv } box{ < md2_X, lo_Y, lo_Z > - epsv, < hi_X, hi_Y, es_hi_Z > + epsv } } object{ un1_drywell_enclosure_massive() translate un1_reactor_axis } bounded_by{ box{ < lo_X, lo_Y, lo_Z > - 3*epsv, < hi_X, hi_Y, hi_Z > + 3*epsv } } } #end #macro un1_steampipes_storey_rooms() // Origin at building SW corner of "mid" block and OP ref level. #local lo_X = un1_building_body_size.x + un1_steampipes_storey_W_wall_thk; #local hi_X = un1_building_base_size.x - un1_steampipes_storey_E_wall_thk; #local lo_Y = 0 + un1_steampipes_storey_S_wall_thk; #local hi_Y = un1_building_base_size.y - un1_steampipes_storey_N_wall_thk; #local lo_Z = un1_steampipes_storey_lo_Z; #local hi_Z = un1_steampipes_storey_hi_Z; box{ < lo_X, lo_Y, lo_Z > - epsv, < hi_X, hi_Y, hi_Z > + epsv } #end #macro un1_hvac_storey_rooms() // Origin at building SW corner of "mid" block and OP ref level. #local lo_X = un1_building_body_size.x + un1_hvac_storey_W_wall_thk; #local hi_X = un1_building_base_size.x - un1_hvac_storey_E_wall_thk; #local lo_Y = 0 + un1_hvac_storey_S_wall_thk; #local hi_Y = un1_building_base_size.y - un1_hvac_storey_N_wall_thk; #local lo_Z = un1_hvac_storey_lo_Z; #local hi_Z = un1_hvac_storey_hi_Z; box{ < lo_X, lo_Y, lo_Z > - epsv, < hi_X, hi_Y, hi_Z > + epsv } #end #macro un1_cooling_storey_rooms() // Origin at building SW corner of "mid" block and OP ref level. #local lo_X = 0 + un1_cooling_storey_W_wall_thk; #local hi_X = un1_building_body_size.x - un1_cooling_storey_E_wall_thk; #local lo_Y = 0 + un1_cooling_storey_S_wall_thk; #local hi_Y = un1_building_body_size.y - un1_cooling_storey_N_wall_thk; #local lo_Z = un1_cooling_storey_lo_Z; // Nominal floor Z. #local hi_Z = un1_cooling_storey_hi_Z; // Nominal ceiling Z. // !! Some rooms have a slightly higher ceiling. difference{ box{ < lo_X, lo_Y, lo_Z > - epsv, < hi_X, hi_Y, hi_Z > + epsv } object{ un1_drywell_enclosure_massive() translate un1_reactor_axis } object{ un1_shroud_enclosure_massive() translate un1_reactor_axis } bounded_by{ box{ < lo_X, lo_Y, lo_Z > - 3*epsv, < hi_X, hi_Y, hi_Z > + 3*epsv } } } #end #macro un1_demineralizer_storey_rooms() // Origin at building SW corner of "mid" block and OP ref level. #local lo_X = 0 + un1_demineralizer_storey_W_wall_thk; #local hi_X = un1_building_body_size.x - un1_demineralizer_storey_E_wall_thk; #local lo_Y = 0 + un1_demineralizer_storey_S_wall_thk; #local hi_Y = un1_building_body_size.y - un1_demineralizer_storey_N_wall_thk; #local lo_Z = un1_demineralizer_storey_lo_Z; // Nominal floor Z. #local hi_Z = un1_demineralizer_storey_hi_Z; // Nominal ceiling Z. difference{ box{ < lo_X, lo_Y, lo_Z > - epsv, < hi_X, hi_Y, hi_Z > + epsv } object{ un1_drywell_enclosure_massive() translate un1_reactor_axis } object{ un1_shroud_enclosure_massive() translate un1_reactor_axis } object{ un1_pools_massive() } bounded_by{ box{ < lo_X, lo_Y, lo_Z > - 3*epsv, < hi_X, hi_Y, hi_Z > + 3*epsv } } } #end #macro un1_condenser_storey_rooms() // Storey that houses the isolation condensers. // Origin at building SW corner of "mid" block and OP ref level. #local lo_X = 0 + un1_condenser_storey_W_wall_thk; #local hi_X = un1_building_body_size.x - un1_condenser_storey_E_wall_thk; #local lo_Y = 0 + un1_condenser_storey_S_wall_thk; #local hi_Y = un1_building_body_size.y - un1_condenser_storey_N_wall_thk; #local lo_Z = un1_condenser_storey_lo_Z; // Nominal floor Z. #local hi_Z = un1_condenser_storey_hi_Z; // Nominal ceiling Z. difference{ box{ < lo_X, lo_Y, lo_Z > - epsv, < hi_X, hi_Y, hi_Z > + epsv } object{ un1_drywell_enclosure_massive() translate un1_reactor_axis } object{ un1_shroud_enclosure_massive() translate un1_reactor_axis } object{ un1_pools_massive() } bounded_by{ box{ < lo_X, lo_Y, lo_Z > - 3*epsv, < hi_X, hi_Y, hi_Z > + 3*epsv } } } #end #macro un1_service_storey_rooms() // Excavator for the service floor space. // Leaves only the outer concrete shell. // Origin at building SW corner of "mid" block and OP ref level. #local lo_X = 0 + un1_service_storey_W_wall_thk; #local hi_X = un1_building_body_size.x - un1_service_storey_E_wall_thk; #local lo_Y = 0 + un1_service_storey_S_wall_thk; #local hi_Y = un1_building_body_size.y - un1_service_storey_N_wall_thk; #local lo_Z = un1_service_storey_lo_Z; // Nominal floor Z. #local hi_Z = un1_service_storey_hi_Z; // Nominal ceiling Z. // !!! Should apply the roof tilt box{ < lo_X, lo_Y, lo_Z > - epsv, < hi_X, hi_Y, hi_Z > + epsv } #end #macro un1_roof_storey_rooms() // Roof terrace excavator. // Leaves only the outer concrete shell. // Origin at building SW corner of "mid" block and OP ref level. #local lo_X = 0 + un1_roof_storey_W_wall_thk; #local hi_X = un1_building_body_size.x - un1_roof_storey_E_wall_thk; #local lo_Y = 0 + un1_roof_storey_S_wall_thk; #local hi_Y = un1_building_body_size.y - un1_roof_storey_N_wall_thk; #local lo_Z = un1_roof_storey_lo_Z; // Nominal floor Z. #local hi_Z = lo_Z + 5.000; // Should be enough. // !!! Should apply the roof tilt box{ < lo_X, lo_Y, lo_Z > - epsv, < hi_X, hi_Y, hi_Z > + epsv } #end // LANDSCAPE #macro un1_ground(C) #local W = 10.000; // Amount of ground around building. #local D = 4.000; // Depth of ground below building. #local bs_lo_corner = < 0, 0, un1_building_lo_Z >; #local bs_hi_corner = < 0, 0, un1_building_lo_Z > + un1_building_base_size; #local gr_lo_corner = bs_lo_corner - ; #local gr_hi_corner = < bs_hi_corner.x + W, bs_hi_corner.y + W, un1_ground_Z > ; intersection{ object{ C } difference{ box{ gr_lo_corner + epsv, gr_hi_corner - epsv } box{ bs_lo_corner - epsv, bs_hi_corner + epsv } } texture{ tx_dirt } } #end // STANDARD CUTTERS #macro un1_standard_cutter(cut,cpos) // Cutter of type {cut} at position {cpos} relative to origin. #if (cut = 0) #local CR = object{ cutter_keep_all() } #end #if (cut = 1) #local CR = object{ cutter_EW_slice() } #end #if (cut = 2) #local CR = object{ cutter_NS_slice() } #end #if (cut = 3) #local CR = object{ cutter_not_SE() } #end #if (cut = 4) #local CR = object{ cutter_not_Z() } #end #if (cut = 5) #local CR = object{ cutter_hor_slice() } #end object{ CR translate cpos } #end #macro un1_standard_building_cutter(cut,cpos) // Cutter of type {cut} displaced by position {cpos}, // suitable for the {CB} argument of {un1_whole}. // Positioned relative to building's core axis, OP level. #local C = object{ un1_standard_cutter(cut,cpos) } object{ C translate un1_reactor_axis } #end #macro un1_standard_drywell_cutter(cut,cpos) // Cutter of type {cut} displaced by position {cpos}, // suitable for the {CD} argument of {un1_whole}. // Positioned relative to X=0, Y=0, Z=(RVP height/2). #local C = object{ un1_standard_cutter(cut,cpos) } object{ C translate un1_drywell_sphere_ctr_Z*z } #end #macro un1_standard_reactor_cutter(cut,cpos) // Cutter of type {cut} displaced by position {cpos}, // suitable for the {CR} argument of {un1_whole}. // Positioned relative to to X=0, Y=0, Z=(RVP height/2). #local C = object{ un1_standard_cutter(cut,cpos) } object{ C translate 0.5*un1_rpv_body_height*z } #end