From 3d9db5056bbc23f1cd7e5e8ae92829fd15460437 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 12 Mar 2021 15:13:29 -0500 Subject: [PATCH 01/32] Improvements to the EnergyPlusExe class (#142) * docstring * Fixes an issue where EnergyPlusExe.cmd would display parameters that are None * improves docstring for EnergyPlusExe * Exposes EnergyPlusExe to __init__ --- archetypal/eplus_interface/__init__.py | 3 +- archetypal/eplus_interface/energy_plus.py | 37 ++++++++++------------- archetypal/idfclass/idf.py | 4 +-- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/archetypal/eplus_interface/__init__.py b/archetypal/eplus_interface/__init__.py index 16c08ef8..d4933e68 100644 --- a/archetypal/eplus_interface/__init__.py +++ b/archetypal/eplus_interface/__init__.py @@ -8,6 +8,7 @@ "EnergyPlusVersionError", "EnergyPlusWeatherError", "BasementThread", + "EnergyPlusExe", "EnergyPlusThread", "ExpandObjectsThread", "SlabThread", @@ -16,7 +17,7 @@ ] from .basement import BasementThread -from .energy_plus import EnergyPlusProgram, EnergyPlusThread +from .energy_plus import EnergyPlusProgram, EnergyPlusThread, EnergyPlusExe from .exceptions import ( EnergyPlusProcessError, EnergyPlusVersionError, diff --git a/archetypal/eplus_interface/energy_plus.py b/archetypal/eplus_interface/energy_plus.py index 13e5e799..90ae10fe 100644 --- a/archetypal/eplus_interface/energy_plus.py +++ b/archetypal/eplus_interface/energy_plus.py @@ -56,33 +56,28 @@ def __init__( ): """ Args: + idfname (str): + epw (str): Weather file path (default: in.epw in current directory)) + output-directory (str): Output directory path (default: current directory) + ep_version (archetypal.EnergyPlusVersion): The version of energyplus + executable. annual (bool): Force annual simulation. (default: False) - convert (bool): Output IDF->epJSON or epJSON->IDF, dependent on - input + convert (bool): Output IDF->epJSON or epJSON->IDF, dependent on input file type. (default: False) - output-directory (str): Output directory path (default: current - directory) - ep_version (archetypal.EnergyPlusVersion): The version of - energyplus executable. - design-day (bool): Force design-day-only simulation. (default: - False) + design_day (bool): Force design-day-only simulation. (default: False) help (bool): Display help information idd (str) :Input data dictionary path (default: Energy+.idd in - executable directory) + executable directory) epmacro (bool): Run EPMacro prior to simulation. (default: True) - output-prefix (str): Prefix for output file names (default: eplus) + output_prefix (str): Prefix for output file names (default: eplus) readvars (bool): Run ReadVarsESO after simulation. (default: True) - output-suffix (str): Suffix style for output file names ( - default: L) - -L: Legacy (e.g., eplustbl.csv) - -C: Capital (e.g., eplusTable.csv) - -D: Dash (e.g., eplus-table.csv) + output_suffix (str): Suffix style for output file names ( + default: L) + -L: Legacy (e.g., eplustbl.csv) + -C: Capital (e.g., eplusTable.csv) + -D: Dash (e.g., eplus-table.csv) version (bool): Display version information (default: False) - epw (str): Weather file path (default: in.epw in current - directory)) - expandobjects (bool): Run ExpandObjects prior to simulation. ( - default: - True) + expandobjects (bool): Run ExpandObjects prior to simulation. (default: True) """ self.a = annual self.c = convert @@ -130,7 +125,7 @@ def __repr__(self): if isinstance(value, bool): cmd.append(f"-{key}") if value else None else: - cmd.extend([f"-{key}", value]) + cmd.extend([f"-{key}", value]) if value is not None else None cmd.append(self.idfname) return cmd diff --git a/archetypal/idfclass/idf.py b/archetypal/idfclass/idf.py index 1138277c..485da9ae 100644 --- a/archetypal/idfclass/idf.py +++ b/archetypal/idfclass/idf.py @@ -1426,12 +1426,12 @@ def upgrade(self, to_version=None, overwrite=True): the updated file. The run is multiprocessing_safe. Hint: - If attempting to upgrade an earlier version of EnergyPlus ( pre-v7.2.0), + If attempting to upgrade an earlier version of EnergyPlus (pre-v7.2.0), specific binaries need to be downloaded and copied to the EnergyPlus*/PreProcess/IDFVersionUpdater folder. More info at `Converting older version files `_ . + /converting-older-version-files>`_. Args: to_version (str, optional): EnergyPlus version in the form "X-X-X". From 47a64e524b7666842faabba1b06953f7b1ed637c Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 12 Mar 2021 16:31:41 -0500 Subject: [PATCH 02/32] bump energy-pandas from 0.1.2 to 0.2.1 (#144) * Bump energy-pandas from 0.1.2 to 0.1.4 (#141) Bumps [energy-pandas](https://github.com/samuelduchesne/energy-pandas) from 0.1.2 to 0.1.4. - [Release notes](https://github.com/samuelduchesne/energy-pandas/releases) - [Commits](https://github.com/samuelduchesne/energy-pandas/compare/v0.1.2...v0.1.4) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * bump energy-pandas from 0.1.2 to 0.2.1 Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 19488c72..7a1e7252 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,5 +15,5 @@ click outdated deprecation sigfig -energy-pandas==0.1.2 +energy-pandas==0.2.1 setuptools_scm From 0e70d1033d2f78083a1f6aa83985e966810c05ad Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 12 Mar 2021 16:34:53 -0500 Subject: [PATCH 03/32] The ZoneGraph class was refactored into its own module (#143) * Removes deprecated command since not supporting python2 anyways * Refactors the ZoneGraph class into it's own module * fixes invalid escape character * Optimizes imports * isort --- archetypal/cli.py | 13 +- archetypal/dataportal.py | 5 +- archetypal/eplus_interface/basement.py | 8 +- archetypal/eplus_interface/transition.py | 2 +- archetypal/idfclass/extensions.py | 2 +- archetypal/idfclass/idf.py | 5 +- archetypal/idfclass/meters.py | 3 +- archetypal/idfclass/reports.py | 3 +- archetypal/idfclass/util.py | 4 +- archetypal/idfclass/variables.py | 2 +- archetypal/plot.py | 3 +- archetypal/reportdata.py | 2 +- archetypal/schedule.py | 4 +- archetypal/simple_glazing.py | 2 +- archetypal/tabulardata.py | 2 +- archetypal/template/building_template.py | 579 +----------------- archetypal/template/conditioning.py | 7 +- archetypal/template/dhw.py | 3 +- archetypal/template/glazing_material.py | 2 +- archetypal/template/load.py | 9 +- archetypal/template/opaque_material.py | 2 +- archetypal/template/schedule.py | 3 +- archetypal/template/umi_base.py | 4 +- archetypal/template/ventilation.py | 6 +- archetypal/template/window.py | 3 +- archetypal/template/zone_construction_set.py | 3 +- archetypal/template/zonedefinition.py | 3 +- archetypal/utils.py | 21 +- archetypal/zone_graph.py | 581 +++++++++++++++++++ docs/conf.py | 4 +- docs/examples/doe_conversion.py | 2 +- docs/examples/parallel_process.py | 3 +- setup.py | 4 +- tests/test_cli.py | 1 - tests/test_simple_glazing.py | 2 - tests/test_template.py | 117 ---- tests/test_zonegraph.py | 129 ++++ 37 files changed, 776 insertions(+), 772 deletions(-) create mode 100644 archetypal/zone_graph.py create mode 100644 tests/test_zonegraph.py diff --git a/archetypal/cli.py b/archetypal/cli.py index c3df55da..db38404f 100644 --- a/archetypal/cli.py +++ b/archetypal/cli.py @@ -10,18 +10,11 @@ import click from path import Path -from archetypal import ( - UmiTemplateLibrary, - __version__, - config, - docstring_parameter, - log, - parallel_process, - settings, - timeit, -) +from archetypal import __version__, settings from archetypal.idfclass import IDF from archetypal.settings import ep_version +from archetypal.umi_template import UmiTemplateLibrary +from archetypal.utils import config, docstring_parameter, log, parallel_process, timeit from .eplus_interface.exceptions import EnergyPlusVersionError from .eplus_interface.version import EnergyPlusVersion, get_eplus_dirs diff --git a/archetypal/dataportal.py b/archetypal/dataportal.py index 14d5b662..bea29605 100644 --- a/archetypal/dataportal.py +++ b/archetypal/dataportal.py @@ -19,7 +19,8 @@ import pycountry as pycountry import requests -from archetypal import log, make_str, settings +from archetypal import settings +from archetypal.utils import log # scipy and sklearn are optional dependencies for faster nearest node search try: @@ -401,7 +402,7 @@ def save_to_cache(url, response_json): settings.cache_folder, os.extsep.join([filename, "json"]) ) # dump to json, and save to file - json_str = make_str(json.dumps(response_json)) + json_str = json.dumps(response_json) with io.open(cache_path_filename, "w", encoding="utf-8") as cache_file: cache_file.write(json_str) diff --git a/archetypal/eplus_interface/basement.py b/archetypal/eplus_interface/basement.py index 49dd1d97..a69cb531 100644 --- a/archetypal/eplus_interface/basement.py +++ b/archetypal/eplus_interface/basement.py @@ -10,13 +10,11 @@ from path import Path from tqdm import tqdm -from ..eplus_interface.exceptions import ( - EnergyPlusProcessError, - EnergyPlusVersionError, -) -from ..eplus_interface.version import EnergyPlusVersion from archetypal.utils import log +from ..eplus_interface.exceptions import EnergyPlusProcessError, EnergyPlusVersionError +from ..eplus_interface.version import EnergyPlusVersion + class BasementThread(Thread): """Basement program manager. diff --git a/archetypal/eplus_interface/transition.py b/archetypal/eplus_interface/transition.py index 7081aea0..1174695a 100644 --- a/archetypal/eplus_interface/transition.py +++ b/archetypal/eplus_interface/transition.py @@ -1,5 +1,6 @@ """Transition module.""" +import logging as lg import os import platform import re @@ -9,7 +10,6 @@ from io import StringIO from subprocess import CalledProcessError from threading import Thread -import logging as lg from eppy.runner.run_functions import paths_from_version from path import Path diff --git a/archetypal/idfclass/extensions.py b/archetypal/idfclass/extensions.py index 01a1e0cc..85555966 100644 --- a/archetypal/idfclass/extensions.py +++ b/archetypal/idfclass/extensions.py @@ -6,7 +6,7 @@ from eppy.EPlusInterfaceFunctions.eplusdata import Eplusdata, Idd, removecomment from geomeppy.patches import EpBunch -from archetypal import extend_class, log +from archetypal.utils import extend_class, log @extend_class(EpBunch) diff --git a/archetypal/idfclass/idf.py b/archetypal/idfclass/idf.py index 485da9ae..74de7287 100644 --- a/archetypal/idfclass/idf.py +++ b/archetypal/idfclass/idf.py @@ -22,6 +22,7 @@ import eppy import pandas as pd +from energy_pandas import EnergySeries from eppy.bunch_subclass import BadEPFieldError from eppy.easyopen import getiddfile from eppy.EPlusInterfaceFunctions.eplusdata import Eplusdata @@ -34,8 +35,6 @@ from tabulate import tabulate from tqdm import tqdm -from archetypal import ReportData, log, settings -from archetypal import EnergySeries from archetypal.eplus_interface.basement import BasementThread from archetypal.eplus_interface.energy_plus import EnergyPlusThread from archetypal.eplus_interface.exceptions import ( @@ -52,6 +51,8 @@ from archetypal.idfclass.reports import get_report from archetypal.idfclass.util import get_idf_version, hash_model from archetypal.idfclass.variables import Variables +from archetypal.reportdata import ReportData +from archetypal.utils import log, settings class IDF(geomIDF): diff --git a/archetypal/idfclass/meters.py b/archetypal/idfclass/meters.py index 0525eae7..c09d048a 100644 --- a/archetypal/idfclass/meters.py +++ b/archetypal/idfclass/meters.py @@ -3,11 +3,12 @@ import inspect import pandas as pd +from energy_pandas import EnergySeries from geomeppy.patches import EpBunch from tabulate import tabulate -from archetypal import EnergySeries, ReportData from archetypal.idfclass.extensions import bunch2db +from archetypal.reportdata import ReportData class Meter: diff --git a/archetypal/idfclass/reports.py b/archetypal/idfclass/reports.py index 69fcf0f0..dca12895 100644 --- a/archetypal/idfclass/reports.py +++ b/archetypal/idfclass/reports.py @@ -5,8 +5,9 @@ import pandas as pd -from archetypal import log, settings +from archetypal import settings from archetypal.idfclass.util import hash_model +from archetypal.utils import log def get_report( diff --git a/archetypal/idfclass/util.py b/archetypal/idfclass/util.py index 7f6dc94e..522f907c 100644 --- a/archetypal/idfclass/util.py +++ b/archetypal/idfclass/util.py @@ -4,12 +4,12 @@ import os from collections import OrderedDict from io import StringIO -from path import Path import eppy from eppy.EPlusInterfaceFunctions import parse_idd +from path import Path -from archetypal import log +from archetypal.utils import log def hash_model(idfname, **kwargs): diff --git a/archetypal/idfclass/variables.py b/archetypal/idfclass/variables.py index e884909b..7cf6d59c 100644 --- a/archetypal/idfclass/variables.py +++ b/archetypal/idfclass/variables.py @@ -1,9 +1,9 @@ """EnergyPlus variables module.""" import pandas as pd +from energy_pandas import EnergyDataFrame from geomeppy.patches import EpBunch -from archetypal import EnergyDataFrame from archetypal.idfclass.extensions import bunch2db from archetypal.reportdata import ReportData diff --git a/archetypal/plot.py b/archetypal/plot.py index 6944f0b1..accdebb0 100644 --- a/archetypal/plot.py +++ b/archetypal/plot.py @@ -18,7 +18,8 @@ import numpy as np -from archetypal import log, settings +from archetypal import settings +from archetypal.utils import log def save_and_show( diff --git a/archetypal/reportdata.py b/archetypal/reportdata.py index ef2c3101..241cae48 100644 --- a/archetypal/reportdata.py +++ b/archetypal/reportdata.py @@ -8,7 +8,7 @@ from pandas import DataFrame, read_sql_query, to_numeric from path import Path -from archetypal import log +from archetypal.utils import log class ReportData(DataFrame): diff --git a/archetypal/schedule.py b/archetypal/schedule.py index 912e8db7..87ca7b0e 100644 --- a/archetypal/schedule.py +++ b/archetypal/schedule.py @@ -14,10 +14,10 @@ import numpy as np import pandas as pd +from energy_pandas import EnergySeries from eppy.bunch_subclass import EpBunch from numpy import ndarray -from archetypal import EnergySeries from archetypal.utils import log @@ -124,7 +124,7 @@ def constant_schedule( **kwargs: """ if not idf: - from archetypal import IDF + from archetypal.idfclass.idf import IDF idf = IDF(prep_outputs=False) # Add the schedule to the existing idf diff --git a/archetypal/simple_glazing.py b/archetypal/simple_glazing.py index 452e5533..4e3b6846 100644 --- a/archetypal/simple_glazing.py +++ b/archetypal/simple_glazing.py @@ -11,7 +11,7 @@ import numpy as np -from archetypal import log +from archetypal.utils import log def calc_simple_glazing(shgc, u_factor, visible_transmittance=None): diff --git a/archetypal/tabulardata.py b/archetypal/tabulardata.py index 7f22170f..301d2aee 100644 --- a/archetypal/tabulardata.py +++ b/archetypal/tabulardata.py @@ -4,7 +4,7 @@ import numpy as np import pandas as pd -from archetypal import log +from archetypal.utils import log class TabularData(pd.DataFrame): diff --git a/archetypal/template/building_template.py b/archetypal/template/building_template.py index 9f0bb5ed..98073da6 100644 --- a/archetypal/template/building_template.py +++ b/archetypal/template/building_template.py @@ -8,23 +8,18 @@ import collections import logging as lg import time -from collections import defaultdict from copy import copy from itertools import chain, repeat -import matplotlib.collections -import matplotlib.colors import networkx -import tabulate from deprecation import deprecated -from eppy.bunch_subclass import EpBunch from path import Path from sigfig import round from tqdm import tqdm import archetypal -from archetypal import log, save_and_show from archetypal.template import ( + DomesticHotWaterSetting, MassRatio, MaterialLayer, StructureInformation, @@ -32,11 +27,8 @@ WindowSetting, YearSchedulePart, ZoneDefinition, - is_core, - resolve_obco, - DomesticHotWaterSetting, ) -from archetypal.utils import reduce +from archetypal.utils import log, reduce class BuildingTemplate(UmiBase): @@ -315,7 +307,7 @@ def _graph_reduce(self, G): :func:`operator.add` method. Args: - G (ZoneGraph): + G (archetypal.zone_graph.ZoneGraph): Returns: ZoneDefinition: The reduced zone @@ -441,568 +433,3 @@ def get_ref(self, ref): ) -def add_to_report(adj_report, zone, surface, adj_zone, adj_surf, counter): - """ - Args: - adj_report (dict): the report dict to append to. - zone (EpBunch): - surface (EpBunch): - adj_zone (EpBunch): - adj_surf (EpBunch): - counter (int): Counter. - """ - adj_report["#"].append(counter) - adj_report["Zone Name"].append(zone.Name) - adj_report["Surface Type"].append(surface["Surface_Type"]) - adj_report["Adjacent Zone"].append(adj_zone["Name"]) - adj_report["Surface Type_"].append(adj_surf["Surface_Type"]) - - -class ZoneGraph(networkx.Graph): - """A subclass of :class:`networkx.Graph`. This class implements useful - methods to visualize and navigate a template along the thermal adjacency of - its zones. - - There are currently two methods to visualize the graph: - - - :func:`plot in 3d ` to get a 3-dimensional view of the - building. - - :func:`plot in 2d ` to get a 2-dimensional view of the - building zones - - Note: - A Graph stores nodes and edges with optional data, or attributes. - - Graphs hold undirected edges. Self loops are allowed but multiple - (parallel) edges are not. - - Nodes can be arbitrary (hashable) Python objects with optional key/value - attributes. By convention `None` is not used as a node. - - Edges are represented as links between nodes with optional key/value - attributes. - """ - - @classmethod - def from_idf(cls, idf, log_adj_report=True, **kwargs): - """Create a graph representation of all the building zones. An edge - between two zones represents the adjacency of the two zones. - - If skeleton is False, this method will create all the building - objects iteratively over the building zones. - - Args: - log_adj_report (bool, optional): If True, prints an adjacency report - in the log. - skeleton (bool, optional): If True, create a zone graph without - creating hierarchical objects, eg. zones > zoneloads > ect. - force (bool): If True, will recalculate the graph. - - Returns: - ZoneGraph: The building's zone graph object - """ - - start_time = time.time() - - G = cls(name=idf.name) - - counter = 0 - zone: EpBunch - for zone in tqdm( - idf.idfobjects["ZONE"], desc="zone_loop", position=idf.position, **kwargs - ): - # initialize the adjacency report dictionary. default list. - adj_report = defaultdict(list) - zone_obj = None - zonesurfaces = zone.zonesurfaces - _is_core = is_core(zone) - G.add_node(zone.Name, epbunch=zone, core=_is_core, zone=zone_obj) - - for surface in zonesurfaces: - if surface.key.upper() in ["INTERNALMASS", "WINDOWSHADINGCONTROL"]: - # Todo deal with internal mass surfaces - pass - else: - adj_zone: EpBunch - adj_surf: EpBunch - adj_surf, adj_zone = resolve_obco(surface) - - if adj_zone and adj_surf: - counter += 1 - - zone_obj = None - _is_core = is_core(zone) - - # create node for adjacent zone - G.add_node( - zone.Name, epbunch=adj_zone, core=_is_core, zone=zone_obj - ) - try: - this_cstr = surface["Construction_Name"] - their_cstr = adj_surf["Construction_Name"] - is_diff_cstr = ( - surface["Construction_Name"] - != adj_surf["Construction_Name"] - ) - except: - this_cstr, their_cstr, is_diff_cstr = None, None, None - # create edge from this zone to the adjacent zone - G.add_edge( - zone.Name, - adj_zone.Name, - this_cstr=this_cstr, - their_cstr=their_cstr, - is_diff_cstr=is_diff_cstr, - ) - - add_to_report( - adj_report, zone, surface, adj_zone, adj_surf, counter - ) - else: - pass - if log_adj_report: - msg = "Printing Adjacency Report for zone %s\n" % zone.Name - msg += tabulate.tabulate(adj_report, headers="keys") - log(msg) - - log("Created zone graph in {:,.2f} seconds".format(time.time() - start_time)) - log(networkx.info(G), lg.DEBUG) - return G - - def __init__(self, incoming_graph_data=None, **attr): - """Initialize a graph with edges, name, or graph attributes. - - Wrapper around the :class:`networkx.Graph` class. - - Args: - incoming_graph_data: input graph (optional, default: None) Data to - initialize graph. If None (default) an empty graph is created. - The data can be an edge list, or any NetworkX graph object. If - the corresponding optional Python packages are installed the - data can also be a NumPy matrix or 2d ndarray, a SciPy sparse - matrix, or a PyGraphviz graph. - attr: keyword arguments, optional (default= no attributes) - Attributes to add to graph as key=value pairs. - """ - super(ZoneGraph, self).__init__(incoming_graph_data=incoming_graph_data, **attr) - - def plot_graph3d( - self, - fig_height=None, - fig_width=6, - save=False, - show=True, - close=False, - ax=None, - axis_off=False, - cmap="plasma", - dpi=300, - file_format="png", - azim=-60, - elev=30, - proj_type="persp", - filename=None, - annotate=False, - plt_style="ggplot", - ): - """Plot the :class:`archetypal.template.ZoneGraph` in a 3D plot. - - The size of the node is relative to its - :func:`networkx.Graph.degree`. The node degree is the number of edges - adjacent to the node. - - The nodes are positioned in 3d space according to the mean value of - the surfaces centroids. For concave volumes, this corresponds to the - center of gravity of the volume. Some weird positioning can occur for - convex volumes. - - Todo: - Create an Example - - Args: - fig_height (float): matplotlib figure height in inches. - fig_width (float): matplotlib figure width in inches. - save (bool): if True, save the figure as an image file to disk. - show (bool): if True, show the figure. - close (bool): close the figure (only if show equals False) to - prevent display. - ax (matplotlib.axes._axes.Axes, optional): An existing axes object - on which to plot this graph. - axis_off (bool): If True, turn off the matplotlib axis. - cmap (str): The name a registered - :class:`matplotlib.colors.Colormap`. - dpi (int): the resolution of the image file if saving. - file_format (str): the format of the file to save (e.g., 'jpg', - 'png', 'svg', 'pdf') - azim (float): Azimuthal viewing angle, defaults to -60. - elev (float): Elevation viewing angle, defaults to 30. - proj_type (str): Type of projection, accepts 'persp' and 'ortho'. - filename (str): the name of the file if saving. - annotate (bool or str or tuple): If True, annotates the node with - the Zone Name. Pass an EpBunch *field_name* to retrieve data - from the zone EpBunch. Pass a tuple (data, key) to retrieve data - from the graph: eg. ('core', None) will retrieve the attribute - 'core' associated to the node. The second tuple element serves - as a key on the first: G.nodes(data=data)[key]. - plt_style (str, dict, or list): A style specification. Valid options - are: - str: The name of a style or a path/URL to a style file. - For a list of available style names, see `style.available` . - - dict: Dictionary with valid key/value pairs for - :attr:`matplotlib.rcParams`. - list: A list of style specifiers - (str or dict) applied from first to last in the list. - - Returns: - fig, ax: fig, ax - """ - import matplotlib.pyplot as plt - import numpy as np - from mpl_toolkits.mplot3d import Axes3D - - def avg(zone: EpBunch): - """calculate the zone centroid coordinates""" - x_, y_, z_, dem = 0, 0, 0, 0 - from geomeppy.geom.polygons import Polygon3D, Vector3D - from geomeppy.recipes import translate_coords - - ggr = zone.theidf.idfobjects["GLOBALGEOMETRYRULES"][0] - - for surface in zone.zonesurfaces: - if surface.key.upper() in ["INTERNALMASS", "WINDOWSHADINGCONTROL"]: - pass - else: - dem += 1 # Counter for average calc at return - if ggr.Coordinate_System.lower() == "relative": - # add zone origin to surface coordinates and create - # Polygon3D from updated coords. - zone = zone.theidf.getobject("ZONE", surface.Zone_Name) - poly3d = Polygon3D(surface.coords) - origin = (zone.X_Origin, zone.Y_Origin, zone.Z_Origin) - coords = translate_coords(poly3d, Vector3D(*origin)) - poly3d = Polygon3D(coords) - else: - # Polygon3D from surface coords - poly3d = Polygon3D(surface.coords) - x, y, z = poly3d.centroid - x_ += x - y_ += y - z_ += z - return x_ / dem, y_ / dem, z_ / dem - - # Get node positions in a dictionary - pos = {name: avg(epbunch) for name, epbunch in self.nodes(data="epbunch")} - - # Get the maximum number of edges adjacent to a single node - edge_max = max(1, max([self.degree[i] for i in self.nodes])) # min = 1 - - # Define color range proportional to number of edges adjacent to a - # single node - colors = { - i: plt.cm.get_cmap(cmap)(self.degree[i] / edge_max) for i in self.nodes - } - labels = {} - if annotate: - # annotate can be bool or str. - if isinstance(annotate, bool): - # if True, default to 'Name' field - annotate = "Name" - if isinstance(annotate, str): - # create dict of the form {id: (x, y, z, label, zdir)}. zdir is - # None by default. - labels = { - name: (*pos[name], data[annotate], None) - for name, data in self.nodes(data="epbunch") - } - if isinstance(annotate, tuple): - data, key = annotate - if key: - labels = { - name: (*pos[name], data[key], None) - for name, data in self.nodes(data=data) - } - else: - labels = { - name: (*pos[name], data, None) - for name, data in self.nodes(data=data) - } - - # 3D network plot - with plt.style.context(plt_style): - if fig_height is None: - fig_height = fig_width - - if ax: - fig = plt.gcf() - else: - fig = plt.figure(figsize=(fig_width, fig_height), dpi=dpi) - ax = Axes3D(fig) - - # Loop on the pos dictionary to extract the x,y,z coordinates of - # each node - for key, value in pos.items(): - xi = value[0] - yi = value[1] - zi = value[2] - - # Scatter plot - ax.scatter( - xi, - yi, - zi, - color=colors[key], - s=20 + 20 * self.degree[key], - edgecolors="k", - alpha=0.7, - ) - if annotate: - # Add node label - ax.text(*labels[key], fontsize=4) - # Loop on the list of edges to get the x,y,z, coordinates of the - # connected nodes - # Those two points are the extrema of the line to be plotted - for i, j in enumerate(self.edges()): - x = np.array((pos[j[0]][0], pos[j[1]][0])) - y = np.array((pos[j[0]][1], pos[j[1]][1])) - z = np.array((pos[j[0]][2], pos[j[1]][2])) - - # Plot the connecting lines - ax.plot(x, y, z, c="black", alpha=0.5) - - # Set the initial view - ax.view_init(elev, azim) - ax.set_proj_type(proj_type) - - # Hide the axes - if axis_off: - ax.set_axis_off() - - if filename is None: - filename = "unnamed" - - fig, ax = save_and_show( - fig=fig, - ax=ax, - save=save, - show=show, - close=close, - filename=filename, - file_format=file_format, - dpi=dpi, - axis_off=axis_off, - extent=None, - ) - return fig, ax - - def plot_graph2d( - self, - layout_function, - *func_args, - color_nodes=None, - fig_height=None, - fig_width=6, - node_labels_to_integers=False, - legend=False, - with_labels=True, - arrows=True, - save=False, - show=True, - close=False, - ax=None, - axis_off=False, - cmap="plasma", - dpi=300, - file_format="png", - filename="unnamed", - plt_style="ggplot", - extent="tight", - **kwargs, - ): - """Plot the adjacency of the zones as a graph. Choose a layout from the - :mod:`networkx.drawing.layout` module, the - :mod:`Graphviz AGraph (dot)` module, the - :mod:`Graphviz with pydot` module. Then, plot - the graph using matplotlib using the :mod:`networkx.drawing.py_lab` - - Examples: - >>> import networkx as nx - >>> G = BuildingTemplate().from_idf - >>> G.plot_graph2d(nx.nx_agraph.graphviz_layout, ('dot'), - >>> font_color='w', legend=True, font_size=8, - >>> color_nodes='core', - >>> node_labels_to_integers=True, - >>> plt_style='seaborn', save=True, - >>> filename='test') - - Args: - layout_function (func): One of the networkx layout functions. - *func_args: The layout function arguments as a tuple. The first - argument (self) is already supplied. - color_nodes (bool or str): False by default. If a string is passed - the nodes are colored according to a data attribute of the - graph. By default, the original node names is accessed with the - 'name' attribute. - fig_height (float): matplotlib figure height in inches. - fig_width (float): matplotlib figure width in inches. - node_labels_to_integers: - legend: - with_labels (bool, optional): Set to True to draw labels on the - arrows (bool, optional): If True, draw arrowheads. Note: Arrows will - be the same color as edges. - save (bool): if True, save the figure as an image file to disk. - show (bool): if True, show the figure. - close (bool): close the figure (only if show equals False) to - prevent display. - ax (matplotlib.axes._axes.Axes, optional): An existing axes object - on which to plot this graph. - axis_off (bool): If True, turn off the matplotlib axis. - cmap (str): The name a registered - :class:`matplotlib.colors.Colormap`. - dpi (int): the resolution of the image file if saving. - file_format (str): the format of the file to save (e.g., 'jpg', - 'png', 'svg', 'pdf') - filename (str): the name of the file if saving. - plt_style (str, dict, or list): A style specification. Valid options - are: - str: The name of a style or a path/URL to a style file. - For a list of available style names, see `style.available` . - - dict: Dictionary with valid key/value pairs for - :attr:`matplotlib.rcParams`. - list: A list of style specifiers - (str or dict) applied from first to last in the list. - extent: - **kwargs: keywords passed to :func:`networkx.draw_networkx` - - Returns: - (tuple): The fig and ax objects - """ - try: - import matplotlib.pyplot as plt - except ImportError: - raise ImportError("Matplotlib required for draw()") - except RuntimeError: - log("Matplotlib unable to open display", lg.WARNING) - raise - G = self.copy() - if node_labels_to_integers: - G = networkx.convert_node_labels_to_integers(G, label_attribute="name") - tree = networkx.dfs_tree(G) - pos = layout_function(tree, *func_args) - with plt.style.context((plt_style)): - if ax: - fig = plt.gcf() - else: - if fig_height is None: - fig_height = fig_width - fig, ax = plt.subplots(1, figsize=(fig_width, fig_height), dpi=dpi) - - if isinstance(color_nodes, str): - from itertools import count - - groups = set(networkx.get_node_attributes(G, color_nodes).values()) - mapping = dict(zip(sorted(groups), count())) - colors = [mapping[G.nodes[n][color_nodes]] for n in tree.nodes] - colors = [discrete_cmap(len(groups), cmap).colors[i] for i in colors] - font_color = kwargs.pop("font_color", None) - font_size = kwargs.pop("font_size", None) - paths_ = [] - for nt in tree: - # choose nodes and color for each iteration - nlist = [nt] - label = "%s: %s" % (nt, G.nodes(data="name")[nt]) - if color_nodes: - node_color = [colors[nt]] - else: - node_color = "#1f78b4" - # draw the graph - sc = networkx.draw_networkx_nodes( - tree, - pos=pos, - nodelist=nlist, - ax=ax, - node_color=node_color, - label=label, - cmap=cmap, - node_size=kwargs.get("node_size", 300), - node_shape=kwargs.get("node_shape", "o"), - alpha=kwargs.get("alpha", None), - vmin=kwargs.get("vmin", None), - vmax=kwargs.get("vmax", None), - linewidths=kwargs.get("linewidths", None), - edgecolors=kwargs.get("linewidths", None), - ) - paths_.extend(sc.get_paths()) - scatter = matplotlib.collections.PathCollection(paths_) - networkx.draw_networkx_edges(tree, pos, ax=ax, arrows=arrows, **kwargs) - if with_labels: - networkx.draw_networkx_labels( - G, - pos, - font_color=font_color, - font_size=font_size, - **kwargs, - ) - - if legend: - bbox = kwargs.get("bbox_to_anchor", (1, 1)) - legend1 = ax.legend( - title=color_nodes, bbox_to_anchor=bbox, markerscale=0.5 - ) - ax.add_artist(legend1) - - # clear axis - ax.axis("off") - - fig, ax = save_and_show( - fig=fig, - ax=ax, - save=save, - show=show, - close=close, - filename=filename, - file_format=file_format, - dpi=dpi, - axis_off=axis_off, - extent=extent, - ) - return fig, ax - - @property - def core_graph(self): - """Returns a copy of the ZoneGraph containing only core zones""" - nodes = [i for i, data in self.nodes(data="core") if data] - H = self.subgraph(nodes).copy() - H.name = "Core_" + self.name - return H - - @property - def perim_graph(self): - """Returns a copy of the ZoneGraph containing only perimeter zones""" - nodes = [i for i, data in self.nodes(data="core") if not data] - H = self.subgraph(nodes).copy() - H.name = "Perim_" + self.name - return H - - def info(self, node=None): - """Print short summary of information for the graph or the node n. - - Args: - node (any hashable): A node in the graph - """ - return log(networkx.info(G=self, n=node)) - - -def discrete_cmap(N, base_cmap=None): - """Create an N-bin discrete colormap from the specified input map - - Args: - N: - base_cmap: - """ - - # Note that if base_cmap is a string or None, you can simply do - # return plt.cm.get_cmap(base_cmap, N) - # The following works for string, None, or a colormap instance: - import matplotlib.pyplot as plt - from numpy.core.function_base import linspace - - base = plt.cm.get_cmap(base_cmap) - color_list = base(linspace(0, 1, N)) - cmap_name = base.name + str(N) - return matplotlib.colors.ListedColormap(color_list, cmap_name, N) diff --git a/archetypal/template/conditioning.py b/archetypal/template/conditioning.py index 85ad2d45..32068691 100644 --- a/archetypal/template/conditioning.py +++ b/archetypal/template/conditioning.py @@ -17,9 +17,10 @@ from sklearn.preprocessing import Binarizer import archetypal -from archetypal import ReportData, float_round, log, settings, timeit -from archetypal.schedule import get_year_for_first_weekday +from archetypal import settings +from archetypal.reportdata import ReportData from archetypal.template import UmiBase, UmiSchedule, UniqueName +from archetypal.utils import float_round, log, timeit class UmiBaseEnum(Enum): @@ -1077,7 +1078,7 @@ def _get_cop(zone, energy_in_list, energy_out_variable_name): sql for the energy given to the zone from the system (e.g. 'Air System Total Heating Energy') """ - from archetypal import ReportData + from archetypal.reportdata import ReportData rd = ReportData.from_sql_dict(zone.idf.sql()) energy_out = rd.filter_report_data(name=tuple(energy_out_variable_name)) diff --git a/archetypal/template/dhw.py b/archetypal/template/dhw.py index 2b3ece99..6b80dd88 100644 --- a/archetypal/template/dhw.py +++ b/archetypal/template/dhw.py @@ -13,8 +13,9 @@ from sigfig import round import archetypal -from archetypal import log, reduce, settings, timeit +from archetypal import settings from archetypal.template import UmiBase, UmiSchedule, UniqueName +from archetypal.utils import log, reduce, timeit class DomesticHotWaterSetting(UmiBase): diff --git a/archetypal/template/glazing_material.py b/archetypal/template/glazing_material.py index 631e8eb5..470f1c84 100644 --- a/archetypal/template/glazing_material.py +++ b/archetypal/template/glazing_material.py @@ -9,8 +9,8 @@ from sigfig import round -from archetypal import log from archetypal.template import MaterialBase, UmiBase, UniqueName +from archetypal.utils import log class GlazingMaterial(MaterialBase): diff --git a/archetypal/template/load.py b/archetypal/template/load.py index 89186546..29c11971 100644 --- a/archetypal/template/load.py +++ b/archetypal/template/load.py @@ -11,15 +11,14 @@ import sqlite3 from enum import Enum +import numpy as np import pandas as pd from deprecation import deprecated from sigfig import round -import archetypal -from archetypal import log, settings, timeit +from archetypal import __version__, settings from archetypal.template import UmiBase, UmiSchedule, UniqueName -from archetypal.utils import reduce -import numpy as np +from archetypal.utils import log, reduce, timeit class DimmingTypes(Enum): @@ -186,7 +185,7 @@ def __eq__(self, other): @deprecated( deprecated_in="1.3.1", removed_in="1.5", - current_version=archetypal.__version__, + current_version=__version__, details="Use from_dict function instead", ) def from_json(cls, *args, **kwargs): diff --git a/archetypal/template/opaque_material.py b/archetypal/template/opaque_material.py index 1a55d382..056aced9 100644 --- a/archetypal/template/opaque_material.py +++ b/archetypal/template/opaque_material.py @@ -10,8 +10,8 @@ import numpy as np from sigfig import round -from archetypal import log from archetypal.template import UmiBase, UniqueName +from archetypal.utils import log class OpaqueMaterial(UmiBase): diff --git a/archetypal/template/schedule.py b/archetypal/template/schedule.py index 850e1812..5445b3ba 100644 --- a/archetypal/template/schedule.py +++ b/archetypal/template/schedule.py @@ -14,8 +14,9 @@ from eppy.bunch_subclass import EpBunch import archetypal -from archetypal import Schedule, log +from archetypal.schedule import Schedule from archetypal.template import UmiBase, UniqueName +from archetypal.utils import log class UmiSchedule(Schedule, UmiBase): diff --git a/archetypal/template/umi_base.py b/archetypal/template/umi_base.py index 33bdd091..aff0fcb9 100644 --- a/archetypal/template/umi_base.py +++ b/archetypal/template/umi_base.py @@ -15,8 +15,8 @@ import numpy as np from sigfig import round -from archetypal import IDF, log -from archetypal.utils import lcm +from archetypal.idfclass.idf import IDF +from archetypal.utils import lcm, log def _resolve_combined_names(predecessors): diff --git a/archetypal/template/ventilation.py b/archetypal/template/ventilation.py index 94175927..28f168c1 100644 --- a/archetypal/template/ventilation.py +++ b/archetypal/template/ventilation.py @@ -13,9 +13,9 @@ from deprecation import deprecated from sigfig import round -import archetypal -from archetypal import log, settings, timeit, top, weighted_mean +from archetypal import __version__, settings from archetypal.template import UmiBase, UmiSchedule, UniqueName +from archetypal.utils import log, timeit, top, weighted_mean def resolve_temp(temp, idf): @@ -226,7 +226,7 @@ def __eq__(self, other): @deprecated( deprecated_in="1.3.1", removed_in="1.5", - current_version=archetypal.__version__, + current_version=__version__, details="Use from_dict function instead", ) def from_json(cls, *args, **kwargs): diff --git a/archetypal/template/window.py b/archetypal/template/window.py index 1d342460..c24f9438 100644 --- a/archetypal/template/window.py +++ b/archetypal/template/window.py @@ -9,11 +9,12 @@ from eppy.bunch_subclass import EpBunch import archetypal -from archetypal import calc_simple_glazing, log, timeit +from archetypal.simple_glazing import calc_simple_glazing from archetypal.template import MaterialLayer, UmiSchedule, UniqueName from archetypal.template.gas_material import GasMaterial from archetypal.template.glazing_material import GlazingMaterial from archetypal.template.umi_base import UmiBase +from archetypal.utils import log, timeit class WindowType(Enum): diff --git a/archetypal/template/zone_construction_set.py b/archetypal/template/zone_construction_set.py index ab4829fa..c14d612a 100644 --- a/archetypal/template/zone_construction_set.py +++ b/archetypal/template/zone_construction_set.py @@ -3,8 +3,9 @@ from deprecation import deprecated -from archetypal import __version__, log, reduce, timeit +from archetypal import __version__ from archetypal.template import OpaqueConstruction, UmiBase, UniqueName +from archetypal.utils import log, reduce, timeit class ZoneConstructionSet(UmiBase): diff --git a/archetypal/template/zonedefinition.py b/archetypal/template/zonedefinition.py index de8b9536..33267d98 100644 --- a/archetypal/template/zonedefinition.py +++ b/archetypal/template/zonedefinition.py @@ -18,7 +18,7 @@ from geomeppy.geom.polygons import Polygon3D from sigfig import round -from archetypal import __version__, log, settings +from archetypal import __version__ from archetypal.template import ( DomesticHotWaterSetting, OpaqueConstruction, @@ -30,6 +30,7 @@ ZoneConstructionSet, ZoneLoad, ) +from archetypal.utils import log, settings class InternalMass(object): diff --git a/archetypal/utils.py b/archetypal/utils.py index f658e05b..15e029f0 100644 --- a/archetypal/utils.py +++ b/archetypal/utils.py @@ -155,7 +155,7 @@ def log( # convert message to ascii for console display so it doesn't break # windows terminals message = ( - unicodedata.normalize("NFKD", make_str(message)) + unicodedata.normalize("NFKD", str(message)) .encode("ascii", errors="replace") .decode() ) @@ -240,23 +240,6 @@ def close_logger(logger=None, level=None, name=None, filename=None, log_dir=None logger.removeHandler(handler) -def make_str(value): - """Convert a passed-in value to unicode if Python 2, or string if Python 3. - - Args: - value (any): the value to convert to unicode/string - - Returns: - unicode or string - """ - try: - # for python 2.x compatibility, use unicode - return np.unicode(value) - except NameError: - # python 3.x has no unicode type, so if error, use str type - return str(value) - - def load_umi_template_objects(filename): """Reads @@ -420,7 +403,7 @@ def layer_composition(row): def schedule_composition(row): - """Takes in a series with $id and \*_ScheduleDay_Name values and return an + """Takes in a series with $id and *_ScheduleDay_Name values and return an array of dict of the form {'$ref': ref} Args: diff --git a/archetypal/zone_graph.py b/archetypal/zone_graph.py new file mode 100644 index 00000000..aa2b8cea --- /dev/null +++ b/archetypal/zone_graph.py @@ -0,0 +1,581 @@ +import logging as lg +import time +from collections import defaultdict + +import matplotlib.collections +import matplotlib.colors +import networkx +import tabulate +from eppy.bunch_subclass import EpBunch +from tqdm import tqdm + +from archetypal.plot import save_and_show +from archetypal.template import is_core, resolve_obco +from archetypal.utils import log + + +def add_to_report(adj_report, zone, surface, adj_zone, adj_surf, counter): + """ + Args: + adj_report (dict): the report dict to append to. + zone (EpBunch): + surface (EpBunch): + adj_zone (EpBunch): + adj_surf (EpBunch): + counter (int): Counter. + """ + adj_report["#"].append(counter) + adj_report["Zone Name"].append(zone.Name) + adj_report["Surface Type"].append(surface["Surface_Type"]) + adj_report["Adjacent Zone"].append(adj_zone["Name"]) + adj_report["Surface Type_"].append(adj_surf["Surface_Type"]) + + +class ZoneGraph(networkx.Graph): + """A subclass of :class:`networkx.Graph`. This class implements useful + methods to visualize and navigate a template along the thermal adjacency of + its zones. + + There are currently two methods to visualize the graph: + + - :func:`plot in 3d ` to get a 3-dimensional view of the + building. + - :func:`plot in 2d ` to get a 2-dimensional view of the + building zones + + Note: + A Graph stores nodes and edges with optional data, or attributes. + + Graphs hold undirected edges. Self loops are allowed but multiple + (parallel) edges are not. + + Nodes can be arbitrary (hashable) Python objects with optional key/value + attributes. By convention `None` is not used as a node. + + Edges are represented as links between nodes with optional key/value + attributes. + """ + + @classmethod + def from_idf(cls, idf, log_adj_report=True, **kwargs): + """Create a graph representation of all the building zones. An edge + between two zones represents the adjacency of the two zones. + + If skeleton is False, this method will create all the building + objects iteratively over the building zones. + + Args: + log_adj_report (bool, optional): If True, prints an adjacency report + in the log. + skeleton (bool, optional): If True, create a zone graph without + creating hierarchical objects, eg. zones > zoneloads > ect. + force (bool): If True, will recalculate the graph. + + Returns: + ZoneGraph: The building's zone graph object + """ + + start_time = time.time() + + G = cls(name=idf.name) + + counter = 0 + zone: EpBunch + for zone in tqdm( + idf.idfobjects["ZONE"], desc="zone_loop", position=idf.position, **kwargs + ): + # initialize the adjacency report dictionary. default list. + adj_report = defaultdict(list) + zone_obj = None + zonesurfaces = zone.zonesurfaces + _is_core = is_core(zone) + G.add_node(zone.Name, epbunch=zone, core=_is_core, zone=zone_obj) + + for surface in zonesurfaces: + if surface.key.upper() in ["INTERNALMASS", "WINDOWSHADINGCONTROL"]: + # Todo deal with internal mass surfaces + pass + else: + adj_zone: EpBunch + adj_surf: EpBunch + adj_surf, adj_zone = resolve_obco(surface) + + if adj_zone and adj_surf: + counter += 1 + + zone_obj = None + _is_core = is_core(zone) + + # create node for adjacent zone + G.add_node( + zone.Name, epbunch=adj_zone, core=_is_core, zone=zone_obj + ) + try: + this_cstr = surface["Construction_Name"] + their_cstr = adj_surf["Construction_Name"] + is_diff_cstr = ( + surface["Construction_Name"] + != adj_surf["Construction_Name"] + ) + except: + this_cstr, their_cstr, is_diff_cstr = None, None, None + # create edge from this zone to the adjacent zone + G.add_edge( + zone.Name, + adj_zone.Name, + this_cstr=this_cstr, + their_cstr=their_cstr, + is_diff_cstr=is_diff_cstr, + ) + + add_to_report( + adj_report, zone, surface, adj_zone, adj_surf, counter + ) + else: + pass + if log_adj_report: + msg = "Printing Adjacency Report for zone %s\n" % zone.Name + msg += tabulate.tabulate(adj_report, headers="keys") + log(msg) + + log("Created zone graph in {:,.2f} seconds".format(time.time() - start_time)) + log(networkx.info(G), lg.DEBUG) + return G + + def __init__(self, incoming_graph_data=None, **attr): + """Initialize a graph with edges, name, or graph attributes. + + Wrapper around the :class:`networkx.Graph` class. + + Args: + incoming_graph_data: input graph (optional, default: None) Data to + initialize graph. If None (default) an empty graph is created. + The data can be an edge list, or any NetworkX graph object. If + the corresponding optional Python packages are installed the + data can also be a NumPy matrix or 2d ndarray, a SciPy sparse + matrix, or a PyGraphviz graph. + attr: keyword arguments, optional (default= no attributes) + Attributes to add to graph as key=value pairs. + """ + super(ZoneGraph, self).__init__(incoming_graph_data=incoming_graph_data, **attr) + + def plot_graph3d( + self, + fig_height=None, + fig_width=6, + save=False, + show=True, + close=False, + ax=None, + axis_off=False, + cmap="plasma", + dpi=300, + file_format="png", + azim=-60, + elev=30, + proj_type="persp", + filename=None, + annotate=False, + plt_style="ggplot", + ): + """Plot the :class:`archetypal.template.ZoneGraph` in a 3D plot. + + The size of the node is relative to its + :func:`networkx.Graph.degree`. The node degree is the number of edges + adjacent to the node. + + The nodes are positioned in 3d space according to the mean value of + the surfaces centroids. For concave volumes, this corresponds to the + center of gravity of the volume. Some weird positioning can occur for + convex volumes. + + Todo: + Create an Example + + Args: + fig_height (float): matplotlib figure height in inches. + fig_width (float): matplotlib figure width in inches. + save (bool): if True, save the figure as an image file to disk. + show (bool): if True, show the figure. + close (bool): close the figure (only if show equals False) to + prevent display. + ax (matplotlib.axes._axes.Axes, optional): An existing axes object + on which to plot this graph. + axis_off (bool): If True, turn off the matplotlib axis. + cmap (str): The name a registered + :class:`matplotlib.colors.Colormap`. + dpi (int): the resolution of the image file if saving. + file_format (str): the format of the file to save (e.g., 'jpg', + 'png', 'svg', 'pdf') + azim (float): Azimuthal viewing angle, defaults to -60. + elev (float): Elevation viewing angle, defaults to 30. + proj_type (str): Type of projection, accepts 'persp' and 'ortho'. + filename (str): the name of the file if saving. + annotate (bool or str or tuple): If True, annotates the node with + the Zone Name. Pass an EpBunch *field_name* to retrieve data + from the zone EpBunch. Pass a tuple (data, key) to retrieve data + from the graph: eg. ('core', None) will retrieve the attribute + 'core' associated to the node. The second tuple element serves + as a key on the first: G.nodes(data=data)[key]. + plt_style (str, dict, or list): A style specification. Valid options + are: - str: The name of a style or a path/URL to a style file. + For a list of available style names, see `style.available` . - + dict: Dictionary with valid key/value pairs for + :attr:`matplotlib.rcParams`. - list: A list of style specifiers + (str or dict) applied from first to last in the list. + + Returns: + fig, ax: fig, ax + """ + import matplotlib.pyplot as plt + import numpy as np + from mpl_toolkits.mplot3d import Axes3D + + def avg(zone: EpBunch): + """calculate the zone centroid coordinates""" + x_, y_, z_, dem = 0, 0, 0, 0 + from geomeppy.geom.polygons import Polygon3D, Vector3D + from geomeppy.recipes import translate_coords + + ggr = zone.theidf.idfobjects["GLOBALGEOMETRYRULES"][0] + + for surface in zone.zonesurfaces: + if surface.key.upper() in ["INTERNALMASS", "WINDOWSHADINGCONTROL"]: + pass + else: + dem += 1 # Counter for average calc at return + if ggr.Coordinate_System.lower() == "relative": + # add zone origin to surface coordinates and create + # Polygon3D from updated coords. + zone = zone.theidf.getobject("ZONE", surface.Zone_Name) + poly3d = Polygon3D(surface.coords) + origin = (zone.X_Origin, zone.Y_Origin, zone.Z_Origin) + coords = translate_coords(poly3d, Vector3D(*origin)) + poly3d = Polygon3D(coords) + else: + # Polygon3D from surface coords + poly3d = Polygon3D(surface.coords) + x, y, z = poly3d.centroid + x_ += x + y_ += y + z_ += z + return x_ / dem, y_ / dem, z_ / dem + + # Get node positions in a dictionary + pos = {name: avg(epbunch) for name, epbunch in self.nodes(data="epbunch")} + + # Get the maximum number of edges adjacent to a single node + edge_max = max(1, max([self.degree[i] for i in self.nodes])) # min = 1 + + # Define color range proportional to number of edges adjacent to a + # single node + colors = { + i: plt.cm.get_cmap(cmap)(self.degree[i] / edge_max) for i in self.nodes + } + labels = {} + if annotate: + # annotate can be bool or str. + if isinstance(annotate, bool): + # if True, default to 'Name' field + annotate = "Name" + if isinstance(annotate, str): + # create dict of the form {id: (x, y, z, label, zdir)}. zdir is + # None by default. + labels = { + name: (*pos[name], data[annotate], None) + for name, data in self.nodes(data="epbunch") + } + if isinstance(annotate, tuple): + data, key = annotate + if key: + labels = { + name: (*pos[name], data[key], None) + for name, data in self.nodes(data=data) + } + else: + labels = { + name: (*pos[name], data, None) + for name, data in self.nodes(data=data) + } + + # 3D network plot + with plt.style.context(plt_style): + if fig_height is None: + fig_height = fig_width + + if ax: + fig = plt.gcf() + else: + fig = plt.figure(figsize=(fig_width, fig_height), dpi=dpi) + ax = Axes3D(fig) + + # Loop on the pos dictionary to extract the x,y,z coordinates of + # each node + for key, value in pos.items(): + xi = value[0] + yi = value[1] + zi = value[2] + + # Scatter plot + ax.scatter( + xi, + yi, + zi, + color=colors[key], + s=20 + 20 * self.degree[key], + edgecolors="k", + alpha=0.7, + ) + if annotate: + # Add node label + ax.text(*labels[key], fontsize=4) + # Loop on the list of edges to get the x,y,z, coordinates of the + # connected nodes + # Those two points are the extrema of the line to be plotted + for i, j in enumerate(self.edges()): + x = np.array((pos[j[0]][0], pos[j[1]][0])) + y = np.array((pos[j[0]][1], pos[j[1]][1])) + z = np.array((pos[j[0]][2], pos[j[1]][2])) + + # Plot the connecting lines + ax.plot(x, y, z, c="black", alpha=0.5) + + # Set the initial view + ax.view_init(elev, azim) + ax.set_proj_type(proj_type) + + # Hide the axes + if axis_off: + ax.set_axis_off() + + if filename is None: + filename = "unnamed" + + fig, ax = save_and_show( + fig=fig, + ax=ax, + save=save, + show=show, + close=close, + filename=filename, + file_format=file_format, + dpi=dpi, + axis_off=axis_off, + extent=None, + ) + return fig, ax + + def plot_graph2d( + self, + layout_function, + *func_args, + color_nodes=None, + fig_height=None, + fig_width=6, + node_labels_to_integers=False, + legend=False, + with_labels=True, + arrows=True, + save=False, + show=True, + close=False, + ax=None, + axis_off=False, + cmap="plasma", + dpi=300, + file_format="png", + filename="unnamed", + plt_style="ggplot", + extent="tight", + **kwargs, + ): + """Plot the adjacency of the zones as a graph. Choose a layout from the + :mod:`networkx.drawing.layout` module, the + :mod:`Graphviz AGraph (dot)` module, the + :mod:`Graphviz with pydot` module. Then, plot + the graph using matplotlib using the :mod:`networkx.drawing.py_lab` + + Examples: + >>> import networkx as nx + >>> G = BuildingTemplate().from_idf + >>> G.plot_graph2d(nx.nx_agraph.graphviz_layout, ('dot'), + >>> font_color='w', legend=True, font_size=8, + >>> color_nodes='core', + >>> node_labels_to_integers=True, + >>> plt_style='seaborn', save=True, + >>> filename='test') + + Args: + layout_function (func): One of the networkx layout functions. + *func_args: The layout function arguments as a tuple. The first + argument (self) is already supplied. + color_nodes (bool or str): False by default. If a string is passed + the nodes are colored according to a data attribute of the + graph. By default, the original node names is accessed with the + 'name' attribute. + fig_height (float): matplotlib figure height in inches. + fig_width (float): matplotlib figure width in inches. + node_labels_to_integers: + legend: + with_labels (bool, optional): Set to True to draw labels on the + arrows (bool, optional): If True, draw arrowheads. Note: Arrows will + be the same color as edges. + save (bool): if True, save the figure as an image file to disk. + show (bool): if True, show the figure. + close (bool): close the figure (only if show equals False) to + prevent display. + ax (matplotlib.axes._axes.Axes, optional): An existing axes object + on which to plot this graph. + axis_off (bool): If True, turn off the matplotlib axis. + cmap (str): The name a registered + :class:`matplotlib.colors.Colormap`. + dpi (int): the resolution of the image file if saving. + file_format (str): the format of the file to save (e.g., 'jpg', + 'png', 'svg', 'pdf') + filename (str): the name of the file if saving. + plt_style (str, dict, or list): A style specification. Valid options + are: - str: The name of a style or a path/URL to a style file. + For a list of available style names, see `style.available` . - + dict: Dictionary with valid key/value pairs for + :attr:`matplotlib.rcParams`. - list: A list of style specifiers + (str or dict) applied from first to last in the list. + extent: + **kwargs: keywords passed to :func:`networkx.draw_networkx` + + Returns: + (tuple): The fig and ax objects + """ + try: + import matplotlib.pyplot as plt + except ImportError: + raise ImportError("Matplotlib required for draw()") + except RuntimeError: + log("Matplotlib unable to open display", lg.WARNING) + raise + G = self.copy() + if node_labels_to_integers: + G = networkx.convert_node_labels_to_integers(G, label_attribute="name") + tree = networkx.dfs_tree(G) + pos = layout_function(tree, *func_args) + with plt.style.context((plt_style)): + if ax: + fig = plt.gcf() + else: + if fig_height is None: + fig_height = fig_width + fig, ax = plt.subplots(1, figsize=(fig_width, fig_height), dpi=dpi) + + if isinstance(color_nodes, str): + from itertools import count + + groups = set(networkx.get_node_attributes(G, color_nodes).values()) + mapping = dict(zip(sorted(groups), count())) + colors = [mapping[G.nodes[n][color_nodes]] for n in tree.nodes] + colors = [discrete_cmap(len(groups), cmap).colors[i] for i in colors] + font_color = kwargs.pop("font_color", None) + font_size = kwargs.pop("font_size", None) + paths_ = [] + for nt in tree: + # choose nodes and color for each iteration + nlist = [nt] + label = getattr(nt, "Name", nt) + if color_nodes: + node_color = [colors[nt]] + else: + node_color = "#1f78b4" + # draw the graph + sc = networkx.draw_networkx_nodes( + tree, + pos=pos, + nodelist=nlist, + ax=ax, + node_color=node_color, + label=label, + cmap=cmap, + node_size=kwargs.pop("node_size", 300), + node_shape=kwargs.pop("node_shape", "o"), + alpha=kwargs.get("alpha", None), + vmin=kwargs.get("vmin", None), + vmax=kwargs.get("vmax", None), + linewidths=kwargs.get("linewidths", None), + edgecolors=kwargs.get("linewidths", None), + ) + paths_.extend(sc.get_paths()) + scatter = matplotlib.collections.PathCollection(paths_) + networkx.draw_networkx_edges(tree, pos, ax=ax, arrows=arrows, **kwargs) + if with_labels: + networkx.draw_networkx_labels( + G, + pos, + font_color=font_color, + font_size=font_size, + **kwargs, + ) + + if legend: + bbox = kwargs.get("bbox_to_anchor", (1, 1)) + legend1 = ax.legend( + title=color_nodes, bbox_to_anchor=bbox, markerscale=0.5 + ) + ax.add_artist(legend1) + + # clear axis + ax.axis("off") + + fig, ax = save_and_show( + fig=fig, + ax=ax, + save=save, + show=show, + close=close, + filename=filename, + file_format=file_format, + dpi=dpi, + axis_off=axis_off, + extent=extent, + ) + return fig, ax + + @property + def core_graph(self): + """Returns a copy of the ZoneGraph containing only core zones""" + nodes = [i for i, data in self.nodes(data="core") if data] + H = self.subgraph(nodes).copy() + H.name = "Core_" + self.name + return H + + @property + def perim_graph(self): + """Returns a copy of the ZoneGraph containing only perimeter zones""" + nodes = [i for i, data in self.nodes(data="core") if not data] + H = self.subgraph(nodes).copy() + H.name = "Perim_" + self.name + return H + + def info(self, node=None): + """Print short summary of information for the graph or the node n. + + Args: + node (any hashable): A node in the graph + """ + return log(networkx.info(G=self, n=node)) + + +def discrete_cmap(N, base_cmap=None): + """Create an N-bin discrete colormap from the specified input map + + Args: + N: + base_cmap: + """ + + # Note that if base_cmap is a string or None, you can simply do + # return plt.cm.get_cmap(base_cmap, N) + # The following works for string, None, or a colormap instance: + import matplotlib.pyplot as plt + from numpy.core.function_base import linspace + + base = plt.cm.get_cmap(base_cmap) + color_list = base(linspace(0, 1, N)) + cmap_name = base.name + str(N) + return matplotlib.colors.ListedColormap(color_list, cmap_name, N) \ No newline at end of file diff --git a/docs/conf.py b/docs/conf.py index 2e7d14dc..a0f51d77 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -8,13 +8,15 @@ # -- Path setup -------------------------------------------------------------- +import datetime + # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # import os import sys -import datetime + from pkg_resources import get_distribution sys.path.insert(0, os.path.abspath(".")) diff --git a/docs/examples/doe_conversion.py b/docs/examples/doe_conversion.py index b01bf7db..48076165 100644 --- a/docs/examples/doe_conversion.py +++ b/docs/examples/doe_conversion.py @@ -4,7 +4,7 @@ from path import Path -from archetypal import UmiTemplateLibrary +from archetypal.umi_template import UmiTemplateLibrary if __name__ == "__main__": diff --git a/docs/examples/parallel_process.py b/docs/examples/parallel_process.py index 44350ff6..3b6440c0 100644 --- a/docs/examples/parallel_process.py +++ b/docs/examples/parallel_process.py @@ -1,7 +1,8 @@ import pandas as pd from path import Path -from archetypal import config, parallel_process, IDF +from archetypal.idfclass.idf import IDF +from archetypal.utils import config, parallel_process config(cache_folder="../../tests/.temp/cache", use_cache=True, log_console=True) diff --git a/setup.py b/setup.py index 3a831731..a0be7a83 100644 --- a/setup.py +++ b/setup.py @@ -1,12 +1,12 @@ # To use a consistent encoding import codecs +import os import re import sys -import os from os import path # Always prefer setuptools over distutils -from setuptools import setup, find_namespace_packages +from setuptools import find_namespace_packages, setup here = os.getcwd() diff --git a/tests/test_cli.py b/tests/test_cli.py index fefe54c8..cdbe99ab 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,6 +1,5 @@ import os -import click import pytest from click.testing import CliRunner from path import Path diff --git a/tests/test_simple_glazing.py b/tests/test_simple_glazing.py index d905ac72..53860b37 100644 --- a/tests/test_simple_glazing.py +++ b/tests/test_simple_glazing.py @@ -1,5 +1,3 @@ -import warnings - import pytest from archetypal.simple_glazing import calc_simple_glazing diff --git a/tests/test_template.py b/tests/test_template.py index 20c308ca..cc77fc19 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -14,7 +14,6 @@ YearSchedule, ZoneConstructionSet, ZoneDefinition, - ZoneGraph, calc_simple_glazing, ) from archetypal.template.umi_base import UniqueName, load_json_objects @@ -1537,7 +1536,6 @@ def test_zoneLoad_from_to_json(self, config, idf): import json from archetypal.template import ZoneLoad - from archetypal.utils import reduce filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" with open(filename, "r") as f: @@ -2399,121 +2397,6 @@ def test_building_template(self, bt): assert bt -class TestZoneGraph: - """Series of tests for the :class:`ZoneGraph` class""" - - def test_traverse_graph(self, small_office): - """ - Args: - small_office: - """ - - idf = small_office - - G = ZoneGraph.from_idf(idf, log_adj_report=False) - - assert G - - @pytest.fixture(scope="module") - def G(self, config, small_office): - """ - Args: - config: - small_office: - """ - - idf = small_office - yield ZoneGraph.from_idf(idf) - - @pytest.mark.parametrize("adj_report", [True, False]) - def test_graph(self, small_office, adj_report): - """Test the creation of a BuildingTemplate zone graph. Parametrize the - creation of the adjacency report - - Args: - small_office: - adj_report: - """ - import networkx as nx - - idf = small_office - - G1 = ZoneGraph.from_idf(idf, log_adj_report=adj_report) - assert not nx.is_empty(G1) - from eppy.bunch_subclass import EpBunch - - assert isinstance( - G1.nodes["Sp-Attic Sys-0 Flr-2 Sch-- undefined - HPlcmt-core ZN"][ - "epbunch" - ], - EpBunch, - ) - - def test_graph_info(self, G): - """test the info method on a ZoneGraph - - Args: - G: - """ - G.info() - - def test_viewgraph2d(self, G): - """test the visualization of the zonegraph in 2d - - Args: - G: - """ - import networkx as nx - - G.plot_graph2d( - nx.layout.circular_layout, - (1), - font_color="w", - legend=True, - font_size=8, - color_nodes="core", - node_labels_to_integers=True, - plt_style="seaborn", - save=False, - show=False, - filename="test", - ) - - @pytest.mark.parametrize("annotate", [True, "Name", ("core", None)]) - def test_viewgraph3d(self, G, annotate): - """test the visualization of the zonegraph in 3d - - Args: - G: - annotate: - """ - G.plot_graph3d( - annotate=annotate, - axis_off=True, - save=False, - show=False, - ) - - def test_core_graph(self, G): - """ - Args: - G: - """ - H = G.core_graph - - assert len(H) == 1 # assert G has no nodes since Warehouse does not have a - # core zone - - def test_perim_graph(self, G): - """ - Args: - G: - """ - H = G.perim_graph - - assert len(H) > 0 # assert G has at least one node - - class TestUniqueName(object): def test_uniquename(self): name1 = UniqueName("myname") diff --git a/tests/test_zonegraph.py b/tests/test_zonegraph.py new file mode 100644 index 00000000..d83177f7 --- /dev/null +++ b/tests/test_zonegraph.py @@ -0,0 +1,129 @@ +import pytest + +from archetypal import IDF +from archetypal.zone_graph import ZoneGraph + + +class TestZoneGraph: + """Series of tests for the :class:`ZoneGraph` class""" + + @pytest.fixture(scope="class") + def small_office(config): + file = ( + "tests/input_data/necb/NECB 2011-SmallOffice-NECB HDD " + "Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" + ) + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + idf = IDF(file, epw=w) + yield idf + + def test_traverse_graph(self, small_office): + """ + Args: + small_office: + """ + + idf = small_office + + G = ZoneGraph.from_idf(idf, log_adj_report=False) + + assert G + + @pytest.fixture(scope="class") + def G(self, config, small_office): + """ + Args: + config: + small_office: + """ + + idf = small_office + yield ZoneGraph.from_idf(idf) + + @pytest.mark.parametrize("adj_report", [True, False]) + def test_graph(self, small_office, adj_report): + """Test the creation of a BuildingTemplate zone graph. Parametrize the + creation of the adjacency report + + Args: + small_office: + adj_report: + """ + import networkx as nx + + idf = small_office + + G1 = ZoneGraph.from_idf(idf, log_adj_report=adj_report) + assert not nx.is_empty(G1) + from eppy.bunch_subclass import EpBunch + + assert isinstance( + G1.nodes["Sp-Attic Sys-0 Flr-2 Sch-- undefined - HPlcmt-core ZN"][ + "epbunch" + ], + EpBunch, + ) + + def test_graph_info(self, G): + """test the info method on a ZoneGraph + + Args: + G: + """ + G.info() + + def test_viewgraph2d(self, G): + """test the visualization of the zonegraph in 2d + + Args: + G: + """ + import networkx as nx + + G.plot_graph2d( + nx.layout.circular_layout, + (1), + font_color="w", + legend=True, + font_size=8, + color_nodes="core", + node_labels_to_integers=True, + plt_style="seaborn", + save=False, + show=False, + filename="test", + ) + + @pytest.mark.parametrize("annotate", [True, "Name", ("core", None)]) + def test_viewgraph3d(self, G, annotate): + """test the visualization of the zonegraph in 3d + + Args: + G: + annotate: + """ + G.plot_graph3d( + annotate=annotate, + axis_off=True, + save=False, + show=False, + ) + + def test_core_graph(self, G): + """ + Args: + G: + """ + H = G.core_graph + + assert len(H) == 1 # assert G has no nodes since Warehouse does not have a + # core zone + + def test_perim_graph(self, G): + """ + Args: + G: + """ + H = G.perim_graph + + assert len(H) > 0 # assert G has at least one node \ No newline at end of file From 3856738f080e79ac9718534d5efc2f651c8d1a27 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Mon, 15 Mar 2021 10:10:30 -0400 Subject: [PATCH 04/32] caches IDD, IDDINDEX and BLOCK values as class attributes by version id --- archetypal/idfclass/idf.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/archetypal/idfclass/idf.py b/archetypal/idfclass/idf.py index 74de7287..a27d3d90 100644 --- a/archetypal/idfclass/idf.py +++ b/archetypal/idfclass/idf.py @@ -64,6 +64,10 @@ class IDF(geomIDF): eppy.modeleditor.IDF class. """ + IDD = {} + IDDINDEX = {} + BLOCK = {} + # dependencies: dict of _dependencies = { "iddname": ["idfname", "as_version"], @@ -359,12 +363,15 @@ def setidd(self, iddinfo, iddindex, block, idd_version): def _read_idf(self): """Read idf file and return bunches.""" + self._idd_info = IDF.IDD.get(str(self.as_version), None) + self._idd_index = IDF.IDDINDEX.get(str(self.as_version), None) + self._block = IDF.BLOCK.get(str(self.as_version), None) bunchdt, block, data, commdct, idd_index, versiontuple = idfreader1( - self.idfname, self.iddname, self, commdct=None, block=None + self.idfname, self.iddname, self, commdct=self._idd_info, block=self._block ) - self._block = block - self._idd_info = commdct - self._idd_index = idd_index + self._block = IDF.BLOCK[str(self.as_version)] = block + self._idd_info = IDF.IDD[str(self.as_version)] = commdct + self._idd_index = IDF.IDDINDEX[str(self.as_version)] = idd_index self._idfobjects = bunchdt self._model = data self._idd_version = versiontuple From 7050f18de7f43765b05e7fa6483e8c1826f4d28d Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Mon, 15 Mar 2021 12:48:37 -0400 Subject: [PATCH 05/32] Adds outputtype as class parameter --- archetypal/idfclass/idf.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/archetypal/idfclass/idf.py b/archetypal/idfclass/idf.py index a27d3d90..d29b8303 100644 --- a/archetypal/idfclass/idf.py +++ b/archetypal/idfclass/idf.py @@ -68,6 +68,8 @@ class IDF(geomIDF): IDDINDEX = {} BLOCK = {} + OUTPUTTYPES = ("standard", "nocomment1", "nocomment2", "compressed") + # dependencies: dict of _dependencies = { "iddname": ["idfname", "as_version"], @@ -178,6 +180,7 @@ def __init__( position=0, name=None, output_directory=None, + outputtype="standard", **kwargs, ): """Initialize an IDF object. @@ -185,8 +188,7 @@ def __init__( Args: output_directory: idfname (str or os.PathLike): The path of the idf file to read. If none, - an in-memory - IDF object is generated. + an in-memory IDF object is generated. epw (str or os.PathLike): The weather-file. If None, epw can be specified in IDF.simulate(). as_version (str): Specify the target EnergyPlus version for the IDF model. @@ -199,6 +201,8 @@ def __init__( design_day (bool): Force design-day-only simulation (default: False). expandobjects (bool): Run ExpandObjects prior to simulation (default: True). convert (bool): If True, only convert IDF->epJSON or epJSON->IDF. + outputtype (str): Specifies the idf string representation of the model. + Choices are: "standard", "nocomment1", "nocomment2", "compressed". EnergyPlus args: tmp_dir=None, @@ -257,7 +261,7 @@ def __init__( self._sim_id = None self._sim_timestamp = None - self.outputtype = "standard" + self.outputtype = outputtype self.original_idfname = self.idfname # Save original try: @@ -281,6 +285,19 @@ def __init__( .apply() ) + @property + def outputtype(self): + return self._outputtype + + @outputtype.setter + def outputtype(self, value): + """Get or set the outputtype for the idf string representation of self.""" + assert value in self.OUTPUTTYPES, ( + f'Invalid input "{value}" for output_type.' + f"\nOutput type must be one of the following: {self.OUTPUTTYPES}" + ) + self._outputtype = value + def __str__(self): """Return the name of IDF model.""" return self.name From 5d7141fb2e0070969250dec4c109f759f032b33f Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Mon, 15 Mar 2021 17:08:11 -0400 Subject: [PATCH 06/32] Fixed an issue where EnergyPlusProcessError would raise an error When getting the name of an idf file for an in memory idf --- archetypal/eplus_interface/exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archetypal/eplus_interface/exceptions.py b/archetypal/eplus_interface/exceptions.py index 77dba9d9..03323a27 100644 --- a/archetypal/eplus_interface/exceptions.py +++ b/archetypal/eplus_interface/exceptions.py @@ -22,7 +22,7 @@ def __str__(self): try: name = self.idf.idfname.abspath() except Exception: - name = self.idf + name = self.idf.name msg = ":\n".join([name, self.stderr]) return msg From 75cbbedb709ac7820ed44f216059f8b6d25dd618 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Tue, 16 Mar 2021 21:40:22 -0400 Subject: [PATCH 07/32] Refactors OpaqueConstruction + added properties (#149) --- archetypal/template/opaque_construction.py | 249 +++++++++++++++------ archetypal/template/umi_base.py | 72 +++--- tests/test_template.py | 45 +++- 3 files changed, 268 insertions(+), 98 deletions(-) diff --git a/archetypal/template/opaque_construction.py b/archetypal/template/opaque_construction.py index 5a7c8afb..e7a6dd49 100644 --- a/archetypal/template/opaque_construction.py +++ b/archetypal/template/opaque_construction.py @@ -25,6 +25,14 @@ class ConstructionBase(UmiBase): -cycle-impact """ + __slots__ = ( + "_assembly_carbon", + "_assembly_cost", + "_assembly_energy", + "_dissassembly_carbon", + "_dissassembly_energy", + ) + def __init__( self, AssemblyCarbon=0, @@ -37,12 +45,12 @@ def __init__( """Initialize a ConstructionBase object with parameters: Args: - AssemblyCarbon: - AssemblyCost: - AssemblyEnergy: - DisassemblyCarbon: - DisassemblyEnergy: - **kwargs: + AssemblyCarbon (float): assembly carbon [kgCO2/m2]. + AssemblyCost (float): assembly carbon [kgCO2/m2]. + AssemblyEnergy (float): assembly energy [MJ/m2]. + DisassemblyCarbon (float): disassembly carbon [kgCO2/m2]. + DisassemblyEnergy (float): disassembly energy [MJ/m2]. + **kwargs: keywords passed to UmiBase. """ super(ConstructionBase, self).__init__(**kwargs) self.AssemblyCarbon = AssemblyCarbon @@ -51,6 +59,51 @@ def __init__( self.DisassemblyCarbon = DisassemblyCarbon self.DisassemblyEnergy = DisassemblyEnergy + @property + def AssemblyCarbon(self): + """Get or set the assembly carbon [kgCO2/m2].""" + return self._assembly_carbon + + @AssemblyCarbon.setter + def AssemblyCarbon(self, value): + self._assembly_carbon = float(value) + + @property + def AssemblyCost(self): + """Get or set the assembly cost [$/m2].""" + return self._assembly_cost + + @AssemblyCost.setter + def AssemblyCost(self, value): + self._assembly_cost = float(value) + + @property + def AssemblyEnergy(self): + """Get or set the assembly energy [MJ/m2].""" + return self._assembly_energy + + @AssemblyEnergy.setter + def AssemblyEnergy(self, value): + self._assembly_energy = float(value) + + @property + def DisassemblyCarbon(self): + """Get or set the disassembly carbon [kgCO2/m2].""" + return self._dissassembly_carbon + + @DisassemblyCarbon.setter + def DisassemblyCarbon(self, value): + self._dissassembly_carbon = float(value) + + @property + def DisassemblyEnergy(self): + """Get or set the disassembly energy [MJ/m2].""" + return self._dissassembly_energy + + @DisassemblyEnergy.setter + def DisassemblyEnergy(self, value): + self._dissassembly_energy = float(value) + def validate(self): """Validate object and fill in missing values.""" return self @@ -74,14 +127,16 @@ def get_ref(self, ref): class LayeredConstruction(ConstructionBase): - """Defines the layers of an :class:`OpaqueConstruction`. This class has one - attribute: + """Defines the layers of an :class:`OpaqueConstruction`. - 1. A list of :class:`MaterialLayer` objects. + Attributes: + Layers (list of MaterialLayer): List of MaterialLayer objects from + outside to inside. """ def __init__(self, Layers, **kwargs): - """ + """Initialize object. + Args: Layers (list of MaterialLayer): A list of :class:`MaterialLayer` objects. @@ -96,71 +151,92 @@ class OpaqueConstruction(LayeredConstruction): """Opaque Constructions .. image:: ../images/template/constructions-opaque.png + + Properties: + * r_value + * u_value + * r_factor + * u_factor + * equivalent_heat_capacity_per_unit_volume + * specific_heat + * heat_capacity_per_unit_wall_area + * total_thickness + * mass_per_unit_area + * timeconstant_per_unit_area + * solar_reflectance_index """ + __slots__ = () def __init__(self, Layers, **kwargs): """ Args: - Layers (list of MaterialLayer): + Layers (list of MaterialLayer): List of MaterialLayers making up the + construction. **kwargs: Other attributes passed to parent constructors such as - :class:`ConstructionBase` + :class:`ConstructionBase`. """ super(OpaqueConstruction, self).__init__(Layers, **kwargs) self.area = 1 - def __add__(self, other): - """Overload + to implement self.combine. + @property + def r_value(self): + """Get or set the thermal resistance [K⋅m2/W] (excluding air films). - Args: - other (OpaqueConstruction): The other OpaqueConstruction. + Note that, when setting the R-value, the thickness of the inferred insulation + layer will be adjusted. """ - return self.combine(other) + return sum([layer.r_value for layer in self.Layers]) - def __hash__(self): - return hash((self.__class__.__name__, getattr(self, "Name", None))) + @r_value.setter + def r_value(self, value): + # First, find the insulation layer + i = self.infer_insulation_layer() + all_layers_except_insulation_layer = [a for a in self.Layers] + all_layers_except_insulation_layer.pop(i) + insulation_layer: MaterialLayer = self.Layers[i] - def __eq__(self, other): - if not isinstance(other, OpaqueConstruction): - return NotImplemented - else: - return all([self.Layers == other.Layers]) + if value <= sum([a.r_value for a in all_layers_except_insulation_layer]): + raise ValueError( + f"Cannot set assembly r-value smaller than " + f"{sum([a.r_value for a in all_layers_except_insulation_layer])} " + f"because it would result in an insulation of a " + f"negative thickness. Try a higher value or changing the material " + f"layers instead." + ) - @property - def r_value(self): - """float: The Thermal Resistance of the :class:`OpaqueConstruction`""" - return sum([layer.r_value for layer in self.Layers]) # (K⋅m2/W) + alpha = float(value) / self.r_value + new_r_value = ( + ((alpha - 1) * sum([a.r_value for a in all_layers_except_insulation_layer])) + ) + alpha * insulation_layer.r_value + insulation_layer.r_value = new_r_value - def u_value(self, include_h=False, h_in=8.0, h_out=20.0): - """float: The overall heat transfer coefficient of the - :class:`OpaqueConstruction`. Expressed in W/(m2⋅K). + @property + def u_value(self): + """Construction heat transfer coefficient [W/m2⋅K] (excluding air films).""" + return 1 / self.r_value - Hint: - The U value of a composite wall made of n layers of uniform - thermophysical properties, surface area A and thermal resistance R - is defined as U=(A·R) :sup:`−1` and is calculated by the - expressionbased on the following expression: - :math:`{{U=}{{{1/h}}_{}{{+∑}}_{i=1}^n{{(δ}}_i{{/k}}_i{{)+1/h}}_∞}^{−1}}` + @property + def r_factor(self): + """Construction R-factor [m2-K/W] (including air films). - Args: - include_h (bool): If True, the convective heat transfer coefficients - are included in the u_value calc. - h_in (float): The room side convective heat transfer coefficient - (W/m2-k). - h_out (float): The ambient convective heat transfer coefficient - (W/m2-k). + inside film resistance = 8 [K⋅m2/W] + outside film resistance = 20 [K⋅m2/W] """ - if include_h: - return (1 / h_out + self.r_value + 1 / h_in) ** -1 - else: - return 1 / self.r_value + h_in = 8.0 + h_out = 20.0 + return 1 / h_out + self.r_value + 1 / h_in + + @property + def u_factor(self): + """Overall heat transfer coefficient (including air films) W/(m2⋅K).""" + return 1 / self.r_factor @property def equivalent_heat_capacity_per_unit_volume(self): - """The equivalent per unit wall **volume** heat capacity. Expressed in - J/(kg⋅K). + """Construction equivalent per unit wall **volume** heat capacity [J/(kg⋅K)]. Hint: - The physical quantity which represents the heat storage capability + "The physical quantity which represents the heat storage capability is the wall heat capacity, defined as HC=M·c. While the per unit wall area of this quantity is (HC/A)=ρ·c·δ, where δ the wall thickness, the per unit volume wall heat capacity, being a @@ -171,7 +247,11 @@ def equivalent_heat_capacity_per_unit_volume(self): :math:`{{(ρ·c)}}_{eq}{{=(1/L)·∑}}_{i=1}^n{{(ρ}}_i{{·c}}_i{{·δ}}_i{)}` where :math:`{ρ}_i`, :math:`{c}_i` and :math:`{δ}_i` are the densities, the specific heat capacities and the layer thicknesses of - the n parallel layers of the composite wall. + the n parallel layers of the composite wall." [ref]_ + + .. [ref] Tsilingiris, P. T. (2004). On the thermal time constant of + structural walls. Applied Thermal Engineering, 24(5–6), 743–757. + https://doi.org/10.1016/j.applthermaleng.2003.10.015 """ return (1 / self.total_thickness) * sum( [ @@ -182,9 +262,7 @@ def equivalent_heat_capacity_per_unit_volume(self): @property def specific_heat(self): - """float: The overall specific heat of the OpaqueConstruction weighted - by wall area mass (J/kg K). - """ + """Construction specific heat weighted by wall area mass [J/(kg⋅K)].""" return np.average( [layer.specific_heat for layer in self.Layers], weights=[layer.Thickness * layer.Material.Density for layer in self.Layers], @@ -192,25 +270,51 @@ def specific_heat(self): @property def heat_capacity_per_unit_wall_area(self): - """The per unit wall area of the heat capacity is :math:`(HC/A)=ρ·c·δ`, - where :math:`δ` is the wall thickness. Expressed in J/(m2 K) + """Construction heat capacity per unit wall area [J/(m2⋅K)]. + + Hint: + :math:`(HC/A)=ρ·c·δ`, where :math:`δ` is the wall thickness. """ return sum([layer.heat_capacity for layer in self.Layers]) @property def total_thickness(self): - """Returns the total thickness of an OpaqueConstruction by summing up - each material layer thicknesses - """ + """Construction total thickness [m].""" return sum([layer.Thickness for layer in self.Layers]) @property def mass_per_unit_area(self): + """Construction mass per unit area [kg/m2].""" return sum([layer.Thickness * layer.Material.Density for layer in self.Layers]) @property - def timeconstant_per_unit_area(self): - return self.mass_per_unit_area * self.specific_heat / self.u_value() + def time_constant_per_unit_area(self): + """Construction time constant per unit area.""" + return self.mass_per_unit_area * self.specific_heat / self.u_factor + + @property + def solar_reflectance_index(self): + """Construction's Solar Reflectance Index of the exposed surface. + + Hint: + calculation from K-12 AEDG, derived from ASTM E1980 assuming medium wind + speed. + + """ + exposedMaterial = self.Layers[0] # 0-th layer is exterior layer + solarAbsorptance = exposedMaterial.Material.SolarAbsorptance + thermalEmissivity = exposedMaterial.Material.ThermalEmittance + + x = (20.797 * solarAbsorptance - 0.603 * thermalEmissivity) / ( + 9.5205 * thermalEmissivity + 12.0 + ) + sri = 123.97 - 141.35 * x + 9.6555 * x * x + + return sri + + def infer_insulation_layer(self): + """Return the material layer index that corresponds to the insulation layer.""" + return self.Layers.index(max(self.Layers, key=lambda x: x.r_value)) def combine(self, other, method="dominant_wall", allow_duplicates=False): """Combine two OpaqueConstruction together. @@ -268,7 +372,7 @@ def combine(self, other, method="dominant_wall", allow_duplicates=False): new_obj = self.__class__(**meta, Layers=layers, idf=self.idf) new_name = ( "Combined Opaque Construction {{{}}} with u_value " - "of {:,.3f} W/m2k".format(uuid.uuid1(), new_obj.u_value()) + "of {:,.3f} W/m2k".format(uuid.uuid1(), new_obj.u_value) ) new_obj.rename(new_name) new_obj.predecessors.update(self.predecessors + other.predecessors) @@ -366,7 +470,7 @@ def obj_func( # thicknesses. Here, the U_value does not take into account the convective heat # transfer coefficients. u_equivalent = np.average( - [self.u_value(), other.u_value()], + [self.u_value, other.u_value], weights=[self.total_thickness, other.total_thickness], ) @@ -577,3 +681,20 @@ def generic(cls, idf=None): idf=idf, Category="Partition", ) + + def __add__(self, other): + """Overload + to implement self.combine. + + Args: + other (OpaqueConstruction): The other OpaqueConstruction. + """ + return self.combine(other) + + def __hash__(self): + return hash((self.__class__.__name__, getattr(self, "Name", None))) + + def __eq__(self, other): + if not isinstance(other, OpaqueConstruction): + return NotImplemented + else: + return all([self.Layers == other.Layers]) diff --git a/archetypal/template/umi_base.py b/archetypal/template/umi_base.py index aff0fcb9..58fef936 100644 --- a/archetypal/template/umi_base.py +++ b/archetypal/template/umi_base.py @@ -535,7 +535,7 @@ class MaterialLayer(object): """ def __init__(self, Material, Thickness, **kwargs): - """Initialize a MaterialLayer object with parameters: + """Initialize a MaterialLayer object with parameters. Args: Material (OpaqueMaterial, GlazingMaterial, GasMaterial): @@ -545,26 +545,9 @@ def __init__(self, Material, Thickness, **kwargs): self.Material = Material self.Thickness = Thickness - def __hash__(self): - return id(self) - - def __eq__(self, other): - if not isinstance(other, MaterialLayer): - return NotImplemented - else: - return all( - [self.Thickness == other.Thickness, self.Material == other.Material] - ) - - def __repr__(self): - return "{} with thickness of {:,.3f} m".format(self.Material, self.Thickness) - - def __iter__(self): - for k, v in self.mapping().items(): - yield k, v - @property def Thickness(self): + """Get or set the material thickness [m].""" return self._thickness @Thickness.setter @@ -577,26 +560,45 @@ def Thickness(self, value): lg.WARNING, ) + @property + def resistivity(self): + """Get or set the resistivity of the material layer [m-K/W].""" + return 1 / self.Material.Conductivity + + @resistivity.setter + def resistivity(self, value): + self.Material.Conductivity = 1 / float(value) + @property def r_value(self): - """float: The Thermal Resistance of the :class:`MaterialLayer`""" - return self.Thickness / self.Material.Conductivity # (K⋅m2/W) + """Get or set the the R-value of the material layer [m2-K/W]. + + Note that, when setting the R-value, the thickness of the material will + be adjusted and the conductivity will remain fixed. + """ + return self.Thickness / self.Material.Conductivity + + @r_value.setter + def r_value(self, value): + self.Thickness = float(value) * self.Material.Conductivity @property def u_value(self): - """float: The overall heat transfer coefficient of the - :class:`MaterialLayer`. Expressed in W/(m2⋅K) - """ + """Get or set the heat transfer coefficient [W/(m2⋅K)].""" return 1 / self.r_value + @u_value.setter + def u_value(self, value): + self.r_value = 1 / float(value) + @property def heat_capacity(self): - """float: The Material Layer's heat capacity J/m2-k""" + """The material layer's heat capacity [J/(m2-k)].""" return self.Material.Density * self.Material.SpecificHeat * self.Thickness @property def specific_heat(self): - """float: The Material's specific heat J/kg-K""" + """The material layer's specific heat [J/kg-K].""" return self.Material.SpecificHeat def to_dict(self): @@ -611,6 +613,24 @@ def mapping(self): def get_unique(self): return self + def __hash__(self): + return id(self) + + def __eq__(self, other): + if not isinstance(other, MaterialLayer): + return NotImplemented + else: + return all( + [self.Thickness == other.Thickness, self.Material == other.Material] + ) + + def __repr__(self): + return "{} with thickness of {:,.3f} m".format(self.Material, self.Thickness) + + def __iter__(self): + for k, v in self.mapping().items(): + yield k, v + from collections.abc import Hashable, MutableSet diff --git a/tests/test_template.py b/tests/test_template.py index cc77fc19..01c61978 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -981,13 +981,46 @@ def construction_b(self, mat_a, idf): yield oc_b + def test_change_r_value(self, facebrick_and_concrete): + """Test setting r_value on a construction.""" + new_r_value = facebrick_and_concrete.r_value * 2 # lets double the r_value + + before_thickness = facebrick_and_concrete.total_thickness + + facebrick_and_concrete.r_value = new_r_value + + after_thickness = facebrick_and_concrete.total_thickness + + np.testing.assert_almost_equal(facebrick_and_concrete.r_value, new_r_value) + assert before_thickness < after_thickness + + def test_change_r_value_one_layer_construction(self, construction_b): + """Test setting r_value on a construction with only one layer.""" + new_r_value = construction_b.r_value * 2 + + before_thickness = construction_b.total_thickness + + construction_b.r_value = new_r_value + + after_thickness = construction_b.total_thickness + + assert construction_b.r_value == new_r_value + assert after_thickness == 2 * before_thickness + + def test_change_r_value_not_physical(self, facebrick_and_concrete): + """Test setting r_value on a construction that results in unrealistic + assembly. + """ + with pytest.raises(ValueError): + facebrick_and_concrete.r_value = 0.1 + def test_thermal_properties(self, construction_a): """test r_value and u_value properties Args: construction_a: """ - assert 1 / construction_a.r_value == construction_a.u_value() + assert 1 / construction_a.r_value == construction_a.u_value def test_add_opaque_construction(self, construction_a, construction_b): """Test __add__() for OpaqueConstruction @@ -1001,7 +1034,7 @@ def test_add_opaque_construction(self, construction_a, construction_b): ) assert oc_c desired = 3.237 - actual = oc_c.u_value() + actual = oc_c.u_value np.testing.assert_almost_equal(actual, desired, decimal=3) def test_iadd_opaque_construction(self, construction_a, construction_b): @@ -1131,9 +1164,7 @@ def test_real_word_construction( facebrick_and_concrete: insulated_concrete_wall: """ - assert facebrick_and_concrete.u_value(include_h=True) == pytest.approx( - 0.6740, 0.01 - ) + assert facebrick_and_concrete.u_factor == pytest.approx(0.6740, 0.01) assert ( facebrick_and_concrete.equivalent_heat_capacity_per_unit_volume == pytest.approx(1595166.7, 0.01) @@ -1142,9 +1173,7 @@ def test_real_word_construction( 574260.0, 0.1 ) - assert insulated_concrete_wall.u_value(include_h=True) == pytest.approx( - 0.7710, 0.01 - ) + assert insulated_concrete_wall.u_factor == pytest.approx(0.7710, 0.01) assert ( insulated_concrete_wall.equivalent_heat_capacity_per_unit_volume == pytest.approx(1826285.7, 0.01) From 09454faac70bcefac7f830ebde176bbc0e16996b Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Mon, 29 Mar 2021 11:52:09 -0400 Subject: [PATCH 08/32] fixes an issue where cops would yield as nan, breaking the json export (#150) --- archetypal/template/conditioning.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/archetypal/template/conditioning.py b/archetypal/template/conditioning.py index 32068691..3efef9f3 100644 --- a/archetypal/template/conditioning.py +++ b/archetypal/template/conditioning.py @@ -823,9 +823,9 @@ def _set_zone_cops(self, zone, nolimit=False): self.HeatingCoeffOfPerf = float(heating_cop) # If cop calc == infinity, COP = 1 because we need a value in json file. - if heating_cop == float("infinity"): + if math.isnan(heating_cop): self.HeatingCoeffOfPerf = 1 - if cooling_cop == float("infinity"): + if math.isnan(cooling_cop): self.CoolingCoeffOfPerf = 1 def _set_thermostat_setpoints(self, zone): From 8b930e60fad176d3eb327b28d0c6e4b0bf0fe830 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Mon, 29 Mar 2021 11:53:52 -0400 Subject: [PATCH 09/32] Meters: Adds better compatibility with earlier versions of EnergyPlus (#151) --- archetypal/idfclass/meters.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/archetypal/idfclass/meters.py b/archetypal/idfclass/meters.py index c09d048a..e055b3eb 100644 --- a/archetypal/idfclass/meters.py +++ b/archetypal/idfclass/meters.py @@ -4,6 +4,7 @@ import pandas as pd from energy_pandas import EnergySeries +from eppy.bunch_subclass import BadEPFieldError from geomeppy.patches import EpBunch from tabulate import tabulate @@ -65,16 +66,20 @@ def values( if self._epobject not in self._idf.idfobjects[self._epobject.key]: self._idf.addidfobject(self._epobject) self._idf.simulate() + try: + key_name = self._epobject.Key_Name + except BadEPFieldError: + key_name = self._epobject.Name # Backwards compatibility report = ReportData.from_sqlite( sqlite_file=self._idf.sql_file, - table_name=self._epobject.Key_Name, + table_name=key_name, environment_type=1 if self._idf.design_day else 3, reporting_frequency=bunch2db[reporting_frequency], ) return EnergySeries.from_reportdata( report, to_units=units, - name=self._epobject.Key_Name, + name=key_name, normalize=normalize, sort_values=sort_values, ascending=ascending, From 731f0d30074ccbcc03516d0a02c7f6040a4015e8 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Thu, 6 May 2021 23:09:03 -0400 Subject: [PATCH 10/32] Overhaul of the template module and multiple bug fixes (#154) * refactors material classes into own package * removes unnecessary ressources * ignore E503 flake8 * cleanup of OpaqueConstruction * cleanup of StructureInformations * cleanup of ZoneLoad * Cleanup of ventilation setting * cleanup dhw * Cleanup ZoneConditioning * Cleanup ZoneConstructionSet * Completes the big cleanup * fixes an issue where the total conditioned area would be zero * Uses Fraction instead of Fractional inline with existing umi template libraries * UmiSchedule.from_epbunch handles the parsing of the ScheduleTypeLimit * Added quantity slot for UmiSchedule * UniqueNames are within each subgroups of an UmiTemplateLibrary * fixes a test * adds missing validator * removes necessary test * Sunday by default if runperiod not available * fix test * skip test * Fixes issues with special days parsing. All schedules now work * adds validator-collection to requirements * Set up GCC * Update python-package.yml * Update python-package.yml * black * Update python-package.yml * Update python-package.yml * Update python-package.yml * Update python-package.yml * Update python-package.yml * Update python-package.yml * fixes test --- .github/workflows/python-package.yml | 7 +- archetypal/__init__.py | 12 +- archetypal/dataportal.py | 8 +- archetypal/eplus_interface/__init__.py | 18 +- archetypal/eplus_interface/energy_plus.py | 2 + archetypal/eplus_interface/expand_objects.py | 4 +- archetypal/eplus_interface/slab.py | 1 - archetypal/eplus_interface/transition.py | 2 +- archetypal/eplus_interface/version.py | 2 +- archetypal/idfclass/__init__.py | 2 +- archetypal/idfclass/idf.py | 80 +- archetypal/idfclass/meters.py | 6 +- archetypal/idfclass/util.py | 1 - archetypal/idfclass/variables.py | 2 +- archetypal/ressources/NewFileTemplate.d18 | 280 - archetypal/ressources/W74-lib.dat | 13861 ---------------- archetypal/ressources/originBUISketchUp.idf | 191 - archetypal/schedule.py | 1678 +- archetypal/settings.py | 21 - archetypal/template/__init__.py | 23 +- archetypal/template/building_template.py | 526 +- archetypal/template/conditioning.py | 924 +- archetypal/template/constructions/__init__.py | 0 .../constructions/base_construction.py | 328 + .../template/constructions/internal_mass.py | 146 + .../opaque_construction.py | 441 +- .../constructions/window_construction.py | 759 + archetypal/template/dhw.py | 485 +- archetypal/template/gas_material.py | 134 - archetypal/template/load.py | 639 +- archetypal/template/materials/__init__.py | 11 + archetypal/template/materials/gas_layer.py | 374 + archetypal/template/materials/gas_material.py | 282 + .../{ => materials}/glazing_material.py | 309 +- .../template/materials/material_base.py | 187 + .../template/materials/material_layer.py | 164 + .../nomass_material.py} | 449 +- .../template/materials/opaque_material.py | 579 + archetypal/template/schedule.py | 969 +- archetypal/template/structure.py | 235 +- archetypal/template/umi_base.py | 575 +- archetypal/template/ventilation.py | 921 +- .../template/{window.py => window_setting.py} | 752 +- archetypal/template/zone_construction_set.py | 633 +- archetypal/template/zonedefinition.py | 999 +- archetypal/umi_template.py | 304 +- archetypal/utils.py | 338 +- archetypal/zone_graph.py | 4 +- docs/converter_umi.rst | 2 +- docs/creating_umi_template.rst | 2 +- docs/package_modules.rst | 9 - environment.yml | 1 + requirements.txt | 37 +- setup.cfg | 3 +- setup.py | 12 +- tests/input_data/materials.idf | 30 + tests/test_cli.py | 5 +- tests/test_dataportals.py | 10 +- tests/test_energypandas.py | 3 +- tests/test_idfclass.py | 17 +- tests/test_schedules.py | 150 +- tests/test_template.py | 2695 +-- tests/test_umi.py | 258 +- tests/test_zonegraph.py | 2 +- 64 files changed, 11160 insertions(+), 20744 deletions(-) delete mode 100644 archetypal/ressources/NewFileTemplate.d18 delete mode 100644 archetypal/ressources/W74-lib.dat delete mode 100644 archetypal/ressources/originBUISketchUp.idf create mode 100644 archetypal/template/constructions/__init__.py create mode 100644 archetypal/template/constructions/base_construction.py create mode 100644 archetypal/template/constructions/internal_mass.py rename archetypal/template/{ => constructions}/opaque_construction.py (58%) create mode 100644 archetypal/template/constructions/window_construction.py delete mode 100644 archetypal/template/gas_material.py create mode 100644 archetypal/template/materials/__init__.py create mode 100644 archetypal/template/materials/gas_layer.py create mode 100644 archetypal/template/materials/gas_material.py rename archetypal/template/{ => materials}/glazing_material.py (54%) create mode 100644 archetypal/template/materials/material_base.py create mode 100644 archetypal/template/materials/material_layer.py rename archetypal/template/{opaque_material.py => materials/nomass_material.py} (56%) create mode 100644 archetypal/template/materials/opaque_material.py rename archetypal/template/{window.py => window_setting.py} (59%) create mode 100644 tests/input_data/materials.idf diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 0a48aeb8..dd1f850c 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -15,10 +15,12 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: [ 3.7, 3.8, 3.9 ] + python-version: [ 3.7, 3.8 ] os: [ macos-latest, ubuntu-latest, windows-latest ] energyplus-version: [ 9.2.0 ] # later, add 9.4.0 include: + - runs-on: ubuntu-latest + compiler: gcc - energyplus-version: 9.2.0 energyplus-sha: 921312fa1d energyplus-install: 9-2-0 @@ -58,7 +60,7 @@ jobs: run: | python -m pip install --upgrade pip python -m pip install flake8 pytest-cov pytest-xdist[psutil] - pip install -r requirements.txt -r requirements-dev.txt + python -m pip install -r requirements.txt -r requirements-dev.txt - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names @@ -76,3 +78,4 @@ jobs: files: ./coverage.xml fail_ci_if_error: false verbose: true + diff --git a/archetypal/__init__.py b/archetypal/__init__.py index e3b48efc..0d1c3fed 100644 --- a/archetypal/__init__.py +++ b/archetypal/__init__.py @@ -30,15 +30,5 @@ warnings.simplefilter(action="ignore", category=FutureWarning) warnings.simplefilter(action="ignore", category=UserWarning) -from .utils import * -from .simple_glazing import * -from energy_pandas import EnergySeries, EnergyDataFrame -from .reportdata import ReportData -from .schedule import Schedule -from .plot import * -from .eplus_interface import * -from .idfclass import * -from .dataportal import * +from .idfclass import IDF from .umi_template import UmiTemplateLibrary -from .utils import * -from .cli import reduce, transition diff --git a/archetypal/dataportal.py b/archetypal/dataportal.py index bea29605..0f9b7b8e 100644 --- a/archetypal/dataportal.py +++ b/archetypal/dataportal.py @@ -22,12 +22,6 @@ from archetypal import settings from archetypal.utils import log -# scipy and sklearn are optional dependencies for faster nearest node search -try: - from osgeo import gdal -except ImportError as e: - gdal = None - def tabula_available_buildings(country_name="France"): """Returns all available building types for a specific country. @@ -542,7 +536,7 @@ def nrel_bcl_api_request(data): response = requests.get(prepared_url) # check if an error has occurred - log(response.raise_for_status(), lg.DEBUG) + response.raise_for_status() # if this URL is not already in the cache, pause, then request it # get the response size and the domain, log result diff --git a/archetypal/eplus_interface/__init__.py b/archetypal/eplus_interface/__init__.py index d4933e68..462bf1ca 100644 --- a/archetypal/eplus_interface/__init__.py +++ b/archetypal/eplus_interface/__init__.py @@ -16,15 +16,19 @@ "get_eplus_dirs", ] -from .basement import BasementThread -from .energy_plus import EnergyPlusProgram, EnergyPlusThread, EnergyPlusExe -from .exceptions import ( +from archetypal.eplus_interface.basement import BasementThread +from archetypal.eplus_interface.energy_plus import ( + EnergyPlusExe, + EnergyPlusProgram, + EnergyPlusThread, +) +from archetypal.eplus_interface.exceptions import ( EnergyPlusProcessError, EnergyPlusVersionError, EnergyPlusWeatherError, InvalidEnergyPlusVersion, ) -from .expand_objects import ExpandObjectsThread -from .slab import SlabThread -from .transition import TransitionThread -from .version import EnergyPlusVersion, get_eplus_dirs +from archetypal.eplus_interface.expand_objects import ExpandObjectsThread +from archetypal.eplus_interface.slab import SlabThread +from archetypal.eplus_interface.transition import TransitionThread +from archetypal.eplus_interface.version import EnergyPlusVersion, get_eplus_dirs diff --git a/archetypal/eplus_interface/energy_plus.py b/archetypal/eplus_interface/energy_plus.py index 90ae10fe..ca3d7b3b 100644 --- a/archetypal/eplus_interface/energy_plus.py +++ b/archetypal/eplus_interface/energy_plus.py @@ -111,9 +111,11 @@ def get_exe_path(self): self.eplus_weather_path = Path(eplus_weather_path).expand() def __str__(self): + """Return string representation.""" return " ".join(self.__repr__()) def __repr__(self): + """Return a representation of self.""" cmd = [self.eplus_exe_path] for key, value in self.__dict__.items(): if key not in [ diff --git a/archetypal/eplus_interface/expand_objects.py b/archetypal/eplus_interface/expand_objects.py index 1f6c88ce..e70743dd 100644 --- a/archetypal/eplus_interface/expand_objects.py +++ b/archetypal/eplus_interface/expand_objects.py @@ -1,7 +1,6 @@ """ExpandObjects module""" import logging as lg -import platform import shutil import subprocess import time @@ -108,7 +107,8 @@ def run(self): self.failure_callback() except Exception as e: self.exception = e - self.p.kill() # kill process to be sure + if self.p is not None: + self.p.kill() # kill process to be sure return def msg_callback(self, *args, **kwargs): diff --git a/archetypal/eplus_interface/slab.py b/archetypal/eplus_interface/slab.py index c5058c50..56a2e53d 100644 --- a/archetypal/eplus_interface/slab.py +++ b/archetypal/eplus_interface/slab.py @@ -10,7 +10,6 @@ from path import Path from tqdm import tqdm -from archetypal.eplus_interface.energy_plus import EnergyPlusProgram from archetypal.eplus_interface.exceptions import ( EnergyPlusProcessError, EnergyPlusVersionError, diff --git a/archetypal/eplus_interface/transition.py b/archetypal/eplus_interface/transition.py index 1174695a..b75a6267 100644 --- a/archetypal/eplus_interface/transition.py +++ b/archetypal/eplus_interface/transition.py @@ -122,7 +122,7 @@ def __str__(self): return " ".join(self.__repr__()) def __repr__(self): - """Return command as string.""" + """Return the command as a string.""" return self.cmd() def cmd(self): diff --git a/archetypal/eplus_interface/version.py b/archetypal/eplus_interface/version.py index 8ecad12d..3238d220 100644 --- a/archetypal/eplus_interface/version.py +++ b/archetypal/eplus_interface/version.py @@ -134,7 +134,7 @@ def __init__(self, version): raise InvalidEnergyPlusVersion def __repr__(self) -> str: - """Return the string representation of the object.""" + """Return a representation of self.""" return "".format(repr(str(self))) @classmethod diff --git a/archetypal/idfclass/__init__.py b/archetypal/idfclass/__init__.py index bc02cedf..a1d2a863 100644 --- a/archetypal/idfclass/__init__.py +++ b/archetypal/idfclass/__init__.py @@ -17,6 +17,6 @@ from .idf import IDF from .meters import Meters from .outputs import Outputs +from .reports import get_ideal_loads_summary from .util import hash_model from .variables import Variables -from .reports import get_ideal_loads_summary diff --git a/archetypal/idfclass/idf.py b/archetypal/idfclass/idf.py index d29b8303..54076497 100644 --- a/archetypal/idfclass/idf.py +++ b/archetypal/idfclass/idf.py @@ -6,6 +6,7 @@ import itertools import logging as lg +import math import os import re import shutil @@ -28,6 +29,7 @@ from eppy.EPlusInterfaceFunctions.eplusdata import Eplusdata from eppy.modeleditor import IDDNotSetError, namebunch, newrawobject from geomeppy import IDF as geomIDF +from geomeppy.geom.polygons import Polygon3D from geomeppy.patches import EpBunch, idfreader1, obj2bunch from pandas import DataFrame, Series from pandas.errors import ParserError @@ -232,7 +234,7 @@ def __init__( self.prep_outputs = prep_outputs self._position = position self.output_prefix = None - self.name = name + self.name = self.idfname.basename() if isinstance(self.idfname, Path) else name self.output_directory = output_directory # Set dependants to None @@ -303,7 +305,7 @@ def __str__(self): return self.name def __repr__(self): - """Describe the model.""" + """Return a representation of self.""" if self.sim_info is not None: sim_info = tabulate(self.sim_info.T, tablefmt="orgtbl") sim_info += f"\n\tFiles at '{self.simulation_dir}'" @@ -765,16 +767,14 @@ def name(self) -> str: Can include the extension (.idf). """ - if self._name is not None: - return self._name - elif isinstance(self.idfname, StringIO): - self._name = f"{uuid.uuid1()}.idf" - return self._name - else: - return self.idfname.basename() + return self._name @name.setter def name(self, value): + if value is None: + value = f"{uuid.uuid1()}.idf" + elif ".idf" not in value: + value = Path(value).stem + ".idf" self._name = value def sql(self) -> dict: @@ -842,7 +842,7 @@ def open_idf(self): import subprocess - subprocess.call( + subprocess.Popen( ( shutil.which( "IDFEditor", @@ -860,7 +860,7 @@ def open_last_simulation(self): import subprocess - subprocess.call( + subprocess.Popen( ( shutil.which( "EP-Launch", @@ -1014,6 +1014,50 @@ def total_building_area(self) -> float: self._area_total = area return self._area_total + @property + def total_building_volume(self): + return NotImplemented() + + @staticmethod + def _get_volume_from_surfs(zone_surfs): + """Calculate the volume of a zone only and only if the surfaces are such + that you can find a point inside so that you can connect every vertex to + the point without crossing a face. + + Adapted from: https://stackoverflow.com/a/19125446 + + Args: + zone_surfs (list): List of zone surfaces (EpBunch) + """ + vol = 0 + for surf in zone_surfs: + polygon_d = Polygon3D(surf.coords) # create Polygon3D from surf + n = len(polygon_d.vertices_list) + v2 = polygon_d[0] + x2 = v2.x + y2 = v2.y + z2 = v2.z + + for i in range(1, n - 1): + v0 = polygon_d[i] + x0 = v0.x + y0 = v0.y + z0 = v0.z + v1 = polygon_d[i + 1] + x1 = v1.x + y1 = v1.y + z1 = v1.z + # Add volume of tetrahedron formed by triangle and origin + vol += math.fabs( + x0 * y1 * z2 + + x1 * y2 * z0 + + x2 * y0 * z1 + - x0 * y2 * z1 + - x1 * y0 * z2 + - x2 * y1 * z0 + ) + return vol / 6.0 + @property def partition_ratio(self) -> float: """float: Lineal meters of partitions per m2 of floor area.""" @@ -1036,8 +1080,8 @@ def partition_ratio(self) -> float: zone.Multiplier if zone.Multiplier != "" else 1 ) partition_lineal += surface.width * multiplier - self._partition_ratio = ( - partition_lineal / self.net_conditioned_building_area + self._partition_ratio = partition_lineal / max( + self.net_conditioned_building_area, self.unconditioned_building_area ) return self._partition_ratio @@ -1071,14 +1115,18 @@ def outputs(self) -> Outputs: @property def day_of_week_for_start_day(self): - """Get day of week for start day for the first found RUNPERIOD.""" + """Get day of week for start day for the first found RUNPERIOD. + + Monday = 0 .. Sunday = 6 + """ import calendar run_period = next(iter(self.idfobjects["RUNPERIOD"]), None) if run_period: day = run_period["Day_of_Week_for_Start_Day"] else: - raise ValueError("model does not contain a 'RunPeriod'") + log("model does not contain a 'RunPeriod'. Defaulting to Sunday.") + day = "Sunday" if day.lower() == "sunday": return calendar.SUNDAY @@ -1538,7 +1586,7 @@ def roundto(x, to=10.0): if surf.key.upper() not in ["INTERNALMASS", "WINDOWSHADINGCONTROL"] ]: if isclose(surface.tilt, 90, abs_tol=10): - if surface.Outside_Boundary_Condition == "Outdoors": + if surface.Outside_Boundary_Condition.lower() == "outdoors": surf_azim = roundto(surface.azimuth, to=azimuth_threshold) total_surface_area[surf_azim] += surface.area * multiplier for subsurface in surface.subsurfaces: diff --git a/archetypal/idfclass/meters.py b/archetypal/idfclass/meters.py index e055b3eb..5157cf48 100644 --- a/archetypal/idfclass/meters.py +++ b/archetypal/idfclass/meters.py @@ -31,7 +31,7 @@ def __init__(self, idf, meter: (dict or EpBunch)): raise TypeError() def __repr__(self): - """Return the string representation of an EpBunch.""" + """Return a representation of self.""" return self._epobject.__str__() def values( @@ -105,7 +105,7 @@ def __getitem__(self, meter_name): return self._properties[meter_name] def __repr__(self): - """Return all available meters.""" + """Return a representation of all available meters.""" # getmembers() returns all the # members of an object members = [] @@ -168,7 +168,7 @@ def __init__(self, idf): ) def __repr__(self): - """Tabulate available meters.""" + """Tabulate all available meters.""" # getmembers() returns all the # members of an object members = [] diff --git a/archetypal/idfclass/util.py b/archetypal/idfclass/util.py index 522f907c..47d566b2 100644 --- a/archetypal/idfclass/util.py +++ b/archetypal/idfclass/util.py @@ -7,7 +7,6 @@ import eppy from eppy.EPlusInterfaceFunctions import parse_idd -from path import Path from archetypal.utils import log diff --git a/archetypal/idfclass/variables.py b/archetypal/idfclass/variables.py index 7cf6d59c..498ff483 100644 --- a/archetypal/idfclass/variables.py +++ b/archetypal/idfclass/variables.py @@ -27,7 +27,7 @@ def __init__(self, idf, variable: (dict or EpBunch)): raise TypeError() def __repr__(self): - """Return the string representation of an EpBunch.""" + """Return a representation of self.""" return self._epobject.__str__() def values( diff --git a/archetypal/ressources/NewFileTemplate.d18 b/archetypal/ressources/NewFileTemplate.d18 deleted file mode 100644 index 888955a6..00000000 --- a/archetypal/ressources/NewFileTemplate.d18 +++ /dev/null @@ -1,280 +0,0 @@ -VERSION 18 -******************************************************************************* -*** TRNSYS input file (deck) generated by TrnsysStudio -*** on Wednesday, June 01, 2016 at 12:28 -*** from TrnsysStudio project: C:\TRNSYS\MyProjects\Studio_Test\Studio.tpf -*** -*** If you edit this file, use the File/Import TRNSYS Input File function in -*** TrnsysStudio to update the project. -*** -*** If you have problems, questions or suggestions please contact your local -*** TRNSYS distributor or mailto:software@cstb.fr -*** -******************************************************************************* - - -******************************************************************************* -*** Units -******************************************************************************* - -******************************************************************************* -*** Control cards -******************************************************************************* -* START, STOP and STEP -CONSTANTS 3 -START=0 -STOP=168 -STEP=1 - -SIMULATION START STOP STEP ! Start time End time Time step -TOLERANCES 0.001 0.001 ! Integration Convergence -LIMITS 30 30 30 ! Max iterations Max warnings Trace limit -DFQ 1 ! TRNSYS numerical integration solver method -WIDTH 80 ! TRNSYS output file width, number of characters -LIST ! NOLIST statement - ! MAP statement -SOLVER 0 1 1 ! Solver statement Minimum relaxation factor Maximum relaxation factor -NAN_CHECK 0 ! Nan DEBUG statement -OVERWRITE_CHECK 0 ! Overwrite DEBUG statement -TIME_REPORT 0 ! disable time report -EQSOLVER 0 ! EQUATION SOLVER statement -* User defined CONSTANTS - - - -* EQUATIONS "Wizard Settings" -* -EQUATIONS 11 -HEMISPHERE = @HEMISPHERE -TURN = HEMISPHERE * $$ROTATION !Rotation angle for building used for adapting azimuth angles -TBOUNDARY = $$T_BOUNDARY -SHADE_CLOSE = $$SHADE_CLOSE * 3.6! Close blinds - radiation on facade in [W/m2 * 3.6]=[kJ/hr] -SHADE_OPEN = $$SHADE_OPEN * 3.6! Open blinds - radiation on facade in [W/m2 * 3.6]=[kJ/hr] -MAX_ISHADE = $$SHADE_FAC/100 ! Maximum opaque fraction of internal shading device -MAX_ESHADE = $$SHADE_FAC/100 ! Maximum opaque fraction of external shading device -h_DEPTH = $$h_DEPTH -T_MEAN = $$T_MEAN -T_AMPLITUDE = $$T_AMPLITUDE -t_T_MIN = $$t_T_MIN - -*$UNIT_NAME Wizard Settings -*$LAYER Main -*$POSITION 96 95 -*$UNIT_NUMBER 1 - - -* EQUATIONS "Radiation Unit Converter" -* -@RADIATION -*$UNIT_NAME Radiation Unit Converter -*$LAYER Main -*$POSITION 405 95 -*$UNIT_NUMBER 2 - -*------------------------------------------------------------------------------ - -* Model "Weather" (Type 15) -* - -UNIT 15 TYPE 15 Weather -*$UNIT_NAME Weather -*$MODEL .\Weather Data Reading and Processing\Standard Format\Meteonorm Files (TM2)\Type15-6.tmf -*$POSITION 253 180 -*$LAYER Weather - Data Files # -@WEATHER -*|? Which file contains the weather data? |1000 -*------------------------------------------------------------------------------ - -* Model "Ground Temperature" (Type 77) -* - -UNIT 77 TYPE 77 Type77 -*$UNIT_NAME Type77 -*$MODEL .\Physical Phenomena\Simple Ground Temperature Model\Type77.tmf -*$POSITION 253 350 -*$LAYER Main # -PARAMETERS 8 -1 ! 1 Number of temperature nodes -T_MEAN ! 2 Mean surface temperature -T_AMPLITUDE ! 3 Amplitude of surface temperature -t_T_MIN ! 4 Time shift -8.72 ! 5 Soil thermal conductivity -3200.0 ! 6 Soil density -0.84 ! 7 Soil specific heat -h_depth ! 8 Depth at point -*------------------------------------------------------------------------------ -* Model "Type56" (Type 56) -* - -UNIT 56 TYPE 56 Type56 -*$UNIT_NAME Building -*$MODEL .\Loads and Structures\Multi-Zone Building\Type56.tmf -*$POSITION 600 255 -*$LAYER Main # -*$# -PARAMETERS 3 -56 ! 1 Logical unit for building description file (*.b18, *.b17, *.bui) -0 ! 2 Star network calculation switch -0.50 ! 3 Weighting factor for operative temperature -@BUILDING -*** External files -ASSIGN "***.b18" 56 -*|? Building description file (*.b18, *.b17, *.bui) |1000 -*------------------------------------------------------------------------------ - -@UNIT_CONVERSION - - -*------------------------------------------------------------------------------ - -*------------------------------------------------------------------------------ -* OUTPUTS -*------------------------------------------------------------------------------ -* Model "Solar_Plotter" (Type 65) -* - -UNIT 65 TYPE 65 Solar_Plotter -*$UNIT_NAME Solar_Plotter -*$MODEL .\Output\Online Plotter\Online Plotter Without File\Type65d.tmf -*$POSITION 906 95 -*$LAYER Main # -PARAMETERS 12 -10 ! 1 Nb. of left-axis variables -10 ! 2 Nb. of right-axis variables -0.0 ! 3 Left axis minimum -1000.0 ! 4 Left axis maximum -0.0 ! 5 Right axis minimum -1000.0 ! 6 Right axis maximum -1 ! 7 Number of plots per simulation -12 ! 8 X-axis gridpoints -0 ! 9 Shut off Online w/o removing --1 ! 10 Logical unit for output file -0 ! 11 Output file units -0 ! 12 Output file delimiter -INPUTS 20 -@Solar_Plotter -LABELS 3 -"Total Incident Solar Radition [W/m]" -"Beam Incident Solar Radition [W/m]" -"Solar_Plotter" - -* Model "T_Plotter" (Type 65) -* - -UNIT 66 TYPE 65 T_Plotter -*$UNIT_NAME T_Plotter -*$MODEL .\Output\Online Plotter\Online Plotter Without File\Type65d.tmf -*$POSITION 906 180 -*$LAYER Main # -PARAMETERS 12 -10 ! 1 Nb. of left-axis variables -10 ! 2 Nb. of right-axis variables --30.0 ! 3 Left axis minimum -80.0 ! 4 Left axis maximum --30.0 ! 5 Right axis minimum -80.0 ! 6 Right axis maximum -1 ! 7 Number of plots per simulation -12 ! 8 X-axis gridpoints -0 ! 9 Shut off Online w/o removing --1 ! 10 Logical unit for output file -0 ! 11 Output file units -0 ! 12 Output file delimiter -INPUTS 20 -@T_Plotter -LABELS 3 -"Operative Temperature" -"Air Temperature" -"T_Plotter" -*------------------------------------------------------------------------------ - -* Model "Q_heat_cool_Plotter" (Type 65) -* - -UNIT 67 TYPE 65 Q_heat_cool_Plotter -*$UNIT_NAME Q_heat_cool_Plotter -*$MODEL .\Output\Online Plotter\Online Plotter Without File\Type65d.tmf -*$POSITION 906 298 -*$LAYER Main # -PARAMETERS 12 -10 ! 1 Nb. of left-axis variables -10 ! 2 Nb. of right-axis variables -0.0 ! 3 Left axis minimum -100.0 ! 4 Left axis maximum -0.0 ! 5 Right axis minimum -100.0 ! 6 Right axis maximum -1 ! 7 Number of plots per simulation -12 ! 8 X-axis gridpoints -0 ! 9 Shut off Online w/o removing --1 ! 10 Logical unit for output file -0 ! 11 Output file units -0 ! 12 Output file delimiter -INPUTS 20 -@Q_heat_cool_Plotter -LABELS 3 -"Heating [W/m]" -"Cooling [W/m]" -"Q_heat_cool_Plotter" - - -* Model "Q_heat_cool_Plotter" (Type 65) -* - -UNIT 68 TYPE 65 Q_el_Plotter -*$UNIT_NAME Q_el_Plotter -*$MODEL .\Output\Online Plotter\Online Plotter Without File\Type65d.tmf -*$POSITION 906 404 -*$LAYER Main # -PARAMETERS 12 -10 ! 1 Nb. of left-axis variables -10 ! 2 Nb. of right-axis variables -0.0 ! 3 Left axis minimum -100.0 ! 4 Left axis maximum -0.0 ! 5 Right axis minimum -100.0 ! 6 Right axis maximum -1 ! 7 Number of plots per simulation -12 ! 8 X-axis gridpoints -0 ! 9 Shut off Online w/o removing --1 ! 10 Logical unit for output file -0 ! 11 Output file units -0 ! 12 Output file delimiter -INPUTS 20 -@Q_el_Plotter -LABELS 3 -"Electricity Equipment [W/m]" -"Electricity Artificial Lighting [W/m]" -"Q_elec_Plotter" - - - -*------------------------------------------------------------------------------ - - -END -*!LINK_STYLE -*!LINK 1:2 -*!CONNECTION_SET 40:20:0:20:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60:0:0:0:0:116,89:385,89 -*!LINK 15:2 -*!CONNECTION_SET 40:0:0:40:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60:0:0:0:0:276,154:325,154:325,109:385,109 -*!LINK 15:56 -*!CONNECTION_SET 40:40:0:20:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60:0:0:0:0:276,194:325,194:325,249:583,249 -*!LINK 1:56 -*!CONNECTION_SET 40:40:0:40:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60:0:0:0:0:116,109:200,109:200,269:583,269 -*!LINK 2:56 -*!CONNECTION_SET 40:40:0:0:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60:0:0:0:0:425,109:500,109:500,229:583,229 -*!LINK 56:3 -*!CONNECTION_SET 40:40:0:20:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60:0:0:0:0:623,269:675,269:675,345:727,345 -*!LINK 2:65 -*!CONNECTION_SET 40:20:0:20:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60:32768:2:0:0:425,89:855,89:886,89 -*!LINK 15:66 -*!CONNECTION_SET 40:20:0:20:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60:32768:2:0:0:276,174:858,174:886,174 -*!LINK 77:56 -*!CONNECTION_SET 40:20:20:40:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60:0:0:0:0:271,345:603,345:603,269 -*!LINK 77:66 -*!CONNECTION_SET 40:40:40:40:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20:32768:2:0:0:271,365:300,365:300,450:1000,450:1000,194:926,194 -*!LINK 56:66 -*!CONNECTION_SET 40:20:0:40:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20:32768:2:0:0:623,249:825,249:825,194:886,194 -*!LINK 3:67 -*!CONNECTION_SET 40:0:0:20:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20:32768:2:0:0:767,325:825,325:825,292:886,292 -*!LINK 3:68 -*!CONNECTION_SET 40:40:0:20:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20:32768:2:0:0:767,365:825,365:825,398:886,398 -*!LINK_STYLE_END \ No newline at end of file diff --git a/archetypal/ressources/W74-lib.dat b/archetypal/ressources/W74-lib.dat deleted file mode 100644 index ee095129..00000000 --- a/archetypal/ressources/W74-lib.dat +++ /dev/null @@ -1,13861 +0,0 @@ -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : TRNSYS 14.2 WINDOW LIB -Desc : No_glazing = open -Window ID : 100 -Tilt : 90.0 -Glazings : 1 -Frame : 11 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1219.2 mm -Total Width : 914.4 mm -Glass Height: 1079.5 mm -Glass Width : 774.7 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.999 -Abs1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.001 0.000 0.001 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -Rbsol 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -Tvis 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.999 -Rfvis 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -Rbvis 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 -SHGC 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 0.000 1.000 -Tvis_daylight: 1.000 - - - -Layer ID# 9052 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 1.000 0 0 0 0 0 -Emis B 1.000 0 0 0 0 0 -Thickness(mm) 0.001 0 0 0 0 0 -Cond(W/m2-C )999.0 0 0 0 0 0 -Spectral File None None None None None None - -Overall and Center of Glass Ig U-values (W/m2-C) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-C) - 0 0.00 12.25 3.42 8.23 5.27 5.27 4.95 4.95 4.94 4.94 5.53 5.53 - 0 6.71 25.47 3.33 8.29 6.26 6.26 5.73 5.73 5.68 5.68 6.46 6.46 - 783 0.00 12.25 3.49 8.17 5.25 5.25 4.58 4.58 5.24 5.24 5.66 5.66 - 783 6.71 25.47 3.37 8.27 6.25 6.25 5.53 5.53 5.95 5.95 6.57 6.57 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Float5mm -Window ID : 101 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.809 0.808 0.806 0.801 0.791 0.770 0.723 0.613 0.373 0.000 0.728 -Abs1 0.117 0.118 0.120 0.123 0.127 0.132 0.136 0.138 0.128 0.000 0.127 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.074 0.074 0.074 0.076 0.082 0.098 0.141 0.249 0.499 1.000 0.134 -Rbsol 0.074 0.074 0.074 0.076 0.082 0.098 0.141 0.249 0.499 1.000 0.134 -Tvis 0.866 0.865 0.864 0.860 0.852 0.832 0.784 0.669 0.413 0.000 0.786 -Rfvis 0.078 0.078 0.078 0.080 0.086 0.103 0.149 0.261 0.519 1.000 0.141 -Rbvis 0.078 0.078 0.078 0.080 0.086 0.103 0.149 0.261 0.519 1.000 0.141 -SHGC 0.837 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.866 - - - -Layer ID# 30054 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 5.0 0 0 0 0 0 -Cond(W/m2-K )200.0 0 0 0 0 0 -Spectral File GT_Float_5mm None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.72 5.72 5.72 5.72 5.72 5.72 5.72 5.72 - 0 6.71 0.00 0.00 0.00 5.72 5.72 5.72 5.72 5.72 5.72 5.72 5.72 - 783 0.00 0.00 0.00 0.00 5.72 5.72 5.72 5.72 5.72 5.72 5.72 5.72 - 783 6.71 0.00 0.00 0.00 5.72 5.72 5.72 5.72 5.72 5.72 5.72 5.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Float6mm -Window ID : 102 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.791 0.790 0.787 0.782 0.772 0.750 0.703 0.595 0.360 0.000 0.710 -Abs1 0.137 0.138 0.140 0.144 0.149 0.154 0.159 0.160 0.147 0.000 0.149 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.072 0.072 0.073 0.074 0.080 0.096 0.138 0.245 0.492 1.000 0.132 -Rbsol 0.072 0.072 0.073 0.074 0.080 0.096 0.138 0.245 0.492 1.000 0.132 -Tvis 0.855 0.855 0.853 0.850 0.841 0.821 0.773 0.659 0.405 0.000 0.776 -Rfvis 0.078 0.078 0.078 0.080 0.086 0.103 0.147 0.259 0.515 1.000 0.140 -Rbvis 0.078 0.078 0.078 0.080 0.086 0.103 0.147 0.259 0.515 1.000 0.140 -SHGC 0.823 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.855 - - - -Layer ID# 30098 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 6.0 0 0 0 0 0 -Cond(W/m2-K )166.7 0 0 0 0 0 -Spectral File GT_Float_06m None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.69 5.69 5.69 5.69 5.69 5.69 5.69 5.69 - 0 6.71 0.00 0.00 0.00 5.69 5.69 5.69 5.69 5.69 5.69 5.69 5.69 - 783 0.00 0.00 0.00 0.00 5.69 5.69 5.69 5.69 5.69 5.69 5.69 5.69 - 783 6.71 0.00 0.00 0.00 5.69 5.69 5.69 5.69 5.69 5.69 5.69 5.69 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Float8mm -Window ID : 103 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.755 0.754 0.751 0.745 0.734 0.712 0.665 0.562 0.338 0.000 0.674 -Abs1 0.175 0.175 0.178 0.182 0.188 0.195 0.200 0.200 0.181 0.000 0.187 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.070 0.071 0.071 0.072 0.078 0.093 0.134 0.238 0.482 1.000 0.128 -Rbsol 0.070 0.071 0.071 0.072 0.078 0.093 0.134 0.238 0.482 1.000 0.128 -Tvis 0.836 0.835 0.833 0.829 0.820 0.799 0.751 0.639 0.391 0.000 0.755 -Rfvis 0.077 0.077 0.077 0.079 0.084 0.101 0.145 0.255 0.507 1.000 0.138 -Rbvis 0.077 0.077 0.077 0.079 0.084 0.101 0.145 0.255 0.507 1.000 0.138 -SHGC 0.796 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.836 - - - -Layer ID# 30052 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 8.0 0 0 0 0 0 -Cond(W/m2-K )125.0 0 0 0 0 0 -Spectral File GT_Float_8mm None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.62 5.62 5.62 5.62 5.62 5.62 5.62 5.62 - 0 6.71 0.00 0.00 0.00 5.62 5.62 5.62 5.62 5.62 5.62 5.62 5.62 - 783 0.00 0.00 0.00 0.00 5.62 5.62 5.62 5.62 5.62 5.62 5.62 5.62 - 783 6.71 0.00 0.00 0.00 5.62 5.62 5.62 5.62 5.62 5.62 5.62 5.62 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Float10mm -Window ID : 104 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.724 0.723 0.719 0.713 0.701 0.678 0.632 0.532 0.318 0.000 0.643 -Abs1 0.208 0.202 0.205 0.210 0.217 0.224 0.230 0.229 0.204 0.000 0.215 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.069 0.076 0.076 0.077 0.082 0.098 0.138 0.239 0.478 1.000 0.132 -Rbsol 0.069 0.076 0.076 0.077 0.082 0.098 0.138 0.239 0.478 1.000 0.132 -Tvis 0.818 0.817 0.815 0.811 0.801 0.779 0.732 0.621 0.378 0.000 0.737 -Rfvis 0.075 0.075 0.075 0.077 0.083 0.099 0.142 0.250 0.501 1.000 0.135 -Rbvis 0.075 0.075 0.075 0.077 0.083 0.099 0.142 0.250 0.501 1.000 0.135 -SHGC 0.773 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.818 - - - -Layer ID# 30051 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 10.0 0 0 0 0 0 -Cond(W/m2-K )100.0 0 0 0 0 0 -Spectral File GT_Float_10m None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.56 5.56 5.56 5.56 5.56 5.56 5.56 5.56 - 0 6.71 0.00 0.00 0.00 5.56 5.56 5.56 5.56 5.56 5.56 5.56 5.56 - 783 0.00 0.00 0.00 0.00 5.56 5.56 5.56 5.56 5.56 5.56 5.56 5.56 - 783 6.71 0.00 0.00 0.00 5.56 5.56 5.56 5.56 5.56 5.56 5.56 5.56 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Float12mm -Window ID : 105 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.694 0.693 0.689 0.682 0.669 0.647 0.601 0.505 0.300 0.000 0.613 -Abs1 0.239 0.234 0.237 0.243 0.250 0.258 0.264 0.261 0.230 0.000 0.248 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.067 0.074 0.074 0.075 0.080 0.095 0.134 0.234 0.470 1.000 0.129 -Rbsol 0.067 0.074 0.074 0.075 0.080 0.095 0.134 0.234 0.470 1.000 0.129 -Tvis 0.800 0.800 0.797 0.792 0.782 0.760 0.713 0.604 0.366 0.000 0.719 -Rfvis 0.075 0.075 0.075 0.076 0.082 0.098 0.141 0.247 0.495 1.000 0.134 -Rbvis 0.075 0.075 0.075 0.076 0.082 0.098 0.141 0.247 0.495 1.000 0.134 -SHGC 0.750 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 30050 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 12.0 0 0 0 0 0 -Cond(W/m2-K ) 83.3 0 0 0 0 0 -Spectral File GT_Float_12m None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 - 0 6.71 0.00 0.00 0.00 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 - 783 0.00 0.00 0.00 0.00 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 - 783 6.71 0.00 0.00 0.00 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Float14mm -Window ID : 106 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.665 0.664 0.660 0.653 0.640 0.617 0.572 0.479 0.284 0.000 0.585 -Abs1 0.269 0.264 0.268 0.274 0.282 0.290 0.296 0.291 0.252 0.000 0.278 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.065 0.072 0.072 0.074 0.079 0.093 0.132 0.229 0.464 1.000 0.126 -Rbsol 0.065 0.072 0.072 0.074 0.079 0.093 0.132 0.229 0.464 1.000 0.126 -Tvis 0.782 0.781 0.779 0.773 0.762 0.740 0.693 0.587 0.354 0.000 0.701 -Rfvis 0.074 0.074 0.074 0.076 0.081 0.097 0.139 0.244 0.489 1.000 0.132 -Rbvis 0.074 0.074 0.074 0.076 0.081 0.097 0.139 0.244 0.489 1.000 0.132 -SHGC 0.729 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.782 - - - -Layer ID# 30154 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 14.0 0 0 0 0 0 -Cond(W/m2-K ) 71.4 0 0 0 0 0 -Spectral File GT_Float_14m None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.44 5.44 5.44 5.44 5.44 5.44 5.44 5.44 - 0 6.71 0.00 0.00 0.00 5.44 5.44 5.44 5.44 5.44 5.44 5.44 5.44 - 783 0.00 0.00 0.00 0.00 5.44 5.44 5.44 5.44 5.44 5.44 5.44 5.44 - 783 6.71 0.00 0.00 0.00 5.44 5.44 5.44 5.44 5.44 5.44 5.44 5.44 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Extraweiss4mm -Window ID : 107 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.896 0.858 0.858 0.855 0.848 0.830 0.784 0.672 0.419 0.000 0.784 -Abs1 0.024 0.024 0.024 0.025 0.026 0.027 0.029 0.030 0.030 0.000 0.027 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.080 0.118 0.118 0.120 0.126 0.143 0.188 0.299 0.552 1.000 0.179 -Rbsol 0.080 0.118 0.118 0.120 0.126 0.143 0.188 0.299 0.552 1.000 0.179 -Tvis 0.907 0.841 0.841 0.838 0.832 0.814 0.770 0.661 0.414 0.000 0.769 -Rfvis 0.081 0.147 0.147 0.149 0.155 0.171 0.215 0.324 0.571 1.000 0.207 -Rbvis 0.081 0.147 0.147 0.149 0.155 0.171 0.215 0.324 0.571 1.000 0.207 -SHGC 0.902 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.907 - - - -Layer ID# 30061 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 4.0 0 0 0 0 0 -Cond(W/m2-K )250.0 0 0 0 0 0 -Spectral File GT_Extraweis None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.75 5.75 5.75 5.75 5.75 5.75 5.75 5.75 - 0 6.71 0.00 0.00 0.00 5.75 5.75 5.75 5.75 5.75 5.75 5.75 5.75 - 783 0.00 0.00 0.00 0.00 5.75 5.75 5.75 5.75 5.75 5.75 5.75 5.75 - 783 6.71 0.00 0.00 0.00 5.75 5.75 5.75 5.75 5.75 5.75 5.75 5.75 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Extraweiss6mm -Window ID : 108 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.885 0.864 0.863 0.860 0.852 0.833 0.786 0.673 0.418 0.000 0.787 -Abs1 0.036 0.036 0.037 0.038 0.040 0.041 0.043 0.045 0.044 0.000 0.040 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.079 0.100 0.101 0.102 0.108 0.126 0.170 0.283 0.538 1.000 0.163 -Rbsol 0.079 0.100 0.101 0.102 0.108 0.126 0.170 0.283 0.538 1.000 0.163 -Tvis 0.903 0.865 0.865 0.862 0.855 0.837 0.791 0.679 0.424 0.000 0.791 -Rfvis 0.081 0.118 0.119 0.120 0.126 0.144 0.189 0.301 0.555 1.000 0.180 -Rbvis 0.081 0.118 0.119 0.120 0.126 0.144 0.189 0.301 0.555 1.000 0.180 -SHGC 0.894 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.903 - - - -Layer ID# 30148 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 6.0 0 0 0 0 0 -Cond(W/m2-K )166.7 0 0 0 0 0 -Spectral File GT_Extraweis None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.69 5.69 5.69 5.69 5.69 5.69 5.69 5.69 - 0 6.71 0.00 0.00 0.00 5.69 5.69 5.69 5.69 5.69 5.69 5.69 5.69 - 783 0.00 0.00 0.00 0.00 5.69 5.69 5.69 5.69 5.69 5.69 5.69 5.69 - 783 6.71 0.00 0.00 0.00 5.69 5.69 5.69 5.69 5.69 5.69 5.69 5.69 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Extraweiss8mm -Window ID : 109 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.874 0.852 0.851 0.848 0.840 0.821 0.774 0.661 0.409 0.000 0.776 -Abs1 0.049 0.049 0.050 0.052 0.054 0.056 0.059 0.060 0.059 0.000 0.055 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.077 0.098 0.098 0.100 0.106 0.123 0.168 0.279 0.532 1.000 0.160 -Rbsol 0.077 0.098 0.098 0.100 0.106 0.123 0.168 0.279 0.532 1.000 0.160 -Tvis 0.898 0.860 0.859 0.857 0.850 0.831 0.786 0.673 0.420 0.000 0.785 -Rfvis 0.081 0.118 0.119 0.120 0.126 0.144 0.188 0.300 0.553 1.000 0.180 -Rbvis 0.081 0.118 0.119 0.120 0.126 0.144 0.188 0.300 0.553 1.000 0.180 -SHGC 0.886 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.898 - - - -Layer ID# 30059 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 8.0 0 0 0 0 0 -Cond(W/m2-K )125.0 0 0 0 0 0 -Spectral File GT_Extraweis None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.62 5.62 5.62 5.62 5.62 5.62 5.62 5.62 - 0 6.71 0.00 0.00 0.00 5.62 5.62 5.62 5.62 5.62 5.62 5.62 5.62 - 783 0.00 0.00 0.00 0.00 5.62 5.62 5.62 5.62 5.62 5.62 5.62 5.62 - 783 6.71 0.00 0.00 0.00 5.62 5.62 5.62 5.62 5.62 5.62 5.62 5.62 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Extraweiss10mm -Window ID : 110 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.865 0.865 0.864 0.860 0.852 0.832 0.784 0.670 0.414 0.000 0.786 -Abs1 0.056 0.056 0.057 0.059 0.061 0.063 0.066 0.067 0.066 0.000 0.061 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.079 0.079 0.080 0.081 0.087 0.105 0.150 0.263 0.521 1.000 0.142 -Rbsol 0.079 0.079 0.080 0.081 0.087 0.105 0.150 0.263 0.521 1.000 0.142 -Tvis 0.895 0.895 0.894 0.891 0.884 0.865 0.817 0.700 0.436 0.000 0.817 -Rfvis 0.080 0.080 0.080 0.082 0.088 0.106 0.153 0.269 0.532 1.000 0.145 -Rbvis 0.080 0.080 0.080 0.082 0.088 0.106 0.153 0.269 0.532 1.000 0.145 -SHGC 0.878 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.895 - - - -Layer ID# 30058 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 10.0 0 0 0 0 0 -Cond(W/m2-K )100.0 0 0 0 0 0 -Spectral File GT_Extraweis None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.56 5.56 5.56 5.56 5.56 5.56 5.56 5.56 - 0 6.71 0.00 0.00 0.00 5.56 5.56 5.56 5.56 5.56 5.56 5.56 5.56 - 783 0.00 0.00 0.00 0.00 5.56 5.56 5.56 5.56 5.56 5.56 5.56 5.56 - 783 6.71 0.00 0.00 0.00 5.56 5.56 5.56 5.56 5.56 5.56 5.56 5.56 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Extraweiss12mm -Window ID : 111 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.855 0.855 0.853 0.849 0.840 0.820 0.772 0.659 0.405 0.000 0.775 -Abs1 0.069 0.070 0.071 0.073 0.076 0.079 0.082 0.084 0.081 0.000 0.076 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.076 0.076 0.076 0.078 0.084 0.101 0.146 0.257 0.514 1.000 0.138 -Rbsol 0.076 0.076 0.076 0.078 0.084 0.101 0.146 0.257 0.514 1.000 0.138 -Tvis 0.890 0.889 0.889 0.886 0.878 0.859 0.811 0.694 0.432 0.000 0.811 -Rfvis 0.080 0.080 0.080 0.082 0.088 0.106 0.152 0.267 0.530 1.000 0.144 -Rbvis 0.080 0.080 0.080 0.082 0.088 0.106 0.152 0.267 0.530 1.000 0.144 -SHGC 0.871 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.890 - - - -Layer ID# 30057 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 12.0 0 0 0 0 0 -Cond(W/m2-K ) 83.3 0 0 0 0 0 -Spectral File GT_Extraweis None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 - 0 6.71 0.00 0.00 0.00 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 - 783 0.00 0.00 0.00 0.00 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 - 783 6.71 0.00 0.00 0.00 5.50 5.50 5.50 5.50 5.50 5.50 5.50 5.50 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : Extraweiss14mm -Window ID : 112 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.845 0.845 0.843 0.839 0.830 0.809 0.761 0.649 0.398 0.000 0.765 -Abs1 0.080 0.080 0.082 0.084 0.087 0.091 0.094 0.096 0.092 0.000 0.088 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.075 0.075 0.075 0.077 0.083 0.100 0.144 0.255 0.510 1.000 0.137 -Rbsol 0.075 0.075 0.075 0.077 0.083 0.100 0.144 0.255 0.510 1.000 0.137 -Tvis 0.885 0.885 0.884 0.881 0.873 0.854 0.806 0.689 0.428 0.000 0.807 -Rfvis 0.079 0.079 0.079 0.081 0.087 0.105 0.151 0.266 0.527 1.000 0.143 -Rbvis 0.079 0.079 0.079 0.081 0.087 0.105 0.151 0.266 0.527 1.000 0.143 -SHGC 0.864 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.885 - - - -Layer ID# 30056 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 14.0 0 0 0 0 0 -Cond(W/m2-K ) 71.4 0 0 0 0 0 -Spectral File GT_Extraweis None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.44 5.44 5.44 5.44 5.44 5.44 5.44 5.44 - 0 6.71 0.00 0.00 0.00 5.44 5.44 5.44 5.44 5.44 5.44 5.44 5.44 - 783 0.00 0.00 0.00 0.00 5.44 5.44 5.44 5.44 5.44 5.44 5.44 5.44 - 783 6.71 0.00 0.00 0.00 5.44 5.44 5.44 5.44 5.44 5.44 5.44 5.44 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : VSG6-2 -Window ID : 113 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.728 0.727 0.725 0.720 0.710 0.690 0.646 0.547 0.332 0.000 0.653 -Abs1 0.197 0.149 0.151 0.154 0.159 0.164 0.168 0.167 0.150 0.000 0.158 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.075 0.124 0.124 0.126 0.131 0.146 0.186 0.286 0.518 1.000 0.179 -Rbsol 0.075 0.124 0.124 0.126 0.131 0.146 0.186 0.286 0.518 1.000 0.179 -Tvis 0.807 0.807 0.805 0.802 0.793 0.774 0.729 0.622 0.383 0.000 0.732 -Rfvis 0.082 0.111 0.112 0.113 0.119 0.136 0.179 0.286 0.531 1.000 0.171 -Rbvis 0.082 0.111 0.112 0.113 0.119 0.136 0.179 0.286 0.531 1.000 0.171 -SHGC 0.774 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.807 - - - -Layer ID# 30048 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 6.8 0 0 0 0 0 -Cond(W/m2-K )147.9 0 0 0 0 0 -Spectral File GT_VSG_6-2.t None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.66 5.66 5.66 5.66 5.66 5.66 5.66 5.66 - 0 6.71 0.00 0.00 0.00 5.66 5.66 5.66 5.66 5.66 5.66 5.66 5.66 - 783 0.00 0.00 0.00 0.00 5.66 5.66 5.66 5.66 5.66 5.66 5.66 5.66 - 783 6.71 0.00 0.00 0.00 5.66 5.66 5.66 5.66 5.66 5.66 5.66 5.66 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : VSG6-2EW -Window ID : 114 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.824 0.824 0.823 0.820 0.812 0.793 0.748 0.639 0.396 0.000 0.750 -Abs1 0.100 0.075 0.075 0.077 0.079 0.081 0.082 0.080 0.072 0.000 0.078 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.076 0.101 0.102 0.103 0.109 0.126 0.170 0.280 0.532 1.000 0.162 -Rbsol 0.076 0.101 0.102 0.103 0.109 0.126 0.170 0.280 0.532 1.000 0.162 -Tvis 0.871 0.871 0.870 0.868 0.860 0.842 0.795 0.682 0.425 0.000 0.795 -Rfvis 0.079 0.079 0.079 0.081 0.087 0.105 0.151 0.266 0.529 1.000 0.143 -Rbvis 0.079 0.079 0.079 0.081 0.087 0.105 0.151 0.266 0.529 1.000 0.143 -SHGC 0.848 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.871 - - - -Layer ID# 30047 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 6.8 0 0 0 0 0 -Cond(W/m2-K )147.9 0 0 0 0 0 -Spectral File GT_VSG_6-2EW None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.66 5.66 5.66 5.66 5.66 5.66 5.66 5.66 - 0 6.71 0.00 0.00 0.00 5.66 5.66 5.66 5.66 5.66 5.66 5.66 5.66 - 783 0.00 0.00 0.00 0.00 5.66 5.66 5.66 5.66 5.66 5.66 5.66 5.66 - 783 6.71 0.00 0.00 0.00 5.66 5.66 5.66 5.66 5.66 5.66 5.66 5.66 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : VSG8-2 -Window ID : 115 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.707 0.706 0.703 0.698 0.687 0.667 0.623 0.527 0.318 0.000 0.632 -Abs1 0.220 0.172 0.174 0.179 0.184 0.190 0.194 0.193 0.171 0.000 0.182 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.073 0.122 0.122 0.123 0.129 0.143 0.183 0.281 0.511 1.000 0.176 -Rbsol 0.073 0.122 0.122 0.123 0.129 0.143 0.183 0.281 0.511 1.000 0.176 -Tvis 0.797 0.796 0.794 0.790 0.782 0.762 0.717 0.611 0.375 0.000 0.721 -Rfvis 0.080 0.110 0.110 0.112 0.117 0.134 0.176 0.282 0.526 1.000 0.169 -Rbvis 0.080 0.110 0.110 0.112 0.117 0.134 0.176 0.282 0.526 1.000 0.169 -SHGC 0.759 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.797 - - - -Layer ID# 30046 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 8.8 0 0 0 0 0 -Cond(W/m2-K )114.2 0 0 0 0 0 -Spectral File GT_VSG_8-2.t None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.60 5.60 5.60 5.60 5.60 5.60 5.60 5.60 - 0 6.71 0.00 0.00 0.00 5.60 5.60 5.60 5.60 5.60 5.60 5.60 5.60 - 783 0.00 0.00 0.00 0.00 5.60 5.60 5.60 5.60 5.60 5.60 5.60 5.60 - 783 6.71 0.00 0.00 0.00 5.60 5.60 5.60 5.60 5.60 5.60 5.60 5.60 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : VSG8-2EW -Window ID : 116 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.812 0.812 0.810 0.807 0.799 0.780 0.735 0.627 0.387 0.000 0.737 -Abs1 0.113 0.081 0.082 0.084 0.086 0.089 0.090 0.090 0.081 0.000 0.085 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.075 0.107 0.107 0.109 0.115 0.131 0.175 0.283 0.531 1.000 0.167 -Rbsol 0.075 0.107 0.107 0.109 0.115 0.131 0.175 0.283 0.531 1.000 0.167 -Tvis 0.865 0.865 0.864 0.861 0.854 0.836 0.789 0.676 0.421 0.000 0.790 -Rfvis 0.079 0.079 0.079 0.081 0.087 0.105 0.151 0.265 0.527 1.000 0.143 -Rbvis 0.079 0.079 0.079 0.081 0.087 0.105 0.151 0.265 0.527 1.000 0.143 -SHGC 0.839 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.865 - - - -Layer ID# 30045 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 8.8 0 0 0 0 0 -Cond(W/m2-K )114.2 0 0 0 0 0 -Spectral File GT_VSG_8-2EW None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.60 5.60 5.60 5.60 5.60 5.60 5.60 5.60 - 0 6.71 0.00 0.00 0.00 5.60 5.60 5.60 5.60 5.60 5.60 5.60 5.60 - 783 0.00 0.00 0.00 0.00 5.60 5.60 5.60 5.60 5.60 5.60 5.60 5.60 - 783 6.71 0.00 0.00 0.00 5.60 5.60 5.60 5.60 5.60 5.60 5.60 5.60 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : VSG_2x5mm -Window ID : 117 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.682 0.681 0.678 0.672 0.661 0.640 0.597 0.504 0.302 0.000 0.607 -Abs1 0.246 0.198 0.201 0.206 0.212 0.218 0.223 0.220 0.194 0.000 0.209 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.072 0.121 0.121 0.122 0.127 0.142 0.180 0.276 0.504 1.000 0.174 -Rbsol 0.072 0.121 0.121 0.122 0.127 0.142 0.180 0.276 0.504 1.000 0.174 -Tvis 0.780 0.779 0.777 0.773 0.763 0.743 0.698 0.594 0.363 0.000 0.703 -Rfvis 0.079 0.109 0.109 0.110 0.116 0.132 0.174 0.278 0.520 1.000 0.167 -Rbvis 0.079 0.109 0.109 0.110 0.116 0.132 0.174 0.278 0.520 1.000 0.167 -SHGC 0.740 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.780 - - - -Layer ID# 30105 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 10.8 0 0 0 0 0 -Cond(W/m2-K ) 92.9 0 0 0 0 0 -Spectral File GT_VSG10-2.t None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.54 5.54 5.54 5.54 5.54 5.54 5.54 5.54 - 0 6.71 0.00 0.00 0.00 5.54 5.54 5.54 5.54 5.54 5.54 5.54 5.54 - 783 0.00 0.00 0.00 0.00 5.54 5.54 5.54 5.54 5.54 5.54 5.54 5.54 - 783 6.71 0.00 0.00 0.00 5.54 5.54 5.54 5.54 5.54 5.54 5.54 5.54 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : VSG_2x5mm_extraweiss -Window ID : 118 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.801 0.801 0.799 0.796 0.788 0.769 0.724 0.617 0.380 0.000 0.727 -Abs1 0.124 0.075 0.076 0.078 0.081 0.084 0.086 0.087 0.081 0.000 0.081 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.075 0.124 0.124 0.126 0.131 0.148 0.190 0.296 0.539 1.000 0.182 -Rbsol 0.075 0.124 0.124 0.126 0.131 0.148 0.190 0.296 0.539 1.000 0.182 -Tvis 0.860 0.860 0.859 0.857 0.849 0.831 0.784 0.672 0.418 0.000 0.785 -Rfvis 0.079 0.109 0.109 0.111 0.117 0.134 0.179 0.291 0.545 1.000 0.171 -Rbvis 0.079 0.109 0.109 0.111 0.117 0.134 0.179 0.291 0.545 1.000 0.171 -SHGC 0.831 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.860 - - - -Layer ID# 30044 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 10.8 0 0 0 0 0 -Cond(W/m2-K ) 92.9 0 0 0 0 0 -Spectral File GT_VSG_10-2E None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.54 5.54 5.54 5.54 5.54 5.54 5.54 5.54 - 0 6.71 0.00 0.00 0.00 5.54 5.54 5.54 5.54 5.54 5.54 5.54 5.54 - 783 0.00 0.00 0.00 0.00 5.54 5.54 5.54 5.54 5.54 5.54 5.54 5.54 - 783 6.71 0.00 0.00 0.00 5.54 5.54 5.54 5.54 5.54 5.54 5.54 5.54 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : VSG12-2 -Window ID : 119 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.654 0.653 0.650 0.643 0.632 0.611 0.569 0.479 0.286 0.000 0.580 -Abs1 0.274 0.226 0.229 0.234 0.241 0.247 0.251 0.247 0.214 0.000 0.237 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.072 0.121 0.121 0.122 0.127 0.142 0.179 0.274 0.500 1.000 0.173 -Rbsol 0.072 0.121 0.121 0.122 0.127 0.142 0.179 0.274 0.500 1.000 0.173 -Tvis 0.766 0.766 0.763 0.759 0.749 0.729 0.684 0.581 0.354 0.000 0.690 -Rfvis 0.080 0.109 0.109 0.111 0.117 0.132 0.174 0.277 0.517 1.000 0.166 -Rbvis 0.080 0.109 0.109 0.111 0.117 0.132 0.174 0.277 0.517 1.000 0.166 -SHGC 0.719 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.766 - - - -Layer ID# 30043 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 12.8 0 0 0 0 0 -Cond(W/m2-K ) 78.4 0 0 0 0 0 -Spectral File GT_VSG_12-2. None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.48 5.48 5.48 5.48 5.48 5.48 5.48 5.48 - 0 6.71 0.00 0.00 0.00 5.48 5.48 5.48 5.48 5.48 5.48 5.48 5.48 - 783 0.00 0.00 0.00 0.00 5.48 5.48 5.48 5.48 5.48 5.48 5.48 5.48 - 783 6.71 0.00 0.00 0.00 5.48 5.48 5.48 5.48 5.48 5.48 5.48 5.48 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : VSG12-2EW -Window ID : 120 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.793 0.793 0.791 0.787 0.779 0.760 0.715 0.609 0.375 0.000 0.718 -Abs1 0.132 0.083 0.084 0.086 0.089 0.092 0.095 0.096 0.089 0.000 0.089 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.075 0.124 0.125 0.126 0.132 0.148 0.190 0.295 0.537 1.000 0.182 -Rbsol 0.075 0.124 0.125 0.126 0.132 0.148 0.190 0.295 0.537 1.000 0.182 -Tvis 0.858 0.858 0.857 0.854 0.846 0.828 0.781 0.669 0.416 0.000 0.782 -Rfvis 0.080 0.109 0.109 0.111 0.117 0.134 0.179 0.290 0.544 1.000 0.171 -Rbvis 0.080 0.109 0.109 0.111 0.117 0.134 0.179 0.290 0.544 1.000 0.171 -SHGC 0.824 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.858 - - - -Layer ID# 30042 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 12.8 0 0 0 0 0 -Cond(W/m2-K ) 78.4 0 0 0 0 0 -Spectral File GT_VSG_12-2E None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.48 5.48 5.48 5.48 5.48 5.48 5.48 5.48 - 0 6.71 0.00 0.00 0.00 5.48 5.48 5.48 5.48 5.48 5.48 5.48 5.48 - 783 0.00 0.00 0.00 0.00 5.48 5.48 5.48 5.48 5.48 5.48 5.48 5.48 - 783 6.71 0.00 0.00 0.00 5.48 5.48 5.48 5.48 5.48 5.48 5.48 5.48 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : VSG14-2 -Window ID : 121 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.629 0.628 0.624 0.617 0.605 0.583 0.541 0.453 0.269 0.000 0.553 -Abs1 0.307 0.259 0.263 0.269 0.276 0.284 0.289 0.283 0.243 0.000 0.272 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.064 0.113 0.113 0.114 0.119 0.133 0.170 0.263 0.488 1.000 0.164 -Rbsol 0.064 0.113 0.113 0.114 0.119 0.133 0.170 0.263 0.488 1.000 0.164 -Tvis 0.751 0.750 0.747 0.742 0.732 0.711 0.666 0.564 0.341 0.000 0.673 -Rfvis 0.072 0.102 0.102 0.104 0.109 0.125 0.165 0.268 0.506 1.000 0.159 -Rbvis 0.072 0.102 0.102 0.104 0.109 0.125 0.165 0.268 0.506 1.000 0.159 -SHGC 0.701 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.751 - - - -Layer ID# 30041 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 14.8 0 0 0 0 0 -Cond(W/m2-K ) 67.8 0 0 0 0 0 -Spectral File GT_VSG_14-2. None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.42 5.42 5.42 5.42 5.42 5.42 5.42 5.42 - 0 6.71 0.00 0.00 0.00 5.42 5.42 5.42 5.42 5.42 5.42 5.42 5.42 - 783 0.00 0.00 0.00 0.00 5.42 5.42 5.42 5.42 5.42 5.42 5.42 5.42 - 783 6.71 0.00 0.00 0.00 5.42 5.42 5.42 5.42 5.42 5.42 5.42 5.42 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : VSG14-2EW -Window ID : 122 -Tilt : 90.0 -Glazings : 1 -Frame : 6 Wood 2.270 -Spacer : 1 Class1 2.330 -0.010 0.138 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.781 0.780 0.778 0.774 0.765 0.746 0.701 0.597 0.366 0.000 0.705 -Abs1 0.147 0.098 0.100 0.102 0.105 0.109 0.112 0.113 0.103 0.000 0.105 -Abs2 0 0 0 0 0 0 0 0 0 0 0 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.073 0.122 0.122 0.124 0.129 0.145 0.187 0.291 0.531 1.000 0.179 -Rbsol 0.073 0.122 0.122 0.124 0.129 0.145 0.187 0.291 0.531 1.000 0.179 -Tvis 0.849 0.849 0.848 0.845 0.837 0.818 0.772 0.660 0.409 0.000 0.773 -Rfvis 0.078 0.108 0.108 0.110 0.116 0.133 0.177 0.288 0.540 1.000 0.169 -Rbvis 0.078 0.108 0.108 0.110 0.116 0.133 0.177 0.288 0.540 1.000 0.169 -SHGC 0.815 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.849 - - - -Layer ID# 30062 0 0 0 0 0 -Tir 0.000 0 0 0 0 0 -Emis F 0.890 0 0 0 0 0 -Emis B 0.890 0 0 0 0 0 -Thickness(mm) 14.8 0 0 0 0 0 -Cond(W/m2-K ) 67.8 0 0 0 0 0 -Spectral File GT_VSG_14-2E None None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 5.42 5.42 5.42 5.42 5.42 5.42 5.42 5.42 - 0 6.71 0.00 0.00 0.00 5.42 5.42 5.42 5.42 5.42 5.42 5.42 5.42 - 783 0.00 0.00 0.00 0.00 5.42 5.42 5.42 5.42 5.42 5.42 5.42 5.42 - 783 6.71 0.00 0.00 0.00 5.42 5.42 5.42 5.42 5.42 5.42 5.42 5.42 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : 2-WSV_#3_Air -Window ID : 200 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Air 12.0 0.02407 7.760 1.722 4.940 1.276 -0.0045 0.720 -0.0002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.562 0.562 0.558 0.552 0.544 0.522 0.467 0.353 0.175 0.000 0.483 -Abs1 0.104 0.105 0.107 0.110 0.114 0.119 0.125 0.130 0.127 0.000 0.116 -Abs2 0.095 0.095 0.097 0.098 0.097 0.095 0.092 0.082 0.051 0.000 0.091 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.239 0.238 0.238 0.240 0.246 0.265 0.317 0.435 0.647 1.000 0.300 -Rbsol 0.249 0.249 0.250 0.252 0.260 0.280 0.332 0.449 0.666 1.000 0.314 -Tvis 0.741 0.740 0.735 0.729 0.718 0.689 0.616 0.465 0.230 0.000 0.638 -Rfvis 0.129 0.128 0.129 0.133 0.143 0.170 0.240 0.394 0.653 1.000 0.215 -Rbvis 0.126 0.125 0.126 0.129 0.139 0.165 0.230 0.373 0.627 1.000 0.207 -SHGC 0.660 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 33000 33009 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.040 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33009_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.58 1.58 1.65 1.65 1.69 1.69 1.72 1.72 - 0 6.71 0.00 0.00 0.00 1.58 1.58 1.65 1.65 1.69 1.69 1.72 1.72 - 783 0.00 0.00 0.00 0.00 1.58 1.58 1.65 1.65 1.69 1.69 1.72 1.72 - 783 6.71 0.00 0.00 0.00 1.58 1.58 1.65 1.65 1.69 1.69 1.72 1.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : 2-WSV_#3_Ar90 -Window ID : 201 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.504 0.507 0.499 0.489 0.475 0.449 0.392 0.284 0.130 0.000 0.418 -Abs1 0.171 0.172 0.174 0.178 0.184 0.191 0.197 0.199 0.184 0.000 0.185 -Abs2 0.094 0.095 0.103 0.108 0.109 0.112 0.121 0.125 0.086 0.000 0.109 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.230 0.226 0.224 0.225 0.231 0.248 0.290 0.391 0.600 1.000 0.279 -Rbsol 0.232 0.226 0.224 0.226 0.237 0.256 0.294 0.382 0.582 0.999 0.280 -Tvis 0.717 0.721 0.711 0.697 0.678 0.641 0.559 0.405 0.186 0.000 0.596 -Rfvis 0.133 0.127 0.126 0.130 0.142 0.169 0.229 0.365 0.620 1.000 0.207 -Rbvis 0.131 0.124 0.121 0.124 0.136 0.160 0.208 0.313 0.540 0.999 0.189 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.780 - - - -Layer ID# 7199 37003 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 6.0 0 0 0 0 -Cond(W/m2-K )166.7 166.7 0 0 0 0 -Spectral File ip_fl_6.ipe 37003_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - 0 6.71 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - 783 0.00 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - 783 6.71 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : 2-WSV_#3_Kr90 -Window ID : 202 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.543 0.546 0.538 0.528 0.514 0.486 0.426 0.310 0.145 0.000 0.452 -Abs1 0.107 0.108 0.109 0.112 0.116 0.121 0.126 0.130 0.124 0.000 0.118 -Abs2 0.085 0.087 0.094 0.100 0.102 0.106 0.119 0.127 0.091 0.000 0.104 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.264 0.260 0.258 0.259 0.267 0.286 0.329 0.433 0.640 1.000 0.315 -Rbsol 0.255 0.249 0.247 0.249 0.260 0.279 0.317 0.404 0.599 0.999 0.302 -Tvis 0.749 0.754 0.743 0.729 0.710 0.672 0.588 0.427 0.198 0.000 0.625 -Rfvis 0.138 0.132 0.131 0.135 0.148 0.176 0.238 0.378 0.639 1.000 0.215 -Rbvis 0.135 0.128 0.125 0.128 0.140 0.165 0.213 0.319 0.546 0.999 0.194 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 7197 37001 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File ip_fl_4.ipe 37001_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : 3-WSV_#2#5_Ar90 -Window ID : 300 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.425 0.429 0.417 0.403 0.386 0.355 0.289 0.181 0.066 0.000 0.329 -Abs1 0.176 0.178 0.188 0.196 0.199 0.207 0.232 0.267 0.244 0.001 0.211 -Abs2 0.050 0.050 0.050 0.051 0.052 0.053 0.052 0.047 0.036 0.000 0.049 -Abs3 0.055 0.056 0.061 0.065 0.066 0.067 0.072 0.068 0.039 0.000 0.064 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.296 0.287 0.283 0.285 0.297 0.318 0.355 0.437 0.616 0.999 0.337 -Rbsol 0.296 0.287 0.283 0.285 0.297 0.318 0.355 0.437 0.616 0.999 0.337 -Tvis 0.642 0.649 0.632 0.611 0.585 0.537 0.437 0.273 0.099 0.000 0.497 -Rfvis 0.173 0.162 0.157 0.161 0.177 0.206 0.257 0.362 0.571 0.999 0.231 -Rbvis 0.173 0.162 0.157 0.161 0.177 0.206 0.257 0.362 0.571 0.999 0.231 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.720 - - - -Layer ID# 37001 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 37001_IP_ipl ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.66 0.66 0.60 0.60 0.61 0.61 0.62 0.62 - 0 6.71 0.00 0.00 0.00 0.66 0.66 0.60 0.60 0.61 0.61 0.62 0.62 - 783 0.00 0.00 0.00 0.00 0.66 0.66 0.60 0.60 0.61 0.61 0.62 0.62 - 783 6.71 0.00 0.00 0.00 0.66 0.66 0.60 0.60 0.61 0.61 0.62 0.62 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : 3-WSV_#2#5_Kr90 -Window ID : 301 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.425 0.429 0.417 0.403 0.386 0.355 0.289 0.181 0.066 0.000 0.329 -Abs1 0.176 0.178 0.188 0.196 0.199 0.207 0.232 0.267 0.244 0.001 0.211 -Abs2 0.050 0.050 0.050 0.051 0.052 0.053 0.052 0.047 0.036 0.000 0.049 -Abs3 0.055 0.056 0.061 0.065 0.066 0.067 0.072 0.068 0.039 0.000 0.064 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.296 0.287 0.283 0.285 0.297 0.318 0.355 0.437 0.616 0.999 0.337 -Rbsol 0.296 0.287 0.283 0.285 0.297 0.318 0.355 0.437 0.616 0.999 0.337 -Tvis 0.642 0.649 0.632 0.611 0.585 0.537 0.437 0.273 0.099 0.000 0.497 -Rfvis 0.173 0.162 0.157 0.161 0.177 0.206 0.257 0.362 0.571 0.999 0.231 -Rbvis 0.173 0.162 0.157 0.161 0.177 0.206 0.257 0.362 0.571 0.999 0.231 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.720 - - - -Layer ID# 37001 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 37001_IP_ipl ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 0 6.71 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 783 0.00 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 783 6.71 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : 2-SSV_60/33_#2_Ar90 -Window ID : 400 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.301 0.303 0.299 0.293 0.286 0.271 0.237 0.173 0.081 0.000 0.252 -Abs1 0.395 0.398 0.404 0.407 0.406 0.405 0.409 0.400 0.311 0.001 0.395 -Abs2 0.013 0.013 0.013 0.013 0.013 0.014 0.013 0.012 0.009 0.000 0.013 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.291 0.286 0.284 0.286 0.295 0.311 0.341 0.416 0.599 0.999 0.330 -Rbsol 0.347 0.343 0.341 0.341 0.347 0.361 0.397 0.484 0.664 1.000 0.386 -Tvis 0.491 0.494 0.487 0.478 0.466 0.441 0.386 0.281 0.131 0.000 0.410 -Rfvis 0.150 0.143 0.141 0.144 0.155 0.175 0.213 0.306 0.526 0.999 0.201 -Rbvis 0.167 0.161 0.160 0.164 0.176 0.203 0.261 0.394 0.646 1.000 0.240 -SHGC 0.330 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.600 - - - -Layer ID# 37161 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.837 0 0 0 0 -Emis B 0.013 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37161_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : 2-SSV_41/22_#2_Ar90 -Window ID : 500 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.256 0.259 0.252 0.244 0.233 0.214 0.175 0.110 0.040 0.000 0.199 -Abs1 0.402 0.405 0.411 0.414 0.413 0.413 0.418 0.411 0.319 0.001 0.403 -Abs2 0.016 0.016 0.016 0.016 0.016 0.017 0.017 0.016 0.013 0.000 0.016 -Abs3 0.026 0.027 0.030 0.032 0.033 0.034 0.038 0.037 0.022 0.000 0.033 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.301 0.294 0.292 0.294 0.304 0.321 0.352 0.427 0.606 0.999 0.339 -Rbsol 0.324 0.316 0.311 0.312 0.322 0.340 0.372 0.447 0.619 0.999 0.358 -Tvis 0.427 0.432 0.420 0.406 0.389 0.357 0.291 0.182 0.066 0.000 0.331 -Rfvis 0.165 0.156 0.154 0.157 0.169 0.192 0.232 0.325 0.538 0.999 0.216 -Rbvis 0.191 0.180 0.175 0.177 0.193 0.220 0.268 0.368 0.572 0.999 0.244 -SHGC 0.300 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.540 - - - -Layer ID# 37161 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.840 0.837 0.037 0 0 0 -Emis B 0.013 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37161_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 0 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : 2-SSV_41/22_#2_Ar90 -Window ID : 401 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.196 0.197 0.195 0.191 0.186 0.177 0.155 0.114 0.055 0.000 0.164 -Abs1 0.478 0.482 0.486 0.487 0.484 0.479 0.474 0.447 0.333 0.001 0.464 -Abs2 0.007 0.007 0.007 0.007 0.007 0.007 0.007 0.006 0.005 0.000 0.007 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.319 0.314 0.313 0.315 0.323 0.337 0.364 0.432 0.608 0.999 0.355 -Rbsol 0.397 0.393 0.391 0.392 0.396 0.409 0.441 0.520 0.685 1.000 0.431 -Tvis 0.321 0.323 0.319 0.313 0.305 0.289 0.254 0.187 0.089 0.000 0.269 -Rfvis 0.214 0.208 0.206 0.209 0.218 0.235 0.267 0.348 0.551 0.999 0.257 -Rbvis 0.249 0.243 0.242 0.245 0.256 0.278 0.328 0.445 0.671 1.000 0.310 -SHGC 0.220 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.410 - - - -Layer ID# 44293 44007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.012 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44293_GT_COM 44007_GT_EUR None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : 3-SSV_36/20_#2#5_AR90 -Window ID : 501 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.166 0.168 0.163 0.158 0.151 0.140 0.114 0.073 0.027 0.000 0.129 -Abs1 0.485 0.489 0.493 0.494 0.491 0.487 0.483 0.456 0.339 0.001 0.472 -Abs2 0.008 0.008 0.008 0.009 0.009 0.009 0.009 0.008 0.007 0.000 0.009 -Abs3 0.016 0.016 0.019 0.020 0.021 0.022 0.024 0.024 0.015 0.000 0.021 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.325 0.319 0.317 0.320 0.328 0.342 0.370 0.438 0.611 0.999 0.360 -Rbsol 0.378 0.371 0.365 0.364 0.372 0.387 0.412 0.475 0.633 0.999 0.402 -Tvis 0.277 0.280 0.272 0.264 0.253 0.233 0.191 0.121 0.045 0.000 0.216 -Rfvis 0.223 0.216 0.214 0.216 0.226 0.244 0.277 0.357 0.557 0.999 0.266 -Rbvis 0.267 0.258 0.251 0.251 0.263 0.285 0.320 0.402 0.588 0.999 0.304 -SHGC 0.200 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.360 - - - -Layer ID# 44293 44007 44066 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.012 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 44293_GT_COM 44007_GT_EUR 44066_GT_ENp None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 0 6.71 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 783 0.00 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 783 6.71 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_N_#3_Air -Window ID : 3200 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Air 12.0 0.02407 7.760 1.722 4.940 1.276 -0.0045 0.720 -0.0002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.562 0.562 0.558 0.552 0.544 0.522 0.467 0.353 0.175 0.000 0.483 -Abs1 0.104 0.105 0.107 0.110 0.114 0.119 0.125 0.130 0.127 0.000 0.116 -Abs2 0.095 0.095 0.097 0.098 0.097 0.095 0.092 0.082 0.051 0.000 0.091 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.239 0.238 0.238 0.240 0.246 0.265 0.317 0.435 0.647 1.000 0.300 -Rbsol 0.249 0.249 0.250 0.252 0.260 0.280 0.332 0.449 0.666 1.000 0.314 -Tvis 0.741 0.740 0.735 0.729 0.718 0.689 0.616 0.465 0.230 0.000 0.638 -Rfvis 0.129 0.128 0.129 0.133 0.143 0.170 0.240 0.394 0.653 1.000 0.215 -Rbvis 0.126 0.125 0.126 0.129 0.139 0.165 0.230 0.373 0.627 1.000 0.207 -SHGC 0.660 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 33000 33009 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.040 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33009_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.58 1.58 1.65 1.65 1.69 1.69 1.72 1.72 - 0 6.71 0.00 0.00 0.00 1.58 1.58 1.65 1.65 1.69 1.69 1.72 1.72 - 783 0.00 0.00 0.00 0.00 1.58 1.58 1.65 1.65 1.69 1.69 1.72 1.72 - 783 6.71 0.00 0.00 0.00 1.58 1.58 1.65 1.65 1.69 1.69 1.72 1.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_N_#3_Ar90 -Window ID : 3201 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.562 0.562 0.558 0.552 0.544 0.522 0.467 0.353 0.175 0.000 0.483 -Abs1 0.104 0.105 0.107 0.110 0.114 0.119 0.125 0.130 0.127 0.000 0.116 -Abs2 0.095 0.095 0.097 0.098 0.097 0.095 0.092 0.082 0.051 0.000 0.091 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.239 0.238 0.238 0.240 0.246 0.265 0.317 0.435 0.647 1.000 0.300 -Rbsol 0.249 0.249 0.250 0.252 0.260 0.280 0.332 0.449 0.666 1.000 0.314 -Tvis 0.741 0.740 0.735 0.729 0.718 0.689 0.616 0.465 0.230 0.000 0.638 -Rfvis 0.129 0.128 0.129 0.133 0.143 0.170 0.240 0.394 0.653 1.000 0.215 -Rbvis 0.126 0.125 0.126 0.129 0.139 0.165 0.230 0.373 0.627 1.000 0.207 -SHGC 0.660 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 33000 33009 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.040 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33009_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - 0 6.71 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - 783 0.00 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - 783 6.71 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_N_#3_Kr90 -Window ID : 3202 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.562 0.562 0.558 0.552 0.544 0.522 0.467 0.353 0.175 0.000 0.483 -Abs1 0.104 0.105 0.107 0.110 0.114 0.119 0.125 0.130 0.127 0.000 0.116 -Abs2 0.095 0.095 0.097 0.098 0.097 0.095 0.092 0.082 0.051 0.000 0.091 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.239 0.238 0.238 0.240 0.246 0.265 0.317 0.435 0.647 1.000 0.300 -Rbsol 0.249 0.249 0.250 0.252 0.260 0.280 0.332 0.449 0.666 1.000 0.314 -Tvis 0.741 0.740 0.735 0.729 0.718 0.689 0.616 0.465 0.230 0.000 0.638 -Rfvis 0.129 0.128 0.129 0.133 0.143 0.170 0.240 0.394 0.653 1.000 0.215 -Rbvis 0.126 0.125 0.126 0.129 0.139 0.165 0.230 0.373 0.627 1.000 0.207 -SHGC 0.660 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 33000 33009 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.040 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33009_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.28 1.28 1.06 1.06 1.09 1.09 1.11 1.11 - 0 6.71 0.00 0.00 0.00 1.28 1.28 1.06 1.06 1.09 1.09 1.11 1.11 - 783 0.00 0.00 0.00 0.00 1.28 1.28 1.06 1.06 1.09 1.09 1.11 1.11 - 783 6.71 0.00 0.00 0.00 1.28 1.28 1.06 1.06 1.09 1.09 1.11 1.11 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_NL_#3_Ar90 -Window ID : 3203 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.549 0.552 0.544 0.533 0.519 0.491 0.429 0.313 0.145 0.000 0.457 -Abs1 0.105 0.106 0.107 0.110 0.115 0.120 0.125 0.129 0.125 0.000 0.116 -Abs2 0.097 0.099 0.107 0.113 0.114 0.118 0.129 0.135 0.095 0.000 0.115 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.248 0.244 0.242 0.244 0.252 0.271 0.316 0.423 0.635 1.000 0.302 -Rbsol 0.248 0.242 0.240 0.242 0.252 0.272 0.310 0.398 0.594 0.999 0.295 -Tvis 0.730 0.734 0.724 0.710 0.692 0.654 0.572 0.415 0.192 0.000 0.608 -Rfvis 0.132 0.126 0.125 0.129 0.142 0.171 0.232 0.373 0.635 1.000 0.210 -Rbvis 0.129 0.122 0.120 0.122 0.135 0.159 0.207 0.312 0.540 0.999 0.188 -SHGC 0.650 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.780 - - - -Layer ID# 33000 33008 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.040 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33008_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - 0 6.71 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - 783 0.00 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - 783 6.71 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_NL_#3_Kr90 -Window ID : 3204 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.549 0.552 0.544 0.533 0.519 0.491 0.429 0.313 0.145 0.000 0.457 -Abs1 0.105 0.106 0.107 0.110 0.115 0.120 0.125 0.129 0.125 0.000 0.116 -Abs2 0.097 0.099 0.107 0.113 0.114 0.118 0.129 0.135 0.095 0.000 0.115 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.248 0.244 0.242 0.244 0.252 0.271 0.316 0.423 0.635 1.000 0.302 -Rbsol 0.248 0.242 0.240 0.242 0.252 0.272 0.310 0.398 0.594 0.999 0.295 -Tvis 0.730 0.734 0.724 0.710 0.692 0.654 0.572 0.415 0.192 0.000 0.608 -Rfvis 0.132 0.126 0.125 0.129 0.142 0.171 0.232 0.373 0.635 1.000 0.210 -Rbvis 0.129 0.122 0.120 0.122 0.135 0.159 0.207 0.312 0.540 0.999 0.188 -SHGC 0.630 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.770 - - - -Layer ID# 33000 33008 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.040 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33008_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.28 1.28 1.06 1.06 1.09 1.09 1.11 1.11 - 0 6.71 0.00 0.00 0.00 1.28 1.28 1.06 1.06 1.09 1.09 1.11 1.11 - 783 0.00 0.00 0.00 0.00 1.28 1.28 1.06 1.06 1.09 1.09 1.11 1.11 - 783 6.71 0.00 0.00 0.00 1.28 1.28 1.06 1.06 1.09 1.09 1.11 1.11 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_D_#3_Ar90 -Window ID : 3205 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.555 0.558 0.550 0.539 0.524 0.496 0.433 0.314 0.145 0.000 0.461 -Abs1 0.098 0.098 0.099 0.102 0.106 0.111 0.117 0.122 0.120 0.000 0.108 -Abs2 0.148 0.150 0.158 0.163 0.164 0.165 0.173 0.170 0.113 0.000 0.160 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.200 0.194 0.193 0.195 0.205 0.227 0.277 0.394 0.622 1.000 0.260 -Rbsol 0.186 0.179 0.177 0.180 0.190 0.211 0.251 0.344 0.556 0.999 0.237 -Tvis 0.698 0.702 0.693 0.680 0.662 0.626 0.547 0.396 0.183 0.000 0.582 -Rfvis 0.126 0.120 0.119 0.123 0.137 0.165 0.228 0.369 0.634 1.000 0.205 -Rbvis 0.121 0.114 0.111 0.114 0.126 0.150 0.197 0.301 0.531 0.999 0.179 -SHGC 0.700 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.740 - - - -Layer ID# 33000 33007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.120 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33007_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.55 1.55 1.36 1.36 1.40 1.40 1.44 1.44 - 0 6.71 0.00 0.00 0.00 1.55 1.55 1.36 1.36 1.40 1.40 1.44 1.44 - 783 0.00 0.00 0.00 0.00 1.55 1.55 1.36 1.36 1.40 1.40 1.44 1.44 - 783 6.71 0.00 0.00 0.00 1.55 1.55 1.36 1.36 1.40 1.40 1.44 1.44 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_D_#3_Kr90 -Window ID : 3206 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.555 0.558 0.550 0.539 0.524 0.496 0.433 0.314 0.145 0.000 0.461 -Abs1 0.098 0.098 0.099 0.102 0.106 0.111 0.117 0.122 0.120 0.000 0.108 -Abs2 0.148 0.150 0.158 0.163 0.164 0.165 0.173 0.170 0.113 0.000 0.160 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.200 0.194 0.193 0.195 0.205 0.227 0.277 0.394 0.622 1.000 0.260 -Rbsol 0.186 0.179 0.177 0.180 0.190 0.211 0.251 0.344 0.556 0.999 0.237 -Tvis 0.698 0.702 0.693 0.680 0.662 0.626 0.547 0.396 0.183 0.000 0.582 -Rfvis 0.126 0.120 0.119 0.123 0.137 0.165 0.228 0.369 0.634 1.000 0.205 -Rbvis 0.121 0.114 0.111 0.114 0.126 0.150 0.197 0.301 0.531 0.999 0.179 -SHGC 0.700 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.740 - - - -Layer ID# 33000 33007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.120 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33007_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.47 1.47 1.33 1.33 1.37 1.37 1.41 1.41 - 0 6.71 0.00 0.00 0.00 1.47 1.47 1.33 1.33 1.37 1.37 1.41 1.41 - 783 0.00 0.00 0.00 0.00 1.47 1.47 1.33 1.33 1.37 1.37 1.41 1.41 - 783 6.71 0.00 0.00 0.00 1.47 1.47 1.33 1.33 1.37 1.37 1.41 1.41 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_Premium_#3_Ar90 -Window ID : 3207 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.532 0.535 0.528 0.517 0.504 0.476 0.417 0.304 0.142 0.000 0.443 -Abs1 0.109 0.109 0.111 0.114 0.118 0.123 0.128 0.132 0.127 0.000 0.119 -Abs2 0.090 0.091 0.099 0.104 0.106 0.110 0.122 0.129 0.092 0.000 0.108 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.269 0.265 0.263 0.264 0.272 0.290 0.333 0.435 0.640 1.000 0.319 -Rbsol 0.277 0.271 0.269 0.271 0.281 0.300 0.337 0.421 0.610 0.999 0.322 -Tvis 0.733 0.737 0.726 0.713 0.694 0.657 0.575 0.417 0.193 0.000 0.611 -Rfvis 0.142 0.136 0.135 0.138 0.152 0.179 0.240 0.378 0.637 1.000 0.218 -Rbvis 0.144 0.137 0.134 0.137 0.149 0.173 0.220 0.325 0.549 0.999 0.202 -SHGC 0.630 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 33000 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.35 1.35 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.35 1.35 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.35 1.35 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.35 1.35 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_Premium_#3_Kr90 -Window ID : 3208 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.532 0.535 0.528 0.517 0.504 0.476 0.417 0.304 0.142 0.000 0.443 -Abs1 0.109 0.109 0.111 0.114 0.118 0.123 0.128 0.132 0.127 0.000 0.119 -Abs2 0.090 0.091 0.099 0.104 0.106 0.110 0.122 0.129 0.092 0.000 0.108 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.269 0.265 0.263 0.264 0.272 0.290 0.333 0.435 0.640 1.000 0.319 -Rbsol 0.277 0.271 0.269 0.271 0.281 0.300 0.337 0.421 0.610 0.999 0.322 -Tvis 0.733 0.737 0.726 0.713 0.694 0.657 0.575 0.417 0.193 0.000 0.611 -Rfvis 0.142 0.136 0.135 0.138 0.152 0.179 0.240 0.378 0.637 1.000 0.218 -Rbvis 0.144 0.137 0.134 0.137 0.149 0.173 0.220 0.325 0.549 0.999 0.202 -SHGC 0.630 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 33000 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.26 1.26 1.02 1.02 1.05 1.05 1.07 1.07 - 0 6.71 0.00 0.00 0.00 1.26 1.26 1.02 1.02 1.05 1.05 1.07 1.07 - 783 0.00 0.00 0.00 0.00 1.26 1.26 1.02 1.02 1.05 1.05 1.07 1.07 - 783 6.71 0.00 0.00 0.00 1.26 1.26 1.02 1.02 1.05 1.05 1.07 1.07 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_1.0_#3_Ar90 -Window ID : 3209 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.445 0.448 0.441 0.433 0.421 0.400 0.351 0.259 0.123 0.000 0.372 -Abs1 0.117 0.117 0.119 0.122 0.127 0.132 0.137 0.140 0.133 0.000 0.128 -Abs2 0.081 0.082 0.088 0.093 0.094 0.098 0.107 0.114 0.082 0.000 0.096 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.358 0.354 0.352 0.352 0.357 0.371 0.404 0.488 0.663 1.000 0.394 -Rbsol 0.393 0.388 0.386 0.388 0.396 0.411 0.441 0.511 0.670 0.999 0.428 -Tvis 0.632 0.636 0.627 0.615 0.600 0.569 0.500 0.367 0.174 0.000 0.529 -Rfvis 0.237 0.232 0.231 0.234 0.244 0.267 0.317 0.434 0.661 1.000 0.299 -Rbvis 0.261 0.255 0.253 0.255 0.266 0.286 0.325 0.413 0.607 0.999 0.309 -SHGC 0.530 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.700 - - - -Layer ID# 33000 33011 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.010 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33011_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.98 0.98 1.00 1.00 1.02 1.02 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.98 0.98 1.00 1.00 1.02 1.02 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.98 0.98 1.00 1.00 1.02 1.02 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.98 0.98 1.00 1.00 1.02 1.02 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_1.0_#3_Kr90 -Window ID : 3210 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.445 0.448 0.441 0.433 0.421 0.400 0.351 0.259 0.123 0.000 0.372 -Abs1 0.117 0.117 0.119 0.122 0.127 0.132 0.137 0.140 0.133 0.000 0.128 -Abs2 0.081 0.082 0.088 0.093 0.094 0.098 0.107 0.114 0.082 0.000 0.096 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.358 0.354 0.352 0.352 0.357 0.371 0.404 0.488 0.663 1.000 0.394 -Rbsol 0.393 0.388 0.386 0.388 0.396 0.411 0.441 0.511 0.670 0.999 0.428 -Tvis 0.632 0.636 0.627 0.615 0.600 0.569 0.500 0.367 0.174 0.000 0.529 -Rfvis 0.237 0.232 0.231 0.234 0.244 0.267 0.317 0.434 0.661 1.000 0.299 -Rbvis 0.261 0.255 0.253 0.255 0.266 0.286 0.325 0.413 0.607 0.999 0.309 -SHGC 0.530 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.700 - - - -Layer ID# 33000 33011 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.010 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33000_GU_Flo 33011_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.20 1.20 0.95 0.95 0.97 0.97 0.98 0.98 - 0 6.71 0.00 0.00 0.00 1.20 1.20 0.95 0.95 0.97 0.97 0.98 0.98 - 783 0.00 0.00 0.00 0.00 1.20 1.20 0.95 0.95 0.97 0.97 0.98 0.98 - 783 6.71 0.00 0.00 0.00 1.20 1.20 0.95 0.95 0.97 0.97 0.98 0.98 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_Nrg_#3_Ar90 -Window ID : 3211 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.657 0.657 0.653 0.647 0.637 0.612 0.548 0.414 0.206 0.000 0.566 -Abs1 0.063 0.063 0.065 0.066 0.069 0.073 0.077 0.082 0.084 0.000 0.071 -Abs2 0.090 0.091 0.093 0.094 0.093 0.092 0.090 0.082 0.053 0.000 0.088 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.189 0.189 0.190 0.192 0.201 0.224 0.285 0.422 0.658 1.000 0.264 -Rbsol 0.179 0.178 0.179 0.182 0.191 0.214 0.273 0.405 0.643 1.000 0.253 -Tvis 0.779 0.778 0.773 0.767 0.756 0.727 0.651 0.492 0.247 0.000 0.672 -Rfvis 0.136 0.135 0.137 0.140 0.151 0.179 0.251 0.407 0.671 1.000 0.225 -Rbvis 0.133 0.132 0.133 0.136 0.146 0.172 0.239 0.384 0.638 1.000 0.215 -SHGC 0.740 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.810 - - - -Layer ID# 33002 33012 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.080 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33002_GU_Flo 33012_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.46 1.46 1.23 1.23 1.27 1.27 1.30 1.30 - 0 6.71 0.00 0.00 0.00 1.46 1.46 1.23 1.23 1.27 1.27 1.30 1.30 - 783 0.00 0.00 0.00 0.00 1.46 1.46 1.23 1.23 1.27 1.27 1.30 1.30 - 783 6.71 0.00 0.00 0.00 1.46 1.46 1.23 1.23 1.27 1.27 1.30 1.30 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_Nrg_#3_Kr90 -Window ID : 3212 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.657 0.657 0.653 0.647 0.637 0.612 0.548 0.414 0.206 0.000 0.566 -Abs1 0.063 0.063 0.065 0.066 0.069 0.073 0.077 0.082 0.084 0.000 0.071 -Abs2 0.090 0.091 0.093 0.094 0.093 0.092 0.090 0.082 0.053 0.000 0.088 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.189 0.189 0.190 0.192 0.201 0.224 0.285 0.422 0.658 1.000 0.264 -Rbsol 0.179 0.178 0.179 0.182 0.191 0.214 0.273 0.405 0.643 1.000 0.253 -Tvis 0.779 0.778 0.773 0.767 0.756 0.727 0.651 0.492 0.247 0.000 0.672 -Rfvis 0.136 0.135 0.137 0.140 0.151 0.179 0.251 0.407 0.671 1.000 0.225 -Rbvis 0.133 0.132 0.133 0.136 0.146 0.172 0.239 0.384 0.638 1.000 0.215 -SHGC 0.740 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.810 - - - -Layer ID# 33002 33012 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.080 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33002_GU_Flo 33012_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.38 1.38 1.20 1.20 1.23 1.23 1.27 1.27 - 0 6.71 0.00 0.00 0.00 1.38 1.38 1.20 1.20 1.23 1.23 1.27 1.27 - 783 0.00 0.00 0.00 0.00 1.38 1.38 1.20 1.20 1.23 1.23 1.27 1.27 - 783 6.71 0.00 0.00 0.00 1.38 1.38 1.20 1.20 1.23 1.23 1.27 1.27 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_Dry_Prem_#1#3_Ar90 -Window ID : 3213 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.522 0.525 0.518 0.508 0.494 0.468 0.410 0.300 0.140 0.000 0.436 -Abs1 0.134 0.135 0.136 0.140 0.144 0.148 0.153 0.154 0.143 0.000 0.144 -Abs2 0.086 0.088 0.095 0.101 0.103 0.106 0.118 0.126 0.090 0.000 0.104 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.258 0.252 0.251 0.252 0.259 0.277 0.319 0.420 0.626 1.000 0.306 -Rbsol 0.284 0.280 0.278 0.280 0.289 0.308 0.343 0.425 0.611 0.999 0.329 -Tvis 0.719 0.723 0.713 0.700 0.682 0.646 0.566 0.412 0.193 0.000 0.600 -Rfvis 0.161 0.155 0.154 0.158 0.171 0.198 0.257 0.391 0.645 1.000 0.235 -Rbvis 0.157 0.152 0.148 0.151 0.162 0.185 0.230 0.330 0.551 0.999 0.213 -SHGC 0.630 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.780 - - - -Layer ID# 33013 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.180 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33013_GU_Cli 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.04 1.04 1.07 1.07 1.09 1.09 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.04 1.04 1.07 1.07 1.09 1.09 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.04 1.04 1.07 1.07 1.09 1.09 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.04 1.04 1.07 1.07 1.09 1.09 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_Dry_1.0_#1#3_Ar90 -Window ID : 3214 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.437 0.440 0.434 0.426 0.415 0.394 0.347 0.256 0.122 0.000 0.367 -Abs1 0.143 0.143 0.145 0.148 0.153 0.158 0.162 0.162 0.149 0.000 0.152 -Abs2 0.078 0.079 0.086 0.090 0.092 0.095 0.105 0.111 0.081 0.000 0.093 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.341 0.337 0.335 0.335 0.341 0.354 0.387 0.470 0.648 1.000 0.378 -Rbsol 0.398 0.394 0.392 0.394 0.402 0.417 0.446 0.514 0.671 0.999 0.433 -Tvis 0.622 0.626 0.617 0.606 0.590 0.560 0.493 0.364 0.173 0.000 0.522 -Rfvis 0.253 0.248 0.247 0.250 0.261 0.283 0.332 0.446 0.669 1.000 0.314 -Rbvis 0.271 0.266 0.264 0.266 0.276 0.295 0.332 0.417 0.609 0.999 0.317 -SHGC 0.530 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.680 - - - -Layer ID# 33013 33011 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.010 0 0 0 0 -Emis B 0.180 0.860 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 33013_GU_Cli 33011_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.98 0.98 1.00 1.00 1.01 1.01 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.98 0.98 1.00 1.00 1.01 1.01 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.98 0.98 1.00 1.00 1.01 1.01 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.98 0.98 1.00 1.00 1.01 1.01 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_N_#2#5_Ar90 -Window ID : 3300 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.436 0.435 0.430 0.423 0.414 0.392 0.334 0.228 0.095 0.000 0.359 -Abs1 0.155 0.156 0.159 0.161 0.161 0.161 0.165 0.167 0.134 0.000 0.158 -Abs2 0.056 0.056 0.057 0.058 0.060 0.062 0.063 0.060 0.050 0.000 0.059 -Abs3 0.063 0.064 0.065 0.065 0.064 0.062 0.058 0.048 0.025 0.000 0.058 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.290 0.289 0.289 0.292 0.301 0.323 0.379 0.497 0.695 1.000 0.356 -Rbsol 0.290 0.289 0.289 0.292 0.301 0.323 0.379 0.497 0.695 1.000 0.356 -Tvis 0.627 0.627 0.619 0.611 0.598 0.565 0.482 0.327 0.137 0.000 0.517 -Rfvis 0.159 0.157 0.159 0.163 0.174 0.206 0.282 0.433 0.668 1.000 0.248 -Rbvis 0.159 0.157 0.159 0.163 0.174 0.206 0.282 0.433 0.668 1.000 0.248 -SHGC 0.540 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 33009 33000 33009 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.040 0 0 0 -Emis B 0.040 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33009_GU_Cli 33000_GU_Flo 33009_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.67 0.67 0.60 0.60 0.62 0.62 0.63 0.63 - 0 6.71 0.00 0.00 0.00 0.67 0.67 0.60 0.60 0.62 0.62 0.63 0.63 - 783 0.00 0.00 0.00 0.00 0.67 0.67 0.60 0.60 0.62 0.62 0.63 0.63 - 783 6.71 0.00 0.00 0.00 0.67 0.67 0.60 0.60 0.62 0.62 0.63 0.63 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_N_#2#5_Kr90 -Window ID : 3301 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.436 0.435 0.430 0.423 0.414 0.392 0.334 0.228 0.095 0.000 0.359 -Abs1 0.155 0.156 0.159 0.161 0.161 0.161 0.165 0.167 0.134 0.000 0.158 -Abs2 0.056 0.056 0.057 0.058 0.060 0.062 0.063 0.060 0.050 0.000 0.059 -Abs3 0.063 0.064 0.065 0.065 0.064 0.062 0.058 0.048 0.025 0.000 0.058 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.290 0.289 0.289 0.292 0.301 0.323 0.379 0.497 0.695 1.000 0.356 -Rbsol 0.290 0.289 0.289 0.292 0.301 0.323 0.379 0.497 0.695 1.000 0.356 -Tvis 0.627 0.627 0.619 0.611 0.598 0.565 0.482 0.327 0.137 0.000 0.517 -Rfvis 0.159 0.157 0.159 0.163 0.174 0.206 0.282 0.433 0.668 1.000 0.248 -Rbvis 0.159 0.157 0.159 0.163 0.174 0.206 0.282 0.433 0.668 1.000 0.248 -SHGC 0.540 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 33009 33000 33009 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.040 0 0 0 -Emis B 0.040 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33009_GU_Cli 33000_GU_Flo 33009_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.63 0.63 0.51 0.51 0.52 0.52 0.53 0.53 - 0 6.71 0.00 0.00 0.00 0.63 0.63 0.51 0.51 0.52 0.52 0.53 0.53 - 783 0.00 0.00 0.00 0.00 0.63 0.63 0.51 0.51 0.52 0.52 0.53 0.53 - 783 6.71 0.00 0.00 0.00 0.63 0.63 0.51 0.51 0.52 0.52 0.53 0.53 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_NL_#2#5_Ar90 -Window ID : 3302 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.419 0.423 0.412 0.398 0.381 0.349 0.284 0.178 0.064 0.000 0.324 -Abs1 0.172 0.174 0.184 0.192 0.196 0.205 0.231 0.267 0.245 0.001 0.209 -Abs2 0.054 0.055 0.055 0.056 0.057 0.058 0.057 0.052 0.040 0.000 0.054 -Abs3 0.066 0.068 0.073 0.076 0.077 0.077 0.080 0.073 0.040 0.000 0.073 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.288 0.280 0.276 0.278 0.290 0.311 0.348 0.430 0.611 0.999 0.330 -Rbsol 0.288 0.280 0.276 0.278 0.290 0.311 0.348 0.430 0.611 0.999 0.330 -Tvis 0.609 0.615 0.599 0.579 0.554 0.508 0.413 0.258 0.093 0.000 0.471 -Rfvis 0.164 0.153 0.148 0.152 0.168 0.197 0.247 0.352 0.563 0.999 0.222 -Rbvis 0.164 0.153 0.148 0.152 0.168 0.197 0.247 0.352 0.563 0.999 0.222 -SHGC 0.510 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.670 - - - -Layer ID# 33008 33000 33008 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.040 0 0 0 -Emis B 0.040 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33008_GU_Cli 33000_GU_Flo 33008_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.67 0.67 0.60 0.60 0.62 0.62 0.63 0.63 - 0 6.71 0.00 0.00 0.00 0.67 0.67 0.60 0.60 0.62 0.62 0.63 0.63 - 783 0.00 0.00 0.00 0.00 0.67 0.67 0.60 0.60 0.62 0.62 0.63 0.63 - 783 6.71 0.00 0.00 0.00 0.67 0.67 0.60 0.60 0.62 0.62 0.63 0.63 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_NL_#2#5_Kr90 -Window ID : 3303 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.419 0.423 0.412 0.398 0.381 0.349 0.284 0.178 0.064 0.000 0.324 -Abs1 0.172 0.174 0.184 0.192 0.196 0.205 0.231 0.267 0.245 0.001 0.209 -Abs2 0.054 0.055 0.055 0.056 0.057 0.058 0.057 0.052 0.040 0.000 0.054 -Abs3 0.066 0.068 0.073 0.076 0.077 0.077 0.080 0.073 0.040 0.000 0.073 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.288 0.280 0.276 0.278 0.290 0.311 0.348 0.430 0.611 0.999 0.330 -Rbsol 0.288 0.280 0.276 0.278 0.290 0.311 0.348 0.430 0.611 0.999 0.330 -Tvis 0.609 0.615 0.599 0.579 0.554 0.508 0.413 0.258 0.093 0.000 0.471 -Rfvis 0.164 0.153 0.148 0.152 0.168 0.197 0.247 0.352 0.563 0.999 0.222 -Rbvis 0.164 0.153 0.148 0.152 0.168 0.197 0.247 0.352 0.563 0.999 0.222 -SHGC 0.510 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.670 - - - -Layer ID# 33008 33000 33008 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.040 0 0 0 -Emis B 0.040 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33008_GU_Cli 33000_GU_Flo 33008_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.63 0.63 0.51 0.51 0.52 0.52 0.53 0.53 - 0 6.71 0.00 0.00 0.00 0.63 0.63 0.51 0.51 0.52 0.52 0.53 0.53 - 783 0.00 0.00 0.00 0.00 0.63 0.63 0.51 0.51 0.52 0.52 0.53 0.53 - 783 6.71 0.00 0.00 0.00 0.63 0.63 0.51 0.51 0.52 0.52 0.53 0.53 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_D_#2#5_Ar90 -Window ID : 3304 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.404 0.409 0.397 0.384 0.367 0.337 0.274 0.171 0.061 0.000 0.312 -Abs1 0.226 0.229 0.239 0.247 0.251 0.259 0.285 0.318 0.282 0.001 0.261 -Abs2 0.053 0.053 0.054 0.054 0.056 0.057 0.056 0.051 0.039 0.000 0.053 -Abs3 0.097 0.099 0.104 0.106 0.105 0.104 0.102 0.087 0.045 0.000 0.097 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.219 0.210 0.206 0.209 0.221 0.244 0.284 0.373 0.572 0.999 0.266 -Rbsol 0.219 0.210 0.206 0.209 0.221 0.244 0.284 0.373 0.572 0.999 0.266 -Tvis 0.556 0.563 0.547 0.529 0.507 0.465 0.378 0.235 0.084 0.000 0.430 -Rfvis 0.150 0.139 0.135 0.138 0.154 0.182 0.232 0.336 0.552 0.999 0.208 -Rbvis 0.150 0.139 0.135 0.138 0.154 0.182 0.232 0.336 0.552 0.999 0.208 -SHGC 0.520 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.590 - - - -Layer ID# 33007 33000 33007 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.120 0 0 0 -Emis B 0.120 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33007_GU_Cli 33000_GU_Flo 33007_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.81 0.81 0.77 0.77 0.80 0.80 0.81 0.81 - 0 6.71 0.00 0.00 0.00 0.81 0.81 0.77 0.77 0.80 0.80 0.81 0.81 - 783 0.00 0.00 0.00 0.00 0.81 0.81 0.77 0.77 0.80 0.80 0.81 0.81 - 783 6.71 0.00 0.00 0.00 0.81 0.81 0.77 0.77 0.80 0.80 0.81 0.81 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_D_#2#5_Kr90 -Window ID : 3305 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.404 0.409 0.397 0.384 0.367 0.337 0.274 0.171 0.061 0.000 0.312 -Abs1 0.226 0.229 0.239 0.247 0.251 0.259 0.285 0.318 0.282 0.001 0.261 -Abs2 0.053 0.053 0.054 0.054 0.056 0.057 0.056 0.051 0.039 0.000 0.053 -Abs3 0.097 0.099 0.104 0.106 0.105 0.104 0.102 0.087 0.045 0.000 0.097 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.219 0.210 0.206 0.209 0.221 0.244 0.284 0.373 0.572 0.999 0.266 -Rbsol 0.219 0.210 0.206 0.209 0.221 0.244 0.284 0.373 0.572 0.999 0.266 -Tvis 0.556 0.563 0.547 0.529 0.507 0.465 0.378 0.235 0.084 0.000 0.430 -Rfvis 0.150 0.139 0.135 0.138 0.154 0.182 0.232 0.336 0.552 0.999 0.208 -Rbvis 0.150 0.139 0.135 0.138 0.154 0.182 0.232 0.336 0.552 0.999 0.208 -SHGC 0.520 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.590 - - - -Layer ID# 33007 33000 33007 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.120 0 0 0 -Emis B 0.120 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33007_GU_Cli 33000_GU_Flo 33007_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.78 0.78 0.69 0.69 0.71 0.71 0.72 0.72 - 0 6.71 0.00 0.00 0.00 0.78 0.78 0.69 0.69 0.71 0.71 0.72 0.72 - 783 0.00 0.00 0.00 0.00 0.78 0.78 0.69 0.69 0.71 0.71 0.72 0.72 - 783 6.71 0.00 0.00 0.00 0.78 0.78 0.69 0.69 0.71 0.71 0.72 0.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_Premium_#2#5_Ar90 -Window ID : 3306 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.409 0.413 0.402 0.388 0.372 0.341 0.278 0.174 0.063 0.000 0.316 -Abs1 0.164 0.166 0.176 0.183 0.187 0.195 0.220 0.255 0.234 0.001 0.199 -Abs2 0.052 0.052 0.052 0.053 0.054 0.055 0.054 0.049 0.038 0.000 0.052 -Abs3 0.057 0.059 0.064 0.067 0.068 0.069 0.072 0.068 0.038 0.000 0.065 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.319 0.311 0.307 0.308 0.320 0.340 0.375 0.454 0.627 0.999 0.358 -Rbsol 0.319 0.311 0.307 0.308 0.320 0.340 0.375 0.454 0.627 0.999 0.358 -Tvis 0.616 0.623 0.606 0.586 0.561 0.515 0.419 0.262 0.095 0.000 0.477 -Rfvis 0.183 0.172 0.168 0.171 0.186 0.215 0.264 0.366 0.573 0.999 0.239 -Rbvis 0.183 0.172 0.168 0.171 0.186 0.215 0.264 0.366 0.573 0.999 0.239 -SHGC 0.490 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 33010 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.030 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33010_GU_Cli 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.64 0.64 0.65 0.65 0.66 0.66 0.67 0.67 - 0 6.71 0.00 0.00 0.00 0.64 0.64 0.65 0.65 0.66 0.66 0.67 0.67 - 783 0.00 0.00 0.00 0.00 0.64 0.64 0.65 0.65 0.66 0.66 0.67 0.67 - 783 6.71 0.00 0.00 0.00 0.64 0.64 0.65 0.65 0.66 0.66 0.67 0.67 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_Premium_#2#5_Kr90 -Window ID : 3307 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.409 0.413 0.402 0.388 0.372 0.341 0.278 0.174 0.063 0.000 0.316 -Abs1 0.164 0.166 0.176 0.183 0.187 0.195 0.220 0.255 0.234 0.001 0.199 -Abs2 0.052 0.052 0.052 0.053 0.054 0.055 0.054 0.049 0.038 0.000 0.052 -Abs3 0.057 0.059 0.064 0.067 0.068 0.069 0.072 0.068 0.038 0.000 0.065 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.319 0.311 0.307 0.308 0.320 0.340 0.375 0.454 0.627 0.999 0.358 -Rbsol 0.319 0.311 0.307 0.308 0.320 0.340 0.375 0.454 0.627 0.999 0.358 -Tvis 0.616 0.623 0.606 0.586 0.561 0.515 0.419 0.262 0.095 0.000 0.477 -Rfvis 0.183 0.172 0.168 0.171 0.186 0.215 0.264 0.366 0.573 0.999 0.239 -Rbvis 0.183 0.172 0.168 0.171 0.186 0.215 0.264 0.366 0.573 0.999 0.239 -SHGC 0.490 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 33010 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.030 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33010_GU_Cli 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.61 0.61 0.49 0.49 0.50 0.50 0.51 0.51 - 0 6.71 0.00 0.00 0.00 0.61 0.61 0.49 0.49 0.50 0.50 0.51 0.51 - 783 0.00 0.00 0.00 0.00 0.61 0.61 0.49 0.49 0.50 0.50 0.51 0.51 - 783 6.71 0.00 0.00 0.00 0.61 0.61 0.49 0.49 0.50 0.50 0.51 0.51 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_1.0_#2#5_Ar90 -Window ID : 3308 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.305 0.308 0.300 0.290 0.278 0.257 0.211 0.136 0.051 0.000 0.238 -Abs1 0.145 0.147 0.156 0.162 0.165 0.171 0.191 0.218 0.197 0.001 0.174 -Abs2 0.048 0.048 0.048 0.049 0.050 0.051 0.049 0.045 0.034 0.000 0.047 -Abs3 0.047 0.048 0.052 0.054 0.055 0.056 0.058 0.055 0.032 0.000 0.053 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.455 0.448 0.445 0.445 0.452 0.466 0.489 0.546 0.686 0.999 0.478 -Rbsol 0.455 0.448 0.445 0.445 0.452 0.466 0.489 0.546 0.686 0.999 0.478 -Tvis 0.472 0.476 0.464 0.448 0.431 0.398 0.327 0.210 0.079 0.000 0.368 -Rfvis 0.342 0.334 0.329 0.330 0.340 0.358 0.390 0.463 0.632 0.999 0.375 -Rbvis 0.342 0.334 0.329 0.330 0.340 0.358 0.390 0.463 0.632 0.999 0.375 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.560 - - - -Layer ID# 33011 33000 33011 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.010 0 0 0 -Emis B 0.010 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33011_GU_Cli 33000_GU_Flo 33011_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.61 0.61 0.54 0.54 0.55 0.55 0.56 0.56 - 0 6.71 0.00 0.00 0.00 0.61 0.61 0.54 0.54 0.55 0.55 0.56 0.56 - 783 0.00 0.00 0.00 0.00 0.61 0.61 0.54 0.54 0.55 0.55 0.56 0.56 - 783 6.71 0.00 0.00 0.00 0.61 0.61 0.54 0.54 0.55 0.55 0.56 0.56 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_1.0_#2#5_Kr90 -Window ID : 3309 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.305 0.308 0.300 0.290 0.278 0.257 0.211 0.136 0.051 0.000 0.238 -Abs1 0.145 0.147 0.156 0.162 0.165 0.171 0.191 0.218 0.197 0.001 0.174 -Abs2 0.048 0.048 0.048 0.049 0.050 0.051 0.049 0.045 0.034 0.000 0.047 -Abs3 0.047 0.048 0.052 0.054 0.055 0.056 0.058 0.055 0.032 0.000 0.053 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.455 0.448 0.445 0.445 0.452 0.466 0.489 0.546 0.686 0.999 0.478 -Rbsol 0.455 0.448 0.445 0.445 0.452 0.466 0.489 0.546 0.686 0.999 0.478 -Tvis 0.472 0.476 0.464 0.448 0.431 0.398 0.327 0.210 0.079 0.000 0.368 -Rfvis 0.342 0.334 0.329 0.330 0.340 0.358 0.390 0.463 0.632 0.999 0.375 -Rbvis 0.342 0.334 0.329 0.330 0.340 0.358 0.390 0.463 0.632 0.999 0.375 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.560 - - - -Layer ID# 33011 33000 33011 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.010 0 0 0 -Emis B 0.010 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33011_GU_Cli 33000_GU_Flo 33011_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.57 0.57 0.44 0.44 0.45 0.45 0.46 0.46 - 0 6.71 0.00 0.00 0.00 0.57 0.57 0.44 0.44 0.45 0.45 0.46 0.46 - 783 0.00 0.00 0.00 0.00 0.57 0.57 0.44 0.44 0.45 0.45 0.46 0.46 - 783 6.71 0.00 0.00 0.00 0.57 0.57 0.44 0.44 0.45 0.45 0.46 0.46 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_Nrg_#2#5_Ar90 -Window ID : 3310 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.524 0.524 0.517 0.509 0.498 0.470 0.400 0.272 0.112 0.000 0.430 -Abs1 0.137 0.137 0.141 0.143 0.143 0.144 0.151 0.157 0.132 0.000 0.143 -Abs2 0.061 0.061 0.062 0.064 0.066 0.068 0.070 0.067 0.057 0.000 0.065 -Abs3 0.063 0.063 0.065 0.065 0.064 0.062 0.059 0.049 0.026 0.000 0.058 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.216 0.214 0.215 0.219 0.229 0.255 0.321 0.455 0.673 1.000 0.293 -Rbsol 0.216 0.214 0.215 0.219 0.229 0.255 0.321 0.455 0.673 1.000 0.293 -Tvis 0.671 0.671 0.663 0.653 0.640 0.605 0.515 0.350 0.147 0.000 0.553 -Rfvis 0.166 0.165 0.166 0.171 0.183 0.215 0.293 0.446 0.679 1.000 0.257 -Rbvis 0.166 0.165 0.166 0.171 0.183 0.215 0.293 0.446 0.679 1.000 0.257 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.730 - - - -Layer ID# 33012 33000 33012 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.080 0 0 0 -Emis B 0.080 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33012_GU_Cli 33000_GU_Flo 33012_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.73 0.73 0.75 0.75 0.77 0.77 0.79 0.79 - 0 6.71 0.00 0.00 0.00 0.73 0.73 0.75 0.75 0.77 0.77 0.79 0.79 - 783 0.00 0.00 0.00 0.00 0.73 0.73 0.75 0.75 0.77 0.77 0.79 0.79 - 783 6.71 0.00 0.00 0.00 0.73 0.73 0.75 0.75 0.77 0.77 0.79 0.79 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_ClimaGuard_Nrg_#2#5_Kr90 -Window ID : 3311 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.524 0.524 0.517 0.509 0.498 0.470 0.400 0.272 0.112 0.000 0.430 -Abs1 0.137 0.137 0.141 0.143 0.143 0.144 0.151 0.157 0.132 0.000 0.143 -Abs2 0.061 0.061 0.062 0.064 0.066 0.068 0.070 0.067 0.057 0.000 0.065 -Abs3 0.063 0.063 0.065 0.065 0.064 0.062 0.059 0.049 0.026 0.000 0.058 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.216 0.214 0.215 0.219 0.229 0.255 0.321 0.455 0.673 1.000 0.293 -Rbsol 0.216 0.214 0.215 0.219 0.229 0.255 0.321 0.455 0.673 1.000 0.293 -Tvis 0.671 0.671 0.663 0.653 0.640 0.605 0.515 0.350 0.147 0.000 0.553 -Rfvis 0.166 0.165 0.166 0.171 0.183 0.215 0.293 0.446 0.679 1.000 0.257 -Rbvis 0.166 0.165 0.166 0.171 0.183 0.215 0.293 0.446 0.679 1.000 0.257 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.730 - - - -Layer ID# 33012 33000 33012 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.080 0 0 0 -Emis B 0.080 0.860 0.860 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 33012_GU_Cli 33000_GU_Flo 33012_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.60 0.60 0.62 0.62 0.63 0.63 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.60 0.60 0.62 0.62 0.63 0.63 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.60 0.60 0.62 0.62 0.63 0.63 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.60 0.60 0.62 0.62 0.63 0.63 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_SNX_60/28_#2_Ar90 -Window ID : 3400 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.259 0.260 0.257 0.252 0.245 0.233 0.204 0.149 0.071 0.000 0.216 -Abs1 0.330 0.333 0.338 0.340 0.339 0.339 0.342 0.334 0.261 0.001 0.330 -Abs2 0.010 0.010 0.010 0.010 0.011 0.011 0.010 0.009 0.007 0.000 0.010 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.402 0.397 0.396 0.398 0.405 0.418 0.444 0.507 0.662 0.999 0.433 -Rbsol 0.423 0.419 0.417 0.416 0.420 0.430 0.458 0.531 0.684 1.000 0.451 -Tvis 0.442 0.445 0.439 0.431 0.420 0.398 0.349 0.255 0.120 0.000 0.370 -Rfvis 0.212 0.206 0.204 0.207 0.217 0.235 0.270 0.355 0.560 0.999 0.258 -Rbvis 0.241 0.236 0.235 0.237 0.248 0.271 0.321 0.437 0.663 1.000 0.302 -SHGC 0.280 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.600 - - - -Layer ID# 33014 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.010 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33014_GU_SNX 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 0 6.71 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 783 0.00 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 783 6.71 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_SN_70/41_#2_Ar90 -Window ID : 3401 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.380 0.382 0.376 0.369 0.360 0.340 0.298 0.218 0.102 0.000 0.317 -Abs1 0.267 0.270 0.277 0.281 0.282 0.285 0.297 0.306 0.254 0.001 0.281 -Abs2 0.020 0.020 0.020 0.020 0.021 0.021 0.020 0.018 0.014 0.000 0.020 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.334 0.329 0.327 0.329 0.338 0.354 0.385 0.458 0.631 0.999 0.372 -Rbsol 0.348 0.343 0.341 0.341 0.347 0.361 0.396 0.484 0.662 1.000 0.386 -Tvis 0.599 0.602 0.594 0.583 0.568 0.537 0.470 0.342 0.159 0.000 0.499 -Rfvis 0.159 0.153 0.150 0.153 0.164 0.186 0.227 0.323 0.542 0.999 0.212 -Rbvis 0.162 0.156 0.155 0.158 0.171 0.198 0.256 0.390 0.642 1.000 0.235 -SHGC 0.410 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.700 - - - -Layer ID# 33017 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.030 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33017_GU_SN7 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_SN_70/37_#2_Ar90 -Window ID : 3402 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.343 0.344 0.340 0.333 0.325 0.308 0.270 0.197 0.093 0.000 0.286 -Abs1 0.255 0.258 0.264 0.268 0.269 0.271 0.281 0.288 0.237 0.001 0.267 -Abs2 0.016 0.016 0.016 0.016 0.016 0.017 0.016 0.015 0.011 0.000 0.016 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.387 0.382 0.380 0.382 0.390 0.405 0.433 0.500 0.659 0.999 0.421 -Rbsol 0.389 0.385 0.383 0.382 0.387 0.399 0.430 0.509 0.674 1.000 0.421 -Tvis 0.562 0.565 0.557 0.547 0.533 0.505 0.442 0.323 0.151 0.000 0.469 -Rfvis 0.196 0.189 0.187 0.190 0.200 0.221 0.260 0.352 0.561 0.999 0.246 -Rbvis 0.205 0.200 0.198 0.202 0.213 0.237 0.291 0.416 0.653 1.000 0.272 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.700 - - - -Layer ID# 33015 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.010 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33015_GU_SN7 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 0 6.71 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 783 0.00 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 783 6.71 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_SN_51/28_#2_Ar90 -Window ID : 3403 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.252 0.254 0.250 0.246 0.239 0.227 0.200 0.147 0.070 0.000 0.212 -Abs1 0.367 0.371 0.376 0.378 0.376 0.375 0.376 0.364 0.280 0.001 0.365 -Abs2 0.011 0.011 0.011 0.011 0.012 0.012 0.012 0.010 0.008 0.000 0.011 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.369 0.364 0.363 0.365 0.372 0.386 0.412 0.478 0.641 0.999 0.402 -Rbsol 0.428 0.424 0.422 0.421 0.424 0.434 0.462 0.532 0.684 1.000 0.454 -Tvis 0.415 0.417 0.412 0.404 0.394 0.374 0.329 0.242 0.115 0.000 0.348 -Rfvis 0.191 0.184 0.182 0.185 0.195 0.213 0.248 0.334 0.544 0.999 0.237 -Rbvis 0.266 0.261 0.260 0.262 0.272 0.293 0.341 0.451 0.668 1.000 0.324 -SHGC 0.280 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.510 - - - -Layer ID# 33019 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.010 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33019_GU_SN5 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 0 6.71 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 783 0.00 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 783 6.71 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_SN_40/23_#2_Ar90 -Window ID : 3404 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.208 0.209 0.206 0.202 0.197 0.187 0.165 0.123 0.060 0.000 0.175 -Abs1 0.423 0.427 0.432 0.433 0.430 0.427 0.423 0.401 0.301 0.001 0.414 -Abs2 0.010 0.010 0.010 0.010 0.010 0.010 0.010 0.009 0.007 0.000 0.010 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.359 0.354 0.353 0.355 0.363 0.376 0.401 0.466 0.632 0.999 0.392 -Rbsol 0.466 0.462 0.460 0.459 0.461 0.469 0.493 0.555 0.694 1.000 0.487 -Tvis 0.336 0.338 0.333 0.327 0.319 0.303 0.268 0.199 0.096 0.000 0.282 -Rfvis 0.193 0.187 0.185 0.188 0.197 0.215 0.248 0.331 0.540 0.999 0.238 -Rbvis 0.336 0.331 0.330 0.332 0.340 0.358 0.398 0.494 0.687 1.000 0.383 -SHGC 0.230 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.400 - - - -Layer ID# 33020 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.010 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33020_GU_SN4 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 0 6.71 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 783 0.00 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - 783 6.71 0.00 0.00 0.00 1.29 1.29 0.98 0.98 1.00 1.00 1.01 1.01 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPlblue_62/52_#2_Ar90 -Window ID : 3405 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.466 0.466 0.463 0.457 0.445 0.423 0.380 0.292 0.138 0.000 0.396 -Abs1 0.328 0.328 0.331 0.336 0.342 0.349 0.356 0.357 0.322 0.000 0.339 -Abs2 0.036 0.036 0.037 0.037 0.038 0.038 0.038 0.035 0.026 0.000 0.036 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.170 0.170 0.169 0.170 0.175 0.189 0.227 0.317 0.513 1.000 0.218 -Rbsol 0.177 0.181 0.180 0.182 0.188 0.208 0.259 0.377 0.609 1.000 0.244 -Tvis 0.584 0.586 0.583 0.576 0.562 0.535 0.479 0.365 0.172 0.000 0.500 -Rfvis 0.148 0.148 0.148 0.150 0.156 0.174 0.221 0.329 0.545 1.000 0.208 -Rbvis 0.118 0.170 0.170 0.172 0.180 0.204 0.264 0.398 0.645 1.000 0.244 -SHGC 0.520 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.620 - - - -Layer ID# 33021 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.140 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33021_GU_HPL 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.59 1.59 1.41 1.41 1.46 1.46 1.50 1.50 - 0 6.71 0.00 0.00 0.00 1.59 1.59 1.41 1.41 1.46 1.46 1.50 1.50 - 783 0.00 0.00 0.00 0.00 1.59 1.59 1.41 1.41 1.46 1.46 1.50 1.50 - 783 6.71 0.00 0.00 0.00 1.59 1.59 1.41 1.41 1.46 1.46 1.50 1.50 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HP_52/41_#2_Ar90 -Window ID : 3406 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.369 0.371 0.366 0.359 0.349 0.330 0.288 0.209 0.097 0.000 0.307 -Abs1 0.394 0.398 0.405 0.409 0.408 0.410 0.419 0.418 0.333 0.001 0.402 -Abs2 0.027 0.027 0.027 0.028 0.028 0.029 0.028 0.024 0.018 0.000 0.027 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.210 0.204 0.202 0.205 0.214 0.232 0.265 0.348 0.553 0.999 0.255 -Rbsol 0.204 0.199 0.198 0.200 0.210 0.231 0.281 0.396 0.623 1.000 0.264 -Tvis 0.482 0.485 0.478 0.469 0.457 0.432 0.377 0.273 0.126 0.000 0.401 -Rfvis 0.176 0.170 0.168 0.170 0.181 0.200 0.237 0.326 0.539 0.999 0.225 -Rbvis 0.123 0.116 0.115 0.119 0.133 0.162 0.225 0.367 0.633 1.000 0.202 -SHGC 0.410 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.520 - - - -Layer ID# 33024 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.110 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33024_GU_HPN 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.53 1.53 1.32 1.32 1.36 1.36 1.40 1.40 - 0 6.71 0.00 0.00 0.00 1.53 1.53 1.32 1.32 1.36 1.36 1.40 1.40 - 783 0.00 0.00 0.00 0.00 1.53 1.53 1.32 1.32 1.36 1.36 1.40 1.40 - 783 6.71 0.00 0.00 0.00 1.53 1.53 1.32 1.32 1.36 1.36 1.40 1.40 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HP_60/40_#2_Ar90 -Window ID : 3407 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.358 0.360 0.355 0.348 0.339 0.321 0.282 0.207 0.098 0.000 0.299 -Abs1 0.276 0.279 0.286 0.290 0.290 0.293 0.304 0.311 0.255 0.001 0.289 -Abs2 0.023 0.024 0.024 0.024 0.025 0.025 0.025 0.022 0.016 0.000 0.023 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.342 0.337 0.335 0.337 0.346 0.361 0.390 0.460 0.631 0.999 0.378 -Rbsol 0.323 0.318 0.316 0.317 0.323 0.339 0.376 0.466 0.653 1.000 0.364 -Tvis 0.505 0.508 0.501 0.492 0.479 0.454 0.398 0.292 0.137 0.000 0.422 -Rfvis 0.250 0.244 0.242 0.245 0.254 0.272 0.307 0.391 0.586 0.999 0.295 -Rbvis 0.207 0.202 0.200 0.204 0.215 0.240 0.293 0.416 0.653 1.000 0.273 -SHGC 0.400 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.600 - - - -Layer ID# 33022 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.040 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33022_GU_HPN 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - 0 6.71 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - 783 0.00 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - 783 6.71 0.00 0.00 0.00 1.37 1.37 1.09 1.09 1.12 1.12 1.14 1.14 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HP_41/33_#2_Ar90 -Window ID : 3408 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.286 0.287 0.283 0.278 0.270 0.255 0.224 0.163 0.076 0.000 0.238 -Abs1 0.449 0.454 0.459 0.462 0.460 0.458 0.460 0.446 0.344 0.001 0.446 -Abs2 0.020 0.020 0.020 0.021 0.021 0.021 0.021 0.018 0.014 0.000 0.020 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.245 0.239 0.237 0.240 0.249 0.265 0.295 0.372 0.567 0.999 0.286 -Rbsol 0.230 0.225 0.223 0.225 0.234 0.254 0.301 0.411 0.629 1.000 0.286 -Tvis 0.379 0.381 0.376 0.369 0.360 0.340 0.298 0.216 0.100 0.000 0.316 -Rfvis 0.218 0.212 0.210 0.212 0.222 0.239 0.272 0.354 0.556 0.999 0.261 -Rbvis 0.144 0.138 0.137 0.141 0.154 0.181 0.242 0.379 0.638 1.000 0.220 -SHGC 0.330 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.410 - - - -Layer ID# 33026 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.110 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33026_GU_HPN 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.53 1.53 1.32 1.32 1.36 1.36 1.40 1.40 - 0 6.71 0.00 0.00 0.00 1.53 1.53 1.32 1.32 1.36 1.36 1.40 1.40 - 783 0.00 0.00 0.00 0.00 1.53 1.53 1.32 1.32 1.36 1.36 1.40 1.40 - 783 6.71 0.00 0.00 0.00 1.53 1.53 1.32 1.32 1.36 1.36 1.40 1.40 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HP_50/32_#2_Ar90 -Window ID : 3409 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.288 0.289 0.285 0.280 0.273 0.259 0.228 0.169 0.081 0.000 0.241 -Abs1 0.324 0.327 0.333 0.336 0.335 0.335 0.340 0.335 0.264 0.001 0.327 -Abs2 0.018 0.018 0.018 0.018 0.019 0.019 0.019 0.017 0.013 0.000 0.018 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.370 0.365 0.364 0.366 0.374 0.387 0.414 0.480 0.643 0.999 0.403 -Rbsol 0.394 0.390 0.387 0.387 0.392 0.404 0.433 0.509 0.672 1.000 0.425 -Tvis 0.421 0.423 0.417 0.410 0.399 0.379 0.334 0.246 0.117 0.000 0.353 -Rfvis 0.263 0.257 0.256 0.258 0.267 0.284 0.317 0.396 0.587 0.999 0.305 -Rbvis 0.277 0.272 0.270 0.273 0.283 0.303 0.349 0.458 0.671 1.000 0.333 -SHGC 0.320 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.500 - - - -Layer ID# 33025 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.030 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33025_GU_HPN 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPsilver_43/31_#2_Ar90 -Window ID : 3410 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.281 0.283 0.279 0.273 0.266 0.252 0.221 0.162 0.076 0.000 0.235 -Abs1 0.336 0.339 0.344 0.347 0.346 0.347 0.352 0.347 0.273 0.001 0.339 -Abs2 0.019 0.019 0.020 0.020 0.020 0.021 0.020 0.018 0.013 0.000 0.019 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.364 0.359 0.358 0.360 0.367 0.381 0.407 0.473 0.637 0.999 0.397 -Rbsol 0.298 0.293 0.292 0.293 0.300 0.316 0.356 0.451 0.646 1.000 0.343 -Tvis 0.386 0.389 0.383 0.376 0.366 0.347 0.304 0.222 0.104 0.000 0.323 -Rfvis 0.320 0.315 0.313 0.315 0.324 0.339 0.368 0.440 0.616 0.999 0.357 -Rbvis 0.194 0.189 0.188 0.191 0.203 0.228 0.283 0.409 0.650 1.000 0.263 -SHGC 0.310 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.430 - - - -Layer ID# 33027 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.050 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33027_GU_HPS 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.39 1.39 1.12 1.12 1.15 1.15 1.18 1.18 - 0 6.71 0.00 0.00 0.00 1.39 1.39 1.12 1.12 1.15 1.15 1.18 1.18 - 783 0.00 0.00 0.00 0.00 1.39 1.39 1.12 1.12 1.15 1.15 1.18 1.18 - 783 6.71 0.00 0.00 0.00 1.39 1.39 1.12 1.12 1.15 1.15 1.18 1.18 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPrblue_41/29_#2_Ar90 -Window ID : 3411 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.257 0.258 0.255 0.250 0.243 0.231 0.204 0.152 0.074 0.000 0.216 -Abs1 0.454 0.459 0.464 0.466 0.463 0.460 0.458 0.437 0.331 0.001 0.447 -Abs2 0.017 0.017 0.017 0.017 0.018 0.018 0.018 0.016 0.012 0.000 0.017 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.272 0.266 0.264 0.267 0.276 0.291 0.320 0.394 0.583 0.999 0.311 -Rbsol 0.425 0.421 0.419 0.418 0.422 0.432 0.459 0.528 0.680 1.000 0.451 -Tvis 0.362 0.364 0.359 0.353 0.344 0.327 0.289 0.215 0.105 0.000 0.305 -Rfvis 0.272 0.266 0.264 0.267 0.276 0.291 0.322 0.399 0.588 0.999 0.312 -Rbvis 0.348 0.343 0.342 0.344 0.352 0.369 0.408 0.501 0.690 1.000 0.394 -SHGC 0.290 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.410 - - - -Layer ID# 33029 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.030 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33029_GU_HPR 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPamber_41/29_#2_Ar90 -Window ID : 3412 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.263 0.264 0.260 0.255 0.249 0.236 0.207 0.151 0.071 0.000 0.219 -Abs1 0.356 0.360 0.365 0.367 0.366 0.365 0.369 0.360 0.280 0.001 0.356 -Abs2 0.016 0.017 0.017 0.017 0.017 0.018 0.017 0.015 0.011 0.000 0.016 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.365 0.360 0.358 0.360 0.368 0.382 0.408 0.473 0.637 0.999 0.398 -Rbsol 0.320 0.316 0.314 0.314 0.321 0.336 0.373 0.465 0.652 1.000 0.362 -Tvis 0.375 0.377 0.372 0.365 0.355 0.337 0.295 0.215 0.101 0.000 0.313 -Rfvis 0.275 0.269 0.268 0.270 0.279 0.295 0.326 0.402 0.590 0.999 0.315 -Rbvis 0.198 0.192 0.191 0.194 0.206 0.231 0.285 0.411 0.651 1.000 0.265 -SHGC 0.290 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.410 - - - -Layer ID# 33031 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.030 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33031_GU_HPA 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPbgreen_40/29_#2_Ar90 -Window ID : 3413 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.253 0.255 0.251 0.247 0.240 0.228 0.200 0.148 0.071 0.000 0.212 -Abs1 0.492 0.497 0.502 0.504 0.501 0.497 0.494 0.471 0.356 0.001 0.482 -Abs2 0.017 0.017 0.017 0.017 0.018 0.018 0.018 0.016 0.012 0.000 0.017 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.238 0.231 0.230 0.232 0.241 0.257 0.288 0.365 0.562 0.999 0.278 -Rbsol 0.350 0.346 0.344 0.345 0.350 0.364 0.398 0.483 0.660 1.000 0.388 -Tvis 0.355 0.357 0.352 0.346 0.337 0.320 0.282 0.207 0.099 0.000 0.298 -Rfvis 0.312 0.306 0.305 0.307 0.316 0.331 0.360 0.432 0.610 0.999 0.349 -Rbvis 0.265 0.260 0.258 0.261 0.271 0.293 0.340 0.451 0.668 1.000 0.323 -SHGC 0.290 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.400 - - - -Layer ID# 33032 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.030 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33032_GU_HPB 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPbronze_40/27_#2_Ar90 -Window ID : 3414 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.238 0.239 0.236 0.231 0.225 0.214 0.189 0.140 0.068 0.000 0.200 -Abs1 0.482 0.487 0.492 0.493 0.490 0.486 0.483 0.458 0.344 0.001 0.472 -Abs2 0.014 0.015 0.015 0.015 0.015 0.015 0.015 0.014 0.011 0.000 0.014 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.265 0.259 0.258 0.260 0.269 0.284 0.313 0.388 0.578 0.999 0.304 -Rbsol 0.402 0.398 0.396 0.396 0.400 0.411 0.440 0.514 0.674 1.000 0.432 -Tvis 0.346 0.348 0.343 0.337 0.328 0.312 0.275 0.203 0.098 0.000 0.290 -Rfvis 0.166 0.159 0.158 0.160 0.170 0.188 0.222 0.308 0.524 0.999 0.213 -Rbvis 0.306 0.301 0.300 0.302 0.311 0.330 0.373 0.475 0.679 1.000 0.358 -SHGC 0.270 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.400 - - - -Layer ID# 33033 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.030 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33033_GU_HPB 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPsilver_35/26_#2_Ar90 -Window ID : 3415 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.235 0.236 0.233 0.228 0.222 0.211 0.185 0.137 0.065 0.000 0.196 -Abs1 0.315 0.318 0.322 0.325 0.324 0.323 0.326 0.319 0.248 0.001 0.315 -Abs2 0.017 0.017 0.017 0.017 0.018 0.018 0.017 0.015 0.012 0.000 0.017 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.433 0.429 0.428 0.430 0.436 0.448 0.471 0.529 0.675 0.999 0.461 -Rbsol 0.329 0.325 0.323 0.324 0.330 0.345 0.381 0.470 0.655 1.000 0.370 -Tvis 0.318 0.320 0.316 0.310 0.302 0.286 0.252 0.185 0.088 0.000 0.267 -Rfvis 0.414 0.409 0.408 0.410 0.417 0.430 0.454 0.515 0.667 0.999 0.444 -Rbvis 0.252 0.247 0.246 0.249 0.259 0.281 0.330 0.443 0.665 1.000 0.312 -SHGC 0.260 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.350 - - - -Layer ID# 33028 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.030 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33028_GU_HPS 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Neutral_70_Ar90 -Window ID : 3416 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.607 0.607 0.602 0.596 0.587 0.563 0.505 0.384 0.191 0.000 0.522 -Abs1 0.083 0.084 0.087 0.089 0.089 0.091 0.097 0.105 0.093 0.000 0.091 -Abs2 0.056 0.057 0.057 0.059 0.061 0.062 0.062 0.056 0.043 0.000 0.058 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.253 0.252 0.253 0.256 0.263 0.284 0.337 0.455 0.672 1.000 0.318 -Rbsol 0.249 0.248 0.249 0.251 0.257 0.276 0.327 0.442 0.651 1.000 0.310 -Tvis 0.618 0.618 0.614 0.609 0.600 0.578 0.522 0.401 0.206 0.000 0.536 -Rfvis 0.314 0.314 0.315 0.317 0.324 0.344 0.393 0.504 0.705 1.000 0.375 -Rbvis 0.310 0.310 0.310 0.312 0.319 0.337 0.386 0.498 0.699 1.000 0.369 -SHGC 0.640 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.650 - - - -Layer ID# 33034 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33034_GU_Sol 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 2.58 2.58 2.72 2.72 2.82 2.82 2.90 2.90 - 0 6.71 0.00 0.00 0.00 2.58 2.58 2.72 2.72 2.82 2.82 2.90 2.90 - 783 0.00 0.00 0.00 0.00 2.58 2.58 2.72 2.72 2.82 2.82 2.90 2.90 - 783 6.71 0.00 0.00 0.00 2.58 2.58 2.72 2.72 2.82 2.82 2.90 2.90 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Neutral_67_Ar90 -Window ID : 3417 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.530 0.532 0.525 0.514 0.500 0.473 0.413 0.300 0.138 0.000 0.440 -Abs1 0.271 0.274 0.284 0.291 0.294 0.300 0.322 0.347 0.300 0.001 0.300 -Abs2 0.046 0.046 0.047 0.047 0.048 0.049 0.047 0.041 0.029 0.000 0.045 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.154 0.147 0.145 0.147 0.158 0.179 0.218 0.313 0.533 0.999 0.205 -Rbsol 0.173 0.168 0.167 0.170 0.181 0.204 0.257 0.379 0.616 1.000 0.239 -Tvis 0.584 0.587 0.579 0.568 0.553 0.524 0.460 0.336 0.158 0.000 0.488 -Rfvis 0.199 0.193 0.190 0.193 0.204 0.224 0.263 0.355 0.564 0.999 0.249 -Rbvis 0.199 0.193 0.192 0.195 0.207 0.232 0.286 0.411 0.651 1.000 0.266 -SHGC 0.590 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.610 - - - -Layer ID# 33035 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.830 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33035_GU_Sol 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 2.55 2.55 2.69 2.69 2.78 2.78 2.87 2.87 - 0 6.71 0.00 0.00 0.00 2.55 2.55 2.69 2.69 2.78 2.78 2.87 2.87 - 783 0.00 0.00 0.00 0.00 2.55 2.55 2.69 2.69 2.78 2.78 2.87 2.87 - 783 6.71 0.00 0.00 0.00 2.55 2.55 2.69 2.69 2.78 2.78 2.87 2.87 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Neutral_60_Ar90 -Window ID : 3418 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.472 0.474 0.467 0.458 0.446 0.421 0.368 0.267 0.123 0.000 0.392 -Abs1 0.300 0.303 0.312 0.318 0.320 0.325 0.343 0.361 0.304 0.001 0.322 -Abs2 0.040 0.041 0.041 0.042 0.043 0.043 0.041 0.036 0.026 0.000 0.040 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.188 0.181 0.179 0.182 0.192 0.211 0.248 0.336 0.547 0.999 0.236 -Rbsol 0.165 0.160 0.158 0.162 0.173 0.197 0.250 0.374 0.613 1.000 0.232 -Tvis 0.530 0.533 0.525 0.516 0.502 0.476 0.417 0.304 0.142 0.000 0.442 -Rfvis 0.243 0.237 0.235 0.237 0.247 0.266 0.302 0.387 0.584 0.999 0.288 -Rbvis 0.173 0.167 0.166 0.170 0.182 0.209 0.266 0.397 0.645 1.000 0.245 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.550 - - - -Layer ID# 33036 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.780 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33036_GU_Sol 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 2.51 2.51 2.63 2.63 2.72 2.72 2.81 2.81 - 0 6.71 0.00 0.00 0.00 2.51 2.51 2.63 2.63 2.72 2.72 2.81 2.81 - 783 0.00 0.00 0.00 0.00 2.51 2.51 2.63 2.63 2.72 2.72 2.81 2.81 - 783 6.71 0.00 0.00 0.00 2.51 2.51 2.63 2.63 2.72 2.72 2.81 2.81 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_LBlue_52_Ar90 -Window ID : 3419 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.371 0.373 0.368 0.360 0.350 0.331 0.290 0.210 0.097 0.000 0.308 -Abs1 0.475 0.480 0.487 0.491 0.489 0.489 0.495 0.487 0.382 0.001 0.478 -Abs2 0.029 0.030 0.030 0.030 0.031 0.031 0.030 0.026 0.019 0.000 0.029 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.125 0.118 0.116 0.119 0.129 0.148 0.185 0.276 0.502 0.999 0.175 -Rbsol 0.178 0.172 0.171 0.174 0.184 0.208 0.260 0.380 0.616 1.000 0.242 -Tvis 0.443 0.446 0.440 0.432 0.420 0.398 0.349 0.254 0.118 0.000 0.370 -Rfvis 0.152 0.145 0.143 0.146 0.156 0.175 0.212 0.302 0.522 0.999 0.201 -Rbvis 0.167 0.161 0.160 0.164 0.176 0.203 0.260 0.393 0.643 1.000 0.239 -SHGC 0.440 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.470 - - - -Layer ID# 33037 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.710 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33037_GU_Sol 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 2.43 2.43 2.54 2.54 2.63 2.63 2.71 2.71 - 0 6.71 0.00 0.00 0.00 2.43 2.43 2.54 2.54 2.63 2.63 2.71 2.71 - 783 0.00 0.00 0.00 0.00 2.43 2.43 2.54 2.54 2.63 2.63 2.71 2.71 - 783 6.71 0.00 0.00 0.00 2.43 2.43 2.54 2.54 2.63 2.63 2.71 2.71 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Sgrey_32_#2_Ar90 -Window ID : 3420 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.223 0.224 0.221 0.217 0.211 0.199 0.175 0.128 0.060 0.000 0.186 -Abs1 0.562 0.567 0.572 0.573 0.569 0.564 0.558 0.527 0.393 0.001 0.546 -Abs2 0.016 0.017 0.017 0.017 0.017 0.018 0.017 0.015 0.011 0.000 0.016 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.199 0.192 0.191 0.194 0.203 0.219 0.250 0.330 0.537 0.999 0.242 -Rbsol 0.240 0.235 0.234 0.236 0.245 0.264 0.309 0.416 0.631 1.000 0.294 -Tvis 0.280 0.282 0.278 0.273 0.266 0.252 0.221 0.161 0.076 0.000 0.234 -Rfvis 0.225 0.218 0.217 0.219 0.228 0.244 0.275 0.354 0.554 0.999 0.266 -Rbvis 0.203 0.197 0.196 0.200 0.211 0.236 0.289 0.414 0.652 1.000 0.270 -SHGC 0.290 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.300 - - - -Layer ID# 33038 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.530 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33038_GU_Sol 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 2.22 2.22 2.28 2.28 2.36 2.36 2.44 2.44 - 0 6.71 0.00 0.00 0.00 2.22 2.22 2.28 2.28 2.36 2.36 2.44 2.44 - 783 0.00 0.00 0.00 0.00 2.22 2.22 2.28 2.28 2.36 2.36 2.44 2.44 - 783 6.71 0.00 0.00 0.00 2.22 2.22 2.28 2.28 2.36 2.36 2.44 2.44 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Rblue_20_#2_Ar90 -Window ID : 3421 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.162 0.163 0.161 0.158 0.153 0.146 0.128 0.095 0.046 0.000 0.136 -Abs1 0.641 0.646 0.650 0.650 0.645 0.637 0.623 0.578 0.420 0.001 0.614 -Abs2 0.013 0.013 0.013 0.014 0.014 0.014 0.014 0.012 0.009 0.000 0.013 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.184 0.177 0.176 0.178 0.188 0.204 0.235 0.315 0.525 0.999 0.227 -Rbsol 0.338 0.333 0.332 0.333 0.339 0.353 0.388 0.474 0.656 1.000 0.377 -Tvis 0.190 0.191 0.188 0.185 0.180 0.171 0.151 0.112 0.054 0.000 0.159 -Rfvis 0.200 0.193 0.192 0.194 0.203 0.219 0.250 0.329 0.535 0.999 0.242 -Rbvis 0.326 0.321 0.320 0.322 0.330 0.349 0.390 0.488 0.684 1.000 0.375 -SHGC 0.230 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.200 - - - -Layer ID# 33040 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.410 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33040_GU_Sol 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 2.06 2.06 2.06 2.06 2.14 2.14 2.21 2.21 - 0 6.71 0.00 0.00 0.00 2.06 2.06 2.06 2.06 2.14 2.14 2.21 2.21 - 783 0.00 0.00 0.00 0.00 2.06 2.06 2.06 2.06 2.14 2.14 2.21 2.21 - 783 6.71 0.00 0.00 0.00 2.06 2.06 2.06 2.06 2.14 2.14 2.21 2.21 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Silver_20_#2_Ar90 -Window ID : 3422 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.148 0.149 0.147 0.144 0.140 0.133 0.117 0.086 0.040 0.000 0.124 -Abs1 0.513 0.518 0.521 0.522 0.518 0.512 0.503 0.469 0.343 0.001 0.494 -Abs2 0.011 0.011 0.011 0.011 0.011 0.011 0.011 0.010 0.007 0.000 0.011 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.328 0.322 0.321 0.323 0.331 0.344 0.370 0.436 0.609 0.999 0.361 -Rbsol 0.285 0.280 0.279 0.280 0.287 0.305 0.345 0.442 0.642 1.000 0.332 -Tvis 0.190 0.191 0.189 0.185 0.181 0.171 0.150 0.110 0.052 0.000 0.159 -Rfvis 0.344 0.338 0.337 0.339 0.347 0.360 0.385 0.450 0.619 0.999 0.376 -Rbvis 0.235 0.229 0.228 0.231 0.242 0.265 0.315 0.432 0.660 1.000 0.297 -SHGC 0.200 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.200 - - - -Layer ID# 33039 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.420 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33039_GU_Sol 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 2.07 2.07 2.08 2.08 2.16 2.16 2.23 2.23 - 0 6.71 0.00 0.00 0.00 2.07 2.07 2.08 2.08 2.16 2.16 2.23 2.23 - 783 0.00 0.00 0.00 0.00 2.07 2.07 2.08 2.08 2.16 2.16 2.23 2.23 - 783 6.71 0.00 0.00 0.00 2.07 2.07 2.08 2.08 2.16 2.16 2.23 2.23 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Bgreen_20_#2_Ar90 -Window ID : 3423 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.141 0.142 0.140 0.137 0.134 0.126 0.111 0.081 0.038 0.000 0.118 -Abs1 0.656 0.662 0.665 0.665 0.659 0.651 0.636 0.589 0.426 0.001 0.628 -Abs2 0.011 0.011 0.011 0.012 0.012 0.012 0.012 0.010 0.007 0.000 0.011 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.191 0.185 0.183 0.186 0.195 0.211 0.241 0.321 0.529 0.999 0.233 -Rbsol 0.225 0.220 0.219 0.221 0.231 0.252 0.298 0.409 0.629 1.000 0.283 -Tvis 0.173 0.174 0.171 0.168 0.164 0.155 0.136 0.099 0.047 0.000 0.144 -Rfvis 0.267 0.261 0.260 0.262 0.271 0.285 0.313 0.385 0.574 0.999 0.305 -Rbvis 0.198 0.192 0.191 0.195 0.207 0.232 0.287 0.413 0.653 1.000 0.266 -SHGC 0.150 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.190 - - - -Layer ID# 33041 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.360 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33041_GU_Sol 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.98 1.98 1.96 1.96 2.04 2.04 2.10 2.10 - 0 6.71 0.00 0.00 0.00 1.98 1.98 1.96 1.96 2.04 2.04 2.10 2.10 - 783 0.00 0.00 0.00 0.00 1.98 1.98 1.96 1.96 2.04 2.04 2.10 2.10 - 783 6.71 0.00 0.00 0.00 1.98 1.98 1.96 1.96 2.04 2.04 2.10 2.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Bronze_20_#2_Ar90 -Window ID : 3424 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.134 0.134 0.132 0.130 0.126 0.120 0.105 0.077 0.036 0.000 0.111 -Abs1 0.656 0.662 0.665 0.665 0.659 0.650 0.635 0.586 0.423 0.001 0.626 -Abs2 0.010 0.010 0.010 0.010 0.010 0.010 0.010 0.009 0.007 0.000 0.010 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.201 0.194 0.193 0.196 0.205 0.220 0.250 0.328 0.534 0.999 0.242 -Rbsol 0.260 0.255 0.253 0.255 0.263 0.282 0.324 0.427 0.635 1.000 0.311 -Tvis 0.171 0.172 0.170 0.167 0.162 0.154 0.135 0.098 0.046 0.000 0.143 -Rfvis 0.179 0.172 0.171 0.174 0.183 0.199 0.230 0.311 0.522 0.999 0.222 -Rbvis 0.194 0.189 0.187 0.191 0.203 0.227 0.282 0.408 0.650 1.000 0.262 -SHGC 0.140 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.190 - - - -Layer ID# 33042 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.330 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33042_GU_Sol 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.94 1.94 1.90 1.90 1.97 1.97 2.03 2.03 - 0 6.71 0.00 0.00 0.00 1.94 1.94 1.90 1.90 1.97 1.97 2.03 2.03 - 783 0.00 0.00 0.00 0.00 1.94 1.94 1.90 1.90 1.97 1.97 2.03 2.03 - 783 6.71 0.00 0.00 0.00 1.94 1.94 1.90 1.90 1.97 1.97 2.03 2.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Gold_20_#2_Ar90 -Window ID : 3425 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.156 0.157 0.155 0.152 0.148 0.140 0.122 0.089 0.041 0.000 0.130 -Abs1 0.651 0.656 0.660 0.660 0.655 0.646 0.633 0.587 0.427 0.001 0.624 -Abs2 0.012 0.012 0.012 0.012 0.012 0.012 0.012 0.011 0.008 0.000 0.012 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.181 0.175 0.173 0.176 0.185 0.201 0.232 0.313 0.523 0.999 0.224 -Rbsol 0.220 0.215 0.213 0.215 0.224 0.245 0.292 0.404 0.625 1.000 0.277 -Tvis 0.198 0.199 0.196 0.193 0.188 0.178 0.155 0.113 0.053 0.000 0.165 -Rfvis 0.235 0.229 0.228 0.230 0.239 0.254 0.283 0.359 0.556 0.999 0.275 -Rbvis 0.163 0.157 0.156 0.160 0.172 0.199 0.257 0.390 0.642 1.000 0.236 -SHGC 0.170 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.210 - - - -Layer ID# 33043 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.320 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33043_GU_Sol 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.92 1.92 1.88 1.88 1.95 1.95 2.01 2.01 - 0 6.71 0.00 0.00 0.00 1.92 1.92 1.88 1.88 1.95 1.95 2.01 2.01 - 783 0.00 0.00 0.00 0.00 1.92 1.92 1.88 1.88 1.95 1.95 2.01 2.01 - 783 6.71 0.00 0.00 0.00 1.92 1.92 1.88 1.88 1.95 1.95 2.01 2.01 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Silver08_#2_Ar90 -Window ID : 3426 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.071 0.071 0.070 0.069 0.067 0.063 0.056 0.042 0.020 0.000 0.059 -Abs1 0.577 0.582 0.584 0.583 0.577 0.568 0.551 0.503 0.358 0.001 0.546 -Abs2 0.006 0.006 0.006 0.006 0.006 0.006 0.006 0.006 0.004 0.000 0.006 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.346 0.341 0.340 0.342 0.350 0.362 0.386 0.450 0.618 0.999 0.378 -Rbsol 0.371 0.367 0.365 0.366 0.371 0.384 0.415 0.495 0.665 1.000 0.406 -Tvis 0.081 0.082 0.081 0.079 0.077 0.073 0.065 0.048 0.023 0.000 0.068 -Rfvis 0.397 0.392 0.391 0.393 0.400 0.412 0.434 0.493 0.648 0.999 0.426 -Rbvis 0.318 0.313 0.312 0.314 0.322 0.341 0.383 0.483 0.682 1.000 0.368 -SHGC 0.120 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.080 - - - -Layer ID# 33044 33000 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.860 0 0 0 0 -Emis B 0.270 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33044_GU_Sol 33000_GU_Flo None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.83 1.83 1.76 1.76 1.83 1.83 1.88 1.88 - 0 6.71 0.00 0.00 0.00 1.83 1.83 1.76 1.76 1.83 1.83 1.88 1.88 - 783 0.00 0.00 0.00 0.00 1.83 1.83 1.76 1.76 1.83 1.83 1.88 1.88 - 783 6.71 0.00 0.00 0.00 1.83 1.83 1.76 1.76 1.83 1.83 1.88 1.88 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Neutral_70_CG_Prem_#3_Ar90 -Window ID : 3427 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.437 0.439 0.431 0.423 0.413 0.393 0.344 0.250 0.121 0.000 0.364 -Abs1 0.101 0.101 0.105 0.107 0.107 0.108 0.113 0.118 0.100 0.000 0.107 -Abs2 0.075 0.076 0.082 0.087 0.089 0.093 0.102 0.108 0.080 0.000 0.091 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.387 0.383 0.381 0.383 0.391 0.406 0.440 0.523 0.699 1.000 0.428 -Rbsol 0.368 0.362 0.358 0.358 0.364 0.377 0.400 0.462 0.625 0.999 0.393 -Tvis 0.578 0.581 0.570 0.558 0.545 0.519 0.453 0.327 0.156 0.000 0.480 -Rfvis 0.315 0.311 0.311 0.314 0.323 0.343 0.387 0.491 0.691 1.000 0.370 -Rbvis 0.290 0.284 0.278 0.276 0.283 0.296 0.321 0.388 0.571 0.999 0.315 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.630 - - - -Layer ID# 33034 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.860 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33034_GU_Sol 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Neutral_67_CG_Prem_#3_Ar90 -Window ID : 3428 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.396 0.401 0.391 0.379 0.366 0.342 0.292 0.202 0.090 0.000 0.319 -Abs1 0.312 0.314 0.324 0.332 0.334 0.339 0.357 0.373 0.311 0.001 0.335 -Abs2 0.066 0.067 0.072 0.075 0.076 0.078 0.084 0.085 0.058 0.000 0.076 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.226 0.218 0.213 0.214 0.224 0.240 0.267 0.340 0.541 0.999 0.260 -Rbsol 0.307 0.298 0.295 0.297 0.307 0.324 0.353 0.425 0.607 0.999 0.341 -Tvis 0.547 0.553 0.539 0.522 0.504 0.471 0.401 0.276 0.122 0.000 0.439 -Rfvis 0.198 0.188 0.185 0.188 0.201 0.221 0.257 0.345 0.555 0.999 0.244 -Rbvis 0.192 0.181 0.175 0.177 0.190 0.211 0.245 0.331 0.543 0.999 0.233 -SHGC 0.470 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.590 - - - -Layer ID# 33035 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.830 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33035_GU_Sol 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Neutral_60_CG_Prem_#3_Ar90 -Window ID : 3429 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.358 0.362 0.353 0.342 0.330 0.309 0.263 0.182 0.081 0.000 0.288 -Abs1 0.341 0.344 0.353 0.359 0.361 0.364 0.378 0.385 0.314 0.001 0.358 -Abs2 0.059 0.061 0.065 0.068 0.069 0.071 0.076 0.077 0.052 0.000 0.069 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.241 0.233 0.229 0.231 0.240 0.256 0.283 0.356 0.552 0.999 0.275 -Rbsol 0.295 0.286 0.283 0.285 0.296 0.314 0.344 0.420 0.605 0.999 0.332 -Tvis 0.496 0.502 0.489 0.474 0.458 0.428 0.363 0.250 0.110 0.000 0.398 -Rfvis 0.242 0.233 0.230 0.233 0.245 0.264 0.297 0.378 0.576 0.999 0.284 -Rbvis 0.170 0.158 0.153 0.156 0.170 0.192 0.230 0.321 0.540 0.999 0.215 -SHGC 0.410 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.540 - - - -Layer ID# 33036 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.780 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33036_GU_Sol 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_LBlue_52_CG_Prem_#3_Ar90 -Window ID : 3430 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.291 0.294 0.287 0.278 0.268 0.251 0.214 0.148 0.065 0.000 0.234 -Abs1 0.512 0.516 0.522 0.526 0.525 0.523 0.524 0.507 0.389 0.001 0.508 -Abs2 0.046 0.047 0.051 0.053 0.054 0.056 0.060 0.061 0.042 0.000 0.054 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.151 0.143 0.140 0.142 0.153 0.170 0.202 0.284 0.504 0.999 0.194 -Rbsol 0.295 0.285 0.282 0.285 0.296 0.314 0.344 0.420 0.605 0.999 0.332 -Tvis 0.416 0.421 0.410 0.398 0.384 0.359 0.304 0.209 0.092 0.000 0.334 -Rfvis 0.150 0.141 0.139 0.142 0.153 0.173 0.208 0.296 0.517 0.999 0.197 -Rbvis 0.164 0.152 0.147 0.150 0.165 0.187 0.226 0.318 0.539 0.999 0.211 -SHGC 0.360 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.460 - - - -Layer ID# 33037 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.710 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33037_GU_Sol 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.08 1.08 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Sgrey_32_CG_Prem_#2#3_Ar90 -Window ID : 3431 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.182 0.184 0.179 0.173 0.167 0.157 0.133 0.092 0.041 0.000 0.146 -Abs1 0.583 0.588 0.592 0.593 0.589 0.583 0.574 0.537 0.396 0.001 0.563 -Abs2 0.029 0.029 0.032 0.033 0.034 0.035 0.038 0.038 0.026 0.000 0.034 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.207 0.200 0.198 0.200 0.210 0.225 0.255 0.332 0.537 0.999 0.247 -Rbsol 0.322 0.314 0.310 0.311 0.321 0.337 0.364 0.433 0.610 0.999 0.354 -Tvis 0.263 0.266 0.259 0.251 0.242 0.227 0.193 0.133 0.058 0.000 0.211 -Rfvis 0.224 0.216 0.215 0.218 0.227 0.243 0.273 0.351 0.552 0.999 0.264 -Rbvis 0.195 0.184 0.179 0.181 0.194 0.214 0.248 0.333 0.544 0.999 0.236 -SHGC 0.230 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.290 - - - -Layer ID# 33038 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.530 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33038_GU_Sol 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Rblue_20_CG_Prem_#2#3_Ar90 -Window ID : 3432 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.129 0.131 0.127 0.123 0.119 0.112 0.096 0.067 0.031 0.000 0.104 -Abs1 0.659 0.664 0.667 0.667 0.662 0.653 0.637 0.587 0.423 0.001 0.629 -Abs2 0.022 0.022 0.024 0.025 0.025 0.026 0.028 0.028 0.020 0.000 0.025 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.191 0.184 0.182 0.185 0.194 0.209 0.239 0.317 0.526 0.999 0.232 -Rbsol 0.396 0.388 0.382 0.382 0.389 0.400 0.416 0.467 0.624 0.999 0.412 -Tvis 0.178 0.180 0.175 0.170 0.164 0.154 0.131 0.092 0.041 0.000 0.143 -Rfvis 0.199 0.192 0.191 0.194 0.203 0.219 0.249 0.328 0.534 0.999 0.241 -Rbvis 0.305 0.295 0.287 0.286 0.294 0.307 0.325 0.383 0.564 0.999 0.322 -SHGC 0.180 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.190 - - - -Layer ID# 33040 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.410 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33040_GU_Sol 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Silver_20_CG_Prem_#2#3_Ar90 -Window ID : 3433 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.123 0.125 0.121 0.118 0.114 0.106 0.091 0.063 0.028 0.000 0.099 -Abs1 0.526 0.530 0.533 0.534 0.530 0.523 0.512 0.474 0.345 0.001 0.504 -Abs2 0.020 0.020 0.022 0.023 0.023 0.024 0.026 0.026 0.018 0.000 0.023 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.331 0.325 0.324 0.326 0.334 0.347 0.371 0.437 0.609 0.999 0.363 -Rbsol 0.345 0.337 0.332 0.333 0.342 0.357 0.380 0.443 0.614 0.999 0.372 -Tvis 0.179 0.181 0.176 0.171 0.165 0.154 0.131 0.091 0.040 0.000 0.143 -Rfvis 0.343 0.337 0.336 0.338 0.346 0.359 0.384 0.449 0.618 0.999 0.376 -Rbvis 0.223 0.212 0.206 0.207 0.219 0.238 0.268 0.345 0.549 0.999 0.258 -SHGC 0.170 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.190 - - - -Layer ID# 33039 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.420 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33039_GU_Sol 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Bgreen_20_CG_Prem_#2#3_Ar90 -Window ID : 3434 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.114 0.115 0.112 0.109 0.105 0.099 0.084 0.058 0.026 0.000 0.092 -Abs1 0.673 0.679 0.682 0.681 0.676 0.666 0.649 0.596 0.429 0.001 0.641 -Abs2 0.018 0.018 0.019 0.020 0.021 0.021 0.023 0.024 0.016 0.000 0.021 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.195 0.188 0.186 0.189 0.198 0.214 0.244 0.322 0.529 0.999 0.236 -Rbsol 0.312 0.303 0.299 0.301 0.311 0.328 0.356 0.428 0.608 0.999 0.345 -Tvis 0.162 0.164 0.160 0.155 0.150 0.140 0.119 0.082 0.036 0.000 0.130 -Rfvis 0.267 0.261 0.259 0.262 0.270 0.285 0.312 0.384 0.573 0.999 0.304 -Rbvis 0.188 0.177 0.172 0.174 0.187 0.208 0.243 0.330 0.543 0.999 0.230 -SHGC 0.130 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.180 - - - -Layer ID# 33041 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.360 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33041_GU_Sol 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Bronze_20_CG_Prem_#2#3_Ar90 -Window ID : 3435 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.112 0.113 0.110 0.107 0.103 0.096 0.082 0.057 0.025 0.000 0.090 -Abs1 0.668 0.673 0.676 0.676 0.670 0.661 0.644 0.591 0.425 0.001 0.636 -Abs2 0.017 0.017 0.019 0.020 0.020 0.020 0.022 0.023 0.016 0.000 0.020 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.203 0.197 0.195 0.198 0.207 0.222 0.252 0.329 0.534 0.999 0.244 -Rbsol 0.321 0.312 0.308 0.310 0.320 0.336 0.363 0.432 0.610 0.999 0.353 -Tvis 0.162 0.164 0.159 0.155 0.149 0.139 0.118 0.082 0.036 0.000 0.130 -Rfvis 0.179 0.172 0.170 0.173 0.182 0.199 0.229 0.310 0.522 0.999 0.222 -Rbvis 0.184 0.172 0.167 0.170 0.183 0.205 0.240 0.328 0.542 0.999 0.227 -SHGC 0.130 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.190 - - - -Layer ID# 33042 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.330 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33042_GU_Sol 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Gold_20_CG_Prem_#2#3_Ar90 -Window ID : 3436 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.129 0.130 0.127 0.123 0.119 0.111 0.095 0.065 0.029 0.000 0.104 -Abs1 0.666 0.671 0.675 0.675 0.669 0.660 0.645 0.594 0.429 0.001 0.636 -Abs2 0.020 0.020 0.022 0.023 0.023 0.024 0.026 0.027 0.018 0.000 0.023 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.185 0.178 0.176 0.179 0.188 0.204 0.234 0.314 0.524 0.999 0.227 -Rbsol 0.301 0.292 0.289 0.291 0.302 0.320 0.349 0.423 0.607 0.999 0.337 -Tvis 0.186 0.189 0.184 0.178 0.172 0.160 0.136 0.094 0.041 0.000 0.149 -Rfvis 0.235 0.228 0.227 0.229 0.238 0.254 0.282 0.358 0.555 0.999 0.274 -Rbvis 0.158 0.146 0.142 0.145 0.159 0.183 0.222 0.316 0.538 0.999 0.207 -SHGC 0.150 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.200 - - - -Layer ID# 33043 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.320 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33043_GU_Sol 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.05 1.05 1.07 1.07 1.09 1.09 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_Solar_Silver08_CG_Prem_#2#3_Ar90 -Window ID : 3437 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.058 0.058 0.057 0.055 0.053 0.050 0.043 0.030 0.014 0.000 0.047 -Abs1 0.584 0.589 0.591 0.590 0.584 0.575 0.557 0.506 0.359 0.001 0.552 -Abs2 0.010 0.010 0.011 0.012 0.012 0.012 0.013 0.013 0.009 0.000 0.012 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.348 0.342 0.341 0.343 0.351 0.363 0.387 0.450 0.618 0.999 0.379 -Rbsol 0.401 0.393 0.387 0.386 0.393 0.404 0.420 0.470 0.625 0.999 0.416 -Tvis 0.076 0.077 0.075 0.073 0.070 0.066 0.056 0.039 0.018 0.000 0.061 -Rfvis 0.397 0.392 0.391 0.393 0.400 0.412 0.434 0.493 0.648 0.999 0.426 -Rbvis 0.296 0.287 0.279 0.278 0.287 0.300 0.320 0.380 0.563 0.999 0.316 -SHGC 0.090 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.080 - - - -Layer ID# 33044 33010 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.860 0.030 0 0 0 0 -Emis B 0.270 0.860 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 33044_GU_Sol 33010_GU_Cli None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.34 1.34 1.04 1.04 1.07 1.07 1.09 1.09 - 0 6.71 0.00 0.00 0.00 1.34 1.34 1.04 1.04 1.07 1.07 1.09 1.09 - 783 0.00 0.00 0.00 0.00 1.34 1.34 1.04 1.04 1.07 1.07 1.09 1.09 - 783 6.71 0.00 0.00 0.00 1.34 1.34 1.04 1.04 1.07 1.07 1.09 1.09 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_SNX_60/28_#2#5_Ar90 -Window ID : 3500 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.222 0.224 0.218 0.211 0.202 0.186 0.152 0.096 0.035 0.000 0.172 -Abs1 0.334 0.337 0.342 0.345 0.344 0.344 0.349 0.343 0.268 0.001 0.336 -Abs2 0.011 0.011 0.011 0.012 0.012 0.012 0.012 0.012 0.010 0.000 0.012 -Abs3 0.024 0.024 0.027 0.029 0.030 0.031 0.034 0.033 0.020 0.000 0.029 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.409 0.403 0.402 0.404 0.412 0.427 0.453 0.516 0.668 0.999 0.441 -Rbsol 0.382 0.375 0.369 0.368 0.376 0.390 0.414 0.476 0.633 0.999 0.405 -Tvis 0.381 0.385 0.375 0.363 0.348 0.320 0.261 0.164 0.060 0.000 0.296 -Rfvis 0.225 0.217 0.215 0.217 0.229 0.249 0.287 0.372 0.570 0.999 0.271 -Rbvis 0.246 0.236 0.229 0.230 0.242 0.265 0.303 0.388 0.579 0.999 0.286 -SHGC 0.260 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.530 - - - -Layer ID# 33014 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.010 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33014_GU_SNX 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 0 6.71 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 783 0.00 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 783 6.71 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_SN_70/41_#2#5_Ar90 -Window ID : 3501 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.312 0.315 0.307 0.296 0.284 0.261 0.212 0.133 0.048 0.000 0.241 -Abs1 0.274 0.276 0.283 0.288 0.290 0.293 0.307 0.318 0.263 0.001 0.290 -Abs2 0.025 0.025 0.025 0.026 0.026 0.027 0.027 0.025 0.020 0.000 0.025 -Abs3 0.039 0.040 0.043 0.046 0.047 0.048 0.052 0.049 0.028 0.000 0.046 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.351 0.344 0.341 0.344 0.354 0.371 0.403 0.475 0.641 0.999 0.388 -Rbsol 0.341 0.333 0.329 0.330 0.339 0.357 0.389 0.462 0.629 0.999 0.374 -Tvis 0.507 0.513 0.499 0.483 0.462 0.424 0.346 0.216 0.078 0.000 0.393 -Rfvis 0.184 0.175 0.171 0.174 0.188 0.213 0.256 0.351 0.559 0.999 0.236 -Rbvis 0.194 0.183 0.178 0.181 0.196 0.223 0.271 0.370 0.574 0.999 0.247 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.620 - - - -Layer ID# 33017 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.030 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33017_GU_SN7 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 0 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_SN_70/37_#2#5_Ar90 -Window ID : 3502 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.288 0.291 0.283 0.274 0.262 0.241 0.197 0.124 0.045 0.000 0.223 -Abs1 0.261 0.263 0.269 0.274 0.275 0.278 0.289 0.298 0.244 0.001 0.274 -Abs2 0.019 0.019 0.019 0.020 0.020 0.021 0.021 0.019 0.016 0.000 0.020 -Abs3 0.033 0.034 0.037 0.040 0.041 0.042 0.046 0.044 0.026 0.000 0.040 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.400 0.393 0.391 0.393 0.402 0.419 0.448 0.515 0.669 0.999 0.433 -Rbsol 0.362 0.355 0.349 0.349 0.358 0.374 0.402 0.469 0.631 0.999 0.390 -Tvis 0.481 0.486 0.473 0.457 0.438 0.403 0.328 0.206 0.075 0.000 0.373 -Rfvis 0.217 0.208 0.204 0.207 0.221 0.244 0.286 0.377 0.577 0.999 0.266 -Rbvis 0.221 0.211 0.205 0.206 0.220 0.245 0.287 0.379 0.576 0.999 0.267 -SHGC 0.340 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.620 - - - -Layer ID# 33015 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.010 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33015_GU_SN7 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 0 6.71 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 783 0.00 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 783 6.71 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_SN_51/28_#2#5_Ar90 -Window ID : 3503 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.213 0.215 0.209 0.202 0.194 0.179 0.147 0.093 0.035 0.000 0.165 -Abs1 0.373 0.376 0.381 0.383 0.382 0.381 0.384 0.373 0.287 0.001 0.371 -Abs2 0.014 0.014 0.014 0.014 0.014 0.015 0.015 0.014 0.012 0.000 0.014 -Abs3 0.025 0.025 0.028 0.030 0.031 0.032 0.034 0.033 0.020 0.000 0.030 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.376 0.370 0.369 0.371 0.379 0.394 0.421 0.486 0.647 0.999 0.409 -Rbsol 0.391 0.383 0.377 0.376 0.383 0.397 0.419 0.478 0.634 0.999 0.411 -Tvis 0.356 0.360 0.350 0.338 0.325 0.299 0.245 0.156 0.058 0.000 0.277 -Rfvis 0.202 0.194 0.192 0.195 0.206 0.226 0.263 0.349 0.553 0.999 0.249 -Rbvis 0.267 0.258 0.251 0.251 0.262 0.282 0.316 0.394 0.580 0.999 0.301 -SHGC 0.250 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.450 - - - -Layer ID# 33019 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.010 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33019_GU_SN5 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 0 6.71 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 783 0.00 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 783 6.71 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_SN_40/23_#2#5_Ar90 -Window ID : 3504 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.175 0.176 0.171 0.166 0.159 0.147 0.121 0.078 0.030 0.000 0.136 -Abs1 0.428 0.432 0.436 0.437 0.435 0.432 0.429 0.409 0.307 0.001 0.419 -Abs2 0.012 0.012 0.012 0.012 0.013 0.013 0.013 0.013 0.011 0.000 0.013 -Abs3 0.021 0.021 0.024 0.025 0.026 0.026 0.029 0.028 0.017 0.000 0.025 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.364 0.358 0.357 0.359 0.367 0.381 0.407 0.472 0.636 0.999 0.397 -Rbsol 0.419 0.413 0.406 0.404 0.409 0.420 0.437 0.488 0.636 0.999 0.433 -Tvis 0.289 0.292 0.284 0.275 0.264 0.244 0.201 0.129 0.049 0.000 0.226 -Rfvis 0.201 0.194 0.191 0.194 0.205 0.223 0.257 0.341 0.546 0.999 0.246 -Rbvis 0.319 0.310 0.302 0.300 0.308 0.324 0.348 0.412 0.585 0.999 0.340 -SHGC 0.210 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.360 - - - -Layer ID# 33020 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.010 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33020_GU_SN4 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 0 6.71 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 783 0.00 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - 783 6.71 0.00 0.00 0.00 0.67 0.67 0.70 0.70 0.72 0.72 0.73 0.73 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPlblue_62/52_#2#5_Ar90 -Window ID : 3505 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.334 0.337 0.330 0.321 0.308 0.284 0.237 0.156 0.057 0.000 0.264 -Abs1 0.356 0.359 0.362 0.366 0.373 0.380 0.385 0.383 0.339 0.000 0.368 -Abs2 0.050 0.049 0.049 0.050 0.051 0.052 0.052 0.050 0.038 0.000 0.049 -Abs3 0.050 0.051 0.055 0.058 0.059 0.060 0.064 0.063 0.036 0.000 0.057 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.209 0.205 0.204 0.205 0.210 0.225 0.262 0.348 0.530 1.000 0.251 -Rbsol 0.298 0.312 0.309 0.310 0.320 0.339 0.375 0.454 0.627 0.999 0.358 -Tvis 0.489 0.495 0.486 0.473 0.454 0.420 0.350 0.230 0.085 0.000 0.390 -Rfvis 0.174 0.172 0.171 0.172 0.181 0.202 0.252 0.361 0.565 1.000 0.234 -Rbvis 0.169 0.201 0.197 0.198 0.209 0.233 0.279 0.376 0.575 0.999 0.259 -SHGC 0.410 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.550 - - - -Layer ID# 33021 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.140 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33021_GU_HPL 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.78 0.78 0.82 0.82 0.84 0.84 0.86 0.86 - 0 6.71 0.00 0.00 0.00 0.78 0.78 0.82 0.82 0.84 0.84 0.86 0.86 - 783 0.00 0.00 0.00 0.00 0.78 0.78 0.82 0.82 0.84 0.84 0.86 0.86 - 783 6.71 0.00 0.00 0.00 0.78 0.78 0.82 0.82 0.84 0.84 0.86 0.86 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HP_52/41_#2#5_Ar90 -Window ID : 3506 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.272 0.275 0.267 0.258 0.247 0.227 0.185 0.116 0.042 0.000 0.210 -Abs1 0.418 0.421 0.428 0.432 0.432 0.433 0.442 0.439 0.346 0.001 0.424 -Abs2 0.038 0.038 0.038 0.039 0.040 0.040 0.039 0.035 0.027 0.000 0.038 -Abs3 0.040 0.041 0.044 0.047 0.047 0.047 0.050 0.046 0.026 0.000 0.045 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.232 0.225 0.222 0.224 0.235 0.252 0.285 0.364 0.561 0.999 0.273 -Rbsol 0.303 0.295 0.291 0.294 0.306 0.327 0.366 0.449 0.626 0.999 0.346 -Tvis 0.405 0.409 0.398 0.385 0.368 0.338 0.275 0.171 0.062 0.000 0.313 -Rfvis 0.193 0.185 0.182 0.185 0.197 0.218 0.256 0.344 0.550 0.999 0.241 -Rbvis 0.170 0.159 0.155 0.158 0.175 0.205 0.257 0.362 0.572 0.999 0.230 -SHGC 0.340 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.460 - - - -Layer ID# 33024 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.110 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33024_GU_HPN 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.76 0.76 0.80 0.80 0.82 0.82 0.83 0.83 - 0 6.71 0.00 0.00 0.00 0.76 0.76 0.80 0.80 0.82 0.82 0.83 0.83 - 783 0.00 0.00 0.00 0.00 0.76 0.76 0.80 0.80 0.82 0.82 0.83 0.83 - 783 6.71 0.00 0.00 0.00 0.76 0.76 0.80 0.80 0.82 0.82 0.83 0.83 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HP_60/40_#2#5_Ar90 -Window ID : 3507 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.280 0.283 0.275 0.266 0.255 0.234 0.192 0.121 0.045 0.000 0.217 -Abs1 0.288 0.291 0.297 0.302 0.302 0.306 0.317 0.325 0.265 0.001 0.301 -Abs2 0.033 0.033 0.034 0.034 0.035 0.035 0.035 0.032 0.025 0.000 0.033 -Abs3 0.039 0.040 0.043 0.046 0.046 0.047 0.050 0.047 0.027 0.000 0.045 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.360 0.353 0.351 0.353 0.362 0.378 0.407 0.475 0.639 0.999 0.394 -Rbsol 0.349 0.341 0.336 0.337 0.347 0.364 0.394 0.464 0.630 0.999 0.380 -Tvis 0.428 0.432 0.421 0.407 0.390 0.359 0.293 0.185 0.068 0.000 0.332 -Rfvis 0.269 0.261 0.258 0.260 0.272 0.292 0.329 0.411 0.598 0.999 0.312 -Rbvis 0.228 0.219 0.213 0.214 0.227 0.251 0.292 0.381 0.577 0.999 0.273 -SHGC 0.360 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.530 - - - -Layer ID# 33022 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.040 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33022_GU_HPN 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.75 0.75 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.75 0.75 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.75 0.75 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.75 0.75 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HP_41/33_#2#5_Ar90 -Window ID : 3508 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.213 0.215 0.209 0.202 0.194 0.178 0.145 0.091 0.033 0.000 0.165 -Abs1 0.470 0.473 0.479 0.481 0.480 0.478 0.480 0.464 0.354 0.001 0.465 -Abs2 0.029 0.029 0.029 0.029 0.030 0.030 0.030 0.027 0.020 0.000 0.028 -Abs3 0.031 0.032 0.034 0.036 0.036 0.037 0.039 0.036 0.020 0.000 0.035 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.258 0.251 0.249 0.251 0.261 0.277 0.307 0.382 0.572 0.999 0.297 -Rbsol 0.314 0.306 0.302 0.304 0.315 0.336 0.372 0.452 0.627 0.999 0.354 -Tvis 0.319 0.323 0.314 0.304 0.291 0.267 0.217 0.136 0.049 0.000 0.247 -Rfvis 0.228 0.221 0.219 0.221 0.232 0.250 0.284 0.365 0.562 0.999 0.272 -Rbvis 0.184 0.173 0.169 0.172 0.187 0.215 0.265 0.367 0.573 0.999 0.240 -SHGC 0.270 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.360 - - - -Layer ID# 33026 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.110 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33026_GU_HPN 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.76 0.76 0.80 0.80 0.82 0.82 0.83 0.83 - 0 6.71 0.00 0.00 0.00 0.76 0.76 0.80 0.80 0.82 0.82 0.83 0.83 - 783 0.00 0.00 0.00 0.00 0.76 0.76 0.80 0.80 0.82 0.82 0.83 0.83 - 783 6.71 0.00 0.00 0.00 0.76 0.76 0.80 0.80 0.82 0.82 0.83 0.83 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HP_50/32_#2#5_Ar90 -Window ID : 3509 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.231 0.233 0.227 0.219 0.210 0.194 0.159 0.102 0.038 0.000 0.180 -Abs1 0.332 0.335 0.340 0.344 0.343 0.344 0.349 0.346 0.271 0.001 0.336 -Abs2 0.025 0.025 0.025 0.026 0.026 0.027 0.026 0.024 0.019 0.000 0.025 -Abs3 0.031 0.031 0.034 0.036 0.037 0.037 0.040 0.039 0.023 0.000 0.036 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.381 0.375 0.373 0.375 0.384 0.398 0.425 0.490 0.649 0.999 0.413 -Rbsol 0.384 0.377 0.371 0.370 0.378 0.391 0.415 0.475 0.633 0.999 0.406 -Tvis 0.360 0.363 0.353 0.342 0.328 0.302 0.248 0.158 0.059 0.000 0.280 -Rfvis 0.276 0.269 0.266 0.269 0.279 0.298 0.331 0.410 0.596 0.999 0.317 -Rbvis 0.276 0.267 0.259 0.259 0.270 0.289 0.321 0.397 0.581 0.999 0.308 -SHGC 0.280 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.440 - - - -Layer ID# 33025 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.030 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33025_GU_HPN 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 0 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPsilver_43/31_#2#5_Ar90 -Window ID : 3510 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.216 0.218 0.212 0.205 0.197 0.181 0.148 0.093 0.034 0.000 0.168 -Abs1 0.350 0.353 0.358 0.361 0.361 0.361 0.367 0.362 0.283 0.001 0.353 -Abs2 0.027 0.028 0.028 0.028 0.029 0.029 0.029 0.026 0.020 0.000 0.027 -Abs3 0.031 0.031 0.034 0.036 0.036 0.037 0.039 0.037 0.021 0.000 0.035 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.376 0.370 0.368 0.370 0.378 0.392 0.418 0.482 0.642 0.999 0.407 -Rbsol 0.340 0.333 0.328 0.329 0.339 0.357 0.388 0.461 0.629 0.999 0.374 -Tvis 0.327 0.330 0.321 0.311 0.298 0.274 0.224 0.141 0.052 0.000 0.254 -Rfvis 0.331 0.324 0.322 0.325 0.334 0.350 0.381 0.452 0.624 0.999 0.368 -Rbvis 0.220 0.210 0.204 0.206 0.219 0.244 0.287 0.378 0.576 0.999 0.266 -SHGC 0.270 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.380 - - - -Layer ID# 33027 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.050 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33027_GU_HPS 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.71 0.71 0.75 0.75 0.76 0.76 0.78 0.78 - 0 6.71 0.00 0.00 0.00 0.71 0.71 0.75 0.75 0.76 0.76 0.78 0.78 - 783 0.00 0.00 0.00 0.00 0.71 0.71 0.75 0.75 0.76 0.76 0.78 0.78 - 783 6.71 0.00 0.00 0.00 0.71 0.71 0.75 0.75 0.76 0.76 0.78 0.78 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPrblue_41/29_#2#5_Ar90 -Window ID : 3511 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.203 0.205 0.199 0.192 0.185 0.171 0.141 0.091 0.035 0.000 0.158 -Abs1 0.463 0.467 0.472 0.474 0.472 0.469 0.467 0.447 0.338 0.001 0.455 -Abs2 0.024 0.024 0.025 0.025 0.025 0.026 0.026 0.024 0.019 0.000 0.024 -Abs3 0.029 0.030 0.032 0.034 0.034 0.035 0.037 0.036 0.021 0.000 0.033 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.281 0.275 0.273 0.275 0.284 0.300 0.329 0.403 0.588 0.999 0.319 -Rbsol 0.413 0.407 0.400 0.398 0.404 0.416 0.434 0.486 0.636 0.999 0.428 -Tvis 0.310 0.313 0.304 0.294 0.283 0.261 0.216 0.139 0.053 0.000 0.242 -Rfvis 0.281 0.274 0.272 0.275 0.285 0.302 0.334 0.410 0.595 0.999 0.321 -Rbvis 0.330 0.322 0.313 0.310 0.318 0.333 0.355 0.416 0.586 0.999 0.348 -SHGC 0.260 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.360 - - - -Layer ID# 33029 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.030 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33029_GU_HPR 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 0 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPamber_41/29_#2#5_Ar90 -Window ID : 3512 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.205 0.207 0.202 0.195 0.187 0.172 0.140 0.089 0.032 0.000 0.159 -Abs1 0.368 0.371 0.376 0.378 0.378 0.378 0.382 0.374 0.289 0.001 0.368 -Abs2 0.023 0.023 0.023 0.024 0.024 0.025 0.024 0.022 0.017 0.000 0.023 -Abs3 0.029 0.030 0.032 0.034 0.034 0.035 0.037 0.035 0.020 0.000 0.033 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.374 0.369 0.367 0.369 0.377 0.391 0.417 0.481 0.642 0.999 0.406 -Rbsol 0.346 0.338 0.334 0.334 0.344 0.361 0.392 0.463 0.629 0.999 0.378 -Tvis 0.317 0.321 0.312 0.302 0.289 0.266 0.217 0.136 0.050 0.000 0.246 -Rfvis 0.286 0.279 0.276 0.279 0.289 0.306 0.338 0.414 0.597 0.999 0.325 -Rbvis 0.221 0.210 0.205 0.206 0.220 0.245 0.287 0.379 0.576 0.999 0.267 -SHGC 0.270 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.360 - - - -Layer ID# 33031 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.030 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33031_GU_HPA 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 0 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPbgreen_40/29_#2#5_Ar90 -Window ID : 3513 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.198 0.200 0.194 0.188 0.180 0.166 0.136 0.087 0.032 0.000 0.154 -Abs1 0.504 0.508 0.513 0.515 0.513 0.509 0.507 0.484 0.364 0.001 0.494 -Abs2 0.024 0.024 0.024 0.025 0.025 0.026 0.025 0.023 0.018 0.000 0.024 -Abs3 0.028 0.028 0.031 0.032 0.033 0.033 0.035 0.034 0.020 0.000 0.032 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.246 0.240 0.238 0.240 0.250 0.266 0.296 0.373 0.566 0.999 0.286 -Rbsol 0.373 0.365 0.360 0.360 0.368 0.383 0.408 0.472 0.632 0.999 0.398 -Tvis 0.302 0.305 0.297 0.287 0.276 0.254 0.209 0.133 0.050 0.000 0.235 -Rfvis 0.321 0.315 0.313 0.315 0.324 0.340 0.370 0.442 0.617 0.999 0.358 -Rbvis 0.271 0.262 0.255 0.254 0.266 0.285 0.318 0.396 0.581 0.999 0.305 -SHGC 0.250 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.360 - - - -Layer ID# 33032 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.030 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33032_GU_HPB 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 0 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPbronze_40/27_#2#5_Ar90 -Window ID : 3514 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.190 0.192 0.187 0.180 0.173 0.160 0.132 0.084 0.032 0.000 0.148 -Abs1 0.491 0.495 0.500 0.501 0.499 0.495 0.492 0.468 0.351 0.001 0.480 -Abs2 0.021 0.021 0.021 0.021 0.022 0.022 0.022 0.020 0.016 0.000 0.021 -Abs3 0.026 0.026 0.029 0.030 0.031 0.031 0.034 0.032 0.019 0.000 0.030 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.273 0.266 0.264 0.267 0.276 0.291 0.321 0.395 0.582 0.999 0.311 -Rbsol 0.395 0.388 0.382 0.381 0.388 0.401 0.422 0.479 0.634 0.999 0.415 -Tvis 0.296 0.299 0.291 0.281 0.270 0.249 0.205 0.131 0.049 0.000 0.231 -Rfvis 0.175 0.167 0.165 0.168 0.178 0.197 0.233 0.319 0.531 0.999 0.221 -Rbvis 0.297 0.288 0.281 0.279 0.289 0.306 0.334 0.404 0.583 0.999 0.324 -SHGC 0.240 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.360 - - - -Layer ID# 33033 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.030 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33033_GU_HPB 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 0 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GU_SunGuard_HPsilver_35/26_#2#5_Ar90 -Window ID : 3515 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.180 0.182 0.177 0.171 0.164 0.151 0.124 0.079 0.029 0.000 0.140 -Abs1 0.328 0.331 0.335 0.338 0.337 0.337 0.340 0.332 0.257 0.001 0.328 -Abs2 0.024 0.024 0.024 0.024 0.025 0.025 0.025 0.023 0.017 0.000 0.024 -Abs3 0.026 0.027 0.029 0.030 0.031 0.031 0.033 0.031 0.018 0.000 0.029 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.442 0.437 0.435 0.437 0.444 0.456 0.479 0.535 0.679 0.999 0.469 -Rbsol 0.365 0.357 0.352 0.352 0.361 0.377 0.403 0.469 0.631 0.999 0.392 -Tvis 0.269 0.272 0.265 0.256 0.246 0.226 0.186 0.118 0.044 0.000 0.210 -Rfvis 0.421 0.416 0.414 0.416 0.424 0.438 0.463 0.523 0.672 0.999 0.451 -Rbvis 0.264 0.254 0.247 0.247 0.259 0.279 0.314 0.393 0.580 0.999 0.299 -SHGC 0.230 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.310 - - - -Layer ID# 33028 33000 33010 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.860 0.860 0.030 0 0 0 -Emis B 0.030 0.860 0.860 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 33028_GU_HPS 33000_GU_Flo 33010_GU_Cli None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 0 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - 783 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.75 0.75 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_iplus_neut_E_#3_Ar90 -Window ID : 7200 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.504 0.507 0.499 0.489 0.475 0.449 0.392 0.284 0.130 0.000 0.418 -Abs1 0.171 0.172 0.174 0.178 0.184 0.191 0.197 0.199 0.184 0.000 0.185 -Abs2 0.094 0.095 0.103 0.108 0.109 0.112 0.121 0.125 0.086 0.000 0.109 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.230 0.226 0.224 0.225 0.231 0.248 0.290 0.391 0.600 1.000 0.279 -Rbsol 0.232 0.226 0.224 0.226 0.237 0.256 0.294 0.382 0.582 0.999 0.280 -Tvis 0.717 0.721 0.711 0.697 0.678 0.641 0.559 0.405 0.186 0.000 0.596 -Rfvis 0.133 0.127 0.126 0.130 0.142 0.169 0.229 0.365 0.620 1.000 0.207 -Rbvis 0.131 0.124 0.121 0.124 0.136 0.160 0.208 0.313 0.540 0.999 0.189 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.780 - - - -Layer ID# 7199 37003 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 6.0 0 0 0 0 -Cond(W/m2-K )166.7 166.7 0 0 0 0 -Spectral File ip_fl_6.ipe 37003_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - 0 6.71 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - 783 0.00 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - 783 6.71 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_iplus_neut_CE_#3_Kr90 -Window ID : 7201 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.543 0.546 0.538 0.528 0.514 0.486 0.426 0.310 0.145 0.000 0.452 -Abs1 0.107 0.108 0.109 0.112 0.116 0.121 0.126 0.130 0.124 0.000 0.118 -Abs2 0.085 0.087 0.094 0.100 0.102 0.106 0.119 0.127 0.091 0.000 0.104 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.264 0.260 0.258 0.259 0.267 0.286 0.329 0.433 0.640 1.000 0.315 -Rbsol 0.255 0.249 0.247 0.249 0.260 0.279 0.317 0.404 0.599 0.999 0.302 -Tvis 0.749 0.754 0.743 0.729 0.710 0.672 0.588 0.427 0.198 0.000 0.625 -Rfvis 0.138 0.132 0.131 0.135 0.148 0.176 0.238 0.378 0.639 1.000 0.215 -Rbvis 0.135 0.128 0.125 0.128 0.140 0.165 0.213 0.319 0.546 0.999 0.194 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 7197 37001 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File ip_fl_4.ipe 37001_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_iplus_1.0_#3_Ar90 -Window ID : 7202 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.458 0.460 0.454 0.445 0.434 0.411 0.361 0.266 0.126 0.000 0.383 -Abs1 0.116 0.116 0.118 0.121 0.125 0.130 0.135 0.137 0.130 0.000 0.126 -Abs2 0.075 0.076 0.083 0.088 0.090 0.093 0.104 0.111 0.081 0.000 0.091 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.352 0.347 0.345 0.346 0.352 0.366 0.400 0.486 0.663 1.000 0.390 -Rbsol 0.358 0.353 0.351 0.353 0.362 0.378 0.410 0.484 0.651 0.999 0.396 -Tvis 0.659 0.663 0.654 0.642 0.625 0.593 0.521 0.382 0.180 0.000 0.552 -Rfvis 0.223 0.218 0.217 0.220 0.231 0.255 0.307 0.428 0.660 1.000 0.288 -Rbvis 0.232 0.226 0.224 0.226 0.237 0.258 0.299 0.392 0.593 0.999 0.282 -SHGC 0.530 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.740 - - - -Layer ID# 7197 37041 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.013 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File ip_fl_4.ipe 37041_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.31 1.31 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.31 1.31 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.31 1.31 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.31 1.31 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_iplus_ET_#3_Ar90 -Window ID : 7203 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.518 0.520 0.513 0.503 0.490 0.464 0.406 0.297 0.139 0.000 0.432 -Abs1 0.109 0.109 0.111 0.114 0.118 0.123 0.128 0.131 0.126 0.000 0.119 -Abs2 0.089 0.091 0.098 0.104 0.105 0.109 0.120 0.127 0.090 0.000 0.107 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.284 0.279 0.278 0.279 0.286 0.304 0.345 0.445 0.645 1.000 0.332 -Rbsol 0.283 0.277 0.275 0.277 0.287 0.306 0.342 0.425 0.612 0.999 0.327 -Tvis 0.718 0.722 0.712 0.699 0.681 0.645 0.564 0.411 0.191 0.000 0.599 -Rfvis 0.156 0.150 0.149 0.153 0.166 0.193 0.252 0.388 0.643 1.000 0.230 -Rbvis 0.161 0.154 0.151 0.154 0.166 0.189 0.235 0.337 0.557 0.999 0.217 -SHGC 0.600 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.780 - - - -Layer ID# 7197 37055 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.840 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File ip_fl_4.ipe 37055_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_iplus_ET_Optiwhite_#3_Ar90 -Window ID : 7204 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.514 0.517 0.509 0.499 0.485 0.458 0.400 0.290 0.133 0.000 0.426 -Abs1 0.175 0.175 0.177 0.182 0.188 0.195 0.201 0.202 0.186 0.000 0.188 -Abs2 0.062 0.063 0.070 0.076 0.078 0.082 0.095 0.105 0.077 0.000 0.082 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.249 0.245 0.243 0.243 0.249 0.265 0.305 0.402 0.604 1.000 0.294 -Rbsol 0.322 0.317 0.315 0.317 0.326 0.344 0.379 0.459 0.636 0.999 0.364 -Tvis 0.716 0.720 0.709 0.696 0.677 0.640 0.559 0.406 0.187 0.000 0.595 -Rfvis 0.152 0.147 0.146 0.149 0.161 0.187 0.244 0.375 0.625 1.000 0.224 -Rbvis 0.169 0.162 0.159 0.162 0.173 0.197 0.243 0.344 0.562 0.999 0.225 -SHGC 0.580 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.780 - - - -Layer ID# 7199 37056 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.840 0 0 0 0 -Thickness(mm) 6.0 6.0 0 0 0 0 -Cond(W/m2-K )166.7 166.7 0 0 0 0 -Spectral File ip_fl_6.ipe 37056_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - 0 6.71 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - 783 0.00 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - 783 6.71 0.00 0.00 0.00 1.35 1.35 1.08 1.08 1.10 1.10 1.12 1.12 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_iplus_sun_#3_Ar90_readComment -Window ID : 7205 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.396 0.398 0.393 0.385 0.375 0.355 0.311 0.227 0.106 0.000 0.330 -Abs1 0.117 0.117 0.119 0.122 0.127 0.132 0.137 0.139 0.132 0.000 0.128 -Abs2 0.163 0.165 0.171 0.174 0.174 0.173 0.175 0.164 0.105 0.000 0.166 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.324 0.319 0.317 0.318 0.324 0.340 0.378 0.470 0.657 1.000 0.366 -Rbsol 0.296 0.291 0.289 0.291 0.300 0.317 0.350 0.427 0.610 0.999 0.337 -Tvis 0.624 0.628 0.619 0.607 0.592 0.560 0.490 0.356 0.165 0.000 0.520 -Rfvis 0.143 0.137 0.135 0.139 0.152 0.180 0.241 0.380 0.640 1.000 0.219 -Rbvis 0.120 0.113 0.111 0.113 0.125 0.148 0.192 0.293 0.522 0.999 0.176 -SHGC 0.430 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 7197 7112 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File ip_fl_4.ipe ip-ipsun.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_iplus_3E_#2#5_Ar90 -Window ID : 7300 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.425 0.429 0.417 0.403 0.386 0.355 0.289 0.181 0.066 0.000 0.329 -Abs1 0.176 0.178 0.188 0.196 0.199 0.207 0.232 0.267 0.244 0.001 0.211 -Abs2 0.050 0.050 0.050 0.051 0.052 0.053 0.052 0.047 0.036 0.000 0.049 -Abs3 0.055 0.056 0.061 0.065 0.066 0.067 0.072 0.068 0.039 0.000 0.064 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.296 0.287 0.283 0.285 0.297 0.318 0.355 0.437 0.616 0.999 0.337 -Rbsol 0.296 0.287 0.283 0.285 0.297 0.318 0.355 0.437 0.616 0.999 0.337 -Tvis 0.642 0.649 0.632 0.611 0.585 0.537 0.437 0.273 0.099 0.000 0.497 -Rfvis 0.173 0.162 0.157 0.161 0.177 0.206 0.257 0.362 0.571 0.999 0.231 -Rbvis 0.173 0.162 0.157 0.161 0.177 0.206 0.257 0.362 0.571 0.999 0.231 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.720 - - - -Layer ID# 37001 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 37001_IP_ipl ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.66 0.66 0.60 0.60 0.61 0.61 0.62 0.62 - 0 6.71 0.00 0.00 0.00 0.66 0.66 0.60 0.60 0.61 0.61 0.62 0.62 - 783 0.00 0.00 0.00 0.00 0.66 0.66 0.60 0.60 0.61 0.61 0.62 0.62 - 783 6.71 0.00 0.00 0.00 0.66 0.66 0.60 0.60 0.61 0.61 0.62 0.62 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_iplus_3CE_#2#5_Kr90 -Window ID : 7301 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.425 0.429 0.417 0.403 0.386 0.355 0.289 0.181 0.066 0.000 0.329 -Abs1 0.176 0.178 0.188 0.196 0.199 0.207 0.232 0.267 0.244 0.001 0.211 -Abs2 0.050 0.050 0.050 0.051 0.052 0.053 0.052 0.047 0.036 0.000 0.049 -Abs3 0.055 0.056 0.061 0.065 0.066 0.067 0.072 0.068 0.039 0.000 0.064 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.296 0.287 0.283 0.285 0.297 0.318 0.355 0.437 0.616 0.999 0.337 -Rbsol 0.296 0.287 0.283 0.285 0.297 0.318 0.355 0.437 0.616 0.999 0.337 -Tvis 0.642 0.649 0.632 0.611 0.585 0.537 0.437 0.273 0.099 0.000 0.497 -Rfvis 0.173 0.162 0.157 0.161 0.177 0.206 0.257 0.362 0.571 0.999 0.231 -Rbvis 0.173 0.162 0.157 0.161 0.177 0.206 0.257 0.362 0.571 0.999 0.231 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.720 - - - -Layer ID# 37001 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 37001_IP_ipl ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 0 6.71 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 783 0.00 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 783 6.71 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_iplus_3CLS_#2#5_Kr90 -Window ID : 7302 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.520 0.520 0.513 0.506 0.495 0.468 0.399 0.272 0.113 0.000 0.428 -Abs1 0.117 0.118 0.121 0.123 0.124 0.125 0.131 0.139 0.119 0.000 0.125 -Abs2 0.060 0.060 0.061 0.062 0.065 0.067 0.068 0.065 0.055 0.000 0.063 -Abs3 0.050 0.051 0.053 0.053 0.052 0.051 0.049 0.043 0.024 0.000 0.048 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.252 0.251 0.252 0.255 0.264 0.290 0.352 0.481 0.689 1.000 0.325 -Rbsol 0.252 0.251 0.252 0.255 0.264 0.290 0.352 0.481 0.689 1.000 0.325 -Tvis 0.693 0.692 0.684 0.674 0.661 0.624 0.533 0.363 0.153 0.000 0.571 -Rfvis 0.167 0.166 0.167 0.172 0.184 0.216 0.295 0.450 0.683 1.000 0.259 -Rbvis 0.167 0.166 0.167 0.172 0.184 0.216 0.295 0.450 0.683 1.000 0.259 -SHGC 0.610 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.730 - - - -Layer ID# 37093 7197 37093 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.092 0 0 0 -Emis B 0.092 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 37093_IP_ipl ip_fl_4.ipe 37093_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.73 0.73 0.63 0.63 0.65 0.65 0.66 0.66 - 0 6.71 0.00 0.00 0.00 0.73 0.73 0.63 0.63 0.65 0.65 0.66 0.66 - 783 0.00 0.00 0.00 0.00 0.73 0.73 0.63 0.63 0.65 0.65 0.66 0.66 - 783 6.71 0.00 0.00 0.00 0.73 0.73 0.63 0.63 0.65 0.65 0.66 0.66 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_platin_25/15_#2_Ar90 -Window ID : 7400 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.119 0.120 0.118 0.116 0.113 0.107 0.095 0.070 0.034 0.000 0.100 -Abs1 0.552 0.557 0.560 0.560 0.555 0.547 0.534 0.493 0.356 0.001 0.527 -Abs2 0.005 0.005 0.005 0.005 0.005 0.005 0.005 0.005 0.004 0.000 0.005 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.324 0.319 0.317 0.320 0.327 0.341 0.366 0.433 0.607 0.999 0.358 -Rbsol 0.438 0.435 0.432 0.432 0.435 0.445 0.471 0.540 0.688 1.000 0.464 -Tvis 0.196 0.197 0.194 0.190 0.186 0.176 0.155 0.115 0.055 0.000 0.164 -Rfvis 0.271 0.265 0.264 0.266 0.274 0.289 0.317 0.389 0.577 0.999 0.309 -Rbvis 0.299 0.294 0.292 0.295 0.304 0.324 0.368 0.473 0.680 1.000 0.352 -SHGC 0.150 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.250 - - - -Layer ID# 37033 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37033_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_sky_30/17_#2_Ar90 -Window ID : 7401 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.138 0.139 0.137 0.134 0.131 0.124 0.109 0.080 0.038 0.000 0.115 -Abs1 0.628 0.634 0.637 0.637 0.631 0.623 0.609 0.563 0.407 0.001 0.601 -Abs2 0.005 0.005 0.005 0.005 0.005 0.006 0.005 0.005 0.004 0.000 0.005 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.228 0.222 0.221 0.223 0.232 0.247 0.277 0.353 0.552 0.999 0.268 -Rbsol 0.394 0.390 0.387 0.387 0.391 0.404 0.434 0.513 0.676 1.000 0.425 -Tvis 0.228 0.229 0.226 0.222 0.216 0.205 0.180 0.131 0.062 0.000 0.191 -Rfvis 0.167 0.161 0.159 0.162 0.171 0.188 0.221 0.304 0.518 0.999 0.212 -Rbvis 0.222 0.217 0.215 0.218 0.229 0.253 0.306 0.427 0.660 1.000 0.287 -SHGC 0.170 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.300 - - - -Layer ID# 37061 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37061_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_shine_40/22_#2_Ar90 -Window ID : 7402 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.191 0.192 0.190 0.186 0.181 0.172 0.151 0.110 0.052 0.000 0.160 -Abs1 0.529 0.533 0.537 0.538 0.534 0.529 0.522 0.490 0.362 0.001 0.512 -Abs2 0.008 0.008 0.008 0.008 0.008 0.008 0.008 0.007 0.005 0.000 0.008 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.273 0.267 0.265 0.268 0.276 0.291 0.320 0.393 0.580 0.999 0.311 -Rbsol 0.384 0.380 0.378 0.378 0.383 0.395 0.427 0.507 0.674 1.000 0.418 -Tvis 0.314 0.316 0.312 0.306 0.298 0.282 0.248 0.181 0.085 0.000 0.263 -Rfvis 0.161 0.154 0.153 0.155 0.165 0.183 0.217 0.303 0.519 0.999 0.207 -Rbvis 0.206 0.200 0.199 0.202 0.214 0.239 0.293 0.418 0.656 1.000 0.273 -SHGC 0.220 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.400 - - - -Layer ID# 37099 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37099_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_platin_47/29_#2_Ar90 -Window ID : 7403 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.268 0.269 0.266 0.261 0.254 0.242 0.214 0.159 0.077 0.000 0.225 -Abs1 0.291 0.294 0.299 0.301 0.301 0.301 0.305 0.301 0.237 0.001 0.294 -Abs2 0.015 0.015 0.015 0.015 0.015 0.016 0.015 0.014 0.011 0.000 0.015 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.427 0.422 0.421 0.423 0.430 0.442 0.466 0.526 0.675 0.999 0.456 -Rbsol 0.436 0.432 0.430 0.430 0.433 0.443 0.469 0.536 0.686 1.000 0.462 -Tvis 0.399 0.402 0.396 0.389 0.379 0.361 0.319 0.237 0.115 0.000 0.336 -Rfvis 0.411 0.406 0.404 0.406 0.414 0.427 0.454 0.518 0.672 0.999 0.442 -Rbvis 0.340 0.335 0.334 0.336 0.344 0.362 0.402 0.497 0.691 1.000 0.387 -SHGC 0.290 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.470 - - - -Layer ID# 37107 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37107_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_48/27_#2_Ar90 -Window ID : 7404 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.241 0.243 0.239 0.235 0.229 0.217 0.190 0.139 0.065 0.000 0.202 -Abs1 0.459 0.464 0.468 0.470 0.468 0.464 0.463 0.442 0.334 0.001 0.451 -Abs2 0.010 0.010 0.010 0.010 0.011 0.011 0.011 0.010 0.007 0.000 0.010 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.289 0.284 0.282 0.284 0.293 0.308 0.337 0.409 0.593 0.999 0.327 -Rbsol 0.365 0.361 0.359 0.359 0.364 0.377 0.411 0.495 0.668 1.000 0.401 -Tvis 0.392 0.395 0.389 0.382 0.372 0.353 0.309 0.225 0.105 0.000 0.328 -Rfvis 0.182 0.175 0.173 0.176 0.186 0.204 0.239 0.325 0.536 0.999 0.228 -Rbvis 0.189 0.183 0.182 0.185 0.197 0.223 0.279 0.407 0.651 1.000 0.258 -SHGC 0.270 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.480 - - - -Layer ID# 37114 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37114_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_50/27_#2_Ar90 -Window ID : 7405 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.234 0.235 0.232 0.228 0.222 0.210 0.184 0.135 0.063 0.000 0.196 -Abs1 0.525 0.530 0.535 0.537 0.533 0.529 0.524 0.496 0.371 0.001 0.512 -Abs2 0.009 0.009 0.009 0.009 0.010 0.010 0.010 0.009 0.007 0.000 0.009 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.231 0.225 0.223 0.226 0.235 0.251 0.282 0.360 0.559 0.999 0.273 -Rbsol 0.384 0.380 0.378 0.378 0.382 0.395 0.427 0.507 0.674 1.000 0.417 -Tvis 0.387 0.389 0.384 0.377 0.367 0.348 0.304 0.222 0.104 0.000 0.323 -Rfvis 0.100 0.093 0.091 0.094 0.104 0.124 0.162 0.256 0.488 0.999 0.151 -Rbvis 0.201 0.195 0.194 0.197 0.209 0.234 0.288 0.415 0.655 1.000 0.268 -SHGC 0.270 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.500 - - - -Layer ID# 37126 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.025 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37126_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.33 1.33 1.03 1.03 1.06 1.06 1.08 1.08 - 0 6.71 0.00 0.00 0.00 1.33 1.33 1.03 1.03 1.06 1.06 1.08 1.08 - 783 0.00 0.00 0.00 0.00 1.33 1.33 1.03 1.03 1.06 1.06 1.08 1.08 - 783 6.71 0.00 0.00 0.00 1.33 1.33 1.03 1.03 1.06 1.06 1.08 1.08 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_60/33_#2_Ar90 -Window ID : 7406 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.301 0.303 0.299 0.293 0.286 0.271 0.237 0.173 0.081 0.000 0.252 -Abs1 0.395 0.398 0.404 0.407 0.406 0.405 0.409 0.400 0.311 0.001 0.395 -Abs2 0.013 0.013 0.013 0.013 0.013 0.014 0.013 0.012 0.009 0.000 0.013 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.291 0.286 0.284 0.286 0.295 0.311 0.341 0.416 0.599 0.999 0.330 -Rbsol 0.347 0.343 0.341 0.341 0.347 0.361 0.397 0.484 0.664 1.000 0.386 -Tvis 0.491 0.494 0.487 0.478 0.466 0.441 0.386 0.281 0.131 0.000 0.410 -Rfvis 0.150 0.143 0.141 0.144 0.155 0.175 0.213 0.306 0.526 0.999 0.201 -Rbvis 0.167 0.161 0.160 0.164 0.176 0.203 0.261 0.394 0.646 1.000 0.240 -SHGC 0.330 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.600 - - - -Layer ID# 37161 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.837 0 0 0 0 -Emis B 0.013 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37161_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_61/33_#2_Ar90 -Window ID : 7407 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.302 0.304 0.300 0.294 0.287 0.272 0.238 0.174 0.082 0.000 0.253 -Abs1 0.366 0.370 0.376 0.379 0.378 0.377 0.382 0.375 0.294 0.001 0.369 -Abs2 0.012 0.012 0.012 0.012 0.013 0.013 0.013 0.011 0.009 0.000 0.012 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.319 0.314 0.312 0.314 0.323 0.338 0.367 0.440 0.616 0.999 0.356 -Rbsol 0.366 0.362 0.360 0.360 0.365 0.379 0.412 0.496 0.669 1.000 0.402 -Tvis 0.499 0.502 0.495 0.486 0.474 0.449 0.393 0.286 0.134 0.000 0.417 -Rfvis 0.167 0.160 0.158 0.161 0.172 0.191 0.230 0.321 0.537 0.999 0.217 -Rbvis 0.184 0.178 0.177 0.181 0.193 0.218 0.275 0.404 0.650 1.000 0.254 -SHGC 0.330 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.610 - - - -Layer ID# 37174 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37174_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_ultraselect_62/29_#2_Ar90 -Window ID : 7408 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.272 0.274 0.270 0.265 0.258 0.244 0.214 0.156 0.073 0.000 0.227 -Abs1 0.325 0.328 0.333 0.336 0.335 0.335 0.339 0.334 0.262 0.001 0.327 -Abs2 0.009 0.009 0.009 0.009 0.009 0.009 0.009 0.008 0.006 0.000 0.009 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.395 0.390 0.388 0.390 0.398 0.411 0.438 0.502 0.659 0.999 0.427 -Rbsol 0.396 0.392 0.390 0.390 0.394 0.406 0.437 0.516 0.679 1.000 0.428 -Tvis 0.470 0.472 0.466 0.457 0.445 0.422 0.369 0.269 0.125 0.000 0.392 -Rfvis 0.187 0.180 0.178 0.181 0.191 0.211 0.248 0.337 0.547 0.999 0.235 -Rbvis 0.197 0.191 0.190 0.193 0.205 0.230 0.285 0.413 0.654 1.000 0.265 -SHGC 0.290 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.620 - - - -Layer ID# 37136 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.013 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37136_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_69/37_#2_Ar90 -Window ID : 7409 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.340 0.342 0.337 0.331 0.322 0.306 0.268 0.196 0.092 0.000 0.284 -Abs1 0.314 0.317 0.323 0.327 0.327 0.328 0.336 0.337 0.271 0.001 0.322 -Abs2 0.014 0.014 0.014 0.014 0.015 0.015 0.014 0.013 0.010 0.000 0.014 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.332 0.327 0.325 0.328 0.336 0.352 0.382 0.454 0.627 0.999 0.370 -Rbsol 0.378 0.374 0.372 0.372 0.376 0.389 0.422 0.504 0.673 1.000 0.412 -Tvis 0.561 0.564 0.556 0.546 0.532 0.504 0.441 0.322 0.151 0.000 0.468 -Rfvis 0.173 0.166 0.164 0.167 0.178 0.198 0.238 0.332 0.547 0.999 0.224 -Rbvis 0.189 0.184 0.182 0.186 0.198 0.223 0.279 0.408 0.652 1.000 0.259 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.690 - - - -Layer ID# 37198 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.013 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37198_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_70/39_#2_Ar90 -Window ID : 7410 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.356 0.358 0.353 0.347 0.338 0.320 0.281 0.205 0.096 0.000 0.298 -Abs1 0.329 0.333 0.339 0.343 0.343 0.344 0.352 0.353 0.284 0.001 0.338 -Abs2 0.015 0.015 0.015 0.016 0.016 0.016 0.016 0.014 0.011 0.000 0.015 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.299 0.294 0.292 0.294 0.303 0.320 0.351 0.428 0.609 0.999 0.339 -Rbsol 0.361 0.356 0.354 0.354 0.360 0.373 0.408 0.493 0.668 1.000 0.397 -Tvis 0.582 0.585 0.577 0.566 0.552 0.522 0.457 0.333 0.156 0.000 0.486 -Rfvis 0.150 0.143 0.141 0.144 0.155 0.176 0.218 0.315 0.536 0.999 0.203 -Rbvis 0.177 0.171 0.170 0.173 0.186 0.212 0.269 0.400 0.649 1.000 0.248 -SHGC 0.390 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.700 - - - -Layer ID# 37215 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.837 0 0 0 0 -Emis B 0.013 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37215_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_73/42_#2_Ar90 -Window ID : 7411 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.388 0.390 0.385 0.377 0.368 0.348 0.305 0.222 0.103 0.000 0.324 -Abs1 0.323 0.327 0.334 0.339 0.339 0.341 0.351 0.356 0.289 0.001 0.335 -Abs2 0.017 0.017 0.018 0.018 0.018 0.018 0.018 0.016 0.012 0.000 0.017 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.272 0.266 0.264 0.266 0.276 0.293 0.327 0.407 0.596 0.999 0.314 -Rbsol 0.327 0.322 0.320 0.321 0.327 0.342 0.380 0.472 0.658 1.000 0.368 -Tvis 0.625 0.628 0.620 0.608 0.592 0.561 0.490 0.356 0.165 0.000 0.521 -Rfvis 0.128 0.121 0.118 0.121 0.133 0.155 0.199 0.300 0.527 0.999 0.184 -Rbvis 0.145 0.139 0.137 0.141 0.154 0.182 0.243 0.381 0.640 1.000 0.221 -SHGC 0.420 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.730 - - - -Layer ID# 37230 7197 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37230_IP_ipa ip_fl_4.ipe None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_bright_neut_#3_Ar90 -Window ID : 7412 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.400 0.404 0.394 0.382 0.369 0.347 0.297 0.208 0.095 0.000 0.323 -Abs1 0.172 0.174 0.185 0.193 0.197 0.205 0.228 0.258 0.231 0.001 0.207 -Abs2 0.065 0.066 0.071 0.075 0.076 0.078 0.085 0.087 0.061 0.000 0.076 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.363 0.355 0.350 0.350 0.358 0.370 0.390 0.447 0.613 0.999 0.384 -Rbsol 0.371 0.363 0.357 0.357 0.364 0.376 0.393 0.447 0.610 0.999 0.389 -Tvis 0.536 0.541 0.527 0.512 0.494 0.464 0.396 0.277 0.126 0.000 0.432 -Rfvis 0.331 0.322 0.319 0.322 0.333 0.351 0.382 0.456 0.634 0.999 0.368 -Rbvis 0.320 0.311 0.302 0.300 0.307 0.319 0.334 0.387 0.564 0.999 0.333 -SHGC 0.460 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.570 - - - -Layer ID# 37244 37001 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.037 0 0 0 0 -Emis B 0.840 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37244_IP_ipa 37001_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_bright_white_#3_Ar90 -Window ID : 7413 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.435 0.437 0.429 0.420 0.411 0.392 0.343 0.250 0.122 0.000 0.363 -Abs1 0.050 0.051 0.054 0.056 0.057 0.058 0.066 0.077 0.073 0.000 0.060 -Abs2 0.076 0.077 0.083 0.087 0.089 0.093 0.103 0.108 0.080 0.000 0.091 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.439 0.436 0.434 0.436 0.443 0.457 0.488 0.564 0.725 1.000 0.476 -Rbsol 0.372 0.367 0.362 0.361 0.367 0.378 0.398 0.456 0.617 0.999 0.393 -Tvis 0.563 0.565 0.555 0.544 0.532 0.506 0.442 0.320 0.154 0.000 0.468 -Rfvis 0.359 0.355 0.355 0.358 0.366 0.384 0.426 0.523 0.711 1.000 0.410 -Rbvis 0.321 0.315 0.308 0.305 0.311 0.322 0.341 0.400 0.574 0.999 0.339 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.580 - - - -Layer ID# 37247 37001 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.037 0 0 0 0 -Emis B 0.840 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37247_IP_ipa 37001_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_bright_green_#3_Ar90 -Window ID : 7414 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.254 0.257 0.250 0.242 0.234 0.220 0.188 0.132 0.060 0.000 0.205 -Abs1 0.556 0.561 0.566 0.569 0.566 0.561 0.556 0.526 0.394 0.001 0.543 -Abs2 0.031 0.032 0.035 0.037 0.038 0.040 0.045 0.048 0.035 0.000 0.039 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.159 0.151 0.149 0.152 0.162 0.179 0.211 0.294 0.512 0.999 0.203 -Rbsol 0.366 0.358 0.353 0.352 0.360 0.372 0.390 0.445 0.609 0.999 0.385 -Tvis 0.396 0.400 0.390 0.378 0.366 0.343 0.293 0.205 0.093 0.000 0.319 -Rfvis 0.209 0.201 0.199 0.202 0.213 0.231 0.264 0.346 0.552 0.999 0.253 -Rbvis 0.314 0.304 0.296 0.294 0.302 0.314 0.330 0.384 0.562 0.999 0.328 -SHGC 0.310 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.480 - - - -Layer ID# 37256 37001 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.037 0 0 0 0 -Emis B 0.840 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37256_IP_ipa 37001_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_bright_grey_#3_Ar90 -Window ID : 7415 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.219 0.221 0.216 0.209 0.202 0.190 0.163 0.114 0.052 0.000 0.177 -Abs1 0.594 0.599 0.605 0.607 0.604 0.599 0.594 0.562 0.419 0.001 0.580 -Abs2 0.036 0.037 0.040 0.042 0.042 0.043 0.047 0.048 0.033 0.000 0.042 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.151 0.143 0.140 0.142 0.151 0.167 0.197 0.276 0.495 0.999 0.191 -Rbsol 0.364 0.357 0.351 0.350 0.358 0.370 0.388 0.444 0.609 0.999 0.384 -Tvis 0.289 0.292 0.284 0.275 0.266 0.250 0.213 0.149 0.067 0.000 0.233 -Rfvis 0.128 0.119 0.117 0.121 0.131 0.150 0.183 0.271 0.497 0.999 0.175 -Rbvis 0.310 0.300 0.292 0.290 0.298 0.310 0.327 0.382 0.562 0.999 0.325 -SHGC 0.280 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.280 - - - -Layer ID# 37253 37001 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.037 0 0 0 0 -Emis B 0.840 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37253_IP_ipa 37001_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_bright_bronze_#3_Ar90 -Window ID : 7416 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.230 0.233 0.227 0.220 0.213 0.199 0.171 0.120 0.055 0.000 0.186 -Abs1 0.571 0.576 0.582 0.585 0.582 0.578 0.574 0.546 0.410 0.001 0.560 -Abs2 0.038 0.038 0.041 0.043 0.044 0.045 0.049 0.050 0.035 0.000 0.044 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.161 0.153 0.150 0.152 0.161 0.177 0.206 0.284 0.501 0.999 0.200 -Rbsol 0.365 0.357 0.351 0.351 0.358 0.370 0.389 0.444 0.609 0.999 0.384 -Tvis 0.305 0.308 0.300 0.291 0.282 0.264 0.226 0.157 0.071 0.000 0.246 -Rfvis 0.136 0.128 0.126 0.129 0.140 0.158 0.192 0.279 0.503 0.999 0.183 -Rbvis 0.310 0.301 0.292 0.290 0.299 0.311 0.327 0.383 0.562 0.999 0.325 -SHGC 0.290 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.320 - - - -Layer ID# 37259 37001 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.037 0 0 0 0 -Emis B 0.840 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37259_IP_ipa 37001_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_bright_blue_#3_Ar90 -Window ID : 7417 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.199 0.201 0.196 0.190 0.184 0.172 0.147 0.103 0.047 0.000 0.161 -Abs1 0.659 0.664 0.669 0.670 0.665 0.657 0.645 0.601 0.440 0.001 0.634 -Abs2 0.024 0.025 0.028 0.029 0.030 0.032 0.036 0.038 0.027 0.000 0.031 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.118 0.110 0.108 0.111 0.121 0.139 0.172 0.258 0.486 0.999 0.164 -Rbsol 0.364 0.357 0.351 0.351 0.358 0.370 0.389 0.444 0.609 0.999 0.384 -Tvis 0.310 0.313 0.305 0.296 0.286 0.268 0.229 0.160 0.072 0.000 0.250 -Rfvis 0.149 0.141 0.139 0.142 0.153 0.171 0.204 0.290 0.511 0.999 0.195 -Rbvis 0.311 0.301 0.293 0.291 0.299 0.311 0.328 0.383 0.562 0.999 0.326 -SHGC 0.250 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.340 - - - -Layer ID# 37250 37001 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.840 0.037 0 0 0 0 -Emis B 0.840 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 37250_IP_ipa 37001_IP_ipl None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_platin_25/15_iplus_E_#2#5_Ar90 -Window ID : 7500 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.103 0.104 0.101 0.097 0.094 0.086 0.071 0.045 0.017 0.000 0.080 -Abs1 0.556 0.560 0.563 0.563 0.558 0.551 0.539 0.499 0.360 0.001 0.531 -Abs2 0.006 0.006 0.006 0.006 0.006 0.006 0.006 0.006 0.005 0.000 0.006 -Abs3 0.010 0.010 0.012 0.013 0.013 0.014 0.015 0.015 0.009 0.000 0.013 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.326 0.320 0.319 0.321 0.329 0.342 0.368 0.435 0.608 0.999 0.359 -Rbsol 0.385 0.378 0.371 0.370 0.377 0.389 0.410 0.468 0.624 0.999 0.404 -Tvis 0.172 0.174 0.169 0.163 0.157 0.145 0.119 0.076 0.028 0.000 0.134 -Rfvis 0.273 0.267 0.266 0.268 0.277 0.292 0.320 0.393 0.580 0.999 0.311 -Rbvis 0.288 0.278 0.270 0.269 0.280 0.298 0.328 0.400 0.581 0.999 0.316 -SHGC 0.130 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.230 - - - -Layer ID# 37033 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.840 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37033_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_sky_30/17_iplus_E_#2#5_Ar90 -Window ID : 7501 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.119 0.120 0.117 0.113 0.108 0.100 0.081 0.051 0.019 0.000 0.092 -Abs1 0.633 0.638 0.641 0.641 0.636 0.628 0.615 0.570 0.412 0.001 0.606 -Abs2 0.007 0.007 0.007 0.007 0.007 0.007 0.007 0.007 0.006 0.000 0.007 -Abs3 0.011 0.012 0.013 0.014 0.015 0.015 0.017 0.017 0.010 0.000 0.015 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.230 0.224 0.222 0.225 0.234 0.250 0.279 0.355 0.553 0.999 0.270 -Rbsol 0.349 0.342 0.336 0.336 0.345 0.361 0.388 0.456 0.621 0.999 0.377 -Tvis 0.200 0.202 0.197 0.190 0.182 0.168 0.137 0.086 0.031 0.000 0.155 -Rfvis 0.171 0.163 0.162 0.165 0.175 0.192 0.225 0.308 0.521 0.999 0.215 -Rbvis 0.225 0.215 0.209 0.210 0.224 0.248 0.290 0.380 0.576 0.999 0.270 -SHGC 0.150 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.270 - - - -Layer ID# 37061 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37061_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_shine_40/22_iplus_E_#2#5_Ar90 -Window ID : 7502 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.164 0.166 0.161 0.156 0.149 0.137 0.112 0.071 0.026 0.000 0.127 -Abs1 0.534 0.538 0.542 0.543 0.540 0.536 0.530 0.499 0.369 0.001 0.518 -Abs2 0.009 0.009 0.009 0.010 0.010 0.010 0.010 0.010 0.008 0.000 0.010 -Abs3 0.016 0.016 0.019 0.020 0.021 0.021 0.024 0.024 0.014 0.000 0.020 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.276 0.270 0.268 0.271 0.280 0.295 0.324 0.397 0.583 0.999 0.314 -Rbsol 0.343 0.335 0.330 0.330 0.339 0.355 0.384 0.453 0.621 0.999 0.372 -Tvis 0.275 0.278 0.270 0.261 0.251 0.230 0.188 0.118 0.043 0.000 0.213 -Rfvis 0.167 0.160 0.158 0.161 0.171 0.190 0.225 0.311 0.524 0.999 0.214 -Rbvis 0.215 0.205 0.199 0.200 0.214 0.240 0.283 0.376 0.575 0.999 0.262 -SHGC 0.200 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.360 - - - -Layer ID# 37099 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.840 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37099_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_platin_47/29_iplus_E_#2#5_Ar90 -Window ID : 7503 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.221 0.223 0.217 0.210 0.201 0.186 0.154 0.099 0.038 0.000 0.173 -Abs1 0.297 0.300 0.305 0.308 0.307 0.308 0.313 0.310 0.244 0.001 0.301 -Abs2 0.020 0.021 0.021 0.021 0.021 0.022 0.022 0.020 0.016 0.000 0.021 -Abs3 0.026 0.027 0.030 0.032 0.032 0.033 0.036 0.036 0.022 0.000 0.032 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.435 0.430 0.428 0.430 0.438 0.451 0.475 0.535 0.680 0.999 0.464 -Rbsol 0.397 0.390 0.383 0.381 0.387 0.399 0.417 0.471 0.625 0.999 0.412 -Tvis 0.349 0.352 0.342 0.331 0.318 0.294 0.243 0.156 0.060 0.000 0.273 -Rfvis 0.421 0.415 0.413 0.415 0.424 0.439 0.467 0.532 0.681 0.999 0.453 -Rbvis 0.321 0.312 0.304 0.301 0.310 0.325 0.349 0.412 0.584 0.999 0.341 -SHGC 0.240 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.420 - - - -Layer ID# 37107 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.840 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37107_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_48/27_iplus_E_#2#5_Ar90 -Window ID : 7504 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.205 0.208 0.202 0.195 0.187 0.172 0.140 0.088 0.032 0.000 0.159 -Abs1 0.466 0.470 0.474 0.476 0.474 0.472 0.472 0.452 0.342 0.001 0.458 -Abs2 0.013 0.013 0.013 0.013 0.013 0.014 0.014 0.013 0.010 0.000 0.013 -Abs3 0.021 0.021 0.024 0.026 0.027 0.028 0.031 0.030 0.018 0.000 0.026 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.295 0.289 0.287 0.289 0.299 0.314 0.344 0.417 0.597 0.999 0.333 -Rbsol 0.334 0.326 0.321 0.321 0.331 0.348 0.379 0.450 0.620 0.999 0.365 -Tvis 0.342 0.345 0.336 0.325 0.311 0.286 0.233 0.146 0.053 0.000 0.265 -Rfvis 0.191 0.183 0.181 0.184 0.195 0.215 0.251 0.337 0.544 0.999 0.238 -Rbvis 0.205 0.194 0.189 0.191 0.205 0.231 0.277 0.372 0.574 0.999 0.254 -SHGC 0.240 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.430 - - - -Layer ID# 37114 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.840 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37114_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_50/27_iplus_E_#2#5_Ar90 -Window ID : 7505 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.201 0.203 0.198 0.191 0.183 0.168 0.137 0.086 0.032 0.000 0.156 -Abs1 0.531 0.536 0.540 0.542 0.539 0.536 0.532 0.506 0.378 0.001 0.519 -Abs2 0.011 0.011 0.011 0.012 0.012 0.012 0.012 0.011 0.010 0.000 0.011 -Abs3 0.019 0.020 0.023 0.025 0.025 0.026 0.029 0.029 0.017 0.000 0.025 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.237 0.230 0.228 0.231 0.241 0.258 0.289 0.368 0.563 0.999 0.278 -Rbsol 0.341 0.333 0.328 0.328 0.337 0.354 0.383 0.453 0.620 0.999 0.371 -Tvis 0.338 0.342 0.333 0.322 0.308 0.283 0.231 0.145 0.053 0.000 0.262 -Rfvis 0.109 0.101 0.098 0.101 0.113 0.135 0.174 0.268 0.496 0.999 0.161 -Rbvis 0.210 0.200 0.194 0.196 0.210 0.236 0.280 0.375 0.574 0.999 0.259 -SHGC 0.260 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.440 - - - -Layer ID# 37126 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.025 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37126_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.76 0.76 - 0 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.76 0.76 - 783 0.00 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.76 0.76 - 783 6.71 0.00 0.00 0.00 0.69 0.69 0.73 0.73 0.74 0.74 0.76 0.76 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_60/33_iplus_E_#2#5_Ar90 -Window ID : 7506 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.256 0.259 0.252 0.244 0.233 0.214 0.175 0.110 0.040 0.000 0.199 -Abs1 0.402 0.405 0.411 0.414 0.413 0.413 0.418 0.411 0.319 0.001 0.403 -Abs2 0.016 0.016 0.016 0.016 0.016 0.017 0.017 0.016 0.013 0.000 0.016 -Abs3 0.026 0.027 0.030 0.032 0.033 0.034 0.038 0.037 0.022 0.000 0.033 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.301 0.294 0.292 0.294 0.304 0.321 0.352 0.427 0.606 0.999 0.339 -Rbsol 0.324 0.316 0.311 0.312 0.322 0.340 0.372 0.447 0.619 0.999 0.358 -Tvis 0.427 0.432 0.420 0.406 0.389 0.357 0.291 0.182 0.066 0.000 0.331 -Rfvis 0.165 0.156 0.154 0.157 0.169 0.192 0.232 0.325 0.538 0.999 0.216 -Rbvis 0.191 0.180 0.175 0.177 0.193 0.220 0.268 0.368 0.572 0.999 0.244 -SHGC 0.300 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.540 - - - -Layer ID# 37161 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.840 0.837 0.037 0 0 0 -Emis B 0.013 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37161_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 0 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_61/33_iplus_E_#2#5_Ar90 -Window ID : 7507 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.259 0.261 0.254 0.246 0.236 0.217 0.177 0.111 0.041 0.000 0.201 -Abs1 0.373 0.376 0.381 0.385 0.384 0.385 0.391 0.386 0.302 0.001 0.376 -Abs2 0.015 0.015 0.015 0.015 0.015 0.016 0.016 0.015 0.012 0.000 0.015 -Abs3 0.026 0.026 0.030 0.032 0.033 0.034 0.038 0.038 0.022 0.000 0.033 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.329 0.322 0.320 0.322 0.332 0.349 0.379 0.451 0.623 0.999 0.366 -Rbsol 0.334 0.326 0.321 0.321 0.331 0.348 0.379 0.450 0.620 0.999 0.365 -Tvis 0.435 0.439 0.428 0.413 0.396 0.364 0.297 0.186 0.068 0.000 0.337 -Rfvis 0.183 0.174 0.171 0.174 0.187 0.209 0.249 0.341 0.550 0.999 0.233 -Rbvis 0.202 0.192 0.186 0.188 0.203 0.229 0.275 0.372 0.573 0.999 0.252 -SHGC 0.300 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.540 - - - -Layer ID# 37174 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.840 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37174_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_ultra_62/29_iplus_E_#2#5_Ar90 -Window ID : 7508 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.238 0.240 0.234 0.226 0.217 0.199 0.162 0.101 0.037 0.000 0.184 -Abs1 0.330 0.332 0.337 0.341 0.340 0.341 0.347 0.343 0.270 0.001 0.333 -Abs2 0.009 0.010 0.010 0.010 0.010 0.010 0.010 0.010 0.008 0.000 0.010 -Abs3 0.021 0.021 0.025 0.027 0.028 0.029 0.033 0.033 0.020 0.000 0.028 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.402 0.396 0.395 0.397 0.405 0.421 0.448 0.513 0.665 0.999 0.435 -Rbsol 0.344 0.336 0.331 0.331 0.340 0.356 0.385 0.454 0.621 0.999 0.373 -Tvis 0.412 0.416 0.405 0.392 0.375 0.345 0.281 0.175 0.064 0.000 0.319 -Rfvis 0.201 0.192 0.190 0.193 0.205 0.227 0.266 0.355 0.559 0.999 0.249 -Rbvis 0.207 0.196 0.190 0.192 0.207 0.233 0.278 0.374 0.574 0.999 0.256 -SHGC 0.270 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.550 - - - -Layer ID# 37136 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.013 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37136_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 0 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_69/37_iplus_E_#2#5_Ar90 -Window ID : 7509 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.291 0.294 0.286 0.277 0.265 0.244 0.199 0.125 0.046 0.000 0.226 -Abs1 0.319 0.322 0.328 0.332 0.333 0.335 0.344 0.347 0.279 0.001 0.328 -Abs2 0.017 0.017 0.017 0.017 0.018 0.018 0.018 0.017 0.014 0.000 0.017 -Abs3 0.029 0.030 0.034 0.036 0.037 0.039 0.043 0.042 0.025 0.000 0.037 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.344 0.337 0.335 0.337 0.347 0.365 0.396 0.469 0.636 0.999 0.382 -Rbsol 0.338 0.330 0.325 0.325 0.334 0.351 0.381 0.452 0.620 0.999 0.368 -Tvis 0.488 0.493 0.480 0.464 0.445 0.409 0.333 0.209 0.076 0.000 0.379 -Rfvis 0.192 0.183 0.180 0.183 0.197 0.220 0.263 0.357 0.563 0.999 0.244 -Rbvis 0.205 0.194 0.189 0.191 0.205 0.232 0.277 0.372 0.574 0.999 0.255 -SHGC 0.340 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.620 - - - -Layer ID# 37198 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.013 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37198_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 0 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_70/39_iplus_E_#2#5_Ar90 -Window ID : 7510 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.304 0.307 0.299 0.289 0.277 0.254 0.207 0.130 0.047 0.000 0.235 -Abs1 0.335 0.338 0.344 0.349 0.349 0.351 0.360 0.364 0.292 0.001 0.345 -Abs2 0.019 0.019 0.019 0.019 0.020 0.020 0.020 0.019 0.015 0.000 0.019 -Abs3 0.031 0.032 0.036 0.038 0.039 0.041 0.045 0.044 0.026 0.000 0.039 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.312 0.305 0.303 0.305 0.316 0.334 0.367 0.443 0.619 0.999 0.352 -Rbsol 0.330 0.322 0.317 0.317 0.327 0.345 0.376 0.449 0.619 0.999 0.362 -Tvis 0.505 0.511 0.497 0.481 0.461 0.423 0.345 0.216 0.079 0.000 0.392 -Rfvis 0.171 0.162 0.158 0.162 0.175 0.200 0.245 0.341 0.552 0.999 0.225 -Rbvis 0.197 0.187 0.181 0.184 0.199 0.226 0.272 0.370 0.573 0.999 0.249 -SHGC 0.350 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.620 - - - -Layer ID# 37215 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.840 0.837 0.037 0 0 0 -Emis B 0.013 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37215_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 0 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : IP_ipasol_neut_73/42_iplus_E_#2#5_Ar90 -Window ID : 7511 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.328 0.331 0.322 0.311 0.298 0.274 0.223 0.140 0.051 0.000 0.254 -Abs1 0.330 0.333 0.340 0.345 0.346 0.349 0.360 0.367 0.298 0.001 0.343 -Abs2 0.021 0.021 0.021 0.022 0.022 0.023 0.023 0.021 0.017 0.000 0.022 -Abs3 0.034 0.035 0.039 0.042 0.043 0.045 0.049 0.048 0.028 0.000 0.042 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.287 0.280 0.277 0.279 0.290 0.310 0.345 0.425 0.606 0.999 0.329 -Rbsol 0.312 0.304 0.300 0.301 0.312 0.331 0.365 0.443 0.618 0.999 0.349 -Tvis 0.541 0.547 0.532 0.514 0.493 0.452 0.368 0.230 0.083 0.000 0.419 -Rfvis 0.152 0.142 0.139 0.142 0.157 0.183 0.230 0.330 0.545 0.999 0.208 -Rbvis 0.175 0.164 0.159 0.162 0.179 0.208 0.259 0.363 0.571 0.999 0.233 -SHGC 0.380 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.650 - - - -Layer ID# 37230 7197 37001 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.840 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 37230_IP_ipa ip_fl_4.ipe 37001_IP_ipl None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMAPLUS_UltraN_#3_Ar90 -Window ID : 11200 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.535 0.538 0.530 0.520 0.505 0.478 0.418 0.304 0.140 0.000 0.445 -Abs1 0.127 0.127 0.129 0.132 0.137 0.143 0.149 0.152 0.145 0.000 0.138 -Abs2 0.097 0.099 0.107 0.112 0.114 0.117 0.128 0.133 0.093 0.000 0.114 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.240 0.236 0.234 0.236 0.244 0.262 0.306 0.411 0.622 1.000 0.292 -Rbsol 0.245 0.239 0.236 0.239 0.249 0.269 0.307 0.395 0.592 0.999 0.292 -Tvis 0.737 0.741 0.730 0.717 0.698 0.660 0.577 0.418 0.193 0.000 0.613 -Rfvis 0.134 0.128 0.127 0.131 0.144 0.172 0.233 0.371 0.630 1.000 0.210 -Rbvis 0.126 0.119 0.116 0.119 0.131 0.156 0.204 0.311 0.539 0.999 0.185 -SHGC 0.630 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 11004 11333 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File PLANILUX 4mm PLT ULTRA N None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.33 1.33 1.31 1.31 1.34 1.34 1.37 1.37 - 0 6.71 0.00 0.00 0.00 1.33 1.33 1.31 1.31 1.34 1.34 1.37 1.37 - 783 0.00 0.00 0.00 0.00 1.33 1.33 1.31 1.31 1.34 1.34 1.37 1.37 - 783 6.71 0.00 0.00 0.00 1.33 1.33 1.31 1.31 1.34 1.34 1.37 1.37 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMAPLUS_UltraN_#3_10Kr90 -Window ID : 11201 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.535 0.538 0.530 0.520 0.505 0.478 0.418 0.304 0.140 0.000 0.445 -Abs1 0.127 0.127 0.129 0.132 0.137 0.143 0.149 0.152 0.145 0.000 0.138 -Abs2 0.097 0.099 0.107 0.112 0.114 0.117 0.128 0.133 0.093 0.000 0.114 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.240 0.236 0.234 0.236 0.244 0.262 0.306 0.411 0.622 1.000 0.292 -Rbsol 0.245 0.239 0.236 0.239 0.249 0.269 0.307 0.395 0.592 0.999 0.292 -Tvis 0.737 0.741 0.730 0.717 0.698 0.660 0.577 0.418 0.193 0.000 0.613 -Rfvis 0.134 0.128 0.127 0.131 0.144 0.172 0.233 0.371 0.630 1.000 0.210 -Rbvis 0.126 0.119 0.116 0.119 0.131 0.156 0.204 0.311 0.539 0.999 0.185 -SHGC 0.630 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 11004 11333 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File PLANILUX 4mm PLT ULTRA N None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - 0 6.71 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - 783 0.00 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - 783 6.71 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.10 1.10 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMAPLUS_UltraN_#3_BioClean_Ar90 -Window ID : 11202 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.524 0.527 0.520 0.510 0.497 0.470 0.413 0.303 0.142 0.000 0.438 -Abs1 0.106 0.105 0.107 0.109 0.113 0.117 0.121 0.124 0.120 0.000 0.114 -Abs2 0.096 0.098 0.106 0.111 0.113 0.117 0.128 0.134 0.095 0.000 0.114 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.273 0.269 0.268 0.270 0.278 0.296 0.338 0.439 0.643 1.000 0.324 -Rbsol 0.259 0.254 0.252 0.254 0.263 0.282 0.317 0.401 0.594 0.999 0.304 -Tvis 0.715 0.720 0.709 0.696 0.679 0.643 0.564 0.412 0.193 0.000 0.598 -Rfvis 0.164 0.159 0.158 0.161 0.174 0.201 0.258 0.390 0.643 1.000 0.237 -Rbvis 0.148 0.143 0.140 0.142 0.153 0.176 0.220 0.319 0.542 0.999 0.204 -SHGC 0.630 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.770 - - - -Layer ID# 11044 11333 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File BIOCLEAN 4mm PLT ULTRA N None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMAPLUS_ONE_#3_Ar90 -Window ID : 11203 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.441 0.444 0.438 0.429 0.418 0.396 0.348 0.256 0.122 0.000 0.369 -Abs1 0.142 0.142 0.144 0.148 0.153 0.159 0.164 0.166 0.155 0.000 0.153 -Abs2 0.055 0.056 0.063 0.068 0.069 0.073 0.085 0.095 0.071 0.000 0.073 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.361 0.358 0.356 0.356 0.360 0.372 0.403 0.483 0.653 1.000 0.395 -Rbsol 0.373 0.368 0.367 0.369 0.377 0.393 0.423 0.495 0.659 0.999 0.410 -Tvis 0.642 0.645 0.636 0.624 0.608 0.577 0.507 0.372 0.176 0.000 0.537 -Rfvis 0.248 0.243 0.242 0.245 0.255 0.276 0.324 0.437 0.658 1.000 0.307 -Rbvis 0.244 0.238 0.236 0.238 0.249 0.269 0.310 0.400 0.599 0.999 0.293 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 11004 11393 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.013 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File PLANILUX 4mm PLANITHERM O None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.31 1.31 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.31 1.31 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.31 1.31 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.31 1.31 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMAPLUS_ONE_#3_Kr92 -Window ID : 11204 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr92/Air8 10.0 0.00990 3.221 2.296 7.550 3.497 -0.0123 0.716 0.00003 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.441 0.444 0.438 0.429 0.418 0.396 0.348 0.256 0.122 0.000 0.369 -Abs1 0.142 0.142 0.144 0.148 0.153 0.159 0.164 0.166 0.155 0.000 0.153 -Abs2 0.055 0.056 0.063 0.068 0.069 0.073 0.085 0.095 0.071 0.000 0.073 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.361 0.358 0.356 0.356 0.360 0.372 0.403 0.483 0.653 1.000 0.395 -Rbsol 0.373 0.368 0.367 0.369 0.377 0.393 0.423 0.495 0.659 0.999 0.410 -Tvis 0.642 0.645 0.636 0.624 0.608 0.577 0.507 0.372 0.176 0.000 0.537 -Rfvis 0.248 0.243 0.242 0.245 0.255 0.276 0.324 0.437 0.658 1.000 0.307 -Rbvis 0.244 0.238 0.236 0.238 0.249 0.269 0.310 0.400 0.599 0.999 0.293 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 11004 11393 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.013 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File PLANILUX 4mm PLANITHERM O None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.19 1.19 0.93 0.93 0.95 0.95 0.97 0.97 - 0 6.71 0.00 0.00 0.00 1.19 1.19 0.93 0.93 0.95 0.95 0.97 0.97 - 783 0.00 0.00 0.00 0.00 1.19 1.19 0.93 0.93 0.95 0.95 0.97 0.97 - 783 6.71 0.00 0.00 0.00 1.19 1.19 0.93 0.93 0.95 0.95 0.97 0.97 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMATOP_UltraN_#2#5_Ar90 -Window ID : 11300 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.414 0.419 0.407 0.393 0.376 0.345 0.281 0.175 0.063 0.000 0.320 -Abs1 0.185 0.187 0.197 0.205 0.209 0.217 0.241 0.275 0.249 0.001 0.220 -Abs2 0.060 0.060 0.060 0.061 0.062 0.063 0.062 0.056 0.042 0.000 0.059 -Abs3 0.059 0.061 0.066 0.069 0.069 0.070 0.074 0.069 0.038 0.000 0.067 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.282 0.273 0.269 0.271 0.283 0.304 0.342 0.425 0.608 0.999 0.324 -Rbsol 0.282 0.273 0.269 0.271 0.283 0.304 0.342 0.425 0.608 0.999 0.324 -Tvis 0.627 0.633 0.616 0.596 0.570 0.523 0.425 0.265 0.095 0.000 0.485 -Rfvis 0.162 0.152 0.147 0.150 0.166 0.195 0.247 0.352 0.563 0.999 0.221 -Rbvis 0.162 0.152 0.147 0.150 0.166 0.195 0.247 0.352 0.563 0.999 0.221 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 11333 11004 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File PLT ULTRA N PLANILUX 4mm PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMATOP_UltraN_#2#5_Kr90 -Window ID : 11301 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.414 0.419 0.407 0.393 0.376 0.345 0.281 0.175 0.063 0.000 0.320 -Abs1 0.185 0.187 0.197 0.205 0.209 0.217 0.241 0.275 0.249 0.001 0.220 -Abs2 0.060 0.060 0.060 0.061 0.062 0.063 0.062 0.056 0.042 0.000 0.059 -Abs3 0.059 0.061 0.066 0.069 0.069 0.070 0.074 0.069 0.038 0.000 0.067 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.282 0.273 0.269 0.271 0.283 0.304 0.342 0.425 0.608 0.999 0.324 -Rbsol 0.282 0.273 0.269 0.271 0.283 0.304 0.342 0.425 0.608 0.999 0.324 -Tvis 0.627 0.633 0.616 0.596 0.570 0.523 0.425 0.265 0.095 0.000 0.485 -Rfvis 0.162 0.152 0.147 0.150 0.166 0.195 0.247 0.352 0.563 0.999 0.221 -Rbvis 0.162 0.152 0.147 0.150 0.166 0.195 0.247 0.352 0.563 0.999 0.221 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 11333 11004 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File PLT ULTRA N PLANILUX 4mm PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 0 6.71 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 783 0.00 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 783 6.71 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMATOP_ONE_#2#5_Ar90 -Window ID : 11302 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.312 0.315 0.307 0.296 0.284 0.262 0.216 0.139 0.052 0.000 0.243 -Abs1 0.160 0.162 0.171 0.178 0.180 0.186 0.205 0.230 0.205 0.001 0.188 -Abs2 0.056 0.056 0.056 0.057 0.058 0.058 0.057 0.051 0.038 0.000 0.055 -Abs3 0.033 0.034 0.038 0.040 0.041 0.043 0.048 0.048 0.029 0.000 0.041 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.439 0.433 0.429 0.429 0.437 0.450 0.474 0.532 0.676 0.999 0.463 -Rbsol 0.439 0.433 0.429 0.429 0.437 0.450 0.474 0.532 0.676 0.999 0.463 -Tvis 0.492 0.497 0.484 0.468 0.449 0.415 0.342 0.220 0.083 0.000 0.384 -Rfvis 0.336 0.327 0.322 0.322 0.333 0.351 0.382 0.455 0.625 0.999 0.368 -Rbvis 0.336 0.327 0.322 0.322 0.333 0.351 0.382 0.455 0.625 0.999 0.368 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.580 - - - -Layer ID# 11393 11004 11393 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.013 0 0 0 -Emis B 0.013 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File PLANITHERM O PLANILUX 4mm PLANITHERM O None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.71 0.71 0.72 0.72 - 0 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.71 0.71 0.72 0.72 - 783 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.71 0.71 0.72 0.72 - 783 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.71 0.71 0.72 0.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMATOP_ONE_#2#5_Kr90 -Window ID : 11303 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.312 0.315 0.307 0.296 0.284 0.262 0.216 0.139 0.052 0.000 0.243 -Abs1 0.160 0.162 0.171 0.178 0.180 0.186 0.205 0.230 0.205 0.001 0.188 -Abs2 0.056 0.056 0.056 0.057 0.058 0.058 0.057 0.051 0.038 0.000 0.055 -Abs3 0.033 0.034 0.038 0.040 0.041 0.043 0.048 0.048 0.029 0.000 0.041 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.439 0.433 0.429 0.429 0.437 0.450 0.474 0.532 0.676 0.999 0.463 -Rbsol 0.439 0.433 0.429 0.429 0.437 0.450 0.474 0.532 0.676 0.999 0.463 -Tvis 0.492 0.497 0.484 0.468 0.449 0.415 0.342 0.220 0.083 0.000 0.384 -Rfvis 0.336 0.327 0.322 0.322 0.333 0.351 0.382 0.455 0.625 0.999 0.368 -Rbvis 0.336 0.327 0.322 0.322 0.333 0.351 0.382 0.455 0.625 0.999 0.368 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.580 - - - -Layer ID# 11393 11004 11393 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.013 0 0 0 -Emis B 0.013 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File PLANITHERM O PLANILUX 4mm PLANITHERM O None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.58 0.58 0.45 0.45 0.46 0.46 0.47 0.47 - 0 6.71 0.00 0.00 0.00 0.58 0.58 0.45 0.45 0.46 0.46 0.47 0.47 - 783 0.00 0.00 0.00 0.00 0.58 0.58 0.45 0.45 0.46 0.46 0.47 0.47 - 783 6.71 0.00 0.00 0.00 0.58 0.58 0.45 0.45 0.46 0.46 0.47 0.47 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMATOP_LUX_#2#5_Ar90 -Window ID : 11304 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.520 0.519 0.513 0.505 0.493 0.465 0.395 0.267 0.109 0.000 0.426 -Abs1 0.145 0.146 0.149 0.151 0.151 0.152 0.158 0.164 0.136 0.000 0.151 -Abs2 0.073 0.073 0.074 0.076 0.079 0.081 0.082 0.079 0.065 0.000 0.077 -Abs3 0.064 0.064 0.066 0.066 0.065 0.063 0.059 0.049 0.026 0.000 0.059 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.199 0.197 0.198 0.202 0.212 0.238 0.304 0.441 0.663 1.000 0.277 -Rbsol 0.199 0.197 0.198 0.202 0.212 0.238 0.304 0.441 0.663 1.000 0.277 -Tvis 0.672 0.671 0.663 0.654 0.640 0.604 0.515 0.349 0.146 0.000 0.553 -Rfvis 0.165 0.164 0.165 0.169 0.181 0.213 0.291 0.445 0.678 1.000 0.256 -Rbvis 0.165 0.164 0.165 0.169 0.181 0.213 0.291 0.445 0.678 1.000 0.256 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.730 - - - -Layer ID# 11031 11004 11031 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.082 0 0 0 -Emis B 0.082 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File PLANITHERM L PLANILUX 4mm PLANITHERM L None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.74 0.74 0.76 0.76 0.78 0.78 0.79 0.79 - 0 6.71 0.00 0.00 0.00 0.74 0.74 0.76 0.76 0.78 0.78 0.79 0.79 - 783 0.00 0.00 0.00 0.00 0.74 0.74 0.76 0.76 0.78 0.78 0.79 0.79 - 783 6.71 0.00 0.00 0.00 0.74 0.74 0.76 0.76 0.78 0.78 0.79 0.79 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMATOP_LUX_#2#5_Kr90 -Window ID : 11305 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.520 0.519 0.513 0.505 0.493 0.465 0.395 0.267 0.109 0.000 0.426 -Abs1 0.145 0.146 0.149 0.151 0.151 0.152 0.158 0.164 0.136 0.000 0.151 -Abs2 0.073 0.073 0.074 0.076 0.079 0.081 0.082 0.079 0.065 0.000 0.077 -Abs3 0.064 0.064 0.066 0.066 0.065 0.063 0.059 0.049 0.026 0.000 0.059 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.199 0.197 0.198 0.202 0.212 0.238 0.304 0.441 0.663 1.000 0.277 -Rbsol 0.199 0.197 0.198 0.202 0.212 0.238 0.304 0.441 0.663 1.000 0.277 -Tvis 0.672 0.671 0.663 0.654 0.640 0.604 0.515 0.349 0.146 0.000 0.553 -Rfvis 0.165 0.164 0.165 0.169 0.181 0.213 0.291 0.445 0.678 1.000 0.256 -Rbvis 0.165 0.164 0.165 0.169 0.181 0.213 0.291 0.445 0.678 1.000 0.256 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.730 - - - -Layer ID# 11031 11004 11031 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.082 0 0 0 -Emis B 0.082 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File PLANITHERM L PLANILUX 4mm PLANITHERM L None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.71 0.71 0.60 0.60 0.62 0.62 0.64 0.64 - 0 6.71 0.00 0.00 0.00 0.71 0.71 0.60 0.60 0.62 0.62 0.64 0.64 - 783 0.00 0.00 0.00 0.00 0.71 0.71 0.60 0.60 0.62 0.62 0.64 0.64 - 783 6.71 0.00 0.00 0.00 0.71 0.71 0.60 0.60 0.62 0.62 0.64 0.64 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMATOP_MAX_#2#5_Ar90 -Window ID : 11306 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.443 0.442 0.437 0.430 0.421 0.397 0.338 0.229 0.094 0.000 0.363 -Abs1 0.202 0.202 0.205 0.207 0.207 0.207 0.209 0.206 0.162 0.000 0.202 -Abs2 0.064 0.065 0.065 0.067 0.069 0.071 0.072 0.069 0.057 0.000 0.068 -Abs3 0.076 0.077 0.078 0.078 0.076 0.073 0.068 0.054 0.027 0.000 0.069 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.215 0.214 0.215 0.218 0.227 0.252 0.313 0.442 0.660 1.000 0.289 -Rbsol 0.215 0.214 0.215 0.218 0.227 0.252 0.313 0.442 0.660 1.000 0.289 -Tvis 0.624 0.623 0.616 0.607 0.594 0.561 0.477 0.324 0.135 0.000 0.513 -Rfvis 0.145 0.144 0.145 0.149 0.161 0.193 0.269 0.422 0.660 1.000 0.236 -Rbvis 0.145 0.144 0.145 0.149 0.161 0.193 0.269 0.422 0.660 1.000 0.236 -SHGC 0.600 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.740 - - - -Layer ID# 11374 11004 11374 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.048 0 0 0 -Emis B 0.048 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File PLANITHERM M PLANILUX 4mm PLANITHERM M None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.73 0.73 0.77 0.77 0.78 0.78 0.80 0.80 - 0 6.71 0.00 0.00 0.00 0.73 0.73 0.77 0.77 0.78 0.78 0.80 0.80 - 783 0.00 0.00 0.00 0.00 0.73 0.73 0.77 0.77 0.78 0.78 0.80 0.80 - 783 6.71 0.00 0.00 0.00 0.73 0.73 0.77 0.77 0.78 0.78 0.80 0.80 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_CLIMATOP_MAX_#2#5_Kr90 -Window ID : 11307 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.443 0.442 0.437 0.430 0.421 0.397 0.338 0.229 0.094 0.000 0.363 -Abs1 0.202 0.202 0.205 0.207 0.207 0.207 0.209 0.206 0.162 0.000 0.202 -Abs2 0.064 0.065 0.065 0.067 0.069 0.071 0.072 0.069 0.057 0.000 0.068 -Abs3 0.076 0.077 0.078 0.078 0.076 0.073 0.068 0.054 0.027 0.000 0.069 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.215 0.214 0.215 0.218 0.227 0.252 0.313 0.442 0.660 1.000 0.289 -Rbsol 0.215 0.214 0.215 0.218 0.227 0.252 0.313 0.442 0.660 1.000 0.289 -Tvis 0.624 0.623 0.616 0.607 0.594 0.561 0.477 0.324 0.135 0.000 0.513 -Rfvis 0.145 0.144 0.145 0.149 0.161 0.193 0.269 0.422 0.660 1.000 0.236 -Rbvis 0.145 0.144 0.145 0.149 0.161 0.193 0.269 0.422 0.660 1.000 0.236 -SHGC 0.600 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.740 - - - -Layer ID# 11374 11004 11374 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.048 0 0 0 -Emis B 0.048 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File PLANITHERM M PLANILUX 4mm PLANITHERM M None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.65 0.65 0.53 0.53 0.54 0.54 0.55 0.55 - 0 6.71 0.00 0.00 0.00 0.65 0.65 0.53 0.53 0.54 0.54 0.55 0.55 - 783 0.00 0.00 0.00 0.00 0.65 0.65 0.53 0.53 0.54 0.54 0.55 0.55 - 783 6.71 0.00 0.00 0.00 0.65 0.65 0.53 0.53 0.54 0.54 0.55 0.55 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_Xtreme_60/28_#2_Ar90 -Window ID : 11400 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.259 0.261 0.257 0.253 0.246 0.233 0.204 0.149 0.070 0.000 0.217 -Abs1 0.342 0.345 0.350 0.353 0.351 0.351 0.353 0.345 0.268 0.001 0.342 -Abs2 0.010 0.010 0.010 0.010 0.011 0.011 0.010 0.009 0.007 0.000 0.010 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.389 0.384 0.382 0.384 0.392 0.406 0.432 0.497 0.655 0.999 0.421 -Rbsol 0.424 0.420 0.418 0.416 0.419 0.428 0.454 0.523 0.673 1.000 0.448 -Tvis 0.449 0.452 0.446 0.437 0.426 0.404 0.354 0.259 0.121 0.000 0.376 -Rfvis 0.228 0.221 0.219 0.222 0.232 0.250 0.285 0.370 0.571 0.999 0.273 -Rbvis 0.244 0.238 0.237 0.240 0.250 0.272 0.321 0.436 0.658 1.000 0.303 -SHGC 0.280 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.600 - - - -Layer ID# 41002 11004 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.013 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 41002_COOL-L PLANILUX 4mm None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_SKN144II_40/23_#2_Ar90 -Window ID : 11401 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.200 0.202 0.199 0.195 0.190 0.180 0.157 0.115 0.054 0.000 0.167 -Abs1 0.487 0.491 0.495 0.496 0.493 0.489 0.484 0.457 0.341 0.001 0.473 -Abs2 0.010 0.011 0.011 0.011 0.011 0.011 0.011 0.010 0.007 0.000 0.010 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.303 0.297 0.295 0.298 0.306 0.320 0.348 0.418 0.598 0.999 0.339 -Rbsol 0.339 0.335 0.333 0.333 0.338 0.351 0.385 0.470 0.648 1.000 0.376 -Tvis 0.329 0.331 0.327 0.320 0.312 0.295 0.259 0.188 0.088 0.000 0.275 -Rfvis 0.217 0.211 0.209 0.212 0.221 0.238 0.270 0.351 0.553 0.999 0.260 -Rbvis 0.174 0.168 0.167 0.170 0.182 0.208 0.264 0.394 0.640 1.000 0.244 -SHGC 0.230 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.400 - - - -Layer ID# 41000 11004 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 41000_COOL-L PLANILUX 4mm None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_SKN154_50/27_#2_Ar90 -Window ID : 11402 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.241 0.242 0.239 0.234 0.228 0.216 0.190 0.140 0.066 0.000 0.202 -Abs1 0.407 0.411 0.416 0.418 0.416 0.413 0.412 0.396 0.301 0.001 0.401 -Abs2 0.012 0.012 0.012 0.012 0.012 0.012 0.012 0.011 0.008 0.000 0.012 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.341 0.335 0.334 0.336 0.344 0.358 0.385 0.454 0.624 0.999 0.375 -Rbsol 0.392 0.389 0.386 0.386 0.389 0.399 0.427 0.501 0.661 1.000 0.421 -Tvis 0.403 0.406 0.400 0.393 0.383 0.363 0.319 0.235 0.111 0.000 0.338 -Rfvis 0.214 0.208 0.206 0.208 0.218 0.236 0.270 0.354 0.558 0.999 0.259 -Rbvis 0.272 0.267 0.266 0.268 0.277 0.298 0.343 0.451 0.664 1.000 0.327 -SHGC 0.270 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.500 - - - -Layer ID# 11036 11004 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.013 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE SK PLANILUX 4mm None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_SKN165_60/33_#2_Ar90 -Window ID : 11403 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.299 0.301 0.297 0.291 0.283 0.268 0.235 0.172 0.081 0.000 0.250 -Abs1 0.370 0.373 0.379 0.382 0.381 0.380 0.384 0.377 0.295 0.001 0.371 -Abs2 0.015 0.016 0.016 0.016 0.016 0.017 0.016 0.014 0.011 0.000 0.015 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.316 0.310 0.309 0.311 0.319 0.335 0.364 0.437 0.614 0.999 0.353 -Rbsol 0.367 0.363 0.361 0.360 0.364 0.376 0.407 0.487 0.656 1.000 0.399 -Tvis 0.497 0.500 0.493 0.484 0.471 0.446 0.391 0.286 0.134 0.000 0.415 -Rfvis 0.181 0.175 0.173 0.175 0.186 0.205 0.243 0.333 0.546 0.999 0.230 -Rbvis 0.206 0.200 0.199 0.202 0.213 0.237 0.290 0.412 0.647 1.000 0.271 -SHGC 0.330 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.610 - - - -Layer ID# 11037 11004 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE SK PLANILUX 4mm None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_SKN174_68/41_#2_Ar90 -Window ID : 11404 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.380 0.382 0.377 0.369 0.360 0.340 0.297 0.216 0.100 0.000 0.316 -Abs1 0.321 0.324 0.331 0.336 0.336 0.338 0.348 0.353 0.287 0.001 0.333 -Abs2 0.023 0.023 0.023 0.024 0.024 0.024 0.024 0.021 0.016 0.000 0.023 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.277 0.271 0.269 0.271 0.280 0.297 0.331 0.409 0.597 0.999 0.318 -Rbsol 0.309 0.305 0.303 0.303 0.309 0.324 0.361 0.453 0.641 1.000 0.350 -Tvis 0.604 0.607 0.599 0.588 0.572 0.541 0.473 0.343 0.158 0.000 0.503 -Rfvis 0.130 0.123 0.121 0.123 0.135 0.157 0.200 0.299 0.526 0.999 0.185 -Rbvis 0.136 0.130 0.129 0.133 0.146 0.173 0.234 0.372 0.631 1.000 0.212 -SHGC 0.410 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.680 - - - -Layer ID# 41001 11004 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 41001_COOL-L PLANILUX 4mm None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_KNT155_47/37_#2_Ar90 -Window ID : 11405 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.318 0.320 0.315 0.309 0.300 0.284 0.248 0.180 0.083 0.000 0.264 -Abs1 0.468 0.472 0.479 0.482 0.480 0.479 0.482 0.470 0.364 0.001 0.467 -Abs2 0.026 0.026 0.026 0.027 0.027 0.028 0.027 0.023 0.017 0.000 0.026 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.188 0.182 0.180 0.183 0.192 0.210 0.243 0.327 0.537 0.999 0.233 -Rbsol 0.201 0.196 0.194 0.196 0.206 0.226 0.274 0.387 0.612 1.000 0.259 -Tvis 0.435 0.437 0.431 0.423 0.412 0.389 0.340 0.246 0.114 0.000 0.362 -Rfvis 0.168 0.161 0.159 0.162 0.172 0.191 0.227 0.315 0.531 0.999 0.216 -Rbvis 0.130 0.124 0.123 0.127 0.140 0.168 0.229 0.368 0.629 1.000 0.207 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.470 - - - -Layer ID# 11018 11004 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.156 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE KN PLANILUX 4mm None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.62 1.62 1.46 1.46 1.51 1.51 1.55 1.55 - 0 6.71 0.00 0.00 0.00 1.62 1.62 1.46 1.46 1.51 1.51 1.55 1.55 - 783 0.00 0.00 0.00 0.00 1.62 1.62 1.46 1.46 1.51 1.51 1.55 1.55 - 783 6.71 0.00 0.00 0.00 1.62 1.62 1.46 1.46 1.51 1.51 1.55 1.55 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_KNT164_57/46_#2_Ar90 -Window ID : 11406 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.405 0.407 0.401 0.393 0.382 0.361 0.315 0.228 0.104 0.000 0.336 -Abs1 0.398 0.402 0.410 0.415 0.414 0.416 0.427 0.430 0.345 0.001 0.409 -Abs2 0.035 0.035 0.036 0.036 0.037 0.037 0.036 0.031 0.022 0.000 0.034 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.163 0.156 0.154 0.157 0.167 0.186 0.222 0.311 0.528 0.999 0.211 -Rbsol 0.179 0.174 0.173 0.175 0.185 0.207 0.258 0.376 0.607 1.000 0.241 -Tvis 0.539 0.542 0.534 0.524 0.510 0.482 0.421 0.305 0.140 0.000 0.448 -Rfvis 0.135 0.128 0.126 0.129 0.140 0.161 0.201 0.297 0.521 0.999 0.188 -Rbvis 0.114 0.108 0.107 0.111 0.125 0.154 0.217 0.360 0.626 1.000 0.194 -SHGC 0.460 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.580 - - - -Layer ID# 11409 11004 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.153 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE KN PLANILUX 4mm None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.61 1.61 1.45 1.45 1.50 1.50 1.54 1.54 - 0 6.71 0.00 0.00 0.00 1.61 1.61 1.45 1.45 1.50 1.50 1.54 1.54 - 783 0.00 0.00 0.00 0.00 1.61 1.61 1.45 1.45 1.50 1.50 1.54 1.54 - 783 6.71 0.00 0.00 0.00 1.61 1.61 1.45 1.45 1.50 1.50 1.54 1.54 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_KS147_44/29_#2_Ar90 -Window ID : 11407 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.257 0.258 0.255 0.250 0.243 0.231 0.205 0.154 0.076 0.000 0.216 -Abs1 0.272 0.275 0.279 0.282 0.282 0.281 0.285 0.281 0.220 0.001 0.275 -Abs2 0.019 0.019 0.019 0.019 0.020 0.020 0.020 0.018 0.014 0.000 0.019 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.452 0.448 0.447 0.449 0.455 0.467 0.490 0.547 0.690 0.999 0.480 -Rbsol 0.475 0.472 0.470 0.469 0.470 0.477 0.497 0.553 0.685 1.000 0.492 -Tvis 0.381 0.383 0.377 0.371 0.361 0.344 0.305 0.229 0.113 0.000 0.321 -Rfvis 0.424 0.419 0.418 0.420 0.427 0.440 0.466 0.529 0.679 0.999 0.455 -Rbvis 0.423 0.419 0.418 0.419 0.425 0.438 0.469 0.545 0.707 1.000 0.458 -SHGC 0.290 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.440 - - - -Layer ID# 11049 11004 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.036 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE KS PLANILUX 4mm None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.07 1.07 1.10 1.10 1.12 1.12 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.07 1.07 1.10 1.10 1.12 1.12 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.07 1.07 1.10 1.10 1.12 1.12 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.07 1.07 1.10 1.10 1.12 1.12 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ANTELIO_silver_#3_Ar90 -Window ID : 11408 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.399 0.403 0.393 0.381 0.368 0.345 0.295 0.206 0.093 0.000 0.322 -Abs1 0.166 0.168 0.178 0.186 0.190 0.198 0.222 0.252 0.227 0.001 0.200 -Abs2 0.076 0.077 0.082 0.085 0.086 0.088 0.093 0.093 0.063 0.000 0.085 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.360 0.352 0.347 0.347 0.356 0.369 0.390 0.450 0.616 0.999 0.383 -Rbsol 0.335 0.327 0.321 0.322 0.330 0.344 0.365 0.426 0.599 0.999 0.359 -Tvis 0.538 0.544 0.530 0.514 0.497 0.465 0.397 0.277 0.124 0.000 0.433 -Rfvis 0.338 0.330 0.327 0.330 0.341 0.359 0.389 0.463 0.638 0.999 0.375 -Rbvis 0.276 0.266 0.258 0.257 0.266 0.281 0.301 0.363 0.552 0.999 0.297 -SHGC 0.480 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.590 - - - -Layer ID# 11047 11333 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File ANTELIO SILV PLT ULTRA N None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ANTELIO_green_#3_Ar90 -Window ID : 11409 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.242 0.244 0.238 0.231 0.223 0.208 0.178 0.123 0.054 0.000 0.194 -Abs1 0.481 0.484 0.490 0.492 0.490 0.487 0.485 0.463 0.351 0.001 0.472 -Abs2 0.034 0.035 0.038 0.040 0.041 0.042 0.047 0.048 0.033 0.000 0.041 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.244 0.236 0.234 0.237 0.246 0.262 0.291 0.366 0.562 0.999 0.282 -Rbsol 0.281 0.272 0.268 0.270 0.281 0.298 0.327 0.401 0.590 0.999 0.316 -Tvis 0.381 0.385 0.375 0.364 0.351 0.328 0.279 0.193 0.085 0.000 0.306 -Rfvis 0.297 0.290 0.288 0.291 0.301 0.317 0.346 0.419 0.602 0.999 0.335 -Rbvis 0.192 0.181 0.175 0.177 0.189 0.209 0.242 0.325 0.537 0.999 0.231 -SHGC 0.300 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.480 - - - -Layer ID# 11108 11333 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File ANTELIO EMER PLT ULTRA N None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ANTELIO_neut_#3_Ar90 -Window ID : 11410 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.296 0.299 0.292 0.283 0.273 0.256 0.219 0.153 0.069 0.000 0.239 -Abs1 0.290 0.292 0.301 0.307 0.308 0.312 0.326 0.336 0.276 0.001 0.308 -Abs2 0.062 0.063 0.067 0.069 0.070 0.071 0.074 0.073 0.049 0.000 0.068 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.352 0.345 0.341 0.341 0.349 0.361 0.381 0.438 0.606 0.999 0.375 -Rbsol 0.317 0.309 0.304 0.305 0.314 0.329 0.353 0.418 0.596 0.999 0.345 -Tvis 0.374 0.378 0.368 0.357 0.345 0.323 0.275 0.191 0.085 0.000 0.301 -Rfvis 0.322 0.315 0.313 0.315 0.325 0.340 0.368 0.438 0.615 0.999 0.357 -Rbvis 0.244 0.233 0.226 0.226 0.237 0.253 0.278 0.348 0.546 0.999 0.271 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.410 - - - -Layer ID# 11048 11333 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File ANTELIO CLEA PLT ULTRA N None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ANTELIO_bronze_#3_Ar90 -Window ID : 11411 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.163 0.164 0.160 0.155 0.150 0.140 0.120 0.083 0.037 0.000 0.131 -Abs1 0.501 0.505 0.510 0.512 0.509 0.505 0.501 0.473 0.353 0.001 0.489 -Abs2 0.036 0.037 0.039 0.040 0.040 0.041 0.042 0.041 0.027 0.000 0.039 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.300 0.294 0.291 0.293 0.301 0.314 0.338 0.403 0.583 0.999 0.331 -Rbsol 0.259 0.249 0.246 0.248 0.260 0.279 0.311 0.391 0.586 0.999 0.299 -Tvis 0.203 0.205 0.200 0.194 0.187 0.175 0.148 0.102 0.045 0.000 0.163 -Rfvis 0.310 0.304 0.303 0.305 0.313 0.327 0.353 0.422 0.600 0.999 0.345 -Rbvis 0.148 0.136 0.132 0.135 0.149 0.172 0.211 0.305 0.530 0.999 0.196 -SHGC 0.230 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.210 - - - -Layer ID# 11103 11333 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File ANTELIO BRON PLT ULTRA N None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ST120_#3_Ar90 -Window ID : 11412 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.118 0.119 0.116 0.112 0.109 0.102 0.087 0.061 0.028 0.000 0.095 -Abs1 0.538 0.542 0.545 0.545 0.541 0.534 0.522 0.482 0.349 0.001 0.514 -Abs2 0.020 0.020 0.022 0.023 0.023 0.024 0.026 0.026 0.018 0.000 0.023 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.325 0.319 0.318 0.320 0.328 0.341 0.366 0.431 0.605 0.999 0.358 -Rbsol 0.349 0.342 0.336 0.336 0.344 0.356 0.376 0.433 0.602 0.999 0.370 -Tvis 0.169 0.170 0.166 0.161 0.156 0.146 0.125 0.087 0.039 0.000 0.136 -Rfvis 0.268 0.262 0.260 0.263 0.272 0.286 0.314 0.386 0.574 0.999 0.305 -Rbvis 0.291 0.282 0.273 0.272 0.280 0.294 0.312 0.370 0.555 0.999 0.309 -SHGC 0.170 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.180 - - - -Layer ID# 11034 11333 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.647 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE ST PLT ULTRA N None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ST150_#3_Ar90 -Window ID : 11413 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.297 0.300 0.293 0.284 0.274 0.257 0.219 0.152 0.068 0.000 0.239 -Abs1 0.427 0.430 0.437 0.442 0.442 0.442 0.447 0.439 0.343 0.001 0.431 -Abs2 0.053 0.054 0.058 0.060 0.061 0.062 0.067 0.066 0.045 0.000 0.060 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.223 0.215 0.212 0.214 0.223 0.239 0.267 0.342 0.544 0.999 0.260 -Rbsol 0.291 0.282 0.278 0.279 0.290 0.306 0.334 0.406 0.592 0.999 0.324 -Tvis 0.414 0.419 0.408 0.396 0.382 0.357 0.304 0.210 0.093 0.000 0.333 -Rfvis 0.186 0.177 0.175 0.178 0.190 0.208 0.242 0.326 0.538 0.999 0.231 -Rbvis 0.202 0.191 0.185 0.186 0.199 0.218 0.249 0.329 0.539 0.999 0.239 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.450 - - - -Layer ID# 11042 11333 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.811 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE ST PLT ULTRA N None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ST450_#3_Ar90 -Window ID : 11414 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.186 0.188 0.183 0.177 0.171 0.160 0.136 0.094 0.041 0.000 0.149 -Abs1 0.615 0.620 0.624 0.625 0.621 0.614 0.603 0.563 0.413 0.001 0.593 -Abs2 0.024 0.025 0.027 0.029 0.029 0.031 0.034 0.035 0.025 0.000 0.030 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.175 0.168 0.166 0.169 0.179 0.195 0.226 0.308 0.521 0.999 0.218 -Rbsol 0.263 0.253 0.250 0.252 0.264 0.282 0.314 0.393 0.587 0.999 0.302 -Tvis 0.299 0.302 0.295 0.286 0.275 0.257 0.219 0.151 0.066 0.000 0.240 -Rfvis 0.172 0.164 0.162 0.165 0.175 0.193 0.226 0.309 0.524 0.999 0.216 -Rbvis 0.160 0.148 0.143 0.146 0.160 0.182 0.219 0.311 0.532 0.999 0.206 -SHGC 0.240 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.370 - - - -Layer ID# 11274 11333 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.811 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE ST PLT ULTRA N None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ST167_#3_Ar90 -Window ID : 11415 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.396 0.400 0.390 0.378 0.365 0.342 0.291 0.202 0.090 0.000 0.318 -Abs1 0.269 0.272 0.282 0.289 0.292 0.298 0.317 0.337 0.286 0.001 0.296 -Abs2 0.073 0.075 0.080 0.083 0.084 0.085 0.091 0.090 0.061 0.000 0.082 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.262 0.253 0.249 0.250 0.259 0.275 0.300 0.370 0.562 0.999 0.293 -Rbsol 0.290 0.281 0.277 0.279 0.289 0.306 0.334 0.406 0.591 0.999 0.324 -Tvis 0.541 0.547 0.533 0.517 0.499 0.467 0.397 0.274 0.121 0.000 0.435 -Rfvis 0.213 0.204 0.201 0.204 0.217 0.237 0.272 0.358 0.565 0.999 0.258 -Rbvis 0.201 0.190 0.184 0.186 0.198 0.217 0.248 0.329 0.539 0.999 0.238 -SHGC 0.470 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.590 - - - -Layer ID# 11249 11333 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.821 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE ST PLT ULTRA N None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ANTELIO_silver_#3_Ar90 -Window ID : 11416 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.337 0.340 0.331 0.321 0.311 0.292 0.250 0.176 0.081 0.000 0.272 -Abs1 0.186 0.189 0.200 0.209 0.212 0.220 0.244 0.272 0.240 0.001 0.221 -Abs2 0.042 0.043 0.047 0.050 0.051 0.054 0.061 0.065 0.047 0.000 0.053 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.435 0.428 0.422 0.420 0.425 0.434 0.445 0.487 0.632 0.999 0.443 -Rbsol 0.442 0.435 0.431 0.432 0.439 0.450 0.468 0.520 0.665 0.999 0.461 -Tvis 0.485 0.489 0.477 0.462 0.447 0.420 0.359 0.252 0.115 0.000 0.391 -Rfvis 0.401 0.394 0.390 0.390 0.399 0.412 0.434 0.493 0.650 0.999 0.425 -Rbvis 0.360 0.352 0.345 0.345 0.353 0.366 0.385 0.442 0.609 0.999 0.380 -SHGC 0.400 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.550 - - - -Layer ID# 11047 11393 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.013 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File ANTELIO SILV PLANITHERM O None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ANTELIO_green_#3_Ar90 -Window ID : 11417 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.208 0.210 0.205 0.199 0.192 0.180 0.154 0.107 0.048 0.000 0.168 -Abs1 0.507 0.511 0.516 0.519 0.516 0.512 0.508 0.481 0.360 0.001 0.496 -Abs2 0.020 0.020 0.023 0.025 0.026 0.028 0.033 0.036 0.026 0.000 0.027 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.265 0.258 0.255 0.257 0.266 0.280 0.306 0.376 0.566 0.999 0.299 -Rbsol 0.401 0.394 0.391 0.393 0.401 0.415 0.439 0.501 0.658 0.999 0.429 -Tvis 0.337 0.341 0.332 0.322 0.311 0.292 0.249 0.173 0.078 0.000 0.272 -Rfvis 0.327 0.321 0.318 0.320 0.328 0.342 0.367 0.433 0.608 0.999 0.359 -Rbvis 0.295 0.285 0.281 0.282 0.293 0.310 0.339 0.411 0.597 0.999 0.328 -SHGC 0.260 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.430 - - - -Layer ID# 11108 11393 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.013 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File ANTELIO EMER PLANITHERM O None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ANTELIO_neut_#3_Ar90 -Window ID : 11418 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.245 0.248 0.241 0.234 0.226 0.213 0.182 0.128 0.059 0.000 0.198 -Abs1 0.318 0.321 0.330 0.336 0.337 0.341 0.353 0.359 0.289 0.001 0.334 -Abs2 0.032 0.033 0.036 0.038 0.039 0.041 0.046 0.049 0.035 0.000 0.040 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.404 0.398 0.393 0.392 0.397 0.406 0.419 0.465 0.617 0.999 0.417 -Rbsol 0.429 0.422 0.418 0.419 0.426 0.439 0.459 0.514 0.663 0.999 0.451 -Tvis 0.335 0.338 0.330 0.320 0.309 0.290 0.248 0.173 0.079 0.000 0.270 -Rfvis 0.353 0.346 0.344 0.345 0.353 0.366 0.390 0.453 0.621 0.999 0.382 -Rbvis 0.336 0.327 0.322 0.322 0.331 0.346 0.368 0.431 0.605 0.999 0.361 -SHGC 0.310 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.380 - - - -Layer ID# 11048 11393 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.013 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File ANTELIO CLEA PLANITHERM O None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ANTELIO_bronze_#3_Ar90 -Window ID : 11419 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.132 0.133 0.130 0.126 0.122 0.114 0.098 0.068 0.031 0.000 0.106 -Abs1 0.532 0.537 0.541 0.543 0.540 0.534 0.527 0.494 0.364 0.001 0.516 -Abs2 0.017 0.018 0.019 0.021 0.021 0.022 0.025 0.026 0.019 0.000 0.021 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.318 0.312 0.309 0.310 0.318 0.330 0.351 0.412 0.587 0.999 0.346 -Rbsol 0.384 0.376 0.374 0.376 0.385 0.401 0.427 0.493 0.655 0.999 0.415 -Tvis 0.179 0.181 0.176 0.171 0.165 0.154 0.132 0.091 0.041 0.000 0.144 -Rfvis 0.320 0.314 0.312 0.314 0.322 0.336 0.360 0.426 0.601 0.999 0.353 -Rbvis 0.262 0.252 0.248 0.251 0.263 0.282 0.315 0.396 0.591 0.999 0.302 -SHGC 0.190 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.200 - - - -Layer ID# 11103 11393 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.013 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File ANTELIO BRON PLANITHERM O None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ST120_#3_Ar90 -Window ID : 11420 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.101 0.102 0.099 0.096 0.093 0.088 0.075 0.053 0.024 0.000 0.082 -Abs1 0.556 0.561 0.564 0.564 0.559 0.551 0.537 0.494 0.355 0.001 0.530 -Abs2 0.012 0.012 0.014 0.015 0.015 0.016 0.018 0.019 0.014 0.000 0.016 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.330 0.325 0.323 0.325 0.333 0.346 0.370 0.434 0.606 0.999 0.362 -Rbsol 0.453 0.446 0.442 0.442 0.449 0.459 0.476 0.525 0.668 0.999 0.470 -Tvis 0.151 0.153 0.149 0.144 0.140 0.131 0.112 0.079 0.036 0.000 0.122 -Rfvis 0.275 0.268 0.267 0.269 0.277 0.292 0.318 0.389 0.576 0.999 0.310 -Rbvis 0.374 0.366 0.359 0.358 0.366 0.378 0.395 0.449 0.612 0.999 0.391 -SHGC 0.140 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.160 - - - -Layer ID# 11034 11393 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.647 0.013 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE ST PLANITHERM O None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ST150_#3_Ar90 -Window ID : 11421 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.249 0.252 0.245 0.238 0.230 0.216 0.184 0.129 0.059 0.000 0.201 -Abs1 0.460 0.464 0.472 0.476 0.475 0.474 0.477 0.463 0.356 0.001 0.461 -Abs2 0.030 0.031 0.034 0.037 0.037 0.039 0.044 0.047 0.034 0.000 0.038 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.260 0.253 0.249 0.250 0.258 0.271 0.294 0.361 0.551 0.999 0.290 -Rbsol 0.407 0.400 0.397 0.399 0.407 0.421 0.444 0.504 0.659 0.999 0.434 -Tvis 0.367 0.370 0.361 0.350 0.338 0.317 0.271 0.189 0.085 0.000 0.295 -Rfvis 0.222 0.215 0.211 0.213 0.223 0.239 0.268 0.343 0.545 0.999 0.260 -Rbvis 0.301 0.292 0.288 0.289 0.299 0.316 0.343 0.415 0.598 0.999 0.333 -SHGC 0.310 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.410 - - - -Layer ID# 11042 11393 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.811 0.013 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE ST PLANITHERM O None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ST450_#3_Ar90 -Window ID : 11422 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.160 0.161 0.157 0.152 0.147 0.138 0.118 0.082 0.037 0.000 0.128 -Abs1 0.638 0.643 0.647 0.648 0.643 0.635 0.623 0.578 0.421 0.001 0.613 -Abs2 0.015 0.015 0.017 0.019 0.020 0.021 0.025 0.027 0.020 0.000 0.021 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.187 0.180 0.178 0.181 0.190 0.206 0.235 0.313 0.523 0.999 0.228 -Rbsol 0.387 0.380 0.377 0.379 0.388 0.403 0.429 0.494 0.655 0.999 0.418 -Tvis 0.263 0.265 0.259 0.251 0.242 0.227 0.193 0.134 0.060 0.000 0.211 -Rfvis 0.190 0.183 0.181 0.183 0.193 0.209 0.239 0.318 0.527 0.999 0.231 -Rbvis 0.270 0.260 0.256 0.258 0.270 0.289 0.321 0.400 0.593 0.999 0.308 -SHGC 0.210 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.330 - - - -Layer ID# 11274 11393 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.811 0.013 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE ST PLANITHERM O None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ST167_#3_Ar90 -Window ID : 11423 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.330 0.334 0.325 0.315 0.305 0.286 0.245 0.171 0.078 0.000 0.266 -Abs1 0.297 0.300 0.311 0.319 0.321 0.327 0.345 0.361 0.300 0.001 0.323 -Abs2 0.041 0.042 0.046 0.049 0.051 0.053 0.060 0.063 0.046 0.000 0.052 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.332 0.324 0.318 0.317 0.324 0.335 0.351 0.404 0.576 0.999 0.349 -Rbsol 0.407 0.400 0.397 0.398 0.407 0.420 0.444 0.504 0.659 0.999 0.434 -Tvis 0.479 0.484 0.472 0.457 0.442 0.414 0.354 0.246 0.111 0.000 0.386 -Rfvis 0.276 0.267 0.263 0.264 0.274 0.290 0.316 0.387 0.576 0.999 0.308 -Rbvis 0.301 0.292 0.287 0.289 0.299 0.316 0.343 0.414 0.598 0.999 0.333 -SHGC 0.390 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.530 - - - -Layer ID# 11249 11393 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.821 0.013 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File COOL-LITE ST PLANITHERM O None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.03 1.03 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_Xtreme_60/28_#2#5_Ar90 -Window ID : 11500 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.226 0.229 0.222 0.215 0.206 0.189 0.155 0.097 0.036 0.000 0.175 -Abs1 0.346 0.349 0.354 0.356 0.356 0.356 0.359 0.353 0.274 0.001 0.347 -Abs2 0.011 0.011 0.011 0.011 0.012 0.012 0.012 0.011 0.009 0.000 0.011 -Abs3 0.021 0.022 0.025 0.027 0.028 0.029 0.032 0.032 0.019 0.000 0.028 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.396 0.390 0.388 0.390 0.399 0.414 0.442 0.507 0.661 0.999 0.429 -Rbsol 0.355 0.347 0.341 0.340 0.347 0.362 0.386 0.450 0.615 0.999 0.378 -Tvis 0.393 0.398 0.387 0.374 0.358 0.330 0.269 0.169 0.062 0.000 0.305 -Rfvis 0.240 0.232 0.230 0.233 0.244 0.265 0.302 0.387 0.582 0.999 0.286 -Rbvis 0.231 0.221 0.215 0.215 0.228 0.250 0.289 0.375 0.569 0.999 0.272 -SHGC 0.260 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.540 - - - -Layer ID# 41002 11004 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.013 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 41002_COOL-L PLANILUX 4mm PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 0 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_SKN144II_40/23_#2#5_Ar90 -Window ID : 11501 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.170 0.172 0.167 0.161 0.154 0.142 0.116 0.072 0.026 0.000 0.131 -Abs1 0.493 0.497 0.501 0.502 0.499 0.496 0.492 0.467 0.348 0.001 0.480 -Abs2 0.012 0.012 0.012 0.013 0.013 0.013 0.013 0.012 0.010 0.000 0.013 -Abs3 0.019 0.019 0.021 0.023 0.023 0.024 0.026 0.025 0.015 0.000 0.023 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.307 0.300 0.299 0.301 0.310 0.325 0.353 0.423 0.601 0.999 0.343 -Rbsol 0.315 0.307 0.302 0.302 0.312 0.330 0.362 0.436 0.611 0.999 0.348 -Tvis 0.285 0.288 0.280 0.271 0.259 0.238 0.194 0.121 0.044 0.000 0.221 -Rfvis 0.224 0.217 0.215 0.218 0.228 0.246 0.279 0.359 0.558 0.999 0.267 -Rbvis 0.188 0.177 0.172 0.174 0.189 0.216 0.262 0.360 0.565 0.999 0.240 -SHGC 0.210 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.360 - - - -Layer ID# 41000 11004 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 41000_COOL-L PLANILUX 4mm PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_SKN154_50/27_#2#5_Ar90 -Window ID : 11502 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.207 0.209 0.203 0.197 0.189 0.174 0.142 0.090 0.033 0.000 0.161 -Abs1 0.412 0.415 0.420 0.422 0.420 0.419 0.419 0.404 0.308 0.001 0.407 -Abs2 0.013 0.013 0.013 0.013 0.014 0.014 0.014 0.013 0.011 0.000 0.013 -Abs3 0.021 0.022 0.025 0.027 0.027 0.028 0.031 0.031 0.018 0.000 0.027 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.347 0.341 0.339 0.341 0.350 0.365 0.393 0.462 0.629 0.999 0.382 -Rbsol 0.355 0.347 0.341 0.340 0.348 0.362 0.386 0.449 0.614 0.999 0.378 -Tvis 0.352 0.355 0.346 0.334 0.321 0.295 0.242 0.153 0.057 0.000 0.274 -Rfvis 0.224 0.216 0.214 0.217 0.228 0.247 0.283 0.367 0.566 0.999 0.269 -Rbvis 0.256 0.246 0.239 0.239 0.250 0.270 0.303 0.382 0.571 0.999 0.290 -SHGC 0.250 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.450 - - - -Layer ID# 11036 11004 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.013 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE SK PLANILUX 4mm PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 0 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 0.00 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - 783 6.71 0.00 0.00 0.00 0.68 0.68 0.72 0.72 0.73 0.73 0.74 0.74 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_SKN165_60/33_#2#5_Ar90 -Window ID : 11503 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.255 0.257 0.250 0.242 0.232 0.213 0.174 0.109 0.040 0.000 0.197 -Abs1 0.375 0.378 0.384 0.387 0.387 0.387 0.392 0.386 0.302 0.001 0.378 -Abs2 0.018 0.018 0.018 0.018 0.019 0.019 0.019 0.018 0.014 0.000 0.018 -Abs3 0.027 0.028 0.031 0.034 0.034 0.036 0.039 0.038 0.022 0.000 0.034 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.325 0.318 0.316 0.319 0.328 0.345 0.376 0.448 0.621 0.999 0.363 -Rbsol 0.330 0.322 0.316 0.316 0.325 0.342 0.371 0.441 0.612 0.999 0.359 -Tvis 0.430 0.435 0.423 0.409 0.392 0.360 0.294 0.185 0.067 0.000 0.334 -Rfvis 0.197 0.188 0.185 0.188 0.201 0.223 0.263 0.353 0.558 0.999 0.246 -Rbvis 0.210 0.200 0.194 0.195 0.208 0.233 0.275 0.367 0.567 0.999 0.255 -SHGC 0.300 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.540 - - - -Layer ID# 11037 11004 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE SK PLANILUX 4mm PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_SKN174_68/41_#2#5_Ar90 -Window ID : 11504 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.316 0.319 0.310 0.300 0.287 0.263 0.214 0.134 0.048 0.000 0.244 -Abs1 0.328 0.331 0.338 0.343 0.344 0.346 0.358 0.365 0.296 0.001 0.341 -Abs2 0.028 0.028 0.028 0.028 0.029 0.030 0.029 0.027 0.022 0.000 0.028 -Abs3 0.037 0.038 0.042 0.045 0.046 0.047 0.050 0.048 0.027 0.000 0.044 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.292 0.284 0.282 0.284 0.295 0.314 0.348 0.426 0.607 0.999 0.333 -Rbsol 0.297 0.288 0.284 0.285 0.296 0.316 0.351 0.430 0.609 0.999 0.335 -Tvis 0.517 0.523 0.509 0.491 0.471 0.432 0.351 0.218 0.078 0.000 0.400 -Rfvis 0.153 0.144 0.140 0.143 0.157 0.183 0.228 0.327 0.542 0.999 0.208 -Rbvis 0.162 0.152 0.147 0.150 0.166 0.195 0.247 0.352 0.563 0.999 0.221 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.610 - - - -Layer ID# 41001 11004 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 41001_COOL-L PLANILUX 4mm PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_KNT155_47/37_#2#5_Ar90 -Window ID : 11505 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.243 0.246 0.239 0.231 0.221 0.203 0.165 0.103 0.037 0.000 0.188 -Abs1 0.487 0.491 0.496 0.500 0.498 0.497 0.501 0.487 0.374 0.001 0.484 -Abs2 0.035 0.035 0.035 0.035 0.036 0.037 0.036 0.032 0.024 0.000 0.034 -Abs3 0.035 0.035 0.038 0.040 0.041 0.041 0.043 0.040 0.022 0.000 0.039 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.201 0.194 0.191 0.194 0.204 0.222 0.256 0.338 0.542 0.999 0.245 -Rbsol 0.275 0.266 0.263 0.265 0.277 0.299 0.338 0.423 0.608 0.999 0.319 -Tvis 0.371 0.375 0.365 0.353 0.338 0.310 0.252 0.157 0.056 0.000 0.287 -Rfvis 0.180 0.172 0.169 0.172 0.184 0.204 0.242 0.330 0.539 0.999 0.228 -Rbvis 0.159 0.148 0.144 0.147 0.163 0.193 0.245 0.351 0.563 0.999 0.218 -SHGC 0.300 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.420 - - - -Layer ID# 11018 11004 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.156 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE KN PLANILUX 4mm PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.80 0.80 0.84 0.84 0.86 0.86 0.88 0.88 - 0 6.71 0.00 0.00 0.00 0.80 0.80 0.84 0.84 0.86 0.86 0.88 0.88 - 783 0.00 0.00 0.00 0.00 0.80 0.80 0.84 0.84 0.86 0.86 0.88 0.88 - 783 6.71 0.00 0.00 0.00 0.80 0.80 0.84 0.84 0.86 0.86 0.88 0.88 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_KNT164_57/46_#2#5_Ar90 -Window ID : 11506 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.304 0.308 0.299 0.289 0.277 0.253 0.206 0.128 0.046 0.000 0.235 -Abs1 0.420 0.423 0.431 0.436 0.436 0.438 0.449 0.450 0.357 0.001 0.429 -Abs2 0.046 0.046 0.047 0.047 0.048 0.049 0.048 0.043 0.032 0.000 0.046 -Abs3 0.045 0.046 0.049 0.052 0.052 0.053 0.055 0.051 0.028 0.000 0.050 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.185 0.177 0.174 0.176 0.187 0.207 0.243 0.329 0.537 0.999 0.230 -Rbsol 0.267 0.258 0.255 0.257 0.270 0.293 0.333 0.421 0.607 0.999 0.313 -Tvis 0.458 0.463 0.451 0.436 0.417 0.382 0.310 0.193 0.069 0.000 0.354 -Rfvis 0.155 0.146 0.142 0.145 0.159 0.182 0.224 0.318 0.534 0.999 0.207 -Rbvis 0.150 0.138 0.134 0.138 0.155 0.185 0.239 0.348 0.562 0.999 0.211 -SHGC 0.380 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.510 - - - -Layer ID# 11409 11004 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.153 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE KN PLANILUX 4mm PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.79 0.79 0.84 0.84 0.86 0.86 0.88 0.88 - 0 6.71 0.00 0.00 0.00 0.79 0.79 0.84 0.84 0.86 0.86 0.88 0.88 - 783 0.00 0.00 0.00 0.00 0.79 0.79 0.84 0.84 0.86 0.86 0.88 0.88 - 783 6.71 0.00 0.00 0.00 0.79 0.79 0.84 0.84 0.86 0.86 0.88 0.88 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_COOL-LITE_KS147_44/29_#2#5_Ar90 -Window ID : 11507 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.210 0.212 0.206 0.200 0.192 0.178 0.147 0.096 0.037 0.000 0.165 -Abs1 0.276 0.279 0.283 0.286 0.286 0.286 0.290 0.287 0.226 0.001 0.279 -Abs2 0.025 0.025 0.025 0.026 0.026 0.027 0.027 0.025 0.020 0.000 0.026 -Abs3 0.028 0.029 0.031 0.033 0.034 0.034 0.037 0.036 0.022 0.000 0.033 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.460 0.455 0.453 0.455 0.462 0.475 0.498 0.556 0.695 0.999 0.487 -Rbsol 0.421 0.415 0.407 0.404 0.408 0.416 0.429 0.473 0.621 0.999 0.428 -Tvis 0.330 0.333 0.324 0.313 0.301 0.279 0.232 0.151 0.059 0.000 0.259 -Rfvis 0.434 0.428 0.426 0.428 0.437 0.451 0.478 0.542 0.688 0.999 0.465 -Rbvis 0.377 0.369 0.359 0.354 0.359 0.368 0.380 0.425 0.583 0.999 0.381 -SHGC 0.260 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.390 - - - -Layer ID# 11049 11004 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.036 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE KS PLANILUX 4mm PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ANTELIO_silver_#3#5_Ar90 -Window ID : 11508 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.309 0.313 0.301 0.287 0.273 0.249 0.198 0.118 0.040 0.000 0.231 -Abs1 0.172 0.174 0.185 0.193 0.197 0.205 0.229 0.259 0.232 0.001 0.207 -Abs2 0.092 0.093 0.098 0.101 0.102 0.105 0.111 0.112 0.081 0.000 0.102 -Abs3 0.046 0.047 0.050 0.052 0.052 0.052 0.054 0.047 0.025 0.000 0.049 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.382 0.373 0.367 0.367 0.375 0.389 0.409 0.464 0.623 0.999 0.401 -Rbsol 0.346 0.336 0.328 0.326 0.335 0.349 0.367 0.425 0.599 0.999 0.363 -Tvis 0.461 0.467 0.449 0.429 0.408 0.371 0.295 0.174 0.058 0.000 0.345 -Rfvis 0.358 0.348 0.344 0.347 0.359 0.379 0.410 0.481 0.648 0.999 0.393 -Rbvis 0.270 0.257 0.245 0.242 0.252 0.267 0.286 0.349 0.545 0.999 0.283 -SHGC 0.410 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.530 - - - -Layer ID# 11047 11333 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.037 0.037 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File ANTELIO SILV PLT ULTRA N PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ANTELIO_green_#3#5_Ar90 -Window ID : 11509 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.200 0.203 0.195 0.186 0.177 0.160 0.127 0.075 0.024 0.000 0.149 -Abs1 0.489 0.492 0.497 0.499 0.498 0.495 0.493 0.471 0.355 0.001 0.480 -Abs2 0.039 0.040 0.043 0.045 0.046 0.048 0.053 0.057 0.042 0.000 0.047 -Abs3 0.023 0.024 0.026 0.028 0.028 0.028 0.030 0.027 0.014 0.000 0.027 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.250 0.242 0.239 0.242 0.252 0.268 0.297 0.371 0.564 0.999 0.287 -Rbsol 0.309 0.298 0.292 0.292 0.304 0.321 0.347 0.416 0.597 0.999 0.337 -Tvis 0.329 0.334 0.321 0.307 0.291 0.264 0.209 0.122 0.040 0.000 0.245 -Rfvis 0.306 0.298 0.295 0.298 0.309 0.326 0.356 0.428 0.607 0.999 0.343 -Rbvis 0.208 0.194 0.185 0.185 0.199 0.221 0.253 0.334 0.542 0.999 0.241 -SHGC 0.260 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.430 - - - -Layer ID# 11108 11333 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.037 0.037 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File ANTELIO EMER PLT ULTRA N PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ANTELIO_neut_#3#5_Ar90 -Window ID : 11510 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.222 0.226 0.217 0.207 0.197 0.179 0.142 0.085 0.028 0.000 0.166 -Abs1 0.299 0.301 0.309 0.315 0.317 0.321 0.335 0.344 0.281 0.001 0.316 -Abs2 0.077 0.078 0.081 0.084 0.084 0.086 0.090 0.089 0.062 0.000 0.083 -Abs3 0.036 0.037 0.039 0.040 0.040 0.040 0.041 0.035 0.018 0.000 0.038 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.367 0.360 0.354 0.354 0.362 0.374 0.392 0.447 0.610 0.999 0.387 -Rbsol 0.332 0.322 0.314 0.313 0.323 0.338 0.359 0.422 0.598 0.999 0.353 -Tvis 0.318 0.323 0.310 0.296 0.282 0.256 0.203 0.120 0.039 0.000 0.238 -Rfvis 0.332 0.324 0.321 0.324 0.334 0.350 0.378 0.447 0.620 0.999 0.366 -Rbvis 0.244 0.231 0.220 0.218 0.230 0.248 0.272 0.343 0.544 0.999 0.266 -SHGC 0.310 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.370 - - - -Layer ID# 11048 11333 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.037 0.037 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File ANTELIO CLEA PLT ULTRA N PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ANTELIO_bronze_#3#5_Ar90 -Window ID : 11511 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.120 0.122 0.117 0.112 0.106 0.096 0.076 0.045 0.015 0.000 0.090 -Abs1 0.511 0.514 0.519 0.520 0.518 0.514 0.509 0.481 0.357 0.001 0.497 -Abs2 0.044 0.045 0.047 0.048 0.048 0.049 0.051 0.050 0.034 0.000 0.047 -Abs3 0.020 0.021 0.022 0.022 0.022 0.022 0.022 0.019 0.010 0.000 0.021 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.305 0.299 0.296 0.297 0.305 0.318 0.341 0.405 0.584 0.999 0.335 -Rbsol 0.289 0.278 0.272 0.274 0.287 0.307 0.337 0.411 0.596 0.999 0.323 -Tvis 0.170 0.173 0.166 0.159 0.151 0.136 0.108 0.063 0.020 0.000 0.127 -Rfvis 0.314 0.307 0.305 0.308 0.316 0.330 0.357 0.424 0.601 0.999 0.348 -Rbvis 0.172 0.157 0.149 0.152 0.169 0.195 0.234 0.325 0.540 0.999 0.216 -SHGC 0.180 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.190 - - - -Layer ID# 11103 11333 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.037 0.037 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File ANTELIO BRON PLT ULTRA N PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ST120_#3#5_Ar90 -Window ID : 11512 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.094 0.095 0.092 0.087 0.083 0.076 0.060 0.036 0.012 0.000 0.070 -Abs1 0.543 0.547 0.550 0.550 0.546 0.539 0.527 0.487 0.352 0.001 0.519 -Abs2 0.024 0.024 0.026 0.027 0.027 0.028 0.030 0.031 0.023 0.000 0.027 -Abs3 0.013 0.013 0.014 0.015 0.015 0.015 0.015 0.014 0.007 0.000 0.014 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.326 0.321 0.319 0.321 0.329 0.342 0.367 0.432 0.606 0.999 0.359 -Rbsol 0.353 0.344 0.335 0.333 0.341 0.354 0.371 0.427 0.599 0.999 0.368 -Tvis 0.146 0.148 0.142 0.136 0.129 0.117 0.093 0.055 0.018 0.000 0.109 -Rfvis 0.270 0.264 0.262 0.265 0.273 0.288 0.316 0.387 0.575 0.999 0.307 -Rbvis 0.280 0.267 0.254 0.250 0.260 0.274 0.291 0.351 0.545 0.999 0.290 -SHGC 0.130 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.160 - - - -Layer ID# 11034 11333 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.647 0.037 0.037 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE ST PLT ULTRA N PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ST150_#3#5_Ar90 -Window ID : 11513 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.233 0.236 0.227 0.217 0.206 0.187 0.148 0.087 0.029 0.000 0.174 -Abs1 0.437 0.440 0.447 0.451 0.451 0.452 0.457 0.448 0.349 0.001 0.440 -Abs2 0.064 0.064 0.068 0.071 0.072 0.073 0.079 0.080 0.057 0.000 0.071 -Abs3 0.033 0.034 0.036 0.038 0.038 0.038 0.039 0.034 0.018 0.000 0.036 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.234 0.226 0.222 0.223 0.233 0.250 0.277 0.350 0.547 0.999 0.269 -Rbsol 0.313 0.303 0.296 0.297 0.308 0.324 0.350 0.417 0.597 0.999 0.340 -Tvis 0.354 0.360 0.346 0.330 0.314 0.285 0.225 0.132 0.043 0.000 0.265 -Rfvis 0.197 0.188 0.185 0.188 0.200 0.220 0.254 0.337 0.544 0.999 0.241 -Rbvis 0.214 0.200 0.190 0.190 0.204 0.226 0.256 0.335 0.542 0.999 0.245 -SHGC 0.310 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.410 - - - -Layer ID# 11042 11333 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.811 0.037 0.037 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE ST PLT ULTRA N PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ST450_#3#5_Ar90 -Window ID : 11514 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.155 0.158 0.151 0.145 0.137 0.124 0.098 0.057 0.019 0.000 0.116 -Abs1 0.622 0.626 0.630 0.631 0.627 0.621 0.611 0.570 0.417 0.001 0.599 -Abs2 0.027 0.028 0.030 0.032 0.033 0.035 0.039 0.042 0.031 0.000 0.034 -Abs3 0.017 0.017 0.019 0.020 0.021 0.021 0.022 0.020 0.011 0.000 0.020 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.179 0.171 0.169 0.172 0.182 0.199 0.230 0.311 0.522 0.999 0.221 -Rbsol 0.295 0.284 0.278 0.280 0.292 0.311 0.340 0.413 0.596 0.999 0.327 -Tvis 0.259 0.263 0.253 0.241 0.229 0.208 0.164 0.096 0.031 0.000 0.193 -Rfvis 0.177 0.169 0.166 0.169 0.181 0.199 0.232 0.315 0.526 0.999 0.221 -Rbvis 0.183 0.169 0.161 0.163 0.179 0.203 0.240 0.328 0.541 0.999 0.224 -SHGC 0.200 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.330 - - - -Layer ID# 11274 11333 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.811 0.037 0.037 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE ST PLT ULTRA N PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_UltraN_ST167_#3#5_Ar90 -Window ID : 11515 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.307 0.311 0.299 0.286 0.272 0.247 0.195 0.115 0.038 0.000 0.229 -Abs1 0.278 0.280 0.290 0.298 0.301 0.307 0.327 0.346 0.292 0.001 0.304 -Abs2 0.088 0.089 0.094 0.098 0.099 0.101 0.108 0.108 0.077 0.000 0.098 -Abs3 0.044 0.046 0.049 0.051 0.051 0.051 0.052 0.046 0.024 0.000 0.048 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.283 0.273 0.267 0.268 0.278 0.294 0.318 0.384 0.569 0.999 0.310 -Rbsol 0.313 0.302 0.296 0.296 0.307 0.324 0.350 0.417 0.597 0.999 0.340 -Tvis 0.462 0.469 0.451 0.430 0.409 0.371 0.293 0.172 0.056 0.000 0.345 -Rfvis 0.233 0.222 0.217 0.221 0.234 0.256 0.292 0.375 0.574 0.999 0.276 -Rbvis 0.213 0.199 0.190 0.190 0.204 0.225 0.256 0.335 0.542 0.999 0.244 -SHGC 0.390 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.520 - - - -Layer ID# 11249 11333 11333 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.821 0.037 0.037 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE ST PLT ULTRA N PLT ULTRA N None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ANTELIO_silver_#3#5_Ar90 -Window ID : 11516 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.243 0.246 0.236 0.226 0.216 0.197 0.158 0.096 0.034 0.000 0.183 -Abs1 0.195 0.197 0.209 0.217 0.221 0.229 0.253 0.280 0.244 0.001 0.230 -Abs2 0.061 0.063 0.067 0.071 0.072 0.075 0.082 0.087 0.064 0.000 0.073 -Abs3 0.025 0.026 0.029 0.031 0.031 0.032 0.035 0.033 0.019 0.000 0.031 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.475 0.468 0.459 0.455 0.460 0.466 0.472 0.504 0.639 0.999 0.473 -Rbsol 0.481 0.474 0.467 0.465 0.472 0.481 0.493 0.535 0.672 0.999 0.489 -Tvis 0.381 0.386 0.370 0.354 0.337 0.308 0.246 0.149 0.052 0.000 0.286 -Rfvis 0.455 0.447 0.439 0.438 0.445 0.457 0.471 0.518 0.661 0.999 0.466 -Rbvis 0.405 0.396 0.385 0.382 0.389 0.400 0.411 0.457 0.615 0.999 0.410 -SHGC 0.310 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.450 - - - -Layer ID# 11047 11393 11393 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.013 0.013 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File ANTELIO SILV PLANITHERM O PLANITHERM O None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 0 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ANTELIO_green_#3#5_Ar90 -Window ID : 11517 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.158 0.160 0.154 0.147 0.140 0.128 0.102 0.061 0.021 0.000 0.119 -Abs1 0.521 0.525 0.530 0.532 0.529 0.525 0.519 0.490 0.364 0.001 0.508 -Abs2 0.027 0.028 0.031 0.033 0.034 0.036 0.042 0.046 0.035 0.000 0.036 -Abs3 0.014 0.014 0.016 0.017 0.018 0.019 0.021 0.020 0.011 0.000 0.018 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.280 0.273 0.269 0.271 0.279 0.293 0.316 0.383 0.569 0.999 0.310 -Rbsol 0.458 0.450 0.445 0.444 0.452 0.463 0.480 0.529 0.670 0.999 0.473 -Tvis 0.265 0.269 0.258 0.246 0.235 0.214 0.171 0.102 0.035 0.000 0.199 -Rfvis 0.353 0.345 0.341 0.342 0.350 0.363 0.385 0.445 0.613 0.999 0.378 -Rbvis 0.366 0.355 0.347 0.346 0.356 0.370 0.390 0.446 0.612 0.999 0.383 -SHGC 0.210 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.360 - - - -Layer ID# 11108 11393 11393 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.013 0.013 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File ANTELIO EMER PLANITHERM O PLANITHERM O None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 0 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ANTELIO_neut_#3#5_Ar90 -Window ID : 11518 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.172 0.174 0.167 0.160 0.153 0.140 0.112 0.068 0.024 0.000 0.130 -Abs1 0.333 0.336 0.344 0.350 0.351 0.354 0.365 0.369 0.294 0.001 0.347 -Abs2 0.049 0.050 0.053 0.056 0.056 0.058 0.063 0.065 0.048 0.000 0.057 -Abs3 0.019 0.019 0.021 0.023 0.023 0.024 0.025 0.024 0.013 0.000 0.022 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.427 0.421 0.414 0.412 0.417 0.424 0.434 0.474 0.621 0.999 0.434 -Rbsol 0.473 0.465 0.459 0.458 0.464 0.474 0.488 0.533 0.671 0.999 0.484 -Tvis 0.262 0.265 0.254 0.243 0.232 0.212 0.169 0.102 0.035 0.000 0.196 -Rfvis 0.379 0.372 0.368 0.368 0.376 0.388 0.408 0.465 0.626 0.999 0.402 -Rbvis 0.390 0.380 0.371 0.368 0.377 0.388 0.403 0.453 0.614 0.999 0.400 -SHGC 0.230 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.310 - - - -Layer ID# 11048 11393 11393 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.013 0.013 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File ANTELIO CLEA PLANITHERM O PLANITHERM O None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 0 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ANTELIO_bronze_#3#5_Ar90 -Window ID : 11519 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.091 0.092 0.088 0.084 0.080 0.073 0.059 0.035 0.012 0.000 0.068 -Abs1 0.547 0.552 0.556 0.557 0.553 0.547 0.538 0.502 0.368 0.001 0.528 -Abs2 0.026 0.027 0.029 0.030 0.030 0.031 0.034 0.035 0.025 0.000 0.030 -Abs3 0.010 0.010 0.011 0.012 0.012 0.013 0.013 0.013 0.007 0.000 0.012 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.325 0.319 0.316 0.317 0.324 0.335 0.356 0.415 0.588 0.999 0.351 -Rbsol 0.446 0.438 0.433 0.433 0.442 0.454 0.474 0.526 0.670 0.999 0.465 -Tvis 0.137 0.139 0.133 0.127 0.121 0.111 0.088 0.053 0.018 0.000 0.103 -Rfvis 0.328 0.322 0.320 0.322 0.329 0.342 0.366 0.430 0.603 0.999 0.359 -Rbvis 0.344 0.333 0.326 0.326 0.337 0.354 0.378 0.441 0.611 0.999 0.368 -SHGC 0.140 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.160 - - - -Layer ID# 11103 11393 11393 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.013 0.013 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File ANTELIO BRON PLANITHERM O PLANITHERM O None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 0 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ST120_#3#5_Ar90 -Window ID : 11520 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.075 0.075 0.072 0.069 0.066 0.060 0.048 0.029 0.010 0.000 0.056 -Abs1 0.566 0.571 0.573 0.573 0.568 0.560 0.545 0.500 0.358 0.001 0.538 -Abs2 0.017 0.018 0.019 0.020 0.021 0.022 0.024 0.025 0.019 0.000 0.021 -Abs3 0.008 0.008 0.009 0.009 0.009 0.010 0.011 0.010 0.006 0.000 0.009 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.334 0.328 0.327 0.328 0.336 0.349 0.372 0.436 0.607 0.999 0.365 -Rbsol 0.487 0.480 0.472 0.470 0.476 0.485 0.496 0.537 0.672 0.999 0.493 -Tvis 0.120 0.121 0.116 0.111 0.106 0.097 0.077 0.047 0.016 0.000 0.090 -Rfvis 0.280 0.273 0.272 0.274 0.282 0.296 0.322 0.391 0.577 0.999 0.314 -Rbvis 0.414 0.404 0.393 0.390 0.396 0.406 0.416 0.459 0.615 0.999 0.416 -SHGC 0.110 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.130 - - - -Layer ID# 11034 11393 11393 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.647 0.013 0.013 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE ST PLANITHERM O PLANITHERM O None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 0 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ST150_#3#5_Ar90 -Window ID : 11521 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.180 0.182 0.175 0.167 0.159 0.146 0.116 0.070 0.024 0.000 0.135 -Abs1 0.477 0.481 0.488 0.491 0.490 0.489 0.490 0.474 0.362 0.001 0.475 -Abs2 0.043 0.044 0.048 0.050 0.051 0.053 0.059 0.062 0.046 0.000 0.052 -Abs3 0.018 0.019 0.021 0.023 0.023 0.024 0.026 0.024 0.014 0.000 0.022 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.281 0.274 0.269 0.269 0.276 0.289 0.309 0.370 0.555 0.999 0.306 -Rbsol 0.460 0.452 0.447 0.446 0.454 0.465 0.481 0.530 0.670 0.999 0.475 -Tvis 0.285 0.289 0.277 0.265 0.252 0.230 0.184 0.110 0.038 0.000 0.214 -Rfvis 0.253 0.244 0.239 0.240 0.249 0.264 0.288 0.357 0.551 0.999 0.282 -Rbvis 0.368 0.358 0.350 0.348 0.358 0.372 0.391 0.447 0.612 0.999 0.385 -SHGC 0.230 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.330 - - - -Layer ID# 11042 11393 11393 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.811 0.013 0.013 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE ST PLANITHERM O PLANITHERM O None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 0 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ST450_#3#5_Ar90 -Window ID : 11522 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.122 0.123 0.118 0.113 0.108 0.098 0.078 0.047 0.016 0.000 0.091 -Abs1 0.652 0.657 0.661 0.661 0.656 0.648 0.634 0.586 0.425 0.001 0.624 -Abs2 0.020 0.020 0.022 0.024 0.025 0.027 0.031 0.034 0.026 0.000 0.026 -Abs3 0.010 0.011 0.012 0.013 0.013 0.014 0.016 0.015 0.008 0.000 0.013 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.197 0.189 0.187 0.189 0.198 0.213 0.242 0.318 0.525 0.999 0.235 -Rbsol 0.449 0.441 0.436 0.436 0.444 0.457 0.475 0.527 0.670 0.999 0.467 -Tvis 0.206 0.208 0.200 0.191 0.182 0.166 0.132 0.079 0.027 0.000 0.154 -Rfvis 0.206 0.198 0.195 0.197 0.206 0.222 0.250 0.325 0.530 0.999 0.243 -Rbvis 0.350 0.339 0.332 0.332 0.342 0.358 0.381 0.442 0.611 0.999 0.372 -SHGC 0.160 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.270 - - - -Layer ID# 11274 11393 11393 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.811 0.013 0.013 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE ST PLANITHERM O PLANITHERM O None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 0 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : SG_ONE_ST167_#3#5_Ar90 -Window ID : 11523 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.237 0.240 0.230 0.220 0.210 0.192 0.153 0.092 0.032 0.000 0.178 -Abs1 0.310 0.313 0.324 0.331 0.334 0.339 0.357 0.371 0.306 0.001 0.335 -Abs2 0.059 0.060 0.065 0.068 0.070 0.072 0.080 0.083 0.061 0.000 0.071 -Abs3 0.025 0.025 0.028 0.030 0.031 0.032 0.034 0.032 0.018 0.000 0.030 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.369 0.361 0.353 0.350 0.356 0.365 0.376 0.421 0.583 0.999 0.377 -Rbsol 0.460 0.452 0.447 0.446 0.454 0.465 0.481 0.530 0.670 0.999 0.475 -Tvis 0.372 0.377 0.362 0.346 0.330 0.301 0.240 0.144 0.049 0.000 0.279 -Rfvis 0.327 0.318 0.311 0.310 0.319 0.332 0.352 0.410 0.585 0.999 0.347 -Rbvis 0.368 0.358 0.350 0.348 0.358 0.372 0.391 0.447 0.612 0.999 0.385 -SHGC 0.300 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.430 - - - -Layer ID# 11249 11393 11393 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.821 0.013 0.013 0 0 0 -Emis B 0.837 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File COOL-LITE ST PLANITHERM O PLANITHERM O None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 0 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 0.00 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - 783 6.71 0.00 0.00 0.00 0.66 0.66 0.69 0.69 0.70 0.70 0.72 0.72 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_ENplus_#3_AIR -Window ID : 14200 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Air 16.0 0.02407 7.760 1.722 4.940 1.276 -0.0045 0.720 -0.0002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.542 0.545 0.538 0.527 0.513 0.486 0.426 0.312 0.146 0.000 0.452 -Abs1 0.093 0.093 0.095 0.097 0.101 0.106 0.110 0.113 0.110 0.000 0.102 -Abs2 0.087 0.088 0.096 0.102 0.104 0.108 0.120 0.128 0.092 0.000 0.106 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.278 0.273 0.272 0.273 0.281 0.300 0.344 0.447 0.652 1.000 0.329 -Rbsol 0.275 0.270 0.267 0.270 0.280 0.299 0.336 0.421 0.610 0.999 0.321 -Tvis 0.741 0.745 0.735 0.721 0.703 0.665 0.583 0.424 0.198 0.000 0.618 -Rfvis 0.152 0.146 0.145 0.149 0.162 0.190 0.251 0.388 0.647 1.000 0.228 -Rbvis 0.154 0.148 0.145 0.148 0.160 0.184 0.231 0.335 0.556 0.999 0.212 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 44007 44066 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 44007_GT_EUR 44066_GT_ENp None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.61 1.61 1.36 1.36 1.39 1.39 1.42 1.42 - 0 6.71 0.00 0.00 0.00 1.61 1.61 1.36 1.36 1.39 1.39 1.42 1.42 - 783 0.00 0.00 0.00 0.00 1.61 1.61 1.36 1.36 1.39 1.39 1.42 1.42 - 783 6.71 0.00 0.00 0.00 1.61 1.61 1.36 1.36 1.39 1.39 1.42 1.42 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_ENplus_#3_AR90 -Window ID : 14201 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.542 0.545 0.538 0.527 0.513 0.486 0.426 0.312 0.146 0.000 0.452 -Abs1 0.093 0.093 0.095 0.097 0.101 0.106 0.110 0.113 0.110 0.000 0.102 -Abs2 0.087 0.088 0.096 0.102 0.104 0.108 0.120 0.128 0.092 0.000 0.106 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.278 0.273 0.272 0.273 0.281 0.300 0.344 0.447 0.652 1.000 0.329 -Rbsol 0.275 0.270 0.267 0.270 0.280 0.299 0.336 0.421 0.610 0.999 0.321 -Tvis 0.741 0.745 0.735 0.721 0.703 0.665 0.583 0.424 0.198 0.000 0.618 -Rfvis 0.152 0.146 0.145 0.149 0.162 0.190 0.251 0.388 0.647 1.000 0.228 -Rbvis 0.154 0.148 0.145 0.148 0.160 0.184 0.231 0.335 0.556 0.999 0.212 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 44007 44066 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 44007_GT_EUR 44066_GT_ENp None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_ENplus_#3_KR90 -Window ID : 14202 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.542 0.545 0.538 0.527 0.513 0.486 0.426 0.312 0.146 0.000 0.452 -Abs1 0.093 0.093 0.095 0.097 0.101 0.106 0.110 0.113 0.110 0.000 0.102 -Abs2 0.087 0.088 0.096 0.102 0.104 0.108 0.120 0.128 0.092 0.000 0.106 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.278 0.273 0.272 0.273 0.281 0.300 0.344 0.447 0.652 1.000 0.329 -Rbsol 0.275 0.270 0.267 0.270 0.280 0.299 0.336 0.421 0.610 0.999 0.321 -Tvis 0.741 0.745 0.735 0.721 0.703 0.665 0.583 0.424 0.198 0.000 0.618 -Rfvis 0.152 0.146 0.145 0.149 0.162 0.190 0.251 0.388 0.647 1.000 0.228 -Rbvis 0.154 0.148 0.145 0.148 0.160 0.184 0.231 0.335 0.556 0.999 0.212 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.800 - - - -Layer ID# 44007 44066 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 44007_GT_EUR 44066_GT_ENp None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.09 1.09 - 0 6.71 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.09 1.09 - 783 0.00 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.09 1.09 - 783 6.71 0.00 0.00 0.00 1.27 1.27 1.05 1.05 1.07 1.07 1.09 1.09 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_ZERO_#3_AR90 -Window ID : 14203 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.425 0.427 0.421 0.413 0.403 0.382 0.337 0.249 0.120 0.000 0.356 -Abs1 0.104 0.104 0.106 0.109 0.113 0.118 0.122 0.124 0.118 0.000 0.114 -Abs2 0.077 0.078 0.084 0.089 0.090 0.093 0.103 0.109 0.079 0.000 0.092 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.395 0.390 0.389 0.389 0.394 0.407 0.438 0.517 0.683 1.000 0.428 -Rbsol 0.394 0.389 0.387 0.389 0.397 0.412 0.442 0.510 0.669 0.999 0.428 -Tvis 0.622 0.626 0.617 0.606 0.591 0.561 0.493 0.363 0.173 0.000 0.522 -Rfvis 0.258 0.253 0.251 0.254 0.265 0.287 0.336 0.450 0.673 1.000 0.318 -Rbvis 0.260 0.254 0.252 0.254 0.265 0.285 0.323 0.411 0.606 0.999 0.307 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 44007 44198 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.012 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 44007_GT_EUR 44198_GT_ZER None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_ZERO_#3_KR90 -Window ID : 14204 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.425 0.427 0.421 0.413 0.403 0.382 0.337 0.249 0.120 0.000 0.356 -Abs1 0.104 0.104 0.106 0.109 0.113 0.118 0.122 0.124 0.118 0.000 0.114 -Abs2 0.077 0.078 0.084 0.089 0.090 0.093 0.103 0.109 0.079 0.000 0.092 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.395 0.390 0.389 0.389 0.394 0.407 0.438 0.517 0.683 1.000 0.428 -Rbsol 0.394 0.389 0.387 0.389 0.397 0.412 0.442 0.510 0.669 0.999 0.428 -Tvis 0.622 0.626 0.617 0.606 0.591 0.561 0.493 0.363 0.173 0.000 0.522 -Rfvis 0.258 0.253 0.251 0.254 0.265 0.287 0.336 0.450 0.673 1.000 0.318 -Rbvis 0.260 0.254 0.252 0.254 0.265 0.285 0.323 0.411 0.606 0.999 0.307 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 44007 44198 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.012 0 0 0 0 -Emis B 0.837 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 44007_GT_EUR 44198_GT_ZER None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.21 1.21 0.95 0.95 0.97 0.97 0.99 0.99 - 0 6.71 0.00 0.00 0.00 1.21 1.21 0.95 0.95 0.97 0.97 0.99 0.99 - 783 0.00 0.00 0.00 0.00 1.21 1.21 0.95 0.95 0.97 0.97 0.99 0.99 - 783 6.71 0.00 0.00 0.00 1.21 1.21 0.95 0.95 0.97 0.97 0.99 0.99 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_FREEVISIONT_#3_AR90 -Window ID : 14205 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.424 0.427 0.421 0.413 0.402 0.381 0.336 0.248 0.118 0.000 0.355 -Abs1 0.163 0.162 0.165 0.168 0.174 0.180 0.185 0.185 0.169 0.000 0.173 -Abs2 0.074 0.075 0.081 0.086 0.087 0.090 0.100 0.106 0.077 0.000 0.089 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.339 0.335 0.333 0.333 0.337 0.349 0.380 0.461 0.637 1.000 0.373 -Rbsol 0.385 0.381 0.380 0.382 0.390 0.405 0.435 0.506 0.667 0.999 0.422 -Tvis 0.628 0.632 0.623 0.611 0.596 0.565 0.497 0.366 0.173 0.000 0.526 -Rfvis 0.236 0.231 0.230 0.232 0.242 0.263 0.311 0.425 0.651 1.000 0.295 -Rbvis 0.246 0.241 0.240 0.242 0.253 0.273 0.313 0.403 0.602 0.999 0.297 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.720 - - - -Layer ID# 44858 44198 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.012 0 0 0 0 -Emis B 0.220 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 44858_GT_FRE 44198_GT_ZER None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_FREEVISIONT_#3_KR90 -Window ID : 14206 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 10.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.424 0.427 0.421 0.413 0.402 0.381 0.336 0.248 0.118 0.000 0.355 -Abs1 0.163 0.162 0.165 0.168 0.174 0.180 0.185 0.185 0.169 0.000 0.173 -Abs2 0.074 0.075 0.081 0.086 0.087 0.090 0.100 0.106 0.077 0.000 0.089 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.339 0.335 0.333 0.333 0.337 0.349 0.380 0.461 0.637 1.000 0.373 -Rbsol 0.385 0.381 0.380 0.382 0.390 0.405 0.435 0.506 0.667 0.999 0.422 -Tvis 0.628 0.632 0.623 0.611 0.596 0.565 0.497 0.366 0.173 0.000 0.526 -Rfvis 0.236 0.231 0.230 0.232 0.242 0.263 0.311 0.425 0.651 1.000 0.295 -Rbvis 0.246 0.241 0.240 0.242 0.253 0.273 0.313 0.403 0.602 0.999 0.297 -SHGC 0.500 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.720 - - - -Layer ID# 44858 44198 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.012 0 0 0 0 -Emis B 0.220 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 44858_GT_FRE 44198_GT_ZER None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.21 1.21 0.95 0.95 0.97 0.97 0.99 0.99 - 0 6.71 0.00 0.00 0.00 1.21 1.21 0.95 0.95 0.97 0.97 0.99 0.99 - 783 0.00 0.00 0.00 0.00 1.21 1.21 0.95 0.95 0.97 0.97 0.99 0.99 - 783 6.71 0.00 0.00 0.00 1.21 1.21 0.95 0.95 0.97 0.97 0.99 0.99 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_SELEKT_#3_AR90 -Window ID : 14207 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Air 16.0 0.02407 7.760 1.722 4.940 1.276 -0.0045 0.720 -0.0002 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.396 0.399 0.393 0.386 0.376 0.356 0.312 0.228 0.107 0.000 0.331 -Abs1 0.281 0.285 0.292 0.297 0.297 0.300 0.312 0.321 0.265 0.001 0.296 -Abs2 0.015 0.016 0.016 0.016 0.016 0.016 0.016 0.014 0.011 0.000 0.015 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.307 0.301 0.300 0.302 0.311 0.327 0.360 0.437 0.617 0.999 0.347 -Rbsol 0.350 0.345 0.344 0.344 0.350 0.366 0.402 0.492 0.673 1.000 0.391 -Tvis 0.633 0.637 0.628 0.616 0.601 0.569 0.498 0.363 0.169 0.000 0.529 -Rfvis 0.145 0.138 0.136 0.138 0.150 0.172 0.216 0.315 0.538 0.999 0.200 -Rbvis 0.161 0.155 0.154 0.157 0.170 0.198 0.257 0.393 0.649 1.000 0.235 -SHGC 0.420 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.720 - - - -Layer ID# 44550 44007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 44550_GT_SEL 44007_GT_EUR None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.61 1.61 1.36 1.36 1.39 1.39 1.42 1.42 - 0 6.71 0.00 0.00 0.00 1.61 1.61 1.36 1.36 1.39 1.39 1.42 1.42 - 783 0.00 0.00 0.00 0.00 1.61 1.61 1.36 1.36 1.39 1.39 1.42 1.42 - 783 6.71 0.00 0.00 0.00 1.61 1.61 1.36 1.36 1.39 1.39 1.42 1.42 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_SELEKT_#3_KR90 -Window ID : 14208 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.396 0.399 0.393 0.386 0.376 0.356 0.312 0.228 0.107 0.000 0.331 -Abs1 0.281 0.285 0.292 0.297 0.297 0.300 0.312 0.321 0.265 0.001 0.296 -Abs2 0.015 0.016 0.016 0.016 0.016 0.016 0.016 0.014 0.011 0.000 0.015 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.307 0.301 0.300 0.302 0.311 0.327 0.360 0.437 0.617 0.999 0.347 -Rbsol 0.350 0.345 0.344 0.344 0.350 0.366 0.402 0.492 0.673 1.000 0.391 -Tvis 0.633 0.637 0.628 0.616 0.601 0.569 0.498 0.363 0.169 0.000 0.529 -Rfvis 0.145 0.138 0.136 0.138 0.150 0.172 0.216 0.315 0.538 0.999 0.200 -Rbvis 0.161 0.155 0.154 0.157 0.170 0.198 0.257 0.393 0.649 1.000 0.235 -SHGC 0.420 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.730 - - - -Layer ID# 44550 44007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 4.0 4.0 0 0 0 0 -Cond(W/m2-K )250.0 250.0 0 0 0 0 -Spectral File 44550_GT_SEL 44007_GT_EUR None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.11 1.11 1.13 1.13 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_PLUS_ENplus_#2#5_AR90 -Window ID : 14300 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.418 0.422 0.410 0.397 0.380 0.349 0.285 0.180 0.066 0.000 0.324 -Abs1 0.161 0.163 0.173 0.181 0.185 0.193 0.218 0.254 0.234 0.001 0.197 -Abs2 0.045 0.045 0.045 0.046 0.047 0.048 0.047 0.043 0.033 0.000 0.045 -Abs3 0.054 0.056 0.061 0.065 0.065 0.067 0.071 0.068 0.039 0.000 0.063 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.323 0.314 0.310 0.312 0.323 0.343 0.378 0.456 0.629 0.999 0.361 -Rbsol 0.323 0.314 0.310 0.312 0.323 0.343 0.378 0.456 0.629 0.999 0.361 -Tvis 0.625 0.632 0.615 0.595 0.570 0.524 0.427 0.268 0.098 0.000 0.485 -Rfvis 0.202 0.191 0.186 0.189 0.205 0.232 0.280 0.380 0.582 0.999 0.256 -Rbvis 0.202 0.191 0.186 0.189 0.205 0.232 0.280 0.380 0.582 0.999 0.256 -SHGC 0.490 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.700 - - - -Layer ID# 44066 44007 44066 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 44066_GT_ENp 44007_GT_EUR 44066_GT_ENp None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 0 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 0.00 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - 783 6.71 0.00 0.00 0.00 0.70 0.70 0.74 0.74 0.76 0.76 0.77 0.77 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_PLUS_ENplus_#2#5_KR90 -Window ID : 14301 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.418 0.422 0.410 0.397 0.380 0.349 0.285 0.180 0.066 0.000 0.324 -Abs1 0.161 0.163 0.173 0.181 0.185 0.193 0.218 0.254 0.234 0.001 0.197 -Abs2 0.045 0.045 0.045 0.046 0.047 0.048 0.047 0.043 0.033 0.000 0.045 -Abs3 0.054 0.056 0.061 0.065 0.065 0.067 0.071 0.068 0.039 0.000 0.063 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.323 0.314 0.310 0.312 0.323 0.343 0.378 0.456 0.629 0.999 0.361 -Rbsol 0.323 0.314 0.310 0.312 0.323 0.343 0.378 0.456 0.629 0.999 0.361 -Tvis 0.625 0.632 0.615 0.595 0.570 0.524 0.427 0.268 0.098 0.000 0.485 -Rfvis 0.202 0.191 0.186 0.189 0.205 0.232 0.280 0.380 0.582 0.999 0.256 -Rbvis 0.202 0.191 0.186 0.189 0.205 0.232 0.280 0.380 0.582 0.999 0.256 -SHGC 0.490 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.700 - - - -Layer ID# 44066 44007 44066 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.037 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 44066_GT_ENp 44007_GT_EUR 44066_GT_ENp None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 0 6.71 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 783 0.00 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - 783 6.71 0.00 0.00 0.00 0.62 0.62 0.50 0.50 0.52 0.52 0.53 0.53 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_PLUS_ZERO_#2#5_AR90 -Window ID : 14302 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.290 0.293 0.285 0.276 0.265 0.245 0.202 0.130 0.050 0.000 0.227 -Abs1 0.173 0.175 0.183 0.189 0.191 0.197 0.214 0.236 0.206 0.001 0.197 -Abs2 0.039 0.039 0.039 0.039 0.040 0.041 0.040 0.036 0.027 0.000 0.038 -Abs3 0.044 0.045 0.048 0.051 0.051 0.052 0.055 0.052 0.031 0.000 0.049 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.455 0.449 0.445 0.445 0.453 0.466 0.489 0.546 0.686 0.999 0.478 -Rbsol 0.455 0.449 0.445 0.445 0.453 0.466 0.489 0.546 0.686 0.999 0.478 -Tvis 0.462 0.466 0.454 0.439 0.422 0.390 0.322 0.207 0.079 0.000 0.361 -Rfvis 0.343 0.335 0.330 0.331 0.341 0.359 0.391 0.463 0.631 0.999 0.376 -Rbvis 0.343 0.335 0.330 0.331 0.341 0.359 0.391 0.463 0.631 0.999 0.376 -SHGC 0.350 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.570 - - - -Layer ID# 44198 44007 44198 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.012 0 0 0 -Emis B 0.012 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 44198_GT_ZER 44007_GT_EUR 44198_GT_ZER None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.62 0.62 0.54 0.54 0.55 0.55 0.56 0.56 - 0 6.71 0.00 0.00 0.00 0.62 0.62 0.54 0.54 0.55 0.55 0.56 0.56 - 783 0.00 0.00 0.00 0.00 0.62 0.62 0.54 0.54 0.55 0.55 0.56 0.56 - 783 6.71 0.00 0.00 0.00 0.62 0.62 0.54 0.54 0.55 0.55 0.56 0.56 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_PLUS_ZERO_#2#5_AR90 -Window ID : 14303 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.290 0.293 0.285 0.276 0.265 0.245 0.202 0.130 0.050 0.000 0.227 -Abs1 0.173 0.175 0.183 0.189 0.191 0.197 0.214 0.236 0.206 0.001 0.197 -Abs2 0.039 0.039 0.039 0.039 0.040 0.041 0.040 0.036 0.027 0.000 0.038 -Abs3 0.044 0.045 0.048 0.051 0.051 0.052 0.055 0.052 0.031 0.000 0.049 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.455 0.449 0.445 0.445 0.453 0.466 0.489 0.546 0.686 0.999 0.478 -Rbsol 0.455 0.449 0.445 0.445 0.453 0.466 0.489 0.546 0.686 0.999 0.478 -Tvis 0.462 0.466 0.454 0.439 0.422 0.390 0.322 0.207 0.079 0.000 0.361 -Rfvis 0.343 0.335 0.330 0.331 0.341 0.359 0.391 0.463 0.631 0.999 0.376 -Rbvis 0.343 0.335 0.330 0.331 0.341 0.359 0.391 0.463 0.631 0.999 0.376 -SHGC 0.350 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.570 - - - -Layer ID# 44198 44007 44198 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.012 0 0 0 -Emis B 0.012 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 44198_GT_ZER 44007_GT_EUR 44198_GT_ZER None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.58 0.58 0.44 0.44 0.45 0.45 0.46 0.46 - 0 6.71 0.00 0.00 0.00 0.58 0.58 0.44 0.44 0.45 0.45 0.46 0.46 - 783 0.00 0.00 0.00 0.00 0.58 0.58 0.44 0.44 0.45 0.45 0.46 0.46 - 783 6.71 0.00 0.00 0.00 0.58 0.58 0.44 0.44 0.45 0.45 0.46 0.46 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_FREEVISIONT_#3#5_AR90 -Window ID : 14304 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.527 0.526 0.520 0.512 0.500 0.472 0.402 0.271 0.111 0.000 0.432 -Abs1 0.133 0.133 0.135 0.139 0.143 0.149 0.157 0.165 0.159 0.000 0.146 -Abs2 0.097 0.098 0.100 0.101 0.100 0.099 0.099 0.095 0.066 0.000 0.096 -Abs3 0.063 0.063 0.065 0.065 0.064 0.062 0.059 0.049 0.026 0.000 0.058 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.181 0.180 0.180 0.183 0.192 0.218 0.283 0.420 0.638 1.000 0.257 -Rbsol 0.199 0.200 0.201 0.204 0.214 0.241 0.307 0.443 0.667 1.000 0.280 -Tvis 0.682 0.681 0.673 0.664 0.650 0.614 0.523 0.355 0.147 0.000 0.561 -Rfvis 0.154 0.153 0.155 0.159 0.171 0.203 0.284 0.446 0.686 1.000 0.249 -Rbvis 0.163 0.163 0.164 0.168 0.180 0.211 0.288 0.440 0.674 1.000 0.254 -SHGC 0.610 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.740 - - - -Layer ID# 44858 44154 44154 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.092 0.092 0 0 0 -Emis B 0.220 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 44858_GT_FRE 44154_GT_TRI 44154_GT_TRI None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.79 0.79 0.83 0.83 0.85 0.85 0.87 0.87 - 0 6.71 0.00 0.00 0.00 0.79 0.79 0.83 0.83 0.85 0.85 0.87 0.87 - 783 0.00 0.00 0.00 0.00 0.79 0.79 0.83 0.83 0.85 0.85 0.87 0.87 - 783 6.71 0.00 0.00 0.00 0.79 0.79 0.83 0.83 0.85 0.85 0.87 0.87 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_TRIII_#2#5_AR90 -Window ID : 14305 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.433 0.438 0.426 0.412 0.394 0.362 0.295 0.186 0.068 0.000 0.336 -Abs1 0.169 0.171 0.182 0.190 0.194 0.202 0.228 0.265 0.244 0.001 0.206 -Abs2 0.046 0.046 0.046 0.047 0.048 0.049 0.048 0.044 0.034 0.000 0.046 -Abs3 0.058 0.060 0.065 0.069 0.070 0.071 0.075 0.071 0.040 0.000 0.067 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.294 0.285 0.281 0.283 0.295 0.316 0.353 0.435 0.614 0.999 0.335 -Rbsol 0.294 0.285 0.281 0.283 0.295 0.316 0.353 0.435 0.614 0.999 0.335 -Tvis 0.636 0.643 0.626 0.605 0.580 0.533 0.434 0.272 0.099 0.000 0.493 -Rfvis 0.182 0.171 0.167 0.170 0.186 0.215 0.265 0.368 0.575 0.999 0.239 -Rbvis 0.182 0.171 0.167 0.170 0.186 0.215 0.265 0.368 0.575 0.999 0.239 -SHGC 0.520 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 44110 44007 44110 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.048 0 0 0 -Emis B 0.048 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 44110_GT_TRI 44007_GT_EUR 44110_GT_TRI None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.72 0.72 0.77 0.77 0.78 0.78 0.80 0.80 - 0 6.71 0.00 0.00 0.00 0.72 0.72 0.77 0.77 0.78 0.78 0.80 0.80 - 783 0.00 0.00 0.00 0.00 0.72 0.72 0.77 0.77 0.78 0.78 0.80 0.80 - 783 6.71 0.00 0.00 0.00 0.72 0.72 0.77 0.77 0.78 0.78 0.80 0.80 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_TRIII_#2#5_KR90 -Window ID : 14306 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.433 0.438 0.426 0.412 0.394 0.362 0.295 0.186 0.068 0.000 0.336 -Abs1 0.169 0.171 0.182 0.190 0.194 0.202 0.228 0.265 0.244 0.001 0.206 -Abs2 0.046 0.046 0.046 0.047 0.048 0.049 0.048 0.044 0.034 0.000 0.046 -Abs3 0.058 0.060 0.065 0.069 0.070 0.071 0.075 0.071 0.040 0.000 0.067 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.294 0.285 0.281 0.283 0.295 0.316 0.353 0.435 0.614 0.999 0.335 -Rbsol 0.294 0.285 0.281 0.283 0.295 0.316 0.353 0.435 0.614 0.999 0.335 -Tvis 0.636 0.643 0.626 0.605 0.580 0.533 0.434 0.272 0.099 0.000 0.493 -Rfvis 0.182 0.171 0.167 0.170 0.186 0.215 0.265 0.368 0.575 0.999 0.239 -Rbvis 0.182 0.171 0.167 0.170 0.186 0.215 0.265 0.368 0.575 0.999 0.239 -SHGC 0.520 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.710 - - - -Layer ID# 44110 44007 44110 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.048 0 0 0 -Emis B 0.048 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 44110_GT_TRI 44007_GT_EUR 44110_GT_TRI None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.65 0.65 0.53 0.53 0.54 0.54 0.55 0.55 - 0 6.71 0.00 0.00 0.00 0.65 0.65 0.53 0.53 0.54 0.54 0.55 0.55 - 783 0.00 0.00 0.00 0.00 0.65 0.65 0.53 0.53 0.54 0.54 0.55 0.55 - 783 6.71 0.00 0.00 0.00 0.65 0.65 0.53 0.53 0.54 0.54 0.55 0.55 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_TRIIIE_#2#5_AR90 -Window ID : 14307 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 12.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.530 0.530 0.523 0.516 0.505 0.477 0.407 0.277 0.116 0.000 0.436 -Abs1 0.142 0.143 0.146 0.148 0.148 0.150 0.156 0.162 0.136 0.000 0.148 -Abs2 0.051 0.051 0.052 0.054 0.055 0.058 0.059 0.057 0.049 0.000 0.055 -Abs3 0.065 0.066 0.067 0.068 0.067 0.065 0.061 0.051 0.027 0.000 0.061 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.212 0.210 0.211 0.215 0.225 0.251 0.318 0.453 0.672 1.000 0.290 -Rbsol 0.212 0.210 0.211 0.215 0.225 0.251 0.318 0.453 0.672 1.000 0.290 -Tvis 0.674 0.673 0.665 0.656 0.643 0.608 0.519 0.355 0.151 0.000 0.556 -Rfvis 0.178 0.176 0.178 0.182 0.194 0.226 0.303 0.455 0.686 1.000 0.268 -Rbvis 0.178 0.176 0.178 0.182 0.194 0.226 0.303 0.455 0.686 1.000 0.268 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.730 - - - -Layer ID# 44154 44007 44154 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.092 0 0 0 -Emis B 0.092 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 44154_GT_TRI 44007_GT_EUR 44154_GT_TRI None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.81 0.81 0.85 0.85 0.88 0.88 0.89 0.89 - 0 6.71 0.00 0.00 0.00 0.81 0.81 0.85 0.85 0.88 0.88 0.89 0.89 - 783 0.00 0.00 0.00 0.00 0.81 0.81 0.85 0.85 0.88 0.88 0.89 0.89 - 783 6.71 0.00 0.00 0.00 0.81 0.81 0.85 0.85 0.88 0.88 0.89 0.89 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SILVERSTAR_TRIIIE_#2#5_KR90 -Window ID : 14308 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -2 Kr90/Air1 12.0 0.01020 3.319 2.283 7.493 3.448 -0.0122 0.725 0.00002 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.530 0.530 0.523 0.516 0.505 0.477 0.407 0.277 0.116 0.000 0.436 -Abs1 0.142 0.143 0.146 0.148 0.148 0.150 0.156 0.162 0.136 0.000 0.148 -Abs2 0.051 0.051 0.052 0.054 0.055 0.058 0.059 0.057 0.049 0.000 0.055 -Abs3 0.065 0.066 0.067 0.068 0.067 0.065 0.061 0.051 0.027 0.000 0.061 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.212 0.210 0.211 0.215 0.225 0.251 0.318 0.453 0.672 1.000 0.290 -Rbsol 0.212 0.210 0.211 0.215 0.225 0.251 0.318 0.453 0.672 1.000 0.290 -Tvis 0.674 0.673 0.665 0.656 0.643 0.608 0.519 0.355 0.151 0.000 0.556 -Rfvis 0.178 0.176 0.178 0.182 0.194 0.226 0.303 0.455 0.686 1.000 0.268 -Rbvis 0.178 0.176 0.178 0.182 0.194 0.226 0.303 0.455 0.686 1.000 0.268 -SHGC 0.620 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.730 - - - -Layer ID# 44154 44007 44154 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.092 0 0 0 -Emis B 0.092 0.837 0.837 0 0 0 -Thickness(mm) 4.0 4.0 4.0 0 0 0 -Cond(W/m2-K )250.0 250.0 250.0 0 0 0 -Spectral File 44154_GT_TRI 44007_GT_EUR 44154_GT_TRI None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.73 0.73 0.63 0.63 0.65 0.65 0.66 0.66 - 0 6.71 0.00 0.00 0.00 0.73 0.73 0.63 0.63 0.65 0.65 0.66 0.66 - 783 0.00 0.00 0.00 0.00 0.73 0.73 0.63 0.63 0.65 0.65 0.66 0.66 - 783 6.71 0.00 0.00 0.00 0.73 0.73 0.63 0.63 0.65 0.65 0.66 0.66 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_COMBI_Neut_70/40_#2_AR90 -Window ID : 14400 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.390 0.392 0.386 0.379 0.369 0.350 0.307 0.224 0.105 0.000 0.325 -Abs1 0.314 0.318 0.325 0.330 0.330 0.332 0.342 0.348 0.283 0.001 0.327 -Abs2 0.015 0.015 0.015 0.015 0.016 0.016 0.015 0.014 0.011 0.000 0.015 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.281 0.276 0.274 0.276 0.285 0.302 0.336 0.415 0.601 0.999 0.323 -Rbsol 0.350 0.345 0.343 0.344 0.350 0.365 0.402 0.492 0.673 1.000 0.390 -Tvis 0.625 0.628 0.620 0.608 0.593 0.562 0.492 0.358 0.167 0.000 0.522 -Rfvis 0.141 0.134 0.131 0.134 0.146 0.168 0.211 0.310 0.534 0.999 0.196 -Rbvis 0.160 0.154 0.153 0.157 0.170 0.197 0.257 0.393 0.649 1.000 0.235 -SHGC 0.420 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.720 - - - -Layer ID# 44469 44007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44469_GT_COM 44007_GT_EUR None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_COMBI_Neut_70/35_#2_AR90 -Window ID : 14401 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.348 0.350 0.345 0.339 0.330 0.313 0.275 0.201 0.095 0.000 0.291 -Abs1 0.307 0.310 0.317 0.321 0.321 0.322 0.330 0.332 0.267 0.001 0.316 -Abs2 0.011 0.012 0.012 0.012 0.012 0.012 0.012 0.011 0.008 0.000 0.012 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.333 0.328 0.326 0.328 0.337 0.353 0.383 0.456 0.629 0.999 0.371 -Rbsol 0.399 0.395 0.393 0.393 0.398 0.411 0.443 0.523 0.688 1.000 0.433 -Tvis 0.578 0.581 0.573 0.563 0.548 0.520 0.456 0.333 0.157 0.000 0.483 -Rfvis 0.198 0.191 0.189 0.192 0.202 0.223 0.263 0.354 0.564 0.999 0.248 -Rbvis 0.208 0.202 0.201 0.204 0.216 0.241 0.296 0.421 0.661 1.000 0.275 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.700 - - - -Layer ID# 44425 44007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.012 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44425_GT_COM 44007_GT_EUR None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_COMBI_Neut_61/32_#2_AR90 -Window ID : 14402 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.312 0.314 0.310 0.304 0.296 0.281 0.247 0.181 0.085 0.000 0.261 -Abs1 0.393 0.397 0.403 0.406 0.404 0.404 0.407 0.399 0.311 0.001 0.394 -Abs2 0.011 0.011 0.011 0.011 0.012 0.012 0.012 0.010 0.008 0.000 0.011 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.284 0.278 0.276 0.279 0.288 0.304 0.335 0.410 0.596 0.999 0.324 -Rbsol 0.383 0.378 0.376 0.377 0.382 0.396 0.429 0.513 0.683 1.000 0.419 -Tvis 0.512 0.515 0.508 0.499 0.486 0.461 0.404 0.295 0.139 0.000 0.429 -Rfvis 0.162 0.156 0.153 0.156 0.167 0.187 0.226 0.318 0.536 0.999 0.213 -Rbvis 0.195 0.189 0.188 0.192 0.204 0.229 0.285 0.413 0.657 1.000 0.264 -SHGC 0.340 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.610 - - - -Layer ID# 44381 44007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.012 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44381_GT_COM 44007_GT_EUR None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_COMBI_Neut_51/26_#2_AR90 -Window ID : 14403 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.252 0.253 0.250 0.245 0.239 0.227 0.200 0.147 0.070 0.000 0.211 -Abs1 0.393 0.396 0.401 0.403 0.402 0.399 0.400 0.385 0.295 0.001 0.389 -Abs2 0.008 0.008 0.008 0.008 0.008 0.009 0.008 0.008 0.006 0.000 0.008 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.348 0.342 0.341 0.343 0.351 0.365 0.392 0.460 0.629 0.999 0.382 -Rbsol 0.419 0.416 0.414 0.414 0.418 0.430 0.459 0.535 0.692 1.000 0.450 -Tvis 0.417 0.420 0.414 0.406 0.396 0.376 0.331 0.243 0.116 0.000 0.350 -Rfvis 0.209 0.202 0.200 0.203 0.213 0.231 0.265 0.350 0.555 0.999 0.254 -Rbvis 0.258 0.252 0.251 0.254 0.264 0.287 0.336 0.451 0.673 1.000 0.318 -SHGC 0.280 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.510 - - - -Layer ID# 44337 44007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.012 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44337_GT_COM 44007_GT_EUR None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SUPERSELEKT_60/27T_#2_AR90 -Window ID : 14404 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.252 0.253 0.250 0.245 0.239 0.227 0.199 0.145 0.069 0.000 0.211 -Abs1 0.371 0.375 0.380 0.382 0.381 0.379 0.380 0.368 0.284 0.001 0.369 -Abs2 0.006 0.006 0.006 0.006 0.006 0.006 0.006 0.006 0.004 0.000 0.006 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.371 0.365 0.364 0.366 0.374 0.388 0.415 0.481 0.644 0.999 0.404 -Rbsol 0.434 0.430 0.428 0.428 0.432 0.443 0.472 0.545 0.698 1.000 0.463 -Tvis 0.436 0.439 0.433 0.425 0.414 0.393 0.344 0.252 0.119 0.000 0.365 -Rfvis 0.222 0.216 0.214 0.216 0.226 0.244 0.279 0.364 0.565 0.999 0.267 -Rbvis 0.243 0.237 0.236 0.239 0.250 0.273 0.325 0.444 0.671 1.000 0.306 -SHGC 0.270 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.600 - - - -Layer ID# 44601 44007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.012 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44601_GT_SUP 44007_GT_EUR None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SUPERSELEKT_35/14T_#2_AR90 -Window ID : 14405 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.129 0.130 0.128 0.126 0.123 0.117 0.103 0.076 0.037 0.000 0.109 -Abs1 0.544 0.549 0.552 0.552 0.547 0.539 0.527 0.487 0.353 0.001 0.520 -Abs2 0.002 0.002 0.002 0.002 0.003 0.003 0.003 0.002 0.002 0.000 0.002 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.324 0.319 0.318 0.320 0.328 0.341 0.367 0.434 0.609 0.999 0.359 -Rbsol 0.520 0.517 0.515 0.514 0.516 0.523 0.544 0.600 0.723 1.000 0.537 -Tvis 0.226 0.227 0.224 0.220 0.214 0.204 0.179 0.132 0.064 0.000 0.189 -Rfvis 0.205 0.198 0.197 0.199 0.209 0.225 0.256 0.336 0.542 0.999 0.247 -Rbvis 0.385 0.380 0.379 0.381 0.389 0.405 0.443 0.533 0.713 1.000 0.428 -SHGC 0.140 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.350 - - - -Layer ID# 45041 44007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.012 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 45041_GT_SUP 44007_GT_EUR None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_COMBI_Neut_41/21_#2_AR90 -Window ID : 14406 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.196 0.197 0.195 0.191 0.186 0.177 0.155 0.114 0.055 0.000 0.164 -Abs1 0.478 0.482 0.486 0.487 0.484 0.479 0.474 0.447 0.333 0.001 0.464 -Abs2 0.007 0.007 0.007 0.007 0.007 0.007 0.007 0.006 0.005 0.000 0.007 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.319 0.314 0.313 0.315 0.323 0.337 0.364 0.432 0.608 0.999 0.355 -Rbsol 0.397 0.393 0.391 0.392 0.396 0.409 0.441 0.520 0.685 1.000 0.431 -Tvis 0.321 0.323 0.319 0.313 0.305 0.289 0.254 0.187 0.089 0.000 0.269 -Rfvis 0.214 0.208 0.206 0.209 0.218 0.235 0.267 0.348 0.551 0.999 0.257 -Rbvis 0.249 0.243 0.242 0.245 0.256 0.278 0.328 0.445 0.671 1.000 0.310 -SHGC 0.220 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.410 - - - -Layer ID# 44293 44007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.012 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44293_GT_COM 44007_GT_EUR None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 0 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 0.00 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - 783 6.71 0.00 0.00 0.00 1.30 1.30 0.99 0.99 1.01 1.01 1.02 1.02 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_COMBI_Silber_48T_#2_AR90 -Window ID : 14407 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.327 0.329 0.324 0.318 0.310 0.295 0.262 0.197 0.097 0.000 0.276 -Abs1 0.201 0.204 0.209 0.213 0.214 0.216 0.226 0.234 0.195 0.001 0.214 -Abs2 0.019 0.019 0.019 0.020 0.020 0.020 0.020 0.018 0.014 0.000 0.019 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.453 0.448 0.447 0.449 0.455 0.468 0.492 0.551 0.694 0.999 0.481 -Rbsol 0.467 0.463 0.461 0.461 0.465 0.474 0.499 0.562 0.704 1.000 0.491 -Tvis 0.448 0.451 0.444 0.436 0.426 0.406 0.360 0.270 0.134 0.000 0.378 -Rfvis 0.426 0.421 0.420 0.421 0.429 0.443 0.470 0.535 0.686 0.999 0.458 -Rbvis 0.413 0.409 0.407 0.409 0.416 0.432 0.465 0.547 0.718 1.000 0.452 -SHGC 0.350 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.480 - - - -Layer ID# 44513 44007 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.837 0 0 0 0 -Emis B 0.037 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44513_GT_COM 44007_GT_EUR None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SUNSTOP_Neut_50T_#2_AR90 -Window ID : 14408 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.301 0.305 0.297 0.288 0.278 0.260 0.222 0.154 0.069 0.000 0.242 -Abs1 0.496 0.500 0.508 0.512 0.511 0.510 0.513 0.499 0.386 0.001 0.496 -Abs2 0.047 0.048 0.052 0.055 0.055 0.057 0.062 0.063 0.043 0.000 0.055 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.155 0.147 0.144 0.146 0.156 0.173 0.203 0.284 0.502 0.999 0.196 -Rbsol 0.308 0.299 0.296 0.298 0.308 0.325 0.353 0.425 0.607 0.999 0.342 -Tvis 0.416 0.421 0.410 0.398 0.384 0.359 0.305 0.211 0.093 0.000 0.334 -Rfvis 0.143 0.134 0.132 0.135 0.146 0.166 0.200 0.289 0.511 0.999 0.190 -Rbvis 0.202 0.190 0.185 0.187 0.200 0.221 0.255 0.339 0.550 0.999 0.242 -SHGC 0.370 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.450 - - - -Layer ID# 44733 44066 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.827 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44733_GT_SUN 44066_GT_ENp None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SUNSTOP_Blau_50T_#2_AR90 -Window ID : 14409 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.288 0.291 0.284 0.275 0.265 0.248 0.212 0.146 0.065 0.000 0.231 -Abs1 0.468 0.471 0.478 0.482 0.481 0.481 0.484 0.471 0.364 0.001 0.468 -Abs2 0.044 0.045 0.048 0.051 0.052 0.053 0.058 0.059 0.041 0.000 0.052 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.201 0.193 0.190 0.192 0.201 0.217 0.246 0.323 0.530 0.999 0.239 -Rbsol 0.296 0.287 0.284 0.286 0.297 0.315 0.345 0.420 0.605 0.999 0.333 -Tvis 0.400 0.405 0.394 0.382 0.369 0.345 0.293 0.202 0.088 0.000 0.321 -Rfvis 0.215 0.207 0.205 0.208 0.218 0.236 0.268 0.349 0.553 0.999 0.258 -Rbvis 0.180 0.168 0.163 0.166 0.180 0.202 0.239 0.330 0.546 0.999 0.225 -SHGC 0.350 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.430 - - - -Layer ID# 44689 44066 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.827 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44689_GT_SUN 44066_GT_ENp None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SUNSTOP_Blau_30T_#2_AR90 -Window ID : 14410 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.174 0.176 0.172 0.167 0.161 0.151 0.128 0.089 0.040 0.000 0.140 -Abs1 0.555 0.559 0.564 0.565 0.561 0.556 0.548 0.513 0.378 0.001 0.537 -Abs2 0.026 0.027 0.029 0.031 0.031 0.032 0.035 0.036 0.025 0.000 0.031 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.244 0.237 0.235 0.238 0.246 0.261 0.289 0.362 0.557 0.999 0.281 -Rbsol 0.315 0.306 0.302 0.304 0.314 0.330 0.358 0.429 0.608 0.999 0.347 -Tvis 0.245 0.248 0.241 0.234 0.226 0.211 0.180 0.124 0.054 0.000 0.197 -Rfvis 0.280 0.273 0.272 0.274 0.283 0.298 0.325 0.397 0.583 0.999 0.317 -Rbvis 0.197 0.186 0.181 0.183 0.197 0.218 0.252 0.338 0.549 0.999 0.239 -SHGC 0.220 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.260 - - - -Layer ID# 44645 44066 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.827 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44645_GT_SUN 44066_GT_ENp None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_SUNSTOP_Silber_20T_#2_AR90 -Window ID : 14411 -Tilt : 90.0 -Glazings : 2 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 16.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.121 0.123 0.119 0.116 0.112 0.105 0.090 0.063 0.029 0.000 0.098 -Abs1 0.612 0.617 0.620 0.620 0.615 0.607 0.592 0.546 0.394 0.001 0.584 -Abs2 0.019 0.019 0.021 0.022 0.022 0.023 0.025 0.026 0.018 0.000 0.022 -Abs3 0 0 0 0 0 0 0 0 0 0 0 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.248 0.241 0.240 0.242 0.251 0.265 0.293 0.366 0.560 0.999 0.285 -Rbsol 0.376 0.368 0.362 0.362 0.370 0.382 0.401 0.457 0.619 0.999 0.395 -Tvis 0.169 0.170 0.166 0.161 0.155 0.146 0.124 0.087 0.039 0.000 0.136 -Rfvis 0.281 0.274 0.273 0.276 0.284 0.298 0.325 0.396 0.581 0.999 0.317 -Rbvis 0.291 0.282 0.274 0.274 0.283 0.297 0.318 0.381 0.566 0.999 0.313 -SHGC 0.170 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.180 - - - -Layer ID# 44821 44066 0 0 0 0 -Tir 0.000 0.000 0 0 0 0 -Emis F 0.837 0.037 0 0 0 0 -Emis B 0.827 0.837 0 0 0 0 -Thickness(mm) 6.0 4.0 0 0 0 0 -Cond(W/m2-K )166.7 250.0 0 0 0 0 -Spectral File 44821_GT_SUN 44066_GT_ENp None None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 0 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 0.00 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - 783 6.71 0.00 0.00 0.00 1.36 1.36 1.08 1.08 1.10 1.10 1.12 1.12 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_COMBI_Neut_70/35_#2#5_AR90 -Window ID : 14501 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.294 0.297 0.289 0.280 0.268 0.247 0.202 0.128 0.047 0.000 0.229 -Abs1 0.313 0.316 0.322 0.326 0.327 0.329 0.338 0.342 0.276 0.001 0.323 -Abs2 0.014 0.014 0.014 0.015 0.015 0.015 0.015 0.015 0.012 0.000 0.015 -Abs3 0.029 0.030 0.033 0.036 0.037 0.039 0.043 0.043 0.026 0.000 0.037 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.350 0.343 0.341 0.343 0.353 0.370 0.401 0.473 0.639 0.999 0.387 -Rbsol 0.368 0.361 0.355 0.355 0.363 0.379 0.406 0.472 0.633 0.999 0.395 -Tvis 0.496 0.501 0.487 0.471 0.452 0.416 0.340 0.214 0.079 0.000 0.385 -Rfvis 0.226 0.217 0.213 0.216 0.229 0.252 0.293 0.384 0.581 0.999 0.274 -Rbvis 0.235 0.225 0.219 0.221 0.234 0.259 0.301 0.391 0.585 0.999 0.280 -SHGC 0.340 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.620 - - - -Layer ID# 44425 44007 44066 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.012 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 44425_GT_COM 44007_GT_EUR 44066_GT_ENp None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 0 6.71 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 783 0.00 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 783 6.71 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_COMBI_Neut_61/32_#2#5_AR90 -Window ID : 14502 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.263 0.266 0.259 0.250 0.240 0.221 0.180 0.114 0.042 0.000 0.204 -Abs1 0.400 0.403 0.409 0.413 0.412 0.412 0.417 0.410 0.319 0.001 0.402 -Abs2 0.014 0.014 0.014 0.014 0.015 0.015 0.015 0.014 0.012 0.000 0.014 -Abs3 0.026 0.027 0.030 0.032 0.033 0.035 0.039 0.038 0.023 0.000 0.033 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.297 0.290 0.288 0.290 0.300 0.317 0.349 0.424 0.604 0.999 0.336 -Rbsol 0.359 0.352 0.346 0.347 0.356 0.372 0.401 0.469 0.632 0.999 0.388 -Tvis 0.439 0.444 0.432 0.418 0.400 0.368 0.301 0.190 0.070 0.000 0.341 -Rfvis 0.184 0.176 0.173 0.175 0.188 0.210 0.250 0.341 0.549 0.999 0.234 -Rbvis 0.227 0.217 0.211 0.213 0.227 0.252 0.296 0.388 0.584 0.999 0.274 -SHGC 0.300 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.540 - - - -Layer ID# 44381 44007 44066 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.012 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 44381_GT_COM 44007_GT_EUR 44066_GT_ENp None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 0 6.71 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 783 0.00 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 783 6.71 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_COMBI_Neut_51/26_#2#5_AR90 -Window ID : 14503 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.214 0.216 0.210 0.203 0.195 0.180 0.148 0.094 0.035 0.000 0.166 -Abs1 0.399 0.402 0.407 0.410 0.408 0.407 0.408 0.395 0.303 0.001 0.396 -Abs2 0.010 0.010 0.010 0.010 0.011 0.011 0.011 0.010 0.009 0.000 0.010 -Abs3 0.020 0.021 0.024 0.026 0.027 0.028 0.031 0.031 0.019 0.000 0.027 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.357 0.351 0.349 0.351 0.360 0.375 0.402 0.469 0.634 0.999 0.391 -Rbsol 0.387 0.380 0.374 0.373 0.380 0.394 0.418 0.478 0.634 0.999 0.409 -Tvis 0.360 0.363 0.354 0.342 0.328 0.303 0.248 0.158 0.059 0.000 0.280 -Rfvis 0.224 0.216 0.213 0.216 0.227 0.247 0.282 0.366 0.565 0.999 0.268 -Rbvis 0.273 0.263 0.256 0.256 0.268 0.289 0.324 0.404 0.589 0.999 0.308 -SHGC 0.250 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.460 - - - -Layer ID# 44337 44007 44066 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.012 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 44337_GT_COM 44007_GT_EUR 44066_GT_ENp None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 0 6.71 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 783 0.00 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 783 6.71 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - -BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi Band Calculation : generated with Trnsys18.std -Unit System : SI -Name : DOE-2 WINDOW LIB -Desc : GT_SANCO_COMBI_Neut_41/21_#2#5_AR90 -Window ID : 14504 -Tilt : 90.0 -Glazings : 3 -Frame : 3 Wood 2.270 -Spacer : 2 Class2 0.068 1.550 -0.143 -Total Height: 1500.0 mm -Total Width : 1200.0 mm -Glass Height: 1360.3 mm -Glass Width : 1060.3 mm -Mullion : None -Gap Thick Cond dCond Vis dVis Dens dDens Pr dPr -1 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -2 Ar90/Air1 14.0 0.01712 5.410 2.062 6.300 1.711 -0.0060 0.687 -0.0001 -3 0 0 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 0 0 -Angle 0 10 20 30 40 50 60 70 80 90 Hemis -Tsol 0.166 0.168 0.163 0.158 0.151 0.140 0.114 0.073 0.027 0.000 0.129 -Abs1 0.485 0.489 0.493 0.494 0.491 0.487 0.483 0.456 0.339 0.001 0.472 -Abs2 0.008 0.008 0.008 0.009 0.009 0.009 0.009 0.008 0.007 0.000 0.009 -Abs3 0.016 0.016 0.019 0.020 0.021 0.022 0.024 0.024 0.015 0.000 0.021 -Abs4 0 0 0 0 0 0 0 0 0 0 0 -Abs5 0 0 0 0 0 0 0 0 0 0 0 -Abs6 0 0 0 0 0 0 0 0 0 0 0 -Rfsol 0.325 0.319 0.317 0.320 0.328 0.342 0.370 0.438 0.611 0.999 0.360 -Rbsol 0.378 0.371 0.365 0.364 0.372 0.387 0.412 0.475 0.633 0.999 0.402 -Tvis 0.277 0.280 0.272 0.264 0.253 0.233 0.191 0.121 0.045 0.000 0.216 -Rfvis 0.223 0.216 0.214 0.216 0.226 0.244 0.277 0.357 0.557 0.999 0.266 -Rbvis 0.267 0.258 0.251 0.251 0.263 0.285 0.320 0.402 0.588 0.999 0.304 -SHGC 0.200 N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A -Tvis_daylight: 0.360 - - - -Layer ID# 44293 44007 44066 0 0 0 -Tir 0.000 0.000 0.000 0 0 0 -Emis F 0.837 0.837 0.037 0 0 0 -Emis B 0.012 0.837 0.837 0 0 0 -Thickness(mm) 6.0 4.0 4.0 0 0 0 -Cond(W/m2-K )166.7 250.0 250.0 0 0 0 -Spectral File 44293_GT_COM 44007_GT_EUR 44066_GT_ENp None None None - -Overall and Center of Glass Ig U-values (W/m2-K) -Outdoor Temperature -17.8 C 15.6 C 26.7 C 37.8 C -Solar WdSpd hcout hrout hin -(W/m2) (m/s) (W/m2-K) - 0 0.00 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 0 6.71 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 783 0.00 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - 783 6.71 0.00 0.00 0.00 0.63 0.63 0.63 0.63 0.64 0.64 0.66 0.66 - - -*** END OF LIBRARY *** -******************************************************************************************************************************** -*WinID Description Design U-Value g-value T-sol Rf-sol T-vis_daylight Lay Width(mm) -******************************************************************************************************************************** -100 No_glazing - 10.00 1.00 1.000 0.001 1.000 0 0 -101 Float5mm 5 5.72 0.84 0.809 0.074 0.000 1 5 -102 Float6mm 6 5.69 0.82 0.791 0.072 0.000 1 6 -103 Float8mm 8 5.62 0.80 0.755 0.070 0.000 1 8 -104 Float10mm 10 5.56 0.77 0.724 0.069 0.000 1 10 -105 Float12mm 12 5.50 0.75 0.694 0.067 0.000 1 12 -106 Float14mm 14 5.44 0.73 0.665 0.065 0.000 1 14 -107 Extraweiss4mm 4 5.75 0.90 0.896 0.080 0.000 1 4 -108 Extraweiss6mm 6 5.69 0.89 0.885 0.079 0.000 1 6 -109 Extraweiss8mm 8 5.62 0.89 0.874 0.077 0.000 1 8 -110 Extraweiss10mm 10 5.56 0.88 0.865 0.079 0.000 1 10 -111 Extraweiss12mm 12 5.50 0.87 0.855 0.076 0.000 1 12 -112 Extraweiss14mm 14 5.44 0.86 0.845 0.075 0.000 1 14 -113 VSG6-2 7 5.66 0.77 0.728 0.075 0.000 1 7 -114 VSG6-2EW 7 5.66 0.85 0.824 0.076 0.000 1 7 -115 VSG8-2 9 5.60 0.76 0.707 0.073 0.000 1 9 -116 VSG8-2EW 9 5.60 0.84 0.812 0.075 0.000 1 9 -117 VSG_2x5mm 11 5.54 0.74 0.682 0.072 0.000 1 11 -118 VSG_2x5mm_extraweiss 11 5.54 0.83 0.801 0.075 0.000 1 11 -119 VSG12-2 13 5.48 0.72 0.654 0.072 0.000 1 13 -120 VSG12-2EW 13 5.48 0.82 0.793 0.075 0.000 1 13 -121 VSG14-2 15 5.42 0.70 0.629 0.064 0.000 1 15 -122 VSG14-2EW 15 5.42 0.82 0.781 0.073 0.000 1 15 -200 2-WSV_#3_Air 4/12/4 1.62 0.64 0.562 0.239 0.800 2 20 -201 2-WSV_#3_Ar90 6/16/6 1.12 0.59 0.504 0.230 0.780 2 28 -202 2-WSV_#3_Kr90 4/10/4 1.05 0.62 0.543 0.264 0.800 2 18 -300 3-WSV_#2#5_Ar90 4/16/4/16/4 0.58 0.50 0.425 0.296 0.720 3 44 -301 3-WSV_#2#5_Kr90 4/12/4/12/4 0.49 0.50 0.425 0.296 0.720 3 36 -400 2-SSV_60/33_#2_Ar90 6/16/4 1.04 0.33 0.301 0.291 0.600 2 26 -401 2-SSV_41/22_#2_Ar90 6/16/4 1.04 0.22 0.196 0.319 0.410 2 26 -500 3-SSV_54/30_#2#5_Ar90 6/12/4/12/4 0.70 0.30 0.256 0.301 0.540 3 38 -501 3-SSV_36/20_#2#5_AR90 6/14/4/14/4 0.62 0.20 0.166 0.325 0.360 3 42 -******************************************************************************************************************************** -*WinID Description Design U-Value g-value T-sol Rf-sol T-vis_daylight Lay Width(mm) -******************************************************************************************************************************** -3200 GU_ClimaGuard_N_#3_Air 4/12/4 1.62 0.64 0.562 0.239 0.800 2 20 -3201 GU_ClimaGuard_N_#3_Ar90 4/16/4 1.13 0.65 0.562 0.239 0.800 2 24 -3202 GU_ClimaGuard_N_#3_Kr90 4/10/4 1.05 0.65 0.562 0.239 0.800 2 18 -3203 GU_ClimaGuard_NL_#3_Ar90 4/16/4 1.13 0.64 0.549 0.248 0.780 2 24 -3204 GU_ClimaGuard_NL_#3_Kr90 4/10/4 1.05 0.64 0.549 0.248 0.770 2 18 -3205 GU_ClimaGuard_D_#3_Ar90 4/16/4 1.36 0.68 0.555 0.200 0.740 2 24 -3206 GU_ClimaGuard_D_#3_Kr90 4/10/4 1.29 0.68 0.555 0.200 0.740 2 18 -3207 GU_ClimaGuard_Premium_#3_Ar90 4/16/4 1.10 0.61 0.532 0.269 0.800 2 24 -3208 GU_ClimaGuard_Premium_#3_Kr90 4/10/4 1.02 0.61 0.532 0.269 0.800 2 18 -3209 GU_ClimaGuard_1.0_#3_Ar90 4/16/4 1.04 0.52 0.445 0.358 0.700 2 24 -3210 GU_ClimaGuard_1.0_#3_Kr90 4/10/4 0.96 0.52 0.445 0.358 0.700 2 18 -3211 GU_ClimaGuard_Nrg_#3_Ar90 4/16/4 1.25 0.74 0.657 0.189 0.810 2 24 -3212 GU_ClimaGuard_Nrg_#3_Kr90 4/10/4 1.18 0.74 0.657 0.189 0.810 2 18 -3213 GU_ClimaGuard_Dry_Prem_#1#3_Ar90 4/16/4 1.09 0.60 0.522 0.258 0.780 2 24 -3214 GU_ClimaGuard_Dry_1.0_#1#3_Ar90 4/16/4 1.04 0.51 0.437 0.341 0.680 2 24 -******************************************************************************************************************************** -3300 GU_ClimaGuard_N_#2#5_Ar90 4/16/4/16/4 0.59 0.52 0.436 0.290 0.710 3 44 -3301 GU_ClimaGuard_N_#2#5_Kr90 4/12/4/12/4 0.50 0.52 0.436 0.290 0.710 3 36 -3302 GU_ClimaGuard_NL_#2#5_Ar90 4/16/4/16/4 0.59 0.51 0.419 0.288 0.670 3 44 -3303 GU_ClimaGuard_NL_#2#5_Kr90 4/12/4/12/4 0.50 0.51 0.419 0.288 0.670 3 36 -3304 GU_ClimaGuard_D_#2#5_Ar90 4/16/4/16/4 0.75 0.52 0.404 0.219 0.590 3 44 -3305 GU_ClimaGuard_D_#2#5_Kr90 4/12/4/12/4 0.66 0.52 0.404 0.219 0.590 3 36 -3306 GU_ClimaGuard_Premium_#2#5_Ar90 4/14/4/14/4 0.63 0.49 0.409 0.319 0.710 3 40 -3307 GU_ClimaGuard_Premium_#2#5_Kr90 4/12/4/12/4 0.48 0.49 0.409 0.319 0.710 3 36 -3308 GU_ClimaGuard_1.0_#2#5_Ar90 4/16/4/16/4 0.52 0.38 0.305 0.455 0.560 3 44 -3309 GU_ClimaGuard_1.0_#2#5_Kr90 4/12/4/12/4 0.43 0.38 0.305 0.455 0.560 3 36 -3310 GU_ClimaGuard_Nrg_#2#5_Ar90 4/14/4/14/4 0.73 0.61 0.524 0.216 0.730 3 40 -3311 GU_ClimaGuard_Nrg_#2#5_Kr90 4/12/4/12/4 0.58 0.61 0.524 0.216 0.730 3 36 -******************************************************************************************************************************** -3400 GU_SunGuard_SNX_60/28_#2_Ar90 6/16/4 1.03 0.28 0.259 0.402 0.600 2 26 -3401 GU_SunGuard_SN_70/41_#2_Ar90 6/16/4 1.10 0.41 0.380 0.334 0.700 2 26 -3402 GU_SunGuard_SN_70/37_#2_Ar90 6/16/4 1.03 0.37 0.343 0.387 0.700 2 26 -3403 GU_SunGuard_SN_51/28_#2_Ar90 6/16/4 1.03 0.28 0.252 0.369 0.510 2 26 -3404 GU_SunGuard_SN_40/23_#2_Ar90 6/16/4 1.03 0.23 0.208 0.359 0.400 2 26 -3405 GU_SunGuard_HPlblue_62/52_#2_Ar90 6/16/4 1.41 0.51 0.466 0.170 0.620 2 26 -3406 GU_SunGuard_HP_52/41_#2_Ar90 6/16/4 1.33 0.41 0.369 0.210 0.520 2 26 -3407 GU_SunGuard_HP_60/40_#2_Ar90 6/16/4 1.13 0.39 0.358 0.342 0.600 2 26 -3408 GU_SunGuard_HP_41/33_#2_Ar90 6/16/4 1.33 0.33 0.286 0.245 0.410 2 26 -3409 GU_SunGuard_HP_50/32_#2_Ar90 6/16/4 1.10 0.32 0.288 0.370 0.500 2 26 -3410 GU_SunGuard_HPsilver_43/31_#2_Ar90 6/16/4 1.16 0.31 0.281 0.364 0.430 2 26 -3411 GU_SunGuard_HPrblue_41/29_#2_Ar90 6/16/4 1.10 0.29 0.257 0.272 0.410 2 26 -3412 GU_SunGuard_HPamber_41/29_#2_Ar90 6/16/4 1.10 0.29 0.263 0.365 0.410 2 26 -3413 GU_SunGuard_HPbgreen_40/29_#2_Ar90 6/16/4 1.10 0.29 0.253 0.238 0.400 2 26 -3414 GU_SunGuard_HPbronze_40/27_#2_Ar90 6/16/4 1.10 0.27 0.238 0.265 0.400 2 26 -3415 GU_SunGuard_HPsilver_35/26_#2_Ar90 6/16/4 1.10 0.26 0.235 0.433 0.350 2 26 -3416 GU_Solar_Neutral_70_Ar90 6/16/4 2.65 0.65 0.607 0.253 0.650 2 26 -3417 GU_Solar_Neutral_67_Ar90 6/16/4 2.62 0.59 0.530 0.154 0.610 2 26 -3418 GU_Solar_Neutral_60_Ar90 6/16/4 2.56 0.53 0.472 0.188 0.550 2 26 -3419 GU_Solar_LBlue_52_Ar90 6/16/4 2.48 0.44 0.371 0.125 0.470 2 26 -3420 GU_Solar_Sgrey_32_#2_Ar90 6/16/4 2.24 0.28 0.223 0.199 0.300 2 26 -3421 GU_Solar_Rblue_20_#2_Ar90 6/16/4 2.05 0.22 0.162 0.184 0.200 2 26 -3422 GU_Solar_Silver_20_#2_Ar90 6/16/4 2.07 0.20 0.148 0.328 0.200 2 26 -3423 GU_Solar_Bgreen_20_#2_Ar90 6/16/4 1.96 0.20 0.141 0.191 0.190 2 26 -3424 GU_Solar_Bronze_20_#2_Ar90 6/16/4 1.91 0.19 0.134 0.201 0.190 2 26 -3425 GU_Solar_Gold_20_#2_Ar90 6/16/4 1.89 0.21 0.156 0.181 0.210 2 26 -3426 GU_Solar_Silver08_#2_Ar90 6/16/4 1.79 0.12 0.071 0.346 0.080 2 26 -3427 GU_Solar_Neutral_70_CG_Prem_#3_Ar90 6/16/4 1.10 0.51 0.437 0.387 0.630 2 26 -3428 GU_Solar_Neutral_67_CG_Prem_#3_Ar90 6/16/4 1.10 0.47 0.396 0.226 0.590 2 26 -3429 GU_Solar_Neutral_60_CG_Prem_#3_Ar90 6/16/4 1.10 0.42 0.358 0.241 0.540 2 26 -3430 GU_Solar_LBlue_52_CG_Prem_#3_Ar90 6/16/4 1.10 0.35 0.291 0.151 0.460 2 26 -3431 GU_Solar_Sgrey_32_CG_Prem_#2#3_Ar90 6/16/4 1.10 0.23 0.182 0.207 0.290 2 26 -3432 GU_Solar_Rblue_20_CG_Prem_#2#3_Ar90 6/16/4 1.09 0.18 0.129 0.191 0.190 2 26 -3433 GU_Solar_Silver_20_CG_Prem_#2#3_Ar90 6/16/4 1.09 0.16 0.123 0.331 0.190 2 26 -3434 GU_Solar_Bgreen_20_CG_Prem_#2#3_Ar90 6/16/4 1.09 0.16 0.114 0.195 0.180 2 26 -3435 GU_Solar_Bronze_20_CG_Prem_#2#3_Ar90 6/16/4 1.09 0.16 0.112 0.203 0.190 2 26 -3436 GU_Solar_Gold_20_CG_Prem_#2#3_Ar90 6/16/4 1.09 0.18 0.129 0.185 0.200 2 26 -3437 GU_Solar_Silver08_CG_Prem_#2#3_Ar90 6/16/4 1.09 0.09 0.058 0.348 0.080 2 26 -******************************************************************************************************************************** -3500 GU_SunGuard_SNX_60/28_#2#5_Ar90 6/12/4/12/4 0.69 0.26 0.222 0.409 0.530 3 38 -3501 GU_SunGuard_SN_70/41_#2#5_Ar90 6/12/4/12/4 0.71 0.37 0.312 0.351 0.620 3 38 -3502 GU_SunGuard_SN_70/37_#2#5_Ar90 6/12/4/12/4 0.69 0.33 0.288 0.400 0.620 3 38 -3503 GU_SunGuard_SN_51/28_#2#5_Ar90 6/12/4/12/4 0.69 0.25 0.213 0.376 0.450 3 38 -3504 GU_SunGuard_SN_40/23_#2#5_Ar90 6/12/4/12/4 0.69 0.21 0.175 0.364 0.360 3 38 -3505 GU_SunGuard_HPlblue_62/52_#2#5_Ar90 6/12/4/12/4 0.80 0.41 0.334 0.209 0.550 3 38 -3506 GU_SunGuard_HP_52/41_#2#5_Ar90 6/12/4/12/4 0.78 0.34 0.272 0.232 0.460 3 38 -3507 GU_SunGuard_HP_60/40_#2#5_Ar90 6/12/4/12/4 0.72 0.34 0.280 0.360 0.530 3 38 -3508 GU_SunGuard_HP_41/33_#2#5_Ar90 6/12/4/12/4 0.78 0.27 0.213 0.258 0.360 3 38 -3509 GU_SunGuard_HP_50/32_#2#5_Ar90 6/12/4/12/4 0.71 0.28 0.231 0.381 0.440 3 38 -3510 GU_SunGuard_HPsilver_43/31_#2#5_Ar90 6/12/4/12/4 0.73 0.27 0.216 0.376 0.380 3 38 -3511 GU_SunGuard_HPrblue_41/29_#2#5_Ar90 6/12/4/12/4 0.71 0.25 0.203 0.281 0.360 3 38 -3512 GU_SunGuard_HPamber_41/29_#2#5_Ar90 6/12/4/12/4 0.71 0.25 0.205 0.374 0.360 3 38 -3513 GU_SunGuard_HPbgreen_40/29_#2#5_Ar90 6/12/4/12/4 0.71 0.25 0.198 0.246 0.360 3 38 -3514 GU_SunGuard_HPbronze_40/27_#2#5_Ar90 6/12/4/12/4 0.71 0.24 0.190 0.273 0.360 3 38 -3515 GU_SunGuard_HPsilver_35/26_#2#5_Ar90 6/12/4/12/4 0.71 0.22 0.180 0.442 0.310 3 38 -******************************************************************************************************************************** -*WinID Description Design U-Value g-value T-sol Rf-sol T-vis_daylight Lay Width(mm) -******************************************************************************************************************************** -7200 IP_iplus_neut_E_#3_Ar90 6/16/6 1.12 0.59 0.504 0.230 0.780 2 28 -7201 IP_iplus_neut_CE_#3_Kr90 4/10/4 1.05 0.62 0.543 0.264 0.800 2 18 -7202 IP_iplus_1.0_#3_Ar90 4/16/4 1.05 0.53 0.458 0.352 0.740 2 24 -7203 IP_iplus_ET_#3_Ar90 4/16/4 1.12 0.60 0.518 0.284 0.780 2 24 -7204 IP_iplus_ET_Optiwhite_#3_Ar90 6/16/6 1.12 0.57 0.514 0.249 0.780 2 28 -7205 IP_iplus_sun_#3_Ar90_readComment 4/16/4 1.12 0.54 0.396 0.324 0.710 2 24 -******************************************************************************************************************************** -7300 IP_iplus_3E_#2#5_Ar90 4/16/4/16/4 0.58 0.50 0.425 0.296 0.720 3 44 -7301 IP_iplus_3CE_#2#5_Kr90 4/12/4/12/4 0.49 0.50 0.425 0.296 0.720 3 36 -7302 IP_iplus_3CLS_#2#5_Kr90 4/12/4/12/4 0.61 0.60 0.520 0.252 0.730 3 36 -******************************************************************************************************************************** -7400 IP_ipasol_platin_25/15_#2_Ar90 6/16/4 1.12 0.15 0.119 0.324 0.250 2 26 -7401 IP_ipasol_sky_30/17_#2_Ar90 6/16/4 1.12 0.17 0.138 0.228 0.300 2 26 -7402 IP_ipasol_shine_40/22_#2_Ar90 6/16/4 1.12 0.22 0.191 0.273 0.400 2 26 -7403 IP_ipasol_platin_47/29_#2_Ar90 6/16/4 1.12 0.29 0.268 0.427 0.470 2 26 -7404 IP_ipasol_neut_48/27_#2_Ar90 6/16/4 1.12 0.27 0.241 0.289 0.480 2 26 -7405 IP_ipasol_neut_50/27_#2_Ar90 6/16/4 1.08 0.26 0.234 0.231 0.500 2 26 -7406 IP_ipasol_neut_60/33_#2_Ar90 6/16/4 1.04 0.33 0.301 0.291 0.600 2 26 -7407 IP_ipasol_neut_61/33_#2_Ar90 6/16/4 1.12 0.33 0.302 0.319 0.610 2 26 -7408 IP_ipasol_ultraselect_62/29_#2_Ar90 6/16/4 1.04 0.29 0.272 0.395 0.620 2 26 -7409 IP_ipasol_neut_69/37_#2_Ar90 6/16/4 1.04 0.37 0.340 0.332 0.690 2 26 -7410 IP_ipasol_neut_70/39_#2_Ar90 6/16/4 1.04 0.38 0.356 0.299 0.700 2 26 -7411 IP_ipasol_neut_73/42_#2_Ar90 6/16/4 1.12 0.42 0.388 0.272 0.730 2 26 -7412 IP_ipasol_bright_neut_#3_Ar90 6/16/4 1.12 0.46 0.400 0.363 0.570 2 26 -7413 IP_ipasol_bright_white_#3_Ar90 6/16/4 1.12 0.50 0.435 0.439 0.580 2 26 -7414 IP_ipasol_bright_green_#3_Ar90 6/16/4 1.12 0.31 0.254 0.159 0.480 2 26 -7415 IP_ipasol_bright_grey_#3_Ar90 6/16/4 1.12 0.28 0.219 0.151 0.280 2 26 -7416 IP_ipasol_bright_bronze_#3_Ar90 6/16/4 1.12 0.29 0.230 0.161 0.320 2 26 -7417 IP_ipasol_bright_blue_#3_Ar90 6/16/4 1.12 0.25 0.199 0.118 0.340 2 26 -******************************************************************************************************************************** -7500 IP_ipasol_platin_25/15_iplus_E_#2#5_Ar90 6/12/4/12/4 0.72 0.13 0.103 0.326 0.230 3 38 -7501 IP_ipasol_sky_30/17_iplus_E_#2#5_Ar90 6/12/4/12/4 0.72 0.15 0.119 0.230 0.270 3 38 -7502 IP_ipasol_shine_40/22_iplus_E_#2#5_Ar90 6/12/4/12/4 0.72 0.20 0.164 0.276 0.360 3 38 -7503 IP_ipasol_platin_47/29_iplus_E_#2#5_Ar90 6/12/4/12/4 0.72 0.26 0.221 0.435 0.420 3 38 -7504 IP_ipasol_neut_48/27_iplus_E_#2#5_Ar90 6/12/4/12/4 0.72 0.24 0.205 0.295 0.430 3 38 -7505 IP_ipasol_neut_50/27_iplus_E_#2#5_Ar90 6/12/4/12/4 0.71 0.24 0.201 0.237 0.440 3 38 -7506 IP_ipasol_neut_60/33_iplus_E_#2#5_Ar90 6/12/4/12/4 0.70 0.30 0.256 0.301 0.540 3 38 -7507 IP_ipasol_neut_61/33_iplus_E_#2#5_Ar90 6/12/4/12/4 0.72 0.30 0.259 0.329 0.540 3 38 -7508 IP_ipasol_ultra_62/29_iplus_E_#2#5_Ar90 6/12/4/12/4 0.70 0.27 0.238 0.402 0.550 3 38 -7509 IP_ipasol_neut_69/37_iplus_E_#2#5_Ar90 6/12/4/12/4 0.70 0.33 0.291 0.344 0.620 3 38 -7510 IP_ipasol_neut_70/39_iplus_E_#2#5_Ar90 6/12/4/12/4 0.70 0.35 0.304 0.312 0.620 3 38 -7511 IP_ipasol_neut_73/42_iplus_E_#2#5_Ar90 6/12/4/12/4 0.72 0.38 0.328 0.287 0.650 3 38 -******************************************************************************************************************************** -*WinID Description Design U-Value g-value T-sol Rf-sol T-vis_daylight Lay Width(mm) -******************************************************************************************************************************** -11200 SG_CLIMAPLUS_UltraN_#3_Ar90 4/12/4 1.28 0.62 0.535 0.240 0.800 2 20 -11201 SG_CLIMAPLUS_UltraN_#3_10Kr90 4/10/4 1.05 0.62 0.535 0.240 0.800 2 18 -11202 SG_CLIMAPLUS_UltraN_#3_BioClean_Ar90 4/16/4 1.12 0.61 0.524 0.273 0.770 2 24 -11203 SG_CLIMAPLUS_ONE_#3_Ar90 4/16/4 1.05 0.50 0.441 0.361 0.710 2 24 -11204 SG_CLIMAPLUS_ONE_#3_Kr92 4/10/4 0.95 0.50 0.441 0.361 0.710 2 18 -******************************************************************************************************************************** -11300 SG_CLIMATOP_UltraN_#2#5_Ar90 4/12/4/12/4 0.72 0.50 0.414 0.282 0.710 3 36 -11301 SG_CLIMATOP_UltraN_#2#5_Kr90 4/12/4/12/4 0.49 0.50 0.414 0.282 0.710 3 36 -11302 SG_CLIMATOP_ONE_#2#5_Ar90 4/12/4/12/4 0.68 0.37 0.312 0.439 0.580 3 36 -11303 SG_CLIMATOP_ONE_#2#5_Kr90 4/12/4/12/4 0.44 0.37 0.312 0.439 0.580 3 36 -11304 SG_CLIMATOP_LUX_#2#5_Ar90 4/14/4/14/4 0.73 0.62 0.520 0.199 0.730 3 40 -11305 SG_CLIMATOP_LUX_#2#5_Kr90 4/12/4/12/4 0.59 0.62 0.520 0.199 0.730 3 36 -11306 SG_CLIMATOP_MAX_#2#5_Ar90 4/12/4/12/4 0.75 0.55 0.443 0.215 0.740 3 36 -11307 SG_CLIMATOP_MAX_#2#5_Kr90 4/12/4/12/4 0.52 0.55 0.443 0.215 0.740 3 36 -******************************************************************************************************************************** -11400 SG_COOL-LITE_Xtreme_60/28_#2_Ar90 6/16/4 1.04 0.28 0.259 0.389 0.600 2 26 -11401 SG_COOL-LITE_SKN144II_40/23_#2_Ar90 6/16/4 1.12 0.23 0.200 0.303 0.400 2 26 -11402 SG_COOL-LITE_SKN154_50/27_#2_Ar90 6/16/4 1.04 0.27 0.241 0.341 0.500 2 26 -11403 SG_COOL-LITE_SKN165_60/33_#2_Ar90 6/16/4 1.12 0.33 0.299 0.316 0.610 2 26 -11404 SG_COOL-LITE_SKN174_68/41_#2_Ar90 6/16/4 1.12 0.41 0.380 0.277 0.680 2 26 -11405 SG_COOL-LITE_KNT155_47/37_#2_Ar90 6/16/4 1.45 0.37 0.318 0.188 0.470 2 26 -11406 SG_COOL-LITE_KNT164_57/46_#2_Ar90 6/16/4 1.44 0.46 0.405 0.163 0.580 2 26 -11407 SG_COOL-LITE_KS147_44/29_#2_Ar90 6/16/4 1.12 0.28 0.257 0.452 0.440 2 26 -11408 SG_UltraN_ANTELIO_silver_#3_Ar90 6/16/4 1.12 0.47 0.399 0.360 0.590 2 26 -11409 SG_UltraN_ANTELIO_green_#3_Ar90 6/16/4 1.12 0.29 0.242 0.244 0.480 2 26 -11410 SG_UltraN_ANTELIO_neut_#3_Ar90 6/16/4 1.12 0.36 0.296 0.352 0.410 2 26 -11411 SG_UltraN_ANTELIO_bronze_#3_Ar90 6/16/4 1.12 0.22 0.163 0.300 0.210 2 26 -11412 SG_UltraN_ST120_#3_Ar90 6/16/4 1.12 0.16 0.118 0.325 0.180 2 26 -11413 SG_UltraN_ST150_#3_Ar90 6/16/4 1.12 0.36 0.297 0.223 0.450 2 26 -11414 SG_UltraN_ST450_#3_Ar90 6/16/4 1.12 0.23 0.186 0.175 0.370 2 26 -11415 SG_UltraN_ST167_#3_Ar90 6/16/4 1.12 0.47 0.396 0.262 0.590 2 26 -11416 SG_ONE_ANTELIO_silver_#3_Ar90 6/16/4 1.04 0.38 0.337 0.435 0.550 2 26 -11417 SG_ONE_ANTELIO_green_#3_Ar90 6/16/4 1.04 0.25 0.208 0.265 0.430 2 26 -11418 SG_ONE_ANTELIO_neut_#3_Ar90 6/16/4 1.04 0.29 0.245 0.404 0.380 2 26 -11419 SG_ONE_ANTELIO_bronze_#3_Ar90 6/16/4 1.04 0.17 0.132 0.318 0.200 2 26 -11420 SG_ONE_ST120_#3_Ar90 6/16/4 1.04 0.13 0.101 0.330 0.160 2 26 -11421 SG_ONE_ST150_#3_Ar90 6/16/4 1.04 0.29 0.249 0.260 0.410 2 26 -11422 SG_ONE_ST450_#3_Ar90 6/16/4 1.04 0.20 0.160 0.187 0.330 2 26 -11423 SG_ONE_ST167_#3_Ar90 6/16/4 1.04 0.38 0.330 0.332 0.530 2 26 -******************************************************************************************************************************** -11500 SG_COOL-LITE_Xtreme_60/28_#2#5_Ar90 6/12/4/12/4 0.70 0.26 0.226 0.396 0.540 3 38 -11501 SG_COOL-LITE_SKN144II_40/23_#2#5_Ar90 6/12/4/12/4 0.72 0.21 0.170 0.307 0.360 3 38 -11502 SG_COOL-LITE_SKN154_50/27_#2#5_Ar90 6/12/4/12/4 0.70 0.24 0.207 0.347 0.450 3 38 -11503 SG_COOL-LITE_SKN165_60/33_#2#5_Ar90 6/12/4/12/4 0.72 0.30 0.255 0.325 0.540 3 38 -11504 SG_COOL-LITE_SKN174_68/41_#2#5_Ar90 6/12/4/12/4 0.72 0.37 0.316 0.292 0.610 3 38 -11505 SG_COOL-LITE_KNT155_47/37_#2#5_Ar90 6/12/4/12/4 0.82 0.30 0.243 0.201 0.420 3 38 -11506 SG_COOL-LITE_KNT164_57/46_#2#5_Ar90 6/12/4/12/4 0.82 0.38 0.304 0.185 0.510 3 38 -11507 SG_COOL-LITE_KS147_44/29_#2#5_Ar90 6/12/4/12/4 0.72 0.26 0.210 0.460 0.390 3 38 -11508 SG_UltraN_ANTELIO_silver_#3#5_Ar90 6/12/4/12/4 0.72 0.40 0.309 0.382 0.530 3 38 -11509 SG_UltraN_ANTELIO_green_#3#5_Ar90 6/12/4/12/4 0.72 0.25 0.200 0.250 0.430 3 38 -11510 SG_UltraN_ANTELIO_neut_#3#5_Ar90 6/12/4/12/4 0.72 0.30 0.222 0.367 0.370 3 38 -11511 SG_UltraN_ANTELIO_bronze_#3#5_Ar90 6/12/4/12/4 0.72 0.17 0.120 0.305 0.190 3 38 -11512 SG_UltraN_ST120_#3#5_Ar90 6/12/4/12/4 0.72 0.13 0.094 0.326 0.160 3 38 -11513 SG_UltraN_ST150_#3#5_Ar90 6/12/4/12/4 0.72 0.30 0.233 0.234 0.410 3 38 -11514 SG_UltraN_ST450_#3#5_Ar90 6/12/4/12/4 0.72 0.20 0.155 0.179 0.330 3 38 -11515 SG_UltraN_ST167_#3#5_Ar90 6/12/4/12/4 0.72 0.40 0.307 0.283 0.520 3 38 -11516 SG_ONE_ANTELIO_silver_#3#5_Ar90 6/12/4/12/4 0.68 0.30 0.243 0.475 0.450 3 38 -11517 SG_ONE_ANTELIO_green_#3#5_Ar90 6/12/4/12/4 0.68 0.20 0.158 0.280 0.360 3 38 -11518 SG_ONE_ANTELIO_neut_#3#5_Ar90 6/12/4/12/4 0.68 0.22 0.172 0.427 0.310 3 38 -11519 SG_ONE_ANTELIO_bronze_#3#5_Ar90 6/12/4/12/4 0.68 0.13 0.091 0.325 0.160 3 38 -11520 SG_ONE_ST120_#3#5_Ar90 6/12/4/12/4 0.68 0.11 0.075 0.334 0.130 3 38 -11521 SG_ONE_ST150_#3#5_Ar90 6/12/4/12/4 0.68 0.23 0.180 0.281 0.330 3 38 -11522 SG_ONE_ST450_#3#5_Ar90 6/12/4/12/4 0.68 0.16 0.122 0.197 0.270 3 38 -11523 SG_ONE_ST167_#3#5_Ar90 6/12/4/12/4 0.68 0.30 0.237 0.369 0.430 3 38 -******************************************************************************************************************************** -*WinID Description Design U-Value g-value T-sol Rf-sol T-vis_daylight Lay Width(mm) -******************************************************************************************************************************** -14200 GT_SANCO_SILVERSTAR_ENplus_#3_AIR 4/16/4 1.34 0.62 0.542 0.278 0.800 2 24 -14201 GT_SANCO_SILVERSTAR_ENplus_#3_AR90 4/16/4 1.12 0.62 0.542 0.278 0.800 2 24 -14202 GT_SANCO_SILVERSTAR_ENplus_#3_KR90 4/10/4 1.04 0.62 0.542 0.278 0.800 2 18 -14203 GT_SANCO_SILVERSTAR_ZERO_#3_AR90 4/16/4 1.04 0.50 0.425 0.395 0.710 2 24 -14204 GT_SANCO_SILVERSTAR_ZERO_#3_KR90 4/10/4 0.96 0.50 0.425 0.395 0.710 2 18 -14205 GT_SANCO_SILVERSTAR_FREEVISIONT_#3_AR90 4/16/4 1.04 0.49 0.424 0.339 0.720 2 24 -14206 GT_SANCO_SILVERSTAR_FREEVISIONT_#3_KR90 4/10/4 0.96 0.50 0.424 0.339 0.720 2 18 -14207 GT_SANCO_SILVERSTAR_SELEKT_#3_AR90 4/16/4 1.34 0.42 0.396 0.307 0.720 2 24 -14208 GT_SANCO_SILVERSTAR_SELEKT_#3_KR90 4/16/4 1.12 0.42 0.396 0.307 0.730 2 24 -******************************************************************************************************************************** -14300 GT_SANCO_PLUS_ENplus_#2#5_AR90 4/12/4/12/4 0.72 0.49 0.418 0.323 0.700 3 36 -14301 GT_SANCO_PLUS_ENplus_#2#5_KR90 4/12/4/12/4 0.49 0.49 0.418 0.323 0.700 3 36 -14302 GT_SANCO_PLUS_ZERO_#2#5_AR90 4/16/4/16/4 0.53 0.35 0.290 0.455 0.570 3 44 -14303 GT_SANCO_PLUS_ZERO_#2#5_AR90 4/12/4/12/4 0.44 0.35 0.290 0.455 0.570 3 36 -14304 GT_SANCO_SILVERSTAR_FREEVISIONT_#3#5_AR90 4/12/4/12/4 0.81 0.63 0.527 0.181 0.740 3 36 -14305 GT_SANCO_SILVERSTAR_TRIII_#2#5_AR90 4/12/4/12/4 0.75 0.51 0.433 0.294 0.710 3 36 -14306 GT_SANCO_SILVERSTAR_TRIII_#2#5_KR90 4/12/4/12/4 0.52 0.51 0.433 0.294 0.710 3 36 -14307 GT_SANCO_SILVERSTAR_TRIIIE_#2#5_AR90 4/12/4/12/4 0.83 0.62 0.530 0.212 0.730 3 36 -14308 GT_SANCO_SILVERSTAR_TRIIIE_#2#5_KR90 4/12/4/12/4 0.61 0.62 0.530 0.212 0.730 3 36 -******************************************************************************************************************************** -14400 GT_SANCO_COMBI_Neut_70/40_#2_AR90 6/16/4 1.12 0.42 0.390 0.281 0.720 2 26 -14401 GT_SANCO_COMBI_Neut_70/35_#2_AR90 6/16/4 1.04 0.37 0.348 0.333 0.700 2 26 -14402 GT_SANCO_COMBI_Neut_61/32_#2_AR90 6/16/4 1.04 0.34 0.312 0.284 0.610 2 26 -14403 GT_SANCO_COMBI_Neut_51/26_#2_AR90 6/16/4 1.04 0.27 0.252 0.348 0.510 2 26 -14404 GT_SANCO_SUPERSELEKT_60/27T_#2_AR90 6/16/4 1.04 0.27 0.252 0.371 0.600 2 26 -14405 GT_SANCO_SUPERSELEKT_35/14T_#2_AR90 6/16/4 1.04 0.15 0.129 0.324 0.350 2 26 -14406 GT_SANCO_COMBI_Neut_41/21_#2_AR90 6/16/4 1.04 0.22 0.196 0.319 0.410 2 26 -14407 GT_SANCO_COMBI_Silber_48T_#2_AR90 6/16/4 1.12 0.35 0.327 0.453 0.480 2 26 -14408 GT_SANCO_SUNSTOP_Neut_50T_#2_AR90 6/16/4 1.12 0.36 0.301 0.155 0.450 2 26 -14409 GT_SANCO_SUNSTOP_Blau_50T_#2_AR90 6/16/4 1.12 0.35 0.288 0.201 0.430 2 26 -14410 GT_SANCO_SUNSTOP_Blau_30T_#2_AR90 6/16/4 1.12 0.22 0.174 0.244 0.260 2 26 -14411 GT_SANCO_SUNSTOP_Silber_20T_#2_AR90 6/16/4 1.12 0.16 0.121 0.248 0.180 2 26 -******************************************************************************************************************************** -14501 GT_SANCO_COMBI_Neut_70/35_#2#5_AR90 6/14/4/14/4 0.62 0.34 0.294 0.350 0.620 3 42 -14502 GT_SANCO_COMBI_Neut_61/32_#2#5_AR90 6/14/4/14/4 0.62 0.30 0.263 0.297 0.540 3 42 -14503 GT_SANCO_COMBI_Neut_51/26_#2#5_AR90 6/14/4/14/4 0.62 0.25 0.214 0.357 0.460 3 42 -14504 GT_SANCO_COMBI_Neut_41/21_#2#5_AR90 6/14/4/14/4 0.62 0.20 0.166 0.325 0.360 3 42 diff --git a/archetypal/ressources/originBUISketchUp.idf b/archetypal/ressources/originBUISketchUp.idf deleted file mode 100644 index a5efcdf1..00000000 --- a/archetypal/ressources/originBUISketchUp.idf +++ /dev/null @@ -1,191 +0,0 @@ -!- =========== BUI-Template for TRNSYS 18 ========== -!-T18_Template_Start -!-********************************************************************************* -!-* TRNBuild 2.0.266 -!-********************************************************************************* -!-* BUILDING DESCRIPTIONS FILE TRNSYS -!-* FOR BUILDING: -!-* GET BY WORKING WITH TRNBuild 1.0 for Windows -!-********************************************************************************* -!-* -!-*-------------------------------------------------------------------------------- -!-* C o m m e n t s -!-*-------------------------------------------------------------------------------- -!-* -!-*-------------------------------------------------------------------------------- -!-* P r o j e c t -!-*-------------------------------------------------------------------------------- -!-*+++ PROJECT -!-*+++ TITLE=UNDEFINED -!-*+++ DESCRIPTION=UNDEFINED -!-*+++ CREATED=UNDEFINED -!-*+++ ADDRESS=UNDEFINED -!-*+++ CITY=UNDEFINED -!-*+++ SWITCH=UNDEFINED -!-*-------------------------------------------------------------------------------- -!-* P r o p e r t i e s -!-*-------------------------------------------------------------------------------- -!-PROPERTIES -!- DENSITY=1.204 : CAPACITY=1.012 : PRESSURE=101325.000 : HVAPOR=2454.0 : SIGMA=2.041e-007 : RTEMP=293.15 -!-*--- convective heat transfer coefficient calculation --------------------- -!- KFLOORUP=7.2 : EFLOORUP=0.31 : KFLOORDOWN=3.888 : EFLOORDOWN=0.31 -!- KCEILUP=7.2 : ECEILUP=0.31 : KCEILDOWN=3.888 : ECEILDOWN=0.31 -!- KVERTICAL=5.76 : EVERTICAL=0.3 -!-*--- radiance parameters ------------------- -!- SCENE_ROTATION_ANGLE=0 : GROUND_IDS= : GROUND_REFLECTANCE=0.2 : SHADER_REFLECTANCE=0 -!- CALC_MODE=RAD : LATITUDE=48 : LONGITUDE=-9.2 : TIME_ZONE=-15 : SITE_ELEVATION=200 -!- AB=5 : AD=1000 : AS=20 : AR=300 : AA=0.1 -!- LR=6 : ST=0.15 : SJ=1 : LW=0.004 : DJ=0 : DS=0.2 : DR=2 : DP=512 -!-*--- comfort parameters ------------------- -!- DIAM-SENSOR=0.07 : EPS-SENSOR=0.82 : REFL-SENSOR=0.47 : ELV_AIRSPEED1=0.3 : ELV_AIRSPEED2=0.7 : ELV_AIRSPEED3=1.2 -!-*--- other ------------------- -!- FSCAL_TREGENZA=MEDIUM : SHM_MODE=0 : SURFGRID=0.2 -!-*--- daylight ------------------- -!- UDIMIN=100 : UDIMAX=2000 : DAMIN=300 -!-* -!-*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!-TYPES -!-*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!-* -!-*-------------------------------------------------------------------------------- -!-* L a y e r s -!-*-------------------------------------------------------------------------------- -!-*-------------------------------------------------------------------------------- -!-* I n p u t s -!-*-------------------------------------------------------------------------------- -!-INPUTS TGROUND TBOUNDARY SHADE_CLOSE SHADE_OPEN MAX_ISHADE MAX_ESHADE -!-INPUTS_DESCRIPTION -!- TBOUNDARY : C : Boundary Temperature (boundary temperature used for boundary floors, walls, ceilings) -!- SHADE_CLOSE : kJ/hr.m^2 : threshold of total radiation on facade where shading device is activated -!- SHADE_OPEN : kJ/hr.m^2 : threshold of total radiation on facade where shading device is deactivated -!- MAX_ISHADE : any : max shading factor of internal shading -!- MAX_ESHADE : any : max shading factor of external shading -!-*-------------------------------------------------------------------------------- -!-* S c h e d u l e s -!-*-------------------------------------------------------------------------------- -!-*-------------------------------------------------------------------------------- -!-* C O N S T R U C T I O N (Wall, Floor, Ceiling,..) -!-*-------------------------------------------------------------------------------- -!-*-------------------------------------------------------------------------------- -!-* W i n d o w s -!-*-------------------------------------------------------------------------------- - -!-*-------------------------------------------------------------------------------- -!-* G a i n s -!-*-------------------------------------------------------------------------------- -!-*-------------------------------------------------------------------------------- -!-* C o m f o r t -!-*-------------------------------------------------------------------------------- -!-*-------------------------------------------------------------------------------- -!-* I n f i l t r a t i o n -!-*-------------------------------------------------------------------------------- -!-*-------------------------------------------------------------------------------- -!-* V e n t i l a t i o n -!-*-------------------------------------------------------------------------------- -!-*-------------------------------------------------------------------------------- -!-* C o o l i n g -!-*-------------------------------------------------------------------------------- -!-*-------------------------------------------------------------------------------- -!-* H e a t i n g -!-*-------------------------------------------------------------------------------- -!-*-------------------------------------------------------------------------------- -!-* D a y l i g h t C o n t r o l -!-*-------------------------------------------------------------------------------- -!-* -!-*-------------------------------------------------------------------------------- -!-* Z o n e s -!-*-------------------------------------------------------------------------------- -!-ZONES -!-*-------------------------------------------------------------------------------- -!-* O r i e n t a t i o n s -!-*-------------------------------------------------------------------------------- -!-HEMISPHERE NORTHERN -!-ORIENTATIONS H_0_0 -!-INTERNAL_CALCULATION H_0_0 -!-* -!-*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!-BUILDING -!-*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!-*-------------------------------------------------------------------------------- -!-* O u t p u t s -!-*-------------------------------------------------------------------------------- -!-OUTPUTS -!- TRANSFER : TIMEBASE=1.000 -!- DEFAULT -!-* -!-*-------------------------------------------------------------------------------- -!-* E n d -!-*-------------------------------------------------------------------------------- -!-END -!- -!-_EXTENSION_WINPOOL_START_ -!-*** END OF LIBRARY *** -!-******************************************************************************************************************************** -!-*WinID Description Design U-Value g-value T-sol Rf-sol T-vis_daylight Lay Width(mm) -!-******************************************************************************************************************************** -!-_EXTENSION_WINPOOL_END_ -!- -!-_EXTENSION_BuildingGeometry_START_ -!- -!-_EXTENSION_BuildingGeometry_END_ -!- -!- -!-_EXTENSION_VirtualSurfaceGeometry_START_ -!-_EXTENSION_VirtualSurfaceGeometry_END_ -!- -!- -!-_EXTENSION_ExternalShadingGeometry_START_ -!- -!-_EXTENSION_ExternalShadingGeometry_END_ -!- -!- -!-_EXTENSION_GeoPositionGeometry_START_ -!-_EXTENSION_GeoPositionGeometry_END_ -!- -!- -!-_EXTENSION_DaylightSensorPoints_START_ -!-_EXTENSION_DaylightSensorPoints_END_ -!- -!-T18_Template_Stop - - -!- =========== ALL OBJECTS IN CLASS: VERSION =========== - -!- =========== ALL OBJECTS IN CLASS: BUILDING =========== - -!- =========== ALL OBJECTS IN CLASS: LOCATION =========== - -!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== - Construction, - EXT_WINDOW1; !- Name -!- =========== ALL OBJECTS IN CLASS: SurfaceProperty:OtherSideCoefficients =========== -SurfaceProperty:OtherSideCoefficients, - BOUNDARY=IDENTICAL; -SurfaceProperty:OtherSideCoefficients, - BOUNDARY=INPUT 1*TBOUNDARY; -SurfaceProperty:OtherSideCoefficients, - BOUNDARY=INPUT 1*TBOUNDARY_2; -SurfaceProperty:OtherSideCoefficients, - BOUNDARY=INPUT 1*TBOUNDARY_3; -SurfaceProperty:OtherSideCoefficients, - BOUNDARY=INPUT 1*TGROUND; -SurfaceProperty:OtherSideCoefficients, - BOUNDARY=20; -SurfaceProperty:OtherSideCoefficients, - BOUNDARY=15; - -!- =========== ALL OBJECTS IN CLASS: WindowProperty:ShadingControl =========== - WindowProperty:ShadingControl, - ESHADE=0; ISHADE=0 !- Name - WindowProperty:ShadingControl, - ESHADE=INPUT 1*MAX_ESHADE : SHADECNTRL=ESHADE_INTERNAL; !- Name - WindowProperty:ShadingControl, - ISHADE=INPUT 1*MAX_ISHADE : SHADECNTRL=ISHADE_INTERNAL; !- Name - -!- =========== ALL OBJECTS IN CLASS: ZONE_TYPE =========== - - ZoneType, - 00_NOT_SELECTED; !- Name - !- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== - - Output:VariableDictionary,IDF; diff --git a/archetypal/schedule.py b/archetypal/schedule.py index 87ca7b0e..52781d96 100644 --- a/archetypal/schedule.py +++ b/archetypal/schedule.py @@ -1,293 +1,245 @@ -################################################################################ -# Module: schedule.py -# Description: Functions for handling conversion of EnergyPlus schedule objects -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal Schedule module.""" import functools import io import logging as lg -from calendar import calendar from datetime import datetime, timedelta from itertools import groupby import numpy as np import pandas as pd from energy_pandas import EnergySeries -from eppy.bunch_subclass import EpBunch -from numpy import ndarray +from eppy.bunch_subclass import BadEPFieldError +from validator_collection import checkers, validators from archetypal.utils import log -class Schedule(object): - """An object designed to handle any EnergyPlus schedule object""" +class ScheduleTypeLimits: + """ScheduleTypeLimits class.""" + + __slots__ = ("_name", "_lower_limit", "_upper_limit", "_numeric_type", "_unit_type") + + _NUMERIC_TYPES = ("continuous", "discrete") + _UNIT_TYPES = ( + "Dimensionless", + "Temperature", + "DeltaTemperature", + "PrecipitationRate", + "Angle", + "ConvectionCoefficient", + "ActivityLevel", + "Velocity", + "Capacity", + "Power", + "Availability", + "Percent", + "Control", + "Mode", + ) def __init__( self, Name, - idf=None, - start_day_of_the_week=None, - strict=False, - base_year=None, - schType=None, - Type=None, - Values=None, - epbunch=None, - **kwargs, + LowerLimit, + UpperLimit, + NumericType="Continuous", + UnitType="Dimensionless", ): - """ - Args: - Name (str): The schedule name in the idf model. - idf (IDF): The IDF model. - start_day_of_the_week (int): 0-based day of week (Monday=0). Default is - None which looks for the start day in the IDF model. - strict (bool): if True, schedules that have the Field-Sets such as - Holidays and CustomDay will raise an error if they are absent - from the IDF file. If False, any missing qualifiers will be - ignored. - base_year (int): The base year of the schedule. Defaults to 2018 - since the first day of that year is a Monday. - schType (str): The EnergyPlus schedule type. eg.: "Schedule:Year" - Type (str): This field contains a reference to the - Schedule Type Limits object. If found in a list of Schedule Type - Limits (see above), then the restrictions from the referenced - object will be used to validate the current field values. - Values (ndarray): A 24 or 8760 list of schedule values. - epbunch (EpBunch): An EpBunch object from which this schedule can - be created. - **kwargs: - """ - try: - kwargs["idf"] = idf - Name = kwargs.pop("Name", Name) - super(Schedule, self).__init__(Name, **kwargs) - except Exception as e: - pass # todo: make this more robust - self.strict = strict - self._idf = idf + """Initialize object.""" self.Name = Name - self.startDayOfTheWeek = self.get_sdow(start_day_of_the_week) - self.year = get_year_for_first_weekday(self.startDayOfTheWeek) - - self.count = 0 - self.startHOY = 1 - self.endHOY = 24 - self.unit = "unknown" - self.index_ = None - self._values = Values - self.schType = schType - self.Type = Type - - try: - self.epbunch = epbunch or self.idf.get_schedule_epbunch(self.Name) - except KeyError: - self.epbunch = None - - if self.Type is None: - self.Type = self.get_schedule_type_limits_name(sch_type=self.schType) + self.LowerLimit = LowerLimit + self.UpperLimit = UpperLimit + self.NumericType = NumericType + self.UnitType = UnitType @property - def idf(self): - if self._idf is None: - from .idfclass.idf import IDF - - self._idf = IDF() - return self._idf - - @classmethod - def from_values(cls, Name, Values, idf, Type="Fraction", **kwargs): - """ - Args: - Name: - Values: - idf: - Type: - **kwargs: - """ - return cls(Name=Name, Values=Values, Type=Type, idf=idf, **kwargs) - - @classmethod - def constant_schedule( - cls, hourly_value=1, Name="AlwaysOn", idf=None, Type="Fraction", **kwargs - ): - """Create a schedule with a constant value for the whole year. Defaults - to a schedule with a value of 1, named 'AlwaysOn'. - - Args: - hourly_value (float, optional): The value for the constant schedule. - Defaults to 1. - Name (str, optional): The name of the schedule. Defaults to Always - On. - idf: - **kwargs: - """ - if not idf: - from archetypal.idfclass.idf import IDF + def Name(self): + """Get or set the name of the ScheduleTypeLimits.""" + return self._name - idf = IDF(prep_outputs=False) - # Add the schedule to the existing idf - epbunch = idf.anidfobject( - key="Schedule:Constant".upper(), - Name=Name, - Schedule_Type_Limits_Name=Type, - Hourly_Value=hourly_value, - ) - return cls( - Name=Name, - Values=np.ones(8760) * hourly_value, - idf=idf, - epbunch=epbunch, - **kwargs, - ) + @Name.setter + def Name(self, value): + self._name = validators.string(value) @property - def all_values(self) -> np.ndarray: - """returns the values array""" - if self._values is None: - self._values = self.get_schedule_values(self.epbunch) - return self._values + def LowerLimit(self): + """Get or set the LowerLimit.""" + return self._lower_limit - @property - def max(self): - return max(self.all_values) + @LowerLimit.setter + def LowerLimit(self, value): + self._lower_limit = validators.float(value, allow_empty=True) @property - def min(self): - return min(self.all_values) + def UpperLimit(self): + """Get or set the UpperLimit.""" + return self._upper_limit + + @UpperLimit.setter + def UpperLimit(self, value): + self._upper_limit = validators.float(value, allow_empty=True) @property - def mean(self): - return np.average(self.all_values) + def NumericType(self): + """Get or set numeric type. Can be null.""" + return self._numeric_type + + @NumericType.setter + def NumericType(self, value): + validators.string(value, allow_empty=True) + if value is not None: + assert value.lower() in self._NUMERIC_TYPES, ( + f"Input error for value '{value}'. NumericType must " + f"be one of '{self._NUMERIC_TYPES}'" + ) + self._numeric_type = value @property - def series(self): - """Returns the schedule values as an :class:`EnergySeries` object with a - DateTimeIndex - """ - index = pd.date_range( - start=self.startDate, periods=len(self.all_values), freq="1H" + def UnitType(self): + """Get or set the unit type. Can be null.""" + return self._unit_type + + @UnitType.setter + def UnitType(self, value): + value = validators.string(value) + assert value.lower() in map(str.lower, self._UNIT_TYPES), ( + f"Input error for value '{value}'. UnitType must " + f"be one of '{self._UNIT_TYPES}'" ) - return EnergySeries(self.all_values, index=index, name=self.Name) + self._unit_type = value - def get_schedule_type_limits_name(self, sch_type=None): - """Return the Schedule Type Limits name associated to this schedule + @classmethod + def from_dict(cls, data): + """Create a ScheduleTypeLimit from a dictionary. Args: - sch_type: + data: ScheduleTypeLimit dictionary following the format below. + + .. code-block:: python + { + "Name": 'Fractional', + "LowerLimit": 0, + "UpperLimit": 1, + "NumericType": None, + "UnitType": "Dimensionless" + } """ - if self.epbunch is None: - schedule_values = self.idf.get_schedule_epbunch( - self.Name, sch_type=sch_type - ) - else: - schedule_values = self.epbunch - try: - schedule_limit_name = schedule_values.Schedule_Type_Limits_Name - except: - return "unknown" - else: - return schedule_limit_name + return cls(**data) - def get_schedule_type_limits_data(self, name=None): - """Returns Schedule Type Limits data from schedule name + @classmethod + def from_epbunch(cls, epbunch): + """Create a ScheduleTypeLimits from an epbunch. Args: - name: + epbunch (EpBunch): The epbunch of key "SCHEDULETYPELIMITS". """ + assert ( + epbunch.key.upper() == "SCHEDULETYPELIMITS" + ), f"Expected 'SCHEDULETYPELIMITS' epbunch. Got {epbunch.key}." + name = epbunch.Name + lower_limit = epbunch.Lower_Limit_Value + upper_limit = epbunch.Upper_Limit_Value + numeric_type = epbunch.Numeric_Type + unit_type = epbunch.Unit_Type + return cls( + Name=name, + LowerLimit=lower_limit if checkers.is_numeric(lower_limit) else None, + UpperLimit=upper_limit if checkers.is_numeric(upper_limit) else None, + NumericType=numeric_type + if checkers.is_string(numeric_type, minimum_length=1) + else "Continuous", + UnitType=unit_type + if checkers.is_string(unit_type, minimum_length=1) + else "Dimensionless", + ) - if name is None: - name = self.Name + def to_dict(self): + """Return ScheduleTypeLimits dictionary representation.""" + return { + "Name": self.Name, + "LowerLimit": self.LowerLimit, + "UpperLimit": self.UpperLimit, + "NumericType": self.NumericType, + "UnitType": self.UnitType, + } - schedule_values = self.epbunch - try: - schedule_limit_name = schedule_values.Schedule_Type_Limits_Name - except: - # this schedule is probably a 'Schedule:Week:Daily' which does - # not have a Schedule_Type_Limits_Name field - return "", "", "", "" - else: - ( - lower_limit, - upper_limit, - numeric_type, - unit_type, - ) = self.idf.get_schedule_type_limits_data_by_name(schedule_limit_name) + def to_epbunch(self, idf): + """Convert self to an epbunch given an idf model. - self.unit = unit_type - if self.unit == "unknown": - self.unit = numeric_type + Notes: + The object is added to the idf model. - return lower_limit, upper_limit, numeric_type, unit_type + Args: + idf (IDF): An IDF model. - def get_schedule_type(self, name=None): - """Return the schedule type, eg.: "Schedule:Year" + .. code-block:: python - Args: - name: + SCHEDULETYPELIMITS, + , !- Name + , !- Lower Limit Value + , !- Upper Limit Value + , !- Numeric Type + Dimensionless; !- Unit Type + + Returns: + EpBunch: The EpBunch object added to the idf model. """ - if name is None: - name = self.Name + return idf.newidfobject( + key="SCHEDULETYPELIMITS", + Name=self.Name, + Lower_Limit_Value=self.LowerLimit, + Upper_Limit_Value=self.UpperLimit, + Numeric_Type=self.NumericType, + Unit_Type=self.UnitType, + ) - schedule_values = self.epbunch - sch_type = schedule_values.key + def duplicate(self): + """Get copy of self.""" + return self.__copy__() - return sch_type + def __copy__(self): + """Get copy of self.""" + return self.__class__( + self.Name, self.LowerLimit, self.UpperLimit, self.NumericType, self.UnitType + ) - @property - def startDate(self): - """The start date of the schedule. Satisfies `startDayOfTheWeek`""" - year = get_year_for_first_weekday(self.startDayOfTheWeek) - return datetime(year, 1, 1) + def __repr__(self): + """Return the string representation of self.""" + return ( + self.Name + + f" {self.LowerLimit} < values < {self.UpperLimit}" + + f"Units: {self.UnitType}" + ) - def plot(self, slice=None, **kwargs): - """Plot the schedule. Implements the .loc accessor on the series object. + def __keys__(self): + """Get keys of self. Useful for hashing.""" + return ( + self.Name, + self.LowerLimit, + self.UpperLimit, + self.NumericType, + self.UnitType, + ) - Examples: - >>> from archetypal import IDF - >>> idf = IDF() - >>> s = Schedule( - >>> Name="NECB-A-Thermostat Setpoint-Heating", - >>> idf=idf) - >>> ) - >>> s.plot(slice=("2018/01/02", "2018/01/03"), drawstyle="steps-post") + def __eq__(self, other): + """Assert self is equal to other.""" + if not isinstance(other, ScheduleTypeLimits): + return NotImplemented + else: + return self.__keys__() == other.__keys__() - Args: - slice (tuple): define a 2-tuple object the will be passed to - :class:`pandas.IndexSlice` as a range. - **kwargs (dict): keyword arguments passed to - :meth:`pandas.Series.plot`. - """ - hourlyvalues = self.all_values - index = pd.date_range(self.startDate, periods=len(hourlyvalues), freq="1H") - series = pd.Series(hourlyvalues, index=index, dtype=float) - if slice is None: - slice = pd.IndexSlice[:] - elif len(slice) > 1: - slice = pd.IndexSlice[slice[0] : slice[1]] - label = kwargs.pop("label", self.Name) - ax = series.loc[slice].plot(**kwargs, label=label) - return ax - def plot2d(self, **kwargs): - """Plot the carpet plot of the schedule""" - return EnergySeries(self.series, name=self.Name).plot2d(**kwargs) +class _ScheduleParser: + """Class used to parse schedules in IDF files.""" - def get_interval_day_ep_schedule_values(self, epbunch: EpBunch) -> np.ndarray: - """Schedule:Day:Interval + @staticmethod + def get_interval_day_ep_schedule_values(epbunch) -> np.ndarray: + """Get values for Schedule:Day:Interval. Args: epbunch (EpBunch): The schedule EpBunch object. """ - - ( - lower_limit, - upper_limit, - numeric_type, - unit_type, - ) = self.get_schedule_type_limits_data(epbunch.Name) - number_of_day_sch = int((len(epbunch.fieldvalues) - 3) / 2) hourly_values = np.arange(24, dtype=float) @@ -304,35 +256,33 @@ def get_interval_day_ep_schedule_values(self, epbunch: EpBunch) -> np.ndarray: hourly_values[hour] = value start_hour = end_hour - + _, _, numeric_type, _ = _ScheduleParser.get_schedule_type_limits_data(epbunch) if numeric_type.strip().lower() == "discrete": hourly_values = hourly_values.astype(int) return hourly_values - def get_hourly_day_ep_schedule_values(self, epbunch): - """Schedule:Day:Hourly + @staticmethod + def get_hourly_day_ep_schedule_values(epbunch): + """Get values for Schedule:Day:Hourly. Args: epbunch (EpBunch): The schedule EpBunch object. """ + return np.array(epbunch.fieldvalues[3:]) - fieldvalues_ = np.array(epbunch.fieldvalues[3:]) - - return fieldvalues_ - + @staticmethod def get_compact_weekly_ep_schedule_values( - self, epbunch, start_date=None, index=None + epbunch, start_date, index=None, strict=False ) -> np.ndarray: - """schedule:week:compact + """Get values for schedule:week:compact. Args: + strict: epbunch (EpBunch): the name of the schedule start_date: index: """ - if start_date is None: - start_date = self.startDate if index is None: idx = pd.date_range(start=start_date, periods=168, freq="1H") slicer_ = pd.Series([False] * (len(idx)), index=idx) @@ -342,16 +292,14 @@ def get_compact_weekly_ep_schedule_values( weekly_schedules = pd.Series([0] * len(slicer_), index=slicer_.index) # update last day of schedule - if self.count == 0: - self.schType = epbunch.key - self.endHOY = 168 - num_of_daily_schedules = int(len(epbunch.fieldvalues[2:]) / 2) for i in range(num_of_daily_schedules): day_type = epbunch["DayType_List_{}".format(i + 1)].lower() # This field can optionally contain the prefix “For” - how = self.field_set(day_type.strip("for: "), slicer_) + how = _ScheduleParser._field_set( + epbunch, day_type.strip("for: "), start_date, slicer_, strict + ) if not weekly_schedules.loc[how].empty: # Loop through days and replace with day:schedule values days = [] @@ -362,21 +310,25 @@ def get_compact_weekly_ep_schedule_values( ref = epbunch.get_referenced_object( "ScheduleDay_Name_{}".format(i + 1) ) - day.loc[:] = self.get_schedule_values(sched_epbunch=ref) + day.loc[:] = _ScheduleParser.get_schedule_values( + sched_epbunch=ref, start_date=start_date, strict=strict + ) days.append(day) new = pd.concat(days) slicer_.update(pd.Series([True] * len(new.index), index=new.index)) - slicer_ = slicer_.apply(lambda x: x == True) + slicer_ = slicer_.apply(lambda x: x is True) weekly_schedules.update(new) else: return weekly_schedules.values return weekly_schedules.values - def get_daily_weekly_ep_schedule_values(self, epbunch) -> np.ndarray: - """schedule:week:daily + @staticmethod + def get_daily_weekly_ep_schedule_values(epbunch, start_date, strict) -> np.ndarray: + """Get values for schedule:week:daily. Args: + strict: epbunch (EpBunch): The schedule EpBunch object. """ # 7 list for 7 days of the week @@ -391,22 +343,24 @@ def get_daily_weekly_ep_schedule_values(self, epbunch) -> np.ndarray: "Sunday", ]: ref = epbunch.get_referenced_object("{}_ScheduleDay_Name".format(day)) - h = self.get_schedule_values(sched_epbunch=ref) + h = _ScheduleParser.get_schedule_values( + sched_epbunch=ref, start_date=start_date, strict=strict + ) hourly_values.append(h) hourly_values = np.array(hourly_values) # shift days earlier by self.startDayOfTheWeek - hourly_values = np.roll(hourly_values, -self.startDayOfTheWeek, axis=0) + hourly_values = np.roll(hourly_values, -start_date.weekday(), axis=0) return hourly_values.ravel() - def get_list_day_ep_schedule_values(self, epbunch) -> np.ndarray: - """schedule:day:list + @staticmethod + def get_list_day_ep_schedule_values(epbunch, start_date) -> np.ndarray: + """Get values for schedule:day:list. Args: + start_date: epbunch (EpBunch): The schedule epbunch object. """ - import pandas as pd - freq = int(epbunch["Minutes_per_Item"]) # Frequency of the values num_values = epbunch.fieldvalues[5:] # List of values method = epbunch["Interpolate_to_Timestep"] # How to resample @@ -417,11 +371,11 @@ def get_list_day_ep_schedule_values(self, epbunch) -> np.ndarray: for i in all_values: try: all_values[i] = num_values[i] - except: + except Exception: all_values[i] = 0 # create a fake index to help us with the resampling index = pd.date_range( - start=self.startDate, periods=(24 * 60) / freq, freq="{}T".format(freq) + start=start_date, periods=(24 * 60) / freq, freq="{}T".format(freq) ) series = pd.Series(all_values, index=index) @@ -430,31 +384,26 @@ def get_list_day_ep_schedule_values(self, epbunch) -> np.ndarray: return series.values - def get_constant_ep_schedule_values(self, epbunch) -> np.ndarray: - """schedule:constant + @staticmethod + def get_constant_ep_schedule_values(epbunch) -> np.ndarray: + """Get values for schedule:constant. Args: epbunch (EpBunch): The schedule epbunch object. """ - ( - lower_limit, - upper_limit, - numeric_type, - unit_type, - ) = self.get_schedule_type_limits_data(epbunch.Name) - hourly_values = np.arange(8760) value = float(epbunch["Hourly_Value"]) for hour in hourly_values: hourly_values[hour] = value - + _, _, numeric_type, _ = _ScheduleParser.get_schedule_type_limits_data(epbunch) if numeric_type.strip().lower() == "discrete": hourly_values = hourly_values.astype(int) return hourly_values - def get_file_ep_schedule_values(self, epbunch) -> np.ndarray: - """schedule:file + @staticmethod + def get_file_ep_schedule_values(epbunch) -> np.ndarray: + """Get values for schedule:file. Args: epbunch (EpBunch): The schedule epbunch object. @@ -462,11 +411,11 @@ def get_file_ep_schedule_values(self, epbunch) -> np.ndarray: filename = epbunch["File_Name"] column = epbunch["Column_Number"] rows = epbunch["Rows_to_Skip_at_Top"] - hours = epbunch["Number_of_Hours_of_Data"] + # hours = epbunch["Number_of_Hours_of_Data"] sep = epbunch["Column_Separator"] - interp = epbunch["Interpolate_to_Timestep"] + # interp = epbunch["Interpolate_to_Timestep"] - file = self.idf.simulation_dir.files(filename)[0] + file = epbunch.theidf.simulation_dir.files(filename)[0] delimeter = _separator(sep) skip_rows = int(rows) - 1 # We want to keep the column @@ -477,43 +426,48 @@ def get_file_ep_schedule_values(self, epbunch) -> np.ndarray: return epbunch.iloc[:, 0].values - def get_compact_ep_schedule_values(self, epbunch) -> np.ndarray: - """schedule:compact + @staticmethod + def get_compact_ep_schedule_values(epbunch, start_date, strict) -> np.ndarray: + """Get values for schedule:compact. Args: + strict: + start_date: epbunch (EpBunch): The schedule epbunch object. """ field_sets = ["through", "for", "interpolate", "until", "value"] fields = epbunch.fieldvalues[3:] - index = pd.date_range(start=self.startDate, periods=8760, freq="H") + index = pd.date_range(start=start_date, periods=8760, freq="H") zeros = np.zeros(len(index)) slicer_ = pd.Series([False] * len(index), index=index) series = pd.Series(zeros, index=index) - from_day = self.startDate - ep_from_day = datetime(self.year, 1, 1) + from_day = start_date + ep_from_day = datetime(start_date.year, 1, 1) from_time = "00:00" how_interpolate = None for field in fields: if any([spe in field.lower() for spe in field_sets]): - f_set, hour, minute, value = self._field_interpreter(field) + f_set, hour, minute, value = _ScheduleParser._field_interpreter( + field, epbunch.Name + ) if f_set.lower() == "through": # main condition. All sub-conditions must obey a # `Through` condition # First, initialize the slice (all False for now) - through_conditions = self.invalidate_condition(series) + through_conditions = _ScheduleParser._invalidate_condition(series) # reset from_time from_time = "00:00" # Prepare ep_to_day variable - ep_to_day = self._date_field_interpretation(value) + timedelta( - days=1 - ) + ep_to_day = _ScheduleParser._date_field_interpretation( + value, start_date + ) + timedelta(days=1) # Calculate Timedelta in days days = (ep_to_day - ep_from_day).days @@ -530,31 +484,37 @@ def get_compact_ep_schedule_values(self, epbunch) -> np.ndarray: # reset from_time from_time = "00:00" - for_condition = self.invalidate_condition(series) + for_condition = _ScheduleParser._invalidate_condition(series) fors = value.split() if len(fors) > 1: # if multiple `For`. eg.: For: Weekends Holidays, - # Combine both conditions + # Combine all conditions for value in fors: if value.lower() == "allotherdays": # Apply condition to slice - how = self.field_set(value, slicer_) - # Reset through condition - through_conditions = how + how = _ScheduleParser._field_set( + epbunch, value, start_date, slicer_, strict + ) + # Reset for condition for_condition = how else: - how = self.field_set(value, slicer_) + how = _ScheduleParser._field_set( + epbunch, value, start_date, slicer_, strict + ) if how is not None: for_condition.loc[how] = True elif value.lower() == "allotherdays": # Apply condition to slice - how = self.field_set(value, slicer_) - # Reset through condition - through_conditions = how + how = _ScheduleParser._field_set( + epbunch, value, start_date, slicer_, strict + ) + # Reset for condition for_condition = how else: # Apply condition to slice - how = self.field_set(value, slicer_) + how = _ScheduleParser._field_set( + epbunch, value, start_date, slicer_, strict + ) for_condition.loc[how] = True # Combine the for_condition with all_conditions @@ -565,7 +525,7 @@ def get_compact_ep_schedule_values(self, epbunch) -> np.ndarray: elif "interpolate" in f_set.lower(): # we need to upsample to series to 8760 * 60 values new_idx = pd.date_range( - start=self.startDate, periods=525600, closed="left", freq="T" + start=start_date, periods=525600, closed="left", freq="T" ) series = series.resample("T").pad() series = series.reindex(new_idx) @@ -578,7 +538,7 @@ def get_compact_ep_schedule_values(self, epbunch) -> np.ndarray: for_condition.fillna(method="pad", inplace=True) how_interpolate = value.lower() elif f_set.lower() == "until": - until_condition = self.invalidate_condition(series) + until_condition = _ScheduleParser._invalidate_condition(series) if series.index.freq.name == "T": # until_time = str(int(hour) - 1) + ':' + minute until_time = timedelta( @@ -617,14 +577,128 @@ def get_compact_ep_schedule_values(self, epbunch) -> np.ndarray: else: return series.values - def _field_interpreter(self, field): - """dealing with a Field-Set (Through, For, Interpolate, # Until, Value) - and return the parsed string + @classmethod + def get_yearly_ep_schedule_values(cls, epbunch, start_date, strict) -> np.ndarray: + """Get values for schedule:year. Args: - field: + strict: + start_date (datetime): + epbunch (EpBunch): the schedule epbunch. + """ + # first week + year = start_date.year + idx = pd.date_range(start=start_date, periods=8760, freq="1H") + hourly_values = pd.Series([0] * 8760, index=idx) + + # generate weekly schedules + num_of_weekly_schedules = int(len(epbunch.fieldvalues[3:]) / 5) + + for i in range(num_of_weekly_schedules): + ref = epbunch.get_referenced_object("ScheduleWeek_Name_{}".format(i + 1)) + + start_month = getattr(epbunch, "Start_Month_{}".format(i + 1)) + end_month = getattr(epbunch, "End_Month_{}".format(i + 1)) + start_day = getattr(epbunch, "Start_Day_{}".format(i + 1)) + end_day = getattr(epbunch, "End_Day_{}".format(i + 1)) + + start = datetime.strptime( + "{}/{}/{}".format(year, start_month, start_day), "%Y/%m/%d" + ) + end = datetime.strptime( + "{}/{}/{}".format(year, end_month, end_day), "%Y/%m/%d" + ) + days = (end - start).days + 1 + + end_date = start_date + timedelta(days=days) + timedelta(hours=23) + how = pd.IndexSlice[start_date:end_date] + + weeks = [] + for name, week in hourly_values.loc[how].groupby(pd.Grouper(freq="168H")): + if not week.empty: + try: + week.loc[:] = cls.get_schedule_values( + sched_epbunch=ref, + start_date=week.index[0], + index=week.index, + strict=strict, + ) + except ValueError: + week.loc[:] = cls.get_schedule_values( + sched_epbunch=ref, start_date=week.index[0], strict=strict + )[0 : len(week)] + finally: + weeks.append(week) + new = pd.concat(weeks) + hourly_values.update(new) + start_date += timedelta(days=days) + + return hourly_values.values + + @staticmethod + def get_schedule_values( + sched_epbunch, start_date, index=None, strict=False + ) -> list: + """Get schedule values for epbunch. + + Args: + strict: + sched_epbunch (EpBunch): the schedule epbunch object + start_date: + index: """ + cls = _ScheduleParser + sch_type = sched_epbunch.key.upper() + + if sch_type.upper() == "schedule:year".upper(): + hourly_values = cls.get_yearly_ep_schedule_values( + sched_epbunch, start_date, strict + ) + elif sch_type.upper() == "schedule:day:interval".upper(): + hourly_values = cls.get_interval_day_ep_schedule_values(sched_epbunch) + elif sch_type.upper() == "schedule:day:hourly".upper(): + hourly_values = cls.get_hourly_day_ep_schedule_values(sched_epbunch) + elif sch_type.upper() == "schedule:day:list".upper(): + hourly_values = cls.get_list_day_ep_schedule_values( + sched_epbunch, start_date + ) + elif sch_type.upper() == "schedule:week:compact".upper(): + hourly_values = cls.get_compact_weekly_ep_schedule_values( + sched_epbunch, start_date, index, strict + ) + elif sch_type.upper() == "schedule:week:daily".upper(): + hourly_values = cls.get_daily_weekly_ep_schedule_values( + sched_epbunch, start_date, strict + ) + elif sch_type.upper() == "schedule:constant".upper(): + hourly_values = cls.get_constant_ep_schedule_values(sched_epbunch) + elif sch_type.upper() == "schedule:compact".upper(): + hourly_values = cls.get_compact_ep_schedule_values( + sched_epbunch, start_date, strict + ) + elif sch_type.upper() == "schedule:file".upper(): + hourly_values = cls.get_file_ep_schedule_values(sched_epbunch) + else: + log( + "Archetypal does not currently support schedules of type " + '"{}"'.format(sch_type), + lg.WARNING, + ) + hourly_values = [] + + return list(hourly_values) + + @staticmethod + def _field_interpreter(field, name): + """Deal with a Field-Set (Through, For, Interpolate, # Until, Value). + + Args: + name: + field: + Returns: + string: the parsed string + """ values_sets = [ "weekdays", "weekends", @@ -654,9 +728,7 @@ def _field_interpreter(self, field): else: msg = ( 'The schedule "{sch}" contains a Field ' - 'that is not understood: "{field}"'.format( - sch=self.Name, field=field - ) + 'that is not understood: "{field}"'.format(sch=name, field=field) ) raise NotImplementedError(msg) elif "for" in field.lower(): @@ -678,16 +750,14 @@ def _field_interpreter(self, field): # parse without a colon msg = ( 'The schedule "{sch}" contains a Field ' - 'that is not understood: "{field}"'.format( - sch=self.Name, field=field - ) + 'that is not understood: "{field}"'.format(sch=name, field=field) ) raise NotImplementedError(msg) elif "interpolate" in field.lower(): msg = ( 'The schedule "{sch}" contains sub-hourly values (' 'Field-Set="{field}"). The average over the hour is ' - "taken".format(sch=self.Name, field=field) + "taken".format(sch=name, field=field) ) log(msg, lg.WARNING) f_set, value = field.split(":") @@ -701,7 +771,7 @@ def _field_interpreter(self, field): hour = hour.strip() # remove trailing spaces minute = minute.strip() # remove trailing spaces value = None - except: + except Exception: f_set = "until" hour, minute = field.split(":") hour = hour[-2:].strip() @@ -710,9 +780,7 @@ def _field_interpreter(self, field): else: msg = ( 'The schedule "{sch}" contains a Field ' - 'that is not understood: "{field}"'.format( - sch=self.Name, field=field - ) + 'that is not understood: "{field}"'.format(sch=name, field=field) ) raise NotImplementedError(msg) elif "value" in field.lower(): @@ -725,9 +793,7 @@ def _field_interpreter(self, field): else: msg = ( 'The schedule "{sch}" contains a Field ' - 'that is not understood: "{field}"'.format( - sch=self.Name, field=field - ) + 'that is not understood: "{field}"'.format(sch=name, field=field) ) raise NotImplementedError(msg) else: @@ -740,127 +806,546 @@ def _field_interpreter(self, field): return f_set, hour, minute, value @staticmethod - def invalidate_condition(series): - """ - Args: - series: - """ + def _invalidate_condition(series): index = series.index periods = len(series) return pd.Series([False] * periods, index=index) - def get_yearly_ep_schedule_values(self, epbunch) -> np.ndarray: - """schedule:year - - Args: - epbunch (EpBunch): the schedule epbunch. - """ - # first week - - start_date = self.startDate - idx = pd.date_range(start=start_date, periods=8760, freq="1H") - hourly_values = pd.Series([0] * 8760, index=idx) + @staticmethod + def get_schedule_type_limits_data(epbunch): + """Return schedule type limits info for epbunch.""" + try: + schedule_limit_name = epbunch.Schedule_Type_Limits_Name + except Exception: + # this schedule is probably a 'Schedule:Week:Daily' which does + # not have a Schedule_Type_Limits_Name field + return "", "", "", "" + else: + ( + lower_limit, + upper_limit, + numeric_type, + unit_type, + ) = epbunch.theidf.get_schedule_type_limits_data_by_name( + schedule_limit_name + ) - # update last day of schedule - self.endHOY = 8760 + return lower_limit, upper_limit, numeric_type, unit_type - # generate weekly schedules - num_of_weekly_schedules = int(len(epbunch.fieldvalues[3:]) / 5) + @staticmethod + def _field_set(schedule_epbunch, field, start_date, slicer_=None, strict=False): + """Return the proper slicer depending on the _field_set value. - for i in range(num_of_weekly_schedules): - ref = epbunch.get_referenced_object("ScheduleWeek_Name_{}".format(i + 1)) + Available values are: Weekdays, Weekends, Holidays, Alldays, + SummerDesignDay, WinterDesignDay, Sunday, Monday, Tuesday, Wednesday, + Thursday, Friday, Saturday, CustomDay1, CustomDay2, AllOtherDays - start_month = getattr(epbunch, "Start_Month_{}".format(i + 1)) - end_month = getattr(epbunch, "End_Month_{}".format(i + 1)) - start_day = getattr(epbunch, "Start_Day_{}".format(i + 1)) - end_day = getattr(epbunch, "End_Day_{}".format(i + 1)) + Args: + start_date: + strict: + schedule_epbunch: + field (str): The EnergyPlus field set value. + slicer_: - start = datetime.strptime( - "{}/{}/{}".format(self.year, start_month, start_day), "%Y/%m/%d" + Returns: + (indexer-like): Returns the appropriate indexer for the series. + """ + if field.lower() == "weekdays": + # return only days of weeks + return lambda x: x.index.dayofweek < 5 + elif field.lower() == "weekends": + # return only weekends + return lambda x: x.index.dayofweek >= 5 + elif field.lower() == "alldays": + # return all days := equivalent to .loc[:] + return pd.IndexSlice[:] + elif field.lower() == "allotherdays": + # return unused days (including special days). Uses the global + # variable `slicer_` + import operator + + if slicer_ is not None: + return _conjunction( + *[ + _ScheduleParser.special_day( + schedule_epbunch, field, slicer_, strict, start_date + ), + ~slicer_, + ], + logical=operator.or_, + ) + else: + raise NotImplementedError + elif field.lower() == "sunday": + # return only sundays + return lambda x: x.index.dayofweek == 6 + elif field.lower() == "monday": + # return only mondays + return lambda x: x.index.dayofweek == 0 + elif field.lower() == "tuesday": + # return only Tuesdays + return lambda x: x.index.dayofweek == 1 + elif field.lower() == "wednesday": + # return only Wednesdays + return lambda x: x.index.dayofweek == 2 + elif field.lower() == "thursday": + # return only Thursdays + return lambda x: x.index.dayofweek == 3 + elif field.lower() == "friday": + # return only Fridays + return lambda x: x.index.dayofweek == 4 + elif field.lower() == "saturday": + # return only Saturdays + return lambda x: x.index.dayofweek == 5 + elif field.lower() == "summerdesignday": + # return _ScheduleParser.design_day( + # schedule_epbunch, field, slicer_, start_date, strict + # ) + return None + elif field.lower() == "winterdesignday": + # return _ScheduleParser.design_day( + # schedule_epbunch, field, slicer_, start_date, strict + # ) + return None + elif field.lower() == "holiday" or field.lower() == "holidays": + field = "holiday" + return _ScheduleParser.special_day( + schedule_epbunch, field, slicer_, strict, start_date ) - end = datetime.strptime( - "{}/{}/{}".format(self.year, end_month, end_day), "%Y/%m/%d" + elif not strict: + # If not strict, ignore missing field-sets such as CustomDay1 + return lambda x: x < 0 + else: + raise NotImplementedError( + f"Archetypal does not yet support The Field_set '{field}'" ) - days = (end - start).days + 1 - end_date = start_date + timedelta(days=days) + timedelta(hours=23) - how = pd.IndexSlice[start_date:end_date] + @staticmethod + def _date_field_interpretation(field, start_date): + """Date Field Interpretation. - weeks = [] - for name, week in hourly_values.loc[how].groupby(pd.Grouper(freq="168H")): - if not week.empty: - try: - week.loc[:] = self.get_schedule_values( - sched_epbunch=ref, - start_date=week.index[0], - index=week.index, - ) - except ValueError: - week.loc[:] = self.get_schedule_values( - sched_epbunch=ref, start_date=week.index[0] - )[0 : len(week)] - finally: - weeks.append(week) - new = pd.concat(weeks) - hourly_values.update(new) - start_date += timedelta(days=days) + Info: + See EnergyPlus documentation for more details: 1.6.8.1.2 Field: + Start Date (Table 1.4: Date Field Interpretation) - return hourly_values.values + Args: + start_date: + field (str): The EnergyPlus Field Contents - def get_schedule_values( - self, sched_epbunch, start_date=None, index=None - ) -> np.ndarray: - """Main function that returns the schedule values + Returns: + (datetime): The datetime object + """ + # < number > Weekday in Month + formats = ["%m/%d", "%d %B", "%B %d", "%d %b", "%b %d"] + date = None + for format_str in formats: + # Tru to parse using each defined formats + try: + date = datetime.strptime(field, format_str) + except Exception: + pass + else: + date = datetime(start_date.year, date.month, date.day) + if date is None: + # if the defined formats did not work, try the fancy parse + try: + date = _ScheduleParser._parse_fancy_string(field, start_date) + except Exception as e: + msg = ( + f"the schedule contains a " + f"Field that is not understood: '{field}'" + ) + raise ValueError(msg, e) + else: + return date + else: + return date + + @staticmethod + def _parse_fancy_string(field, start_date): + """Parse cases such as `3rd Monday in February` or `Last Weekday In Month`. Args: - sched_epbunch (EpBunch): the schedule epbunch object start_date: - index: + field (str): The EnergyPlus Field Contents + + Returns: + (datetime): The datetime object """ - if self.count == 0: - # This is the first time, get the schedule type and the type limits. - if self.Type is None: - self.Type = self.get_schedule_type_limits_name() - self.count += 1 + import re - sch_type = sched_epbunch.key.upper() + # split the string at the term ' in ' + time, month = field.lower().split(" in ") + month = datetime.strptime(month, "%B").month - if sch_type.upper() == "schedule:year".upper(): - hourly_values = self.get_yearly_ep_schedule_values(sched_epbunch) - elif sch_type.upper() == "schedule:day:interval".upper(): - hourly_values = self.get_interval_day_ep_schedule_values(sched_epbunch) - elif sch_type.upper() == "schedule:day:hourly".upper(): - hourly_values = self.get_hourly_day_ep_schedule_values(sched_epbunch) - elif sch_type.upper() == "schedule:day:list".upper(): - hourly_values = self.get_list_day_ep_schedule_values(sched_epbunch) - elif sch_type.upper() == "schedule:week:compact".upper(): - hourly_values = self.get_compact_weekly_ep_schedule_values( - sched_epbunch, start_date, index + # split the first part into nth and dayofweek + nth, dayofweek = time.split(" ") + if "last" in nth: + nth = -1 # Use the last one + else: + nth = re.findall(r"\d+", nth) # use the nth one + nth = int(nth[0]) - 1 # python is zero-based + + weekday = { + "monday": 0, + "tuesday": 1, + "wednesday": 2, + "thursday": 3, + "friday": 4, + "saturday": 5, + "sunday": 6, + } + + # parse the dayofweek eg. monday + dayofweek = weekday.get(dayofweek, 6) + + # create list of possible days using Calendar + import calendar + + c = calendar.Calendar(firstweekday=start_date.weekday()) + monthcal = c.monthdatescalendar(start_date.year, month) + + # iterate though the month and get the nth weekday + date = [ + day + for week in monthcal + for day in week + if day.weekday() == dayofweek and day.month == month + ][nth] + return datetime(date.year, date.month, date.day) + + @staticmethod + def special_day(schedule_epbunch, field, slicer_, strict, start_date): + """Try to get the RunPeriodControl:SpecialDays for the corresponding DayType. + + Args: + start_date: + strict: + field: + slicer_: + """ + sp_slicer_ = slicer_.copy() + sp_slicer_.loc[:] = False + special_day_types = ["holiday", "customday1", "customday2"] + + dds = schedule_epbunch.theidf.idfobjects["RunPeriodControl:SpecialDays".upper()] + dd = [ + dd + for dd in dds + if dd.Special_Day_Type.lower() == field + or dd.Special_Day_Type.lower() in special_day_types + ] + if len(dd) > 0: + for dd in dd: + # can have more than one special day types + field = dd.Start_Date + special_day_start_date = _ScheduleParser._date_field_interpretation( + field, start_date + ) + duration = int(dd.Duration) + to_date = ( + special_day_start_date + + timedelta(days=duration) + + timedelta(hours=-1) + ) + + sp_slicer_.loc[special_day_start_date:to_date] = True + return sp_slicer_ + elif not strict: + return sp_slicer_ + else: + msg = ( + 'Could not find a "SizingPeriod:DesignDay" object ' + 'needed for schedule with Day Type "{}"'.format(field.capitalize()) ) - elif sch_type.upper() == "schedule:week:daily".upper(): - hourly_values = self.get_daily_weekly_ep_schedule_values(sched_epbunch) - elif sch_type.upper() == "schedule:constant".upper(): - hourly_values = self.get_constant_ep_schedule_values(sched_epbunch) - elif sch_type.upper() == "schedule:compact".upper(): - hourly_values = self.get_compact_ep_schedule_values(sched_epbunch) - elif sch_type.upper() == "schedule:file".upper(): - hourly_values = self.get_file_ep_schedule_values(sched_epbunch) + raise ValueError(msg) + + @staticmethod + def design_day(schedule_epbunch, field, slicer_, start_date, strict): + """Try to get the SizingPeriod:DesignDay for the corresponding Day Type. + + Args: + strict: + start_date: + schedule_epbunch: + field: + slicer_: + """ + sp_slicer_ = slicer_.copy() + sp_slicer_.loc[:] = False + dds = schedule_epbunch.theidf.idfobjects["SizingPeriod:DesignDay".upper()] + dd = [dd for dd in dds if dd.Day_Type.lower() == field] + if len(dd) > 0: + for dd in dd: + # should have found only one design day matching the Day Type + month = dd.Month + day = dd.Day_of_Month + data = str(month) + "/" + str(day) + ep_start_date = _ScheduleParser._date_field_interpretation( + data, start_date + ) + ep_orig = datetime(start_date.year, 1, 1) + days_to_speciald = (ep_start_date - ep_orig).days + duration = 1 # Duration of 1 day + from_date = start_date + timedelta(days=days_to_speciald) + to_date = from_date + timedelta(days=duration) + timedelta(hours=-1) + + sp_slicer_.loc[from_date:to_date] = True + return sp_slicer_ + elif not strict: + return sp_slicer_ else: - log( - "Archetypal does not currently support schedules of type " - '"{}"'.format(sch_type), - lg.WARNING, + msg = ( + f"Could not find a 'SizingPeriod:DesignDay' object " + f"needed for schedule with Day Type '{field.capitalize()}'" ) - hourly_values = [] + raise ValueError(msg) + data = [dd[0].Month, dd[0].Day_of_Month] + date = "/".join([str(item).zfill(2) for item in data]) + date = _ScheduleParser._date_field_interpretation(date, start_date) + return lambda x: x.index == date + + +class Schedule: + """Class handling any EnergyPlus schedule object.""" + + def __init__( + self, + Name, + start_day_of_the_week=0, + strict=False, + Type=None, + Values=None, + **kwargs, + ): + """Initialize object. + + Args: + Name (str): The schedule name in the idf model. + start_day_of_the_week (int): 0-based day of week (Monday=0). Default is + None which looks for the start day in the IDF model. + strict (bool): if True, schedules that have the Field-Sets such as + Holidays and CustomDay will raise an error if they are absent + from the IDF file. If False, any missing qualifiers will be + ignored. + Type (str, ScheduleTypeLimits): This field contains a reference to the + Schedule Type Limits object. If found in a list of Schedule Type + Limits (see above), then the restrictions from the referenced + object will be used to validate the current field values. If None, + no validation will occur. + Values (ndarray): A 24 or 8760 list of schedule values. + **kwargs: + """ + try: + super(Schedule, self).__init__(Name, **kwargs) + except Exception: + pass # todo: make this more robust + self.Name = Name + self.strict = strict + self.startDayOfTheWeek = start_day_of_the_week + self.year = get_year_for_first_weekday(self.startDayOfTheWeek) + self.Values = Values + self.Type = Type + + @property + def Type(self): + """Get or set the schedule type limits object. Can be None.""" + return self._schedule_type_limits + + @Type.setter + def Type(self, value): + if isinstance(value, str): + if "fraction" in value.lower(): + value = ScheduleTypeLimits("Fraction", 0, 1) + elif value.lower() == "temperature": + value = ScheduleTypeLimits("Temperature", -100, 100) + else: + raise ValueError( + f"'{value}' is not a known ScheduleTypeLimits for " + f"{self.Name}. Please instantiate the object before " + f"passing as the 'Type' parameter." + ) + assert isinstance(value, ScheduleTypeLimits), value + self._schedule_type_limits = value + + @property + def Values(self): + """Get or set the list of schedule values.""" + return self._values + + @Values.setter + def Values(self, value): + if isinstance(value, np.ndarray): + assert value.ndim == 1, value.ndim + value = value.tolist() + self._values = validators.iterable(value, allow_empty=True) + + @property + def Name(self): + """Get or set the name of the schedule.""" + return self._name + + @Name.setter + def Name(self, value): + self._name = value + + @classmethod + def from_values(cls, Name, Values, Type="Fraction", **kwargs): + """Create a Schedule from a list of Values. + + Args: + Name: + Values: + Type: + **kwargs: + """ + return cls(Name=Name, Values=Values, Type="Fraction", **kwargs) + + @classmethod + def from_epbunch(cls, epbunch, strict=False, Type=None, **kwargs): + """Create a Schedule from an epbunch. + + Args: + epbunch: + strict: + **kwargs: + + """ + if Type is None: + try: + type_limit_ep = epbunch.get_referenced_object( + "Schedule_Type_Limits_Name" + ) + Type = ScheduleTypeLimits.from_epbunch(type_limit_ep) + except (BadEPFieldError, AttributeError): + pass + name = epbunch.Name + start_day_of_the_week = epbunch.theidf.day_of_week_for_start_day + start_date = datetime(get_year_for_first_weekday(start_day_of_the_week), 1, 1) + + schedule = cls( + Name=kwargs.pop("Name", name), + epbunch=epbunch, + start_day_of_the_week=kwargs.pop( + "start_day_of_the_week", start_day_of_the_week + ), + Type=Type, + DataSource=kwargs.pop("DataSource", epbunch.theidf.name), + Values=np.array( + _ScheduleParser.get_schedule_values( + epbunch, start_date=start_date, strict=strict + ) + ), + **kwargs, + ) + return schedule + + @classmethod + def constant_schedule(cls, value=1, Name="AlwaysOn", Type="Fraction", **kwargs): + """Initialize a schedule with a constant value for the whole year. + + Defaults to a schedule with a value of 1, named 'AlwaysOn'. + + Args: + value (float, optional): The value for the constant schedule. + Defaults to 1. + Name (str, optional): The name of the schedule. Defaults to Always + On. + **kwargs: + """ + return cls.from_values( + Name=Name, + Values=np.ones((8760,)) * value, + **kwargs, + ) + + @property + def all_values(self) -> np.ndarray: + """Return numpy array of schedule Values.""" + return np.array(self._values) + + @all_values.setter + def all_values(self, value): + self._values = validators.iterable(value, maximum_length=8760) + + @property + def max(self): + """Get the maximum value of the schedule.""" + return max(self.all_values) + + @property + def min(self): + """Get the minimum value of the schedule.""" + return min(self.all_values) + + @property + def mean(self): + """Get the mean value of the schedule.""" + return np.average(self.all_values) + + @property + def series(self): + """Return an :class:`EnergySeries`.""" + index = pd.date_range( + start=self.startDate, periods=self.all_values.size, freq="1H" + ) + return EnergySeries(self.all_values, index=index, name=self.Name) + + @staticmethod + def get_schedule_type_limits_name(epbunch): + """Return the Schedule Type Limits name associated to this schedule.""" + try: + schedule_limit_name = epbunch.Schedule_Type_Limits_Name + except Exception: + return "unknown" + else: + return schedule_limit_name + + @property + def startDate(self): + """Get the start date of the schedule. Satisfies `startDayOfTheWeek`.""" + year = get_year_for_first_weekday(self.startDayOfTheWeek) + return datetime(year, 1, 1) - return hourly_values + def plot(self, slice=None, **kwargs): + """Plot the schedule. Implements the .loc accessor on the series object. - def to_year_week_day(self, Values=None): - """convert a Schedule Class to the 'Schedule:Year', - 'Schedule:Week:Daily' and 'Schedule:Day:Hourly' representation + Examples: + >>> from archetypal import IDF + >>> idf = IDF() + >>> epbunch = idf.schedules_dict["NECB-A-Thermostat Setpoint-Heating"] + >>> s = Schedule.from_epbunch(epbunch) + >>> ) + >>> s.plot(slice=("2018/01/02", "2018/01/03"), drawstyle="steps-post") Args: - Values: + slice (tuple): define a 2-tuple object the will be passed to + :class:`pandas.IndexSlice` as a range. + **kwargs (dict): keyword arguments passed to + :meth:`pandas.Series.plot`. + """ + hourlyvalues = self.all_values + index = pd.date_range(self.startDate, periods=len(hourlyvalues), freq="1H") + series = pd.Series(hourlyvalues, index=index, dtype=float) + if slice is None: + slice = pd.IndexSlice[:] + elif len(slice) > 1: + slice = pd.IndexSlice[slice[0] : slice[1]] + label = kwargs.pop("label", self.Name) + ax = series.loc[slice].plot(**kwargs, label=label) + return ax + + def plot2d(self, **kwargs): + """Plot the carpet plot of the schedule.""" + return EnergySeries(self.series, name=self.Name).plot2d(**kwargs) + + plot2d.__doc__ += EnergySeries.plot2d.__doc__ + + def to_year_week_day(self): + """Convert to three-tuple epbunch given an idf model. + + Returns 'Schedule:Year', 'Schedule:Week:Daily' and 'Schedule:Day:Hourly' + representations. Returns: 3-element tuple containing @@ -870,10 +1355,14 @@ def to_year_week_day(self, Values=None): objects - **daily** (*list of Schedule*):The list of daily schedule objects """ - if Values: - full_year = Values - else: - full_year = np.array(self.all_values) # array of shape (8760,) + from archetypal.template.schedule import ( + DaySchedule, + WeekSchedule, + YearSchedule, + YearSchedulePart, + ) + + full_year = np.array(self.all_values) # array of shape (8760,) # reshape to (365, 24) Values = full_year.reshape(-1, 24) # shape (365, 24) @@ -888,13 +1377,8 @@ def to_year_week_day(self, Values=None): dict_day[name] = unique_day # Create idf_objects for schedule:day:hourly - ep_day = self.idf.anidfobject( - key="Schedule:Day:Hourly".upper(), - **dict( - Name=name, - Schedule_Type_Limits_Name=self.Type, - **{"Hour_{}".format(i + 1): unique_day[i] for i in range(24)}, - ), + ep_day = DaySchedule( + Name=name, Type=self.Type, Values=[unique_day[i] for i in range(24)] ) ep_days.append(ep_day) @@ -927,33 +1411,23 @@ def to_year_week_day(self, Values=None): dict_week[week_id] = {} for i, day in zip(list(range(0, 7)), list(c.iterweekdays())): day_of_week = unique_week[..., i * 24 : (i + 1) * 24] - for key in dict_day: + for key, ep_day in zip(dict_day, ep_days): if (day_of_week == dict_day[key]).all(): - dict_week[week_id]["day_{}".format(day)] = key + dict_week[week_id]["day_{}".format(day)] = ep_day # Create idf_objects for schedule:week:daily # Create ep_weeks list and iterate over dict_week - ep_weeks = [] + ep_weeks = {} for week_id in dict_week: - ep_week = self.idf.anidfobject( - key="Schedule:Week:Daily".upper(), - **dict( - Name=week_id, - **{ - "{}_ScheduleDay_Name".format( - calendar.day_name[day_num] - ): dict_week[week_id]["day_{}".format(day_num)] - for day_num in c.iterweekdays() - }, - Holiday_ScheduleDay_Name=dict_week[week_id]["day_6"], - SummerDesignDay_ScheduleDay_Name=dict_week[week_id]["day_1"], - WinterDesignDay_ScheduleDay_Name=dict_week[week_id]["day_1"], - CustomDay1_ScheduleDay_Name=dict_week[week_id]["day_2"], - CustomDay2_ScheduleDay_Name=dict_week[week_id]["day_5"], - ), + ep_week = WeekSchedule( + Name=week_id, + Days=[ + dict_week[week_id]["day_{}".format(day_num)] + for day_num in c.iterweekdays() + ], ) - ep_weeks.append(ep_week) + ep_weeks[week_id] = ep_week blocks = {} from_date = datetime(self.year, 1, 1) @@ -967,211 +1441,30 @@ def to_year_week_day(self, Values=None): for i, (week_n, count) in enumerate(zip(week_order, bincount)): week_id = list(dict_week)[week_order[i]] to_date = from_date + timedelta(days=int(count * 7), hours=-1) - blocks[i] = {} - blocks[i]["week_id"] = week_id - blocks[i]["from_day"] = from_date.day - blocks[i]["end_day"] = to_date.day - blocks[i]["from_month"] = from_date.month - blocks[i]["end_month"] = to_date.month + blocks[i] = YearSchedulePart( + FromDay=from_date.day, + FromMonth=from_date.month, + ToDay=to_date.day, + ToMonth=to_date.month, + Schedule=ep_weeks[week_id], + ) from_date = to_date + timedelta(hours=1) # If this is the last block, force end of year if i == len(bincount) - 1: - blocks[i]["end_day"] = 31 - blocks[i]["end_month"] = 12 - - new_dict = dict(Name=self.Name, Schedule_Type_Limits_Name=self.Type) - for i in blocks: - new_dict.update( - { - "ScheduleWeek_Name_{}".format(i + 1): blocks[i]["week_id"], - "Start_Month_{}".format(i + 1): blocks[i]["from_month"], - "Start_Day_{}".format(i + 1): blocks[i]["from_day"], - "End_Month_{}".format(i + 1): blocks[i]["end_month"], - "End_Day_{}".format(i + 1): blocks[i]["end_day"], - } - ) - - ep_year = self.idf.anidfobject(key="Schedule:Year".upper(), **new_dict) - return ep_year, ep_weeks, ep_days - - def _date_field_interpretation(self, field): - """Date Field Interpretation - - Info: - See EnergyPlus documentation for more details: 1.6.8.1.2 Field: - Start Date (Table 1.4: Date Field Interpretation) - - Args: - field (str): The EnergyPlus Field Contents - - Returns: - (datetime): The datetime object - """ - # < number > Weekday in Month - formats = ["%m/%d", "%d %B", "%B %d", "%d %b", "%b %d"] - date = None - for format_str in formats: - # Tru to parse using each defined formats - try: - date = datetime.strptime(field, format_str) - except: - pass - else: - date = datetime(self.year, date.month, date.day) - if date is None: - # if the defined formats did not work, try the fancy parse - try: - date = self._parse_fancy_string(field) - except: - msg = ( - "the schedule '{sch}' contains a " - "Field that is not understood: '{field}'".format( - sch=self.Name, field=field - ) - ) - raise ValueError(msg) - else: - return date - else: - return date - - def _parse_fancy_string(self, field): - """Will try to parse cases such as `3rd Monday in February` or `Last - Weekday In Month` - - Args: - field (str): The EnergyPlus Field Contents - - Returns: - (datetime): The datetime object - """ - import re - - # split the string at the term ' in ' - time, month = field.lower().split(" in ") - month = datetime.strptime(month, "%B").month - - # split the first part into nth and dayofweek - nth, dayofweek = time.split(" ") - if "last" in nth: - nth = -1 # Use the last one - else: - nth = re.findall(r"\d+", nth) # use the nth one - nth = int(nth[0]) - 1 # python is zero-based - - weekday = { - "monday": 0, - "tuesday": 1, - "wednesday": 2, - "thursday": 3, - "friday": 4, - "saturday": 5, - "sunday": 6, - } - - # parse the dayofweek eg. monday - dayofweek = weekday.get(dayofweek, 6) - - # create list of possible days using Calendar - import calendar - - c = calendar.Calendar(firstweekday=self.startDayOfTheWeek) - monthcal = c.monthdatescalendar(self.year, month) - - # iterate though the month and get the nth weekday - date = [ - day - for week in monthcal - for day in week - if day.weekday() == dayofweek and day.month == month - ][nth] - return datetime(date.year, date.month, date.day) - - def field_set(self, field, slicer_=None): - """helper function to return the proper slicer depending on the - field_set value. - - Available values are: Weekdays, Weekends, Holidays, Alldays, - SummerDesignDay, WinterDesignDay, Sunday, Monday, Tuesday, Wednesday, - Thursday, Friday, Saturday, CustomDay1, CustomDay2, AllOtherDays - - Args: - field (str): The EnergyPlus field set value. - slicer_: - - Returns: - (indexer-like): Returns the appropriate indexer for the series. - """ + blocks[i].ToDay = 31 + blocks[i].ToMonth = 12 - if field.lower() == "weekdays": - # return only days of weeks - return lambda x: x.index.dayofweek < 5 - elif field.lower() == "weekends": - # return only weekends - return lambda x: x.index.dayofweek >= 5 - elif field.lower() == "alldays": - log( - 'For schedule "{}", the field-set "AllDays" may be overridden ' - 'by the "AllOtherDays" field-set'.format(self.Name), - lg.WARNING, - ) - # return all days := equivalent to .loc[:] - return pd.IndexSlice[:] - elif field.lower() == "allotherdays": - # return unused days (including special days). Uses the global - # variable `slicer_` - import operator + ep_year = YearSchedule(self.Name, Type=self.Type, Parts=list(blocks.values())) - if slicer_ is not None: - return _conjunction( - *[self.special_day(field, slicer_), ~slicer_], logical=operator.or_ - ) - else: - raise NotImplementedError - elif field.lower() == "sunday": - # return only sundays - return lambda x: x.index.dayofweek == 6 - elif field.lower() == "monday": - # return only mondays - return lambda x: x.index.dayofweek == 0 - elif field.lower() == "tuesday": - # return only Tuesdays - return lambda x: x.index.dayofweek == 1 - elif field.lower() == "wednesday": - # return only Wednesdays - return lambda x: x.index.dayofweek == 2 - elif field.lower() == "thursday": - # return only Thursdays - return lambda x: x.index.dayofweek == 3 - elif field.lower() == "friday": - # return only Fridays - return lambda x: x.index.dayofweek == 4 - elif field.lower() == "saturday": - # return only Saturdays - return lambda x: x.index.dayofweek == 5 - elif field.lower() == "summerdesignday": - # return design_day(self, field) - return None - elif field.lower() == "winterdesignday": - # return design_day(self, field) - return None - elif field.lower() == "holiday" or field.lower() == "holidays": - field = "holiday" - return self.special_day(field, slicer_) - elif not self.strict: - # If not strict, ignore missing field-sets such as CustomDay1 - return lambda x: x < 0 - else: - raise NotImplementedError( - f"Archetypal does not yet support The Field_set '{field}'" - ) + return ep_year, list(ep_weeks.values()), ep_days def __len__(self): - """returns the length of all values of the schedule""" + """Get the length of all values of the schedule.""" return len(self.all_values) def __add__(self, other): + """Add self and other.""" if isinstance(other, Schedule): return self.all_values + other.all_values elif isinstance(other, list): @@ -1180,6 +1473,7 @@ def __add__(self, other): raise NotImplementedError def __sub__(self, other): + """Subtract self and other.""" if isinstance(other, Schedule): return self.all_values - other.all_values elif isinstance(other, list): @@ -1188,6 +1482,7 @@ def __sub__(self, other): raise NotImplementedError def __mul__(self, other): + """Multiply self with other.""" if isinstance(other, Schedule): return self.all_values * other.all_values elif isinstance(other, list): @@ -1196,111 +1491,12 @@ def __mul__(self, other): raise NotImplementedError def _repr_svg_(self): - """SVG representation for iPython notebook""" + """SVG representation for iPython notebook.""" fig, ax = self.series.plot2d(cmap="Greys", show=False, fig_width=5, dpi=72) f = io.BytesIO() fig.savefig(f, format="svg") return f.getvalue() - def get_sdow(self, start_day_of_week): - """Returns the start day of the week - - Args: - start_day_of_week: - """ - if start_day_of_week is None: - try: - return self.idf.day_of_week_for_start_day - except: - return 0 - else: - return start_day_of_week - - def special_day(self, field, slicer_): - """try to get the RunPeriodControl:SpecialDays for the corresponding Day - Type - - Args: - field: - slicer_: - """ - sp_slicer_ = slicer_.copy() - sp_slicer_.loc[:] = False - special_day_types = ["holiday", "customday1", "customday2"] - - dds = self.idf.idfobjects["RunPeriodControl:SpecialDays".upper()] - dd = [ - dd - for dd in dds - if dd.Special_Day_Type.lower() == field - or dd.Special_Day_Type.lower() in special_day_types - ] - if len(dd) > 0: - for dd in dd: - # can have more than one special day types - data = dd.Start_Date - ep_start_date = self._date_field_interpretation(data) - ep_orig = datetime(self.year, 1, 1) - days_to_speciald = (ep_start_date - ep_orig).days - duration = int(dd.Duration) - from_date = self.startDate + timedelta(days=days_to_speciald) - to_date = from_date + timedelta(days=duration) + timedelta(hours=-1) - - sp_slicer_.loc[from_date:to_date] = True - return sp_slicer_ - elif not self.strict: - return sp_slicer_ - else: - msg = ( - 'Could not find a "SizingPeriod:DesignDay" object ' - 'needed for schedule "{}" with Day Type "{}"'.format( - self.Name, field.capitalize() - ) - ) - raise ValueError(msg) - - def design_day(self, field, slicer_): - # try to get the SizingPeriod:DesignDay for the corresponding Day Type - """ - Args: - field: - slicer_: - """ - sp_slicer_ = slicer_.copy() - sp_slicer_.loc[:] = False - dds = self.idf.idfobjects["SizingPeriod:DesignDay".upper()] - dd = [dd for dd in dds if dd.Day_Type.lower() == field] - if len(dd) > 0: - for dd in dd: - # should have found only one design day matching the Day Type - month = dd.Month - day = dd.Day_of_Month - data = str(month) + "/" + str(day) - ep_start_date = self._date_field_interpretation(data) - ep_orig = datetime(self.year, 1, 1) - days_to_speciald = (ep_start_date - ep_orig).days - duration = 1 # Duration of 1 day - from_date = self.startDate + timedelta(days=days_to_speciald) - to_date = from_date + timedelta(days=duration) + timedelta(hours=-1) - - sp_slicer_.loc[from_date:to_date] = True - return sp_slicer_ - elif not self.strict: - return sp_slicer_ - else: - msg = ( - 'Could not find a "SizingPeriod:DesignDay" object ' - 'needed for schedule "{}" with Day Type "{}"'.format( - self.Name, field.capitalize() - ) - ) - raise ValueError(msg) - - data = [dd[0].Month, dd[0].Day_of_Month] - date = "/".join([str(item).zfill(2) for item in data]) - date = self._date_field_interpretation(date) - return lambda x: x.index == date - def combine(self, other, weights=None, quantity=None): """Combine two schedule objects together. @@ -1343,27 +1539,16 @@ def combine(self, other, weights=None, quantity=None): # the new object's name name = "+".join([self.Name, other.Name]) - new_obj = self.__class__(name, value=new_values, idf=self.idf) + new_obj = self.__class__(name, value=new_values) return new_obj def _conjunction(*conditions, logical=np.logical_and): - """Applies a logical function on n conditions - - Args: - *conditions: - logical: - """ return functools.reduce(logical, conditions) def _separator(sep): - """helper function to return the correct delimiter - - Args: - sep: - """ if sep == "Comma": return "," elif sep == "Tab": @@ -1377,11 +1562,6 @@ def _separator(sep): def _how(how): - """Helper function to return the correct resampler - - Args: - how: - """ if how.lower() == "average": return "mean" elif how.lower() == "linear": @@ -1393,7 +1573,7 @@ def _how(how): def get_year_for_first_weekday(weekday=0): - """Returns the year that starts on weekday, eg. Monday=0""" + """Get the year that starts on 'weekday', eg. Monday=0.""" import calendar if weekday > 6: diff --git a/archetypal/settings.py b/archetypal/settings.py index 7e8891cd..a377ca8e 100644 --- a/archetypal/settings.py +++ b/archetypal/settings.py @@ -6,9 +6,7 @@ ################################################################################ import logging as lg -import os -import pint from path import Path # locations to save data, logs, images, and cache @@ -123,27 +121,8 @@ # unique schedule number as list unique_schedules = [] -# region read template - use io.BytesIO(settings.template) in code -import pkg_resources - resource_package = archetypal.__name__ # Could be any module/package name -# originBUISketchUp.idf template -resource_path = "/".join(("ressources", "originBUISketchUp.idf")) -# Do not use os.path.join() -template_BUI = pkg_resources.resource_string(resource_package, resource_path) - -# window library ('W74-lib.dat') template -resource_path = "/".join(("ressources", "W74-lib.dat")) -# Do not use os.path.join() -template_winLib = pkg_resources.resource_string(resource_package, resource_path) - -# NewFileTemplate.d18 ('W74-lib.dat') template -resource_path = "/".join(("ressources", "NewFileTemplate.d18")) -# Do not use os.path.join() -path_template_d18 = pkg_resources.resource_filename(resource_package, resource_path) -# endregion - # Units from energy_pandas.units import unit_registry diff --git a/archetypal/template/__init__.py b/archetypal/template/__init__.py index 6113762e..c126d4cc 100644 --- a/archetypal/template/__init__.py +++ b/archetypal/template/__init__.py @@ -1,22 +1 @@ -################################################################################ -# Module: template.__init__.py -# Description: Template module for everything UMI template. -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ - -from .umi_base import * -from .gas_material import * -from .glazing_material import * -from .opaque_material import * -from .opaque_construction import * -from .schedule import * -from .window import * -from .structure import * -from .conditioning import * -from .load import * -from .ventilation import * -from .dhw import * -from .zone_construction_set import * -from .zonedefinition import * -from .building_template import * +"""archetypal umi template library.""" diff --git a/archetypal/template/building_template.py b/archetypal/template/building_template.py index 98073da6..c9fbfbab 100644 --- a/archetypal/template/building_template.py +++ b/archetypal/template/building_template.py @@ -8,26 +8,21 @@ import collections import logging as lg import time -from copy import copy from itertools import chain, repeat import networkx -from deprecation import deprecated from path import Path from sigfig import round from tqdm import tqdm - -import archetypal -from archetypal.template import ( - DomesticHotWaterSetting, - MassRatio, - MaterialLayer, - StructureInformation, - UmiBase, - WindowSetting, - YearSchedulePart, - ZoneDefinition, -) +from validator_collection import validators + +from archetypal.template.dhw import DomesticHotWaterSetting +from archetypal.template.materials.material_layer import MaterialLayer +from archetypal.template.schedule import YearSchedulePart +from archetypal.template.structure import MassRatio, StructureInformation +from archetypal.template.umi_base import UmiBase +from archetypal.template.window_setting import WindowSetting +from archetypal.template.zonedefinition import ZoneDefinition from archetypal.utils import log, reduce @@ -37,8 +32,26 @@ class BuildingTemplate(UmiBase): .. image:: ../images/template/buildingtemplate.png """ + __slots__ = ( + "_partition_ratio", + "_lifespan", + "_core", + "_perimeter", + "_structure_definition", + "_window_setting", + "_default_window_to_wall_ratio", + "_year_from", + "_year_to", + "_country", + "_climate_zone", + "_authors", + "_author_emails", + "_version", + ) + def __init__( self, + Name, Core=None, Perimeter=None, Structure=None, @@ -85,16 +98,15 @@ def __init__( Version (str): Version number. **kwargs: other optional keywords passed to other constructors. """ - super(BuildingTemplate, self).__init__(**kwargs) - self._zone_graph = None - self._partition_ratio = PartitionRatio + super(BuildingTemplate, self).__init__(Name, **kwargs) + self.PartitionRatio = PartitionRatio self.Lifespan = Lifespan self.Core = Core self.Perimeter = Perimeter self.Structure = Structure self.Windows = Windows self.DefaultWindowToWallRatio = DefaultWindowToWallRatio - self.YearFrom = YearFrom + self._year_from = YearFrom # set privately to allow validation self.YearTo = YearTo self.Country = Country if Country else [] self.ClimateZone = ClimateZone if ClimateZone else [] @@ -102,76 +114,235 @@ def __init__( self.AuthorEmails = AuthorEmails if AuthorEmails else [] self.Version = Version - self._allzones = [] + @property + def Perimeter(self): + """Get or set the perimeter ZoneDefinition.""" + return self._perimeter + + @Perimeter.setter + def Perimeter(self, value): + assert isinstance( + value, ZoneDefinition + ), f"Expected a ZoneDefinition, not {type(value)}" + self._perimeter = value + + @property + def Core(self): + """Get or set the core ZoneDefinition.""" + return self._core + + @Core.setter + def Core(self, value): + assert isinstance( + value, ZoneDefinition + ), f"Expected a ZoneDefinition, not {type(value)}" + self._core = value + + @property + def Structure(self): + """Get or set the StructureInformation.""" + return self._structure_definition + + @Structure.setter + def Structure(self, value): + assert isinstance( + value, StructureInformation + ), f"Expected a StructureInformation, not {type(value)}" + self._structure_definition = value + + @property + def Windows(self): + """Get or set the WindowSetting.""" + return self._window_setting + + @Windows.setter + def Windows(self, value): + assert isinstance( + value, WindowSetting + ), f"Expected a WindowSetting, not {type(value)}" + self._window_setting = value + + @property + def DefaultWindowToWallRatio(self): + """Get or set the DefaultWindowToWallRatio [-].""" + return self._default_window_to_wall_ratio + + @DefaultWindowToWallRatio.setter + def DefaultWindowToWallRatio(self, value): + self._default_window_to_wall_ratio = validators.float( + value, minimum=0, maximum=1 + ) + + @property + def Lifespan(self): + """Get or set the building life span [years].""" + return self._lifespan + + @Lifespan.setter + def Lifespan(self, value): + self._lifespan = validators.integer(value, minimum=True, coerce_value=True) @property def PartitionRatio(self): - if self._partition_ratio is None: - self._partition_ratio = self.idf.partition_ratio + """Get or set the partition ratio [-].""" return self._partition_ratio - def __hash__(self): - return hash( - (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + @PartitionRatio.setter + def PartitionRatio(self, value): + self._partition_ratio = validators.float(value, minimum=0) + + @property + def YearFrom(self): + """Get or set the YearFrom [int].""" + return self._year_from + + @YearFrom.setter + def YearFrom(self, value): + self._year_from = validators.integer( + value, coerce_value=True, maximum=self.YearTo, allow_empty=True ) - def __eq__(self, other): - if not isinstance(other, BuildingTemplate): - return NotImplemented - else: - return all( - [ - self.Core == other.Core, - self.Perimeter == other.Perimeter, - self.Structure == other.Structure, - self.Windows == other.Windows, - self.Lifespan == other.Lifespan, - self.PartitionRatio == other.PartitionRatio, - self.DefaultWindowToWallRatio == other.DefaultWindowToWallRatio, - self.YearFrom == other.YearFrom, - self.YearTo == other.YearTo, - self.Country == other.Country, - self.ClimateZone == other.ClimateZone, - self.Authors == other.Authors, - self.AuthorEmails == other.AuthorEmails, - self.Version == other.Version, - ] - ) + @property + def YearTo(self): + """Get or set the YearTo [int].""" + return self._year_to + + @YearTo.setter + def YearTo(self, value): + self._year_to = validators.integer( + value, coerce_value=True, minimum=self.YearFrom, allow_empty=True + ) - @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): + @property + def Country(self): + """Get or set the list of alpha-3 country codes [list].""" + return self._country + + @Country.setter + def Country(self, value): + self._country = validators.iterable(value, allow_empty=True) - return cls.from_dict(*args, **kwargs) + @property + def ClimateZone(self): + """Get or set the list of climatic zones [list].""" + return self._climate_zone + + @ClimateZone.setter + def ClimateZone(self, value): + self._climate_zone = validators.iterable(value, allow_empty=True) + + @property + def Authors(self): + """Get or set the list of authors [list].""" + return self._authors + + @Authors.setter + def Authors(self, value): + self._authors = validators.iterable(value, allow_empty=True) + + @property + def AuthorEmails(self): + """Get or set list of author emails [list].""" + return self._author_emails + + @AuthorEmails.setter + def AuthorEmails(self, value): + self._author_emails = validators.iterable(value, allow_empty=True) + + @property + def Version(self): + """Get or set the template version [str].""" + return self._version + + @Version.setter + def Version(self, value): + self._version = validators.string(value, coerce_value=True) @classmethod - def from_dict(cls, *args, **kwargs): - """ + def from_dict( + cls, + data, + zone_definitions, + structure_definitions, + window_settings, + schedules, + window_constructions, + **kwargs, + ): + """Create an BuildingTemplate from a dictionary. + Args: - *args: - **kwargs: + data (dict): The python dictionary. + zone_definitions (dict): A dictionary of ZoneDefinition objects with their + id as keys. + structure_definitions (dict): A dictionary of StructureInformation with + their id as keys. + window_settings (dict): A dictionary of WindowSetting objects with their + id as keys. + schedules (dict): A dictionary of UmiSchedule with their id as keys. + window_constructions (dict): A dictionary of WindowConstruction objects + with their id as keys. + **kwargs: keywords passed to the constructor. + + .. code-block:: python + + { + "Core": { + "$ref": "178" + }, + "Lifespan": 60, + "PartitionRatio": 0.3, + "Perimeter": { + "$ref": "178" + }, + "Structure": { + "$ref": "64" + }, + "Windows": { + "$ref": "181" + }, + "DefaultWindowToWallRatio": 0.4, + "YearFrom": 0, + "YearTo": 0, + "Country": [ + "USA" + ], + "ClimateZone": [ + "5A" + ], + "Authors": [ + "Carlos Cerezo" + ], + "AuthorEmails": [ + "ccerezo@mit.edu" + ], + "Version": "v1.0", + "Category": "Residential and Lodging", + "Comments": "Base building definition for MIT 4433", + "DataSource": "MIT_SDL", + "Name": "B_Res_0_WoodFrame" + } + """ - bt = cls(*args, **kwargs) - - ref = kwargs.get("Core", None) - bt.Core = bt.get_ref(ref) - ref = kwargs.get("Perimeter", None) - bt.Perimeter = bt.get_ref(ref) - ref = kwargs.get("Structure", None) - bt.Structure = bt.get_ref(ref) - ref = kwargs.get("Windows", None) + core = zone_definitions[data.pop("Core")["$ref"]] + perim = zone_definitions[data.pop("Perimeter")["$ref"]] + structure = structure_definitions[data.pop("Structure")["$ref"]] + window_data = data.pop("Windows") try: - idf = kwargs.get("idf", None) - bt.Windows = WindowSetting.from_dict(Name=ref.pop("Name"), **ref, idf=idf) - except: - bt.Windows = bt.get_ref(ref) + window = window_settings[window_data["$ref"]] + except KeyError: + window = WindowSetting.from_dict( + window_data, schedules, window_constructions + ) - return bt + return cls( + Core=core, + Perimeter=perim, + Structure=structure, + Windows=window, + **data, + **kwargs, + ) @classmethod def from_idf(cls, idf, **kwargs): @@ -183,119 +354,136 @@ def from_idf(cls, idf, **kwargs): """ # initialize empty BuildingTemplate name = kwargs.pop("Name", Path(idf.idfname).basename().splitext()[0]) - bt = cls(Name=name, idf=idf, **kwargs) epbunch_zones = idf.idfobjects["ZONE"] zones = [ - ZoneDefinition.from_zone_epbunch(ep_zone, allow_duplicates=True, **kwargs) + ZoneDefinition.from_epbunch(ep_zone, allow_duplicates=True, **kwargs) for ep_zone in tqdm(epbunch_zones, desc=f"Creating UMI objects for {name}") ] + # do core and Perim zone reduction + bt = cls.reduced_model(name, zones, **kwargs) + + if not bt.Core.DomesticHotWater or not bt.Perimeter.DomesticHotWater: + dhw = DomesticHotWaterSetting.whole_building(idf) + if not bt.Core.DomesticHotWater: + bt.Core.DomesticHotWater = dhw + if not bt.Perimeter.DomesticHotWater: + bt.Perimeter.DomesticHotWater = dhw + + bt.Comments = "\n".join( + [ + "WWR calculated for original model: ", + idf.wwr().to_string(), + "where East=90, South=180, West=270, North=0\n", + ] + ) + + bt.PartitionRatio = idf.partition_ratio + + return bt + + @classmethod + def reduced_model(cls, name, zones, **kwargs): + """Create reduced BuildingTemplate from list of ZoneDefinitions. + + Args: + name (str): The name of the building template. + zones (list of ZoneDefinition): A list of zone definition objects to + reduce. At least one must be a perimeter zone (ZoneDefinition.is_core is + False). + **kwargs: keywords passed to the class constructor. + + Returns: + BuildingTemplate: The reduced BuildingTemplate. + """ + # reduce list of perimeter zones + + log("Initiating complexity reduction...") + start_time = time.time() zone: ZoneDefinition - bt.cores = list( + cores = list( chain.from_iterable( [ - list(repeat(copy(zone), zone.multiplier)) + list(repeat(zone.duplicate(), zone.multiplier)) for zone in zones if zone.is_core ] ) ) - bt.perims = list( + perimeters = list( chain.from_iterable( [ - list(repeat(copy(zone), zone.multiplier)) + list(repeat(zone.duplicate(), zone.multiplier)) for zone in zones if not zone.is_core ] ) ) - # do Core and Perim zone reduction - bt.reduce(bt.cores, bt.perims) - - # resolve StructureInformation and WindowSetting - bt.Structure = StructureInformation( - Name=bt.Name + "_StructureDefinition", - MassRatios=[MassRatio.generic()], - idf=idf, - ) - bt.Windows = bt.Perimeter.Windows - - bt.Comments += "\n".join( - [ - "WWR calculated for original model: ", - bt.idf.wwr().to_string(), - "where East=90, South=180, West=270, North=0\n", - ] - ) - - return bt - - def reduce(self, cores, perims): - """Reduce the building to its simplest core and perimeter zones.""" - log("Initiating complexity reduction...") - start_time = time.time() + assert ( + len(perimeters) >= 1 + ), "Building complexity reduction must have at least one perimeter zone." + Core = None # reduce list of core zones if cores: - self.Core = reduce( + Core = reduce( ZoneDefinition.combine, tqdm( cores, - desc=f"Reducing core zones {self.idf.position}-{self.idf.name}", + desc=f"Reducing core zones in {name}", ), ) - self.Core.Name = f"{self.Name}_ZoneDefinition_Core" # set name + Core.Name = f"{name}_ZoneDefinition_Core" # set name - # reduce list of perimeter zones - if not perims: - raise ValueError( - "Building complexity reduction must have at least one perimeter zone" + Perimeter = None + if perimeters: + Perimeter = reduce( + ZoneDefinition.combine, + tqdm( + zones, + desc=f"Reducing perimeter zones in {name}", + ), ) - else: - try: - self.Perimeter = reduce( - ZoneDefinition.combine, - tqdm( - perims, - desc=f"Reducing perimeter zones {self.idf.position}-{self.idf.name}", - ), - ) - self.Perimeter.Name = f"{self.Name}_ZoneDefinition_Perimeter" - except Exception as e: - raise e + Perimeter.Name = f"{name}_ZoneDefinition_Perimeter" # If all perimeter zones, assign self.Perimeter to core. - if not self.Core: - self.Core = self.Perimeter - self.Core.Name = f"{self.Name}_ZoneDefinition" # rename as both core/perim + if not Core: + Core = Perimeter + Core.Name = f"{name}_ZoneDefinition" # rename as both core/perim + + # resolve StructureInformation and WindowSetting + structure = StructureInformation( + MassRatios=[MassRatio.generic()], + Name=name + "_StructureDefinition", + ) # assign generic window if None - if self.Perimeter.Windows is None: + if Perimeter.Windows is None: # create generic window - self.Perimeter.Windows = WindowSetting.generic( - idf=self.idf, Name="Generic Window" - ) - - if not self.Core.DomesticHotWater or not self.Perimeter.DomesticHotWater: - dhw = DomesticHotWaterSetting.whole_building(self.idf) - if not self.Core.DomesticHotWater: - self.Core.DomesticHotWater = dhw - if not self.Perimeter.DomesticHotWater: - self.Perimeter.DomesticHotWater = dhw + Perimeter.Windows = WindowSetting.generic(Name="Generic Window") + kwargs.setdefault("DefaultWindowToWallRatio", 0) log( - f"Equivalent core zone has an area of {self.Core.area:,.0f} m2", + f"Equivalent core zone has an area of {Core.area:,.0f} m2", level=lg.DEBUG, ) log( - f"Equivalent perimeter zone has an area of {self.Perimeter.area:,.0f} m2", + f"Equivalent perimeter zone has an area of {Perimeter.area:,.0f} m2", level=lg.DEBUG, ) log( - f"Completed model complexity reduction for BuildingTemplate '{self.Name}' " + f"Completed model complexity reduction for BuildingTemplate '{name}' " f"in {time.time() - start_time:,.2f}" ) + return cls( + name, + Core=Core, + Perimeter=Perimeter, + Windows=Perimeter.Windows, + Structure=structure, + **kwargs, + ) def _graph_reduce(self, G): """Using the depth first search algorithm, iterate over the zone @@ -339,20 +527,20 @@ def _graph_reduce(self, G): ) return bundle_zone - def to_json(self): - """Convert class properties to dict""" + def to_dict(self): + """Return BuildingTemplate dictionary representation.""" self.validate() # Validate object before trying to get json format data_dict = collections.OrderedDict() - data_dict["Core"] = self.Core.to_dict() + data_dict["Core"] = self.Core.to_ref() data_dict["Lifespan"] = self.Lifespan data_dict["PartitionRatio"] = round(self.PartitionRatio, 2) - data_dict["Perimeter"] = self.Perimeter.to_dict() - data_dict["Structure"] = self.Structure.to_dict() - data_dict["Windows"] = self.Windows.to_dict() - data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments + data_dict["Perimeter"] = self.Perimeter.to_ref() + data_dict["Structure"] = self.Structure.to_ref() + data_dict["Windows"] = self.Windows.to_ref() + data_dict["Category"] = validators.string(self.Category, allow_empty=True) + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource data_dict["Name"] = self.Name data_dict["YearFrom"] = self.YearFrom @@ -370,8 +558,7 @@ def validate(self): return self def get_unique(self): - """Recursively replaces every UmiBase objects with the first instance - satisfying equality""" + """Replace recursively every objects with the first equivalent object.""" def recursive_replace(umibase): for key, obj in umibase.mapping().items(): @@ -392,8 +579,15 @@ def recursive_replace(umibase): recursive_replace(self) return self - def mapping(self): - self.validate() + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() return dict( Core=self.Core, @@ -432,4 +626,32 @@ def get_ref(self, ref): None, ) + def __hash__(self): + """Return the hash value of self.""" + return hash( + (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + ) + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, BuildingTemplate): + return NotImplemented + else: + return all( + [ + self.Core == other.Core, + self.Perimeter == other.Perimeter, + self.Structure == other.Structure, + self.Windows == other.Windows, + self.Lifespan == other.Lifespan, + self.PartitionRatio == other.PartitionRatio, + self.DefaultWindowToWallRatio == other.DefaultWindowToWallRatio, + self.YearFrom == other.YearFrom, + self.YearTo == other.YearTo, + self.Country == other.Country, + self.ClimateZone == other.ClimateZone, + self.Authors == other.Authors, + self.AuthorEmails == other.AuthorEmails, + self.Version == other.Version, + ] + ) diff --git a/archetypal/template/conditioning.py b/archetypal/template/conditioning.py index 3efef9f3..95945dc4 100644 --- a/archetypal/template/conditioning.py +++ b/archetypal/template/conditioning.py @@ -1,9 +1,4 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal ZoneConditioning.""" import collections import logging as lg @@ -12,22 +7,25 @@ from enum import Enum import numpy as np -from deprecation import deprecated from sigfig import round from sklearn.preprocessing import Binarizer +from validator_collection import checkers, validators -import archetypal -from archetypal import settings from archetypal.reportdata import ReportData -from archetypal.template import UmiBase, UmiSchedule, UniqueName -from archetypal.utils import float_round, log, timeit +from archetypal.template.schedule import UmiSchedule +from archetypal.template.umi_base import UmiBase +from archetypal.utils import float_round, log class UmiBaseEnum(Enum): + """An Enum base class.""" + def __lt__(self, other): + """Assert if self is lower than other.""" return self._value_ < other._value_ def __gt__(self, other): + """Assert if self is greater than other.""" return self._value_ > other._value_ @@ -51,25 +49,32 @@ class FuelType(Enum): class HeatRecoveryTypes(UmiBaseEnum): + """Heat recovery types.""" + NONE = 0 Enthalpy = 1 Sensible = 2 class EconomizerTypes(UmiBaseEnum): + """Economizer types.""" + NoEconomizer = 0 DifferentialDryBulb = 1 DifferentialEnthalphy = 2 class IdealSystemLimit(UmiBaseEnum): - """LimitFlowRate means that the heating supply air flow rate will be + """Ideal System Limit. + + LimitFlowRate means that the heating supply air flow rate will be limited to the value specified in the next input field. LimitCapacity means that the sensible heating capacity will be limited to the value specified in the Maximum Sensible Heating Capacity field. LimitFlowRateAndCapacity means that both flow rate and capacity will be limited. NoLimit (the default) means that there will not be any limit on the heating supply air flow rate or capacity and the subsequent - two fields will be ignored.""" + two fields will be ignored. + """ NoLimit = 0 LimitFlowRate = 1 @@ -78,38 +83,67 @@ class IdealSystemLimit(UmiBaseEnum): class ZoneConditioning(UmiBase): - """HVAC settings for the zone + """HVAC settings for the zone. .. image:: ../images/template/zoninfo-conditioning.png """ + __slots__ = ( + "_cooling_setpoint", + "_heating_setpoint", + "_max_cool_flow", + "_max_heat_flow", + "_max_heating_capacity", + "_max_cooling_capacity", + "_min_fresh_air_per_person", + "_min_fresh_air_per_area", + "_is_heating_on", + "_heating_schedule", + "_heating_limit_type", + "_heating_fuel_type", + "_heating_coeff_of_perf", + "_is_cooling_on", + "_cooling_schedule", + "_cooling_limit_type", + "_cooling_fuel_type", + "_cooling_coeff_of_perf", + "_is_mech_vent_on", + "_economizer_type", + "_mech_vent_schedule", + "_heat_recovery_type", + "_heat_recovery_efficiency_latent", + "_heat_recovery_efficiency_sensible", + "_area", + ) + def __init__( self, Name, - IsHeatingOn=False, - HeatingSetpoint=20, - HeatingSchedule=None, - HeatingLimitType=IdealSystemLimit.NoLimit, - HeatingFuelType=FuelType.NaturalGas, - MaxHeatingCapacity=100, - MaxHeatFlow=100, - HeatingCoeffOfPerf=1, - IsCoolingOn=False, - CoolingSetpoint=26, - CoolingSchedule=None, - CoolingLimitType=IdealSystemLimit.NoLimit, - CoolingFuelType=FuelType.Electricity, - MaxCoolingCapacity=100, - MaxCoolFlow=100, - CoolingCoeffOfPerf=1, - IsMechVentOn=False, - EconomizerType=EconomizerTypes.NoEconomizer, - MechVentSchedule=None, - MinFreshAirPerArea=0, - MinFreshAirPerPerson=0, - HeatRecoveryType=HeatRecoveryTypes.NONE, + IsHeatingOn=False, # + HeatingSetpoint=20, # + HeatingSchedule=None, # + HeatingLimitType=IdealSystemLimit.NoLimit, # + HeatingFuelType=FuelType.NaturalGas, # + MaxHeatingCapacity=100, # + MaxHeatFlow=100, # + HeatingCoeffOfPerf=1, # + IsCoolingOn=False, # + CoolingSetpoint=26, # + CoolingSchedule=None, # + CoolingLimitType=IdealSystemLimit.NoLimit, # + CoolingFuelType=FuelType.Electricity, # + MaxCoolingCapacity=100, # + MaxCoolFlow=100, # + CoolingCoeffOfPerf=1, # + IsMechVentOn=False, # + EconomizerType=EconomizerTypes.NoEconomizer, # + MechVentSchedule=None, # + MinFreshAirPerArea=0, # + MinFreshAirPerPerson=0, # + HeatRecoveryType=HeatRecoveryTypes.NONE, # HeatRecoveryEfficiencyLatent=0.65, HeatRecoveryEfficiencySensible=0.7, + area=1, **kwargs, ): """Initialize a new :class:`ZoneConditioning` object. @@ -229,7 +263,7 @@ def __init__( self.CoolingCoeffOfPerf = CoolingCoeffOfPerf self.CoolingLimitType = IdealSystemLimit(CoolingLimitType) self.CoolingFuelType = FuelType(CoolingFuelType) - self.CoolingSetpoint = CoolingSetpoint + self._cooling_setpoint = CoolingSetpoint # setter without check self.EconomizerType = EconomizerTypes(EconomizerType) self.HeatRecoveryEfficiencyLatent = HeatRecoveryEfficiencyLatent self.HeatRecoveryEfficiencySensible = HeatRecoveryEfficiencySensible @@ -248,149 +282,411 @@ def __init__( self.MinFreshAirPerArea = MinFreshAirPerArea self.MinFreshAirPerPerson = MinFreshAirPerPerson - self._belongs_to_zone = kwargs.get("zone", None) + self.area = area + + @property + def area(self): + """Get or set the area of the zone associated to this object [m²].""" + return self._area + + @area.setter + def area(self, value): + self._area = value @property def CoolingSetpoint(self): - return float(self._cooling_setpoint) + """Get or set the cooling setpoint [degC].""" + return self._cooling_setpoint @CoolingSetpoint.setter def CoolingSetpoint(self, value): - self._cooling_setpoint = value + assert ( + self._heating_setpoint < value + ), "Heating setpoint must be lower than the cooling setpoint." + self._cooling_setpoint = validators.float(value, minimum=-100, maximum=50) @property def HeatingSetpoint(self): - return float(self._heating_setpoint) + """Get or set the heating setpoint [degC].""" + return self._heating_setpoint @HeatingSetpoint.setter def HeatingSetpoint(self, value): - self._heating_setpoint = value + assert ( + value < self._cooling_setpoint + ), "Heating setpoint must be lower than the cooling setpoint." + self._heating_setpoint = validators.float(value) @property def MaxCoolFlow(self): - return float(self._MaxCoolFlow) + """Get or set the maximum cooling flowrate [m³/s/m²].""" + return self._max_cool_flow @MaxCoolFlow.setter def MaxCoolFlow(self, value): - self._MaxCoolFlow = value + self._max_cool_flow = validators.float(value, minimum=0) @property def MaxHeatFlow(self): - return float(self._MaxHeatFlow) + """Get or set the maximum heating flowrate [m³/s/m²].""" + return self._max_heat_flow @MaxHeatFlow.setter def MaxHeatFlow(self, value): - self._MaxHeatFlow = value + self._max_heat_flow = validators.float(value, minimum=0) @property def MaxHeatingCapacity(self): - return float(self._MaxHeatingCapacity) + """Get or set the maximum heating capacity [W/m²].""" + return float(self._max_heating_capacity) @MaxHeatingCapacity.setter def MaxHeatingCapacity(self, value): - self._MaxHeatingCapacity = value + self._max_heating_capacity = validators.float(value, minimum=0) @property def MaxCoolingCapacity(self): - return float(self._MaxCoolingCapacity) + """Get or set the maximum cooling capacity [W/m²].""" + return self._max_cooling_capacity @MaxCoolingCapacity.setter def MaxCoolingCapacity(self, value): - self._MaxCoolingCapacity = value + self._max_cooling_capacity = validators.float(value, minimum=0) @property def MinFreshAirPerArea(self): - return float(self._min_fresh_air_per_area) + """Get or set the minimum fresh air per area [m³/s/m²].""" + return self._min_fresh_air_per_area @MinFreshAirPerArea.setter def MinFreshAirPerArea(self, value): - self._min_fresh_air_per_area = value + self._min_fresh_air_per_area = validators.float(value, minimum=0) @property def MinFreshAirPerPerson(self): - return float(self._min_fresh_air_per_person) + """Get or set the minimum fresh air per person [m³/s/p].""" + return self._min_fresh_air_per_person @MinFreshAirPerPerson.setter def MinFreshAirPerPerson(self, value): - self._min_fresh_air_per_person = value + self._min_fresh_air_per_person = validators.float(value, minimum=0) - def __add__(self, other): - return self.combine(other) + @property + def IsHeatingOn(self): + """Get or set the availability of heating [bool].""" + return self._is_heating_on + + @IsHeatingOn.setter + def IsHeatingOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsHeatingOn must " + f"be a boolean, not a {type(value)}" + ) + self._is_heating_on = value - def __hash__(self): - return hash( - (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + @property + def HeatingSchedule(self): + """Get or set the heating availability schedule.""" + return self._heating_schedule + + @HeatingSchedule.setter + def HeatingSchedule(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input error with value {value}. HeatingSchedule must " + f"be an UmiSchedule, not a {type(value)}" + ) + self._heating_schedule = value + + @property + def HeatingLimitType(self): + """Get or set the heating limit type [enum].""" + return self._heating_limit_type + + @HeatingLimitType.setter + def HeatingLimitType(self, value): + if checkers.is_string(value): + assert IdealSystemLimit[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in IdealSystemLimit)}" + ) + self._heating_limit_type = IdealSystemLimit[value] + elif checkers.is_numeric(value): + assert IdealSystemLimit[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in IdealSystemLimit)}" + ) + self._heating_limit_type = IdealSystemLimit(value) + elif isinstance(value, IdealSystemLimit): + self._heating_limit_type = value + + @property + def HeatingFuelType(self): + """Get or set the heating fuel type [enum].""" + return self._heating_fuel_type + + @HeatingFuelType.setter + def HeatingFuelType(self, value): + if checkers.is_string(value): + assert FuelType[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in FuelType)}" + ) + self._heating_fuel_type = FuelType[value] + elif checkers.is_numeric(value): + assert FuelType[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in FuelType)}" + ) + self._heating_fuel_type = FuelType(value) + elif isinstance(value, FuelType): + self._heating_fuel_type = value + + @property + def HeatingCoeffOfPerf(self): + """Get or set the heating COP [-].""" + return self._heating_coeff_of_perf + + @HeatingCoeffOfPerf.setter + def HeatingCoeffOfPerf(self, value): + self._heating_coeff_of_perf = validators.float(value, minimum=0) + + @property + def IsCoolingOn(self): + """Get or set the availability of cooling [bool].""" + return self._is_cooling_on + + @IsCoolingOn.setter + def IsCoolingOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsCoolingOn must " + f"be a boolean, not a {type(value)}" ) + self._is_cooling_on = value - def __eq__(self, other): - if not isinstance(other, ZoneConditioning): - return NotImplemented - else: - return all( - [ - self.CoolingCoeffOfPerf == other.CoolingCoeffOfPerf, - self.CoolingLimitType == other.CoolingLimitType, - self.CoolingSetpoint == other.CoolingSetpoint, - self.CoolingSchedule == other.CoolingSchedule, - self.EconomizerType == other.EconomizerType, - self.HeatRecoveryEfficiencyLatent - == other.HeatRecoveryEfficiencyLatent, - self.HeatRecoveryEfficiencySensible - == other.HeatRecoveryEfficiencySensible, - self.HeatRecoveryType == other.HeatRecoveryType, - self.HeatingCoeffOfPerf == other.HeatingCoeffOfPerf, - self.HeatingLimitType == other.HeatingLimitType, - self.HeatingSetpoint == other.HeatingSetpoint, - self.HeatingSchedule == other.HeatingSchedule, - self.IsCoolingOn == other.IsCoolingOn, - self.IsHeatingOn == other.IsHeatingOn, - self.IsMechVentOn == other.IsMechVentOn, - self.MaxCoolFlow == other.MaxCoolFlow, - self.MaxCoolingCapacity == other.MaxCoolingCapacity, - self.MaxHeatFlow == other.MaxHeatFlow, - self.MaxHeatingCapacity == other.MaxHeatingCapacity, - self.MinFreshAirPerArea == other.MinFreshAirPerArea, - self.MinFreshAirPerPerson == other.MinFreshAirPerPerson, - self.MechVentSchedule == other.MechVentSchedule, - ] + @property + def CoolingSchedule(self): + """Get or set the cooling availability schedule.""" + return self._cooling_schedule + + @CoolingSchedule.setter + def CoolingSchedule(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input error with value {value}. CoolingSchedule must " + f"be an UmiSchedule, not a {type(value)}" ) + self._cooling_schedule = value - @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): + @property + def CoolingLimitType(self): + """Get or set the cooling limit type [enum].""" + return self._cooling_limit_type + + @CoolingLimitType.setter + def CoolingLimitType(self, value): + if checkers.is_string(value): + assert IdealSystemLimit[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in IdealSystemLimit)}" + ) + self._cooling_limit_type = IdealSystemLimit[value] + elif checkers.is_numeric(value): + assert IdealSystemLimit[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in IdealSystemLimit)}" + ) + self._cooling_limit_type = IdealSystemLimit(value) + elif isinstance(value, IdealSystemLimit): + self._cooling_limit_type = value - return cls.from_dict(*args, **kwargs) + @property + def CoolingFuelType(self): + """Get or set the cooling fuel type [enum].""" + return self._cooling_fuel_type + + @CoolingFuelType.setter + def CoolingFuelType(self, value): + if checkers.is_string(value): + assert FuelType[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in FuelType)}" + ) + self._cooling_fuel_type = FuelType[value] + elif checkers.is_numeric(value): + assert FuelType[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in FuelType)}" + ) + self._cooling_fuel_type = FuelType(value) + elif isinstance(value, FuelType): + self._cooling_fuel_type = value + + @property + def CoolingCoeffOfPerf(self): + """Get or set the cooling COP [-].""" + return self._cooling_coeff_of_perf + + @CoolingCoeffOfPerf.setter + def CoolingCoeffOfPerf(self, value): + self._cooling_coeff_of_perf = validators.float(value, minimum=0) + + @property + def IsMechVentOn(self): + """Get or set the availability of mechanical ventilation [bool].""" + return self._is_mech_vent_on + + @IsMechVentOn.setter + def IsMechVentOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsMechVentOn must " + f"be a boolean, not a {type(value)}" + ) + self._is_mech_vent_on = value + + @property + def EconomizerType(self): + """Get or set the economizer type [enum].""" + return self._economizer_type + + @EconomizerType.setter + def EconomizerType(self, value): + if checkers.is_string(value): + assert EconomizerTypes[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in EconomizerTypes)}" + ) + self._economizer_type = EconomizerTypes[value] + elif checkers.is_numeric(value): + assert EconomizerTypes[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in EconomizerTypes)}" + ) + self._economizer_type = EconomizerTypes(value) + elif isinstance(value, EconomizerTypes): + self._economizer_type = value + + @property + def MechVentSchedule(self): + """Get or set the outdoor air requirements over time.""" + return self._mech_vent_schedule + + @MechVentSchedule.setter + def MechVentSchedule(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input error with value {value}. MechVentSchedule must " + f"be an UmiSchedule, not a {type(value)}" + ) + self._mech_vent_schedule = value + + @property + def HeatRecoveryType(self): + """Get or set the heat recovery type.""" + return self._heat_recovery_type + + @HeatRecoveryType.setter + def HeatRecoveryType(self, value): + if checkers.is_string(value): + assert HeatRecoveryTypes[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in HeatRecoveryTypes)}" + ) + self._heat_recovery_type = HeatRecoveryTypes[value] + elif checkers.is_numeric(value): + assert HeatRecoveryTypes[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in HeatRecoveryTypes)}" + ) + self._heat_recovery_type = HeatRecoveryTypes(value) + elif isinstance(value, HeatRecoveryTypes): + self._heat_recovery_type = value + + @property + def HeatRecoveryEfficiencyLatent(self): + """Get or set the latent heat recovery effectiveness [-].""" + return self._heat_recovery_efficiency_latent + + @HeatRecoveryEfficiencyLatent.setter + def HeatRecoveryEfficiencyLatent(self, value): + self._heat_recovery_efficiency_latent = validators.float( + value, minimum=0, maximum=1 + ) + + @property + def HeatRecoveryEfficiencySensible(self): + """Get or set the sensible heat recovery effectiveness [-].""" + return self._heat_recovery_efficiency_sensible + + @HeatRecoveryEfficiencySensible.setter + def HeatRecoveryEfficiencySensible(self, value): + self._heat_recovery_efficiency_sensible = validators.float( + value, minimum=0, maximum=1 + ) @classmethod - def from_dict(cls, *args, **kwargs): - """ + def from_dict(cls, data, schedules, **kwargs): + """Create a ZoneConditioning from a dictionary. + Args: - *args: - **kwargs: + data (dict): The python dictionary. + schedules (dict): A dictionary of UmiSchedules with their id as keys. + **kwargs: keywords passed to parent constructor. + + .. code-block:: python + { + "$id": "165", + "CoolingSchedule": { $ref: "1" }, + "CoolingCoeffOfPerf": 3.0, + "CoolingSetpoint": 24.0, + "CoolingLimitType": 0, + "CoolingFuelType": 1, + "EconomizerType": 0, + "HeatingCoeffOfPerf": 0.9, + "HeatingLimitType": 0, + "HeatingFuelType": 2, + "HeatingSchedule": { $ref: "2" }, + "HeatingSetpoint": 20.0, + "HeatRecoveryEfficiencyLatent": 0.65, + "HeatRecoveryEfficiencySensible": 0.7, + "HeatRecoveryType": 0, + "IsCoolingOn": True, + "IsHeatingOn": True, + "IsMechVentOn": True, + "MaxCoolFlow": 100.0, + "MaxCoolingCapacity": 100.0, + "MaxHeatFlow": 100.0, + "MaxHeatingCapacity": 100.0, + "MechVentSchedule": { $ref: "3" }, + "MinFreshAirPerArea": 0.0003, + "MinFreshAirPerPerson": 0.0025, + "Category": "Office Spaces", + "Comments": None, + "DataSource": "MIT_SDL", + "Name": "B_Off_0 Conditioning", + } """ - zc = cls(*args, **kwargs) - - cool_schd = kwargs.get("CoolingSchedule", None) - zc.CoolingSchedule = zc.get_ref(cool_schd) - heat_schd = kwargs.get("HeatingSchedule", None) - zc.HeatingSchedule = zc.get_ref(heat_schd) - mech_schd = kwargs.get("MechVentSchedule", None) - zc.MechVentSchedule = zc.get_ref(mech_schd) - return zc - - def to_json(self): - """Convert class properties to dict""" + _id = data.pop("$id") + cooling_schedule = schedules[data.pop("CoolingSchedule")["$ref"]] + heating_schedule = schedules[data.pop("HeatingSchedule")["$ref"]] + mech_vent_schedule = schedules[data.pop("MechVentSchedule")["$ref"]] + return cls( + id=_id, + CoolingSchedule=cooling_schedule, + HeatingSchedule=heating_schedule, + MechVentSchedule=mech_vent_schedule, + **data, + **kwargs, + ) + + def to_dict(self): + """Return ZoneConditioning dictionary representation.""" self.validate() # Validate object before trying to get json format data_dict = collections.OrderedDict() data_dict["$id"] = str(self.id) - data_dict["CoolingSchedule"] = self.CoolingSchedule.to_dict() + data_dict["CoolingSchedule"] = self.CoolingSchedule.to_ref() data_dict["CoolingCoeffOfPerf"] = round(self.CoolingCoeffOfPerf, 3) data_dict["CoolingSetpoint"] = ( round(self.CoolingSetpoint, 3) @@ -403,7 +699,7 @@ def to_json(self): data_dict["HeatingCoeffOfPerf"] = round(self.HeatingCoeffOfPerf, 3) data_dict["HeatingLimitType"] = self.HeatingLimitType.value data_dict["HeatingFuelType"] = self.HeatingFuelType.value - data_dict["HeatingSchedule"] = self.HeatingSchedule.to_dict() + data_dict["HeatingSchedule"] = self.HeatingSchedule.to_ref() data_dict["HeatingSetpoint"] = ( round(self.HeatingSetpoint, 3) if not math.isnan(self.HeatingSetpoint) @@ -423,42 +719,41 @@ def to_json(self): data_dict["MaxCoolingCapacity"] = round(self.MaxCoolingCapacity, 3) data_dict["MaxHeatFlow"] = round(self.MaxHeatFlow, 3) data_dict["MaxHeatingCapacity"] = round(self.MaxHeatingCapacity, 3) - data_dict["MechVentSchedule"] = self.MechVentSchedule.to_dict() + data_dict["MechVentSchedule"] = self.MechVentSchedule.to_ref() data_dict["MinFreshAirPerArea"] = round(self.MinFreshAirPerArea, 3) data_dict["MinFreshAirPerPerson"] = round(self.MinFreshAirPerPerson, 3) data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict @classmethod - @timeit - def from_zone(cls, zone, nolimit=False, **kwargs): - """ + def from_zone(cls, zone, zone_ep, nolimit=False, **kwargs): + """Create a ZoneConditioning object from a zone. + Args: - zone (archetypal.template.zone.Zone): zone to gets information from + zone_ep: + zone (archetypal.template.zone.Zone): zone to gets information from. """ # If Zone is not part of Conditioned Area, it should not have a ZoneLoad object. if zone.is_part_of_conditioned_floor_area and zone.is_part_of_total_floor_area: # First create placeholder object. name = zone.Name + "_ZoneConditioning" - z_cond = cls( - Name=name, zone=zone, idf=zone.idf, Category=zone.idf.name, **kwargs - ) - z_cond._set_thermostat_setpoints(zone) - z_cond._set_zone_cops(zone, nolimit=nolimit) - z_cond._set_heat_recovery(zone) - z_cond._set_mechanical_ventilation(zone) - z_cond._set_economizer(zone) + z_cond = cls(Name=name, zone=zone, Category=zone.DataSource, **kwargs) + z_cond._set_thermostat_setpoints(zone, zone_ep) + z_cond._set_zone_cops(zone, zone_ep, nolimit=nolimit) + z_cond._set_heat_recovery(zone, zone_ep) + z_cond._set_mechanical_ventilation(zone, zone_ep) + z_cond._set_economizer(zone, zone_ep) return z_cond else: return None - def _set_economizer(self, zone): - """Set economizer parameters + def _set_economizer(self, zone, zone_ep): + """Set economizer parameters. Todo: - Here EconomizerType is for the entire building, try to do it for @@ -468,10 +763,11 @@ def _set_economizer(self, zone): https://github.com/MITSustainableDesignLab/basilisk/issues/32 Args: + zone_ep: zone (Zone): The zone object. """ # Economizer - controllers_in_idf = zone.idf.idfobjects["Controller:OutdoorAir".upper()] + controllers_in_idf = zone_ep.theidf.idfobjects["Controller:OutdoorAir".upper()] self.EconomizerType = EconomizerTypes.NoEconomizer # default value for object in controllers_in_idf: @@ -492,11 +788,13 @@ def _set_economizer(self, zone): elif object.Economizer_Control_Type == "DifferentialDryBulbAndEnthalpy": self.EconomizerType = EconomizerTypes.DifferentialEnthalphy - def _set_mechanical_ventilation(self, zone): - """Mechanical Ventilation in UMI (or Archsim-based models) is applied to an - `ZoneHVAC:IdealLoadsAirSystem` through the `Design Specification Outdoor Air - Object Name` which in turn is a `DesignSpecification:OutdoorAir` object. It - is this last object that performs the calculation for the outdoor air + def _set_mechanical_ventilation(self, zone, zone_ep): + """Set mechanical ventilation settings. + + Notes: Mechanical Ventilation in UMI (or Archsim-based models) is applied to + an `ZoneHVAC:IdealLoadsAirSystem` through the `Design Specification Outdoor + Air Object Name` which in turn is a `DesignSpecification:OutdoorAir` object. + It is this last object that performs the calculation for the outdoor air flowrate. Moreover, UMI defaults to the "sum" method, meaning that the Outdoor Air Flow per Person {m3/s-person} and the Outdoor Air Flow per Area { m3/s-m2} are summed to obtain the zone outdoor air flow rate. Moreover, @@ -507,6 +805,7 @@ def _set_mechanical_ventilation(self, zone): no `DesignSpecification:OutdoorAir`) and 2) models with Args: + zone_ep: zone (Zone): The zone object. """ # For models with ZoneSizes @@ -524,8 +823,8 @@ def _set_mechanical_ventilation(self, zone): self.MinFreshAirPerArea, self.MinFreshAirPerPerson, self.MechVentSchedule, - ) = self.fresh_air_from_ideal_loads(zone) - except Exception as e: + ) = self.fresh_air_from_ideal_loads(zone, zone_ep) + except Exception: # Set elements to None so that .combine works correctly self.IsMechVentOn = False self.MinFreshAirPerPerson = 0 @@ -533,9 +832,13 @@ def _set_mechanical_ventilation(self, zone): self.MechVentSchedule = None @staticmethod - def get_equipment_list(zone): - # get zone equipment list - connections = zone._epbunch.getreferingobjs( + def get_equipment_list(zone, zone_ep): + """Get zone equipment list. + + Args: + zone_ep: + """ + connections = zone_ep.getreferingobjs( iddgroups=["Zone HVAC Equipment Connections"], fields=["Zone_Name"] ) referenced_object = next(iter(connections)).get_referenced_object( @@ -550,16 +853,18 @@ def get_equipment_list(zone): ], ) - def fresh_air_from_ideal_loads(self, zone): - """ + def fresh_air_from_ideal_loads(self, zone, zone_ep): + """Resolve fresh air requirements for Ideal Loads Air System. Args: + zone_ep: zone: Returns: - 4-tuple: (IsMechVentOn, MinFreshAirPerArea, MinFreshAirPerPerson, MechVentSchedule) + 4-tuple: (IsMechVentOn, MinFreshAirPerArea, MinFreshAirPerPerson, + MechVentSchedule) """ - equip_list = self.get_equipment_list(zone) + equip_list = self.get_equipment_list(zone, zone_ep) equipment = next( iter( [ @@ -580,7 +885,7 @@ def fresh_air_from_ideal_loads(self, zone): return True, oa_area, oa_person, mechvent_schedule def fresh_air_from_zone_sizes(self, zone): - """Returns the Mechanical Ventilation from the ZoneSizes Table in the sql db. + """Return the Mechanical Ventilation from the ZoneSizes Table in the sql db. Args: zone (ZoneDefinition): @@ -625,11 +930,10 @@ def fresh_air_from_zone_sizes(self, zone): return isoa, oa_area, oa_person, mechvent_schedule def _mechanical_schedule_from_outdoorair_object(self, oa_spec, zone) -> UmiSchedule: - """Get the mechanical ventilation schedule for zone and OutdoorAir:DesignSpec""" + """Get mechanical ventilation schedule for zone and OutdoorAir:DesignSpec.""" if oa_spec.Outdoor_Air_Schedule_Name != "": - umi_schedule = UmiSchedule( - Name=oa_spec.Outdoor_Air_Schedule_Name, idf=zone.idf - ) + epbunch = zone.idf.schedules_dict[oa_spec.Outdoor_Air_Schedule_Name.upper()] + umi_schedule = UmiSchedule.from_epbunch(epbunch) log( f"Mechanical Ventilation Schedule set as {UmiSchedule} for " f"zone {zone.Name}", @@ -656,10 +960,7 @@ def _mechanical_schedule_from_outdoorair_object(self, oa_spec, zone) -> UmiSched f"{zone.Name}" ) return UmiSchedule.constant_schedule( - hourly_value=0, - Name="AlwaysOff", - allow_duplicates=True, - idf=zone.idf, + value=0, Name="AlwaysOff", allow_duplicates=True ) else: log( @@ -672,12 +973,15 @@ def _mechanical_schedule_from_outdoorair_object(self, oa_spec, zone) -> UmiSched idf=zone.idf, ) - def _set_zone_cops(self, zone, nolimit=False): - """ + def _set_zone_cops(self, zone, zone_ep, nolimit=False): + """Set the zone COPs. + Todo: - Make this method zone-independent. + - This method takes 75% of the `from_zone` constructor. Args: + zone_ep: zone (Zone): """ # COPs (heating and cooling) @@ -693,7 +997,7 @@ def _set_zone_cops(self, zone, nolimit=False): for meter in heating_meters: try: total_input_heating_energy += ( - self.idf.meters.OutputMeter[meter].values("kWh").sum() + zone_ep.theidf.meters.OutputMeter[meter].values("kWh").sum() ) except KeyError: pass # pass if meter does not exist for model @@ -706,14 +1010,14 @@ def _set_zone_cops(self, zone, nolimit=False): for meter in heating_energy_transfer_meters: try: total_output_heating_energy += ( - self.idf.meters.OutputMeter[meter].values("kWh").sum() + zone_ep.theidf.meters.OutputMeter[meter].values("kWh").sum() ) except KeyError: pass # pass if meter does not exist for model if total_output_heating_energy == 0: # IdealLoadsAirSystem try: total_output_heating_energy += ( - self.idf.meters.OutputMeter["Heating__EnergyTransfer"] + zone_ep.theidf.meters.OutputMeter["Heating__EnergyTransfer"] .values("kWh") .sum() ) @@ -731,7 +1035,7 @@ def _set_zone_cops(self, zone, nolimit=False): for meter in cooling_meters: try: total_input_cooling_energy += ( - self.idf.meters.OutputMeter[meter].values("kWh").sum() + zone_ep.theidf.meters.OutputMeter[meter].values("kWh").sum() ) except KeyError: pass # pass if meter does not exist for model @@ -744,14 +1048,14 @@ def _set_zone_cops(self, zone, nolimit=False): for meter in cooling_energy_transfer_meters: try: total_output_cooling_energy += ( - self.idf.meters.OutputMeter[meter].values("kWh").sum() + zone_ep.theidf.meters.OutputMeter[meter].values("kWh").sum() ) except KeyError: pass # pass if meter does not exist for model if total_output_cooling_energy == 0: # IdealLoadsAirSystem try: total_output_cooling_energy += ( - self.idf.meters.OutputMeter["Cooling__EnergyTransfer"] + zone_ep.theidf.meters.OutputMeter["Cooling__EnergyTransfer"] .values("kWh") .sum() ) @@ -768,7 +1072,9 @@ def _set_zone_cops(self, zone, nolimit=False): # estimate fans electricity for cooling and heating try: fans_energy = ( - self.idf.meters.OutputMeter["Fans__Electricity"].values("kWh").sum() + zone_ep.theidf.meters.OutputMeter["Fans__Electricity"] + .values("kWh") + .sum() ) fans_cooling = fans_energy * ratio_cooling fans_heating = fans_energy * ratio_heating @@ -780,7 +1086,9 @@ def _set_zone_cops(self, zone, nolimit=False): # estimate pumps electricity for cooling and heating try: pumps_energy = ( - self.idf.meters.OutputMeter["Pumps__Electricity"].values("kWh").sum() + zone_ep.theidf.meters.OutputMeter["Pumps__Electricity"] + .values("kWh") + .sum() ) pumps_cooling = pumps_energy * ratio_cooling pumps_heating = pumps_energy * ratio_heating @@ -800,8 +1108,8 @@ def _set_zone_cops(self, zone, nolimit=False): heating_cop = total_output_heating_energy / total_input_heating_energy # Capacity limits (heating and cooling) - zone_size = zone.idf.sql()["ZoneSizes"][ - zone.idf.sql()["ZoneSizes"]["ZoneName"] == zone.Name.upper() + zone_size = zone_ep.theidf.sql()["ZoneSizes"][ + zone_ep.theidf.sql()["ZoneSizes"]["ZoneName"] == zone.Name.upper() ] # Heating HeatingLimitType, heating_cap, heating_flow = self._get_design_limits( @@ -828,21 +1136,16 @@ def _set_zone_cops(self, zone, nolimit=False): if math.isnan(cooling_cop): self.CoolingCoeffOfPerf = 1 - def _set_thermostat_setpoints(self, zone): - """Sets the thermostat settings and schedules for this zone. - - Thermostat Setpoints: - - CoolingSetpoint (float): - - HeatingSetpoint (float): - - HeatingSchedule (UmiSchedule): - - CoolingSchedule (UmiSchedule): + def _set_thermostat_setpoints(self, zone, zone_ep): + """Set the thermostat settings and schedules for this zone. Args: + zone_ep: zone (Zone): The zone object. """ # Set Thermostat set points # Heating and Cooling set points and schedules - with sqlite3.connect(zone.idf.sql_file) as conn: + with sqlite3.connect(zone_ep.theidf.sql_file) as conn: sql_query = f""" SELECT t.ReportVariableDataDictionaryIndex FROM ReportVariableDataDictionary t @@ -862,7 +1165,6 @@ def _set_thermostat_setpoints(self, zone): Name=zone.Name + "_Heating_Schedule", Values=heating_availability, Type="Fraction", - idf=zone.idf, allow_duplicates=True, ) else: @@ -887,14 +1189,13 @@ def _set_thermostat_setpoints(self, zone): Name=zone.Name + "_Cooling_Schedule", Values=1 - cooling_availability, # take flipped Type="Fraction", - idf=zone.idf, allow_duplicates=True, ) else: cooling_sched = None - self.HeatingSetpoint = max(h_array) + self.HeatingSetpoint = max(h_array)[0] self.HeatingSchedule = heating_sched - self.CoolingSetpoint = min(c_array) + self.CoolingSetpoint = min(c_array)[0] self.CoolingSchedule = cooling_sched # If HeatingSetpoint == nan, means there is no heat or cold input, @@ -908,8 +1209,8 @@ def _set_thermostat_setpoints(self, zone): else: self.IsCoolingOn = True - def _set_heat_recovery(self, zone): - """Sets the heat recovery parameters for this zone. + def _set_heat_recovery(self, zone, zone_ep): + """Set the heat recovery parameters for this zone. Heat Recovery Parameters: - HeatRecoveryEfficiencyLatent (float): The latent heat recovery @@ -920,6 +1221,7 @@ def _set_heat_recovery(self, zone): - comment (str): A comment to append to the class comment attribute. Args: + zone_ep: zone (Zone): The Zone object. """ from itertools import chain @@ -934,12 +1236,12 @@ def _set_heat_recovery(self, zone): # for con in connections # ] # get possible heat recovery objects from idd - heat_recovery_objects = zone.idf.getiddgroupdict()["Heat Recovery"] + heat_recovery_objects = zone_ep.theidf.getiddgroupdict()["Heat Recovery"] # get possible heat recovery objects from this idf heat_recovery_in_idf = list( chain.from_iterable( - zone.idf.idfobjects[key.upper()] for key in heat_recovery_objects + zone_ep.theidf.idfobjects[key.upper()] for key in heat_recovery_objects ) ) @@ -977,7 +1279,7 @@ def _set_heat_recovery(self, zone): ( HeatRecoveryEfficiencyLatent, HeatRecoveryEfficiencySensible, - ) = self._get_recoverty_effectiveness(object, zone) + ) = self._get_recoverty_effectiveness(object, zone, zone_ep) HeatRecoveryType = HeatRecoveryTypes.Enthalpy comment = ( @@ -1009,13 +1311,8 @@ def _set_heat_recovery(self, zone): self.Comments += comment @staticmethod - def _get_recoverty_effectiveness(object, zone): - """ - Args: - object: - zone: - """ - rd = ReportData.from_sql_dict(zone.idf.sql()) + def _get_recoverty_effectiveness(object, zone, zone_ep): + rd = ReportData.from_sql_dict(zone_ep.theidf.sql()) effectiveness = ( rd.filter_report_data( name=( @@ -1038,7 +1335,7 @@ def _get_recoverty_effectiveness(object, zone): @staticmethod def _get_design_limits(zone, zone_size, load_name, nolimit=False): - """Gets design limits for heating and cooling systems + """Get design limits for heating and cooling systems. Args: zone (archetypal.template.zone.Zone): zone to gets information from @@ -1059,7 +1356,7 @@ def _get_design_limits(zone, zone_size, load_name, nolimit=False): / zone.area ) LimitType = IdealSystemLimit.LimitFlowRateAndCapacity - except: + except Exception: cap = 100 flow = 100 LimitType = IdealSystemLimit.NoLimit @@ -1067,7 +1364,7 @@ def _get_design_limits(zone, zone_size, load_name, nolimit=False): @staticmethod def _get_cop(zone, energy_in_list, energy_out_variable_name): - """Calculates COP for heating or cooling systems + """Calculate COP for heating or cooling systems. Args: zone (archetypal.template.zone.Zone): zone to gets information from @@ -1125,70 +1422,58 @@ def combine(self, other, weights=None): meta = self._get_predecessors_meta(other) if not weights: - zone_weight = settings.zone_weight - weights = [ - getattr(self._belongs_to_zone, str(zone_weight)), - getattr(other._belongs_to_zone, str(zone_weight)), - ] - log( - 'using zone {} "{}" as weighting factor in "{}" ' - "combine.".format( - zone_weight, - " & ".join(list(map(str, map(int, weights)))), - self.__class__.__name__, - ) - ) - - a = UmiBase._float_mean(self, other, "CoolingCoeffOfPerf", weights) - b = max(self.CoolingLimitType, other.CoolingLimitType) - c = UmiBase._float_mean(self, other, "CoolingSetpoint", weights) - d = max(self.EconomizerType, other.EconomizerType) - e = UmiBase._float_mean(self, other, "HeatRecoveryEfficiencyLatent", weights) - f = UmiBase._float_mean(self, other, "HeatRecoveryEfficiencySensible", weights) - g = max(self.HeatRecoveryType, other.HeatRecoveryType) - h = UmiBase._float_mean(self, other, "HeatingCoeffOfPerf", weights) - i = max(self.HeatingLimitType, other.HeatingLimitType) - j = UmiBase._float_mean(self, other, "HeatingSetpoint", weights) - k = any((self.IsCoolingOn, other.IsCoolingOn)) - l = any((self.IsHeatingOn, other.IsHeatingOn)) - m = any((self.IsMechVentOn, other.IsMechVentOn)) - n = UmiBase._float_mean(self, other, "MaxCoolFlow", weights) - o = UmiBase._float_mean(self, other, "MaxCoolingCapacity", weights) - p = UmiBase._float_mean(self, other, "MaxHeatFlow", weights) - q = UmiBase._float_mean(self, other, "MaxHeatingCapacity", weights) - r = UmiBase._float_mean(self, other, "MinFreshAirPerArea", weights) - s = UmiBase._float_mean(self, other, "MinFreshAirPerPerson", weights) - t = UmiSchedule.combine(self.HeatingSchedule, other.HeatingSchedule, weights) - u = UmiSchedule.combine(self.CoolingSchedule, other.CoolingSchedule, weights) - v = UmiSchedule.combine(self.MechVentSchedule, other.MechVentSchedule, weights) + weights = [self.area, other.area] new_attr = dict( - CoolingCoeffOfPerf=a, - CoolingLimitType=b, - CoolingSetpoint=c, - EconomizerType=d, - HeatRecoveryEfficiencyLatent=e, - HeatRecoveryEfficiencySensible=f, - HeatRecoveryType=g, - HeatingCoeffOfPerf=h, - HeatingLimitType=i, - HeatingSetpoint=j, - IsCoolingOn=k, - IsHeatingOn=l, - IsMechVentOn=m, - MaxCoolFlow=n, - MaxCoolingCapacity=o, - MaxHeatFlow=p, - MaxHeatingCapacity=q, - MinFreshAirPerArea=r, - MinFreshAirPerPerson=s, - HeatingSchedule=t, - CoolingSchedule=u, - MechVentSchedule=v, + CoolingCoeffOfPerf=UmiBase.float_mean( + self, other, "CoolingCoeffOfPerf", weights + ), + CoolingLimitType=max(self.CoolingLimitType, other.CoolingLimitType), + CoolingSetpoint=UmiBase.float_mean(self, other, "CoolingSetpoint", weights), + EconomizerType=max(self.EconomizerType, other.EconomizerType), + HeatRecoveryEfficiencyLatent=UmiBase.float_mean( + self, other, "HeatRecoveryEfficiencyLatent", weights + ), + HeatRecoveryEfficiencySensible=UmiBase.float_mean( + self, other, "HeatRecoveryEfficiencySensible", weights + ), + HeatRecoveryType=max(self.HeatRecoveryType, other.HeatRecoveryType), + HeatingCoeffOfPerf=UmiBase.float_mean( + self, other, "HeatingCoeffOfPerf", weights + ), + HeatingLimitType=max(self.HeatingLimitType, other.HeatingLimitType), + HeatingSetpoint=UmiBase.float_mean(self, other, "HeatingSetpoint", weights), + IsCoolingOn=any((self.IsCoolingOn, other.IsCoolingOn)), + IsHeatingOn=any((self.IsHeatingOn, other.IsHeatingOn)), + IsMechVentOn=any((self.IsMechVentOn, other.IsMechVentOn)), + MaxCoolFlow=UmiBase.float_mean(self, other, "MaxCoolFlow", weights), + MaxCoolingCapacity=UmiBase.float_mean( + self, other, "MaxCoolingCapacity", weights + ), + MaxHeatFlow=UmiBase.float_mean(self, other, "MaxHeatFlow", weights), + MaxHeatingCapacity=UmiBase.float_mean( + self, other, "MaxHeatingCapacity", weights + ), + MinFreshAirPerArea=UmiBase.float_mean( + self, other, "MinFreshAirPerArea", weights + ), + MinFreshAirPerPerson=UmiBase.float_mean( + self, other, "MinFreshAirPerPerson", weights + ), + HeatingSchedule=UmiSchedule.combine( + self.HeatingSchedule, other.HeatingSchedule, weights + ), + CoolingSchedule=UmiSchedule.combine( + self.CoolingSchedule, other.CoolingSchedule, weights + ), + MechVentSchedule=UmiSchedule.combine( + self.MechVentSchedule, other.MechVentSchedule, weights + ), + area=1 if self.area + other.area == 2 else self.area + other.area, ) # create a new object with the previous attributes new_obj = self.__class__( - **meta, **new_attr, idf=self.idf, allow_duplicates=self._allow_duplicates + **meta, **new_attr, allow_duplicates=self.allow_duplicates ) new_obj.predecessors.update(self.predecessors + other.predecessors) return new_obj @@ -1196,11 +1481,11 @@ def combine(self, other, weights=None): def validate(self): """Validate object and fill in missing values.""" if self.HeatingSchedule is None: - self.HeatingSchedule = UmiSchedule.constant_schedule(idf=self.idf) + self.HeatingSchedule = UmiSchedule.constant_schedule() if self.CoolingSchedule is None: - self.CoolingSchedule = UmiSchedule.constant_schedule(idf=self.idf) + self.CoolingSchedule = UmiSchedule.constant_schedule() if self.MechVentSchedule is None: - self.MechVentSchedule = UmiSchedule.constant_schedule(idf=self.idf) + self.MechVentSchedule = UmiSchedule.constant_schedule() if not self.IsMechVentOn: self.IsMechVentOn = False if not self.MinFreshAirPerPerson: @@ -1208,10 +1493,18 @@ def validate(self): if not self.MinFreshAirPerArea: self.MinFreshAirPerArea = 0 - def mapping(self): - self.validate() + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. - return dict( + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() + + base = super(ZoneConditioning, self).mapping(validate=validate) + data = dict( CoolingSchedule=self.CoolingSchedule, CoolingCoeffOfPerf=self.CoolingCoeffOfPerf, CoolingSetpoint=self.CoolingSetpoint, @@ -1236,25 +1529,100 @@ def mapping(self): MechVentSchedule=self.MechVentSchedule, MinFreshAirPerArea=self.MinFreshAirPerArea, MinFreshAirPerPerson=self.MinFreshAirPerPerson, - Category=self.Category, - Comments=self.Comments, - DataSource=self.DataSource, - Name=self.Name, ) + data.update(base) + return data - def get_ref(self, ref): - """Get item matching reference id. + def to_epbunch(self, idf, zone_name, design_specification_outdoor_air_object): + """Convert self to an EpBunch given an IDF model. Args: - ref: + idf: + zone_name: + + Returns: + EpBunch: The EpBunch object added to the idf model. + """ - return next( - iter( + return idf.newidfobject( + key="ZONEHVAC:IDEALLOADSAIRSYSTEM", + Name=f"{zone_name} Ideal Loads Air System", + Availability_Schedule_Name="", + Zone_Supply_Air_Node_Name="", + Zone_Exhaust_Air_Node_Name="", + System_Inlet_Air_Node_Name="", + Maximum_Heating_Supply_Air_Temperature="50", + Minimum_Cooling_Supply_Air_Temperature="13", + Maximum_Heating_Supply_Air_Humidity_Ratio="0.0156", + Minimum_Cooling_Supply_Air_Humidity_Ratio="0.0077", + Heating_Limit=self.HeatingLimitType.name, + Maximum_Heating_Air_Flow_Rate=self.MaxHeatFlow, + Maximum_Sensible_Heating_Capacity=self.MaxHeatingCapacity, + Cooling_Limit=self.CoolingLimitType.name, + Maximum_Cooling_Air_Flow_Rate=self.MaxCoolFlow, + Maximum_Total_Cooling_Capacity=self.MaxCoolingCapacity, + Heating_Availability_Schedule_Name=self.HeatingSchedule, + Cooling_Availability_Schedule_Name=self.CoolingSchedule, + Dehumidification_Control_Type="ConstantSensibleHeatRatio", + Cooling_Sensible_Heat_Ratio="0.7", + Humidification_Control_Type="None", + Design_Specification_Outdoor_Air_Object_Name=design_specification_outdoor_air_object.Name, + Outdoor_Air_Inlet_Node_Name="", + Demand_Controlled_Ventilation_Type="None", + Outdoor_Air_Economizer_Type=self.EconomizerType.name, + Heat_Recovery_Type=self.HeatRecoveryType.name, + Sensible_Heat_Recovery_Effectiveness=self.HeatRecoveryEfficiencySensible, + Latent_Heat_Recovery_Effectiveness=self.HeatRecoveryEfficiencyLatent, + ) + + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def __add__(self, other): + """Combine self and other.""" + return self.combine(other) + + def __hash__(self): + """Return the hash value of self.""" + return hash( + (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + ) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, ZoneConditioning): + return NotImplemented + else: + return all( [ - value - for value in ZoneConditioning.CREATED_OBJECTS - if value.id == ref["$ref"] + self.CoolingCoeffOfPerf == other.CoolingCoeffOfPerf, + self.CoolingLimitType == other.CoolingLimitType, + self.CoolingSetpoint == other.CoolingSetpoint, + self.CoolingSchedule == other.CoolingSchedule, + self.EconomizerType == other.EconomizerType, + self.HeatRecoveryEfficiencyLatent + == other.HeatRecoveryEfficiencyLatent, + self.HeatRecoveryEfficiencySensible + == other.HeatRecoveryEfficiencySensible, + self.HeatRecoveryType == other.HeatRecoveryType, + self.HeatingCoeffOfPerf == other.HeatingCoeffOfPerf, + self.HeatingLimitType == other.HeatingLimitType, + self.HeatingSetpoint == other.HeatingSetpoint, + self.HeatingSchedule == other.HeatingSchedule, + self.IsCoolingOn == other.IsCoolingOn, + self.IsHeatingOn == other.IsHeatingOn, + self.IsMechVentOn == other.IsMechVentOn, + self.MaxCoolFlow == other.MaxCoolFlow, + self.MaxCoolingCapacity == other.MaxCoolingCapacity, + self.MaxHeatFlow == other.MaxHeatFlow, + self.MaxHeatingCapacity == other.MaxHeatingCapacity, + self.MinFreshAirPerArea == other.MinFreshAirPerArea, + self.MinFreshAirPerPerson == other.MinFreshAirPerPerson, + self.MechVentSchedule == other.MechVentSchedule, ] - ), - None, - ) + ) + + def __copy__(self): + """Create a copy of self.""" + return self.__class__(**self.mapping(validate=False)) diff --git a/archetypal/template/constructions/__init__.py b/archetypal/template/constructions/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/archetypal/template/constructions/base_construction.py b/archetypal/template/constructions/base_construction.py new file mode 100644 index 00000000..817eea9b --- /dev/null +++ b/archetypal/template/constructions/base_construction.py @@ -0,0 +1,328 @@ +"""archetypal ConstructionBase and LayeredConstruction.""" + +import math +from typing import List, Union + +from validator_collection import validators + +from archetypal.template.materials import GasMaterial +from archetypal.template.materials.gas_layer import GasLayer +from archetypal.template.materials.material_layer import MaterialLayer +from archetypal.template.umi_base import UmiBase + + +class ConstructionBase(UmiBase): + """A class used to store data linked to Life Cycle aspects. + + For more information on the Life Cycle Analysis performed in UMI, see: + https://umidocs.readthedocs.io/en/latest/docs/life-cycle-introduction.html#life-cycle-impact + """ + + __slots__ = ( + "_assembly_carbon", + "_assembly_cost", + "_assembly_energy", + "_dissassembly_carbon", + "_dissassembly_energy", + ) + + def __init__( + self, + Name, + AssemblyCarbon=0, + AssemblyCost=0, + AssemblyEnergy=0, + DisassemblyCarbon=0, + DisassemblyEnergy=0, + **kwargs, + ): + """Initialize a ConstructionBase object with parameters. + + Args: + AssemblyCarbon (float): assembly carbon [kgCO2/m2]. + AssemblyCost (float): assembly carbon [kgCO2/m2]. + AssemblyEnergy (float): assembly energy [MJ/m2]. + DisassemblyCarbon (float): disassembly carbon [kgCO2/m2]. + DisassemblyEnergy (float): disassembly energy [MJ/m2]. + **kwargs: keywords passed to UmiBase. + """ + super(ConstructionBase, self).__init__(Name, **kwargs) + self.AssemblyCarbon = AssemblyCarbon + self.AssemblyCost = AssemblyCost + self.AssemblyEnergy = AssemblyEnergy + self.DisassemblyCarbon = DisassemblyCarbon + self.DisassemblyEnergy = DisassemblyEnergy + + @property + def AssemblyCarbon(self): + """Get or set the assembly carbon [kgCO2/m2].""" + return self._assembly_carbon + + @AssemblyCarbon.setter + def AssemblyCarbon(self, value): + self._assembly_carbon = float(value) + + @property + def AssemblyCost(self): + """Get or set the assembly cost [$/m2].""" + return self._assembly_cost + + @AssemblyCost.setter + def AssemblyCost(self, value): + self._assembly_cost = float(value) + + @property + def AssemblyEnergy(self): + """Get or set the assembly energy [MJ/m2].""" + return self._assembly_energy + + @AssemblyEnergy.setter + def AssemblyEnergy(self, value): + self._assembly_energy = float(value) + + @property + def DisassemblyCarbon(self): + """Get or set the disassembly carbon [kgCO2/m2].""" + return self._dissassembly_carbon + + @DisassemblyCarbon.setter + def DisassemblyCarbon(self, value): + self._dissassembly_carbon = float(value) + + @property + def DisassemblyEnergy(self): + """Get or set the disassembly energy [MJ/m2].""" + return self._dissassembly_energy + + @DisassemblyEnergy.setter + def DisassemblyEnergy(self, value): + self._dissassembly_energy = float(value) + + def validate(self): + """Validate object and fill in missing values.""" + return self + + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def __key__(self): + """Get a tuple of attributes. Useful for hashing and comparing.""" + return ( + self.AssemblyCarbon, + self.AssemblyCost, + self.AssemblyEnergy, + self.DisassemblyCarbon, + self.DisassemblyEnergy, + ) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + return isinstance(other, ConstructionBase) and self.__key__() == other.__key__() + + def __copy__(self): + """Create a copy of self.""" + return self.__class__( + self.Name, + self.AssemblyCarbon, + self.AssemblyCost, + self.AssemblyEnergy, + self.DisassemblyCarbon, + self.DisassemblyEnergy, + ) + + +class LayeredConstruction(ConstructionBase): + """Defines the layers of an :class:`OpaqueConstruction`. + + Attributes: + Layers (list of archetypal.MaterialLayer): List of MaterialLayer objects from + outside to inside. + """ + + __slots__ = ("_layers",) + + def __init__(self, Name, Layers, **kwargs): + """Initialize Layered Construction. + + Args: + Layers (list of (MaterialLayer or GasLayer)): A list of + :class:`MaterialLayer` or :class:`GasLayer` objects. + **kwargs: Keywords passed to the :class:`ConstructionBase` + constructor. + """ + super(LayeredConstruction, self).__init__(Name, **kwargs) + self.Layers = Layers + + @property + def Layers(self) -> List[Union[MaterialLayer, GasLayer]]: + """Get or set the material layers.""" + return self._layers + + @Layers.setter + def Layers(self, value): + value = validators.iterable(value, minimum_length=1, maximum_length=10) + assert all(isinstance(a, (MaterialLayer, GasLayer)) for a in value), ( + "Value input error for '{value}'. Layers must be a list of MaterialLayer " + "or GasLayer objects only." + ) + assert isinstance( + value[0], MaterialLayer + ), "The outside layer cannot be a GasLayer" + assert isinstance( + value[-1], MaterialLayer + ), "The inside layer cannot be a GasLayer" + self._layers = value + + @property + def r_value(self): + """Get or set the thermal resistance [K⋅m2/W] (excluding air films).""" + return sum([layer.r_value for layer in self.Layers]) + + @property + def u_value(self): + """Get the heat transfer coefficient [W/m2⋅K] (excluding air films).""" + return 1 / self.r_value + + @property + def r_factor(self): + """Get the R-factor [m2-K/W] (including air films).""" + return 1 / self.out_h_simple() + self.r_value + 1 / self.in_h_simple() + + def out_h_simple(self): + """Get the simple outdoor heat transfer coefficient according to ISO 10292. + + This is used for all opaque R-factor calculations. + """ + return 23 + + def in_h_simple(self): + """Get the simple indoor heat transfer coefficient according to ISO 10292. + + This is used for all opaque R-factor calculations. + """ + return 3.6 + (4.4 * self.inside_emissivity / 0.84) + + def out_h(self, wind_speed=6.7, t_kelvin=273.15): + """Get the detailed outdoor heat transfer coefficient according to ISO 15099. + + This is used for window U-factor calculations and all of the + temperature_profile calculations. + + Args: + wind_speed (float): The average outdoor wind speed [m/s]. This affects the + convective heat transfer coefficient. Default is 6.7 m/s. + t_kelvin (float): The average between the outdoor temperature and the + exterior surface temperature. This can affect the radiative heat + transfer. Default is 273.15K (0C). + """ + _conv_h = 4 + (4 * wind_speed) + _rad_h = 4 * 5.6697e-8 * self.outside_emissivity * (t_kelvin ** 3) + return _conv_h + _rad_h + + def in_h(self, t_kelvin=293.15, delta_t=15, height=1.0, angle=90, pressure=101325): + """Get the detailed indoor heat transfer coefficient according to ISO 15099. + + This is used for window U-factor calculations and all of the + temperature_profile calculations. + + Args: + t_kelvin (float): The average between the indoor temperature and the + interior surface temperature. Default is 293.15K (20C). + delta_t (float): The temperature difference between the indoor temperature + and the interior surface temperature [C]. Default is 15C. + height (float): An optional height for the surface in meters. Default is + 1.0 m, which is consistent with NFRC standards. + angle (float): An angle in degrees between 0 and 180. + 0 = A horizontal surface with downward heat flow through the layer. + 90 = A vertical surface + 180 = A horizontal surface with upward heat flow through the layer. + pressure (float): The average pressure in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + _conv_h = self.in_h_c(t_kelvin, delta_t, height, angle, pressure) + _rad_h = 4 * 5.6697e-8 * self.inside_emissivity * (t_kelvin ** 3) + return _conv_h + _rad_h + + def in_h_c( + self, t_kelvin=293.15, delta_t=15, height=1.0, angle=90, pressure=101325 + ): + """Get the detailed indoor convective heat transfer coefficient according to + ISO 15099. + + This is used for window U-factor calculations and all of the + temperature_profile calculations. + + Args: + t_kelvin (float): The average between the indoor temperature and the + interior surface temperature. Default is 293.15K (20C). + delta_t (float): The temperature difference between the indoor temperature + and the interior surface temperature [C]. Default is 15C. + height (float): An optional height for the surface in meters. Default is + 1.0 m, which is consistent with NFRC standards. + angle (float): An angle in degrees between 0 and 180. + 0 = A horizontal surface with downward heat flow through the layer. + 90 = A vertical surface + 180 = A horizontal surface with upward heat flow through the layer. + pressure (float): The average pressure in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + gas_material = GasMaterial("AIR") + _ray_numerator = ( + (gas_material.density_at_temperature(t_kelvin, pressure) ** 2) + * (height ** 3) + * 9.81 + * gas_material.specific_heat_at_temperature(t_kelvin, pressure) + * delta_t + ) + _ray_denominator = ( + t_kelvin + * gas_material.viscosity_at_temperature(t_kelvin, pressure) + * gas_material.conductivity_at_temperature(t_kelvin, pressure) + ) + _rayleigh_h = abs(_ray_numerator / _ray_denominator) + if angle < 15: + nusselt = 0.13 * (_rayleigh_h ** (1 / 3)) + elif angle <= 90: + _sin_a = math.sin(math.radians(angle)) + _rayleigh_c = 2.5e5 * ((math.exp(0.72 * angle) / _sin_a) ** (1 / 5)) + if _rayleigh_h < _rayleigh_c: + nusselt = 0.56 * ((_rayleigh_h * _sin_a) ** (1 / 4)) + else: + nu_1 = 0.56 * ((_rayleigh_c * _sin_a) ** (1 / 4)) + nu_2 = 0.13 * ((_rayleigh_h ** (1 / 3)) - (_rayleigh_c ** (1 / 3))) + nusselt = nu_1 + nu_2 + elif angle <= 179: + _sin_a = math.sin(math.radians(angle)) + nusselt = 0.56 * ((_rayleigh_h * _sin_a) ** (1 / 4)) + else: + nusselt = 0.58 * (_rayleigh_h ** (1 / 5)) + _conv_h = nusselt * ( + gas_material.conductivity_at_temperature(t_kelvin, pressure) / height + ) + return _conv_h + + @property + def outside_emissivity(self): + """Get the hemispherical emissivity of the outside face of the construction.""" + return self.Layers[0].Material.ThermalEmittance + + @property + def inside_emissivity(self): + """Get the emissivity of the inside face of the construction [-].""" + return self.Layers[-1].Material.ThermalEmittance + + @property + def u_factor(self): + """Get the overall heat transfer coefficient (including air films) W/(m2⋅K).""" + return 1 / self.r_factor + + def __copy__(self): + """Create a copy of self.""" + return self.__class__(Name=self.Name, Layers=self.Layers) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + return isinstance(other, LayeredConstruction) and all( + [self.Layers == other.Layers] + ) diff --git a/archetypal/template/constructions/internal_mass.py b/archetypal/template/constructions/internal_mass.py new file mode 100644 index 00000000..c8061aa4 --- /dev/null +++ b/archetypal/template/constructions/internal_mass.py @@ -0,0 +1,146 @@ +import functools +from operator import add + +from validator_collection import validators + +from archetypal.template.constructions.opaque_construction import OpaqueConstruction + + +class InternalMass: + """InternalMass class.""" + + def __init__(self, surface_name, construction, total_area_exposed_to_zone): + """Create an InternalMass object.""" + self.surface_name = surface_name + self.construction = construction + self.total_area_exposed_to_zone = total_area_exposed_to_zone + + @property + def surface_name(self): + """Get or set the surface name [string].""" + return self._surface_name + + @surface_name.setter + def surface_name(self, value): + self._surface_name = validators.string( + value, minimum_length=1, maximum_length=100 + ) + + @property + def construction(self) -> OpaqueConstruction: + """Get or set the construction.""" + return self._construction + + @construction.setter + def construction(self, value): + assert isinstance(value, OpaqueConstruction), ( + f"Input value error for {value}. construction must be of type " + f"{OpaqueConstruction}, not {type(value)}." + ) + self._construction = value + + @property + def total_area_exposed_to_zone(self): + """Get or set the total area exposed to Zone [m2].""" + return self._total_area_exposed_to_zone + + @total_area_exposed_to_zone.setter + def total_area_exposed_to_zone(self, value): + self._total_area_exposed_to_zone = validators.float(value, minimum=0) + + @classmethod + def from_zone(cls, zone_epbunch): + """Create InternalMass from ZoneDefinition and Zone EpBunch. + + Args: + zone_epbunch (EpBunch): The Zone EpBunch object. + + Returns: + Construction: The internal mass construction for the zone + None: if no internal mass defined for zone. + """ + internal_mass_objs = zone_epbunch.getreferingobjs( + iddgroups=["Thermal Zones and Surfaces"], fields=["Zone_or_ZoneList_Name"] + ) + + area = 0 # initialize area + mass_opaque_constructions = [] # collect internal mass objects + + # Looping over possible InternalMass objects + # This InternalMass object (int_obj) is assigned to self, + # then create object and append to list. There could be more then + # one. + for int_obj in internal_mass_objs: + if int_obj.key.upper() == "INTERNALMASS": + mass_opaque_constructions.append( + OpaqueConstruction.from_epbunch(int_obj, Category="Internal Mass") + ) + area += float(int_obj.Surface_Area) + + # If one or more constructions, combine them into one. + if mass_opaque_constructions: + # Combine elements and assign the aggregated Surface Area + construction = functools.reduce(add, mass_opaque_constructions) + else: + # No InternalMass object assigned to this Zone, then return Zone and set + # floor area to 0 + return cls.generic_internalmass_from_zone(zone_epbunch) + return cls(f"{zone_epbunch.Name} InternalMass", construction, area) + + @classmethod + def generic_internalmass_from_zone(cls, zone_epbunch): + """Create an InternalMass object with generic construction and 0 floor area. + + Args: + zone_epbunch (EpBunch): A ZoneDefinition object. + """ + construction = OpaqueConstruction.generic_internalmass() + return cls( + surface_name=f"{zone_epbunch.Name} InternalMass", + total_area_exposed_to_zone=0, + construction=construction, + ) + + def duplicate(self): + """Get a copy of self.""" + return self.__copy__() + + def mapping(self): + """Get a dict based on the object properties, useful for dict repr.""" + return { + "surface_name": self.surface_name, + "construction": self.construction, + "total_area_exposed_to_zone": self.total_area_exposed_to_zone, + } + + def to_epbunch(self, idf, zone_name): + """Create an `INTERNALMASS` EpBunch given an idf model and a zone name. + + Args: + idf (IDF): An idf model to add the EpBunch in. + zone_name (str): The name of the zone for this InternamMass object. + + Returns: + EpBunch: The EpBunch object added to the idf model. + """ + construction = self.construction.to_epbunch(idf) + internal_mass = idf.newidfobject( + key="INTERNALMASS", + Name=self.surface_name, + Construction_Name=construction.Name, + Zone_or_ZoneList_Name=zone_name, + Surface_Area=self.total_area_exposed_to_zone, + ) + return internal_mass + + def __copy__(self): + """Get a copy of self.""" + return self.__class__(**self.mapping()) + + def __eq__(self, other): + """Assert self equals to other.""" + return isinstance(other, InternalMass) and self.__key__() == other.__key__() + + def __key__(self): + """Get a tuple of attributes. Useful for hashing and comparing.""" + return tuple(self.mapping().values()) diff --git a/archetypal/template/opaque_construction.py b/archetypal/template/constructions/opaque_construction.py similarity index 58% rename from archetypal/template/opaque_construction.py rename to archetypal/template/constructions/opaque_construction.py index e7a6dd49..542420ea 100644 --- a/archetypal/template/opaque_construction.py +++ b/archetypal/template/constructions/opaque_construction.py @@ -1,154 +1,19 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal OpaqueConstruction.""" import collections import uuid import numpy as np -from deprecation import deprecated from eppy.bunch_subclass import BadEPFieldError +from validator_collection import validators -import archetypal -from archetypal.template import MaterialLayer, OpaqueMaterial, UmiBase, UniqueName - - -class ConstructionBase(UmiBase): - """A class used to store data linked with the Life Cycle aspect of - constructions (eg.: wall assemblies). - - For more information on the Life Cycle Analysis performed in UMI, see: - https://umidocs.readthedocs.io/en/latest/docs/life-cycle-introduction.html#life - -cycle-impact - """ - - __slots__ = ( - "_assembly_carbon", - "_assembly_cost", - "_assembly_energy", - "_dissassembly_carbon", - "_dissassembly_energy", - ) - - def __init__( - self, - AssemblyCarbon=0, - AssemblyCost=0, - AssemblyEnergy=0, - DisassemblyCarbon=0, - DisassemblyEnergy=0, - **kwargs, - ): - """Initialize a ConstructionBase object with parameters: - - Args: - AssemblyCarbon (float): assembly carbon [kgCO2/m2]. - AssemblyCost (float): assembly carbon [kgCO2/m2]. - AssemblyEnergy (float): assembly energy [MJ/m2]. - DisassemblyCarbon (float): disassembly carbon [kgCO2/m2]. - DisassemblyEnergy (float): disassembly energy [MJ/m2]. - **kwargs: keywords passed to UmiBase. - """ - super(ConstructionBase, self).__init__(**kwargs) - self.AssemblyCarbon = AssemblyCarbon - self.AssemblyCost = AssemblyCost - self.AssemblyEnergy = AssemblyEnergy - self.DisassemblyCarbon = DisassemblyCarbon - self.DisassemblyEnergy = DisassemblyEnergy - - @property - def AssemblyCarbon(self): - """Get or set the assembly carbon [kgCO2/m2].""" - return self._assembly_carbon - - @AssemblyCarbon.setter - def AssemblyCarbon(self, value): - self._assembly_carbon = float(value) - - @property - def AssemblyCost(self): - """Get or set the assembly cost [$/m2].""" - return self._assembly_cost - - @AssemblyCost.setter - def AssemblyCost(self, value): - self._assembly_cost = float(value) - - @property - def AssemblyEnergy(self): - """Get or set the assembly energy [MJ/m2].""" - return self._assembly_energy - - @AssemblyEnergy.setter - def AssemblyEnergy(self, value): - self._assembly_energy = float(value) - - @property - def DisassemblyCarbon(self): - """Get or set the disassembly carbon [kgCO2/m2].""" - return self._dissassembly_carbon - - @DisassemblyCarbon.setter - def DisassemblyCarbon(self, value): - self._dissassembly_carbon = float(value) - - @property - def DisassemblyEnergy(self): - """Get or set the disassembly energy [MJ/m2].""" - return self._dissassembly_energy - - @DisassemblyEnergy.setter - def DisassemblyEnergy(self, value): - self._dissassembly_energy = float(value) - - def validate(self): - """Validate object and fill in missing values.""" - return self - - def get_ref(self, ref): - """Get item matching reference id. - - Args: - ref: - """ - return next( - iter( - [ - value - for value in ConstructionBase.CREATED_OBJECTS - if value.id == ref["$ref"] - ] - ), - None, - ) - - -class LayeredConstruction(ConstructionBase): - """Defines the layers of an :class:`OpaqueConstruction`. - - Attributes: - Layers (list of MaterialLayer): List of MaterialLayer objects from - outside to inside. - """ - - def __init__(self, Layers, **kwargs): - """Initialize object. - - Args: - Layers (list of MaterialLayer): A list of :class:`MaterialLayer` - objects. - **kwargs: Keywords passed to the :class:`ConstructionBase` - constructor. - """ - super(LayeredConstruction, self).__init__(Layers=Layers, **kwargs) - self.Layers = Layers +from archetypal.template.constructions.base_construction import LayeredConstruction +from archetypal.template.materials.material_layer import MaterialLayer +from archetypal.template.materials.opaque_material import OpaqueMaterial class OpaqueConstruction(LayeredConstruction): - """Opaque Constructions + """Opaque Constructions. .. image:: ../images/template/constructions-opaque.png @@ -165,27 +30,29 @@ class OpaqueConstruction(LayeredConstruction): * timeconstant_per_unit_area * solar_reflectance_index """ - __slots__ = () - def __init__(self, Layers, **kwargs): - """ + __slots__ = ("area",) + + def __init__(self, Name, Layers, **kwargs): + """Initialize an OpaqueConstruction. + Args: - Layers (list of MaterialLayer): List of MaterialLayers making up the - construction. + Layers (list of archetypal.MaterialLayer): List of MaterialLayers making + up the construction. **kwargs: Other attributes passed to parent constructors such as :class:`ConstructionBase`. """ - super(OpaqueConstruction, self).__init__(Layers, **kwargs) + super(OpaqueConstruction, self).__init__(Name, Layers, **kwargs) self.area = 1 @property def r_value(self): """Get or set the thermal resistance [K⋅m2/W] (excluding air films). - Note that, when setting the R-value, the thickness of the inferred insulation - layer will be adjusted. + Note that, when setting the R-value, the thickness of the inferred + insulation layer will be adjusted. """ - return sum([layer.r_value for layer in self.Layers]) + return super(OpaqueConstruction, self).r_value @r_value.setter def r_value(self, value): @@ -210,30 +77,9 @@ def r_value(self, value): ) + alpha * insulation_layer.r_value insulation_layer.r_value = new_r_value - @property - def u_value(self): - """Construction heat transfer coefficient [W/m2⋅K] (excluding air films).""" - return 1 / self.r_value - - @property - def r_factor(self): - """Construction R-factor [m2-K/W] (including air films). - - inside film resistance = 8 [K⋅m2/W] - outside film resistance = 20 [K⋅m2/W] - """ - h_in = 8.0 - h_out = 20.0 - return 1 / h_out + self.r_value + 1 / h_in - - @property - def u_factor(self): - """Overall heat transfer coefficient (including air films) W/(m2⋅K).""" - return 1 / self.r_factor - @property def equivalent_heat_capacity_per_unit_volume(self): - """Construction equivalent per unit wall **volume** heat capacity [J/(kg⋅K)]. + """Get the equivalent per unit wall volume heat capacity [J/(kg⋅K)]. Hint: "The physical quantity which represents the heat storage capability @@ -262,7 +108,7 @@ def equivalent_heat_capacity_per_unit_volume(self): @property def specific_heat(self): - """Construction specific heat weighted by wall area mass [J/(kg⋅K)].""" + """Get the construction specific heat weighted by wall area mass [J/(kg⋅K)].""" return np.average( [layer.specific_heat for layer in self.Layers], weights=[layer.Thickness * layer.Material.Density for layer in self.Layers], @@ -270,7 +116,7 @@ def specific_heat(self): @property def heat_capacity_per_unit_wall_area(self): - """Construction heat capacity per unit wall area [J/(m2⋅K)]. + """Get the construction heat capacity per unit wall area [J/(m2⋅K)]. Hint: :math:`(HC/A)=ρ·c·δ`, where :math:`δ` is the wall thickness. @@ -279,34 +125,34 @@ def heat_capacity_per_unit_wall_area(self): @property def total_thickness(self): - """Construction total thickness [m].""" + """Get the construction total thickness [m].""" return sum([layer.Thickness for layer in self.Layers]) @property def mass_per_unit_area(self): - """Construction mass per unit area [kg/m2].""" + """Get the construction mass per unit area [kg/m2].""" return sum([layer.Thickness * layer.Material.Density for layer in self.Layers]) @property def time_constant_per_unit_area(self): - """Construction time constant per unit area.""" + """Get the construction time constant per unit area [seconds/m2].""" return self.mass_per_unit_area * self.specific_heat / self.u_factor @property def solar_reflectance_index(self): - """Construction's Solar Reflectance Index of the exposed surface. + """Get the Solar Reflectance Index of the exposed surface. Hint: calculation from K-12 AEDG, derived from ASTM E1980 assuming medium wind speed. """ - exposedMaterial = self.Layers[0] # 0-th layer is exterior layer - solarAbsorptance = exposedMaterial.Material.SolarAbsorptance - thermalEmissivity = exposedMaterial.Material.ThermalEmittance + exposed_material = self.Layers[0] # 0-th layer is exterior layer + solar_absorptance = exposed_material.Material.SolarAbsorptance + thermal_emissivity = exposed_material.Material.ThermalEmittance - x = (20.797 * solarAbsorptance - 0.603 * thermalEmissivity) / ( - 9.5205 * thermalEmissivity + 12.0 + x = (20.797 * solar_absorptance - 0.603 * thermal_emissivity) / ( + 9.5205 * thermal_emissivity + 12.0 ) sri = 123.97 - 141.35 * x + 9.6555 * x * x @@ -354,22 +200,19 @@ def combine(self, other, method="dominant_wall", allow_duplicates=False): meta = self._get_predecessors_meta(other) # thicknesses & materials for self - if method == "equivalent_volume": - new_m, new_t = self.equivalent_volume(other) - elif method == "constant_ufactor": - new_m, new_t = self.constant_ufactor(other, weights) + if method == "constant_ufactor": + new_m, new_t = self._constant_ufactor(other, weights) elif method == "dominant_wall": # simply return the dominant wall construction oc = self.dominant_wall(other, weights) return oc else: raise ValueError( - 'Possible choices are ["equivalent_volume", "constant_ufactor", ' - '"dominant_wall"]' + 'Possible choices are ["constant_ufactor", "dominant_wall"]' ) # layers for the new OpaqueConstruction layers = [MaterialLayer(mat, t) for mat, t in zip(new_m, new_t)] - new_obj = self.__class__(**meta, Layers=layers, idf=self.idf) + new_obj = self.__class__(**meta, Layers=layers) new_name = ( "Combined Opaque Construction {{{}}} with u_value " "of {:,.3f} W/m2k".format(uuid.uuid1(), new_obj.u_value) @@ -379,33 +222,8 @@ def combine(self, other, method="dominant_wall", allow_duplicates=False): new_obj.area = sum(weights) return new_obj - def equivalent_volume(self, other): - """ - Todo: - - Implement the 'equivalent_volume' method. - - Args: - other: - """ - raise NotImplementedError( - '"equivalent_volume" method is not yet ' - "fully implemented. Please choose " - '"constant_ufactor"' - ) - - self_t = np.array([mat.Thickness for mat in self.Layers]) - self_m = [mat.Material for mat in self.Layers] - # thicknesses & materials for other - other_t = np.array([mat.Thickness for mat in other.Layers]) - other_m = [mat.Material for mat in other.Layers] - # thicknesses & materials for the new OpaqueConstruction - new_t = np.append(self_t, other_t) - new_t = new_t / 2 - new_m = self_m + other_m - return new_m, new_t - def dominant_wall(self, other, weights): - """Simply returns dominant wall properties + """Return dominant wall construction between self and other. Args: other: @@ -419,8 +237,10 @@ def dominant_wall(self, other, weights): ][0] return oc - def constant_ufactor(self, other, weights=None): - """The constant u-factor method will produce an assembly that has the + def _constant_ufactor(self, other, weights=None): + """Return materials and thicknesses for constant u-value. + + The constant u-factor method will produce an assembly that has the same u-value as an equivalent wall (weighted by wall area) but with a mixture of all unique layer materials @@ -440,8 +260,7 @@ def obj_func( expected_specific_heat, expected_total_thickness, ): - """Objective function for thickness evaluation""" - + """Objective function for thickness evaluation.""" u_value = 1 / sum( [ thickness / mat.Conductivity @@ -513,94 +332,106 @@ def obj_func( return np.array(materials), res.x @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - return cls.from_dict(*args, **kwargs) + def from_dict(cls, data, materials, **kwargs): + """Create an OpaqueConstruction from a dictionary. - @classmethod - def from_dict(cls, *args, **kwargs): - """ Args: - *args: - **kwargs: + data (dict): The python dictionary. + materials (dict): A dictionary of materials with their id as keys. + + .. code-block:: python + materials = {} # dict of materials. + data = { + "$id": "140300770659680", + "Layers": [ + { + "Material": { + "$ref": "140300653743792" + }, + "Thickness": 0.013 + }, + { + "Material": { + "$ref": "140300653743792" + }, + "Thickness": 0.013 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Partition", + "Comments": "", + "DataSource": "ASHRAE 90.1-2007", + "Name": "90.1-2007 Nonres 6A Int Wall" + } + """ # resolve Material objects from ref - layers = kwargs.pop("Layers", None) - oc = cls(Layers=layers, **kwargs) - lys = [ + layers = [ MaterialLayer( - oc.get_ref(layer["Material"]), - layer["Thickness"], + Material=materials[layer["Material"]["$ref"]], + Thickness=layer["Thickness"], ) - for layer in layers + for layer in data.pop("Layers") ] - oc.Layers = lys + _id = data.pop("$id") + oc = cls(Layers=layers, id=_id, **data, **kwargs) return oc @classmethod - def generic_internalmass(cls, idf, **kwargs): - """ + def generic_internalmass(cls, **kwargs): + """Create a generic internal mass object. Args: - idf (IDF): The IDF model - **kwargs: - - Returns: - + **kwargs: keywords passed to the class constructor. """ - mat = idf.anidfobject( - key="Material".upper(), + mat = OpaqueMaterial( Name="Wood 6inch", Roughness="MediumSmooth", Thickness=0.15, Conductivity=0.12, Density=540, - Specific_Heat=1210, - Thermal_Absorptance=0.7, - Visible_Absorptance=0.7, + SpecificHeat=1210, + ThermalAbsorptance=0.7, + VisibleAbsorptance=0.7, ) return OpaqueConstruction( Name="InternalMass", - idf=idf, - Layers=[ - MaterialLayer(Material=OpaqueMaterial.from_epbunch(mat), Thickness=0.15) - ], - Category=kwargs.pop("Category", "InternalMass"), + Layers=[MaterialLayer(Material=mat, Thickness=0.15)], + Category="InternalMass", **kwargs, ) @classmethod def from_epbunch(cls, epbunch, **kwargs): - """Construct an OpaqueMaterial object given an epbunch with keys - "BuildingSurface:Detailed" or "InternalMass" + """Create an OpaqueConstruction object from an epbunch. + + Possible keys are "BuildingSurface:Detailed" or "InternalMass" + Args: - epbunch (EpBunch): - **kwargs: + epbunch (EpBunch): The epbunch object. + **kwargs: keywords passed to the LayeredConstruction constructor. """ + assert epbunch.key.lower() in ("internalmass", "construction"), ( + f"Expected ('Internalmass', 'Construction')." f"Got '{epbunch.key}'." + ) name = epbunch.Name - idf = kwargs.pop("idf", epbunch.theidf) - # treat internalmass and surfaces differently + + # treat internalmass and regular surfaces differently if epbunch.key.lower() == "internalmass": layers = cls._internalmass_layer(epbunch) - return cls(Name=name, Layers=layers, idf=idf, **kwargs) - else: + return cls(Name=name, Layers=layers, **kwargs) + elif epbunch.key.lower() == "construction": layers = cls._surface_layers(epbunch) - return cls(Name=name, Layers=layers, idf=idf, **kwargs) + return cls(Name=name, Layers=layers, **kwargs) @classmethod def _internalmass_layer(cls, epbunch): - """Returns layers of an internal mass object. + """Return layers of an internal mass object. Args: epbunch (EpBunch): The InternalMass epobject. @@ -610,17 +441,17 @@ def _internalmass_layer(cls, epbunch): @classmethod def _surface_layers(cls, epbunch): - """Retrieve layers for the OpaqueConstruction + """Retrieve layers for the OpaqueConstruction. Args: epbunch (EpBunch): EP-Construction object """ layers = [] for layer in epbunch.fieldnames[2:]: - # Iterate over the constructions layers + # Iterate over the construction's layers material = epbunch.get_referenced_object(layer) if material: - o = OpaqueMaterial.from_epbunch(material) + o = OpaqueMaterial.from_epbunch(material, allow_duplicates=True) try: thickness = material.Thickness except BadEPFieldError: @@ -628,8 +459,8 @@ def _surface_layers(cls, epbunch): layers.append(MaterialLayer(Material=o, Thickness=thickness)) return layers - def to_json(self): - """Convert class properties to dict""" + def to_dict(self): + """Return OpaqueConstruction dictionary representation.""" self.validate() # Validate object before trying to get json format data_dict = collections.OrderedDict() @@ -642,14 +473,21 @@ def to_json(self): data_dict["DisassemblyCarbon"] = self.DisassemblyCarbon data_dict["DisassemblyEnergy"] = self.DisassemblyEnergy data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = str(self.DataSource) - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict - def mapping(self): - self.validate() + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() return dict( Layers=self.Layers, @@ -665,21 +503,17 @@ def mapping(self): ) @classmethod - def generic(cls, idf=None): - # 90.1-2007 Nonres 4B Int Wall - """ - Args: - idf: - """ - om = OpaqueMaterial.generic(idf=idf) + def generic(cls, **kwargs): + """Return OpaqueConstruction based on 90.1-2007 Nonres 4B Int Wall.""" + om = OpaqueMaterial.generic() layers = [MaterialLayer(om, 0.0127), MaterialLayer(om, 0.0127)] # half inch return cls( Name="90.1-2007 Nonres 6A Int Wall", Layers=layers, DataSource="ASHRAE 90.1-2007", - idf=idf, Category="Partition", + **kwargs, ) def __add__(self, other): @@ -691,10 +525,39 @@ def __add__(self, other): return self.combine(other) def __hash__(self): + """Return the hash value of self.""" return hash((self.__class__.__name__, getattr(self, "Name", None))) def __eq__(self, other): + """Assert self is equivalent to other.""" if not isinstance(other, OpaqueConstruction): return NotImplemented else: return all([self.Layers == other.Layers]) + + def __copy__(self): + """Create a copy of self.""" + new_con = self.__class__(Name=self.Name, Layers=[a for a in self.Layers]) + return new_con + + def to_epbunch(self, idf): + """Get a Construction EpBunch given an idf model. + + Notes: + Will create layered materials as well. + + Args: + idf (IDF): An idf model to add the EpBunch in. + + Returns: + EpBunch: The EpBunch object added to the idf model. + """ + return idf.newidfobject( + key="CONSTRUCTION", + Name=self.Name, + Outside_Layer=self.Layers[0].to_epbunch(idf).Name, + **{ + f"Layer_{i+2}": layer.to_epbunch(idf).Name + for i, layer in enumerate(self.Layers[1:]) + }, + ) diff --git a/archetypal/template/constructions/window_construction.py b/archetypal/template/constructions/window_construction.py new file mode 100644 index 00000000..908387bf --- /dev/null +++ b/archetypal/template/constructions/window_construction.py @@ -0,0 +1,759 @@ +"""Window module handles window settings.""" + +import collections +from enum import Enum + +from validator_collection import validators + +from archetypal.simple_glazing import calc_simple_glazing +from archetypal.template.constructions.base_construction import LayeredConstruction +from archetypal.template.materials.gas_layer import GasLayer +from archetypal.template.materials.gas_material import GasMaterial +from archetypal.template.materials.glazing_material import GlazingMaterial +from archetypal.template.materials.material_layer import MaterialLayer + + +class WindowType(Enum): + """Refers to the window type. Two choices are available: interior or exterior.""" + + External = 0 + Internal = 1 + + def __lt__(self, other): + """Return true if self lower than other.""" + return self._value_ < other._value_ + + def __gt__(self, other): + """Return true if self higher than other.""" + return self._value_ > other._value_ + + +class ShadingType(Enum): + """Refers to window shading types. + + Hint: + EnergyPlus specifies 8 different shading types, but only 2 are supported + here: InteriorShade and ExteriorShade. See shading_ for more info. + + .. _shading: https://bigladdersoftware.com/epx/docs/8-4/input-output-reference/group-thermal-zone-description-geometry.html#field-shading-type + """ + + ExteriorShade = 0 + InteriorShade = 1 + + def __lt__(self, other): + """Return true if self lower than other.""" + return self._value_ < other._value_ + + def __gt__(self, other): + """Return true if self higher than other.""" + return self._value_ > other._value_ + + +class WindowConstruction(LayeredConstruction): + """Window Construction. + + .. image:: ../images/template/constructions-window.png + """ + + _CATEGORIES = ("single", "double", "triple", "quadruple") + + __slots__ = ("_category",) + + def __init__(self, Name, Layers, Category="Double", **kwargs): + """Initialize a WindowConstruction. + + Args: + Name (str): Name of the WindowConstruction. + Layers (list of (MaterialLayer or GasLayer)): List of MaterialLayer and + GasLayer. + Category (str): "Single", "Double" or "Triple". + **kwargs: Other keywords passed to the constructor. + """ + super(WindowConstruction, self).__init__( + Name, + Layers, + Category=Category, + **kwargs, + ) + self.Category = Category # set here for validators + + @property + def Category(self): + """Get or set the Category. Choices are ("single", "double", "triple").""" + return self._category + + @Category.setter + def Category(self, value): + assert value.lower() in self._CATEGORIES, ( + f"Input error for value '{value}'. The " + f"Category must be one of ({self._CATEGORIES})" + ) + self._category = value + + @property + def gap_count(self): + """Get the number of gas gaps contained within the window construction.""" + count = 0 + for layer in self.Layers: + if isinstance(layer, GasLayer): + count += 1 + return count + + @property + def glazing_count(self): + """Get the nb of glazing materials contained within the window construction.""" + count = 0 + for layer in self.Layers: + if isinstance(layer, MaterialLayer): + count += 1 + return count + + @property + def r_factor(self): + """Get the construction R-factor [m2-K/W]. + + Note: including standard resistances for air films. Formulas for film + coefficients come from EN673 / ISO10292. + """ + gap_count = self.gap_count + if gap_count == 0: # single pane + return ( + self.Layers[0].r_value + + (1 / self.out_h_simple()) + + (1 / self.in_h_simple()) + ) + elif gap_count == 1: + heat_transfers, temperature_profile = self.heat_balance("summer", 0) + *_, Q_dot_i4 = heat_transfers + return (temperature_profile[-1] - temperature_profile[0]) / Q_dot_i4 + r_vals, emissivities = self._layered_r_value_initial(gap_count) + r_vals = self._solve_r_values(r_vals, emissivities) + return sum(r_vals) + + @property + def r_value(self): + """Get or set the thermal resistance [K⋅m2/W] (excluding air films).""" + gap_count = self.gap_count + if gap_count == 0: # single pane + return self.Layers[0].r_value + r_vals, emissivities = self._layered_r_value_initial(gap_count) + r_vals = self._solve_r_values(r_vals, emissivities) + return sum(r_vals[1:-1]) + + @property + def outside_emissivity(self): + """Get the hemispherical emissivity of the outside face of the construction.""" + return self.Layers[0].Material.IREmissivityFront + + @property + def inside_emissivity(self): + """Get the hemispherical emissivity of the inside face of the construction.""" + return self.Layers[-1].Material.IREmissivityBack + + @property + def solar_transmittance(self): + """Get the solar transmittance of the window at normal incidence.""" + if self.glazing_count == 2: + tau_1 = self.Layers[0].Material.SolarTransmittance + tau_2 = self.Layers[-1].Material.SolarTransmittance + rho_1 = self.Layers[0].Material.SolarReflectanceFront + rho_2 = self.Layers[-1].Material.SolarReflectanceFront + return (tau_1 * tau_2) / (1 - rho_1 * rho_2) + trans = 1 + for layer in self.Layers: + if isinstance(layer.Material, GlazingMaterial): + trans *= layer.Material.SolarTransmittance + return trans + + @property + def visible_transmittance(self): + """Get the visible transmittance of the window at normal incidence.""" + trans = 1 + for layer in self.Layers: + if isinstance(layer.Material, GlazingMaterial): + trans *= layer.Material.VisibleTransmittance + return trans + + @property + def thickness(self): + """Thickness of the construction [m].""" + thickness = 0 + for layer in self.Layers: + thickness += layer.Thickness + return thickness + + @classmethod + def from_dict(cls, data, materials, **kwargs): + """Create an WindowConstruction from a dictionary. + + Args: + data (dict): The python dictionary. + materials (dict): A dictionary of materials with their id as keys. + **kwargs: keywords passed to the constructor. + + .. code-block:: python + + data = { + "$id": "57", + "Layers": [ + {"Material": {"$ref": "7"}, "Thickness": 0.003}, + {"Material": {"$ref": "1"}, "Thickness": 0.006}, + {"Material": {"$ref": "7"}, "Thickness": 0.003}, + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Double", + "Comments": "default", + "DataSource": "default", + "Name": "B_Dbl_Air_Cl", + } + """ + _id = data.pop("$id") + layers = [ + MaterialLayer(materials[layer["Material"]["$ref"]], layer["Thickness"]) + if isinstance( + materials[layer["Material"]["$ref"]], (MaterialLayer, GlazingMaterial) + ) + else GasLayer(materials[layer["Material"]["$ref"]], layer["Thickness"]) + for layer in data.pop("Layers") + ] + return cls(Layers=layers, id=_id, **data, **kwargs) + + @classmethod + def from_epbunch(cls, Construction, **kwargs): + """Create :class:`WindowConstruction` object from idf Construction object. + + Example: + >>> from archetypal import IDF + >>> from archetypal.template.window_setting import WindowSetting + >>> idf = IDF("myidf.idf") + >>> construction_name = "Some construction name" + >>> WindowConstruction.from_epbunch(Name=construction_name, idf=idf) + + Args: + Construction (EpBunch): The Construction epbunch object. + **kwargs: Other keywords passed to the constructor. + """ + layers = WindowConstruction._layers_from_construction(Construction, **kwargs) + catdict = {0: "Single", 1: "Single", 2: "Double", 3: "Triple", 4: "Quadruple"} + category = catdict[ + len([lyr for lyr in layers if isinstance(lyr.Material, GlazingMaterial)]) + ] + return cls(Name=Construction.Name, Layers=layers, Category=category, **kwargs) + + @classmethod + def from_shgc( + cls, + Name, + solar_heat_gain_coefficient, + u_factor, + visible_transmittance=None, + **kwargs, + ): + """Create a WindowConstruction from shgc, u_factor and visible_transmittance. + + Args: + Name (str): The name of the window construction. + shgc (double): The window's Solar Heat Gain Coefficient. + u_factor (double): The window's U-value. + visible_transmittance (double, optional): The window's visible + transmittance. If none, the visible transmittance defaults to the + solar transmittance t_sol. + kwargs: keywrods passed to the parent constructor. + + Returns: + + """ + glass_properties = calc_simple_glazing( + solar_heat_gain_coefficient, + u_factor, + visible_transmittance, + ) + material_obj = GlazingMaterial(Name="Simple Glazing", **glass_properties) + + material_layer = MaterialLayer(material_obj, glass_properties["Thickness"]) + return cls(Name, Layers=[material_layer], **kwargs) + + def to_dict(self): + """Return WindowConstruction dictionary representation.""" + self.validate() # Validate object before trying to get json format + + data_dict = collections.OrderedDict() + + data_dict["$id"] = str(self.id) + data_dict["Layers"] = [layer.to_dict() for layer in self.Layers] + data_dict["AssemblyCarbon"] = self.AssemblyCarbon + data_dict["AssemblyCost"] = self.AssemblyCost + data_dict["AssemblyEnergy"] = self.AssemblyEnergy + data_dict["DisassemblyCarbon"] = self.DisassemblyCarbon + data_dict["DisassemblyEnergy"] = self.DisassemblyEnergy + data_dict["Category"] = self.Category + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) + data_dict["DataSource"] = self.DataSource + data_dict["Name"] = self.Name + + return data_dict + + def to_epbunch(self, idf): + """Convert self to a `Construction` epbunch given an idf model. + + Args: + idf (IDF): The idf model in which the EpBunch is created. + + .. code-block:: python + + Construction, + B_Dbl_Air_Cl, !- Name + B_Glass_Clear_3_0.003_B_Dbl_Air_Cl, !- Outside Layer + AIR_0.006_B_Dbl_Air_Cl, !- Layer 2 + B_Glass_Clear_3_0.003_B_Dbl_Air_Cl; !- Layer 3 + + Returns: + EpBunch: The EpBunch object added to the idf model. + """ + data = {"Name": self.Name} + for i, layer in enumerate(self.Layers): + mat = layer.to_epbunch(idf) + if i < 1: + data["Outside_Layer"] = mat.Name + else: + data[f"Layer_{i+1}"] = mat.Name + + return idf.newidfobject("CONSTRUCTION", **data) + + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() + + return dict( + Layers=self.Layers, + AssemblyCarbon=self.AssemblyCarbon, + AssemblyCost=self.AssemblyCost, + AssemblyEnergy=self.AssemblyEnergy, + DisassemblyCarbon=self.DisassemblyCarbon, + DisassemblyEnergy=self.DisassemblyEnergy, + Category=self.Category, + Comments=self.Comments, + DataSource=self.DataSource, + Name=self.Name, + ) + + def combine(self, other, weights=None): + """Append other to self. Return self + other as a new object. + + For now, simply returns self. + + todo: + - Implement equivalent window layers for constant u-factor. + + """ + # Check if other is None. Simply return self + if not other: + return self + + if not self: + return other + + return self + + def validate(self): + """Validate object and fill in missing values. + + todo: + - Implement validation + """ + return self + + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def temperature_profile( + self, + outside_temperature=-18, + inside_temperature=21, + wind_speed=6.7, + height=1.0, + angle=90.0, + pressure=101325, + ): + """Get a list of temperatures at each material boundary across the construction. + + Args: + outside_temperature: The temperature on the outside of the construction [C]. + Default is -18, which is consistent with NFRC 100-2010. + inside_temperature: The temperature on the inside of the construction [C]. + Default is 21, which is consistent with NFRC 100-2010. + wind_speed: The average outdoor wind speed [m/s]. This affects outdoor + convective heat transfer coefficient. Default is 6.7 m/s. + height: An optional height for the surface in meters. Default is 1.0 m. + angle: An angle in degrees between 0 and 180. + 0 = A horizontal surface with the outside boundary on the bottom. + 90 = A vertical surface + 180 = A horizontal surface with the outside boundary on the top. + pressure: The average pressure of in Pa. + Default is 101325 Pa for standard pressure at sea level. + Returns: + A tuple with two elements + - temperatures: A list of temperature values [C]. + The first value will always be the outside temperature and the + second will be the exterior surface temperature. + The last value will always be the inside temperature and the second + to last will be the interior surface temperature. + - r_values: A list of R-values for each of the material layers [m2-K/W]. + The first value will always be the resistance of the exterior air + and the last value is the resistance of the interior air. + The sum of this list is the R-factor for this construction given + the input parameters. + """ + # reverse the angle if the outside temperature is greater than the inside one + if angle != 90 and outside_temperature > inside_temperature: + angle = abs(180 - angle) + gap_count = self.gap_count + + # single pane or simple glazing system + if gap_count == 0: + in_r_init = 1 / self.in_h_simple() + r_values = [ + 1 / self.out_h(wind_speed, outside_temperature + 273.15), + self.Layers[0].r_value, + in_r_init, + ] + in_delta_t = (in_r_init / sum(r_values)) * ( + outside_temperature - inside_temperature + ) + r_values[-1] = 1 / self.in_h( + inside_temperature - (in_delta_t / 2) + 273.15, + in_delta_t, + height, + angle, + pressure, + ) + temperatures = self._temperature_profile_from_r_values( + r_values, outside_temperature, inside_temperature + ) + return temperatures, r_values + + # multi-layered window construction + guess = abs(inside_temperature - outside_temperature) / 2 + guess = 1 if guess < 1 else guess # prevents zero division with gas conductance + avg_guess = ((inside_temperature + outside_temperature) / 2) + 273.15 + r_values, emissivities = self._layered_r_value_initial( + gap_count, guess, avg_guess, wind_speed + ) + r_last = 0 + r_next = sum(r_values) + while abs(r_next - r_last) > 0.001: # 0.001 is the r-value tolerance + r_last = sum(r_values) + temperatures = self._temperature_profile_from_r_values( + r_values, outside_temperature, inside_temperature + ) + r_values = self._layered_r_value( + temperatures, r_values, emissivities, height, angle, pressure + ) + r_next = sum(r_values) + temperatures = self._temperature_profile_from_r_values( + r_values, outside_temperature, inside_temperature + ) + return temperatures, r_values + + @staticmethod + def _layers_from_construction(construction, **kwargs): + """Retrieve layers for the Construction epbunch.""" + layers = [] + for field in construction.fieldnames[2:]: + # Loop through the layers from the outside layer towards the + # indoor layers and get the material they are made of. + material = construction.get_referenced_object(field) or kwargs.get( + "material", None + ) + if material: + # Create the WindowMaterial:Glazing or the WindowMaterial:Gas + # and append to the list of layers + if material.key.upper() == "WindowMaterial:Glazing".upper(): + material_obj = GlazingMaterial( + Name=material.Name, + Conductivity=material.Conductivity, + SolarTransmittance=material.Solar_Transmittance_at_Normal_Incidence, + SolarReflectanceFront=material.Front_Side_Solar_Reflectance_at_Normal_Incidence, + SolarReflectanceBack=material.Back_Side_Solar_Reflectance_at_Normal_Incidence, + VisibleTransmittance=material.Visible_Transmittance_at_Normal_Incidence, + VisibleReflectanceFront=material.Front_Side_Visible_Reflectance_at_Normal_Incidence, + VisibleReflectanceBack=material.Back_Side_Visible_Reflectance_at_Normal_Incidence, + IRTransmittance=material.Infrared_Transmittance_at_Normal_Incidence, + IREmissivityFront=material.Front_Side_Infrared_Hemispherical_Emissivity, + IREmissivityBack=material.Back_Side_Infrared_Hemispherical_Emissivity, + DirtFactor=material.Dirt_Correction_Factor_for_Solar_and_Visible_Transmittance, + Optical=material.Optical_Data_Type, + OpticalData=material.Window_Glass_Spectral_Data_Set_Name, + ) + + material_layer = MaterialLayer(material_obj, material.Thickness) + + elif material.key.upper() == "WindowMaterial:Gas".upper(): + # Todo: Make gas name generic, like in UmiTemplateLibrary Editor + material_obj = GasMaterial( + Name=material.Gas_Type.upper(), Conductivity=0.02 + ) + material_layer = GasLayer(material_obj, material.Thickness) + elif material.key.upper() == "WINDOWMATERIAL:SIMPLEGLAZINGSYSTEM": + glass_properties = calc_simple_glazing( + material.Solar_Heat_Gain_Coefficient, + material.UFactor, + material.Visible_Transmittance, + ) + material_obj = GlazingMaterial( + Name=material.Name, **glass_properties + ) + + material_layer = MaterialLayer( + material_obj, glass_properties["Thickness"] + ) + layers.append(material_layer) + break + else: + continue + + layers.append(material_layer) + return layers + + def _layered_r_value_initial( + self, gap_count, delta_t_guess=15, avg_t_guess=273.15, wind_speed=6.7 + ): + """Compute initial r-values of each layer within a layered construction.""" + r_vals = [1 / self.out_h(wind_speed, avg_t_guess - delta_t_guess)] + emiss = [] + delta_t = delta_t_guess / gap_count + for i, lyr in enumerate(self.Layers): + if isinstance(lyr, MaterialLayer): + r_vals.append(lyr.r_value) + emiss.append(None) + else: # gas layer + e_front = self.Layers[i + 1].Material.IREmissivityFront + e_back = self.Layers[i + 1].Material.IREmissivityBack + r_vals.append( + 1 / lyr.u_value(delta_t, e_back, e_front, t_kelvin=avg_t_guess) + ) + emiss.append((e_back, e_front)) + r_vals.append(1 / self.in_h_simple()) + return r_vals, emiss + + def __hash__(self): + """Return the hash value of self.""" + return hash((self.__class__.__name__, getattr(self, "Name", None))) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, WindowConstruction): + return NotImplemented + else: + return all( + [ + self.Category == other.Category, + self.AssemblyCarbon == other.AssemblyCarbon, + self.AssemblyCost == other.AssemblyCost, + self.AssemblyEnergy == other.AssemblyEnergy, + self.DisassemblyCarbon == other.DisassemblyCarbon, + self.DisassemblyEnergy == other.DisassemblyEnergy, + self.Layers == other.Layers, + ] + ) + + def __copy__(self): + """Create a copy of self.""" + return self.__class__(**self.mapping()) + + def __add__(self, other): + """Combine self and other.""" + return self.combine(other) + + def _solve_r_values(self, r_values, emissivities): + """Solve iteratively for R-values.""" + r_last = 0 + r_next = sum(r_values) + while abs(r_next - r_last) > 0.001: # 0.001 is the r-value tolerance + r_last = sum(r_values) + temperatures = self._temperature_profile_from_r_values(r_values) + r_values = self._layered_r_value(temperatures, r_values, emissivities) + r_next = sum(r_values) + return r_values + + def _temperature_profile_from_r_values( + self, r_values, outside_temperature=-18, inside_temperature=21 + ): + """Get a list of temperatures at each material boundary between R-values.""" + r_factor = sum(r_values) + delta_t = inside_temperature - outside_temperature + temperatures = [outside_temperature] + for i, r_val in enumerate(r_values): + temperatures.append(temperatures[i] + (delta_t * (r_val / r_factor))) + return temperatures + + def _layered_r_value( + self, + temperatures, + r_values_init, + emiss, + height=1.0, + angle=90.0, + pressure=101325, + ): + """Compute delta_t adjusted r-values of each layer within a construction.""" + r_vals = [r_values_init[0]] + for i, layer in enumerate(self.Layers): + if isinstance(layer, MaterialLayer): + r_vals.append(r_values_init[i + 1]) + elif isinstance(layer, GasLayer): # gas layer + delta_t = abs(temperatures[i + 1] - temperatures[i + 2]) + avg_temp = ((temperatures[i + 1] + temperatures[i + 2]) / 2) + 273.15 + r_vals.append( + 1 + / layer.u_value_at_angle( + delta_t, + emiss[i][0], + emiss[i][1], + height, + angle, + avg_temp, + pressure, + ) + ) + delta_t = abs(temperatures[-1] - temperatures[-2]) + avg_temp = ((temperatures[-1] + temperatures[-2]) / 2) + 273.15 + r_vals.append(1 / self.in_h(avg_temp, delta_t, height, angle, pressure)) + return r_vals + + def shgc(self, environmental_conditions="summer", G_t=783): + """Calculate the shgc given environmental conditions. + + Args: + environmental_conditions: "summer" or "winter". + G_t: Incident solar radiation [W / m ^ 2] + + Returns: + tuple + """ + # Q_dot_noSun + heat_transfers, temperature_profile = self.heat_balance( + environmental_conditions, 0 + ) + *_, Q_dot_noSun = heat_transfers + + # Q_dot_Sun + heat_transfers, temperature_profile = self.heat_balance( + environmental_conditions, 783 + ) + *_, Q_dot_i4 = heat_transfers + + Q_dot_sun = -Q_dot_i4 + self.solar_transmittance * G_t + shgc = (Q_dot_sun - -Q_dot_noSun) / G_t + return shgc + + def heat_balance(self, environmental_conditions="summer", G_t=783): + """Return heat flux and temperatures at each surface of the window. + + Note: Only implemented for glazing with two layers. + + Args: + environmental_conditions (str): The environmental conditions from + the NRFC standard used to calculate the heat balance. Default is + "summer". + G_t (float): The incident radiation. + + Returns: + tuple: heat_flux, temperature_profile + """ + assert ( + self.glazing_count == 2 + ), f"Expected a window with 2 glazing layers, not {self.glazing_count}." + ENV_CONDITIONS = {"summer": [32, 24, 2.75], "winter": [-18, 21, 5.5]} + ( + outside_temperature, + inside_temperature, + environmental_conditions, + ) = ENV_CONDITIONS[environmental_conditions] + temperatures_next, r_values = self.temperature_profile( + outside_temperature, inside_temperature, environmental_conditions + ) + temperatures_last = [0] * 6 + pressure = 101325 # [Pa] + height = 1 # [m] + angle = 90 # degree + k_g = 1 # [W / m - K] + sigma = 5.670e-8 # [W / m2 - K4] + # "21011 (SGG Planiclear 4 mm), Air 12 mm, 21414 (SGG Planitherm One 4 mm)" + epsilon_1 = self.Layers[0].Material.IREmissivityFront # [-] + epsilon_2 = self.Layers[0].Material.IREmissivityBack # [-] + epsilon_3 = self.Layers[-1].Material.IREmissivityFront # [-] + epsilon_4 = self.Layers[-1].Material.IREmissivityBack # [-] + abs_1 = 0.0260 # [-] + abs_2 = 0.0737 # [-] + L_12 = self.Layers[0].Thickness # [m] + L_23 = self.Layers[1].Thickness # [m] # included in Layers[1] used below + L_34 = self.Layers[2].Thickness # [m] + # "Solar absorption distribution" + Q_dot_abs_1 = abs_1 / self.glazing_count * G_t + Q_dot_abs_2 = abs_1 / self.glazing_count * G_t + Q_dot_abs_3 = abs_2 / self.glazing_count * G_t + Q_dot_abs_4 = abs_2 / self.glazing_count * G_t + T_o, T_1, T_2, T_3, T_4, T_i = temperatures_next + while not self.assert_almost_equal(temperatures_last, temperatures_next): + temperatures_last = [T_o, T_1, T_2, T_3, T_4, T_i] + + # "Heat balance at surface 1" + h_c_o = 4 + 4 * environmental_conditions + Q_dot_c_1o = h_c_o * (T_1 - T_o) + Q_dot_r_1o = epsilon_1 * sigma * ((T_1 + 273.15) ** 4 - (T_o + 273.15) ** 4) + Q_dot_1o = Q_dot_c_1o + Q_dot_r_1o + Q_dot_21 = k_g / L_12 * (T_2 - T_1) # + Q_dot_abs_1 + + # "Heat balance at surface 2" + h_c_32 = self.Layers[1].convective_conductance_at_angle( + abs(T_3 - T_2), height, angle, (T_3 + T_2) / 2 + 273.15, pressure + ) + Q_dot_c_32 = h_c_32 * (T_3 - T_2) + Q_dot_r_32 = ( + sigma + * ((T_3 + 273.15) ** 4 - (T_2 + 273.15) ** 4) + / (1 / epsilon_2 + 1 / epsilon_3 - 1) + ) + Q_dot_32 = Q_dot_c_32 + Q_dot_r_32 + + # "Heat balance at surface 3" + Q_dot_43 = k_g / L_34 * (T_4 - T_3) # + Q_dot_abs_3 + + # Q_dot_32 = Q_dot_abs_3 + Q_dot_43 + + # "Heat balance at surface 4" + h_c_i = self.in_h_c( + (T_4 + T_i) / 2 + 273.15, abs(T_i - T_4), height, angle, pressure + ) + Q_dot_c_i4 = h_c_i * (T_i - T_4) + Q_dot_r_i4 = epsilon_4 * sigma * ((T_i + 273.15) ** 4 - (T_4 + 273.15) ** 4) + Q_dot_i4 = Q_dot_c_i4 + Q_dot_r_i4 + + # calc new temps + T_1 = T_2 - (Q_dot_1o - Q_dot_abs_1) / k_g * L_12 + T_2 = (Q_dot_abs_2 + Q_dot_32) / k_g * L_12 + T_1 + T_3 = T_4 - (Q_dot_32 - Q_dot_abs_3) / k_g * L_34 + T_4 = (Q_dot_abs_4 + Q_dot_i4) / k_g * L_34 + T_3 + + temperatures_next = [T_o, T_1, T_2, T_3, T_4, T_i] + heat_transfers = [Q_dot_1o, Q_dot_21, Q_dot_32, Q_dot_43, Q_dot_i4] + return heat_transfers, temperatures_next + + def assert_almost_equal(self, temperatures_last, temperatures_next): + return all( + abs(desired - actual) < 1.5 * 10 ** (-3) + for desired, actual in zip(temperatures_last, temperatures_next) + ) diff --git a/archetypal/template/dhw.py b/archetypal/template/dhw.py index 6b80dd88..0884c6ea 100644 --- a/archetypal/template/dhw.py +++ b/archetypal/template/dhw.py @@ -1,145 +1,145 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal DomesticHotWaterSetting.""" import collections from statistics import mean import numpy as np -from deprecation import deprecated +from eppy import modeleditor from sigfig import round +from validator_collection import validators -import archetypal from archetypal import settings -from archetypal.template import UmiBase, UmiSchedule, UniqueName +from archetypal.template.schedule import UmiSchedule +from archetypal.template.umi_base import UmiBase from archetypal.utils import log, reduce, timeit class DomesticHotWaterSetting(UmiBase): - """Domestic Hot Water settings + """Domestic Hot Water settings. .. image:: ../images/template/zoneinfo-dhw.png """ + __slots__ = ( + "_flow_rate_per_floor_area", + "_is_on", + "_water_schedule", + "_water_supply_temperature", + "_water_temperature_inlet", + "_area", + ) + def __init__( self, - IsOn=True, + Name, WaterSchedule=None, + IsOn=True, FlowRatePerFloorArea=0.03, WaterSupplyTemperature=65, WaterTemperatureInlet=10, + area=1, **kwargs, ): - """ + """Initialize object with parameters. + Args: - IsOn (bool): - WaterSchedule (UmiSchedule): - FlowRatePerFloorArea (float): - WaterSupplyTemperature (float): - WaterTemperatureInlet (float): - **kwargs: + area (float): The area the zone associated to this object. + IsOn (bool): If True, dhw is on. + WaterSchedule (UmiSchedule): Schedule that modulates the + FlowRatePerFloorArea. + FlowRatePerFloorArea (float): The flow rate per flow area [m³/(hr·m²)]. + WaterSupplyTemperature (float): The water supply temperature [degC]. + WaterTemperatureInlet (float): The water temperature intel from the water + mains [degC]. + **kwargs: keywords passed to parent constructors. """ - super(DomesticHotWaterSetting, self).__init__(**kwargs) + super(DomesticHotWaterSetting, self).__init__(Name, **kwargs) self.FlowRatePerFloorArea = FlowRatePerFloorArea self.IsOn = IsOn self.WaterSupplyTemperature = WaterSupplyTemperature self.WaterTemperatureInlet = WaterTemperatureInlet self.WaterSchedule = WaterSchedule - self._belongs_to_zone = kwargs.get("Zone", None) + self.area = area @property def FlowRatePerFloorArea(self): - return float(self._FlowRatePerFloorArea) + """Get or set the flow rate per flow area [m³/(hr·m²)].""" + return self._flow_rate_per_floor_area @FlowRatePerFloorArea.setter def FlowRatePerFloorArea(self, value): - self._FlowRatePerFloorArea = value + self._flow_rate_per_floor_area = validators.float(value, minimum=0) + + @property + def IsOn(self): + """Get or set the availability of the domestic hot water [bool].""" + return self._is_on + + @IsOn.setter + def IsOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsOn must " + f"be a boolean, not a {type(value)}" + ) + self._is_on = value + + @property + def WaterSchedule(self): + """Get or set the schedule which modulates the FlowRatePerFloorArea.""" + return self._water_schedule + + @WaterSchedule.setter + def WaterSchedule(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input error with value {value}. WaterSchedule must " + f"be an UmiSchedule, not a {type(value)}" + ) + self._water_schedule = value @property def WaterSupplyTemperature(self): - return float(self._WaterSupplyTemperature) + """Get or set the water supply temperature [degC].""" + return self._water_supply_temperature @WaterSupplyTemperature.setter def WaterSupplyTemperature(self, value): - self._WaterSupplyTemperature = value + self._water_supply_temperature = validators.float(value) @property def WaterTemperatureInlet(self): - return float(self._WaterTemperatureInlet) + """Get or set the water temperature intel from the water mains [degC].""" + return self._water_temperature_inlet @WaterTemperatureInlet.setter def WaterTemperatureInlet(self, value): - self._WaterTemperatureInlet = value + self._water_temperature_inlet = validators.float(value) @property - def Zone(self): - return self._belongs_to_zone - - @Zone.setter - def Zone(self, value): - self._belongs_to_zone = value + def area(self): + """Get or set the area of the zone associated to this object [m²].""" + return self._area - def __add__(self, other): - """Overload + to implement self.combine - - Args: - other (DomesticHotWaterSetting): - """ - return self.combine(other) - - def __hash__(self): - return hash( - (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) - ) - - def __eq__(self, other): - if not isinstance(other, DomesticHotWaterSetting): - return NotImplemented - else: - return all( - [ - self.IsOn == other.IsOn, - self.FlowRatePerFloorArea == other.FlowRatePerFloorArea, - self.WaterSupplyTemperature == other.WaterSupplyTemperature, - self.WaterTemperatureInlet == other.WaterTemperatureInlet, - self.WaterSchedule == other.WaterSchedule, - ] - ) - - def __str__(self): - return ( - f"{str(self.id)}: {str(self.Name)} " - f"PeakFlow {self.FlowRatePerFloorArea:.5f} m3/hr/m2" - ) + @area.setter + def area(self, value): + self._area = validators.float(value, minimum=0) @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): - - return cls.from_dict(*args, **kwargs) + def from_dict(cls, data, schedules, **kwargs): + """Create a DomesticHotWaterSetting from a dictionary. - @classmethod - def from_dict(cls, *args, **kwargs): - """ Args: - *args: - **kwargs: + data (dict): The python dictionary. + schedules (dict): A dictionary of UmiSchedules with their id as keys. + **kwargs: keywords passed the MaterialBase constructor. """ - dhws = cls(*args, **kwargs) - wat_sch = kwargs.get("WaterSchedule", None) - dhws.WaterSchedule = dhws.get_ref(wat_sch) - return dhws + _id = data.pop("$id") + wat_sch = data.pop("WaterSchedule", None) + schedule = schedules[wat_sch["$ref"]] + return cls(id=_id, WaterSchedule=schedule, **data, **kwargs) - def to_json(self): - """Convert class properties to dict""" + def to_dict(self): + """Return DomesticHotWaterSetting dictionary representation.""" self.validate() # Validate object before trying to get json format data_dict = collections.OrderedDict() @@ -147,7 +147,7 @@ def to_json(self): data_dict["$id"] = str(self.id) data_dict["FlowRatePerFloorArea"] = round(self.FlowRatePerFloorArea, sigfigs=4) data_dict["IsOn"] = self.IsOn - data_dict["WaterSchedule"] = self.WaterSchedule.to_dict() + data_dict["WaterSchedule"] = self.WaterSchedule.to_ref() data_dict["WaterSupplyTemperature"] = round( self.WaterSupplyTemperature, sigfigs=4 ) @@ -155,62 +155,74 @@ def to_json(self): self.WaterTemperatureInlet, sigfigs=4 ) data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict @classmethod @timeit - def from_zone(cls, zone, **kwargs): - """Some WaterUse:Equipment objects can be assigned to a zone. :param - zone: :type zone: Zone + def from_zone(cls, zone_epbunch, **kwargs): + """Create object from a zone EpBunch. + + WaterUse:Equipment objects referring to this zone will be parsed. Args: - zone (Zone): + zone (EpBunch): The zone object. """ # If Zone is not part of Conditioned Area, it should not have a DHW object. - if not zone.is_part_of_conditioned_floor_area: + if zone_epbunch.Part_of_Total_Floor_Area.lower() == "no": return None # First, find the WaterUse:Equipment assigned to this zone - dhw_objs = zone._epbunch.getreferingobjs( + dhw_objs = zone_epbunch.getreferingobjs( iddgroups=["Water Systems"], fields=["Zone_Name"] ) + if not dhw_objs: + # Sometimes, some of the WaterUse:Equipment objects are not assigned to + # any zone. Therefore, to account for their water usage, we can try to + # assign dangling WaterUse:Equipments by looking for the zone name in the + # object name. + dhw_objs.extend( + [ + dhw + for dhw in zone_epbunch.theidf.idfobjects["WATERUSE:EQUIPMENT"] + if zone_epbunch.Name.lower() in dhw.Name.lower() + ] + ) + if dhw_objs: # This zone has more than one WaterUse:Equipment object - total_flow_rate = cls._do_flow_rate(dhw_objs, zone.area) - water_schedule = cls._do_water_schedule(dhw_objs, zone.idf) - water_schedule.quantity = total_flow_rate - inlet_temp = cls._do_inlet_temp(dhw_objs, zone.idf) - supply_temp = cls._do_hot_temp(dhw_objs, zone.idf) + zone_area = modeleditor.zonearea(zone_epbunch.theidf, zone_epbunch.Name) + total_flow_rate = cls._do_flow_rate(dhw_objs, zone_area) + water_schedule = cls._do_water_schedule(dhw_objs) + inlet_temp = cls._do_inlet_temp(dhw_objs) + supply_temp = cls._do_hot_temp(dhw_objs) - name = zone.Name + "_DHW" + name = zone_epbunch.Name + "_DHW" z_dhw = cls( Name=name, - Zone=zone, FlowRatePerFloorArea=total_flow_rate, - IsOn=total_flow_rate > 0, + IsOn=bool(total_flow_rate > 0), WaterSchedule=water_schedule, WaterSupplyTemperature=supply_temp, WaterTemperatureInlet=inlet_temp, - idf=zone.idf, - Category=zone.idf.name, + Category=zone_epbunch.theidf.name, + area=zone_area, **kwargs, ) return z_dhw else: - log(f"No 'Water Systems' found in zone '{zone.Name}'") + log(f"No 'Water Systems' found in zone '{zone_epbunch.Name}'") return None @classmethod - @timeit - def _do_hot_temp(cls, dhw_objs, idf): - """ + def _do_hot_temp(cls, dhw_objs): + """Resolve hot water temperature. + Args: dhw_objs: - idf: """ hot_schds = [] for obj in dhw_objs: @@ -222,44 +234,41 @@ def _do_hot_temp(cls, dhw_objs, idf): if obj.Target_Temperature_Schedule_Name != "" else obj.Hot_Water_Supply_Temperature_Schedule_Name ) - - hot_schd = UmiSchedule(Name=schedule_name, idf=idf) + epbunch = obj.theidf.schedules_dict[schedule_name.upper()] + hot_schd = UmiSchedule.from_epbunch(epbunch) hot_schds.append(hot_schd) return np.array([sched.all_values.mean() for sched in hot_schds]).mean() @classmethod - @timeit - def _do_inlet_temp(cls, dhw_objs, idf): - """Reference to the Schedule object specifying the cold water - temperature [C] from the supply mains that provides the cold water to - the tap and makes up for all water lost down the drain. - - Args: - dhw_objs: - idf: - """ + def _do_inlet_temp(cls, dhw_objs): + """Calculate inlet water temperature.""" WaterTemperatureInlet = [] for obj in dhw_objs: if obj.Cold_Water_Supply_Temperature_Schedule_Name != "": # If a cold water supply schedule is provided, create the # schedule - cold_schd_names = UmiSchedule( - Name=obj.Cold_Water_Supply_Temperature_Schedule_Name, idf=idf - ) + epbunch = obj.theidf.schedules_dict[ + obj.Cold_Water_Supply_Temperature_Schedule_Name.upper() + ] + cold_schd_names = UmiSchedule.from_epbunch(epbunch) WaterTemperatureInlet.append(cold_schd_names.mean) else: # If blank, water temperatures are calculated by the # Site:WaterMainsTemperature object. - water_mains_temps = idf.idfobjects["Site:WaterMainsTemperature".upper()] + water_mains_temps = obj.theidf.idfobjects[ + "Site:WaterMainsTemperature".upper() + ] if water_mains_temps: # If a "Site:WaterMainsTemperature" object exists, # do water depending on calc method: water_mains_temp = water_mains_temps[0] if water_mains_temp.Calculation_Method.lower() == "schedule": # From Schedule method - mains_scd = UmiSchedule( - Name=water_mains_temp.Schedule_Name, idf=idf + mains_scd = UmiSchedule.from_epbunch( + obj.theidf.schedules_dict[ + water_mains_temp.Schedule_Name.upper() + ] ) WaterTemperatureInlet.append(mains_scd.mean()) elif water_mains_temp.Calculation_Method.lower() == "correlation": @@ -282,21 +291,20 @@ def _do_inlet_temp(cls, dhw_objs, idf): return mean(WaterTemperatureInlet) if WaterTemperatureInlet else 10 @classmethod - @timeit - def _do_water_schedule(cls, dhw_objs, idf): - """Returns the WaterSchedule for a list of WaterUse:Equipment objects. + def _do_water_schedule(cls, dhw_objs): + """Return the WaterSchedule for a list of WaterUse:Equipment objects. + If more than one objects are passed, a combined schedule is returned Args: - dhw_objs: - idf: + dhw_objs (list of EpBunch): List of WaterUse:Equipment objects. + Returns: UmiSchedule: The WaterSchedule """ water_schds = [ - UmiSchedule( - Name=obj.Flow_Rate_Fraction_Schedule_Name, - idf=idf, + UmiSchedule.from_epbunch( + obj.theidf.schedules_dict[obj.Flow_Rate_Fraction_Schedule_Name.upper()], quantity=obj.Peak_Flow_Rate, ) for obj in dhw_objs @@ -306,14 +314,15 @@ def _do_water_schedule(cls, dhw_objs, idf): UmiSchedule.combine, water_schds, weights=None, - quantity=lambda x: sum(obj.quantity for obj in x), + quantity=True, ) @classmethod - @timeit def _do_flow_rate(cls, dhw_objs, area): """Calculate total flow rate from list of WaterUse:Equipment objects. - The zone's net_conditioned_building_area property is used to normalize the flow rate. + + The zone's net_conditioned_building_area property is used to normalize the + flow rate. Args: dhw_objs (Idf_MSequence): @@ -325,17 +334,34 @@ def _do_flow_rate(cls, dhw_objs, area): total_flow_rate *= 3600.0 # m3/h/m2 return total_flow_rate - def combine(self, other, weights=None): + def combine(self, other, **kwargs): """Combine two DomesticHotWaterSetting objects together. + Notes: + When combining 2 DomesticHotWater Settings objects, the WaterSchedule + must be averaged via the final quantity which is the peak floor rate + [m3/hr/m2] * area [m2]. + + .. code-block:: python + + ( + np.average( + [zone_1.WaterSchedule.all_values, zone_2.WaterSchedule.all_values], + axis=0, + weights=[ + zone_1.FlowRatePerFloorArea * zone_1.area, + zone_2.FlowRatePerFloorArea * zone_2.area, + ], + ) + * (combined.FlowRatePerFloorArea * 100) + ).sum() + Args: - other (DomesticHotWaterSetting): - weights (list-like, optional): A list-like object of len 2. If None, - the volume of the zones for which self and other belongs is - used. + other (DomesticHotWaterSetting): The other object. + **kwargs: keywords passed to the constructor. Returns: - (DomesticHotWaterSetting): a new combined object + (DomesticHotWaterSetting): a new combined object. """ # Check if other is None. Simply return self if not other: @@ -357,96 +383,98 @@ def combine(self, other, weights=None): return self meta = self._get_predecessors_meta(other) - - if not weights: - zone_weight = settings.zone_weight - weights = [ - getattr(self.Zone, str(zone_weight)), - getattr(other.Zone, str(zone_weight)), - ] - log( - 'using zone {} "{}" as weighting factor in "{}" ' - "combine.".format( - zone_weight, - " & ".join(list(map(str, map(int, weights)))), - self.__class__.__name__, - ) - ) - new_obj = DomesticHotWaterSetting( - **meta, - IsOn=any((self.IsOn, other.IsOn)), WaterSchedule=UmiSchedule.combine( self.WaterSchedule, other.WaterSchedule, - quantity=True, + weights=[ + self.FlowRatePerFloorArea * self.area, + other.FlowRatePerFloorArea * other.area, + ], ), - FlowRatePerFloorArea=self._float_mean( - other, "FlowRatePerFloorArea", weights + IsOn=any((self.IsOn, other.IsOn)), + FlowRatePerFloorArea=self.float_mean( + other, "FlowRatePerFloorArea", [self.area, other.area] ), - WaterSupplyTemperature=self._float_mean( - other, "WaterSupplyTemperature", weights + WaterSupplyTemperature=self.float_mean( + other, "WaterSupplyTemperature", [self.area, other.area] ), - WaterTemperatureInlet=self._float_mean( - other, "WaterTemperatureInlet", weights + WaterTemperatureInlet=self.float_mean( + other, "WaterTemperatureInlet", [self.area, other.area] ), - idf=self.idf, + area=self.area + other.area, + **meta, ) new_obj.predecessors.update(self.predecessors + other.predecessors) return new_obj def validate(self): """Validate object and fill in missing values.""" - # Assume water systems for whole building - pass + return self @classmethod def whole_building(cls, idf): - z_dhw_list = [] - dhw_objs = idf.idfobjects["WaterUse:Equipment".upper()] + """Create one DomesticHotWaterSetting for whole building model. + + Args: + idf (IDF): The idf model. + Returns: + DomesticHotWaterSetting: The DomesticHotWaterSetting object. + """ # Unconditioned area could be zero, therefore taking max of both area = max(idf.net_conditioned_building_area, idf.unconditioned_building_area) - total_flow_rate = DomesticHotWaterSetting._do_flow_rate(dhw_objs, area) - water_schedule = DomesticHotWaterSetting._do_water_schedule(dhw_objs, idf) - inlet_temp = DomesticHotWaterSetting._do_inlet_temp(dhw_objs, idf) - supply_temp = DomesticHotWaterSetting._do_hot_temp(dhw_objs, idf) - z_dhw = DomesticHotWaterSetting( - Name="Whole Building WaterUse:Equipment", - FlowRatePerFloorArea=total_flow_rate, - IsOn=total_flow_rate > 0, - WaterSchedule=water_schedule, - WaterSupplyTemperature=supply_temp, - WaterTemperatureInlet=inlet_temp, - idf=idf, - Category=idf.name, - ) - z_dhw_list.append(z_dhw) + z_dhw_list = [] + dhw_objs = idf.idfobjects["WaterUse:Equipment".upper()] if not dhw_objs: # defaults with 0 flow rate. total_flow_rate = 0 - water_schedule = UmiSchedule.constant_schedule(idf=idf) + water_schedule = UmiSchedule.constant_schedule() supply_temp = 60 inlet_temp = 10 name = idf.name + "_DHW" z_dhw = DomesticHotWaterSetting( - Name=name, + WaterSchedule=water_schedule, + IsOn=bool(total_flow_rate > 0), FlowRatePerFloorArea=total_flow_rate, - IsOn=total_flow_rate > 0, + WaterSupplyTemperature=supply_temp, + WaterTemperatureInlet=inlet_temp, + area=area, + Name=name, + Category=idf.name, + ) + z_dhw_list.append(z_dhw) + else: + total_flow_rate = DomesticHotWaterSetting._do_flow_rate(dhw_objs, area) + water_schedule = DomesticHotWaterSetting._do_water_schedule(dhw_objs) + water_schedule.quantity = total_flow_rate + inlet_temp = DomesticHotWaterSetting._do_inlet_temp(dhw_objs) + supply_temp = DomesticHotWaterSetting._do_hot_temp(dhw_objs) + z_dhw = DomesticHotWaterSetting( WaterSchedule=water_schedule, + IsOn=bool(total_flow_rate > 0), + FlowRatePerFloorArea=total_flow_rate, WaterSupplyTemperature=supply_temp, WaterTemperatureInlet=inlet_temp, - idf=idf, + area=area, + Name="Whole Building WaterUse:Equipment", Category=idf.name, ) z_dhw_list.append(z_dhw) - return reduce(DomesticHotWaterSetting.combine, z_dhw_list, weights=[1, 1]) + return reduce(DomesticHotWaterSetting.combine, z_dhw_list) - def mapping(self): - self.validate() + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() return dict( FlowRatePerFloorArea=self.FlowRatePerFloorArea, @@ -460,27 +488,57 @@ def mapping(self): Name=self.Name, ) - def get_ref(self, ref): - """Get item matching reference id. + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def __add__(self, other): + """Overload + to implement self.combine. Args: - ref: + other (DomesticHotWaterSetting): """ - return next( - iter( - [ - value - for value in DomesticHotWaterSetting.CREATED_OBJECTS - if value.id == ref["$ref"] - ] - ), - None, + return self.combine( + other, + ) + + def __hash__(self): + """Return the hash value of self.""" + return hash( + (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + ) + + def __key__(self): + """Get a tuple of attributes. Useful for hashing and comparing.""" + return ( + self.IsOn, + self.FlowRatePerFloorArea, + self.WaterSupplyTemperature, + self.WaterTemperatureInlet, + self.WaterSchedule, + ) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, DomesticHotWaterSetting): + return NotImplemented + else: + return self.__key__() == other.__key__() + + def __str__(self): + """Return string representation.""" + return ( + f"{str(self.id)}: {str(self.Name)} " + f"PeakFlow {self.FlowRatePerFloorArea:.5f} m3/hr/m2" ) + def __copy__(self): + """Create a copy of self.""" + return self.__class__(**self.mapping(validate=False)) + def water_main_correlation(t_out_avg, max_diff): - """Based on the coorelation by correlation was developed by Craig - Christensen and Jay Burch. + """Based on the correlation developed by Craig Christensen and Jay Burch. Returns a 365 days temperature profile. @@ -505,9 +563,12 @@ def water_main_correlation(t_out_avg, max_diff): ratio = 0.4 + 0.01 * (t_out_avg_F.m - 44) lag = 35 - 1.0 * (t_out_avg_F.m - 44) days = np.arange(1, 365) - function = lambda t_out_avg, day, max_diff: (t_out_avg + 6) + ratio * ( - max_diff / 2 - ) * np.sin(np.deg2rad(0.986 * (day - 15 - lag) - 90)) + + def function(t_out_avg, day, max_diff): + return (t_out_avg + 6) + ratio * (max_diff / 2) * np.sin( + np.deg2rad(0.986 * (day - 15 - lag) - 90) + ) + mains = [Q_(function(t_out_avg_F.m, day, max_diff_F.m), "degF") for day in days] series = pd.Series([temp.to("degC").m for temp in mains]) return series diff --git a/archetypal/template/gas_material.py b/archetypal/template/gas_material.py deleted file mode 100644 index 4203df14..00000000 --- a/archetypal/template/gas_material.py +++ /dev/null @@ -1,134 +0,0 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ - -import collections - -import numpy as np -from deprecation import deprecated -from sigfig import round - -import archetypal -from archetypal.template import MaterialBase - - -class GasMaterial(MaterialBase): - """Gas Materials - - .. image:: ../images/template/materials-gas.png - """ - - def __init__(self, Name, Category="Gases", Type="Air", **kwargs): - """ - Args: - Name: - Category: - Type: - **kwargs: - """ - super(GasMaterial, self).__init__(Name, Category=Category, **kwargs) - self.Type = Type - - def __hash__(self): - return hash((self.__class__.__name__, getattr(self, "Name", None))) - - def __eq__(self, other): - if not isinstance(other, GasMaterial): - return NotImplemented - else: - return all( - [ - self.Category == other.Category, - self.Type == other.Type, - self.Conductivity == other.Conductivity, - self.Cost == other.Cost, - self.Density == other.Density, - self.EmbodiedCarbon == other.EmbodiedCarbon, - self.EmbodiedEnergy == other.EmbodiedEnergy, - np.array_equal( - self.SubstitutionRatePattern, other.SubstitutionRatePattern - ), - self.SubstitutionTimestep == other.SubstitutionTimestep, - self.TransportCarbon == other.TransportCarbon, - self.TransportDistance == other.TransportDistance, - self.TransportEnergy == other.TransportEnergy, - ] - ) - - @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): - - """ - Args: - *args: - **kwargs: - """ - return cls.from_dict(*args, **kwargs) - - @classmethod - def from_dict(cls, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - gm = cls(*args, **kwargs) - gas_type = kwargs.get("Name", None) - gm.Type = gas_type - - return gm - - def to_json(self): - """Convert class properties to dict""" - self.validate() # Validate object before trying to get json format - - data_dict = collections.OrderedDict() - - data_dict["$id"] = str(self.id) - data_dict["Category"] = self.Category - data_dict["Type"] = self.Type - data_dict["Conductivity"] = round(self.Conductivity, sigfigs=2) - data_dict["Cost"] = self.Cost - data_dict["Density"] = self.Density - data_dict["EmbodiedCarbon"] = self.EmbodiedCarbon - data_dict["EmbodiedEnergy"] = self.EmbodiedEnergy - data_dict["SubstitutionRatePattern"] = self.SubstitutionRatePattern - data_dict["SubstitutionTimestep"] = self.SubstitutionTimestep - data_dict["TransportCarbon"] = self.TransportCarbon - data_dict["TransportDistance"] = self.TransportDistance - data_dict["TransportEnergy"] = self.TransportEnergy - data_dict["Comments"] = self.Comments - data_dict["DataSource"] = self.DataSource - data_dict["Name"] = self.Name - - return data_dict - - def mapping(self): - self.validate() - - return dict( - Category=self.Category, - Type=self.Type, - Conductivity=self.Conductivity, - Cost=self.Cost, - Density=self.Density, - EmbodiedCarbon=self.EmbodiedCarbon, - EmbodiedEnergy=self.EmbodiedEnergy, - SubstitutionRatePattern=self.SubstitutionRatePattern, - SubstitutionTimestep=self.SubstitutionTimestep, - TransportCarbon=self.TransportCarbon, - TransportDistance=self.TransportDistance, - TransportEnergy=self.TransportEnergy, - Comments=self.Comments, - DataSource=self.DataSource, - Name=self.Name, - ) diff --git a/archetypal/template/load.py b/archetypal/template/load.py index 29c11971..51aec8de 100644 --- a/archetypal/template/load.py +++ b/archetypal/template/load.py @@ -1,9 +1,4 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal ZoneLoad.""" import collections import logging as lg @@ -13,28 +8,33 @@ import numpy as np import pandas as pd -from deprecation import deprecated from sigfig import round +from validator_collection import checkers, validators -from archetypal import __version__, settings -from archetypal.template import UmiBase, UmiSchedule, UniqueName +from archetypal import settings +from archetypal.template.schedule import UmiSchedule +from archetypal.template.umi_base import UmiBase from archetypal.utils import log, reduce, timeit class DimmingTypes(Enum): + """DimmingType class.""" + Continuous = 0 Off = 1 Stepped = 2 def __lt__(self, other): + """Assert if self is lower then other.""" return self._value_ < other._value_ def __gt__(self, other): + """Assert if self is greater then other.""" return self._value_ > other._value_ class ZoneLoad(UmiBase): - """Zone Loads + """Zone Loads. Important: Please note that the calculation of the equipment power density will sum @@ -43,22 +43,41 @@ class ZoneLoad(UmiBase): .. image:: ../images/template/zoneinfo-loads.png """ + __slots__ = ( + "_dimming_type", + "_equipment_availability_schedule", + "_lights_availability_schedule", + "_occupancy_schedule", + "_equipment_power_density", + "_illuminance_target", + "_lighting_power_density", + "_people_density", + "_is_equipment_on", + "_is_lighting_on", + "_is_people_on", + "_area", + "_volume", + ) + def __init__( self, - DimmingType=DimmingTypes.Continuous, - EquipmentAvailabilitySchedule=None, + Name, EquipmentPowerDensity=0, - IlluminanceTarget=500, + EquipmentAvailabilitySchedule=None, LightingPowerDensity=0, LightsAvailabilitySchedule=None, + PeopleDensity=0, OccupancySchedule=None, IsEquipmentOn=True, IsLightingOn=True, IsPeopleOn=True, - PeopleDensity=0, + DimmingType=DimmingTypes.Continuous, + IlluminanceTarget=500, + area=1, + volume=1, **kwargs, ): - """Initialize a new ZoneLoad object + """Initialize a new ZoneLoad object. Args: DimmingType (int): Different types to dim the lighting to respect the @@ -93,158 +112,259 @@ def __init__( IsPeopleOn (bool): If True, heat gains from People are taken into account for the zone's load calculation. PeopleDensity (float): Density of people in the zone (people/m²). + area (float): The floor area assiciated to this zone load object. **kwargs: Other keywords passed to the parent constructor :class:`UmiBase`. """ - super(ZoneLoad, self).__init__(**kwargs) - self.DimmingType = DimmingTypes(DimmingType) - self.EquipmentAvailabilitySchedule = EquipmentAvailabilitySchedule + super(ZoneLoad, self).__init__(Name, **kwargs) + self.EquipmentPowerDensity = EquipmentPowerDensity - self.IlluminanceTarget = IlluminanceTarget + self.EquipmentAvailabilitySchedule = EquipmentAvailabilitySchedule self.LightingPowerDensity = LightingPowerDensity self.LightsAvailabilitySchedule = LightsAvailabilitySchedule + self.PeopleDensity = PeopleDensity self.OccupancySchedule = OccupancySchedule self.IsEquipmentOn = IsEquipmentOn self.IsLightingOn = IsLightingOn self.IsPeopleOn = IsPeopleOn - self.PeopleDensity = PeopleDensity + self.DimmingType = DimmingTypes(DimmingType) + self.IlluminanceTarget = IlluminanceTarget + self.area = area + self.volume = volume + + @property + def DimmingType(self): + """Get or set the dimming type. + + Hint: + To set the value an int or a string is supported. + Choices are (, , + ) + """ + return self._dimming_type + + @DimmingType.setter + def DimmingType(self, value): + if checkers.is_string(value): + assert DimmingTypes[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in DimmingTypes)}" + ) + self._dimming_type = DimmingTypes[value] + elif checkers.is_numeric(value): + assert DimmingTypes[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in DimmingTypes)}" + ) + self._dimming_type = DimmingTypes(value) + elif isinstance(value, DimmingTypes): + self._dimming_type = value + else: + raise ValueError(f"Could not set DimmingType with value '{value}'") - self._belongs_to_zone = kwargs.get("zone", None) + @property + def EquipmentAvailabilitySchedule(self): + """Get or set the equipment availability schedule.""" + return self._equipment_availability_schedule + + @EquipmentAvailabilitySchedule.setter + def EquipmentAvailabilitySchedule(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input value error for '{value}'. Value must be of type '" + f"{UmiSchedule}', not {type(value)}" + ) + # set quantity on schedule as well + value.quantity = self.EquipmentPowerDensity + self._equipment_availability_schedule = value @property def EquipmentPowerDensity(self): - if math.isnan(self._EquipmentPowerDensity): - return self._EquipmentPowerDensity - return round(float(self._EquipmentPowerDensity), decimals=3) + """Get or set the equipment power density [W/m²].""" + return self._equipment_power_density @EquipmentPowerDensity.setter def EquipmentPowerDensity(self, value): - self._EquipmentPowerDensity = value + self._equipment_power_density = validators.float( + value, minimum=0, allow_empty=True + ) @property def IlluminanceTarget(self): - return float(self._IlluminanceTarget) + """Get or set the illuminance target [lux].""" + return self._illuminance_target @IlluminanceTarget.setter def IlluminanceTarget(self, value): - self._IlluminanceTarget = value + self._illuminance_target = validators.float(value, minimum=0) @property def LightingPowerDensity(self): - if math.isnan(self._LightingPowerDensity): - return self._LightingPowerDensity - return round(float(self._LightingPowerDensity), decimals=3) + """Get or set the lighting power density [W/m²].""" + return self._lighting_power_density @LightingPowerDensity.setter def LightingPowerDensity(self, value): - self._LightingPowerDensity = value + self._lighting_power_density = validators.float( + value, minimum=0, allow_empty=True + ) + + @property + def LightsAvailabilitySchedule(self) -> UmiSchedule: + """Get or set the lights availability schedule.""" + return self._lights_availability_schedule + + @LightsAvailabilitySchedule.setter + def LightsAvailabilitySchedule(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input value error for '{value}'. Value must be of type '" + f"{UmiSchedule}', not {type(value)}" + ) + # set quantity on schedule as well + value.quantity = self.LightingPowerDensity + self._lights_availability_schedule = value + + @property + def OccupancySchedule(self) -> UmiSchedule: + """Get or set the occupancy schedule.""" + return self._occupancy_schedule + + @OccupancySchedule.setter + def OccupancySchedule(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input value error for '{value}'. Value must be if type '" + f"{UmiSchedule}', not {type(value)}" + ) + # set quantity on schedule as well + value.quantity = self.PeopleDensity + self._occupancy_schedule = value @property def PeopleDensity(self): - if math.isnan(self._PeopleDensity): - return self._PeopleDensity - return round(float(self._PeopleDensity), decimals=3) + """Get or set the people density [ppl/m²].""" + return self._people_density @PeopleDensity.setter def PeopleDensity(self, value): - self._PeopleDensity = value + self._people_density = validators.float(value, minimum=0) - def __add__(self, other): - """ - Args: - other (Zone): - """ - return self.combine(other) - - def __hash__(self): - return hash( - (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + @property + def IsEquipmentOn(self): + """Get or set the use of equipment [bool].""" + return self._is_equipment_on + + @IsEquipmentOn.setter + def IsEquipmentOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsEquipmentOn must " + f"be a boolean, not a {type(value)}" ) + self._is_equipment_on = value - def __eq__(self, other): - if not isinstance(other, ZoneLoad): - return NotImplemented - else: - return all( - [ - self.DimmingType == other.DimmingType, - self.EquipmentAvailabilitySchedule - == other.EquipmentAvailabilitySchedule, - self.EquipmentPowerDensity == other.EquipmentPowerDensity, - self.IlluminanceTarget == other.IlluminanceTarget, - self.LightingPowerDensity == other.LightingPowerDensity, - self.LightsAvailabilitySchedule == other.LightsAvailabilitySchedule, - self.OccupancySchedule == other.OccupancySchedule, - self.IsEquipmentOn == other.IsEquipmentOn, - self.IsLightingOn == other.IsLightingOn, - self.IsPeopleOn == other.IsPeopleOn, - self.PeopleDensity == other.PeopleDensity, - ] - ) - - @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): - - return cls.from_dict(*args, **kwargs) + @property + def IsLightingOn(self): + """Get or set the use of lighting [bool].""" + return self._is_lighting_on + + @IsLightingOn.setter + def IsLightingOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsLightingOn must " + f"be a boolean, not a {type(value)}" + ) + self._is_lighting_on = value - @classmethod - def from_dict(cls, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - zl = cls(*args, **kwargs) + @property + def IsPeopleOn(self): + """Get or set people [bool].""" + return self._is_people_on + + @IsPeopleOn.setter + def IsPeopleOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsPeopleOn must " + f"be a boolean, not a {type(value)}" + ) + self._is_people_on = value - cool_schd = kwargs.get("EquipmentAvailabilitySchedule", None) - zl.EquipmentAvailabilitySchedule = zl.get_ref(cool_schd) - heat_schd = kwargs.get("LightsAvailabilitySchedule", None) - zl.LightsAvailabilitySchedule = zl.get_ref(heat_schd) - mech_schd = kwargs.get("OccupancySchedule", None) - zl.OccupancySchedule = zl.get_ref(mech_schd) + @property + def area(self): + """Get or set the floor area of the zone associated to this zone load [m²].""" + return self._area - return zl + @area.setter + def area(self, value): + self._area = validators.float(value, minimum=0) - def to_json(self): - """Convert class properties to dict""" - self.validate() # Validate object before trying to get json format + @property + def volume(self): + """Get or set the volume of the zone associated to this zone load [m³].""" + return self._volume - data_dict = collections.OrderedDict() + @volume.setter + def volume(self, value): + self._volume = validators.float(value, minimum=0) - data_dict["$id"] = str(self.id) - data_dict["DimmingType"] = self.DimmingType.value - data_dict[ - "EquipmentAvailabilitySchedule" - ] = self.EquipmentAvailabilitySchedule.to_dict() - data_dict["EquipmentPowerDensity"] = round(self.EquipmentPowerDensity, 3) - data_dict["IlluminanceTarget"] = round(self.IlluminanceTarget, 3) - data_dict["LightingPowerDensity"] = round(self.LightingPowerDensity, 3) - data_dict[ - "LightsAvailabilitySchedule" - ] = self.LightsAvailabilitySchedule.to_dict() - data_dict["OccupancySchedule"] = self.OccupancySchedule.to_dict() - data_dict["IsEquipmentOn"] = self.IsEquipmentOn - data_dict["IsLightingOn"] = self.IsLightingOn - data_dict["IsPeopleOn"] = self.IsPeopleOn - data_dict["PeopleDensity"] = round(self.PeopleDensity, 3) - data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments - data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + @classmethod + def from_dict(cls, data, schedules, **kwargs): + """Create a ZoneLoad from a dictionary. - return data_dict + Args: + data (dict): A python dictionary with the structure shown bellow. + schedules (dict): A python dictionary of UmiSchedules with their id as keys. + **kwargs: keywords passed to parent constructors. + + .. code-block:: python + + { + "$id": "172", + "DimmingType": 1, + "EquipmentAvailabilitySchedule": { + "$ref": "147" + }, + "EquipmentPowerDensity": 8.0, + "IlluminanceTarget": 500.0, + "LightingPowerDensity": 12.0, + "LightsAvailabilitySchedule": { + "$ref": "146" + }, + "OccupancySchedule": { + "$ref": "145" + }, + "IsEquipmentOn": true, + "IsLightingOn": true, + "IsPeopleOn": true, + "PeopleDensity": 0.055, + "Category": "Office Spaces", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Off_0 loads" + }, + """ + _id = data.pop("$id") + return cls( + id=_id, + EquipmentAvailabilitySchedule=schedules[ + data.pop("EquipmentAvailabilitySchedule")["$ref"] + ], + LightsAvailabilitySchedule=schedules[ + data.pop("LightsAvailabilitySchedule")["$ref"] + ], + OccupancySchedule=schedules[data.pop("OccupancySchedule")["$ref"]], + **data, + **kwargs, + ) @classmethod @timeit - def from_zone(cls, zone, **kwargs): - """ + def from_zone(cls, zone, zone_ep, **kwargs): + """Create a ZoneLoad object from a :class:`ZoneDefinition`. + Args: + zone_ep: zone (ZoneDefinition): zone to gets information from + kwargs: keywords passed to the parent constructor. """ # If Zone is not part of total area, it should not have a ZoneLoad object. if not zone._is_part_of_total_floor_area: @@ -254,7 +374,7 @@ def from_zone(cls, zone, **kwargs): # Verify if Equipment in zone # create database connection with sqlite3 - with sqlite3.connect(str(zone.idf.sql_file)) as conn: + with sqlite3.connect(str(zone_ep.theidf.sql_file)) as conn: sql_query = "select ifnull(ZoneIndex, null) from Zones where ZoneName=?" t = (zone.Name.upper(),) c = conn.cursor() @@ -268,8 +388,7 @@ def from_zone(cls, zone, **kwargs): nominal_gas = pd.read_sql(sql_query, conn, params=(zone_index,)) def get_schedule(series): - """Computes schedule with quantity for nominal equipment - series""" + """Compute the schedule with quantity for nominal equipment series.""" sched = series["ScheduleIndex"] sql_query = ( "select t.ScheduleName, t.ScheduleType as M from " @@ -278,10 +397,8 @@ def get_schedule(series): sched_name, sched_type = c.execute(sql_query, (int(sched),)).fetchone() level_ = float(series["DesignLevel"]) if level_ > 0: - return UmiSchedule( - Name=sched_name, - idf=zone.idf, - Type=sched_type, + return UmiSchedule.from_epbunch( + zone_ep.theidf.schedules_dict[sched_name.upper()], quantity=level_, ) @@ -335,18 +452,15 @@ def get_schedule(series): # Verifies if People in zone def get_schedule(series): - """Computes schedule with quantity for nominal equipment - series""" + """Compute schedule with quantity for nominal equipment series.""" sched = series["NumberOfPeopleScheduleIndex"] sql_query = ( "select t.ScheduleName, t.ScheduleType as M from " "Schedules t where ScheduleIndex=?" ) sched_name, sched_type = c.execute(sql_query, (int(sched),)).fetchone() - return UmiSchedule( - Name=sched_name, - idf=zone.idf, - Type=sched_type, + return UmiSchedule.from_epbunch( + zone_ep.theidf.schedules_dict[sched_name.upper()], quantity=series["NumberOfPeople"], ) @@ -373,11 +487,10 @@ def get_schedule(series): name = zone.Name + "_ZoneLoad" z_load = cls( Name=name, - zone=zone, - DimmingType=_resolve_dimming_type(zone), + DimmingType=_resolve_dimming_type(zone, zone_ep), EquipmentAvailabilitySchedule=EquipmentAvailabilitySchedule, EquipmentPowerDensity=EquipmentPowerDensity, - IlluminanceTarget=_resolve_illuminance_target(zone), + IlluminanceTarget=_resolve_illuminance_target(zone, zone_ep), LightingPowerDensity=LightingPowerDensity, LightsAvailabilitySchedule=LightsAvailabilitySchedule, OccupancySchedule=OccupancySchedule, @@ -385,20 +498,20 @@ def get_schedule(series): IsLightingOn=LightingPowerDensity > 0, IsPeopleOn=PeopleDensity > 0, PeopleDensity=PeopleDensity, - idf=zone.idf, - Category=zone.idf.name, + Category=zone.DataSource, + area=zone.area, + volume=zone.volume, **kwargs, ) return z_load def combine(self, other, weights=None): - """Combine two ZoneLoad objects together. + """Combine two ZoneLoad objects together. Returns a new object. Args: - other (ZoneLoad): + other (ZoneLoad): The other ZoneLoad object. weights (list-like, optional): A list-like object of len 2. If None, - the volume of the zones for which self and other belongs is - used. + the `settings.zone_weight` of the objects is used. Returns: (ZoneLoad): the combined ZoneLoad object. @@ -422,16 +535,13 @@ def combine(self, other, weights=None): if self == other: return self - incoming_load_data = self.__dict__.copy() - incoming_load_data.pop("Name") - meta = self._get_predecessors_meta(other) if not weights: zone_weight = settings.zone_weight weights = [ - getattr(self._belongs_to_zone, str(zone_weight)), - getattr(other._belongs_to_zone, str(zone_weight)), + getattr(self, str(zone_weight)), + getattr(other, str(zone_weight)), ] log( 'using zone {} "{}" as weighting factor in "{}" ' @@ -447,35 +557,39 @@ def combine(self, other, weights=None): EquipmentAvailabilitySchedule=UmiSchedule.combine( self.EquipmentAvailabilitySchedule, other.EquipmentAvailabilitySchedule, + weights=[self.area, other.area], quantity=True, ), - EquipmentPowerDensity=self._float_mean( + EquipmentPowerDensity=self.float_mean( other, "EquipmentPowerDensity", weights ), - IlluminanceTarget=self._float_mean(other, "IlluminanceTarget", weights), - LightingPowerDensity=self._float_mean( + IlluminanceTarget=self.float_mean(other, "IlluminanceTarget", weights), + LightingPowerDensity=self.float_mean( other, "LightingPowerDensity", weights ), LightsAvailabilitySchedule=UmiSchedule.combine( self.LightsAvailabilitySchedule, other.LightsAvailabilitySchedule, + weights=[self.area, other.area], quantity=True, ), OccupancySchedule=UmiSchedule.combine( self.OccupancySchedule, other.OccupancySchedule, + weights=[self.area, other.area], quantity=True, ), IsEquipmentOn=any([self.IsEquipmentOn, other.IsEquipmentOn]), IsLightingOn=any([self.IsLightingOn, other.IsLightingOn]), IsPeopleOn=any([self.IsPeopleOn, other.IsPeopleOn]), - PeopleDensity=self._float_mean(other, "PeopleDensity", weights), + PeopleDensity=self.float_mean(other, "PeopleDensity", weights), ) new_obj = self.__class__( - **meta, **new_attr, idf=self.idf, allow_duplicates=self._allow_duplicates + **meta, **new_attr, allow_duplicates=self.allow_duplicates ) - new_obj._belongs_to_zone = self._belongs_to_zone + new_obj.area = self.area + other.area + new_obj.volume = self.volume + other.volume new_obj.predecessors.update(self.predecessors + other.predecessors) return new_obj @@ -505,8 +619,15 @@ def validate(self): self.PeopleDensity = 0 return self - def mapping(self): - self.validate() + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() return dict( DimmingType=self.DimmingType, @@ -526,26 +647,203 @@ def mapping(self): Name=self.Name, ) - def get_ref(self, ref): - """Get item matching reference id. + def to_dict(self): + """Return ZoneLoad dictionary representation.""" + self.validate() # Validate object before trying to get json format + + data_dict = collections.OrderedDict() + + data_dict["$id"] = str(self.id) + data_dict["DimmingType"] = self.DimmingType.value + data_dict[ + "EquipmentAvailabilitySchedule" + ] = self.EquipmentAvailabilitySchedule.to_ref() + data_dict["EquipmentPowerDensity"] = ( + round(self.EquipmentPowerDensity, 3) + if not math.isnan(self.EquipmentPowerDensity) + else 0 + ) + data_dict["IlluminanceTarget"] = round(self.IlluminanceTarget, 3) + data_dict["LightingPowerDensity"] = ( + round(self.LightingPowerDensity, 3) + if not math.isnan(self.LightingPowerDensity) + else 0 + ) + data_dict[ + "LightsAvailabilitySchedule" + ] = self.LightsAvailabilitySchedule.to_ref() + data_dict["OccupancySchedule"] = self.OccupancySchedule.to_ref() + data_dict["IsEquipmentOn"] = self.IsEquipmentOn + data_dict["IsLightingOn"] = self.IsLightingOn + data_dict["IsPeopleOn"] = self.IsPeopleOn + data_dict["PeopleDensity"] = ( + round(self.PeopleDensity, 3) if not math.isnan(self.PeopleDensity) else 0 + ) + data_dict["Category"] = self.Category + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) + data_dict["DataSource"] = self.DataSource + data_dict["Name"] = self.Name + + return data_dict + + def to_epbunch(self, idf, zone_name): + """Convert the zone load to epbunch given an idf model and a zone name. Args: - ref: + idf (IDF): The idf model. epbunches will be added to this model. + zone_name (str): The name of the zone in the idf model. + + .. code-block:: python + + People, + People Perim, !- Name + Perim, !- Zone or ZoneList Name + B_Off_Y_Occ, !- Number of People Schedule Name + People/Area, !- Number of People Calculation Method + , !- Number of People + 0.055, !- People per Zone Floor Area + , !- Zone Floor Area per Person + 0.3, !- Fraction Radiant + AUTOCALCULATE, !- Sensible Heat Fraction + PerimPeopleActivity, !- Activity Level Schedule Name + 3.82e-08, !- Carbon Dioxide Generation Rate + No, !- Enable ASHRAE 55 Comfort Warnings + ZoneAveraged, !- Mean Radiant Temperature Calculation Type + , !- Surface NameAngle Factor List Name + PerimWorkEfficiency, !- Work Efficiency Schedule Name + DynamicClothingModelASHRAE55, !- Clothing Insulation Calculation Method + , !- Clothing Insulation Calculation Method Schedule Name + , !- Clothing Insulation Schedule Name + PerimAirVelocity, !- Air Velocity Schedule Name + AdaptiveASH55; !- Thermal Comfort Model 1 Type + + Lights, + Perim General lighting, !- Name + Perim, !- Zone or ZoneList Name + B_Off_Y_Lgt, !- Schedule Name + Watts/Area, !- Design Level Calculation Method + , !- Lighting Level + 12, !- Watts per Zone Floor Area + , !- Watts per Person + 0, !- Return Air Fraction + 0.42, !- Fraction Radiant + 0.18, !- Fraction Visible + 1, !- Fraction Replaceable + ; !- EndUse Subcategory + + ElectricEquipment, + Perim Equipment 1, !- Name + Perim, !- Zone or ZoneList Name + B_Off_Y_Plg, !- Schedule Name + Watts/Area, !- Design Level Calculation Method + , !- Design Level + 8, !- Watts per Zone Floor Area + , !- Watts per Person + 0, !- Fraction Latent + 0.2, !- Fraction Radiant + 0, !- Fraction Lost + ; !- EndUse Subcategory + + Returns: + EpBunch: The EpBunch object added to the idf model. """ - return next( - iter( - [value for value in ZoneLoad.CREATED_OBJECTS if value.id == ref["$ref"]] - ), - None, + people = idf.newidfobject( + "PEOPLE", + Name=self.Name, + Zone_or_ZoneList_Name=zone_name, + Number_of_People_Schedule_Name=self.OccupancySchedule.to_epbunch(idf).Name, + Number_of_People_Calculation_Method="People/Area", + People_per_Zone_Floor_Area=self.PeopleDensity, + Fraction_Radiant=0.3, + Sensible_Heat_Fraction="AUTOCALCULATE", + Activity_Level_Schedule_Name=idf.newidfobject( + "SCHEDULE:CONSTANT", Name="PeopleActivity", Hourly_Value=125.28 + ).Name, + Carbon_Dioxide_Generation_Rate=3.82e-08, + Enable_ASHRAE_55_Comfort_Warnings="No", + Mean_Radiant_Temperature_Calculation_Type="ZoneAveraged", + Work_Efficiency_Schedule_Name=idf.newidfobject( + "SCHEDULE:CONSTANT", Name="WorkEfficiency", Hourly_Value=0 + ).Name, + Clothing_Insulation_Calculation_Method="DynamicClothingModelASHRAE55", + Air_Velocity_Schedule_Name=idf.newidfobject( + "SCHEDULE:CONSTANT", Name="AirVelocity", Hourly_Value=0.2 + ).Name, + ) + lights = idf.newidfobject( + key="LIGHTS", + Name=self.Name, + Zone_or_ZoneList_Name=zone_name, + Schedule_Name=self.LightsAvailabilitySchedule.to_epbunch(idf).Name, + Design_Level_Calculation_Method="Watts/Area", + Watts_per_Zone_Floor_Area=self.LightingPowerDensity, + Return_Air_Fraction=0, + Fraction_Radiant=0.42, + Fraction_Visible=0.18, + Fraction_Replaceable=1, + ) + equipment = idf.newidfobject( + "ELECTRICEQUIPMENT", + Name=self.Name, + Zone_or_ZoneList_Name=zone_name, + Schedule_Name=self.EquipmentAvailabilitySchedule.to_epbunch(idf).Name, + Design_Level_Calculation_Method="Watts/Area", + Watts_per_Zone_Floor_Area=self.EquipmentPowerDensity, + Fraction_Latent=0, + Fraction_Radiant=0.2, + Fraction_Lost=0, ) + return people, lights, equipment + def __copy__(self): + """Create a copy of self.""" + return self.__class__( + **self.mapping(validate=False), area=self.area, volume=self.volume + ) + + def __add__(self, other): + """Combine self and other.""" + return self.combine(other) -def _resolve_dimming_type(zone): - """Resolves the dimming type for the Zone object""" + def __hash__(self): + """Return the hash value of self.""" + return hash( + (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + ) + + def __key__(self): + """Get a tuple of attributes. Useful for hashing and comparing.""" + return ( + self.DimmingType, + self.EquipmentAvailabilitySchedule, + self.EquipmentPowerDensity, + self.IlluminanceTarget, + self.LightingPowerDensity, + self.LightsAvailabilitySchedule, + self.OccupancySchedule, + self.IsEquipmentOn, + self.IsLightingOn, + self.IsPeopleOn, + self.PeopleDensity, + ) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, ZoneLoad): + return NotImplemented + else: + return self.__key__() == other.__key__() + + +def _resolve_dimming_type(zone, zone_ep): + """Resolve the dimming type for the Zone object. + + Args: + zone_ep: + """ # First, retrieve the list of Daylighting objects for this zone. Uses the eppy # `getreferingobjs` method. - ep_obj = zone._epbunch - possible_ctrls = ep_obj.getreferingobjs( + possible_ctrls = zone_ep.getreferingobjs( iddgroups=["Daylighting"], fields=["Zone_Name"] ) # Then, if there are controls @@ -582,12 +880,15 @@ def _resolve_dimming_type(zone): return DimmingTypes.Off -def _resolve_illuminance_target(zone): - """Resolves the illuminance target for the Zone object""" +def _resolve_illuminance_target(zone, zone_ep): + """Resolve the illuminance target for the Zone object. + + Args: + zone_ep: + """ # First, retrieve the list of Daylighting objects for this zone. Uses the eppy # `getreferingobjs` method. - ep_obj = zone._epbunch - possible_ctrls = ep_obj.getreferingobjs( + possible_ctrls = zone_ep.getreferingobjs( iddgroups=["Daylighting"], fields=["Zone_Name"] ) # Then, if there are controls diff --git a/archetypal/template/materials/__init__.py b/archetypal/template/materials/__init__.py new file mode 100644 index 00000000..157d1386 --- /dev/null +++ b/archetypal/template/materials/__init__.py @@ -0,0 +1,11 @@ +"""archetypal materials.""" + +__all__ = ( + "GasMaterial", + "GlazingMaterial", + "OpaqueMaterial", +) + +from archetypal.template.materials.gas_material import GasMaterial +from archetypal.template.materials.glazing_material import GlazingMaterial +from archetypal.template.materials.opaque_material import OpaqueMaterial diff --git a/archetypal/template/materials/gas_layer.py b/archetypal/template/materials/gas_layer.py new file mode 100644 index 00000000..4b5e4896 --- /dev/null +++ b/archetypal/template/materials/gas_layer.py @@ -0,0 +1,374 @@ +"""archetypal GasLayer.""" +import collections +import logging as lg +import math + +from sigfig import round + +from archetypal.utils import log + + +class GasLayer(object): + """Class used to define one gas layer in a window construction assembly. + + This class has two attributes: + + 1. Material (:class:`GasMaterial`): the material object for this layer. + 2. Thickness (float): The thickness of the material in the layer. + """ + + __slots__ = ("_material", "_thickness") + + def __init__(self, Material, Thickness, **kwargs): + """Initialize a MaterialLayer object with parameters. + + Args: + Material (GasMaterial): + Thickness (float): The thickness of the material in the + construction. + """ + self.Material = Material + self.Thickness = Thickness + + @property + def Material(self): + """Get or set the material of self.""" + return self._material + + @Material.setter + def Material(self, value): + from archetypal.template.materials import GasMaterial + + assert isinstance(value, GasMaterial), ( + f"Input value error for '{value}'. Value must be of type (GasMaterial), " + f"not {type(value)}." + ) + self._material = value + + @property + def Thickness(self): + """Get or set the material thickness [m].""" + return self._thickness + + @Thickness.setter + def Thickness(self, value): + self._thickness = value + if value < 0.003: + log( + "Modeling layer thinner (less) than 0.003 m (not recommended) for " + f"MaterialLayer '{self}'", + lg.WARNING, + ) + + @property + def resistivity(self): + """Get or set the resistivity of the material layer [m-K/W].""" + return 1 / self.Material.Conductivity + + @resistivity.setter + def resistivity(self, value): + self.Material.Conductivity = 1 / float(value) + + @property + def r_value(self): + """Get or set the the R-value of the material layer [m2-K/W]. + + Note that, when setting the R-value, the thickness of the material will + be adjusted and the conductivity will remain fixed. + """ + return self.Thickness / self.Material.Conductivity + + @r_value.setter + def r_value(self, value): + self.Thickness = float(value) * self.Material.Conductivity + + @property + def heat_capacity(self): + """Get the material layer's heat capacity [J/(m2-k)].""" + return ( + self.Material.Density + * self.Material.specific_heat_at_temperature(273.15) + * self.Thickness + ) + + @property + def specific_heat(self): + """Get the material layer's specific heat at 0C [J/kg-K].""" + return self.Material.specific_heat + + def u_value( + self, + delta_t=15, + emissivity_1=0.84, + emissivity_2=0.84, + height=1.0, + t_kelvin=273.15, + pressure=101325, + ): + """Get the U-value of a vertical gas cavity given temp diff and emissivity. + + Args: + delta_t: The temperature difference across the gas cavity [C]. This + influences how strong the convection is within the gas gap. Default is + 15C, which is consistent with the NFRC standard for double glazed units. + emissivity_1: The emissivity of the surface on one side of the cavity. + Default is 0.84, which is typical of clear, uncoated glass. + emissivity_2: The emissivity of the surface on the other side of the cavity. + Default is 0.84, which is typical of clear, uncoated glass. + height: An optional height for the cavity in meters. Default is 1.0, + which is consistent with NFRC standards. + t_kelvin: The average temperature of the gas cavity in Kelvin. + Default: 273.15 K (0C). + pressure: The average pressure of the gas cavity in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + return self.convective_conductance( + delta_t, height, t_kelvin, pressure + ) + self.radiative_conductance(emissivity_1, emissivity_2, t_kelvin) + + def u_value_at_angle( + self, + delta_t=15, + emissivity_1=0.84, + emissivity_2=0.84, + height=1.0, + angle=90, + t_kelvin=273.15, + pressure=101325, + ): + """Get the U-value of a vertical gas cavity given temp diff and emissivity. + + Args: + delta_t: The temperature difference across the gas cavity [C]. This + influences how strong the convection is within the gas gap. Default is + 15C, which is consistent with the NFRC standard for double glazed units. + emissivity_1: The emissivity of the surface on one side of the cavity. + Default is 0.84, which is typical of clear, uncoated glass. + emissivity_2: The emissivity of the surface on the other side of the cavity. + Default is 0.84, which is typical of clear, uncoated glass. + height: An optional height for the cavity in meters. Default is 1.0, + which is consistent with NFRC standards. + angle: An angle in degrees between 0 and 180. + 0 = A horizontal cavity with downward heat flow through the layer. + 90 = A vertical cavity + 180 = A horizontal cavity with upward heat flow through the layer. + t_kelvin: The average temperature of the gas cavity in Kelvin. + Default: 273.15 K (0C). + pressure: The average pressure of the gas cavity in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + return self.convective_conductance_at_angle( + delta_t, height, angle, t_kelvin, pressure + ) + self.radiative_conductance(emissivity_1, emissivity_2, t_kelvin) + + def convective_conductance( + self, delta_t=15, height=1.0, t_kelvin=273.15, pressure=101325 + ): + """Get convective conductance of the cavity in a vertical position. + + Args: + delta_t: The temperature difference across the gas cavity [C]. Default is + 15C, which is consistent with the NFRC standard for double glazed units. + height: An optional height for the cavity in meters. Default is 1.0, + which is consistent with NFRC standards. + t_kelvin: The average temperature of the gas cavity in Kelvin. + Default: 273.15 K (0C). + pressure: The average pressure of the gas cavity in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + return self.nusselt(delta_t, height, t_kelvin, pressure) * ( + self.Material.conductivity_at_temperature(t_kelvin) / self.Thickness + ) + + def convective_conductance_at_angle( + self, delta_t=15, height=1.0, angle=90, t_kelvin=273.15, pressure=101325 + ): + """Get convective conductance of the cavity in an angle. + + Args: + delta_t: The temperature difference across the gas cavity [C]. Default is + 15C, which is consistent with the NFRC standard for double glazed units. + height: An optional height for the cavity in meters. Default is 1.0, + which is consistent with NFRC standards. + angle: An angle in degrees between 0 and 180. + * 0 = A horizontal cavity with downward heat flow through the layer. + * 90 = A vertical cavity + * 180 = A horizontal cavity with upward heat flow through the layer. + t_kelvin: The average temperature of the gas cavity in Kelvin. + Default: 273.15 K (0C). + pressure: The average pressure of the gas cavity in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + return self.nusselt_at_angle(delta_t, height, angle, t_kelvin, pressure) * ( + self.Material.conductivity_at_temperature(t_kelvin) / self.Thickness + ) + + def radiative_conductance( + self, emissivity_1=0.84, emissivity_2=0.84, t_kelvin=273.15 + ): + """Get the radiative conductance of the cavity given emissivities on both sides. + + Args: + emissivity_1: The emissivity of the surface on one side of the cavity. + Default is 0.84, which is typical of clear, uncoated glass. + emissivity_2: The emissivity of the surface on the other side of the cavity. + Default is 0.84, which is typical of clear, uncoated glass. + t_kelvin: The average temperature of the gas cavity in Kelvin. + Default: 273.15 K (0C). + """ + return ( + (4 * 5.6697e-8) + * (((1 / emissivity_1) + (1 / emissivity_2) - 1) ** -1) + * (t_kelvin ** 3) + ) + + def nusselt_at_angle( + self, delta_t=15, height=1.0, angle=90, t_kelvin=273.15, pressure=101325 + ): + """Get Nusselt number for a cavity at a given angle, temp diff and height. + + Args: + delta_t: The temperature difference across the gas cavity [C]. Default is + 15C, which is consistent with the NFRC standard for double glazed units. + height: An optional height for the cavity in meters. Default is 1.0, + which is consistent with NFRC standards. + angle: An angle in degrees between 0 and 180. + * 0 = A horizontal cavity with downward heat flow through the layer. + * 90 = A vertical cavity + * 180 = A horizontal cavity with upward heat flow through the layer. + t_kelvin: The average temperature of the gas cavity in Kelvin. + Default: 273.15 K (0C). + pressure: The average pressure of the gas cavity in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + + def dot_x(x): + return (x + abs(x)) / 2 + + rayleigh = self.rayleigh(delta_t, t_kelvin, pressure) + if angle < 60: + cos_a = math.cos(math.radians(angle)) + sin_a_18 = math.sin(1.8 * math.radians(angle)) + term_1 = dot_x(1 - (1708 / (rayleigh * cos_a))) + term_2 = 1 - ((1708 * (sin_a_18 ** 1.6)) / (rayleigh * cos_a)) + term_3 = dot_x(((rayleigh * cos_a) / 5830) ** (1 / 3) - 1) + return 1 + (1.44 * term_1 * term_2) + term_3 + elif angle < 90: + g = 0.5 / ((1 + ((rayleigh / 3160) ** 20.6)) ** 0.1) + n_u1 = (1 + (((0.0936 * (rayleigh ** 0.314)) / (1 + g)) ** 7)) ** (1 / 7) + n_u2 = (0.104 + (0.175 / (self.Thickness / height))) * (rayleigh ** 0.283) + n_u_60 = max(n_u1, n_u2) + n_u_90 = self.nusselt(delta_t, height, t_kelvin, pressure) + return (n_u_60 + n_u_90) / 2 + elif angle == 90: + return self.nusselt(delta_t, height, t_kelvin, pressure) + else: + n_u_90 = self.nusselt(delta_t, height, t_kelvin, pressure) + return 1 + ((n_u_90 - 1) * math.sin(math.radians(angle))) + + def nusselt(self, delta_t=15, height=1.0, t_kelvin=273.15, pressure=101325): + """Get Nusselt number for a vertical cavity given the temp diff. and height. + + Args: + delta_t: The temperature difference across the gas cavity [C]. Default is + 15C, which is consistent with the NFRC standard for double glazed units. + height: An optional height for the cavity in meters. Default is 1.0, + which is consistent with NFRC standards. + t_kelvin: The average temperature of the gas cavity in Kelvin. + Default: 273.15 K (0C). + pressure: The average pressure of the gas cavity in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + rayleigh = self.rayleigh(delta_t, t_kelvin, pressure) + if rayleigh > 50000: + n_u_l_1 = 0.0673838 * (rayleigh ** (1 / 3)) + elif rayleigh > 10000: + n_u_l_1 = 0.028154 * (rayleigh ** 0.4134) + else: + n_u_l_1 = 1 + 1.7596678e-10 * (rayleigh ** 2.2984755) + n_u_l_2 = 0.242 * ((rayleigh * (self.Thickness / height)) ** 0.272) + return max(n_u_l_1, n_u_l_2) + + def rayleigh(self, delta_t=15, t_kelvin=273.15, pressure=101325): + """Get Rayleigh number given the temperature difference across the cavity. + + Args: + delta_t: The temperature difference across the gas cavity [C]. Default is + 15C, which is consistent with the NFRC standard for double glazed units. + t_kelvin: The average temperature of the gas cavity in Kelvin. + Default: 273.15 K (0C). + pressure: The average pressure of the gas cavity in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + _numerator = ( + (self.Material.density_at_temperature(t_kelvin, pressure) ** 2) + * (self.Thickness ** 3) + * 9.81 + * self.Material.specific_heat_at_temperature(t_kelvin) + * delta_t + ) + _denominator = ( + t_kelvin + * self.Material.viscosity_at_temperature(t_kelvin) + * self.Material.conductivity_at_temperature(t_kelvin) + ) + return _numerator / _denominator + + def to_dict(self): + """Return MaterialLayer dictionary representation.""" + return collections.OrderedDict( + Material={"$ref": str(self.Material.id)}, + Thickness=round(self.Thickness, decimals=3), + ) + + def to_epbunch(self, idf): + """Convert self to an epbunch given an IDF model. + + Notes: + The thickness is passed to the epbunch. + + Args: + idf (IDF): An IDF model. + + Returns: + EpBunch: The EpBunch object added to the idf model. + """ + return self.Material.to_epbunch(idf, self.Thickness) + + def mapping(self): + """Get a dict based on the object properties, useful for dict repr.""" + return dict(Material=self.Material, Thickness=self.Thickness) + + def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" + return self + + def __hash__(self): + """Return the hash value of self.""" + return id(self) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, GasLayer): + return NotImplemented + else: + return all( + [self.Thickness == other.Thickness, self.Material == other.Material] + ) + + def __repr__(self): + """Return a representation of self.""" + return "{} with thickness of {:,.3f} m".format(self.Material, self.Thickness) + + def __iter__(self): + """Iterate over attributes. Yields tuple of (keys, value).""" + for k, v in self.mapping().items(): + yield k, v + + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def __copy__(self): + """Create a copy of self.""" + return self.__class__(self.Material, self.Thickness) diff --git a/archetypal/template/materials/gas_material.py b/archetypal/template/materials/gas_material.py new file mode 100644 index 00000000..31708b55 --- /dev/null +++ b/archetypal/template/materials/gas_material.py @@ -0,0 +1,282 @@ +"""GasMaterial module.""" + +import collections + +import numpy as np +from sigfig import round +from validator_collection import validators + +from .material_base import MaterialBase + + +class GasMaterial(MaterialBase): + """Gas Materials. + + .. image:: ../images/template/materials-gas.png + """ + + __slots__ = ("_type", "_conductivity", "_density") + + _GASTYPES = ("air", "argon", "krypton", "xenon", "sf6") + + def __init__( + self, Name, Conductivity=None, Density=None, Category="Gases", **kwargs + ): + """Initialize object with parameters. + + Args: + Name (str): The name of the GasMaterial. + Conductivity (float): Thermal conductivity (W/m-K). + Density (float): A number representing the density of the material + in kg/m3. This is essentially the mass of one cubic meter of the + material. + Category (str): Category is set as "Gases" for GasMaterial. + **kwargs: keywords passed to the MaterialBase constructor. + """ + super(GasMaterial, self).__init__(Name, Category=Category, **kwargs) + self.Type = Name.upper() + self.Conductivity = Conductivity + self.Density = Density + + @property + def Type(self): + """Get or set the gas type. + + Choices are ("Air", "Argon", "Krypton", "Xenon"). + """ + return self._type + + @Type.setter + def Type(self, value): + assert value.lower() in self._GASTYPES, ( + f"Invalid value '{value}' for material gas type. Gas type must be one " + f"of the following:\n{self._GASTYPES}" + ) + self._type = value + + @property + def Conductivity(self): + """Get or set the conductivity of the gas at 0C [W/m-K].""" + return self._conductivity + + @Conductivity.setter + def Conductivity(self, value): + if value is not None: + self._conductivity = validators.float(value, minimum=0) + else: + self._conductivity = self.conductivity_at_temperature(273.15) + + @property + def Density(self): + """Get or set the density of the gas.""" + return self._density + + @Density.setter + def Density(self, value): + """Density of the gas at 0C and sea-level pressure [J/kg-K].""" + if value is not None: + self._density = validators.float(value, minimum=0) + else: + self._density = self.density_at_temperature(273.15) + + @property + def molecular_weight(self): + """Get the molecular weight [kg/mol].""" + import CoolProp.CoolProp as CP + + return CP.PropsSI("molemass", self.Type) + + @property + def specific_heat(self): + """Get the material layer's specific heat at 0C [J/kg-K].""" + return self.specific_heat_at_temperature(273.15) + + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + @classmethod + def from_dict(cls, data, **kwargs): + """Create a GasMaterial from a dictionary. + + Args: + data (dict): A python dictionary. + **kwargs: keywords passed the MaterialBase constructor. + """ + _id = data.pop("$id") + return cls(id=_id, **data, **kwargs) + + def to_dict(self): + """Return GasMaterial dictionary representation.""" + self.validate() # Validate object before trying to get json format + + data_dict = collections.OrderedDict() + + data_dict["$id"] = str(self.id) + data_dict["Category"] = self.Category + data_dict["Type"] = self.Type + data_dict["Conductivity"] = round(self.Conductivity, sigfigs=2) + data_dict["Cost"] = self.Cost + data_dict["Density"] = self.Density + data_dict["EmbodiedCarbon"] = self.EmbodiedCarbon + data_dict["EmbodiedEnergy"] = self.EmbodiedEnergy + data_dict["SubstitutionRatePattern"] = self.SubstitutionRatePattern + data_dict["SubstitutionTimestep"] = self.SubstitutionTimestep + data_dict["TransportCarbon"] = self.TransportCarbon + data_dict["TransportDistance"] = self.TransportDistance + data_dict["TransportEnergy"] = self.TransportEnergy + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) + data_dict["DataSource"] = self.DataSource + data_dict["Name"] = self.Name + + return data_dict + + def to_epbunch(self, idf, thickness): + """Convert self to an epbunch given an idf model and a thickness. + + Args: + idf (IDF): An IDF model. + thickness (float): the thickness of the material. + + .. code-block:: python + + WindowMaterial:Gas, + AIR_0.006_B_Dbl_Air_Cl, !- Name + AIR, !- Gas Type + 0.006; !- Thickness + + Returns: + EpBunch: The EpBunch object added to the idf model. + """ + return idf.newidfobject( + "WINDOWMATERIAL:GAS", + Name=self.Name, + Gas_Type=self.Type, + Thickness=thickness, + ) + + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() + + return dict( + Category=self.Category, + Type=self.Type, + Conductivity=self.Conductivity, + Cost=self.Cost, + Density=self.Density, + EmbodiedCarbon=self.EmbodiedCarbon, + EmbodiedEnergy=self.EmbodiedEnergy, + SubstitutionRatePattern=self.SubstitutionRatePattern, + SubstitutionTimestep=self.SubstitutionTimestep, + TransportCarbon=self.TransportCarbon, + TransportDistance=self.TransportDistance, + TransportEnergy=self.TransportEnergy, + Comments=self.Comments, + DataSource=self.DataSource, + Name=self.Name, + ) + + def density_at_temperature(self, t_kelvin, pressure=101325): + """Get the density of the gas [kg/m3] at a given temperature and pressure. + + This method uses CoolProp to get the density. + + Args: + t_kelvin (float): The average temperature of the gas cavity in Kelvin. + pressure (float): The average pressure of the gas cavity in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + import CoolProp.CoolProp as CP + + return CP.PropsSI("Dmass", "T", t_kelvin, "P", pressure, self.Type) + + def specific_heat_at_temperature(self, t_kelvin, pressure=101325): + """Get the specific heat of the gas [J/(kg-K)] at a given Kelvin temperature. + + This method uses CoolProp to get the density. + + Args: + t_kelvin (float): The average temperature of the gas cavity in Kelvin. + pressure (float): The average pressure of the gas cavity in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + import CoolProp.CoolProp as CP + + return CP.PropsSI("Cpmass", "T", t_kelvin, "P", pressure, self.Type) + + def viscosity_at_temperature(self, t_kelvin, pressure=101325): + """Get the viscosity of the gas [kg/m-s] at a given Kelvin temperature. + + This method uses CoolProp to get the density. + + Args: + t_kelvin (float): The average temperature of the gas cavity in Kelvin. + pressure (float): The average pressure of the gas cavity in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + import CoolProp.CoolProp as CP + + try: + return CP.PropsSI("viscosity", "T", t_kelvin, "P", pressure, self.Type) + except ValueError: + # ValueError: Viscosity model is not available for Krypton, Xenon + return {"krypton": 2.3219e-5, "xenon": 2.1216e-5}[self.Type.lower()] + + def conductivity_at_temperature(self, t_kelvin, pressure=101325): + """Get the conductivity of the gas [W/(m-K)] at a given Kelvin temperature. + + This method uses CoolProp to get the density. Note that the thermal + conductivity model is not available for Krypton, Xenon gases. Values from the + literature are used instead. + + Args: + t_kelvin (float): The average temperature of the gas cavity in Kelvin. + pressure (float): The average pressure of the gas cavity in Pa. + Default is 101325 Pa for standard pressure at sea level. + """ + import CoolProp.CoolProp as CP + + try: + return CP.PropsSI("conductivity", "T", t_kelvin, "P", pressure, self.Type) + except ValueError: + # ValueError: Thermal conductivity model is not available for Krypton, Xenon + return {"krypton": 0.00943, "xenon": 5.65e-3}[self.Type.lower()] + + def __hash__(self): + """Return the hash value of self.""" + return hash((self.__class__.__name__, getattr(self, "Name", None))) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, GasMaterial): + return NotImplemented + else: + return all( + [ + self.Category == other.Category, + self.Type == other.Type, + self.Conductivity == other.Conductivity, + self.Cost == other.Cost, + self.Density == other.Density, + self.EmbodiedCarbon == other.EmbodiedCarbon, + self.EmbodiedEnergy == other.EmbodiedEnergy, + np.array_equal( + self.SubstitutionRatePattern, other.SubstitutionRatePattern + ), + self.SubstitutionTimestep == other.SubstitutionTimestep, + self.TransportCarbon == other.TransportCarbon, + self.TransportDistance == other.TransportDistance, + self.TransportEnergy == other.TransportEnergy, + ] + ) + + def __copy__(self): + """Create a copy of self.""" + return self.__class__(**self.mapping(validate=False)) diff --git a/archetypal/template/glazing_material.py b/archetypal/template/materials/glazing_material.py similarity index 54% rename from archetypal/template/glazing_material.py rename to archetypal/template/materials/glazing_material.py index 470f1c84..9810174f 100644 --- a/archetypal/template/glazing_material.py +++ b/archetypal/template/materials/glazing_material.py @@ -1,30 +1,42 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal GlazingMaterial.""" import collections from sigfig import round +from validator_collection import validators -from archetypal.template import MaterialBase, UmiBase, UniqueName +from archetypal.idfclass.extensions import EpBunch +from archetypal.template.materials.material_base import MaterialBase +from archetypal.template.umi_base import UmiBase from archetypal.utils import log class GlazingMaterial(MaterialBase): - """Glazing Materials + """Glazing Materials class. .. image:: ../images/template/materials-glazing.png """ + __slots__ = ( + "_ir_emissivity_back", + "_ir_emissivity_front", + "_ir_transmittance", + "_visible_reflectance_back", + "_visible_reflectance_front", + "_visible_transmittance", + "_solar_reflectance_back", + "_solar_reflectance_front", + "_solar_transmittance", + "_dirt_factor", + "_conductivity", + ) + def __init__( self, Name, Density=2500, - Conductivity=0, + Conductivity=0.9, SolarTransmittance=0, SolarReflectanceFront=0, SolarReflectanceBack=0, @@ -35,12 +47,10 @@ def __init__( IREmissivityFront=0, IREmissivityBack=0, DirtFactor=1.0, - Type=None, Cost=0.0, - Life=1, - **kwargs + **kwargs, ): - """Initialize a GlazingMaterial object with parameters: + """Initialize a GlazingMaterial object. Args: Name (str): The name of the GlazingMaterial. @@ -71,15 +81,18 @@ def __init__( of dirt on the glass. Using a material with dirt correction factor < 1.0 in the construction for an interior window will result in an error message. - Type: # todo: defined parameter - Life: # todo: defined parameter **kwargs: keywords passed to the :class:`MaterialBase` constructor. For more info, see :class:`MaterialBase`. """ - super(GlazingMaterial, self).__init__(Name, **kwargs) - self.Life = Life - self.Cost = Cost - self.Type = Type + super(GlazingMaterial, self).__init__(Name, Cost=Cost, **kwargs) + + self._solar_reflectance_front = 0 + self._solar_reflectance_back = None + self._visible_reflectance_front = 0 + self._visible_reflectance_back = None + + self.Conductivity = Conductivity + self.Density = Density self.DirtFactor = DirtFactor self.IREmissivityBack = IREmissivityBack self.IREmissivityFront = IREmissivityFront @@ -90,110 +103,125 @@ def __init__( self.SolarReflectanceBack = SolarReflectanceBack self.SolarReflectanceFront = SolarReflectanceFront self.SolarTransmittance = SolarTransmittance - self.Density = Density - self.Conductivity = Conductivity + + @property + def Conductivity(self): + """Get or set the conductivity of the material [W/m-K].""" + return self._conductivity + + @Conductivity.setter + def Conductivity(self, value): + self._conductivity = validators.float(value, minimum=0) + + @property + def Density(self): + """Get or set the density of the material [J/kg-K].""" + return self._density + + @Density.setter + def Density(self, value): + self._density = validators.float(value, minimum=0) + + @property + def DirtFactor(self): + """Get or set the dirt correction factor [-].""" + return self._dirt_factor + + @DirtFactor.setter + def DirtFactor(self, value): + if value == "": + value = 1 + self._dirt_factor = validators.float(value, minimum=0, maximum=1) @property def IREmissivityBack(self): - return float(self._IREmissivityBack) + """Get or set the infrared emissivity of the back side [-].""" + return float(self._ir_emissivity_back) @IREmissivityBack.setter def IREmissivityBack(self, value): - self._IREmissivityBack = value + self._ir_emissivity_back = validators.float(value, False, 0.0, 1.0) @property def IREmissivityFront(self): - return float(self._IREmissivityFront) + """Get or set the infrared emissivity of the front side [-].""" + return self._ir_emissivity_front @IREmissivityFront.setter def IREmissivityFront(self, value): - self._IREmissivityFront = value + self._ir_emissivity_front = validators.float(value, False, 0.0, 1.0) @property def IRTransmittance(self): - return float(self._IRTransmittance) + """Get or set the infrared transmittance [-].""" + return self._ir_transmittance @IRTransmittance.setter def IRTransmittance(self, value): - self._IRTransmittance = value + self._ir_transmittance = validators.float(value, False, 0.0, 1.0) @property def VisibleReflectanceBack(self): - return float(self._VisibleReflectanceBack) + """Get or set the visible reflectance of the back side [-].""" + return self._visible_reflectance_back @VisibleReflectanceBack.setter def VisibleReflectanceBack(self, value): - self._VisibleReflectanceBack = value + self._visible_reflectance_back = validators.float(value, False, 0.0, 1.0) @property def VisibleReflectanceFront(self): - return float(self._VisibleReflectanceFront) + """Get or set the visible reflectance of the front side [-].""" + return self._visible_reflectance_front @VisibleReflectanceFront.setter def VisibleReflectanceFront(self, value): - self._VisibleReflectanceFront = value + self._visible_reflectance_front = validators.float(value, False, 0.0, 1.0) @property def VisibleTransmittance(self): - return float(self._VisibleTransmittance) + """Get or set the visible transmittance [-].""" + return self._visible_transmittance @VisibleTransmittance.setter def VisibleTransmittance(self, value): - self._VisibleTransmittance = value + assert value + self._visible_reflectance_front <= 1, ( + f"Sum of window transmittance and reflectance '" + f"{self._visible_reflectance_front}' is greater than 1." + ) + if self._visible_reflectance_back is not None: + assert value + self._visible_reflectance_back <= 1, ( + f"Sum of window transmittance and reflectance '" + f"{self._visible_reflectance_back}' is greater than 1." + ) + self._visible_transmittance = validators.float(value, False, 0.0, 1.0) @property def SolarReflectanceBack(self): - return float(self._SolarReflectanceBack) + """Get or set the solar reflectance of the back side [-].""" + return self._solar_reflectance_back @SolarReflectanceBack.setter def SolarReflectanceBack(self, value): - self._SolarReflectanceBack = value + self._solar_reflectance_back = validators.float(value, False, 0.0, 1.0) @property def SolarReflectanceFront(self): - return float(self._SolarReflectanceFront) + """Get or set the solar reflectance of the front side [-].""" + return self._solar_reflectance_front @SolarReflectanceFront.setter def SolarReflectanceFront(self, value): - self._SolarReflectanceFront = value + self._solar_reflectance_front = validators.float(value, False, 0.0, 1.0) @property def SolarTransmittance(self): - return float(self._SolarTransmittance) + """Get or set the solar transmittance [-].""" + return self._solar_transmittance @SolarTransmittance.setter def SolarTransmittance(self, value): - self._SolarTransmittance = value - - def __add__(self, other): - """Overload + to implement self.combine.""" - return self.combine(other) - - def __hash__(self): - return hash((self.__class__.__name__, getattr(self, "Name", None))) - - def __eq__(self, other): - if not isinstance(other, GlazingMaterial): - return NotImplemented - else: - return all( - [ - self.Density == other.Density, - self.Conductivity == other.Conductivity, - self.SolarTransmittance == other.SolarTransmittance, - self.SolarReflectanceFront == other.SolarReflectanceFront, - self.SolarReflectanceBack == other.SolarReflectanceBack, - self.VisibleTransmittance == other.VisibleTransmittance, - self.VisibleReflectanceFront == other.VisibleReflectanceFront, - self.VisibleReflectanceBack == other.VisibleReflectanceBack, - self.IRTransmittance == other.IRTransmittance, - self.IREmissivityFront == other.IREmissivityFront, - self.IREmissivityBack == other.IREmissivityBack, - self.DirtFactor == other.DirtFactor, - self.Cost == other.Cost, - self.Life == other.Life, - ] - ) + self._solar_transmittance = validators.float(value, False, 0.0, 1.0) def combine(self, other, weights=None, allow_duplicates=False): """Combine two GlazingMaterial objects together. @@ -229,7 +257,7 @@ def combine(self, other, weights=None, allow_duplicates=False): for attr, value in self.mapping().items(): if attr not in ["Comments", "DataSource"]: if isinstance(value, (int, float)) or isinstance(other, (int, float)): - new_attr[attr] = UmiBase._float_mean( + new_attr[attr] = UmiBase.float_mean( self, other, attr=attr, weights=weights ) elif isinstance(value, str) or isinstance(other, str): @@ -247,11 +275,12 @@ def combine(self, other, weights=None, allow_duplicates=False): [new_attr.pop(key, None) for key in meta.keys()] # meta handles these # keywords. # create a new object from combined attributes - new_obj = self.__class__(**meta, **new_attr, idf=self.idf) + new_obj = self.__class__(**meta, **new_attr) new_obj.predecessors.update(self.predecessors + other.predecessors) return new_obj - def to_json(self): + def to_dict(self): + """Return GlazingMaterial dictionary representation.""" self.validate() # Validate object before trying to get json format data_dict = collections.OrderedDict() @@ -278,14 +307,69 @@ def to_json(self): data_dict["TransportDistance"] = self.TransportDistance data_dict["TransportEnergy"] = self.TransportEnergy data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict - def mapping(self): - self.validate() + def to_epbunch(self, idf, thickness) -> EpBunch: + """Convert self to an EpBunch given an idf model and a thickness. + + Args: + idf (IDF): An IDF model. + thickness (float): the thickness of the material. + + .. code-block:: python + + WindowMaterial:Glazing, + B_Glass_Clear_3_0.003_B_Dbl_Air_Cl, !- Name + SpectralAverage, !- Optical Data Type + SpectralAverage, !- Window Glass Spectral Data Set Name + 0.003, !- Thickness + 0.83, !- Solar Transmittance at Normal Incidence + 0.07, !- Front Side Solar Reflectance at Normal Incidence + 0.07, !- Back Side Solar Reflectance at Normal Incidence + 0.89, !- Visible Transmittance at Normal Incidence + 0.08, !- Front Side Visible Reflectance at Normal Incidence + 0.08, !- Back Side Visible Reflectance at Normal Incidence + 0, !- Infrared Transmittance at Normal Incidence + 0.84, !- Front Side Infrared Hemispherical Emissivity + 0.84, !- Back Side Infrared Hemispherical Emissivity + 0.9, !- Conductivity + 1; !- Dirt Correction Factor for Solar and Visible Transmittance + + Returns: + EpBunch: The EpBunch object added to the idf model. + """ + return idf.newidfobject( + "WINDOWMATERIAL:GLAZING", + Name=self.Name, + Optical_Data_Type="SpectralAverage", + Window_Glass_Spectral_Data_Set_Name="SpectralAverage", + Thickness=thickness, + Solar_Transmittance_at_Normal_Incidence=self.SolarTransmittance, + Front_Side_Solar_Reflectance_at_Normal_Incidence=self.SolarReflectanceFront, + Back_Side_Solar_Reflectance_at_Normal_Incidence=self.SolarReflectanceBack, + Visible_Transmittance_at_Normal_Incidence=self.VisibleTransmittance, + Front_Side_Visible_Reflectance_at_Normal_Incidence=self.VisibleReflectanceFront, + Back_Side_Visible_Reflectance_at_Normal_Incidence=self.VisibleReflectanceBack, + Infrared_Transmittance_at_Normal_Incidence=self.IRTransmittance, + Front_Side_Infrared_Hemispherical_Emissivity=self.IREmissivityFront, + Back_Side_Infrared_Hemispherical_Emissivity=self.IREmissivityBack, + Conductivity=self.Conductivity, + Dirt_Correction_Factor_for_Solar_and_Visible_Transmittance=self.DirtFactor, + ) + + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() return dict( DirtFactor=self.DirtFactor, @@ -313,3 +397,76 @@ def mapping(self): DataSource=self.DataSource, Name=self.Name, ) + + @classmethod + def from_dict(cls, data, **kwargs): + """Create a GlazingMaterial from a dictionary. + + Args: + data: The python dictionary following the format below. + + .. code-block:: python + + {'$id': '1', + 'DirtFactor': 1.0, + 'IREmissivityBack': 0.0, + 'IREmissivityFront': 0.0, + 'IRTransmittance': 0.0, + 'SolarReflectanceBack': 0.0, + 'SolarReflectanceFront': 0.0, + 'SolarTransmittance': 0.0, + 'VisibleReflectanceBack': 0.0, + 'VisibleReflectanceFront': 0.0, + 'VisibleTransmittance': 0.0, + 'Conductivity': 0.0, + 'Cost': 0.0, + 'Density': 2500, + 'EmbodiedCarbon': 0.0, + 'EmbodiedEnergy': 0.0, + 'SubstitutionRatePattern': [1.0], + 'SubstitutionTimestep': 100.0, + 'TransportCarbon': 0.0, + 'TransportDistance': 0.0, + 'TransportEnergy': 0.0, + 'Category': 'Uncategorized', + 'Comments': '', + 'DataSource': None, + 'Name': 'A'} + """ + _id = data.pop("$id") + return cls(id=_id, **data, **kwargs) + + def __add__(self, other): + """Overload + to implement self.combine.""" + return self.combine(other) + + def __hash__(self): + """Return the hash value of self.""" + return hash((self.__class__.__name__, getattr(self, "Name", None))) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, GlazingMaterial): + return NotImplemented + else: + return all( + [ + self.Density == other.Density, + self.Conductivity == other.Conductivity, + self.SolarTransmittance == other.SolarTransmittance, + self.SolarReflectanceFront == other.SolarReflectanceFront, + self.SolarReflectanceBack == other.SolarReflectanceBack, + self.VisibleTransmittance == other.VisibleTransmittance, + self.VisibleReflectanceFront == other.VisibleReflectanceFront, + self.VisibleReflectanceBack == other.VisibleReflectanceBack, + self.IRTransmittance == other.IRTransmittance, + self.IREmissivityFront == other.IREmissivityFront, + self.IREmissivityBack == other.IREmissivityBack, + self.DirtFactor == other.DirtFactor, + self.Cost == other.Cost, + ] + ) + + def __copy__(self): + """Create a copy of self.""" + return self.__class__(**self.mapping()) diff --git a/archetypal/template/materials/material_base.py b/archetypal/template/materials/material_base.py new file mode 100644 index 00000000..fac24524 --- /dev/null +++ b/archetypal/template/materials/material_base.py @@ -0,0 +1,187 @@ +"""archetypal MaterialBase.""" + +import numpy as np +from validator_collection import validators + +from archetypal.template.umi_base import UmiBase + + +class MaterialBase(UmiBase): + """A class used to store data linked with the Life Cycle aspect of materials. + + For more information on the Life Cycle Analysis performed in UMI, see: + https://umidocs.readthedocs.io/en/latest/docs/life-cycle-introduction.html#life + -cycle-impact + """ + + __slots__ = ( + "_cost", + "_embodied_carbon", + "_embodied_energy", + "_substitution_timestep", + "_transport_carbon", + "_transport_distance", + "_transport_energy", + "_substitution_rate_pattern", + "_density", + ) + + def __init__( + self, + Name, + Cost=0, + EmbodiedCarbon=0, + EmbodiedEnergy=0, + SubstitutionTimestep=100, + TransportCarbon=0, + TransportDistance=0, + TransportEnergy=0, + SubstitutionRatePattern=None, + **kwargs, + ): + """Initialize a MaterialBase object with parameters. + + Args: + Name (str): Name of the Material. + Cost (float): The purchase cost of the material by volume ($/m3). + EmbodiedCarbon (float): Represents the GHG emissions through the + lifetime of the product (kgCO2/kg). + EmbodiedEnergy (float): Represents all fuel consumption ( Typically + from non-renewable sources) which happened through the lifetime + of a product (or building), expressed as primary energy (MJ/kg). + SubstitutionTimestep (float): The duration in years of a period of + replacement (e.g. There will be interventions in this material + type every 10 years). + TransportCarbon (float): The impacts associated with the transport + by km of distance and kg of material (kgCO2/kg/km). + TransportDistance (float): The average distance in km from the + manufacturing site to the building construction site + TransportEnergy (float): The impacts associated with the transport + by km of distance and kg of material (MJ/kg/km). + SubstitutionRatePattern (list-like): A ratio from 0 to 1 which + defines the amount of the material replaced at the end of each + period of replacement, :attr:`SubstitutionTimestep` (e.g. Every + 10 years this cladding will be completely replaced with ratio + 1). Notice that you can define different replacement ratios for + different consecutive periods, introducing them separated by + commas. For example, if you introduce the series “0.1 , 0.1 , 1” + after the first 10 years a 10% will be replaced, then after 20 + years another 10%, then after 30 years a 100%, and finally the + series would start again in year 40. + **kwargs: Keywords passed to the :class:`UmiBase` class. See + :class:`UmiBase` for more details. + """ + super(MaterialBase, self).__init__(Name, **kwargs) + self.Cost = Cost + self.EmbodiedCarbon = EmbodiedCarbon + self.EmbodiedEnergy = EmbodiedEnergy + self.SubstitutionRatePattern = SubstitutionRatePattern + self.SubstitutionTimestep = SubstitutionTimestep + self.TransportCarbon = TransportCarbon + self.TransportDistance = TransportDistance + self.TransportEnergy = TransportEnergy + + @property + def Cost(self): + """Get or set the cost of the material [$].""" + return self._cost + + @Cost.setter + def Cost(self, value): + self._cost = validators.float(value) + + @property + def EmbodiedCarbon(self): + """Get or set the embodied carbon of the material [kgCO2/kg].""" + return self._embodied_carbon + + @EmbodiedCarbon.setter + def EmbodiedCarbon(self, value): + self._embodied_carbon = validators.float(value) + + @property + def EmbodiedEnergy(self): + """Get or set the embodied energy of the material [MJ/kg].""" + return self._embodied_energy + + @EmbodiedEnergy.setter + def EmbodiedEnergy(self, value): + self._embodied_energy = validators.float(value) + + @property + def SubstitutionTimestep(self): + """Get or set the substitution timestep of the material.""" + return self._substitution_timestep + + @SubstitutionTimestep.setter + def SubstitutionTimestep(self, value): + self._substitution_timestep = validators.float(value, minimum=0) + + @property + def SubstitutionRatePattern(self): + """Get or set the substitution rate pattern of the material.""" + return self._substitution_rate_pattern + + @SubstitutionRatePattern.setter + def SubstitutionRatePattern(self, value): + if value is None: + value = [1.0] + elif isinstance(value, np.ndarray): + value = value.tolist() + self._substitution_rate_pattern = validators.iterable(value, allow_empty=True) + + @property + def TransportCarbon(self): + """Get or set the transportation carbon of the material [kgCO2/kg/km].""" + return self._transport_carbon + + @TransportCarbon.setter + def TransportCarbon(self, value): + self._transport_carbon = validators.float(value, minimum=0) + + @property + def TransportDistance(self): + """Get or set the transportation distance of the material [km].""" + return self._transport_distance + + @TransportDistance.setter + def TransportDistance(self, value): + self._transport_distance = validators.float(value, minimum=0) + + @property + def TransportEnergy(self): + """Get or set the transporation energy of the material [MJ/kg/km].""" + return self._transport_energy + + @TransportEnergy.setter + def TransportEnergy(self, value): + self._transport_energy = validators.float(value, minimum=0) + + def __hash__(self): + """Return the hash value of self.""" + return hash((self.__class__.__name__, getattr(self, "Name", None))) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, MaterialBase): + return NotImplemented + else: + return all( + [ + self.Cost == other.Cost, + self.EmbodiedCarbon == other.EmbodiedCarbon, + self.EmbodiedEnergy == other.EmbodiedEnergy, + self.SubstitutionTimestep == other.SubstitutionTimestep, + self.TransportCarbon == other.TransportCarbon, + self.TransportDistance == other.TransportDistance, + self.TransportEnergy == other.TransportEnergy, + np.array_equal( + self.SubstitutionRatePattern, other.SubstitutionRatePattern + ), + self.Density == other.Density, + ] + ) + + def validate(self): + """Validate object and fill in missing values.""" + return self diff --git a/archetypal/template/materials/material_layer.py b/archetypal/template/materials/material_layer.py new file mode 100644 index 00000000..6b691b87 --- /dev/null +++ b/archetypal/template/materials/material_layer.py @@ -0,0 +1,164 @@ +"""archetypal MaterialLayer.""" + +import collections +import logging as lg + +from sigfig import round +from validator_collection import validators + +from archetypal.utils import log + + +class MaterialLayer(object): + """Class used to define one layer in a construction assembly. + + This class has two attributes: + + 1. Material (:class:`OpaqueMaterial` or :class:`GlazingMaterial` or + :class:`GasMaterial`): the material object for this layer. + 2. Thickness (float): The thickness of the material in the layer. + """ + + __slots__ = ("_material", "_thickness") + + def __init__(self, Material, Thickness, **kwargs): + """Initialize a MaterialLayer object with parameters. + + Args: + Material (OpaqueMaterial, GlazingMaterial, GasMaterial): + Thickness (float): The thickness of the material in the + construction. + """ + self.Material = Material + self.Thickness = Thickness + + @property + def Material(self): + """Get or set the material of self.""" + return self._material + + @Material.setter + def Material(self, value): + from archetypal.template.materials import GlazingMaterial, OpaqueMaterial + + assert isinstance(value, (OpaqueMaterial, GlazingMaterial)), ( + f"Input value error for '{value}'. Value must be " + f"of type (OpaqueMaterial, GlazingMaterial), not {type(value)}" + ) + self._material = value + + @property + def Thickness(self): + """Get or set the material thickness [m].""" + return self._thickness + + @Thickness.setter + def Thickness(self, value): + self._thickness = value + if value < 0.003: + log( + "Modeling layer thinner (less) than 0.003 m (not recommended) for " + f"MaterialLayer '{self}'", + lg.WARNING, + ) + + @property + def resistivity(self): + """Get or set the resistivity of the material layer [m-K/W].""" + return 1 / self.Material.Conductivity + + @resistivity.setter + def resistivity(self, value): + self.Material.Conductivity = 1 / validators.float(value, minimum=0) + + @property + def r_value(self): + """Get or set the the R-value of the material layer [m2-K/W]. + + Note that, when setting the R-value, the thickness of the material will + be adjusted and the conductivity will remain fixed. + """ + return self.Thickness / self.Material.Conductivity + + @r_value.setter + def r_value(self, value): + self.Thickness = validators.float(value, minimum=0) * self.Material.Conductivity + + @property + def u_value(self): + """Get or set the heat transfer coefficient [W/(m2⋅K)].""" + return 1 / self.r_value + + @u_value.setter + def u_value(self, value): + self.r_value = 1 / validators.float(value, minimum=0) + + @property + def heat_capacity(self): + """Get the material layer's heat capacity [J/(m2-k)].""" + return self.Material.Density * self.Material.SpecificHeat * self.Thickness + + @property + def specific_heat(self): + """Get the material layer's specific heat [J/kg-K].""" + return self.Material.SpecificHeat + + def to_dict(self): + """Return MaterialLayer dictionary representation.""" + return collections.OrderedDict( + Material={"$ref": str(self.Material.id)}, + Thickness=round(self.Thickness, decimals=3), + ) + + def to_epbunch(self, idf): + """Convert self to an EpBunch given an IDF model. + + Notes: + The object is added to the idf model. + The thickness is passed to the epbunch. + + Args: + idf (IDF): An IDF model. + + Returns: + EpBunch: The EpBunch object added to the idf model. + """ + return self.Material.to_epbunch(idf, self.Thickness) + + def mapping(self): + """Get a dict based on the object properties, useful for dict repr.""" + return dict(Material=self.Material, Thickness=self.Thickness) + + def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" + return self + + def __hash__(self): + """Return the hash value of self.""" + return id(self) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, MaterialLayer): + return NotImplemented + else: + return all( + [self.Thickness == other.Thickness, self.Material == other.Material] + ) + + def __repr__(self): + """Return a representation of self.""" + return "{} with thickness of {:,.3f} m".format(self.Material, self.Thickness) + + def __iter__(self): + """Iterate over attributes. Yields tuple of (keys, value).""" + for k, v in self.mapping().items(): + yield k, v + + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def __copy__(self): + """Create a copy of self.""" + return self.__class__(self.Material, self.Thickness) diff --git a/archetypal/template/opaque_material.py b/archetypal/template/materials/nomass_material.py similarity index 56% rename from archetypal/template/opaque_material.py rename to archetypal/template/materials/nomass_material.py index 056aced9..7cffde2a 100644 --- a/archetypal/template/opaque_material.py +++ b/archetypal/template/materials/nomass_material.py @@ -1,60 +1,52 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal OpaqueMaterial.""" import collections import numpy as np from sigfig import round +from validator_collection import validators -from archetypal.template import UmiBase, UniqueName +from archetypal.template.materials.material_base import MaterialBase from archetypal.utils import log -class OpaqueMaterial(UmiBase): - """Use this component to create a custom opaque material. +class NoMassMaterial(MaterialBase): + """Use this component to create a custom no mass material.""" - .. image:: ../images/template/materials-opaque.png - """ + _ROUGHNESS_TYPES = ( + "VeryRough", + "Rough", + "MediumRough", + "MediumSmooth", + "Smooth", + "VerySmooth", + ) + + __slots__ = ( + "_roughness", + "_solar_absorptance", + "_thermal_emittance", + "_visible_absorptance", + "_moisture_diffusion_resistance", + "_r_value", + ) def __init__( self, Name, - Conductivity, - SpecificHeat, + RValue, SolarAbsorptance=0.7, ThermalEmittance=0.9, VisibleAbsorptance=0.7, Roughness="Rough", - Cost=0, - Density=1, MoistureDiffusionResistance=50, - EmbodiedCarbon=0.45, - EmbodiedEnergy=0, - TransportCarbon=0, - TransportDistance=0, - TransportEnergy=0, - SubstitutionRatePattern=None, - SubstitutionTimestep=20, **kwargs, ): - """A custom opaque material. + """Initialize an opaque material. Args: Name (str): The name of the material. - Conductivity (float): A number representing the conductivity of the - material in W/m-K. This is essentially the heat flow in Watts - across one meter thick of the material when the temperature - difference on either side is 1 Kelvin. Modeling layers with - conductivity higher than 5.0 W/(m-K) is not recommended. - SpecificHeat (float): A number representing the specific heat - capacity of the material in J/kg-K. This is essentially the - number of joules needed to raise one kg of the material by 1 - degree Kelvin. Only values of specific heat of 100 or larger are - allowed. Typical ranges are from 800 to 2000 J/(kg-K). + RValue (float): Number for the R-value of the material [m2-K/W]. SolarAbsorptance (float): An number between 0 and 1 that represents the absorptance of solar radiation by the material. The default is set to 0.7, which is common for most non-metallic materials. @@ -71,117 +63,84 @@ def __init__( material. This can be either "VeryRough", "Rough", "MediumRough", "MediumSmooth", "Smooth", and "VerySmooth". The default is set to "Rough". - Cost: # todo: define parameter - Density (float): A number representing the density of the material - in kg/m3. This is essentially the mass of one cubic meter of the - material. - MoistureDiffusionResistance: # todo: defined parameter - EmbodiedCarbon: # todo: define parameter - EmbodiedEnergy: # todo: define parameter - TransportCarbon: # todo: define parameter - TransportDistance: # todo: define parameter - TransportEnergy: # todo: define parameter - SubstitutionRatePattern: # todo: define parameter - SubstitutionTimestep: # todo: define parameter - **kwargs: + MoistureDiffusionResistance (float): the factor by which the vapor + diffusion in the material is impeded, as compared to diffusion in + stagnant air [%]. + **kwargs: keywords passed to parent constructors. """ - super(OpaqueMaterial, self).__init__(Name, **kwargs) - - if SubstitutionRatePattern is None: - SubstitutionRatePattern = [0.5, 1] - self.Conductivity = Conductivity + super(NoMassMaterial, self).__init__(Name, **kwargs) + self.r_value = RValue self.Roughness = Roughness self.SolarAbsorptance = SolarAbsorptance - self.SpecificHeat = SpecificHeat self.ThermalEmittance = ThermalEmittance self.VisibleAbsorptance = VisibleAbsorptance - self.TransportCarbon = TransportCarbon - self.TransportDistance = TransportDistance - self.TransportEnergy = TransportEnergy - self.SubstitutionRatePattern = SubstitutionRatePattern - self.SubstitutionTimestep = SubstitutionTimestep - self.Cost = Cost - self.Density = Density - self.EmbodiedCarbon = EmbodiedCarbon - self.EmbodiedEnergy = EmbodiedEnergy self.MoistureDiffusionResistance = MoistureDiffusionResistance @property - def ThermalEmittance(self): - return float(self._thermal_emittance) + def r_value(self): + """Get or set the thermal resistance [m2-K/W].""" + return self._r_value - @ThermalEmittance.setter - def ThermalEmittance(self, value): - try: - value = float(value) - except ValueError: - value = 0.9 # Use default - finally: - if 9.9999e-6 < value <= 1: - self._thermal_emittance = value - else: - raise ValueError( - f"Out of range value Numeric Field (ThermalEmittance), " - f"value={value}, " - "range={>9.9999E-6 and <=1}, " - f"in MATERIAL={self.Name}" - ) + @r_value.setter + def r_value(self, value): + self._r_value = validators.float(value, minimum=0) - def __add__(self, other): - """Overload + to implement self.combine. + @property + def Roughness(self): + """Get or set the roughness of the material. - Args: - other (OpaqueMaterial): + Hint: + choices are: "VeryRough", "Rough", "MediumRough", "MediumSmooth", "Smooth", + "VerySmooth". """ - return self.combine(other) + return self._roughness - def __hash__(self): - return hash((self.__class__.__name__, getattr(self, "Name", None))) + @Roughness.setter + def Roughness(self, value): + assert value in self._ROUGHNESS_TYPES, ( + f"Invalid value '{value}' for material roughness. Roughness must be one " + f"of the following:\n{self._ROUGHNESS_TYPES}" + ) + self._roughness = value - def __eq__(self, other): - if not isinstance(other, OpaqueMaterial): - return NotImplemented - else: - return all( - [ - self.Conductivity == other.Conductivity, - self.SpecificHeat == other.SpecificHeat, - self.SolarAbsorptance == other.SolarAbsorptance, - self.ThermalEmittance == other.ThermalEmittance, - self.VisibleAbsorptance == other.VisibleAbsorptance, - self.Roughness == other.Roughness, - self.Cost == other.Cost, - self.Density == other.Density, - self.MoistureDiffusionResistance - == self.MoistureDiffusionResistance, - self.EmbodiedCarbon == other.EmbodiedCarbon, - self.EmbodiedEnergy == other.EmbodiedEnergy, - self.TransportCarbon == other.TransportCarbon, - self.TransportDistance == other.TransportDistance, - self.TransportEnergy == other.TransportEnergy, - np.array_equal( - self.SubstitutionRatePattern, other.SubstitutionRatePattern - ), - self.SubstitutionTimestep == other.SubstitutionTimestep, - ] - ) + @property + def SolarAbsorptance(self): + """Get or set the solar absorptance of the material [-].""" + return self._solar_absorptance - @classmethod - def generic(cls, idf=None): - """generic plaster board""" - return cls( - Conductivity=0.16, - SpecificHeat=1090, - Density=800, - Name="GP01 GYPSUM", - Roughness="Smooth", - SolarAbsorptance=0.7, - ThermalEmittance=0.9, - VisibleAbsorptance=0.5, - DataSource="ASHRAE 90.1-2007", - idf=idf, + @SolarAbsorptance.setter + def SolarAbsorptance(self, value): + self._solar_absorptance = validators.float(value, minimum=0, maximum=1) + + @property + def ThermalEmittance(self): + """Get or set the thermal emittance of the material [-].""" + return self._thermal_emittance + + @ThermalEmittance.setter + def ThermalEmittance(self, value): + self._thermal_emittance = validators.float(value, minimum=0, maximum=1) + + @property + def VisibleAbsorptance(self): + """Get or set the visible absorptance of the material [-].""" + return self._visible_absorptance + + @VisibleAbsorptance.setter + def VisibleAbsorptance(self, value): + self._visible_absorptance = validators.float( + value, minimum=0, maximum=1, allow_empty=True ) + @property + def MoistureDiffusionResistance(self): + """Get or set the vapor resistance factor of the material [%].""" + return self._moisture_diffusion_resistance + + @MoistureDiffusionResistance.setter + def MoistureDiffusionResistance(self, value): + self._moisture_diffusion_resistance = validators.float(value, minimum=0) + def combine(self, other, weights=None, allow_duplicates=False): """Combine two OpaqueMaterial objects. @@ -215,37 +174,34 @@ def combine(self, other, weights=None, allow_duplicates=False): weights = [self.Density, other.Density] meta = self._get_predecessors_meta(other) - new_obj = OpaqueMaterial( + new_obj = NoMassMaterial( **meta, - Conductivity=self._float_mean(other, "Conductivity", weights), Roughness=self._str_mean(other, attr="Roughness", append=False), - SolarAbsorptance=self._float_mean(other, "SolarAbsorptance", weights), - SpecificHeat=self._float_mean(other, "SpecificHeat"), - ThermalEmittance=self._float_mean(other, "ThermalEmittance", weights), - VisibleAbsorptance=self._float_mean(other, "VisibleAbsorptance", weights), - TransportCarbon=self._float_mean(other, "TransportCarbon", weights), - TransportDistance=self._float_mean(other, "TransportDistance", weights), - TransportEnergy=self._float_mean(other, "TransportEnergy", weights), - SubstitutionRatePattern=self._float_mean( + SolarAbsorptance=self.float_mean(other, "SolarAbsorptance", weights), + r_value=self.float_mean(other, "r_value", weights), + ThermalEmittance=self.float_mean(other, "ThermalEmittance", weights), + VisibleAbsorptance=self.float_mean(other, "VisibleAbsorptance", weights), + TransportCarbon=self.float_mean(other, "TransportCarbon", weights), + TransportDistance=self.float_mean(other, "TransportDistance", weights), + TransportEnergy=self.float_mean(other, "TransportEnergy", weights), + SubstitutionRatePattern=self.float_mean( other, "SubstitutionRatePattern", weights=None ), - SubstitutionTimestep=self._float_mean( + SubstitutionTimestep=self.float_mean( other, "SubstitutionTimestep", weights ), - Cost=self._float_mean(other, "Cost", weights), - Density=self._float_mean(other, "Density", weights), - EmbodiedCarbon=self._float_mean(other, "EmbodiedCarbon", weights), - EmbodiedEnergy=self._float_mean(other, "EmbodiedEnergy", weights), - MoistureDiffusionResistance=self._float_mean( + Cost=self.float_mean(other, "Cost", weights), + EmbodiedCarbon=self.float_mean(other, "EmbodiedCarbon", weights), + EmbodiedEnergy=self.float_mean(other, "EmbodiedEnergy", weights), + MoistureDiffusionResistance=self.float_mean( other, "MoistureDiffusionResistance", weights ), - idf=self.idf, ) new_obj.predecessors.update(self.predecessors + other.predecessors) return new_obj - def to_json(self): - """Convert class properties to dict""" + def to_dict(self): + """Return OpaqueMaterial dictionary representation.""" self.validate() # Validate object before trying to get json format data_dict = collections.OrderedDict() @@ -254,12 +210,10 @@ def to_json(self): data_dict["MoistureDiffusionResistance"] = self.MoistureDiffusionResistance data_dict["Roughness"] = self.Roughness data_dict["SolarAbsorptance"] = round(self.SolarAbsorptance, 2) - data_dict["SpecificHeat"] = round(self.SpecificHeat, 4) data_dict["ThermalEmittance"] = round(self.ThermalEmittance, 2) data_dict["VisibleAbsorptance"] = round(self.VisibleAbsorptance, 2) - data_dict["Conductivity"] = round(self.Conductivity, 3) + data_dict["RValue"] = round(self.r_value, 3) data_dict["Cost"] = self.Cost - data_dict["Density"] = round(self.Density, 4) data_dict["EmbodiedCarbon"] = self.EmbodiedCarbon data_dict["EmbodiedEnergy"] = self.EmbodiedEnergy data_dict["SubstitutionRatePattern"] = self.SubstitutionRatePattern @@ -268,16 +222,53 @@ def to_json(self): data_dict["TransportDistance"] = self.TransportDistance data_dict["TransportEnergy"] = self.TransportEnergy data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict + @classmethod + def from_dict(cls, data, **kwargs): + """Create an NoMassMaterial from a dictionary. + + Args: + data (dict): The python dictionary. + **kwargs: keywords passed to MaterialBase constructor. + + .. code-block:: python + + { + "$id": "140532076832464", + "Name": "R13LAYER", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.75, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.75, + "RValue": 2.29, + "Cost": 0.0, + "EmbodiedCarbon": 0.0, + "EmbodiedEnergy": 0.0, + "SubstitutionRatePattern": [1.0], + "SubstitutionTimestep": 100.0, + "TransportCarbon": 0.0, + "TransportDistance": 0.0, + "TransportEnergy": 0.0, + "Category": "Uncategorized", + "Comments": "", + "DataSource": None, + } + """ + _id = data.pop("$id") + return cls(id=_id, **data, **kwargs) + @classmethod def from_epbunch(cls, epbunch, **kwargs): - """Create an OpaqueMaterial from an IDF "Material", "Material:NoMAss", - or "Material:AirGap" element. + """Create a NoMassMaterial from an EpBunch. + + Note that "Material", "Material:NoMAss" and "Material:AirGap" objects are + supported. Hint: (From EnergyPlus Manual): When a user enters such a “no mass” @@ -299,50 +290,29 @@ def from_epbunch(cls, epbunch, **kwargs): **kwargs: """ if epbunch.key.upper() == "MATERIAL": - # do MATERIAL - Name = epbunch.Name - Conductivity = epbunch.Conductivity - Density = epbunch.Density - Roughness = epbunch.Roughness - SolarAbsorptance = epbunch.Solar_Absorptance - SpecificHeat = epbunch.Specific_Heat - ThermalEmittance = epbunch.Thermal_Absorptance - VisibleAbsorptance = epbunch.Visible_Absorptance - Thickness = epbunch.Thickness return cls( - Conductivity=Conductivity, - Density=Density, - Roughness=Roughness, - SolarAbsorptance=SolarAbsorptance, - SpecificHeat=SpecificHeat, - ThermalEmittance=ThermalEmittance, - VisibleAbsorptance=VisibleAbsorptance, - Thickness=Thickness, - Name=Name, + Conductivity=epbunch.Conductivity, + Density=epbunch.Density, + Roughness=epbunch.Roughness, + SolarAbsorptance=epbunch.Solar_Absorptance, + SpecificHeat=epbunch.Specific_Heat, + ThermalEmittance=epbunch.Thermal_Absorptance, + VisibleAbsorptance=epbunch.Visible_Absorptance, + Name=epbunch.Name, idf=epbunch.theidf, **kwargs, ) elif epbunch.key.upper() == "MATERIAL:NOMASS": - # do MATERIAL:NOMASS. Assume properties of air. - Name = epbunch.Name - Conductivity = 0.02436 # W/mK, dry air at 0 °C and 100 kPa. - Density = 1.2754 # dry air at 0 °C and 100 kPa. - SpecificHeat = 100.5 # J/kg-K, dry air at 0 °C and 100 kPa. - Thickness = Conductivity * epbunch.Thermal_Resistance - Roughness = epbunch.Roughness - SolarAbsorptance = epbunch.Solar_Absorptance - ThermalEmittance = epbunch.Thermal_Absorptance - VisibleAbsorptance = epbunch.Visible_Absorptance + # Assume properties of air. return cls( - Conductivity=Conductivity, - Density=Density, - Roughness=Roughness, - SolarAbsorptance=SolarAbsorptance, - SpecificHeat=SpecificHeat, - ThermalEmittance=ThermalEmittance, - VisibleAbsorptance=VisibleAbsorptance, - Thickness=Thickness, - Name=Name, + Conductivity=0.02436, # W/mK, dry air at 0 °C and 100 kPa + Density=1.2754, # dry air at 0 °C and 100 kPa. + Roughness=epbunch.Roughness, + SolarAbsorptance=epbunch.Solar_Absorptance, + SpecificHeat=100.5, # J/kg-K, dry air at 0 °C and 100 kPa + ThermalEmittance=epbunch.Thermal_Absorptance, + VisibleAbsorptance=epbunch.Visible_Absorptance, + Name=epbunch.Name, idf=epbunch.theidf, **kwargs, ) @@ -405,13 +375,32 @@ def from_epbunch(cls, epbunch, **kwargs): "authors".format(epbunch.Name, epbunch.key) ) - def validate(self): - """Validate object and fill in missing values.""" + def to_epbunch(self, idf): + """Convert self to an epbunch given an IDF model. - # Some OpaqueMaterial don't have a default value, therefore an empty string is - # parsed. This breaks the UmiTemplate Editor, therefore we set a value on these - # attributes (if necessary) in this validation step. + Args: + idf (IDF): An IDF model. + Returns: + EpBunch: The EpBunch object added to the idf model. + """ + return idf.newidfobject( + "MATERIAL:NOMASS", + Roughness=self.Roughness, + Thermal_Resistance=self.r_value, + Thermal_Absorptance=self.ThermalEmittance, + Solar_Absorptance=self.SolarAbsorptance, + Visible_Absorptance=self.VisibleAbsorptance, + ) + + def validate(self): + """Validate object and fill in missing values. + + Hint: + Some OpaqueMaterial don't have a default value, therefore an empty string + is parsed. This breaks the UmiTemplate Editor, therefore we set a value + on these attributes (if necessary) in this validation step. + """ if getattr(self, "SolarAbsorptance") == "": setattr(self, "SolarAbsorptance", 0.7) if getattr(self, "ThermalEmittance") == "": @@ -420,19 +409,24 @@ def validate(self): setattr(self, "VisibleAbsorptance", 0.7) return self - def mapping(self): - self.validate() + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() return dict( + RValue=self.r_value, MoistureDiffusionResistance=self.MoistureDiffusionResistance, Roughness=self.Roughness, SolarAbsorptance=self.SolarAbsorptance, - SpecificHeat=self.SpecificHeat, ThermalEmittance=self.ThermalEmittance, VisibleAbsorptance=self.VisibleAbsorptance, - Conductivity=self.Conductivity, Cost=self.Cost, - Density=self.Density, EmbodiedCarbon=self.EmbodiedCarbon, EmbodiedEnergy=self.EmbodiedEnergy, SubstitutionRatePattern=self.SubstitutionRatePattern, @@ -446,19 +440,50 @@ def mapping(self): Name=self.Name, ) - def get_ref(self, ref): - """Get item matching reference id. + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def __add__(self, other): + """Overload + to implement self.combine. Args: - ref: + other (OpaqueMaterial): """ - return next( - iter( + return self.combine(other) + + def __hash__(self): + """Return the hash value of self.""" + return hash((self.__class__.__name__, getattr(self, "Name", None))) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, NoMassMaterial): + return NotImplemented + else: + return all( [ - value - for value in OpaqueMaterial.CREATED_OBJECTS - if value.id == ref["$ref"] + self.r_value == other.r_value, + self.SolarAbsorptance == other.SolarAbsorptance, + self.ThermalEmittance == other.ThermalEmittance, + self.VisibleAbsorptance == other.VisibleAbsorptance, + self.Roughness == other.Roughness, + self.Cost == other.Cost, + self.MoistureDiffusionResistance + == self.MoistureDiffusionResistance, + self.EmbodiedCarbon == other.EmbodiedCarbon, + self.EmbodiedEnergy == other.EmbodiedEnergy, + self.TransportCarbon == other.TransportCarbon, + self.TransportDistance == other.TransportDistance, + self.TransportEnergy == other.TransportEnergy, + np.array_equal( + self.SubstitutionRatePattern, other.SubstitutionRatePattern + ), + self.SubstitutionTimestep == other.SubstitutionTimestep, ] - ), - None, - ) + ) + + def __copy__(self): + """Create a copy of self.""" + new_om = self.__class__(**self.mapping()) + return new_om diff --git a/archetypal/template/materials/opaque_material.py b/archetypal/template/materials/opaque_material.py new file mode 100644 index 00000000..916effa1 --- /dev/null +++ b/archetypal/template/materials/opaque_material.py @@ -0,0 +1,579 @@ +"""archetypal OpaqueMaterial.""" + +import collections + +from eppy.bunch_subclass import EpBunch +from validator_collection import validators + +from archetypal.template.materials import GasMaterial +from archetypal.template.materials.material_base import MaterialBase +from archetypal.utils import log + + +class OpaqueMaterial(MaterialBase): + """Use this component to create a custom opaque material. + + .. image:: ../images/template/materials-opaque.png + """ + + _ROUGHNESS_TYPES = ( + "VeryRough", + "Rough", + "MediumRough", + "MediumSmooth", + "Smooth", + "VerySmooth", + ) + + __slots__ = ( + "_roughness", + "_solar_absorptance", + "_specific_heat", + "_thermal_emittance", + "_visible_absorptance", + "_moisture_diffusion_resistance", + "_conductivity", + "_density", + ) + + def __init__( + self, + Name, + Conductivity, + SpecificHeat, + SolarAbsorptance=0.7, + ThermalEmittance=0.9, + VisibleAbsorptance=0.7, + Roughness="Rough", + Cost=0, + Density=1, + MoistureDiffusionResistance=50, + EmbodiedCarbon=0.45, + EmbodiedEnergy=0, + TransportCarbon=0, + TransportDistance=0, + TransportEnergy=0, + SubstitutionRatePattern=None, + SubstitutionTimestep=20, + **kwargs, + ): + """Initialize an opaque material. + + Args: + Name (str): The name of the material. + Conductivity (float): A number representing the conductivity of the + material in W/m-K. This is essentially the heat flow in Watts + across one meter thick of the material when the temperature + difference on either side is 1 Kelvin. Modeling layers with + conductivity higher than 5.0 W/(m-K) is not recommended. + SpecificHeat (float): A number representing the specific heat + capacity of the material in J/kg-K. This is essentially the + number of joules needed to raise one kg of the material by 1 + degree Kelvin. Only values of specific heat of 100 or larger are + allowed. Typical ranges are from 800 to 2000 J/(kg-K). + SolarAbsorptance (float): An number between 0 and 1 that represents + the absorptance of solar radiation by the material. The default + is set to 0.7, which is common for most non-metallic materials. + ThermalEmittance (float): An number between 0 and 1 that represents + the thermal absorptance of the material. The default is set to + 0.9, which is common for most non-metallic materials. For long + wavelength radiant exchange, thermal emissivity and thermal + emittance are equal to thermal absorptance. + VisibleAbsorptance (float): An number between 0 and 1 that + represents the absorptance of visible light by the material. + The default is set to 0.7, which is common for most non-metallic + materials. + Roughness (str): A text value that indicated the roughness of your + material. This can be either "VeryRough", "Rough", + "MediumRough", "MediumSmooth", "Smooth", and "VerySmooth". The + default is set to "Rough". + Density (float): A number representing the density of the material + in kg/m3. This is essentially the mass of one cubic meter of the + material. + MoistureDiffusionResistance (float): the factor by which the vapor + diffusion in the material is impeded, as compared to diffusion in + stagnant air [%]. + **kwargs: keywords passed to parent constructors. + """ + super(OpaqueMaterial, self).__init__( + Name, + Cost=Cost, + EmbodiedCarbon=EmbodiedCarbon, + EmbodiedEnergy=EmbodiedEnergy, + SubstitutionTimestep=SubstitutionTimestep, + TransportCarbon=TransportCarbon, + TransportDistance=TransportDistance, + TransportEnergy=TransportEnergy, + SubstitutionRatePattern=SubstitutionRatePattern, + **kwargs, + ) + + self.Conductivity = Conductivity + self.Density = Density + self.Roughness = Roughness + self.SolarAbsorptance = SolarAbsorptance + self.SpecificHeat = SpecificHeat + self.ThermalEmittance = ThermalEmittance + self.VisibleAbsorptance = VisibleAbsorptance + self.MoistureDiffusionResistance = MoistureDiffusionResistance + + @property + def Conductivity(self): + """Get or set the conductivity of the material [W/m-K].""" + return self._conductivity + + @Conductivity.setter + def Conductivity(self, value): + self._conductivity = validators.float(value, minimum=0) + + @property + def Density(self): + """Get or set the density of the material [J/kg-K].""" + return self._density + + @Density.setter + def Density(self, value): + self._density = validators.float(value, minimum=0) + + @property + def Roughness(self): + """Get or set the roughness of the material. + + Hint: + choices are: "VeryRough", "Rough", "MediumRough", "MediumSmooth", "Smooth", + "VerySmooth". + """ + return self._roughness + + @Roughness.setter + def Roughness(self, value): + assert value in self._ROUGHNESS_TYPES, ( + f"Invalid value '{value}' for material roughness. Roughness must be one " + f"of the following:\n{self._ROUGHNESS_TYPES}" + ) + self._roughness = value + + @property + def SolarAbsorptance(self): + """Get or set the solar absorptance of the material [-].""" + return self._solar_absorptance + + @SolarAbsorptance.setter + def SolarAbsorptance(self, value): + self._solar_absorptance = validators.float(value, minimum=0, maximum=1) + + @property + def SpecificHeat(self): + """Get or set the specific heat of the material [J/(kg-K)].""" + return self._specific_heat + + @SpecificHeat.setter + def SpecificHeat(self, value): + self._specific_heat = validators.float(value, minimum=100) + + @property + def ThermalEmittance(self): + """Get or set the thermal emittance of the material [-].""" + return self._thermal_emittance + + @ThermalEmittance.setter + def ThermalEmittance(self, value): + self._thermal_emittance = validators.float(value, minimum=0, maximum=1) + + @property + def VisibleAbsorptance(self): + """Get or set the visible absorptance of the material [-].""" + return self._visible_absorptance + + @VisibleAbsorptance.setter + def VisibleAbsorptance(self, value): + self._visible_absorptance = validators.float( + value, minimum=0, maximum=1, allow_empty=True + ) + + @property + def MoistureDiffusionResistance(self): + """Get or set the vapor resistance factor of the material [%].""" + return self._moisture_diffusion_resistance + + @MoistureDiffusionResistance.setter + def MoistureDiffusionResistance(self, value): + self._moisture_diffusion_resistance = validators.float(value, minimum=0) + + @classmethod + def generic(cls, **kwargs): + """Return a generic material based on properties of plaster board. + + Args: + **kwargs: keywords passed to UmiBase constructor. + """ + return cls( + Conductivity=0.16, + SpecificHeat=1090, + Density=800, + Name="GP01 GYPSUM", + Roughness="Smooth", + SolarAbsorptance=0.7, + ThermalEmittance=0.9, + VisibleAbsorptance=0.5, + DataSource="ASHRAE 90.1-2007", + MoistureDiffusionResistance=8.3, + **kwargs, + ) + + def combine(self, other, weights=None, allow_duplicates=False): + """Combine two OpaqueMaterial objects. + + Args: + weights (list-like, optional): A list-like object of len 2. If None, + the density of the OpaqueMaterial of each objects is used as + a weighting factor. + other (OpaqueMaterial): The other OpaqueMaterial object the + combine with. + + Returns: + OpaqueMaterial: A new combined object made of self + other. + """ + # Check if other is the same type as self + if not isinstance(other, self.__class__): + msg = "Cannot combine %s with %s" % ( + self.__class__.__name__, + other.__class__.__name__, + ) + raise NotImplementedError(msg) + + # Check if other is not the same as self + if self == other: + return self + + if not weights: + log( + 'using OpaqueMaterial density as weighting factor in "{}" ' + "combine.".format(self.__class__.__name__) + ) + weights = [self.Density, other.Density] + + meta = self._get_predecessors_meta(other) + new_obj = OpaqueMaterial( + **meta, + Conductivity=self.float_mean(other, "Conductivity", weights), + Roughness=self._str_mean(other, attr="Roughness", append=False), + SolarAbsorptance=self.float_mean(other, "SolarAbsorptance", weights), + SpecificHeat=self.float_mean(other, "SpecificHeat"), + ThermalEmittance=self.float_mean(other, "ThermalEmittance", weights), + VisibleAbsorptance=self.float_mean(other, "VisibleAbsorptance", weights), + TransportCarbon=self.float_mean(other, "TransportCarbon", weights), + TransportDistance=self.float_mean(other, "TransportDistance", weights), + TransportEnergy=self.float_mean(other, "TransportEnergy", weights), + SubstitutionRatePattern=self.float_mean( + other, "SubstitutionRatePattern", weights=None + ), + SubstitutionTimestep=self.float_mean( + other, "SubstitutionTimestep", weights + ), + Cost=self.float_mean(other, "Cost", weights), + Density=self.float_mean(other, "Density", weights), + EmbodiedCarbon=self.float_mean(other, "EmbodiedCarbon", weights), + EmbodiedEnergy=self.float_mean(other, "EmbodiedEnergy", weights), + MoistureDiffusionResistance=self.float_mean( + other, "MoistureDiffusionResistance", weights + ), + ) + new_obj.predecessors.update(self.predecessors + other.predecessors) + return new_obj + + def to_ref(self): + """Return a ref pointer to self.""" + pass + + def to_dict(self): + """Return OpaqueMaterial dictionary representation.""" + self.validate() # Validate object before trying to get json format + + data_dict = collections.OrderedDict() + + data_dict["$id"] = str(self.id) + data_dict["MoistureDiffusionResistance"] = self.MoistureDiffusionResistance + data_dict["Roughness"] = self.Roughness + data_dict["SolarAbsorptance"] = self.SolarAbsorptance + data_dict["SpecificHeat"] = self.SpecificHeat + data_dict["ThermalEmittance"] = self.ThermalEmittance + data_dict["VisibleAbsorptance"] = self.VisibleAbsorptance + data_dict["Conductivity"] = self.Conductivity + data_dict["Cost"] = self.Cost + data_dict["Density"] = self.Density + data_dict["EmbodiedCarbon"] = self.EmbodiedCarbon + data_dict["EmbodiedEnergy"] = self.EmbodiedEnergy + data_dict["SubstitutionRatePattern"] = self.SubstitutionRatePattern + data_dict["SubstitutionTimestep"] = self.SubstitutionTimestep + data_dict["TransportCarbon"] = self.TransportCarbon + data_dict["TransportDistance"] = self.TransportDistance + data_dict["TransportEnergy"] = self.TransportEnergy + data_dict["Category"] = self.Category + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) + data_dict["DataSource"] = self.DataSource + data_dict["Name"] = self.Name + + return data_dict + + @classmethod + def from_dict(cls, data, **kwargs): + """Create an OpaqueMaterial from a dictionary. + + Args: + data (dict): The python dictionary. + **kwargs: keywords passed to MaterialBase constructor. + + .. code-block:: python + + { + "$id": "1", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.7, + "SpecificHeat": 920.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.7, + "Conductivity": 0.85, + "Cost": 0.0, + "Density": 2000, + "EmbodiedCarbon": 0.45, + "EmbodiedEnergy": 0.0, + "SubstitutionRatePattern": [ + 1.0 + ], + "SubstitutionTimestep": 20.0, + "TransportCarbon": 0.0, + "TransportDistance": 0.0, + "TransportEnergy": 0.0, + "Category": "Uncategorized", + "Comments": "", + "DataSource": null, + "Name": "Concrete" + } + """ + _id = data.pop("$id") + return cls(id=_id, **data, **kwargs) + + @classmethod + def from_epbunch(cls, epbunch, **kwargs): + """Create an OpaqueMaterial from an EpBunch. + + Note that "Material", "Material:NoMAss" and "Material:AirGap" objects are + supported. + + Hint: + (From EnergyPlus Manual): When a user enters such a “no mass” + material into EnergyPlus, internally the properties of this layer + are converted to approximate the properties of air (density, + specific heat, and conductivity) with the thickness adjusted to + maintain the user’s desired R-Value. This allowed such layers to be + handled internally in the same way as other layers without any + additional changes to the code. This solution was deemed accurate + enough as air has very little thermal mass and it made the coding of + the state space method simpler. + + For Material:AirGap, a similar strategy is used, with the + exception that solar properties (solar and visible absorptance and + emittance) are assumed null. + + Args: + epbunch (EpBunch): EP-Construction object + **kwargs: + """ + if epbunch.key.upper() == "MATERIAL": + return cls( + Conductivity=epbunch.Conductivity, + Density=epbunch.Density, + Roughness=epbunch.Roughness, + SolarAbsorptance=epbunch.Solar_Absorptance, + SpecificHeat=epbunch.Specific_Heat, + ThermalEmittance=epbunch.Thermal_Absorptance, + VisibleAbsorptance=epbunch.Visible_Absorptance, + Name=epbunch.Name, + **kwargs, + ) + elif epbunch.key.upper() == "MATERIAL:NOMASS": + # Assume properties of air. + return cls( + Conductivity=0.02436, # W/mK, dry air at 0 °C and 100 kPa + Density=1.2754, # dry air at 0 °C and 100 kPa. + Roughness=epbunch.Roughness, + SolarAbsorptance=epbunch.Solar_Absorptance, + SpecificHeat=100.5, # J/kg-K, dry air at 0 °C and 100 kPa + ThermalEmittance=epbunch.Thermal_Absorptance, + VisibleAbsorptance=epbunch.Visible_Absorptance, + Name=epbunch.Name, + **kwargs, + ) + elif epbunch.key.upper() == "MATERIAL:AIRGAP": + gas_prop = { + obj.Name.upper(): obj.mapping() + for obj in [GasMaterial(gas_name) for gas_name in GasMaterial._GASTYPES] + } + for gasname, properties in gas_prop.items(): + if gasname.lower() in epbunch.Name.lower(): + thickness = properties["Conductivity"] * epbunch.Thermal_Resistance + properties.pop("Name") + return cls( + Name=epbunch.Name, + Thickness=thickness, + SpecificHeat=100.5, + **properties, + ) + else: + thickness = ( + gas_prop["AIR"]["Conductivity"] * epbunch.Thermal_Resistance + ) + properties.pop("Name") + return cls( + Name=epbunch.Name, + Thickness=thickness, + SpecificHeat=100.5, + **gas_prop["AIR"], + ) + else: + raise NotImplementedError( + "Material '{}' of type '{}' is not yet " + "supported. Please contact package " + "authors".format(epbunch.Name, epbunch.key) + ) + + def to_epbunch(self, idf, thickness) -> EpBunch: + """Convert self to an EpBunch given an idf model and a thickness. + + Args: + idf (IDF): An IDF model. + thickness (float): the thickness of the material. + + .. code-block:: python + + MATERIAL, + , !- Name + , !- Roughness + , !- Thickness + , !- Conductivity + , !- Density + , !- Specific Heat + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + + Returns: + EpBunch: The EpBunch object added to the idf model. + """ + return idf.newidfobject( + "MATERIAL", + Name=self.Name, + Roughness=self.Roughness, + Thickness=thickness, + Conductivity=self.Conductivity, + Density=self.Density, + Specific_Heat=self.SpecificHeat, + Thermal_Absorptance=self.ThermalEmittance, + Solar_Absorptance=self.SolarAbsorptance, + Visible_Absorptance=self.VisibleAbsorptance, + ) + + def validate(self): + """Validate object and fill in missing values. + + Hint: + Some OpaqueMaterial don't have a default value, therefore an empty string + is parsed. This breaks the UmiTemplate Editor, therefore we set a value + on these attributes (if necessary) in this validation step. + """ + if getattr(self, "SolarAbsorptance") == "": + setattr(self, "SolarAbsorptance", 0.7) + if getattr(self, "ThermalEmittance") == "": + setattr(self, "ThermalEmittance", 0.9) + if getattr(self, "VisibleAbsorptance") == "": + setattr(self, "VisibleAbsorptance", 0.7) + return self + + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() + + return dict( + MoistureDiffusionResistance=self.MoistureDiffusionResistance, + Roughness=self.Roughness, + SolarAbsorptance=self.SolarAbsorptance, + SpecificHeat=self.SpecificHeat, + ThermalEmittance=self.ThermalEmittance, + VisibleAbsorptance=self.VisibleAbsorptance, + Conductivity=self.Conductivity, + Cost=self.Cost, + Density=self.Density, + EmbodiedCarbon=self.EmbodiedCarbon, + EmbodiedEnergy=self.EmbodiedEnergy, + SubstitutionRatePattern=self.SubstitutionRatePattern, + SubstitutionTimestep=self.SubstitutionTimestep, + TransportCarbon=self.TransportCarbon, + TransportDistance=self.TransportDistance, + TransportEnergy=self.TransportEnergy, + Category=self.Category, + Comments=self.Comments, + DataSource=self.DataSource, + Name=self.Name, + ) + + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def __add__(self, other): + """Overload + to implement self.combine. + + Args: + other (OpaqueMaterial): + """ + return self.combine(other) + + def __hash__(self): + """Return the hash value of self.""" + return hash( + ( + self.__class__.__name__, + getattr(self, "Name", None), + ) + ) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, OpaqueMaterial): + return NotImplemented + else: + return self.__key__() == other.__key__() + + def __key__(self): + """Get a tuple of attributes. Useful for hashing and comparing.""" + return ( + self.Conductivity, + self.SpecificHeat, + self.SolarAbsorptance, + self.ThermalEmittance, + self.VisibleAbsorptance, + self.Roughness, + self.Cost, + self.Density, + self.MoistureDiffusionResistance, + self.EmbodiedCarbon, + self.EmbodiedEnergy, + self.TransportCarbon, + self.TransportDistance, + self.TransportEnergy, + self.SubstitutionRatePattern, + self.SubstitutionTimestep, + ) + + def __copy__(self): + """Create a copy of self.""" + new_om = self.__class__(**self.mapping()) + return new_om diff --git a/archetypal/template/schedule.py b/archetypal/template/schedule.py index 5445b3ba..9b90b92d 100644 --- a/archetypal/template/schedule.py +++ b/archetypal/template/schedule.py @@ -1,119 +1,88 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""UmiSchedules module.""" +import calendar import collections import hashlib +from datetime import datetime import numpy as np import pandas as pd -from deprecation import deprecated -from eppy.bunch_subclass import EpBunch +from validator_collection import validators -import archetypal -from archetypal.schedule import Schedule -from archetypal.template import UmiBase, UniqueName +from archetypal.schedule import Schedule, _ScheduleParser, get_year_for_first_weekday +from archetypal.template.umi_base import UmiBase from archetypal.utils import log class UmiSchedule(Schedule, UmiBase): - """Class that handles Schedules as""" + """Class that handles Schedules.""" + + __slots__ = ("_quantity",) + + def __init__(self, Name, quantity=None, **kwargs): + """Initialize object with parameters. - def __init__(self, *args, quantity=None, **kwargs): - """ Args: - *args: + Name: + quantity: **kwargs: """ - super(UmiSchedule, self).__init__(**kwargs) + super(UmiSchedule, self).__init__(Name, **kwargs) self.quantity = quantity + @property + def quantity(self): + """Get or set the schedule quantity.""" + return self._quantity + + @quantity.setter + def quantity(self, value): + self._quantity = value + @classmethod - def constant_schedule( - cls, hourly_value=1, Name="AlwaysOn", Type="Fraction", idf=None, **kwargs - ): - """ + def constant_schedule(cls, value=1, Name="AlwaysOn", Type="Fraction", **kwargs): + """Create an UmiSchedule with a constant value at each timestep. + Args: - hourly_value: + Type: + value (float): Name: idf: **kwargs: """ + value = validators.float(value) return super(UmiSchedule, cls).constant_schedule( - hourly_value=hourly_value, Name=Name, Type=Type, idf=idf, **kwargs + value=value, Name=Name, Type=Type, **kwargs ) @classmethod - def from_values(cls, Name, Values, idf, Type="Fraction", **kwargs): - """ + def random(cls, Name="AlwaysOn", Type="Fraction", **kwargs): + """Create an UmiSchedule with a randomized value (0-1) at each timestep. + Args: - Name: - Values: - idf: - Type: - **kwargs: + Name (str): The name of the Schedule. + Type (str or ScheduleTypeLimits): + **kwargs: keywords passed to the constructor. """ - return super(UmiSchedule, cls).from_values( - Name=Name, Values=Values, Type=Type, idf=idf, **kwargs + values = np.random.rand( + 8760, ) + return cls(Values=values.tolist(), Name=Name, Type=Type, **kwargs) @classmethod - def from_yearschedule(cls, year_sched, idf=None): - """ + def from_values(cls, Name, Values, Type="Fraction", **kwargs): + """Create an UmiSchedule from a list of values. + Args: - year_sched: - idf: + Name (str): The name of the Schedule. + Values (list): + Type: + **kwargs: """ - if isinstance(year_sched, YearSchedule): - return cls.from_values( - Name=year_sched.Name, - Values=year_sched.all_values, - Type=year_sched.Type, - idf=idf, - ) - - def __add__(self, other): - return UmiSchedule.combine(self, other) - - def __repr__(self): - name = self.Name - resample = self.series.resample("D") - min = resample.min().mean() - mean = resample.mean().mean() - max = resample.max().mean() - return ( - name - + ": " - + "mean daily min:{:.2f} mean:{:.2f} max:{:.2f} ".format(min, mean, max) - + (f"quantity {self.quantity}" if self.quantity is not None else "") + return super(UmiSchedule, cls).from_values( + Name=Name, Values=Values, Type=Type, **kwargs ) - def __str__(self): - return repr(self) - - def __hash__(self): - return hash((self.__class__.__name__, getattr(self, "Name", None))) - - def __eq__(self, other): - if not isinstance(other, UmiSchedule): - return NotImplemented - else: - return all( - [ - # self.Name == other.Name, - self.strict == other.strict, - self.schType == other.schType, - self.Type == other.Type, - self.quantity == other.quantity, - np.allclose(self.all_values, other.all_values, rtol=1e-02) - if self.all_values.size == other.all_values.size - else False, - ] - ) - def combine(self, other, weights=None, quantity=None): """Combine two UmiSchedule objects together. @@ -172,11 +141,11 @@ def combine(self, other, weights=None, quantity=None): weights = [getattr(self, weights), getattr(other, weights)] elif isinstance(weights, (list, tuple)): # check if length is 2. - l = len(weights) - if l != 2: + length = len(weights) + if length != 2: raise ValueError( "USing a list or tuple, the weights attribute must " - "have a length of 2. A length of {}".format(l) + "have a length of 2. A length of {}".format(length) ) elif isinstance(weights, dict): weights = [weights[self.Name], weights[other.Name]] @@ -214,10 +183,11 @@ def combine(self, other, weights=None, quantity=None): self.all_values * self_quantity + other.all_values * other_quantity ) / sum(quantity) elif isinstance(quantity, bool): - self_quantity, other_quantity = self.quantity, other.quantity - new_values = ( - self.all_values * self_quantity + other.all_values * other_quantity - ) / (self_quantity + other_quantity) + new_values = np.average( + [self.all_values, other.all_values], + axis=0, + weights=[self.quantity * weights[0], other.quantity * weights[1]], + ) else: raise TypeError("Quantity is not of type list, tuple, dict or a callable") @@ -232,86 +202,54 @@ def combine(self, other, weights=None, quantity=None): [self.quantity or float("nan"), other.quantity or float("nan")] ) new_obj = UmiSchedule.from_values( - Values=new_values, Type="Fraction", quantity=quantity, idf=self.idf, **meta + Values=new_values, Type="Fraction", quantity=quantity, **meta ) new_obj.predecessors.update(self.predecessors + other.predecessors) new_obj.weights = sum(weights) return new_obj def develop(self): + """Develop the UmiSchedule into a Year-Week-Day schedule structure.""" year, weeks, days = self.to_year_week_day() lines = ["- {}".format(obj) for obj in self.predecessors] - newdays = [] - for day in days: - newdays.append( - DaySchedule.from_epbunch( - day, - Comments="Year Week Day schedules created from: \n{}".format( - "\n".join(lines) - ), - allow_duplicates=getattr(self, "_not_unique", False), - Category=self.Name, - ) - ) - Parts = [] - weeks = {schd.Name: schd for schd in weeks} - - def chunks(lst, n): - """Yield successive n-sized chunks from lst.""" - for i in range(0, len(lst), n): - yield lst[i : i + n] - - for fields in chunks(year.fieldvalues[3:], 5): - weekname, from_month, from_day, to_month, to_day = fields - Parts.append( - YearSchedulePart( - FromMonth=from_month, - ToMonth=to_month, - FromDay=from_day, - ToDay=to_day, - Schedule=WeekSchedule.from_epbunch( - weeks[weekname], - Comments="Year Week Day schedules created from:\n{}".format( - "\n".join(lines) - ), - Category=self.Name, - allow_duplicates=getattr(self, "_not_unique", False), - ), - ) - ) _from = "\n".join(lines) - return YearSchedule( - Name=self.Name, - Parts=Parts, - Type="Fraction", - epbunch=year, - Category=self.Name, - Comments=f"Year Week Day schedules created from: \n{_from}" + str(id(self)), - idf=self.idf, - allow_duplicates=getattr(self, "_not_unique", False), + year.Comments = ( + f"Year Week Day schedules created from: \n{_from}" + str(id(self)), ) + return year def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" return super(UmiSchedule, self.develop()).get_unique() - def to_json(self): - """UmiSchedule does not implement the to_json method because it is not - used when generating the json file. Only Year-Week- and DaySchedule - classes are used - """ + def to_dict(self): + """Return UmiSchedule dictionary representation. - return self.to_dict() + Hint: + UmiSchedule does not implement the to_dict method because it is not used + when generating the json file. Only Year-Week- and DaySchedule classes + are used. + """ + return self.to_ref() - def to_dict(self): + def to_ref(self): + """Return a ref pointer to self.""" return {"$ref": str(self.id)} def validate(self): """Validate object and fill in missing values.""" return self - def mapping(self): - self.validate() + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() return dict( Category=self.Category, @@ -338,11 +276,67 @@ def get_ref(self, ref): None, ) + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def __add__(self, other): + """Return new object that is the combination of self and other.""" + return UmiSchedule.combine(self, other) + + def __repr__(self): + """Return a representation of self.""" + name = self.Name + resample = self.series.resample("D") + min = resample.min().mean() + mean = resample.mean().mean() + max = resample.max().mean() + return ( + name + + ": " + + "mean daily min:{:.2f} mean:{:.2f} max:{:.2f} ".format(min, mean, max) + + (f"quantity {self.quantity}" if self.quantity is not None else "") + ) + + def __str__(self): + """Return the string representation of self.""" + return repr(self) + + def __hash__(self): + """Return the hash value of self.""" + return hash((self.__class__.__name__, getattr(self, "Name", None))) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, UmiSchedule): + return NotImplemented + if self.all_values.size != other.all_values.size: + return NotImplemented + else: + return all( + [ + self.strict == other.strict, + self.Type == other.Type, + self.quantity == other.quantity, + np.allclose(self.all_values, other.all_values, rtol=1e-02), + ] + ) + + def __copy__(self): + """Create a copy of self.""" + return self.__class__( + Name=self.Name, + quantity=self.quantity, + Values=self.all_values.tolist(), + strict=self.strict, + Type=self.Type, + ) + class YearSchedulePart: - """Helper Class for YearSchedules that are defined using FromDay FromMonth - ToDay ToMonth attributes. - """ + """Helper Class for YearSchedules defined with FromDay FromMonth ToDay ToMonth.""" + + __slots__ = ("_from_day", "_from_month", "_to_day", "_to_month", "_schedule") def __init__( self, @@ -353,7 +347,8 @@ def __init__( Schedule=None, **kwargs, ): - """ + """Initialize YearSchedulePart. + Args: FromDay (int): This numeric field is the starting day for the schedule time period. @@ -373,58 +368,78 @@ def __init__( self.ToMonth = ToMonth self.Schedule = Schedule - def __eq__(self, other): - if not isinstance(other, YearSchedulePart): - return NotImplemented - else: - return all( - [ - self.FromDay == other.FromDay, - self.FromMonth == other.FromMonth, - self.ToDay == other.ToDay, - self.ToMonth == other.ToMonth, - self.Schedule == other.Schedule, - ] - ) + @property + def FromDay(self): + """Get or set the start day-of-month number [int].""" + return self._from_day - def __iter__(self): - for k, v in self.mapping().items(): - yield k, v + @FromDay.setter + def FromDay(self, value): + self._from_day = validators.integer(value, minimum=1, maximum=31) - def __hash__(self): - return id(self) + @property + def FromMonth(self): + """Get or set the start month-number [int].""" + return self._from_month - @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): + @FromMonth.setter + def FromMonth(self, value): + self._from_month = validators.integer(value, minimum=1, maximum=12) - """ - Args: - all_objects: - *args: - **kwargs: - """ - return cls.from_dict(*args, **kwargs) + @property + def ToDay(self): + """Get or set the end day-of-month number [int].""" + return self._to_day + + @ToDay.setter + def ToDay(self, value): + self._to_day = validators.integer(value, minimum=1, maximum=31) + + @property + def ToMonth(self): + """Get or set the end month-number [int].""" + return self._to_month + + @ToMonth.setter + def ToMonth(self, value): + self._to_month = validators.integer(value, minimum=1, maximum=12) + + @property + def Schedule(self): + """Get or set the WeekSchedule object.""" + return self._schedule + + @Schedule.setter + def Schedule(self, value): + assert isinstance(value, WeekSchedule), "schedule must be of type WeekSchedule" + self._schedule = value @classmethod - def from_dict(cls, Schedule, **kwargs): - """ + def from_dict(cls, data, schedules, **kwargs): + """Create a YearSchedulePart object from a dictionary. + Args: - all_objects: - *args: - **kwargs: + data (dict): The python dictionary. + schedules (dict): A dictionary of WeekSchedules with their id as keys. + **kwargs: keywords passed to parent constructor. + + .. code-block:: python + + data = { + 'FromDay': 1, + 'FromMonth': 1, + 'ToDay': 31, + 'ToMonth': 12, + 'Schedule': {'$ref': '140622440042800'} + } """ - ref = UmiBase.get_classref(Schedule) - ysp = cls(Schedule=ref, **kwargs) + schedule = schedules[data.pop("Schedule")["$ref"]] + ysp = cls(Schedule=schedule, **data, **kwargs) return ysp def to_dict(self): + """Return YearSchedulePart dictionary representation.""" return collections.OrderedDict( FromDay=self.FromDay, FromMonth=self.FromMonth, @@ -434,9 +449,11 @@ def to_dict(self): ) def __str__(self): + """Return string representation of self.""" return str(self.to_dict()) def mapping(self): + """Get a dict based on the object properties, useful for dict repr.""" return dict( FromDay=self.FromDay, FromMonth=self.FromMonth, @@ -446,39 +463,67 @@ def mapping(self): ) def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" return self + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, YearSchedulePart): + return NotImplemented + else: + return all( + [ + self.FromDay == other.FromDay, + self.FromMonth == other.FromMonth, + self.ToDay == other.ToDay, + self.ToMonth == other.ToMonth, + self.Schedule == other.Schedule, + ] + ) + + def __iter__(self): + """Iterate over attributes. Yields tuple of (keys, value).""" + for k, v in self.mapping().items(): + yield k, v + + def __hash__(self): + """Return the hash value of self.""" + return id(self) + class DaySchedule(UmiSchedule): """Superclass of UmiSchedule that handles daily schedules.""" - def __init__(self, Category="Day", **kwargs): - """Initialize a DaySchedule object with parameters: + __slots__ = ("_values",) + + def __init__(self, Name, Values, Category="Day", **kwargs): + """Initialize a DaySchedule object with parameters. Args: - Category: + Values (list): List of 24 values. + Name (str): Name of the schedule. + Category (str): category identification (default: "Day"). **kwargs: Keywords passed to the :class:`UmiSchedule` constructor. """ - super(DaySchedule, self).__init__(Category=Category, **kwargs) + super(DaySchedule, self).__init__( + Category=Category, Name=Name, Values=Values, **kwargs + ) - def __eq__(self, other): - if not isinstance(other, DaySchedule): - return NotImplemented - else: - return all( - [ - self.Type == other.Type, - np.allclose(self.all_values, other.all_values, rtol=1e-02), - ] - ) + @property + def all_values(self) -> np.ndarray: + """Return numpy array of schedule Values.""" + return np.array(self._values) - def __hash__(self): - return super(DaySchedule, self).__hash__() + @all_values.setter + def all_values(self, value): + self._values = validators.iterable(value, maximum_length=24) @classmethod - def from_epbunch(cls, epbunch, **kwargs): - """Create a DaySchedule from a :class:`~eppy.bunch_subclass.EpBunch` - object + def from_epbunch(cls, epbunch, strict=False, **kwargs): + """Create a DaySchedule from an EpBunch. + + This method accepts "Schedule:Day:Hourly", "Schedule:Day:List" and + "Schedule:Day:Interval". Args: epbunch (EpBunch): The EpBunch object to construct a DaySchedule @@ -486,82 +531,96 @@ def from_epbunch(cls, epbunch, **kwargs): **kwargs: Keywords passed to the :class:`UmiSchedule` constructor. See :class:`UmiSchedule` for more details. """ - + assert epbunch.key.lower() in ( + "schedule:day:hourly", + "schedule:day:list", + "schedule:day:interval", + ), ( + f"Value input error for '{epbunch.key}'. Expected on of " + f"('Schedule:Day:Hourly', 'Schedule:Day:List' and " + f"'Schedule:Day:Interval')" + ) + start_day_of_the_week = epbunch.theidf.day_of_week_for_start_day + start_date = datetime(get_year_for_first_weekday(start_day_of_the_week), 1, 1) sched = cls( - idf=epbunch.theidf, Name=epbunch.Name, epbunch=epbunch, schType=epbunch.key, + Type=cls.get_schedule_type_limits_name(epbunch), + Values=_ScheduleParser.get_schedule_values( + epbunch, start_date, strict=strict + ), **kwargs, ) return sched @classmethod - def from_values(cls, Name, Values, idf, Type="Fraction", **kwargs): - """Create a DaySchedule from an array of size (24,) + def from_values(cls, Name, Values, Type="Fraction", **kwargs): + """Create a DaySchedule from an array of size (24,). Args: Name: Values (array-like): A list of values of length 24. - idf (IDF): The idf model. - Type: + Type (str): Schedule Type Limit name. **kwargs: Keywords passed to the :class:`UmiSchedule` constructor. See :class:`UmiSchedule` for more details. """ - return cls(Name=Name, Values=np.array(Values), Type=Type, idf=idf, **kwargs) + return cls(Name=Name, Values=Values, Type=Type, **kwargs) @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, Type, **kwargs): + def from_dict(cls, data, **kwargs): + """Create a DaySchedule from a dictionary. - """ Args: - Type: - **kwargs: - """ - return cls.from_dict(Type, **kwargs) - - @classmethod - def from_dict(cls, Name, Values, Type, **kwargs): - """Create a DaySchedule from a Umi Template json file. - - Args: - Type (str): The schedule type limits name. - **kwargs: + data (dict): A python dictionary with the structure shown bellow. + **kwargs: keywords passed to parents constructors. + + .. code-block:: python + + { + "$id": "67", + "Category": "Day", + "Type": "Fraction", + "Values": [...], # 24 hourly values + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Occ_WD" + }, """ - sched = cls.from_values(Name=Name, Values=Values, Type=Type, **kwargs) + _id = data.pop("$id") + sched = cls.from_values(id=_id, **data, **kwargs) return sched def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" return UmiBase.get_unique(self) - def to_json(self): - """Returns a dict-like representation of the schedule. - - Returns: - dict: The dict-like representation of the schedule - """ - + def to_dict(self): + """Return DaySchedule dictionary representation.""" data_dict = collections.OrderedDict() data_dict["$id"] = str(self.id) data_dict["Category"] = self.Category - data_dict["Type"] = self.Type - data_dict["Values"] = self.all_values.round(3).tolist() - data_dict["Comments"] = self.Comments + data_dict["Type"] = "Fraction" if self.Type is None else self.Type.Name + data_dict["Values"] = np.round(self.all_values, 3).tolist() + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict - def mapping(self): + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() + return dict( Category=self.Category, Type=self.Type, @@ -571,56 +630,124 @@ def mapping(self): Name=self.Name, ) - @property - def all_values(self) -> np.ndarray: - if self._values is None: - self._values = self.get_schedule_values(self.epbunch) - if isinstance(self._values, list): - self._values = np.array(self._values) - return self._values - - def to_dict(self): - """returns umi template repr""" + def to_ref(self): + """Return a ref pointer to self.""" return {"$ref": str(self.id)} - -class WeekSchedule(UmiSchedule): - """Superclass of UmiSchedule that handles weekly schedules.""" - - def __init__(self, Days=None, Category="Week", **kwargs): - """Initialize a WeekSchedule object with parameters: - - Args: - Days (list of DaySchedule): list of :class:`DaySchedule`. - **kwargs: - """ - super(WeekSchedule, self).__init__(Category=Category, **kwargs) - self.Days = Days + def duplicate(self): + """Get copy of self.""" + return self.__copy__() def __eq__(self, other): - if not isinstance(other, WeekSchedule): + """Assert self is equivalent to other.""" + if not isinstance(other, DaySchedule): return NotImplemented else: return all( [ self.Type == other.Type, - self.Days == other.Days, + np.allclose(self.all_values, other.all_values, rtol=1e-02), ] ) def __hash__(self): - return super(WeekSchedule, self).__hash__() + """Return the hash value of self.""" + return super(DaySchedule, self).__hash__() - @classmethod - def from_epbunch(cls, epbunch, **kwargs): + def __copy__(self): + """Create a copy of self.""" + return self.__class__(self.Name, Values=self.all_values.tolist()) + + def to_epbunch(self, idf): + """Convert self to an epbunch given an idf model. + + Args: + idf (IDF): An IDF model. + + .. code-block:: python + + SCHEDULE:DAY:HOURLY, + , !- Name + , !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0, !- Hour 7 + 0, !- Hour 8 + 0, !- Hour 9 + 0, !- Hour 10 + 0, !- Hour 11 + 0, !- Hour 12 + 0, !- Hour 13 + 0, !- Hour 14 + 0, !- Hour 15 + 0, !- Hour 16 + 0, !- Hour 17 + 0, !- Hour 18 + 0, !- Hour 19 + 0, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + + Returns: + EpBunch: The EpBunch object added to the idf model. """ + return idf.newidfobject( + key="Schedule:Day:Hourly".upper(), + **dict( + Name=self.Name, + Schedule_Type_Limits_Name=self.Type.to_epbunch(idf).Name, + **{"Hour_{}".format(i + 1): self.all_values[i] for i in range(24)}, + ), + ) + + +class WeekSchedule(UmiSchedule): + """Superclass of UmiSchedule that handles weekly schedules.""" + + __slots__ = ("_days", "_values") + + def __init__(self, Name, Days=None, Category="Week", **kwargs): + """Initialize a WeekSchedule object with parameters. + Args: - epbunch: + Days (list of DaySchedule): list of :class:`DaySchedule`. **kwargs: """ - Days = WeekSchedule.get_days(epbunch) + super(WeekSchedule, self).__init__(Name, Category=Category, **kwargs) + self.Days = Days + + @property + def Days(self): + """Get or set the list of DaySchedule objects.""" + return self._days + + @Days.setter + def Days(self, value): + if value is not None: + assert all( + isinstance(x, DaySchedule) for x in value + ), f"Input value error '{value}'. Expected list of DaySchedule." + self._days = value + + @classmethod + def from_epbunch(cls, epbunch, **kwargs): + """Create a WeekSchedule from a Schedule:Week:Daily object. + + Args: + epbunch (EpBunch): The Schedule:Week:Daily object. + **kwargs: keywords passed to the constructor. + """ + assert ( + epbunch.key.lower() == "schedule:week:daily" + ), f"Expected a 'schedule:week:daily' not a '{epbunch.key.lower()}'" + Days = WeekSchedule.get_days(epbunch, **kwargs) sched = cls( - idf=epbunch.theidf, Name=epbunch.Name, schType=epbunch.key, Days=Days, @@ -630,53 +757,49 @@ def from_epbunch(cls, epbunch, **kwargs): return sched @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, **kwargs): - - """ - Args: - **kwargs: - """ - return cls.from_dict(**kwargs) + def from_dict(cls, data, day_schedules, **kwargs): + """Create a WeekSchedule from a dictionary. - @classmethod - def from_dict(cls, Type, **kwargs): - """ Args: - **kwargs: + data (dict): The python dictionary. + day_schedules (dict): A dictionary of python DaySchedules with their id as + keys. + **kwargs: keywords passed to the constructor. """ - refs = kwargs.pop("Days") - Days = [UmiBase.get_classref(ref) for ref in refs] - wc = cls(Type=Type, Days=Days, **kwargs) + refs = data.pop("Days") + _id = data.pop("$id") + Days = [day_schedules[ref["$ref"]] for ref in refs] + wc = cls(Days=Days, id=_id, **data, **kwargs) return wc def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" return UmiBase.get_unique(self) - def to_json(self): - """Returns a dict-like representation of the schedule. - - Returns: - dict: The dict-like representation of the schedule - """ + def to_dict(self): + """Return WeekSchedule dictionary representation.""" data_dict = collections.OrderedDict() data_dict["$id"] = str(self.id) data_dict["Category"] = self.Category - data_dict["Days"] = [day.to_dict() for day in self.Days] - data_dict["Type"] = self.Type - data_dict["Comments"] = self.Comments + data_dict["Days"] = [day.to_ref() for day in self.Days] + data_dict["Type"] = "Fraction" if self.Type is None else self.Type.Name + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict - def mapping(self): + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() + return dict( Category=self.Category, Days=self.Days, @@ -687,12 +810,16 @@ def mapping(self): ) @classmethod - def get_days(cls, epbunch): - """ + def get_days(cls, epbunch, **kwargs): + """Get the DaySchedules referenced in the Week:Schedule:Days object. + Args: - epbunch (EpBunch): + list of DaySchedule: The list of DaySchedules referenced by the epbunch. """ - blocks = [] + assert ( + epbunch.key.lower() == "schedule:week:daily" + ), f"Expected a 'schedule:week:daily' not a '{epbunch.key.lower()}'" + Days = [] dayname = [ "Monday", "Tuesday", @@ -703,37 +830,77 @@ def get_days(cls, epbunch): "Sunday", ] for day in dayname: - week_day_schedule_name = epbunch["{}_ScheduleDay_Name".format(day)] - blocks.append( - next( - ( - x - for x in UmiBase.CREATED_OBJECTS - if x.Name == week_day_schedule_name - and type(x).__name__ == "DaySchedule" - ), - None, - ) - ) + day_ep = epbunch.get_referenced_object("{}_ScheduleDay_Name".format(day)) + Days.append(DaySchedule.from_epbunch(day_ep, **kwargs)) - return blocks + return Days @property def all_values(self) -> np.ndarray: + """Return numpy array of schedule Values.""" if self._values is None: self._values = np.concatenate([day.all_values for day in self.Days]) return self._values - def to_dict(self): - """returns umi template repr""" + def to_ref(self): + """Return a ref pointer to self.""" return {"$ref": str(self.id)} + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, WeekSchedule): + return NotImplemented + else: + return all( + [ + self.Type == other.Type, + self.Days == other.Days, + ] + ) + + def __hash__(self): + """Return the hash value of self.""" + return super(WeekSchedule, self).__hash__() + + def __copy__(self): + """Create a copy of self.""" + return self.__class__(Name=self.Name, Days=self.Days) + + def to_epbunch(self, idf): + """Convert self to an epbunch given an idf model. + + Args: + idf (IDF): An IDF model. + + Returns: + EpBunch: The EpBunch object added to the idf model. + """ + return idf.newidfobject( + key="Schedule:Week:Daily".upper(), + **dict( + Name=self.Name, + **{ + f"{calendar.day_name[i]}_ScheduleDay_Name": day.to_epbunch(idf).Name + for i, day in enumerate(self.Days) + }, + Holiday_ScheduleDay_Name=self.Days[6].Name, + SummerDesignDay_ScheduleDay_Name=self.Days[0].Name, + WinterDesignDay_ScheduleDay_Name=self.Days[0].Name, + CustomDay1_ScheduleDay_Name=self.Days[1].Name, + CustomDay2_ScheduleDay_Name=self.Days[6].Name, + ), + ) + class YearSchedule(UmiSchedule): """Superclass of UmiSchedule that handles yearly schedules.""" def __init__(self, Name, Type="Fraction", Parts=None, Category="Year", **kwargs): - """Initialize a YearSchedule object with parameters: + """Initialize a YearSchedule object with parameters. Args: Category: @@ -744,7 +911,7 @@ def __init__(self, Name, Type="Fraction", Parts=None, Category="Year", **kwargs) """ self.epbunch = kwargs.get("epbunch", None) if Parts is None: - self.Parts = self.get_parts(self.epbunch) + self.Parts = self._get_parts(self.epbunch) else: self.Parts = Parts super(YearSchedule, self).__init__( @@ -752,57 +919,33 @@ def __init__(self, Name, Type="Fraction", Parts=None, Category="Year", **kwargs) ) def __eq__(self, other): + """Assert self is equivalent to other.""" if not isinstance(other, YearSchedule): return NotImplemented else: return all([self.Type == other.Type, self.Parts == other.Parts]) def __hash__(self): + """Return the hash value of self.""" return super(YearSchedule, self).__hash__() - @classmethod - def from_parts(cls, *args, Parts, **kwargs): - """ - Args: - *args: - Parts (list of YearSchedulePart): - **kwargs: - """ - ysp = cls(*args, Parts=Parts, **kwargs) - ysp._values = ysp.all_values - - return ysp - @property def all_values(self) -> np.ndarray: + """Return numpy array of schedule Values.""" if self._values is None: index = pd.date_range(start=self.startDate, freq="1H", periods=8760) series = pd.Series(index=index) for part in self.Parts: start = "{}-{}-{}".format(self.year, part.FromMonth, part.FromDay) end = "{}-{}-{}".format(self.year, part.ToMonth, part.ToDay) - try: # Get week values from all_values of Days that are DaySchedule object - one_week = np.array( - [ - item - for sublist in part.Schedule.Days - for item in sublist.all_values - ] - ) - except: # Days are not DaySchedule object - try: # Days is a list of 7 dicts (7 days in a week) - # Dicts are the id of Days ({"$ref": id}) - day_values = [self.get_ref(day) for day in part.Schedule.Days] - values = [] - for i in range(0, 7): # There is 7 days a week - values = values + day_values[i].all_values.tolist() - one_week = np.array(values) - except: - msg = ( - 'Days are not a DaySchedule or dictionaries in the form "{' - '$ref: id}" ' - ) - raise NotImplementedError(msg) + # Get week values from all_values of Days + one_week = np.array( + [ + item + for sublist in part.Schedule.Days + for item in sublist.all_values + ] + ) all_weeks = np.resize(one_week, len(series.loc[start:end])) series.loc[start:end] = all_weeks @@ -810,56 +953,80 @@ def all_values(self) -> np.ndarray: return self._values @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, **kwargs): + def from_dict(cls, data, week_schedules, **kwargs): + """Create a YearSchedule from a dictionary. - """ Args: - **kwargs: - """ - return cls.from_dict(**kwargs) - - @classmethod - def from_dict(cls, Type, **kwargs): - """ - Args: - **kwargs: + data (dict): The python dictionary. + week_schedule (dict): A dictionary of python WeekSchedules with their id as + keys. + **kwargs: keywords passed to the constructor. """ Parts = [ - YearSchedulePart.from_dict(**part) for part in kwargs.pop("Parts", None) + YearSchedulePart.from_dict(data, week_schedules) + for data in data.pop("Parts", None) ] - ys = cls(Type=Type, Parts=Parts, **kwargs) - ys.schType = "Schedule:Year" + _id = data.pop("$id") + ys = cls(Parts=Parts, id=_id, **data, **kwargs) return ys def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" return UmiBase.get_unique(self) - def to_json(self): - """Returns a dict-like representation of the schedule. - - Returns: - dict: The dict-like representation of the schedule - """ + def to_dict(self): + """Return YearSchedule dictionary representation.""" data_dict = collections.OrderedDict() data_dict["$id"] = str(self.id) data_dict["Category"] = self.Category data_dict["Parts"] = [part.to_dict() for part in self.Parts] - data_dict["Type"] = self.Type - data_dict["Comments"] = self.Comments + data_dict["Type"] = "Fraction" if self.Type is None else self.Type.Name + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict - def mapping(self): - self.validate() + def to_epbunch(self, idf): + """Convert self to an epbunch given an idf model. + + Notes: + The object is added to the idf model. + + Args: + idf (IDF): An IDF model. + + Returns: + EpBunch: The EpBunch object added to the idf model. + """ + new_dict = dict( + Name=self.Name, Schedule_Type_Limits_Name=self.Type.to_epbunch(idf).Name + ) + for i, part in enumerate(self.Parts): + new_dict.update( + { + "ScheduleWeek_Name_{}".format(i + 1): part.Schedule.to_epbunch( + idf + ).Name, + "Start_Month_{}".format(i + 1): part.FromMonth, + "Start_Day_{}".format(i + 1): part.FromDay, + "End_Month_{}".format(i + 1): part.ToMonth, + "End_Day_{}".format(i + 1): part.ToDay, + } + ) + + return idf.newidfobject(key="Schedule:Year".upper(), **new_dict) + + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() return dict( Category=self.Category, @@ -870,11 +1037,7 @@ def mapping(self): Name=self.Name, ) - def get_parts(self, epbunch): - """ - Args: - epbunch (EpBunch): - """ + def _get_parts(self, epbunch): parts = [] for i in range(int(len(epbunch.fieldvalues[3:]) / 5)): week_day_schedule_name = epbunch["ScheduleWeek_Name_{}".format(i + 1)] @@ -901,6 +1064,6 @@ def get_parts(self, epbunch): ) return parts - def to_dict(self): - """returns umi template repr""" + def to_ref(self): + """Return a ref pointer to self.""" return {"$ref": str(self.id)} diff --git a/archetypal/template/structure.py b/archetypal/template/structure.py index 15a6d40d..bcd038b6 100644 --- a/archetypal/template/structure.py +++ b/archetypal/template/structure.py @@ -1,23 +1,20 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal StructureInformation.""" import collections -from deprecation import deprecated +from validator_collection import validators -import archetypal -from archetypal.template import OpaqueMaterial, UmiBase, UniqueName +from archetypal.template.constructions.base_construction import ConstructionBase +from archetypal.template.materials.opaque_material import OpaqueMaterial class MassRatio(object): - """Handles the properties of the""" + """Handles the properties of the mass ratio for building template structure.""" + + __slots__ = ("_high_load_ratio", "_material", "_normal_ratio") def __init__(self, HighLoadRatio=None, Material=None, NormalRatio=None, **kwargs): - """Initialize a MassRatio object with parameters + """Initialize a MassRatio object with parameters. Args: HighLoadRatio (float): @@ -28,27 +25,62 @@ def __init__(self, HighLoadRatio=None, Material=None, NormalRatio=None, **kwargs self.Material = Material self.NormalRatio = NormalRatio + @property + def HighLoadRatio(self): + """Get or set the high load ratio [kg/m2].""" + return self._high_load_ratio + + @HighLoadRatio.setter + def HighLoadRatio(self, value): + self._high_load_ratio = validators.float(value, minimum=0) + + @property + def Material(self): + """Get or set the structure OpaqueMaterial.""" + return self._material + + @Material.setter + def Material(self, value): + assert isinstance( + value, OpaqueMaterial + ), f"Material must be of type OpaqueMaterial, not {type(value)}" + self._material = value + + @property + def NormalRatio(self): + """Get or set the normal load ratio [kg/m2].""" + return self._normal_ratio + + @NormalRatio.setter + def NormalRatio(self, value): + self._normal_ratio = validators.float(value, minimum=0) + def __hash__(self): - return hash(id(self)) + """Return the hash value of self.""" + return hash(self.__key__()) + + def __key__(self): + """Get a tuple of attributes. Useful for hashing and comparing.""" + return ( + self.HighLoadRatio, + self.Material, + self.NormalRatio, + ) def __eq__(self, other): + """Assert self is equivalent to other.""" if not isinstance(other, MassRatio): return NotImplemented else: - return all( - [ - self.HighLoadRatio == other.HighLoadRatio, - self.Material == other.Material, - self.NormalRatio == other.NormalRatio, - ] - ) + return self.__key__() == other.__key__() def __iter__(self): + """Iterate over attributes. Yields tuple of (keys, value).""" for k, v in self.mapping().items(): yield k, v def to_dict(self): - """dict representation of object""" + """Return MassRatio dictionary representation.""" return collections.OrderedDict( HighLoadRatio=self.HighLoadRatio, Material={"$ref": str(self.Material.id)}, @@ -56,6 +88,7 @@ def to_dict(self): ) def mapping(self): + """Get a dict based on the object properties, useful for dict repr.""" return dict( HighLoadRatio=self.HighLoadRatio, Material=self.Material, @@ -63,10 +96,12 @@ def mapping(self): ) def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" return self @classmethod def generic(cls): + """Create generic MassRatio object.""" mat = OpaqueMaterial( Name="Steel General", Conductivity=45.3, @@ -89,94 +124,67 @@ def generic(cls): ) return cls(HighLoadRatio=305, Material=mat, NormalRatio=305) + def duplicate(self): + """Get copy of self.""" + return self.__copy__() -class StructureInformation(UmiBase): + def __copy__(self): + """Create a copy of self.""" + return self.__class__(self.HighLoadRatio, self.Material, self.NormalRatio) + + +class StructureInformation(ConstructionBase): """Building Structure settings. .. image:: ../images/template/constructions-structure.png """ - def __init__( - self, - *args, - AssemblyCarbon=0, - AssemblyCost=0, - AssemblyEnergy=0, - DisassemblyCarbon=0, - DisassemblyEnergy=0, - MassRatios=None, - **kwargs - ): - """ + __slots__ = ("_mass_ratios",) + + def __init__(self, Name, MassRatios, **kwargs): + """Initialize object. + Args: - *args: - AssemblyCarbon: - AssemblyCost: - AssemblyEnergy: - DisassemblyCarbon: - DisassemblyEnergy: - MassRatios: - **kwargs: + MassRatios (list of MassRatio): MassRatio object. + **kwargs: keywords passed to the ConstructionBase constructor. """ - super(StructureInformation, self).__init__(**kwargs) - self.AssemblyCarbon = AssemblyCarbon - self.AssemblyCost = AssemblyCost - self.AssemblyEnergy = AssemblyEnergy - self.DisassemblyCarbon = DisassemblyCarbon - self.DisassemblyEnergy = DisassemblyEnergy + super(StructureInformation, self).__init__(Name, **kwargs) self.MassRatios = MassRatios - def __hash__(self): - return hash( - (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) - ) + @property + def MassRatios(self): + """Get or set the list of MassRatios.""" + return self._mass_ratios - def __eq__(self, other): - if not isinstance(other, StructureInformation): - return NotImplemented - else: - return all( - [ - self.AssemblyCarbon == other.AssemblyCarbon, - self.AssemblyCost == other.AssemblyCost, - self.AssemblyEnergy == other.AssemblyEnergy, - self.DisassemblyCarbon == other.DisassemblyCarbon, - self.DisassemblyEnergy == other.DisassemblyEnergy, - self.MassRatios == other.MassRatios, - ] - ) + @MassRatios.setter + def MassRatios(self, value): + assert isinstance(value, list), "mass_ratio must be of a list of MassRatio" + self._mass_ratios = value @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): + def from_dict(cls, data, materials, **kwargs): + """Create StructureInformation from a dictionary. - return cls.from_dict(*args, **kwargs) - - @classmethod - def from_dict(cls, *args, **kwargs): - """ Args: - *args: - **kwargs: + data (dict): A python dictionary. + materials (dict): A dictionary of python OpaqueMaterials with their id as + keys. + **kwargs: keywords passed to parent constructors. """ - sd = cls(*args, **kwargs) - massratios = kwargs.get("MassRatios", None) - sd.MassRatios = [ + mass_ratio_ref = data.pop("MassRatios") + mass_ratios = [ MassRatio( HighLoadRatio=massratio["HighLoadRatio"], - Material=sd.get_ref(massratio["Material"]), + Material=materials[massratio["Material"]["$ref"]], NormalRatio=massratio["NormalRatio"], ) - for massratio in massratios + for massratio in mass_ratio_ref ] - return sd + _id = data.pop("$id") + return cls(MassRatios=mass_ratios, id=_id, **data, **kwargs) - def to_json(self): + def to_dict(self): + """Return StructureInformation dictionary representation.""" self.validate() # Validate object before trying to get json format data_dict = collections.OrderedDict() @@ -189,9 +197,9 @@ def to_json(self): data_dict["DisassemblyCarbon"] = self.DisassemblyCarbon data_dict["DisassemblyEnergy"] = self.DisassemblyEnergy data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict @@ -199,8 +207,16 @@ def validate(self): """Validate object and fill in missing values.""" return self - def mapping(self): - self.validate() + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() + return dict( MassRatios=self.MassRatios, AssemblyCarbon=self.AssemblyCarbon, @@ -214,19 +230,32 @@ def mapping(self): Name=self.Name, ) - def get_ref(self, ref): - """Get item matching reference id. + def duplicate(self): + """Get copy of self.""" + return self.__copy__() - Args: - ref: - """ - return next( - iter( + def __hash__(self): + """Return the hash value of self.""" + return hash( + (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + ) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, StructureInformation): + return NotImplemented + else: + return all( [ - value - for value in StructureInformation.CREATED_OBJECTS - if value.id == ref["$ref"] + self.AssemblyCarbon == other.AssemblyCarbon, + self.AssemblyCost == other.AssemblyCost, + self.AssemblyEnergy == other.AssemblyEnergy, + self.DisassemblyCarbon == other.DisassemblyCarbon, + self.DisassemblyEnergy == other.DisassemblyEnergy, + self.MassRatios == other.MassRatios, ] - ), - None, - ) + ) + + def __copy__(self): + """Create a copy of self.""" + return self.__class__(**self.mapping(validate=False)) diff --git a/archetypal/template/umi_base.py b/archetypal/template/umi_base.py index 58fef936..d3c8c609 100644 --- a/archetypal/template/umi_base.py +++ b/archetypal/template/umi_base.py @@ -1,22 +1,14 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ - -import collections +"""archetypal UmiBase module.""" + import itertools -import logging as lg import math import re -from itertools import chain +from collections.abc import Hashable, MutableSet import numpy as np -from sigfig import round +from validator_collection import validators -from archetypal.idfclass.idf import IDF -from archetypal.utils import lcm, log +from archetypal.utils import lcm def _resolve_combined_names(predecessors): @@ -51,45 +43,24 @@ def _shorten_name(long_name): class UmiBase(object): - # dependencies: dict of - _dependencies = {"sql": ["idf"]} - _independant_vars = set(chain(*list(_dependencies.values()))) - _dependant_vars = set(_dependencies.keys()) + """Base class for template objects.""" + + __slots__ = ( + "_id", + "_datasource", + "_predecessors", + "_name", + "_category", + "_comments", + "_allow_duplicates", + "_unit_number", + ) CREATED_OBJECTS = [] _ids = itertools.count(0) # unique id for each class instance - def _reset_dependant_vars(self, name): - _reverse_dependencies = {} - for k, v in self._dependencies.items(): - for x in v: - _reverse_dependencies.setdefault(x, []).append(k) - for var in _reverse_dependencies[name]: - super().__setattr__(f"_{var}", None) - - def __setattr__(self, key, value): - propobj = getattr(UmiBase, key, None) - if isinstance(propobj, property): - if propobj.fset is None: - raise AttributeError("Cannot set attribute") - # self.__set_on_dependencies(key.strip("_"), value) - else: - propobj.fset(self, value) - self.__set_on_dependencies(key, value) - else: - self.__set_on_dependencies(key, value) - - def __set_on_dependencies(self, key, value): - if key in self._dependant_vars: - raise AttributeError("Cannot set this value.") - if key in self._independant_vars: - self._reset_dependant_vars(key) - key = f"_{key}" - super(UmiBase, self).__setattr__(key, value) - def __init__( self, Name, - idf=None, Category="Uncategorized", Comments="", DataSource=None, @@ -100,7 +71,6 @@ def __init__( Args: Name (str): Unique, the name of the object. - idf (IDF): The idf object associated to this object. Category (str): Group objects by assigning the same category identifier. Thies can be any string. Comments (str): A comment displayed in the UmiTemplateLibrary. @@ -111,77 +81,109 @@ def __init__( if it has a different name. **kwargs: """ - self._datasource = None - self._predecessors = None - self._idf = None - self._sql = None - self._id = None self.Name = Name - self.idf = idf self.Category = Category self.Comments = Comments self.DataSource = DataSource - self.id = kwargs.get("$id", None) - self._allow_duplicates = allow_duplicates + + self.id = kwargs.get("id", None) + self.allow_duplicates = allow_duplicates self.unit_number = next(self._ids) + self.predecessors = None UmiBase.CREATED_OBJECTS.append(self) - def __repr__(self): - return ":".join([str(self.id), str(self.Name)]) - - def __str__(self): - """string representation of the object as id:Name""" - return self.__repr__() + @property + def Name(self): + """Get or set the name of the object.""" + return self._name - def __iter__(self): - for attr, value in self.mapping().items(): - yield attr, value + @Name.setter + def Name(self, value): + self._name = validators.string(value, coerce_value=True) @property def id(self): - if self._id is None: - self._id = id(self) + """Get or set the id.""" return self._id @id.setter def id(self, value): - self._id = value + if value is None: + value = id(self) + self._id = validators.string(value, coerce_value=True) @property def DataSource(self): + """Get or set the datasource of the object.""" return self._datasource @DataSource.setter def DataSource(self, value): - self._datasource = value + self._datasource = validators.string(value, coerce_value=True, allow_empty=True) + + @property + def Category(self): + """Get or set the Category attribute.""" + return self._category + + @Category.setter + def Category(self, value): + value = validators.string(value, coerce_value=True, allow_empty=True) + if value is None: + value = "" + self._category = value @property - def idf(self): - if self._idf is None: - self._idf = IDF() - return self._idf + def Comments(self): + """Get or set the object comments.""" + return self._comments - @idf.setter - def idf(self, value): - self._idf = value + @Comments.setter + def Comments(self, value): + value = validators.string(value, coerce_value=True, allow_empty=True) + if value is None: + value = "" + self._comments = value @property - def sql(self): - if self._sql is None: - self._sql = self.idf.sql() - return self._sql + def allow_duplicates(self): + """Get or set the use of duplicates [bool].""" + return self._allow_duplicates + + @allow_duplicates.setter + def allow_duplicates(self, value): + assert isinstance(value, bool), value + self._allow_duplicates = value + + @property + def unit_number(self): + return self._unit_number + + @unit_number.setter + def unit_number(self, value): + self._unit_number = validators.integer(value) @property def predecessors(self): - """Of which objects is self made of. If from nothing else then self, + """Get or set the predecessors of self. + + Of which objects is self made of. If from nothing else then self, return self. """ if self._predecessors is None: self._predecessors = MetaData([self]) return self._predecessors + @predecessors.setter + def predecessors(self, value): + self._predecessors = value + + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + def _get_predecessors_meta(self, other): """get predecessor objects to self and other @@ -231,9 +233,9 @@ def rename(self, name): """ self.Name = name - def to_json(self): - """Convert class properties to dict""" - return {"$id": "{}".format(self.id), "Name": "{}".format(UniqueName(self.Name))} + def to_dict(self): + """Return UmiBase dictionary representation.""" + return {"$id": "{}".format(self.id), "Name": "{}".format(self.Name)} @classmethod def get_classref(cls, ref): @@ -248,13 +250,31 @@ def get_ref(self, ref): pass def __hash__(self): + """Return the hash value of self.""" return hash((self.__class__.mro()[0].__name__, self.Name)) - def to_dict(self): - """returns umi template repr""" + def __repr__(self): + """Return a representation of self.""" + return ":".join([str(self.id), str(self.Name)]) + + def __str__(self): + """string representation of the object as id:Name""" + return self.__repr__() + + def __iter__(self): + """Iterate over attributes. Yields tuple of (keys, value).""" + for attr, value in self.mapping().items(): + yield attr, value + + def __copy__(self): + """Create a copy of self.""" + return self.__class__(**self.mapping(validate=False)) + + def to_ref(self): + """Return a ref pointer to self.""" return {"$ref": str(self.id)} - def _float_mean(self, other, attr, weights=None): + def float_mean(self, other, attr, weights=None): """Calculates the average attribute value of two floats. Can provide weights. @@ -356,20 +376,35 @@ def extend(self, other, allow_duplicates): id = self.id new_obj = self.combine(other, allow_duplicates=allow_duplicates) new_obj.id = id - self.__dict__.update(**new_obj.__dict__) - self.CREATED_OBJECTS.append(self) + for key in self.mapping(validate=False): + setattr(self, key, getattr(new_obj, key)) return self def validate(self): """Validate UmiObjects and fills in missing values.""" return self - def mapping(self): - return {} + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() + + return dict( + id=self.id, + Name=self.Name, + Category=self.Category, + Comments=self.Comments, + DataSource=self.DataSource, + ) def get_unique(self): """Return first object matching equality in the list of instantiated objects.""" - if self._allow_duplicates: + if self.allow_duplicates: # We want to return the first similar object (equality) that has this name. obj = next( iter( @@ -406,265 +441,47 @@ def get_unique(self): return obj -class MaterialBase(UmiBase): - """A class used to store data linked with the Life Cycle aspect of materials - - For more information on the Life Cycle Analysis performed in UMI, see: - https://umidocs.readthedocs.io/en/latest/docs/life-cycle-introduction.html#life - -cycle-impact - """ - - def __init__( - self, - Name, - Cost=0, - EmbodiedCarbon=0, - EmbodiedEnergy=0, - SubstitutionTimestep=100, - TransportCarbon=0, - TransportDistance=0, - TransportEnergy=0, - SubstitutionRatePattern=None, - Conductivity=0, - Density=0, - **kwargs, - ): - """Initialize a MaterialBase object with parameters: - - Args: - Name (str): Name of the Material. - Cost (float): The purchase cost of the material by volume ($/m3). - EmbodiedCarbon (float): Represents the GHG emissions through the - lifetime of the product (kgCO2/kg). - EmbodiedEnergy (float): Represents all fuel consumption ( Typically - from non-renewable sources) which happened through the lifetime - of a product (or building), expressed as primary energy (MJ/kg). - SubstitutionTimestep (float): The duration in years of a period of - replacement (e.g. There will be interventions in this material - type every 10 years). - TransportCarbon (float): The impacts associated with the transport - by km of distance and kg of material (kgCO2/kg/km). - TransportDistance (float): The average distance in km from the - manufacturing site to the building construction site - TransportEnergy (float): The impacts associated with the transport - by km of distance and kg of material (MJ/kg/km). - SubstitutionRatePattern (list-like): A ratio from 0 to 1 which - defines the amount of the material replaced at the end of each - period of replacement, :attr:`SubstitutionTimestep` (e.g. Every - 10 years this cladding will be completely replaced with ratio - 1). Notice that you can define different replacement ratios for - different consecutive periods, introducing them separated by - commas. For example, if you introduce the series “0.1 , 0.1 , 1” - after the first 10 years a 10% will be replaced, then after 20 - years another 10%, then after 30 years a 100%, and finally the - series would start again in year 40. - Conductivity (float): Thermal conductivity (W/m-K). - Density (float): A number representing the density of the material - in kg/m3. This is essentially the mass of one cubic meter of the - material. - **kwargs: Keywords passed to the :class:`UmiBase` class. See - :class:`UmiBase` for more details. - """ - super(MaterialBase, self).__init__(Name, **kwargs) - if SubstitutionRatePattern is None: - SubstitutionRatePattern = [1.0] - self.Conductivity = Conductivity - self.Cost = Cost - self.Density = Density - self.EmbodiedCarbon = EmbodiedCarbon - self.EmbodiedEnergy = EmbodiedEnergy - self.SubstitutionRatePattern = SubstitutionRatePattern - self.SubstitutionTimestep = SubstitutionTimestep - self.TransportCarbon = TransportCarbon - self.TransportDistance = TransportDistance - self.TransportEnergy = TransportEnergy - - def __hash__(self): - return hash((self.__class__.__name__, getattr(self, "Name", None))) - - def __eq__(self, other): - if not isinstance(other, MaterialBase): - return NotImplemented - else: - return all( - [ - self.Cost == other.Cost, - self.EmbodiedCarbon == other.EmbodiedCarbon, - self.EmbodiedEnergy == other.EmbodiedEnergy, - self.SubstitutionTimestep == other.SubstitutionTimestep, - self.TransportCarbon == other.TransportCarbon, - self.TransportDistance == other.TransportDistance, - self.TransportEnergy == other.TransportEnergy, - np.array_equal( - self.SubstitutionRatePattern, other.SubstitutionRatePattern - ), - self.Conductivity == other.Conductivity, - self.Density == other.Density, - ] - ) - - def validate(self): - """Validate object and fill in missing values.""" - return self - - def get_ref(self, ref): - """Get item matching reference id. - - Args: - ref: - """ - return next( - iter( - [ - value - for value in MaterialBase.CREATED_OBJECTS - if value.id == ref["$ref"] - ] - ), - None, - ) - - -class MaterialLayer(object): - """Class used to define one layer in a construction assembly. This class has - two attributes: - - 1. Material (:class:`OpaqueMaterial` or :class:`GlazingMaterial` or - :class:`GasMaterial`): the material object for this layer. - 2. Thickness (float): The thickness of the material in the layer. - """ - - def __init__(self, Material, Thickness, **kwargs): - """Initialize a MaterialLayer object with parameters. - - Args: - Material (OpaqueMaterial, GlazingMaterial, GasMaterial): - Thickness (float): The thickness of the material in the - construction. - """ - self.Material = Material - self.Thickness = Thickness - - @property - def Thickness(self): - """Get or set the material thickness [m].""" - return self._thickness - - @Thickness.setter - def Thickness(self, value): - self._thickness = value - if value < 0.003: - log( - "Modeling layer thinner (less) than 0.003 m (not recommended) for " - f"MaterialLayer '{self}'", - lg.WARNING, - ) - - @property - def resistivity(self): - """Get or set the resistivity of the material layer [m-K/W].""" - return 1 / self.Material.Conductivity - - @resistivity.setter - def resistivity(self, value): - self.Material.Conductivity = 1 / float(value) - - @property - def r_value(self): - """Get or set the the R-value of the material layer [m2-K/W]. - - Note that, when setting the R-value, the thickness of the material will - be adjusted and the conductivity will remain fixed. - """ - return self.Thickness / self.Material.Conductivity - - @r_value.setter - def r_value(self, value): - self.Thickness = float(value) * self.Material.Conductivity - - @property - def u_value(self): - """Get or set the heat transfer coefficient [W/(m2⋅K)].""" - return 1 / self.r_value - - @u_value.setter - def u_value(self, value): - self.r_value = 1 / float(value) - - @property - def heat_capacity(self): - """The material layer's heat capacity [J/(m2-k)].""" - return self.Material.Density * self.Material.SpecificHeat * self.Thickness - - @property - def specific_heat(self): - """The material layer's specific heat [J/kg-K].""" - return self.Material.SpecificHeat - - def to_dict(self): - return collections.OrderedDict( - Material={"$ref": str(self.Material.id)}, - Thickness=round(self.Thickness, decimals=3), - ) - - def mapping(self): - return dict(Material=self.Material, Thickness=self.Thickness) - - def get_unique(self): - return self - - def __hash__(self): - return id(self) - - def __eq__(self, other): - if not isinstance(other, MaterialLayer): - return NotImplemented - else: - return all( - [self.Thickness == other.Thickness, self.Material == other.Material] - ) - - def __repr__(self): - return "{} with thickness of {:,.3f} m".format(self.Material, self.Thickness) - - def __iter__(self): - for k, v in self.mapping().items(): - yield k, v - - -from collections.abc import Hashable, MutableSet - - class UserSet(Hashable, MutableSet): + """UserSet class.""" + __hash__ = MutableSet._hash def __init__(self, iterable=()): + """Initialize object.""" self.data = set(iterable) def __contains__(self, value): + """Assert value is in self.data.""" return value in self.data def __iter__(self): + """Iterate over self.data.""" return iter(self.data) def __len__(self): + """return len of self.""" return len(self.data) def __repr__(self): + """Return a representation of self.""" return repr(self.data) def __add__(self, other): + """Add other to self.""" self.data.update(other.data) return self def update(self, other): + """Update self with other.""" self.data.update(other.data) return self def add(self, item): + """Add an item.""" self.data.add(item) def discard(self, item): + """Remove a class if it is currently present.""" self.data.discard(item) @@ -673,135 +490,31 @@ class MetaData(UserSet): @property def Name(self): + """Get object name.""" return "+".join([obj.Name for obj in self]) @property def comments(self): + """Get object comments.""" return "Object composed of a combination of these objects:\n{}".format( set(obj.Name for obj in self) ) -def load_json_objects(datastore, idf=None): - """ - Args: - datastore: - """ - from archetypal.template import ( - BuildingTemplate, - DaySchedule, - DomesticHotWaterSetting, - GasMaterial, - GlazingMaterial, - OpaqueConstruction, - OpaqueMaterial, - StructureInformation, - VentilationSetting, - WeekSchedule, - WindowConstruction, - WindowSetting, - YearSchedule, - ZoneConditioning, - ZoneConstructionSet, - ZoneDefinition, - ZoneLoad, - ) - - if not idf: - idf = IDF(prep_outputs=False) - t = dict( - # with datastore, create each objects - GasMaterials=[ - GasMaterial.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["GasMaterials"] - ], - GlazingMaterials=[ - GlazingMaterial(**store, idf=idf, allow_duplicates=True) - for store in datastore["GlazingMaterials"] - ], - OpaqueMaterials=[ - OpaqueMaterial(**store, idf=idf, allow_duplicates=True) - for store in datastore["OpaqueMaterials"] - ], - OpaqueConstructions=[ - OpaqueConstruction.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["OpaqueConstructions"] - ], - WindowConstructions=[ - WindowConstruction.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["WindowConstructions"] - ], - StructureDefinitions=[ - StructureInformation.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["StructureDefinitions"] - ], - DaySchedules=[ - DaySchedule.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["DaySchedules"] - ], - WeekSchedules=[ - WeekSchedule.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["WeekSchedules"] - ], - YearSchedules=[ - YearSchedule.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["YearSchedules"] - ], - DomesticHotWaterSettings=[ - DomesticHotWaterSetting.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["DomesticHotWaterSettings"] - ], - VentilationSettings=[ - VentilationSetting.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["VentilationSettings"] - ], - ZoneConditionings=[ - ZoneConditioning.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["ZoneConditionings"] - ], - ZoneConstructionSets=[ - ZoneConstructionSet.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["ZoneConstructionSets"] - ], - ZoneLoads=[ - ZoneLoad.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["ZoneLoads"] - ], - Zones=[ - ZoneDefinition.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["Zones"] - ], - WindowSettings=[ - WindowSetting.from_ref( - store["$ref"], datastore["BuildingTemplates"], idf=idf - ) - if "$ref" in store - else WindowSetting.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["WindowSettings"] - ], - BuildingTemplates=[ - BuildingTemplate.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["BuildingTemplates"] - ], - ) - return t - - class UniqueName(str): - """Handles the attribution of user defined names for :class:`UmiBase`, and - makes sure they are unique. - """ + """Attribute unique user-defined names for :class:`UmiBase`.""" existing = set() def __new__(cls, content): - """Pick a name. Will increment the name if already used""" + """Pick a name. Will increment the name if already used.""" return str.__new__(cls, cls.create_unique(content)) @classmethod def create_unique(cls, name): - """Check if name has already been used. If so, try to increment until - not used + """Check if name has already been used. + + If so, try to increment until not used. Args: name: diff --git a/archetypal/template/ventilation.py b/archetypal/template/ventilation.py index 28f168c1..118bc8a5 100644 --- a/archetypal/template/ventilation.py +++ b/archetypal/template/ventilation.py @@ -1,25 +1,23 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal VentilationSetting.""" import collections import logging as lg +from enum import Enum import numpy as np import pandas as pd -from deprecation import deprecated from sigfig import round +from validator_collection import checkers, validators -from archetypal import __version__, settings -from archetypal.template import UmiBase, UmiSchedule, UniqueName +from archetypal.template.schedule import UmiSchedule +from archetypal.template.umi_base import UmiBase from archetypal.utils import log, timeit, top, weighted_mean def resolve_temp(temp, idf): - """Resolve the temperature. If a float is passed, simply return it. If a str + """Resolve the temperature given a float or a string. + + If a float is passed, simply return it. If a str is passed, get the schedule and return the mean value. Args: @@ -29,53 +27,102 @@ def resolve_temp(temp, idf): if isinstance(temp, float): return temp elif isinstance(temp, str): - sched = UmiSchedule(Name=temp, idf=idf) + epbunch = idf.schedules_dict[temp.upper()] + sched = UmiSchedule.from_epbunch(epbunch) return sched.all_values.mean() +class VentilationType(Enum): + """EnergyPlus Ventilation Types for ZoneVentilation:DesignFlowrate. + + This alpha character string defines the type of ventilation as one of the + following options: Natural, Exhaust, Intake, or Balanced. Natural ventilation is + assumed to be air movement/exchange as a result of openings in the building + façade and will not consume any fan energy. Values for fan pressure and + efficiency for natural ventilation are ignored. For either Exhaust or Intake, + values for fan pressure and efficiency define the fan electric consumption. For + Natural and Exhaust ventilation, the conditions of the air entering the space are + assumed to be equivalent to outside air conditions. For Intake and Balanced + ventilation, an appropriate amount of fan heat is added to the entering air + stream. For Balanced ventilation, both an intake fan and an exhaust fan are + assumed to co-exist, both having the same flow rate and power consumption (using + the entered values for fan pressure rise and fan total efficiency). Thus, + the fan electric consumption for Balanced ventilation is twice that for the + Exhaust or Intake ventilation types which employ only a single fan. + """ + + Natural = 0 + Intake = 1 + Exhaust = 2 + Balanced = 3 + + class VentilationSetting(UmiBase): - """Zone Ventilation Settings + """Zone Ventilation Settings. .. image:: ../images/template/zoneinfo-ventilation.png """ + __slots__ = ( + "_infiltration", + "_is_infiltration_on", + "_is_buoyancy_on", + "_is_nat_vent_on", + "_is_scheduled_ventilation_on", + "_is_wind_on", + "_natural_ventilation_max_outdoor_air_temp", + "_natural_ventilation_max_relative_humidity", + "_natural_ventilation_min_outdoor_air_temp", + "_natural_ventilation_zone_setpoint_temp", + "_scheduled_ventilation_ach", + "_scheduled_ventilation_setpoint", + "_scheduled_ventilation_schedule", + "_nat_ventilation_schedule", + "_ventilation_type", + "_afn", + "_area", + "_volume", + ) + def __init__( self, - NatVentSchedule=None, - ScheduledVentilationSchedule=None, - Afn=False, + Name, Infiltration=0.1, - IsBuoyancyOn=True, IsInfiltrationOn=True, IsNatVentOn=False, - IsScheduledVentilationOn=False, + NatVentSchedule=None, IsWindOn=False, + IsBuoyancyOn=True, NatVentMaxOutdoorAirTemp=30, NatVentMaxRelHumidity=90, NatVentMinOutdoorAirTemp=0, NatVentZoneTempSetpoint=18, ScheduledVentilationAch=0.6, + ScheduledVentilationSchedule=None, ScheduledVentilationSetpoint=18, - **kwargs + IsScheduledVentilationOn=False, + VentilationType=VentilationType.Exhaust, + Afn=False, + area=1, + volume=1, + **kwargs, ): - """Initialize a new VentilationSetting (for zone) object + """Initialize a new VentilationSetting (for zone) object. Args: NatVentSchedule (UmiSchedule): The name of the schedule (Day | Week | Year) which ultimately modifies the Opening Area - value (see previous field). In its current implementation, any - value greater than 0 will consider, value above The schedule - values must be any positive number between 0 and 1 as a - fraction. + value. In its current implementation, any + value greater than 0 will consider an open window. ScheduledVentilationSchedule (UmiSchedule): The name of the schedule (Schedules Tab) that modifies the maximum design volume flow rate. This fraction is between 0.0 and 1.0. - Afn (bool): - Infiltration (float): Infiltration rate in ACH + Afn (bool): Todo: Not Used. + Infiltration (float): Infiltration rate in ACH. IsBuoyancyOn (bool): If True, simulation takes into account the stack effect in the infiltration calculation IsInfiltrationOn (bool): If yes, there is heat transfer between the - building and the outside caused by infiltration + building and the outside caused by infiltration. IsNatVentOn (bool): If True, Natural ventilation (air movement/exchange as a result of openings in the building façade not consuming any fan energy). @@ -111,16 +158,33 @@ def __init__( to be available if the zone air temperature is above 20°C. If the zone air temperature drops below 20°C, then ventilation is automatically turned off. - **kwargs: + VentilationType (int): This alpha character string defines the type of + ventilation as one of the following options: Natural, Exhaust, + Intake, or Balanced. Natural ventilation is assumed to be air + movement/exchange as a result of openings in the building façade and + will not consume any fan energy. Values for fan pressure and + efficiency for natural ventilation are ignored. For either Exhaust or + Intake, values for fan pressure and efficiency define the fan + electric consumption. For Natural and Exhaust ventilation, + the conditions of the air entering the space are assumed to be + equivalent to outside air conditions. For Intake and Balanced + ventilation, an appropriate amount of fan heat is added to the entering + air stream. For Balanced ventilation, both an intake fan and an + exhaust fan are assumed to co-exist, both having the same flow rate + and power consumption (using the entered values for fan pressure rise + and fan total efficiency). Thus, the fan electric consumption for + Balanced ventilation is twice that for the Exhaust or Intake + ventilation types which employ only a single fan. + **kwargs: keywords passed to the constructor. """ - super(VentilationSetting, self).__init__(**kwargs) - self.Afn = Afn + super(VentilationSetting, self).__init__(Name, **kwargs) + self.Infiltration = Infiltration - self.IsBuoyancyOn = IsBuoyancyOn self.IsInfiltrationOn = IsInfiltrationOn self.IsNatVentOn = IsNatVentOn - self.IsScheduledVentilationOn = IsScheduledVentilationOn + self.NatVentSchedule = NatVentSchedule self.IsWindOn = IsWindOn + self.IsBuoyancyOn = IsBuoyancyOn self.NatVentMaxOutdoorAirTemp = NatVentMaxOutdoorAirTemp self.NatVentMaxRelHumidity = NatVentMaxRelHumidity self.NatVentMinOutdoorAirTemp = NatVentMinOutdoorAirTemp @@ -128,127 +192,306 @@ def __init__( self.ScheduledVentilationAch = ScheduledVentilationAch self.ScheduledVentilationSetpoint = ScheduledVentilationSetpoint self.ScheduledVentilationSchedule = ScheduledVentilationSchedule - self.NatVentSchedule = NatVentSchedule + self.IsScheduledVentilationOn = IsScheduledVentilationOn + self.VentilationType = VentilationType + self.Afn = Afn + self.area = area + self.volume = volume + + @property + def NatVentSchedule(self): + """Get or set the natural ventilation schedule. + + Hint: + This schedule ultimately modifies the Opening Area value. + """ + return self._nat_ventilation_schedule + + @NatVentSchedule.setter + def NatVentSchedule(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input error with value {value}. NatVentSchedule must " + f"be an UmiSchedule, not a {type(value)}" + ) + self._nat_ventilation_schedule = value - self._belongs_to_zone = kwargs.get("zone", None) + @property + def ScheduledVentilationSchedule(self): + """Get or set the scheduled ventilation schedule.""" + return self._scheduled_ventilation_schedule + + @ScheduledVentilationSchedule.setter + def ScheduledVentilationSchedule(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input error with value {value}. ScheduledVentilationSchedule must " + f"be an UmiSchedule, not a {type(value)}" + ) + value.quantity = self.ScheduledVentilationAch + self._scheduled_ventilation_schedule = value @property def Infiltration(self): - return float(self._Infiltration) + """Get or set the infiltration air change rate [ach].""" + return self._infiltration @Infiltration.setter def Infiltration(self, value): - self._Infiltration = value + if value is None: + value = 0 + value = validators.float(value, minimum=0) + if value == 0: + self.IsInfiltrationOn = False + self._infiltration = value + + @property + def IsInfiltrationOn(self): + """Get or set the the infiltration [bool].""" + return self._is_infiltration_on + + @IsInfiltrationOn.setter + def IsInfiltrationOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsInfiltrationOn must " + f"be an boolean, not a {type(value)}" + ) + self._is_infiltration_on = value + + @property + def IsBuoyancyOn(self): + """Get or set the buoyancy boolean.""" + return self._is_buoyancy_on + + @IsBuoyancyOn.setter + def IsBuoyancyOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsBuoyancyOn must " + f"be an boolean, not a {type(value)}" + ) + self._is_buoyancy_on = value + + @property + def IsNatVentOn(self): + """Get or set the natural ventilation [bool].""" + return self._is_nat_vent_on + + @IsNatVentOn.setter + def IsNatVentOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsNatVentOn must " + f"be an boolean, not a {type(value)}" + ) + self._is_nat_vent_on = value + + @property + def IsScheduledVentilationOn(self): + """Get or set the scheduled ventilation [bool].""" + return self._is_scheduled_ventilation_on + + @IsScheduledVentilationOn.setter + def IsScheduledVentilationOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsScheduledVentilationOn must " + f"be an boolean, not a {type(value)}" + ) + if value: + assert ( + self.ScheduledVentilationAch > 0 + and self.ScheduledVentilationSchedule is not None + ), ( + f"IsScheduledVentilationOn cannot be 'True' if ScheduledVentilationAch " + f"is 0 or if ScheduledVentilationSchedule is None." + ) + self._is_scheduled_ventilation_on = value + + @property + def IsWindOn(self): + """Get or set the wind effect [bool].""" + return self._is_wind_on + + @IsWindOn.setter + def IsWindOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsWindOn must " + f"be an boolean, not a {type(value)}" + ) + self._is_wind_on = value @property def NatVentMaxOutdoorAirTemp(self): - return float(self._NatVentMaxOutdoorAirTemp) + """Get or set the natural ventilation maximum outdoor air temperature [degC].""" + return self._natural_ventilation_max_outdoor_air_temp @NatVentMaxOutdoorAirTemp.setter def NatVentMaxOutdoorAirTemp(self, value): - self._NatVentMaxOutdoorAirTemp = value + self._natural_ventilation_max_outdoor_air_temp = validators.float( + value, minimum=-100, maximum=100 + ) @property def NatVentMaxRelHumidity(self): - return float(self._NatVentMaxRelHumidity) + """Get or set the natural ventilation relative humidity setpoint [%].""" + return self._natural_ventilation_max_relative_humidity @NatVentMaxRelHumidity.setter def NatVentMaxRelHumidity(self, value): - self._NatVentMaxRelHumidity = value + self._natural_ventilation_max_relative_humidity = validators.float( + value, minimum=0, maximum=100 + ) @property def NatVentMinOutdoorAirTemp(self): - return float(self._NatVentMinOutdoorAirTemp) + """Get or set the natural ventilation minimum outdoor air temperature [degC].""" + return self._natural_ventilation_min_outdoor_air_temp @NatVentMinOutdoorAirTemp.setter def NatVentMinOutdoorAirTemp(self, value): - self._NatVentMinOutdoorAirTemp = value + self._natural_ventilation_min_outdoor_air_temp = validators.float( + value, minimum=-100, maximum=100 + ) @property def NatVentZoneTempSetpoint(self): - return float(self._NatVentZoneTempSetpoint) + """Get or set the natural ventilation zone temperature setpoint [degC].""" + return self._natural_ventilation_zone_setpoint_temp @NatVentZoneTempSetpoint.setter def NatVentZoneTempSetpoint(self, value): - self._NatVentZoneTempSetpoint = value + self._natural_ventilation_zone_setpoint_temp = validators.float( + value, + minimum=self.NatVentMinOutdoorAirTemp, + maximum=self.NatVentMaxOutdoorAirTemp, + ) @property def ScheduledVentilationAch(self): - return float(self._ScheduledVentilationAch) + """Get or set the scheduled ventilation air changes per hours [-].""" + return self._scheduled_ventilation_ach @ScheduledVentilationAch.setter def ScheduledVentilationAch(self, value): - self._ScheduledVentilationAch = value + if value is None: + value = 0 + self._scheduled_ventilation_ach = validators.float(value, minimum=0) @property def ScheduledVentilationSetpoint(self): - return float(self._ScheduledVentilationSetpoint) + """Get or set the scheduled ventilation setpoint.""" + return self._scheduled_ventilation_setpoint @ScheduledVentilationSetpoint.setter def ScheduledVentilationSetpoint(self, value): - self._ScheduledVentilationSetpoint = value + self._scheduled_ventilation_setpoint = validators.float( + value, minimum=-100, maximum=100 + ) - def __add__(self, other): - return self.combine(other) + @property + def VentilationType(self): + """Get or set the ventilation type. - def __hash__(self): - return hash( - (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + Choices are (, , + , ). + """ + return self._ventilation_type + + @VentilationType.setter + def VentilationType(self, value): + if checkers.is_string(value): + assert VentilationType[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in VentilationType)}" + ) + self._ventilation_type = VentilationType[value] + elif checkers.is_numeric(value): + assert VentilationType[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in VentilationType)}" + ) + self._ventilation_type = VentilationType(value) + self._ventilation_type = value + + @property + def Afn(self): + """Get or set the use of the airflow network [bool].""" + return self._afn + + @Afn.setter + def Afn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. Afn must " + f"be an boolean, not a {type(value)}" ) + self._afn = value - def __eq__(self, other): - if not isinstance(other, VentilationSetting): - return NotImplemented - else: - return all( - [ - self.NatVentSchedule == other.NatVentSchedule, - self.ScheduledVentilationSchedule - == self.ScheduledVentilationSchedule, - self.Afn == other.Afn, - self.Infiltration == other.Infiltration, - self.IsBuoyancyOn == other.IsBuoyancyOn, - self.IsInfiltrationOn == other.IsInfiltrationOn, - self.IsNatVentOn == other.IsNatVentOn, - self.IsScheduledVentilationOn == other.IsScheduledVentilationOn, - self.IsWindOn == other.IsWindOn, - self.NatVentMaxOutdoorAirTemp == other.NatVentMaxOutdoorAirTemp, - self.NatVentMaxRelHumidity == other.NatVentMaxRelHumidity, - self.NatVentMinOutdoorAirTemp == other.NatVentMinOutdoorAirTemp, - self.NatVentZoneTempSetpoint == other.NatVentZoneTempSetpoint, - self.ScheduledVentilationAch == other.ScheduledVentilationAch, - self.ScheduledVentilationSetpoint - == other.ScheduledVentilationSetpoint, - ] - ) + @property + def area(self): + """Get or set the area of the zone [m²].""" + return self._area - @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): + @area.setter + def area(self, value): + self._area = validators.float(value, minimum=0) + + @property + def volume(self): + """Get or set the volume of the zone [m³].""" + return self._volume - return cls.from_dict(*args, **kwargs) + @volume.setter + def volume(self, value): + self._volume = validators.float(value, minimum=0) @classmethod - def from_dict(cls, *args, **kwargs): - """ + def from_dict(cls, data, schedules, **kwargs): + """Create a VentilationSetting from a dictionary. + Args: - *args: - **kwargs: + data (dict): The python dictionary. + schedules (dict): A dictionary of UmiSchedules with their id as keys. + **kwargs: keywords passed parent constructor. + + .. code-block:: python + { + "$id": "162", + "Afn": false, + "IsBuoyancyOn": true, + "Infiltration": 0.35, + "IsInfiltrationOn": true, + "IsNatVentOn": false, + "IsScheduledVentilationOn": false, + "NatVentMaxRelHumidity": 80.0, + "NatVentMaxOutdoorAirTemp": 26.0, + "NatVentMinOutdoorAirTemp": 20.0, + "NatVentSchedule": { + "$ref": "151" + }, + "NatVentZoneTempSetpoint": 22.0, + "ScheduledVentilationAch": 0.6, + "ScheduledVentilationSchedule": { + "$ref": "151" + }, + "ScheduledVentilationSetpoint": 22.0, + "IsWindOn": false, + "Category": "Office Spaces", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Off_0 ventilation" + } """ - vs = cls(*args, **kwargs) - vent_sch = kwargs.get("ScheduledVentilationSchedule", None) - vs.ScheduledVentilationSchedule = vs.get_ref(vent_sch) - nat_sch = kwargs.get("NatVentSchedule", None) - vs.NatVentSchedule = vs.get_ref(nat_sch) - return vs - - def to_json(self): - """Convert class properties to dict""" + vent_sch = schedules[data.pop("ScheduledVentilationSchedule")["$ref"]] + nat_sch = schedules[data.pop("NatVentSchedule")["$ref"]] + _id = data.pop("$id") + return cls( + id=_id, + ScheduledVentilationSchedule=vent_sch, + NatVentSchedule=nat_sch, + **data, + **kwargs, + ) + + def to_dict(self): + """Return VentilationSetting dictionary representation.""" self.validate() # Validate object before trying to get json format data_dict = collections.OrderedDict() @@ -263,29 +506,30 @@ def to_json(self): data_dict["NatVentMaxRelHumidity"] = round(self.NatVentMaxRelHumidity, 3) data_dict["NatVentMaxOutdoorAirTemp"] = round(self.NatVentMaxOutdoorAirTemp, 3) data_dict["NatVentMinOutdoorAirTemp"] = round(self.NatVentMinOutdoorAirTemp, 3) - data_dict["NatVentSchedule"] = self.NatVentSchedule.to_dict() + data_dict["NatVentSchedule"] = self.NatVentSchedule.to_ref() data_dict["NatVentZoneTempSetpoint"] = round(self.NatVentZoneTempSetpoint, 3) data_dict["ScheduledVentilationAch"] = round(self.ScheduledVentilationAch, 3) data_dict[ "ScheduledVentilationSchedule" - ] = self.ScheduledVentilationSchedule.to_dict() + ] = self.ScheduledVentilationSchedule.to_ref() data_dict["ScheduledVentilationSetpoint"] = round( self.ScheduledVentilationSetpoint, 3 ) data_dict["IsWindOn"] = self.IsWindOn data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict @classmethod @timeit - def from_zone(cls, zone, **kwargs): - """ + def from_zone(cls, zone, zone_ep, **kwargs): + """Create VentilationSetting from a zone object. Args: + zone_ep: zone (template.zone.Zone): zone to gets information from """ # If Zone is not part of Conditioned Area, it should not have a @@ -294,14 +538,14 @@ def from_zone(cls, zone, **kwargs): return None name = zone.Name + "_VentilationSetting" - df = {"a": zone.idf.sql()} + df = {"a": zone_ep.theidf.sql()} ni_df = nominal_infiltration(df) sched_df = nominal_mech_ventilation(df) nat_df = nominal_nat_ventilation(df) index = ("a", zone.Name.upper()) # Do infiltration - Infiltration, IsInfiltrationOn = do_infiltration(index, ni_df, zone) + Infiltration, IsInfiltrationOn = do_infiltration(index, ni_df) # Do natural ventilation ( @@ -313,7 +557,7 @@ def from_zone(cls, zone, **kwargs): NatVentMinOutdoorAirTemp, NatVentSchedule, NatVentZoneTempSetpoint, - ) = do_natural_ventilation(index, nat_df, zone) + ) = do_natural_ventilation(index, nat_df, zone, zone_ep) # Do scheduled ventilation ( @@ -340,30 +584,36 @@ def from_zone(cls, zone, **kwargs): IsScheduledVentilationOn=IsScheduledVentilationOn, ScheduledVentilationAch=ScheduledVentilationAch, ScheduledVentilationSetpoint=ScheduledVentilationSetpoint, - idf=zone.idf, - Category=zone.idf.name, - **kwargs + Category=zone.DataSource, + **kwargs, ) return z_vent - def combine(self, other, weights=None): - """Combine two VentilationSetting objects together. + def combine(self, other, **kwargs): + """Combine VentilationSetting objects together. Args: other (VentilationSetting): - weights (list-like, optional): A list-like object of len 2. If None, - the volume of the zones for which self and other belongs is - used. + kwargs: keywords passed to constructor. Returns: (VentilationSetting): the combined VentilationSetting object. """ - # Check if other is None. Simply return self - if not other: - return self - - if not self: - return other + # Check if other is None. Simply return self or if other is not the same as self + if not self and not other: + return None + elif self == other: + area = 1 if self.area + other.area == 2 else self.area + other.area + volume = ( + 1 if self.volume + other.volume == 2 else self.volume + other.volume + ) + new_obj = self.duplicate() + new_obj.area = area + new_obj.volume = volume + return new_obj + elif not self or not other: + new_obj = (self or other).duplicate() + return new_obj # Check if other is the same type as self if not isinstance(other, self.__class__): @@ -373,68 +623,53 @@ def combine(self, other, weights=None): ) raise NotImplementedError(msg) - # Check if other is not the same as self - if self == other: - return self - meta = self._get_predecessors_meta(other) - if not weights: - zone_weight = settings.zone_weight - weights = [ - getattr(self._belongs_to_zone, str(zone_weight)), - getattr(other._belongs_to_zone, str(zone_weight)), - ] - log( - 'using zone {} "{}" as weighting factor in "{}" ' - "combine.".format( - zone_weight, - " & ".join(list(map(str, map(int, weights)))), - self.__class__.__name__, - ) - ) - - a = UmiSchedule.combine(self.NatVentSchedule, other.NatVentSchedule, weights) - b = UmiSchedule.combine( - self.ScheduledVentilationSchedule, - other.ScheduledVentilationSchedule, - weights, - ) - c = any((self.Afn, other.Afn)) - d = self._float_mean(other, "Infiltration", weights) - e = any((self.IsBuoyancyOn, other.IsBuoyancyOn)) - f = any((self.IsInfiltrationOn, other.IsInfiltrationOn)) - g = any((self.IsNatVentOn, other.IsNatVentOn)) - h = any((self.IsScheduledVentilationOn, other.IsScheduledVentilationOn)) - i = any((self.IsWindOn, other.IsWindOn)) - j = self._float_mean(other, "NatVentMaxOutdoorAirTemp", weights) - k = self._float_mean(other, "NatVentMaxRelHumidity", weights) - l = self._float_mean(other, "NatVentMinOutdoorAirTemp", weights) - m = self._float_mean(other, "NatVentZoneTempSetpoint", weights) - n = self._float_mean(other, "ScheduledVentilationAch", weights) - o = self._float_mean(other, "ScheduledVentilationSetpoint", weights) - - new_attr = dict( - NatVentSchedule=a, - ScheduledVentilationSchedule=b, - Afn=c, - Infiltration=d, - IsBuoyancyOn=e, - IsInfiltrationOn=f, - IsNatVentOn=g, - IsScheduledVentilationOn=h, - IsWindOn=i, - NatVentMaxOutdoorAirTemp=j, - NatVentMaxRelHumidity=k, - NatVentMinOutdoorAirTemp=l, - NatVentZoneTempSetpoint=m, - ScheduledVentilationAch=n, - ScheduledVentilationSetpoint=o, - ) - - # create a new object with the previous attributes + # create a new object with the combined attributes new_obj = self.__class__( - **meta, **new_attr, idf=self.idf, allow_duplicates=self._allow_duplicates + NatVentSchedule=UmiSchedule.combine( + self.NatVentSchedule, other.NatVentSchedule, [self.area, other.area] + ), + ScheduledVentilationSchedule=UmiSchedule.combine( + self.ScheduledVentilationSchedule, + other.ScheduledVentilationSchedule, + weights=[self.volume, other.volume], + quantity=True, + ), + Afn=any((self.Afn, other.Afn)), + Infiltration=self.float_mean( + other, "Infiltration", [self.area, other.area] + ), + IsBuoyancyOn=any((self.IsBuoyancyOn, other.IsBuoyancyOn)), + IsInfiltrationOn=any((self.IsInfiltrationOn, other.IsInfiltrationOn)), + IsNatVentOn=any((self.IsNatVentOn, other.IsNatVentOn)), + IsScheduledVentilationOn=any( + (self.IsScheduledVentilationOn, other.IsScheduledVentilationOn) + ), + IsWindOn=any((self.IsWindOn, other.IsWindOn)), + NatVentMaxOutdoorAirTemp=self.float_mean( + other, "NatVentMaxOutdoorAirTemp", [self.area, other.area] + ), + NatVentMaxRelHumidity=self.float_mean( + other, "NatVentMaxRelHumidity", [self.area, other.area] + ), + NatVentMinOutdoorAirTemp=self.float_mean( + other, "NatVentMinOutdoorAirTemp", [self.area, other.area] + ), + NatVentZoneTempSetpoint=self.float_mean( + other, "NatVentZoneTempSetpoint", [self.area, other.area] + ), + ScheduledVentilationAch=self.float_mean( + other, "ScheduledVentilationAch", [self.volume, other.volume] + ), + ScheduledVentilationSetpoint=self.float_mean( + other, "ScheduledVentilationSetpoint", [self.area, other.area] + ), + area=1 if self.area + other.area == 2 else self.area + other.area, + volume=1 if self.volume + other.volume == 2 else self.volume + other.volume, + **meta, + **kwargs, + allow_duplicates=self.allow_duplicates, ) new_obj.predecessors.update(self.predecessors + other.predecessors) return new_obj @@ -443,16 +678,21 @@ def validate(self): """Validate object and fill in missing values.""" if not self.NatVentSchedule: self.NatVentSchedule = UmiSchedule.constant_schedule( - hourly_value=0, Name="AlwaysOff", allow_duplicates=True, idf=self.idf + value=0, Name="AlwaysOff", allow_duplicates=True ) if not self.ScheduledVentilationSchedule: self.ScheduledVentilationSchedule = UmiSchedule.constant_schedule( - hourly_value=0, Name="AlwaysOff", allow_duplicates=True, idf=self.idf + value=0, Name="AlwaysOff", allow_duplicates=True ) return self - def mapping(self): + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate: + """ self.validate() return dict( @@ -477,38 +717,233 @@ def mapping(self): Name=self.Name, ) - def get_ref(self, ref): - """Get item matching reference id. + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def __add__(self, other): + """Combine self and other.""" + return self.combine(other) + + def __hash__(self): + """Return the hash value of self.""" + return hash( + (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + ) + + def __key__(self): + """Get a tuple of attributes. Useful for hashing and comparing.""" + return ( + self.NatVentSchedule, + self.ScheduledVentilationSchedule, + self.Afn, + self.Infiltration, + self.IsBuoyancyOn, + self.IsInfiltrationOn, + self.IsNatVentOn, + self.IsScheduledVentilationOn, + self.IsWindOn, + self.NatVentMaxOutdoorAirTemp, + self.NatVentMaxRelHumidity, + self.NatVentMinOutdoorAirTemp, + self.NatVentZoneTempSetpoint, + self.ScheduledVentilationAch, + self.ScheduledVentilationSetpoint, + ) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, VentilationSetting): + return NotImplemented + else: + return self.__key__() == other.__key__() + + def __copy__(self): + """Create a copy of self.""" + return self.__class__( + **self.mapping(validate=False), area=self.area, volume=self.volume + ) + + def to_epbunch(self, idf, zone_name, opening_area=0.0): + """Convert self to the EpBunches given an idf model, a zone name. + + Notes: + Note that attr:`IsInfiltrationOn`, attr:`IsScheduledVentilationOn` and + attr:`IsNatVentOn` must be `True` for their respective EpBunch objects + to be created. Args: - ref: + idf (IDF): The idf model in which the EpBunch is created. + zone_name (str): The zone name to associate this EpBunch. + opening_area (float): The opening area exposed to outdoors (m2) + in a zone. + + .. code-block:: + + ZONEINFILTRATION:DESIGNFLOWRATE, + Zone Infiltration, !- Name + Zone 1, !- Zone or ZoneList Name + AlwaysOn, !- Schedule Name + AirChanges/Hour, !- Design Flow Rate Calculation Method + , !- Design Flow Rate + , !- Flow per Zone Floor Area + , !- Flow per Exterior Surface Area + 0.1, !- Air Changes per Hour + 1, !- Constant Term Coefficient + 0, !- Temperature Term Coefficient + 0, !- Velocity Term Coefficient + 0; !- Velocity Squared Term Coefficient + + ZONEVENTILATION:DESIGNFLOWRATE, + Zone 1 Ventilation, !- Name + Zone 1, !- Zone or ZoneList Name + AlwaysOn, !- Schedule Name + AirChanges/Hour, !- Design Flow Rate Calculation Method + , !- Design Flow Rate + , !- Flow Rate per Zone Floor Area + , !- Flow Rate per Person + 0.6, !- Air Changes per Hour + Exhaust, !- Ventilation Type + 67, !- Fan Pressure Rise + 0.7, !- Fan Total Efficiency + 1, !- Constant Term Coefficient + 0, !- Temperature Term Coefficient + 0, !- Velocity Term Coefficient + 0, !- Velocity Squared Term Coefficient + -100, !- Minimum Indoor Temperature + , !- Minimum Indoor Temperature Schedule Name + 100, !- Maximum Indoor Temperature + , !- Maximum Indoor Temperature Schedule Name + -100, !- Delta Temperature + , !- Delta Temperature Schedule Name + -100, !- Minimum Outdoor Temperature + , !- Minimum Outdoor Temperature Schedule Name + 100, !- Maximum Outdoor Temperature + , !- Maximum Outdoor Temperature Schedule Name + 40; !- Maximum Wind Speed) + + ZONEVENTILATION:WINDANDSTACKOPENAREA, + , !- Name + , !- Zone Name + 0, !- Opening Area + , !- Opening Area Fraction Schedule Name + Autocalculate, !- Opening Effectiveness + 0, !- Effective Angle + 0, !- Height Difference + Autocalculate, !- Discharge Coefficient for Opening + -100, !- Minimum Indoor Temperature + , !- Minimum Indoor Temperature Schedule Name + 100, !- Maximum Indoor Temperature + , !- Maximum Indoor Temperature Schedule Name + -100, !- Delta Temperature + , !- Delta Temperature Schedule Name + -100, !- Minimum Outdoor Temperature + , !- Minimum Outdoor Temperature Schedule Name + 100, !- Maximum Outdoor Temperature + , !- Maximum Outdoor Temperature Schedule Name + 40; !- Maximum Wind Speed + + Returns: + tuple: A 3-tuple of EpBunch objects added to the idf model. """ - return next( - iter( - [ - value - for value in VentilationSetting.CREATED_OBJECTS - if value.id == ref["$ref"] - ] - ), - None, - ) + if self.IsInfiltrationOn: + infiltration_epbunch = idf.newidfobject( + key="ZONEINFILTRATION:DESIGNFLOWRATE", + Name=f"{zone_name} Infiltration", + Zone_or_ZoneList_Name=zone_name, + Schedule_Name=idf.newidfobject( + key="SCHEDULE:CONSTANT", Name="AlwaysOn", Hourly_Value=1 + ).Name, + Design_Flow_Rate_Calculation_Method="AirChanges/Hour", + Air_Changes_per_Hour=self.Infiltration, + Constant_Term_Coefficient=1, + Temperature_Term_Coefficient=0, + Velocity_Term_Coefficient=0, + Velocity_Squared_Term_Coefficient=0, + ) + else: + infiltration_epbunch = None + log("No epbunch created since IsInfiltrationOn == False.") + + if self.IsScheduledVentilationOn: + ventilation_epbunch = idf.newidfobject( + key="ZONEVENTILATION:DESIGNFLOWRATE", + Name=f"{zone_name} Ventilation", + Zone_or_ZoneList_Name=zone_name, + Schedule_Name=self.ScheduledVentilationSchedule.to_year_week_day()[ + 0 + ].Name, # take the YearSchedule and get the name. + Design_Flow_Rate_Calculation_Method="AirChanges/Hour", + Design_Flow_Rate="", + Flow_Rate_per_Zone_Floor_Area="", + Flow_Rate_per_Person="", + Air_Changes_per_Hour=self.ScheduledVentilationAch, + Ventilation_Type=self.VentilationType.name, + Fan_Pressure_Rise=67.0, + Fan_Total_Efficiency=0.7, + Constant_Term_Coefficient=1.0, + Temperature_Term_Coefficient=0.0, + Velocity_Term_Coefficient=0.0, + Velocity_Squared_Term_Coefficient=0.0, + Minimum_Indoor_Temperature=-100, + Minimum_Indoor_Temperature_Schedule_Name="", + Maximum_Indoor_Temperature=100.0, + Maximum_Indoor_Temperature_Schedule_Name="", + Delta_Temperature=-100.0, + Delta_Temperature_Schedule_Name="", + Minimum_Outdoor_Temperature=-100.0, + Minimum_Outdoor_Temperature_Schedule_Name="", + Maximum_Outdoor_Temperature=100.0, + Maximum_Outdoor_Temperature_Schedule_Name="", + Maximum_Wind_Speed=40.0, + ) + else: + ventilation_epbunch = None + log("No epbunch created since IsScheduledVentilationOn == False.") + + if self.IsNatVentOn: + natural_epbunch = idf.newidfobject( + key="ZONEVENTILATION:WINDANDSTACKOPENAREA", + Name=f"{zone_name} Natural Ventilation", + Zone_Name=zone_name, + Opening_Area=opening_area, + Opening_Area_Fraction_Schedule_Name="", + Opening_Effectiveness="Autocalculate", + Effective_Angle=0.0, + Height_Difference=1, + Discharge_Coefficient_for_Opening="Autocalculate", + Minimum_Indoor_Temperature=self.NatVentZoneTempSetpoint, + Minimum_Indoor_Temperature_Schedule_Name="", + Maximum_Indoor_Temperature=100.0, + Maximum_Indoor_Temperature_Schedule_Name="", + Delta_Temperature=-100.0, + Delta_Temperature_Schedule_Name="", + Minimum_Outdoor_Temperature=self.NatVentMinOutdoorAirTemp, + Minimum_Outdoor_Temperature_Schedule_Name="", + Maximum_Outdoor_Temperature=self.NatVentMaxOutdoorAirTemp, + Maximum_Outdoor_Temperature_Schedule_Name="", + Maximum_Wind_Speed=40.0, + ) + else: + natural_epbunch = None + log("No epbunch created since IsNatVentOn == False.") + return infiltration_epbunch, ventilation_epbunch, natural_epbunch -def do_infiltration(index, inf_df, zone): - """Gets infiltration information of the zone + +def do_infiltration(index, inf_df): + """Get infiltration information of the zone. Args: index (tuple): Zone name inf_df (dataframe): Dataframe with infiltration information for each - zone - zone (template.zone.Zone): zone to gets information from + zone. """ if not inf_df.empty: try: Infiltration = inf_df.loc[index, "ACH - Air Changes per Hour"] IsInfiltrationOn = any(inf_df.loc[index, "Name"]) - except: + except Exception: Infiltration = 0 IsInfiltrationOn = False else: @@ -517,10 +952,11 @@ def do_infiltration(index, inf_df, zone): return Infiltration, IsInfiltrationOn -def do_natural_ventilation(index, nat_df, zone): - """Gets natural ventilation information of the zone +def do_natural_ventilation(index, nat_df, zone, zone_ep): + """Get natural ventilation information of the zone. Args: + zone_ep: index (tuple): Zone name nat_df: zone (template.zone.Zone): zone to gets information from @@ -531,9 +967,8 @@ def do_natural_ventilation(index, nat_df, zone): schedule_name_ = nat_df.loc[index, "Schedule Name"] quantity = nat_df.loc[index, "Volume Flow Rate/Floor Area {m3/s/m2}"] if schedule_name_.upper() in zone.idf.schedules_dict: - NatVentSchedule = UmiSchedule( - Name=schedule_name_, idf=zone.idf, quantity=quantity - ) + epbunch = zone.idf.schedules_dict[schedule_name_.upper()] + NatVentSchedule = UmiSchedule.from_epbunch(epbunch, quantity=quantity) else: raise KeyError except KeyError: @@ -542,28 +977,24 @@ def do_natural_ventilation(index, nat_df, zone): # in the nat_df. For the mean time, a zone containing such an # object will be turned on with an AlwaysOn schedule. IsNatVentOn = True - NatVentSchedule = UmiSchedule.constant_schedule( - idf=zone.idf, allow_duplicates=True - ) + NatVentSchedule = UmiSchedule.constant_schedule(allow_duplicates=True) except Exception: IsNatVentOn = False - NatVentSchedule = UmiSchedule.constant_schedule( - idf=zone.idf, allow_duplicates=True - ) + NatVentSchedule = UmiSchedule.constant_schedule(allow_duplicates=True) finally: try: NatVentMaxRelHumidity = 90 # todo: not sure if it is being used NatVentMaxOutdoorAirTemp = resolve_temp( nat_df.loc[index, "Maximum Outdoor Temperature{C}/Schedule"], - zone.idf, + zone_ep.theidf, ) NatVentMinOutdoorAirTemp = resolve_temp( nat_df.loc[index, "Minimum Outdoor Temperature{C}/Schedule"], - zone.idf, + zone_ep.theidf, ) NatVentZoneTempSetpoint = resolve_temp( nat_df.loc[index, "Minimum Indoor Temperature{C}/Schedule"], - zone.idf, + zone_ep.theidf, ) except KeyError: # this zone is not in the nat_df. Revert to defaults. @@ -574,16 +1005,16 @@ def do_natural_ventilation(index, nat_df, zone): else: IsNatVentOn = False - NatVentSchedule = UmiSchedule.constant_schedule( - idf=zone.idf, allow_duplicates=True - ) + NatVentSchedule = UmiSchedule.constant_schedule(allow_duplicates=True) NatVentMaxRelHumidity = 90 NatVentMaxOutdoorAirTemp = 30 NatVentMinOutdoorAirTemp = 0 NatVentZoneTempSetpoint = 18 # Is Wind ON - if not zone.idf.idfobjects["ZoneVentilation:WindandStackOpenArea".upper()].list1: + if not zone_ep.theidf.idfobjects[ + "ZoneVentilation:WindandStackOpenArea".upper() + ].list1: IsWindOn = False IsBuoyancyOn = False else: @@ -603,7 +1034,7 @@ def do_natural_ventilation(index, nat_df, zone): def do_scheduled_ventilation(index, scd_df, zone): - """Gets schedule ventilation information of the zone + """Get schedule ventilation information of the zone. Args: index (tuple): Zone name @@ -614,24 +1045,23 @@ def do_scheduled_ventilation(index, scd_df, zone): try: IsScheduledVentilationOn = any(scd_df.loc[index, "Name"]) schedule_name_ = scd_df.loc[index, "Schedule Name"] - ScheduledVentilationSchedule = UmiSchedule( - Name=schedule_name_, idf=zone.idf - ) + epbunch = zone.idf.schedules_dict[schedule_name_.upper()] + ScheduledVentilationSchedule = UmiSchedule.from_epbunch(epbunch) ScheduledVentilationAch = scd_df.loc[index, "ACH - Air Changes per Hour"] ScheduledVentilationSetpoint = resolve_temp( scd_df.loc[index, "Minimum Indoor Temperature{C}/Schedule"], zone.idf, ) - except: + except Exception: ScheduledVentilationSchedule = UmiSchedule.constant_schedule( - hourly_value=0, Name="AlwaysOff", idf=zone.idf, allow_duplicates=True + value=0, Name="AlwaysOff", allow_duplicates=True ) IsScheduledVentilationOn = False ScheduledVentilationAch = 0 ScheduledVentilationSetpoint = 18 else: ScheduledVentilationSchedule = UmiSchedule.constant_schedule( - hourly_value=0, Name="AlwaysOff", idf=zone.idf, allow_duplicates=True + value=0, Name="AlwaysOff", allow_duplicates=True ) IsScheduledVentilationOn = False ScheduledVentilationAch = 0 @@ -645,6 +1075,7 @@ def do_scheduled_ventilation(index, scd_df, zone): def nominal_nat_ventilation(df): + """Get the Nominal Natural Ventilation.""" _nom_vent = nominal_ventilation(df) if _nom_vent.empty: return _nom_vent @@ -661,6 +1092,7 @@ def nominal_nat_ventilation(df): def nominal_mech_ventilation(df): + """Get the Nominal Mechanical Ventilation.""" _nom_vent = nominal_ventilation(df) if _nom_vent.empty: return _nom_vent @@ -677,19 +1109,12 @@ def nominal_mech_ventilation(df): def nominal_infiltration(df): - """Nominal Infiltration - - Args: - df: - - Returns: - df + """Get the Nominal Infiltration. References: * `Nominal Infiltration Table \ `_ - """ df = get_from_tabulardata(df) report_name = "Initialization Summary" @@ -720,19 +1145,12 @@ def nominal_infiltration(df): def nominal_ventilation(df): - """Nominal Ventilation - - Args: - df: - - Returns: - df + """Nominal Ventilation. References: * `Nominal Ventilation Table \ `_ - """ df = get_from_tabulardata(df) report_name = "Initialization Summary" @@ -768,10 +1186,10 @@ def nominal_ventilation(df): def nominal_ventilation_aggregation(x): - """Aggregates the ventilations whithin a single zone_loads name (implies - that - .groupby(['Archetype', 'Zone Name']) is - performed before calling this function). + """Aggregate the ventilation objects whithin a single zone_loads name. + + Implies that .groupby(['Archetype', 'Zone Name']) is performed before calling + this function). Args: x: @@ -854,14 +1272,9 @@ def nominal_ventilation_aggregation(x): def get_from_tabulardata(results): - """Returns a DataFrame from the 'TabularDataWithStrings' table. A - multiindex is returned with names ['Archetype', 'Index'] - - Args: - results: - - Returns: + """Return a DataFrame from the 'TabularDataWithStrings' table. + A MultiIndex is returned with names ['Archetype', 'Index']. """ tab_data_wstring = pd.concat( [value["TabularDataWithStrings"] for value in results.values()], diff --git a/archetypal/template/window.py b/archetypal/template/window_setting.py similarity index 59% rename from archetypal/template/window.py rename to archetypal/template/window_setting.py index c24f9438..0f1a62a9 100644 --- a/archetypal/template/window.py +++ b/archetypal/template/window_setting.py @@ -1,312 +1,29 @@ -"""Window module handles window settings.""" +"""archetypal WindowSettings.""" import collections import logging as lg -from enum import Enum +from copy import copy from functools import reduce -from deprecation import deprecated -from eppy.bunch_subclass import EpBunch +from validator_collection import checkers, validators +from validator_collection.errors import EmptyValueError -import archetypal -from archetypal.simple_glazing import calc_simple_glazing -from archetypal.template import MaterialLayer, UmiSchedule, UniqueName -from archetypal.template.gas_material import GasMaterial -from archetypal.template.glazing_material import GlazingMaterial +from archetypal.template.constructions.window_construction import ( + ShadingType, + WindowConstruction, + WindowType, +) +from archetypal.template.schedule import UmiSchedule from archetypal.template.umi_base import UmiBase from archetypal.utils import log, timeit -class WindowType(Enum): - """Refers to the window type. Two choices are available: interior or exterior.""" - - External = 0 - Internal = 1 - - def __lt__(self, other): - """Return true if self lower than other.""" - return self._value_ < other._value_ - - def __gt__(self, other): - """Return true if self higher than other.""" - return self._value_ > other._value_ - - -class ShadingType(Enum): - """Refers to window shading types. - - Hint: - EnergyPlus specifies 8 different shading types, but only 2 are supported - here: InteriorShade and ExteriorShade. See shading_ for more info. - - .. _shading: https://bigladdersoftware.com/epx/docs/8-4/input-output-reference/group-thermal-zone-description-geometry.html#field-shading-type - """ - - ExteriorShade = 0 - InteriorShade = 1 - - def __lt__(self, other): - """Return true if self lower than other.""" - return self._value_ < other._value_ - - def __gt__(self, other): - """Return true if self higher than other.""" - return self._value_ > other._value_ - - -class WindowConstruction(UmiBase): - """Window Construction. - - .. image:: ../images/template/constructions-window.png - """ - - def __init__( - self, - Category="Double", - AssemblyCarbon=0, - AssemblyCost=0, - AssemblyEnergy=0, - DisassemblyCarbon=0, - DisassemblyEnergy=0, - Layers=None, - **kwargs, - ): - """Initialize a WindowConstruction. - - Args: - Category (str): "Single", "Double" or "Triple". - AssemblyCarbon (float): Assembly Embodied Carbon by m2 of - construction. - AssemblyCost (float): Assembly cost by m2 of construction. - AssemblyEnergy (float): Assembly Embodied Energy by m2; of - construction. - DisassemblyCarbon (float): Disassembly embodied carbon by m2 of - construction. - DisassemblyEnergy (float): Disassembly embodied energy by m2 of - construction. - Layers (list of MaterialLayer): - **kwargs: Other keywords passed to the constructor. - """ - super(WindowConstruction, self).__init__(**kwargs) - self.Category = Category - self.DisassemblyEnergy = DisassemblyEnergy - self.DisassemblyCarbon = DisassemblyCarbon - self.AssemblyEnergy = AssemblyEnergy - self.AssemblyCost = AssemblyCost - self.AssemblyCarbon = AssemblyCarbon - self.Layers = Layers - - def __hash__(self): - return hash((self.__class__.__name__, getattr(self, "Name", None))) - - def __eq__(self, other): - if not isinstance(other, WindowConstruction): - return NotImplemented - else: - return all( - [ - self.Category == other.Category, - self.AssemblyCarbon == other.AssemblyCarbon, - self.AssemblyCost == other.AssemblyCost, - self.AssemblyEnergy == other.AssemblyEnergy, - self.DisassemblyCarbon == other.DisassemblyCarbon, - self.DisassemblyEnergy == other.DisassemblyEnergy, - self.Layers == other.Layers, - ] - ) - - @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): - - return cls.from_dict(*args, **kwargs) - - @classmethod - def from_dict(cls, *args, **kwargs): - """Create :class:`WindowConstruction` object from json dict.""" - wc = cls(*args, **kwargs) - layers = kwargs.get("Layers", None) - - # resolve Material objects from ref - wc.Layers = [ - MaterialLayer(wc.get_ref(layer["Material"]), layer["Thickness"]) - for layer in layers - ] - return wc - - @classmethod - def from_epbunch(cls, Construction, **kwargs): - """Create :class:`WindowConstruction` object from idf Construction object. - - Example: - >>> from archetypal import IDF - >>> from archetypal.template import WindowSetting - >>> idf = IDF("myidf.idf") - >>> construction_name = "Some construction name" - >>> WindowConstruction.from_epbunch(Name=construction_name, - >>> idf=idf) - - Args: - Construction (EpBunch): The Construction epbunch object. - **kwargs: Other keywords passed to the constructor. - """ - Name = Construction.Name - idf = Construction.theidf - wc = cls(Name=Name, idf=idf, **kwargs) - wc.Layers = wc.layers(Construction, **kwargs) - catdict = {0: "Single", 1: "Single", 2: "Double", 3: "Triple", 4: "Quadruple"} - wc.Category = catdict[ - len([lyr for lyr in wc.Layers if isinstance(lyr.Material, GlazingMaterial)]) - ] - return wc - - def to_json(self): - """Convert class properties to dict.""" - self.validate() # Validate object before trying to get json format - - data_dict = collections.OrderedDict() - - data_dict["$id"] = str(self.id) - data_dict["Layers"] = [layer.to_dict() for layer in self.Layers] - data_dict["AssemblyCarbon"] = self.AssemblyCarbon - data_dict["AssemblyCost"] = self.AssemblyCost - data_dict["AssemblyEnergy"] = self.AssemblyEnergy - data_dict["DisassemblyCarbon"] = self.DisassemblyCarbon - data_dict["DisassemblyEnergy"] = self.DisassemblyEnergy - data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments - data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) - - return data_dict - - def mapping(self): - self.validate() - - return dict( - Layers=self.Layers, - AssemblyCarbon=self.AssemblyCarbon, - AssemblyCost=self.AssemblyCost, - AssemblyEnergy=self.AssemblyEnergy, - DisassemblyCarbon=self.DisassemblyCarbon, - DisassemblyEnergy=self.DisassemblyEnergy, - Category=self.Category, - Comments=self.Comments, - DataSource=self.DataSource, - Name=self.Name, - ) - - def layers(self, Construction, **kwargs): - """Retrieve layers for the WindowConstruction""" - layers = [] - for field in Construction.fieldnames: - # Loop through the layers from the outside layer towards the - # indoor layers and get the material they are made of. - material = Construction.get_referenced_object(field) or kwargs.get( - "material", None - ) - if material: - # Create the WindowMaterial:Glazing or the WindowMaterial:Gas - # and append to the list of layers - if material.key.upper() == "WindowMaterial:Glazing".upper(): - material_obj = GlazingMaterial( - Conductivity=material.Conductivity, - SolarTransmittance=material.Solar_Transmittance_at_Normal_Incidence, - SolarReflectanceFront=material.Front_Side_Solar_Reflectance_at_Normal_Incidence, - SolarReflectanceBack=material.Back_Side_Solar_Reflectance_at_Normal_Incidence, - VisibleTransmittance=material.Visible_Transmittance_at_Normal_Incidence, - VisibleReflectanceFront=material.Front_Side_Visible_Reflectance_at_Normal_Incidence, - VisibleReflectanceBack=material.Back_Side_Visible_Reflectance_at_Normal_Incidence, - IRTransmittance=material.Infrared_Transmittance_at_Normal_Incidence, - IREmissivityFront=material.Front_Side_Infrared_Hemispherical_Emissivity, - IREmissivityBack=material.Back_Side_Infrared_Hemispherical_Emissivity, - DirtFactor=material.Dirt_Correction_Factor_for_Solar_and_Visible_Transmittance, - Type="Uncoated", - Name=material.Name, - Optical=material.Optical_Data_Type, - OpticalData=material.Window_Glass_Spectral_Data_Set_Name, - idf=self.idf, - ) - - material_layer = MaterialLayer(material_obj, material.Thickness) - - elif material.key.upper() == "WindowMaterial:Gas".upper(): - # Todo: Make gas name generic, like in UmiTemplateLibrary Editor - material_obj = GasMaterial( - Name=material.Gas_Type.upper(), idf=self.idf - ) - material_layer = MaterialLayer(material_obj, material.Thickness) - elif material.key.upper() == "WINDOWMATERIAL:SIMPLEGLAZINGSYSTEM": - glass_properties = calc_simple_glazing( - material.Solar_Heat_Gain_Coefficient, - material.UFactor, - material.Visible_Transmittance, - ) - material_obj = GlazingMaterial( - **glass_properties, Name=material.Name, idf=self.idf - ) - - material_layer = MaterialLayer( - material_obj, glass_properties["Thickness"] - ) - layers.append(material_layer) - break - else: - continue - - layers.append(material_layer) - return layers - - def combine(self, other, weights=None): - """Append other to self. Return self + other as a new object. - - For now, simply returns self. - - todo: - - Implement equivalent window layers for constant u-factor. - - """ - # Check if other is None. Simply return self - if not other: - return self - - if not self: - return other - - return self - - def validate(self): - """Validate object and fill in missing values. - - todo: - - Implement validation - """ - return self - - def get_ref(self, ref): - """Get item matching reference id.""" - return next( - iter( - [ - value - for value in WindowConstruction.CREATED_OBJECTS - if value.id == ref["$ref"] - ] - ), - None, - ) - - class WindowSetting(UmiBase): - """Window Settings define the various window-related properties of a - specific :class:`Zone`. Control natural ventilation, shading and airflow - networks and more using this class. This class serves the same role as the - ZoneInformation>Windows tab in the UMI TemplateEditor. + """Defines the various window-related properties of a :class:`Zone`. + + Control natural ventilation, shading and airflow networks and more using this + class. This class serves the same role as the ZoneInformation>Windows tab in the + UMI TemplateEditor. .. image:: ../images/template/zoneinfo-windows.png @@ -320,8 +37,29 @@ class WindowSetting(UmiBase): .. _eppy : https://eppy.readthedocs.io/en/latest/ """ + __slots__ = ( + "_operable_area", + "_afn_discharge_c", + "_afn_temp_setpoint", + "_shading_system_setpoint", + "_shading_system_transmittance", + "_zone_mixing_availability_schedule", + "_shading_system_availability_schedule", + "_construction", + "_afn_window_availability", + "_is_shading_system_on", + "_is_virtual_partition", + "_is_zone_mixing_on", + "_shading_system_type", + "_type", + "_zone_mixing_delta_temperature", + "_zone_mixing_flow_rate", + "_area", + ) + def __init__( self, + Name, Construction=None, OperableArea=0.8, AfnWindowAvailability=None, @@ -338,9 +76,10 @@ def __init__( ZoneMixingAvailabilitySchedule=None, ZoneMixingDeltaTemperature=2, ZoneMixingFlowRate=0.001, + area=1, **kwargs, ): - """Initialize a WindowSetting using default values: + """Initialize a WindowSetting using default values. Args: Construction (WindowConstruction): The window construction. @@ -371,9 +110,8 @@ def __init__( Default = 0.001 m3/m2. **kwargs: other keywords passed to the constructor. """ - super(WindowSetting, self).__init__(**kwargs) + super(WindowSetting, self).__init__(Name, **kwargs) - self.ZoneMixingAvailabilitySchedule = ZoneMixingAvailabilitySchedule self.ShadingSystemAvailabilitySchedule = ShadingSystemAvailabilitySchedule self.Construction = Construction self.AfnWindowAvailability = AfnWindowAvailability @@ -389,68 +127,243 @@ def __init__( self.Type = WindowType(Type) self.ZoneMixingDeltaTemperature = ZoneMixingDeltaTemperature self.ZoneMixingFlowRate = ZoneMixingFlowRate + self.ZoneMixingAvailabilitySchedule = ZoneMixingAvailabilitySchedule + + self.area = area + + @property + def area(self): + """Get or set the area of the zone associated to this object [m²].""" + return self._area + + @area.setter + def area(self, value): + self._area = validators.float(value, minimum=0) @property def OperableArea(self): + """Get or set the operable area ratio [-].""" return self._operable_area @OperableArea.setter def OperableArea(self, value): - if value > 1: - raise ValueError("Operable Area must be a number between 0 and 1.") - self._operable_area = value + self._operable_area = validators.float(value, minimum=0, maximum=1) @property def AfnDischargeC(self): - return float(self._afn_discharge_c) + """Get or set the air flow network discarge coefficient.""" + return self._afn_discharge_c @AfnDischargeC.setter def AfnDischargeC(self, value): - if value > 1: - raise ValueError("Operable Area must be a number between 0 and 1.") - self._afn_discharge_c = value + self._afn_discharge_c = validators.float(value, minimum=0, maximum=1) @property def AfnTempSetpoint(self): - return float(self._afn_temp_setpoint) + """Get or set the air flow network setpoint temperature [degC].""" + return self._afn_temp_setpoint @AfnTempSetpoint.setter def AfnTempSetpoint(self, value): - self._afn_temp_setpoint = value + self._afn_temp_setpoint = validators.float(value, minimum=-100, maximum=100) + + @property + def AfnWindowAvailability(self): + """Get or set the air flow network window availability schedule.""" + return self._afn_window_availability + + @AfnWindowAvailability.setter + def AfnWindowAvailability(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input error with value {value}. AfnWindowAvailability must " + f"be an UmiSchedule, not a {type(value)}" + ) + self._afn_window_availability = value + + @property + def ShadingSystemType(self): + """Get or set the shading system type [enum].""" + return self._shading_system_type + + @ShadingSystemType.setter + def ShadingSystemType(self, value): + if checkers.is_string(value): + assert ShadingType[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in ShadingType)}" + ) + self._shading_system_type = ShadingType[value] + elif checkers.is_numeric(value): + assert ShadingType[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in ShadingType)}" + ) + self._shading_system_type = ShadingType(value) + elif isinstance(value, ShadingType): + self._shading_system_type = value @property def ShadingSystemSetpoint(self): - return float(self._shading_system_setpoint) + """Get or set the shading system setpoint [W/m2].""" + return self._shading_system_setpoint @ShadingSystemSetpoint.setter def ShadingSystemSetpoint(self, value): - self._shading_system_setpoint = value + self._shading_system_setpoint = validators.float(value, minimum=0) @property def ShadingSystemTransmittance(self): - return float(self._shading_system_transmittance) + """Get or set the shading system transmittance [-].""" + return self._shading_system_transmittance @ShadingSystemTransmittance.setter def ShadingSystemTransmittance(self, value): - self._shading_system_transmittance = value + self._shading_system_transmittance = validators.float( + value, minimum=0, maximum=1 + ) + + @property + def ShadingSystemAvailabilitySchedule(self): + """Get or set the shading system availability schedule.""" + return self._shading_system_availability_schedule + + @ShadingSystemAvailabilitySchedule.setter + def ShadingSystemAvailabilitySchedule(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input error with value {value}. ZoneMixingAvailabilitySchedule must " + f"be an UmiSchedule, not a {type(value)}" + ) + self._shading_system_availability_schedule = value + + @property + def IsShadingSystemOn(self): + """Get or set the use of the shading system.""" + return self._is_shading_system_on + + @IsShadingSystemOn.setter + def IsShadingSystemOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsShadingSystemOn must " + f"be a boolean, not a {type(value)}" + ) + self._is_shading_system_on = value + + @property + def ZoneMixingAvailabilitySchedule(self): + """Get or set the zone mixing availability schedule.""" + return self._zone_mixing_availability_schedule + + @ZoneMixingAvailabilitySchedule.setter + def ZoneMixingAvailabilitySchedule(self, value): + if value is not None: + assert isinstance(value, UmiSchedule), ( + f"Input error with value {value}. ZoneMixingAvailabilitySchedule must " + f"be an UmiSchedule, not a {type(value)}" + ) + self._zone_mixing_availability_schedule = value + + @property + def ZoneMixingDeltaTemperature(self): + """Get or set the zone mixing delta temperature.""" + return self._zone_mixing_delta_temperature + + @ZoneMixingDeltaTemperature.setter + def ZoneMixingDeltaTemperature(self, value): + self._zone_mixing_delta_temperature = validators.float(value, minimum=0) + + @property + def Construction(self): + """Get or set the window construction.""" + return self._construction + + @Construction.setter + def Construction(self, value): + if value is not None: + assert isinstance(value, WindowConstruction), ( + f"Input error with value {value}. Construction must " + f"be an WindowConstruction, not a {type(value)}" + ) + self._construction = value + + @property + def IsVirtualPartition(self): + """Get or set the state of the virtual partition.""" + return self._is_virtual_partition + + @IsVirtualPartition.setter + def IsVirtualPartition(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsVirtualPartition must " + f"be a boolean, not a {type(value)}" + ) + self._is_virtual_partition = value + + @property + def IsZoneMixingOn(self): + """Get or set mixing in zone.""" + return self._is_zone_mixing_on + + @IsZoneMixingOn.setter + def IsZoneMixingOn(self, value): + assert isinstance(value, bool), ( + f"Input error with value {value}. IsZoneMixingOn must " + f"be a boolean, not a {type(value)}" + ) + self._is_zone_mixing_on = value + + @property + def ZoneMixingFlowRate(self): + """Get or set the zone mixing flow rate [m3/s].""" + return self._zone_mixing_flow_rate + + @ZoneMixingFlowRate.setter + def ZoneMixingFlowRate(self, value): + self._zone_mixing_flow_rate = validators.float(value, minimum=0) + + @property + def Type(self): + """Get or set the window type [enum].""" + return self._type + + @Type.setter + def Type(self, value): + if checkers.is_string(value): + assert WindowType[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in WindowType)}" + ) + self._type = WindowType[value] + elif checkers.is_numeric(value): + assert WindowType[value], ( + f"Input value error for '{value}'. " + f"Expected one of {tuple(a for a in WindowType)}" + ) + self._type = WindowType(value) + elif isinstance(value, WindowType): + self._type = value def __add__(self, other): + """Combine self and other.""" return self.combine(other) def __repr__(self): - # header = "{}: <{}>\n".format(self.Name, self.__class__.mro()[0].__name__) - # return header + tabulate.tabulate(self.mapping().items(), tablefmt="plain") + """Return a representation of self.""" return super(WindowSetting, self).__repr__() def __str__(self): + """Return string representation.""" return repr(self) def __hash__(self): + """Return the hash value of self.""" return hash( (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) ) def __eq__(self, other): + """Assert self is equivalent to other.""" if not isinstance(other, WindowSetting): return NotImplemented else: @@ -478,27 +391,19 @@ def __eq__(self, other): ) @classmethod - def generic(cls, idf, Name): + def generic(cls, Name): """Initialize a generic window with SHGC=0.704, UFactor=2.703, Tvis=0.786. Args: Name (str): Name of the WindowSetting - idf (IDF): """ - material = idf.anidfobject( - "WindowMaterial:SimpleGlazingSystem".upper(), - Name="SimpleWindow:SINGLE PANE HW WINDOW", - UFactor=2.703, - Solar_Heat_Gain_Coefficient=0.704, - Visible_Transmittance=0.786, - ) - - constr = idf.anidfobject( - "CONSTRUCTION", - Name="SINGLE PANE HW WINDOW", - Outside_Layer="SimpleWindow:SINGLE PANE HW WINDOW", + construction = WindowConstruction.from_shgc( + "SimpleWindow:SINGLE PANE HW WINDOW", + u_factor=2.703, + solar_heat_gain_coefficient=0.704, + visible_transmittance=0.786, ) - return cls.from_construction(Name=Name, Construction=constr, material=material) + return WindowSetting(Name, Construction=construction) @classmethod def from_construction(cls, Construction, **kwargs): @@ -508,13 +413,15 @@ def from_construction(cls, Construction, **kwargs): Examples: >>> from archetypal import IDF - >>> from archetypal.template import WindowSetting + >>> from archetypal.template.window_setting import WindowSetting >>> # Given an IDF object >>> idf = IDF("idfname.idf") - >>> construction = idf.getobject('CONSTRUCTION', + >>> constr = idf.getobject('CONSTRUCTION', >>> 'AEDG-SmOffice 1A Window Fixed') - >>> WindowSetting.from_construction(Name='test_window', - >>> Construction=construction) + >>> WindowSetting.from_construction( + >>> Name='test_window', + >>> Construction=constr + >>> ) Args: Construction (EpBunch): The construction name for this window. @@ -524,12 +431,18 @@ def from_construction(cls, Construction, **kwargs): (windowSetting): The window setting object. """ name = kwargs.pop("Name", Construction.Name + "_Window") - w = cls(Name=name, idf=Construction.theidf, **kwargs) - w.Construction = WindowConstruction.from_epbunch(Construction, **kwargs) - w.AfnWindowAvailability = UmiSchedule.constant_schedule(idf=w.idf) - w.ShadingSystemAvailabilitySchedule = UmiSchedule.constant_schedule(idf=w.idf) - w.ZoneMixingAvailabilitySchedule = UmiSchedule.constant_schedule(idf=w.idf) - return w + construction = WindowConstruction.from_epbunch(Construction, **kwargs) + AfnWindowAvailability = UmiSchedule.constant_schedule() + ShadingSystemAvailabilitySchedule = UmiSchedule.constant_schedule() + ZoneMixingAvailabilitySchedule = UmiSchedule.constant_schedule() + return cls( + Name=name, + Construction=construction, + AfnWindowAvailability=AfnWindowAvailability, + ShadingSystemAvailabilitySchedule=ShadingSystemAvailabilitySchedule, + ZoneMixingAvailabilitySchedule=ZoneMixingAvailabilitySchedule, + **kwargs, + ) @classmethod def from_surface(cls, surface, **kwargs): @@ -569,7 +482,13 @@ def from_surface(cls, surface, **kwargs): (WindowSetting): The window setting object. """ if surface.key.upper() == "FENESTRATIONSURFACE:DETAILED": + if not surface.Surface_Type.lower() == "window": + return # Other surface types (Doors, GlassDoors, etc.) are ignored. construction = surface.get_referenced_object("Construction_Name") + if construction is None: + construction = surface.theidf.getobject( + "CONSTRUCTION", surface.Construction_Name + ) construction = WindowConstruction.from_epbunch(construction) shading_control = surface.get_referenced_object("Shading_Control_Name") elif surface.key.upper() == "WINDOW": @@ -608,8 +527,8 @@ def from_surface(cls, surface, **kwargs): # get shading control schedule if shading_control["Shading_Control_Is_Scheduled"].upper() == "YES": name = shading_control["Schedule_Name"] - attr["ShadingSystemAvailabilitySchedule"] = UmiSchedule( - Name=name, idf=surface.theidf + attr["ShadingSystemAvailabilitySchedule"] = UmiSchedule.from_epbunch( + surface.theidf.schedules_dict[name.upper()] ) else: # Determine which behavior of control @@ -617,13 +536,11 @@ def from_surface(cls, surface, **kwargs): if shade_ctrl_type.lower() == "alwaysoff": attr[ "ShadingSystemAvailabilitySchedule" - ] = UmiSchedule.constant_schedule( - name="AlwaysOff", hourly_value=0, idf=surface.theidf - ) + ] = UmiSchedule.constant_schedule(value=0, name="AlwaysOff") elif shade_ctrl_type.lower() == "alwayson": attr[ "ShadingSystemAvailabilitySchedule" - ] = UmiSchedule.constant_schedule(idf=surface.theidf) + ] = UmiSchedule.constant_schedule() else: log( 'Window "{}" uses a window control type that ' @@ -633,7 +550,7 @@ def from_surface(cls, surface, **kwargs): ) attr[ "ShadingSystemAvailabilitySchedule" - ] = UmiSchedule.constant_schedule(idf=surface.theidf) + ] = UmiSchedule.constant_schedule() # get shading type if shading_control["Shading_Type"] != "": mapping = { @@ -649,9 +566,7 @@ def from_surface(cls, surface, **kwargs): attr["ShadingSystemType"] = mapping[shading_control["Shading_Type"]] else: # Set default schedules - attr["ShadingSystemAvailabilitySchedule"] = UmiSchedule.constant_schedule( - idf=surface.theidf - ) + attr["ShadingSystemAvailabilitySchedule"] = UmiSchedule.constant_schedule() # get airflow network afn = next( @@ -669,13 +584,11 @@ def from_surface(cls, surface, **kwargs): leak = afn.get_referenced_object("Leakage_Component_Name") name = afn["Venting_Availability_Schedule_Name"] if name != "": - attr["AfnWindowAvailability"] = UmiSchedule( - Name=name, idf=surface.theidf + attr["AfnWindowAvailability"] = UmiSchedule.from_epbunch( + surface.theidf.schedules_dict[name.upper()] ) else: - attr["AfnWindowAvailability"] = UmiSchedule.constant_schedule( - idf=surface.theidf - ) + attr["AfnWindowAvailability"] = UmiSchedule.constant_schedule() name = afn["Ventilation_Control_Zone_Temperature_Setpoint_Schedule_Name"] if name != "": attr["AfnTempSetpoint"] = UmiSchedule( @@ -728,11 +641,11 @@ def from_surface(cls, surface, **kwargs): ) else: attr["AfnWindowAvailability"] = UmiSchedule.constant_schedule( - hourly_value=0, Name="AlwaysOff", idf=surface.theidf + value=0, Name="AlwaysOff" ) # Todo: Zone Mixing is always off attr["ZoneMixingAvailabilitySchedule"] = UmiSchedule.constant_schedule( - hourly_value=0, Name="AlwaysOff", idf=surface.theidf + value=0, Name="AlwaysOff" ) DataSource = kwargs.pop("DataSource", surface.theidf.name) Category = kwargs.pop("Category", surface.theidf.name) @@ -763,7 +676,7 @@ def from_zone(cls, zone, **kwargs): """ window_sets = [] - for surf in zone._zonesurfaces: + for surf in zone.zone_surfaces: # skip internalmass objects since they don't have windows. if surf.key.lower() != "internalmass": for subsurf in surf.subsurfaces: @@ -820,26 +733,26 @@ def combine(self, other, weights=None, allow_duplicates=False): Construction=WindowConstruction.combine( self.Construction, other.Construction, weights ), - AfnDischargeC=self._float_mean(other, "AfnDischargeC", weights), - AfnTempSetpoint=self._float_mean(other, "AfnTempSetpoint", weights), + AfnDischargeC=self.float_mean(other, "AfnDischargeC", weights), + AfnTempSetpoint=self.float_mean(other, "AfnTempSetpoint", weights), AfnWindowAvailability=UmiSchedule.combine( self.AfnWindowAvailability, other.AfnWindowAvailability, weights ), IsShadingSystemOn=any([self.IsShadingSystemOn, other.IsShadingSystemOn]), IsVirtualPartition=any([self.IsVirtualPartition, other.IsVirtualPartition]), IsZoneMixingOn=any([self.IsZoneMixingOn, other.IsZoneMixingOn]), - OperableArea=self._float_mean(other, "OperableArea", weights), - ShadingSystemSetpoint=self._float_mean( + OperableArea=self.float_mean(other, "OperableArea", weights), + ShadingSystemSetpoint=self.float_mean( other, "ShadingSystemSetpoint", weights ), - ShadingSystemTransmittance=self._float_mean( + ShadingSystemTransmittance=self.float_mean( other, "ShadingSystemTransmittance", weights ), ShadingSystemType=max(self.ShadingSystemType, other.ShadingSystemType), - ZoneMixingDeltaTemperature=self._float_mean( + ZoneMixingDeltaTemperature=self.float_mean( other, "ZoneMixingDeltaTemperature", weights ), - ZoneMixingFlowRate=self._float_mean(other, "ZoneMixingFlowRate", weights), + ZoneMixingFlowRate=self.float_mean(other, "ZoneMixingFlowRate", weights), ZoneMixingAvailabilitySchedule=UmiSchedule.combine( self.ZoneMixingAvailabilitySchedule, other.ZoneMixingAvailabilitySchedule, @@ -852,12 +765,12 @@ def combine(self, other, weights=None, allow_duplicates=False): ), Type=max(self.Type, other.Type), ) - new_obj = WindowSetting(**meta, **new_attr, idf=self.idf) + new_obj = WindowSetting(**meta, **new_attr) new_obj.predecessors.update(self.predecessors + other.predecessors) return new_obj - def to_json(self): - """Convert class properties to dict.""" + def to_dict(self): + """Return WindowSetting dictionary representation.""" self.validate() # Validate object before trying to get json format data_dict = collections.OrderedDict() @@ -865,7 +778,7 @@ def to_json(self): data_dict["$id"] = str(self.id) data_dict["AfnDischargeC"] = self.AfnDischargeC data_dict["AfnTempSetpoint"] = self.AfnTempSetpoint - data_dict["AfnWindowAvailability"] = self.AfnWindowAvailability.to_dict() + data_dict["AfnWindowAvailability"] = self.AfnWindowAvailability.to_ref() data_dict["Construction"] = {"$ref": str(self.Construction.id)} data_dict["IsShadingSystemOn"] = self.IsShadingSystemOn data_dict["IsVirtualPartition"] = self.IsVirtualPartition @@ -873,51 +786,58 @@ def to_json(self): data_dict["OperableArea"] = self.OperableArea data_dict[ "ShadingSystemAvailabilitySchedule" - ] = self.ShadingSystemAvailabilitySchedule.to_dict() + ] = self.ShadingSystemAvailabilitySchedule.to_ref() data_dict["ShadingSystemSetpoint"] = self.ShadingSystemSetpoint data_dict["ShadingSystemTransmittance"] = self.ShadingSystemTransmittance data_dict["ShadingSystemType"] = self.ShadingSystemType.value data_dict["Type"] = self.Type.value data_dict[ "ZoneMixingAvailabilitySchedule" - ] = self.ZoneMixingAvailabilitySchedule.to_dict() + ] = self.ZoneMixingAvailabilitySchedule.to_ref() data_dict["ZoneMixingDeltaTemperature"] = self.ZoneMixingDeltaTemperature data_dict["ZoneMixingFlowRate"] = self.ZoneMixingFlowRate data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=archetypal.__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): - - return cls.from_dict(*args, **kwargs) + def from_dict(cls, data, schedules, window_constructions, **kwargs): + """Create a ZoneConditioning from a dictionary. - @classmethod - def from_dict(cls, *args, **kwargs): - """Initialize :class:`WindowSetting` object from json dict.""" - w = cls(*args, **kwargs) - - ref = kwargs.get("AfnWindowAvailability", None) - w.AfnWindowAvailability = w.get_ref(ref) - ref = kwargs.get("Construction", None) - w.Construction = w.get_ref(ref) - ref = kwargs.get("ShadingSystemAvailabilitySchedule", None) - w.ShadingSystemAvailabilitySchedule = w.get_ref(ref) - ref = kwargs.get("ZoneMixingAvailabilitySchedule", None) - w.ZoneMixingAvailabilitySchedule = w.get_ref(ref) - return w + Args: + data (dict): The python dictionary. + schedules (dict): A dictionary of UmiSchedules with their id as keys. + window_constructions (dict): A dictionary of WindowConstruction objects + with their id as keys. + **kwargs: keywords passed to parent constructor. + """ + data = copy(data) + _id = data.pop("$id") + afn_availability_schedule = schedules[data.pop("AfnWindowAvailability")["$ref"]] + construction = window_constructions[data.pop("Construction")["$ref"]] + shading_system_availability_schedule = schedules[ + data.pop("ShadingSystemAvailabilitySchedule")["$ref"] + ] + zone_mixing_availability_schedule = schedules[ + data.pop("ZoneMixingAvailabilitySchedule")["$ref"] + ] + return cls( + id=_id, + Construction=construction, + AfnWindowAvailability=afn_availability_schedule, + ShadingSystemAvailabilitySchedule=shading_system_availability_schedule, + ZoneMixingAvailabilitySchedule=zone_mixing_availability_schedule, + **data, + **kwargs, + ) @classmethod - def from_ref(cls, ref, building_templates, idf=None, **kwargs): + def from_ref( + cls, ref, building_templates, schedules, window_constructions, **kwargs + ): """Initialize :class:`WindowSetting` object from a reference id. Hint: @@ -941,28 +861,35 @@ def from_ref(cls, ref, building_templates, idf=None, **kwargs): ) ) ) - w = cls.from_json(**store, idf=idf, **kwargs) + w = cls.from_dict(store, schedules, window_constructions, **kwargs) return w def validate(self): """Validate object and fill in missing values.""" if not self.AfnWindowAvailability: self.AfnWindowAvailability = UmiSchedule.constant_schedule( - hourly_value=0, Name="AlwaysOff", idf=self.idf + value=0, Name="AlwaysOff" ) if not self.ShadingSystemAvailabilitySchedule: self.ShadingSystemAvailabilitySchedule = UmiSchedule.constant_schedule( - hourly_value=0, Name="AlwaysOff", idf=self.idf + value=0, Name="AlwaysOff" ) if not self.ZoneMixingAvailabilitySchedule: self.ZoneMixingAvailabilitySchedule = UmiSchedule.constant_schedule( - hourly_value=0, Name="AlwaysOff", idf=self.idf + value=0, Name="AlwaysOff" ) return self - def mapping(self): - self.validate() + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() return dict( AfnDischargeC=self.AfnDischargeC, @@ -986,20 +913,3 @@ def mapping(self): DataSource=self.DataSource, Name=self.Name, ) - - def get_ref(self, ref): - """Get item matching reference id. - - Args: - ref: - """ - return next( - iter( - [ - value - for value in WindowSetting.CREATED_OBJECTS - if value.id == ref["$ref"] - ] - ), - None, - ) diff --git a/archetypal/template/zone_construction_set.py b/archetypal/template/zone_construction_set.py index c14d612a..49bbe3cd 100644 --- a/archetypal/template/zone_construction_set.py +++ b/archetypal/template/zone_construction_set.py @@ -1,15 +1,32 @@ +"""archetypal ZoneConstructionSet.""" + import collections import logging as lg -from deprecation import deprecated +from validator_collection import validators -from archetypal import __version__ -from archetypal.template import OpaqueConstruction, UmiBase, UniqueName +from archetypal.template.constructions.opaque_construction import OpaqueConstruction +from archetypal.template.umi_base import UmiBase from archetypal.utils import log, reduce, timeit class ZoneConstructionSet(UmiBase): - """Zone-specific :class:`Construction` ids""" + """ZoneConstructionSet class.""" + + __slots__ = ( + "_facade", + "_ground", + "_partition", + "_roof", + "_slab", + "_is_facade_adiabatic", + "_is_ground_adiabatic", + "_is_partition_adiabatic", + "_is_roof_adiabatic", + "_is_slab_adiabatic", + "_area", + "_volume", + ) def __init__( self, @@ -24,9 +41,12 @@ def __init__( IsPartitionAdiabatic=False, IsRoofAdiabatic=False, IsSlabAdiabatic=False, + area=1, + volume=1, **kwargs, ): - """ + """Create a ZoneConstructionSet object. + Args: Name (str): Name of the object. Must be Unique. Facade (OpaqueConstruction): The OpaqueConstruction object representing @@ -57,71 +77,199 @@ def __init__( self.IsGroundAdiabatic = IsGroundAdiabatic self.Facade = Facade self.IsFacadeAdiabatic = IsFacadeAdiabatic - self._belongs_to_zone = kwargs.get("zone", None) + self.area = area + self.volume = volume + + @property + def Facade(self): + """Get or set the Facade OpaqueConstruction.""" + return self._facade + + @Facade.setter + def Facade(self, value): + if value is not None: + assert isinstance(value, OpaqueConstruction), ( + f"Input value error for {value}. Facade must be" + f" an OpaqueConstruction, not a {type(value)}" + ) + self._facade = value + + @property + def Ground(self): + """Get or set the Ground OpaqueConstruction.""" + return self._ground + + @Ground.setter + def Ground(self, value): + if value is not None: + assert isinstance(value, OpaqueConstruction), ( + f"Input value error for {value}. Ground must be" + f" an OpaqueConstruction, not a {type(value)}" + ) + self._ground = value + + @property + def Partition(self): + """Get or set the Partition OpaqueConstruction.""" + return self._partition + + @Partition.setter + def Partition(self, value): + if value is not None: + assert isinstance(value, OpaqueConstruction), ( + f"Input value error for {value}. Partition must be" + f" an OpaqueConstruction, not a {type(value)}" + ) + self._partition = value + + @property + def Roof(self): + """Get or set the Roof OpaqueConstruction.""" + return self._roof + + @Roof.setter + def Roof(self, value): + if value is not None: + assert isinstance(value, OpaqueConstruction), ( + f"Input value error for {value}. Roof must be" + f" an OpaqueConstruction, not a {type(value)}" + ) + self._roof = value + + @property + def Slab(self): + """Get or set the Slab OpaqueConstruction.""" + return self._slab + + @Slab.setter + def Slab(self, value): + if value is not None: + assert isinstance(value, OpaqueConstruction), ( + f"Input value error for {value}. Slab must be" + f" an OpaqueConstruction, not a {type(value)}" + ) + self._slab = value + + @property + def IsFacadeAdiabatic(self): + """Get or set is facade adiabatic [bool].""" + return self._is_facade_adiabatic + + @IsFacadeAdiabatic.setter + def IsFacadeAdiabatic(self, value): + assert isinstance(value, bool), ( + f"Input value error for {value}. " + f"IsFacadeAdiabatic must be of type bool, " + f"not {type(value)}." + ) + self._is_facade_adiabatic = value + + @property + def IsGroundAdiabatic(self): + """Get or set is ground adiabatic [bool].""" + return self._is_ground_adiabatic + + @IsGroundAdiabatic.setter + def IsGroundAdiabatic(self, value): + assert isinstance(value, bool), ( + f"Input value error for {value}. " + f"IsGroundAdiabatic must be of type bool, " + f"not {type(value)}." + ) + self._is_ground_adiabatic = value + + @property + def IsPartitionAdiabatic(self): + """Get or set is partition adiabatic [bool].""" + return self._is_partition_adiabatic + + @IsPartitionAdiabatic.setter + def IsPartitionAdiabatic(self, value): + assert isinstance(value, bool), ( + f"Input value error for {value}. " + f"IsPartitionAdiabatic must be of type bool, " + f"not {type(value)}." + ) + self._is_partition_adiabatic = value + + @property + def IsRoofAdiabatic(self): + """Get or set is roof adiabatic [bool].""" + return self._is_roof_adiabatic + + @IsRoofAdiabatic.setter + def IsRoofAdiabatic(self, value): + assert isinstance(value, bool), ( + f"Input value error for {value}. " + f"IsRoofAdiabatic must be of type bool, " + f"not {type(value)}." + ) + self._is_roof_adiabatic = value + + @property + def IsSlabAdiabatic(self): + """Get or set is slab adiabatic [bool].""" + return self._is_slab_adiabatic + + @IsSlabAdiabatic.setter + def IsSlabAdiabatic(self, value): + assert isinstance(value, bool), ( + f"Input value error for {value}. " + f"IsSlabAdiabatic must be of type bool, " + f"not {type(value)}." + ) + self._is_slab_adiabatic = value - def __add__(self, other): - """Overload + to implement self.combine. + @property + def area(self): + """Get or set the area of the zone [m²].""" + return self._area - Args: - other: - """ - return self.combine(other) + @area.setter + def area(self, value): + self._area = validators.float(value, minimum=0) - def __hash__(self): - return hash( - (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) - ) + @property + def volume(self): + """Get or set the volume of the zone [m³].""" + return self._volume - def __eq__(self, other): - if not isinstance(other, ZoneConstructionSet): - return NotImplemented - else: - return all( - [ - self.Slab == other.Slab, - self.IsSlabAdiabatic == other.IsSlabAdiabatic, - self.Roof == other.Roof, - self.IsRoofAdiabatic == other.IsRoofAdiabatic, - self.Partition == other.Partition, - self.IsPartitionAdiabatic == other.IsPartitionAdiabatic, - self.Ground == other.Ground, - self.IsGroundAdiabatic == other.IsGroundAdiabatic, - self.Facade == other.Facade, - self.IsFacadeAdiabatic == other.IsFacadeAdiabatic, - ] - ) + @volume.setter + def volume(self, value): + self._volume = validators.float(value, minimum=0) @classmethod @timeit def from_zone(cls, zone, **kwargs): - """ + """Create a ZoneConstructionSet from a ZoneDefinition object. + Args: zone (ZoneDefinition): """ name = zone.Name + "_ZoneConstructionSet" # dispatch surfaces facade, ground, partition, roof, slab = [], [], [], [], [] - zonesurfaces = zone._zonesurfaces + zonesurfaces = zone.zone_surfaces for surf in zonesurfaces: - for disp_surf in surface_dispatcher(surf, zone): - if disp_surf: - if disp_surf.Surface_Type == "Facade": - if zone.is_part_of_conditioned_floor_area: - facade.append(disp_surf) - elif disp_surf.Surface_Type == "Ground": - ground.append(disp_surf) - elif disp_surf.Surface_Type == "Partition": - partition.append(disp_surf) - elif disp_surf.Surface_Type == "Roof": - roof.append(disp_surf) - elif disp_surf.Surface_Type == "Slab": - slab.append(disp_surf) - else: - msg = ( - 'Surface Type "{}" is not known, this method is not' - " implemented".format(disp_surf.Surface_Type) - ) - raise NotImplementedError(msg) + disp_surf = SurfaceDispatcher(surf, zone).resolved_surface + if disp_surf: + if disp_surf.Category == "Facade": + if zone.is_part_of_conditioned_floor_area: + facade.append(disp_surf) + elif disp_surf.Category == "Ground": + ground.append(disp_surf) + elif disp_surf.Category == "Partition": + partition.append(disp_surf) + elif disp_surf.Category == "Roof": + roof.append(disp_surf) + elif disp_surf.Category == "Slab": + slab.append(disp_surf) + else: + msg = ( + 'Surface Type "{}" is not known, this method is not' + " implemented".format(disp_surf.Surface_Type) + ) + raise NotImplementedError(msg) # Returning a set() for each groups of Constructions. @@ -159,64 +307,93 @@ def from_zone(cls, zone, **kwargs): Slab=slab, Name=name, zone=zone, - idf=zone.idf, - Category=zone.idf.name, + Category=zone.DataSource, **kwargs, ) return z_set @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): - return cls.from_dict(*args, **kwargs) + def from_dict(cls, data, opaque_constructions, **kwargs): + """Create a ZoneConstructionSet from a dictionary. - @classmethod - def from_dict(cls, *args, **kwargs): - """ Args: - *args: - **kwargs: + data (dict): The python dictionary. + opaque_constructions (dict): A dictionary of OpaqueConstruction with their + id as keys. + **kwargs: keywords passed parent constructor. + + .. code-block:: python + { + "$id": "168", + "Facade": { + "$ref": "35" + }, + "Ground": { + "$ref": "42" + }, + "Partition": { + "$ref": "48" + }, + "Roof": { + "$ref": "39" + }, + "Slab": { + "$ref": "45" + }, + "IsFacadeAdiabatic": false, + "IsGroundAdiabatic": false, + "IsPartitionAdiabatic": false, + "IsRoofAdiabatic": false, + "IsSlabAdiabatic": false, + "Category": "Office Spaces", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Off_0 constructions" + } """ - zc = cls(*args, **kwargs) - - ref = kwargs.get("Facade", None) - zc.Facade = zc.get_ref(ref) - - ref = kwargs.get("Ground", None) - zc.Ground = zc.get_ref(ref) - - ref = kwargs.get("Partition", None) - zc.Partition = zc.get_ref(ref) - - ref = kwargs.get("Roof", None) - zc.Roof = zc.get_ref(ref) - - ref = kwargs.get("Slab", None) - zc.Slab = zc.get_ref(ref) - - return zc + _id = data.pop("$id") + facade = opaque_constructions[data.pop("Facade")["$ref"]] + ground = opaque_constructions[data.pop("Ground")["$ref"]] + partition = opaque_constructions[data.pop("Partition")["$ref"]] + roof = opaque_constructions[data.pop("Roof")["$ref"]] + slab = opaque_constructions[data.pop("Slab")["$ref"]] + return cls( + id=_id, + Facade=facade, + Ground=ground, + Partition=partition, + Roof=roof, + Slab=slab, + **data, + **kwargs, + ) def combine(self, other, weights=None, **kwargs): - """Append other to self. Return self + other as a new object. + """Combine two ZoneConstructionSet objects together. Args: other (ZoneConstructionSet): - weights: + kwargs: keywords passed to constructor. Returns: (ZoneConstructionSet): the combined ZoneConstructionSet object. """ # Check if other is None. Simply return self - if not other: - return self + if not self and not other: + return None + elif self == other: + area = 1 if self.area + other.area == 2 else self.area + other.area + volume = ( + 1 if self.volume + other.volume == 2 else self.volume + other.volume + ) + new_obj = self.duplicate() + new_obj.area = area + new_obj.volume = volume + return new_obj + elif not self or not other: + new_obj = (self or other).duplicate() + return new_obj - if not self: - return other # Check if other is the same type as self if not isinstance(other, self.__class__): msg = "Cannot combine %s with %s" % ( @@ -225,22 +402,10 @@ def combine(self, other, weights=None, **kwargs): ) raise NotImplementedError(msg) - # Check if other is not the same as self - if self == other: - return self - - if not weights: - weights = [self._belongs_to_zone.volume, other._belongs_to_zone.volume] - log( - 'using zone volume "{}" as weighting factor in "{}" ' - "combine.".format( - " & ".join(list(map(str, map(int, weights)))), - self.__class__.__name__, - ) - ) - meta = self._get_predecessors_meta(other) - new_attr = dict( + + # create a new object with the combined attributes + new_obj = self.__class__( Slab=OpaqueConstruction.combine(self.Slab, other.Slab), IsSlabAdiabatic=any([self.IsSlabAdiabatic, other.IsSlabAdiabatic]), Roof=OpaqueConstruction.combine(self.Roof, other.Roof), @@ -253,13 +418,17 @@ def combine(self, other, weights=None, **kwargs): IsGroundAdiabatic=any([self.IsGroundAdiabatic, other.IsGroundAdiabatic]), Facade=OpaqueConstruction.combine(self.Facade, other.Facade), IsFacadeAdiabatic=any([self.IsFacadeAdiabatic, other.IsFacadeAdiabatic]), + area=1 if self.area + other.area == 2 else self.area + other.area, + volume=1 if self.volume + other.volume == 2 else self.volume + other.volume, + **meta, + **kwargs, + allow_duplicates=self.allow_duplicates, ) - new_obj = self.__class__(**meta, **new_attr, idf=self.idf, **kwargs) new_obj.predecessors.update(self.predecessors + other.predecessors) return new_obj - def to_json(self): - """Convert class properties to dict""" + def to_dict(self): + """Return ZoneConstructionSet dictionary representation.""" self.validate() data_dict = collections.OrderedDict() @@ -275,13 +444,14 @@ def to_json(self): data_dict["IsRoofAdiabatic"] = self.IsRoofAdiabatic data_dict["IsSlabAdiabatic"] = self.IsSlabAdiabatic data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict def validate(self): + """Validate object and fill in missing values.""" for attr in ["Slab", "Roof", "Partition", "Ground", "Facade"]: if getattr(self, attr) is None: # First try to get one from another zone that has the attr @@ -298,7 +468,7 @@ def validate(self): setattr(self, attr, getattr(zone, attr)) else: # If not, default to a generic construction for last resort. - setattr(self, attr, OpaqueConstruction.generic(idf=self.idf)) + setattr(self, attr, OpaqueConstruction.generic()) log( f"While validating {self}, the required attribute " f"'{attr}' was filled " @@ -307,12 +477,129 @@ def validate(self): ) return self - @staticmethod - def _do_facade(surf): + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. """ + if validate: + self.validate() + + return dict( + Facade=self.Facade, + Ground=self.Ground, + Partition=self.Partition, + Roof=self.Roof, + Slab=self.Slab, + IsFacadeAdiabatic=self.IsFacadeAdiabatic, + IsGroundAdiabatic=self.IsGroundAdiabatic, + IsPartitionAdiabatic=self.IsPartitionAdiabatic, + IsRoofAdiabatic=self.IsRoofAdiabatic, + IsSlabAdiabatic=self.IsSlabAdiabatic, + Category=self.Category, + Comments=self.Comments, + DataSource=self.DataSource, + Name=self.Name, + ) + + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + + def __key__(self): + """Get a tuple of attributes. Useful for hashing and comparing.""" + return ( + self.Slab, + self.IsSlabAdiabatic, + self.Roof, + self.IsRoofAdiabatic, + self.Partition, + self.IsPartitionAdiabatic, + self.Ground, + self.IsGroundAdiabatic, + self.Facade, + self.IsFacadeAdiabatic, + ) + + def __add__(self, other): + """Overload + to implement self.combine. + Args: - surf (EpBunch): + other: """ + return self.combine(other) + + def __hash__(self): + """Return the hash value of self.""" + return hash( + (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + ) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, ZoneConstructionSet): + return NotImplemented + else: + return self.__key__() == other.__key__() + + def __copy__(self): + """Get copy of self.""" + return self.__class__(**self.mapping(validate=False)) + + +class SurfaceDispatcher: + """Surface dispatcher class.""" + + __slots__ = ("surf", "zone", "_dispatch") + + def __init__(self, surf, zone): + """Initialize a surface dispatcher object.""" + self.surf = surf + self.zone = zone + + # dispatch map + self._dispatch = { + ("Wall", "Outdoors"): self._do_facade, + ("Floor", "Ground"): self._do_ground, + ("Floor", "Outdoors"): self._do_ground, + ("Floor", "Foundation"): self._do_ground, + ("Floor", "OtherSideCoefficients"): self._do_ground, + ("Floor", "GroundSlabPreprocessorAverage"): self._do_ground, + ("Floor", "Surface"): self._do_slab, + ("Floor", "Adiabatic"): self._do_slab, + ("Floor", "Zone"): self._do_slab, + ("Wall", "Adiabatic"): self._do_partition, + ("Wall", "Surface"): self._do_partition, + ("Wall", "Zone"): self._do_partition, + ("Wall", "Ground"): self._do_basement, + ("Roof", "Outdoors"): self._do_roof, + ("Roof", "Zone"): self._do_roof, + ("Roof", "Surface"): self._do_roof, + ("Ceiling", "Adiabatic"): self._do_slab, + ("Ceiling", "Surface"): self._do_slab, + ("Ceiling", "Zone"): self._do_slab, + } + + @property + def resolved_surface(self): + """Generate a resolved surface. Yields value.""" + if self.surf.key.upper() not in ["INTERNALMASS", "WINDOWSHADINGCONTROL"]: + a, b = ( + self.surf["Surface_Type"].capitalize(), + self.surf["Outside_Boundary_Condition"], + ) + try: + return self._dispatch[a, b](self.surf) + except KeyError as e: + raise NotImplementedError( + "surface '%s' in zone '%s' not supported by surface dispatcher " + "with keys %s" % (self.surf.Name, self.zone.Name, e) + ) + + @staticmethod + def _do_facade(surf): log( 'surface "%s" assigned as a Facade' % surf.Name, lg.DEBUG, @@ -322,16 +609,11 @@ def _do_facade(surf): surf.theidf.getobject("Construction".upper(), surf.Construction_Name) ) oc.area = surf.area - oc.Surface_Type = "Facade" - oc.Category = oc.Surface_Type + oc.Category = "Facade" return oc @staticmethod def _do_ground(surf): - """ - Args: - surf (EpBunch): - """ log( 'surface "%s" assigned as a Ground' % surf.Name, lg.DEBUG, @@ -341,24 +623,18 @@ def _do_ground(surf): surf.theidf.getobject("Construction".upper(), surf.Construction_Name) ) oc.area = surf.area - oc.Surface_Type = "Ground" - oc.Category = oc.Surface_Type + oc.Category = "Ground" return oc @staticmethod def _do_partition(surf): - """ - Args: - surf (EpBunch): - """ the_construction = surf.theidf.getobject( "Construction".upper(), surf.Construction_Name ) if the_construction: oc = OpaqueConstruction.from_epbunch(the_construction) oc.area = surf.area - oc.Surface_Type = "Partition" - oc.Category = oc.Surface_Type + oc.Category = "Partition" log( 'surface "%s" assigned as a Partition' % surf.Name, lg.DEBUG, @@ -373,10 +649,6 @@ def _do_partition(surf): @staticmethod def _do_roof(surf): - """ - Args: - surf (EpBunch): - """ log( 'surface "%s" assigned as a Roof' % surf.Name, lg.DEBUG, @@ -386,16 +658,11 @@ def _do_roof(surf): surf.theidf.getobject("Construction".upper(), surf.Construction_Name) ) oc.area = surf.area - oc.Surface_Type = "Roof" - oc.Category = oc.Surface_Type + oc.Category = "Roof" return oc @staticmethod def _do_slab(surf): - """ - Args: - surf (EpBunch): - """ log( 'surface "%s" assigned as a Slab' % surf.Name, lg.DEBUG, @@ -405,16 +672,11 @@ def _do_slab(surf): surf.theidf.getobject("Construction".upper(), surf.Construction_Name) ) oc.area = surf.area - oc.Surface_Type = "Slab" - oc.Category = oc.Surface_Type + oc.Category = "Slab" return oc @staticmethod def _do_basement(surf): - """ - Args: - surf (EpBunch): - """ log( 'surface "%s" ignored because basement facades are not supported' % surf.Name, @@ -423,78 +685,3 @@ def _do_basement(surf): ) oc = None return oc - - def mapping(self): - self.validate() - - return dict( - Facade=self.Facade, - Ground=self.Ground, - Partition=self.Partition, - Roof=self.Roof, - Slab=self.Slab, - IsFacadeAdiabatic=self.IsFacadeAdiabatic, - IsGroundAdiabatic=self.IsGroundAdiabatic, - IsPartitionAdiabatic=self.IsPartitionAdiabatic, - IsRoofAdiabatic=self.IsRoofAdiabatic, - IsSlabAdiabatic=self.IsSlabAdiabatic, - Category=self.Category, - Comments=self.Comments, - DataSource=self.DataSource, - Name=self.Name, - ) - - def get_ref(self, ref): - """Get item matching reference id. - - Args: - ref: - """ - return next( - iter( - [ - value - for value in ZoneConstructionSet.CREATED_OBJECTS - if value.id == ref["$ref"] - ] - ), - None, - ) - - -def surface_dispatcher(surf, zone): - """ - Args: - surf (EpBunch): - zone (ZoneDefinition): - """ - dispatch = { - ("Wall", "Outdoors"): ZoneConstructionSet._do_facade, - ("Floor", "Ground"): ZoneConstructionSet._do_ground, - ("Floor", "Outdoors"): ZoneConstructionSet._do_ground, - ("Floor", "Foundation"): ZoneConstructionSet._do_ground, - ("Floor", "OtherSideCoefficients"): ZoneConstructionSet._do_ground, - ("Floor", "GroundSlabPreprocessorAverage"): ZoneConstructionSet._do_ground, - ("Floor", "Surface"): ZoneConstructionSet._do_slab, - ("Floor", "Adiabatic"): ZoneConstructionSet._do_slab, - ("Floor", "Zone"): ZoneConstructionSet._do_slab, - ("Wall", "Adiabatic"): ZoneConstructionSet._do_partition, - ("Wall", "Surface"): ZoneConstructionSet._do_partition, - ("Wall", "Zone"): ZoneConstructionSet._do_partition, - ("Wall", "Ground"): ZoneConstructionSet._do_basement, - ("Roof", "Outdoors"): ZoneConstructionSet._do_roof, - ("Roof", "Zone"): ZoneConstructionSet._do_roof, - ("Roof", "Surface"): ZoneConstructionSet._do_roof, - ("Ceiling", "Adiabatic"): ZoneConstructionSet._do_slab, - ("Ceiling", "Surface"): ZoneConstructionSet._do_slab, - ("Ceiling", "Zone"): ZoneConstructionSet._do_slab, - } - if surf.key.upper() not in ["INTERNALMASS", "WINDOWSHADINGCONTROL"]: - a, b = surf["Surface_Type"].capitalize(), surf["Outside_Boundary_Condition"] - try: - yield dispatch[a, b](surf) - except KeyError as e: - raise NotImplementedError( - "surface '%s' in zone '%s' not supported by surface dispatcher " - "with keys %s" % (surf.Name, zone.Name, e) - ) diff --git a/archetypal/template/zonedefinition.py b/archetypal/template/zonedefinition.py index 33267d98..2a682a47 100644 --- a/archetypal/template/zonedefinition.py +++ b/archetypal/template/zonedefinition.py @@ -1,105 +1,52 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal ZoneDefinition module.""" import collections -import functools -import math import sqlite3 import time -from operator import add -import numpy as np -from deprecation import deprecated from eppy.bunch_subclass import BadEPFieldError -from geomeppy.geom.polygons import Polygon3D from sigfig import round - -from archetypal import __version__ -from archetypal.template import ( - DomesticHotWaterSetting, - OpaqueConstruction, - UmiBase, - UniqueName, - VentilationSetting, - WindowSetting, - ZoneConditioning, - ZoneConstructionSet, - ZoneLoad, -) +from validator_collection import validators + +from archetypal.template.conditioning import ZoneConditioning +from archetypal.template.constructions.internal_mass import InternalMass +from archetypal.template.constructions.opaque_construction import OpaqueConstruction +from archetypal.template.dhw import DomesticHotWaterSetting +from archetypal.template.load import ZoneLoad +from archetypal.template.umi_base import UmiBase +from archetypal.template.ventilation import VentilationSetting +from archetypal.template.window_setting import WindowSetting +from archetypal.template.zone_construction_set import ZoneConstructionSet from archetypal.utils import log, settings -class InternalMass(object): - """Class handles the creation of InternalMass constructions from - :class:`ZoneDefinition`.""" - - @classmethod - def from_zone(cls, zone, **kwargs): - """ - - Args: - zone (ZoneDefinition): A ZoneDefinition object. - **kwargs: - - Returns: - Construction: The internal mass construction for the zone - None: if no internal mass defined for zone. - """ - internal_mass_objs = zone._epbunch.getreferingobjs( - iddgroups=["Thermal Zones and Surfaces"], fields=["Zone_or_ZoneList_Name"] - ) - - area = 0 # initialize area - mass_opaque_constructions = [] # collect internal mass objects - - # Looping over possible InternalMass objects - # This InternalMass object (int_obj) is assigned to self, - # then create object and append to list. There could be more then - # one. - for int_obj in internal_mass_objs: - if int_obj.key.upper() == "INTERNALMASS": - mass_opaque_constructions.append( - OpaqueConstruction.from_epbunch(int_obj, Category="Internal Mass") - ) - area += float(int_obj.Surface_Area) - - # If one or more constructions, combine them into one. - if mass_opaque_constructions: - # Combine elements and assign the aggregated Surface Area - zone.InternalMassExposedPerFloorArea = float(area) / zone.area - return functools.reduce(add, mass_opaque_constructions) - else: - # No InternalMass object assigned to this Zone, then return Zone and set - # floor area to 0 - zone.InternalMassExposedPerFloorArea = 0 - return None - - @classmethod - def generic_internalmass_from_zone(cls, zone): - """Assign a generic internal mass with InternalMassExposedPerFloorArea = 0 to zone. - - Also set it to the self.InternalMassConstruction attribute. - - Args: - zone (ZoneDefinition): A ZoneDefinition object. - """ - zone.InternalMassConstruction = OpaqueConstruction.generic_internalmass( - idf=zone.idf - ) - zone.InternalMassExposedPerFloorArea = 0 - - class ZoneDefinition(UmiBase): - """Class containing HVAC settings: Conditioning, Domestic Hot Water, Loads, - Ventilation, adn Constructions + """Zone settings class. .. image:: ../images/template/zoneinfo-zone.png """ + __slots__ = ( + "_internal_mass_exposed_per_floor_area", + "_constructions", + "_loads", + "_conditioning", + "_ventilation", + "_domestic_hot_water", + "_windows", + "_occupants", + "_daylight_mesh_resolution", + "_daylight_workplane_height", + "_internal_mass_construction", + "_is_part_of_conditioned_floor_area", + "_is_part_of_total_floor_area", + "_zone_surfaces", + "_volume", + "_multiplier", + "_area", + "_is_core", + ) + def __init__( self, Name, @@ -113,6 +60,14 @@ def __init__( InternalMassConstruction=None, InternalMassExposedPerFloorArea=1.05, Windows=None, + area=1, + volume=1, + occupants=1, + is_part_of_conditioned_floor_area=True, + is_part_of_total_floor_area=True, + multiplier=1, + zone_surfaces=None, + is_core=False, **kwargs, ): """Initialize :class:`Zone` object. @@ -135,6 +90,9 @@ def __init__( InternalMassExposedPerFloorArea: Windows (WindowSetting): The WindowSetting object associated with this zone. + area (float): + volume (float): + occupants (float): **kwargs: """ super(ZoneDefinition, self).__init__(Name, **kwargs) @@ -149,70 +107,147 @@ def __init__( self.InternalMassConstruction = InternalMassConstruction self.InternalMassExposedPerFloorArea = InternalMassExposedPerFloorArea - self.Windows = Windows # This is not used in to_json() + self.Windows = Windows # This is not used in to_dict() + + if zone_surfaces is None: + zone_surfaces = [] + self.zone_surfaces = zone_surfaces + self.area = area + self.volume = volume + self.occupants = occupants + self.is_part_of_conditioned_floor_area = is_part_of_conditioned_floor_area + self.is_part_of_total_floor_area = is_part_of_total_floor_area + self.multiplier = multiplier + self.is_core = is_core + + @property + def Constructions(self): + """Get or set the ZoneConstructionSet object.""" + return self._constructions + + @Constructions.setter + def Constructions(self, value): + if value is not None: + assert isinstance(value, ZoneConstructionSet), ( + f"Input value error. Constructions must be of " + f"type {ZoneConstructionSet}, not {type(value)}." + ) + self._constructions = value + + @property + def Loads(self): + """Get or set the ZoneLoad object.""" + return self._loads + + @Loads.setter + def Loads(self, value): + if value is not None: + assert isinstance(value, ZoneLoad), ( + f"Input value error. Loads must be of " + f"type {ZoneLoad}, not {type(value)}." + ) + self._loads = value + + @property + def Conditioning(self): + """Get or set the ZoneConditioning object.""" + return self._conditioning + + @Conditioning.setter + def Conditioning(self, value): + if value is not None: + assert isinstance(value, ZoneConditioning), ( + f"Input value error. Conditioning must be of " + f"type {ZoneConditioning}, not {type(value)}." + ) + self._conditioning = value + + @property + def Ventilation(self): + """Get or set the VentilationSetting object.""" + return self._ventilation + + @Ventilation.setter + def Ventilation(self, value): + if value is not None: + assert isinstance(value, VentilationSetting), ( + f"Input value error. Ventilation must be of " + f"type {VentilationSetting}, not {type(value)}." + ) + self._ventilation = value + + @property + def DomesticHotWater(self): + """Get or set the DomesticHotWaterSetting object.""" + return self._domestic_hot_water + + @DomesticHotWater.setter + def DomesticHotWater(self, value): + if value is not None: + assert isinstance(value, DomesticHotWaterSetting), ( + f"Input value error. DomesticHotWater must be of " + f"type {DomesticHotWaterSetting}, not {type(value)}." + ) + self._domestic_hot_water = value + + @property + def DaylightMeshResolution(self): + """Get or set the daylight mesh resolution [m].""" + return self._daylight_mesh_resolution + + @DaylightMeshResolution.setter + def DaylightMeshResolution(self, value): + self._daylight_mesh_resolution = validators.float(value, minimum=0) + + @property + def DaylightWorkplaneHeight(self): + """Get or set the DaylightWorkplaneHeight [m].""" + return self._daylight_workplane_height + + @DaylightWorkplaneHeight.setter + def DaylightWorkplaneHeight(self, value): + self._daylight_workplane_height = validators.float(value, minimum=0) - self._epbunch = kwargs.get("epbunch", None) - self._zonesurfaces = kwargs.get("zonesurfaces", None) - self._area = None - self._volume = None - self._occupants = None - self._is_part_of_conditioned_floor_area = None - self._is_part_of_total_floor_area = None - self._multiplier = None + @property + def InternalMassConstruction(self): + """Get or set the internal mass construction object.""" + return self._internal_mass_construction + + @InternalMassConstruction.setter + def InternalMassConstruction(self, value): + if value is not None: + assert isinstance(value, OpaqueConstruction), ( + f"Input value error. InternalMassConstruction must be of " + f"type {OpaqueConstruction}, not {type(value)}." + ) + self._internal_mass_construction = value @property def InternalMassExposedPerFloorArea(self): - return float(self._InternalMassExposedPerFloorArea) + """Get or set the internal mass exposed per floor area [-].""" + return self._internal_mass_exposed_per_floor_area @InternalMassExposedPerFloorArea.setter def InternalMassExposedPerFloorArea(self, value): - self._InternalMassExposedPerFloorArea = value - - def __add__(self, other): - """ - Args: - other (ZoneDefinition): - """ - # create the new merged zone from self - return ZoneDefinition.combine(self, other) - - def __hash__(self): - return hash( - (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) - ) + self._internal_mass_exposed_per_floor_area = validators.float(value, minimum=0) - def __eq__(self, other): - if not isinstance(other, ZoneDefinition): - return NotImplemented - else: - return all( - [ - self.Conditioning == other.Conditioning, - self.Constructions == other.Constructions, - self.DomesticHotWater == other.DomesticHotWater, - self.Loads == other.Loads, - self.Ventilation == other.Ventilation, - self.Windows == other.Windows, - self.InternalMassConstruction == other.InternalMassConstruction, - self.InternalMassExposedPerFloorArea - == other.InternalMassExposedPerFloorArea, - self.DaylightMeshResolution == other.DaylightMeshResolution, - self.DaylightWorkplaneHeight == other.DaylightWorkplaneHeight, - ] + @property + def Windows(self): + """Get or set the WindowSetting object.""" + return self._windows + + @Windows.setter + def Windows(self, value): + if value is not None: + assert isinstance(value, WindowSetting), ( + f"Input value error. Windows must be of " + f"type {WindowSetting}, not {type(value)}." ) + self._windows = value @property def occupants(self): - if self._occupants is None: - with sqlite3.connect(self.idf.sql_file) as conn: - sql_query = ( - "SELECT t.Value FROM TabularDataWithStrings t " - "WHERE TableName='Average Outdoor Air During Occupied Hours' and ColumnName='Nominal Number of Occupants' and RowName=?" - ) - - fetchone = conn.execute(sql_query, (self.Name.upper(),)).fetchone() - (res,) = fetchone or (0,) - self._occupants = float(res) + """Get or set the number of occupants in the zone.""" return self._occupants @occupants.setter @@ -221,251 +256,327 @@ def occupants(self, value): @property def area(self): - if self._area is None: - with sqlite3.connect(self.idf.sql_file) as conn: - sql_query = """ - SELECT t.Value - FROM TabularDataWithStrings t - WHERE TableName='Zone Summary' and ColumnName='Area' and RowName=? - """ - (res,) = conn.execute(sql_query, (self.Name.upper(),)).fetchone() - self._area = float(res) + """Get or set the area of the zone [m²].""" return self._area @area.setter def area(self, value): - self._area = value + self._area = validators.float(value, minimum=0) @property def volume(self): - """Calculates the volume of the zone - - Returns (float): zone's volume in m³ - """ - if self._volume is None: - with sqlite3.connect(self.idf.sql_file) as conn: - sql_query = ( - "SELECT t.Value FROM TabularDataWithStrings t " - "WHERE TableName='Zone Summary' and ColumnName='Volume' and RowName=?" - ) - (res,) = conn.execute(sql_query, (self.Name.upper(),)).fetchone() - self._volume = float(res) + """Get or set the volume of the zone [m³].""" return self._volume @volume.setter def volume(self, value): - self._volume = value - - def zonesurfaces(self, exclude=None): - """Returns list of surfaces belonging to this zone. Optionally filter - surface types. - - Args: - exclude (list): exclude surface types, e.g.: ["INTERNALMASS", - "WINDOWSHADINGCONTROL"]. Object key must be in capital letters. - """ - if exclude is None: - exclude = [] - if self._zonesurfaces is None: - self._zonesurfaces = [surf for surf in self._epbunch.zonesurfaces] - return [surf for surf in self._zonesurfaces if surf.key.upper() not in exclude] + self._volume = validators.float(value, minimum=0) @property def is_core(self): - return is_core(self._epbunch) + """Get or set if the zone is a core zone [bool].""" + return self._is_core + + @is_core.setter + def is_core(self, value): + assert isinstance(value, bool), value + self._is_core = value @property def multiplier(self): - """Zone multipliers are designed as a “multiplier” for floor area, - zone loads, and energy consumed by internal gains. + """Get or set the zone multiplier. + + Note: Zone multiplier is designed as a “multiplier” for floor + area, zone loads, and energy consumed by internal gains. """ - if self._multiplier is None: - with sqlite3.connect(self.idf.sql_file) as conn: - sql_query = "SELECT t.Value FROM TabularDataWithStrings t WHERE TableName='Zone Summary' and ColumnName='Multipliers' and RowName=?" - (res,) = conn.execute(sql_query, (self.Name.upper(),)).fetchone() - self._multiplier = int(float(res)) return self._multiplier @multiplier.setter def multiplier(self, value): - self._multiplier = value + self._multiplier = validators.integer(value, minimum=1) @property def is_part_of_conditioned_floor_area(self): - """Returns True if zone is conditioned""" - if self._is_part_of_conditioned_floor_area is None: - with sqlite3.connect(self.idf.sql_file) as conn: - sql_query = ( - "SELECT t.Value FROM TabularDataWithStrings t WHERE TableName='Zone Summary' and ColumnName='Conditioned (Y/N)' and RowName=?" - "" - ) - res = conn.execute(sql_query, (self.Name.upper(),)).fetchone() - self._is_part_of_conditioned_floor_area = "Yes" in res + """Get or set is part of conditioned area [bool].""" return self._is_part_of_conditioned_floor_area + @is_part_of_conditioned_floor_area.setter + def is_part_of_conditioned_floor_area(self, value): + assert isinstance(value, bool) + self._is_part_of_conditioned_floor_area = value + @property def is_part_of_total_floor_area(self): - """Returns True if zone is part of the total floor area""" - if self._is_part_of_total_floor_area is None: - with sqlite3.connect(self.idf.sql_file) as conn: - sql_query = "SELECT t.Value FROM TabularDataWithStrings t WHERE TableName='Zone Summary' and ColumnName='Part of Total Floor Area (Y/N)' and RowName=?" - res = conn.execute(sql_query, (self.Name.upper(),)).fetchone() - self._is_part_of_total_floor_area = "Yes" in res + """Get or set is part od the total building floor area [bool].""" return self._is_part_of_total_floor_area - @staticmethod - def get_volume_from_surfs(zone_surfs): - """Calculate the volume of a zone only and only if the surfaces are such - that you can find a point inside so that you can connect every vertex to - the point without crossing a face. + @is_part_of_total_floor_area.setter + def is_part_of_total_floor_area(self, value): + assert isinstance(value, bool) + self._is_part_of_total_floor_area = value - Adapted from: https://stackoverflow.com/a/19125446 + @property + def zone_surfaces(self): + """Get or set the list of surfaces for this zone.""" + return self._zone_surfaces - Args: - zone_surfs (list): List of zone surfaces (EpBunch) - """ - vol = 0 - for surf in zone_surfs: - polygon_d = Polygon3D(surf.coords) # create Polygon3D from surf - n = len(polygon_d.vertices_list) - v2 = polygon_d[0] - x2 = v2.x - y2 = v2.y - z2 = v2.z - - for i in range(1, n - 1): - v0 = polygon_d[i] - x0 = v0.x - y0 = v0.y - z0 = v0.z - v1 = polygon_d[i + 1] - x1 = v1.x - y1 = v1.y - z1 = v1.z - # Add volume of tetrahedron formed by triangle and origin - vol += math.fabs( - x0 * y1 * z2 - + x1 * y2 * z0 - + x2 * y0 * z1 - - x0 * y2 * z1 - - x1 * y0 * z2 - - x2 * y1 * z0 - ) - return vol / 6.0 + @zone_surfaces.setter + def zone_surfaces(self, value): + self._zone_surfaces = validators.iterable(value, allow_empty=True) - def to_json(self): + def to_dict(self): + """Return ZoneDefinition dictionary representation.""" self.validate() # Validate object before trying to get json format data_dict = collections.OrderedDict() data_dict["$id"] = str(self.id) - data_dict["Conditioning"] = self.Conditioning.to_dict() - data_dict["Constructions"] = self.Constructions.to_dict() + data_dict["Conditioning"] = self.Conditioning.to_ref() + data_dict["Constructions"] = self.Constructions.to_ref() data_dict["DaylightMeshResolution"] = round(self.DaylightMeshResolution, 2) data_dict["DaylightWorkplaneHeight"] = round(self.DaylightWorkplaneHeight, 2) - data_dict["DomesticHotWater"] = self.DomesticHotWater.to_dict() - data_dict["InternalMassConstruction"] = self.InternalMassConstruction.to_dict() + data_dict["DomesticHotWater"] = self.DomesticHotWater.to_ref() + data_dict["InternalMassConstruction"] = self.InternalMassConstruction.to_ref() data_dict["InternalMassExposedPerFloorArea"] = round( - self.InternalMassExposedPerFloorArea, 2 + self.InternalMassExposedPerFloorArea, 3 ) - data_dict["Loads"] = self.Loads.to_dict() - data_dict["Ventilation"] = self.Ventilation.to_dict() + data_dict["Loads"] = self.Loads.to_ref() + data_dict["Ventilation"] = self.Ventilation.to_ref() data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments + data_dict["Comments"] = validators.string(self.Comments, allow_empty=True) data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) + data_dict["Name"] = self.Name return data_dict - @classmethod - @deprecated( - deprecated_in="1.3.1", - removed_in="1.5", - current_version=__version__, - details="Use from_dict function instead", - ) - def from_json(cls, *args, **kwargs): - - return cls.from_dict(*args, **kwargs) - @classmethod def from_dict( cls, - Conditioning, - Constructions, - DomesticHotWater, - InternalMassConstruction, - Loads, - Ventilation, - *args, + data, + zone_conditionings, + zone_construction_sets, + domestic_hot_water_settings, + opaque_constructions, + zone_loads, + ventilation_settings, **kwargs, ): - """ + """Create a ZoneDefinition from a dictionary. + Args: - *args: - **kwargs: + data (dict): The python dictionary. + zone_conditionings (dict): A dictionary of ZoneConditioning objects with + their id as keys. + zone_construction_sets (dict): A dictionary of ZoneConstructionSet + objects with their id as keys. + domestic_hot_water_settings (dict): A dictionary of DomesticHotWaterSetting + objects with their id as keys. + opaque_constructions (dict): A dictionary of OpaqueConstruction objects + with their id as keys. + zone_loads (dict): A dictionary of ZoneLoad objects with their id as + keys. + ventilation_settings (dict): A dictionary of ZoneConditioning objects with + their id as keys. + **kwargs: keywords passed to the constructor. + + .. code-block:: python + + { + "$id": "175", + "Conditioning": { + "$ref": "165" + }, + "Constructions": { + "$ref": "168" + }, + "DaylightMeshResolution": 1.0, + "DaylightWorkplaneHeight": 0.8, + "DomesticHotWater": { + "$ref": "159" + }, + "InternalMassConstruction": { + "$ref": "54" + }, + "InternalMassExposedPerFloorArea": 1.05, + "Loads": { + "$ref": "172" + }, + "Ventilation": { + "$ref": "162" + }, + "Category": "Office Spaces", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Off_0" + } """ - Conditioning = cls.get_classref(Conditioning) - Constructions = cls.get_classref(Constructions) - DomesticHotWater = cls.get_classref(DomesticHotWater) - InternalMassConstruction = cls.get_classref(InternalMassConstruction) - Loads = cls.get_classref(Loads) - Ventilation = cls.get_classref(Ventilation) - zone = cls( - *args, - Conditioning=Conditioning, - Constructions=Constructions, - DomesticHotWater=DomesticHotWater, - InternalMassConstruction=InternalMassConstruction, - Loads=Loads, - Ventilation=Ventilation, + _id = data.pop("$id") + + conditioning = zone_conditionings[data.pop("Conditioning")["$ref"]] + construction_set = zone_construction_sets[data.pop("Constructions")["$ref"]] + domestic_hot_water_setting = domestic_hot_water_settings[ + data.pop("DomesticHotWater")["$ref"] + ] + internal_mass_construction = opaque_constructions[ + data.pop("InternalMassConstruction")["$ref"] + ] + zone_load = zone_loads[data.pop("Loads")["$ref"]] + ventilation_setting = ventilation_settings[data.pop("Ventilation")["$ref"]] + + return cls( + id=_id, + Conditioning=conditioning, + Constructions=construction_set, + DomesticHotWater=domestic_hot_water_setting, + InternalMassConstruction=internal_mass_construction, + Loads=zone_load, + Ventilation=ventilation_setting, + **data, **kwargs, ) - return zone - @classmethod - def from_zone_epbunch(cls, zone_ep, construct_parents=True, **kwargs): + def from_epbunch(cls, ep_bunch, construct_parents=True, **kwargs): """Create a Zone object from an eppy 'ZONE' epbunch. Args: - zone_ep (eppy.bunch_subclass.EpBunch): The Zone EpBunch. + ep_bunch (eppy.bunch_subclass.EpBunch): The Zone EpBunch. construct_parents (bool): If False, skips construction of parents objects such as Constructions, Conditioning, etc. """ + assert ( + ep_bunch.key.lower() == "zone" + ), f"Expected a `ZONE` epbunch, got {ep_bunch.key}" start_time = time.time() - log('Constructing :class:`Zone` for zone "{}"'.format(zone_ep.Name)) - name = zone_ep.Name + log('Constructing :class:`Zone` for zone "{}"'.format(ep_bunch.Name)) + + def calc_zone_area(zone_ep): + """Get zone area from simulation sql file.""" + with sqlite3.connect(zone_ep.theidf.sql_file) as conn: + sql_query = """ + SELECT t.Value + FROM TabularDataWithStrings t + WHERE TableName='Zone Summary' and ColumnName='Area' and RowName=? + """ + (res,) = conn.execute(sql_query, (zone_ep.Name.upper(),)).fetchone() + return float(res) + + def calc_zone_volume(zone_ep): + """Get zone volume from simulation sql file.""" + with sqlite3.connect(zone_ep.theidf.sql_file) as conn: + sql_query = ( + "SELECT t.Value FROM TabularDataWithStrings t " + "WHERE TableName='Zone Summary' and ColumnName='Volume' and " + "RowName=?" + ) + (res,) = conn.execute(sql_query, (zone_ep.Name.upper(),)).fetchone() + return float(res) + + def calc_zone_occupants(zone_ep): + """Get zone occupants from simulation sql file.""" + with sqlite3.connect(zone_ep.theidf.sql_file) as conn: + sql_query = ( + "SELECT t.Value FROM TabularDataWithStrings t " + "WHERE TableName='Average Outdoor Air During Occupied Hours' and ColumnName='Nominal Number of Occupants' and RowName=?" + ) + + fetchone = conn.execute(sql_query, (zone_ep.Name.upper(),)).fetchone() + (res,) = fetchone or (0,) + return float(res) + + def calc_is_part_of_conditioned_floor_area(zone_ep): + """Return True if zone is part of the conditioned floor area.""" + with sqlite3.connect(zone_ep.theidf.sql_file) as conn: + sql_query = ( + "SELECT t.Value FROM TabularDataWithStrings t WHERE " + "TableName='Zone Summary' and ColumnName='Conditioned (Y/N)' " + "and RowName=?" + "" + ) + res = conn.execute(sql_query, (zone_ep.Name.upper(),)).fetchone() + return "Yes" in res + + def calc_is_part_of_total_floor_area(zone_ep): + """Return True if zone is part of the total floor area.""" + with sqlite3.connect(zone_ep.theidf.sql_file) as conn: + sql_query = ( + "SELECT t.Value FROM TabularDataWithStrings t WHERE " + "TableName='Zone Summary' and ColumnName='Part of " + "Total Floor Area (Y/N)' and RowName=?" + ) + res = conn.execute(sql_query, (zone_ep.Name.upper(),)).fetchone() + return "Yes" in res + + def calc_multiplier(zone_ep): + """Get the zone multiplier from simulation sql.""" + with sqlite3.connect(zone_ep.theidf.sql_file) as conn: + sql_query = ( + "SELECT t.Value FROM TabularDataWithStrings t WHERE " + "TableName='Zone Summary' and " + "ColumnName='Multipliers' and RowName=?" + ) + (res,) = conn.execute(sql_query, (zone_ep.Name.upper(),)).fetchone() + return int(float(res)) + + def is_core(zone_ep): + # if all surfaces don't have boundary condition == "Outdoors" + iscore = True + for s in zone_ep.zonesurfaces: + try: + if (abs(int(s.tilt)) < 180) & (abs(int(s.tilt)) > 0): + obc = s.Outside_Boundary_Condition.lower() + if obc in ["outdoors", "ground"]: + iscore = False + break + except BadEPFieldError: + pass # pass surfaces that don't have an OBC, + # eg. InternalMass + return iscore + + name = ep_bunch.Name zone = cls( Name=name, - idf=zone_ep.theidf, - Category=zone_ep.theidf.name, + Category=ep_bunch.theidf.name, + area=calc_zone_area(ep_bunch), + volume=calc_zone_volume(ep_bunch), + occupants=calc_zone_occupants(ep_bunch), + is_part_of_conditioned_floor_area=calc_is_part_of_conditioned_floor_area( + ep_bunch + ), + is_part_of_total_floor_area=calc_is_part_of_total_floor_area(ep_bunch), + multiplier=calc_multiplier(ep_bunch), + zone_surfaces=ep_bunch.zonesurfaces, + is_core=is_core(ep_bunch), **kwargs, ) - zone._epbunch = zone_ep - zone._zonesurfaces = zone_ep.zonesurfaces - if construct_parents: zone.Constructions = ZoneConstructionSet.from_zone(zone, **kwargs) - zone.Conditioning = ZoneConditioning.from_zone(zone, **kwargs) - zone.Ventilation = VentilationSetting.from_zone(zone, **kwargs) - zone.DomesticHotWater = DomesticHotWaterSetting.from_zone(zone, **kwargs) - zone.Loads = ZoneLoad.from_zone(zone, **kwargs) - zone.InternalMassConstruction = InternalMass.from_zone(zone, **kwargs) + zone.Conditioning = ZoneConditioning.from_zone(zone, ep_bunch, **kwargs) + zone.Ventilation = VentilationSetting.from_zone(zone, ep_bunch, **kwargs) + zone.DomesticHotWater = DomesticHotWaterSetting.from_zone( + ep_bunch, **kwargs + ) + zone.Loads = ZoneLoad.from_zone(zone, ep_bunch, **kwargs) + internal_mass_from_zone = InternalMass.from_zone(ep_bunch) + zone.InternalMassConstruction = internal_mass_from_zone.construction + zone.InternalMassExposedPerFloorArea = ( + internal_mass_from_zone.total_area_exposed_to_zone + ) zone.Windows = WindowSetting.from_zone(zone, **kwargs) log( 'completed Zone "{}" constructor in {:,.2f} seconds'.format( - zone_ep.Name, time.time() - start_time + ep_bunch.Name, time.time() - start_time ) ) return zone def combine(self, other, weights=None, allow_duplicates=False): - """ + """Combine two ZoneDefinition objects together. + Args: - other (ZoneDefinition): + other (ZoneDefinition): The other object. weights (list-like, optional): A list-like object of len 2. If None, the volume of the zones for which self and other belongs is used. @@ -478,11 +589,20 @@ def combine(self, other, weights=None, allow_duplicates=False): (ZoneDefinition): the combined Zone object. """ # Check if other is None. Simply return self - if not other: - return self - - if not self: - return other + if not self and not other: + return None + elif self == other: + area = 1 if self.area + other.area == 2 else self.area + other.area + volume = ( + 1 if self.volume + other.volume == 2 else self.volume + other.volume + ) + new_obj = self.duplicate() + new_obj.area = area + new_obj.volume = volume + return new_obj + elif not self or not other: + new_obj = (self or other).duplicate() + return new_obj # Check if other is the same type as self if not isinstance(other, self.__class__): @@ -516,44 +636,34 @@ def combine(self, other, weights=None, allow_duplicates=False): Constructions=ZoneConstructionSet.combine( self.Constructions, other.Constructions, weights ), - Ventilation=VentilationSetting.combine( - self.Ventilation, other.Ventilation, weights - ), + Ventilation=VentilationSetting.combine(self.Ventilation, other.Ventilation), Windows=WindowSetting.combine(self.Windows, other.Windows, weights), - DaylightMeshResolution=self._float_mean( + DaylightMeshResolution=self.float_mean( other, "DaylightMeshResolution", weights=weights ), - DaylightWorkplaneHeight=self._float_mean( + DaylightWorkplaneHeight=self.float_mean( other, "DaylightWorkplaneHeight", weights ), DomesticHotWater=DomesticHotWaterSetting.combine( - self.DomesticHotWater, other.DomesticHotWater, weights + self.DomesticHotWater, other.DomesticHotWater ), InternalMassConstruction=OpaqueConstruction.combine( self.InternalMassConstruction, other.InternalMassConstruction ), - InternalMassExposedPerFloorArea=self._float_mean( + InternalMassExposedPerFloorArea=self.float_mean( other, "InternalMassExposedPerFloorArea", weights ), Loads=ZoneLoad.combine(self.Loads, other.Loads, weights), ) - new_obj = ZoneDefinition(**meta, **new_attr, idf=self.idf) + new_obj = ZoneDefinition(**meta, **new_attr) # transfer aggregated values [volume, area, occupants] to new combined zone new_obj.volume = self.volume + other.volume new_obj.area = self.area + other.area new_obj.occupants = self.occupants + other.occupants - if new_attr["Conditioning"]: # Could be None - new_attr["Conditioning"]._belongs_to_zone = new_obj - if new_attr["Constructions"]: # Could be None - new_attr["Constructions"]._belongs_to_zone = new_obj - if new_attr["Ventilation"]: # Could be None - new_attr["Ventilation"]._belongs_to_zone = new_obj - if new_attr["DomesticHotWater"]: # Could be None - new_attr["DomesticHotWater"]._belongs_to_zone = new_obj if new_attr["Windows"]: # Could be None - new_attr["Windows"]._belongs_to_zone = new_obj + new_attr["Windows"].area = new_obj.area new_obj.predecessors.update(self.predecessors + other.predecessors) return new_obj @@ -561,7 +671,11 @@ def combine(self, other, weights=None, allow_duplicates=False): def validate(self): """Validate object and fill in missing values.""" if not self.InternalMassConstruction: - InternalMass.generic_internalmass_from_zone(self) + internal_mass = InternalMass.generic_internalmass_from_zone(self) + self.InternalMassConstruction = internal_mass.construction + self.InternalMassExposedPerFloorArea = ( + internal_mass.total_area_exposed_to_zone + ) log( f"While validating {self}, the required attribute " f"'InternalMassConstruction' was filled " @@ -575,8 +689,15 @@ def validate(self): return self - def mapping(self): - self.validate() + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate (bool): If True, try to validate object before returning the + mapping. + """ + if validate: + self.validate() return dict( Conditioning=self.Conditioning, @@ -593,32 +714,57 @@ def mapping(self): Comments=self.Comments, DataSource=self.DataSource, Name=self.Name, + area=self.area, + volume=self.volume, + occupants=self.occupants, + is_part_of_conditioned_floor_area=self.is_part_of_conditioned_floor_area, + is_part_of_total_floor_area=self.is_part_of_total_floor_area, + multiplier=self.multiplier, + zone_surfaces=self.zone_surfaces, + is_core=self.is_core, ) - def get_ref(self, ref): - """Get item matching reference id. + def __add__(self, other): + """Return a combination of self and other.""" + return ZoneDefinition.combine(self, other) - Args: - ref: - """ - return next( - iter( + def __hash__(self): + """Return the hash value of self.""" + return hash( + (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + ) + + def __eq__(self, other): + """Assert self is equivalent to other.""" + if not isinstance(other, ZoneDefinition): + return NotImplemented + else: + return all( [ - value - for value in ZoneDefinition.CREATED_OBJECTS - if value.id == ref["$ref"] + self.Conditioning == other.Conditioning, + self.Constructions == other.Constructions, + self.DomesticHotWater == other.DomesticHotWater, + self.Loads == other.Loads, + self.Ventilation == other.Ventilation, + self.Windows == other.Windows, + self.InternalMassConstruction == other.InternalMassConstruction, + self.InternalMassExposedPerFloorArea + == other.InternalMassExposedPerFloorArea, + self.DaylightMeshResolution == other.DaylightMeshResolution, + self.DaylightWorkplaneHeight == other.DaylightWorkplaneHeight, ] - ), - None, - ) + ) + + def __copy__(self): + """Return a copy of self.""" + return self.__class__(**self.mapping(validate=False)) -def resolve_obco(this): - """Resolve the outside boundary condition of a surface and return the other - SURFACE epbunch and, if possible, the ZONE epbunch. +def resolve_obco(ep_bunch): + """Resolve the outside boundary condition of a surface. Args: - this (EpBunch): The surface for which we are identifying the boundary + ep_bunch (EpBunch): The surface for which we are identifying the boundary object. Returns: @@ -642,149 +788,23 @@ def resolve_obco(this): SurfaceProperty:OtherSideCoefficients. If OtherSideConditionsModel, specify name of SurfaceProperty:OtherSideConditionsModel. """ - - # other belongs to which zone? - # for key in this.getfieldidd_item('Outside_Boundary_Condition_Object', - # 'validobjects'): - - obc = this.Outside_Boundary_Condition + obc = ep_bunch.Outside_Boundary_Condition if obc.upper() == "ZONE": - name = this.Outside_Boundary_Condition_Object - adj_zone = this.theidf.getobject("ZONE", name) + name = ep_bunch.Outside_Boundary_Condition_Object + adj_zone = ep_bunch.theidf.getobject("ZONE", name) return None, adj_zone elif obc.upper() == "SURFACE": - obco = this.get_referenced_object("Outside_Boundary_Condition_Object") + obco = ep_bunch.get_referenced_object("Outside_Boundary_Condition_Object") adj_zone = obco.theidf.getobject("ZONE", obco.Zone_Name) return obco, adj_zone else: return None, None -def label_surface(row): - """Takes a boundary and returns its corresponding umi-Category - - Args: - row: - """ - # Floors - if row["Surface_Type"] == "Floor": - if row["Outside_Boundary_Condition"] == "Surface": - return "Interior Floor" - if row["Outside_Boundary_Condition"] == "Ground": - return "Ground Floor" - if row["Outside_Boundary_Condition"] == "Outdoors": - return "Exterior Floor" - if row["Outside_Boundary_Condition"] == "Adiabatic": - return "Interior Floor" - else: - return "Other" - - # Roofs & Ceilings - if row["Surface_Type"] == "Roof": - return "Roof" - if row["Surface_Type"] == "Ceiling": - return "Interior Floor" - # Walls - if row["Surface_Type"] == "Wall": - if row["Outside_Boundary_Condition"] == "Surface": - return "Partition" - if row["Outside_Boundary_Condition"] == "Outdoors": - return "Facade" - if row["Outside_Boundary_Condition"] == "Adiabatic": - return "Partition" - return "Other" - - -def type_surface(row): - """Takes a boundary and returns its corresponding umi-type - - Args: - row: - """ - - # Floors - if row["Surface_Type"] == "Floor": - if row["Outside_Boundary_Condition"] == "Surface": - return 3 # umi defined - if row["Outside_Boundary_Condition"] == "Ground": - return 2 # umi defined - if row["Outside_Boundary_Condition"] == "Outdoors": - return 4 # umi defined - if row["Outside_Boundary_Condition"] == "Adiabatic": - return 5 - else: - return ValueError('Cannot find Construction Type for "{}"'.format(row)) - - # Roofs & Ceilings - elif row["Surface_Type"] == "Roof": - return 1 - elif row["Surface_Type"] == "Ceiling": - return 3 - # Walls - elif row["Surface_Type"] == "Wall": - if row["Outside_Boundary_Condition"] == "Surface": - return 5 # umi defined - if row["Outside_Boundary_Condition"] == "Outdoors": - return 0 # umi defined - if row["Outside_Boundary_Condition"] == "Adiabatic": - return 5 # umi defined - else: - raise ValueError('Cannot find Construction Type for "{}"'.format(row)) - - -def zone_information(df): - """Each zone_loads is summarized in a simple set of statements - - Args: - df: - - Returns: - df - - References: - * ` Zone Loads Information - - < https://bigladdersoftware.com/epx/docs/8-3/output-details-and - -examples/eplusout.eio.html#zone_loads-information>`_ - """ - df = get_from_tabulardata(df) - tbstr = df[ - (df.ReportName == "Initialization Summary") - & (df.TableName == "Zone Information") - ].reset_index() - # Ignore Zone that are not part of building area - pivoted = tbstr.pivot_table( - index=["RowName"], - columns="ColumnName", - values="Value", - aggfunc=lambda x: " ".join(x), - ) - - return pivoted.loc[pivoted["Part of Total Building Area"] == "Yes", :] - - -def get_from_tabulardata(sql): - """Returns a DataFrame from the 'TabularDataWithStrings' table. - - Args: - sql (dict): - - Returns: - (pandas.DataFrame) - """ - tab_data_wstring = sql["TabularDataWithStrings"] - tab_data_wstring.index.names = ["Index"] - - # strip whitespaces - tab_data_wstring.Value = tab_data_wstring.Value.str.strip() - tab_data_wstring.RowName = tab_data_wstring.RowName.str.strip() - return tab_data_wstring - - def is_core(zone): - """ + """Return true if zone is a core zone. Args: zone (eppy.bunch_subclass.EpBunch): The Zone object. @@ -805,34 +825,3 @@ def is_core(zone): pass # pass surfaces that don't have an OBC, # eg. InternalMass return iscore - - -def iscore(row): - """Helps to group by core and perimeter zones. If any of "has `core` in - name" and "ExtGrossWallArea == 0" is true, will consider zone_loads as core, - else as perimeter. - - Todo: - * assumes a basement zone_loads will be considered as a core zone_loads - since no ext wall area for basements. - - Args: - row (pandas.Series): a row - - Returns: - str: 'Core' or 'Perimeter' - """ - if any( - [ - "core" in row["Zone Name"].lower(), - float(row["Exterior Gross Wall Area {m2}"]) == 0, - ] - ): - # We look for the string `core` in the Zone_Name - return "Core" - elif row["Part of Total Building Area"] == "No": - return np.NaN - elif "plenum" in row["Zone Name"].lower(): - return np.NaN - else: - return "Perimeter" diff --git a/archetypal/umi_template.py b/archetypal/umi_template.py index 15e886b6..a776995f 100644 --- a/archetypal/umi_template.py +++ b/archetypal/umi_template.py @@ -8,33 +8,32 @@ from pandas.io.common import get_handle from path import Path +from archetypal import settings from archetypal.eplus_interface.exceptions import EnergyPlusProcessError -from archetypal.template import ( - IDF, - BuildingTemplate, +from archetypal.idfclass.idf import IDF +from archetypal.template.building_template import BuildingTemplate +from archetypal.template.conditioning import ZoneConditioning +from archetypal.template.constructions.opaque_construction import OpaqueConstruction +from archetypal.template.constructions.window_construction import WindowConstruction +from archetypal.template.dhw import DomesticHotWaterSetting +from archetypal.template.load import ZoneLoad +from archetypal.template.materials.gas_layer import GasLayer +from archetypal.template.materials.gas_material import GasMaterial +from archetypal.template.materials.glazing_material import GlazingMaterial +from archetypal.template.materials.material_layer import MaterialLayer +from archetypal.template.materials.opaque_material import OpaqueMaterial +from archetypal.template.schedule import ( DaySchedule, - DomesticHotWaterSetting, - GasMaterial, - GlazingMaterial, - MassRatio, - MaterialLayer, - OpaqueConstruction, - OpaqueMaterial, - StructureInformation, - UmiBase, - UniqueName, - VentilationSetting, WeekSchedule, - WindowConstruction, - WindowSetting, YearSchedule, YearSchedulePart, - ZoneConditioning, - ZoneConstructionSet, - ZoneDefinition, - ZoneLoad, - settings, ) +from archetypal.template.structure import MassRatio, StructureInformation +from archetypal.template.umi_base import UmiBase, UniqueName +from archetypal.template.ventilation import VentilationSetting +from archetypal.template.window_setting import WindowSetting +from archetypal.template.zone_construction_set import ZoneConstructionSet +from archetypal.template.zonedefinition import ZoneDefinition from archetypal.utils import CustomJSONEncoder, log, parallel_process @@ -141,7 +140,7 @@ def __init__( self.GlazingMaterials = GlazingMaterials or [] def __iter__(self): - """Iterate over component groups.""" + """Iterate over component groups. Yields tuple of (group, value).""" for group in self._LIB_GROUPS: yield group, self.__dict__[group] @@ -188,16 +187,12 @@ def from_idf_files( # instantiate class umi_template = cls(name) - # fill in arguments - umi_template.idf_files = [Path(idf) for idf in idf_files] - umi_template.weather = Path(weather).expand() - # if parallel is True, run eplus in parallel in_dict = {} - for i, idf_file in enumerate(umi_template.idf_files): + for i, idf_file in enumerate(idf_files): in_dict[idf_file] = dict( idfname=idf_file, - epw=umi_template.weather, + epw=weather, verbose=False, position=i, nolimit=True, @@ -281,104 +276,174 @@ def template_complexity_reduction(idfname, epw, **kwargs): return BuildingTemplate.from_idf(idf, **kwargs) @classmethod - def open(cls, filename, idf=None): + def open(cls, filename): """Initialize an UmiTemplate object from an UMI Template Library File. Args: filename (str or Path): PathLike object giving the pathname of the UMI Template File. - idf (IDF): Optionally pass a pre-initialized IDF object. Returns: UmiTemplateLibrary: The template object. """ name = Path(filename) - t = cls(name) - if not idf: - idf = IDF(prep_outputs=False) with open(filename, "r") as f: - import json - - datastore = json.load(f) - - # with datastore, create each objects - t.GasMaterials = [ - GasMaterial.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["GasMaterials"] - ] - t.GlazingMaterials = [ - GlazingMaterial(**store, idf=idf, allow_duplicates=True) - for store in datastore["GlazingMaterials"] - ] - t.OpaqueMaterials = [ - OpaqueMaterial(**store, idf=idf, allow_duplicates=True) - for store in datastore["OpaqueMaterials"] - ] - t.OpaqueConstructions = [ - OpaqueConstruction.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["OpaqueConstructions"] - ] - t.WindowConstructions = [ - WindowConstruction.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["WindowConstructions"] - ] - t.StructureInformations = [ - StructureInformation.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["StructureDefinitions"] - ] - t.DaySchedules = [ - DaySchedule.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["DaySchedules"] - ] - t.WeekSchedules = [ - WeekSchedule.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["WeekSchedules"] - ] - t.YearSchedules = [ - YearSchedule.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["YearSchedules"] - ] - t.DomesticHotWaterSettings = [ - DomesticHotWaterSetting.from_dict( - **store, idf=idf, allow_duplicates=True - ) - for store in datastore["DomesticHotWaterSettings"] - ] - t.VentilationSettings = [ - VentilationSetting.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["VentilationSettings"] - ] - t.ZoneConditionings = [ - ZoneConditioning.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["ZoneConditionings"] - ] - t.ZoneConstructionSets = [ - ZoneConstructionSet.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["ZoneConstructionSets"] - ] - t.ZoneLoads = [ - ZoneLoad.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["ZoneLoads"] - ] - t.ZoneDefinitions = [ - ZoneDefinition.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["Zones"] - ] - t.WindowSettings = [ - WindowSetting.from_ref( - store["$ref"], datastore["BuildingTemplates"], idf=idf - ) - if "$ref" in store - else WindowSetting.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["WindowSettings"] - ] - t.BuildingTemplates = [ - BuildingTemplate.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["BuildingTemplates"] - ] + t = cls.loads(f.read(), name) return t + @classmethod + def loads(cls, s, name): + """load string.""" + datastore = json.loads(s) + # with datastore, create each objects + t = cls(name) + t.GasMaterials = [ + GasMaterial.from_dict(store, allow_duplicates=True) + for store in datastore["GasMaterials"] + ] + t.GlazingMaterials = [ + GlazingMaterial.from_dict( + store, + ) + for store in datastore["GlazingMaterials"] + ] + t.OpaqueMaterials = [ + OpaqueMaterial.from_dict(store, allow_duplicates=True) + for store in datastore["OpaqueMaterials"] + ] + t.OpaqueConstructions = [ + OpaqueConstruction.from_dict( + store, + materials={ + a.id: a + for a in (t.GasMaterials + t.GlazingMaterials + t.OpaqueMaterials) + }, + allow_duplicates=True, + ) + for store in datastore["OpaqueConstructions"] + ] + t.WindowConstructions = [ + WindowConstruction.from_dict( + store, + materials={a.id: a for a in (t.GasMaterials + t.GlazingMaterials)}, + allow_duplicates=True, + ) + for store in datastore["WindowConstructions"] + ] + t.StructureInformations = [ + StructureInformation.from_dict( + store, + materials={a.id: a for a in t.OpaqueMaterials}, + allow_duplicates=True, + ) + for store in datastore["StructureDefinitions"] + ] + t.DaySchedules = [ + DaySchedule.from_dict(store, allow_duplicates=True) + for store in datastore["DaySchedules"] + ] + t.WeekSchedules = [ + WeekSchedule.from_dict( + store, + day_schedules={a.id: a for a in t.DaySchedules}, + allow_duplicates=True, + ) + for store in datastore["WeekSchedules"] + ] + t.YearSchedules = [ + YearSchedule.from_dict( + store, + week_schedules={a.id: a for a in t.WeekSchedules}, + allow_duplicates=True, + ) + for store in datastore["YearSchedules"] + ] + t.DomesticHotWaterSettings = [ + DomesticHotWaterSetting.from_dict( + store, + schedules={a.id: a for a in t.YearSchedules}, + allow_duplicates=True, + ) + for store in datastore["DomesticHotWaterSettings"] + ] + t.VentilationSettings = [ + VentilationSetting.from_dict( + store, + schedules={a.id: a for a in t.YearSchedules}, + allow_duplicates=True, + ) + for store in datastore["VentilationSettings"] + ] + t.ZoneConditionings = [ + ZoneConditioning.from_dict( + store, + schedules={a.id: a for a in t.YearSchedules}, + allow_duplicates=True, + ) + for store in datastore["ZoneConditionings"] + ] + t.ZoneConstructionSets = [ + ZoneConstructionSet.from_dict( + store, + opaque_constructions={a.id: a for a in t.OpaqueConstructions}, + allow_duplicates=True, + ) + for store in datastore["ZoneConstructionSets"] + ] + t.ZoneLoads = [ + ZoneLoad.from_dict( + store, + schedules={a.id: a for a in t.YearSchedules}, + allow_duplicates=True, + ) + for store in datastore["ZoneLoads"] + ] + t.ZoneDefinitions = [ + ZoneDefinition.from_dict( + store, + zone_conditionings={a.id: a for a in t.ZoneConditionings}, + zone_construction_sets={a.id: a for a in t.ZoneConstructionSets}, + domestic_hot_water_settings={ + a.id: a for a in t.DomesticHotWaterSettings + }, + opaque_constructions={a.id: a for a in t.OpaqueConstructions}, + zone_loads={a.id: a for a in t.ZoneLoads}, + ventilation_settings={a.id: a for a in t.VentilationSettings}, + allow_duplicates=True, + ) + for store in datastore["Zones"] + ] + t.WindowSettings = [ + WindowSetting.from_ref( + store["$ref"], + datastore["BuildingTemplates"], + schedules={a.id: a for a in t.YearSchedules}, + window_constructions={a.id: a for a in t.WindowConstructions}, + ) + if "$ref" in store + else WindowSetting.from_dict( + store, + schedules={a.id: a for a in t.YearSchedules}, + window_constructions={a.id: a for a in t.WindowConstructions}, + allow_duplicates=True, + ) + for store in datastore["WindowSettings"] + ] + t.BuildingTemplates = [ + BuildingTemplate.from_dict( + store, + zone_definitions={a.id: a for a in t.ZoneDefinitions}, + structure_definitions={a.id: a for a in t.StructureInformations}, + window_settings={a.id: a for a in t.WindowSettings}, + schedules={a.id: a for a in t.YearSchedules}, + window_constructions={a.id: a for a in t.WindowConstructions}, + allow_duplicates=True, + ) + for store in datastore["BuildingTemplates"] + ] + return t + def validate(self, defaults=True): """Validate the object.""" pass @@ -497,22 +562,27 @@ def to_json( return response def to_dict(self): - """Return the dict representation of the object.""" + """Return UmiTemplateLibrary dictionary representation.""" # First, reset existing name - UniqueName.existing = set() # Create ordered dict with empty list data_dict = OrderedDict([(key, []) for key in self._LIB_GROUPS]) # create dict values for group_name, group in self: + # reset unique names for group + UniqueName.existing = set() obj: UmiBase for obj in group: - data_dict.setdefault(group_name, []).append(obj.to_json()) + data = obj.to_dict() + data.update({"Name": UniqueName(data.get("Name"))}) + data_dict.setdefault(group_name, []).append(data) if not data_dict.get("GasMaterials"): # Umi needs at least one gas material even if it is not necessary. - data_dict.get("GasMaterials").append(GasMaterial(Name="AIR").to_json()) + data = GasMaterial(Name="AIR").to_dict() + data.update({"Name": UniqueName(data.get("Name"))}) + data_dict.get("GasMaterials").append(data) data_dict.move_to_end("GasMaterials", last=False) # Correct naming convention and reorder categories @@ -641,7 +711,7 @@ def no_duplicates(file, attribute="Name"): return True -DEEP_OBJECTS = (UmiBase, MaterialLayer, YearSchedulePart, MassRatio, list) +DEEP_OBJECTS = (UmiBase, MaterialLayer, GasLayer, YearSchedulePart, MassRatio, list) def traverse(parent): diff --git a/archetypal/utils.py b/archetypal/utils.py index 15e029f0..a405b017 100644 --- a/archetypal/utils.py +++ b/archetypal/utils.py @@ -18,14 +18,12 @@ import logging as lg import multiprocessing import os -import re import sys import time import unicodedata import warnings from collections import OrderedDict from concurrent.futures._base import as_completed -from datetime import datetime, timedelta import numpy as np import pandas as pd @@ -240,252 +238,6 @@ def close_logger(logger=None, level=None, name=None, filename=None, log_dir=None logger.removeHandler(handler) -def load_umi_template_objects(filename): - """Reads - - Args: - filename (str): path of template file - - Returns: - dict: Dict of umi_objects - """ - with open(filename) as f: - umi_objects = json.load(f) - return umi_objects - - -def umi_template_object_to_dataframe(umi_dict, umi_object): - """Returns flattened DataFrame of umi_objects - - Args: - umi_dict (dict): dict of umi objects - umi_object (str): umi_object name - - Returns: - pandas.DataFrame: flattened DataFrame of umi_objects - """ - return json_normalize(umi_dict[umi_object]) - - -def get_list_of_common_umi_objects(filename): - """Returns list of common umi objects - - Args: - filename (str): path to umi template file - - Returns: - dict: Dict of common umi objects - """ - umi_objects = load_umi_template(filename) - components = OrderedDict() - for umi_dict in umi_objects: - for x in umi_dict: - components[x] = umi_dict[x].columns.tolist() - return components - - -def newrange(previous, following): - """Takes the previous DataFrame and calculates a new Index range. Returns a - DataFrame with a new index - - Args: - previous (pandas.DataFrame): previous DataFrame - following (pandas.DataFrame): follwoing DataFrame - - Returns: - pandas.DataFrame: DataFrame with an incremented new index - """ - if not previous.empty: - from_index = previous.iloc[[-1]].index.values + 1 - to_index = from_index + len(following) - - following.index = np.arange(from_index, to_index) - following.rename_axis("$id", inplace=True) - return following - else: - # If previous dataframe is empty, return the orginal DataFrame - return following - - -def type_surface(row): - """Takes a boundary and returns its corresponding umi-type - - Args: - row: - - Returns: - str: The umi-type of boundary - """ - - # Floors - if row["Surface_Type"] == "Floor": - if row["Outside_Boundary_Condition"] == "Surface": - return 3 - if row["Outside_Boundary_Condition"] == "Ground": - return 2 - if row["Outside_Boundary_Condition"] == "Outdoors": - return 4 - else: - return np.NaN - - # Roofs & Ceilings - if row["Surface_Type"] == "Roof": - return 1 - if row["Surface_Type"] == "Ceiling": - return 3 - # Walls - if row["Surface_Type"] == "Wall": - if row["Outside_Boundary_Condition"] == "Surface": - return 5 - if row["Outside_Boundary_Condition"] == "Outdoors": - return 0 - return np.NaN - - -def label_surface(row): - """Takes a boundary and returns its corresponding umi-Category - - Args: - row: - """ - # Floors - if row["Surface_Type"] == "Floor": - if row["Outside_Boundary_Condition"] == "Surface": - return "Interior Floor" - if row["Outside_Boundary_Condition"] == "Ground": - return "Ground Floor" - if row["Outside_Boundary_Condition"] == "Outdoors": - return "Exterior Floor" - else: - return "Other" - - # Roofs & Ceilings - if row["Surface_Type"] == "Roof": - return "Roof" - if row["Surface_Type"] == "Ceiling": - return "Interior Floor" - # Walls - if row["Surface_Type"] == "Wall": - if row["Outside_Boundary_Condition"] == "Surface": - return "Partition" - if row["Outside_Boundary_Condition"] == "Outdoors": - return "Facade" - return "Other" - - -def layer_composition(row): - """Takes in a series with $id and thickness values and return an array of - dict of the form {'Material': {'$ref': ref}, 'thickness': thickness} If - thickness is 'nan', it returns None. - - Returns (list): List of dicts - - Args: - row (pandas.Series): a row - """ - array = [] - ref = row["$id", "Outside_Layer"] - thickness = row["Thickness", "Outside_Layer"] - if np.isnan(ref): - pass - else: - array.append({"Material": {"$ref": str(int(ref))}, "Thickness": thickness}) - for i in range(2, len(row["$id"]) + 1): - ref = row["$id", "Layer_{}".format(i)] - if np.isnan(ref): - pass - else: - thickness = row["Thickness", "Layer_{}".format(i)] - array.append( - {"Material": {"$ref": str(int(ref))}, "Thickness": thickness} - ) - return array - - -def schedule_composition(row): - """Takes in a series with $id and *_ScheduleDay_Name values and return an - array of dict of the form {'$ref': ref} - - Args: - row (pandas.Series): a row - - Returns: - list: list of dicts - """ - # Assumes 7 days - day_schedules = [] - days = [ - "Monday_ScheduleDay_Name", - "Tuesday_ScheduleDay_Name", - "Wednesday_ScheduleDay_Name", - "Thursday_ScheduleDay_Name", - "Friday_ScheduleDay_Name", - "Saturday_ScheduleDay_Name", - "Sunday_ScheduleDay_Name", - ] # With weekends last (as defined in - # umi-template) - # Let's start with the `Outside_Layer` - for day in days: - try: - ref = row["$id", day] - except: - pass - else: - day_schedules.append({"$ref": str(int(ref))}) - return day_schedules - - -def year_composition(row): - """Takes in a series with $id and ScheduleWeek_Name_{} values and return an - array of dict of the form {'FromDay': fromday, 'FromMonth': frommonth, - 'Schedule': {'$ref': int( ref)}, 'ToDay': today, 'ToMonth': tomonth} - - Args: - row (pandas.Series): a row - - Returns: - list: list of dicts - """ - parts = [] - for i in range(1, 26 + 1): - try: - ref = row["$id", "ScheduleWeek_Name_{}".format(i)] - except: - pass - else: - if ~np.isnan(ref): - fromday = row["Schedules", "Start_Day_{}".format(i)] - frommonth = row["Schedules", "Start_Month_{}".format(i)] - today = row["Schedules", "End_Day_{}".format(i)] - tomonth = row["Schedules", "End_Month_{}".format(i)] - - parts.append( - { - "FromDay": fromday, - "FromMonth": frommonth, - "Schedule": {"$ref": str(int(ref))}, - "ToDay": today, - "ToMonth": tomonth, - } - ) - return parts - - -def date_transform(date_str): - """Simple function transforming one-based hours (1->24) into zero-based - hours (0->23) - - Args: - date_str (str): a date string of the form 'HH:MM' - - Returns: - datetime.datetime: datetime object - """ - if date_str[0:2] != "24": - return datetime.strptime(date_str, "%H:%M") - timedelta(hours=1) - return datetime.strptime("23:00", "%H:%M") - - def weighted_mean(series, df, weighting_variable): """Compute the weighted average while ignoring NaNs. Implements :func:`numpy.average`. @@ -632,87 +384,14 @@ def cd(path): log("finally inside {0}".format(os.getcwd())) -def rmse(data, targets): - """calculate rmse with target values - - # Todo : write de description of the args - Args: - data: - targets: - """ - y = piecewise(data) - predictions = y - error = np.sqrt(np.mean((predictions - targets) ** 2)) - return error - - -def piecewise(data): - """returns a piecewise function from an array of the form [hour1, hour2, - ..., value1, value2, ...] - - # Todo : write de description of the args - Args: - data: - """ - nb = int(len(data) / 2) - bins = data[0:nb] - sf = data[nb:] - x = np.linspace(0, 8760, 8760) - # build condition array - conds = [x < bins[0]] - conds.extend([np.logical_and(x >= i, x < j) for i, j in zip(bins[0:], bins[1:])]) - # build function array. This is the value of y when the condition is met. - funcs = sf - y = np.piecewise(x, conds, funcs) - return y - - -def checkStr(datafile, string, begin_line=0): - """Find the first occurrence of a string and return its line number - - Returns: the list index containing the string - - Args: - datafile (list-like): a list-like object - string (str): the string to find in the txt file - """ - value = [] - count = 0 - for line in datafile: - if count < begin_line: - count += 1 - continue - count += 1 - match = re.search(string, str(line)) - if match: - return count - break - - -def write_lines(file_path, lines): - """Delete file if exists, then write lines in it - - Args: - file_path (str): path of the file - lines (list of str): lines to be written in file - """ - # Delete temp file if exists - if os.path.exists(file_path): - os.remove(file_path) - # Save lines in temp file - temp_idf_file = open(file_path, "w+") - for line in lines: - temp_idf_file.write("%s" % line) - temp_idf_file.close() - - def load_umi_template(json_template): - """ + """Load umi template file to list of dict. + Args: - json_template: Absolute or relative filepath to an umi json_template + json_template (str): filepath to an umi json_template. Returns: - pandas.DataFrame: 17 DataFrames, one for each component groups + list: list of dict. """ if os.path.isfile(json_template): with open(json_template) as f: @@ -825,12 +504,7 @@ def timed(*args, **kwargs): def lcm(x, y): - """This function takes two integers and returns the L.C.M. - - Args: - x: - y: - """ + """This function takes two integers and returns the least common multiple.""" # choose the greater number if x > y: @@ -931,7 +605,7 @@ def parallel_process( Args: in_dict (dict): A dictionary to iterate over. `function` is applied to value and key is used as an identifier. - function (function): A python function to apply to the elements of + function (callable): A python function to apply to the elements of in_dict processors (int): The number of cores to use. use_kwargs (bool): If True, pass the kwargs as arguments to `function`. diff --git a/archetypal/zone_graph.py b/archetypal/zone_graph.py index aa2b8cea..e8405d2a 100644 --- a/archetypal/zone_graph.py +++ b/archetypal/zone_graph.py @@ -10,7 +10,7 @@ from tqdm import tqdm from archetypal.plot import save_and_show -from archetypal.template import is_core, resolve_obco +from archetypal.template.zonedefinition import is_core, resolve_obco from archetypal.utils import log @@ -578,4 +578,4 @@ def discrete_cmap(N, base_cmap=None): base = plt.cm.get_cmap(base_cmap) color_list = base(linspace(0, 1, N)) cmap_name = base.name + str(N) - return matplotlib.colors.ListedColormap(color_list, cmap_name, N) \ No newline at end of file + return matplotlib.colors.ListedColormap(color_list, cmap_name, N) diff --git a/docs/converter_umi.rst b/docs/converter_umi.rst index 31ef44a0..abd419ab 100644 --- a/docs/converter_umi.rst +++ b/docs/converter_umi.rst @@ -71,4 +71,4 @@ the AdultEducationCenter.idf model is used. >>> template_json = UmiTemplateLibrary( >>> name="my_umi_template", >>> BuildingTemplates=[template_obj] - >>> ).to_json() + >>> ).to_dict() diff --git a/docs/creating_umi_template.rst b/docs/creating_umi_template.rst index 33c45094..6d4a41a4 100644 --- a/docs/creating_umi_template.rst +++ b/docs/creating_umi_template.rst @@ -921,7 +921,7 @@ Creating Umi template .. code-block:: python - umi_template.to_json() + umi_template.to_dict() .. _OpaqueMaterial: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.OpaqueMaterial.html .. _GlazingMaterial: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.GlazingMaterial.html diff --git a/docs/package_modules.rst b/docs/package_modules.rst index 9177dfea..39d76bff 100644 --- a/docs/package_modules.rst +++ b/docs/package_modules.rst @@ -242,18 +242,9 @@ Utils config log - load_umi_template_objects - umi_template_object_to_dataframe - get_list_of_common_umi_objects - newrange - date_transform weighted_mean top copy_file - piecewise - rmse - checkStr - write_lines load_umi_template check_unique_name angle diff --git a/environment.yml b/environment.yml index 1d7ec2c1..1e8f8cc1 100644 --- a/environment.yml +++ b/environment.yml @@ -26,4 +26,5 @@ dependencies: - geomeppy - deprecation - sigfig + - validator_collection - -r file:requirements-dev.txt \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 7a1e7252..7f2ee9a3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,19 +1,24 @@ -networkx -geomeppy -eppy +networkx==2.5 +geomeppy==0.11.8 +eppy==0.5.56 matplotlib>=3.2 # because of TwoSlopesNorm -pycountry -scikit-learn +pycountry==20.7.3 +scikit-learn==0.24.1 pandas>=1.2.0 numpy>=1.17 -tqdm -tabulate -path -tsam -pint -click -outdated -deprecation -sigfig -energy-pandas==0.2.1 -setuptools_scm +tqdm==4.59.0 +tabulate==0.8.9 +path~=15.0.0 +click==7.1.2 +outdated~=0.2.0 +deprecation==2.1.0 +sigfig==1.1.8 +pybind11==2.6.2 +requests~=2.25.1 +packaging~=20.9 +pytest~=6.1.2 +setuptools~=49.6.0 +sklearn~=0.0 +CoolProp~=6.4.1 +energy-pandas==0.2.3 +validator_collection==1.5.0 \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index 3ff9e02c..804bc041 100644 --- a/setup.cfg +++ b/setup.cfg @@ -12,4 +12,5 @@ skip = __init__.py max-line-length = 88 extend-ignore = # See https://github.com/PyCQA/pycodestyle/issues/373 - E203, \ No newline at end of file + E203, + E501, # line too long (> 88 characters) \ No newline at end of file diff --git a/setup.py b/setup.py index a0be7a83..9e3cbfcb 100644 --- a/setup.py +++ b/setup.py @@ -50,15 +50,9 @@ def find_version(*file_paths): name="archetypal", use_scm_version=True, setup_requires=["setuptools_scm"], - packages=find_namespace_packages(include=["archetypal", "archetypal.*"], - exclude=["tests"]), - package_data={ - "archetypal": [ - "ressources/originBUISketchUp.idf", - "ressources/W74-lib.dat", - "ressources/NewFileTemplate.d18", - ] - }, + packages=find_namespace_packages( + include=["archetypal", "archetypal.*"], exclude=["tests"] + ), include_package_data=True, url="https://github.com/samuelduchesne/archetypal", license="MIT License", diff --git a/tests/input_data/materials.idf b/tests/input_data/materials.idf new file mode 100644 index 00000000..d0cfd80b --- /dev/null +++ b/tests/input_data/materials.idf @@ -0,0 +1,30 @@ +!- Darwin Line endings + +VERSION, + 9.2.0; !- Version Identifier + +MATERIAL, + A2 - 4 IN DENSE FACE BRICK, !- Name + Rough, !- Roughness + 0.1014984, !- Thickness + 1.245296, !- Conductivity + 2082.4, !- Density + 920.48, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.93, !- Solar Absorptance + 0.93; !- Visible Absorptance + +MATERIAL:NOMASS, + R13LAYER, !- Name + Rough, !- Roughness + 2.290965, !- Thermal Resistance + 0.9, !- Thermal Absorptance + 0.75, !- Solar Absorptance + 0.75; !- Visible Absorptance + +MATERIAL:INFRAREDTRANSPARENT, + IRTMaterial1; !- Name + +MATERIAL:AIRGAP, + B1 - AIRSPACE RESISTANCE, !- Name + 0.1603675; !- Thermal Resistance \ No newline at end of file diff --git a/tests/test_cli.py b/tests/test_cli.py index cdbe99ab..de2df2bc 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -4,15 +4,16 @@ from click.testing import CliRunner from path import Path -from archetypal import log, settings +from archetypal import settings from archetypal.cli import cli +from archetypal.utils import log class TestCli: """Defines tests for usage of the archetypal Command Line Interface""" def test_reduce(self): - """Tests the 'reduce' method""" + """Tests the 'reduced_model' method""" runner = CliRunner() base = Path("tests/input_data/umi_samples") outname = "tests/.temp/warehouse.json" diff --git a/tests/test_dataportals.py b/tests/test_dataportals.py index 61fafd64..6758c734 100644 --- a/tests/test_dataportals.py +++ b/tests/test_dataportals.py @@ -3,13 +3,9 @@ import pandas as pd import pytest -from archetypal import ( - IDF, - dataportal, - download_bld_window, - tabula_building_details_sheet, -) -from archetypal.template import WindowSetting +from archetypal import IDF, dataportal +from archetypal.dataportal import download_bld_window, tabula_building_details_sheet +from archetypal.template.window_setting import WindowSetting def test_tabula_available_country(config): diff --git a/tests/test_energypandas.py b/tests/test_energypandas.py index 55c3a0c1..0b795001 100644 --- a/tests/test_energypandas.py +++ b/tests/test_energypandas.py @@ -1,8 +1,9 @@ import pytest +from energy_pandas import EnergyDataFrame, EnergySeries from numpy.testing import assert_almost_equal from pandas import read_csv -from archetypal import IDF, EnergyDataFrame, EnergySeries, settings +from archetypal import IDF, settings @pytest.fixture(scope="module") diff --git a/tests/test_idfclass.py b/tests/test_idfclass.py index 3ea710c9..9c2a81c9 100644 --- a/tests/test_idfclass.py +++ b/tests/test_idfclass.py @@ -3,16 +3,14 @@ import pytest from path import Path -from archetypal import ( - IDF, +from archetypal import IDF, settings +from archetypal.eplus_interface import ( EnergyPlusProcessError, - EnergyPlusVersion, EnergyPlusVersionError, InvalidEnergyPlusVersion, - parallel_process, - settings, ) -from archetypal.eplus_interface.version import get_eplus_dirs +from archetypal.eplus_interface.version import EnergyPlusVersion, get_eplus_dirs +from archetypal.utils import parallel_process @pytest.fixture() @@ -228,6 +226,7 @@ def test_area(self, archetype, area, config): ) @pytest.fixture( + scope="class", params=[ None, get_eplus_dirs(settings.ep_version) @@ -279,9 +278,10 @@ def test_version_object(self, idf): """ assert next(iter(idf.idfobjects["VERSION"])) - def test_save(self, idf): + def test_save(self, idf, tmp_path): """Saving should overwrite the file content.""" - idf.save() + save_as = tmp_path / "idf_dup.idf" + idf_dup = idf.saveas(save_as) class TestIDFTransition: @@ -321,7 +321,6 @@ def test_retrieve_meters(self, config, shoebox_res): class TestThreads: - @pytest.mark.xfail def test_runslab(self, config, tmp_path): """Test the slab preprocessors. Makes a temp file so that permissions are ok.""" diff --git a/tests/test_schedules.py b/tests/test_schedules.py index 92be266a..a6389a6e 100644 --- a/tests/test_schedules.py +++ b/tests/test_schedules.py @@ -1,74 +1,93 @@ import numpy as np +import pandas as pd import pytest import archetypal.settings as settings from archetypal import IDF from archetypal.eplus_interface.version import get_eplus_dirs -from archetypal.schedule import Schedule +from archetypal.schedule import Schedule, ScheduleTypeLimits from archetypal.template.schedule import UmiSchedule, YearSchedule from archetypal.utils import config -@pytest.fixture() -def schedules_in_necb_specific(config): - idf = IDF( - "tests/input_data/necb/NECB 2011-MediumOffice-NECB HDD " - "Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" - ) - - s = Schedule( - Name="NECB-A-Thermostat Setpoint-Heating", idf=idf, start_day_of_the_week=0 - ) - yield s +class TestScheduleTypeLimits: + """Test ScheduleTypeLimits class.""" + def test_from_to_dict(self): + data = { + "Name": "Fractional", + "LowerLimit": 0, + "UpperLimit": 1, + "NumericType": None, + "UnitType": "Dimensionless", + } -@pytest.mark.xfail -def test_plot(schedules_in_necb_specific): - schedules_in_necb_specific.plot( - slice=("2018/01/02", "2018/01/03"), drawstyle="steps-post" - ) + type_limit = ScheduleTypeLimits.from_dict(data) + type_limit_dict = type_limit.to_dict() + type_limit_dup = ScheduleTypeLimits.from_dict(type_limit_dict) + assert type_limit.Name == type_limit_dup.Name == "Fractional" -def test_plot2d(schedules_in_necb_specific): - schedules_in_necb_specific.plot2d(show=False, save=False) + def test_from_epbunch(self): + idf = IDF() + epbunch = idf.anidfobject("SCHEDULETYPELIMITS", Name="Fractional") + type_limit = ScheduleTypeLimits.from_epbunch(epbunch) + assert type_limit -def test_make_umi_schedule(config): - """Tests only a single schedule name""" - idf = IDF("tests/input_data/schedules/schedules.idf") +class TestSchedule: + @pytest.fixture() + def schedules_in_necb_specific(self, config): + idf = IDF( + "tests/input_data/necb/NECB 2011-MediumOffice-NECB HDD " + "Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" + ) + epbunch = idf.schedules_dict["NECB-A-Thermostat Setpoint-Heating".upper()] + s = Schedule.from_epbunch(epbunch, start_day_of_the_week=0) + yield s - s = UmiSchedule(Name="CoolingCoilAvailSched", idf=idf, start_day_of_the_week=0) - new = s.develop() - assert hash(s) != hash(new) - assert id(s) != id(new) + def test_plot(self, schedules_in_necb_specific): + schedules_in_necb_specific.plot( + slice=("2018/01/02", "2018/01/03"), drawstyle="steps-post" + ) - assert isinstance(s, UmiSchedule) - assert isinstance(new, YearSchedule) - assert len(s.all_values) == len(new.all_values) - np.testing.assert_array_equal(new.all_values, s.all_values) + def test_plot2d(self, schedules_in_necb_specific): + schedules_in_necb_specific.plot2d(show=False, save=False) + def test_make_umi_schedule(self): + """Test only a single schedule name.""" -def test_constant_schedule(config): - const = Schedule.constant_schedule() - assert const.__class__.__name__ == "Schedule" + idf = IDF("tests/input_data/schedules/schedules.idf", prep_outputs=False) + ep_bunch = idf.schedules_dict["CoolingCoilAvailSched".upper()] + s = UmiSchedule.from_epbunch(ep_bunch, start_day_of_the_week=0) + new = s.develop() + assert hash(s) != hash(new) + assert id(s) != id(new) + assert isinstance(s, UmiSchedule) + assert isinstance(new, YearSchedule) + assert len(s.all_values) == len(new.all_values) + np.testing.assert_array_equal(new.all_values, s.all_values) -@pytest.fixture() -def mew_idf(config): - yield IDF(prep_outputs=False) + def test_constant_schedule(self): + const = Schedule.constant_schedule() + assert const.__class__.__name__ == "Schedule" + @pytest.fixture() + def new_idf(self, config): + yield IDF(prep_outputs=False) -def test_from_values(mew_idf): - import numpy as np + def test_from_values(self, new_idf): + import numpy as np - heating_sched = UmiSchedule.from_values( - Name="Zone_Heating_Schedule", - Values=np.ones(8760), - Type="Fraction", - idf=idf, - ) - assert len(heating_sched.all_values) == 8760 + heating_sched = UmiSchedule.from_values( + Name="Zone_Heating_Schedule", + Values=np.ones(8760), + Type="Fraction", + idf=idf, + ) + assert len(heating_sched.all_values) == 8760 idf_file = "tests/input_data/schedules/test_multizone_EP.idf" @@ -91,8 +110,9 @@ def schedules_idf(): idf = schedules_idf() -schedules = list(idf._get_all_schedules(yearly_only=True).keys()) -ids = [i.replace(" ", "_") for i in schedules] +schedules_dict = idf._get_all_schedules(yearly_only=True) +schedules = list(schedules_dict.values()) +ids = [i.replace(" ", "_") for i in schedules_dict.keys()] @pytest.fixture(scope="module") @@ -122,36 +142,24 @@ def schedule_parametrized(request, csv_out): """Create the test_data""" import pandas as pd - # read original schedule - idf = schedules_idf() - schName = request.param - orig = Schedule(Name=schName, idf=idf) - - print( - "{name}\tType:{type}\t[{len}]\tValues:{" - "values}".format( - name=orig.Name, - type=orig.schType, - values=orig.all_values, - len=len(orig.all_values), - ) - ) + ep_bunch = request.param + origin = Schedule.from_epbunch(ep_bunch) # create year:week:day version - new_eps = orig.to_year_week_day() - new = orig + new_eps = origin.to_year_week_day() + new = origin - index = orig.series.index + index = origin.series.index epv = pd.read_csv(csv_out) epv.columns = epv.columns.str.strip() - epv = epv.loc[:, schName.upper() + ":Schedule Value [](Hourly)"].values + epv = epv.loc[:, ep_bunch.Name.upper() + ":Schedule Value [](Hourly)"].values expected = pd.Series(epv, index=index) print("Year: {}".format(new_eps[0].Name)) print("Weeks: {}".format([obj.Name for obj in new_eps[1]])) print("Days: {}".format([obj.Name for obj in new_eps[2]])) - yield orig, new, expected + yield origin, new, expected def test_ep_versus_schedule(schedule_parametrized): @@ -181,10 +189,6 @@ def test_ep_versus_schedule(schedule_parametrized): # plt.show() # # endregion - print(orig.series[mask]) - assert ( - orig.all_values.round(3)[0 : 52 * 7 * 24] == expected.round(3)[0 : 52 * 7 * 24] - ).all() - assert ( - new.all_values.round(3)[0 : 52 * 7 * 24] == expected.round(3)[0 : 52 * 7 * 24] - ).all() + print(pd.DataFrame({"actual": orig.series[mask], "expected": expected[mask]})) + np.testing.assert_array_almost_equal(orig.all_values, expected, verbose=True) + np.testing.assert_array_almost_equal(new.all_values, expected, verbose=True) diff --git a/tests/test_template.py b/tests/test_template.py index 01c61978..da889946 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -1,27 +1,51 @@ +import itertools +from copy import copy + import numpy as np import pytest +from eppy.bunch_subclass import EpBunch from archetypal import IDF, settings from archetypal.eplus_interface.version import get_eplus_dirs -from archetypal.template import ( +from archetypal.simple_glazing import calc_simple_glazing +from archetypal.template.building_template import BuildingTemplate +from archetypal.template.conditioning import ZoneConditioning, EconomizerTypes +from archetypal.template.dhw import DomesticHotWaterSetting +from archetypal.template.load import DimmingTypes, ZoneLoad +from archetypal.template.materials.gas_layer import GasLayer +from archetypal.template.materials.gas_material import GasMaterial +from archetypal.template.materials.glazing_material import GlazingMaterial +from archetypal.template.materials.material_layer import MaterialLayer +from archetypal.template.materials.nomass_material import NoMassMaterial +from archetypal.template.materials.opaque_material import OpaqueMaterial +from archetypal.template.constructions.opaque_construction import OpaqueConstruction +from archetypal.template.constructions.base_construction import ( + ConstructionBase, + LayeredConstruction, +) +from archetypal.template.schedule import ( DaySchedule, - DimmingTypes, - GlazingMaterial, - MaterialLayer, - OpaqueConstruction, - OpaqueMaterial, + UmiSchedule, WeekSchedule, YearSchedule, - ZoneConstructionSet, - ZoneDefinition, - calc_simple_glazing, + YearSchedulePart, ) -from archetypal.template.umi_base import UniqueName, load_json_objects +from archetypal.template.structure import MassRatio, StructureInformation +from archetypal.template.umi_base import UniqueName +from archetypal.template.ventilation import VentilationSetting +from archetypal.template.constructions.window_construction import WindowConstruction +from archetypal.template.window_setting import WindowSetting +from archetypal.template.zone_construction_set import ZoneConstructionSet +from archetypal.template.zonedefinition import ZoneDefinition +from archetypal.template.constructions.internal_mass import InternalMass +from archetypal.utils import reduce @pytest.fixture(scope="class") -def small_idf(config, small_idf_obj): +def small_idf(small_idf_obj): """An IDF model""" + if small_idf_obj.sim_info is None: + idf.simulate() yield small_idf_obj @@ -44,8 +68,6 @@ def small_idf_obj(config): file = "tests/input_data/umi_samples/B_Off_0.idf" w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" idf = IDF(file, epw=w) - if idf.sim_info is None: - idf.simulate() yield idf @@ -138,42 +160,100 @@ class TestUmiBase: class TestMaterialLayer: """Series of tests for the :class:`MaterialLayer` class""" - # todo: Implement tests for MaterialLayer class - pass + @pytest.fixture() + def mat_a(self, idf): + yield OpaqueMaterial(Conductivity=0.1, SpecificHeat=4180, Name="mat_a", idf=idf) + + def test_init_material_layer(self, mat_a): + """Test constructor.""" + mat_layer = MaterialLayer(mat_a, 0.1) + + mat_layer_dup = mat_layer.duplicate() + + assert mat_layer.Material == mat_layer_dup.Material == mat_a + assert mat_layer.Thickness == mat_layer_dup.Thickness == 0.1 class TestConstructionBase: """Series of tests for the :class:`ConstructionBase` class""" - # todo: Implement tests for ConstructionBase class - pass + def test_init_construction_base(self): + """Test constructor.""" + construction_base = ConstructionBase("base", 0, 0, 0, 0, 0) + construction_base_dup = construction_base.duplicate() + + assert construction_base == construction_base_dup + assert ( + construction_base.AssemblyCarbon + == construction_base_dup.AssemblyCarbon + == 0 + ) + assert construction_base.id != construction_base_dup.id class TestLayeredConstruction: """Series of tests for the :class:`LayeredConstruction` class""" - # todo: Implement tests for LayeredConstruction class - pass + @pytest.fixture() + def mat_a(self): + yield OpaqueMaterial(Conductivity=0.1, SpecificHeat=4180, Name="mat_a") + + def test_init_layerd_construction(self, mat_a): + """Test constructor.""" + + layers = [MaterialLayer(mat_a, 0.1), MaterialLayer(mat_a, 0.1)] + + layered_construction = LayeredConstruction( + Layers=layers, Name="layered_construction" + ) + + layered_construction_dup = layered_construction.duplicate() + + assert layered_construction == layered_construction_dup class TestMassRatio: """Series of tests for the :class:`MassRatio` class""" - # todo: Implement tests for MassRatio class - pass + @pytest.fixture() + def structure_material(self): + yield OpaqueMaterial( + Name="Steel General", + Conductivity=45.3, + SpecificHeat=500, + SolarAbsorptance=0.4, + ThermalEmittance=0.9, + VisibleAbsorptance=0.4, + Roughness="Rough", + Cost=0, + Density=7830, + MoistureDiffusionResistance=50, + EmbodiedCarbon=1.37, + EmbodiedEnergy=20.1, + TransportCarbon=0.067, + TransportDistance=500, + TransportEnergy=0.94, + SubstitutionRatePattern=[1], + SubstitutionTimestep=100, + DataSource="BostonTemplateLibrary.json", + ) + def test_init_mass_ratio(self, structure_material): + """Test constructor.""" + from archetypal.template.structure import MassRatio -class TestInternalMass: - """Series of tests for the parsing of internal mass""" + mass_ratio = MassRatio(600, structure_material, 300) + mass_ratio_dup = mass_ratio.duplicate() - def test_with_thermalmassobject(self, small_idf): - """ - Args: - small_idf: - """ - idf = small_idf - intmass = OpaqueConstruction.generic_internalmass(idf) - assert intmass.to_json() + assert mass_ratio == mass_ratio_dup + assert mass_ratio is not mass_ratio_dup + assert mass_ratio.HighLoadRatio == mass_ratio_dup.HighLoadRatio == 600 + + def test_generic_mass_ratio(self): + from archetypal.template.structure import MassRatio + + mass_ratio = MassRatio.generic() + assert mass_ratio.Material.Name == "Steel General" class TestYearScheduleParts: @@ -186,30 +266,19 @@ class TestYearScheduleParts: class TestDaySchedule: """Series of tests for the :class:`DaySchedule` class""" - # todo: Implement tests for DaySchedule class + def test_init_day_schedule(self): + """Test constructor.""" + from archetypal.template.schedule import DaySchedule - def test_from_epbunch(self, small_idf): - """test the `from_epbunch` constructor + day_schedule = DaySchedule("day_1", [0] * 24) + day_schedule_dup = day_schedule.duplicate() - Args: - small_idf: - """ - from archetypal.template import DaySchedule + assert day_schedule.Name == day_schedule_dup.Name == "day_1" + assert (day_schedule.all_values == day_schedule_dup.all_values).all() - idf = small_idf - epbunch = idf.getobject("Schedule:Day:Hourly".upper(), "B_Off_D_Het_WD") - sched = DaySchedule.from_epbunch(epbunch) - assert len(sched.all_values) == 24.0 - assert repr(sched) - - def test_from_values(self, config, idf): - """test the `from_epbunch` constructor - - Args: - config: - idf: - """ - from archetypal.template import DaySchedule + def test_from_values(self): + """test the `from_values` constructor.""" + from archetypal.template.schedule import DaySchedule values = np.array(range(0, 24)) kwargs = { @@ -217,78 +286,79 @@ def test_from_values(self, config, idf): "Type": "Fraction", "Name": "hourlyAllOn", "Values": values, - "idf": idf, } sched = DaySchedule.from_values(**kwargs) assert len(sched.all_values) == 24.0 assert repr(sched) - def test_daySchedule_from_to_json(self, config, idf): - """ - Args: - config: - idf: - """ - import json + def test_daySchedule_from_to_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" + day_schedule = DaySchedule("A", [0] * 24, Type="Fraction") + day_dict = day_schedule.to_dict() + day_schedule_dup = DaySchedule.from_dict(day_dict) + assert day_schedule == day_schedule_dup - with open(filename, "r") as f: - datastore = json.load(f) - loaded_dict = load_json_objects(datastore, idf) - assert loaded_dict["DaySchedules"][0].to_json() + @pytest.fixture(scope="class") + def schedules_idf(self): + yield IDF("tests/input_data/schedules/schedules.idf") + @pytest.fixture() + def schedule_day_interval(self, schedules_idf): + yield schedules_idf.idfobjects["SCHEDULE:DAY:INTERVAL"] -class TestWeekSchedule: - """Series of tests for the :class:`WeekSchedule` class""" + @pytest.fixture() + def schedule_day_hourly(self, schedules_idf): + yield schedules_idf.idfobjects["SCHEDULE:DAY:HOURLY"] - # todo: Implement tests for WeekSchedule class + @pytest.fixture() + def schedule_day_list(self, schedules_idf): + yield schedules_idf.idfobjects["SCHEDULE:DAY:LIST"] - @pytest.fixture(scope="class") - def idf(self): - yield IDF(prep_outputs=False) + @pytest.fixture() + def all_schedule_days( + self, schedule_day_interval, schedule_day_hourly, schedule_day_list + ): + yield itertools.chain(schedule_day_list, schedule_day_hourly, schedule_day_list) - def test_weekSchedule_from_to_json(self, config, idf): - """ - Args: - config: - idf: - """ - import json + def test_from_epbunch(self, all_schedule_days): + """test the `from_epbunch` constructor.""" - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - with open(filename, "r") as f: - datastore = json.load(f) - loaded_dict = load_json_objects(datastore, idf) - assert ( - dict(loaded_dict["WeekSchedules"][0].to_json()) - == datastore["WeekSchedules"][0] - ) + for epbunch in all_schedule_days: + sched = DaySchedule.from_epbunch(epbunch) + sched_dup = sched.duplicate() + assert len(sched.all_values) == len(sched_dup.all_values) == 24 + assert repr(sched) - def test_weekSchedule(self, config, idf): - """Creates WeekSchedule from DaySchedule - Args: - config: - idf: - """ +class TestWeekSchedule: + """Series of tests for the :class:`WeekSchedule` class""" - # Creates 2 DaySchedules : 1 always ON and 1 always OFF - sch_d_on = DaySchedule.from_values( - Values=[1] * 24, - Category="Day", - Type="Fraction", - Name="AlwaysOn", - idf=idf, + @pytest.fixture() + def schedule_week_daily(self, schedules_idf): + yield schedules_idf.idfobjects["SCHEDULE:WEEK:DAILY"] + + @pytest.fixture() + def schedule_week_compact(self, schedules_idf): + yield schedules_idf.idfobjects["SCHEDULE:WEEK:COMPACT"] + + @pytest.fixture() + def sch_d_on(self): + """Creates 2 DaySchedules: 1 always ON.""" + yield DaySchedule.from_values( + Name="AlwaysOn", Values=[1] * 24, Type="Fraction", Category="Day" ) - sch_d_off = DaySchedule.from_values( - Values=[0] * 24, - Category="Day", - Type="Fraction", - Name="AlwaysOff", - idf=idf, + + @pytest.fixture() + def sch_d_off(self): + """Creates DaySchedules: 1 always OFF.""" + yield DaySchedule.from_values( + Name="AlwaysOff", Values=[0] * 24, Type="Fraction", Category="Day" ) + def test_init(self, sch_d_on, sch_d_off): + """Creates WeekSchedule from DaySchedule.""" + # List of 7 dict with id of DaySchedule, representing the 7 days of the week days = [sch_d_on, sch_d_off, sch_d_on, sch_d_off, sch_d_on, sch_d_off, sch_d_on] # Creates WeekSchedule from list of DaySchedule @@ -297,11 +367,26 @@ def test_weekSchedule(self, config, idf): Category="Week", Type="Fraction", Name="OnOff_1", - idf=idf, ) + @pytest.fixture(scope="class") + def schedules_idf(self): + yield IDF("tests/input_data/schedules/schedules.idf") + + def test_from_epbunch_daily(self, schedule_week_daily): + for epbunch in schedule_week_daily: + assert WeekSchedule.from_epbunch(epbunch) + + @pytest.mark.skip("Not yet implemented for Schedule:Week:Compact.") + def test_from_epbunch_compact(self, schedule_week_compact): + for epbunch in schedule_week_compact: + assert WeekSchedule.from_epbunch(epbunch) + + def test_from_dict(self, sch_d_on, sch_d_off): + days = [sch_d_on, sch_d_off] # Dict of a WeekSchedule (like it would be written in json file) dict_w_on = { + "$id": "1", "Category": "Week", "Days": [ {"$ref": sch_d_on.id}, @@ -316,57 +401,47 @@ def test_weekSchedule(self, config, idf): "Name": "OnOff_2", } # Creates WeekSchedule from dict (from json) - b = WeekSchedule.from_dict(**dict_w_on, idf=idf, allow_duplicates=True) - + a = WeekSchedule.from_dict( + dict_w_on, day_schedules={a.id: a for a in days}, allow_duplicates=True + ) + b = a.duplicate() # Makes sure WeekSchedules created with 2 methods have the same values # And different ids assert np.array_equal(a.all_values, b.all_values) assert a.id != b.id + def test_from_to_dict(self, sch_d_on, sch_d_off): + """Make dict with `to_dict` and load again with `from_dict`.""" + # List of 7 dict with id of DaySchedule, representing the 7 days of the week + days = [sch_d_on, sch_d_off, sch_d_on, sch_d_off, sch_d_on, sch_d_off, sch_d_on] + # Creates WeekSchedule from list of DaySchedule + a = WeekSchedule( + Days=days, + Category="Week", + Type="Fraction", + Name="OnOff_1", + ) -class TestYearSchedule: - """Series of tests for the :class:`YearSchedule` class""" - - # todo: Implement tests for YearSchedule class - - def test_yearSchedule_from_to_json(self, config, idf): - """ - Args: - config: - idf: - """ - import json - - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - with open(filename, "r") as f: - datastore = json.load(f) - loaded_dict = load_json_objects(datastore, idf) + week_schedule_dict = a.to_dict() - assert json.loads(json.dumps(loaded_dict["YearSchedules"][0].to_json())) == ( - datastore["YearSchedules"][0] + b = WeekSchedule.from_dict( + week_schedule_dict, day_schedules={a.id: a for a in days} ) + assert a == b + assert a is not b - def test_yearSchedule(self, config, idf): - """Creates YearSchedule from dict (json) - Args: - config: - idf: - """ +class TestYearSchedule: + """Series of tests for the :class:`YearSchedule` class""" + + def test_yearSchedule(self): + """Creates YearSchedule from a dictionary.""" # Creates 2 DaySchedules : 1 always ON and 1 always OFF sch_d_on = DaySchedule.from_values( - Values=[1] * 24, - Category="Day", - Type="Fraction", - Name="AlwaysOn", - idf=idf, + Name="AlwaysOn", Values=[1] * 24, Type="Fraction", Category="Day" ) sch_d_off = DaySchedule.from_values( - Values=[0] * 24, - Category="Day", - Type="Fraction", - Name="AlwaysOff", - idf=idf, + Name="AlwaysOff", Values=[0] * 24, Type="Fraction", Category="Day" ) # List of 7 dict with id of DaySchedule, representing the 7 days of the week @@ -377,11 +452,11 @@ def test_yearSchedule(self, config, idf): Category="Week", Type="Fraction", Name="OnOff", - idf=idf, ) # Dict of a YearSchedule (like it would be written in json file) dict_year = { + "$id": "1", "Category": "Year", "Parts": [ { @@ -396,10 +471,45 @@ def test_yearSchedule(self, config, idf): "Name": "OnOff", } # Creates YearSchedule from dict (from json) - a = YearSchedule.from_dict(**dict_year, idf=idf, allow_duplicates=True) + a = YearSchedule.from_dict( + dict_year, + week_schedules={a.id: a for a in [sch_w_on_off]}, + allow_duplicates=True, + ) # Makes sure YearSchedule has the same values as concatenate WeekSchedule - np.testing.assert_equal(a.all_values, np.resize(sch_w_on_off.all_values, 8760)) + assert a.all_values == pytest.approx(np.resize(sch_w_on_off.all_values, 8760)) + + def test_year_schedule_from_to_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" + sch_d_on = DaySchedule.from_values( + Name="AlwaysOn", Values=[1] * 24, Type="Fraction", Category="Day" + ) + sch_d_off = DaySchedule.from_values( + Name="AlwaysOff", Values=[0] * 24, Type="Fraction", Category="Day" + ) + + # List of 7 dict with id of DaySchedule, representing the 7 days of the week + days = [sch_d_on, sch_d_off, sch_d_on, sch_d_off, sch_d_on, sch_d_off, sch_d_on] + # Creates WeekSchedule from list of DaySchedule + sch_w_on_off = WeekSchedule( + Days=days, + Category="Week", + Type="Fraction", + Name="OnOff", + ) + + parts = [YearSchedulePart(1, 1, 31, 12, sch_w_on_off)] + + sch_year = YearSchedule(Name="OnOff", Parts=parts) + + sch_dict = sch_year.to_dict() + + sch_year_dup = YearSchedule.from_dict( + sch_dict, week_schedules={a.id: a for a in [sch_w_on_off]} + ) + + assert sch_year == sch_year_dup class TestWindowType: @@ -414,94 +524,88 @@ class TestOpaqueMaterial: """Series of tests for the :class:`OpaqueMaterial` class""" @pytest.fixture() - def mat_a(self, idf): - """ - Args: - idf: - """ - yield OpaqueMaterial(Conductivity=0.1, SpecificHeat=4.18, Name="mat_a", idf=idf) + def mat_a(self): + yield OpaqueMaterial(Conductivity=0.1, SpecificHeat=4180, Name="mat_a") @pytest.fixture() - def mat_b(self, idf): - """ - Args: - idf: - """ - yield OpaqueMaterial(Conductivity=0.2, SpecificHeat=4.18, Name="mat_b", idf=idf) + def mat_b(self): + yield OpaqueMaterial(Conductivity=0.2, SpecificHeat=4180, Name="mat_b") - def test_add_materials(self, mat_a, mat_b): - """test __add__() for OpaqueMaterial + @pytest.fixture() + def idf(self): + file = "tests/input_data/umi_samples/B_Off_0.idf" + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + yield IDF(file, epw=w) - Args: - mat_a: - mat_b: - """ + def test_add_materials(self, mat_a, mat_b): + """Test __add__().""" mat_c = mat_a + mat_b assert mat_c - np.testing.assert_almost_equal(mat_c.Conductivity, 0.150) + assert mat_c.Conductivity == pytest.approx(0.150) assert mat_a.id != mat_b.id != mat_c.id mat_d = mat_c + mat_a - print(mat_c) - print(mat_d) + assert mat_d != mat_a != mat_c - def test_iadd_materials(self, idf): - """test __iadd__() for OpaqueMaterial - - Args: - idf: - """ - mat_a = OpaqueMaterial( - Conductivity=0.1, SpecificHeat=4.18, Name="mat_ia", idf=idf - ) + def test_iadd_materials(self): + """test __iadd__().""" + mat_a = OpaqueMaterial(Conductivity=0.1, SpecificHeat=4180, Name="mat_ia") id_ = mat_a.id # storing mat_a's id. - mat_b = OpaqueMaterial( - Conductivity=0.2, SpecificHeat=4.18, Name="mat_ib", idf=idf - ) + mat_b = OpaqueMaterial(Conductivity=0.2, SpecificHeat=4180, Name="mat_ib") mat_a += mat_b assert mat_a - np.testing.assert_almost_equal(mat_a.Conductivity, 0.150) + assert mat_a.Conductivity == pytest.approx(0.150) assert mat_a.id == id_ # id should not change assert mat_a.id != mat_b.id - def test_opaqueMaterial_from_to_json(self, config, small_idf_obj): + def test_from_to_dict(self): """Get OpaqueMaterial, convert to json, load back and compare.""" - from archetypal.template import OpaqueMaterial - - idf = small_idf_obj - if idf.idfobjects["MATERIAL"]: - opaqMat_epBunch = OpaqueMaterial.from_epbunch(idf.idfobjects["MATERIAL"][0]) - opaqMat_json = opaqMat_epBunch.to_json() - assert OpaqueMaterial(**opaqMat_json) == opaqMat_epBunch - if idf.idfobjects["MATERIAL:NOMASS"]: - opaqMat_epBunch = OpaqueMaterial.from_epbunch( - idf.idfobjects["MATERIAL:NOMASS"][0] - ) - opaqMat_json = opaqMat_epBunch.to_json() - assert OpaqueMaterial(**opaqMat_json) == opaqMat_epBunch - if idf.idfobjects["MATERIAL:AIRGAP"]: - opaqMat_epBunch = OpaqueMaterial.from_epbunch( - idf.idfobjects["MATERIAL:AIRGAP"][0] - ) - opaqMat_json = opaqMat_epBunch.to_json() - assert OpaqueMaterial(**opaqMat_json) == opaqMat_epBunch - - def test_hash_eq_opaq_mat(self, small_idf_obj, other_idf_object): - """Test equality and hashing of :class:`TestOpaqueMaterial` - - Args: - small_idf_obj: - other_idf_object: - """ - from copy import copy - - from archetypal.template import OpaqueMaterial - - idf = small_idf_obj - opaq_mat = idf.getobject("MATERIAL", "B_Gypsum_Plaster_0.02_B_Off_Thm_0") - om = OpaqueMaterial.from_epbunch(opaq_mat) - om_2 = copy(om) + data = { + "$id": "10", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.6, + "SpecificHeat": 1200.0, + "ThermalEmittance": 0.85, + "VisibleAbsorptance": 0.6, + "Conductivity": 0.14, + "Cost": 0.0, + "Density": 650.0, + "EmbodiedCarbon": 0.45, + "EmbodiedEnergy": 7.4, + "SubstitutionRatePattern": [0.5, 1.0], + "SubstitutionTimestep": 20.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": None, + "DataSource": "default", + "Name": "B_Wood_Floor", + } + opaque_mat = OpaqueMaterial.from_dict(data) + opaque_mat_data = opaque_mat.to_dict() + opaque_mat_dup = OpaqueMaterial.from_dict(opaque_mat_data) + assert opaque_mat == opaque_mat_dup + + def test_hash_eq_opaq_mat(self): + """Test equality and hashing of :class:`TestOpaqueMaterial`.""" + + data = { + "$id": "MATERIAL 1", + "Name": "A2 - 4 IN DENSE FACE BRICK", + "Roughness": "Rough", + "Thickness": 0.1014984, + "Conductivity": 1.245296, + "Density": 2082.4, + "SpecificHeat": 920.48, + "ThermalEmittance": 0.9, + "SolarAbsorptance": 0.93, + "VisibleAbsorptance": 0.93, + } + om = OpaqueMaterial.from_dict(data) + om_2 = om.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object @@ -544,27 +648,133 @@ def test_hash_eq_opaq_mat(self, small_idf_obj, other_idf_object): # 2 OpaqueMaterial from different idf should have the same hash if they # have different names, not be the same object, yet be equal if they have the # same characteristics (Thickness, Roughness, etc.) - idf_2 = other_idf_object - assert idf is not idf_2 - opaq_mat_3 = idf_2.getobject("MATERIAL", "B_Gypsum_Plaster_0.02_B_Res_Thm_0") - assert opaq_mat is not opaq_mat_3 - assert opaq_mat != opaq_mat_3 - om_3 = OpaqueMaterial.from_epbunch(opaq_mat_3, allow_duplicates=True) - assert hash(om) != hash(om_3) + om_3 = om.duplicate() + om_3.DataSource = "Other IDF" + assert hash(om) == hash(om_3) assert id(om) != id(om_3) assert om is not om_3 assert om == om_3 + def test_material_new(self): + gypsum = OpaqueMaterial( + Name="GP01 GYPSUM", + Conductivity=0.16, + SpecificHeat=1090, + Density=800, + Roughness="Smooth", + SolarAbsorptance=0.7, + ThermalEmittance=0.9, + VisibleAbsorptance=0.5, + DataSource="ASHRAE 90.1-2007", + MoistureDiffusionResistance=8.3, + ) + gypsum_duplicate = gypsum.duplicate() + + assert gypsum.Name == gypsum_duplicate.Name == "GP01 GYPSUM" + assert gypsum.Conductivity == gypsum_duplicate.Conductivity == 0.16 + assert gypsum.SpecificHeat == gypsum_duplicate.SpecificHeat == 1090 + assert gypsum.Density == gypsum_duplicate.Density == 800 + assert gypsum.Roughness == gypsum_duplicate.Roughness == "Smooth" + assert gypsum.SolarAbsorptance == gypsum_duplicate.SolarAbsorptance == 0.7 + assert gypsum.ThermalEmittance == gypsum_duplicate.ThermalEmittance == 0.9 + assert gypsum.VisibleAbsorptance == gypsum_duplicate.VisibleAbsorptance == 0.5 + assert ( + gypsum.MoistureDiffusionResistance + == gypsum_duplicate.MoistureDiffusionResistance + == 8.3 + ) + + @pytest.fixture() + def materials_idf(self): + """An IDF object with different material definitions.""" + file = "tests/input_data/materials.idf" + yield IDF(file, prep_outputs=False) + + def test_from_epbunch(self, materials_idf): + + for epbunch in itertools.chain( + materials_idf.idfobjects["MATERIAL"], + materials_idf.idfobjects["MATERIAL:NOMASS"], + materials_idf.idfobjects["MATERIAL:AIRGAP"], + ): + opaqMat_epBunch = OpaqueMaterial.from_epbunch(epbunch) + opaqMat_json = opaqMat_epBunch.to_dict() + assert OpaqueMaterial.from_dict(opaqMat_json) == opaqMat_epBunch + + +class TestNoMassMaterial: + """NoMassMaterial tests.""" + + def test_init_nomass_material(self): + no_mass = NoMassMaterial( + Name="R13LAYER", + RValue=2.290965, + ThermalEmittance=0.9, + SolarAbsorptance=0.75, + VisibleAbsorptance=0.75, + ) + no_mass_dup = no_mass.duplicate() + + assert no_mass == no_mass_dup + + def test_from_dict_to_dict(self): + + data = { + "$id": "140532076832464", + "Name": "R13LAYER", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.75, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.75, + "RValue": 2.29, + "Cost": 0.0, + "EmbodiedCarbon": 0.0, + "EmbodiedEnergy": 0.0, + "SubstitutionRatePattern": [1.0], + "SubstitutionTimestep": 100.0, + "TransportCarbon": 0.0, + "TransportDistance": 0.0, + "TransportEnergy": 0.0, + "Category": "Uncategorized", + "Comments": None, + "DataSource": None, + } + no_mass = NoMassMaterial.from_dict(data) + to_data = dict(no_mass.to_dict()) + to_data.pop("$id") + assert to_data == data + + def test_to_epbunch(self, idf): + """Test to_epbunch.""" + no_mass = NoMassMaterial( + Name="R13LAYER", + RValue=2.290965, + ThermalEmittance=0.9, + SolarAbsorptance=0.75, + VisibleAbsorptance=0.75, + ) + epbunch = no_mass.to_epbunch(idf) + assert idf.getobject("MATERIAL:NOMASS", epbunch.Name) + + def test_add(self): + no_mass = NoMassMaterial( + Name="R13LAYER", + RValue=2.290965, + ThermalEmittance=0.9, + SolarAbsorptance=0.75, + VisibleAbsorptance=0.75, + ) + no_mass_dup = no_mass.duplicate() + + no_mass_addition = no_mass + no_mass_dup + assert no_mass_addition + class TestGlazingMaterial: """Series of tests for the :class:`GlazingMaterial` class""" - def test_simple_glazing_material(self, config): - """ - Args: - config: - idf: - """ + def test_simple_glazing_material(self): name = "A Glass Material" glass = GlazingMaterial( Name=name, @@ -574,21 +784,16 @@ def test_simple_glazing_material(self, config): SolarReflectanceFront=0.5, SolarReflectanceBack=0.5, VisibleTransmittance=0.7, - VisibleReflectanceFront=0.5, - VisibleReflectanceBack=0.5, + VisibleReflectanceFront=0.3, + VisibleReflectanceBack=0.3, IRTransmittance=0.7, IREmissivityFront=0.5, IREmissivityBack=0.5, ) assert glass.Name == name - def test_add_glazing_material(self, config): - """test __add__() for OpaqueMaterial - - Args: - config: - idf: - """ + def test_add_glazing_material(self): + """test __add__() for OpaqueMaterial.""" sg_a = calc_simple_glazing(0.763, 2.716, 0.812) sg_b = calc_simple_glazing(0.578, 2.413, 0.706) mat_a = GlazingMaterial(Name="mat_a", **sg_a) @@ -599,13 +804,8 @@ def test_add_glazing_material(self, config): assert mat_c assert mat_a.id != mat_b.id != mat_c.id - def test_iadd_glazing_material(self, config): - """test __iadd__() for OpaqueMaterial - - Args: - config: - idf: - """ + def test_iadd_glazing_material(self): + """test __iadd__() for OpaqueMaterial.""" sg_a = calc_simple_glazing(0.763, 2.716, 0.812) sg_b = calc_simple_glazing(0.578, 2.413, 0.706) mat_a = GlazingMaterial(Name="mat_ia", **sg_a) @@ -619,15 +819,10 @@ def test_iadd_glazing_material(self, config): assert mat_a.id == id_ # id should not change assert mat_a.id != mat_b.id - # todo: Implement from_to_json test for GlazingMaterial class - - def test_hash_eq_glaz_mat(self, config): - """Test equality and hashing of :class:`OpaqueConstruction` + # todo: Implement from_to_dict test for GlazingMaterial class - Args: - config: - idf: - """ + def test_hash_eq_glaz_mat(self): + """Test equality and hashing of :class:`OpaqueConstruction`.""" from copy import copy sg_a = calc_simple_glazing(0.763, 2.716, 0.812) @@ -686,59 +881,41 @@ def test_hash_eq_glaz_mat(self, config): class TestGasMaterial: """Series of tests for the GasMaterial class""" - def test_gas_material(self, config): - """ - Args: - config: - idf: - """ - from archetypal.template import GasMaterial + def test_gas_material(self): + from archetypal.template.materials.gas_material import GasMaterial air = GasMaterial(Name="Air", Conductivity=0.02, Density=1.24) assert air.Conductivity == 0.02 + assert air.Density == 1.24 - def test_GasMaterial_from_to_json(self, config, idf): - """ - Args: - config: - idf: - """ - import json + def test_gas_material_from_to_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" + from archetypal.template.materials.gas_material import GasMaterial - from archetypal.template import GasMaterial + air = GasMaterial(Name="Air", Conductivity=0.02, Density=1.24) - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - with open(filename, "r") as f: - datastore = json.load(f) - gasMat_json = [ - GasMaterial.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["GasMaterials"] - ] - gasMat_to_json = gasMat_json[0].to_json() - assert gasMat_json[0].Name == gasMat_to_json["Name"] + air_dict = air.to_dict() - def test_hash_eq_gas_mat(self, config, idf): - """Test equality and hashing of :class:`OpaqueConstruction` + air_dup = GasMaterial.from_dict(air_dict) - Args: - config: - idf: - """ + assert air == air_dup + + def test_hash_eq_gas_mat(self): + """Test equality and hashing of :class:`OpaqueConstruction`.""" import json - from copy import copy - from archetypal.template import GasMaterial + from archetypal.template.materials.gas_material import GasMaterial filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" with open(filename, "r") as f: datastore = json.load(f) gasMat_json = [ - GasMaterial.from_dict(**store, idf=idf, allow_duplicates=True) + GasMaterial.from_dict(store, allow_duplicates=True) for store in datastore["GasMaterials"] ] gm = gasMat_json[0] - gm_2 = copy(gm) + gm_2 = gm.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object @@ -781,7 +958,7 @@ def test_hash_eq_gas_mat(self, config, idf): # 2 GasMaterial from same json should not have the same hash if they # have different names, not be the same object, yet be equal if they have the # same layers (Material and Thickness) - gm_3 = copy(gm) + gm_3 = gm.duplicate() gm_3.Name = "other name" assert hash(gm) != hash(gm_3) assert id(gm) != id(gm_3) @@ -790,142 +967,97 @@ def test_hash_eq_gas_mat(self, config, idf): class TestOpaqueConstruction: - """Series of tests for the :class:`OpaqueConstruction` class""" + """Series of tests for the :class:`OpaqueConstruction` class.""" @pytest.fixture() - def mat_a(self, idf): - """A :class:Material fixture - - Args: - idf: - """ + def mat_a(self): + """A :class:Material fixture.""" mat_a = OpaqueMaterial( - Conductivity=1.4, SpecificHeat=840, Density=2240, Name="Concrete", idf=idf + Conductivity=1.4, SpecificHeat=840, Density=2240, Name="Concrete" ) yield mat_a @pytest.fixture() - def mat_b(self, idf): - """A :class:Material fixture - - Args: - idf: - """ + def mat_b(self): + """A :class:Material fixture.""" mat_b = OpaqueMaterial( - Conductivity=0.12, SpecificHeat=1210, Density=540, Name="Plywood", idf=idf + Conductivity=0.12, SpecificHeat=1210, Density=540, Name="Plywood" ) yield mat_b @pytest.fixture() - def construction_a(self, mat_a, mat_b, idf): - """A :class:Construction fixture - - Args: - mat_a: - mat_b: - idf: - """ + def construction_a(self, mat_a, mat_b): + """A :class:Construction fixture.""" thickness = 0.10 layers = [ MaterialLayer(mat_a, thickness), MaterialLayer(mat_b, thickness), ] - oc_a = OpaqueConstruction(Layers=layers, Name="oc_a", idf=idf) + oc_a = OpaqueConstruction(Layers=layers, Name="oc_a") yield oc_a @pytest.fixture() - def face_brick(self, idf): - """A :class:Material fixture - - Args: - idf: - """ + def face_brick(self): + """A :class:Material fixture.""" face_brick = OpaqueMaterial( Conductivity=1.20, Density=1900, SpecificHeat=850, Name="Face Brick", - idf=idf, ) yield face_brick @pytest.fixture() - def thermal_insulation(self, idf): - """A :class:Material fixture - - Args: - idf: - """ + def thermal_insulation(self): + """A :class:Material fixture.""" thermal_insulation = OpaqueMaterial( Conductivity=0.041, Density=40, SpecificHeat=850, Name="Thermal insulation", - idf=idf, ) yield thermal_insulation @pytest.fixture() - def hollow_concrete_block(self, idf): - """A :class:Material fixture - - Args: - idf: - """ + def hollow_concrete_block(self): + """A :class:Material fixture.""" hollow_concrete_block = OpaqueMaterial( Conductivity=0.85, Density=2000, SpecificHeat=920, Name="Hollow concrete block", - idf=idf, ) yield hollow_concrete_block @pytest.fixture() - def plaster(self, idf): - """A :class:Material fixture - - Args: - idf: - """ + def plaster(self): + """A :class:Material fixture.""" plaster = OpaqueMaterial( - Conductivity=1.39, Density=2000, SpecificHeat=1085, Name="Plaster", idf=idf + Conductivity=1.39, Density=2000, SpecificHeat=1085, Name="Plaster" ) yield plaster @pytest.fixture() - def concrete_layer(self, idf): - """A :class:Material fixture - - Args: - idf: - """ + def concrete_layer(self): + """A :class:Material fixture.""" concrete = OpaqueMaterial( Conductivity=1.70, Density=2300, SpecificHeat=920, Name="Concrete layer", - idf=idf, ) yield concrete @pytest.fixture() def facebrick_and_concrete( - self, face_brick, thermal_insulation, hollow_concrete_block, plaster, idf + self, face_brick, thermal_insulation, hollow_concrete_block, plaster ): """A :class:Construction based on the `Facebrick–concrete wall` from: On the thermal time constant of structural walls. Applied Thermal Engineering, 24(5–6), 743–757. https://doi.org/10.1016/j.applthermaleng.2003.10.015 - - Args: - face_brick: - thermal_insulation: - hollow_concrete_block: - plaster: - idf: """ layers = [ MaterialLayer(face_brick, 0.1), @@ -933,27 +1065,18 @@ def facebrick_and_concrete( MaterialLayer(hollow_concrete_block, 0.2), MaterialLayer(plaster, 0.02), ] - oc_a = OpaqueConstruction( - Layers=layers, Name="Facebrick–concrete wall", idf=idf - ) + oc_a = OpaqueConstruction(Layers=layers, Name="Facebrick–concrete wall") yield oc_a @pytest.fixture() def insulated_concrete_wall( - self, face_brick, thermal_insulation, concrete_layer, plaster, idf + self, face_brick, thermal_insulation, concrete_layer, plaster ): """A :class:Construction based on the `Facebrick–concrete wall` from: On the thermal time constant of structural walls. Applied Thermal Engineering, 24(5–6), 743–757. https://doi.org/10.1016/j.applthermaleng.2003.10.015 - - Args: - face_brick: - thermal_insulation: - concrete_layer: - plaster: - idf: """ layers = [ MaterialLayer(plaster, 0.02), @@ -961,23 +1084,16 @@ def insulated_concrete_wall( MaterialLayer(thermal_insulation, 0.04), MaterialLayer(plaster, 0.02), ] - oc_a = OpaqueConstruction( - Layers=layers, Name="Insulated Concrete Wall", idf=idf - ) + oc_a = OpaqueConstruction(Layers=layers, Name="Insulated Concrete Wall") yield oc_a @pytest.fixture() - def construction_b(self, mat_a, idf): - """A :class:Construction fixture - - Args: - mat_a: - idf: - """ + def construction_b(self, mat_a): + """A :class:Construction fixture.""" thickness = 0.30 layers = [MaterialLayer(mat_a, thickness)] - oc_b = OpaqueConstruction(Layers=layers, Name="oc_b", idf=idf) + oc_b = OpaqueConstruction(Layers=layers, Name="oc_b") yield oc_b @@ -991,7 +1107,7 @@ def test_change_r_value(self, facebrick_and_concrete): after_thickness = facebrick_and_concrete.total_thickness - np.testing.assert_almost_equal(facebrick_and_concrete.r_value, new_r_value) + assert facebrick_and_concrete.r_value == pytest.approx(new_r_value) assert before_thickness < after_thickness def test_change_r_value_one_layer_construction(self, construction_b): @@ -1008,34 +1124,22 @@ def test_change_r_value_one_layer_construction(self, construction_b): assert after_thickness == 2 * before_thickness def test_change_r_value_not_physical(self, facebrick_and_concrete): - """Test setting r_value on a construction that results in unrealistic - assembly. - """ + """Test r_value that results in unrealistic assembly.""" with pytest.raises(ValueError): facebrick_and_concrete.r_value = 0.1 def test_thermal_properties(self, construction_a): - """test r_value and u_value properties - - Args: - construction_a: - """ + """test r_value and u_value properties.""" assert 1 / construction_a.r_value == construction_a.u_value def test_add_opaque_construction(self, construction_a, construction_b): - """Test __add__() for OpaqueConstruction - - Args: - construction_a: - construction_b: - """ + """Test __add__() for OpaqueConstruction.""" oc_c = OpaqueConstruction.combine( construction_a, construction_b, method="constant_ufactor" ) assert oc_c desired = 3.237 - actual = oc_c.u_value - np.testing.assert_almost_equal(actual, desired, decimal=3) + assert oc_c.u_value == pytest.approx(desired, 1e-3) def test_iadd_opaque_construction(self, construction_a, construction_b): """Test __iadd__() for OpaqueConstruction @@ -1051,64 +1155,38 @@ def test_iadd_opaque_construction(self, construction_a, construction_b): assert construction_a.id == id_ # id should not change assert construction_a.id != construction_b.id - def test_opaqueConstruction_from_to_json(self, config, idf): - """ - Args: - config: - idf: - """ - import json - - from archetypal.template import ( - MaterialLayer, - OpaqueConstruction, - OpaqueMaterial, - ) + def test_opaqueConstruction_from_to_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - mat_a = OpaqueMaterial( - Conductivity=100, SpecificHeat=4.18, Name="mat_a", idf=idf - ) - mat_b = OpaqueMaterial( - Conductivity=0.2, SpecificHeat=4.18, Name="mat_b", idf=idf - ) + mat_a = OpaqueMaterial(Conductivity=100, SpecificHeat=4180, Name="mat_a") + mat_b = OpaqueMaterial(Conductivity=0.2, SpecificHeat=4180, Name="mat_b") thickness = 0.10 layers = [MaterialLayer(mat_a, thickness), MaterialLayer(mat_b, thickness)] - with open(filename, "r") as f: - datastore = json.load(f) - load_json_objects(datastore, idf) - opaqConstr_json = [ - OpaqueConstruction.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["OpaqueConstructions"] - ] - assert opaqConstr_json[0].to_json() - - def test_hash_eq_opaq_constr(self, small_idf, other_idf): - """Test equality and hashing of :class:`OpaqueConstruction` + construction = OpaqueConstruction(Name="Construction", Layers=layers) + construction_dict = construction.to_dict() - Args: - small_idf: - other_idf: - """ - from copy import copy + construction_from_dict = OpaqueConstruction.from_dict( + construction_dict, + materials={mat_a.id: mat_a, mat_b.id: mat_b}, + allow_duplicates=True, + ) + assert construction == construction_from_dict - from archetypal.template import OpaqueConstruction + def test_hash_eq_opaq_constr(self, construction_a, construction_b): + """Test equality and hashing of :class:`OpaqueConstruction`""" - idf = small_idf - opaq_constr = idf.getobject("CONSTRUCTION", "B_Off_Thm_0") - oc = OpaqueConstruction.from_epbunch(opaq_constr) - oc_2 = copy(oc) + oc_2 = construction_a.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object - assert oc == oc_2 - assert hash(oc) == hash(oc_2) - assert oc is not oc_2 + assert construction_a == oc_2 + assert hash(construction_a) == hash(oc_2) + assert construction_a is not oc_2 # hash is used to find object in lookup table - oc_list = [oc] - assert oc in oc_list + oc_list = [construction_a] + assert construction_a in oc_list assert oc_2 in oc_list # This is weird but expected oc_list.append(oc_2) @@ -1119,21 +1197,17 @@ def test_hash_eq_opaq_constr(self, small_idf, other_idf): assert len(set(oc_list)) == 1 # dict behavior - oc_dict = {oc: "this_idf", oc_2: "same_idf"} + oc_dict = {construction_a: "this_idf", oc_2: "same_idf"} assert len(oc_dict) == 1 oc_2.Name = "some other name" # even if name changes, they should be equal - assert oc_2 == oc + assert oc_2 == construction_a - oc_dict = {oc: "this_idf", oc_2: "same_idf"} - assert oc in oc_dict + oc_dict = {construction_a: "this_idf", oc_2: "same_idf"} + assert construction_a in oc_dict assert len(oc_dict) == 2 - # if an attribute changed, equality is lost - oc_2.Layers = None - assert oc != oc_2 - # length of set() should be 2 since both objects are not equal anymore and # don't have the same hash. assert len(set(oc_list)) == 2 @@ -1141,16 +1215,9 @@ def test_hash_eq_opaq_constr(self, small_idf, other_idf): # 2 OpaqueConstruction from different idf should not have the same hash if they # have different names, not be the same object, yet be equal if they have the # same layers (Material and Thickness) - idf_2 = other_idf - assert idf is not idf_2 - opaq_constr_3 = idf_2.getobject("CONSTRUCTION", "B_Res_Thm_0") - assert opaq_constr is not opaq_constr_3 - assert opaq_constr != opaq_constr_3 - oc_3 = OpaqueConstruction.from_epbunch(opaq_constr_3, allow_duplicates=True) - assert hash(oc) != hash(oc_3) - assert id(oc) != id(oc_3) - assert oc is not oc_3 - assert oc == oc_3 + assert construction_a is not construction_b + assert construction_a != construction_b + assert hash(construction_a) != hash(construction_b) def test_real_word_construction( self, facebrick_and_concrete, insulated_concrete_wall @@ -1186,90 +1253,400 @@ def test_real_word_construction( combined_2xmat = facebrick_and_concrete + insulated_concrete_wall assert combined_mat.specific_heat > combined_2xmat.specific_heat + def test_generic(self): + """Test generic constructors.""" + generic = OpaqueConstruction.generic() + generic_dup = generic.duplicate() + + assert generic == generic_dup + assert generic is not generic_dup + + generic_internalmass = OpaqueConstruction.generic_internalmass() + generic_internalmass_dup = generic_internalmass.duplicate() + + assert generic_internalmass == generic_internalmass_dup + assert generic_internalmass is not generic_internalmass_dup + + def test_from_epbunch(self, small_idf_obj): + """Test OpaqueConstruction.from_epbunch().""" + + internal_mass = small_idf_obj.idfobjects["INTERNALMASS"][0] + oc_im = OpaqueConstruction.from_epbunch(internal_mass) + + assert oc_im.Name == "PerimInternalMass" + + surface = small_idf_obj.idfobjects["CONSTRUCTION"][0] + oc_surface = OpaqueConstruction.from_epbunch(surface) + + assert oc_surface.Name == "B_Off_Thm_0" + + # should raise error if wrong type. + with pytest.raises(AssertionError): + surface = small_idf_obj.idfobjects["BUILDINGSURFACE:DETAILED"][0] + OpaqueConstruction.from_epbunch(surface) + class TestWindowConstruction: """Series of tests for the :class:`WindowConstruction` class""" - # todo: Implement from_to_json for WindowConstruction class - - def test_windowConstr_from_to_json(self, config, idf): - """ - Args: - config: - idf: - """ - import json + @pytest.fixture() + def air(self): + yield GasMaterial(Name="Air") - from archetypal.template import WindowConstruction + @pytest.fixture() + def b_glass_clear_3(self): + yield GlazingMaterial( + Name="B_Glass_Clear_3", + Density=2500, + Conductivity=1, + SolarTransmittance=0.770675, + SolarReflectanceFront=0.07, + SolarReflectanceBack=0.07, + VisibleTransmittance=0.8836, + VisibleReflectanceFront=0.0804, + VisibleReflectanceBack=0.0804, + IRTransmittance=0, + IREmissivityFront=0.84, + IREmissivityBack=0.84, + DirtFactor=1, + ) - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - with open(filename, "r") as f: - datastore = json.load(f) - load_json_objects(datastore, idf) - winConstr_json = [ - WindowConstruction.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["WindowConstructions"] + def test_window_construction_init(self, air, b_glass_clear_3): + """Test constructor.""" + gap = GasLayer(air, 0.0127) + clear_glass = MaterialLayer(b_glass_clear_3, 0.005715) + layers = [ + clear_glass, + gap, + clear_glass, + gap, + clear_glass, ] - assert winConstr_json[0].to_json() + window = WindowConstruction(Layers=layers, Name="Triple Clear Window") + window_dup = window.duplicate() + assert window == window_dup + assert window.u_factor == pytest.approx(1.757, rel=1e-2) -class TestStructureDefinition: - """Series of tests for the :class:`StructureInformation` class""" + def test_window_construction_errors(self, air, b_glass_clear_3): + gap = GasLayer(air, 0.0127) + clear_glass = MaterialLayer(b_glass_clear_3, 0.005715) + layers = [ + clear_glass, + gap, + clear_glass, + gap, + ] + with pytest.raises(AssertionError): + WindowConstruction(Layers=layers, Name="Triple Clear Window") - # todo: Implement from_to_json for StructureInformation class + layers = [gap, clear_glass, gap, clear_glass] + with pytest.raises(AssertionError): + WindowConstruction(Layers=layers, Name="Triple Clear Window") - def test_structure_from_to_json(self, config, idf): - """ - Args: - config: - idf: - """ - import json + def test_window_construction_from_to_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" - from archetypal.template import StructureInformation + gas_materials = [ + GasMaterial.from_dict( + { + "$id": "1", + "Category": "Gases", + "Type": "AIR", + "Conductivity": 0.0, + "Cost": 0.0, + "Density": 0.0, + "EmbodiedCarbon": 0.0, + "EmbodiedEnergy": 0.0, + "SubstitutionRatePattern": [], + "SubstitutionTimestep": 0.0, + "TransportCarbon": 0.0, + "TransportDistance": 0.0, + "TransportEnergy": 0.0, + "Comments": None, + "DataSource": None, + "Name": "AIR", + } + ) + ] - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - with open(filename, "r") as f: - datastore = json.load(f) - load_json_objects(datastore, idf) - struct_json = [ - StructureInformation.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["StructureDefinitions"] + glazing_materials = [ + GlazingMaterial.from_dict(data) + for data in [ + { + "$id": "6", + "DirtFactor": 1.0, + "IREmissivityBack": 0.84, + "IREmissivityFront": 0.84, + "IRTransmittance": 0.01, + "SolarReflectanceBack": 0.07, + "SolarReflectanceFront": 0.07, + "SolarTransmittance": 0.83, + "VisibleReflectanceBack": 0.08, + "VisibleReflectanceFront": 0.08, + "VisibleTransmittance": 0.89, + "Conductivity": 0.9, + "Cost": 0.0, + "Density": 2500.0, + "EmbodiedCarbon": 10.1, + "EmbodiedEnergy": 191.8, + "SubstitutionRatePattern": [0.2], + "SubstitutionTimestep": 50.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": None, + "DataSource": "default", + "Name": "B_Glass_Clear_4", + }, + { + "$id": "7", + "DirtFactor": 1.0, + "IREmissivityBack": 0.84, + "IREmissivityFront": 0.84, + "IRTransmittance": 0.01, + "SolarReflectanceBack": 0.07, + "SolarReflectanceFront": 0.07, + "SolarTransmittance": 0.83, + "VisibleReflectanceBack": 0.08, + "VisibleReflectanceFront": 0.08, + "VisibleTransmittance": 0.89, + "Conductivity": 0.9, + "Cost": 0.0, + "Density": 2500.0, + "EmbodiedCarbon": 5.06, + "EmbodiedEnergy": 96.1, + "SubstitutionRatePattern": [0.2], + "SubstitutionTimestep": 50.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": None, + "DataSource": "default", + "Name": "B_Glass_Clear_3", + }, + { + "$id": "8", + "DirtFactor": 1.0, + "IREmissivityBack": 0.84, + "IREmissivityFront": 0.84, + "IRTransmittance": 0.01, + "SolarReflectanceBack": 0.43, + "SolarReflectanceFront": 0.27, + "SolarTransmittance": 0.11, + "VisibleReflectanceBack": 0.35, + "VisibleReflectanceFront": 0.31, + "VisibleTransmittance": 0.14, + "Conductivity": 0.9, + "Cost": 0.0, + "Density": 2500.0, + "EmbodiedCarbon": 5.06, + "EmbodiedEnergy": 96.1, + "SubstitutionRatePattern": [0.2], + "SubstitutionTimestep": 50.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": None, + "DataSource": "default", + "Name": "B_Glass_Clear_3_Ref_H", + }, + { + "$id": "9", + "DirtFactor": 1.0, + "IREmissivityBack": 0.84, + "IREmissivityFront": 0.84, + "IRTransmittance": 0.01, + "SolarReflectanceBack": 0.22, + "SolarReflectanceFront": 0.19, + "SolarTransmittance": 0.63, + "VisibleReflectanceBack": 0.08, + "VisibleReflectanceFront": 0.06, + "VisibleTransmittance": 0.85, + "Conductivity": 0.9, + "Cost": 0.0, + "Density": 2500.0, + "EmbodiedCarbon": 5.06, + "EmbodiedEnergy": 96.1, + "SubstitutionRatePattern": [0.2], + "SubstitutionTimestep": 50.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": None, + "DataSource": "default", + "Name": "B_Glass_Clear_3_LoE_1", + }, + ] ] - assert struct_json[0].to_json() - def test_hash_eq_struc_def(self, config, idf): - """Test equality and hashing of :class:`OpaqueConstruction` + window = WindowConstruction.from_dict( + { + "$id": "57", + "Layers": [ + {"Material": {"$ref": "7"}, "Thickness": 0.003}, + {"Material": {"$ref": "1"}, "Thickness": 0.006}, + {"Material": {"$ref": "7"}, "Thickness": 0.003}, + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Double", + "Comments": "default", + "DataSource": "default", + "Name": "B_Dbl_Air_Cl", + }, + materials={a.id: a for a in (gas_materials + glazing_materials)}, + allow_duplicates=True, + ) + window_dup = window.duplicate() + assert window == window_dup + assert window.id == "57" + + def test_add_and_iadd(self, air, b_glass_clear_3): + gap = GasLayer(air, 0.0127) + clear_glass = MaterialLayer(b_glass_clear_3, 0.005715) + triple = WindowConstruction( + Layers=[ + clear_glass, + gap, + clear_glass, + gap, + clear_glass, + ], + Name="Triple Clear Window", + ) + double = WindowConstruction( + Layers=[ + clear_glass, + gap, + clear_glass, + ], + Name="Triple Clear Window", + ) - Args: - config: - idf: - """ - import json - from copy import copy + combined = triple + double - from archetypal.template import StructureInformation + assert combined - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - with open(filename, "r") as f: - datastore = json.load(f) + def test_shgc(self, b_glass_clear_3): + vision_lite = GlazingMaterial( + Name="Vision-Lite Diamant", + Density=2500, + Conductivity=1, + SolarTransmittance=0.881, + SolarReflectanceFront=0.101, + SolarReflectanceBack=0.101, + VisibleTransmittance=0.973, + VisibleReflectanceFront=0.014, + VisibleReflectanceBack=0.014, + IRTransmittance=0, + IREmissivityFront=0.868, + IREmissivityBack=0.868, + DirtFactor=1, + ) + planitherm = GlazingMaterial( + Name="Planitherm One II", + Density=2500, + Conductivity=1, + SolarTransmittance=0.478, + SolarReflectanceFront=0.443, + SolarReflectanceBack=0.382, + VisibleTransmittance=0.783, + VisibleReflectanceFront=0.167, + VisibleReflectanceBack=0.175, + IRTransmittance=0, + IREmissivityFront=0.013, + IREmissivityBack=0.837, + DirtFactor=1, + ) + argon = GasMaterial("ARGON") + triple = WindowConstruction( + Layers=[ + MaterialLayer(vision_lite, 0.004), + GasLayer(argon, 0.012), + MaterialLayer(planitherm, 0.004), + ], + Name="Triple Clear Window", + ) + print("u_factor is ", triple.u_factor) - struct_json = [ - StructureInformation.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["StructureDefinitions"] - ] - sd = struct_json[0] - sd_2 = copy(sd) + # assert temperature profile winter conditions. Values taken from WINDOW + # software. + temperature, r_values = triple.temperature_profile( + outside_temperature=-18, inside_temperature=21, wind_speed=5.5 + ) + assert [-18, -16.3, -16.1, 13.6, 13.8, 21.0] == pytest.approx(temperature, 1e-1) + print(temperature, r_values) + + shgc = triple.shgc("summer") + _, temperature = triple.heat_balance("summer") + print("shgc:", shgc) + assert [32, 32.9, 32.9, 31.9, 31.8, 24.0] == pytest.approx(temperature, 1e-1) + + print(temperature, r_values) # m2-K/W + + print("q_no_sun", (32 - 24) / sum(r_values)) + print("q_sun", triple.solar_transmittance * 783) + + def q_dot_at_outside_layer(layer: LayeredConstruction, t_1, t_out): + epsilon = layer.Layers[0].Material.ThermalEmittance + sigma = 5.670e-8 # [W/m2-K4] + + epsilon * sigma * ((t_1 + 273) ** 4 - (t_out + 273) ** 4) + + def test_from_simple_glazing(self): + """Test from shgc and u-value.""" + window = WindowConstruction.from_shgc("Window 1", 0.763, 2.716, 0.812) + + assert window.u_factor == pytest.approx(2.716, 1e-1) + assert window.visible_transmittance == 0.812 + + +class TestStructureInformation: + """Series of tests for the :class:`StructureInformation` class""" + + @pytest.fixture() + def structure(self): + """Test initializing StructureInformation.""" + + structure_information = StructureInformation( + MassRatios=[MassRatio(600, OpaqueMaterial.generic(), 300)], Name="structure" + ) + yield structure_information + assert structure_information.Name == "structure" + + def test_structure_from_to_dict(self, structure): + """Make dict with `to_dict` and load again with `from_dict`.""" + + materials = [a.Material for a in structure.MassRatios] + + structure_dict = structure.to_dict() + structure_dub = StructureInformation.from_dict( + structure_dict, + materials={a.id: a for a in materials}, + ) + assert structure == structure_dub + + def test_hash_eq_struc_def(self, structure): + """Test equality and hashing of :class:`OpaqueConstruction`.""" # a copy of dhw should be equal and have the same hash, but still not be the # same object - assert sd == sd_2 - assert hash(sd) == hash(sd_2) - assert sd is not sd_2 + sd_2 = structure.duplicate() + assert structure == sd_2 + assert hash(structure) == hash(sd_2) + assert structure is not sd_2 # hash is used to find object in lookup table - sd_list = [sd] - assert sd in sd_list + sd_list = [structure] + assert structure in sd_list assert sd_2 in sd_list # This is weird but expected sd_list.append(sd_2) @@ -1280,20 +1657,20 @@ def test_hash_eq_struc_def(self, config, idf): assert len(set(sd_list)) == 1 # dict behavior - sd_dict = {sd: "this_idf", sd_2: "same_idf"} + sd_dict = {structure: "this_idf", sd_2: "same_idf"} assert len(sd_dict) == 1 sd_2.Name = "some other name" # even if name changes, they should be equal - assert sd_2 == sd + assert sd_2 == structure - sd_dict = {sd: "this_idf", sd_2: "same_idf"} - assert sd in sd_dict + sd_dict = {structure: "this_idf", sd_2: "same_idf"} + assert structure in sd_dict assert len(sd_dict) == 2 # if an attribute changed, equality is lost sd_2.AssemblyCost = 69 - assert sd != sd_2 + assert structure != sd_2 # length of set() should be 2 since both objects are not equal anymore and # don't have the same hash. @@ -1302,28 +1679,23 @@ def test_hash_eq_struc_def(self, config, idf): # 2 GasMaterial from same json should not have the same hash if they # have different names, not be the same object, yet be equal if they have the # same layers (Material and Thickness) - sd_3 = copy(sd) + sd_3 = structure.duplicate() sd_3.Name = "other name" - assert hash(sd) != hash(sd_3) - assert id(sd) != id(sd_3) - assert sd is not sd_3 - assert sd == sd_3 + assert hash(structure) != hash(sd_3) + assert id(structure) != id(sd_3) + assert structure is not sd_3 + assert structure == sd_3 class TestUmiSchedule: """Tests for :class:`UmiSchedule` class""" - # todo: Implement from_to_json for UmiSchedule class + # todo: Implement from_to_dict for UmiSchedule class - def test_constant_umischedule(self, config, idf): - """ - Args: - config: - idf: - """ - from archetypal.template import UmiSchedule + def test_constant_umischedule(self): + """""" - const = UmiSchedule.constant_schedule(idf=idf) + const = UmiSchedule.constant_schedule() assert const.__class__.__name__ == "UmiSchedule" assert const.Name == "AlwaysOn" @@ -1333,22 +1705,18 @@ def test_schedule_develop(self, config, small_idf): config: small_idf: """ - from archetypal.template import UmiSchedule idf = small_idf # clear_cache() sched = UmiSchedule(Name="B_Off_Y_Occ", idf=idf) - assert sched.to_dict() + assert sched.to_ref() def test_hash_eq_umi_sched(self, small_idf, other_idf): """Test equality and hashing of :class:`ZoneLoad`""" - from copy import copy - - from archetypal.template import UmiSchedule - idf = small_idf - sched = UmiSchedule(Name="On", idf=idf) - sched_2 = copy(sched) + ep_bunch = small_idf.getobject("SCHEDULE:YEAR", "B_Off_Y_Occ") + sched = UmiSchedule.from_epbunch(epbunch=ep_bunch) + sched_2 = sched.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object @@ -1388,11 +1756,11 @@ def test_hash_eq_umi_sched(self, small_idf, other_idf): # don't have the same hash. assert len(set(sched_list)) == 2 - # 2 UmiSchedule from different idf should have the same hash, + # 2 UmiSchedule from different small_idf should have the same hash, # not be the same object, yet be equal if they have the same values - idf_2 = other_idf - assert idf is not idf_2 - sched_3 = UmiSchedule(Name="On", idf=idf_2, allow_duplicates=True) + sched_3 = UmiSchedule.from_epbunch( + ep_bunch, allow_duplicates=True, DataSource="Other Name" + ) assert sched is not sched_3 assert sched == sched_3 assert hash(sched) == hash(sched_3) @@ -1401,7 +1769,6 @@ def test_hash_eq_umi_sched(self, small_idf, other_idf): def test_combine(self): import numpy as np - from archetypal.template import UmiSchedule from archetypal.utils import reduce sch1 = UmiSchedule( @@ -1418,72 +1785,82 @@ def test_combine(self): class TestZoneConstructionSet: - """Combines different :class:`ZoneConstructionSet` tests""" + """Combines different :class:`ZoneConstructionSet` tests.""" - def test_add_zoneconstructionset(self, small_idf): - """Test __add__() for ZoneConstructionSet.""" - idf = small_idf - zone_core = idf.getobject("ZONE", core_name) - zone_perim = idf.getobject("ZONE", perim_name) - - z_core = ZoneConstructionSet.from_zone( - ZoneDefinition.from_zone_epbunch(zone_core) - ) - z_perim = ZoneConstructionSet.from_zone( - ZoneDefinition.from_zone_epbunch(zone_perim) - ) - z_new = z_core + z_perim - assert z_new - - def test_iadd_zoneconstructionset(self, small_idf): - """Test __iadd__() for ZoneConstructionSet.""" - idf = small_idf - zone_core = idf.getobject("ZONE", core_name) - zone_perim = idf.getobject("ZONE", perim_name) - - z_core = ZoneConstructionSet.from_zone( - ZoneDefinition.from_zone_epbunch(zone_core) + @pytest.fixture() + def core_set(self): + yield ZoneConstructionSet( + Name="Core Construction Set", Partition=OpaqueConstruction.generic() ) - z_perim = ZoneConstructionSet.from_zone( - ZoneDefinition.from_zone_epbunch(zone_perim) + + @pytest.fixture() + def perim_set(self): + yield ZoneConstructionSet( + Name="Perimeter Construction Set", Partition=OpaqueConstruction.generic() ) - id_ = z_core.id - z_core += z_perim - assert z_core - assert z_core.id == id_ # id should not change - assert z_core.id != z_perim.id + def test_add_zoneconstructionset(self, core_set, perim_set): + """Test __add__() for ZoneConstructionSet.""" - def test_zoneConstructionSet_init(self, config, idf): - """""" - from archetypal.template import ZoneConstructionSet + z_new = core_set + perim_set + assert z_new == core_set == perim_set - constrSet = ZoneConstructionSet(Name="A construction set", idf=idf) + def test_iadd_zoneconstructionset(self, core_set, perim_set): + """Test __iadd__() for ZoneConstructionSet.""" + id_ = core_set.id + core_set += perim_set - def test_zoneConstructionSet_from_zone(self, config, warehouse): - """""" - from archetypal.template import ZoneConstructionSet, ZoneDefinition + assert core_set + assert core_set.id == id_ # id should not change + assert core_set.id != perim_set.id - idf = warehouse - zone = idf.getobject("ZONE", "Office") - z = ZoneDefinition.from_zone_epbunch(zone_ep=zone) - constrSet_ = ZoneConstructionSet.from_zone(z) + def test_zoneConstructionSet_init(self): + """Test constructor.""" + construction_set = ZoneConstructionSet(Name="A construction set") + construction_set_dup = construction_set.duplicate() - def test_zoneConstructionSet_from_to_json(self, config, idf): - """""" - import json + assert construction_set == construction_set_dup + assert ( + construction_set.Name == construction_set_dup.Name == "A construction set" + ) - from archetypal.template import ZoneConstructionSet + def test_zone_construction_set_from_zone(self, warehouse): + """Test from zone epbunch""" + zone = warehouse.getobject("ZONE", "Office") + z = ZoneDefinition.from_epbunch(ep_bunch=zone) + constrSet_ = ZoneConstructionSet.from_zone(z) - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - with open(filename, "r") as f: - datastore = json.load(f) + def test_zoneConstructionSet_from_to_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" + construction = OpaqueConstruction.generic() + data = { + "$id": "168", + "Facade": construction.to_ref(), + "Ground": construction.to_ref(), + "Partition": construction.to_ref(), + "Roof": construction.to_ref(), + "Slab": construction.to_ref(), + "IsFacadeAdiabatic": False, + "IsGroundAdiabatic": False, + "IsPartitionAdiabatic": False, + "IsRoofAdiabatic": False, + "IsSlabAdiabatic": False, + "Category": "Office Spaces", + "Comments": None, + "DataSource": "MIT_SDL", + "Name": "B_Off_0 constructions", + } - constr_json = [ - ZoneConstructionSet.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["ZoneConstructionSets"] - ] - assert constr_json[0].to_json() + construction_set = ZoneConstructionSet.from_dict( + data, opaque_constructions={a.id: a for a in [construction]} + ) + construction_set_data = construction_set.to_dict() + + construction_set_dup = ZoneConstructionSet.from_dict( + construction_set_data, + opaque_constructions={a.id: a for a in [construction]}, + ) + assert construction_set == construction_set_dup class TestZoneLoad: @@ -1492,101 +1869,105 @@ class TestZoneLoad: @pytest.fixture(scope="class") def fiveZoneEndUses(self, config): """""" - w = ( + epw = ( get_eplus_dirs(settings.ep_version) / "WeatherData" / "USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw" ) idf = IDF.from_example_files( - "5ZoneAirCooled_AirBoundaries_Daylighting.idf", epw=w + "5ZoneAirCooled_AirBoundaries_Daylighting.idf", epw=epw ) if idf.sim_info is None: idf.simulate() yield idf - def test_zoneLoad_init(self, config, idf): - """""" - from archetypal.template import ZoneLoad - - load = ZoneLoad(Name=None, idf=idf) - - def test_zoneLoad_picle(self, config, idf): - import pickle - - from archetypal.template import ZoneLoad - - zone_load = ZoneLoad(Name=None, idf=idf) - - with open("Emp.pickle", "wb") as pickling_on: - pickle.dump(zone_load, pickling_on) - - with open("Emp.pickle", "rb") as pickle_off: - emp = pickle.load(pickle_off) - print(emp) - - assert zone_load == emp + def test_zoneLoad_init(self): + """Test constructor.""" + zone_load = ZoneLoad( + LightsAvailabilitySchedule=UmiSchedule.constant_schedule(Name="AlwaysOn"), + OccupancySchedule=UmiSchedule.constant_schedule(Name="AlwaysOn"), + Name="Zone 1 Loads", + ) + zone_load_dup = zone_load.duplicate() + assert zone_load == zone_load_dup + assert zone_load.Name == zone_load_dup.Name - def test_zoneLoad_from_zone(self, config, warehouse): + def test_zoneLoad_from_zone(self, warehouse): """""" - from archetypal.template import ZoneDefinition, ZoneLoad - idf = warehouse zone = idf.getobject("ZONE", "Office") - z = ZoneDefinition.from_zone_epbunch(zone_ep=zone) - zone_loads = ZoneLoad.from_zone(z) + z = ZoneDefinition.from_epbunch(ep_bunch=zone) + zone_loads = ZoneLoad.from_zone(z, zone) assert zone_loads.DimmingType == DimmingTypes.Off - assert zone_loads.EquipmentPowerDensity == 8.07 - assert zone_loads.IlluminanceTarget == 500 + assert zone_loads.EquipmentPowerDensity == pytest.approx(8.07, 1e-2) + assert zone_loads.IlluminanceTarget == pytest.approx(500, 1e-2) assert zone_loads.IsEquipmentOn assert zone_loads.IsPeopleOn - assert zone_loads.LightingPowerDensity == 11.84 - assert zone_loads.PeopleDensity == 0.021 + assert zone_loads.LightingPowerDensity == pytest.approx(11.84, 1e-2) + assert zone_loads.PeopleDensity == pytest.approx(0.021, 1e-2) - def test_zoneLoad_from_zone_mixedparams(self, config, fiveZoneEndUses): + def test_zoneLoad_from_zone_mixedparams(self, fiveZoneEndUses): """""" - from archetypal.template import ZoneDefinition, ZoneLoad - idf = fiveZoneEndUses - zone = idf.getobject("ZONE", "SPACE1-1") - z = ZoneDefinition.from_zone_epbunch(zone_ep=zone) - zone_loads = ZoneLoad.from_zone(z) + zone_ep = idf.getobject("ZONE", "SPACE1-1") + z = ZoneDefinition.from_epbunch(ep_bunch=zone_ep) + zone_loads = ZoneLoad.from_zone(z, zone_ep) assert zone_loads.DimmingType == DimmingTypes.Stepped - assert zone_loads.EquipmentPowerDensity == 10.649 + assert zone_loads.EquipmentPowerDensity == pytest.approx(10.649, 1e-2) assert zone_loads.IlluminanceTarget == 400 assert zone_loads.IsEquipmentOn assert zone_loads.IsPeopleOn - assert zone_loads.LightingPowerDensity == 15.974 - assert zone_loads.PeopleDensity == 0.111 - - def test_zoneLoad_from_to_json(self, config, idf): - """""" - import json - - from archetypal.template import ZoneLoad - - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - with open(filename, "r") as f: - datastore = json.load(f) - - load_json = [ - ZoneLoad.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["ZoneLoads"] + assert zone_loads.LightingPowerDensity == pytest.approx(15.974, 1e-2) + assert zone_loads.PeopleDensity == pytest.approx(0.111, 1e-2) + + def test_zoneLoad_from_to_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" + schedules = [ + UmiSchedule.constant_schedule(id="147"), + UmiSchedule.constant_schedule(id="146"), + UmiSchedule.constant_schedule(id="145"), ] - assert load_json[0].to_json() - - def test_hash_eq_zone_load(self, small_idf, small_idf_copy): - """Test equality and hashing of :class:`ZoneLoad`.""" - from copy import copy + data = { + "$id": "172", + "DimmingType": 1, + "EquipmentAvailabilitySchedule": {"$ref": "147"}, + "EquipmentPowerDensity": 8.0, + "IlluminanceTarget": 500.0, + "LightingPowerDensity": 12.0, + "LightsAvailabilitySchedule": {"$ref": "146"}, + "OccupancySchedule": {"$ref": "145"}, + "IsEquipmentOn": True, + "IsLightingOn": True, + "IsPeopleOn": True, + "PeopleDensity": 0.055, + "Category": "Office Spaces", + "Comments": None, + "DataSource": "MIT_SDL", + "Name": "B_Off_0 loads", + } + zone_load = ZoneLoad.from_dict(copy(data), {a.id: a for a in schedules}) + data_dup = dict(zone_load.to_dict()) + assert zone_load.id == "172" + assert data == data_dup - from archetypal.template import ZoneDefinition, ZoneLoad + @pytest.fixture() + def zl(self): + yield ZoneLoad( + EquipmentPowerDensity=10, + EquipmentAvailabilitySchedule=UmiSchedule.random( + Name="Random Equipment " "Schedule" + ), + LightsAvailabilitySchedule=UmiSchedule.constant_schedule(Name="AlwaysOn"), + OccupancySchedule=UmiSchedule.constant_schedule(Name="AlwaysOn"), + area=50, + Name="Zone 1 Loads", + ) - idf = small_idf - zone_ep = idf.idfobjects["ZONE"][0] - zone = ZoneDefinition.from_zone_epbunch(zone_ep) - zl = ZoneLoad.from_zone(zone) - zl_2 = copy(zl) + def test_hash_eq_zone_load(self, zl): + """Test equality and hashing of :class:`ZoneLoad`.""" + zl_2 = zl.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object @@ -1626,21 +2007,27 @@ def test_hash_eq_zone_load(self, small_idf, small_idf_copy): # don't have the same hash. assert len(set(zl_list)) == 2 - # 2 ZoneLoad from different idf should have the same hash if they + # 2 ZoneLoad from different idf should not have the same hash even if they # have the same name, not be the same object, yet be equal if they have the # same values (EquipmentPowerDensity, LightingPowerDensity, etc.) - idf_2 = small_idf_copy - zone_ep_3 = idf_2.idfobjects["ZONE"][0] - zone_3 = ZoneDefinition.from_zone_epbunch(zone_ep_3) - assert idf is not idf_2 - zl_3 = ZoneLoad.from_zone(zone_3, allow_duplicates=True) - assert zone_ep is not zone_ep_3 - assert zone_ep != zone_ep_3 - assert hash(zl) == hash(zl_3) + zl_3 = zl.duplicate() + zl_3.DataSource = "Other" + assert hash(zl) != hash(zl_3) assert id(zl) != id(zl_3) assert zl is not zl_3 assert zl == zl_3 + def test_zone_add(self, zl): + zl_2: ZoneLoad = zl.duplicate() + zl_2.EquipmentPowerDensity = None + zl_2.EquipmentAvailabilitySchedule = None + + zl_combined = ZoneLoad.combine(zl, zl_2, weights=[zl.area, zl_2.area]) + + # zl_combined = zl + zl_2 + assert zl_combined.EquipmentPowerDensity == 10 + assert zl_combined.area == 100 + class TestZoneConditioning: """Combines different :class:`ZoneConditioning` tests""" @@ -1671,68 +2058,88 @@ def zoneConditioningtests(self, config, request): copy, # yield a copy ) - def test_zoneConditioning_init(self, config, idf): - """""" - from archetypal.template import ZoneConditioning - - cond = ZoneConditioning(Name="A Name", idf=idf) - assert cond.Name == "A Name" + def test_zone_conditioning_init(self): + """Test constructor.""" + cond = ZoneConditioning(Name="A Name") + cond_dup = cond.duplicate() - with pytest.raises(TypeError): - # Name should be required, so it should raise a TypeError if it is missing - cond = ZoneConditioning() + assert ( + cond.EconomizerType + == cond_dup.EconomizerType + == EconomizerTypes.NoEconomizer + ) - def test_zoneConditioning_from_zone(self, config, zoneConditioningtests): + def test_from_zone(self, config, zoneConditioningtests): """""" - from archetypal.template import ZoneConditioning, ZoneDefinition idf, idf_name, _ = zoneConditioningtests if idf_name == "RefMedOffVAVAllDefVRP.idf": - zone = idf.getobject("ZONE", "Core_mid") - z = ZoneDefinition.from_zone_epbunch(zone_ep=zone) - cond_ = ZoneConditioning.from_zone(z) + zone_ep = idf.getobject("ZONE", "Core_mid") + z = ZoneDefinition.from_epbunch(ep_bunch=zone_ep) + cond_ = ZoneConditioning.from_zone(z, zone_ep) if idf_name == "AirflowNetwork_MultiZone_SmallOffice_HeatRecoveryHXSL.idf": - zone = idf.getobject("ZONE", "West Zone") - z = ZoneDefinition.from_zone_epbunch(zone_ep=zone) - cond_HX = ZoneConditioning.from_zone(z) + zone_ep = idf.getobject("ZONE", "West Zone") + z = ZoneDefinition.from_epbunch(ep_bunch=zone_ep) + cond_HX = ZoneConditioning.from_zone(z, zone_ep) if idf_name == "AirflowNetwork_MultiZone_SmallOffice_CoilHXAssistedDX.idf": - zone = idf.getobject("ZONE", "East Zone") - z = ZoneDefinition.from_zone_epbunch(zone_ep=zone) - cond_HX_eco = ZoneConditioning.from_zone(z) - - def test_zoneConditioning_from_to_json(self, config, idf): - """""" - import json - - from archetypal.template import ZoneConditioning - from archetypal.utils import reduce + zone_ep = idf.getobject("ZONE", "East Zone") + z = ZoneDefinition.from_epbunch(ep_bunch=zone_ep) + cond_HX_eco = ZoneConditioning.from_zone(z, zone_ep) + + def test_from_to_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" + schedule = UmiSchedule.constant_schedule(id="150") + data = { + "$id": "165", + "CoolingSchedule": schedule.to_ref(), + "CoolingCoeffOfPerf": 3.0, + "CoolingSetpoint": 24.0, + "CoolingLimitType": 0, + "CoolingFuelType": 1, + "EconomizerType": 0, + "HeatingCoeffOfPerf": 0.9, + "HeatingLimitType": 0, + "HeatingFuelType": 2, + "HeatingSchedule": schedule.to_ref(), + "HeatingSetpoint": 20.0, + "HeatRecoveryEfficiencyLatent": 0.65, + "HeatRecoveryEfficiencySensible": 0.7, + "HeatRecoveryType": 0, + "IsCoolingOn": True, + "IsHeatingOn": True, + "IsMechVentOn": True, + "MaxCoolFlow": 100.0, + "MaxCoolingCapacity": 100.0, + "MaxHeatFlow": 100.0, + "MaxHeatingCapacity": 100.0, + "MechVentSchedule": schedule.to_ref(), + "MinFreshAirPerArea": 0.0003, + "MinFreshAirPerPerson": 0.0025, + "Category": "Office Spaces", + "Comments": None, + "DataSource": "MIT_SDL", + "Name": "B_Off_0 Conditioning", + } - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - with open(filename, "r") as f: - datastore = json.load(f) - load_json_objects(datastore, idf) - cond_json = [ - ZoneConditioning.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["ZoneConditionings"] - ] - assert reduce(ZoneConditioning.combine, cond_json, weights=[1, 1]).to_json() + cond = ZoneConditioning.from_dict( + copy(data), schedules={a.id: a for a in [schedule]} + ) - def test_hash_eq_zone_cond(self, zoneConditioningtests): - """Test equality and hashing of :class:`ZoneConditioning` + cond_dict = cond.to_dict() - Args: - zoneConditioningtests: - """ - from copy import copy + cond_dup = ZoneConditioning.from_dict( + cond_dict, schedules={a.id: a for a in [schedule]} + ) - from archetypal.template import ZoneConditioning, ZoneDefinition + assert cond == cond_dup + assert cond is not cond_dup + assert cond.Name == cond_dup.Name == "B_Off_0 Conditioning" - idf, idf_name, idf_2 = zoneConditioningtests + def test_hash_eq_zone_cond(self): + """Test equality and hashing of :class:`ZoneConditioning`.""" - zone_ep = idf.idfobjects["ZONE"][0] - zone = ZoneDefinition.from_zone_epbunch(zone_ep, construct_parents=False) - zc = ZoneConditioning.from_zone(zone) - zc_2 = copy(zc) + zc = ZoneConditioning(Name="Conditioning 1") + zc_2 = zc.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object @@ -1765,7 +2172,7 @@ def test_hash_eq_zone_cond(self, zoneConditioningtests): assert len(zc_dict) == 2 # if an attribute changed, equality is lost - zc_2.IsCoolingOn = False + zc_2.IsCoolingOn = True assert zc != zc_2 # length of set() should be 2 since both objects are not equal anymore and @@ -1775,13 +2182,9 @@ def test_hash_eq_zone_cond(self, zoneConditioningtests): # 2 ZoneConditioning from different idf should not have the same hash if they # have different names, not be the same object, yet be equal if they have the # same values (CoolingSetpoint, HeatingSetpoint, etc.) - zone_ep_3 = idf_2.idfobjects["ZONE"][0] - zone_3 = ZoneDefinition.from_zone_epbunch(zone_ep_3, construct_parents=False) - assert idf is not idf_2 - zc_3 = ZoneConditioning.from_zone(zone_3) - assert zone_ep is not zone_ep_3 - assert zone_ep != zone_ep_3 - assert hash(zc) == hash(zc_3) + zc_3 = zc.duplicate() + zc_3.DataSource = "Other IDF" + assert hash(zc) != hash(zc_3) assert id(zc) != id(zc_3) assert zc is not zc_3 assert zc == zc_3 @@ -1795,11 +2198,7 @@ class TestVentilationSetting: params=["VentilationSimpleTest.idf", "RefBldgWarehouseNew2004_Chicago.idf"], ) def ventilatontests(self, config, request): - """ - Args: - config: - request: - """ + """Create test cases with different ventilation definitions.""" eplusdir = get_eplus_dirs(settings.ep_version) w = eplusdir / "WeatherData" / "USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw" @@ -1811,67 +2210,85 @@ def ventilatontests(self, config, request): copy.simulate() yield idf, request.param, copy # passes a copy as well - def test_ventilation_init(self, config, idf): - """ - Args: - config: - idf: - """ - from archetypal.template import VentilationSetting + def test_ventilation_init(self): + """Test __init__ constructor.""" + schedule = UmiSchedule.constant_schedule() - vent = VentilationSetting(Name=None, idf=idf) + vent = VentilationSetting( + NatVentSchedule=schedule, + ScheduledVentilationSchedule=schedule, + Name="Ventilation 1", + ) + vent_dup = vent.duplicate() - def test_naturalVentilation_from_zone(self, config, ventilatontests): - """ - Args: - config: - ventilatontests: - """ - from archetypal.template import VentilationSetting, ZoneDefinition + assert vent == vent_dup + assert vent is not vent_dup + assert vent.Name == vent_dup.Name == "Ventilation 1" + def test_naturalVentilation_from_zone(self, ventilatontests): + """Test from_zone constructor.""" idf, idf_name, _ = ventilatontests if idf_name == "VentilationSimpleTest.idf": - zone = idf.getobject("ZONE", "ZONE 1") - z = ZoneDefinition.from_zone_epbunch(zone_ep=zone, construct_parents=False) - natVent = VentilationSetting.from_zone(z) + zone_ep = idf.getobject("ZONE", "ZONE 1") + z = ZoneDefinition.from_epbunch(ep_bunch=zone_ep, construct_parents=False) + natVent = VentilationSetting.from_zone(z, zone_ep) if idf_name == "VentilationSimpleTest.idf": - zone = idf.getobject("ZONE", "ZONE 2") - z = ZoneDefinition.from_zone_epbunch(zone_ep=zone, construct_parents=False) - schedVent = VentilationSetting.from_zone(z) + zone_ep = idf.getobject("ZONE", "ZONE 2") + z = ZoneDefinition.from_epbunch(ep_bunch=zone_ep, construct_parents=False) + schedVent = VentilationSetting.from_zone(z, zone_ep) if idf_name == "RefBldgWarehouseNew2004_Chicago.idf": - zone = idf.getobject("ZONE", "Office") - z = ZoneDefinition.from_zone_epbunch(zone_ep=zone, construct_parents=False) - infiltVent = VentilationSetting.from_zone(z) - - def test_ventilationSetting_from_to_json(self, config, idf): - """""" - import json + zone_ep = idf.getobject("ZONE", "Office") + z = ZoneDefinition.from_epbunch(ep_bunch=zone_ep, construct_parents=False) + infiltVent = VentilationSetting.from_zone(z, zone_ep) + + def test_ventilationSetting_from_to_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" + schedule = UmiSchedule.constant_schedule(id="151") + data = { + "$id": "162", + "Afn": False, + "IsBuoyancyOn": True, + "Infiltration": 0.35, + "IsInfiltrationOn": True, + "IsNatVentOn": False, + "IsScheduledVentilationOn": False, + "NatVentMaxRelHumidity": 80.0, + "NatVentMaxOutdoorAirTemp": 26.0, + "NatVentMinOutdoorAirTemp": 20.0, + "NatVentSchedule": {"$ref": schedule.id}, + "NatVentZoneTempSetpoint": 22.0, + "ScheduledVentilationAch": 0.6, + "ScheduledVentilationSchedule": {"$ref": schedule.id}, + "ScheduledVentilationSetpoint": 22.0, + "IsWindOn": False, + "Category": "Office Spaces", + "Comments": None, + "DataSource": "MIT_SDL", + "Name": "Ventilation 1", + } + vent = VentilationSetting.from_dict( + data, schedules={a.id: a for a in [schedule]} + ) + vent_dict = vent.to_dict() - from archetypal.template import VentilationSetting - from archetypal.utils import reduce + vent_dup = VentilationSetting.from_dict( + vent_dict, schedules={a.id: a for a in [schedule]} + ) - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - with open(filename, "r") as f: - datastore = json.load(f) - load_json_objects(datastore, idf) - vent_json = [ - VentilationSetting.from_dict(**store, idf=idf, allow_duplicates=True) - for store in datastore["VentilationSettings"] - ] - assert reduce(VentilationSetting.combine, vent_json, weights=[1, 1]).to_json() + assert vent == vent_dup + assert vent is not vent_dup + assert vent.Name == vent_dup.Name == "Ventilation 1" - def test_hash_eq_vent_settings(self, ventilatontests): + def test_hash_eq_vent_settings(self): """Test equality and hashing of :class:`DomesticHotWaterSetting`.""" - from copy import copy - - from archetypal.template import VentilationSetting, ZoneDefinition - idf, idf_name, idf_2 = ventilatontests - - zone_ep = idf.idfobjects["ZONE"][0] - zone = ZoneDefinition.from_zone_epbunch(zone_ep, construct_parents=False) - vent = VentilationSetting.from_zone(zone) - vent_2 = copy(vent) + schedule = UmiSchedule.constant_schedule() + vent = VentilationSetting( + NatVentSchedule=schedule, + ScheduledVentilationSchedule=schedule, + Name="Ventilation 1", + ) + vent_2 = vent.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object @@ -1911,47 +2328,225 @@ def test_hash_eq_vent_settings(self, ventilatontests): # don't have the same hash. assert len(set(vent_list)) == 2 - # 2 VentilationSettings from different idf should have the same hash if they + # 2 VentilationSettings from different idf should not have the same hash if they # have same names, not be the same object, yet be equal if they have the # same values (Infiltration, IsWindOn, etc.) - - zone_ep_3 = idf_2.idfobjects["ZONE"][0] - zone_3 = ZoneDefinition.from_zone_epbunch( - zone_ep_3, construct_parents=False, allow_duplicates=True - ) - vent_3 = VentilationSetting.from_zone(zone) - assert idf is not idf_2 - vent_3 = VentilationSetting.from_zone(zone_3, allow_duplicates=True) - assert zone_ep is not zone_ep_3 - assert zone_ep != zone_ep_3 - assert hash(vent) == hash(vent_3) + vent_3 = vent.duplicate() + vent_3.DataSource = "Other IDF" + assert hash(vent) != hash(vent_3) assert id(vent) != id(vent_3) assert vent is not vent_3 assert vent == vent_3 + def test_combine(self): + """Test combining two objects.""" + always_on = UmiSchedule.constant_schedule() + always_half = UmiSchedule.constant_schedule(0.5, Name="AlwaysHalf") + random = UmiSchedule.random() + vent_1 = VentilationSetting( + Infiltration=0.1, + NatVentSchedule=always_on, + ScheduledVentilationAch=1, + ScheduledVentilationSchedule=random, + IsScheduledVentilationOn=True, + area=50, + volume=150, + Name="Ventilation 1", + ) + vent_2 = VentilationSetting( + Infiltration=0.2, + NatVentSchedule=always_on, + ScheduledVentilationAch=2, + ScheduledVentilationSchedule=always_half, + IsScheduledVentilationOn=True, + area=50, + volume=150, + Name="Ventilation 2", + ) + + vent_3 = vent_1 + vent_2 + + assert vent_3.area == vent_1.area + vent_2.area + assert vent_3.volume == vent_1.volume + vent_2.volume + assert vent_3.Infiltration == pytest.approx((0.1 + 0.2) / 2) + annual_air_volume = ( + vent_1.ScheduledVentilationSchedule.all_values + * vent_1.ScheduledVentilationAch + * vent_1.volume + ).sum() + ( + vent_2.ScheduledVentilationSchedule.all_values + * vent_2.ScheduledVentilationAch + * vent_2.volume + ).sum() + combined_annual_air_volume = ( + vent_3.ScheduledVentilationSchedule.all_values + * vent_3.ScheduledVentilationAch + * vent_3.volume + ).sum() + assert combined_annual_air_volume == pytest.approx(annual_air_volume) + + def test_combine_with_none(self): + """Test combining two objects.""" + always_on = UmiSchedule.constant_schedule() + always_half = UmiSchedule.constant_schedule(0.5, Name="AlwaysHalf") + vent_1 = VentilationSetting( + Infiltration=None, + NatVentSchedule=always_on, + ScheduledVentilationAch=None, + ScheduledVentilationSchedule=None, + IsScheduledVentilationOn=False, + area=50, + volume=150, + Name="Ventilation 1", + ) + vent_2 = VentilationSetting( + Infiltration=0.2, + NatVentSchedule=always_on, + ScheduledVentilationAch=2, + ScheduledVentilationSchedule=always_half, + IsScheduledVentilationOn=True, + area=50, + volume=150, + Name="Ventilation 2", + ) + + vent_3 = vent_1 + vent_2 + + assert vent_3.area == vent_1.area + vent_2.area + assert vent_3.volume == vent_1.volume + vent_2.volume + assert vent_3.ScheduledVentilationAch == pytest.approx( + (vent_1.ScheduledVentilationAch + vent_2.ScheduledVentilationAch) / 2 + ) + annual_air_volume = ( + 0 + + ( + vent_2.ScheduledVentilationSchedule.all_values + * vent_2.ScheduledVentilationAch + * vent_2.volume + ).sum() + ) + combined_annual_air_volume = ( + vent_3.ScheduledVentilationSchedule.all_values + * vent_3.ScheduledVentilationAch + * vent_3.volume + ).sum() + assert combined_annual_air_volume == annual_air_volume + class TestDomesticHotWaterSetting: - """Series of tests for the :class:`DomesticHotWaterSetting` class""" + """Series of tests for the :class:`DomesticHotWaterSetting` class.""" + + def test_init_dhw(self): + dhw = DomesticHotWaterSetting(area=1, Name="DHW 1") + dhw_dup = dhw.duplicate() + assert dhw == dhw_dup + assert dhw.Name == dhw_dup.Name == "DHW 1" + + def test_to_from_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" + schedules = [UmiSchedule.constant_schedule(id="1")] + dhw_dict = { + "$id": "2", + "FlowRatePerFloorArea": 0.00021, + "IsOn": True, + "WaterSchedule": {"$ref": "1"}, + "WaterSupplyTemperature": 55.0, + "WaterTemperatureInlet": 16.0, + "Category": "Office Spaces", + "Comments": None, + "DataSource": "MIT_SDL", + "Name": "B_Off_0 hot water", + } + dhw = DomesticHotWaterSetting.from_dict( + dhw_dict, schedules={a.id: a for a in schedules} + ) + dhw_dup = dhw.duplicate() - def test_hash_eq_dhw(self, small_idf): - """Test equality and hashing of :class:`DomesticHotWaterSetting` + assert dhw == dhw_dup + assert dhw is not dhw_dup + assert dhw.FlowRatePerFloorArea == dhw_dup.FlowRatePerFloorArea == 0.00021 - Args: - small_idf: - """ - from copy import copy + @pytest.fixture(scope="class") + def five_zone_water_systems(self, config): + """Parse 5ZoneWaterSystems. Add RunPeriod because not included in file.""" + idf = IDF.from_example_files("5ZoneWaterSystems.idf") + idf.newidfobject( + "RUNPERIOD", + Name="Run period", + Begin_Month=1, + Begin_Day_of_Month=1, + Begin_Year="", + End_Month=12, + End_Day_of_Month=31, + End_Year="", + Day_of_Week_for_Start_Day="", + Use_Weather_File_Holidays_and_Special_Days="No", + Use_Weather_File_Daylight_Saving_Period="No", + Apply_Weekend_Holiday_Rule="No", + Use_Weather_File_Rain_Indicators="Yes", + Use_Weather_File_Snow_Indicators="Yes", + ) + yield idf + + def test_from_zone(self, five_zone_water_systems): + zone = five_zone_water_systems.getobject("ZONE", "SPACE5-1") + dhw = DomesticHotWaterSetting.from_zone(zone) + assert dhw + + @pytest.mark.skip() + def test_whole_building(self, five_zone_water_systems): + dhws = {} + for zone in five_zone_water_systems.idfobjects["ZONE"]: + dhws[zone.Name] = DomesticHotWaterSetting.from_zone(zone) + dhw_per_zone = reduce(DomesticHotWaterSetting.combine, dhws.values()) + # dhw_per_zone = list(dhws.values()) + dhw_whole_bldg = DomesticHotWaterSetting.whole_building(five_zone_water_systems) + assert dhw_per_zone.__key__() == dhw_whole_bldg.__key__() + + def test_combine(self): + """""" + zone_1 = DomesticHotWaterSetting( + Name="zone_1", + FlowRatePerFloorArea=0.001, + area=25, + WaterSchedule=UmiSchedule.constant_schedule(1, Name="AlwaysOn"), + ) + zone_2 = DomesticHotWaterSetting( + Name="zone_2", + FlowRatePerFloorArea=0.002, + area=75, + WaterSchedule=UmiSchedule.constant_schedule(0.5, Name="AlwaysHalf"), + ) + combined = zone_1 + zone_2 + assert combined.FlowRatePerFloorArea == pytest.approx(0.00175) + assert combined.area == zone_1.area + zone_2.area + + # assert final annual quantity is kept. multiply schedule by flowrate per + # area and area. + total_water_zone_1 = sum( + zone_1.WaterSchedule.all_values * zone_1.FlowRatePerFloorArea * zone_1.area + ) + total_water_zone_2 = sum( + zone_2.WaterSchedule.all_values * zone_2.FlowRatePerFloorArea * zone_2.area + ) + total_water = total_water_zone_1 + total_water_zone_2 + assert sum( + combined.WaterSchedule.all_values * combined.FlowRatePerFloorArea * 100 + ) == pytest.approx(total_water) - from archetypal.template import DomesticHotWaterSetting, UmiSchedule + def test_hash_eq_dhw(self): + """Test equality and hashing of :class:`DomesticHotWaterSetting`.""" dhw = DomesticHotWaterSetting( - Name="", - IsOn=True, + "Domestic", WaterSchedule=UmiSchedule.constant_schedule(), + IsOn=True, FlowRatePerFloorArea=0.03, WaterSupplyTemperature=65, WaterTemperatureInlet=10, + area=1, ) - dhw_2 = copy(dhw) + dhw_2 = dhw.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object @@ -1993,7 +2588,7 @@ def test_hash_eq_dhw(self, small_idf): class TestWindowSetting: - """Combines different :class:`WindowSetting` tests""" + """Combines different :class:`WindowSetting` tests.""" @pytest.fixture( scope="class", params=["WindowTests.idf", "AirflowNetwork3zVent.idf"] @@ -2015,24 +2610,14 @@ def test_window_from_construction_name(self, small_idf): Args: small_idf: """ - from archetypal.template import WindowSetting - idf = small_idf construction = idf.getobject("CONSTRUCTION", "B_Dbl_Air_Cl") - # clear_cache() w = WindowSetting.from_construction(construction) - assert w.to_json() + assert w.to_dict() @pytest.fixture(scope="class") def allwindowtypes(self, config, windowtests): - """ - Args: - config: - windowtests: - """ - from archetypal.template import WindowSetting - idf = windowtests f_surfs = idf.idfobjects["FENESTRATIONSURFACE:DETAILED"] windows = [] @@ -2040,100 +2625,102 @@ def allwindowtypes(self, config, windowtests): windows.append(WindowSetting.from_surface(f)) yield windows - def test_allwindowtype(self, allwindowtypes): - """ - Args: - allwindowtypes: - """ - assert allwindowtypes + def test_init(self): + """Test class init.""" + w = WindowSetting("Window 1") + w_dup = w.duplicate() + + assert w == w_dup + assert w.Name == w_dup.Name + + def test_windowsettings_from_to_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" + + window_cstrc = WindowConstruction.from_shgc( + "Window Construction", 0.5, 2.2, 0.21, id="57" + ) + constructions = [window_cstrc] + schedules = [UmiSchedule.constant_schedule(id="1")] + data = { + "$id": "179", + "AfnDischargeC": 0.65, + "AfnTempSetpoint": 20.0, + "AfnWindowAvailability": {"$ref": "1"}, + "Construction": {"$ref": "57"}, + "IsShadingSystemOn": False, + "IsVirtualPartition": False, + "IsZoneMixingOn": False, + "OperableArea": 0.8, + "ShadingSystemAvailabilitySchedule": {"$ref": "1"}, + "ShadingSystemSetpoint": 350.0, + "ShadingSystemTransmittance": 0.5, + "ShadingSystemType": 0, + "Type": 0, + "ZoneMixingAvailabilitySchedule": {"$ref": "1"}, + "ZoneMixingDeltaTemperature": 2.0, + "ZoneMixingFlowRate": 0.001, + "Category": "Office Spaces", + "Comments": "Base building definition for MIT 4433", + "DataSource": "MIT_SDL", + "Name": "B_Off_0 windows", + } + + w = WindowSetting.from_dict( + data, + schedules={a.id: a for a in schedules}, + window_constructions={a.id: a for a in constructions}, + ) + + w_dict = w.to_dict() + + w_dup = WindowSetting.from_dict( + w_dict, + schedules={a.id: a for a in schedules}, + window_constructions={a.id: a for a in constructions}, + ) + + assert w == w_dup + assert w is not w_dup + assert w.Name == w_dup.Name == "B_Off_0 windows" + assert w.id == w_dup.id == "179" + assert isinstance(w.Construction, WindowConstruction) def test_winow_add2(self, allwindowtypes): - """ - Args: - allwindowtypes: - """ - from archetypal.template import WindowSetting from archetypal.utils import reduce window = reduce(WindowSetting.combine, allwindowtypes) print(window) - def test_window_add(self): - """ - Args: - small_idf: - other_idf: - """ - from archetypal.template import WindowSetting - - idf = IDF() - window_1 = WindowSetting.generic(idf, Name="window_1") - window_2 = WindowSetting.generic(idf, Name="window_2") + def test_window_add(self, allwindowtypes): + window_1, window_2, *_ = allwindowtypes # take 2 new_w = window_1 + window_2 assert window_1 == window_2 assert new_w.id == window_1.id assert window_1.id != window_2.id != new_w.id - def test_window_iadd(self, small_idf, other_idf): - """ - Args: - small_idf: - other_idf: - """ - from archetypal.template import WindowSetting + def test_window_iadd(self, allwindowtypes): + window_1, window_2, *_ = allwindowtypes - idf = small_idf - idf2 = other_idf - zone = idf.idfobjects["ZONE"][0] - iterator = iter([win for surf in zone.zonesurfaces for win in surf.subsurfaces]) - surface = next(iterator, None) - window_1 = WindowSetting.from_surface(surface) - id_ = window_1.id - zone = idf2.idfobjects["ZONE"][0] - iterator = iter([win for surf in zone.zonesurfaces for win in surf.subsurfaces]) - surface = next(iterator, None) - window_2 = WindowSetting.from_surface(surface, allow_duplicates=True) + previous_id = window_1.id window_1 += window_2 assert window_1 - assert window_1.id == id_ # id should not change + assert window_1.id == previous_id # id should not change assert window_1.id != window_2.id - def test_glazing_material_from_simple_glazing(self, config, idf): - """test __add__() for OpaqueMaterial + def test_window_generic(self): + w = WindowSetting.generic("Generic Window") - Args: - config: - idf: - """ - sg_a = calc_simple_glazing(0.763, 2.716, 0.812) - mat_a = GlazingMaterial(Name="mat_a", **sg_a, idf=idf) - glazMat_to_json = mat_a.to_json() - assert glazMat_to_json - - def test_window_generic(self, small_idf): - """ - Args: - small_idf: - """ - from archetypal.template import WindowSetting - - idf = small_idf - w = WindowSetting.generic(idf, "Generic Window") - - assert w.to_json() + assert w.to_dict() def test_hash_eq_window_settings(self, small_idf, small_idf_copy): """Test equality and hashing of :class:`DomesticHotWaterSetting`""" - from copy import copy - - from archetypal.template import WindowSetting idf = small_idf f_surf = idf.idfobjects["FENESTRATIONSURFACE:DETAILED"][0] wind = WindowSetting.from_surface(f_surf) - wind_2 = copy(wind) + wind_2 = wind.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object @@ -2192,8 +2779,6 @@ def test_window_fromsurface(self, config, small_idf): config: small_idf: """ - from archetypal.template import WindowSetting - idf = small_idf f_surfs = idf.idfobjects["FENESTRATIONSURFACE:DETAILED"] for f in f_surfs: @@ -2215,57 +2800,144 @@ def test_window_fromsurface(self, config, small_idf): assert w -class TestZone: - """Tests for :class:`Zone` class""" +class TestInternalMass: + """Tests for class InternalMass.""" + + def test_init_class(self): + internal_mass = InternalMass( + surface_name="InternalMass for zone 1", + construction=OpaqueConstruction.generic(), + total_area_exposed_to_zone=10, + ) + internal_mass_dup = internal_mass.duplicate() + assert internal_mass == internal_mass_dup + assert ( + internal_mass.total_area_exposed_to_zone + == internal_mass_dup.total_area_exposed_to_zone + ) - def test_zone_volume(self, small_idf_copy): - """Test the zone volume for a sloped roof + def test_from_zone(self, small_idf_obj): + """Test constructor from Zone EpBunch object.""" + zone_epbunch = small_idf_obj.idfobjects["ZONE"][0] + internal_mass = InternalMass.from_zone(zone_epbunch=zone_epbunch) + assert internal_mass.total_area_exposed_to_zone == pytest.approx(5.03, 1e-2) + + def test_to_ep_bunch(self, idf): + internal_mass = InternalMass( + construction=OpaqueConstruction.generic(), + total_area_exposed_to_zone=10, + surface_name="InternalMass", + ) + ep_bunch = internal_mass.to_epbunch(idf, "Zone 1") + assert isinstance(ep_bunch, EpBunch) + assert ep_bunch.Name == "InternalMass" + assert idf.getobject("INTERNALMASS", "InternalMass") == ep_bunch + + +class TestZoneDefinition: + """Tests for :class:`ZoneDefinition` class""" + + def test_zone_init(self): + zone = ZoneDefinition( + Name="Zone 1", + Constructions=ZoneConstructionSet("Zone 1 Constructions"), + Loads=ZoneLoad("Zone 1 Load"), + Conditioning=ZoneConditioning("Zone 1 Conditioning"), + Ventilation=VentilationSetting("Zone 1 Ventilation"), + DomesticHotWater=DomesticHotWaterSetting("Zone 1 DHW"), + InternalMassConstruction=OpaqueConstruction.generic(), + Windows=WindowSetting("Zone 1 Windows"), + ) + zone_dup = zone.duplicate() - Args: - small_idf_copy: - """ - from archetypal.template import ZoneDefinition + assert zone == zone_dup + assert zone.Name == zone_dup.Name - idf = small_idf_copy - zone = idf.getobject("ZONE", "Perim") - z = ZoneDefinition.from_zone_epbunch(zone_ep=zone, construct_parents=False) - np.testing.assert_almost_equal(desired=z.volume, actual=25.54, decimal=1) + def test_from_to_dict(self): + """""" + conditionings = [ZoneConditioning("Zone 1 Conditioning", id="165")] + construction_sets = [ZoneConstructionSet("Zone 1 Constructions", id="168")] + dhws = [DomesticHotWaterSetting("Zone 1 DHW", id="159")] + constructions = [OpaqueConstruction.generic(id="54")] + loads = [ZoneLoad("Zone 1 Load", id="172")] + ventilations = [VentilationSetting("Zone 1 Ventilation", id="162")] + data = { + "$id": "175", + "Conditioning": {"$ref": "165"}, + "Constructions": {"$ref": "168"}, + "DaylightMeshResolution": 1.0, + "DaylightWorkplaneHeight": 0.8, + "DomesticHotWater": {"$ref": "159"}, + "InternalMassConstruction": {"$ref": "54"}, + "InternalMassExposedPerFloorArea": 1.05, + "Loads": {"$ref": "172"}, + "Ventilation": {"$ref": "162"}, + "Category": "Office Spaces", + "Comments": None, + "DataSource": "MIT_SDL", + "Name": "B_Off_0", + } + zone = ZoneDefinition.from_dict( + data, + zone_conditionings={a.id: a for a in conditionings}, + zone_construction_sets={a.id: a for a in construction_sets}, + domestic_hot_water_settings={a.id: a for a in dhws}, + opaque_constructions={a.id: a for a in constructions}, + zone_loads={a.id: a for a in loads}, + ventilation_settings={a.id: a for a in ventilations}, + ) - def test_add_zone(self, small_idf_copy): - """Test __add__() for Zone + zone_dict = zone.to_dict() + + zone_dup = ZoneDefinition.from_dict( + zone_dict, + zone_conditionings={a.id: a for a in conditionings}, + zone_construction_sets={a.id: a for a in construction_sets}, + domestic_hot_water_settings={a.id: a for a in dhws}, + opaque_constructions={a.id: a for a in constructions}, + zone_loads={a.id: a for a in loads}, + ventilation_settings={a.id: a for a in ventilations}, + ) + + assert zone == zone_dup + + def test_zone_volume(self, small_idf_copy): + """Test the zone volume for a sloped roof Args: small_idf_copy: """ idf = small_idf_copy - zone_core = idf.getobject("ZONE", core_name) - zone_perim = idf.getobject("ZONE", perim_name) + zone = idf.getobject("ZONE", "Perim") + z = ZoneDefinition.from_epbunch(ep_bunch=zone, construct_parents=False) + assert z.volume == pytest.approx(25.54, 1e-2) - z_core = ZoneDefinition.from_zone_epbunch(zone_core, construct_parents=False) - z_perim = ZoneDefinition.from_zone_epbunch(zone_perim, construct_parents=False) + def test_add_zone(self): + """Test __add__() for Zone.""" + z_core = ZoneDefinition("Core Zone", area=10 * 10, volume=10 * 10 * 3) + z_perim = ZoneDefinition("Perim Zone", area=10 * 10, volume=10 * 10 * 3) z_new = z_core + z_perim assert z_new - np.testing.assert_almost_equal( - actual=z_core.volume + z_perim.volume, desired=z_new.volume, decimal=3 + assert z_new.volume == pytest.approx(z_core.volume + z_perim.volume) + assert z_new.area == pytest.approx(z_core.area + z_perim.area) + + def test_iadd_zone(self): + """Test __iadd__() for Zone.""" + z_core = ZoneDefinition( + "Core Zone", + area=10 * 10, + volume=10 * 10 * 3, + InternalMassExposedPerFloorArea=1, ) - np.testing.assert_almost_equal( - actual=z_core.area + z_perim.area, desired=z_new.area, decimal=3 + z_perim = ZoneDefinition( + "Perim Zone", + area=10 * 10, + volume=10 * 10 * 3, + InternalMassExposedPerFloorArea=0, ) - def test_iadd_zone(self, small_idf_copy): - """Test __iadd__() for Zone - - Args: - small_idf_copy: - """ - idf = small_idf_copy - zone_core = idf.getobject("ZONE", core_name) - zone_perim = idf.getobject("ZONE", perim_name) - - z_core = ZoneDefinition.from_zone_epbunch(zone_core, construct_parents=False) - z_perim = ZoneDefinition.from_zone_epbunch(zone_perim, construct_parents=False) volume = z_core.volume + z_perim.volume # save volume before changing area = z_core.area + z_perim.area # save area before changing @@ -2276,20 +2948,18 @@ def test_iadd_zone(self, small_idf_copy): assert z_core.id == id_ assert z_core.id != z_perim.id - np.testing.assert_almost_equal(actual=volume, desired=z_core.volume, decimal=3) - - np.testing.assert_almost_equal(actual=area, desired=z_core.area, decimal=3) + assert z_core.volume == pytest.approx(volume) + assert z_core.area == pytest.approx(area) - def test_hash_eq_zone(self, small_idf, small_idf_copy): + def test_hash_eq_zone(self): """Test equality and hashing of :class:`ZoneLoad`.""" - from copy import copy - - from archetypal.template import ZoneDefinition - - idf = small_idf - zone_ep = idf.idfobjects["ZONE"][0] - zone = ZoneDefinition.from_zone_epbunch(zone_ep) - zone_2 = copy(zone) + zone = ZoneDefinition( + "Core Zone", + area=10 * 10, + volume=10 * 10 * 3, + InternalMassExposedPerFloorArea=1, + ) + zone_2 = zone.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object @@ -2332,12 +3002,8 @@ def test_hash_eq_zone(self, small_idf, small_idf_copy): # 2 Zones from different idf should not have the same hash, not be the same # object, yet be equal if they have the same values (Conditioning, Loads, etc.). # 2 Zones with different names should not have the same hash. - idf_2 = small_idf_copy - zone_ep_3 = idf_2.idfobjects["ZONE"][0] - zone_3 = ZoneDefinition.from_zone_epbunch(zone_ep_3, DataSource="OtherIDF") - assert idf is not idf_2 - assert zone_ep is not zone_ep_3 - assert zone_ep != zone_ep_3 + zone_3 = zone.duplicate() + zone_3.DataSource = "OtherIDF" assert hash(zone) != hash(zone_3) assert id(zone) != id(zone_3) assert zone is not zone_3 @@ -2347,7 +3013,6 @@ def test_hash_eq_zone(self, small_idf, small_idf_copy): @pytest.fixture(scope="session") def bt(config): """A building template fixture used in subsequent tests""" - from archetypal.template import BuildingTemplate w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" idf = IDF.from_example_files("5ZoneCostEst.idf", epw=w, annual=True) @@ -2361,24 +3026,122 @@ def bt(config): class TestBuildingTemplate: """Various tests with the :class:`BuildingTemplate` class""" - def test_buildingTemplate_from_to_json(self, config): - from archetypal import UmiTemplateLibrary + @pytest.fixture() + def building_template(self, zone_definition, structure_information, window_setting): + bt = BuildingTemplate( + "A Building Template", + Core=zone_definition, + Perimeter=zone_definition, + Structure=structure_information, + Windows=window_setting, + ) + return bt - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" + @pytest.fixture() + def window_setting(self, window_construction): + window_setting = WindowSetting( + "Window Setting", Construction=window_construction, id="181" + ) + return window_setting + + @pytest.fixture() + def window_construction(self): + window_cstrc = WindowConstruction.from_shgc( + "Window Construction", 0.5, 2.2, 0.21, id="57" + ) + return window_cstrc - b = UmiTemplateLibrary.open(filename) - bt = b.BuildingTemplates - bt_to_json = bt[0].to_json() - w_to_json = bt[0].Windows.to_json() + @pytest.fixture() + def structure_information(self): + return StructureInformation( + MassRatios=[MassRatio(600, OpaqueMaterial.generic(), 300)], + Name="structure", + id="64", + ) - def test_hash_eq_bt(self, config, other_idf_object, other_idf_object_copy): - """Test equality and hashing of class BuildingTemplate""" - from archetypal.template import BuildingTemplate + @pytest.fixture() + def zone_definition(self): + return ZoneDefinition( + Name="Zone 1", + Constructions=ZoneConstructionSet("Zone 1 Constructions"), + Loads=ZoneLoad( + "Zone 1 Load", + LightsAvailabilitySchedule=UmiSchedule.constant_schedule(), + ), + Conditioning=ZoneConditioning("Zone 1 Conditioning"), + Ventilation=VentilationSetting("Zone 1 Ventilation"), + DomesticHotWater=DomesticHotWaterSetting("Zone 1 DHW"), + InternalMassConstruction=OpaqueConstruction.generic(), + Windows=WindowSetting("Zone 1 Windows"), + is_core=False, + id="178", + ) + + def test_init(self, building_template): + """Test init.""" + bt = building_template + bt_dup = bt.duplicate() + assert bt == bt_dup + + def test_from_to_dict( + self, + zone_definition, + structure_information, + window_setting, + window_construction, + ): + """Make dict with `to_dict` and load again with `from_dict`.""" + data = { + "Core": {"$ref": "178"}, + "Lifespan": 60, + "PartitionRatio": 0.3, + "Perimeter": {"$ref": "178"}, + "Structure": {"$ref": "64"}, + "Windows": {"$ref": "181"}, + "DefaultWindowToWallRatio": 0.4, + "YearFrom": 0, + "YearTo": 0, + "Country": ["USA"], + "ClimateZone": ["5A"], + "Authors": ["Carlos Cerezo"], + "AuthorEmails": ["ccerezo@mit.edu"], + "Version": "v1.0", + "Category": "Residential and Lodging", + "Comments": "Base building definition for MIT 4433", + "DataSource": "MIT_SDL", + "Name": "B_Res_0_WoodFrame", + } + zone_definitions = [zone_definition] + structure_informations = [structure_information] + window_settings = [window_setting] + year_schedules = [] # needed only of windowsettings is embedded in dict. + window_constructions = [window_construction] + bt = BuildingTemplate.from_dict( + data, + zone_definitions={a.id: a for a in zone_definitions}, + structure_definitions={a.id: a for a in structure_informations}, + window_settings={a.id: a for a in window_settings}, + schedules={a.id: a for a in year_schedules}, + window_constructions={a.id: a for a in window_constructions}, + ) + + bt_dict = bt.to_dict() + + bt_dup = BuildingTemplate.from_dict( + bt_dict, + zone_definitions={a.id: a for a in zone_definitions}, + structure_definitions={a.id: a for a in structure_informations}, + window_settings={a.id: a for a in window_settings}, + schedules={a.id: a for a in year_schedules}, + window_constructions={a.id: a for a in window_constructions}, + ) + + assert bt == bt_dup - idf = other_idf_object - bt = BuildingTemplate.from_idf(idf) - idf2 = other_idf_object_copy - bt_2 = BuildingTemplate.from_idf(idf2) + def test_hash_eq_bt(self, building_template): + """Test equality and hashing of class BuildingTemplate""" + bt = building_template + bt_2 = building_template.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object @@ -2418,12 +3181,12 @@ def test_hash_eq_bt(self, config, other_idf_object, other_idf_object_copy): # don't have the same hash. assert len(set(bt_list)) == 2 - def test_building_template(self, bt): - """ - Args: - bt: - """ - assert bt + def test_reduce(self, zone_definition): + + bt = BuildingTemplate.reduced_model( + "A Building Template", + [zone_definition], + ) class TestUniqueName(object): diff --git a/tests/test_umi.py b/tests/test_umi.py index d26e8f5e..e4d634b4 100644 --- a/tests/test_umi.py +++ b/tests/test_umi.py @@ -7,37 +7,35 @@ from archetypal import IDF, settings from archetypal.eplus_interface.version import get_eplus_dirs -from archetypal.template import ( - BuildingTemplate, - DomesticHotWaterSetting, - GasMaterial, - GlazingMaterial, - MassRatio, - MaterialLayer, - OpaqueConstruction, - OpaqueMaterial, - StructureInformation, - VentilationSetting, - WindowConstruction, - WindowSetting, - ZoneConditioning, - ZoneConstructionSet, - ZoneDefinition, - ZoneLoad, -) +from archetypal.template.building_template import BuildingTemplate +from archetypal.template.conditioning import ZoneConditioning +from archetypal.template.dhw import DomesticHotWaterSetting +from archetypal.template.load import ZoneLoad +from archetypal.template.materials.gas_layer import GasLayer +from archetypal.template.materials.gas_material import GasMaterial +from archetypal.template.materials.glazing_material import GlazingMaterial +from archetypal.template.materials.material_layer import MaterialLayer +from archetypal.template.materials.opaque_material import OpaqueMaterial +from archetypal.template.constructions.opaque_construction import OpaqueConstruction from archetypal.template.schedule import ( DaySchedule, WeekSchedule, YearSchedule, YearSchedulePart, ) +from archetypal.template.structure import MassRatio, StructureInformation +from archetypal.template.ventilation import VentilationSetting +from archetypal.template.constructions.window_construction import WindowConstruction +from archetypal.template.window_setting import WindowSetting +from archetypal.template.zone_construction_set import ZoneConstructionSet +from archetypal.template.zonedefinition import ZoneDefinition from archetypal.umi_template import UmiTemplateLibrary, no_duplicates class TestUmiTemplate: """Test suite for the UmiTemplateLibrary class""" - def test_template_to_template(self, config): + def test_template_to_template(self): """load the json into UmiTemplateLibrary object, then convert back to json and compare""" @@ -65,7 +63,7 @@ def test_umitemplate(self, config): ) data_dict = a.to_dict() - a.to_json() + a.to_dict() assert no_duplicates(data_dict) @pytest.mark.skipif( @@ -81,7 +79,7 @@ def test_umi_samples(self, config): ] wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" a = UmiTemplateLibrary.from_idf_files(idf_source, wf, name="Mixed_Files") - a.to_json() + a.to_dict() data_dict = a.to_dict() assert no_duplicates(data_dict) @@ -123,23 +121,35 @@ def idf(self): yield IDF(prep_outputs=False) @pytest.fixture() - def manual_umitemplate_library(self, config, idf): + def manual_umitemplate_library(self, config): """ Creates Umi template from scratch """ # region Defines materials # Opaque materials concrete = OpaqueMaterial( - Name="Concrete", Conductivity=0.5, SpecificHeat=800, Density=1500, idf=idf + Name="Concrete", + Conductivity=0.5, + SpecificHeat=800, + Density=1500, ) insulation = OpaqueMaterial( - Name="Insulation", Conductivity=0.04, SpecificHeat=1000, Density=30, idf=idf + Name="Insulation", + Conductivity=0.04, + SpecificHeat=1000, + Density=30, ) brick = OpaqueMaterial( - Name="Brick", Conductivity=1, SpecificHeat=900, Density=1900, idf=idf + Name="Brick", + Conductivity=1, + SpecificHeat=900, + Density=1900, ) plywood = OpaqueMaterial( - Name="Plywood", Conductivity=0.13, SpecificHeat=800, Density=540, idf=idf + Name="Plywood", + Conductivity=0.13, + SpecificHeat=800, + Density=540, ) OpaqueMaterials = [concrete, insulation, brick, plywood] @@ -152,17 +162,16 @@ def manual_umitemplate_library(self, config, idf): SolarReflectanceFront=0.5, SolarReflectanceBack=0.5, VisibleTransmittance=0.7, - VisibleReflectanceFront=0.5, - VisibleReflectanceBack=0.5, + VisibleReflectanceFront=0.3, + VisibleReflectanceBack=0.3, IRTransmittance=0.7, IREmissivityFront=0.5, IREmissivityBack=0.5, - idf=idf, ) GlazingMaterials = [glass] # Gas materials - air = GasMaterial(Name="Air", Conductivity=0.02, Density=1.24, idf=idf) + air = GasMaterial(Name="Air", Conductivity=0.02, Density=1.24) GasMaterials = [air] # endregion @@ -178,7 +187,7 @@ def manual_umitemplate_library(self, config, idf): glassLayer = MaterialLayer(glass, Thickness=0.16) # Gas MaterialLayers - airLayer = MaterialLayer(air, Thickness=0.04) + airLayer = GasLayer(air, Thickness=0.04) MaterialLayers = [ concreteLayer, @@ -196,44 +205,31 @@ def manual_umitemplate_library(self, config, idf): wall_int = OpaqueConstruction( Name="wall_int", Layers=[plywoodLayer], - Surface_Type="Partition", - Outside_Boundary_Condition="Zone", - IsAdiabatic=True, - idf=idf, ) wall_ext = OpaqueConstruction( Name="wall_ext", Layers=[concreteLayer, insulationLayer, brickLayer], - Surface_Type="Facade", - Outside_Boundary_Condition="Outdoors", - idf=idf, ) floor = OpaqueConstruction( Name="floor", Layers=[concreteLayer, plywoodLayer], - Surface_Type="Ground", - Outside_Boundary_Condition="Zone", - idf=idf, ) roof = OpaqueConstruction( Name="roof", Layers=[plywoodLayer, insulationLayer, brickLayer], - Surface_Type="Roof", - Outside_Boundary_Condition="Outdoors", - idf=idf, ) OpaqueConstructions = [wall_int, wall_ext, floor, roof] # Window construction window = WindowConstruction( - Name="Window", Layers=[glassLayer, airLayer, glassLayer], idf=idf + Layers=[glassLayer, airLayer, glassLayer], Name="Window" ) WindowConstructions = [window] # Structure definition mass_ratio = MassRatio(Material=plywood, NormalRatio=1, HighLoadRatio=1) struct_definition = StructureInformation( - Name="Structure", MassRatios=[mass_ratio], idf=idf + MassRatios=[mass_ratio], Name="Structure" ) StructureDefinitions = [struct_definition] # endregion @@ -243,35 +239,22 @@ def manual_umitemplate_library(self, config, idf): # Day schedules # Always on sch_d_on = DaySchedule.from_values( - Values=[1] * 24, - Category="Day", - Type="Fraction", - Name="AlwaysOn", - idf=idf, + Name="AlwaysOn", Values=[1] * 24, Type="Fraction", Category="Day" ) # Always off sch_d_off = DaySchedule.from_values( - Values=[0] * 24, - Category="Day", - Type="Fraction", - Name="AlwaysOff", - idf=idf, + Name="AlwaysOff", Values=[0] * 24, Type="Fraction", Category="Day" ) # DHW sch_d_dhw = DaySchedule.from_values( - Values=[0.3] * 24, - Category="Day", - Type="Fraction", - Name="DHW", - idf=idf, + Name="DHW", Values=[0.3] * 24, Type="Fraction", Category="Day" ) # Internal gains sch_d_gains = DaySchedule.from_values( + Name="Gains", Values=[0] * 6 + [0.5, 0.6, 0.7, 0.8, 0.9, 1] + [0.7] * 6 + [0.4] * 6, - Category="Day", Type="Fraction", - Name="Gains", - idf=idf, + Category="Day", ) DaySchedules = [sch_d_on, sch_d_dhw, sch_d_gains, sch_d_off] @@ -282,7 +265,6 @@ def manual_umitemplate_library(self, config, idf): Category="Week", Type="Fraction", Name="AlwaysOn", - idf=idf, ) # Always off sch_w_off = WeekSchedule( @@ -298,7 +280,6 @@ def manual_umitemplate_library(self, config, idf): Category="Week", Type="Fraction", Name="AlwaysOff", - idf=idf, ) # DHW sch_w_dhw = WeekSchedule( @@ -314,7 +295,6 @@ def manual_umitemplate_library(self, config, idf): Category="Week", Type="Fraction", Name="DHW", - idf=idf, ) # Internal gains sch_w_gains = WeekSchedule( @@ -328,89 +308,82 @@ def manual_umitemplate_library(self, config, idf): sch_d_gains, ], Category="Week", - Type="Fractio", + Type="Fraction", Name="Gains", - idf=idf, ) WeekSchedules = [sch_w_on, sch_w_off, sch_w_dhw, sch_w_gains] # Year schedules # Always on dict_on = { + "$id": 1, "Category": "Year", "Parts": [ - YearSchedulePart( - **{ - "FromDay": 1, - "FromMonth": 1, - "ToDay": 31, - "ToMonth": 12, - "Schedule": sch_w_on, - } - ) + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": sch_w_on.to_ref(), + } ], "Type": "Fraction", "Name": "AlwaysOn", - "idf": idf, } - sch_y_on = YearSchedule.from_parts(**dict_on) + sch_y_on = YearSchedule.from_dict(dict_on, {a.id: a for a in WeekSchedules}) # Always off dict_off = { + "$id": 2, "Category": "Year", "Parts": [ - YearSchedulePart( - **{ - "FromDay": 1, - "FromMonth": 1, - "ToDay": 31, - "ToMonth": 12, - "Schedule": sch_w_off, - } - ) + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": sch_w_off.to_ref(), + } ], "Type": "Fraction", "Name": "AlwaysOff", - "idf": idf, } - sch_y_off = YearSchedule.from_parts(**dict_off) + sch_y_off = YearSchedule.from_dict(dict_off, {a.id: a for a in WeekSchedules}) # DHW dict_dhw = { + "$id": 3, "Category": "Year", "Parts": [ - YearSchedulePart( - **{ - "FromDay": 1, - "FromMonth": 1, - "ToDay": 31, - "ToMonth": 12, - "Schedule": sch_w_dhw, - } - ) + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": sch_w_dhw.to_ref(), + } ], "Type": "Fraction", "Name": "DHW", - "idf": idf, } - sch_y_dhw = YearSchedule.from_parts(**dict_dhw) + sch_y_dhw = YearSchedule.from_dict(dict_dhw, {a.id: a for a in WeekSchedules}) # Internal gains dict_gains = { + "$id": 4, "Category": "Year", "Parts": [ - YearSchedulePart( - **{ - "FromDay": 1, - "FromMonth": 1, - "ToDay": 31, - "ToMonth": 12, - "Schedule": sch_w_gains, - } - ) + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": sch_w_gains.to_ref(), + } ], "Type": "Fraction", "Name": "Gains", - "idf": idf, } - sch_y_gains = YearSchedule.from_parts(**dict_gains) + sch_y_gains = YearSchedule.from_dict( + dict_gains, {a.id: a for a in WeekSchedules} + ) YearSchedules = [sch_y_on, sch_y_off, sch_y_dhw, sch_y_gains] # endregion @@ -422,7 +395,6 @@ def manual_umitemplate_library(self, config, idf): AfnWindowAvailability=sch_y_off, ShadingSystemAvailabilitySchedule=sch_y_off, ZoneMixingAvailabilitySchedule=sch_y_off, - idf=idf, ) WindowSettings = [window_setting] # endregion @@ -430,13 +402,13 @@ def manual_umitemplate_library(self, config, idf): # region Defines DHW settings dhw_setting = DomesticHotWaterSetting( - Name="dhw_setting_1", - IsOn=True, WaterSchedule=sch_y_dhw, + IsOn=True, FlowRatePerFloorArea=0.03, WaterSupplyTemperature=65, WaterTemperatureInlet=10, - idf=idf, + area=1, + Name="dhw_setting_1", ) DomesticHotWaterSettings = [dhw_setting] # endregion @@ -444,10 +416,9 @@ def manual_umitemplate_library(self, config, idf): # region Defines ventilation settings vent_setting = VentilationSetting( - Name="vent_setting_1", NatVentSchedule=sch_y_off, ScheduledVentilationSchedule=sch_y_off, - idf=idf, + Name="vent_setting_1", ) VentilationSettings = [vent_setting] # endregion @@ -459,7 +430,6 @@ def manual_umitemplate_library(self, config, idf): HeatingSchedule=sch_y_on, CoolingSchedule=sch_y_on, MechVentSchedule=sch_y_off, - idf=idf, ) ZoneConditionings = [zone_conditioning] # endregion @@ -480,7 +450,6 @@ def manual_umitemplate_library(self, config, idf): IsGroundAdiabatic=False, Facade=wall_ext, IsFacadeAdiabatic=False, - idf=idf, ) # Core zone zone_constr_set_core = ZoneConstructionSet( @@ -496,7 +465,6 @@ def manual_umitemplate_library(self, config, idf): IsGroundAdiabatic=False, Facade=wall_ext, IsFacadeAdiabatic=False, - idf=idf, ) ZoneConstructionSets = [zone_constr_set_perim, zone_constr_set_core] # endregion @@ -504,11 +472,10 @@ def manual_umitemplate_library(self, config, idf): # region Defines zone loads zone_load = ZoneLoad( - Name="zone_load_1", EquipmentAvailabilitySchedule=sch_y_gains, LightsAvailabilitySchedule=sch_y_gains, OccupancySchedule=sch_y_gains, - idf=idf, + Name="zone_load_1", ) ZoneLoads = [zone_load] # endregion @@ -518,7 +485,6 @@ def manual_umitemplate_library(self, config, idf): # Perimeter zone perim = ZoneDefinition( Name="Perim_zone", - idf=idf, Conditioning=zone_conditioning, Constructions=zone_constr_set_perim, DomesticHotWater=dhw_setting, @@ -530,7 +496,6 @@ def manual_umitemplate_library(self, config, idf): # Core zone core = ZoneDefinition( Name="Core_zone", - idf=idf, Conditioning=zone_conditioning, Constructions=zone_constr_set_core, DomesticHotWater=dhw_setting, @@ -550,7 +515,6 @@ def manual_umitemplate_library(self, config, idf): Structure=struct_definition, Windows=window_setting, Name="Building_template_1", - idf=idf, ) BuildingTemplates = [building_template] # endregion @@ -590,34 +554,19 @@ def test_climatestudio(self, climatestudio): ).to_json() print(template_json) - @pytest.mark.skipif( - os.environ.get("CI", "False").lower() == "true", - reason="Skipping this test on CI environment because it needs EnergyPlys 8-7-0", - ) - def test_sf_cz5a(self, config): - from path import Path - - settings.log_console = False - files = Path("tests/input_data/problematic").files("*CZ5A*.idf") - w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - template = UmiTemplateLibrary.from_idf_files( - name="my_umi_template", idf_files=files, as_version="9-2-0", weather=w - ) - template.to_json() - assert no_duplicates(template.to_dict(), attribute="Name") - assert no_duplicates(template.to_dict(), attribute="$id") - - office = [ - "tests/input_data/necb/NECB 2011-SmallOffice-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf", - "tests/input_data/necb/NECB 2011-MediumOffice-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf", - "tests/input_data/necb/NECB 2011-LargeOffice-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf", - ] - @pytest.mark.skipif( os.environ.get("CI", "False").lower() == "true", reason="Skipping this test on CI environment", ) - @pytest.mark.parametrize("file", office, ids=["small", "medium", "large"]) + @pytest.mark.parametrize( + "file", + ( + "tests/input_data/necb/NECB 2011-SmallOffice-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf", + "tests/input_data/necb/NECB 2011-MediumOffice-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf", + "tests/input_data/necb/NECB 2011-LargeOffice-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf", + ), + ids=("small", "medium", "large"), + ) def test_necb_serial(self, file, config): settings.log_console = True w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" @@ -653,7 +602,7 @@ def test_necb_parallel(self, config): weather=w, processors=-1, ) - template.to_json() + template.to_dict() assert no_duplicates(template.to_dict(), attribute="Name") assert no_duplicates(template.to_dict(), attribute="$id") @@ -683,7 +632,6 @@ def test_cz5a_serial(self, file, config): weather=w, processors=1, ) - template.to_json() assert no_duplicates(template.to_dict(), attribute="Name") assert no_duplicates(template.to_dict(), attribute="$id") @@ -698,8 +646,6 @@ def climatestudio(config): if idf.sim_info is None: idf.simulate() - from archetypal.template import BuildingTemplate - bt = BuildingTemplate.from_idf(idf) yield bt @@ -712,7 +658,5 @@ def sf_cz5a(config): w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" idf = IDF(file, epw=w, annual=True) - from archetypal.template import BuildingTemplate - bt = BuildingTemplate.from_idf(idf) yield bt diff --git a/tests/test_zonegraph.py b/tests/test_zonegraph.py index d83177f7..a6db9e3d 100644 --- a/tests/test_zonegraph.py +++ b/tests/test_zonegraph.py @@ -126,4 +126,4 @@ def test_perim_graph(self, G): """ H = G.perim_graph - assert len(H) > 0 # assert G has at least one node \ No newline at end of file + assert len(H) > 0 # assert G has at least one node From b06980c2882ec96850959079f8fe98071f57882f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 07:45:59 -0400 Subject: [PATCH 11/32] Bump tqdm from 4.59.0 to 4.60.0 (#155) Bumps [tqdm](https://github.com/tqdm/tqdm) from 4.59.0 to 4.60.0. - [Release notes](https://github.com/tqdm/tqdm/releases) - [Commits](https://github.com/tqdm/tqdm/compare/v4.59.0...v4.60.0) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 7f2ee9a3..bf10603f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ pycountry==20.7.3 scikit-learn==0.24.1 pandas>=1.2.0 numpy>=1.17 -tqdm==4.59.0 +tqdm==4.60.0 tabulate==0.8.9 path~=15.0.0 click==7.1.2 From 2d55d3fd92319fcb2396f04d714a174817750381 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 07:46:38 -0400 Subject: [PATCH 12/32] Update setuptools requirement from ~=49.6.0 to ~=56.1.0 (#156) Updates the requirements on [setuptools](https://github.com/pypa/setuptools) to permit the latest version. - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/CHANGES.rst) - [Commits](https://github.com/pypa/setuptools/compare/v49.6.0...v56.1.0) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index bf10603f..2cfdb147 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,7 +17,7 @@ pybind11==2.6.2 requests~=2.25.1 packaging~=20.9 pytest~=6.1.2 -setuptools~=49.6.0 +setuptools~=56.1.0 sklearn~=0.0 CoolProp~=6.4.1 energy-pandas==0.2.3 From 8b6134ee78f4815352ea3a2cb859dffd58527820 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 07:46:55 -0400 Subject: [PATCH 13/32] Update outdated requirement from ~=0.2.0 to ~=0.2.1 (#157) Updates the requirements on [outdated](https://github.com/alexmojaki/outdated) to permit the latest version. - [Release notes](https://github.com/alexmojaki/outdated/releases) - [Commits](https://github.com/alexmojaki/outdated/compare/v0.2.1...v0.2.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2cfdb147..e0217ca1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ tqdm==4.60.0 tabulate==0.8.9 path~=15.0.0 click==7.1.2 -outdated~=0.2.0 +outdated~=0.2.1 deprecation==2.1.0 sigfig==1.1.8 pybind11==2.6.2 From 57b0d014f152dba909f60e934e399958843f60b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 07:47:13 -0400 Subject: [PATCH 14/32] Update path requirement from ~=15.0.0 to ~=15.1.2 (#158) Updates the requirements on [path](https://github.com/jaraco/path) to permit the latest version. - [Release notes](https://github.com/jaraco/path/releases) - [Changelog](https://github.com/jaraco/path/blob/main/CHANGES.rst) - [Commits](https://github.com/jaraco/path/compare/v15.0.0...v15.1.2) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e0217ca1..428a8925 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,7 @@ pandas>=1.2.0 numpy>=1.17 tqdm==4.60.0 tabulate==0.8.9 -path~=15.0.0 +path~=15.1.2 click==7.1.2 outdated~=0.2.1 deprecation==2.1.0 From 191d234cb3411ee9c851b59c8daae5d5435d0b72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 11:48:32 +0000 Subject: [PATCH 15/32] Bump scikit-learn from 0.24.1 to 0.24.2 Bumps [scikit-learn](https://github.com/scikit-learn/scikit-learn) from 0.24.1 to 0.24.2. - [Release notes](https://github.com/scikit-learn/scikit-learn/releases) - [Commits](https://github.com/scikit-learn/scikit-learn/compare/0.24.1...0.24.2) Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 428a8925..f3e71670 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ geomeppy==0.11.8 eppy==0.5.56 matplotlib>=3.2 # because of TwoSlopesNorm pycountry==20.7.3 -scikit-learn==0.24.1 +scikit-learn==0.24.2 pandas>=1.2.0 numpy>=1.17 tqdm==4.60.0 From fef85fb9865daf9a295c8cdfaddb1dbbca21540f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 07:49:04 -0400 Subject: [PATCH 16/32] Bump networkx from 2.5 to 2.5.1 (#161) Bumps [networkx](https://github.com/networkx/networkx) from 2.5 to 2.5.1. - [Release notes](https://github.com/networkx/networkx/releases) - [Changelog](https://github.com/networkx/networkx/blob/main/doc/news.rst) - [Commits](https://github.com/networkx/networkx/compare/networkx-2.5...networkx-2.5.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 428a8925..6b42421f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -networkx==2.5 +networkx==2.5.1 geomeppy==0.11.8 eppy==0.5.56 matplotlib>=3.2 # because of TwoSlopesNorm From a27443dc65c9f89c3f32be9c62e6ca8031ed7728 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 11:49:15 +0000 Subject: [PATCH 17/32] Update pytest requirement from ~=6.1.2 to ~=6.2.4 Updates the requirements on [pytest](https://github.com/pytest-dev/pytest) to permit the latest version. - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/6.1.2...6.2.4) Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 428a8925..97cff79f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,7 @@ sigfig==1.1.8 pybind11==2.6.2 requests~=2.25.1 packaging~=20.9 -pytest~=6.1.2 +pytest~=6.2.4 setuptools~=56.1.0 sklearn~=0.0 CoolProp~=6.4.1 From 1150d749db6efd37ad44590c9662dc24a0c185ee Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 7 May 2021 09:36:44 -0400 Subject: [PATCH 18/32] Update python-package.yml --- .github/workflows/python-package.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index dd1f850c..8896676e 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: python-version: [ 3.7, 3.8 ] - os: [ macos-latest, ubuntu-latest, windows-latest ] + os: [ ubuntu-latest ] # later, add macos-latest, windows-latest energyplus-version: [ 9.2.0 ] # later, add 9.4.0 include: - runs-on: ubuntu-latest From 1b1ee7171afbc4d8eaced7c75f7bc4d434374e43 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 7 May 2021 10:27:09 -0400 Subject: [PATCH 19/32] Bump energy-pandas to flexible 0.2.4 (#162) --- requirements.txt | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/requirements.txt b/requirements.txt index 6b42421f..b1b98cbf 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,24 +1,23 @@ -networkx==2.5.1 +networkx~=2.5.1 geomeppy==0.11.8 -eppy==0.5.56 +eppy==0.5.56. # for stability matplotlib>=3.2 # because of TwoSlopesNorm -pycountry==20.7.3 -scikit-learn==0.24.1 +pycountry~=20.7.3 +scikit-learn~=0.24.1 pandas>=1.2.0 numpy>=1.17 -tqdm==4.60.0 -tabulate==0.8.9 +tqdm~=4.60.0 +tabulate~=0.8.9 path~=15.1.2 -click==7.1.2 +click~=7.1.2 outdated~=0.2.1 -deprecation==2.1.0 -sigfig==1.1.8 -pybind11==2.6.2 +deprecation~=2.1.0 +sigfig~=1.1.8 requests~=2.25.1 packaging~=20.9 pytest~=6.1.2 setuptools~=56.1.0 sklearn~=0.0 CoolProp~=6.4.1 -energy-pandas==0.2.3 -validator_collection==1.5.0 \ No newline at end of file +energy-pandas~=0.2.4 +validator_collection~=1.5.0 From 6ef1b4e62a1da2fbb59ea7c1ee0df7cf81e0cb41 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 7 May 2021 12:02:22 -0400 Subject: [PATCH 20/32] fixes requirements --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index e7e6eff1..9f29d87e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ networkx~=2.5.1 geomeppy==0.11.8 -eppy==0.5.56. # for stability -matplotlib>=3.2 # because of TwoSlopesNorm +eppy==0.5.56 # for stability +matplotlib~=3.2 # because of TwoSlopesNorm pycountry~=20.7.3 scikit-learn~=0.24.1 pandas>=1.2.0 From 86e8cf7b4f7de051f8713b59409aba3a02bf9248 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 12:51:39 -0400 Subject: [PATCH 21/32] Update scikit-learn requirement from ~=0.24.1 to ~=0.24.2 (#163) Updates the requirements on [scikit-learn](https://github.com/scikit-learn/scikit-learn) to permit the latest version. - [Release notes](https://github.com/scikit-learn/scikit-learn/releases) - [Commits](https://github.com/scikit-learn/scikit-learn/compare/0.24.1...0.24.2) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9f29d87e..85b08033 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ geomeppy==0.11.8 eppy==0.5.56 # for stability matplotlib~=3.2 # because of TwoSlopesNorm pycountry~=20.7.3 -scikit-learn~=0.24.1 +scikit-learn~=0.24.2 pandas>=1.2.0 numpy>=1.17 tqdm~=4.60.0 From a85cb7475299bf744cfa981d7bb8d0416bc4a7f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 May 2021 12:51:50 -0400 Subject: [PATCH 22/32] Update matplotlib requirement from ~=3.2 to ~=3.4 (#164) Updates the requirements on [matplotlib](https://github.com/matplotlib/matplotlib) to permit the latest version. - [Release notes](https://github.com/matplotlib/matplotlib/releases) - [Commits](https://github.com/matplotlib/matplotlib/compare/v3.2.0...v3.4.1) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 85b08033..2e4af6ce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ networkx~=2.5.1 geomeppy==0.11.8 eppy==0.5.56 # for stability -matplotlib~=3.2 # because of TwoSlopesNorm +matplotlib~=3.4 # because of TwoSlopesNorm pycountry~=20.7.3 scikit-learn~=0.24.2 pandas>=1.2.0 From 114f5bb783680dfff3ffa309a85ae158642de98f Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 7 May 2021 14:07:07 -0400 Subject: [PATCH 23/32] attribution --- .../template/constructions/base_construction.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/archetypal/template/constructions/base_construction.py b/archetypal/template/constructions/base_construction.py index 817eea9b..1f79d505 100644 --- a/archetypal/template/constructions/base_construction.py +++ b/archetypal/template/constructions/base_construction.py @@ -1,4 +1,10 @@ -"""archetypal ConstructionBase and LayeredConstruction.""" +"""archetypal ConstructionBase and LayeredConstruction. + +Notes: + Thank you to `honeybee-energy` for implementing heat transfer coefficient + formulas from ISO. Those where adapted to the structure of the + archetypal.template module. +""" import math from typing import List, Union @@ -247,8 +253,7 @@ def in_h(self, t_kelvin=293.15, delta_t=15, height=1.0, angle=90, pressure=10132 def in_h_c( self, t_kelvin=293.15, delta_t=15, height=1.0, angle=90, pressure=101325 ): - """Get the detailed indoor convective heat transfer coefficient according to - ISO 15099. + """Get detailed indoor convective heat transfer coef. according to ISO 15099. This is used for window U-factor calculations and all of the temperature_profile calculations. From c26bf1f0b131fc4e5debf4c055a5a31c0558a8d6 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 7 May 2021 14:15:10 -0400 Subject: [PATCH 24/32] better docstrings --- .../constructions/window_construction.py | 22 ++++++++++++++----- archetypal/umi_template.py | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/archetypal/template/constructions/window_construction.py b/archetypal/template/constructions/window_construction.py index 908387bf..046a13b9 100644 --- a/archetypal/template/constructions/window_construction.py +++ b/archetypal/template/constructions/window_construction.py @@ -633,15 +633,25 @@ def _layered_r_value( r_vals.append(1 / self.in_h(avg_temp, delta_t, height, angle, pressure)) return r_vals - def shgc(self, environmental_conditions="summer", G_t=783): + def shgc(self, environmental_conditions="summer", global_radiation=783): """Calculate the shgc given environmental conditions. + Notes: + This method implements a heat balance at each interface of the + glazing unit including outside and inside air film resistances, + solar radiation absorption in the glass. See + :meth:`~archetypal.template.constructions.window_construction + .WindowConstruction.heat_balance` for more details. + Args: - environmental_conditions: "summer" or "winter". - G_t: Incident solar radiation [W / m ^ 2] + environmental_conditions (str): "summer" or "winter". A window shgc is + usually calculated with summer conditions. Default is "summer". + global_radiation (float): Incident solar radiation [W / m ^ 2]. Overwrite + the solar radiation used in the calculation of the shgc. Returns: - tuple + float: The shgc of the window construction for the given environmental + conditions. """ # Q_dot_noSun heat_transfers, temperature_profile = self.heat_balance( @@ -655,8 +665,8 @@ def shgc(self, environmental_conditions="summer", G_t=783): ) *_, Q_dot_i4 = heat_transfers - Q_dot_sun = -Q_dot_i4 + self.solar_transmittance * G_t - shgc = (Q_dot_sun - -Q_dot_noSun) / G_t + Q_dot_sun = -Q_dot_i4 + self.solar_transmittance * global_radiation + shgc = (Q_dot_sun - -Q_dot_noSun) / global_radiation return shgc def heat_balance(self, environmental_conditions="summer", G_t=783): diff --git a/archetypal/umi_template.py b/archetypal/umi_template.py index a776995f..e1c5d633 100644 --- a/archetypal/umi_template.py +++ b/archetypal/umi_template.py @@ -655,7 +655,7 @@ def update_components_list(self, exceptions=None): obj_list.append(child) def build_graph(self): - """Create a :class:`networkx.DiGraph` of UmiTemplate.""" + """Create the :class:`networkx.DiGraph` UmiBase objects as nodes.""" import networkx as nx G = nx.DiGraph() From 35ac83b03a824c0f9fd04fe1de10eb27bbc9a2b2 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 7 May 2021 14:15:28 -0400 Subject: [PATCH 25/32] removes unnecessary method --- tests/test_template.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/test_template.py b/tests/test_template.py index da889946..69541a3b 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -1595,12 +1595,6 @@ def test_shgc(self, b_glass_clear_3): print("q_no_sun", (32 - 24) / sum(r_values)) print("q_sun", triple.solar_transmittance * 783) - def q_dot_at_outside_layer(layer: LayeredConstruction, t_1, t_out): - epsilon = layer.Layers[0].Material.ThermalEmittance - sigma = 5.670e-8 # [W/m2-K4] - - epsilon * sigma * ((t_1 + 273) ** 4 - (t_out + 273) ** 4) - def test_from_simple_glazing(self): """Test from shgc and u-value.""" window = WindowConstruction.from_shgc("Window 1", 0.763, 2.716, 0.812) From 403282fd07d62e1e26181dc444077a7ee3193df7 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Fri, 7 May 2021 14:17:52 -0400 Subject: [PATCH 26/32] Fixes warning --- archetypal/template/ventilation.py | 2 +- tests/test_template.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/archetypal/template/ventilation.py b/archetypal/template/ventilation.py index 118bc8a5..5a512f60 100644 --- a/archetypal/template/ventilation.py +++ b/archetypal/template/ventilation.py @@ -114,7 +114,7 @@ def __init__( (Day | Week | Year) which ultimately modifies the Opening Area value. In its current implementation, any value greater than 0 will consider an open window. - ScheduledVentilationSchedule (UmiSchedule): The name of + ScheduledVentilationSchedule (UmiSchedule, optional): The name of the schedule (Schedules Tab) that modifies the maximum design volume flow rate. This fraction is between 0.0 and 1.0. Afn (bool): Todo: Not Used. diff --git a/tests/test_template.py b/tests/test_template.py index 69541a3b..cff320c1 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -2384,9 +2384,9 @@ def test_combine_with_none(self): always_on = UmiSchedule.constant_schedule() always_half = UmiSchedule.constant_schedule(0.5, Name="AlwaysHalf") vent_1 = VentilationSetting( - Infiltration=None, + Infiltration=0, NatVentSchedule=always_on, - ScheduledVentilationAch=None, + ScheduledVentilationAch=0, ScheduledVentilationSchedule=None, IsScheduledVentilationOn=False, area=50, From 64aa9640e2d6e5dfaa3769e0f51d9c8785019863 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 09:00:39 -0400 Subject: [PATCH 27/32] Update setuptools requirement from ~=56.1.0 to ~=56.2.0 (#166) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2e4af6ce..16056c6a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,7 @@ sigfig~=1.1.8 requests~=2.25.1 packaging~=20.9 pytest~=6.2.4 -setuptools~=56.1.0 +setuptools~=56.2.0 sklearn~=0.0 CoolProp~=6.4.1 energy-pandas~=0.2.4 From 38182b2e0bc26f4b0738541b3811ae0d3b65150a Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Tue, 11 May 2021 09:25:41 -0400 Subject: [PATCH 28/32] removes docs for BUI --- docs/converter_bui.rst | 181 ----------------------------------------- docs/converting.rst | 5 +- 2 files changed, 1 insertion(+), 185 deletions(-) delete mode 100644 docs/converter_bui.rst diff --git a/docs/converter_bui.rst b/docs/converter_bui.rst deleted file mode 100644 index 8398c9b6..00000000 --- a/docs/converter_bui.rst +++ /dev/null @@ -1,181 +0,0 @@ -Converting IDF to BUI ---------------------- - -.. figure:: images/converter@2x.png - :alt: converter logo - :width: 100% - :align: center - -The necessity of translating IDF files (EnergyPlus_ input files) to BUI files (TRNBuild_ input files) emerged from the -need of modeling building archetypes [#]_. Knowing that a lot of different models from different sources (NECB_ and US-DOE_) -have already been developed under EnergyPlus, and it can be a tedious task to create a multizone building in a model -editor (e.g. TRNBuild), we assume the development of a file translator could be useful for simulationists. - -Objectives -.......... - -The principal objectives of this module was to translate (from IDF to BUI) the geometry of the building, the different schedules used in -the model, and the thermal gains. - -1. Geometry - -The building geometry is kept with all the zoning, the different surfaces (construction and windows) and the thermal -properties of the walls. The thermal properties of windows are not from the IDF, but chosen by the user. The user gives -a U-value, a SHGC value and Tvis value. Then a window is chosen in the Berkeley Lab library (library used in TRNBuild). -For more information, see the methodology_ section please. - -2. Schedules - -All schedules from the IDF file are translated. The translator is able to process all schedule types defined by -EnergyPlus (see the different schedule_ types for more information). Only day and week schedules are written in the output -BUI file - -3. Gains - -Internal thermal gains such as “people”, “lights” and “equipment” are translated from the IDF file to the BUI file. - -4. Conditioning - -Heating and cooling demands are translated from the IDF file to the BUI file such as power per floor area (W/m²) and a temperature setpoint. -The temperature set-point is the set-point at the peak time for heating (or cooling). - -Methodology -........... - -The module is divided in 2 major operations. The first one consist in translating the IDF file from EnergyPlus, to an -IDF file proper to an input file for TRNBuild (T3D file), usually created by the TRNSYS plugin "Trnsys3D_" in SketchUp. -The second operation is the conversion of the IDF file for TRNBuild to a BUI file done with the executable trnsidf.exe -(installed by default in the TRNSYS installation folder: `C:TRNSYS18\\Building\\trnsIDF\\`) - -1. IDF to T3D - -The conversion from the IDF EnergyPlus file to the IDF TRNBuild file (called here T3D file) is the important part of -the module, which uses the Eppy_ python package, allowing, with object classes, to find the IDF objects, modify them if -necessary and re-transcribe them in the T3D file - -2. T3D to BUI - -The operation to convert the T3D file to the BUI file is done by running the trnsidf.exe executable with a command -line. After this operation, the infiltration rate, internal gains and conditioning systems are written in the "REGIME" -section of each zone in the BUI file. - -How to convert an IDF file -.......................... - -Converting an IDF file to a BUI file is done using the terminal with a command line. First, open the Command Prompt on Windows -or the Terminal on Mac. Note that if you used Anaconda to install python on your machine, you will most likely avoid some issues -by using the Anaconda Prompt instead. - -Then simply run the following command: - -.. code-block:: python - - archetypal convert [OPTIONS] IDF_FILE WEATHER_FILE OUTPUT_FOLDER - -1. ``IDF_FILE`` is the file path of the IDF file to convert. If there are space characters in the path, it should be -enclosed in quotation marks. - -2. ``WEATHER_FILE`` is the file path of the weather file to use to run the EnergyPlus simulation. If there are space characters in the path, it should be -enclosed in quotation marks. - -3. ``OUTPUT_FOLDER`` is the folder where we want the output folders to be written. If there are space characters in -the path, it should enclosed in quotation marks. If output folder path is passed, it must exist. -If nothing is passed, the output folder will be the current working directory. - -Here is an example. Make sure to replace the last two arguments with the idf file path and the output folder path -respectively. - -.. code-block:: python - - archetypal convert "/Users/Documents/NECB 2011 - Warehouse.idf" "/Users/Documents/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" "/Users/Documents/WIP" - -4. `OPTIONS`: There are different options to the `convert` command. The first 3 manage the requested output files. -Users can chose to return a combination of flags - - - if ``-i`` is added, the path to the modified IDF file is returned in the console, and the modified IDF file is - returned in the output folder. If ``-t`` is added, the path to the T3D file (converted from the IDF file) is - returned. If ``-d`` is added, the DCK file (TRNSYS input file) is returned in the output folder, and the path to - this DCK file is returned in the console. - - .. code-block:: python - - archetypal convert -i -t -d "/Users/Documents/NECB 2011 - Warehouse.idf" "/Users/Documents/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" "/Users/Documents/WIP" - - - ``--window_lib`` is the path of the window library (W74-lib.dat). This library must be in the same format as the - Berkeley Lab library used by default in TRNBuild. If nothing is passed, the "W74-lib.dat" file available in the - package "ressources" folder will be used. - - .. code-block:: python - - archetypal convert --window_lib "/Users/Documents/W74-lib.dat" "/Users/Documents/NECB 2011 - Warehouse.idf" "/Users/Documents/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" "/Users/Documents/WIP" - - - ``--trnsidf_exe`` is the path of the trnsidf.exe executable. Usually located in the TRNSYS18 folder under - "Building/trnsIDF/trnsidf.exe". - If nothing is passed, the following path will be used : "C:TRNSYS18\\Building\\trnsIDF\\trnsidf.exe". - - .. code-block:: python - - archetypal convert --trnsidf_exe "C:TRNSYS18\\Building\\trnsIDF\\trnsidf.exe" "/Users/Documents/NECB 2011 - Warehouse.idf" "/Users/Documents/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" "/Users/Documents/WIP" - - - ``--template`` is the path of the .d18 template file (usually in the same directory as the `trnsidf.exe` executable). - If nothing is passed, the following path will be used : "C:TRNSYS18\\Building\\trnsIDF\\NewFileTemplate.d18". - - .. code-block:: python - - archetypal convert --template "C:TRNSYS18\\Building\\trnsIDF\\NewFileTemplate.d18" "/Users/Documents/NECB 2011 - Warehouse.idf" "/Users/Documents/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" "/Users/Documents/WIP" - - - ``--log_clear_names`` if added, do not print log of "clear_names" (equivalence between old and new names) in - the console. - - .. code-block:: python - - archetypal convert --log_clear_names "/Users/Documents/NECB 2011 - Warehouse.idf" "/Users/Documents/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" "/Users/Documents/WIP" - - - ``--window`` specifies the window properties . - If nothing is passed, the following values will be used : 2.2 0.65 0.8 0.05 0.15 8.17 - - .. code-block:: python - - archetypal convert --window 2.2 0.65 0.8 0.05 0.15 8.17 "/Users/Documents/NECB 2011 - Warehouse.idf" "/Users/Documents/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" "/Users/Documents/WIP" - - - ``--ordered`` sorts the idf object names - - .. code-block:: python - - archetypal convert --ordered "/Users/Documents/NECB 2011 - Warehouse.idf" "/Users/Documents/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" "/Users/Documents/WIP" - - - If ``--nonum`` is added, do not renumber surfaces in BUI. If ``--batchjob`` or ``-N`` is added, does BatchJob Modus when running trnsidf.exe. - ``--geofloor`` must be followed by a float between 0 and 1, and generates GEOSURF values for distributing direct solar radiation where `geo_floor` % is directed to the floor, - the rest to walls/windows. If ``--refarea`` is added, updates floor reference area of airnodes. If ``--volume`` is added, updates volume of airnodes. - If ``--capacitance`` is added, updates capacitance of airnodes. All those options are used when running trnsidf.exe (converting T3D file to BUI file). - - .. code-block:: python - - archetypal convert --nonum -N --geofloor 0.6 --refarea --volume --capacitance "/Users/Documents/NECB 2011 - Warehouse.idf" "/Users/Documents/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" "/Users/Documents/WIP" - - - ``-h`` Shows the "help" message - - .. code-block:: python - - archetypal convert -h - -.. [#] Archetype: building model representing a type of building based on its geometry, thermal properties and its - usage. Usually used to create urban building model by assigning different archetypes to represent at best the - building stock we want to model. - -Equivalence between idf object names when converting a file -........................................................... - -.. csv-table:: Equivalences - :file: ./_static/name_equivalence.csv - :header-rows: 1 - - -.. _EnergyPlus: https://energyplus.net -.. _TRNBuild: http://www.trnsys.com/features/suite-of-tools.php -.. _NECB: https://github.com/canmet-energy/necb_2011_reference_buildings/tree/master/osm_files -.. _US-DOE: https://www.energycodes.gov/development/commercial/prototype_models -.. _schedule: https://bigladdersoftware.com/epx/docs/8-9/input-output-reference/group-schedules.html#group-schedules -.. _Trnsys3D: https://www.trnsys.de/docs/trnsys3d/trnsys3d_uebersicht_en.htm -.. _Eppy: https://pythonhosted.org/eppy/Main_Tutorial.html - diff --git a/docs/converting.rst b/docs/converting.rst index b059bed8..01527296 100644 --- a/docs/converting.rst +++ b/docs/converting.rst @@ -1,9 +1,6 @@ Converting IDF models ===================== -EnergyPlus models can be converted to two different other formats using `archetypal`. TRNSYS users can convert IDF -files to TRNBuild/Type56 files while UMI users can convert IDF files to UMI Template Files. - -.. include:: converter_bui.rst +EnergyPlus models can be converted to umi template library files using `archetypal`. .. include:: converter_umi.rst From 2420ee1bed730058a8b1e3eacafe18a83269cf7b Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Tue, 11 May 2021 11:53:13 -0400 Subject: [PATCH 29/32] Updates docs --- archetypal/schedule.py | 1 + archetypal/template/__init__.py | 32 ++ archetypal/template/conditioning.py | 1 + .../constructions/opaque_construction.py | 1 + archetypal/template/ventilation.py | 1 + archetypal/template/zone_construction_set.py | 1 + docs/creating_umi_template.rst | 450 +++++++++--------- docs/package_modules.rst | 91 +--- 8 files changed, 279 insertions(+), 299 deletions(-) diff --git a/archetypal/schedule.py b/archetypal/schedule.py index 52781d96..108bcf9d 100644 --- a/archetypal/schedule.py +++ b/archetypal/schedule.py @@ -117,6 +117,7 @@ def from_dict(cls, data): data: ScheduleTypeLimit dictionary following the format below. .. code-block:: python + { "Name": 'Fractional', "LowerLimit": 0, diff --git a/archetypal/template/__init__.py b/archetypal/template/__init__.py index c126d4cc..eb513564 100644 --- a/archetypal/template/__init__.py +++ b/archetypal/template/__init__.py @@ -1 +1,33 @@ """archetypal umi template library.""" + +__all__ = [ + "BuildingTemplate", + "ZoneConditioning", + "DomesticHotWaterSetting", + "GasMaterial", + "GlazingMaterial", + "ZoneLoad", + "OpaqueConstruction", + "OpaqueMaterial", + "UmiSchedule", + "StructureInformation", + "VentilationSetting", + "WindowConstruction", + "WindowSetting", + "ZoneDefinition", + "ZoneConstructionSet", +] + +from archetypal.template.building_template import BuildingTemplate +from archetypal.template.conditioning import ZoneConditioning +from archetypal.template.constructions.opaque_construction import OpaqueConstruction +from archetypal.template.constructions.window_construction import WindowConstruction +from archetypal.template.dhw import DomesticHotWaterSetting +from archetypal.template.load import ZoneLoad +from archetypal.template.materials import GasMaterial, GlazingMaterial, OpaqueMaterial +from archetypal.template.schedule import UmiSchedule +from archetypal.template.structure import StructureInformation +from archetypal.template.ventilation import VentilationSetting +from archetypal.template.window_setting import WindowSetting +from archetypal.template.zone_construction_set import ZoneConstructionSet +from archetypal.template.zonedefinition import ZoneDefinition diff --git a/archetypal/template/conditioning.py b/archetypal/template/conditioning.py index 95945dc4..208c4747 100644 --- a/archetypal/template/conditioning.py +++ b/archetypal/template/conditioning.py @@ -634,6 +634,7 @@ def from_dict(cls, data, schedules, **kwargs): **kwargs: keywords passed to parent constructor. .. code-block:: python + { "$id": "165", "CoolingSchedule": { $ref: "1" }, diff --git a/archetypal/template/constructions/opaque_construction.py b/archetypal/template/constructions/opaque_construction.py index 542420ea..f5a1b0b8 100644 --- a/archetypal/template/constructions/opaque_construction.py +++ b/archetypal/template/constructions/opaque_construction.py @@ -340,6 +340,7 @@ def from_dict(cls, data, materials, **kwargs): materials (dict): A dictionary of materials with their id as keys. .. code-block:: python + materials = {} # dict of materials. data = { "$id": "140300770659680", diff --git a/archetypal/template/ventilation.py b/archetypal/template/ventilation.py index 5a512f60..100835df 100644 --- a/archetypal/template/ventilation.py +++ b/archetypal/template/ventilation.py @@ -452,6 +452,7 @@ def from_dict(cls, data, schedules, **kwargs): **kwargs: keywords passed parent constructor. .. code-block:: python + { "$id": "162", "Afn": false, diff --git a/archetypal/template/zone_construction_set.py b/archetypal/template/zone_construction_set.py index 49bbe3cd..5a5a1a93 100644 --- a/archetypal/template/zone_construction_set.py +++ b/archetypal/template/zone_construction_set.py @@ -323,6 +323,7 @@ def from_dict(cls, data, opaque_constructions, **kwargs): **kwargs: keywords passed parent constructor. .. code-block:: python + { "$id": "168", "Facade": { diff --git a/docs/creating_umi_template.rst b/docs/creating_umi_template.rst index 6d4a41a4..b58fb966 100644 --- a/docs/creating_umi_template.rst +++ b/docs/creating_umi_template.rst @@ -157,7 +157,7 @@ Example of GasMaterial object: GasMaterials = [air] Defining material layers ------------------- +------------------------ Once the materials are created, layers (or :class:`MaterialLayer` objects) can be created. Here are the parameters and their default values for an MaterialLayer object @@ -293,14 +293,14 @@ Example of StructureInformation object: Defining schedules ------------------ - Creating Umi template objects to define schedules (e.g. `DaySchedule`). +Creating Umi template objects to define schedules (e.g. `DaySchedule`). - - Day schedules +- Day schedules - Here are all the parameters and their default values for an - DaySchedule object (see DaySchedule_ doc for more information) + Here are all the parameters and their default values for a + :class:`~schedule.DaySchedule` object (see :class:`~schedule.DaySchedule` doc for more information) - .. code-block:: python + .. code-block:: python def __init__( Name=None, @@ -313,232 +313,232 @@ Defining schedules values=None, **kwargs) - Example of DaySchedule objects: + Example of :class:`~schedule.DaySchedule` objects: + + .. code-block:: python + + # Always on + sch_d_on = ar.DaySchedule.from_values( + [1] * 24, Category="Day", schTypeLimitsName="Fractional", Name="AlwaysOn") + # Always off + sch_d_off = ar.DaySchedule.from_values( + [0] * 24, Category="Day", schTypeLimitsName="Fractional", Name="AlwaysOff") + # DHW + sch_d_dhw = ar.DaySchedule.from_values( + [0.3] * 24, Category="Day", schTypeLimitsName="Fractional", Name="DHW") + # Internal gains + sch_d_gains = ar.DaySchedule.from_values( + [0] * 6 + [0.5, 0.6, 0.7, 0.8, 0.9, 1] + [0.7] * 6 + [0.4] * 6, + Category="Day", + schTypeLimitsName="Fractional", + Name="Gains",) + # List of DaySchedule objects (needed for Umi template creation) + DaySchedules = [sch_d_on, sch_d_dhw, sch_d_gains, sch_d_off] + +- Week schedules + + Here are all the parameters and their default values for a + :class:`~schedule.WeekSchedule` object (see :class:`~schedule.WeekSchedule` doc for more information) - .. code-block:: python + .. code-block:: python - # Always on - sch_d_on = ar.DaySchedule.from_values( - [1] * 24, Category="Day", schTypeLimitsName="Fractional", Name="AlwaysOn") - # Always off - sch_d_off = ar.DaySchedule.from_values( - [0] * 24, Category="Day", schTypeLimitsName="Fractional", Name="AlwaysOff") - # DHW - sch_d_dhw = ar.DaySchedule.from_values( - [0.3] * 24, Category="Day", schTypeLimitsName="Fractional", Name="DHW") - # Internal gains - sch_d_gains = ar.DaySchedule.from_values( - [0] * 6 + [0.5, 0.6, 0.7, 0.8, 0.9, 1] + [0.7] * 6 + [0.4] * 6, - Category="Day", - schTypeLimitsName="Fractional", - Name="Gains",) - # List of DaySchedule objects (needed for Umi template creation) - DaySchedules = [sch_d_on, sch_d_dhw, sch_d_gains, sch_d_off] + def __init__( + Name=None, + idf=None, + start_day_of_the_week=0, + strict=False, + base_year=2018, + schType=None, + schTypeLimitsName=None, + values=None, + **kwargs) - - Week schedules + Example of :class:`~schedule.WeekSchedule` objects: + + .. code-block:: python + + # WeekSchedules using DaySchedule objects + # Variable `days` needs a list of 7 dict, + # representing the 7 days of the week + sch_w_on = ar.WeekSchedule( + days=[ + {"$ref": sch_d_on.id}, + {"$ref": sch_d_on.id}, + {"$ref": sch_d_on.id}, + {"$ref": sch_d_on.id}, + {"$ref": sch_d_on.id}, + {"$ref": sch_d_on.id}, + {"$ref": sch_d_on.id},], + Category="Week", + schTypeLimitsName="Fractional", + Name="AlwaysOn") + # Always off + sch_w_off = ar.WeekSchedule( + days=[ + {"$ref": sch_d_off.id}, + {"$ref": sch_d_off.id}, + {"$ref": sch_d_off.id}, + {"$ref": sch_d_off.id}, + {"$ref": sch_d_off.id}, + {"$ref": sch_d_off.id}, + {"$ref": sch_d_off.id},], + Category="Week", + schTypeLimitsName="Fractional", + Name="AlwaysOff") + # DHW + sch_w_dhw = ar.WeekSchedule( + days=[ + {"$ref": sch_d_dhw.id}, + {"$ref": sch_d_dhw.id}, + {"$ref": sch_d_dhw.id}, + {"$ref": sch_d_dhw.id}, + {"$ref": sch_d_dhw.id}, + {"$ref": sch_d_dhw.id}, + {"$ref": sch_d_dhw.id},], + Category="Week", + schTypeLimitsName="Fractional", + Name="DHW") + # Internal gains + sch_w_gains = ar.WeekSchedule( + days=[ + {"$ref": sch_d_gains.id}, + {"$ref": sch_d_gains.id}, + {"$ref": sch_d_gains.id}, + {"$ref": sch_d_gains.id}, + {"$ref": sch_d_gains.id}, + {"$ref": sch_d_gains.id}, + {"$ref": sch_d_gains.id},], + Category="Week", + schTypeLimitsName="Fractional", + Name="Gains") + # List of WeekSchedule objects (needed for Umi template creation) + WeekSchedules = [sch_w_on, sch_w_off, sch_w_dhw, sch_w_gains] + + WeekSchedule object can also be created from a dictionary. + For example, we create a WeekSchedule `AlwaysOn` from a dictionary and + using DaySchedule `AlwaysOn` objects: + + .. code-block:: python + + # Dict of a WeekSchedule (like it would be written in json file) + dict_w_on = { + "Category": "Week", + "Days": [ + {"$ref": sch_d_on.id}, + {"$ref": sch_d_off.id}, + {"$ref": sch_d_on.id}, + {"$ref": sch_d_off.id}, + {"$ref": sch_d_on.id}, + {"$ref": sch_d_off.id}, + {"$ref": sch_d_on.id}, + ], + "Type": "Fraction", + "Name": "OnOff_2"} + # Creates WeekSchedule from dict (from json) + sch_w_on = ar.WeekSchedule.from_dict(**dict_w_on) + +- Year schedules - Here are all the parameters and their default values for an - WeekSchedule object (see WeekSchedule_ doc for more information) + Here are all the parameters and their default values for an + YearSchedule object (see YearSchedule_ doc for more information) - .. code-block:: python + .. code-block:: python - def __init__( - Name=None, - idf=None, - start_day_of_the_week=0, - strict=False, - base_year=2018, - schType=None, - schTypeLimitsName=None, - values=None, - **kwargs) + def __init__( + Name=None, + idf=None, + start_day_of_the_week=0, + strict=False, + base_year=2018, + schType=None, + schTypeLimitsName=None, + values=None, + **kwargs) - Example of WeekSchedule objects: - - .. code-block:: python - - # WeekSchedules using DaySchedule objects - # Variable `days` needs a list of 7 dict, - # representing the 7 days of the week - sch_w_on = ar.WeekSchedule( - days=[ - {"$ref": sch_d_on.id}, - {"$ref": sch_d_on.id}, - {"$ref": sch_d_on.id}, - {"$ref": sch_d_on.id}, - {"$ref": sch_d_on.id}, - {"$ref": sch_d_on.id}, - {"$ref": sch_d_on.id},], - Category="Week", - schTypeLimitsName="Fractional", - Name="AlwaysOn") - # Always off - sch_w_off = ar.WeekSchedule( - days=[ - {"$ref": sch_d_off.id}, - {"$ref": sch_d_off.id}, - {"$ref": sch_d_off.id}, - {"$ref": sch_d_off.id}, - {"$ref": sch_d_off.id}, - {"$ref": sch_d_off.id}, - {"$ref": sch_d_off.id},], - Category="Week", - schTypeLimitsName="Fractional", - Name="AlwaysOff") - # DHW - sch_w_dhw = ar.WeekSchedule( - days=[ - {"$ref": sch_d_dhw.id}, - {"$ref": sch_d_dhw.id}, - {"$ref": sch_d_dhw.id}, - {"$ref": sch_d_dhw.id}, - {"$ref": sch_d_dhw.id}, - {"$ref": sch_d_dhw.id}, - {"$ref": sch_d_dhw.id},], - Category="Week", - schTypeLimitsName="Fractional", - Name="DHW") - # Internal gains - sch_w_gains = ar.WeekSchedule( - days=[ - {"$ref": sch_d_gains.id}, - {"$ref": sch_d_gains.id}, - {"$ref": sch_d_gains.id}, - {"$ref": sch_d_gains.id}, - {"$ref": sch_d_gains.id}, - {"$ref": sch_d_gains.id}, - {"$ref": sch_d_gains.id},], - Category="Week", - schTypeLimitsName="Fractional", - Name="Gains") - # List of WeekSchedule objects (needed for Umi template creation) - WeekSchedules = [sch_w_on, sch_w_off, sch_w_dhw, sch_w_gains] - - WeekSchedule object can also be created from a dictionary. - For example, we create a WeekSchedule `AlwaysOn` from a dictionary and - using DaySchedule `AlwaysOn` objects: - - .. code-block:: python - - # Dict of a WeekSchedule (like it would be written in json file) - dict_w_on = { - "Category": "Week", - "Days": [ - {"$ref": sch_d_on.id}, - {"$ref": sch_d_off.id}, - {"$ref": sch_d_on.id}, - {"$ref": sch_d_off.id}, - {"$ref": sch_d_on.id}, - {"$ref": sch_d_off.id}, - {"$ref": sch_d_on.id}, + YearSchedule are created from dictionaries. + For example, we create YearSchedules from dictionaries and + using WeekSchedule objects: + + .. code-block:: python + + # YearSchedules using DaySchedule objects + # Always on + dict_on = { + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": {"$ref": sch_w_on.id} + }], + "Type": "Fraction", + "Name": "AlwaysOn"} + sch_y_on = ar.YearSchedule.from_dict(**dict_on) + # Always off + dict_off = { + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": {"$ref": sch_w_off.id}}], + "Type": "Fraction", + "Name": "AlwaysOff"} + sch_y_off = ar.YearSchedule.from_dict(**dict_off) + # Year ON/OFF + dict_on_off = { + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 5, + "Schedule": {"$ref": sch_w_on.id} + }, + { + "FromDay": 1, + "FromMonth": 6, + "ToDay": 31, + "ToMonth": 12, + "Schedule": {"$ref": sch_w_off.id} + } ], - "Type": "Fraction", - "Name": "OnOff_2"} - # Creates WeekSchedule from dict (from json) - sch_w_on = ar.WeekSchedule.from_dict(**dict_w_on) - - - Year schedules - - Here are all the parameters and their default values for an - YearSchedule object (see YearSchedule_ doc for more information) - - .. code-block:: python - - def __init__( - Name=None, - idf=None, - start_day_of_the_week=0, - strict=False, - base_year=2018, - schType=None, - schTypeLimitsName=None, - values=None, - **kwargs) - - YearSchedule are created from dictionaries. - For example, we create YearSchedules from dictionaries and - using WeekSchedule objects: - - .. code-block:: python - - # YearSchedules using DaySchedule objects - # Always on - dict_on = { - "Category": "Year", - "Parts": [ - { - "FromDay": 1, - "FromMonth": 1, - "ToDay": 31, - "ToMonth": 12, - "Schedule": {"$ref": sch_w_on.id} - }], - "Type": "Fraction", - "Name": "AlwaysOn"} - sch_y_on = ar.YearSchedule.from_dict(**dict_on) - # Always off - dict_off = { - "Category": "Year", - "Parts": [ - { - "FromDay": 1, - "FromMonth": 1, - "ToDay": 31, - "ToMonth": 12, - "Schedule": {"$ref": sch_w_off.id}}], - "Type": "Fraction", - "Name": "AlwaysOff"} - sch_y_off = ar.YearSchedule.from_dict(**dict_off) - # Year ON/OFF - dict_on_off = { - "Category": "Year", - "Parts": [ - { - "FromDay": 1, - "FromMonth": 1, - "ToDay": 31, - "ToMonth": 5, - "Schedule": {"$ref": sch_w_on.id} - }, - { - "FromDay": 1, - "FromMonth": 6, - "ToDay": 31, - "ToMonth": 12, - "Schedule": {"$ref": sch_w_off.id} - } - ], - "Type": "Fraction", - "Name": "ON_OFF"} - sch_y_on_off = ar.YearSchedule.from_dict(**dict_on_off) - # DHW - dict_dhw = { - "Category": "Year", - "Parts": [ - { - "FromDay": 1, - "FromMonth": 1, - "ToDay": 31, - "ToMonth": 12, - "Schedule": {"$ref": sch_w_dhw.id}}], - "Type": "Fraction", - "Name": "DHW"} - sch_y_dhw = ar.YearSchedule.from_dict(**dict_dhw) - # Internal gains - dict_gains = { - "Category": "Year", - "Parts": [ - { - "FromDay": 1, - "FromMonth": 1, - "ToDay": 31, - "ToMonth": 12, - "Schedule": {"$ref": sch_w_gains.id}}], - "Type": "Fraction", - "Name": "Gains"} - sch_y_gains = ar.YearSchedule.from_dict(**dict_gains) - # List of YearSchedule objects (needed for Umi template creation) - YearSchedules = [sch_y_on, sch_y_off, sch_y_on_off, sch_y_dhw, sch_y_gains] + "Type": "Fraction", + "Name": "ON_OFF"} + sch_y_on_off = ar.YearSchedule.from_dict(**dict_on_off) + # DHW + dict_dhw = { + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": {"$ref": sch_w_dhw.id}}], + "Type": "Fraction", + "Name": "DHW"} + sch_y_dhw = ar.YearSchedule.from_dict(**dict_dhw) + # Internal gains + dict_gains = { + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": {"$ref": sch_w_gains.id}}], + "Type": "Fraction", + "Name": "Gains"} + sch_y_gains = ar.YearSchedule.from_dict(**dict_gains) + # List of YearSchedule objects (needed for Umi template creation) + YearSchedules = [sch_y_on, sch_y_off, sch_y_on_off, sch_y_dhw, sch_y_gains] Defining window settings ------------------------ @@ -923,14 +923,12 @@ Creating Umi template umi_template.to_dict() -.. _OpaqueMaterial: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.OpaqueMaterial.html .. _GlazingMaterial: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.GlazingMaterial.html .. _GasMaterial: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.GasMaterial.html .. _OpaqueConstruction: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.OpaqueConstruction.html .. _WindowConstruction: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.WindowConstruction.html .. _StructureDefinition: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.StructureInformation.html .. _MassRatio: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.MassRatio.html -.. _DaySchedule: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.DaySchedule.html .. _WeekSchedule: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.WeekSchedule.html .. _YearSchedule: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.YearSchedule.html .. _WindowSetting: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.WindowSetting.html diff --git a/docs/package_modules.rst b/docs/package_modules.rst index 39d76bff..258d1641 100644 --- a/docs/package_modules.rst +++ b/docs/package_modules.rst @@ -68,23 +68,23 @@ Classes that support the :ref:`templates_label` classes above. :nosignatures: :toctree: reference/ - UmiBase - MaterialBase - MaterialLayer - ConstructionBase - LayeredConstruction - MassRatio - YearSchedulePart - DaySchedule - WeekSchedule - YearSchedule - WindowType - ShadingType + umi_base.UmiBase + materials.material_base.MaterialBase + materials.material_layer.MaterialLayer + constructions.base_construction.ConstructionBase + constructions.base_construction.LayeredConstruction + structure.MassRatio + schedule.YearSchedulePart + schedule.DaySchedule + schedule.WeekSchedule + schedule.YearSchedule + constructions.window_construction.WindowType + constructions.window_construction.ShadingType Graph Module ------------ -.. currentmodule:: archetypal.template +.. currentmodule:: archetypal.zone_graph .. autosummary:: :template: autosummary.rst @@ -132,51 +132,17 @@ Data Portal EnergyDataFrame --------------- -.. currentmodule:: archetypal.energypandas - -.. autosummary:: - :template: autosummary-noinherit.rst - :nosignatures: - :toctree: reference/ +.. note:: - EnergyDataFrame - EnergySeries.to_units - EnergySeries.normalize - EnergyDataFrame.discretize_tsam + EnergyDataFrame is now part of its own package `energy-pandas `_. EnergySeries ------------ -.. currentmodule:: archetypal.energypandas +.. note:: -.. autosummary:: - :template: autosummary.rst - :nosignatures: - :toctree: reference/ - - EnergySeries - EnergySeries.from_reportdata - EnergySeries.to_units - EnergySeries.normalize - EnergySeries.ldc_source - EnergySeries.source_side - EnergySeries.discretize_tsam - EnergySeries.plot3d - EnergySeries.plot2d - EnergySeries.p_max - EnergySeries.p_max - EnergySeries.monthly - EnergySeries.capacity_factor - EnergySeries.bin_edges - EnergySeries.time_at_min - EnergySeries.bin_scaling_factors - EnergySeries.duration_scaling_factor - EnergySeries.ldc - EnergySeries.nseries - save_and_show - plot_energyseries - plot_energyseries_map + EnergySeries is now part of its own package `energy-pandas `_. Report Data @@ -189,6 +155,7 @@ Report Data :nosignatures: :toctree: reference/ + ReportData.__init__ ReportData.from_sql_dict ReportData.from_sqlite ReportData.filter_report_data @@ -207,28 +174,6 @@ Tabular Data TabularData.from_sql TabularData.filter_tabular_data -IDF to BUI module ------------------ - -.. currentmodule:: archetypal.trnsys - -.. autosummary:: - :template: autosummary.rst - :nosignatures: - :toctree: reference/ - - convert_idf_to_trnbuild - get_idf_objects - clear_name_idf_objects - zone_origin - closest_coords - parse_window_lib - choose_window - trnbuild_idf - - - - Utils ----- From 7e6e538838778c8ce3dd6447e22216d8afac8c18 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Tue, 11 May 2021 14:09:05 -0400 Subject: [PATCH 30/32] Updates readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 50abb769..615e08c6 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ the multizone building model) is now part of a distinct package known as the ## Features -Here is a short overview of features that we are part of archetypal: +Here is a short overview of features that are part of archetypal: 1. Building Complexity Reduction: A utility to transform a multizone EnergyPlus model to a two-zone normalized model. Such models are called `building archetypes` and are the From 14674bbd801cee32cab8fc3f9f816627d2a0a91a Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Tue, 11 May 2021 14:16:34 -0400 Subject: [PATCH 31/32] minimum python --- setup.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 9e3cbfcb..e1543f69 100644 --- a/setup.py +++ b/setup.py @@ -12,10 +12,10 @@ # This check is here if the user does not have a new enough pip to recognize # the minimum Python requirement in the metadata. -if sys.version_info < (3, 6): +if sys.version_info < (3, 7): error = """ archetypal 1.1+ does not support Python 2.x, 3.0, 3.1, 3.2, or 3.3. -Python 3.6 and above is required. This may be due to an out of date pip. +Python 3.7 and above is required. This may be due to an out of date pip. Make sure you have pip >= 9.0.1. """ sys.exit(error) @@ -61,7 +61,7 @@ def find_version(*file_paths): description="Retrieve, construct, simulate, convert and analyse building archetypes", long_description=long_description, keywords="Building archetypes", - python_requires=">=3.6", + python_requires=">=3.7", install_requires=install_requires, extras_require={"dev": dev_requires}, test_suite="tests", @@ -69,4 +69,19 @@ def find_version(*file_paths): [console_scripts] archetypal=archetypal.cli:cli """, + classifiers=[ + # How mature is this project? Common values are + # 3 - Alpha + # 4 - Beta + # 5 - Production/Stable + "Development Status :: 4 - Beta", + # Indicate who your project is intended for + "Intended Audience :: Science/Research", + # Pick your license as you wish (should match "license" above) + "License :: OSI Approved :: MIT License", + # Specify the Python versions you support here. In particular, ensure + # that you indicate whether you support Python 2, Python 3 or both. + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + ], ) From 1f10ba1a24016fc8da2b6054d638555ad5e4f575 Mon Sep 17 00:00:00 2001 From: Samuel Letellier-Duchesne Date: Tue, 11 May 2021 14:19:57 -0400 Subject: [PATCH 32/32] attribution --- archetypal/template/constructions/window_construction.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/archetypal/template/constructions/window_construction.py b/archetypal/template/constructions/window_construction.py index 046a13b9..da2c7712 100644 --- a/archetypal/template/constructions/window_construction.py +++ b/archetypal/template/constructions/window_construction.py @@ -1,4 +1,11 @@ -"""Window module handles window settings.""" +"""Window module handles window settings. + +Notes: + Thank you to `honeybee-energy `_ for implementing center + of glass resistance formulas from ISO. Those where adapted to the structure of the + archetypal.template module. +""" import collections from enum import Enum