Skip to content

BEMGen pipeline

At Checkpoint 1 (stages S0–S4, D-030) the pipeline is complete for the linear plan; the revision stage S4.1 (D-061 to D-064) gave the plan generator one preset input per space type and added default preset components, a Preview Location input, and component icons; the revision stage S4.2 (D-068 to D-075, ADR-013) added Transform Plan, made the floor aggregators designate floors and ceilings on the assembled stack, turned them into four methods, and made heat transfer between zones a conversion option; stage S5 (D-079, ADR-012) gives every rebuilt outdoor wall one centred window with the glazed area it covers; stage S8.1 (D-082 to D-084, ADR-006, ADR-011) adds a plan generator for each bar family of the High-Density Housing precedent study and the minimum wall and window geometry of every generator; stage S8.2 (D-084) adds the non-rectangular families without holes, the point plate, the winged band, and the open court, and makes the united zones and the edge tests of the surface builder exact on rotated plans; stage S8.3 (D-084) adds the enclosed court, the first footprint with a hole, which every simplifier and aggregator supports; stage S8.4 (D-093 to D-098, ADR-014) adds the non-residential space types with their presets and default preset components, and the office plate and the cafeteria of the four-source precedent set; stage S8.5 (D-098, D-100) adds the four families that branch from a hub on the shared hub-and-arms layout, the radial lobes, the branching mall, the care hub, and the foyer with halls, and makes the perimeter zones of Perimeter Core keep the footprint's own vertices; stage S8.6 (D-098) adds the operating suite with separated clean and dirty routes and the court cluster, the first footprint with several holes; stage S8.7 (D-095, D-098, ADR-015) adds generators that return one plan per storey and the stepped band, whose lower roofs become terraces; the revision stage S8.8 (D-108) previews a storey's floors at the storey's height, as its plan, adds the Any Program Preset parameter, which casts any preset to one without a space type that every preset input takes, and moves the built-in preset components to a panel of their own; stage S6 (D-112, D-113, ADR-010) adds the envelope preset shared by both converters and Convert2IDF, which writes an EnergyPlus 25.2 input file; the revision stage Conditioned Merge (D-123, design note) adds Conditioned Merge, which merges the conditioned and the unconditioned zones of a floor separately, and the option Join Pieces of both merge simplifiers, which makes one zone of all the separate pieces of a class; the revision stage of D-124 (ADR-017) adds Mix Programs, which mixes program presets by floor-area share with the zone-merge rule, and makes infiltration an input of the envelope preset instead of a program load, applied to each zone at conversion; the program JSON stage (D-126, ADR-018, version 1.2.0) adds Program JSON, which makes a program preset from the atlas's program JSON 2.0.0 (program-json.md), and extends the program model with per-dwelling loads, end uses, heat fractions, people properties, heating and cooling as separate sides, hot-water temperatures, and a calendar, while the S10 atlas fetch components are retired. This document describes each step, the rules it applies, where results are validated, and the Grasshopper components that expose it. The domain types are described in domain-model.md, the validation checks in validation.md, and the Convert2BEM output layout in convert2bem.md.

Overview

program presets          ProgramPreset, PresetValues, ProgramMix,           one preset per space type, conditioned or not; ProgramMix mixes presets (D-124);
                         ProgramJsonImporter (Lod.ProgramJson)              the importer makes a preset from program JSON 2.0.0 (D-126)
  → plan generator       PlanGenerator<P, Presets>: LinearPlanGenerator |   → IGeneratedPlan        one preset input per space type; Z0: one zone per dwelling unit or department, explicit windows (ADR-011 limits)
                         StairBayBar | StairPair | GalleryBar | TerraceRow |
                         PointPlate | WingedBand | OpenCourt |
                         EnclosedCourt | OfficePlate | Cafeteria |
                         RadialLobes | BranchingMall | CareHub |
                         FoyerHalls | OperatingSuite | CourtCluster
                         MultiStoreyPlanGenerator<P, Presets>:              → IGeneratedPlan per storey, bottom-up (ADR-015)
                         SteppedBand
  (→ PlanTransform       optional: rotation about z, x-y translation        → IGeneratedPlan        D-070)
  → IPlanSimplifier      NoSimplification | SemanticMerge |                 → IFloor                Z0 | Z1 | Z1c | Z2 | Z3, one centred window per rebuilt wall (D-079)
                         ConditionedMerge | PerimeterCore |
                         SingleZonePerFloor
  → IFloorAggregator     Stack | StackedFloorZoneMultiplier |               → IGeneratedBuilding    floors bottom to top as FloorEntry(IFloor, Multiplier)
                         SingleZonePerFloorType | SingleZoneBuilding
  → validation           FloorValidator, BuildingValidator                  → ValidationReport
  → Convert2BEM          Grasshopper component, HeatTransferOptions         → data trees for a ClimateStudio definition (provisional, D-023)
  → Convert2IDF          Grasshopper component over Convert2Idf (Lod.Export) → EnergyPlus 26.2 IDF text and file, ready to simulate with a weather file (ADR-010, ADR-019, D-130); EnergyPlus runs outside the pipeline, in Lod.Simulation
  • All logic lives in Lod.Core and Lod.Generators, which reference neither Rhino nor Grasshopper; their tests run with dotnet test. Lod.Grasshopper wraps each pipeline type in a Goo with a viewport preview and exposes one component per step (D-017, D-018). Every component that previews a plan, floor, or building has a last input Preview Location that moves only its preview (D-062, below).
  • Every step returns Result<T>: a value or errors, plus warnings and info diagnostics with stable codes (DiagnosticCodes). Components show diagnostics as runtime messages (error, warning, remark); after an error there is no output.
  • Pipeline objects are immutable. Every plan, floor, and building carries a Provenance record (operation, parameters, inputs, code version), which the Inspect component prints.
  • Numerical tolerances come only from ToleranceSettings (ADR-004), the minimum wall and window geometry of the generators only from GeometryLimits (ADR-011). The same inputs always give the same output.
  • Windows are not a separate axis (D-079, ADR-012). Wherever zones are merged and walls are rebuilt (Semantic Merge, Conditioned Merge, Perimeter Core, Single Zone per Floor, Single Zone per Floor Type, Single Zone Building), every outdoor wall carries exactly one window, centred on it by the generator's rule (D-026), whose area is the glazed area of the source windows it covers; a wall without glazing has none. Glazed area is conserved per wall, and so per façade, orientation, and building; window positions are not. No Simplification, Stack Floors, and Stacked Floor Zone Multiplier keep their input's windows. The window levels W1–W5 of the earlier research brief are dropped.

Steps

1. Program presets

Types Schedule, LoadDefinition, Thermostat, ZoneProgram, ProgramPreset, PresetValues, PresetLoadValue, ExampleResidentialPresets, ExampleNonResidentialPresets, ProgramMix (D-124); since D-126 LoadEndUses, LoadComponent, HeatFractions, WaterTemperatures, PeopleProperties, SensibleHeatFraction, ScheduleCalendar, and in Lod.ProgramJson ProgramJsonImporter, ProgramJsonReader; envelope (S6): EnvelopePreset, EnvelopeValues, Construction, OpaqueLayer (Layer, NoMassLayer, AirGapLayer) with SurfaceFinish, WindowGlazing (GlazingSpec, LayeredGlazing of GlassLayer and GasLayer), Infiltration (D-124), ExampleEnvelopePresets
Components Panel 1 Program: Schedule, Load, Program Preset (input Conditioned), Mix Programs (D-124), Program JSON (D-126), Construction JSON (D-137), DOE Program Map (DOE geometry P1, 0e471c68-8cb1-4375-b82a-71b36d797b94, doe-components.md), and the parameters Any Program Preset (S8.8) and Program Map (ec21d323-a3c1-41d7-aed8-b1e13dab50df, hidden; the output of DOE Program Map); panel 1 Program Presets (S8.8): Dwelling Unit Preset, Corridor Preset, Stair Preset, the fifteen non-residential default preset components (Office Preset … Service Preset, S8.4), Envelope Preset (S6; its infiltration inputs D-124), and in their own group the fifteen DOE program-map presets DOE Small Office Programs … DOE Outpatient Programs (DOE geometry P7, doe-components.md)
Decisions D-024, D-026, D-038, D-047, D-061, D-094, D-097, D-108, D-124, D-126; ADR-003, ADR-005, ADR-007, ADR-014, ADR-017, ADR-018
  • A program preset holds the zone program of one space type, the window-to-wall ratio per orientation (N, E, S, W, each in [0, 1)) and the skylight ratio in [0, 1) that the plan generator uses (D-024, D-026; DOE geometry note S5, O3). A scalar WWR means all four orientations and a skylight ratio of 0. Its name is descriptive only: it appears in reports, provenance, and messages and is never used for matching (D-061).
  • An any-program preset (S8.8, D-108, ADR-014) has no space type: ProgramPreset.SpaceType is null and IsAnyProgram is true. Every preset is created with a space type; AsAnyProgram() returns it without one and keeps its name, program (loads, schedules, conditioning, setpoints), WWR per orientation, and skylight ratio.
  • PresetValues holds the plain values a preset is built from: name, space type, WWR (with an optional WWR per orientation and a skylight ratio), Conditioned, constant heating and cooling setpoints in °C, and the loads (PresetLoadValue: type, basis, value, fraction schedule). ToPreset() builds the preset and reports every invalid value at once; a conditioned preset gets constant setpoint schedules named "{Name} Heating Setpoint" and "{Name} Cooling Setpoint", and an unconditioned one ignores the setpoints.
  • Conditioning comes from the preset (D-038): a conditioned program has a thermostat with a heating setpoint schedule, a cooling setpoint schedule, or both (D-126; heating never above cooling in any hour); an unconditioned program has no setpoints.
  • Schedules have 8760 hourly values, fractions, temperatures, or (D-126) activity levels in W per person (ADR-003).
  • Load types: Occupancy, Lighting, ElectricEquipment, GasEquipment, DomesticHotWater, Ventilation. Each load has one basis: PerFloorArea, PerPerson, Absolute, AirChangesPerHour (ADR-007), or since D-126 PerDwellingUnit (the zone's dwelling count is the basis quantity). Infiltration and the per-exterior-wall basis left the program in D-124: infiltration follows the envelope, so it is an input of the envelope preset, and a program load type or basis that is not defined is the error UndefinedLoadKind. A program holds at most one load per type, end use, and basis (D-126; D-047 said type and basis), so a load type may have components in several bases and end uses, which add up; a zone's design occupants are the sum of its occupancy components (D-047). Magnitudes are people, W, or m³/h.
  • The extended program (D-126, ADR-018). A load has an end use (default the type's snake-case name); lighting and equipment loads have heat fractions and hot-water loads a target and an inlet temperature; the program has the occupants' activity schedule and radiant and sensible fractions and, for a preset from program JSON, the calendar its schedules were expanded on. Every default is the value the IDF writer used before, so presets that set none behave as before (domain-model.md, program presets).
  • Program JSON (D-126, abb0aeb9-5a9f-40ff-b3a1-bb125cfb675c, nickname PJson, panel 1 Program) makes a program preset from the text of a program JSON 2.0.0 (defaulted export; no file, no network). It is a thin adaptor over ProgramJsonImporter.Import in Lod.ProgramJson, which checks the JSON against the embedded schema and the contract's rules, expands its schedules to 8760 values on the calendar of Year (default 2007) and Holidays, maps it to a preset, and applies the overrides of the inputs after JSON: Name, Space Type (unset: an any-program preset), WWR (0.4), Loads, Heating On, Cooling On, Heating Setpoint, Cooling Setpoint, Activity, People Radiant, People Sensible. Outputs: Preset, Source, Assumptions, Overrides, Left Out. Errors and warnings are runtime messages. Contract, mapping, checks, and rules: program-json.md.
  • Construction JSON (D-137, b2802511-fee7-49ab-bdcb-9329ce293461, nickname CJson, panel 1 Program) makes a construction set from the text of the atlas's unified building-scope construction JSON (no file, no network; a single-dwelling set is refused and a detailed document is read as evidence only, D-142; packet v7, D-145, gives the set its foundation and ground data, from which Convert2IDF writes F-factor or layered ground floors, ADR-023), a thin adaptor over ConstructionJsonImporter.Import in Lod.ConstructionJson. Its output goes to Convert2IDF's Construction input instead of an envelope preset. Outputs: Construction, Source, Roles, Unused. Mapping and checks: construction-json.md.
  • Schedule Draw (D-194, ADR-033, 740cafea-7afe-47f4-8723-b24b6ec3c836, nickname SDraw, panel 1 Program) draws stochastic 8,760-hour schedules for a program JSON 6.0.0 with the atlas generator atlas_schedules 4.1.0 (ADR-035, D-242, reading atlas release 2.3.0), run as an external command only while Run is true: Program JSON, Generator JSON (the generation.json of the program's folder in release 2.3.0), Setting (schedule_draw_setting 2.0.0), Seed, Floor Area, Command, Folder, Run → Drawn JSON, Provenance, Diagnostics. The drawn JSON goes into Program JSON. A thin adaptor over ScheduleDrawer in Lod.ProgramJson; contract, checks, and suites: schedule-draw.md.
  • ExampleResidentialPresets hold illustrative round numbers for development and tests, not DOE prototype values: dwelling unit and corridor conditioned, stair unconditioned. Each is available as values (DwellingUnitValues, CorridorValues, StairValues) and as the preset built from them (DwellingUnit, Corridor, Stair). The default preset components Dwelling Unit Preset, Corridor Preset, and Stair Preset take these values as their input defaults, so each works with nothing connected, and each shows the remark "Illustrative values; not sourced from DOE prototypes or standards." Since D-124 the example presets have no infiltration load, so none of the default preset components has Infiltration and Infiltration Schedule inputs.
  • An envelope preset (S6, ADR-010) is not part of a program preset: it holds one layered construction per envelope role (massive, massless, and air-gap layers), the window's glazing (a simple glazing system, or layers of glass and gas), and since D-124 the building's infiltration, is the same at every level of detail, and is given to the converters (Convert2BEM, Convert2IDF). The infiltration is one design rate (m³/h per m² of exterior surface area or of exterior wall area, or air changes per hour) with a fraction schedule, the same for every zone; Envelope Preset has the inputs Infiltration Rate, Infiltration Basis (PerExteriorSurfaceArea, PerExteriorWallArea, or AirChangesPerHour), and an optional Infiltration Schedule. Each converter applies it to each zone's own exterior surfaces or volume, so no zone merge aggregates it (see steps 3, 6, and 7). ExampleEnvelopePresets.Example holds illustrative values, not taken from any standard (envelope presets).
  • ExampleNonResidentialPresets (S8.4, ADR-014) hold illustrative presets, all conditioned, for the space types of the non-residential departments (D-097): Office, Core, Retail, Mall, Kitchen, Dining, OperatingTheatre, CleanCorridor, DirtyCorridor, ClinicalSupport, CareBedroom, CareCommunal, Lobby, ActivityHall, and Service; the kitchen has gas equipment and, like the operating theatre, ventilation in air changes per hour; the retail schedules have their own Saturday and Sunday profiles. One default preset component per type, Office Preset to Service Preset, takes these values as input defaults with the same remark. Values and schedules: program presets §2.2.
  • Mix Programs (D-124, ADR-017; ProgramMix.Mix in Lod.Core.Programs, GUID 744378f8-861d-4e6d-bff4-68c7fe2b62c1) mixes one or more program presets into one by a weight per preset, a floor-area share. Inputs Presets (list), Weights (list of the same length; each finite and greater than 0, normalised to sum to 1), Name (optional, default Mix of A 0.7, B 0.3), Space Type (optional, an enum input), and WWR (optional); output Preset. Since D-228 a strip Get from Atlas… stores a folder's atlas programs and their weights in the component (AtlasProgramMix; program-json.md): Presets and Weights are then optional, a wire into Presets takes precedence over the stored members, and Weights alone replaces the stored weights; the appended inputs Climate Zone, Year, Holidays, Context are used with the stored members only, and the appended outputs JSON and Left Out give each member's text and what it leaves out. The mix is the zone merge of step 3 applied to one virtual zone of unit floor area and volume whose sources are the inputs: floor-area and air-change loads are weighted by share, per-person loads by the occupants each input brings, absolute loads are summed raw whatever the weights, schedules are weighted by each input's transferred magnitude, the mix is conditioned when any input is, and its setpoints are the share-weighted means over the conditioned inputs (program presets §6). A missing Space Type is that of the input with the largest weight (the first on a tie), and a missing WWR the weighted mean. Since D-126 per-dwelling loads mix like floor-area loads (a weight is also a share of dwellings), heat fractions, people properties, and water temperatures follow the zone-merge rules, setpoints are mixed per side, and presets on different calendars are the error CalendarMismatch. A per-person load beside absolute occupancy in any inputs is the error PerPersonWithAbsoluteOccupancy; occupancy in more than one basis with a per-person load or different people properties is the error MixedOccupancyBases; conditioned beside unconditioned inputs is the info MixedConditioning. The result's Source records the inputs as Input.k name, weight, and normalised-weight pairs, so the plan, floor, and building provenance that follows names them, and every mixed load and schedule records its inputs by those keys.

2. Plan generation

Types PlanGenerator<TParameters, TPresets> → IGeneratedPlan: LinearPlanGenerator, StairBayBarGenerator, StairPairGenerator, GalleryBarGenerator, TerraceRowGenerator, PointPlateGenerator, WingedBandGenerator, OpenCourtGenerator, EnclosedCourtGenerator, OfficePlateGenerator, CafeteriaGenerator, RadialLobesGenerator, BranchingMallGenerator, CareHubGenerator, FoyerHallsGenerator, OperatingSuiteGenerator, CourtClusterGenerator, each with its <Family>Parameters and <Family>Presets; MultiStoreyPlanGenerator<TParameters, TPresets> → IReadOnlyList<IGeneratedPlan>, one plan per storey bottom-up (ADR-015): SteppedBandGenerator with SteppedBandParameters and SteppedBandPresets; the DOE reference geometry generators of Lod.Generators.Doe (RingOfficeGenerator, RestaurantGenerator, StoreRowGenerator, RetailBoxGenerator, SupermarketGenerator, WarehouseGenerator, SchoolGenerator, CorridorHotelGenerator, TowerHotelGenerator, HospitalGenerator, and OutpatientGenerator, each over a DoeProgramMap, doe-layouts.md); GeometryLimits; PlanTransform.Apply(IGeneratedPlan, rotationDegrees, translationX, translationY) → IGeneratedPlan
Components Linear Plan Generator, Stair Bay Bar, Stair Pair, Gallery Bar, Terrace Row, Point Plate, Winged Band, Open Court, Enclosed Court, Office Plate, Cafeteria, Radial Lobes, Branching Mall, Care Hub, Foyer Halls, Operating Suite, Court Cluster, Stepped Band, Transform Plan; the 15 DOE generators DOE Small Office, DOE Medium Office, DOE Large Office, DOE Full-Service Restaurant, DOE Quick-Service Restaurant, DOE Strip Mall, DOE Stand-alone Retail, DOE Supermarket, DOE Warehouse, DOE Primary School, DOE Secondary School, DOE Small Hotel, DOE Large Hotel, DOE Hospital, and DOE Outpatient, and DOE Program Map in panel 1 Program (doe-components.md)
Decisions D-009, D-015, D-026, D-039, D-061, D-070, D-082, D-083, D-084, D-093, D-094, D-095, D-097, D-098, D-100, D-160 to D-169; ADR-002, ADR-006, ADR-011, ADR-013, ADR-015
  • Presets (D-061): a generator takes a typed preset record with one preset per space type it places, a PlanPresets whose Slots list its inputs as PresetSlot(Input, SpaceType, Preset). For the linear block this is LinearPlanPresets(DwellingUnit, Corridor, Stair). Before the layout is built every slot is checked: a preset of another space type is the error PresetSpaceTypeMismatch (one per wrong slot, naming the input, both space types, and the preset), a missing preset the error MissingPreset. Each zone gets the preset of the slot of its space type; provenance records Presets=DwellingUnit:<name>;Corridor:<name>;Stair:<name> in slot order, with each slot's space type. An any-program preset (S8.8, D-108) is accepted on every slot: the zones keep the space type of the layout and take the preset's program and WWR, and the plan records AnyProgramPreset.<Input>=<name> for each such slot (for example AnyProgramPreset.Corridor=Example Office), so the change of program is never silent (GLOBAL.md scientific rule 3). A plan of typed presets records no such parameter and is unchanged. A preset with a Source (a mix, D-124, or a sourced preset) adds it as an input of the plan's provenance, once each; a plan of presets without one is unchanged. Since the DOE geometry stage P0a (design note, S4) a planned zone may carry a ProgramKey from source data (the standards space type of a DOE zone), which its generated Zone keeps; every other generator leaves it null. The preset of a zone is PlanPresets.PresetFor(zone), by default the slot of its space type; a record keyed by program key (DoeProgramMap, DOE layouts) looks the key up instead, a key without a preset being MissingPreset (No program preset for program key '<key>'.), and its slots carry their key (PresetSlot.ProgramKey), so provenance names them Presets=<key>:<name>;….

  • Mechanism (ADR-006): one generator per typology family of the precedent study (four-source families, D-093; the nine High-Density Housing families are carried as SYN-TYP-001–009, hdhm-typologies.md, D-082, D-083), each a PlanGenerator subclass in Lod.Generators/<Family>/ whose layout returns the footprint and the zones as polygons; the base checks the presets, builds the surfaces, places the windows, and records provenance. Layouts are axis-aligned in the plan frame (origin at the south-west corner, the bar along plan east); Orientation turns plan north and Transform Plan moves the result. Parameter records of S8 have a static Default with the ADR-006 defaults, which the components use as their input defaults. A parameter that would remove one of the family's essential relationships (a count below the family minimum) or a length that is not positive is the error InvalidParameter. Lengths are metres.

  • Linear block (HDHM-TYP-009, double-sided internal corridor bar): a full-depth stair at the west end (ST), a double-loaded corridor (CO), and one row of equal dwelling units on each side (US1…, UN1…); one zone per dwelling unit (D-009). Checked against the family's rules in S8.1 and unchanged.
  • Stair bay bar (HDHM-TYP-001): BayCount (≥ 2, default 3) stair bays of dwelling | stair | dwelling through the full depth (UnitWidth 7 m, StairWidth 3 m, Depth 12 m): stairs ST1…STn, then dwellings U1…U2n, west to east; each stair adjoins the two dwellings of its bay; no corridor.
  • Stair pair (HDHM-TYP-008): one stair bay as its own building, with the same layout code (StairBayLayout): ST1, U1, U2; defaults as the stair bay bar.
  • Gallery bar (HDHM-TYP-002): UnitCount (≥ 2, default 6) dwellings of UnitWidth 6 m through Depth 10 m between two end stairs of StairWidth 4 m: ST1 (west), ST2 (east), U1…Un. The gallery is not modelled (D-083): no gallery zone or geometry, and the gallery-side façade is an ordinary outdoor façade.
  • Terrace row (HDHM-TYP-006): PlotCount (≥ 2, default 6) attached houses of PlotWidth 5.5 m through Depth 10 m, U1…Un named House i, neighbours sharing a dividing wall; one dwelling zone per plot and storey, the house's own stair not zoned; only a Dwelling Unit preset.
  • Point plate (HDHM-TYP-007): a square plate of side CoreWidth + 2 · DwellingDepth (22 m by default) with a central core ST (Core, a Stair zone, 6 m square) and four dwellings U1…U4 of DwellingDepth 8 m in a pinwheel around it, counter-clockwise from the south-west; every dwelling adjoins the core along one of the core's sides and has two façades; the core has no outdoor wall, the first zone of any family without one.
  • Winged band (HDHM-TYP-003): a band of stair bays along plan x and WingCount (≥ 2, default 3) wings of stair bays projecting to plan north, WingLength 17 m long and WingSpacing 17 m apart, all Depth 12 m deep; the first wing is flush with the band's west end, the last with its east end, so the outline is a comb. Every wing adjoins the band along its whole root. The band and each wing hold n = max(1, round(L / (2U + S))) bays with the dwelling width adjusted to fill their length L (the default 70 m band has four bays of 7.25 m dwellings, the wings one bay each); stairs that leave no dwelling width are the error InvalidParameter. Zones B-ST1…, B-U1… (band, west to east), then W{i}-ST1…, W{i}-U1… (wing i, south to north). The band's north façade is fragments between the wings' roots and its bay boundaries (1.25 m to 7.25 m by default); a fragment shorter than 1 m gets no window (WindowOmitted, ADR-011).
  • Open court (HDHM-TYP-004): three wings of stair bays, Depth 12 m deep, around a court CourtWidth 24 m wide and CourtDepth 17 m deep that is open to plan south: west and east wings of length CourtDepth and a north wing across the full width 2 · Depth + CourtWidth that holds the corners. Bays are fitted to each wing as in the winged band. Zones N-… (west to east), then W-… and E-… (south to north); every dwelling adjoins a stair of its bay.
  • Enclosed court (HDHM-TYP-005): four wings of stair bays, Depth 12 m deep, around a court CourtWidth 24 m wide and CourtDepth 24 m deep that is closed on all four sides: south and north wings across the full width 2 · Depth + CourtWidth that hold the corners, and west and east wings of length CourtDepth between them. The footprint is the outer rectangle with the court as its one hole, so the court is outside the building and its façades are outdoor walls with windows, facing into it. Bays are fitted to each wing as in the winged band (by default three bays of 6.5 m dwellings in each 48 m long wing and one bay of 10.5 m dwellings in each side wing). Zones S-…, N-… (west to east), then W-… and E-… (south to north); 1728 m², 44 windows, 16 of them on the court façades.
  • Office plate (SYN-TYP-017, S8.4): a PlateLength 42 m × PlateDepth 30 m plate with a central CoreLength 18 m × CoreDepth 6 m core SC (Service Core, a Core zone without outdoor walls) and one office work area OF (Office), the plate minus the core: a zone with the core as its hole in a footprint without one (D-097). The core must leave at least 3 m of work area at every façade (OfficePlateGenerator.MinimumOfficeDepth), or the error InvalidParameter names the depth left. Floor height 3.8 m; 1260 m², 4 windows.
  • Cafeteria (SYN-TYP-016, S8.4): a Length 30 m plan with the kitchen and servery KS (Kitchen, KitchenDepth 8 m) along the whole north edge of the dining field DI (Dining, DiningDepth 15 m); the servery counter is the shared edge, not a zone. KitchenDepth must be smaller than DiningDepth (InvalidParameter). Floor height 4 m; 690 m², 6 windows.
  • Hub and arms (S8.5): the radial lobes, the branching mall, the care hub, and the foyer with halls share HubArmsLayout (internal, Lod.Generators/HubArms/): a square hub with up to four arms of one width, centred on its sides in the order east, north, west, south; a family with n arms uses the first n sides (two arms east and north, three a T open to plan south, four a cross), and the bounding box's south-west corner is at the origin. Each arm has its own frame, along from the hub and across from its clockwise side, in which the families cut their zones. An arm must not be wider than the hub, and at most four arms fit the axis-aligned layout (D-100); both are InvalidParameter. Arms narrower than the hub leave its corners as short outdoor walls, which get no window below 1 m (WindowOmitted). Zones are listed hub first, then arm by arm.
  • Radial lobes (SYN-TYP-010, S8.5): LobeCount (3–4, default 4) lobes, LobeLength 10 m and LobeWidth 12 m, around a CoreWidth 12 m core ST (Core, a Stair zone); each lobe holds two dwellings side by side, L{i}-U1 (the half clockwise of the lobe's axis) and L{i}-U2, both adjoining the core. With three lobes the core's south side is a façade. 624 m², 16 windows.
  • Branching mall (SYN-TYP-014, S8.5): BranchCount (3–4, default 3) branches from a central court as wide as the branches, 2 · ShopDepth + MallWidth = 32 m; each branch has a BranchLength 40 m shop wing on either side of an 8 m mall strip, B{i}-S1, B{i}-S2 (Retail), and an AnchorDepth 30 m anchor B{i}-AN (Retail) across its end. The court and every strip are one zone MALL (Mall), which every shop wing and anchor adjoins. Floor height 5 m; 7744 m², 16 windows; with four branches the mall has no outdoor wall.
  • Care hub (SYN-TYP-018, S8.5): WingCount (2–4, default 3) wings of WingLength 30 m around a HubWidth 16 m communal hub HUB (CareCommunal); each wing is a CorridorWidth 2.4 m corridor W{i}-CO (Corridor) from the hub to the wing's end between two bedroom zones W{i}-B1, W{i}-B2 (CareBedroom) of BedroomDepth 6 m. The wing width 2 · BedroomDepth + CorridorWidth must not exceed HubWidth. 1552 m², 16 windows; the six 0.8 m hub corners get none (WindowOmitted).
  • Foyer with halls (SYN-TYP-019, S8.5): a FoyerWidth 20 m foyer FO (Lobby) with HallCount (2–3, default 2) activity halls H1…Hn (ActivityHall) of HallLength 30 m × HallWidth 20 m and a SupportLength 10 m support wing SV (Service): hall 1 east, the support wing north, hall 2 west, hall 3 south; zones FO, H1…Hn, SV. With two halls the foyer's south side is its entrance façade. Floor height 6 m; 1800 m², 10 windows.
  • Operating suite (SYN-TYP-015, S8.6): SupportLength 12 m of support rooms SUP (ClinicalSupport) across the full depth at the west end; east of them, bands of BankLength 36 m stacked from south to north: a dirty corridor, then per bank (BankCount ≥ 2, default 2) the bank of TheatreDepth 7 m and the next corridor, the corridors alternating dirty and clean: DC1, TB1, CC1, TB2, DC2, … (DirtyCorridor 2.4 m, OperatingTheatre, CleanCorridor 3 m). Every bank lies between one clean and one dirty corridor, no clean corridor adjoins a dirty one, and every band adjoins SUP. A bank's only outdoor wall is its east end, which the theatre preset's WWR 0 leaves without a window (no WindowOmitted). Floor height 4.2 m; 1046.4 m², 8 windows.
  • Court cluster (SYN-TYP-011, S8.6): CourtCount (≥ 2, default 2) courts of CourtWidth 24 m × CourtDepth 24 m in a row along plan x, closed by wings of stair bays Depth 12 m deep: south and north wings across the full width (k + 1) · Depth + k · CourtWidth, and a west wing, k − 1 middle wings, and an east wing between them, each middle wing bordering two courts. Bays are fitted to each wing as in the winged band (five bays of 6.9 m dwellings in each 84 m long wing by default). The footprint is the outer rectangle with one hole per court, west to east. Zones S-…, N-… (west to east), then W-…, M1-…, …, E-… (south to north); 2880 m², 72 windows, 16 on the façades of each court.
  • Plans per storey (S8.7, D-095, ADR-015): a MultiStoreyPlanGenerator returns one ordinary plan per storey, bottom-up, for a family whose plan differs by storey. It checks the parameters and presets once and builds every storey as PlanGenerator builds its plan; each plan lies at elevation 0, has the parameters' floor height and orientation, and records its storey index as the provenance parameter Storey (from 0) and its base elevation, the sum of the floor heights below it, as StoreyElevation (m, S8.8, D-108), which only the previews read (StoreyProvenance). A plan may stand for several storeys (StoreyMultiplier, 1 by default; the DOE large office's middle floor stands for ten): those storeys count in the elevations above it, the plan records the number as the provenance parameter StoreyMultiplier, and it is the plan's multiplier as a floor entry. A diagnostic of one storey keeps its code and subject, and its message starts with Storey k:.
  • Stepped band (SYN-TYP-012, S8.7): StoreyCount (≥ 2, default 3) storeys of a Length 36 m band; on storey k the dwellings U1…Un (west to east, n = max(1, round((Length − StairWidth) / UnitWidth)), five of 6.4 m by default) span from k · StepDepth (3 m) to BaseDepth (14 m), beside a west stair ST (StairWidth 4 m) over the same depth, and the corridor CO (CorridorWidth 2 m) runs along the rear on every storey, adjoined by every dwelling. Each storey stands on the one below, which keeps a terrace of Length × StepDepth (108 m² by default), an outdoor roof once stacked (D-068); the walls facing the terraces are outdoor walls with windows. Length must exceed StairWidth, and BaseDepth − (StoreyCount − 1) · StepDepth must be positive (InvalidParameter). 576, 468, and 360 m² by default, 11 windows per storey.
  • Non-residential families place one zone per department (D-097, ADR-014); their default dimensions are controller design defaults (D-098). The last family of the four-source set, SYN-TYP-012, is built in S8.7 as the first generator of one plan per storey (ADR-015); with it every family of D-093 except the set-aside SYN-TYP-013 (D-096) has a generator, eighteen in all.
  • Surfaces come from LayoutSurfaceBuilder: an edge shared by two zones becomes an interzone wall, an edge on the plan boundary an outdoor wall; any other edge (a gap or an overlap) is an error. The boundary includes the footprint's holes, whose edges face into the court, and every boundary edge must be covered by outdoor zone edges over its full length, so a zone placed in a court is an error too (UnmatchedEdge, ADR-002, S8.3). On a plan with multiplied rooms (DOE geometry stage P5a) the footprint less the zones is the copy space, its edges cover the boundary, zone edges on it are SelfAdjacent, and drawn zones plus copy space that do not make the footprint's area are CopySpaceAreaMismatch. Whether a vertex lies on an edge, to split it there or to place it on the boundary, is measured between the vertices' original positions against the distance tolerance, not between their snapped grid cells, so T-junctions are recognised on rotated plans (ADR-002, S8.2). Floors and ceilings stay Unresolved until floors are aggregated.
  • Walls carry explicit windows (position along the wall, sill, width, height; any number per wall, D-039). Every generator's rule: one centered window per outdoor wall with area = the zone preset's WWR for the orientation the wall faces × wall area (D-026; DOE geometry note S5: the bin of the wall's true azimuth, plan azimuth plus OrientationDegrees, N [315°, 45°), E [45°, 135°), S [135°, 225°), W [225°, 315°)), or × wall length × GlazingReferenceHeight when the plan parameters set one (S6: the wall area below a source ceiling, for zones one floor-to-floor high with the plenum inside, G1; recorded in provenance; the window keeps the wall's proportions); and every zone ceiling one skylight of the preset's skylight ratio × the ceiling area, centred in the ceiling's largest grid rectangle (S5, Skylights.Centred; a skylight that does not fit is the error SkylightDoesNotFit, never capped), or, for a zone with a source skylight layout of that ratio (PlannedZone.SkylightLayouts, the DOE retail, warehouse, supermarket, and schools, D-252), the source's skylights of that area in all, their frame mapped onto the ceiling's bounding box (SkylightLayout.Place; where one would leave the ceiling or meet another, one centred skylight and the warning SkylightLayoutNotFitted), except on a wall shorter than 1 m or where the window would be narrower or lower than 0.3 m (GeometryLimits, ADR-011): that wall gets no window and the info WindowOmitted (subject: the wall), and the plan is produced. Every later step conserves the glazing the generator placed.
  • Transform (D-070): PlanTransform.Apply rotates a plan about the world origin by an angle about +z (counter-clockwise seen from above, degrees) and then moves it in x and y (metres). Footprint, zones, walls, and floors and ceilings move rigidly (PlanMotion; whole quarter turns are exact); windows keep their offsets, sills, and sizes; IDs are kept. Wall facing follows the rotated geometry; the plan's Orientation (true north) is unchanged. Provenance: operation TransformPlan, parameters RotationDegrees, TranslationX, TranslationY, the source plan as input. A value that is not finite is the error InvalidParameter. Only plans are transformed; floors and buildings keep the geometry of their plans, and storey elevations come from the floor aggregator.

3. Plan simplification

Type IPlanSimplifier.Simplify(IGeneratedPlan) → IFloor (with Source and Mapping)
Components No Simplification (Z0), Semantic Merge (Z1, input Join Pieces), Conditioned Merge (Z1c, input Join Pieces), Perimeter Core (Z2, input Depth, default 4.57 m), Single Zone per Floor (Z3); Map Source to Target lists the mapping
Decisions D-019, D-034, D-038, D-039, D-041, D-047, D-079, D-123; ADR-005, ADR-007, ADR-008, ADR-012
  • NoSimplification keeps the plan's zones and surfaces with an identity mapping.
  • The other simplifiers share one procedure (PlanSimplifier). A strategy proposes target footprints; source zones are mapped to targets by overlap area (ZoneMapping); surfaces are rebuilt, so walls between merged sources disappear (D-034); the target outdoor walls must cover every source outdoor wall over its full length (D-041, error FacadeNotCovered); every target ceiling gets one skylight centred in its largest grid rectangle with the skylight area of the plan's ceilings under it (CentredSkylights, DOE geometry note S5), except a target ceiling that is a plan ceiling unchanged, which keeps its skylights (D-252); every source window is attributed to the target outdoor wall that contains it (WindowRehosting, D-039), and every target outdoor wall then gets one window centred on it with the total area of the windows attributed to it (CentredWindows, D-079), shaped like the generator's windows (Window.Centered, D-026) and none when that area is zero; a window that no single target wall contains (WindowNotHosted) and a wall whose glazed area is not smaller than its area (GlazingExceedsWall) are errors that hold by construction once the façades are covered, checked rather than repaired; programs are aggregated through the transfer fractions.
  • Aggregation (ADR-005, ADR-007): each (load type, basis) component is aggregated on its own (D-047). Each source with the component transfers Tᵢ = fᵢ·Qᵢ of its design magnitude; the component's target magnitude is Q = ΣTᵢ and its value Q/B in that component's basis; its schedule is s(t) = ΣTᵢ·sᵢ(t)/Q*. Sources without the component contribute nothing to it, and mixed bases are not an error. Air-change loads are therefore volume weighted (D-019). Every basis is known from the zone alone (floor area, volume, occupants): since D-124 there is no exterior-wall basis and no exterior-wall weighting, and infiltration, which is the envelope's, is not aggregated; each converter applies it to each target zone's own surfaces or volume (steps 6 and 7). A target is conditioned if any source contributing floor area is; its setpoints are floor-area weighted over the conditioned sources, a prescribed control rule (D-038).
  • Semantic Merge merges connected zones of the same space type and program key (zones without a key, every generator's but the DOE ones, group by space type alone, as before), and a merged zone keeps its sources' key; each group's footprint is the union of its zones as tiles (PolygonOps.UnionTiles), which keeps the zones' own vertices and may have holes: the four dwellings of the point plate become one ring around the core (ADR-002). Perimeter Core makes one perimeter zone per orientation plus a core, with corners split on the bisectors (ADR-008), also at re-entrant corners; an orientation with several separate façade runs, such as the open court's three south façades, gives the zones P-South-1…. A footprint with holes is offset on every ring: the court façades get their own zones P-Court-North, P-Court-East, P-Court-South, P-Court-West, named by the direction they face and listed after the outer zones, and the core is a ring around the court (ADR-008, S8.3). With several courts the court trapezoids of each bin are united across the courts, giving one zone per court and bin, P-Court-North-1, P-Court-North-2, …, numbered in the union's output order, and a core with one hole per court (ADR-008, S8.6). The perimeter zones keep the footprint's own vertices, not vertices rounded to the clipping grid, so a façade edge shorter than about 1 m, such as a hub corner of the care hub, is covered by the single-zone aggregators on a rotated plan (ADR-008, S8.5). Every wing or other part of the footprint, including the wings between the outer and the court façades and between two courts, must be wider than twice the depth, or the simplifier fails with PlanTooNarrow, whose message says so. Single Zone per Floor makes the floor one zone.
  • Semantic Merge and Conditioned Merge (D-123) share one grouping (MergeGroups). A key function sorts the plan's zones into classes: the space type for Semantic Merge, conditioning for Conditioned Merge. Within a class, zones that share a wall (an interzone wall between them, D-034) are connected, and zones that touch only at a point are not. Each connected group is a piece, the union of its zones as tiles (above); a piece that is not one polygon is the error DisconnectedGroup.
  • Multiplied rooms (DOE geometry stage P5a, S8, ADR-026). A planned zone may carry a multiplier above 1: one drawn room standing for several identical ones (O5). A plan with such a zone may leave part of its footprint undrawn, the copy space where the copies stand; every wall on it, and every wall between zones of different multipliers (both sides), is SelfAdjacent, never paired. Both merge simplifiers merge only zones of equal multiplier, also with Join Pieces, and the merged zone keeps it, so every total, counted zone times multiplier, is conserved; Conditioned Merge follows the same rule (the controller's decision for P5a, ADR-026). No Simplification and Transform Plan keep multipliers and boundaries. Perimeter Core and Single Zone per Floor return NotSupported for a plan with multiplied rooms, and so do Single Zone per Floor Type and Single Zone Building for floors with them: each re-zones the whole plan, and a room's copies have no drawn geometry to merge.
  • Join Pieces (D-123) is an input of both merge simplifiers: a Boolean, default false, and a property of the simplifier that is never inferred. False gives one zone per piece, which is what Semantic Merge did before the input existed; no result, snapshot, or provenance changes. True gives one zone per class on the floor, made of all the class's pieces: a zone of several disjoint polygons at one elevation (TargetZone.Pieces), with one ZonePart per piece (domain-model.md). The pieces of a class share no wall, since they would otherwise be one piece, so joining them removes no partition; what it adds is that the pieces are one zone. The zone's floor area and volume are summed over its pieces, and so are the exterior areas its infiltration is applied to at conversion (D-124), which come from the surfaces of every piece; the mapping has one row per source and target, summed over the pieces, with the target fraction taken of the area of all of them. The walls of such a zone are numbered on across its pieces, and it has one floor and one ceiling per piece (F1, F2, …, C1, C2, …); a zone of one piece keeps F and C until floors are stacked. Provenance records JoinPieces=true only when it is true, as it records non-default GeometryLimits, so no existing output changes.
  • Conditioned Merge (Z1c, D-123, research brief §8) classes the zones as conditioned or unconditioned by the thermostat of their program, which comes from the preset (D-038), and by nothing else: not the space type, the name, or the setpoint values. The conditioned zones that share walls form one zone, and so do the unconditioned ones; with Join Pieces true a floor has at most one conditioned and one unconditioned zone. Zones are Conditioned-n, then Unconditioned-n, each class numbered in plan order of its first source zone; a class with no source zone gives no zone; a zone takes the space type its sources share, or Mixed. With the example presets, where only the stair is unconditioned, the linear plan gives Conditioned-1 (the corridor and the dwellings) and Unconditioned-1 (the stair) in both modes, and the Stair Bay Bar gives four conditioned and three unconditioned zones, or with Join Pieces true Conditioned-1 of four pieces and Unconditioned-1 of three. Aggregation is unchanged (above): a conditioned target's setpoints are floor-area weighted over its sources, all of which are conditioned, and an unconditioned target has no thermostat and keeps its loads. Its defining invariant is that the conditioned floor area is conserved exactly, in both modes, because every target covers source zones of one class only: the reported check ConditionedFloorArea (validation.md) never differs.
  • Target zones are checked before surfaces are built (D-123): two targets with one ID are the error DuplicateZoneId, because the surface builder would read them as one zone of two pieces, and a target with no piece is InvalidParameter. Two pieces of one zone that share an edge are the error TouchingPieces, reported once per shared edge when the surface builder runs. A plan generator rejects two zones of a layout with one ID the same way, so a plan never has them.

4. Floor aggregation

Type IFloorAggregator.Aggregate(IReadOnlyList<FloorEntry>) → IGeneratedBuilding
Components Stack Floors, Stacked Floor Zone Multiplier, Single Zone per Floor Type, Single Zone Building; inputs Floors (bottom to top) and Multipliers (optional, one per floor, whole numbers from 1, D-072, default 1)
Decisions D-018, D-021, D-031, D-032, D-034, D-039, D-041, D-045, D-046, D-068, D-071, D-072, D-074, D-075, D-079; ADR-009, ADR-013

All aggregators reject an empty list (NoFloors), multipliers below 1 (InvalidParameter), and floors with different orientations (OrientationMismatch). Floor types may have different footprints and may come from differently transformed plans.

Every aggregator first assembles the full stack (Storeys.Assemble, D-068): each entry repeated by its multiplier, storey k at the sum of the floor-to-floor heights below it, zone and surface IDs prefixed L{k}/. Every floor and ceiling piece is designated there: split by overlap with the zones of the storeys below and above into pieces between two storeys (Interzone), uncovered parts Outdoors, the floors of storey 0 Ground, and the ceilings of the top storey roofs (Outdoors). The footprints of each pair of adjacent storeys are clipped together as conformed polygons (PolygonOps.Conform, ADR-002), so the pieces keep the zones' own vertices and rotated storeys leave no zero-width slivers, spikes, or excursions. A floor zone of several parts (D-123) gets the floor and ceiling pieces of every part, each part clipped against the parts of the adjacent storeys and the pieces of one kind numbered on across its parts (F1, F2, …, C1, C2, …). A storey k > 0 whose floor area covered by storey k − 1 differs from its floor area by more than the relative area tolerance gets the warning UnsupportedStorey, naming the storey and the uncovered area in m² (D-074); the building is still produced. Multiplied rooms (DOE geometry stage P5a, S8, ADR-026): a zone keeps its room multiplier on every storey; a floor or ceiling piece between zones of different multipliers is SelfAdjacent on both sides, and so is a piece over or under the copy space of the storey beyond (where the undrawn copies stand), which counts as neither ground, roof, nor exposed. The four methods differ in what they model:

Aggregator Storeys and zones Multiplier Nᵢ Floors and ceilings Walls and windows Internal mass
Stack every storey of the assembly, zones L{k}/… explicit repetition as designated as in the floors none
StackedFloorZoneMultiplier type i stands for Nᵢ storeys; a storey of a multiplied type whose floor or ceiling is ground, roof, or exposed on the stack is split off as × 1 (info FloorTypeSplit, D-046); each remaining group of n storeys from storey first is modelled by storey first + ⌊n/2⌋ at its true elevation, zones L{k}/…; the other storeys are represented but not modelled (D-045) Zone.Multiplier = n on every zone of the group, times a multiplied room's own (S8); exposure is never multiplied; provenance parameter Storeys, e.g. L0x1,L5x8,L9x1 the modelled storeys' pieces from the stack: ground, roof, and exposed pieces kept; every piece between two storeys Adiabatic, whether the other storey is modelled or not (D-075), a SelfAdjacent one too as in the floors none
SingleZonePerFloorType one zone E{i} ("Floor type i") per floor entry, spanning its Nᵢ storeys, one part per storey outline explicit repetition ground, roof, and exposed pieces kept; pieces between two entries Interzone between E{i} and E{i+1} rebuilt per storey outline, all outdoors, covering every source façade (D-041); one centred window per wall with the glazed area it covers (D-079); partitions discarded (D-034) one per slab level within an entry: slab area, 2 exposed faces (D-031; Convert2IDF writes each face as a half slice of the slab, D-143)
SingleZoneBuilding one zone BUILDING ("Building") with one part per storey outline explicit repetition ground, roof, and exposed pieces kept as SingleZonePerFloorType one per slab level: slab area, 2 exposed faces (D-031; Convert2IDF writes each face as a half slice of the slab, D-143)

The single-zone methods share one merge (SingleZoneMerge); their storey outlines are unions of the footprints of every part of the storey's zones as tiles (PolygonOps.UnionTiles; a zone of several pieces gives all of them, D-123), so rotated plans give clean outlines whose vertices are the zones' own vertices (S8.2). An outline keeps the footprint's holes, its rebuilt walls include the court walls of every storey, and the court has no floor or ceiling piece, so it adds neither ground nor roof area (S8.3). Programs are aggregated per zone with EquivalentPropertyAggregator from the stacked zones (fractions 1), so every invariant is conserved; infiltration is not aggregated (D-124); a zone is conditioned if any source is (D-038). SingleZoneBuilding is the former SingleZoneMerged, and StackedFloorZoneMultiplier the former FloorAreaMultiplier (D-071).

Storeys that differ (S8.7, ADR-015): the plans of a multi-storey generator, each simplified on its own, are floor entries with multiplier 1, bottom to top, and every aggregator takes them unchanged. The part of a lower storey's ceiling that the storey above does not cover is an outdoor roof piece (a terrace), the covered part lies between the storeys; StackedFloorZoneMultiplier then models every storey, SingleZonePerFloorType makes one zone per storey, and SingleZoneBuilding one zone with one part per storey outline. Building.RoofArea counts the terraces with the top roof. A multiplier above 1 repeats a storey as for any floor and is allowed, but gives another building than the generator's.

5. Validation

Types FloorValidator, BuildingValidator → ValidationReport (Passed, Checks, Describe())
Component Validate (a floor or a building)
Decisions D-038, D-041, D-045, D-046; ADR-004; GLOBAL.md scientific rules 1 and 6

See What is validated where below; every check, its reference, and its tolerance are listed in validation.md.

6. Convert2BEM

Type Grasshopper component only (Lod.Grasshopper)
Component Convert2BEM
Decisions D-016, D-023, D-038, D-039, D-069, D-112, D-124; ADR-010, ADR-017; GLOBAL.md scientific rule 6
  • Inputs Building, Override, EnableInternalWallHeatTransfer (IWHT), EnableFloorHeatTransfer (FHT), and Envelope (S6, optional, the example envelope preset when unconnected); both options default to False (D-069). The Boundaries output comes from HeatTransferOptions.Exported (Lod.Core.Conversion): an Interzone wall between two conditioned zones is written Adiabatic unless IWHT is set, an Interzone floor or ceiling between two conditioned zones Adiabatic unless FHT is set, an Interzone surface of a zone without HVAC keeps its link whatever the options (D-211), and every other surface as it is. The building is not changed; Provenance records both values. Convert2IDF (S6) uses the same function.
  • Validates the building with BuildingValidator first. A failed enforced check blocks conversion (ValidationFailed) unless Override is true; then the component converts, warns (ValidationOverridden), and writes the override into its Provenance output.
  • Outputs one data-tree branch per zone: zone Breps, names, space types, multipliers, the conditioned flag, loads (types, bases, values, schedules), heating and cooling setpoints (empty for unconditioned zones), surfaces with their boundaries, the explicit windows at their positions, the exposed internal-mass area (slab area × exposed faces), and since S6 the construction of every surface (by its envelope role, ConstructionRoles) and of every window. Since D-124 the envelope's infiltration is output once (Infiltration Rate, Infiltration Basis, Infiltration Schedule) with one branch per zone of Infiltration Flows, the design flow of one instance of the zone in m³/h (ZoneInfiltration: the rate times the zone's own exterior surface area, outdoor wall area, or volume, by the basis), and Provenance has an INFILTRATION: line. The layout is neutral and provisional until a ClimateStudio reference definition exists (D-023); see convert2bem.md. Since D-130 the output Shading holds the opaque shading surfaces of the storeys a multiplied storey stands for (the shared rule UnmodelledStoreyShading), empty under the other aggregators.
  • No simulation runs inside the pipeline (D-016).

7. Convert2IDF

Types Convert2Idf, IdfWriter, IdfFile, IdfOptions, IdfFileRequest, IdfDocument (Lod.Export.Idf)
Component Convert2IDF (S6)
Decisions D-069, D-112, D-113, D-124, D-130; ADR-010, ADR-017, ADR-019; GLOBAL.md scientific rule 6
  • Inputs Building, Envelope (optional, the example envelope preset when unconnected), EnableInternalWallHeatTransfer and EnableFloorHeatTransfer (both False by default, the shared HeatTransferOptions), Override, Path, Write, and Overwrite (both False by default), and since D-130 Weather (optional, the path of an .epw file), and since D-233 Daylighting (False by default: no daylighting object; true, the programs' daylighting controls placed by the 90.1 code rule on the zones' own windows and skylights, convert2idf.md); outputs IDF, Provenance, and Written.
  • Validates the building with BuildingValidator; a failed enforced check blocks the conversion unless Override is set, recorded in Provenance and in the IDF header. The file is written only when Write is true, and an existing file only when Overwrite is true.
  • The IDF targets EnergyPlus 26.2 and holds the simulation objects, Site:Location from the weather file when one is given, ground temperatures "indoor minus 2 °C" (a packet v7 construction set brings its own ground method and ground temperatures instead, D-145), the research outputs of the experiment outputs, a case record in its header, constructions from the envelope preset, ideal loads for conditioned zones, exact hourly schedules, loads, one ZoneInfiltration:DesignFlowRate per zone from the envelope's infiltration in EnergyPlus's own method for its basis (D-124), internal mass (each exposed face of a removed slab as a half slice, so the file holds the slab's capacity once, D-143), zone multipliers, outdoor surfaces split into convex pieces, and the shading of unmodelled storeys (D-130); EnergyPlus is run outside the pipeline by Lod.Simulation (energyplus-runner.md), never by the component. Layout and rules: convert2idf.md.

What is validated where

Where What Effect of a failure
Program types (schedules, loads, programs, presets) Schedule length, values, and kind; defined load types and bases (UndefinedLoadKind, D-124); load values and allowed bases; one load per type, end use, and basis (D-047, D-126); per-person loads need an occupancy load; setpoints are temperature schedules, at least one side (NoSetpoint), heating never above cooling (SetpointsCross); heat fractions in [0, 1], summing to at most 1, none in a field EnergyPlus lacks (HeatFractionValue, HeatFractionsExceedOne, HeatFractionNotSupported); water temperatures only on hot water, target not below inlet (WaterTemperaturesNotAllowed, WaterTargetBelowInlet); people fractions (PeopleFraction); the calendar (CalendarYear, CalendarHoliday); WWR in [0, 1) Error; no object
Program JSON (ProgramJsonImporter, D-126) Strict parsing, the defaulted mode, the schema, the contract's checks, the expansion of every schedule, then the mapping and the overrides; every error has the JSON Pointer of its node or the name of its input (program-json.md) Error; no preset (warnings and remarks keep it)
Mix Programs (ProgramMix, D-124) At least one preset (NoSources); one weight per preset, each finite and greater than 0, with a finite sum (MixWeight); a given WWR in [0, 1); no per-person load beside absolute occupancy in any inputs (PerPersonWithAbsoluteOccupancy); no occupancy in several bases with a per-person load or different people properties (MixedOccupancyBases, D-126); the aggregation of the virtual zone. Conditioned beside unconditioned inputs is the info MixedConditioning Error; no preset (MixedConditioning is a remark)
Envelope preset (S6, D-124) The constructions and glazing (ADR-010); the infiltration's design rate finite and not negative and its basis defined (InfiltrationValue), its schedule a fraction schedule (ScheduleKindMismatch) Error; no object
Transform Plan Rotation and translation finite (InvalidParameter); parts of the Grasshopper transform other than the rotation about z and the x-y translation are not applied and give a warning (D-070) Error; no plan (after the warning the plan is produced)
Plan generator Parameters (InvalidParameter, including the family minimum counts of ADR-006); every preset input holds a preset (MissingPreset) of its space type (PresetSpaceTypeMismatch, D-061) or an any-program preset (D-108); a preset for every space type the layout uses (MissingPreset); no per-dwelling load in a zone without dwellings (PerDwellingWithoutDwellings) and one calendar for all presets (CalendarMismatch, D-126); zones tile the footprint (OverlappingZones, UnmatchedEdge, also for a boundary edge, holes included, that zones do not cover outdoors); polygons (DegeneratePolygon); every zone ID once (DuplicateZoneId, D-123). A wall or window below the ADR-011 minimum gets no window (WindowOmitted) Error; no plan (WindowOmitted is a remark; the plan is produced)
Property aggregation (plan simplifiers, single-zone aggregators) Fractions in [0, 1]; a positive load component needs a positive target basis quantity (ZeroBasisQuantity, the dwelling count included); valid measures; positive setpoint weights; positive weights for heat fractions, water temperatures, and people (ZeroAggregationWeight); sources on one calendar (CalendarMismatch); merged heating not above merged cooling (SetpointsCross). A numeric beside an autocalculated people sensible fraction is the warning MixedSensibleFraction Error; a zero load only gives the info ZeroLoadSchedule
Plan simplifiers Strategy preconditions (InvalidParameter, PlanTooNarrow, DisconnectedGroup); target zones (D-123): unique IDs (DuplicateZoneId), at least one piece each (InvalidParameter), and no edge shared by two pieces of one zone (TouchingPieces); façade coverage (FacadeNotCovered); guards of the centred-window rule, which hold by construction once the façades are covered (D-079): every window contained by one target wall (WindowNotHosted), glazing of each target wall smaller than its area (GlazingExceedsWall) Error; no floor
Floor aggregators At least one floor (NoFloors); multipliers from 1 (InvalidParameter); one orientation (OrientationMismatch); façade coverage and the centred-window guards (FacadeNotCovered, WindowNotHosted, GlazingExceedsWall, single-zone methods); roof skylights that fit their pieces (SkylightDoesNotFit) and the skylight guard (SkylightNotHosted), when the stack is assembled (DOE geometry note S5). A storey not carried by the storey below is the warning UnsupportedStorey (D-074). StackedFloorZoneMultiplier rejects no input for exposure: it splits exposed storeys of multiplied types off and reports the info FloorTypeSplit (D-046) Error; no building (UnsupportedStorey is a warning and FloorTypeSplit a remark; the building is produced)
FloorValidator: a floor against its source plan Enforced: FloorArea, Volume, ExteriorWallArea, Glazing, Glazing.<orientation>, Installed.<load type>, Scheduled.<load type> (every hour), Installed.<component> and Scheduled.<component> (type, end use, basis; D-126), DwellingUnits, PerDwellingLoads, Calendar, FacadeCoverage, NoTargetOverlap, SourceCoverage, Traceability, and Skylights when either side has skylights (DOE geometry note S5). Reported: ConditionedFloorArea (D-038; it never differs for Conditioned Merge, D-123). Setpoints are a prescribed rule and are not compared The report fails on enforced checks only; reported checks show as note when they differ
BuildingValidator: a building Floor{i}.*: the floor checks for every distinct source floor. Building.*: the conservation checks against Stack of the same entries, counting zone multipliers, including Building.GroundArea, Building.RoofArea, and Building.ExposedFloorArea (enforced, D-046), Building.Height (enforced, D-045), Building.Skylights and Building.SkylightsOnRoofs when either has skylights (enforced, DOE geometry note S5), and Building.ConditionedFloorArea (reported, D-038) The report fails on enforced checks only
Convert2BEM Runs BuildingValidator; no check of its own for infiltration, which is the envelope's and follows each zone's own surfaces (D-124) Conversion blocked unless Override; the override is recorded
Convert2IDF (IdfWriter, S6) Runs BuildingValidator; then one calendar for the building's zones and an options weekday that agrees with it (CalendarMismatch, D-126, no override); every interzone surface needs a partner (UnpairedInterzoneSurface) and windows lie only in outdoor walls (InteriorWindow). Partners across different multipliers are written adiabatic (InterzoneMultiplierMismatch), slivers and zero-width parts narrower than the distance tolerance are omitted (SliverOmitted), edges shorter than EnergyPlus merges are warned (ShortEdge), and split surfaces are reported (SurfaceSplit) ValidationFailed error and no file unless overridden (ValidationOverridden, recorded in the IDF header); the other errors give no file; warnings and info keep it (convert2idf.md)

Area and volume checks use the relative area tolerance, load checks the relative load tolerance (ADR-004).

Grasshopper components through S8.8

All components are on the BEMGen tab. GUIDs never change once merged, and the GUID of a deleted component is never reused (D-064).

  • Icons (D-063). Every component and parameter, and the plugin itself, has a 24 × 24 PNG icon: a dark glyph with one accent colour per panel (a parameter takes the colour of the panel that makes its object). scripts/make_icons.py (Python 3.10+, Pillow) draws them at 96 × 96, downsamples them, and writes src/Lod.Grasshopper/Icons/<class name>.png; it stops when a component or parameter class has no icon. The PNGs are embedded resources, loaded by IconLibrary by class name; a missing resource gives Grasshopper's default icon instead of an exception. S9 only polishes them.
  • Goo constructors (S9). Every Goo has a public parameterless constructor that makes an empty, invalid wrapper. Grasshopper's GH_Param<T>.InstantiateT creates one with Activator.CreateInstance to give an empty parameter's TypeName (component help, the "Data conversion failed from … to …" message) and to try CastFrom when a wire of another type arrives (a plan into a Floors input). Without it the call throws and Grasshopper opens its modal Grasshopper breakpoint assert dialog, which blocks Rhino; the headless smoke check hung there. The parameters now report their Goo's type name (Plan, Floor, Building, Program Preset, ...), and a wrong wire ends in the conversion error. An empty wrapper is safe to use: it reads Empty <type name>, duplicates to another empty wrapper, casts to nothing, and has no preview (an empty clipping box).
  • Preview Location (D-062). The eighteen plan generators, the DOE generators (doe-components.md), Transform Plan, the five plan simplifiers, and the four floor aggregators have an optional last input Preview Location (PL): a vector in model units, default 0,0,0 (a point converts to a vector). It moves only that component's viewport preview: the plan, floor, or building data, Inspect, Validate, and Convert2BEM keep the true coordinates, and downstream components do not inherit the move (each wraps its output with its own input). Convert2BEM has no such input. A plan or floor that is a storey of a multi-storey generator, or is made from one alone through Transform Plan or a simplifier, is previewed at the storey's elevation (StoreyElevation, S8.8, D-108) plus the Preview Location; every other plan and floor, and every building, is previewed at its own coordinates plus the Preview Location.
  • Default preset components (D-061). Dwelling Unit Preset, Corridor Preset, and Stair Preset, in panel 1 Program Presets since S8.8 (D-108) like every built-in preset component, share their inputs: Name (default the example name), WWR, Conditioned, Heating (°C), Cooling (°C), then for each load of the space type's example preset, in its order, a value input (its unit in the description: people/m², W/m², or 1/h) and an optional schedule input that replaces the built-in schedule when connected. Every input except the schedules has a default; the output is one Preset.
  • Example Residential Presets (0239f4c9-0f19-4cf1-9d90-08db878eac8a, S2) was deleted in S4.1 (D-061); its GUID is retired.
  • The S10 atlas fetch components (D-126). The branch that held them was never merged (it exists only as the tag archive/archetype-data), so no released version had them. Their GUIDs are retired and never reused: Atlas Snapshot c231969e-a062-4f0b-a2b4-45ca60b7cc3e, Atlas Query ec2037f0-b14e-432b-a907-23a6e4566e94, Atlas Program Preset 43b5b5c4-b180-4be5-94ce-74d982640fd9, and the parameter Atlas Snapshot dbf8128f-fdd3-4f36-a941-89d849668161. Program JSON replaces them.
  • The program JSON stage (D-126, version 1.2.0). Program JSON is new. Every other change appends inputs or outputs, so definitions saved with 1.1.0 keep their wires and values: Load gained End Use, Radiant, Latent, Lost, Visible, Return Air, Target Temperature, and Inlet Temperature (and its Basis offers PerDwellingUnit); Schedule's Kind offers Activity; Program Preset gained Heating On, Cooling On, Activity, People Radiant, and People Sensible; each default preset component gained Heating On and Cooling On after its load inputs; Convert2BEM gained the outputs 22 to 30 (convert2bem.md). Grasshopper restores parameters by position and opens its IO dialog for a current parameter without a saved chunk, so these components read a saved definition with the appended parameters set aside and put them back with their defaults (ComponentSupport.ReadWithAppendedParameters, the Join Pieces precedent); trailing saved parameters whose name differs from the current one, such as the removed Infiltration inputs of the default preset components, are not counted as saved. Two behaviours change: Program Preset with Conditioned and one setpoint connected gives a space that is heated or cooled only, with a remark, where it was an error, and a preset whose heating setpoint exceeds its cooling setpoint is now an error on every preset component.
  • Floor Area Multiplier became Stacked Floor Zone Multiplier and Single Zone Merged became Single Zone per Floor Type in S4.2, keeping their GUIDs (D-064, D-071); Single Zone Building is new.
  • Aggregator previews (D-071, D-075). Stacked Floor Zone Multiplier previews the whole stacked building: the modelled storeys as before and the storeys that are represented but not modelled in transparent grey (StackedFloorZoneMultiplier.UnmodelledStoreys). A zone with several parts (Single Zone per Floor Type, Single Zone Building) is previewed as one merged volume, with its windows. Only the preview changes: the building and the Convert2BEM outputs keep one part per storey outline.
  • Windows (S5, D-079). No component was added or removed and no GUID changed. The descriptions of Semantic Merge, Perimeter Core, Single Zone per Floor, Single Zone per Floor Type, and Single Zone Building state that every rebuilt outdoor wall gets one centred window with the glazed area it covers, and the Windows output of Convert2BEM is described as one centred window per glazed outdoor wall.
  • Typology generators (S8.1, ADR-006). Stair Bay Bar, Stair Pair, Gallery Bar, and Terrace Row follow Linear Plan Generator: their number inputs (counts are integers) default to the family's Default record, then Floor Height (3 m) and Orientation (0°), then one required preset input per space type they place (Dwelling Unit, and Stair except for Terrace Row; an unconnected one is Grasshopper's missing-input warning, D-065), then Preview Location. Their descriptions name the family and what is not modelled. WindowOmitted shows as a remark. Linear Plan Generator's description names HDHM-TYP-009; its inputs and GUID are unchanged. Point Plate, Winged Band, and Open Court (S8.2) follow the same pattern with the preset inputs Dwelling Unit and Stair; on Point Plate the Stair preset is the core's. Enclosed Court (S8.3) follows the same pattern; its plan previews the court as a hole, and every zone, floor, and ceiling Brep of a footprint with holes is one face or closed extrusion with an inner loop per hole (RhinoGeometry). Office Plate and Cafeteria (S8.4) follow the same pattern with the preset inputs Office and Core, and Kitchen and Dining; their descriptions name the SYN-TYP-* family. The office work area is previewed as a ring around the core. Radial Lobes, Branching Mall, Care Hub, and Foyer Halls (S8.5) follow the same pattern, their count input (Lobe Count, Branch Count, Wing Count, Hall Count) an integer first, with the preset inputs Dwelling Unit and Stair (the core's); Mall and Retail; Care Bedroom, Care Communal, and Corridor; and Lobby, Activity Hall, and Service. Operating Suite and Court Cluster (S8.6) follow the same pattern, their count input (Bank Count, Court Count) an integer first, with the preset inputs Operating Theatre, Clean Corridor, Dirty Corridor, and Clinical Support, and Dwelling Unit and Stair; the court cluster's plan previews every court as a hole. Stepped Band (S8.7) follows the same pattern, its Storey Count an integer first, with the preset inputs Dwelling Unit, Corridor, and Stair; its Plan output is a list, one plan per storey bottom-up (ADR-015), and each storey is previewed at its elevation (the floor heights below it) on top of the Preview Location, while the plans keep elevation 0.
  • DOE generators (DOE geometry P1, doe-components.md). A DOE generator component has its count inputs first (storeys, then repeated units), then its sizes, Floor Height, and Orientation, with the defaults of its record, then Program Map (a DOE Program Map of one preset per program key, S4), then Preview Location; its outputs are Plan (list, bottom-up), Multipliers (how many storeys each plan stands for; wire it into the aggregator's Multipliers), and Program Keys (the keys the map needs, given even without a map). They are a group of their own in 2 Generate (secondary exposure). The fifteen are DOE Small Office, DOE Medium Office, and DOE Large Office (doe-ring-office.md); DOE Full-Service Restaurant, DOE Quick-Service Restaurant, DOE Strip Mall, DOE Stand-alone Retail, DOE Supermarket, and DOE Warehouse (doe-single-storey.md); DOE Primary School and DOE Secondary School (doe-school.md); DOE Small Hotel (doe-corridor-hotel.md); DOE Large Hotel (doe-tower-hotel.md); DOE Hospital (doe-hospital.md); and DOE Outpatient (doe-outpatient.md). A generator of repeated rooms (DOE Large Hotel, DOE Hospital) has its room multipliers as an input, and its plans keep them as zone multipliers (ADR-026).
  • Wiring storeys that differ (S8.7, ADR-015). Connect the Stepped Band's Plan list to a plan simplifier (optionally through Transform Plan); Grasshopper runs it once per storey, and its Floor output is the list of floors in the same order. Connect that list to a floor aggregator's Floors and leave Multipliers unconnected: every storey counts once, bottom to top. Transform Plan and every simplifier preview each storey's plan or floor at the storey's elevation, as the generator does (S8.8, D-108; through S8.7 they previewed it at 0), each plus its own Preview Location; the data stay at elevation 0, and the aggregator places the storeys. A Single Zone Building or Single Zone per Floor Type zone whose storey outlines differ is previewed by a boolean union of its storeys, as for setbacks (RhinoGeometry.MergedZoneBreps).
  • Default preset components of the non-residential types (S8.4, ADR-014). Office Preset to Service Preset share the inputs of the residential ones (above), one value and one optional schedule input per load of their example preset; Gas Equipment is in W/m², Ventilation in 1/h. Zones of the new types have their own preview colours. Through v1.0.2 they also had Infiltration (1/h) and Infiltration Schedule; D-124 removed both.
  • Glazing per orientation and skylights (DOE geometry P0b). No component is added or removed and no GUID changes (D-064). Every default preset component, Program Preset, and Program JSON gain five inputs, appended after the existing ones so saved definitions keep their wires (ReadWithAppendedParameters, now also on Program JSON): WWR North, WWR East, WWR South, and WWR West (WWRN, WWRE, WWRS, WWRW), each optional, replacing the component's WWR on the walls facing that way (WindowToWallRatios.WithOverrides), and Skylight Ratio (SR), optional, default 0 on the default preset components and unset (no skylight) on the other two. Program JSON passes a ratio per orientation only when one of the four is connected, so its provenance is unchanged otherwise. A preset's text shows WWR r for one ratio or WWR N n, E e, S s, W w, then , skylight ratio s when it has one. Convert2BEM's Windows output holds each roof's skylights after the windows of the walls before it, with the window construction in Window Constructions, and the previews draw skylights like windows.
  • Any Program Preset (S8.8, D-108). A floating parameter in panel 1 Program, like Grasshopper's Geometry parameter: place it on the canvas, wire a preset into its left grip (any default preset component, Program Preset, or another preset parameter), and wire its right grip into any preset input of any plan generator. It outputs each preset as an any-program preset (AnyProgramPresetGoo, shown as Preset <name> (any program, no space type, WWR <ratio>)), with the same name, program, and WWR; it holds no data of its own, so an unconnected one is empty. The generator's preset inputs take it (ProgramPresetParameter converts it), and their descriptions say so in one shared text. The zones keep the input's space type (preview colour, Semantic Merge groups, Convert2BEM Space Types) and take the preset's program; Inspect's provenance shows AnyProgramPreset.<Input>. A preset wired directly, without the parameter, must still have the input's space type.
  • Panels (S8.8, D-108). 1 Program holds Schedule, Load, Program Preset, Mix Programs (D-124), and Any Program Preset; the eighteen built-in preset components are in 1 Program Presets, next to it. Their icons keep the Program accent. No GUID changed.
  • Enum inputs (D-120). The inputs that take the name of an enum value, Schedule Kind (ScheduleKind, default Fraction) and First Day (DayOfWeek, default Monday), Load Type (LoadType) and Basis (LoadBasis), Program Preset Space Type (SpaceType), and, since D-124, Mix Programs Space Type and Envelope Preset Infiltration Basis (InfiltrationBasis), are text inputs of the internal class EnumParameter<TEnum>, a Param_String. Text from a panel or wire works as before and is parsed ignoring case; a name that is not a value is an error listing the valid names. Right-click the input to choose a value: the names follow Manage Text collection, the current one ticked, and are disabled while the input has a source. Extract parameter places a Value List in dropdown mode left of the input, labelled with its name, with every name in declaration order (each outputs its name as text), selected on the current value (the first name when the value is not one), and wired into the input; it moves down past any object it would overlap, such as the dropdown of the input above, and adding it and the wire are one undo step. The class is internal and generic, so Grasshopper never registers it. It keeps the Text parameter's ComponentGuid and icon, so a saved definition records the input as a Text parameter; it must not get a GUID of its own. No component GUID, input name, nickname, access, or default changed.
  • Mix Programs and infiltration (D-124, ADR-017). Mix Programs is new (step 1). The 18 default preset components lost their Infiltration and Infiltration Schedule inputs, so a definition saved earlier opens only after Grasshopper's Grasshopper IO message about the removed inputs; the 19 examples were rebuilt. Envelope Preset gained the inputs Infiltration Rate (Inf, number, default 0.3), Infiltration Basis (InfB, an enum input of InfiltrationBasis, default AirChangesPerHour), and Infiltration Schedule (InfS, optional; unset means always on). Convert2BEM gained the outputs 18 to 21 (convert2bem.md). A Load whose Type or Basis text is Infiltration or PerExteriorWallArea, as in a definition saved earlier, is an error that says to set infiltration on the Envelope Preset. No component GUID changed.
  • Transform Plan (D-070). Its Transform input is a Grasshopper transform in model units. The component applies the rotation about the world z axis, atan2(M10, M00), and the x-y translation (M03, M13) converted to metres with the preview's unit scale (PlanMotionDecomposition). A translation along z, a plan part that is not a pure rotation (scaling, shear, mirroring), a rotation about another axis or scaling along z, and a projection are not applied; they are named in one warning, Not applied (D-070): …. Applied: a rotation of …° about the world z axis and a translation of (…, …) m in x and y. Matrix entries are compared within ToleranceSettings.Angle, the z translation within Distance.
  • Conditioned Merge and Join Pieces (D-123). Conditioned Merge (Z1c) is new in panel 3 Simplify, after Semantic Merge, with its own GUID and icon. It and Semantic Merge have the inputs Plan, Join Pieces (J, Boolean, default False; its description says what False and True do), and Preview Location, and the output Floor. Semantic Merge keeps its GUID (D-064 allows an input to be added). A definition saved before Join Pieces existed has only two inputs on Semantic Merge, and Grasshopper restores inputs by position, so the saved Preview Location would be read into Join Pieces and the component would give no output and no message. The component therefore reads such a file with Join Pieces set aside and puts it back at its place with its default, False, the behaviour the definition had; the saved Plan and Preview Location keep their state. A zone of several pieces on one storey is previewed as one solid per piece and never united, because pieces that meet at a corner would fuse into one solid; the previews of zones that span storeys are unchanged (D-071). The data outputs keep one Brep per part (convert2bem.md).
Panel Component (nickname) Inputs → outputs Class GUID Since
0 Info BEMGen Info (Info) — → Version BemGenInfoComponent b1d4f0a2-6c3e-4f7a-8e21-5a9c0d7e3b14 S0
1 Program Schedule (Sch) Name, Kind, Weekday, Weekend, First Day → Schedule ScheduleComponent 1be96980-e9eb-4636-9ce6-4e5b6a301d1f S2
1 Program Load (Load) Type, Basis, Value, Schedule, End Use, Radiant, Latent, Lost, Visible, Return Air, Target Temperature, Inlet Temperature → Load LoadComponent c07304be-fe9c-4810-ba1d-1cac1710c386 S2 (inputs 4 to 11 D-126)
1 Program Program Preset (Preset) Name, Space Type, Loads, Conditioned, Heating, Cooling, WWR, Heating On, Cooling On, Activity, People Radiant, People Sensible, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset ProgramPresetComponent 56ca1eba-abed-4dbb-a9a7-09d8b5806231 S2 (inputs 7 to 11 D-126)
1 Program Program JSON (PJson) JSON, Name, Space Type, WWR, Year, Holidays, Loads, Heating On, Cooling On, Heating Setpoint, Cooling Setpoint, Activity, People Radiant, People Sensible, WWR North, WWR East, WWR South, WWR West, Skylight Ratio, Climate Zone, Context → Preset, Source, Assumptions, Overrides, Left Out ProgramJsonComponent abb0aeb9-5a9f-40ff-b3a1-bb125cfb675c D-126 (program JSON 5.4.0, WWR optional, Climate Zone and Context appended: D-172)
1 Program Construction JSON (CJson) JSON → Construction, Source, Roles, Unused ConstructionJsonComponent b2802511-fee7-49ab-bdcb-9329ce293461 D-137
1 Program Schedule Draw (SDraw) Program JSON, Generator JSON, Setting, Seed, Floor Area, Command, Folder, Run → Drawn JSON, Provenance, Diagnostics ScheduleDrawComponent 740cafea-7afe-47f4-8723-b24b6ec3c836 D-194 (ADR-033)
1 Program Mix Programs (Mix) Presets (list), Weights (list), Name, Space Type, WWR, Climate Zone, Year, Holidays (list), Context (list) → Preset, JSON (list), Left Out (tree); strip Get from Atlas… MixProgramsComponent 744378f8-861d-4e6d-bff4-68c7fe2b62c1 D-124, D-228
1 Program DOE Program Map (DoeMap) Keys (list), Presets (list) → Program Map DoeProgramMapComponent 0e471c68-8cb1-4375-b82a-71b36d797b94 DOE P1
1 Program Presets Dwelling Unit Preset (Unit) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Equipment, Equipment Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset DwellingUnitPresetComponent b491330c-bc92-42e7-b494-6946e66b599a S4.1
1 Program Presets Corridor Preset (Corr) Name, WWR, Conditioned, Heating, Cooling, Lighting, Lighting Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset CorridorPresetComponent 5947d3ea-25fe-4dc3-b388-384d8326826e S4.1
1 Program Presets Stair Preset (Stair) Name, WWR, Conditioned, Heating, Cooling, Lighting, Lighting Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset StairPresetComponent 717ccc25-1097-4b66-addc-d2fcdd4e385a S4.1
1 Program Presets Office Preset (Office) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Equipment, Equipment Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset OfficePresetComponent 4160f791-07dc-4529-9986-1c9ba7d21a98 S8.4
1 Program Presets Core Preset (Core) Name, WWR, Conditioned, Heating, Cooling, Lighting, Lighting Schedule, Equipment, Equipment Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset CorePresetComponent ca44b061-1ced-4ae3-afed-d806e6db2b7c S8.4
1 Program Presets Retail Preset (Retail) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Equipment, Equipment Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset RetailPresetComponent b760860d-05c9-4cbe-a22f-ddd2e38e4d64 S8.4
1 Program Presets Mall Preset (Mall) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset MallPresetComponent dbd514d5-7553-4000-b10c-bca748e3b301 S8.4
1 Program Presets Kitchen Preset (Kitch) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Equipment, Equipment Schedule, Gas Equipment, Gas Equipment Schedule, Ventilation, Ventilation Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset KitchenPresetComponent 658e05dc-c935-4518-bc99-512546153e1e S8.4
1 Program Presets Dining Preset (Dine) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Equipment, Equipment Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset DiningPresetComponent c8b05fa2-330a-4e8a-acaa-e57ca57b4fd9 S8.4
1 Program Presets Operating Theatre Preset (OT) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Equipment, Equipment Schedule, Ventilation, Ventilation Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset OperatingTheatrePresetComponent eb55b6d5-08f1-4a5e-9598-13951c34c2a4 S8.4
1 Program Presets Clean Corridor Preset (Clean) Name, WWR, Conditioned, Heating, Cooling, Lighting, Lighting Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset CleanCorridorPresetComponent c199a986-28b8-41c7-b260-5f4581b7362b S8.4
1 Program Presets Dirty Corridor Preset (Dirty) Name, WWR, Conditioned, Heating, Cooling, Lighting, Lighting Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset DirtyCorridorPresetComponent 0e61c86e-5981-4a11-b922-52650757e4a9 S8.4
1 Program Presets Clinical Support Preset (ClinS) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Equipment, Equipment Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset ClinicalSupportPresetComponent 274e0ac9-de95-4bd4-8028-25d74bfd1e4b S8.4
1 Program Presets Care Bedroom Preset (CBed) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Equipment, Equipment Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset CareBedroomPresetComponent 8447ea38-faec-4630-96dd-92569cd7d0d8 S8.4
1 Program Presets Care Communal Preset (CComm) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Equipment, Equipment Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset CareCommunalPresetComponent a3000f8c-633f-4a54-9fb8-1a4109e337bb S8.4
1 Program Presets Lobby Preset (Lobby) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset LobbyPresetComponent 395aebb3-3e49-4814-93ab-388da9de2360 S8.4
1 Program Presets Activity Hall Preset (Hall) Name, WWR, Conditioned, Heating, Cooling, Occupancy, Occupancy Schedule, Lighting, Lighting Schedule, Equipment, Equipment Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset ActivityHallPresetComponent 6bf00cd3-70b9-4337-8b80-70fc00d79666 S8.4
1 Program Presets Service Preset (Serv) Name, WWR, Conditioned, Heating, Cooling, Lighting, Lighting Schedule, Heating On, Cooling On, WWR North, WWR East, WWR South, WWR West, Skylight Ratio → Preset ServicePresetComponent 60251c8e-ad4b-4ef5-8f68-64f4c6bf6f8b S8.4
1 Program Presets Envelope Preset (Env) Name, Glazing, U-Factor, SHGC, VT, Infiltration Rate, Infiltration Basis, Infiltration Schedule → Envelope EnvelopePresetComponent 89ebd842-fc6e-4a06-95f5-2fcfe39f08b8 S6 (infiltration inputs D-124)
1 Program Presets the fifteen DOE … Programs (DoeSOffP … DoeOutPP), one per DOE generator no inputs → Program Map, Keys, Presets <Record>ProgramsComponent (base DoeProgramPresetsComponent) per component in doe-components.md DOE P7
2 Generate Linear Plan Generator (Linear) Length, Unit Depth, Corridor Width, Unit Width, Stair Length, Floor Height, Orientation, Dwelling Unit, Corridor, Stair, Preview Location → Plan LinearPlanGeneratorComponent a4a9131e-0a0f-49e0-99a4-f26760f6810f S2 (inputs S4.1)
2 Generate Stair Bay Bar (SBar) Bay Count (3), Unit Width (7), Depth (12), Stair Width (3), Floor Height (3), Orientation (0), Dwelling Unit, Stair, Preview Location → Plan StairBayBarComponent 911c3204-42bb-4023-bdb7-2931ea1caad3 S8.1
2 Generate Stair Pair (SPair) Unit Width (7), Depth (12), Stair Width (3), Floor Height (3), Orientation (0), Dwelling Unit, Stair, Preview Location → Plan StairPairComponent 5669d39b-45e6-47ea-9250-f2304d005335 S8.1
2 Generate Gallery Bar (GBar) Unit Count (6), Unit Width (6), Depth (10), Stair Width (4), Floor Height (3), Orientation (0), Dwelling Unit, Stair, Preview Location → Plan GalleryBarComponent a58df462-b3c2-46b7-be3d-7ea9f4629280 S8.1
2 Generate Terrace Row (Terr) Plot Count (6), Plot Width (5.5), Depth (10), Floor Height (3), Orientation (0), Dwelling Unit, Preview Location → Plan TerraceRowComponent f694e595-dba2-4b98-9d1e-f1492e3edf39 S8.1
2 Generate Point Plate (PPlate) Dwelling Depth (8), Core Width (6), Floor Height (3), Orientation (0), Dwelling Unit, Stair, Preview Location → Plan PointPlateComponent 8ac9044a-8fbe-4964-a9de-2ef8be35094a S8.2
2 Generate Winged Band (WBand) Wing Count (3), Wing Length (17), Wing Spacing (17), Depth (12), Unit Width (7), Stair Width (3), Floor Height (3), Orientation (0), Dwelling Unit, Stair, Preview Location → Plan WingedBandComponent e285811d-2fdb-4d31-8b02-62c270b609cf S8.2
2 Generate Open Court (OCourt) Court Width (24), Court Depth (17), Depth (12), Unit Width (7), Stair Width (3), Floor Height (3), Orientation (0), Dwelling Unit, Stair, Preview Location → Plan OpenCourtComponent 223014ea-3c01-4d2b-b8ba-92ebdc4a7327 S8.2
2 Generate Enclosed Court (ECourt) Court Width (24), Court Depth (24), Depth (12), Unit Width (7), Stair Width (3), Floor Height (3), Orientation (0), Dwelling Unit, Stair, Preview Location → Plan EnclosedCourtComponent b9765cd0-a62b-483d-9470-86d5fda287e8 S8.3
2 Generate Office Plate (OPlate) Plate Length (42), Plate Depth (30), Core Length (18), Core Depth (6), Floor Height (3.8), Orientation (0), Office, Core, Preview Location → Plan OfficePlateComponent 783cefaa-b836-4dbc-b16d-8e74820ed361 S8.4
2 Generate Cafeteria (Cafe) Length (30), Dining Depth (15), Kitchen Depth (8), Floor Height (4), Orientation (0), Kitchen, Dining, Preview Location → Plan CafeteriaComponent 95956724-ddbc-48ce-9874-0ec6c244c8fe S8.4
2 Generate Radial Lobes (RLobes) Lobe Count (4), Lobe Length (10), Lobe Width (12), Core Width (12), Floor Height (3), Orientation (0), Dwelling Unit, Stair, Preview Location → Plan RadialLobesComponent a9f132c2-40c3-40b9-ba6a-3f3e1f2ced80 S8.5
2 Generate Branching Mall (BMall) Branch Count (3), Branch Length (40), Mall Width (8), Shop Depth (12), Anchor Depth (30), Floor Height (5), Orientation (0), Mall, Retail, Preview Location → Plan BranchingMallComponent d886b33f-7b51-41f9-b160-a550e6aadd2b S8.5
2 Generate Care Hub (CHub) Wing Count (3), Wing Length (30), Bedroom Depth (6), Corridor Width (2.4), Hub Width (16), Floor Height (3), Orientation (0), Care Bedroom, Care Communal, Corridor, Preview Location → Plan CareHubComponent 7d3d1002-c695-47df-afd9-48f50c5b3e90 S8.5
2 Generate Foyer Halls (FHalls) Hall Count (2), Hall Length (30), Hall Width (20), Support Length (10), Foyer Width (20), Floor Height (6), Orientation (0), Lobby, Activity Hall, Service, Preview Location → Plan FoyerHallsComponent 6638efe7-c0e8-45b6-89b1-1e9e3f725c15 S8.5
2 Generate Operating Suite (OSuite) Bank Count (2), Bank Length (36), Theatre Depth (7), Clean Corridor Width (3), Dirty Corridor Width (2.4), Support Length (12), Floor Height (4.2), Orientation (0), Operating Theatre, Clean Corridor, Dirty Corridor, Clinical Support, Preview Location → Plan OperatingSuiteComponent 33323afd-abf1-4ecc-bf54-5d67c411c962 S8.6
2 Generate Court Cluster (CCluster) Court Count (2), Court Width (24), Court Depth (24), Depth (12), Unit Width (7), Stair Width (3), Floor Height (3), Orientation (0), Dwelling Unit, Stair, Preview Location → Plan CourtClusterComponent 01fc2ca9-3ec0-4142-b827-2519a4523d36 S8.6
2 Generate Stepped Band (SBand) Storey Count (3), Length (36), Base Depth (14), Step Depth (3), Corridor Width (2), Unit Width (6), Stair Width (4), Floor Height (3), Orientation (0), Dwelling Unit, Corridor, Stair, Preview Location → Plan (list, one per storey) SteppedBandComponent 3c685bfb-b45b-45af-98d2-8318a6314922 S8.7
2 Generate DOE Small Office (DoeSOff) Storeys (1), Plate Length (27.690763), Plate Depth (18.45945), Perimeter Depth (4.572), Corridor Width (1.2192), Floor Height (3.05), Orientation (0), Program Map, Preview Location → Plan, Multipliers, Program Keys SmallOfficeComponent c8f1e87b-b238-4b4f-a6de-c510d1e5d02b DOE P1
2 Generate DOE Medium Office (DoeMOff) Storeys (3), Plate Length (49.911), Plate Depth (33.274), Perimeter Depth (5.341938), Corridor Width (1.2192), Floor Height (3.9624), Orientation (0), Program Map, Preview Location → Plan, Multipliers, Program Keys MediumOfficeComponent e7998061-adad-41d7-a08f-aeb372863442 DOE P1
2 Generate DOE Large Office (DoeLOff) Storeys (12), Plate Length (73.10755), Plate Depth (48.737837), Perimeter Depth (12.161838), Corridor Width (1.523999), Floor Height (3.9632), Orientation (0), Program Map, Preview Location → Plan, Multipliers, Program Keys LargeOfficeComponent 8bb8e1b0-83e8-4cdf-b36b-3364315e6006 DOE P1
2 Generate Transform Plan (TPlan) Plan, Transform, Preview Location → Plan TransformPlanComponent 57c17b9c-04b4-4595-9150-bb923877d95e S4.2
3 Simplify No Simplification (Z0) Plan, Preview Location → Floor NoSimplificationComponent 83270abe-a13f-4f4c-a893-79739ad6e006 S2
3 Simplify Semantic Merge (Z1) Plan, Join Pieces, Preview Location → Floor SemanticMergeComponent 7d36f1d3-2708-4b69-b1a7-cf294c186e9a S3 (Join Pieces D-123)
3 Simplify Conditioned Merge (Z1c) Plan, Join Pieces, Preview Location → Floor ConditionedMergeComponent 4bf2f852-144c-4afb-8dcc-8c016787f571 D-123
3 Simplify Perimeter Core (Z2) Plan, Depth, Preview Location → Floor PerimeterCoreComponent 6a86b976-c838-427f-93a7-344dcc2c18ce S3
3 Simplify Single Zone per Floor (Z3) Plan, Preview Location → Floor SingleZonePerFloorComponent 4ff83222-5b7d-4d1b-8f26-fd580893a5db S3
4 Aggregate Stack Floors (Stack) Floors, Multipliers, Preview Location → Building StackFloorsComponent 6ce6524d-09b0-49fc-9b88-4c15bdcc8797 S2
4 Aggregate Stacked Floor Zone Multiplier (ZMult) Floors, Multipliers, Preview Location → Building StackedFloorZoneMultiplierComponent e4b44821-c9ed-49b9-9c4e-7c08355254dd S4 (renamed S4.2)
4 Aggregate Single Zone per Floor Type (1ZType) Floors, Multipliers, Preview Location → Building SingleZonePerFloorTypeComponent 506d5037-de93-4aee-a6c4-47dcc97509e1 S4 (renamed, new method S4.2)
4 Aggregate Single Zone Building (1ZBldg) Floors, Multipliers, Preview Location → Building SingleZoneBuildingComponent 50965154-e31e-4730-b61c-15a6f40bee6f S4.2
5 Convert Convert2BEM (2BEM) Building, Override, EnableInternalWallHeatTransfer, EnableFloorHeatTransfer, Envelope → Zones, Names, Space Types, Multipliers, Conditioned, Load Types, Load Bases, Load Values, Load Schedules, Heating Setpoints, Cooling Setpoints, Surfaces, Boundaries, Windows, Internal Mass, Provenance, Constructions, Window Constructions, Infiltration Rate, Infiltration Basis, Infiltration Schedule, Infiltration Flows, Load End Uses, Heat Fractions, Dwelling Units, Activity, People Radiant, People Sensible, Water Target, Water Inlet, Calendar Convert2BemComponent d091d70c-4de3-4f29-a900-ea4c9b777ba3 S2 (validation gate S3, options S4.2, envelope S6, infiltration outputs D-124, outputs 22 to 30 D-126)
5 Convert Convert2IDF (2IDF) Building, Envelope, EnableInternalWallHeatTransfer, EnableFloorHeatTransfer, Override, Path, Write, Overwrite, Weather (D-130), Construction (D-137), Fill From Example (D-140), Require Floor Research Eligibility, Daylighting (D-233) → IDF, Provenance, Written Convert2IdfComponent 56dd6611-90b2-4299-b53c-650652843a1a S6
6 Inspect Inspect (Inspect) Object → Report, Provenance InspectComponent 1d56a553-7a66-451f-90e2-81e744b43bdd S2
6 Inspect Map Source to Target (Map) Floor → Source, Target, Overlap, Source Fraction, Target Fraction MapSourceToTargetComponent eee37e01-28a2-4b5a-9c7d-7566cb9d93d4 S3
6 Inspect Validate (Validate) Object → Passed, Report ValidateComponent 03558c0b-83e8-417d-b122-96ebde64c147 S3

The Multipliers input of the four aggregators means: explicit repetition for Stack Floors, Single Zone per Floor Type, and Single Zone Building (the storeys are stacked before they are merged), and the number of storeys each floor type stands for in Stacked Floor Zone Multiplier, which models them as representative storeys with zone multipliers at their true elevations and splits storeys with an exposed floor or ceiling off as × 1 storeys, so exposure is never multiplied (D-045, D-046). Multipliers are whole numbers from 1 (D-072). The aggregators show UnsupportedStorey as a warning and FloorTypeSplit as a remark.

Parameters (the six of S2, Envelope Preset, S6, and Program Map, DOE P1, are hidden from the toolbar and registered in panel 0 Info; they carry and preview the pipeline objects. Any Program Preset is visible in panel 1 Program, S8.8, D-108):

Parameter (nickname) Class GUID
Schedule (Sch) ScheduleParameter a4ae84ac-36d6-41b8-9b3d-c77cca52a2df
Load (L) LoadParameter 9e9fbc12-9b81-42b7-8c5d-a4f8397a4487
Program Preset (P) ProgramPresetParameter 56578999-825c-4926-afdd-ce897b53221a
Any Program Preset (AnyP) AnyProgramPresetParameter 24bc6a12-ad06-4c25-bc9d-4e8318b8744c
Envelope Preset (Env) EnvelopePresetParameter efcbaf51-af02-44af-8d57-c4ca82c2ab3d
Plan (Plan) PlanParameter fca85387-7aaf-41fe-9654-382b2980f18f
Floor (Floor) FloorParameter 15a085fa-f308-46b7-93e6-88a7a85e6a89
Building (Bldg) BuildingParameter d6726442-189d-4c44-b043-b56417a3826a
Program Map (Map) ProgramMapParameter ec21d323-a3c1-41d7-aed8-b1e13dab50df

The plugin assembly (BemGenAssemblyInfo, name BEMGen) has the GUID 6f0f5d0e-2a8b-4c55-9a51-0a7b3d2c9e41.

Not implemented yet

No stage of the roadmap is open: S9, the release (D-115, D-116), is complete as version 1.0.0, and the latest revision stage, program JSON (D-126), is released as version 1.2.0 (D-127).

Open: the first EnergyPlus run once a weather file and outputs are chosen (D-112), the ClimateStudio-specific form of the Convert2BEM output (D-023), sourced program preset values including conditioning (an open research input; the atlas's program JSON is one route to them since D-126), sourced programs for the DOE generators' program keys (atlas inputs A1 to A3 of the DOE geometry design note; their tests use fixture programs), and simulation, which stays outside the pipeline (D-016).

The opt-in floor research gate also compares normalized per-source program signatures and configured hourly heat partitions (D-179). Generic caller-supplied source/derived air and boundary ledgers preserve unknown quantities and explicit departures; they do not certify geometry or vertical equivalence. See ADR-030 and research usage.