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:
- Allow for a holistic building performance simulation using best-practice algorithms for each domain
- Make it easier to account for the complex interactions between Humans and Buildings
- Make it possible to implement complex algorithms, such as Model Predictive Control.
- Be deployable in multiple environments, including Windows, Linux and Mac, the cloud, the browser (i.e., WebAssembly)
- 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:
- 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 ofSIMPLE
. - 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.
- Historical perspective, referring to the motivations and drivers that determined its design and motivated me to develop it.
- 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:
- 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.
- 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
- 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 simulation | Thermal simulation |
---|---|
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.
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
- Gathering a bunch of potential actions to take
- Execute each action, simulating some time into the future, record the results, and undo the changes.
- From the results of all actions, identify the best decision to take, if any.
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:
- Holistic simulations let us optimize multi-domain control algorithms that might lead to more optimal performance of buildings.
- 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:
- 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. - 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 howSIMPLE
's results compare to those of EnergyPlus, which performs this calculation in a very different manner.
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.
Environment | Example |
---|---|
Run locally | Being a pure RUST program, can be compiled to run on Windows, Linux and MacOS (has been tested on Linux and Mac). |
Web Assembly | Run it on a browser, without the need for servers. CHECK THIS EXAMPLE |
On the cloud | Embed 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 aSurface
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 thefenestrations
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 aFenestration
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 aFenestration
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 Space
s 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 aSpace
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 () | () |
---|---|
10 | 0.222 |
20 | 0.338 |
30 | 0.433 |
40 | 0.513 |
50 | 0.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 withsolar_transmitance
andvisible_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 aSubstance
of typeGas
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 aBuilding
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"