Data centres: multi-storey shell, racks and pods, cooling, fire safety, power
Deploy web Studio / deploy (push) Successful in 1m4s

datacentre.rhai (palette groups Data centre, Cooling, Fire safety, Power):

- dc_building: multi-storey shell (storeys of storey_h), walls in pieces,
  slabs, roof with parapet, louvres, front door and loading dock; levels
  cut it open storey by storey
- raised_floor; rack_row and dc_pod (cabinets by U, width, depth,
  equipment, fill, doors, LEDs; in-row coolers; cold / hot aisle
  containment with vent tiles, roof, end doors, ceiling duct, airflow);
  dc_cage for colocation
- crah, chiller (air-cooled, dry, adiabatic), cooling_tower, pipe_run
- smoke_detectors (grid + coverage), fire_pipe (VESDA, sprinkler, gas),
  gas_bank (Novec 1230, FM-200, Inergen sized for its halls), fire_device
  (panels, call points, abort switches, beacons, extinguishers)
- power_cab (UPS, battery, PDU, switchgear, RPP), busway, cable_tray,
  transformer
- tooltips sum IT load, kW/m2, cooling redundancy per storey, UPS load,
  battery runtime, plant cooling and agent quantity (warning when short)

Engine and stdlib:

- part_hidden(o) in house.rhai: parts on closed storeys inside a
  dc_building are not drawn (they only made sort cycles under the slab
  above); house parts, furniture and people use it. Existing examples
  render byte-identical.
- overhead services sort in their own "ceiling" layer with tight boxes
- sort records which sprites each broken cycle involved; isokit check
  names them (Rendered.cycle_at)

examples/datacentre (three storeys and a roof plant), Data centre demo in
the web Studio, tests, SCRIPTING/README/ROADMAP, MCP instructions.
This commit is contained in:
grabowski committed 2026-10-27 17:08:39 +07:00
1 parent c8becc2e59
commit 2810477f1b
22 files changed
+2281 -18

No files matched your search

+42
View File
@@ -293,6 +293,48 @@ prefabs work together through the document, not through a parent object:
- Ground-level floors and rugs go to the `floor` layer; upper floors are slabs
whose top is at the object's z. Furniture starts 0.02 m above its z.
## Data centres
`datacentre.rhai` lays out multi-storey data centres from parts that read
each other through the document, like house parts:
- `dc_building` is the shell: `storeys` of `storey_h` (the project
parameter; 5 m suits data halls), outer walls split into pieces of at most
15 m, a slab per storey and a flat roof with a parapet. On level `kf` the
storeys below are closed, the walls facing the viewer are cut 1.2 m above
storey k, the others reach its ceiling, and everything above is left out.
- `part_hidden(o)` (house.rhai) leaves out a part above the storey a level
cuts open, and a part on a closed storey inside a `dc_building`: the shell
hides it, and drawing it would only make sort cycles with what stands on
the slab above. House walls, doors, floors, stairs, furniture, people and
every data centre part use it (`dc_skip` is the same rule).
- `dc_lift(o)`: the top of a `raised_floor` under o on its storey; racks,
pods, CRAH units, cabinets, gas banks, devices and people stand on it.
- A rack line is one sprite with a box per cabinet (`seq`) and the faces
painted with `open()` per class (equipment, LED strips, rear PDUs), so a
pod of 20 racks costs a few dozen nodes. In-row coolers (`inrow`) are
0.3 m units between groups of racks. A pod is three sprites (two rows and
the aisle between them: vent tiles, airflow puffs, end doors, roof, duct),
which never overlap.
- Overhead services (`cable_tray`, `busway`, `fire_pipe`, `smoke_detectors`)
draw in the layer `ceiling` (`dc_ceiling_layer()`: sorted, z first) after
everything on the floor, with sort boxes as tight as the run itself
(hangers do not count): a tray beside a pod with a busway over the pod and
under the tray has no valid order as boxes in one layer. Keep runs that
cross or lie side by side at heights that do not overlap. The project
parameter `ceiling` = false leaves them out.
- Totals: `dc_it(storey)` (IT load, racks; every storey for -1),
`dc_cool(storey)` (CRAH duty and standby, in-row coolers),
`dc_redundancy(cooling, kw)` ("N+1, 140 kW spare"), `dc_plant()` (chillers
and towers), `dc_agent(agent, V, t, litres)` (Novec 1230 at 4.5 %, FM-200
at 7 % by NFPA 2001 / ISO 14520, Inergen at 39.9 %), `dc_gas_volume(o)`.
A gas bank that is short puts a `warntag` on the view.
- Wall devices facing away from the viewer on the storey cut open hang on
the far side of a wall that is cut low: they draw ghosted.
`isokit check` names where the depth sort broke a cycle ("a before b, c":
sprite ids, `Rendered.cycle_at`), which points at the sprites to split.
## Rules that keep the depth sort right
These are lessons from the CNX/Mooban views, and the engine relies on them: