SIMPLE - Simulating for People

       [SIM]ulating
for peo[PLE]

Thanks for your interest in SIMPLE, a simulation tool aiming to satisfy the present needs of Building Performance Simulation. Long story short, SIMPLE aims to:

  1. Allow for a holistic building performance simulation using best-practice algorithms for each domain
  2. Make it easier to account for the complex interactions between Humans and Buildings
  3. Make it possible to implement complex algorithms, such as Model Predictive Control.
  4. Be deployable in multiple environments, including Windows, Linux and Mac, the cloud, the browser (i.e., WebAssembly)
  5. Use modern languages, toolset, and aim for clarity of source code (I do my best...)

You can read more about this in the "Do we need SIMPLE? section"

What to expect from this book?

For now this book has two parts:

  1. User guide: This part is written manually, and it is meant to help you learn and understand SIMPLE. This part is mainly focused on users. For example, (in the future) it might help you migrate from other tools—if you wanted to—, to understand best building-modelling practices, and so on. If you are looking for information regarding math and equations, then you'd better be looking at the developer documentation (e.g., this). The developer documentation is meant not only for people who want to code but also for people who want to understand the internals of SIMPLE.
  2. Input/Output Reference guide: This is an automatically generated guide, is updated every time the source code of SIMPLE's input model is updated. This section is meant to be a reference guide, helping

What is SIMPLE?

First and foremost, SIMPLE is a building performance simulation tool that aims to satisfy the present needs of this industry.

Digging deeper, SIMPLE can be seen from two perspectives.

  1. Historical perspective, referring to the motivations and drivers that determined its design and motivated me to develop it.
  2. Pragmatic perspective, associated with those cool features and benefits of SIMPLE that I have been finding during it's development.

Arguibly, these pragmatic benefits might be present in any modern simulation tool... but considering the low number of these, I guess they are pretty unique to SIMPLE anyway.

SIMPLE's origins — It's the people, stupid

The development of SIMPLE was motivated by the results of my PhD Research. In these studies, I investigated what is it that people—not building scientists or architects or engineers—mean by and expect from a comfortable home. In a single sentence, my finidings suggest that our understanding of building physics far outpaces our knowledge of how people interact with buildings. This gap is only going to widen unless we invest resources in understanding humans.

Let put it this way:

  1. Materials have been/will be getting better which means that, for instance, closed doors and windows are really good at preventing air leakage and heat transfer. Therefore, building controls and human behaviour—which define whether a window or door is open or closed—greatly impact the building's performance, and the health and comfort of the people in it.
  2. Software have been/will be getting better, meaning that we can—for instance—predict and understand the effects of an open/closed window better than ever before
  3. Our understanding of people is not catching up, meaning that we are not certain of whether windows and doors are open or not.

Note that point 3 is not suggesting that nothing has been done about understanding people. However, I would argue that our current tools to study people are not the best. This should be more clear later in this section.

This is a problem because buildings are built for people. Therefore, not understanding people implies not understanding the performance of buildings. Understanding when and why people choose to open windows requires tools that will let us properly research and evaluate human comfort and behaviour.

Below are the three main elements of SIMPLE that make it better at simulating buildings for real people.

1. It was designed to allow for holistic simulations

The motivation for performing holistic simulations is kind of obvious: when people get into a room, they just feel it. In other words, people do not separate—as software and building scientists do—the Thermal from the Daylight from the Acoustic domains. This means that, if we want to trully incorporate people's behaviour and comfort into our simulations, we need to account for multiple domains at the same time, at run time.

At run time means that it is not enough to run three simulations (one for thermal, one for acoustic, one for lighting) without considering the interaction between these domains.

So far, SIMPLE is actually quite good at Lighting and Thermal simulation, even though this feature has not been fully utilised. For instance, the following figure is evidence of how good it can calculate lighting and how well it compares to Energy Plus in therms of temperature estimations.

Lighting simulationThermal simulation
CornellSIMPLE vs Energy Plus

In order to allow for holistic simulations, we developed an architecture where different modules would connect to a single—domain agnostic—api. This API is the SIMPLE Model, and it allows any developer to say "Hey, give me the temperature of this room" without knowing how this value was calculated. In a similar manner, it allows these developers to make available values for other modules to use.

SIMPLE's architecture

2. It was designed to give some room for people's lives

People are not simple. They do not just say "it is cold, I will turn the heater on" in a deterministic manner. They take into account things like budget, bills, whether they are alone, and whether they have kids. Modelling this kind of behaviour calls for a much more flexible way of modelling control algorithms (yes, I am treating human behaviour as a control algorithm).

This is actually addressed in the same way as point 1 (i.e., Holistic simulations), in the sense that a new module could be created to deal with "Budget" or "Safety" and then use the same API to read and write values.

3. It was designed to travel in time

SIMPLE was designed with the purpose of acknowledging that people are constantly aware of their future. This is kind of obvious (e.g., you put a jacket before going out, not after) but our simulation tools tend to make it hard to implement this feature.

Allowing the simulation to travel in time is not trivial, as it means that—at every time step of the simulation—we need to estimate what will happen in the future and then return to the present.

From a simulation perspective, this implies

  1. Gathering a bunch of potential actions to take
  2. Execute each action, simulating some time into the future, record the results, and undo the changes.
  3. From the results of all actions, identify the best decision to take, if any.

Time traveling

SIMPLE deals with this challenge by separating the Simulation State (i.e., the values that describe the physical state of the building and therefore change during the simulation) from the model (i.e., which is constant throughout the simulation). From a software perspective, the structure representing the model is immutable while the state is mutable.

The whole point of this architecture is that the Simulation State happens to be a relatively small and cheap-to-copy structure (it is an array of floating point numbers). This implies that during a simulation, we can create copy, then simulate, and then destroy this copy without much loss of performance.

Beyond people — benefits of a modern tool

Having a modern simulation tool offers several benefits. However, it is important to also acknowledge the general benefits that come built-in from designing a tool that helps design buildings for people:

  1. Holistic simulations let us optimize multi-domain control algorithms that might lead to more optimal performance of buildings.
  2. Traveling in time gives us the chance to implement Model Predictive Control, at runtime, in production, as part of a real EMS system.

And, of course, there are other benefits.

1. It allows easily defining complex control algorithms

SIMPLE can ingest control algorithms as scripts. This allows for a much richer and flexible way of writing algoritghms than through schedules. or other common methods.

let kids_bedroom = space("Kids Bedroom");
let kids_heater = hvac("Kids heater");
let kids_window = fenestration("kids window");

let window_is_open = kids_window.open_fraction > 0.0
let temperature = kids_bedroom.dry_bulb_temperature;
let is_cold = temperature < 19
let is_hot = temperature > 25

let outside_temperature = kids_window.front_temperature

if is_hot && outside_temperature < inside_temperature  {
    if random() < 0.7 {
        // 70% chance of opening windows
        kids_window.open_fraction = 1
    }
} else if is_cold && outside_temperature > inside_temperature {
    if random() < 0.3 {
        // 30% chance of ventilating
        kids_window.open_fraction = 1
    }
} else {
    if random() < 0.5{
        // 50% of opening windows to balance temperatures
        kids_window.open_fraction = 1
    }
}


// Do something else...

2. You can store and reuse the solar calculations

Optical calculations—like those required for estimating the amount of sun or light that reaches each surface—can be computationally expensive. Because of this, it is common to pre-calculate as much as possible before the simulation starts, and then reuse this data when advancing through time.

SIMPLE goes one step ahead and allows you to save this data, and then reuse it in succeding simulations. (This data is valid as long as the geometry and materials of the model remain the same.)

SolarOptions {
    optical_data_path: "./path/to/solar/data.json",
    // ... other options
}

Some applications of this are the following:

  1. We had SIMPLE deployed on the cloud, and used it to run simulations on-demand. Keeping the solar data on a database meant that we did not have to recalculate it, significantly reducing response time and computational expenses.
  2. Optimising non-geometric elements (e.g., insulation thickness, size of heaters, luminaire placements, etc.) does not imply changes in geometry. This means that every step of the optimisation will be shorter.

Note: A very common example of this technique is the Daylight Coefficients, which is the method that SIMPLE utilises to calculate the amount of solar radiation reaching each surface. The figure below shows how SIMPLE's results compare to those of EnergyPlus, which performs this calculation in a very different manner. Solar Radiation

3. You can save the current state of the simulation

This is possible, but not yet implemented

Given that the Simulation State is a relatively small, independent object, it can be conveniently stored in a database or text file. This enables the pausing and restarting of simulations, offering flexibility for various applications.

This feature can potentially be particularly beneficial for integrating SIMPLE with Energy Management Systems (EMS). By periodically running simulations, EMS systems can update the building's current state and determine the most o ptimal control strategy, such as Model Predictive Control.

4. Deploy it to modern infrastructure

SIMPLE is a modern tool, written in a modern language, and that can run in multiple environments.

EnvironmentExample
Run locallyBeing a pure RUST program, can be compiled to run on Windows, Linux and MacOS (has been tested on Linux and Mac).
Web AssemblyRun it on a browser, without the need for servers. CHECK THIS EXAMPLE
On the cloudEmbed SIMPLE into a web server and release it into very small and secure containers
On location(not tested) Compile SIMPLE in a Raspberry PI or similar machine, and put it to work as part of the EMS

Can't we just improve other tools?

I have been working in Building Simulation Tool space for nearly a decade now. During this time, I have tried to combine simulation tools and methods, and also to make simulation more accessible to people. For example, my MSc research focused on the integration of Radiance and EnergyPlus. It was then when I started developing Groundhog, which intended to put Radiance in everyone’s hands. While developing Groundhog I realized that Radiance could use some sort of wrapper to make it a bit friendlier by offering out-of-the-box optimizations and pre- and post-processing. This motivated me to develop Emp, a Radiance orchestrator. Both projects—Radiance and Emp—have already died for various reasons.

During my time developing building performance simulation tools I have learned about an enormous amount of undeniable virtues that currently available tools—e.g., EnergyPlus and Radiance—have: they have been extensively validated, they are open source, they are free (as in freedom), and so on. Unfortunately, I have also seen many drawbacks. For starters, these tools were not really meant to be embedded on other tools. Radiance confesses this quite clearly:

“These routines are designed to aid the programmer who wishes to call Radiance as a library. Unfortunately, the system was not originally intended to be run this way, and there are some awkward limitations to contend with…” (Radiance’s raycalls.c)

Also, these tools were developed decades ago. Radiance was developed before the gaming and animation industry invested millions in improving rendering techniques, and EnergyPlus tends to focus too much on building physics even if we now know that we need to pay more attention to people’s behaviour in buildings (because insulating an open door is pointless). Also, programming was different back then, with different source control systems and way less people who knew how to code.

SIMPLE attempts to fix these issues by being open-source from day zero, by using a modern programming language, by having an architeture designed for enabling collaboration. Don’t be mistaken, though, SIMPLE does not attempt to reinvent the wheel. The real wheel is the knowledge of physics and rendering and computer sciences behind currently existing Building Performance Simulation tools… what it proposes is to build a good-old wheel with new materials and methods, in a more modern factory, and that is designed to travel in modern roads.

Getting Started with SIMPLE

SIMPLE requires occasion interactions with the terminal and code, so we have made this guide very simple for beginners. Throughout, you will learn how the tool works, how to prepare input files and analyze outputs.

Running a SIMPLE Simulation

SIMPLE is a command-line based tool, therefore, it doesn't have a user interface (UI). Here’s a short crash course on how the terminal works:

The terminal is an interface that allows you to access the command line. The command line is a text-based interface within the operating system to control the software.

To run SIMPLE, you will use the terminal to navigate to the folder where your SIMPLE executable file is located. This can be done by executing a sequence of cd (change directory) commands.

Once you are in the correct directory, you can call SIMPLE and start a simulation. Here's an example:

simple -i model.spl -w weather_file.epw -n 1 -o results.csv

In this command:

  • -i stands for input, followed by the name of your model file (in this case, model.spl).
  • -w is used to specify the weather file (here, weather_file.epw).
  • -n 1 defines the timestep, which is used to report variables and control the building.
  • -o is used to define the output file (results.csv in this case).

The Building Model

SIMPLE uses a text file as its primary input. This file describes a model, which can contain multiple buildings, although it is most common to simulate just one. (Describing the building in single-building simulations might hel[] estimate some things, like air leakage, based on the number of stories.)

A SIMPLE model contains—among others—the following elements (a more accurate and detailed list is available in the Input/Output reference)

  • Spaces: Basically, volumes of air that will have a single temperature. Each of them becomes a single Thermal Zone.
  • Buildings: Can contain Spaces
  • Surfaces: Physical elements—of a certain Material—that receive sun, transmit heat, and separate spaces.
  • Substances: A substance with a set of physical properties (e.g., density)
  • Materials: A layer of a certain thickness made up of a certain Substance
  • Constructions: A set of Materials
  • Hvacs: Heaters, Air Conditioners and so on.
  • Luminaires: Elements made for lighting. They produce light and also heat.
  • Objects: Mostly decorative at the moment (i.e., they do not interfere in simulation results), this is furniture, toiletes and so on.
  • Site Details: Describes the site and environment in which the model is located.
  • Outputs: Describe the outputs we want to be reported.

Describing a model

A SIMPLE model can be written in a .spl or .json file. The .spl format is meant to be more human-readable. (.json files are meant to be read and written by machines, mostly).

A .spl file starts by identifying the object type (e.g., SiteDetails or Substance) followed by a set of corresponding properties of the object being described.

Comments can be added with // for single lines and /*... */ for multi lines.

Here’s a sample basic model written in .spl syntax:

// This is a single line comment
/*
Comments can have multiple lines
So you can explain thigs better:

1. By adding lists
2. And longer comments.

*/

// This describes the environment of the model
SiteDetails {
   altitude : 0.0, // it is at sea level
   terrain : "City", // in a city
   latitude : -41.0, // at this latitude
   longitude : 174.0,  // at this loingitude
   standard_meridian : 180.0,  // this defines the timezone, basically
}

// This describes a building
Building {
    name: "Art Deco Building",
    n_storeys: 2, // it has 2 storeys
    shelter_class: "Urban",  // It is shelter as you would expect in a city
}

Asking for output

You can request specific outputs to be included in the results. This is done with an Output keyword followed by the desired output and an identifier. Here's an example:

Output {
    SpaceDryBulbTemperature : "Kids Bedroom" // Report the Dry Bulb Temperature of the Kids Bedroom.
}

Check out the Output section for a full list of possible output options.

Boundary

Represents the boundary of a Surface

By default (i.e., if no boundary is assigned to a Surface), the boundary will be assumed to be outside.

Note: This object cannot be declared by itself in a SIMPLE model. It is always embedded on a Surface

Examples

A Space boundary (in .json)

{
    "type": "Space",
    "space": "Some Room"    
}

A Ground boundary (in .json)

{
    "type": "Ground"
}

Supported Variants

Outdoor

Leads Outdoors. This is also the default (i.e., when no Boundary is set)

Full Specification
{
	type: "Outdoor"
}

Ground

The Surface is in contact with the Ground

Full Specification
{
	type: "Ground"
}

Space

The Surface leads to another space whose temperature and other properties are part of the simulation

Border conditions:

  • Solar Radiation: As calculated by the Solar module
  • Net Shortwave (IR) Radiation: Zero, for now at least (this is a good assumption if the surfaces inside the Space are at similar temperatures)
  • Convection Coefficient: Indoor
  • Wind: No
Full Specification
Boundary {
	type : "Space", // this should not change
	space : string
}

AmbientTemperature

The surface leads to an environment with no wind or sun, and with a fixed mean-radiant and dry bulb temperature

This object is useful for defining surfaces that lead to spaces that we one is not interested in modelling; for example, a wall that separates an apartment's room with the hall of the building. In that case, we don't need to simulate the temperature of the hall... but we can assume a certain temperature.

Border conditions:

  • Solar Radiation: None
  • Net Shortwave (IR) Radiation: The set temperature
  • Convection Coefficient: Indoor
  • Wind: No
Full Specification
Boundary {
	type : "AmbientTemperature", // this should not change
	temperature : number
}

Adiabatic

The temperature of the other side of the wall will be the same as the one measured at the interior of the space

Full Specification
{
	type: "Adiabatic"
}

Building

This object has two purposes. First, it can be utilized to group Space objects together for metering. Also, there are some physical aspects of the the building that can be calculated from some parameters of the building. For example, the Infiltrations can be estimated from the number of storeys and the ShelterClass (check docs for those).

Examples

.spl

Building {
    name: "Main Building",
    shelter_class: "Urban"    
}

.json

{
    "name": "Main Building",
    "shelter_class": "Urban"
}

Full Specification

Building {
   name : string,
   n_storeys : int, // optional,
   shelter_class : ShelterClass, // optional,
   stack_coefficient : number, // optional,
   wind_coefficient : number, // optional,
}

name

The name of the Building

n_storeys (optional)

The number of storeys of this building.

This value use used by the AirFlow module when a Space associated to this Building has been assigned an EffectiveAirLeakageArea infiltration. This value is required for calculating the Stack Coefficient () and the Wind Coefficient () of the EffectiveAirLeakageArea infiltration. and can be inputed directly by assigning values to the stack_coefficient and wind_coefficient fields, in which case the n_storeys field will be ignored.

shelter_class (optional)

The ShelterClass of this building.

This value use used by the AirFlow module when a Space associated to this Building has been assigned an EffectiveAirLeakageArea infiltration. This value is required for calculating the Wind Coefficient () of the EffectiveAirLeakageArea infiltration. can be inputed directly by assigning values to the wind_coefficient field, in which case the shelter_class field will be ignored.

stack_coefficient (optional)

The stack coefficient of this building, used for calculating infiltrations in Spaces that utilize the EffectiveAirLeakageArea infiltration option.

If not given, the number of storeys will be used for getting this values (based on EnergyPlus' Engineering Reference).

Note: The EffectiveAirLeakageArea object is appropriate for buildings of 3 storeys or less.

wind_coefficient (optional)

The wind coefficient of this building, used for calculating infiltrations in Spaces that utilize the EffectiveAirLeakageArea infiltration option.

If not given, the number of storeys will be used for getting this values (based on EnergyPlus' Engineering Reference).

Note: The EffectiveAirLeakageArea object is appropriate for buildings of 3 storeys or less.

ChairArmType

Types of armchair

Supported Variants

Existing

Has arms

Full Specification
"Existing"

Missing

Does not have arms

Full Specification
"Missing"

ChairBackType

Types of chair back

Supported Variants

Existing

Has arms

Full Specification
"Existing"

Missing

Does not have arms

Full Specification
"Missing"

ChairLegType

Types of legs in a chair

Supported Variants

Four

Four legs

Full Specification
"Four"

Three

Three legs

Full Specification
"Three"

Star

Star

Full Specification
"Star"

Other

Other

Full Specification
"Other"

ChairType

Type of chair

Supported Variants

Other

Other

Full Specification
"Other"

Dining

Dining

Full Specification
"Dining"

Office

Office

Full Specification
"Office"

Stool

Stool

Full Specification
"Stool"

Construction

An object representing an array of Materials, ordered from front to back

Front and back can be indoor, outdoor, or they can both be indoor (it depends exclusively on the Boundary set to the surface)

Examples

.spl

Construction {
    name: "The Construction",
    materials: [
        "layer 1",
        "layer 2",
    ]
}

.json

{
    "name": "The Construction",
    "materials": [
        "layer 1",
        "layer 2"
    ]
}

Full Specification

Construction {
   name : string,
   materials : [string, ...],
}

name

The name of the Construction object. Must be unique within the model

materials

The indices of the Material objects in the materials property of the Model object

Fenestration

A surface that can potentially be opened and closed. It can be of any Construction and it does not need to be a hole in another surface.

Examples

.spl

Fenestration {
    name: "Window 1",
    construction: "Double Clear Glass",
    back_boundary: {
        type: "Space",
        space: "Space 1",
    },
    operation: {
        type: "Fixed",
    },
    category: "Window",
    vertices: [
        0.548000,0,2.5000,  // X,Y,Z ==> Vertex 1 {m}
        0.548000,0,0.5000,  // X,Y,Z ==> Vertex 2 {m}
        5.548000,0,0.5000,  // X,Y,Z ==> Vertex 3 {m}
        5.548000,0,2.5000   // X,Y,Z ==> Vertex 4 {m}
    ],
    
}

.json

{
    "name": "Window 1",
    "construction": "Double Clear Glass",
    "back_boundary": {
        "type": "Space",
        "space": "Space 1"
    },
    "operation": {
        "type": "Fixed"
    },
    "category": "Window",
    "vertices": [
        0.548000,0,2.5000,  
        0.548000,0,0.5000,  
        5.548000,0,0.5000,  
        5.548000,0,2.5000   
    ]    
}

Full Specification

Fenestration {
   name : string,
   vertices : Polygon3D,
   construction : string,
   category : FenestrationType,
   operation : FenestrationPosition, // optional,
   front_boundary : Boundary,
   back_boundary : Boundary,
   precalculated_front_convection_coef : number, // optional,
   precalculated_back_convection_coef : number, // optional,
   parent_surface : string, // optional,
}

name

The name of the sub surface

vertices

An array of Numbers representing the vertices of the surface. The length of this array must be divisible by 3.

construction

The name of the Construction object in the constructions property of the Model object

category

Defines whether a Fenestration is a Window, Door, or other. If none is given, the assumed behaviour is that it is a Window.

operation (optional)

The opportunity for operating the Fenestration. If none is given, the window is assumed to be Fixed at Closed position.

front_boundary

The front Boundary. No boundary means it leads to the exterior

back_boundary

The back Boundary. No boundary means it leads to the exterior

precalculated_front_convection_coef (optional)

The front convection coefficient, in W/m2K

This value fixes the value, so the automatic calculations in SIMPLE have no effect.

precalculated_back_convection_coef (optional)

The back convection coefficient, in W/m2K

This value fixes the value, so the automatic calculations in SIMPLE have no effect.

parent_surface (optional)

The name of the surface containing this Fenestration, if any. A hole will be made in the parent surface in order to accomodate

Note that a Fenestration can be self contained (i.e., it can have no parent surface), which allows representing situation where the fenestration is very large and therefore there would be no area for wall.

Note: This field will not be serialized. This is beacuse there is no quarantee that the surfaces will be there before the fenestrations and thus there would be errors when deserializing. In any case, it is assumed that JSON models are read/written by machines—e.g., either by serializing a Model or by another kind of machine—and therefore the convenience of not having to write down the vertices around holes is not much needed.

API Access

// by name
let my_fenestration = fenestration(string);
// by index
let my_fenestration = fenestration(int);

API

The following properties are available for simulating control algorithms

Property
front_temperature
back_temperature
open_fraction
front_convection_coefficient
back_convection_coefficient
front_convective_heat_flow
back_convective_heat_flow
front_incident_solar_irradiance
back_incident_solar_irradiance
front_ir_irradiance
back_ir_irradiance

FenestrationPosition

Defines whether the Fenestration is fixed or openable.

Example

.json

{
    "type" : "Continuous", 
    "max" : 1.0,
    "min" : 0.0
}

Note: This object cannot be declared by itself in a SIMPLE model, as it is always embeded on a Fenestration object

Supported Variants

Fixed

It is fixed at a certain open fraction

Full Specification
FenestrationPosition {
	type : "Fixed", // this should not change
	fraction : number, // optional
}

Continuous

It can be position at any position, from fully opened to fully closed

Full Specification
FenestrationPosition {
	type : "Continuous", // this should not change
	max : number, // optional
	min : number, // optional,
}

Binary

It can only be opened or closed, no in-between

Full Specification
FenestrationPosition {
	type : "Binary", // this should not change
	open : number, // optional
	closed : number, // optional,
}

FenestrationType

Defines whether the fenestration is a Door or a Window.

At present, this option has no effect whatsoever

Example

.json

"Window"    

Note: This object cannot be declared by itself in a SIMPLE model, as it is always embeded on a Fenestration object

Supported Variants

Window

This is a Window. This is the default.

Full Specification
"Window"

Door

This is a Door

Full Specification
"Door"

Opening

This is an opening, meaning that it lets air through it.

Full Specification
"Opening"

HVAC

A collection of elements heating and cooling systems

Example .spl



HVAC {    
    type: "ElectricHeater",
    name: "Bedrooms heater",
    target_space: "Bedroom",    
}



Example .json

{    
    "type": "ElectricHeater",
    "name": "Bedrooms heater",
    "target_space": "Bedroom"
}

Supported Types

  • IdealHeaterCooler: An ideal heating/cooling device. Heats and Cools with an efficiency of 1, and nothing effects its COP or efficiency

  • ElectricHeater: An electric heater, it can only heat.

API Access

// by name
let my_hvac = hvac(string);
// by index
let my_hvac = hvac(int);

ElectricHeater

A simple model of an Electric Heater. It can only heat and has a COP of 1. It only has two states: On/Off.

The thermostat that controls it—if any—is assumed to be in the target_space

Examples

.spl



HVAC {    
    type: "ElectricHeater",
    name: "Bedrooms heater",
    target_space: "Bedroom",    
}


.json

{    
    "type": "ElectricHeater",
    "name": "Bedrooms heater",
    "target_space": "Bedroom"
}

Full Specification

ElectricHeater {
   name : string,
   target_space : string, // optional,
   max_heating_power : number, // optional,
   heating_setpoint : number, // optional,
}

name

The name of the system

target_space (optional)

The Space that this [ElectricHeater] heats and/or cools

max_heating_power (optional)

Max heating power

heating_setpoint (optional)

The temperature that triggers the on/off option.

This tempareture is 'measured' in the target_space. If the dry bulb tempreature in the target_space is below this value, the heater starts heating.

Note: This assumes automatic control; that is to say, this condition will be evaluated every timestep of the heat model simulation (as opposed to the occupant/people control timestep, which is the one set by the user witht the simulation options)

API

The following properties are available for simulating control algorithms

Property
power_consumption

IdealHeaterCooler

An ideal Heating and Cooling device, with a COP of 1.

It only has two states: On/Off.

Example

.spl

HVAC {    
    type: "IdealHeaterCooler",
    name: "Bedrooms heater",
    target_space:  "Bedroom"    
}

.json

{    
    "type": "IdealHeaterCooler",
    "name": "Bedrooms heater",
    "target_space": "Bedroom"    
}

Full Specification

IdealHeaterCooler {
   name : string,
   target_space : string, // optional,
   max_heating_power : number, // optional,
   max_cooling_power : number, // optional,
   heating_setpoint : number, // optional,
   cooling_setpoint : number, // optional,
}

name

The name of the system

target_space (optional)

The Spaces that this IdealHeaterCooler heats and/or cools

max_heating_power (optional)

Max heating power

max_cooling_power (optional)

Max cooling power

heating_setpoint (optional)

The temperature that automatically triggers the on/off option.

This tempareture is 'measured' in the thermostat_location. If the dry bulb tempreature in the thermostat_location is below this value, the system starts heating.

Note: This assumes automatic control; that is to say, this condition will be evaluated every timestep of the heat model simulation (as opposed to the occupant/people control timestep, which is the one set by the user witht the simulation options)

cooling_setpoint (optional)

The temperature that triggers the on/off option.

This tempareture is 'measured' in the thermostat_location. If the dry bulb tempreature in the thermostat_location is over this value, the system starts cooling.

Note: This assumes automatic control; that is to say, this condition will be evaluated every timestep of the heat model simulation (as opposed to the occupant/people control timestep, which is the one set by the user witht the simulation options)

API

The following properties are available for simulating control algorithms

Property
power_consumption

Infiltration

Infiltration is the unintended air exchange between an interior space and the exterior. In SIMPLE, infiltrations are added to the intended ventilation.

This group of objects allow defining infiltration on different ways. Which variety is better will depend on the information available and the kind of building.

Examples

.spl

// Note that Infiltration is always attached to a Space
Space {
    name: "Bedroom", 
    volume: 42, // volume in m3. 
    infiltration: { // <- Define the infiltration
        type : "Doe2", 
        flow : 0.24,
    }
}

.json

{
    "type": "DesignFlowRate",
    "a": 1.0,
    "b": 0.0,
    "c": 0.04,
    "d": 0.0,
    "phi": 1.2
}
{
    "type": "Constant",
    "flow": 1.2
}

Note: This object cannot be declared by itself in a SIMPLE model, as it is always embeded on a Space

Supported Variants

Constant

A contant infiltration, specified in m3/s

Full Specification
Infiltration {
	type : "Constant", // this should not change
	flow : number
}

Blast

It is the same as the DesignFlowRate infiltration object, but specifying the default values from BLAST, as described in the EnergyPlus' Input Output reference

Full Specification
Infiltration {
	type : "Blast", // this should not change
	flow : number
}

Doe2

It is the same as the DesignFlowRate infiltration object, but specifying the default values from DOE-2 as described in the EnergyPlus' Input Output reference

Full Specification
Infiltration {
	type : "Doe2", // this should not change
	flow : number
}

DesignFlowRate

Sets the infiltration to the DesignFlowRate values using an arbitrary set of values. This option is based on EnergyPlus' object of the same name.

The flow (in ) is calculated from the parameters , , , and as follows:

The inputs to this object are , , , , .

Full Specification
Infiltration {
	type : "DesignFlowRate", // this should not change
	a : number
	b : number,
	c : number,
	d : number,
	phi : number,
}

EffectiveAirLeakageArea

Sets the infiltration based on EffectiveLeakageArea as described in the EnergyPlus' Input Output reference. This variant of infiltration requires the space to be part of a Building

The infiltration rate—in —is calculated based on the following equation:

where:

  • is the effective air leakage in @ 4Pa (NOTE THAT THE INPUT IS IN M2)
  • is the coefficient for stack induced infiltration
  • is the coefficient for wind induced infiltration

The only input to this object is the effecctive air leakage, , in @ 4Pa. The other parameters— and —are derived based on the required Building object associated with the Space that owns this Infiltration. For this to work, the associated Building needs to have been assigned the fields n_storeys and a shelter_class (which allow calculating and ) OR the properties of stack_coefficient (i.e., ) and wind_coefficient (i.e., ).

Note: The EffectiveAirLeakageArea object is appropriate for buildings of 3 storeys or less.

Example

Building {
    name: "Art Deco Building", 
    n_storeys: 2,
    shelter_class: "Urban",
}

Space {
    name: "Kids Bedroom",
    volume: 19.23, 
    infiltration: {
      type : "EffectiveAirLeakageArea",
      area: 0.0496, // this is roughly 22cm x 22cm
    },
    building: "Art Deco Building"
}

Values for

(source of this example: Sherman and Grimsrud (1980) Infiltration-Pressurization correlation: Simplified physical modeling). Conference of American Society of Heating, Refrigeration and Air Conditioning Engineers

Ideally, the value from should come from a blower-door test. When doing one of these, you can get a table like the following:

Q () ()
100.222
200.338
300.433
400.513
500.586

This data can be fitted in a model with the shape:

In this case, the values for and are and , respectively.

Evaluating this model at , we get an air flow of .

To calculate we now need to use this data in the following equation, which relates air flows through openings of size :

Where is the air density of . So, the estimated would be

Full Specification
Infiltration {
	type : "EffectiveAirLeakageArea", // this should not change
	area : number
}

Luminaire

A Luminaire

Examples

.spl
Luminaire {
    name: "Some Light",
    max_power: 30,
    target_space: "A bright space!"
}
.json
{
    "name": "Some Light",
    "max_power": 30,
    "target_space": "A bright space!"
}

Full Specification

Luminaire {
   name : string,
   max_power : number, // optional,
   target_space : string, // optional,
}

name

The name of the Luminaire

max_power (optional)

The maximum power consumption

target_space (optional)

The name of the space in which the space is located

While this value might not be relevant for e.g., lighting calculations, this is necessary for thermal simulations, in which the heat disipated by a luminaire will be disipated into the air of a thermal zone. So, if this is an exterior luminaire or if no thermal calculation is performed, this can be left empty.

API Access

// by name
let my_luminaire = luminaire(string);
// by index
let my_luminaire = luminaire(int);

API

The following properties are available for simulating control algorithms

Property
power_consumption

Material

The representation of a physical layer-Material. That is to say, a layer of a certain thickness made of a certain Substance

Examples

.spl
Material {
    name:"Fancy Material",
    substance: "Fancy Substance",
    thickness: 0.2
}
.json
{
    "name":"Fancy Material",
    "substance": "Fancy Substance",
    "thickness": 0.2
}

Full Specification

Material {
   name : string,
   substance : string,
   thickness : number,
}

name

The name of the material object

substance

The name of the Substance of which this [Material] is made of

thickness

The thickness of the [Material]

Object

An object

Full Specification

Object {
   name : string,
   dimensions : Point3D,
   location : Point3D,
   up : Vector3D,
   front : Vector3D,
   specifications : ObjectSpecs,
   space : string, // optional,
}

name

The name of the object

dimensions

The size of the object (x, y, z)

location

The location of the center of the object

up

The up

front

Front

specifications

The specification of the object

space (optional)

The space in which the object is located

ObjectSpecs

An object category

Supported Variants

Other

Other category

Full Specification
{
	type: "Other"
}

Bathtub

Bathtub

Full Specification
{
	type: "Bathtub"
}

Bed

Bed

Full Specification
{
	type: "Bed"
}

Chair

Chair

Full Specification
ObjectSpecs {
	type : "Chair", // this should not change
	category : ChairType
	arms : ChairArmType,
	back : ChairBackType,
	legs : ChairLegType,
}

Dishwasher

Dishwasher

Full Specification
{
	type: "Dishwasher"
}

Fireplace

Fireplace

Full Specification
{
	type: "Fireplace"
}

Oven

Oven

Full Specification
{
	type: "Oven"
}

Refrigerator

Refrigerator

Full Specification
{
	type: "Refrigerator"
}

Sink

Sink

Full Specification
{
	type: "Sink"
}

Sofa

Sofa

Full Specification
ObjectSpecs {
	type : "Sofa", // this should not change
	category : SofaType
}

Stairs

Stairs

Full Specification
{
	type: "Stairs"
}

Storage

Storage

Full Specification
ObjectSpecs {
	type : "Storage", // this should not change
	category : StorageType
}

Stove

Stove

Full Specification
{
	type: "Stove"
}

Table

Table

Full Specification
ObjectSpecs {
	type : "Table", // this should not change
	category : TableType
	shape : TableShape,
}

Television

Television

Full Specification
{
	type: "Television"
}

Toilet

Toilet

Full Specification
{
	type: "Toilet"
}

WasherDryer

Washer Dryer

Full Specification
{
	type: "WasherDryer"
}

Output

Possible outputs to request from the simulation

Example

Space {
   name: "Bedroom", 
   volume: 42, // volume in m3. 
   infiltration: { // <- Define the infiltration
       type : "Doe2", 
       flow : 0.24,
   }
}

// Report the Bedroom's output variable
Output{
   SpaceDryBulbTemperature: "Bedroom"
}

Supported Variants

Clothing

The amount of clothing the person is using, in Clo value

Output {
	Clothing : string
}

FenestrationOpenFraction

Represents how open is a fenestration. Contains the Index of fenestration, and its open fraction

Output {
	FenestrationOpenFraction : string
}

HeatingCoolingPowerConsumption

Represents the heating/cooling energy consumption of a Heating/Cooling system, in Watts

Contains the index of the HVAC in the building\'s vector, and the power.

Output {
	HeatingCoolingPowerConsumption : string
}

LuminairePowerConsumption

Represents the power being consumed by a Luminaire object, in Watts (luminaire index, power)

Output {
	LuminairePowerConsumption : string
}

SurfaceFrontConvectionCoefficient

The convective heat transfer coefficient at the front of a surface

Output {
	SurfaceFrontConvectionCoefficient : string
}

SurfaceBackConvectionCoefficient

The convective heat transfer coefficient at the back of a surface

Output {
	SurfaceBackConvectionCoefficient : string
}

SurfaceFrontConvectiveHeatFlow

The convective heat flow at the front of a surface

Output {
	SurfaceFrontConvectiveHeatFlow : string
}

SurfaceBackConvectiveHeatFlow

The convective heat flow at the back of a surface

Output {
	SurfaceBackConvectiveHeatFlow : string
}

SurfaceFrontSolarIrradiance

Incident solar irradiance at the front

Output {
	SurfaceFrontSolarIrradiance : string
}

SurfaceBackSolarIrradiance

Incident solar irradiance at the back

Output {
	SurfaceBackSolarIrradiance : string
}

SurfaceFrontIRIrradiance

Incident Infrared irradiance at the front

Output {
	SurfaceFrontIRIrradiance : string
}

SurfaceBackIRIrradiance

Incident Infrared irradiance at the back

Output {
	SurfaceBackIRIrradiance : string
}

FenestrationFrontConvectionCoefficient

The convective heat transfer coefficient at the front of a surface

Output {
	FenestrationFrontConvectionCoefficient : string
}

FenestrationBackConvectionCoefficient

The convective heat transfer coefficient at the back of a surface

Output {
	FenestrationBackConvectionCoefficient : string
}

FenestrationFrontConvectiveHeatFlow

The convective heat flow at the front of a surface

Output {
	FenestrationFrontConvectiveHeatFlow : string
}

FenestrationBackConvectiveHeatFlow

The convective heat flow at the back of a surface

Output {
	FenestrationBackConvectiveHeatFlow : string
}

FenestrationFrontSolarIrradiance

Incident solar irradiance at the front

Output {
	FenestrationFrontSolarIrradiance : string
}

FenestrationBackSolarIrradiance

Incident solar irradiance at the back

Output {
	FenestrationBackSolarIrradiance : string
}

FenestrationFrontIRIrradiance

Incident Infrared irradiance at the front

Output {
	FenestrationFrontIRIrradiance : string
}

FenestrationBackIRIrradiance

Incident Infrared irradiance at the back

Output {
	FenestrationBackIRIrradiance : string
}

SpaceDryBulbTemperature

Space Air Temperature in C... The elements are the index of the Space in the Building mode and the temperature

Output {
	SpaceDryBulbTemperature : string
}

SpaceInfiltrationVolume

The volume of air that is entering the space in an uncontrolled way. In m3/s

Output {
	SpaceInfiltrationVolume : string
}

SpaceInfiltrationTemperature

The temperature of air that is entering the space in an uncontrolled way. In C

Output {
	SpaceInfiltrationTemperature : string
}

SpaceVentilationVolume

The volume of air that is entering the space in a controlled way. In m3/s

Output {
	SpaceVentilationVolume : string
}

SpaceVentilationTemperature

The temperature of air that is entering the space in a controlled way. In C

Output {
	SpaceVentilationTemperature : string
}

SpaceAirExchangeVolume

The volume of air that is moving from one space to another in a controlled way. In m3/s

Output {
	SpaceAirExchangeVolume : string
}

SurfaceNodeTemperature

Temperature (Float) of Surface\'s (usize) node (usize) I.e. the order is (Surface Index, Node index, Temperature).

Output {
	SurfaceNodeTemperature : string
}

FenestrationNodeTemperature

Temperature (Float) of Fenestration\'s (usize) node (usize) I.e. the order is (Surface Index, Node index, Temperature).

Output {
	FenestrationNodeTemperature : string
}

SiteDetails

Some information about the site in which the building(s) are located

Examples

.spl

SiteDetails {    
    altitude: 123.0,
    terrain: "Urban"
}

.json

{    
    "altitude": 123.0,
    "terrain": "Urban"
}

Full Specification

SiteDetails {
   altitude : number, // optional,
   terrain : TerrainClass, // optional,
   latitude : number, // optional,
   longitude : number, // optional,
   standard_meridian : number, // optional,
}

altitude (optional)

The altitude of the site.

terrain (optional)

The kind of terrain

latitude (optional)

In degrees. South is negative and North is positive

This value is irrelevant if a simulation is ran based on an EPW weather file (in which case it is extracted such file). However, it can be useful when producing synthetic weathers or HVAC sizing, or other applications.

longitude (optional)

In degrees. West is negative, east is positive.

This value is irrelevant if a simulation is ran based on an EPW weather file (in which case it is extracted such file). However, it can be useful when producing synthetic weathers or HVAC sizing, or other applications.

standard_meridian (optional)

In degrees. This is 15*GMT Time Zone

This value is irrelevant if a simulation is ran based on an EPW weather file (in which case it is extracted such file). However, it can be useful when producing synthetic weathers or HVAC sizing, or other applications.

SofaType

Types of armchair

Supported Variants

Other

Other

Full Specification
"Other"

Rectangular

Rectangular

Full Specification
"Rectangular"

SingleSeat

Single Seat

Full Specification
"SingleSeat"

LShaped

L-Shaped

Full Specification
"LShaped"

LShapedExtension

L-Shaped Extension

Full Specification
"LShapedExtension"

SolarOptions

The options for the solar and lighting calculations

Examples

.spl
SolarOptions {    
    n_solar_irradiance_points: 30,
    solar_sky_discretization: 2,
    optical_data_path: "data.json"
}
.json
{    
    "n_solar_irradiance_points": 30,
    "solar_sky_discretization": 2,
    "optical_data_path": "data.json"
}

Full Specification

SolarOptions {
   n_solar_irradiance_points : int, // optional,
   solar_ambient_divitions : int, // optional,
   solar_sky_discretization : int, // optional,
   optical_data_path : string, // optional,
}

n_solar_irradiance_points (optional)

Number of points utilized to calculate the average incident solar irradiance over each fenestration or surface in W/m2.

A larger number of points leads to more accurate results but, as usual, it has an impact on the time of the computation. Specifically, the time required for creating the model increases linearly with the number of points. The time required to process each timestep is not affected.

solar_ambient_divitions (optional)

Number of primary rays sent from each of the n_solar_irradiance_points when calculating the average incident solar irradiance over each surface or fenestration.

A larger number of rays leads to more accurate results but, as usual, it has an impact on the time of the computation. Specifically, the time required for creating the model increases linearly with the number of points. The time required to process each timestep is not affected.

solar_sky_discretization (optional)

The sky discretization scheme used for solar irradiance. A value of 1 leads to 145 sky patches + the ground.

A larger number leads to more accurate results but, as usual, it has an impact on the time of the computation. Although the time required for creating the model is not greatly affected, the time required for processing each timestep can increase considerably.

optical_data_path (optional)

A path to the file containing information about solar radiation and other optical stuff. If the file does not exist, this information will be calculated and saved in this path. If it does exist, it will be loaded and used directly, saving time

Space

Represents a space with homogeneous temperature within a building. It is often actual room enclosed by walls, but it can also be more than one room. In this latter case, there will be walls within the Space, meaning that there are walls whose Front and Back boundary is this space.

Examples

.spl

Space {
    name: "Walrus Enclosure",
    volume: 249,
    building: "Wonderful Zoo"
}

.json

{
    "name": "Walrus Enclosure",
    "volume": 249,
    "building": "Wonderful Zoo"
}

Full Specification

Space {
   name : string,
   volume : number, // optional,
   infiltration : Infiltration, // optional,
   building : string, // optional,
   storey : int, // optional,
   purposes : [SpacePurpose, ...],
}

name

The name of the space

volume (optional)

Volume of the space

infiltration (optional)

The infiltration in the space

building (optional)

The building in which this Space is inserted

storey (optional)

The storey in which the space is located, indexing from 0 (i.e., ground floor is 0)

purposes

The purposes in a room. It can have multiple purposes (e.g., a Living/Dining/Kithen space)

API Access

// by name
let my_space = space(string);
// by index
let my_space = space(int);

API

The following properties are available for simulating control algorithms

Property
dry_bulb_temperature
brightness
loudness
infiltration_volume
infiltration_temperature
ventilation_volume
ventilation_temperature

SpacePurpose

The category of a space.

Supported Variants

Bathroom

Bathroom, toilette, shower, etc.

Full Specification
{
	type: "Bathroom"
}

Bedroom

Bedroom

Full Specification
{
	type: "Bedroom"
}

DiningRoom

Dining room

Full Specification
{
	type: "DiningRoom"
}

Kitchen

Kitchen

Full Specification
{
	type: "Kitchen"
}

LivingRoom

Living room

Full Specification
{
	type: "LivingRoom"
}

Office

Office

Full Specification
{
	type: "Office"
}

Storage

Storage

Full Specification
{
	type: "Storage"
}

Garage

Garage

Full Specification
{
	type: "Garage"
}

Hallway

Hallway

Full Specification
{
	type: "Hallway"
}

Laundry

Laundry

Full Specification
{
	type: "Laundry"
}

Other

Other

Full Specification
{
	type: "Other"
}

StorageType

Types of storage

Supported Variants

Cabinet

Enclosed storage

Full Specification
"Cabinet"

Shelf

Open storage (i.e., shelves)

Full Specification
"Shelf"

Substance

A physical substance with physical—i.e., optical, thermal—properties.

Note that, contrary to EnergyPlus' Materials, Substances do not contain information about the thickness, which in Simple is given when creating a Material. The idea is to enable multiple materials of different thicknesses to reference the same material.

Note: Glazing substances are Normal substances with solar_transmitance and visible_transmittance. However, contrary to all other properties, this property does depend on the thickness of the substance. So, in order to build a coherent Glazing, you'll need to match this Substance with an appropriate Material

Examples

A normal substance

Substance {
    type: "Normal",
    name: "the substance", 
    thermal_conductivity: 12,
}

A gas

Substance {
    type: "Gas",
    name: "Some Gas",
    gas: "Xenon"
}

Supported Types

  • Normal: A normal (i.e., solid, homogeneous) substance such as glass, timber or concrete.

  • Gas: A gas, as understood by the standard ISO-15099(2003).

Normal

Represents a physical material with common physical properties (e.g., timber, concrete, brick, glass). In other words, it cannot change its thermal/optical properties based on its internal state (e.g., it cannot change its specific heat based on temperature, like Gas or Phase Change Materials).

Examples

.spl

Substance {
    type: "Normal",
    name: "the substance", 
    thermal_conductivity: 12,
}

.json

{
    "type": "Normal",
    "name": "the substance", 
    "thermal_conductivity": 12.0 
}

Full Specification

Normal {
   name : string,
   thermal_conductivity : number, // optional,
   specific_heat_capacity : number, // optional,
   density : number, // optional,
   front_solar_absorbtance : number, // optional,
   back_solar_absorbtance : number, // optional,
   solar_transmittance : number, // optional,
   front_visible_reflectance : number, // optional,
   back_visible_reflectance : number, // optional,
   visible_transmissivity : number, // optional,
   front_thermal_absorbtance : number, // optional,
   back_thermal_absorbtance : number, // optional,
}

name

The name of the Substance. Should be unique for each Substance in the Model object

thermal_conductivity (optional)

The thermal conductivity of the substance in W/m.K

specific_heat_capacity (optional)

The specific heat capacity of the substance in J/kg.K

density (optional)

The density of the substance in kg/m3

front_solar_absorbtance (optional)

Solar absorbtance (from 0 to 1) at the front side (Front being the side closer to the first material in a construction)

Absorbtance is used instead of reflectance (which is used in visible radiation properties) to maintain coherence with EnergyPlus

back_solar_absorbtance (optional)

Solar absorbtance (from 0 to 1) at the front side (Back being the side closer to the last material in a construction)

Absorbtance is used instead of reflectance (which is used in visible radiation properties) to maintain coherence with EnergyPlus... because in Thermal calculation we mostly care about how much is absorbed; in lighting we care mainly about how much is reflected.

solar_transmittance (optional)

The front solar transmittance at normal incidence (from 0 to 1)

Please note that, contrary to all other properties, this property does depend on the thickness of the substance. So, in order to build a coherent Glazing, you'll need to match this Substance with an appropriate Material

Transmittance is used instead of transmissivity (which is used in visible radiation properties) to maintain coherence with EnergyPlus... because in Thermal calculation we mostly care about how much is absorbed; in lighting we care mainly about how much is reflected.

front_visible_reflectance (optional)

Solar absorbtance (from 0 to 1) at the front side (Front being the side closer to the first material in a construction)

Reflectance is used instead of Absorbtance (which is used in solar radiation properties) to maintain coherence with Radiance... because in Lighting we really care about how much is reflected; in thermal we care mainly about how much is absorbed.

back_visible_reflectance (optional)

Solar absorbtance (from 0 to 1) at the front side (Back being the side closer to the last material in a construction)

Reflectance is used instead of Absorbtance (which is used in solar radiation properties) to maintain coherence with Radiance... because in Lighting we really care about how much is reflected; in thermal we care mainly about how much is absorbed.

visible_transmissivity (optional)

The front solar transmittance at normal incidence (from 0 to 1)

Please note that, contrary to all other properties, this property does depend on the thickness of the substance. So, in order to build a coherent Glazing, you'll need to match this Substance with an appropriate Material

Transmissivity is used instead of Transmittance (which is used in solar radiation properties) to maintain coherence with Radiance

front_thermal_absorbtance (optional)

Front thermal absorbtance (i.e., emissitivy; from 0 to 1) (Front being the side closer to the first material in a construction)

back_thermal_absorbtance (optional)

Back thermal absorbtance (i.e., emissitivy; from 0 to 1) (Back being the side closer to the last material in a construction)

Gas

Represents a Gas, as understood by the standard ISO-15099(2003).

Examples

.spl

Substance {
    type: "Gas",
    name: "Some Gas",
    gas: "Xenon"
}

.json

{
    "type": "Gas",
    "name": "Some Gas",
    "gas": "Xenon"
}

Full Specification

Gas {
   name : string,
   gas : GasSpecification, // optional,
}

name

The name of the Substance. Should be unique for each Substance in the Model object

gas (optional)

A predefined gas

GasSpecification

Represent a common gas, with known physical properties

Examples

.json

"Air"

Note: This object cannot be declared by itself in a SIMPLE model, as it is always embeded on a Substance of type Gas

Supported Variants

Air

Air

Full Specification
"Air"

Argon

Argon

Full Specification
"Argon"

Krypton

Krypton

Full Specification
"Krypton"

Xenon

Xenon

Full Specification
"Xenon"

ShelterClass

Indicates how sheltered is the building. This affects its infiltration

Examples

.json

"Urban"

Note: This object cannot be declared by itself in a SIMPLE model, as it is always embeded on a Building object

Supported Variants

NoObstructions

No obstructions or local shielding

Full Specification
"NoObstructions"

IsolatedRural

Typical shelter for an isolated rural house

Full Specification
"IsolatedRural"

Urban

Typical shelter caused by other buildings across the street

Full Specification
"Urban"

LargeLotUrban

Typical shelter for urban buildings on larger lots

Full Specification
"LargeLotUrban"

SmallLotUrban

Typical shelter produced by buildings that are immediately adjacent.

Full Specification
"SmallLotUrban"

Surface

A fixed (i.e., not movable) surface in the building (or surroundings). This can be of any Construction, transparent or not.

Examples

.spl

// This should not be empty
Construction {
    name: "the construction",
    materials: []
}
Surface {
    name: "the surface",
    construction:"the construction", 
    vertices: [ 
        0, 0, 0, // X, Y and Z of Vertex 0
        1, 0, 0, // X, Y and Z of Vertex 1
        1, 1, 0, // X, Y and Z of Vertex 2
        0, 1, 0  // ... 
    ]
}

.json

{
    "name": "the surface",
    "construction":"the construction", 
    "vertices": [ 
        0, 0, 0, 
        1, 0, 0, 
        1, 1, 0, 
        0, 1, 0  
    ]
}

Full Specification

Surface {
   name : string,
   vertices : Polygon3D,
   construction : string,
   front_boundary : Boundary,
   back_boundary : Boundary,
   category : SurfaceType, // optional,
   precalculated_front_convection_coef : number, // optional,
   precalculated_back_convection_coef : number, // optional,
}

name

The name of the surface

vertices

An array of Numbers representing the vertices of the surface. The length of this array must be divisible by 3.

construction

The name of the construction in the Model's Construction array

front_boundary

The Boundary in front of the Surface

back_boundary

The Boundary in back of the Surface

category (optional)

The Surface Category.

This field does not affect the simulations, as it was designed to be used based on conventions (see [SurfaceType] documentation). So, if no [SurfaceType] is assigned, we cannot tell you what to do.

precalculated_front_convection_coef (optional)

The front convection coefficient, in W/m2K

This value fixes the value, so the automatic calculations in SIMPLE have no effect.

precalculated_back_convection_coef (optional)

The back convection coefficient, in W/m2K

This value fixes the value, so the automatic calculations in SIMPLE have no effect.

API Access

// by name
let my_surface = surface(string);
// by index
let my_surface = surface(int);

API

The following properties are available for simulating control algorithms

Property
front_temperature
back_temperature
front_convection_coefficient
back_convection_coefficient
front_convective_heat_flow
back_convective_heat_flow
front_incident_solar_irradiance
back_incident_solar_irradiance
front_ir_irradiance
back_ir_irradiance

SurfaceType

The kind of surface, useful for pre- and post-processing.

This information does not affect the simulation outcome. For example, SIMPLE will decide whether a wall is interior or exterior based on the boundaries, and will not check these labels. However, these labels can be useful for creating measures (e.g., insulate all the exterior walls)

Example

.json

"ExteriorWall"

Supported Variants

ExteriorWall

A Wall that connects a space with the exterior.

Full Specification
"ExteriorWall"

InteriorWall

A Wall connecting two spaces

Full Specification
"InteriorWall"

GroundFloor

A useful horizontal surface that touches the ground

Full Specification
"GroundFloor"

ExteriorFloor

A floor that leads to the exterior (e.g., a floor suspended by columns)

Full Specification
"ExteriorFloor"

InteriorFloor

Floor/ceiling that connects two spaces, and whose area is part of the
building or project being modelled. For instance, the top ceiling of an apartment is often, strictly speaking, an interior floor... but it is not part of the sellable area of the apartment itself

Full Specification
"InteriorFloor"

Ceiling

A floor/ceiling that connect two spaces, but whose area is not part of the area of the project/building (see the InteriorFloor variant).

Full Specification
"Ceiling"

Roof

A surfaces at the top of a building

Full Specification
"Roof"

Other

Other kind of surface

Full Specification
"Other"

TableShape

Shape of a table

Supported Variants

Other

Other kind of table

Full Specification
"Other"

Rectangular

Rectangular

Full Specification
"Rectangular"

Circular

Circular

Full Specification
"Circular"

LShaped

L-Shaped

Full Specification
"LShaped"

TableType

Type of a table

Supported Variants

Other

Other kind of table

Full Specification
"Other"

Dining

Dining table

Full Specification
"Dining"

Coffee

Cofee table

Full Specification
"Coffee"

TerrainClass

This class modifies the wind speed in the site

Supported Variants

Country

Describes a Flat, Open Country

Full Specification
"Country"

Suburbs

Describes a Rough, Wooded Country or Suburb

Full Specification
"Suburbs"

City

Describes Towns, City Outskirts, and centers of large cities

Full Specification
"City"

Ocean

Describes sites next to the Ocean or Bayou Flat

Full Specification
"Ocean"

Urban

Describes Urban, Industrual or Forest terrain

Full Specification
"Urban"