diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..3ccc10fe --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +version: 2 +updates: +- package-ecosystem: pip + directory: "/" + schedule: + interval: daily + time: "10:00" + open-pull-requests-limit: 10 + # Raise pull requests for version updates + # to pip against the `develop` branch + target-branch: "develop" diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 259b7694..acb907ef 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -1,24 +1,40 @@ -template: | - ## What’s New - - $CHANGES - - ## Contributors - - $CONTRIBUTORS - +name-template: 'v$RESOLVED_VERSION 🌈' +tag-template: 'v$RESOLVED_VERSION' categories: - - title: 'New Features' + - title: '🚀 New Features' labels: - - 'feature' + - 'new feature' - 'enhancement' - - title: 'Bug Fixes' + - title: '🐛 Bug Fixes' labels: - 'fix' - 'bugfix' - 'bug' - - title: 'Under the hood refactoring ⚙' + - title: '🧰 Maintenance' labels: - 'refactoring' -name-template: 'v$NEXT_PATCH_VERSION 🌈' -tag-template: 'v$NEXT_PATCH_VERSION' + - 'dependencies' +change-template: '- $TITLE @$AUTHOR (#$NUMBER)' +change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. +version-resolver: + major: + labels: + - 'major' + minor: + labels: + - 'minor' + - 'feature' + - 'new feature' + - 'enhancement' + patch: + labels: + - 'fix' + - 'bugfix' + - 'bug' + - 'patch' + - 'refactoring' + default: patch +template: | + ## Changes + + $CHANGES diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml new file mode 100644 index 00000000..8896676e --- /dev/null +++ b/.github/workflows/python-package.yml @@ -0,0 +1,81 @@ +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: Python package + +on: + push: + branches: [ master, develop ] + pull_request: + branches: [ master, develop ] + +jobs: + build: + + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: [ 3.7, 3.8 ] + os: [ ubuntu-latest ] # later, add macos-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 + # later, add 9.4.0 + # - energyplus-version: 9.4.0 + # energyplus-sha: 998c4b761e + # energyplus-install: 9-4-0 + steps: + - name: Display the OS + run: echo $OSTYPE + shell: bash + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install EnergyPlus + env: + ENERGYPLUS_VERSION: ${{ matrix.energyplus-version }} + ENERGYPLUS_SHA: ${{ matrix.energyplus-sha }} + ENERGYPLUS_INSTALL_VERSION: ${{ matrix.energyplus-install }} + run: bash ./install_energyplus.sh + - name: Get pip cache dir + id: pip-cache + run: | + echo "::set-output name=dir::$(pip cache dir)" + - name: pip cache + id: cache + uses: actions/cache@v2 + with: + path: ${{ steps.pip-cache.outputs.dir }} + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt', '**/requirements-dev.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + - name: Install dependencies + if: success() + run: | + python -m pip install --upgrade pip + python -m pip install flake8 pytest-cov pytest-xdist[psutil] + 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 + flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics + # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide + flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics + - name: Test with pytest + run: | + pytest -n auto --cov=archetypal --cov-report=xml tests/ + - name: Upload coverage to Codecov + if: ${{ matrix.python-version == 3.7 }} + uses: codecov/codecov-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./coverage.xml + fail_ci_if_error: false + verbose: true + diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml new file mode 100644 index 00000000..8188adc4 --- /dev/null +++ b/.github/workflows/python-publish.yml @@ -0,0 +1,31 @@ +# This workflow will upload a Python Package using Twine when a release is created +# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries + +name: Upload Python Package + +on: + release: + types: [created, edited] + +jobs: + deploy: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install setuptools wheel twine + - name: Build and publish + env: + TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} + TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + python setup.py sdist bdist_wheel + twine upload dist/* diff --git a/.gitignore b/.gitignore index 2d18ec4b..da86c5f7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,19 @@ +# Created by .ignore support plugin (hsz.mobi) +### VirtualEnv template +# Virtualenv +# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ +.Python +[Bb]in +[Ii]nclude +[Ll]ib +[Ll]ib64 +[Ll]ocal +[Ss]cripts +pyvenv.cfg +.venv +pip-selfcheck.json + +### Python template # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -7,8 +23,6 @@ __pycache__/ *.so # Distribution / packaging -.Python -env/ build/ develop-eggs/ dist/ @@ -20,9 +34,12 @@ lib64/ parts/ sdist/ var/ +wheels/ +share/python-wheels/ *.egg-info/ .installed.cfg *.egg +MANIFEST # PyInstaller # Usually these files are written by a python script from a template @@ -37,12 +54,18 @@ pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ +.nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml -*,cover +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ +tests/.temp # Translations *.mo @@ -50,54 +73,166 @@ coverage.xml # Django stuff: *.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy # Sphinx documentation docs/_build/ # PyBuilder +.pybuilder/ target/ -\.idea/ - -\.ipynb_checkpoints/ +# Jupyter Notebook +.ipynb_checkpoints -data/ +# IPython +profile_default/ +ipython_config.py -energy-table\.xlsx +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version -main-test\.py +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock -# EnergyPlus -*.audit -*.bnd -*.eio -*.end -*.err -*.mdd -*.mtd -*.rdd -*.shd -*.sql -*.htm -*.dbg -*.eso -*.mtr +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ -# vscode stuff -.vscode/ +# Celery stuff +celerybeat-schedule +celerybeat.pid -# archetypal stuff -cache/ -notebooks/ -_build/ +# SageMath parsed files +*.sage.py -tests/\.temp/ - -*.lp - -\.DS_Store - -tests/input_data/schedules/eprun/ -trnsidf.exe +# Environments +.env +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# AMW +.idea/aws.xml + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser +/cache/ +/data/ +/images/ +/logs/ +/_build/ docs/reference/ + +.idea/ \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index c71a9996..52f3d065 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ jobs: include: - name: Python 3.8 on Xenial Linux python: 3.8 # this works for Linux but is ignored on macOS or Windows - script: py.test --cov=archetypal --verbose tests/ + script: python -m pytest "tests/" -p no:warnings --cov="archetypal" after_success: - coverage report -m - coveralls @@ -20,11 +20,11 @@ jobs: os: osx osx_image: xcode11.2 language: objective-c - script: py.test --cov=archetypal --verbose tests/ + script: python -m pytest "tests/" -p no:warnings --cov="archetypal" - name: "Python 3.8 on Windows" os: windows # Windows 10.0.17134 N/A Build 17134 language: shell # 'language: python' is an error on Travis CI Windows - script: py.test --cov=archetypal --verbose tests/ + script: python -m pytest "tests/" -p no:warnings --cov="archetypal" - stage: deploy script: echo "Deploying to PyPi and GitHub releases ..." deploy: diff --git a/docker/Dockerfile b/Dockerfile similarity index 56% rename from docker/Dockerfile rename to Dockerfile index 47a1bca7..2f9bc0be 100644 --- a/docker/Dockerfile +++ b/Dockerfile @@ -39,11 +39,11 @@ ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 ENV PATH /opt/conda/bin:$PATH RUN apt-get update --fix-missing && \ - apt-get install -y wget bzip2 ca-certificates curl git libxml2-dev && \ + apt-get install -y wget bzip2 ca-certificates curl git libxml2-dev sudo && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* -RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86_64.sh -O ~/miniconda.sh && \ +RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \ /bin/bash ~/miniconda.sh -b -p /opt/conda && \ rm ~/miniconda.sh && \ /opt/conda/bin/conda clean -tipsy && \ @@ -51,47 +51,24 @@ RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-4.5.11-Linux-x86 echo ". /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \ echo "conda activate base" >> ~/.bashrc -ENV TINI_VERSION v0.16.1 +ENV TINI_VERSION=v0.16.1 ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /usr/bin/tini RUN chmod +x /usr/bin/tini # Add EnergyPlus -ENV ENERGYPLUS_VERSION=8.9.0 -ENV ENERGYPLUS_SHA=40101eaafd -ENV ENERGYPLUS_INSTALL_VERSION=8-9-0 -ENV PLATFORM=Linux -ENV EXT=sh -ENV ENERGYPLUS_DOWNLOAD_BASE_URL=https://github.com/NREL/EnergyPlus/releases/download/v$ENERGYPLUS_VERSION -ENV ENERGYPLUS_DOWNLOAD_FILENAME=EnergyPlus-$ENERGYPLUS_VERSION-$ENERGYPLUS_SHA-$PLATFORM-x86_64 -ENV ENERGYPLUS_DOWNLOAD_URL=$ENERGYPLUS_DOWNLOAD_BASE_URL/$ENERGYPLUS_DOWNLOAD_FILENAME.$EXT -RUN curl -SLO $ENERGYPLUS_DOWNLOAD_URL && \ - chmod +x $ENERGYPLUS_DOWNLOAD_FILENAME.$EXT && \ - echo "y\r" | ./$ENERGYPLUS_DOWNLOAD_FILENAME.$EXT && \ - rm $ENERGYPLUS_DOWNLOAD_FILENAME.$EXT +# Install EnergyPlus +ENV TRAVIS_OS_NAME=linux +ENV ENERGYPLUS_VERSION=9.2.0 +COPY install_energyplus.sh install_energyplus.sh +RUN /bin/bash install_energyplus.sh # Add trnsidf -COPY ./trnsidf /app/trnsidf +COPY docker/trnsidf /app/trnsidf +# Copy over environement.yml and requirements-dev.txt +COPY environment.yml environment.yml +COPY requirements-dev.txt requirements-dev.txt # configure conda and install packages in one RUN to keep image tidy -RUN git clone --branch=feature/umi --verbose https://github.com/samuelduchesne/archetypal.git && \ - cd archetypal && \ - conda update -n base conda && \ - conda config --append channels conda-forge && \ - conda env update -n archetypal -f environment.yml --prune && \ - conda install -n archetypal --file requirements-dev.txt && \ - conda install --strict-channel-priority --update-all --force-reinstall --yes jupyterlab python-igraph && \ - conda clean --yes --all && \ - conda info --all && \ - conda list && \ - echo "source activate archetypal" > ~/.bashrc && \ - python setup.py install -ENV PATH /opt/conda/envs/archetypal/bin:$PATH - -# launch notebook in the local working directory that we mount -WORKDIR /home/archetypal/wip -ENTRYPOINT ["/usr/bin/entrypoint"] -# set default command to launch when container is run -CMD ["jupyter", "lab", "--ip='0.0.0.0'", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''", "--NotebookApp.password=''"] - -# to test, import archetypal and print its version -RUN ipython -c "import archetypal; print(archetypal.__version__)" \ No newline at end of file +RUN conda update -n base conda && \ + conda config --prepend channels conda-forge && \ + conda env update -n base -f environment.yml --prune \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 402505df..00000000 --- a/MANIFEST.in +++ /dev/null @@ -1,7 +0,0 @@ -# package_data is a low-down, dirty lie. It is only used when building binary packages (python setup.py bdist ...) but -# not when building source packages (python setup.py sdist ...) - -include archetypal/ressources/* -include archetypal/template/* -include requirements.txt -include requirements-dev.txt \ No newline at end of file diff --git a/README.md b/README.md index 29c1c71b..615e08c6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.com/samuelduchesne/archetypal.svg?branch=develop)](https://travis-ci.com/samuelduchesne/archetypal) +[![Build Status](https://github.com/samuelduchesne/archetypal/actions/workflows/python-package.yml/badge.svg?branch=master)](https://github.com/samuelduchesne/archetypal/actions/workflows/python-package.yml) [![Coverage Status](https://coveralls.io/repos/github/samuelduchesne/archetypal/badge.svg)](https://coveralls.io/github/samuelduchesne/archetypal) [![Documentation Status](https://readthedocs.org/projects/archetypal/badge/?version=latest)](https://archetypal.readthedocs.io/en/latest/?badge=latest) [![DOI](https://joss.theoj.org/papers/10.21105/joss.01833/status.svg)](https://doi.org/10.21105/joss.01833) @@ -12,26 +12,24 @@ Retrieve, construct, simulate, convert and analyze building simulation templates ## Overview -**Archetypal** is a Python package that helps handle building archetypes. The first public feature released in this -version is the conversion of [EnergyPlus](https://energyplus.net) IDF models to Trnsys [TrnBuild](http://www.trnsys.com/features/suite-of-tools.php.html) Models (compatible with the multizone building model). For a list of features -currently in development see the [In development](#in-development) section. +**Archetypal** is a Python package that helps handle building archetypes. -## In development +## Changes since v2.0.0 -Many features are still in development and will become public as the development process continues. Here is a short -overview of features that we are excited to release soon: +The conversion of [EnergyPlus](https://energyplus.net) IDF models to Trnsys +[TrnBuild](http://www.trnsys.com/features/suite-of-tools.php.html) Models (compatible with +the multizone building model) is now part of a distinct package known as the +[trnslator](https://github.com/louisleroy5/trnslator). -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 foundation of the -[UMI Energy Module](https://umidocs.readthedocs.io/en/latest/docs/model-setup-template.html). This tool will allow -any EnergyPlus model to be imported into [UMI](http://web.mit.edu/sustainabledesignlab/projects/umi/index.html) and drastically speedup the UBEM process. -2. Database archetype creation: From open-source building model data sources such as the TABULA database, construct a -building template and use in UMI. Variabilty in the parameters could be achieved to effectively pick out templates -that follow a statistical distribution or a known distribution for some parameters in your area. +## Features -## Authors +Here is a short overview of features that are part of archetypal: -This work is developed by a small team of building energy simulation enthusiasts +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 + foundation of the + [UMI Energy Module](https://umidocs.readthedocs.io/en/latest/docs/model-setup-template.html). + This tool will allow any EnergyPlus model to be imported into + [UMI](http://web.mit.edu/sustainabledesignlab/projects/umi/index.html) and drastically + speedup the UBEM process. -- Samuel Letellier-Duchesne, PhD Candidate at Polytechnique Montréal (Corresponding Author) -- Louis Leroy, Master Student at Polytechnique Montréal diff --git a/archetypal/__init__.py b/archetypal/__init__.py index 32eb5836..0d1c3fed 100644 --- a/archetypal/__init__.py +++ b/archetypal/__init__.py @@ -6,26 +6,29 @@ ################################################################################ # Version of the package -__version__ = "1.3.4" +from pkg_resources import get_distribution, DistributionNotFound -# warn if a newer version of archetypal is available -from outdated import warn_if_outdated -from .utils import warn_if_not_compatible +try: + __version__ = get_distribution("archetypal").version +except DistributionNotFound: + # package is not installed + __version__ = "0.0.0" # should happen only if package is copied, not installed. +else: + # warn if a newer version of archetypal is available + from outdated import warn_if_outdated + from .eplus_interface.version import warn_if_not_compatible +finally: + # warn if energyplus not installed or incompatible + from .eplus_interface.version import warn_if_not_compatible -warn_if_outdated("archetypal", __version__) -warn_if_not_compatible() + warn_if_not_compatible() -from .utils import * -from .simple_glazing import * -from .energyseries import EnergySeries -from .energydataframe import EnergyDataFrame -from .reportdata import ReportData -from .tabulardata import TabularData -from .idfclass import * -from .schedule import Schedule -from .dataportal import * -from .plot import * -from .trnsys import * -from .template import * -from .umi_template import * -from .cli import * +# don't display futurewarnings + +import warnings + +warnings.simplefilter(action="ignore", category=FutureWarning) +warnings.simplefilter(action="ignore", category=UserWarning) + +from .idfclass import IDF +from .umi_template import UmiTemplateLibrary diff --git a/archetypal/cli.py b/archetypal/cli.py index d26a7e71..db38404f 100644 --- a/archetypal/cli.py +++ b/archetypal/cli.py @@ -6,30 +6,18 @@ ################################################################################ import os import time -from collections import defaultdict -from typing import Any, Union +import click from path import Path -import click -from tabulate import tabulate - -from archetypal import ( - settings, - cd, - load_idf, - convert_idf_to_trnbuild, - get_eplus_dirs, - parallel_process, - run_eplus, - IDF, - UmiTemplate, - config, - log, - idf_version_updater, - timeit, - EnergyPlusProcessError, -) +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 CONTEXT_SETTINGS = dict(help_option_names=["-h", "--help"]) @@ -48,7 +36,6 @@ def __init__(self): self.log_filename = settings.log_filename self.useful_idf_objects = settings.useful_idf_objects self.umitemplate = settings.umitemplate - self.trnsys_default_folder = settings.trnsys_default_folder self.ep_version = settings.ep_version @@ -81,23 +68,26 @@ def __init__(self): default=settings.cache_folder, ) @click.option( - "-c/-nc", - "--use-cache/--no-cache", - help="Use a local cache to save/retrieve many of " - "archetypal outputs such as EnergyPlus simulation results", - default=True, + "-c", + "--use-cache", + is_flag=True, + default=False, + help="Use a local cache to save/retrieve DataPortal API calls for the same " + "requests.", ) @click.option( "-l", "--log-file", + "log_file", is_flag=True, help="save log output to a log file in logs_folder", default=settings.log_file, ) @click.option( - "--verbose/--noverbose", - "-v/-nv", + "--silent", + "-s", "log_console", + is_flag=True, default=True, help="print log output to the console", ) @@ -111,18 +101,19 @@ def __init__(self): @click.option( "--log-filename", help="name of the log file", default=settings.log_filename ) -@click.option( - "--trnsys-default-folder", - type=click.Path(), - help="root folder of TRNSYS install", - default=settings.trnsys_default_folder, -) @click.option( "--ep_version", type=click.STRING, default=settings.ep_version, help='the EnergyPlus version to use. eg. "{}"'.format(settings.ep_version), ) +@click.option( + "-d", + "--debug", + is_flag=True, + default=False, + help="Will break on any exception. Useful when debugging", +) @pass_config def cli( cli_config, @@ -136,13 +127,14 @@ def cli( log_level, log_name, log_filename, - trnsys_default_folder, ep_version, + debug, ): """archetypal: Retrieve, construct, simulate, convert and analyse building simulation templates Visit archetypal.readthedocs.io for the online documentation. + """ cli_config.data_folder = data_folder cli_config.logs_folder = logs_folder @@ -154,197 +146,24 @@ def cli( cli_config.log_level = log_level cli_config.log_name = log_name cli_config.log_filename = log_filename - cli_config.trnsys_default_folder = trnsys_default_folder cli_config.ep_version = ep_version + cli_config.debug = debug # apply new config params config(**cli_config.__dict__) -@cli.command() -@click.argument("idf_file", type=click.Path(exists=True)) -@click.argument("weather_file", type=click.Path(exists=True)) -@click.argument( - "output_folder", type=click.Path(exists=True), required=False, default="." -) -@click.option( - "--return_idf", - "-i", - is_flag=True, - default=False, - help="Save modified IDF file to output_folder, and return path " - "to the file in the console", -) -@click.option( - "--return_t3d", - "-t", - is_flag=True, - default=False, - help="Return T3D file path in the console", -) -@click.option( - "--return_dck", - "-d", - is_flag=True, - default=False, - help="Generate dck file and save to output_folder, and return " - "path to the file in the console", -) -@click.option( - "--window_lib", - type=click.Path(), - default=None, - help="Path of the window library (from Berkeley Lab)", -) -@click.option( - "--trnsidf_exe", - type=click.Path(), - help="Path to trnsidf.exe", - default=os.path.join( - settings.trnsys_default_folder, r"Building\trnsIDF\trnsidf.exe" - ), -) -@click.option( - "--template", - type=click.Path(), - default=settings.path_template_d18, - help="Path to d18 template file", -) -@click.option( - "--log_clear_names", - is_flag=True, - default=False, - help='If mentioned (True), DO NOT print log of "clear_names" (equivalence between ' - "old and new names) in the console. Default (not mentioned) is False.", -) -@click.option( - "--schedule_as_input", - is_flag=True, - default=True, - help="If mentioned (False), writes schedules as SCHEDULES in BUI file. Be aware that " - "this option might make crash TRNBuild. Default (not mentioned) is True, and " - "writes the schedules as INPUTS. This option requires the user to link " - "(in the TRNSYS Studio) the csv file containing the schedules with those INPUTS", -) -@click.option( - "--ep_version", - type=str, - default=None, - help="Specify the EnergyPlus version to use. Default = None", -) -@click.option( - "--window", - nargs=6, - type=float, - default=(2.2, 0.64, 0.8, 0.05, 0.15, 8.17), - help="Specify window properties " - " . Default = 2.2 0.64 0.8 0.05 0.15 8.17", -) -@click.option("--ordered", is_flag=True, help="sort idf object names") -@click.option("--nonum", is_flag=True, default=False, help="Do not renumber surfaces") -@click.option("--batchjob", "-N", is_flag=True, default=False, help="BatchJob Modus") -@click.option( - "--geofloor", - type=float, - default=0.6, - help="Generates GEOSURF values for distributing; direct solar " - "radiation where `geo_floor` % is directed to the floor, " - "the rest; to walls/windows. Default = 0.6", -) -@click.option( - "--refarea", - is_flag=True, - default=False, - help="Updates floor reference area of airnodes", -) -@click.option( - "--volume", is_flag=True, default=False, help="Updates volume of airnodes" -) -@click.option( - "--capacitance", is_flag=True, default=False, help="Updates capacitance of airnodes" -) -def convert( - idf_file, - weather_file, - output_folder, - return_idf, - return_t3d, - return_dck, - window_lib, - trnsidf_exe, - template, - log_clear_names, - schedule_as_input, - ep_version, - window, - ordered, - nonum, - batchjob, - geofloor, - refarea, - volume, - capacitance, -): - """Convert regular IDF file (EnergyPlus) to TRNBuild file (TRNSYS) The - output folder path defaults to the working directory. Equivalent to '.' - """ - u_value, shgc, t_vis, tolerance, fframe, uframe = window - window_kwds = { - "u_value": u_value, - "shgc": shgc, - "t_vis": t_vis, - "tolerance": tolerance, - "fframe": fframe, - "uframe": uframe, - } - paths = convert_idf_to_trnbuild( - idf_file, - weather_file, - window_lib, - return_idf, - True, - return_t3d, - return_dck, - output_folder, - trnsidf_exe, - template, - log_clear_names=log_clear_names, - schedule_as_input=schedule_as_input, - ep_version=ep_version, - **window_kwds, - ordered=ordered, - nonum=nonum, - N=batchjob, - geo_floor=geofloor, - refarea=refarea, - volume=volume, - capacitance=capacitance - ) - # Print path of output files in console - click.echo("Here are the paths to the different output files: ") - - for path in paths: - if "MODIFIED" in path: - click.echo("Path to the modified IDF file: {}".format(path)) - elif "b18" in path: - click.echo("Path to the BUI file: {}".format(path)) - elif "dck" in path: - click.echo("Path to the DCK file: {}".format(path)) - else: - click.echo("Path to the T3D file: {}".format(path)) - - @timeit @cli.command() -@click.argument("idf", nargs=-1, type=click.Path(exists=True), required=True) -@click.argument( - "output", +@click.argument("idf", nargs=-1, required=True) +@click.option( + "-o", + "--output", type=click.Path(dir_okay=True, writable=True), default="myumitemplate.json", ) @click.option( "--weather", "-w", - type=click.Path(exists=True), help="EPW weather file path", default=get_eplus_dirs(settings.ep_version) / "WeatherData" @@ -353,117 +172,101 @@ def convert( ) @click.option( "-p", - "parallel", - is_flag=True, - default=True, - help="Parallel process; each idf file on different cores", + "--parallel", + "cores", + default=-1, + help="Specify number of cores to run in parallel", ) @click.option( "-z", - "all_zones", + "--all_zones", is_flag=True, default=False, help="Include all zones in the " "output template", ) -def reduce(idf, output, weather, parallel, all_zones): - """Perform the model reduction and translate to an UMI template file. +@click.option( + "-v", + "--version", + "as_version", + default=settings.ep_version, + help="EnergyPlus version to upgrade to - e.g., '9-2-0'", +) +@click.pass_context +def reduce(ctx, idf, output, weather, cores, all_zones, as_version): + """Convert EnergyPlus models to an Umi Template Library by using the model + complexity reduction algorithm. - IDF is one or multiple idf files to process. - OUTPUT is the output file name (or path) to write to. Optional. - """ - if parallel: - # if parallel is True, run eplus in parallel - rundict = { - file: dict( - eplus_file=file, - weather_file=weather, - annual=True, - prep_outputs=True, - expandobjects=True, - verbose="v", - output_report="sql", - return_idf=False, - ep_version=settings.ep_version, - ) - for file in idf - } - res = parallel_process(rundict, run_eplus) - res = _write_invalid(res) - - loaded_idf = {} - for key, sql in res.items(): - loaded_idf[key] = {} - loaded_idf[key][0] = sql - loaded_idf[key][1] = load_idf(key) - res = loaded_idf - else: - # else, run sequentially - res = defaultdict(dict) - invalid = [] - for i, fn in enumerate(idf): - try: - res[fn][0], res[fn][1] = run_eplus( - fn, - weather, - ep_version=settings.ep_version, - output_report="sql", - prep_outputs=True, - annual=True, - design_day=False, - verbose="v", - return_idf=True, - ) - except EnergyPlusProcessError as e: - invalid.append({"#": i, "Filename": fn.basename(), "Error": e}) - if invalid: - filename = Path("failed_reduce.txt") - with open(filename, "w") as failures: - failures.writelines(tabulate(invalid, headers="keys")) - log('Invalid run listed in "%s"' % filename) - - from archetypal import BuildingTemplate - - bts = [] - for fn in res.values(): - sql = next( - iter([value for key, value in fn.items() if isinstance(value, dict)]) - ) - idf = next(iter([value for key, value in fn.items() if isinstance(value, IDF)])) - bts.append(BuildingTemplate.from_idf(idf, sql=sql, DataSource=idf.name)) + IDF can be a file path or a directory. In case of a directory, all *.idf + files will be matched in the directory and subdirectories (recursively). Mix & + match is ok (see example below). + OUTPUT is the output file + name (or path) to write to. Optional. + + Example: % archetypal -csl reduce "." "elsewhere/model1.idf" -w "weather.epw" + """ output = Path(output) - name = output.namebase + name = output.stem ext = output.ext if output.ext == ".json" else ".json" dir_ = output.dirname() - template = UmiTemplate(name=name, BuildingTemplates=bts) + + file_paths = list(set_filepaths(idf)) + file_list = "\n".join( + [f"{i}. " + str(file.name) for i, file in enumerate(file_paths)] + ) + log( + f"executing {len(file_paths)} file(s):\n{file_list}", + verbose=True, + ) + weather, *_ = set_filepaths([weather]) + log(f"using the '{weather.basename()}' weather file\n", verbose=True) + + # Call UmiTemplateLibrary constructor with list of IDFs + template = UmiTemplateLibrary.from_idf_files( + file_paths, + weather=weather, + name=name, + processors=cores, + keep_all_zones=all_zones, + as_version=as_version, + annual=True, + ) + # Save json file final_path: Path = dir_ / name + ext - template.to_json(path_or_buf=final_path, all_zones=all_zones) - log("Successfully created template file at {}".format(final_path.abspath())) + template.save(path_or_buf=final_path) + log( + f"Successfully created template file at {final_path.abspath()}", + verbose=True, + ) + +def validate_energyplusversion(ctx, param, value): + try: + return EnergyPlusVersion(value) + except EnergyPlusVersionError: + raise click.BadParameter("invalid energyplus version") -def _write_invalid(res): - res = {k: v for k, v in res.items() if ~isinstance(res[k], Exception)} - invalid_runs = {k: v for k, v in res.items() if isinstance(res[k], Exception)} - if invalid_runs: - invalid = [] - for i, (k, v) in enumerate(invalid_runs.items()): - invalid.append({"#": i, "Filename": k, "Error": invalid_runs[k]}) - filename = Path("failed_reduce.txt") - with open(filename, "w") as failures: - failures.writelines(tabulate(invalid, headers="keys")) - log("Invalid runs listed in %s" % "failed_transition.txt") - return res +def validate_paths(ctx, param, value): + try: + file_paths = set_filepaths(value) + file_list = "\n".join( + [f"{i}. " + str(file.name) for i, file in enumerate(file_paths)] + ) + return file_paths, file_list + except FileNotFoundError: + raise click.BadParameter("no files were found.") @cli.command() -@click.argument("idf", nargs=-1, type=click.Path(exists=True), required=True) +@click.argument("idf", nargs=-1, required=True, callback=validate_paths) @click.option( "-v", "--version", "to_version", default=settings.ep_version, help="EnergyPlus version to upgrade to - e.g., '9-2-0'", + callback=validate_energyplusversion, ) @click.option( "-p", @@ -472,13 +275,125 @@ def _write_invalid(res): default=-1, help="Specify number of cores to run in parallel", ) -def transition(idf, to_version, cores): - """Upgrade an IDF file to a newer version""" - start_time = time.time() - rundict = {file: dict(idf_file=file, to_version=to_version) for file in idf} - parallel_process(rundict, idf_version_updater, processors=cores) +@click.option( + "-y", + "yes", + is_flag=True, + help="Suppress confirmation prompt, when overwriting files.", +) +@docstring_parameter(arversion=__version__, ep_version=ep_version) +def transition(idf, to_version, cores, yes): + """Upgrade an IDF file to a newer version. + + IDF can be a file path or a directory. In case of a directory, all *.idf + files will be found in the directory and subdirectories (recursively). Mix & + match is ok (see example below). + + Example: % archetypal -csl transition "." "elsewhere/model1.idf" + + archetypal will look in the current working directory (".") and find any + *.idf files and also run the model located at "elsewhere/model1.idf". + + Note: The latest version archetypal v{arversion} can upgrade to is + {ep_version}. + + """ + file_paths, file_list = idf log( - "Successfully transitioned files to version '{}' in {:,.2f} seconds".format( - to_version, time.time() - start_time + f"executing {len(file_paths)} file(s):\n{file_list}", + verbose=True, + ) + if not yes: + overwrite = click.confirm("Would you like to overwrite the file(s)?") + else: + overwrite = False + start_time = time.time() + + to_version = to_version.dash + rundict = { + file: dict( + idfname=file, + as_version=to_version, + check_required=False, + check_length=False, + overwrite=overwrite, + prep_outputs=False, ) + for i, file in enumerate(file_paths) + } + results = parallel_process( + rundict, + IDF, + processors=cores, + show_progress=True, + position=0, + debug=False, + ) + + # Save results to file (overwriting if True) + file_list = [] + for idf in results: + if isinstance(idf, IDF): + if overwrite: + file_list.append(idf.original_idfname) + idf.saveas(str(idf.original_idfname)) + else: + full_path = ( + idf.original_idfname.dirname() / idf.original_idfname.stem + + f"V{to_version}.idf" + ) + file_list.append(full_path) + idf.saveas(full_path) + log( + f"Successfully transitioned to version '{to_version}' in " + f"{time.time() - start_time:,.2f} seconds for file(s):\n" + "\n".join(file_list) ) + + +def set_filepaths(idf): + """Simplifies file-like paths, dir-like paths and Paths with wildcards. A + list of unique paths is returned. For directories, Path.walkfiles("*.idfs") + returns IDF files. For Paths with wildcards, glob(Path) is used to return + whatever the pattern defines. + + Args: + idf (list of (str or Path) or tuple of (str or Path)): A list of path-like + objects. Can contain wildcards. + + Returns: + set of Path: The set of a list of paths + """ + if not isinstance(idf, (list, tuple)): + raise ValueError("A list must be passed") + idf = tuple(Path(file_or_path).expand() for file_or_path in idf) # make Paths + file_paths = () # Placeholder for tuple of paths + for file_or_path in idf: + if file_or_path.isfile(): # if a file, concatenate into file_paths + file_paths += tuple([file_or_path]) + elif file_or_path.isdir(): # if a directory, walkdir (recursive) and get *.idf + file_paths += tuple(file_or_path.walkfiles("*.idf")) + else: + # has wildcard + excluded_dirs = [ + settings.cache_folder, + settings.data_folder, + settings.imgs_folder, + settings.logs_folder, + ] + top = file_or_path.abspath().dirname() + for root, dirs, files in walkdirs(top, excluded_dirs): + pattern = file_or_path.basename() + file_paths += tuple(Path(root).files(pattern)) + + file_paths = set([f.relpath().expand() for f in file_paths]) # Only keep unique + # values + if file_paths: + return file_paths + else: + raise FileNotFoundError + + +def walkdirs(top, excluded): + for root, dirs, files in os.walk(top, topdown=True): + yield root, dirs, files + dirs[:] = [d for d in dirs if (Path(root) / d) not in excluded] diff --git a/archetypal/dataportal.py b/archetypal/dataportal.py index 8e29f88a..0f9b7b8e 100644 --- a/archetypal/dataportal.py +++ b/archetypal/dataportal.py @@ -19,13 +19,8 @@ import pycountry as pycountry import requests -from archetypal import log, settings, make_str - -# scipy and sklearn are optional dependencies for faster nearest node search -try: - from osgeo import gdal -except ImportError as e: - gdal = None +from archetypal import settings +from archetypal.utils import log def tabula_available_buildings(country_name="France"): @@ -401,14 +396,16 @@ 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) log('Saved response to cache file "{}"'.format(cache_path_filename)) -def openei_api_request(data,): +def openei_api_request( + data, +): """Query the OpenEI.org API. Args: @@ -434,8 +431,8 @@ def nrel_api_cbr_request(data): """Query the NREL Commercial Building Resource Database Examples: - >>> import archetypal as ar - >>> ar.dataportal.nrel_api_cbr_request({'s': 'Commercial' + >>> from archetypal import dataportal + >>> dataportal.nrel_api_cbr_request({'s': 'Commercial' >>> 'Reference', 'api_key': 'oGZdX1nhars1cTJYTm7M9T12T1ZOvikX9pH0Zudq'}) Args: @@ -525,7 +522,7 @@ def nrel_bcl_api_request(data): else: url = "https://bcl.nrel.gov/api/search/{}.{}".format(keyword, kformat) prepared_url = requests.Request("GET", url, params=data).prepare().url - print(prepared_url) + log(prepared_url) cached_response_json = get_from_cache(prepared_url) if cached_response_json: @@ -539,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 @@ -709,23 +706,19 @@ def stat_can_geo_request(type="json", lang="E", geos="PR", cpt="00"): # There seems to be a double backlash in the response. We try # removing it here. try: - response = response.content.decode("UTF-8").replace("//", "") - response_json = json.loads(response) - except Exception: + response_str = response.content.decode("UTF-8").replace("//", "") + response_json = json.loads(response_str) + except Exception as e: log( - "Server at {} returned status code {} and no JSON " - "data.".format(domain, response.status_code), + f"Error {e}\n" + f"Server at {domain} returned status code {response.status_code} " + f"and no JSON data.", level=lg.ERROR, ) + return {} else: save_to_cache(prepared_url, response_json) return response_json - # deal with response satus_code here - log( - "Server at {} returned status code {} and no JSON " - "data.".format(domain, response.status_code), - level=lg.ERROR, - ) else: return response_json diff --git a/archetypal/energydataframe.py b/archetypal/energydataframe.py deleted file mode 100644 index 6aa97933..00000000 --- a/archetypal/energydataframe.py +++ /dev/null @@ -1,237 +0,0 @@ -import matplotlib.pyplot as plt -from pandas import DataFrame, Series, DatetimeIndex - -from archetypal import EnergySeries, settings -from archetypal.energyseries import plot_energyseries_map, save_and_show - - -class EnergyDataFrame(DataFrame): - """An EnergyDataFrame object is a pandas.DataFrame that has energy related - data. In addition to the standard DataFrame constructor arguments, - EnergyDataFrame also accepts the following keyword arguments: - - - """ - - _metadata = [ - "profile_type", - "base_year", - "frequency", - "units", - "sort_values", - "to_units", - ] - - def __init__(self, *args, **kwargs): - from_units = kwargs.pop("units", None) - super(EnergyDataFrame, self).__init__(*args, **kwargs) - self.from_units = from_units - if from_units is not None: - self.set_unit(from_units, inplace=True) - - def set_unit(self, from_unit, inplace): - ureg = settings.unit_registry - - if inplace: - frame = self - else: - frame = self.copy() - - self.from_units = ureg.parse_expression(from_unit) - - if not inplace: - return frame - - def plot2d(self, **kwargs): - return plot_energydataframe_map(self, **kwargs) - - @property - def _constructor(self): - return EnergyDataFrame - - @property - def nseries(self): - if self._data.ndim == 1: - return 1 - else: - return self._data.shape[0] - - def __getitem__(self, key): - """ - return an EnergySeries or an EnergyDataFrame with propagated metadata. - """ - result = super(EnergyDataFrame, self).__getitem__(key) - if isinstance(result, Series): - result.__class__ = EnergySeries - elif isinstance(result, DataFrame): - result.__class__ = EnergyDataFrame - return result.__finalize__(self) - - def stack(self, level=-1, dropna=True): - from pandas.core.reshape.reshape import stack, stack_multiple - - if isinstance(level, (tuple, list)): - result = stack_multiple(self, level, dropna=dropna) - return result.__finalize__(self) - else: - result = stack(self, level, dropna=dropna) - return result.__finalize__(self) - - def discretize_tsam( - self, - resolution=None, - noTypicalPeriods=10, - hoursPerPeriod=24, - clusterMethod="hierarchical", - evalSumPeriods=False, - sortValues=False, - sameMean=False, - rescaleClusterPeriods=True, - weightDict=None, - extremePeriodMethod="None", - solver="glpk", - roundOutput=None, - addPeakMin=None, - addPeakMax=None, - addMeanMin=None, - addMeanMax=None, - ): - """uses tsam""" - try: - import tsam.timeseriesaggregation as tsam - except ImportError: - raise ImportError("tsam is required for discretize_tsam()") - if not isinstance(self.index, DatetimeIndex): - raise TypeError("To use tsam, index of series must be a " "DateTimeIndex") - timeSeries = self.copy() - agg = tsam.TimeSeriesAggregation( - timeSeries, - resolution=resolution, - noTypicalPeriods=noTypicalPeriods, - hoursPerPeriod=hoursPerPeriod, - clusterMethod=clusterMethod, - evalSumPeriods=evalSumPeriods, - sortValues=sortValues, - sameMean=sameMean, - rescaleClusterPeriods=rescaleClusterPeriods, - weightDict=weightDict, - extremePeriodMethod=extremePeriodMethod, - solver=solver, - roundOutput=roundOutput, - addPeakMin=addPeakMin, - addPeakMax=addPeakMax, - addMeanMin=addMeanMin, - addMeanMax=addMeanMax, - ) - - agg.createTypicalPeriods() - results = agg.predictOriginalData() - results = EnergyDataFrame(results) - results.__dict__["agg"] = agg - return results.__finalize__(self) - - -def plot_energydataframe_map( - data, - periodlength=24, - subplots=False, - vmin=None, - vmax=None, - axis_off=True, - cmap="RdBu", - fig_height=None, - fig_width=6, - show=True, - view_angle=-60, - save=False, - close=False, - dpi=300, - file_format="png", - color=None, - ax=None, - filename="untitled", - extent="tight", - sharex=True, - sharey=True, - layout=None, - layout_type="vertical", - **kwargs -): - if fig_height is None: - fig_height = fig_width / 3 - figsize = (fig_width, fig_height) - nseries = data.nseries - fig, axes = _setup_subplots( - subplots, nseries, sharex, sharey, figsize, ax, layout, layout_type - ) - cols = data.columns - for ax, col in zip(axes, cols): - plot_energyseries_map( - data[col], - periodlength=periodlength, - subplots=subplots, - vmin=vmin, - vmax=vmax, - axis_off=axis_off, - cmap=cmap, - fig_height=fig_height, - fig_width=fig_width, - show=False, - save=False, - close=False, - dpi=dpi, - file_format=file_format, - color=color, - ax=ax, - filename=filename, - extent=extent, - sharex=sharex, - sharey=sharey, - layout=layout, - layout_type=layout_type, - **kwargs - ) - - fig, axes = save_and_show( - fig, axes, save, show, close, filename, file_format, dpi, axis_off, extent - ) - - return fig, axes - - -def _setup_subplots( - subplots, - nseries, - sharex=False, - sharey=False, - figsize=None, - ax=None, - layout=None, - layout_type="vertical", -): - """prepares the subplots""" - from pandas.plotting._tools import _subplots, _flatten - - if subplots: - fig, axes = _subplots( - naxes=nseries, - sharex=sharex, - sharey=sharey, - figsize=figsize, - ax=ax, - layout=layout, - layout_type=layout_type, - ) - else: - if ax is None: - fig = plt.figure(figsize=figsize) - axes = fig.add_subplot(111) - else: - fig = ax.get_figure() - if figsize is not None: - fig.set_size_inches(figsize) - axes = ax - - axes = _flatten(axes) - - return fig, axes diff --git a/archetypal/energyseries.py b/archetypal/energyseries.py deleted file mode 100644 index 2dc7d88f..00000000 --- a/archetypal/energyseries.py +++ /dev/null @@ -1,1117 +0,0 @@ -import copy -import logging as lg -import os -import time -import warnings -from datetime import timedelta - -import numpy as np -import pandas as pd -import tsam.timeseriesaggregation as tsam -from matplotlib import pyplot as plt, cm -from matplotlib.colors import LightSource -from pandas import Series, DataFrame, concat, MultiIndex, date_range -from sklearn import preprocessing - -import archetypal -from archetypal import log, rmse, piecewise, settings - - -class EnergySeries(Series): - """A Series object designed to store energy related data.""" - - @property - def _constructor(self): - return EnergySeries - - _metadata = [ - "name", - "bin_edges_", - "bin_scaling_factors_", - "profile_type", - "base_year", - "frequency", - "units", - "sort_values", - "to_units", - "converted_", - "concurrent_sort_", - ] - - def __new__( - cls, - data, - frequency=None, - units=None, - profile_type="undefinded", - index=None, - dtype=None, - copy=True, - name=None, - fastpath=False, - base_year=2018, - normalize=False, - sort_values=False, - ascending=False, - archetypes=None, - concurrent_sort=False, - to_units=None, - use_timeindex=False, - ): - """ - Args: - data: - frequency: - units: - profile_type: - index: - dtype: - copy: - name: - fastpath: - base_year: - normalize: - sort_values: - ascending: - archetypes: - concurrent_sort: - to_units: - use_timeindex: - """ - self = super(EnergySeries, cls).__new__(cls) - return self - - def __init__( - self, - data, - frequency=None, - units=None, - profile_type="undefinded", - index=None, - dtype=None, - copy=True, - name=None, - fastpath=False, - base_year=2018, - normalize=False, - sort_values=False, - ascending=False, - archetypes=None, - concurrent_sort=False, - to_units=None, - use_timeindex=False, - ): - """ - Args: - data: - frequency: - units: - profile_type: - index: - dtype: - copy: - name: - fastpath: - base_year: - normalize: - sort_values: - ascending: - archetypes: - concurrent_sort: - to_units: - use_timeindex: - """ - super(EnergySeries, self).__init__( - data=data, index=index, dtype=dtype, name=name, copy=copy, fastpath=fastpath - ) - self.bin_edges_ = None - self.bin_scaling_factors_ = None - self.profile_type = profile_type - self.frequency = frequency - self.base_year = base_year - self.units = settings.unit_registry.parse_expression(units).units - self.archetypes = archetypes - self.to_units = settings.unit_registry.parse_expression(to_units).units - self.converted_ = False - self.concurrent_sort_ = concurrent_sort - # handle sorting of the data - if sort_values: - self.is_sorted = True - if concurrent_sort: - self.concurrent_sort(ascending=ascending, inplace=True) - else: - self.sort_values(ascending=ascending, inplace=True) - self.reset_index(drop=True, inplace=True) - else: - self.is_sorted = False - - # handle archetype names - if isinstance(self.index, MultiIndex): - self.archetypes = list(set(self.index.get_level_values(level=0))) - else: - self.archetypes = None - - # handle normalization - if normalize: - self.normalize(inplace=True) - - # handle unit conversion - if to_units and units: - self.unit_conversion(to_units=to_units, inplace=True) - - # handle DateTimeIndex - if index is None and use_timeindex: - start_date = str(self.base_year) + "0101" - if isinstance(self.index, MultiIndex): - newindex = self.index # todo: finish this - else: - newindex = pd.date_range( - start=start_date, freq=self.frequency, periods=len(self) - ) - self.index = newindex - - @classmethod - def from_sqlite( - cls, - df, - name=None, - base_year=2018, - units=None, - normalize=False, - sort_values=False, - ascending=False, - concurrent_sort=False, - to_units=None, - agg_func="sum", - ): - """Create a. - - Args: - df (DataFrame): - name: - base_year: - units: - normalize: - sort_values: - ascending: - concurrent_sort: - to_units: - agg_func (callable): The aggregation function to use in the case - that multiple values have the same index value. If a function, - must either work when passed a DataFrame or when passed to - DataFrame.apply. For a DataFrame, can pass a dict, if the keys - are DataFrame column names. - - Accepted Combinations are: - - string function name - - function - - list of functions - - dict of column names -> functions (or list of functions) - """ - index = pd.to_datetime( - { - "year": base_year, - "month": df.Month, - "day": df.Day, - "hour": df.Hour, - "minute": df.Minute, - } - ) - # Adjust timeindex by timedelta - index -= df.Interval.apply(lambda x: timedelta(minutes=x)) - index = pd.DatetimeIndex(index) - # get data - data = df.Value - data.index = index - units = [units] if units else set(df.Units) - if len(units) > 1: - raise ValueError("The DataFrame contains mixed units: {}".format(units)) - else: - units = next(iter(units), None) - # group data by index value (level=0) using the agg_func - if agg_func: - grouped_Data = data.groupby(level=0).agg(agg_func) - else: - df["DateTimeIndex"] = index - grouped_Data = df.set_index(["DateTimeIndex", "Name"]).Value - # Since we create the index, use_timeindex must be false - return cls( - grouped_Data.values, - name=name, - units=units, - index=grouped_Data.index, - use_timeindex=False, - base_year=base_year, - normalize=normalize, - sort_values=sort_values, - ascending=ascending, - concurrent_sort=concurrent_sort, - to_units=to_units, - ) - - def unit_conversion(self, to_units=None, inplace=False): - """returns the multiplier to convert units - - Args: - to_units (pint.Unit): - inplace: - """ - reg = settings.unit_registry - if to_units is None: - to_units = self.to_units - else: - to_units = reg.parse_expression(to_units).units - cdata = reg.Quantity(self.values, self.units).to(to_units).m - result = self.apply(lambda x: x) - result.update(pd.Series(cdata, index=result.index)) - result.__class__ = EnergySeries - result.converted_ = True - result.units = to_units - if inplace: - self._update_inplace(result) - self.__finalize__(result) - else: - return result - - def concurrent_sort(self, ascending=False, inplace=False, level=0): - """ - Args: - ascending: - inplace: - level: - """ - if isinstance(self.index, MultiIndex): - concurrent = self.unstack(level=level) - concurrent_sum = concurrent.sum(axis=1) - - sortedIdx = concurrent_sum.sort_values(ascending=ascending).index - - result = concurrent.loc[sortedIdx, :] - result.index = concurrent.index - result = result.stack().swaplevel() - - if inplace: - self.update(result) - self.__finalize__(result) - else: - return result # todo: make sure results has all the metadata - - def normalize(self, feature_range=(0, 1), inplace=False): - """Returns a normalized EnergySeries - - Args: - feature_range: - inplace: - """ - scaler = preprocessing.MinMaxScaler(feature_range=feature_range) - if self.archetypes: - result = concat( - { - name: Series( - scaler.fit_transform(sub.values.reshape(-1, 1)).ravel() - ) - for name, sub in self.groupby(level=0) - } - ).sort_index() - result = self._constructor(result) - else: - result = Series(scaler.fit_transform(self.values.reshape(-1, 1)).ravel()) - result = self._constructor(result) - result.units = settings.unit_registry.dimensionless - if inplace: - self._update_inplace(result) - else: - return result # todo: make sure result has all the metadata - - def ldc_source(self, SCOPH=4, SCOPC=4): - """Returns the Load Duration Curve from the source side of theoretical - Heat Pumps - - Args: - SCOPH: Seasonal COP in Heating - SCOPC: Seasonal COP in Cooling - - Returns: - (EnergySeries) Load Duration Curve - """ - - result = self.ldc.apply( - lambda x: x * (1 - 1 / SCOPH) if x > 0 else x * (1 + 1 / SCOPC) - ) - return result - - def source_side(self, SCOPH=None, SCOPC=None): - """Returns the Source Side EnergySeries given a Seasonal COP. Negative - values are considered like Cooling Demand. - - Args: - SCOPH: Seasonal COP in Heating - SCOPC: Seasonal COP in Cooling - - Returns: - (EnergySeries) Load Duration Curve - """ - if SCOPC or SCOPH: - result = self.apply( - lambda x: x * (1 - 1 / SCOPH) if SCOPH else x * (1 + 1 / SCOPC) - ) - return result - else: - raise ValueError("Please provide a SCOPH or a SCOPC") - - def discretize_tsam( - self, - resolution=None, - noTypicalPeriods=10, - hoursPerPeriod=24, - clusterMethod="hierarchical", - evalSumPeriods=False, - sortValues=False, - sameMean=False, - rescaleClusterPeriods=True, - weightDict=None, - extremePeriodMethod="None", - solver="glpk", - roundOutput=None, - addPeakMin=None, - addPeakMax=None, - addMeanMin=None, - addMeanMax=None, - ): - """uses tsam - - Args: - resolution: - noTypicalPeriods: - hoursPerPeriod: - clusterMethod: - evalSumPeriods: - sortValues: - sameMean: - rescaleClusterPeriods: - weightDict: - extremePeriodMethod: - solver: - roundOutput: - addPeakMin: - addPeakMax: - addMeanMin: - addMeanMax: - """ - try: - import tsam.timeseriesaggregation as tsam - except ImportError: - raise ImportError("tsam is required for discretize_tsam()") - if not isinstance(self.index, pd.DatetimeIndex): - raise TypeError("To use tsam, index of series must be a " "DateTimeIndex") - if isinstance(self, Series): - timeSeries = pd.DataFrame(self) - else: - timeSeries = self.copy() - agg = tsam.TimeSeriesAggregation( - timeSeries, - resolution=resolution, - noTypicalPeriods=noTypicalPeriods, - hoursPerPeriod=hoursPerPeriod, - clusterMethod=clusterMethod, - evalSumPeriods=evalSumPeriods, - sortValues=sortValues, - sameMean=sameMean, - rescaleClusterPeriods=rescaleClusterPeriods, - weightDict=weightDict, - extremePeriodMethod=extremePeriodMethod, - solver=solver, - roundOutput=roundOutput, - addPeakMin=addPeakMin, - addPeakMax=addPeakMax, - addMeanMin=addMeanMin, - addMeanMax=addMeanMax, - ) - - agg.createTypicalPeriods() - results = agg.predictOriginalData() - results = EnergySeries(results.iloc[:, 0]) - # results._internal_names += agg.clusterOrder - return results.__finalize__(self) - - def discretize(self, n_bins=3, inplace=False): - """Retruns a discretized pandas.Series - - Args: - n_bins (int): Number of bins or steps to discretize the function - inplace (bool): if True, perform operation in-place - """ - try: - from scipy.optimize import minimize - from itertools import chain - except ImportError: - raise ImportError( - "The sklearn package must be installed to " "use this optional feature." - ) - if self.archetypes: - # if multiindex, group and apply operation on each group. - # combine at the end - results = {} - edges = {} - ampls = {} - for name, sub in self.groupby(level=0): - hour_of_min = sub.time_at_min[1] - - sf = [1 / (i * 1.01) for i in range(1, n_bins + 1)] - sf.extend([sub.min()]) - sf_bounds = [(0, sub.max()) for i in range(0, n_bins + 1)] - hours = [ - hour_of_min - hour_of_min * 1 / (i * 1.01) - for i in range(1, n_bins + 1) - ] - # Todo hours need to work fow datetime index - hours.extend([len(sub)]) - hours_bounds = [(0, len(sub)) for i in range(0, n_bins + 1)] - - start_time = time.time() - log("discretizing EnergySeries {}".format(name), lg.DEBUG) - res = minimize( - rmse, - np.array(hours + sf), - args=(sub.values), - method="L-BFGS-B", - bounds=hours_bounds + sf_bounds, - options=dict(disp=True), - ) - log( - "Completed discretization in {:,.2f} seconds".format( - time.time() - start_time - ), - lg.DEBUG, - ) - edges[name] = res.x[0 : n_bins + 1] - ampls[name] = res.x[n_bins + 1 :] - results[name] = Series(piecewise(res.x)) - self.bin_edges_ = Series(edges).apply(Series) - self.bin_scaling_factors_ = DataFrame(ampls) - - result = concat(results) - else: - hour_of_min = self.time_at_min - - sf = [1 / (i * 1.01) for i in range(1, n_bins + 1)] - sf.extend([self.min()]) - sf_bounds = [(0, self.max()) for i in range(0, n_bins + 1)] - hours = [ - hour_of_min - hour_of_min * 1 / (i * 1.01) for i in range(1, n_bins + 1) - ] - hours.extend([len(self)]) - hours_bounds = [(0, len(self)) for i in range(0, n_bins + 1)] - - start_time = time.time() - # log('discretizing EnergySeries {}'.format(name), lg.DEBUG) - res = minimize( - rmse, - np.array(hours + sf), - args=(self.values), - method="L-BFGS-B", - bounds=hours_bounds + sf_bounds, - options=dict(disp=True), - ) - log( - "Completed discretization in {:,.2f} seconds".format( - time.time() - start_time - ), - lg.DEBUG, - ) - edges = res.x[0 : n_bins + 1] - ampls = res.x[n_bins + 1 :] - result = Series(piecewise(res.x)) - bin_edges = Series(edges).apply(Series) - self.bin_edges_ = bin_edges - bin_edges.loc[-1, 0] = 0 - bin_edges.sort_index(inplace=True) - bin_edges = bin_edges.diff().dropna() - bin_edges = bin_edges.round() - self.bin_scaling_factors_ = DataFrame( - {"duration": bin_edges[0], "scaling factor": ampls} - ) - self.bin_scaling_factors_.index = np.round(edges).astype(int) - - if inplace: - self.update(result) - self.__class__ = EnergySeries - self.__finalize__(result) - else: - result.__class__ = EnergySeries - return result.__finalize__(self) - - def unstack(self, level=-1, fill_value=None): - """ - Args: - level: - fill_value: - """ - from pandas.core.reshape.reshape import unstack - - result = unstack(self, level, fill_value) - result.__class__ = archetypal.EnergyDataFrame - return result.__finalize__(self) - - def stack(self, level=-1, dropna=True): - """ - Args: - level: - dropna: - """ - from pandas.core.reshape.reshape import stack, stack_multiple - - if isinstance(level, (tuple, list)): - result = stack_multiple(self, level, dropna=dropna) - return self.__finalize__(result) - else: - result = stack(self, level, dropna=dropna) - return self.__finalize__(result) - - def plot3d(self, *args, **kwargs): - """Generate a plot of the EnergySeries. - - Wraps the ``plot_energyseries()`` function, and documentation is - copied from there. - - Args: - *args: - **kwargs: - """ - return plot_energyseries(self, *args, **kwargs) - - def plot2d(self, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - return plot_energyseries_map(self, **kwargs) - - # @property - # def units(self): - # return self.units.units - - @property - def p_max(self): - if isinstance(self.index, MultiIndex): - return self.groupby(level=0).max() - else: - return self.max() - - @property - def monthly(self): - if isinstance(self.index, MultiIndex): - return self.groupby(level=0).max() - else: - datetimeindex = date_range( - freq=self.frequency, - start="{}-01-01".format(self.base_year), - periods=self.size, - ) - self_copy = self.copy() - self_copy.index = datetimeindex - self_copy = self_copy.resample("M").mean() - self_copy.frequency = "M" - return EnergySeries(self_copy, frequency="M", units=self.units) - - @property - def capacity_factor(self): - max = self.max() - mean = self.mean() - return mean / max - - @property - def bin_edges(self): - return self.bin_edges_ - - @property - def time_at_min(self): - return self.idxmin() - - @property - def bin_scaling_factors(self): - return self.bin_scaling_factors_ - - @property - def duration_scaling_factor(self): - return list(map(tuple, self.bin_scaling_factors.values)) - - @property - def ldc(self): - nb_points = len(self) - newdata = self.sort_values(ascending=False).reset_index(drop=True) - return newdata.__finalize__(self) - - @property - def nseries(self): - if self.data.ndim == 1: - return 1 - else: - return self.data.shape[1] - - -def save_and_show( - fig, ax, save, show, close, filename, file_format, dpi, axis_off, extent -): - """Save a figure to disk and show it, as specified. - - Args: - fig (matplotlib.figure.Figure): the figure - ax (matplotlib.axes.Axes or list(matplotlib.axes.Axes)): the axes - save (bool): whether to save the figure to disk or not - show (bool): whether to display the figure or not - close (bool): close the figure (only if show equals False) to prevent - display - filename (string): the name of the file to save - file_format (string): the format of the file to save (e.g., 'jpg', - 'png', 'svg') - dpi (int): the resolution of the image file if saving (Dots per inch) - axis_off (bool): if True matplotlib axis was turned off by plot_graph so - constrain the saved figure's extent to the interior of the axis - extent: - - Returns: - (tuple) fig, ax - """ - # save the figure if specified - - if save: - start_time = time.time() - - # create the save folder if it doesn't already exist - if not os.path.exists(settings.imgs_folder): - os.makedirs(settings.imgs_folder) - path_filename = os.path.join( - settings.imgs_folder, os.extsep.join([filename, file_format]) - ) - - if not isinstance(ax, (np.ndarray, list)): - ax = [ax] - if file_format == "svg": - for ax in ax: - # if the file_format is svg, prep the fig/ax a bit for saving - ax.axis("off") - ax.set_position([0, 0, 1, 1]) - ax.patch.set_alpha(0.0) - fig.patch.set_alpha(0.0) - fig.savefig( - path_filename, - bbox_inches=0, - format=file_format, - facecolor=fig.get_facecolor(), - transparent=True, - ) - else: - if extent is None: - if len(ax) == 1: - if axis_off: - for ax in ax: - # if axis is turned off, constrain the saved - # figure's extent to the interior of the axis - extent = ax.get_window_extent().transformed( - fig.dpi_scale_trans.inverted() - ) - else: - extent = "tight" - fig.savefig( - path_filename, - dpi=dpi, - bbox_inches=extent, - format=file_format, - facecolor=fig.get_facecolor(), - transparent=True, - ) - log( - "Saved the figure to disk in {:,.2f} seconds".format( - time.time() - start_time - ) - ) - - # show the figure if specified - if show: - start_time = time.time() - plt.show() - # fig.show() - log("Showed the plot in {:,.2f} seconds".format(time.time() - start_time)) - # if show=False, close the figure if close=True to prevent display - elif close: - plt.close() - - return fig, ax - - -def plot_energyseries( - energy_series, - kind="polygon", - axis_off=True, - cmap=None, - fig_height=None, - fig_width=6, - show=True, - view_angle=-60, - save=False, - close=False, - dpi=300, - file_format="png", - color=None, - axes=None, - vmin=None, - vmax=None, - filename=None, - timeStepsPerPeriod=24, - **kwargs -): - """ - Args: - energy_series (EnergySeries): - kind (str): - axis_off (bool): - cmap: - fig_height (float): - fig_width (float): - show (bool): - view_angle (float): - save (bool): - close (bool): - dpi (int): - file_format (str): - color (str): - axes: - vmin (float): - vmax (float): - filename (str): - timeStepsPerPeriod (int): The number of discrete timesteps which - describe one period. - **kwargs: - """ - if energy_series.empty: - warnings.warn( - "The EnergyProgile you are attempting to plot is " - "empty. Nothing has been displayed.", - UserWarning, - ) - return axes - - import matplotlib.pyplot as plt - - # noinspection PyUnresolvedReferences - from mpl_toolkits.mplot3d import Axes3D - - if isinstance(energy_series.index, pd.MultiIndex): - groups = energy_series.groupby(level=0) - nax = len(groups) - else: - nax = 1 - groups = [("unnamed", energy_series)] - - if fig_height is None: - fig_height = fig_width * nax - - # Set up plot - fig, axes = plt.subplots( - nax, - 1, - subplot_kw=dict(projection="3d"), - figsize=(fig_width, fig_height), - dpi=dpi, - ) - if not isinstance(axes, np.ndarray): - axes = [axes] - - for ax, (name, profile) in zip(axes, groups): - values = profile.values - - vmin = values.min() if vmin is None else vmin - vmax = values.max() if vmax is None else vmax - - if kind == "polygon": - import tsam.timeseriesaggregation as tsam - - z, _ = tsam.unstackToPeriods(profile, timeStepsPerPeriod=timeStepsPerPeriod) - nrows, ncols = z.shape - - xs = z.columns - zs = z.index.values - - verts = [] - for i in zs: - ys = z.iloc[int(i), :] - verts.append(_polygon_under_graph(xs, ys)) - - _plot_poly_collection( - ax, - verts, - zs, - edgecolors=kwargs.get("edgecolors", None), - facecolors=kwargs.get("facecolors", None), - linewidths=kwargs.get("linewidths", None), - cmap=cmap, - ) - elif kind == "surface": - import tsam.timeseriesaggregation as tsam - - z, _ = tsam.unstackToPeriods(profile, timeStepsPerPeriod=timeStepsPerPeriod) - nrows, ncols = z.shape - x = z.columns - y = z.index.values - - x, y = np.meshgrid(x, y) - _plot_surface(ax, x, y, z.values, cmap=cmap, **kwargs) - elif kind == "contour": - import tsam.timeseriesaggregation as tsam - - z, _ = tsam.unstackToPeriods(profile, timeStepsPerPeriod=timeStepsPerPeriod) - nrows, ncols = z.shape - x = z.columns - y = z.index.values - - x, y = np.meshgrid(x, y) - _plot_contour(ax, x, y, z.values, cmap=cmap, **kwargs) - else: - raise NameError('plot kind "{}" is not supported'.format(kind)) - - if filename is None: - filename = "unnamed" - - # set the extent of the figure - ax.set_xlim3d(-1, ncols) - ax.set_xlabel(kwargs.get("xlabel", "hour of day")) - ax.set_ylim3d(-1, nrows) - ax.set_ylabel(kwargs.get("ylabel", "day of year")) - ax.set_zlim3d(vmin, vmax) - z_label = "{} [{:~P}]".format( - energy_series.name if energy_series.name is not None else "Z", - energy_series.units, - ) - ax.set_zlabel(z_label) - - # configure axis appearance - xaxis = ax.xaxis - yaxis = ax.yaxis - zaxis = ax.zaxis - - xaxis.get_major_formatter().set_useOffset(False) - yaxis.get_major_formatter().set_useOffset(False) - zaxis.get_major_formatter().set_useOffset(False) - - # if axis_off, turn off the axis display set the margins to zero and - # point the ticks in so there's no space around the plot - if axis_off: - ax.axis("off") - ax.margins(0) - ax.tick_params(which="both", direction="in") - xaxis.set_visible(False) - yaxis.set_visible(False) - zaxis.set_visible(False) - fig.canvas.draw() - if view_angle is not None: - ax.view_init(30, view_angle) - ax.set_proj_type(kwargs.get("proj_type", "persp")) - fig.canvas.draw() - fig, axes = save_and_show( - fig=fig, - ax=axes, - save=save, - show=show, - close=close, - filename=filename, - file_format=file_format, - dpi=dpi, - axis_off=axis_off, - extent=None, - ) - return fig, axes - - -def plot_energyseries_map( - data, - periodlength=24, - subplots=False, - vmin=None, - vmax=None, - axis_off=True, - cmap="RdBu", - fig_height=None, - fig_width=6, - show=True, - view_angle=-60, - save=False, - close=False, - dpi=300, - file_format="png", - color=None, - ax=None, - filename="untitled", - extent="tight", - sharex=False, - sharey=False, - layout=None, - layout_type="vertical", - **kwargs -): - """ - Args: - data (EnergySeries or EnergyDataFrame): - periodlength: - subplots: - vmin: - vmax: - axis_off: - cmap: - fig_height: - fig_width: - show: - view_angle: - save: - close: - dpi: - file_format: - color: - ax: - filename: - extent: - sharex: - sharey: - layout: - layout_type: - **kwargs: - """ - if fig_height is None: - fig_height = fig_width / 3 - figsize = (fig_width, fig_height) - - if not ax: - if subplots: - if isinstance(data, EnergySeries): - data = data.unstack(level=0) - n = data.shape[1] - else: - n = 1 - fig, axes = plt.subplots( - nrows=n, ncols=1, figsize=(fig_width, fig_height), dpi=dpi - ) - else: - fig = ax.get_figure() - if figsize is not None: - fig.set_size_inches(figsize) - axes = ax - - stacked, timeindex = tsam.unstackToPeriods(copy.deepcopy(data), periodlength) - cmap = plt.get_cmap(cmap) - im = axes.imshow( - stacked.values.T, interpolation="nearest", vmin=vmin, vmax=vmax, cmap=cmap - ) - axes.set_aspect("auto") - axes.set_ylabel("Hour") - plt.xlabel("Day") - - # fig.subplots_adjust(right=1.1) - cbar = fig.colorbar(im, ax=axes) - cbar.set_label("{} [{:~P}]".format(data.name, data.units)) - - fig, axes = save_and_show( - fig, axes, save, show, close, filename, file_format, dpi, axis_off, extent - ) - - return fig, axes - - -def _plot_poly_collection( - ax, verts, zs=None, color=None, cmap=None, vmin=None, vmax=None, **kwargs -): - """ - Args: - ax: - verts: - zs: - color: - cmap: - vmin: - vmax: - **kwargs: - """ - from matplotlib.collections import PolyCollection - - # if None in zs: - # zs = None - - # color=None overwrites specified facecolor/edgecolor with default color - if color is not None: - kwargs["color"] = color - import matplotlib as mpl - - norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax) - - poly = PolyCollection(verts, **kwargs) - if zs is not None: - poly.set_array(np.asarray(zs)) - poly.set_cmap(cmap) - poly.set_clim(vmin, vmax) - - ax.add_collection3d(poly, zs=zs, zdir="y") - # ax.autoscale_view() - return poly - - -def _plot_surface(ax, x, y, z, cmap=None, **kwargs): - """ - Args: - ax: - x: - y: - z: - cmap: - **kwargs: - """ - if cmap is None: - cmap = cm.gist_earth - - ls = LightSource(270, 45) - # To use a custom hillshading mode, override the built-in shading and pass - # in the rgb colors of the shaded surface calculated from "shade". - rgb = ls.shade(z, cmap=cm.get_cmap(cmap), vert_exag=0.1, blend_mode="soft") - surf = ax.plot_surface( - x, - y, - z, - rstride=1, - cstride=1, - facecolors=rgb, - linewidth=0, - antialiased=False, - shade=False, - **kwargs - ) - return surf - - -def _plot_contour(ax, x, y, z, cmap=None, **kwargs): - """ - Args: - ax: - x: - y: - z: - cmap: - **kwargs: - """ - if cmap is None: - cmap = cm.gist_earth - surf = ax.contour3D(x, y, z, 150, cmap=cmap, **kwargs) - return surf - - -def _polygon_under_graph(xlist, ylist): - """Construct the vertex list which defines the polygon filling the space - under the (xlist, ylist) line graph. Assumes the xs are in ascending order. - - Args: - xlist: - ylist: - """ - return [(xlist[0], 0.0), *zip(xlist, ylist), (xlist[-1], 0.0)] - - -EnergySeries.plot3d.__doc__ = plot_energyseries.__doc__ -EnergySeries.plot2d.__doc__ = plot_energyseries_map.__doc__ diff --git a/archetypal/eplus_interface/__init__.py b/archetypal/eplus_interface/__init__.py new file mode 100644 index 00000000..462bf1ca --- /dev/null +++ b/archetypal/eplus_interface/__init__.py @@ -0,0 +1,34 @@ +"""EnergyPlus python interface.""" + +__all__ = [ + "InvalidEnergyPlusVersion", + "EnergyPlusProcessError", + "EnergyPlusVersion", + "EnergyPlusProgram", + "EnergyPlusVersionError", + "EnergyPlusWeatherError", + "BasementThread", + "EnergyPlusExe", + "EnergyPlusThread", + "ExpandObjectsThread", + "SlabThread", + "TransitionThread", + "get_eplus_dirs", +] + +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 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/basement.py b/archetypal/eplus_interface/basement.py new file mode 100644 index 00000000..a69cb531 --- /dev/null +++ b/archetypal/eplus_interface/basement.py @@ -0,0 +1,217 @@ +"""Slab module""" + +import logging as lg +import shutil +import subprocess +import time +from threading import Thread + +from eppy.runner.run_functions import paths_from_version +from path import Path +from tqdm import tqdm + +from archetypal.utils import log + +from ..eplus_interface.exceptions import EnergyPlusProcessError, EnergyPlusVersionError +from ..eplus_interface.version import EnergyPlusVersion + + +class BasementThread(Thread): + """Basement program manager. + + The basement program used to calculate the results is included with the + EnergyPlus distribution. It requires an input file named GHTin.idf in + input data file format. The needed corresponding idd file is + SlabGHT.idd. An EnergyPlus weather file for the location is also needed. + """ + + def __init__(self, idf, tmp): + """Constructor.""" + super(BasementThread, self).__init__() + self.p = None + self.std_out = None + self.std_err = None + self.idf = idf + self.cancelled = False + self.run_dir = Path(tmp).expand() + self.exception = None + self.name = "RunBasement_" + self.idf.name + self.include = None + + @property + def cmd(self): + """Get the command.""" + cmd_path = Path(shutil.which("Basement", path=self.run_dir)) + return [cmd_path.relpath(self.run_dir)] + + def run(self): + """Wrapper around the Basement command line interface.""" + self.cancelled = False + # get version from IDF object or by parsing the IDF file for it + + # Move files into place + # copy "%wthrfile%.epw" in.epw + self.epw = self.idf.epw.copy(self.run_dir / "in.epw").expand() + self.idfname = Path(self.idf.savecopy(self.run_dir / "in.idf")).expand() + self.idd = self.idf.iddname.copy(self.run_dir).expand() + + # Get executable using shutil.which (determines the extension based on + # the platform, eg: .exe. And copy the executable to tmp + self.basement_exe = Path( + shutil.which( + "Basement", path=self.eplus_home / "PreProcess" / "GrndTempCalc" + ) + ).copy(self.run_dir) + self.basement_idd = ( + self.eplus_home / "PreProcess" / "GrndTempCalc" / "BasementGHT.idd" + ).copy(self.run_dir) + self.outfile = self.idf.name + + # The BasementGHTin.idf file is copied from the self.include list ( + # added by ExpandObjects. If self.include is empty, no need to run + # Basement. + self.include = [Path(file).copy(self.run_dir) for file in self.idf.include] + if "BasementGHTIn.idf" not in self.include: + self.cleanup_callback() + return + + self.msg_callback( + "===== (Run Basement Temperature Generation) ===== Start =====" + ) + self.msg_callback("Running Basement.exe") + self.msg_callback(f"Input File : {self.idfname}") + self.msg_callback( + f"Output Files: {self.outfile}_bsmt.csv " + f"{self.outfile}_bsmt.audit {self.outfile}_bsmt.out" + ) + self.msg_callback(f"Weather File: {self.epw}") + + # Run Slab Program + with tqdm( + unit_scale=True, + miniters=1, + desc=f"RunBasement #{self.idf.position}-{self.idf.name}", + position=self.idf.position, + ) as progress: + + self.p = subprocess.Popen( + self.cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True, # can use shell + cwd=self.run_dir, + ) + start_time = time.time() + self.msg_callback("Begin Basement Temperature Calculation processing . . .") + + for line in self.p.stdout: + self.msg_callback(line.decode("utf-8").strip("\n")) + progress.update() + + # We explicitly close stdout + self.p.stdout.close() + + # Wait for process to complete + self.p.wait() + + # Communicate callbacks + if self.cancelled: + self.msg_callback("RunSlab cancelled") + # self.cancelled_callback(self.std_out, self.std_err) + else: + if self.p.returncode == 0: + self.msg_callback( + "RunSlab completed in {:,.2f} seconds".format( + time.time() - start_time + ) + ) + self.success_callback() + for line in self.p.stderr: + self.msg_callback(line.decode("utf-8")) + else: + self.msg_callback("RunSlab failed") + self.failure_callback() + + def msg_callback(self, *args, **kwargs): + """Pass message to logger.""" + log(*args, name=self.idf.name, **kwargs) + + def success_callback(self): + """Parse surface temperature and append to IDF file.""" + csv_ = self.run_dir / "MonthlyResults.csv" + if csv_.exists(): + csv_ = csv_.rename(self.idf.output_directory / f"{self.outfile}_bsmt.csv") + + input_ = self.run_dir / "RunINPUT.TXT" + if input_.exists(): + input_ = input_.rename( + self.idf.output_directory / f"{self.outfile}_bsmt.out" + ) + + debug_ = self.run_dir / "RunDEBUGOUT.txt" + if debug_.exists(): + debug_ = debug_.rename(self.idf.output_directory / "basementout.audit") + + err_ = self.run_dir / "eplusout.err" + if err_.exists(): + with open(err_) as f: + with open(debug_, "a") as f1: + for line in f: + f1.write(line) + + audit_ = self.run_dir / "audit.out" + if audit_.exists(): + with open(audit_) as f: + with open(debug_, "a") as f1: + for line in f: + f1.write(line) + + ep_objects = self.run_dir / "EPObjects.txt" + if ep_objects.exists(): + with open(self.idf.idfname, "a") as outfile: + with open(ep_objects) as infile: + next(infile) # Skipping first line + next(infile) # Skipping second line + for line in infile: + outfile.write(line) + # invalidate attributes dependant on idfname, since it has changed + self.idf._reset_dependant_vars("idfname") + self.cleanup_callback() + + def cleanup_callback(self): + """clean up temp files, directories and variables that need cleanup.""" + + # Remove from include + ghtin = self.idf.output_directory / "BasementGHTIn.idf" + if ghtin.exists(): + try: + self.idf.include.remove(ghtin) + ghtin.remove() + except ValueError: + log("nothing to remove", lg.DEBUG) + + def failure_callback(self): + """Parse error file and log""" + error_filename = self.run_dir / "eplusout.err" + if error_filename.exists(): + with open(error_filename, "r") as stderr: + stderr_r = stderr.read() + self.exception = EnergyPlusProcessError( + cmd=self.cmd, stderr=stderr_r, idf=self.idf + ) + self.cleanup_callback() + + def cancelled_callback(self, stdin, stdout): + """Call on cancelled.""" + self.cleanup_callback() + + @property + def eplus_home(self): + eplus_exe, eplus_home = paths_from_version(self.idf.as_version.dash) + if not Path(eplus_home).exists(): + raise EnergyPlusVersionError( + msg=f"No EnergyPlus Executable found for version " + f"{EnergyPlusVersion(self.idf.as_version)}" + ) + else: + return Path(eplus_home) diff --git a/archetypal/eplus_interface/energy_plus.py b/archetypal/eplus_interface/energy_plus.py new file mode 100644 index 00000000..ca3d7b3b --- /dev/null +++ b/archetypal/eplus_interface/energy_plus.py @@ -0,0 +1,300 @@ +import logging as lg +import subprocess +import time +from subprocess import CalledProcessError +from threading import Thread + +import eppy +from eppy.runner.run_functions import paths_from_version +from path import Path +from tqdm import tqdm + +from archetypal.eplus_interface.exceptions import ( + EnergyPlusProcessError, + EnergyPlusVersionError, +) +from archetypal.eplus_interface.version import EnergyPlusVersion +from archetypal.utils import log + + +class EnergyPlusProgram: + def __init__(self, idf): + self.idf = idf + + @property + def eplus_home(self): + eplus_exe, eplus_home = paths_from_version(self.idf.as_version.dash) + if not Path(eplus_home).exists(): + raise EnergyPlusVersionError( + msg=f"No EnergyPlus Executable found for version " + f"{EnergyPlusVersion(self.idf.as_version)}" + ) + else: + return Path(eplus_home) + + +class EnergyPlusExe: + """Usage: energyplus [options] [input-file]""" + + def __init__( + self, + idfname, + epw, + output_directory, + ep_version, + annual=False, + convert=False, + design_day=False, + help=False, + idd=None, + epmacro=False, + output_prefix="eplus", + readvars=True, + output_sufix="L", + version=False, + expandobjects=True, + ): + """ + 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 + file type. (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) + epmacro (bool): Run EPMacro prior to simulation. (default: True) + 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) + version (bool): Display version information (default: False) + expandobjects (bool): Run ExpandObjects prior to simulation. (default: True) + """ + self.a = annual + self.c = convert + self.d = output_directory + self.D = design_day + self.h = help + self.i = idd + self.m = epmacro + self.p = output_prefix + self.r = readvars + self.s = output_sufix + self.v = version + self.w = epw + self.x = expandobjects + + self.idfname = idfname + self.ep_version = ep_version + + self.get_exe_path() + + def get_exe_path(self): + (eplus_exe_path, eplus_weather_path) = eppy.runner.run_functions.install_paths( + self.ep_version.dash, self.i + ) + if not Path(eplus_exe_path).exists(): + raise EnergyPlusVersionError( + msg=f"No EnergyPlus Executable found for version " + f"{EnergyPlusVersion(self.ep_version)}" + ) + self.eplus_exe_path = Path(eplus_exe_path).expand() + 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 [ + "idfname", + "ep_version", + "eplus_exe_path", + "eplus_weather_path", + ]: + if isinstance(value, bool): + cmd.append(f"-{key}") if value else None + else: + cmd.extend([f"-{key}", value]) if value is not None else None + cmd.append(self.idfname) + return cmd + + def cmd(self): + return self.__repr__() + + +class EnergyPlusThread(Thread): + def __init__(self, idf, tmp): + """ + + Args: + idf (IDF): The idf model. + tmp (str or Path): The directory in which the process will be launched. + """ + super(EnergyPlusThread, self).__init__() + self.p = None + self.std_out = None + self.std_err = None + self.idf = idf + self.cancelled = False + self.run_dir = Path("") + self.exception = None + self.name = "EnergyPlus_" + self.idf.name + self.tmp = tmp + + def stop(self): + if self.p.poll() is None: + self.msg_callback("Attempting to cancel simulation ...") + self.cancelled = True + self.p.kill() + + def run(self): + """Wrapper around the EnergyPlus command line interface. + + Adapted from :func:`eppy.runner.runfunctions.run`. + """ + self.cancelled = False + # get version from IDF object or by parsing the IDF file for it + + tmp = self.tmp + self.epw = self.idf.epw.copy(tmp).expand() + self.idfname = Path(self.idf.savecopy(tmp / self.idf.name)).expand() + self.idd = self.idf.iddname.copy(tmp).expand() + self.run_dir = Path(tmp).expand() + self.include = [Path(file).copy(tmp) for file in self.idf.include] + + # build a list of command line arguments + try: + self.cmd = EnergyPlusExe( + idfname=self.idfname, + epw=self.epw, + output_directory=self.run_dir, + ep_version=self.idf.as_version, + annual=self.idf.annual, + convert=self.idf.convert, + design_day=self.idf.design_day, + help=False, + idd=self.idd, + epmacro=self.idf.epmacro, + output_prefix=self.idf.output_prefix, + readvars=self.idf.readvars, + output_sufix=self.idf.output_suffix, + version=False, + expandobjects=self.idf.expandobjects, + ).cmd() + except EnergyPlusVersionError as e: + self.exception = e + self.p.kill() # kill process to be sure + return + + # Start process with tqdm bar + with tqdm( + unit_scale=True, + total=self.idf.energyplus_its if self.idf.energyplus_its > 0 else None, + miniters=1, + desc=f"EnergyPlus #{self.idf.position}-{self.idf.name}" + if self.idf.position + else f"EnergyPlus {self.idf.name}", + position=self.idf.position, + ) as progress: + self.p = subprocess.Popen( + self.cmd, + shell=False, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + start_time = time.time() + self.msg_callback("Simulation started") + self.idf._energyplus_its = 0 # reset counter + for line in self.p.stdout: + self.msg_callback(line.decode("utf-8").strip("\n")) + self.idf._energyplus_its += 1 + progress.update() + + # We explicitly close stdout + self.p.stdout.close() + + # Wait for process to complete + self.p.wait() + + # Communicate callbacks + if self.cancelled: + self.msg_callback("Simulation cancelled") + self.cancelled_callback(self.std_out, self.std_err) + else: + if self.p.returncode == 0: + self.msg_callback( + "EnergyPlus Completed in {:,.2f} seconds".format( + time.time() - start_time + ) + ) + self.success_callback() + else: + self.msg_callback("Simulation failed") + self.failure_callback() + + def msg_callback(self, *args, **kwargs): + log(*args, name=self.idf.name, **kwargs) + + def success_callback(self): + save_dir = self.idf.simulation_dir + if self.idf.keep_data: + try: + save_dir.rmtree_p() # purge target dir + self.run_dir.copytree(save_dir) # copy files + except PermissionError as e: + pass + else: + log( + "Files generated at the end of the simulation: %s" + % "\n".join(save_dir.files()), + lg.DEBUG, + name=self.name, + ) + + def failure_callback(self): + error_filename = self.run_dir / self.idf.output_prefix + "out.err" + try: + with open(error_filename, "r") as stderr: + stderr_r = stderr.read() + if self.idf.keep_data_err: + failed_dir = self.idf.simulation_dir.mkdir_p() / "failed" + try: + failed_dir.rmtree_p() + except PermissionError as e: + log(f"Could not remove {failed_dir}") + else: + self.run_dir.copytree(failed_dir) # no need to create folder before + self.exception = EnergyPlusProcessError( + cmd=self.cmd, stderr=stderr_r, idf=self.idf + ) + except FileNotFoundError: + self.exception = CalledProcessError( + self.p.returncode, cmd=self.cmd, stderr=self.p.stderr + ) + + def cancelled_callback(self, stdin, stdout): + pass + + @property + def eplus_home(self): + eplus_exe, eplus_home = paths_from_version(self.idf.as_version.dash) + if not Path(eplus_home).exists(): + raise EnergyPlusVersionError( + msg=f"No EnergyPlus Executable found for version " + f"{EnergyPlusVersion(self.idf.as_version)}" + ) + else: + return Path(eplus_home) diff --git a/archetypal/eplus_interface/exceptions.py b/archetypal/eplus_interface/exceptions.py new file mode 100644 index 00000000..03323a27 --- /dev/null +++ b/archetypal/eplus_interface/exceptions.py @@ -0,0 +1,76 @@ +from packaging.version import InvalidVersion +from tabulate import tabulate + + +class EnergyPlusProcessError(Exception): + """EnergyPlus Process call error""" + + def __init__(self, cmd=None, stderr=None, idf=None): + """ + Args: + cmd: + stderr: + idf: + """ + self.cmd = cmd + self.idf = idf + self.stderr = stderr + super().__init__(self.stderr) + + def __str__(self): + """Override that only returns the stderr""" + try: + name = self.idf.idfname.abspath() + except Exception: + name = self.idf.name + msg = ":\n".join([name, self.stderr]) + return msg + + def write(self): + # create and add headers + invalid = [{"Filename": self.idf, "Error": self.stderr}] + return tabulate(invalid, headers="keys") + + +class EnergyPlusVersionError(Exception): + """EnergyPlus Version call error""" + + def __init__(self, msg=None, idf_file=None, idf_version=None, ep_version=None): + super(EnergyPlusVersionError, self).__init__(None) + self.msg = msg + self.idf_file = idf_file + self.idf_version = idf_version + self.ep_version = ep_version + + def __str__(self): + """Override that only returns the stderr""" + if not self.msg: + if self.idf_version > self.ep_version: + compares_ = "higher" + self.msg = ( + f"The version of {self.idf_file.basename()} (v{self.idf_version}) " + f"is {compares_} than the specified EnergyPlus version " + f"(v{self.ep_version}). This file looks like it has already been " + f"transitioned to a newer version" + ) + else: + compares_ = "lower" + self.msg = ( + f"The version of {self.idf_file.basename()} (v{self.idf_version}) " + f"is {compares_} than the specified EnergyPlus version " + f"(v{self.ep_version})" + ) + + return self.msg + + +class EnergyPlusWeatherError(Exception): + """Error for when weather file is not defined""" + + pass + + +class InvalidEnergyPlusVersion(InvalidVersion): + """ + An invalid version was found, users should refer to EnergyPlus Documentation. + """ diff --git a/archetypal/eplus_interface/expand_objects.py b/archetypal/eplus_interface/expand_objects.py new file mode 100644 index 00000000..e70743dd --- /dev/null +++ b/archetypal/eplus_interface/expand_objects.py @@ -0,0 +1,161 @@ +"""ExpandObjects module""" + +import logging as lg +import shutil +import subprocess +import time +from io import StringIO +from subprocess import CalledProcessError +from threading import Thread + +from eppy.runner.run_functions import paths_from_version +from path import Path +from tqdm import tqdm + +from archetypal.eplus_interface.energy_plus import EnergyPlusProgram +from archetypal.eplus_interface.exceptions import EnergyPlusVersionError +from archetypal.eplus_interface.version import EnergyPlusVersion +from archetypal.utils import log + + +class ExpandObjectsExe(EnergyPlusProgram): + """ExpandObject Wrapper""" + + def __init__(self, idf): + """Constructor.""" + super().__init__(idf) + + @property + def cmd(self): + """Get the command.""" + return ["ExpandObjects"] + + +class ExpandObjectsThread(Thread): + """ExpandObjects program manager.""" + + def __init__(self, idf, tmp): + """Constructor.""" + super(ExpandObjectsThread, self).__init__() + self.p = None + self.std_out = None + self.std_err = None + self.idf = idf + self.cancelled = False + self.run_dir = Path("") + self.exception = None + self.name = "ExpandObjects_" + self.idf.name + self.tmp = tmp + self.cmd = None + + def run(self): + """Wrapper around the EnergyPlus command line interface.""" + try: + self.cancelled = False + # get version from IDF object or by parsing the IDF file for it + + # Move files into place + tmp = self.tmp + self.epw = self.idf.epw.copy(tmp / "in.epw").expand() + self.idfname = Path(self.idf.savecopy(tmp / "in.idf")).expand() + self.idd = self.idf.iddname.copy(tmp / "Energy+.idd").expand() + self.expandobjectsexe = Path( + shutil.which("ExpandObjects", path=self.eplus_home.expand()) + ).copy2(tmp) + self.run_dir = Path(tmp).expand() + + # Run ExpandObjects Program + self.cmd = ExpandObjectsExe(self.idf).cmd + with tqdm( + unit_scale=True, + miniters=1, + desc=f"ExpandObjects #{self.idf.position}-{self.idf.name}", + position=self.idf.position, + ) as progress: + + self.p = subprocess.Popen( + self.cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True, # can use shell + cwd=self.run_dir.abspath(), + ) + start_time = time.time() + # self.msg_callback("ExpandObjects started") + for line in self.p.stdout: + self.msg_callback(line.decode("utf-8")) + progress.update() + + # We explicitly close stdout + self.p.stdout.close() + + # Wait for process to complete + self.p.wait() + + # Communicate callbacks + if self.cancelled: + self.msg_callback("ExpandObjects cancelled") + # self.cancelled_callback(self.std_out, self.std_err) + else: + if self.p.returncode == 0: + self.msg_callback( + f"ExpandObjects completed in " + f"{time.time() - start_time:,.2f} seconds" + ) + self.success_callback() + else: + self.failure_callback() + except Exception as e: + self.exception = e + if self.p is not None: + self.p.kill() # kill process to be sure + return + + def msg_callback(self, *args, **kwargs): + """Pass message to logger.""" + log(*args, name=self.idf.name, **kwargs) + + def success_callback(self): + """Replace idf with expanded.idf.""" + if (self.run_dir / "expanded.idf").exists(): + if isinstance(self.idf.idfname, StringIO): + file = StringIO((self.run_dir / "expanded.idf").read_text()) + else: + file = (self.run_dir / "expanded.idf").copy(self.idf.idfname) + self.idf.idfname = file + if (Path(self.run_dir) / "GHTIn.idf").exists(): + self.idf.include.append( + (Path(self.run_dir) / "GHTIn.idf").copy( + self.idf.output_directory / "GHTIn.idf" + ) + ) + + if (Path(self.run_dir) / "BasementGHTIn.idf").exists(): + self.idf.include.append( + (Path(self.run_dir) / "BasementGHTIn.idf").copy( + self.idf.output_directory / "BasementGHTIn.idf" + ) + ) + + def failure_callback(self): + """Read stderr and pass to logger.""" + for line in self.p.stderr: + self.msg_callback(line.decode("utf-8"), level=lg.ERROR) + self.exception = CalledProcessError( + self.p.returncode, cmd=self.cmd, stderr=self.p.stderr + ) + + def cancelled_callback(self, stdin, stdout): + """Call on cancelled.""" + pass + + @property + def eplus_home(self): + eplus_exe, eplus_home = paths_from_version(self.idf.as_version.dash) + if not Path(eplus_home).exists(): + raise EnergyPlusVersionError( + msg=f"No EnergyPlus Executable found for version " + f"{EnergyPlusVersion(self.idf.as_version)}" + ) + else: + return Path(eplus_home) diff --git a/archetypal/eplus_interface/slab.py b/archetypal/eplus_interface/slab.py new file mode 100644 index 00000000..56a2e53d --- /dev/null +++ b/archetypal/eplus_interface/slab.py @@ -0,0 +1,174 @@ +"""Slab module""" + +import logging as lg +import shutil +import subprocess +import time +from threading import Thread + +from eppy.runner.run_functions import paths_from_version +from path import Path +from tqdm import tqdm + +from archetypal.eplus_interface.exceptions import ( + EnergyPlusProcessError, + EnergyPlusVersionError, +) +from archetypal.eplus_interface.version import EnergyPlusVersion +from archetypal.utils import log + + +class SlabThread(Thread): + """Slab program manager. + + The slab program used to calculate the results is included with the + EnergyPlus distribution. It requires an input file named GHTin.idf in + input data file format. The needed corresponding idd file is + SlabGHT.idd. An EnergyPlus weather file for the location is also needed. + """ + + def __init__(self, idf, tmp): + """Constructor.""" + super(SlabThread, self).__init__() + self.p = None + self.std_out = None + self.std_err = None + self.idf = idf + self.cancelled = False + self.run_dir = Path(tmp).expand() + self.exception = None + self.name = "RunSlab_" + self.idf.name + self.include = None + + @property + def cmd(self): + """Get the command.""" + cmd_path = Path(shutil.which("Slab", path=self.run_dir)) + return [cmd_path.relpath(self.run_dir)] + + def run(self): + """Wrapper around the EnergyPlus command line interface.""" + self.cancelled = False + # get version from IDF object or by parsing the IDF file for it + + # Move files into place + self.epw = self.idf.epw.copy(self.run_dir / "in.epw").expand() + self.idfname = Path(self.idf.savecopy(self.run_dir / "in.idf")).expand() + self.idd = self.idf.iddname.copy(self.run_dir).expand() + + # Get executable using shutil.which (determines the extension based on + # the platform, eg: .exe. And copy the executable to tmp + self.slabexe = Path( + shutil.which("Slab", path=self.eplus_home / "PreProcess" / "GrndTempCalc") + ).copy(self.run_dir) + self.slabidd = ( + self.eplus_home / "PreProcess" / "GrndTempCalc" / "SlabGHT.idd" + ).copy(self.run_dir) + + # The GHTin.idf file is copied from the self.include list (added by + # ExpandObjects. If self.include is empty, no need to run Slab. + self.include = [Path(file).copy(self.run_dir) for file in self.idf.include] + if not self.include: + self.cleanup_callback() + return + + # Run Slab Program + with tqdm( + unit_scale=True, + miniters=1, + desc=f"RunSlab #{self.idf.position}-{self.idf.name}", + position=self.idf.position, + ) as progress: + + self.p = subprocess.Popen( + self.cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=True, # can use shell + cwd=self.run_dir.abspath(), + ) + start_time = time.time() + self.msg_callback("Begin Slab Temperature Calculation processing . . .") + for line in self.p.stdout: + self.msg_callback(line.decode("utf-8").strip("\n")) + progress.update() + + # We explicitly close stdout + self.p.stdout.close() + + # Wait for process to complete + self.p.wait() + + # Communicate callbacks + if self.cancelled: + self.msg_callback("RunSlab cancelled") + # self.cancelled_callback(self.std_out, self.std_err) + else: + if self.p.returncode == 0: + self.msg_callback( + "RunSlab completed in {:,.2f} seconds".format( + time.time() - start_time + ) + ) + self.success_callback() + for line in self.p.stderr: + self.msg_callback(line.decode("utf-8")) + else: + self.msg_callback("RunSlab failed") + self.failure_callback() + + def msg_callback(self, *args, **kwargs): + """Pass message to logger.""" + log(*args, name=self.idf.name, **kwargs) + + def success_callback(self): + """Parse surface temperature and append to IDF file.""" + temp_schedule = self.run_dir / "SLABSurfaceTemps.txt" + if temp_schedule.exists(): + with open(self.idf.idfname, "a") as outfile: + with open(temp_schedule) as infile: + next(infile) # Skipping first line + next(infile) # Skipping second line + for line in infile: + outfile.write(line) + # invalidate attributes dependant on idfname, since it has changed + self.idf._reset_dependant_vars("idfname") + self.cleanup_callback() + + def cleanup_callback(self): + """clean up temp files, directories and variables that need cleanup.""" + + # Remove from include + ghtin = self.idf.output_directory / "GHTIn.idf" + if ghtin.exists(): + try: + self.idf.include.remove(ghtin) + ghtin.remove() + except ValueError: + log("nothing to remove", lg.DEBUG) + + def failure_callback(self): + """Parse error file and log""" + error_filename = self.run_dir / "eplusout.err" + if error_filename.exists(): + with open(error_filename, "r") as stderr: + stderr_r = stderr.read() + self.exception = EnergyPlusProcessError( + cmd=self.cmd, stderr=stderr_r, idf=self.idf + ) + self.cleanup_callback() + + def cancelled_callback(self, stdin, stdout): + """Call on cancelled.""" + self.cleanup_callback() + + @property + def eplus_home(self): + eplus_exe, eplus_home = paths_from_version(self.idf.as_version.dash) + if not Path(eplus_home).exists(): + raise EnergyPlusVersionError( + msg=f"No EnergyPlus Executable found for version " + f"{EnergyPlusVersion(self.idf.as_version)}" + ) + else: + return Path(eplus_home) diff --git a/archetypal/eplus_interface/transition.py b/archetypal/eplus_interface/transition.py new file mode 100644 index 00000000..b75a6267 --- /dev/null +++ b/archetypal/eplus_interface/transition.py @@ -0,0 +1,293 @@ +"""Transition module.""" + +import logging as lg +import os +import platform +import re +import shutil +import subprocess +import time +from io import StringIO +from subprocess import CalledProcessError +from threading import Thread + +from eppy.runner.run_functions import paths_from_version +from path import Path +from tqdm import tqdm + +from archetypal.eplus_interface.energy_plus import EnergyPlusProgram +from archetypal.eplus_interface.exceptions import ( + EnergyPlusProcessError, + EnergyPlusVersionError, +) +from archetypal.eplus_interface.version import EnergyPlusVersion +from archetypal.utils import log + + +class TransitionExe(EnergyPlusProgram): + """Transition Program Generator. + + Examples: + >>> from archetypal import IDF + >>> for transition in TransitionExe(IDF(), tmp_dir=os.getcwd()): + >>> print(transition.cmd()) + """ + + def __init__(self, idf, tmp_dir): + """Initialize Transition Executable.""" + super().__init__(idf) + self.idf = idf + self.trans = None # Set by __next__() + self.running_directory = tmp_dir + + self._trans_exec = None + + def __next__(self): + """Return next transition.""" + self.trans = next(self.transitions_generator) + return self + + def __iter__(self): + """Iterate over transitions.""" + return self + + def get_exe_path(self): + """Return the path containing the next transition.""" + if not self.trans_exec[self.trans].exists(): + raise EnergyPlusProcessError( + cmd=self.trans_exec[self.trans], + stderr="The specified EnergyPlus version (v{}) does not have" + " the required transition program '{}' in the " + "PreProcess folder. See the documentation " + "(archetypal.readthedocs.io/troubleshooting.html#missing" + "-transition-programs) " + "to solve this issue".format( + self.idf.as_version, self.trans_exec[self.trans] + ), + idf=self.idf, + ) + return self.trans_exec[self.trans] + + @property + def idfname(self): + """Copy and return self.idf to the output directory and expand.""" + return Path(self.idf.savecopy(self.running_directory / "in.idf")).expand() + + @property + def trans_exec(self) -> dict: + """Return dict of {EnergyPlusVersion: executable} for each transitions.""" + + def copytree(src, dst, symlinks=False, ignore=None): + for item in os.listdir(src): + s = os.path.join(src, item) + d = os.path.join(dst, item) + try: + if os.path.isdir(s): + shutil.copytree(s, d, symlinks, ignore) + else: + shutil.copy2(s, d) + except FileNotFoundError as e: + time.sleep(60) + log(f"{e}") + + if self._trans_exec is None: + copytree(self.idf.idfversionupdater_dir, self.running_directory) + self._trans_exec = { + EnergyPlusVersion( + re.search(r"to-V(([\d])-([\d])-([\d]))", exec).group(1) + ): exec + for exec in self.running_directory.files("Transition-V*") + } + return self._trans_exec + + @property + def transitions(self) -> list: + """Return a sorted list of necessary transitions.""" + transitions = [ + key + for key in self.trans_exec + if self.idf.as_version >= key > self.idf.file_version + ] + transitions.sort() + return transitions + + @property + def transitions_generator(self): + """Generate transitions.""" + for transition in self.transitions: + yield transition + + def __str__(self): + """Return string representation.""" + return " ".join(self.__repr__()) + + def __repr__(self): + """Return the command as a string.""" + return self.cmd() + + def cmd(self): + """Get the platform-specific command.""" + _which = Path(shutil.which(self.get_exe_path())) + if platform.system() == "Windows": + cmd = [_which.relpath(), self.idfname.basename()] + else: + # must specify current dir on Unix + cmd = ["./" + _which.basename(), self.idfname.basename()] + return cmd + + +class TransitionThread(Thread): + """Transition program manager.""" + + def __init__(self, idf, tmp, overwrite=False): + """Initialize Thread.""" + super(TransitionThread, self).__init__() + self.overwrite = overwrite + self.p = None + self.std_out = None + self.std_err = None + self.idf = idf + self.cancelled = False + self.run_dir = Path("") + self.exception = None + self.name = "Transition_" + self.idf.name + self.tmp = tmp + self.idfname = None + self.idd = None + self.cmd = None + + def run(self): + """Run. + + Wrapper around the EnergyPlus command line interface. + """ + self.cancelled = False + # get version from IDF object or by parsing the IDF file for it + + # Move files into place + tmp = self.tmp + self.idfname = Path(self.idf.savecopy(tmp / "in.idf")).expand() + self.idd = self.idf.iddname.copy(tmp).expand() + + generator = TransitionExe(self.idf, tmp_dir=tmp) + + for trans in tqdm( + generator, + total=len(generator.transitions), + unit_scale=True, + miniters=1, + position=self.idf.position, + desc=f"Transition #{self.idf.position}-{self.idf.name}", + ): + # Get executable using shutil.which (determines the extension + # based on the platform, eg: .exe. And copy the executable to tmp + self.run_dir = Path(tmp).expand() + + # Run Transition Program + self.cmd = trans.cmd() + self.p = subprocess.Popen( + self.cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + shell=False, # cannot use shell + cwd=self.run_dir, + ) + start_time = time.time() + self.msg_callback("Transition started") + for line in self.p.stdout: + self.msg_callback(line.decode("utf-8").strip("\n")) + + # We explicitly close stdout + self.p.stdout.close() + + # Wait for process to complete + self.p.wait() + + # Communicate callbacks + if self.cancelled: + self.msg_callback("Transition cancelled") + # self.cancelled_callback(self.std_out, self.std_err) + else: + if self.p.returncode == 0: + self.msg_callback( + "Transition completed in {:,.2f} seconds".format( + time.time() - start_time + ) + ) + self.success_callback() + for line in self.p.stderr: + self.msg_callback(line.decode("utf-8")) + else: + self.msg_callback("Transition failed") + self.failure_callback() + + @property + def trans_exec(self) -> dict: + """Return dict of {EnergyPlusVersion, executable} for each transitions.""" + return { + EnergyPlusVersion( + re.search(r"to-V(([\d])-([\d])-([\d]))", exec).group(1) + ): exec + for exec in self.idf.idfversionupdater_dir.files("Transition-V*") + } + + @property + def transitions(self): + """Return a sorted list of necessary transitions.""" + transitions = [ + key + for key in self.trans_exec + if self.idf.as_version >= key > self.idf.file_version + ] + transitions.sort() + return transitions + + def msg_callback(self, *args, **kwargs): + """Pass message to logger.""" + log(*args, name=self.idf.name, **kwargs) + + def success_callback(self): + """Retrieve the transitioned file. + + If self.overwrite is True, the transitioned file replaces the + original file. + """ + for f in Path(self.run_dir).files("*.idfnew"): + if isinstance(self.idf.idfname, StringIO) or not self.overwrite: + file = StringIO(f.read_text()) + else: + file = f.copy(self.idf.idfname) + + # replace idfname with file + try: + self.idf.idfname = file + except (NameError, UnboundLocalError): + self.exception = EnergyPlusProcessError( + cmd="IDF.upgrade", + stderr="An error occurred during transitioning", + idf=self.idf, + ) + else: + self.idf._reset_dependant_vars("idfname") + + def failure_callback(self): + """Read stderr and pass to logger.""" + for line in self.p.stderr: + self.msg_callback(line.decode("utf-8"), level=lg.ERROR) + raise CalledProcessError(self.p.returncode, cmd=self.cmd, stderr=self.p.stderr) + + def cancelled_callback(self, stdin, stdout): + """Call on cancelled.""" + pass + + @property + def eplus_home(self): + """Return the location of the EnergyPlus directory.""" + eplus_exe, eplus_home = paths_from_version(self.idf.as_version.dash) + if not Path(eplus_home).exists(): + raise EnergyPlusVersionError( + msg=f"No EnergyPlus Executable found for version " + f"{EnergyPlusVersion(self.idf.as_version)}" + ) + else: + return Path(eplus_home) diff --git a/archetypal/eplus_interface/version.py b/archetypal/eplus_interface/version.py new file mode 100644 index 00000000..3238d220 --- /dev/null +++ b/archetypal/eplus_interface/version.py @@ -0,0 +1,181 @@ +"""EnergyPlusVersion module.""" + +import platform +import re +import warnings +from itertools import chain + +from packaging.version import Version +from path import Path + +from archetypal import settings +from archetypal.eplus_interface.exceptions import InvalidEnergyPlusVersion +from archetypal.settings import ep_version + + +def get_eplus_dirs(version=ep_version): + """Return EnergyPlus root folder for a specific version. + + Args: + version (str): Version number in the form "9-2-0" to search for. + + Returns: + (Path): The folder path. + """ + from eppy.runner.run_functions import install_paths + + eplus_exe, eplus_weather = install_paths(version) + return Path(eplus_exe).dirname() + + +def get_eplus_basedirs(): + """Return a list of possible E+ install paths.""" + if platform.system() == "Windows": + eplus_homes = Path("C:\\").dirs("EnergyPlus*") + return eplus_homes + elif platform.system() == "Linux": + eplus_homes = Path("/usr/local/").dirs("EnergyPlus*") + return eplus_homes + elif platform.system() == "Darwin": + eplus_homes = Path("/Applications").dirs("EnergyPlus*") + return eplus_homes + else: + warnings.warn( + "Archetypal is not compatible with %s. It is only compatible " + "with Windows, Linux or MacOs" % platform.system() + ) + + +def _latest_energyplus_version(): + """Find all EnergyPlus installs. and returns the latest version number. + + Only looks in default locations on all platforms. + + Returns: + (EnergyPlusVersion): The version number of the latest E+ install + """ + eplus_homes = get_eplus_basedirs() + + # check if any EnergyPlus install exists + if not eplus_homes: + raise Exception( + "No EnergyPlus installation found. Make sure you have EnergyPlus " + "installed. Go to https://energyplus.net/downloads to download the " + "latest version of EnergyPlus." + ) + + # Find the most recent version of EnergyPlus installed from the version + # number (at the end of the folder name) + return sorted( + (re.search(r"([\d])-([\d])-([\d])", home.stem).group() for home in eplus_homes), + reverse=True, + )[0] + + +def warn_if_not_compatible(): + """Check if an EnergyPlus install is detected. + + Warnings: + If the latest version detected is higher than the one specified by + archetypal, a warning is raised. + """ + eplus_homes = get_eplus_basedirs() + + if not eplus_homes: + warnings.warn( + "No installation of EnergyPlus could be detected on this " + "machine. Please install EnergyPlus from https://energyplus.net before " + "using archetypal" + ) + + +class EnergyPlusVersion(Version): + """EnergyPlusVersion class. + + This class subclasses the :class:`packaging.version.Version` class. It is usuful + to compare version numbers together. + + Any EnergyPlusVersion numbers are checked against valid versions before they can + be initialized. + + Examples: + To create a version number: + + >>> from archetypal import EnergyPlusVersion + >>> EnergyPlusVersion("9.2.0") + + + An invalid version number raises an exception: + + >>> from archetypal import EnergyPlusVersion + >>> EnergyPlusVersion("3.2.0") # "3.2.0" was never released. + archetypal.eplus_interface.exceptions.InvalidEnergyPlusVersion + + """ + + def __init__(self, version): + """Initialize an EnergyPlusVersion from a version number. + + Args: + version (str, EnergyPlusVersion): The version number to create. Can be a + string a tuple or another EnergyPlusVersion object. + + Raises: + InvalidEnergyPlusVersion: If the version is not a valid version number. + """ + if isinstance(version, tuple): + version = ".".join(map(str, version[0:3])) + if isinstance(version, Version): + version = ".".join(map(str, (version.major, version.minor, version.micro))) + if isinstance(version, str) and "-" in version: + version = version.replace("-", ".") + super(EnergyPlusVersion, self).__init__(version) + if self.dash not in self.valid_versions: + raise InvalidEnergyPlusVersion + + def __repr__(self) -> str: + """Return a representation of self.""" + return "".format(repr(str(self))) + + @classmethod + def latest(cls): + """Return the latest EnergyPlus version installed.""" + version = _latest_energyplus_version() + return cls(version) + + @classmethod + def current(cls): + """Return the current EnergyPlus version specified by the main module. + + Specified by :ref:`archetypal.settings.ep_version` + """ + version = settings.ep_version + return cls(version) + + @property + def tuple(self) -> tuple: + """Return the object as a tuple: (major, minor, micro).""" + return self.major, self.minor, self.micro + + @property + def dash(self) -> str: + """Return the object as a dash-separated string: "major-minor-micro".""" + return "-".join(map(str, (self.major, self.minor, self.micro))) + + @property + def valid_versions(self) -> list: + """List the idd versions installed on this machine.""" + try: + basedirs_ = [] + for basedir in get_eplus_basedirs(): + updater_ = basedir / "PreProcess" / "IDFVersionUpdater" + if updater_.exists(): + basedirs_.append(updater_.files("*.idd")) + iddnames = set(chain.from_iterable(basedirs_)) + except FileNotFoundError: + _choices = ["9-2-0"] # Little hack in case E+ is not installed + else: + _choices = set( + re.match(r"V(.*)-Energy\+", idd.stem).groups()[0] for idd in iddnames + ) + return _choices diff --git a/archetypal/idfclass.py b/archetypal/idfclass.py deleted file mode 100644 index c7895a04..00000000 --- a/archetypal/idfclass.py +++ /dev/null @@ -1,2556 +0,0 @@ -################################################################################ -# Module: idfclass.py -# Description: Various functions for processing of EnergyPlus models and -# retrieving results in different forms -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ -import datetime -import glob -import hashlib -import inspect -import json -import logging as lg -import os -import platform -import subprocess -import time -from collections import defaultdict, OrderedDict -from itertools import compress -from math import isclose -from sqlite3 import OperationalError -from subprocess import CalledProcessError -from tempfile import TemporaryDirectory - -import eppy -import eppy.modeleditor -import geomeppy -import pandas as pd -from eppy.EPlusInterfaceFunctions import parse_idd -from eppy.bunch_subclass import EpBunch -from eppy.easyopen import getiddfile -from path import Path, TempDir - -import archetypal -import archetypal.settings -from archetypal import ( - log, - settings, - EnergyPlusProcessError, - cd, - ReportData, - EnergySeries, - close_logger, - EnergyPlusVersionError, - get_eplus_dirs, -) -from archetypal.utils import _unpack_tuple - - -class IDF(geomeppy.IDF): - """Wrapper over the geomeppy.IDF class and subsequently the - eppy.modeleditor.IDF class - """ - - def __init__(self, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - super(IDF, self).__init__(*args, **kwargs) - self._sql_file = None - self.schedules_dict = self.get_all_schedules() - self._sql = None - self._htm = None - self.eplus_run_options = EnergyPlusOptions( - eplus_file=self.idfname, - weather_file=getattr(self, "epw", None), - ep_version="-".join(map(str, self.idd_version)), - ) - self.OutputPrep = None - - @classmethod - def setiddname(cls, iddname, testing=False): - """Set the path to the EnergyPlus IDD for the version of EnergyPlus - which is to be used by eppy. - - Args: - iddname (str): Path to the IDD file. - testing: - """ - cls.iddname = iddname - cls.idd_info = None - cls.block = None - - @property - def name(self): - return os.path.basename(self.idfname) - - @property - def sql(self): - if self._sql is None: - log("No sql object for {}. Running EnergyPlus...".format(self.name)) - self._sql = self.run_eplus( - annual=True, prep_outputs=True, output_report="sql", verbose="q" - ) - return self._sql - else: - return self._sql - - @property - def htm(self): - if self._htm is None: - self._htm = self.run_eplus( - annual=True, prep_outputs=True, output_report="htm" - ) - return self._htm - else: - return self._htm - - @property - def sql_file(self): - if self._sql_file is None: - log("No sql file for {}. Running EnergyPlus...".format(self.name)) - self._sql_file = self.run_eplus( - annual=True, prep_outputs=True, output_report="sql_file", verbose="q" - ) - return self._sql_file - else: - return self._sql_file - - @property - def area_conditioned(self): - """Returns the total conditioned area of a building (taking into account - zone multipliers - """ - area = 0 - zones = self.idfobjects["ZONE"] - zone: EpBunch - for zone in zones: - for surface in zone.zonesurfaces: - if hasattr(surface, "tilt"): - if surface.tilt == 180.0: - part_of = int(zone.Part_of_Total_Floor_Area.upper() != "NO") - multiplier = float( - zone.Multiplier if zone.Multiplier != "" else 1 - ) - - area += surface.area * multiplier * part_of - return area - - @property - def partition_ratio(self): - """The number of lineal meters of partitions (Floor to ceiling) present - in average in the building floor plan by m2. - """ - partition_lineal = 0 - zones = self.idfobjects["ZONE"] - zone: EpBunch - for zone in zones: - for surface in [ - surf - for surf in zone.zonesurfaces - if surf.key.upper() not in ["INTERNALMASS", "WINDOWSHADINGCONTROL"] - ]: - if hasattr(surface, "tilt"): - if ( - surface.tilt == 90.0 - and surface.Outside_Boundary_Condition != "Outdoors" - ): - multiplier = float( - zone.Multiplier if zone.Multiplier != "" else 1 - ) - partition_lineal += surface.width * multiplier - - return partition_lineal / self.area_conditioned - - def wwr(self, azimuth_threshold=10, round_to=None): - """Returns the Window-to-Wall Ratio by major orientation for the IDF - model. Optionally round up the WWR value to nearest value (eg.: nearest - 10). - - Args: - azimuth_threshold (int): Defines the incremental major orientation - azimuth angle. Due to possible rounding errors, some surface - azimuth can be rounded to values different than the main - directions (eg.: 89 degrees instead of 90 degrees). Defaults to - increments of 10 degrees. - round_to (float): Optionally round the WWR value to nearest value - (eg.: nearest 10). If None, this is ignored and the float is - returned. - - Returns: - (pd.DataFrame): A DataFrame with the total wall area, total window - area and WWR for each main orientation of the building. - """ - import math - - def roundto(x, to=10.0): - """Rounds up to closest `to` number""" - if to and not math.isnan(x): - return int(round(x / to)) * to - else: - return x - - total_wall_area = defaultdict(int) - total_window_area = defaultdict(int) - - zones = self.idfobjects["ZONE"] - zone: EpBunch - for zone in zones: - multiplier = float(zone.Multiplier if zone.Multiplier != "" else 1) - for surface in [ - surf - for surf in zone.zonesurfaces - if surf.key.upper() not in ["INTERNALMASS", "WINDOWSHADINGCONTROL"] - ]: - if isclose(surface.tilt, 90, abs_tol=10): - if surface.Outside_Boundary_Condition == "Outdoors": - surf_azim = roundto(surface.azimuth, to=azimuth_threshold) - total_wall_area[surf_azim] += surface.area * multiplier - for subsurface in surface.subsurfaces: - if isclose(subsurface.tilt, 90, abs_tol=10): - if subsurface.Surface_Type.lower() == "window": - surf_azim = roundto( - subsurface.azimuth, to=azimuth_threshold - ) - total_window_area[surf_azim] += subsurface.area * multiplier - # Fix azimuth = 360 which is the same as azimuth 0 - total_wall_area[0] += total_wall_area.pop(360, 0) - total_window_area[0] += total_window_area.pop(360, 0) - - # Create dataframe with wall_area, window_area and wwr as columns and azimuth - # as indexes - df = pd.DataFrame( - {"wall_area": total_wall_area, "window_area": total_window_area} - ).rename_axis("Azimuth") - df["wwr"] = df.window_area / df.wall_area - df["wwr_rounded_%"] = (df.window_area / df.wall_area * 100).apply( - lambda x: roundto(x, to=round_to) - ) - return df - - def space_heating_profile( - self, - units="kWh", - energy_out_variable_name=None, - name="Space Heating", - EnergySeries_kwds={}, - ): - """ - Args: - units (str): Units to convert the energy profile to. Will detect the - units of the EnergyPlus results. - energy_out_variable_name (list-like): a list of EnergyPlus Variable - names. - name (str): Name given to the EnergySeries. - EnergySeries_kwds (dict, optional): keywords passed to - :func:`EnergySeries.from_sqlite` - - Returns: - EnergySeries - """ - start_time = time.time() - if energy_out_variable_name is None: - energy_out_variable_name = ( - "Air System Total Heating Energy", - "Zone Ideal Loads Zone Total Heating Energy", - ) - series = self._energy_series( - energy_out_variable_name, units, name, EnergySeries_kwds=EnergySeries_kwds - ) - log( - "Retrieved Space Heating Profile in {:,.2f} seconds".format( - time.time() - start_time - ) - ) - return series - - def service_water_heating_profile( - self, - units="kWh", - energy_out_variable_name=None, - name="Space Heating", - EnergySeries_kwds={}, - ): - """ - Args: - units (str): Units to convert the energy profile to. Will detect the - units of the EnergyPlus results. - energy_out_variable_name (list-like): a list of EnergyPlus Variable - names. - name (str): Name given to the EnergySeries. - EnergySeries_kwds (dict, optional): keywords passed to - :func:`EnergySeries.from_sqlite` - - Returns: - EnergySeries - """ - start_time = time.time() - if energy_out_variable_name is None: - energy_out_variable_name = ("WaterSystems:EnergyTransfer",) - series = self._energy_series( - energy_out_variable_name, units, name, EnergySeries_kwds=EnergySeries_kwds - ) - log( - "Retrieved Service Water Heating Profile in {:,.2f} seconds".format( - time.time() - start_time - ) - ) - return series - - def space_cooling_profile( - self, - units="kWh", - energy_out_variable_name=None, - name="Space Cooling", - EnergySeries_kwds={}, - ): - """ - Args: - units (str): Units to convert the energy profile to. Will detect the - units of the EnergyPlus results. - energy_out_variable_name (list-like): a list of EnergyPlus - name (str): Name given to the EnergySeries. - EnergySeries_kwds (dict, optional): keywords passed to - :func:`EnergySeries.from_sqlite` - - Returns: - EnergySeries - """ - start_time = time.time() - if energy_out_variable_name is None: - energy_out_variable_name = ( - "Air System Total Cooling Energy", - "Zone Ideal Loads Zone Total Cooling Energy", - ) - series = self._energy_series( - energy_out_variable_name, units, name, EnergySeries_kwds=EnergySeries_kwds - ) - log( - "Retrieved Space Cooling Profile in {:,.2f} seconds".format( - time.time() - start_time - ) - ) - return series - - def custom_profile( - self, - energy_out_variable_name, - name, - units="kWh", - prep_outputs=None, - EnergySeries_kwds={}, - ): - """ - Args: - energy_out_variable_name (list-like): a list of EnergyPlus - name (str): Name given to the EnergySeries. - units (str): Units to convert the energy profile to. Will detect the - units of the EnergyPlus results. - prep_outputs: - EnergySeries_kwds (dict, optional): keywords passed to - :func:`EnergySeries.from_sqlite` - - Returns: - EnergySeries - """ - start_time = time.time() - series = self._energy_series( - energy_out_variable_name, - units, - name, - prep_outputs, - EnergySeries_kwds=EnergySeries_kwds, - ) - log("Retrieved {} in {:,.2f} seconds".format(name, time.time() - start_time)) - return series - - def _energy_series( - self, - energy_out_variable_name, - units, - name, - prep_outputs=None, - EnergySeries_kwds=None, - ): - """ - Args: - energy_out_variable_name: - units: - name: - prep_outputs (list): - EnergySeries_kwds: - """ - if prep_outputs: - self._sql = self.run_eplus( - annual=True, - prep_outputs=prep_outputs, - output_report="sql_file", - verbose="q", - ) - rd = ReportData.from_sqlite(self.sql_file, table_name=energy_out_variable_name) - profile = EnergySeries.from_sqlite( - rd, to_units=units, name=name, **EnergySeries_kwds - ) - return profile - - def run_eplus(self, **kwargs): - """wrapper around the :meth:`archetypal.idfclass.run_eplus` method. - - If weather file is defined in the IDF object, then this field is - optional. By default, will load the sql in self.sql. - - Args: - kwargs: - - Returns: - The output report or the sql file loaded as a dict of DataFrames. - """ - self.eplus_run_options.__dict__.update(kwargs) - results = run_eplus(**self.eplus_run_options.__dict__) - if self.eplus_run_options.output_report == "sql": - # user simply wants the sql - self._sql = results - return results - elif self.eplus_run_options.output_report == "sql_file": - self._sql_file = results - return results - else: - # user wants something more than the sql - return results - - def add_object(self, ep_object, save=True, **kwargs): - """Add a new object to an idf file. The function will test if the object - exists to prevent duplicates. By default, the idf with the new object is - saved to disk (save=True) - - Args: - ep_object (str): the object name to add, eg. 'OUTPUT:METER' (Must be - in all_caps). - save (bool): Save the IDF as a text file with the current idfname of - the IDF. - **kwargs: keyword arguments to pass to other functions. - - Returns: - EpBunch: the object - """ - # get list of objects - objs = self.idfobjects[ep_object] # a list - # If object is supposed to be 'unique-object', deletes all objects to be - # sure there is only one of them when creating new object - # (see following line) - for obj in objs: - if "unique-object" in obj.objidd[0].keys(): - self.removeidfobject(obj) - # create new object - new_object = self.newidfobject(ep_object, **kwargs) - # Check if new object exists in previous list - # If True, delete the object - if sum([str(obj).upper() == str(new_object).upper() for obj in objs]) > 1: - log('object "{}" already exists in idf file'.format(ep_object), lg.DEBUG) - # Remove the newly created object since the function - # `idf.newidfobject()` automatically adds it - self.removeidfobject(new_object) - if not save: - return self.getobject( - ep_object, - kwargs.get( - "Variable_Name", - kwargs.get("Key_Name", kwargs.get("Name", None)), - ), - ) - else: - if save: - log('object "{}" added to the idf file'.format(ep_object)) - self.save() - # invalidate the sql statements - self._sql = None - self._sql_file = None - # return the ep_object - return new_object - - def get_schedule_type_limits_data_by_name(self, schedule_limit_name): - """Returns the data for a particular 'ScheduleTypeLimits' object - - Args: - schedule_limit_name: - """ - schedule = self.getobject("ScheduleTypeLimits".upper(), schedule_limit_name) - - if schedule is not None: - lower_limit = schedule["Lower_Limit_Value"] - upper_limit = schedule["Upper_Limit_Value"] - numeric_type = schedule["Numeric_Type"] - unit_type = schedule["Unit_Type"] - - if schedule["Unit_Type"] == "": - unit_type = numeric_type - - return lower_limit, upper_limit, numeric_type, unit_type - else: - return "", "", "", "" - - def get_schedule_epbunch(self, name, sch_type=None): - """Returns the epbunch of a particular schedule name. If the schedule - type is know, retreives it quicker. - - Args: - name (str): The name of the schedule to retreive in the IDF file. - sch_type (str): The schedule type, e.g.: "SCHEDULE:YEAR". - """ - if sch_type is None: - try: - return self.schedules_dict[name.upper()] - except: - try: - schedules_dict = self.get_all_schedules() - return schedules_dict[name.upper()] - except KeyError: - raise KeyError( - 'Unable to find schedule "{}" of type "{}" ' - 'in idf file "{}"'.format(name, sch_type, self.idfname) - ) - else: - return self.getobject(sch_type.upper(), name) - - def get_all_schedules(self, yearly_only=False): - """Returns all schedule ep_objects in a dict with their name as a key - - Args: - yearly_only (bool): If True, return only yearly schedules - - Returns: - (dict of eppy.bunch_subclass.EpBunch): the schedules with their - name as a key - """ - schedule_types = list(map(str.upper, self.getiddgroupdict()["Schedules"])) - if yearly_only: - schedule_types = [ - "Schedule:Year".upper(), - "Schedule:Compact".upper(), - "Schedule:Constant".upper(), - "Schedule:File".upper(), - ] - scheds = {} - for sched_type in schedule_types: - for sched in self.idfobjects[sched_type]: - try: - if sched.key.upper() in schedule_types: - scheds[sched.Name.upper()] = sched - except: - pass - return scheds - - def get_used_schedules(self, yearly_only=False): - """Returns all used schedules - - Args: - yearly_only (bool): If True, return only yearly schedules - - Returns: - (list): the schedules names - """ - schedule_types = [ - "Schedule:Day:Hourly".upper(), - "Schedule:Day:Interval".upper(), - "Schedule:Day:List".upper(), - "Schedule:Week:Daily".upper(), - "Schedule:Year".upper(), - "Schedule:Week:Compact".upper(), - "Schedule:Compact".upper(), - "Schedule:Constant".upper(), - "Schedule:File".upper(), - ] - - used_schedules = [] - all_schedules = self.get_all_schedules(yearly_only=yearly_only) - for object_name in self.idfobjects: - for object in self.idfobjects[object_name]: - if object.key.upper() not in schedule_types: - for fieldvalue in object.fieldvalues: - try: - if ( - fieldvalue.upper() in all_schedules.keys() - and fieldvalue not in used_schedules - ): - used_schedules.append(fieldvalue) - except: - pass - return used_schedules - - @property - def day_of_week_for_start_day(self): - """Get day of week for start day for the first found RUNPERIOD""" - import calendar - - day = self.idfobjects["RUNPERIOD"][0]["Day_of_Week_for_Start_Day"] - - if day.lower() == "sunday": - return calendar.SUNDAY - elif day.lower() == "monday": - return calendar.MONDAY - elif day.lower() == "tuesday": - return calendar.TUESDAY - elif day.lower() == "wednesday": - return calendar.WEDNESDAY - elif day.lower() == "thursday": - return calendar.THURSDAY - elif day.lower() == "friday": - return calendar.FRIDAY - elif day.lower() == "saturday": - return calendar.SATURDAY - else: - return 0 - - def building_name(self, use_idfname=False): - """ - Args: - use_idfname: - """ - if use_idfname: - return os.path.basename(self.idfname) - else: - bld = self.idfobjects["BUILDING"] - if bld is not None: - return bld[0].Name - else: - return os.path.basename(self.idfname) - - def rename(self, objkey, objname, newname): - """rename all the references to this objname - - Function comes from eppy.modeleditor and was modify to compare the - name to rename as a lower string (see - idfobject[idfobject.objls[findex]].lower() == objname.lower()) - - Args: - objkey (EpBunch): EpBunch we want to rename and rename all the - occurrences where this object is in the IDF file - objname (str): The name of the EpBunch to rename - newname (str): New name used to rename the EpBunch - - Returns: - theobject (EpBunch): The IDF objects renameds - """ - - refnames = eppy.modeleditor.getrefnames(self, objkey) - for refname in refnames: - objlists = eppy.modeleditor.getallobjlists(self, refname) - # [('OBJKEY', refname, fieldindexlist), ...] - for robjkey, refname, fieldindexlist in objlists: - idfobjects = self.idfobjects[robjkey] - for idfobject in idfobjects: - for findex in fieldindexlist: # for each field - if ( - idfobject[idfobject.objls[findex]].lower() - == objname.lower() - ): - idfobject[idfobject.objls[findex]] = newname - theobject = self.getobject(objkey, objname) - fieldname = [item for item in theobject.objls if item.endswith("Name")][0] - theobject[fieldname] = newname - return theobject - - -class EnergyPlusOptions: - def __init__( - self, - eplus_file, - weather_file, - output_directory=None, - ep_version=None, - output_report=None, - prep_outputs=False, - simulname=None, - keep_data=True, - annual=False, - design_day=False, - epmacro=False, - expandobjects=True, - readvars=False, - output_prefix=False, - output_suffix="L", - version=None, - verbose="v", - keep_data_err=False, - include=None, - process_files=False, - custom_processes=None, - return_idf=False, - return_files=False, - ): - """ - Args: - eplus_file: - weather_file: - output_directory: - ep_version: - output_report: - prep_outputs: - simulname: - keep_data: - annual: - design_day: - epmacro: - expandobjects: - readvars: - output_prefix: - output_suffix: - version: - verbose: - keep_data_err: - include: - process_files: - custom_processes: - return_idf: - return_files: - """ - self.return_files = return_files - self.custom_processes = custom_processes - self.process_files = process_files - self.include = include - self.keep_data_err = keep_data_err - self.version = version - self.keep_data = keep_data - self.simulname = simulname - self.output_suffix = output_suffix - self.verbose = verbose - self.output_prefix = output_prefix - self.readvars = readvars - self.expandobjects = expandobjects - self.epmacro = epmacro - self.design_day = design_day - self.annual = annual - self.return_idf = return_idf - self.prep_outputs = prep_outputs - self.output_report = output_report - self.ep_version = ep_version - self.output_directory = output_directory - self.weather_file = weather_file - self.eplus_file = eplus_file - - def __repr__(self): - return str(self) - - def __str__(self): - return json.dumps(self.__dict__, indent=2) - - -def load_idf( - eplus_file, - idd_filename=None, - output_folder=None, - include=None, - weather_file=None, - ep_version=None, -): - """Returns a parsed IDF object from file. If *archetypal.settings.use_cache* - is true, then the idf object is loaded from cache. - - Args: - eplus_file (str): Either the absolute or relative path to the idf file. - idd_filename (str, optional): Either the absolute or relative path to - the EnergyPlus IDD file. If None, the function tries to find it at - the default EnergyPlus install location. - output_folder (Path, optional): Either the absolute or relative path of - the output folder. Specify if the cache location is different than - archetypal.settings.cache_folder. - include (str, optional): List input files that need to be copied to the - simulation directory. Those can be, for example, schedule files read - by the idf file. If a string is provided, it should be in a glob - form (see pathlib.Path.glob). - weather_file: Either the absolute or relative path to the weather epw - file. - ep_version (str, optional): EnergyPlus version number to use, eg.: - "9-2-0". Defaults to `settings.ep_version` . - - Returns: - IDF: The IDF object. - """ - eplus_file = Path(eplus_file) - start_time = time.time() - - idf = load_idf_object_from_cache(eplus_file) - if idf: - return idf - else: - # Else, run eppy to load the idf objects - idf = _eppy_load( - eplus_file, - idd_filename, - output_folder=output_folder, - include=include, - epw=weather_file, - ep_version=ep_version if ep_version is not None else settings.ep_version, - ) - log( - 'Loaded "{}" in {:,.2f} seconds\n'.format( - eplus_file.basename(), time.time() - start_time - ) - ) - return idf - - -def _eppy_load( - file, idd_filename, output_folder=None, include=None, epw=None, ep_version=None -): - """Uses package eppy to parse an idf file. Will also try to upgrade the idf - file using the EnergyPlus Transition executables if the version of - EnergyPlus is not installed on the machine. - - Args: - file (str): path of the idf file. - idd_filename: path of the EnergyPlus IDD file. - output_folder (str): path to the output folder. Will default to the - settings.cache_folder. - include (str, optional): List input files that need to be copied to the - simulation directory.if a string is provided, it should be in a glob - form (see pathlib.Path.glob). - epw (str, optional): path of the epw weather file. - ep_version (str): EnergyPlus version number to use. - - Returns: - eppy.modeleditor.IDF: IDF object - """ - file = Path(file) - cache_filename = hash_file(file) - - try: - # first copy the file - if not output_folder: - output_folder = settings.cache_folder / cache_filename - else: - output_folder = Path(output_folder) - - output_folder.makedirs_p() - if file.basename() not in [ - file.basename() for file in output_folder.glob("*.idf") - ]: - # The file does not exist; copy it to the output_folder & override path name - file = Path(file.copy(output_folder)) - else: - # The file already exists at the location. Use that file - file = output_folder / file.basename() - - # Determine version of idf file by reading the text file - if idd_filename is None: - idd_filename = getiddfile(get_idf_version(file)) - - # Initiate an eppy.modeleditor.IDF object - IDF.setiddname(idd_filename, testing=True) - # load the idf object - idf_object = IDF(file, epw=epw) - # Check version of IDF file against version of IDD file - idf_version = idf_object.idfobjects["VERSION"][0].Version_Identifier - idd_version = "{}.{}".format( - idf_object.idd_version[0], idf_object.idd_version[1] - ) - except FileNotFoundError: - # Loading the idf object will raise a FileNotFoundError if the - # version of EnergyPlus is not installed - log("Transitioning idf file {}".format(file)) - # if they don't fit, upgrade file - file = idf_version_updater(file, out_dir=output_folder, to_version=ep_version) - idd_filename = getiddfile(get_idf_version(file)) - # Initiate an eppy.modeleditor.IDF object - IDF.setiddname(idd_filename, testing=True) - # load the idf object - idf_object = IDF(file, epw=epw) - else: - # the versions fit, great! - log( - 'The version of the IDF file "{}", version "{}", matched the ' - 'version of EnergyPlus {}, version "{}", used to parse it.'.format( - file.basename(), idf_version, idf_object.getiddname(), idd_version - ), - level=lg.DEBUG, - ) - # when parsing is complete, save it to disk, then return object - save_idf_object_to_cache(idf_object, idf_object.idfname, output_folder) - if isinstance(include, str): - include = Path().abspath().glob(include) - if include is not None: - [Path(file).copy(output_folder) for file in include] - return idf_object - - -def save_idf_object_to_cache(idf_object, idf_file, output_folder=None, how=None): - """Saves the object to disk. Essentially uses the pickling functions of - python. - - Todo: - * Json dump does not work yet. - - Args: - idf_object (eppy.modeleditor.IDF): an eppy IDF object - idf_file (str): file path of idf file - output_folder (Path): temporary output directory (default: - settings.cache_folder) - how (str, optional): How the pickling is done. Choices are 'json' or - 'pickle'. json dump does not quite work yet. 'pickle' will save to a - gzip'ed file instead of a regular binary file (.dat). - - Returns: - None - """ - # upper() can't take NoneType as input. - if how is None: - how = "" - # The main function - if settings.use_cache: - if output_folder is None: - output_folder = hash_file(idf_file) - cache_dir = os.path.join(settings.cache_folder, output_folder) - cache_dir = output_folder - - # create the folder on the disk if it doesn't already exist - if not os.path.exists(cache_dir): - os.makedirs(cache_dir) - - if how.upper() == "JSON": - cache_fullpath_filename = cache_dir / cache_dir.basename() + "idfs.json" - import gzip, json - - with open(cache_fullpath_filename, "w") as file_handle: - json.dump( - { - key: value.__dict__ - for key, value in idf_object.idfobjects.items() - }, - file_handle, - sort_keys=True, - indent=4, - check_circular=True, - ) - - elif how.upper() == "PICKLE": - # create pickle and dump - cache_fullpath_filename = cache_dir / cache_dir.basename() + "idfs.gzip" - import gzip - - try: - import cPickle as pickle - except ImportError: - import pickle - start_time = time.time() - with gzip.GzipFile(cache_fullpath_filename, "wb") as file_handle: - pickle.dump(idf_object, file_handle, protocol=0) - log( - "Saved pickle to file in {:,.2f} seconds".format( - time.time() - start_time - ) - ) - - else: - cache_fullpath_filename = cache_dir / cache_dir.basename() + "idfs.dat" - try: - import cPickle as pickle - except ImportError: - import pickle - start_time = time.time() - with open(cache_fullpath_filename, "wb") as file_handle: - pickle.dump(idf_object, file_handle, protocol=-1) - log( - "Saved pickle to file in {:,.2f} seconds".format( - time.time() - start_time - ) - ) - - -def load_idf_object_from_cache(idf_file, how=None): - """Load an idf instance from cache. - - Args: - idf_file (str): Either the absolute or relative path to the idf file. - how (str, optional): How the pickling is done. Choices are 'json' or - 'pickle' or 'idf'. json dump doesn't quite work yet. 'pickle' will - load from a gzip'ed file instead of a regular binary file (.gzip). - 'idf' will load from idf file saved in cache (.dat). - - Returns: - IDF: The IDF object. - """ - # upper() can't take NoneType as input. - if how is None: - how = "" - # The main function - if settings.use_cache: - cache_filename = hash_file(idf_file) - if how.upper() == "JSON": - cache_fullpath_filename = os.path.join( - settings.cache_folder, - cache_filename, - os.extsep.join([cache_filename + "idfs", "json"]), - ) - import json - - try: - import cPickle as pickle - except ImportError: - import pickle - start_time = time.time() - if os.path.isfile(cache_fullpath_filename): - if os.path.getsize(cache_fullpath_filename) > 0: - with open(cache_fullpath_filename, "rb") as file_handle: - idf = json.load(file_handle) - log( - 'Loaded "{}" from pickled file in {:,.2f} seconds'.format( - os.path.basename(idf_file), time.time() - start_time - ) - ) - return idf - - elif how.upper() == "PICKLE": - cache_fullpath_filename = os.path.join( - settings.cache_folder, - cache_filename, - os.extsep.join([cache_filename + "idfs", "gzip"]), - ) - import gzip - - try: - import cPickle as pickle - except ImportError: - import pickle - start_time = time.time() - if os.path.isfile(cache_fullpath_filename): - if os.path.getsize(cache_fullpath_filename) > 0: - with gzip.GzipFile(cache_fullpath_filename, "rb") as file_handle: - try: - idf = pickle.load(file_handle) - except EOFError: - return None - if idf.iddname is None: - idf.setiddname(getiddfile(idf.model.dt["VERSION"][0][1])) - # idf.read() - log( - 'Loaded "{}" from pickled file in {:,.2f} seconds'.format( - os.path.basename(idf_file), time.time() - start_time - ) - ) - return idf - elif how.upper() == "IDF": - cache_fullpath_filename = os.path.join( - settings.cache_folder, - cache_filename, - os.extsep.join([cache_filename, "idf"]), - ) - if os.path.isfile(cache_fullpath_filename): - version = get_idf_version(cache_fullpath_filename, doted=True) - iddfilename = getiddfile(version) - idf = _eppy_load(cache_fullpath_filename, iddfilename) - return idf - else: - cache_fullpath_filename = os.path.join( - settings.cache_folder, - cache_filename, - os.extsep.join([cache_filename + "idfs", "dat"]), - ) - try: - import cPickle as pickle - except ImportError: - import pickle - start_time = time.time() - if os.path.isfile(cache_fullpath_filename): - if os.path.getsize(cache_fullpath_filename) > 0: - with open(cache_fullpath_filename, "rb") as file_handle: - try: - idf = pickle.load(file_handle) - except EOFError: - return None - if idf.iddname is None: - idf.setiddname(getiddfile(idf.model.dt["VERSION"][0][1])) - idf.read() - log( - 'Loaded "{}" from pickled file in {:,.2f} seconds'.format( - os.path.basename(idf_file), time.time() - start_time - ) - ) - return idf - - -class OutputPrep: - """Handles preparation of EnergyPlus outputs. Different instance methods - allow to chain methods together and to add predefined bundles of outputs in - one go. - - For example: - >>> OutputPrep(idf=idf_obj).add_output_control().add_umi_ouputs().add_profile_gas_elect_ouputs() - """ - - def __init__(self, idf, save=True): - """Initialize an OutputPrep object. - - Args: - idf (IDF): the IDF object for wich this OutputPrep object is created. - save (bool): weather to save or not changes after adding outputs to the - IDF file. - """ - self.idf = idf - self.save = save - self.outputs = [] - - def add_custom(self, outputs): - """Add custom-defined outputs as a list of objects. - - Examples: - >>> outputs = [ - >>> { - >>> "ep_object": "OUTPUT:METER", - >>> "kwargs": dict( - >>> Key_Name="Electricity:Facility", - >>> Reporting_Frequency="hourly", - >>> save=True, - >>> ), - >>> }, - >>> ] - >>> OutputPrep().add_custom(outputs) - - Args: - outputs (list): Pass a list of ep-objects defined as dictionary. See - examples. - """ - if isinstance(outputs, list): - prepare_outputs(self.idf, outputs=outputs, save=self.save) - self.outputs.extend(outputs) - return self - - def add_basics(self): - """Adds the summary report and the sql file to the idf outputs""" - return self.add_summary_report().add_output_control().add_sql().add_schedules() - - def add_schedules(self): - """Adds Schedules object""" - outputs = [ - { - "ep_object": "Output:Schedules".upper(), - "kwargs": dict(Key_Field="Hourly", save=self.save), - } - ] - prepare_outputs(self.idf, outputs=outputs, save=self.save) - self.outputs.extend(outputs) - return self - - def add_summary_report(self, summary="AllSummary"): - """Adds the Output:Table:SummaryReports object. - - Args: - summary (str): Choices are AllSummary, AllMonthly, - AllSummaryAndMonthly, AllSummaryAndSizingPeriod, - AllSummaryMonthlyAndSizingPeriod, - AnnualBuildingUtilityPerformanceSummary, - InputVerificationandResultsSummary, - SourceEnergyEndUseComponentsSummary, ClimaticDataSummary, - EnvelopeSummary, SurfaceShadowingSummary, ShadingSummary, - LightingSummary, EquipmentSummary, HVACSizingSummary, - ComponentSizingSummary, CoilSizingDetails, OutdoorAirSummary, - SystemSummary, AdaptiveComfortSummary, SensibleHeatGainSummary, - Standard62.1Summary, EnergyMeters, InitializationSummary, - LEEDSummary, TariffReport, EconomicResultSummary, - ComponentCostEconomicsSummary, LifeCycleCostReport, - HeatEmissionsSummary, - """ - outputs = [ - { - "ep_object": "Output:Table:SummaryReports".upper(), - "kwargs": dict(Report_1_Name=summary, save=self.save), - } - ] - prepare_outputs(self.idf, outputs=outputs, save=self.save) - self.outputs.extend(outputs) - return self - - def add_sql(self, sql_output_style="SimpleAndTabular"): - """Adds the `Output:SQLite` object. This object will produce an sql file - that contains the simulation results in a database format. See - `eplusout.sql - `_ for more details. - - Args: - sql_output_style (str): The *Simple* option will include all of the - predefined database tables as well as time series related data. - Using the *SimpleAndTabular* choice adds database tables related - to the tabular reports that are already output by EnergyPlus in - other formats. - """ - outputs = [ - { - "ep_object": "Output:SQLite".upper(), - "kwargs": dict(Option_Type=sql_output_style, save=self.save), - } - ] - prepare_outputs(self.idf, outputs=outputs, save=self.save) - self.outputs.extend(outputs) - return self - - def add_output_control(self, output_control_table_style="CommaAndHTML"): - """Sets the `OutputControl:Table:Style` object. - - Args: - output_control_table_style (str): Choices are: Comma, Tab, Fixed, - HTML, XML, CommaAndHTML, TabAndHTML, XMLAndHTML, All - """ - outputs = [ - { - "ep_object": "OutputControl:Table:Style".upper(), - "kwargs": dict( - Column_Separator=output_control_table_style, save=self.save - ), - } - ] - prepare_outputs(self.idf, outputs=outputs, save=self.save) - self.outputs.extend(outputs) - return self - - def add_template_outputs(self): - """Adds the necessary outputs in order to create an UMI template.""" - # list the outputs here - outputs = [ - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Air System Total Heating Energy", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Air System Total Cooling Energy", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Ideal Loads Zone Total Cooling Energy", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Ideal Loads Zone Total Heating Energy", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Thermostat Heating Setpoint Temperature", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Thermostat Cooling Setpoint Temperature", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Heat Exchanger Total Heating Rate", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Heat Exchanger Sensible Effectiveness", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Heat Exchanger Latent Effectiveness", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Water Heater Heating Energy", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="HeatRejection:EnergyTransfer", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Heating:EnergyTransfer", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Cooling:EnergyTransfer", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Heating:DistrictHeating", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Heating:Electricity", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Heating:Gas", Reporting_Frequency="hourly", save=self.save - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Cooling:DistrictCooling", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Cooling:Electricity", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Cooling:Electricity", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Cooling:Gas", Reporting_Frequency="hourly", save=self.save - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="WaterSystems:EnergyTransfer", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Cooling:Gas", Reporting_Frequency="hourly", save=self.save - ), - }, - ] - - prepare_outputs(self.idf, outputs=outputs, save=self.save) - self.outputs.extend(outputs) - return self - - def add_umi_ouputs(self): - """Adds the necessary outputs in order to return the same energy profile - as in UMI. - """ - # list the outputs here - outputs = [ - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Air System Total Heating Energy", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Air System Total Cooling Energy", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Ideal Loads Zone Total Cooling Energy", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Ideal Loads Zone Total Heating Energy", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Water Heater Heating Energy", - Reporting_Frequency="hourly", - save=self.save, - ), - }, - ] - - prepare_outputs(self.idf, outputs=outputs, save=self.save) - self.outputs.extend(outputs) - return self - - def add_profile_gas_elect_ouputs(self): - """Adds the following meters: Electricity:Facility, Gas:Facility, - WaterSystems:Electricity, Heating:Electricity, Cooling:Electricity - """ - # list the outputs here - outputs = [ - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Electricity:Facility", - Reporting_Frequency="hourly", - save=True, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Gas:Facility", Reporting_Frequency="hourly", save=True - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="WaterSystems:Electricity", - Reporting_Frequency="hourly", - save=True, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Heating:Electricity", - Reporting_Frequency="hourly", - save=True, - ), - }, - { - "ep_object": "OUTPUT:METER", - "kwargs": dict( - Key_Name="Cooling:Electricity", - Reporting_Frequency="hourly", - save=True, - ), - }, - ] - - prepare_outputs(self.idf, outputs=outputs, save=self.save) - self.outputs.extend(outputs) - return self - - -def prepare_outputs( - idf, outputs=None, idd_filename=None, output_directory=None, save=True, epw=None -): - """Add additional epobjects to the idf file. Users can pass in an outputs - - Examples: - >>> objects = [{'ep_object':'OUTPUT:DIAGNOSTICS', - >>> 'kwargs':{'Key_1':'DisplayUnusedSchedules'}}] - >>> prepare_outputs(idf, outputs=objects) - - Args: - idf (IDF or Path): The IDF object or the path to the file describing the - model (.idf). - outputs (bool or list): - idd_filename: - output_directory: - save (bool): if True, saves the idf inplace to disk with added objects - epw: - """ - if isinstance(idf, (Path, str)): - log("first, loading the idf file") - idf = load_idf( - idf, - idd_filename=idd_filename, - output_folder=output_directory, - weather_file=epw, - ) - - if isinstance(outputs, list): - for output in outputs: - save = output["kwargs"].pop("save", save) - idf.add_object(output["ep_object"], **output["kwargs"], save=save) - - -def cache_runargs(eplus_file, runargs): - """ - Args: - eplus_file: - runargs: - """ - import json - - output_directory = runargs["output_directory"] / runargs["output_prefix"] - - runargs.update({"run_time": datetime.datetime.now().isoformat()}) - runargs.update({"idf_file": eplus_file}) - with open(os.path.join(output_directory, "runargs.json"), "w") as fp: - json.dump(runargs, fp, sort_keys=True, indent=4) - - -def run_eplus( - eplus_file, - weather_file, - output_directory=None, - ep_version=None, - output_report=None, - prep_outputs=False, - simulname=None, - keep_data=True, - annual=False, - design_day=False, - epmacro=False, - expandobjects=True, - readvars=False, - output_prefix=None, - output_suffix=None, - version=None, - verbose="v", - keep_data_err=False, - include=None, - process_files=False, - custom_processes=None, - return_idf=False, - return_files=False, - **kwargs, -): - """Run an EnergyPlus file using the EnergyPlus executable. - - Specify run options: - Run options are specified in the same way as the E+ command line - interface: annual, design_day, epmacro, expandobjects, etc. are all - supported. - - Specify outputs: - Optionally define the desired outputs by specifying the - :attr:`prep_outputs` attribute. - - With the :attr:`prep_outputs` attribute, specify additional outputs - objects to append to the energy plus file. If True is specified, a selection of - useful options will be append by default (see: :class:`OutputPrep` - for more details). - - Args: - eplus_file (str): path to the idf file. - weather_file (str): path to the EPW weather file. - output_directory (str, optional): path to the output folder. Will - default to the settings.cache_folder. - ep_version (str, optional): EnergyPlus version to use, eg: 9-2-0 - output_report: 'sql' or 'htm'. - prep_outputs (bool or list, optional): if True, meters and variable - outputs will be appended to the idf files. Can also specify custom - outputs as list of ep-object outputs. - simulname (str): The name of the simulation. (Todo: Currently not implemented). - keep_data (bool): If True, files created by EnergyPlus are saved to the - output_directory. - annual (bool): If True then force annual simulation (default: False) - design_day (bool): Force design-day-only simulation (default: False) - epmacro (bool): Run EPMacro prior to simulation (default: False) - expandobjects (bool): Run ExpandObjects prior to simulation (default: - True) - readvars (bool): Run ReadVarsESO after simulation (default: False) - output_prefix (str, optional): Prefix for output file names. - output_suffix (str, optional): Suffix style for output file names - (default: L) Choices are: - - L: Legacy (e.g., eplustbl.csv) - - C: Capital (e.g., eplusTable.csv) - - D: Dash (e.g., eplus-table.csv) - version (bool, optional): Display version information (default: False) - verbose (str): Set verbosity of runtime messages (default: v) v: verbose - q: quiet - keep_data_err (bool): If True, errored directory where simulation occurred is - kept. - include (str, optional): List input files that need to be copied to the - simulation directory. If a string is provided, it should be in a glob - form (see :meth:`pathlib.Path.glob`). - process_files (bool): If True, process the output files and load to a - :class:`~pandas.DataFrame`. Custom processes can be passed using the - :attr:`custom_processes` attribute. - custom_processes (dict(Callback)): if provided, it has to be a - dictionary with the keys being a glob (see :meth:`pathlib.Path.glob`), and - the value a Callback taking as signature `callback(file: str, - working_dir, simulname) -> Any` All the file matching this glob will - be processed by this callback. Note: they will still be processed by - pandas.read_csv (if they are csv files), resulting in duplicate. The - only way to bypass this behavior is to add the key "*.csv" to that - dictionary. - return_idf (bool): If True, returns the :class:`IDF` object part of the - return tuple. - return_files (bool): It True, all files paths created by the EnergyPlus - run are returned. - - Returns: - 2-tuple: a 1-tuple or a 2-tuple - - dict: dict of [(title, table), .....] - - IDF: The IDF object. Only provided if return_idf is True. - - Raises: - EnergyPlusProcessError. - """ - eplus_file = Path(eplus_file) - weather_file = Path(weather_file) - - frame = inspect.currentframe() - args, _, _, values = inspect.getargvalues(frame) - args = {arg: values[arg] for arg in args} - - cache_filename = hash_file(eplus_file) - if not output_prefix: - output_prefix = cache_filename - if not output_directory: - output_directory = settings.cache_folder / cache_filename - else: - output_directory = Path(output_directory) - args["output_directory"] = output_directory - # - try: - start_time = time.time() - cached_run_results = get_from_cache(args) - except Exception as e: - # catch other exceptions that could occur - raise Exception("{}".format(e)) - else: - if cached_run_results: - # if cached run found, simply return it - log( - "Successfully parsed cached idf run in {:,.2f} seconds".format( - time.time() - start_time - ), - name=eplus_file.basename(), - ) - # return_idf - if return_idf: - filepath = os.path.join( - output_directory, - hash_file(output_directory / eplus_file.basename(), args), - eplus_file.basename(), - ) - idf = load_idf( - filepath, - weather_file=weather_file, - output_folder=output_directory, - include=include, - ) - else: - idf = None - if return_files: - files = Path( - os.path.join( - output_directory, - hash_file(output_directory / eplus_file.basename(), args), - ) - ).files() - else: - files = None - return_elements = list( - compress( - [cached_run_results, idf, files], [True, return_idf, return_files] - ) - ) - return _unpack_tuple(return_elements) - - runs_not_found = eplus_file - # - - # - if ep_version: - # if users specifies version, make sure dots are replaced with "-". - ep_version = ep_version.replace(".", "-") - else: - # if no version is specified, take the package default version - ep_version = archetypal.settings.ep_version - eplus_file = idf_version_updater( - upgraded_file(eplus_file, output_directory), - to_version=ep_version, - out_dir=output_directory, - ) - # In case the file has been updated, update the versionid of the file - # and the idd_file - versionid = get_idf_version(eplus_file, doted=False) - idd_file = Path(getiddfile(get_idf_version(eplus_file, doted=True))) - # - - # Prepare outputs e.g. sql table - if prep_outputs: - # Check if idf file has necessary objects (eg specific outputs) - idf_obj = load_idf( - eplus_file, - idd_filename=idd_file, - output_folder=output_directory, - weather_file=weather_file, - ) - # Call the OutputPrep class with chained instance methods to add all - # necessary outputs + custom ones defined in the parameters of this function. - OutputPrep( - idf=idf_obj, save=True - ).add_basics().add_template_outputs().add_custom( - outputs=prep_outputs - ).add_profile_gas_elect_ouputs() - - if runs_not_found: - # continue with simulation of other files - log( - "no cached run for {}. Running EnergyPlus...".format( - os.path.basename(eplus_file) - ), - name=eplus_file.basename(), - ) - - start_time = time.time() - if isinstance(include, str): - include = Path().abspath().glob(include) - elif include is not None: - include = [Path(file) for file in include] - # run the EnergyPlus Simulation - with TempDir( - prefix="eplus_run_", suffix=output_prefix, dir=output_directory - ) as tmp: - log( - "temporary dir (%s) created" % tmp, lg.DEBUG, name=eplus_file.basename() - ) - if include: - include = [file.copy(tmp) for file in include] - tmp_file = Path(eplus_file.copy(tmp)) - runargs = { - "tmp": tmp, - "eplus_file": tmp_file, - "weather": Path(weather_file.copy(tmp)), - "verbose": verbose, - "output_directory": output_directory, - "ep_version": versionid, - "output_prefix": hash_file(eplus_file, args), - "idd": Path(idd_file.copy(tmp)), - "annual": annual, - "epmacro": epmacro, - "readvars": readvars, - "output_suffix": output_suffix, - "version": version, - "expandobjects": expandobjects, - "design_day": design_day, - "keep_data_err": keep_data_err, - "output_report": output_report, - "include": include, - "custom_processes": custom_processes, - } - - _run_exec(**runargs) - - log( - "EnergyPlus Completed in {:,.2f} seconds".format( - time.time() - start_time - ), - name=eplus_file.basename(), - ) - - processes = {"*.csv": _process_csv} # output_prefix + - if custom_processes is not None: - processes.update(custom_processes) - - results = [] - if process_files: - - for glob, process in processes.items(): - results.extend( - [ - ( - file.basename(), - process( - file, - working_dir=os.getcwd(), - simulname=output_prefix, - ), - ) - for file in tmp.files(glob) - ] - ) - - save_dir = output_directory / hash_file(eplus_file, args) - if keep_data: - save_dir.rmtree_p() - tmp.copytree(save_dir) - - log( - "Files generated at the end of the simulation: %s" - % "\n".join((save_dir).files()), - lg.DEBUG, - name=eplus_file.basename(), - ) - if return_files: - files = save_dir.files() - else: - files = None - - # save runargs - cache_runargs(tmp_file, runargs.copy()) - - # Return summary DataFrames - runargs["output_directory"] = save_dir - cached_run_results = get_report(**runargs) - if return_idf: - idf = load_idf( - eplus_file, - output_folder=output_directory, - include=include, - weather_file=weather_file, - ) - runargs["output_report"] = "sql" - idf._sql = get_report(**runargs) - runargs["output_report"] = "sql_file" - idf._sql_file = get_report(**runargs) - runargs["output_report"] = "htm" - idf._htm = get_report(**runargs) - else: - idf = None - return_elements = list( - compress( - [cached_run_results, idf, files], [True, return_idf, return_files] - ) - ) - return _unpack_tuple(return_elements) - - -def upgraded_file(eplus_file, output_directory): - """returns the eplus_file path that would have been copied in the output - directory if it exists - - Args: - eplus_file: - output_directory: - """ - if settings.use_cache: - eplus_file = next(iter(output_directory.glob("*.idf")), eplus_file) - return eplus_file - - -def _process_csv(file, working_dir, simulname): - """ - Args: - file: - working_dir: - simulname: - """ - try: - log("looking for csv output, return the csv files in DataFrames if any") - if "table" in file.basename(): - tables_out = working_dir.abspath() / "tables" - tables_out.makedirs_p() - file.copy( - tables_out / "%s_%s.csv" % (file.basename().stripext(), simulname) - ) - return - log("try to store file %s in DataFrame" % (file)) - df = pd.read_csv(file, sep=",", encoding="us-ascii") - log("file %s stored" % file) - return df - except Exception: - pass - - -def _run_exec( - tmp, - eplus_file, - weather, - output_directory, - annual, - design_day, - idd, - epmacro, - expandobjects, - readvars, - output_prefix, - output_suffix, - version, - verbose, - ep_version, - keep_data_err, - output_report, - include, - custom_processes, -): - """Wrapper around the EnergyPlus command line interface. - - Adapted from :func:`eppy.runner.runfunctions.run`. - - Args: - tmp: - eplus_file: - weather: - output_directory: - annual: - design_day: - idd: - epmacro: - expandobjects: - readvars: - output_prefix: - output_suffix: - version: - verbose: - ep_version: - keep_data_err: - output_report: - include: - """ - - args = locals().copy() - # get unneeded params out of args ready to pass the rest to energyplus.exe - verbose = args.pop("verbose") - eplus_file = args.pop("eplus_file") - iddname = args.get("idd") - tmp = args.pop("tmp") - keep_data_err = args.pop("keep_data_err") - output_directory = args.pop("output_directory") - output_report = args.pop("output_report") - idd = args.pop("idd") - include = args.pop("include") - custom_processes = args.pop("custom_processes") - try: - idf_path = os.path.abspath(eplus_file.idfname) - except AttributeError: - idf_path = os.path.abspath(eplus_file) - ep_version = args.pop("ep_version") - # get version from IDF object or by parsing the IDF file for it - if not ep_version: - try: - ep_version = "-".join(str(x) for x in eplus_file.idd_version[:3]) - except AttributeError: - raise AttributeError( - "The ep_version must be set when passing an IDF path. \ - Alternatively, use IDF.run()" - ) - - eplus_exe_path, eplus_weather_path = eppy.runner.run_functions.install_paths( - ep_version, iddname - ) - if version: - # just get EnergyPlus version number and return - cmd = [eplus_exe_path, "--version"] - subprocess.check_call(cmd) - return - - # convert paths to absolute paths if required - if os.path.isfile(args["weather"]): - args["weather"] = os.path.abspath(args["weather"]) - else: - args["weather"] = os.path.join(eplus_weather_path, args["weather"]) - # args['output_directory'] = tmp.abspath() - - with tmp.abspath() as tmp: - # build a list of command line arguments - cmd = [eplus_exe_path] - for arg in args: - if args[arg]: - if isinstance(args[arg], bool): - args[arg] = "" - cmd.extend(["--{}".format(arg.replace("_", "-"))]) - if args[arg] != "": - cmd.extend([args[arg]]) - cmd.extend([idf_path]) - - with subprocess.Popen( - cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) as process: - _log_subprocess_output( - process.stdout, name=eplus_file.basename(), verbose=verbose - ) - if process.wait() != 0: - error_filename = output_prefix + "out.err" - with open(error_filename, "r") as stderr: - stderr_r = stderr.read() - if keep_data_err: - failed_dir = output_directory / "failed" - failed_dir.mkdir_p() - tmp.copytree(failed_dir / output_prefix) - raise EnergyPlusProcessError( - cmd=cmd, idf=eplus_file.basename(), stderr=stderr_r - ) - - -def _log_subprocess_output(pipe, name, verbose): - """ - Args: - pipe: - name: - verbose: - """ - logger = None - for line in iter(pipe.readline, b""): - if verbose == "v": - logger = log( - line.decode().strip("\n"), - level=lg.DEBUG, - name="eplus_run_" + name, - filename="eplus_run_" + name, - log_dir=os.getcwd(), - ) - if logger: - close_logger(logger) - - -def hash_file(eplus_file, kwargs=None): - """Simple function to hash a file and return it as a string. Will also hash - the :func:`eppy.runner.run_functions.run()` arguments so that correct - results are returned when different run arguments are used. - - Todo: - Hashing should include the external files used an idf file. For example, - if a model uses a csv file as an input and that file changes, the - hashing will currently not pickup that change. This could result in - loading old results without the user knowing. - - Args: - eplus_file (str): path of the idf file. - kwargs (dict): keywargs to serialize in addition to the file content. - - Returns: - str: The digest value as a string of hexadecimal digits - """ - if kwargs: - # Before we hash the kwargs, remove the ones that don't have an impact on - # simulation results and so should not change the cache dirname. - no_impact = ["keep_data", "keep_data_err", "return_idf", "return_files"] - for argument in no_impact: - _ = kwargs.pop(argument, None) - - # sorting keys for serialization of dictionary - kwargs = OrderedDict(sorted(kwargs.items())) - - # create hasher - hasher = hashlib.md5() - with open(eplus_file, "rb") as afile: - buf = afile.read() - hasher.update(buf) - hasher.update(kwargs.__str__().encode("utf-8")) # Hashing the kwargs as well - return hasher.hexdigest() - - -def get_report( - eplus_file, output_directory=None, output_report="sql", output_prefix=None, **kwargs -): - """Returns the specified report format (html or sql) - - Args: - eplus_file (str): path of the idf file - output_directory (str, optional): path to the output folder. Will - default to the settings.cache_folder. - output_report: 'html' or 'sql' - output_prefix: - **kwargs: keyword arguments to pass to hasher. - - Returns: - dict: a dict of DataFrames - """ - # Hash the idf file with any kwargs used in the function - if output_prefix is None: - output_prefix = hash_file(eplus_file, kwargs) - if output_report is None: - return None - elif "htm" in output_report.lower(): - # Get the html report - fullpath_filename = output_directory / output_prefix + "tbl.htm" - if fullpath_filename.exists(): - return get_html_report(fullpath_filename) - else: - raise FileNotFoundError( - 'File "{}" does not exist'.format(fullpath_filename) - ) - - elif "sql" == output_report.lower(): - # Get the sql report - fullpath_filename = output_directory / output_prefix + "out.sql" - if fullpath_filename.exists(): - return get_sqlite_report(fullpath_filename) - else: - raise FileNotFoundError( - 'File "{}" does not exist'.format(fullpath_filename) - ) - elif output_report.lower() == "sql_file": - # Get the sql report - fullpath_filename = output_directory / output_prefix + "out.sql" - if fullpath_filename.exists(): - return fullpath_filename - else: - raise FileNotFoundError( - 'File "{}" does not exist'.format(fullpath_filename) - ) - else: - return None - - -def get_from_cache(kwargs): - """Retrieve a EPlus Tabulated Summary run result from the cache - - Args: - kwargs (dict): Args used to create the cache name. - - Returns: - dict: dict of DataFrames - """ - output_directory = Path(kwargs.get("output_directory")) - output_report = kwargs.get("output_report") - eplus_file = next(iter(output_directory.glob("*.idf")), None) - if not eplus_file: - return None - if settings.use_cache: - # determine the filename by hashing the eplus_file - cache_filename_prefix = hash_file(eplus_file, kwargs) - - if output_report is None: - # No report is expected but we should still return the path if it exists. - cached_run_dir = output_directory / cache_filename_prefix - if cached_run_dir.exists(): - return cached_run_dir - else: - return None - elif "htm" in output_report.lower(): - # Get the html report - - cache_fullpath_filename = ( - output_directory / cache_filename_prefix / cache_filename_prefix - + "tbl.htm" - ) - if cache_fullpath_filename.exists(): - return get_html_report(cache_fullpath_filename) - - elif "sql" == output_report.lower(): - # get the SQL report - if not output_directory: - output_directory = settings.cache_folder / cache_filename_prefix - - cache_fullpath_filename = ( - output_directory / cache_filename_prefix / cache_filename_prefix - + "out.sql" - ) - - if cache_fullpath_filename.exists(): - # get reports from passed-in report names or from - # settings.available_sqlite_tables if None are given - return get_sqlite_report( - cache_fullpath_filename, - kwargs.get("report_tables", settings.available_sqlite_tables), - ) - elif "sql_file" == output_report.lower(): - # get the SQL report - if not output_directory: - output_directory = settings.cache_folder / cache_filename_prefix - - cache_fullpath_filename = ( - output_directory / cache_filename_prefix / cache_filename_prefix - + "out.sql" - ) - if cache_fullpath_filename.exists(): - return cache_fullpath_filename - - -def get_html_report(report_fullpath): - """Parses the html Summary Report for each tables into a dictionary of - DataFrames - - Args: - report_fullpath (str): full path to the report file - - Returns: - dict: dict of {title : table ,...} - """ - from eppy.results import readhtml # the eppy module with functions to read the html - - with open(report_fullpath, "r", encoding="utf-8") as cache_file: - filehandle = cache_file.read() # get a file handle to the html file - - cached_tbl = readhtml.titletable( - filehandle - ) # get a file handle to the html file - - log('Retrieved response from cache file "{}"'.format(report_fullpath)) - return summary_reports_to_dataframes(cached_tbl) - - -def summary_reports_to_dataframes(reports_list): - """Converts a list of [(title, table),...] to a dict of {title: table - }. Duplicate keys must have their own unique names in the output - dict. - - Args: - reports_list (list): a list of [(title, table),...] - - Returns: - dict: a dict of {title: table } - """ - results_dict = {} - for table in reports_list: - key = str(table[0]) - if key in results_dict: # Check if key is already exists in - # dictionary and give it a new name - key = key + "_" - df = pd.DataFrame(table[1]) - df = df.rename(columns=df.iloc[0]).drop(df.index[0]) - results_dict[key] = df - return results_dict - - -def get_sqlite_report(report_file, report_tables=None): - """Connects to the EnergyPlus SQL output file and retreives all tables - - Args: - report_file (str): path of report file - report_tables (list, optional): list of report table names to retreive. - Defaults to settings.available_sqlite_tables - - Returns: - dict: dict of DataFrames - """ - # set list of report tables - if not report_tables: - report_tables = settings.available_sqlite_tables - - # if file exists, parse it with pandas' read_sql_query - if os.path.isfile(report_file): - import sqlite3 - import numpy as np - - # create database connection with sqlite3 - with sqlite3.connect(report_file) as conn: - # empty dict to hold all DataFrames - all_tables = {} - # Iterate over all tables in the report_tables list - for table in report_tables: - try: - # Try regular str read, could fail if wrong encoding - conn.text_factory = str - df = pd.read_sql_query( - "select * from {};".format(table), - conn, - index_col=report_tables[table]["PrimaryKey"], - parse_dates=report_tables[table]["ParseDates"], - coerce_float=True, - ) - all_tables[table] = df - except OperationalError: - # Wring encoding found, the load bytes and ecode object - # columns only - conn.text_factory = bytes - df = pd.read_sql_query( - "select * from {};".format(table), - conn, - index_col=report_tables[table]["PrimaryKey"], - parse_dates=report_tables[table]["ParseDates"], - coerce_float=True, - ) - str_df = df.select_dtypes([np.object]) - str_df = str_df.stack().str.decode("8859").unstack() - for col in str_df: - df[col] = str_df[col] - all_tables[table] = df - log( - "SQL query parsed {} tables as DataFrames from {}".format( - len(all_tables), report_file - ) - ) - return all_tables - - -def idf_version_updater(idf_file, to_version=None, out_dir=None, simulname=None): - """EnergyPlus idf version updater using local transition program. - - Update the EnergyPlus simulation file (.idf) to the latest available - EnergyPlus version installed on this machine. Optionally specify a version - (eg.: "9-2-0") to aim for a specific version. The output will be the path of - the updated file. The run is multiprocessing_safe. - - Hint: - 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 - `_ . - - Args: - idf_file (Path): path of idf file - to_version (str, optional): EnergyPlus version in the form "X-X-X". - out_dir (Path): path of the output_dir - simulname (str or None, optional): this name will be used for temp dir - id and saved outputs. If not provided, uuid.uuid1() is used. Be - careful to avoid naming collision : the run will alway be done in - separated folders, but the output files can overwrite each other if - the simulname is the same. (default: None) - - Returns: - Path: The path of the new transitioned idf file. - """ - idf_file = Path(idf_file) - if not out_dir: - # if no directory is provided, use directory of file - out_dir = idf_file.dirname() - if not out_dir.isdir() and out_dir != "": - # check if dir exists - out_dir.makedirs_p() - with TemporaryDirectory( - prefix="transition_run_", suffix=simulname, dir=out_dir - ) as tmp: - log("temporary dir (%s) created" % tmp, lg.DEBUG) - idf_file = Path(idf_file.copy(tmp)).abspath() # copy and return abspath - - versionid = get_idf_version(idf_file, doted=False)[0:5] - doted_version = get_idf_version(idf_file, doted=True) - iddfile = getiddfile(doted_version) - if os.path.exists(iddfile): - # if a E+ exists, means there is an E+ install that can be used - if versionid == to_version: - # if version of idf file is equal to intended version, copy file from - # temp transition folder into cache folder and return path - return idf_file.copy(out_dir / idf_file.basename()) - # might be an old version of E+ - elif tuple(map(int, doted_version.split("."))) < (8, 0): - # the version is an old E+ version (< 8.0) - iddfile = getoldiddfile(doted_version) - if versionid == to_version: - # if version of idf file is equal to intended version, copy file from - # temp transition folder into cache folder and return path - return idf_file.copy(out_dir / idf_file.basename()) - # use to_version - if to_version is None: - # What is the latest E+ installed version - to_version = find_eplus_installs(iddfile) - if tuple(versionid.split("-")) > tuple(to_version.split("-")): - raise EnergyPlusVersionError(idf_file, versionid, to_version) - vupdater_path = ( - get_eplus_dirs(settings.ep_version) / "PreProcess" / "IDFVersionUpdater" - ) - exe = ".exe" if platform.system() == "Windows" else "" - trans_exec = { - "1-0-0": vupdater_path / "Transition-V1-0-0-to-V1-0-1" + exe, - "1-0-1": vupdater_path / "Transition-V1-0-1-to-V1-0-2" + exe, - "1-0-2": vupdater_path / "Transition-V1-0-2-to-V1-0-3" + exe, - "1-0-3": vupdater_path / "Transition-V1-0-3-to-V1-1-0" + exe, - "1-1-0": vupdater_path / "Transition-V1-1-0-to-V1-1-1" + exe, - "1-1-1": vupdater_path / "Transition-V1-1-1-to-V1-2-0" + exe, - "1-2-0": vupdater_path / "Transition-V1-2-0-to-V1-2-1" + exe, - "1-2-1": vupdater_path / "Transition-V1-2-1-to-V1-2-2" + exe, - "1-2-2": vupdater_path / "Transition-V1-2-2-to-V1-2-3" + exe, - "1-2-3": vupdater_path / "Transition-V1-2-3-to-V1-3-0" + exe, - "1-3-0": vupdater_path / "Transition-V1-3-0-to-V1-4-0" + exe, - "1-4-0": vupdater_path / "Transition-V1-4-0-to-V2-0-0" + exe, - "2-0-0": vupdater_path / "Transition-V2-0-0-to-V2-1-0" + exe, - "2-1-0": vupdater_path / "Transition-V2-1-0-to-V2-2-0" + exe, - "2-2-0": vupdater_path / "Transition-V2-2-0-to-V3-0-0" + exe, - "3-0-0": vupdater_path / "Transition-V3-0-0-to-V3-1-0" + exe, - "3-1-0": vupdater_path / "Transition-V3-1-0-to-V4-0-0" + exe, - "4-0-0": vupdater_path / "Transition-V4-0-0-to-V5-0-0" + exe, - "5-0-0": vupdater_path / "Transition-V5-0-0-to-V6-0-0" + exe, - "6-0-0": vupdater_path / "Transition-V6-0-0-to-V7-0-0" + exe, - "7-0-0": vupdater_path / "Transition-V7-0-0-to-V7-1-0" + exe, - "7-1-0": vupdater_path / "Transition-V7-1-0-to-V7-2-0" + exe, - "7-2-0": vupdater_path / "Transition-V7-2-0-to-V8-0-0" + exe, - "8-0-0": vupdater_path / "Transition-V8-0-0-to-V8-1-0" + exe, - "8-1-0": vupdater_path / "Transition-V8-1-0-to-V8-2-0" + exe, - "8-2-0": vupdater_path / "Transition-V8-2-0-to-V8-3-0" + exe, - "8-3-0": vupdater_path / "Transition-V8-3-0-to-V8-4-0" + exe, - "8-4-0": vupdater_path / "Transition-V8-4-0-to-V8-5-0" + exe, - "8-5-0": vupdater_path / "Transition-V8-5-0-to-V8-6-0" + exe, - "8-6-0": vupdater_path / "Transition-V8-6-0-to-V8-7-0" + exe, - "8-7-0": vupdater_path / "Transition-V8-7-0-to-V8-8-0" + exe, - "8-8-0": vupdater_path / "Transition-V8-8-0-to-V8-9-0" + exe, - "8-9-0": vupdater_path / "Transition-V8-9-0-to-V9-0-0" + exe, - "9-0-0": vupdater_path / "Transition-V9-0-0-to-V9-1-0" + exe, - "9-1-0": vupdater_path / "Transition-V9-1-0-to-V9-2-0" + exe, - } - - # check the file version, if it corresponds to the latest version found on - # the machine, means its already upgraded to the correct version. Return it. - if versionid == to_version: - # if file version and to_version are the same, we don't need to - # perform transition - log( - 'file {} already upgraded to latest version "{}"'.format( - idf_file, versionid - ) - ) - idf_file = Path(idf_file.copy(out_dir)) - return idf_file - - # Otherwise, - # build a list of command line arguments - try: - with cd(vupdater_path): - transitions = [ - key - for key in trans_exec - if tuple(map(int, key.split("-"))) - < tuple(map(int, to_version.split("-"))) - and tuple(map(int, key.split("-"))) - >= tuple(map(int, versionid.split("-"))) - ] - for trans in transitions: - if not trans_exec[trans].exists(): - raise EnergyPlusProcessError( - cmd=trans_exec[trans], - stderr="The specified EnergyPlus version (v{}) does not have" - " the required transition program '{}' in the " - "PreProcess folder. See the documentation " - "(archetypal.readthedocs.io/troubleshooting.html#missing-transition-programs) " - "to solve this issue".format(to_version, trans_exec[trans]), - idf=idf_file.basename(), - ) - else: - cmd = [trans_exec[trans], idf_file] - try: - process = subprocess.Popen( - cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - process_output, error_output = process.communicate() - log(process_output.decode("utf-8"), lg.DEBUG) - except CalledProcessError as exception: - log( - "{} failed with error\n".format( - idf_version_updater.__name__, str(exception) - ), - lg.ERROR, - ) - except EnergyPlusProcessError as e: - raise e - for f in Path(tmp).files("*.idfnew"): - f.copy(out_dir / idf_file.basename()) - return Path(out_dir / idf_file.basename()) - - -def find_eplus_installs(iddfile): - """Finds all installed versions of EnergyPlus in the default location and - returns the latest version number - - Args: - iddfile: - - Returns: - (str): The version number of the latest E+ install - """ - vupdater_path, _ = iddfile.split("Energy+") - path_to_eplus, _ = vupdater_path.split("EnergyPlus") - - # Find all EnergyPlus folders - list_eplus_dir = glob.glob(os.path.join(path_to_eplus, "EnergyPlus*")) - - # check if any EnergyPlus install exists - if not list_eplus_dir: - raise Exception( - "No EnergyPlus installation found. Make sure you have EnergyPlus installed. " - "Go to https://energyplus.net/downloads to download the latest version of EnergyPlus." - ) - - # Find the most recent version of EnergyPlus installed from the version - # number (at the end of the folder name) - v0 = (0, 0, 0) # Initialize the version number - # Find the most recent version in the different folders found - for dir in list_eplus_dir: - version = dir[-5:] - ver = tuple(map(int, version.split("-"))) - if ver > v0: - v0 = ver - - return "-".join(tuple(map(str, v0))) - - -def get_idf_version(file, doted=True): - """Get idf version quickly by reading first few lines of idf file containing - the 'VERSION' identifier - - Args: - file (str): Absolute or relative Path to the idf file - doted (bool, optional): Wheter or not to return the version number - - Returns: - str: the version id - """ - with open(os.path.abspath(file), "r", encoding="latin-1") as fhandle: - try: - txt = fhandle.read() - ntxt = parse_idd.nocomment(txt, "!") - blocks = ntxt.split(";") - blocks = [block.strip() for block in blocks] - bblocks = [block.split(",") for block in blocks] - bblocks1 = [[item.strip() for item in block] for block in bblocks] - ver_blocks = [block for block in bblocks1 if block[0].upper() == "VERSION"] - ver_block = ver_blocks[0] - if doted: - versionid = ver_block[1] - else: - versionid = ver_block[1].replace(".", "-") + "-0" - except Exception as e: - log('Version id for file "{}" cannot be found'.format(file)) - log("{}".format(e)) - raise - else: - return versionid - - -def getoldiddfile(versionid): - """find the IDD file of the E+ installation E+ version 7 and earlier have - the idd in /EnergyPlus-7-2-0/bin/Energy+.idd - - Args: - versionid: - """ - vlist = versionid.split(".") - if len(vlist) == 1: - vlist = vlist + ["0", "0"] - elif len(vlist) == 2: - vlist = vlist + ["0"] - ver_str = "-".join(vlist) - eplus_exe, _ = eppy.runner.run_functions.install_paths(ver_str) - eplusfolder = os.path.dirname(eplus_exe) - iddfile = "{}/bin/Energy+.idd".format(eplusfolder) - return iddfile - - -if __name__ == "__main__": - pass diff --git a/archetypal/idfclass/__init__.py b/archetypal/idfclass/__init__.py new file mode 100644 index 00000000..a1d2a863 --- /dev/null +++ b/archetypal/idfclass/__init__.py @@ -0,0 +1,22 @@ +"""IDF model package. Working with energy plus files""" + +__all__ = [ + "__eq__", + "_parse_idd_type", + "get_default", + "makedict", + "nameexists", + "hash_model", + "IDF", + "Outputs", + "Meters", + "Variables", +] + +from .extensions import __eq__, _parse_idd_type, get_default, makedict, nameexists +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 diff --git a/archetypal/idfclass/extensions.py b/archetypal/idfclass/extensions.py new file mode 100644 index 00000000..85555966 --- /dev/null +++ b/archetypal/idfclass/extensions.py @@ -0,0 +1,119 @@ +"""Eppy extensions module.""" + +import copy + +from eppy.bunch_subclass import BadEPFieldError +from eppy.EPlusInterfaceFunctions.eplusdata import Eplusdata, Idd, removecomment +from geomeppy.patches import EpBunch + +from archetypal.utils import extend_class, log + + +@extend_class(EpBunch) +def __eq__(self, other): + """Test the equality of two EpBunch objects using all attribute values.""" + if not isinstance(other, EpBunch): + return False + return all(str(a).upper() == str(b).upper() for a, b in zip(self.obj, other.obj)) + + +@extend_class(EpBunch) +def nameexists(self): + """Return True if EpBunch Name already exists in idf.idfobjects[KEY].""" + existing_objs = self.theidf.idfobjects[self.key.upper()] + try: + return self.Name.upper() in [obj.Name.upper() for obj in existing_objs] + except BadEPFieldError: + return False + + +@extend_class(EpBunch) +def get_default(self, name): + """Return the default value of a field""" + if "default" in self.getfieldidd(name).keys(): + _type = _parse_idd_type(self, name) + default_ = next(iter(self.getfieldidd_item(name, "default")), None) + return _type(default_) + else: + return "" + + +@extend_class(Eplusdata) +def makedict(self, dictfile, fnamefobject): + """stuff file data into the blank dictionary.""" + # fname = './exapmlefiles/5ZoneDD.idf' + # fname = './1ZoneUncontrolled.idf' + if isinstance(dictfile, Idd): + localidd = copy.deepcopy(dictfile) + dt, dtls = localidd.dt, localidd.dtls + else: + dt, dtls = self.initdict(dictfile) + fnamefobject.seek(0) # make sure to read from the beginning + astr = fnamefobject.read() + try: + astr = astr.decode("ISO-8859-2") + except AttributeError: + pass + nocom = removecomment(astr, "!") + idfst = nocom + # alist = string.split(idfst, ';') + alist = idfst.split(";") + lss = [] + for element in alist: + # lst = string.split(element, ',') + lst = element.split(",") + lss.append(lst) + + for i in range(0, len(lss)): + for j in range(0, len(lss[i])): + lss[i][j] = lss[i][j].strip() + + for element in lss: + node = element[0].upper() + if node in dt: + # stuff data in this key + dt[node.upper()].append(element) + else: + # scream + if node == "": + continue + log("this node -%s-is not present in base dictionary" % node) + + self.dt, self.dtls = dt, dtls + return dt, dtls + + +def _parse_idd_type(epbunch, name): + """Parse the fieldvalue type into a python type. + + Possible types are: + - integer -> int + - real -> float + - alpha -> str (arbitrary string), + - choice -> str (alpha with specific list of choices, see \key) + - object-list -> str (link to a list of objects defined elsewhere, see \object-list and \reference) + - external-list -> str (uses a special list from an external source, see \external-list) + - node -> str (name used in connecting HVAC components) + """ + _type = next(iter(epbunch.getfieldidd_item(name, "type")), "").lower() + if _type == "real": + return float + elif _type == "alpha": + return str + elif _type == "integer": + return int + else: + return str + + +# relationship between epbunch output frequency and db. +bunch2db = { + "Detailed": ["HVAC System Timestep", "Zone Timestep"], + "Timestep": ["HVAC System Timestep", "Zone Timestep"], + "Hourly": "Hourly", + "Daily": "Daily", + "Monthly": "Monthly", + "RunPeriod": "Run Period", + "Environment": "Run Period", + "Annual": "Annual", +} diff --git a/archetypal/idfclass/idf.py b/archetypal/idfclass/idf.py new file mode 100644 index 00000000..54076497 --- /dev/null +++ b/archetypal/idfclass/idf.py @@ -0,0 +1,2163 @@ +"""IDF class module. + +Various functions for processing EnergyPlus models and retrieving results in +different forms. +""" + +import itertools +import logging as lg +import math +import os +import re +import shutil +import sqlite3 +import subprocess +import time +import uuid +import warnings +from collections import defaultdict +from io import IOBase, StringIO +from itertools import chain +from math import isclose +from typing import Any, Optional, Union + +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 +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 +from path import Path +from tabulate import tabulate +from tqdm import tqdm + +from archetypal.eplus_interface.basement import BasementThread +from archetypal.eplus_interface.energy_plus import EnergyPlusThread +from archetypal.eplus_interface.exceptions import ( + EnergyPlusProcessError, + EnergyPlusVersionError, + EnergyPlusWeatherError, +) +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 +from archetypal.idfclass.meters import Meters +from archetypal.idfclass.outputs import Outputs +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): + """Class for loading and parsing idf models. + + This is the starting point to run simulations and retrieving results. + + Wrapper over the geomeppy.IDF class and subsequently the + eppy.modeleditor.IDF class. + """ + + IDD = {} + IDDINDEX = {} + BLOCK = {} + + OUTPUTTYPES = ("standard", "nocomment1", "nocomment2", "compressed") + + # dependencies: dict of + _dependencies = { + "iddname": ["idfname", "as_version"], + "idd_info": ["iddname", "idfname"], + "idd_index": ["iddname", "idfname"], + "idd_version": ["iddname", "idfname"], + "idfobjects": ["iddname", "idfname"], + "block": ["iddname", "idfname"], + "model": ["iddname", "idfname"], + "sql": [ + "as_version", + "annual", + "design_day", + "epw", + "idfname", + "tmp_dir", + ], + "htm": [ + "as_version", + "annual", + "design_day", + "epw", + "idfname", + "tmp_dir", + ], + "meters": [ + "idfobjects", + "epw", + "annual", + "design_day", + "readvars", + "as_version", + ], + "variables": [ + "idfobjects", + "epw", + "annual", + "design_day", + "readvars", + "as_version", + ], + "sim_id": [ + "idfobjects", + "epw", + "annual", + "design_day", + "readvars", + "as_version", + ], + "schedules_dict": ["idfobjects"], + "partition_ratio": ["idfobjects"], + "net_conditioned_building_area": ["idfobjects"], + "energyplus_its": ["annual", "design_day"], + "tmp_dir": ["idfobjects"], + } + _independant_vars = set(chain(*list(_dependencies.values()))) + _dependant_vars = set(_dependencies.keys()) + + _initial_postition = itertools.count(start=1) + + 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): + """Set attribute.""" + propobj = getattr(self.__class__, 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(IDF, self).__setattr__(key, value) + + def __init__( + self, + idfname=None, + epw=None, + as_version=settings.ep_version, + annual=False, + design_day=False, + expandobjects=False, + convert=False, + verbose=settings.log_console, + readvars=True, + prep_outputs=True, + include=None, + custom_processes=None, + output_suffix="L", + epmacro=False, + keep_data=True, + keep_data_err=False, + position=0, + name=None, + output_directory=None, + outputtype="standard", + **kwargs, + ): + """Initialize an IDF object. + + 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. + 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. + If as_version is higher than the file version, the model will be + transitioned to the target version. This will not overwrite the file + unless IDF.save() is invoked. See :meth:`IDF.save`, + :meth:`IDF.saveas` and :meth:`IDF.savecopy` for other IO operations + on IDF objects. + annual (bool): If True then force annual simulation (default: False). + 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, + as_version=None, + prep_outputs=True, + include=None, + keep_original=True, + """ + # Set independents to there original values + if include is None: + include = [] + self.idfname = idfname + self.epw = epw + self.as_version = as_version if as_version else settings.ep_version + self._custom_processes = custom_processes + self._include = include + self.keep_data_err = keep_data_err + self._keep_data = keep_data + self.output_suffix = output_suffix + self.verbose = verbose + self.readvars = readvars + self.expandobjects = expandobjects + self.convert = convert + self.epmacro = epmacro + self.design_day = design_day + self.annual = annual + self.prep_outputs = prep_outputs + self._position = position + self.output_prefix = None + self.name = self.idfname.basename() if isinstance(self.idfname, Path) else name + self.output_directory = output_directory + + # Set dependants to None + self.file_version = kwargs.get("file_version", None) + self._iddname = None + self._idd_info = None + self._idd_index = None + self._idd_version = None + self._idfobjects = None + self._block = None + self._model = None + self._sql = None + self._sql_file = None + self._htm = None + self._original_ep_version = None + self._schedules_dict = None + self._outputs = None + self._partition_ratio = None + self._area_conditioned = None + self._area_unconditioned = None + self._area_total = None + self._schedules = None + self._meters = None + self._variables = None + self._energyplus_its = 0 + self._sim_id = None + self._sim_timestamp = None + + self.outputtype = outputtype + self.original_idfname = self.idfname # Save original + + try: + # load the idf object by asserting self.idd_info + assert self.idd_info + except Exception as e: + raise e + else: + self._original_cache = hash_model(self) + if self.file_version < self.as_version: + self.upgrade(to_version=self.as_version, overwrite=False) + finally: + # Set model outputs + self._outputs = Outputs(idf=self) + if self.prep_outputs: + ( + self._outputs.add_basics() + .add_umi_template_outputs() + .add_custom(outputs=self.prep_outputs) + .add_profile_gas_elect_ouputs() + .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 + + def __repr__(self): + """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}'" + else: + sim_info = "\tNot yet simulated" + body = "\n".join([f"IDF object {self.name}", f"at {self.idfname}"]) + body += f"\n\tVersion {self.file_version}\nSimulation Info:\n" + body += sim_info + return f"<{body}>" + + @classmethod + def from_example_files(cls, example_name, **kwargs): + """Load an IDF model from the ExampleFiles folder by name.""" + file = next( + iter( + (get_eplus_dirs(settings.ep_version) / "ExampleFiles").files( + example_name + ) + ) + ) + return cls(file, **kwargs) + + def setiddname(self, iddname, testing=False): + """Set EnergyPlus IDD path for model. + + Sets the version of EnergyPlus which is to be used by eppy. + + Args: + iddname (str): Path to the IDD file. + testing (bool): + """ + self.iddname = iddname + self.idd_info = None + self.block = None + + def read(self): + """Read the IDF file and the IDD file. + + If the IDD file had already been read, it will not be read again. + + Read populates the following data structures: + - idfobjects : list + - model : list + - idd_info : list + - idd_index : dict + """ + if self.getiddname() is None: + errortxt = ( + "IDD file needed to read the idf file. " + "Set it using IDF.setiddname(iddfile)" + ) + raise IDDNotSetError(errortxt) + readout = idfreader1( + self.idfname, self.iddname, self, commdct=self.idd_info, block=self.block + ) + (self.idfobjects, block, self.model, idd_info, idd_index, idd_version) = readout + self.setidd(idd_info, idd_index, block, idd_version) + + def getiddname(self): + """Get the name of the current IDD used by eppy.""" + return self.iddname + + def setidd(self, iddinfo, iddindex, block, idd_version): + """Set the IDD to be used by eppy. + + Args: + iddinfo (list): Comments and metadata about fields in the IDD. + block (list): Field names in the IDD. + """ + self.idd_info = iddinfo + self.block = block + self.idd_index = iddindex + self.idd_version = 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=self._idd_info, block=self._block + ) + 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 + + @property + def block(self) -> list: + """Set EnergyPlus field ID names of the IDF from the IDD.""" + if self._block is None: + self._read_idf() + return self._block + + @property + def idd_info(self) -> list: + """Set comments and metadata about fields in the IDD.""" + if self._idd_info is None: + self._read_idf() + return self._idd_info + + @property + def idd_index(self) -> dict: + """Set pair of dicts used for fast lookups of names of groups of objects.""" + if self._idd_index is None: + self._read_idf() + return self._idd_index + + @property + def idfobjects(self) -> dict: + """Set dict of lists of idf_MSequence objects in the IDF.""" + if self._idfobjects is None: + self._read_idf() + return self._idfobjects + + @property + def model(self) -> Eplusdata: + """Set Eplusdata object containing representations of IDF objects.""" + if self._model is None: + self._read_idf() + return self._model + + @property + def idd_version(self) -> tuple: + """Return the version of the iddname as a tuple.""" + if self._idd_version is None: + self._read_idf() + return self._idd_version + + @property + def iddname(self) -> Path: + """Return the iddname used to parse the idf model.""" + if self._iddname is None: + if self.file_version > self.as_version: + raise EnergyPlusVersionError( + f"{self.as_version} cannot be lower then " + f"the version number set in the file: {self.file_version}" + ) + idd_filename = Path(getiddfile(str(self.file_version))).expand() + if not idd_filename.exists(): + # Try finding the one in IDFVersionsUpdater + idd_filename = ( + self.idfversionupdater_dir / f"V" + f"{self.file_version.dash}-Energy+.idd" + ).expand() + self._iddname = idd_filename + return self._iddname + + @property + def file_version(self) -> EnergyPlusVersion: + """Return the :class:`EnergyPlusVersion` of the idf text file.""" + if self._file_version is None: + return EnergyPlusVersion(get_idf_version(self.idfname)) + else: + return self._file_version + + @file_version.setter + def file_version(self, value): + if value is None: + self._file_version = None + else: + self._file_version = EnergyPlusVersion(value) + + @property + def custom_processes(self) -> list: + """Return list of callables. Called on the output files.""" + return self._custom_processes + + @property + def include(self) -> list: + """Return list of external files attached to model.""" + return self._include + + @property + def keep_data_err(self) -> bool: + """bool: If True, error files are copied back into self.output_folder.""" + return self._keep_data_err + + @keep_data_err.setter + def keep_data_err(self, value): + if not isinstance(value, bool): + raise TypeError("'keep_data_err' needs to be a bool") + self._keep_data_err = value + + @property + def keep_data(self) -> bool: + """bool: If True, keep data folder.""" + return self._keep_data + + # region User-Defined Properties (have setter) + @property + def output_suffix(self) -> str: + """str: The 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) + """ + return self._output_suffix + + @output_suffix.setter + def output_suffix(self, value): + choices = ["L", "C", "D"] + if value not in choices: + raise ValueError(f"Choices of 'output_suffix' are {choices}") + self._output_suffix = value + + @property + def idfname(self) -> Union[Path, StringIO]: + """Path: The path of the active (parsed) idf model.""" + if self._idfname is None: + idfname = StringIO(f"VERSION, {self.as_version};") + self._idfname = idfname + self._reset_dependant_vars("idfname") + else: + if isinstance(self._idfname, StringIO): + pass + else: + self._idfname = Path(self._idfname).expand() + return self._idfname + + @idfname.setter + def idfname(self, value): + if not value: + self._idfname = None + elif not isinstance(value, (str, os.PathLike, StringIO, IOBase)): + raise ValueError(f"IDF path must be Path-Like, not {type(value)}") + elif isinstance(value, (str, os.PathLike)): + self._idfname = Path(value).expand() + else: + self._idfname = value + self._reset_dependant_vars("idfname") + + @property + def epw(self) -> Path: + """Path: The weather file path.""" + if self._epw is not None: + return Path(self._epw).expand() + + @epw.setter + def epw(self, value): + """Set the epw file path.""" + if value: + self._epw = Path(value).expand() + else: + self._epw = None + + @property + def verbose(self): + """bool: If True, print outputs to logging module. + + See Also: + :ref:`archetypal.utils.config` + """ + return self._verbose + + @verbose.setter + def verbose(self, value): + """Set verbose status for simulation.""" + if not isinstance(value, bool): + raise TypeError("'verbose' needs to be a bool") + self._verbose = value + + @property + def expandobjects(self) -> bool: + """bool: If True, run ExpandObjects prior to simulation.""" + return self._expandobjects + + @expandobjects.setter + def expandobjects(self, value): + """Set expandobjects.""" + if not isinstance(value, bool): + raise TypeError("'expandobjects' needs to be a bool") + self._expandobjects = value + + @property + def readvars(self) -> bool: + """bool: If True, run ReadVarsESO after simulation.""" + return self._readvars + + @readvars.setter + def readvars(self, value): + """Set readvars.""" + if not isinstance(value, bool): + raise TypeError("'readvars' needs to be a bool") + self._readvars = value + + @property + def epmacro(self) -> bool: + """bool: If True, run EPMacro prior to simulation.""" + return self._epmacro + + @epmacro.setter + def epmacro(self, value): + """Set epmacro.""" + if not isinstance(value, bool): + raise TypeError("'epmacro' needs to be a bool") + self._epmacro = value + + @property + def design_day(self) -> bool: + """bool: If True, force design-day-only simulation.""" + return self._design_day + + @design_day.setter + def design_day(self, value): + """Set design_day.""" + if not isinstance(value, bool): + raise TypeError("'design_day' needs to be a bool") + self._design_day = value + + @property + def annual(self) -> bool: + """bool: If True, force annual simulation.""" + return self._annual + + @annual.setter + def annual(self, value): + """Set annual.""" + if not isinstance(value, bool): + raise TypeError("'annual' needs to be a bool") + self._annual = value + + @property + def convert(self) -> bool: + """bool: If True, only convert IDF->epJSON or epJSON->IDF. + + Dependent on input file type. No simulation. + """ + return self._convert + + @convert.setter + def convert(self, value): + if not isinstance(value, bool): + raise TypeError("'convert' needs to be a bool") + self._convert = value + + @property + def prep_outputs(self): + """Bool or set list of custom outputs.""" + return self._prep_outputs + + @prep_outputs.setter + def prep_outputs(self, value): + self._prep_outputs = value + + @property + def as_version(self): + """Specify the desired :class:`EnergyPlusVersion` for the IDF model.""" + if self._as_version is None: + self._as_version = EnergyPlusVersion.current() + return EnergyPlusVersion(self._as_version) + + @as_version.setter + def as_version(self, value): + # Parse value and check if above or bellow + self._as_version = EnergyPlusVersion(value) + + @property + def output_directory(self) -> Path: + """Path: The output directory based on the hashing of the original file. + + Notes: + The hashing is performed before transitions or modifications. + """ + if self._output_directory is None: + cache_filename = self._original_cache + output_directory = settings.cache_folder / cache_filename + output_directory.makedirs_p() + self._output_directory = output_directory.expand() + return Path(self._output_directory) + + @output_directory.setter + def output_directory(self, value): + if value and not Path(value).exists(): + raise ValueError( + f"The tmp_dir '{value}' must be created before being assigned" + ) + elif value: + value = Path(value) + self._output_directory = value + + @property + def output_prefix(self) -> str: + """str: Prefix for output file names (default: eplus).""" + if self._output_prefix is None: + self._output_prefix = "eplus" + return self._output_prefix + + @output_prefix.setter + def output_prefix(self, value): + if value and not isinstance(value, str): + raise TypeError("'output_prefix' needs to be a string") + self._output_prefix = value + + @property + def sim_id(self) -> str: + """str: The unique Id of the simulation. + + Based on a subset of hashed variables: + - The idf model itself. + - epw + - annual + - design_day + - readvars + - as_version + """ + self._sim_id = hash_model( + self, + epw=self.epw, + annual=self.annual, + design_day=self.design_day, + readvars=self.readvars, + ep_version=self.as_version, + include=self.include, + ) + return self._sim_id + + # endregion + @property + def sim_info(self) -> Optional[DataFrame]: + """DataFrame: Unique number generated for a simulation.""" + if self.sql_file is not None: + with sqlite3.connect(self.sql_file) as conn: + sql_query = """select * from Simulations""" + sim_info = pd.read_sql_query(sql_query, con=conn) + return sim_info + else: + return None + + @property + def sim_timestamp(self) -> Union[str, Series]: + """Return the simulation timestamp or "Never" if not ran yet.""" + if self.sim_info is None: + return "Never" + else: + return self.sim_info.TimeStamp + + @property + def position(self) -> int: + """int: Position for the progress bar.""" + return self._position + + @property + def idfversionupdater_dir(self) -> Path: + """Path: The path of the IDFVersionUpdater folder. + + Uses the current module's ep_version. + """ + return ( + get_eplus_dirs(settings.ep_version) / "PreProcess" / "IDFVersionUpdater" + ).expand() + + @property + def name(self) -> str: + """str: Name of the idf model. + + Can include the extension (.idf). + """ + 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: + """Get the sql table report.""" + if self._sql is None: + try: + sql_dict = get_report( + self.idfname, + self.simulation_dir, + output_report="sql", + output_prefix=self.output_prefix, + ) + except FileNotFoundError: + # check if htm output is in file + sql_object = self.anidfobject( + key="Output:SQLite".upper(), Option_Type="SimpleAndTabular" + ) + if sql_object not in self.idfobjects["Output:SQLite".upper()]: + self.addidfobject(sql_object) + return self.simulate().sql() + except Exception as e: + raise e + else: + self._sql = sql_dict + return self._sql + + def htm(self) -> dict: + """Get the htm table report.""" + if self._htm is None: + try: + htm_dict = get_report( + self.idfname, + self.simulation_dir, + output_report="htm", + output_prefix=self.output_prefix, + ) + except FileNotFoundError: + return self.simulate().htm() + else: + self._htm = htm_dict + return self._htm + + @property + def energyplus_its(self) -> int: + """Return number of iterations needed to complete simulation.""" + if self._energyplus_its is None: + self._energyplus_its = 0 + return self._energyplus_its + + def open_htm(self): + """Open .htm file in browser.""" + import webbrowser + + html, *_ = self.simulation_dir.files("*.htm") + + webbrowser.open(html.abspath()) + + def open_idf(self): + """Open file in correct version of Ep-Launch.""" + if isinstance(self.idfname, StringIO): + # make a temporary file if inmemery IDF. + filepath = self.savecopy(self.output_directory / self.name) + else: + filepath = self.idfname + + import subprocess + + subprocess.Popen( + ( + shutil.which( + "IDFEditor", + path=get_eplus_dirs(self.file_version.dash) + / "PreProcess" + / "IDFEditor", + ), + filepath.abspath(), + ) + ) + + def open_last_simulation(self): + """Open last simulation in Ep-Launch.""" + filepath, *_ = self.simulation_dir.files("*.idf") + + import subprocess + + subprocess.Popen( + ( + shutil.which( + "EP-Launch", + path=get_eplus_dirs(self.file_version.dash), + ), + filepath.abspath(), + ) + ) + + def open_mdd(self): + """Open .mdd file in browser. + + This file shows all the report meters along with their “availability” for the + current input file. + """ + import webbrowser + + mdd, *_ = self.simulation_dir.files("*.mdd") + + webbrowser.open(mdd.abspath()) + + def open_mtd(self): + """Open .mtd file in browser. + + This file contains the “meter details” for the run. This shows what report + variables are on which meters and vice versa – which meters contain what + report variables. + """ + import webbrowser + + mtd, *_ = self.simulation_dir.files("*.mtd") + + webbrowser.open(mtd.abspath()) + + @property + def sql_file(self): + """Get the sql file path.""" + try: + file, *_ = self.simulation_dir.files("*out.sql") + except (FileNotFoundError, ValueError): + return None + return file.expand() + + @property + def mtd_file(self) -> Path: + """Get the mtd file path.""" + try: + file, *_ = self.simulation_dir.files("*.mtd") + except (FileNotFoundError, ValueError): + return self.simulate().mtd_file + return file.expand() + + @property + def net_conditioned_building_area(self) -> float: + """Return the total conditioned area of a building. + + Takes into account zone multipliers. + """ + if self._area_conditioned is None: + if self.simulation_dir.exists(): + with sqlite3.connect(self.sql_file) as conn: + sql_query = """ + SELECT t.Value + FROM TabularDataWithStrings t + WHERE TableName == 'Building Area' + and ColumnName == 'Area' + and RowName == 'Net Conditioned Building Area'; + """ + (res,) = conn.execute(sql_query).fetchone() + self._area_conditioned = float(res) + else: + area = 0 + zones = self.idfobjects["ZONE"] + zone: EpBunch + for zone in zones: + for surface in zone.zonesurfaces: + if hasattr(surface, "tilt"): + if surface.tilt == 180.0: + part_of = int( + zone.Part_of_Total_Floor_Area.upper() != "NO" + ) + multiplier = float( + zone.Multiplier if zone.Multiplier != "" else 1 + ) + + area += surface.area * multiplier * part_of + self._area_conditioned = area + return self._area_conditioned + + @property + def unconditioned_building_area(self) -> float: + """Return the Unconditioned Building Area.""" + if self._area_unconditioned is None: + if self.simulation_dir.exists(): + with sqlite3.connect(self.sql_file) as conn: + sql_query = """ + SELECT t.Value + FROM TabularDataWithStrings t + WHERE TableName == 'Building Area' + and ColumnName == 'Area' + and RowName == 'Unconditioned Building Area'; + """ + (res,) = conn.execute(sql_query).fetchone() + self._area_unconditioned = float(res) + else: + area = 0 + zones = self.idfobjects["ZONE"] + zone: EpBunch + for zone in zones: + for surface in zone.zonesurfaces: + if hasattr(surface, "tilt"): + if surface.tilt == 180.0: + part_of = int( + zone.Part_of_Total_Floor_Area.upper() == "NO" + ) + multiplier = float( + zone.Multiplier if zone.Multiplier != "" else 1 + ) + + area += surface.area * multiplier * part_of + self._area_unconditioned = area + return self._area_unconditioned + + @property + def total_building_area(self) -> float: + """Return the Total Building Area.""" + if self._area_total is None: + if self.simulation_dir.exists(): + with sqlite3.connect(self.sql_file) as conn: + sql_query = """ + SELECT t.Value + FROM TabularDataWithStrings t + WHERE TableName == 'Building Area' + and ColumnName == 'Area' and RowName == 'Total Building Area'; + """ + (res,) = conn.execute(sql_query).fetchone() + self._area_total = float(res) + else: + area = 0 + zones = self.idfobjects["ZONE"] + zone: EpBunch + for zone in zones: + for surface in zone.zonesurfaces: + if hasattr(surface, "tilt"): + if surface.tilt == 180.0: + multiplier = float( + zone.Multiplier if zone.Multiplier != "" else 1 + ) + + area += surface.area * multiplier + 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.""" + if self._partition_ratio is None: + partition_lineal = 0 + zones = self.idfobjects["ZONE"] + zone: EpBunch + for zone in zones: + for surface in [ + surf + for surf in zone.zonesurfaces + if surf.key.upper() not in ["INTERNALMASS", "WINDOWSHADINGCONTROL"] + ]: + if hasattr(surface, "tilt"): + if ( + surface.tilt == 90.0 + and surface.Outside_Boundary_Condition != "Outdoors" + ): + multiplier = float( + zone.Multiplier if zone.Multiplier != "" else 1 + ) + partition_lineal += surface.width * multiplier + self._partition_ratio = partition_lineal / max( + self.net_conditioned_building_area, self.unconditioned_building_area + ) + return self._partition_ratio + + @property + def simulation_files(self) -> list: + """list: The list of files generated by the simulation.""" + try: + return self.simulation_dir.files() + except FileNotFoundError: + return [] + + @property + def simulation_dir(self) -> Path: + """Path: The path where simulation results are stored.""" + try: + return (self.output_directory / self.sim_id).expand() + except AttributeError: + return Path() + + @property + def schedules_dict(self) -> dict: + """Return the dict of {NAME: schedule} in the model.""" + if self._schedules_dict is None: + self._schedules_dict = self._get_all_schedules() + return self._schedules_dict + + @property + def outputs(self) -> Outputs: + """Return the Outputs class associated with the model.""" + return self._outputs + + @property + def day_of_week_for_start_day(self): + """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: + log("model does not contain a 'RunPeriod'. Defaulting to Sunday.") + day = "Sunday" + + if day.lower() == "sunday": + return calendar.SUNDAY + elif day.lower() == "monday": + return calendar.MONDAY + elif day.lower() == "tuesday": + return calendar.TUESDAY + elif day.lower() == "wednesday": + return calendar.WEDNESDAY + elif day.lower() == "thursday": + return calendar.THURSDAY + elif day.lower() == "friday": + return calendar.FRIDAY + elif day.lower() == "saturday": + return calendar.SATURDAY + else: + # field is null + return 6 # E+ default is Sunday + + @property + def meters(self) -> Meters: + """List of available meters for the :class:`IDF` model. + + The :class:`IDF` model must be simulated once (to retrieve the .mdd file). + + The listed meters may or may not be included in the idf file. If they are + not, the output is added to the file and the model is simulated again. The + output is appended to the :attr:`IDF.idfobjects` list, but will not overwrite + the original idf file, unless :meth:`IDF.save` is called. + + Hint: + Call `idf.meters...values()` to retreive a + time-series based on the :class:`pandas.Series` class which can be plotted. + + See :class:`Meter` and :class:`EnergySeries` for more information. + + Example: + The IDF.meters attribute is populated with meters categories + (`Output:Meter` or `Output:Meter:Cumulative`) and each category is + populated with all the available meters. + + .. code-block:: + + >>> IDF.meters.OutputMeter.WaterSystems__MainsWater + >>> IDF.meters.OutputMeterCumulative.WaterSystems__MainsWater + """ + if self._meters is None: + try: + self.simulation_dir.files("*.mdd") + except FileNotFoundError: + raise Exception( + "call IDF.simulate() at least once to get a list of " + "possible meters" + ) + else: + self._meters = Meters(self) + return self._meters + + @property + def variables(self): + """List of available meters for the :class:`IDF` model. + + The :class:`IDF` model must be simulated once (to retrieve the .mdd file). + + The listed meters may or may not be included in the idf file. If they are + not, the output is added to the file and the model is simulated again. The + output is appended to the :attr:`IDF.idfobjects` list, but will not overwrite + the + original idf file, unless :meth:`IDF.save` is called. + + Hint: + Call `idf.meters...values()` to retreive a + time-series based on the :class:`pandas.Series` class which can be plotted. + + See :class:`Meter` and :class:`EnergySeries` for more information. + + Example: + The IDF.meters attribute is populated with meters categories + (`Output:Meter` or `Output:Meter:Cumulative`) and each category is + populated with all the available meters. + + .. code-block:: + + >>> IDF.variables.OutputVariable + >>> IDF.variables.OutputVariable + """ + if self._variables is None: + try: + self.simulation_dir.files("*.rdd") + except FileNotFoundError: + return "call IDF.simulate() to get a list of possible variables" + else: + self._variables = Variables(self) + return self._variables + + def simulate(self, **kwargs): + """Execute EnergyPlus. + + Specified kwargs overwrite IDF parameters. ExpandObjects, Basement and Slab + preprocessors are ran before EnergyPlus. + + Does not return anything. + + Keyword Args: + eplus_file (str): path to the idf file. + weather_file (str): path to the EPW weather file. + output_directory (str, optional): path to the output folder. + ep_version (str, optional): EnergyPlus executable version to use, eg: 9-2-0 + output_report: 'sql' or 'htm' + prep_outputs (bool or list, optional): if True, meters and variable + outputs will be appended to the idf files. Can also specify custom + outputs as list of ep-object outputs. + keep_data (bool): If True, files created by EnergyPlus are saved to the + tmp_dir. + annual (bool): If True then force annual simulation (default: False) + design_day (bool): Force design-day-only simulation (default: False) + epmacro (bool): Run EPMacro prior to simulation (default: False) + expandobjects (bool): Run ExpandObjects prior to simulation (default: + True) + readvars (bool): Run ReadVarsESO after simulation (default: False) + output_prefix (str, optional): Prefix for output file names. + output_suffix (str, optional): Suffix style for output file names + (default: L) Choices are: + - L: Legacy (e.g., eplustbl.csv) + - C: Capital (e.g., eplusTable.csv) + - D: Dash (e.g., eplus-table.csv) + version (bool, optional): Display version information (default: False) + verbose (str): Set verbosity of runtime messages (default: v) v: verbose + q: quiet + keep_data_err (bool): If True, errored directory where simulation + occurred is + kept. + include (str, optional): List input files that need to be copied to the + simulation directory. If a string is provided, it should be in a glob + form (see :meth:`pathlib.Path.glob`). + process_files (bool): If True, process the output files and load to a + :class:`~pandas.DataFrame`. Custom processes can be passed using the + :attr:`custom_processes` attribute. + custom_processes (dict(Callback)): if provided, it has to be a + dictionary with the keys being a glob (see + :meth:`pathlib.Path.glob`), and + the value a Callback taking as signature `callback(file: str, + working_dir, simulname) -> Any` All the file matching this glob will + be processed by this callback. Note: they will still be processed by + pandas.read_csv (if they are csv files), resulting in duplicate. The + only way to bypass this behavior is to add the key "*.csv" to that + dictionary. + return_idf (bool): If True, returns the :class:`IDF` object part of the + return tuple. + return_files (bool): It True, all files paths created by the EnergyPlus + run are returned. + + Raises: + EnergyPlusProcessError: If an issue occurs with the execution of the + energyplus command. + + See Also: + :meth:`simulation_files`, :meth:`processed_results` for simulation outputs. + + """ + # First, update keys with new values + for key, value in kwargs.items(): + if f"_{key}" in self.__dict__.keys(): + setattr(self, key, value) + + if self.as_version != EnergyPlusVersion(self.idd_version): + raise EnergyPlusVersionError( + None, self.idfname, EnergyPlusVersion(self.idd_version), self.as_version + ) + + include = self.include + if isinstance(include, str): + include = Path().abspath().glob(include) + elif include is not None: + include = [Path(file) for file in include] + + # check if a weather file is defined + if not getattr(self, "epw", None): + raise EnergyPlusWeatherError( + f"No weather file specified with {self}. Set 'epw' in IDF(" + f"filename, epw='weather.epw').simulate() or in IDF.simulate(" + f"epw='weather.epw')" + ) + + # Todo: Add EpMacro Thread -> if exist in.imf "%program_path%EPMacro" + # Run the expandobjects program if necessary + tmp = ( + self.output_directory / "expandobjects_run_" + str(uuid.uuid1())[0:8] + ).mkdir() + # Run the ExpandObjects preprocessor program + expandobjects_thread = ExpandObjectsThread(self, tmp) + expandobjects_thread.start() + expandobjects_thread.join() + while expandobjects_thread.is_alive(): + time.sleep(1) + tmp.rmtree(ignore_errors=True) + e = expandobjects_thread.exception + if e is not None: + raise e + + # Run the Basement preprocessor program if necessary + tmp = ( + self.output_directory / "runBasement_run_" + str(uuid.uuid1())[0:8] + ).mkdir() + basement_thread = BasementThread(self, tmp) + basement_thread.start() + basement_thread.join() + while basement_thread.is_alive(): + time.sleep(1) + tmp.rmtree(ignore_errors=True) + e = basement_thread.exception + if e is not None: + raise e + + # Run the Slab preprocessor program if necessary + tmp = (self.output_directory / "runSlab_run_" + str(uuid.uuid1())[0:8]).mkdir() + slab_thread = SlabThread(self, tmp) + slab_thread.start() + slab_thread.join() + while slab_thread.is_alive(): + time.sleep(1) + tmp.rmtree(ignore_errors=True) + e = slab_thread.exception + if e is not None: + raise e + + # Run the energyplus program + tmp = (self.output_directory / "eplus_run_" + str(uuid.uuid1())[0:8]).mkdir() + running_simulation_thread = EnergyPlusThread(self, tmp) + running_simulation_thread.start() + running_simulation_thread.join() + while running_simulation_thread.is_alive(): + time.sleep(1) + tmp.rmtree(ignore_errors=True) + e = running_simulation_thread.exception + if e is not None: + raise e + return self + + def savecopy(self, filename, lineendings="default", encoding="latin-1"): + """Save a copy of the file with the filename passed. + + Args: + filename (str): Filepath to save the file. + lineendings (str): Line endings to use in the saved file. Options are + 'default', 'windows' and 'unix' the default is 'default' which uses + the line endings for the current system. + encoding (str): Encoding to use for the saved file. The default is + 'latin-1' which is compatible with the EnergyPlus IDFEditor. + + Returns: + Path: The new file path. + """ + super(IDF, self).save(filename, lineendings, encoding) + return Path(filename) + + def save(self, lineendings="default", encoding="latin-1", **kwargs): + """Write the IDF model to the text file. + + Uses :meth:`~eppy.modeleditor.IDF.save` but also brings over existing + simulation results. + + Args: + filename (str): Filepath to save the file. If None then use the IDF.idfname + parameter. Also accepts a file handle. + lineendings (str) : Line endings to use in the saved file. Options are + 'default', 'windows' and 'unix' the default is 'default' which uses + the line endings for the current system. + encoding (str): Encoding to use for the saved file. The default is + 'latin-1' which is compatible with the EnergyPlus IDFEditor. + Returns: + IDF: The IDF model + """ + super(IDF, self).save( + filename=self.idfname, lineendings=lineendings, encoding=encoding + ) + log(f"saved '{self.name}' at '{self.idfname}'") + return self + + def saveas(self, filename, lineendings="default", encoding="latin-1"): + """Save the IDF model as. + + Writes a new text file and load a new instance of the IDF class (new object). + + Args: + filename (str): Filepath to save the file. If None then use the IDF.idfname + parameter. Also accepts a file handle. + lineendings (str) : Line endings to use in the saved file. Options are + 'default', 'windows' and 'unix' the default is 'default' which uses + the line endings for the current system. + encoding (str): Encoding to use for the saved file. The default is + 'latin-1' which is compatible with the EnergyPlus IDFEditor. + + Returns: + IDF: A new IDF object based on the new location file. + """ + super(IDF, self).save( + filename=filename, lineendings=lineendings, encoding=encoding + ) + + import inspect + + sig = inspect.signature(IDF.__init__) + kwargs = { + key: getattr(self, key) + for key in [a for a in sig.parameters] + if key not in ["self", "idfname", "kwargs"] + } + + as_idf = IDF(filename, **kwargs) + # copy simulation_dir over to new location + file: Path + as_idf.simulation_dir.makedirs_p() + for file in self.simulation_files: + if self.output_prefix in file: + name = file.replace(self.output_prefix, as_idf.output_prefix) + name = Path(name).basename() + else: + name = file.basename() + file.copy(as_idf.simulation_dir / name) + return as_idf + + def process_results(self): + """Return the list of processed results. + + Processes are defined by :attr:`custom_processes` as a list of tuple(file, + result). A default process looks for csv files and tries to parse them into + :class:`~pandas.DataFrame` objects. + + Returns: + list: List of two-tuples. + + Info: + For processed_results to work more consistently, it may be necessary to + add the "readvars=True" parameter to :func:`IDF.simulate` as this one is + set to false by default. + """ + processes = {"*.csv": _process_csv} + custom_processes = self.custom_processes + if custom_processes: + processes.update(custom_processes) + + try: + results = [] + for glob, process in processes.items(): + results.extend( + [ + ( + file.basename(), + process( + file, + working_dir=os.getcwd(), + simulname=self.output_prefix, + ), + ) + for file in self.simulation_dir.files(glob) + ] + ) + except FileNotFoundError: + raise ValueError("No results to process. Have you called IDF.simulate()?") + else: + return results + + def upgrade(self, to_version=None, overwrite=True): + """`EnergyPlus` idf version updater using local transition program. + + Update the EnergyPlus simulation file (.idf) to the latest available + EnergyPlus version installed on this machine. Optionally specify a version + (eg.: "9-2-0") to aim for a specific version. The output will be the path of + the updated file. The run is multiprocessing_safe. + + Hint: + 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 + `_. + + Args: + to_version (str, optional): EnergyPlus version in the form "X-X-X". + overwrite (bool): If True, original idf file is overwritten with new + transitioned file. + + Raises: + EnergyPlusProcessError: If version updater fails. + EnergyPlusVersionError: + CalledProcessError: + """ + # First, set versions + if to_version is None: + to_version = EnergyPlusVersion.latest() + elif isinstance(to_version, (str, tuple)): + to_version = EnergyPlusVersion(to_version) + + # second check if upgrade needed + if self.file_version == to_version: + return + elif self.file_version > to_version: + raise EnergyPlusVersionError(self.name, self.file_version, to_version) + else: + self.as_version = to_version # set version number + # execute transitions + tmp = ( + self.output_directory / "Transition_run_" + str(uuid.uuid1())[0:8] + ).mkdir() + slab_thread = TransitionThread(self, tmp, overwrite=overwrite) + slab_thread.start() + slab_thread.join() + while slab_thread.is_alive(): + time.sleep(1) + tmp.rmtree(ignore_errors=True) + e = slab_thread.exception + if e is not None: + raise e + + def wwr(self, azimuth_threshold=10, round_to=10): + """Return the Window-to-Wall Ratio by major orientation. + + Optionally round up the WWR value to nearest value (eg.: nearest 10 %). + + Args: + azimuth_threshold (int): Defines the incremental major orientation + azimuth angle. Due to possible rounding errors, some surface + azimuth can be rounded to values different than the main + directions (eg.: 89 degrees instead of 90 degrees). Defaults to + increments of 10 degrees. + round_to (float): Optionally round the WWR value to nearest value + (eg.: nearest 10). If None, this is ignored and the float is + returned. + + Returns: + (pd.DataFrame): A DataFrame with the total wall area, total window + area and WWR for each main orientation of the building. + """ + import math + + def roundto(x, to=10.0): + """Round up to closest `to` number.""" + from builtins import round + + if to and not math.isnan(x): + return int(round(x / to)) * to + else: + return x + + total_surface_area = defaultdict(int) + total_window_area = defaultdict(int) + + zones = self.idfobjects["ZONE"] + zone: EpBunch + for zone in zones: + multiplier = float(zone.Multiplier if zone.Multiplier != "" else 1) + for surface in [ + surf + for surf in zone.zonesurfaces + if surf.key.upper() not in ["INTERNALMASS", "WINDOWSHADINGCONTROL"] + ]: + if isclose(surface.tilt, 90, abs_tol=10): + 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: + if hasattr(subsurface, "tilt"): + if isclose(subsurface.tilt, 90, abs_tol=10): + if subsurface.Surface_Type.lower() == "window": + surf_azim = roundto( + subsurface.azimuth, to=azimuth_threshold + ) + total_window_area[surf_azim] += ( + subsurface.area * multiplier + ) + if isclose(subsurface.tilt, 180, abs_tol=80): + total_window_area["sky"] += subsurface.area * multiplier + # Fix azimuth = 360 which is the same as azimuth 0 + total_surface_area[0] += total_surface_area.pop(360, 0) + total_window_area[0] += total_window_area.pop(360, 0) + + # Create dataframe with wall_area, window_area and wwr as columns and azimuth + # as indexes + from sigfig import round + + df = ( + pd.DataFrame( + {"wall_area": total_surface_area, "window_area": total_window_area} + ) + .rename_axis("Azimuth") + .fillna(0) + ) + df.wall_area = df.wall_area.apply(round, decimals=1) + df.window_area = df.window_area.apply(round, decimals=1) + df["wwr"] = (df.window_area / df.wall_area).fillna(0).apply(round, 2) + df["wwr_rounded_%"] = ( + (df.window_area / df.wall_area * 100) + .fillna(0) + .apply(lambda x: roundto(x, to=round_to)) + ) + return df + + def space_heating_profile( + self, + units="kWh", + energy_out_variable_name=None, + name="Space Heating", + EnergySeries_kwds=None, + ): + """Return space-heating time series. + + Args: + units (str): Units to convert the energy profile to. Will detect the + units of the EnergyPlus results. + energy_out_variable_name (list-like): a list of EnergyPlus Variable + names. + name (str): Name given to the EnergySeries. + EnergySeries_kwds (dict, optional): keywords passed to + :func:`EnergySeries.from_sqlite` + + Returns: + EnergySeries + """ + if EnergySeries_kwds is None: + EnergySeries_kwds = {} + start_time = time.time() + if energy_out_variable_name is None: + energy_out_variable_name = ( + "Air System Total Heating Energy", + "Zone Ideal Loads Zone Total Heating Energy", + ) + series = self._energy_series( + energy_out_variable_name, units, name, EnergySeries_kwds=EnergySeries_kwds + ) + log( + "Retrieved Space Heating Profile in {:,.2f} seconds".format( + time.time() - start_time + ) + ) + return series + + def space_cooling_profile( + self, + units="kWh", + energy_out_variable_name=None, + name="Space Cooling", + EnergySeries_kwds=None, + ): + """Return space-cooling time series. + + Args: + units (str): Units to convert the energy profile to. Will detect the + units of the EnergyPlus results. + energy_out_variable_name (list-like): a list of EnergyPlus + name (str): Name given to the EnergySeries. + EnergySeries_kwds (dict, optional): keywords passed to + :func:`EnergySeries.from_sqlite` + + Returns: + EnergySeries + """ + if EnergySeries_kwds is None: + EnergySeries_kwds = {} + start_time = time.time() + if energy_out_variable_name is None: + energy_out_variable_name = ( + "Air System Total Cooling Energy", + "Zone Ideal Loads Zone Total Cooling Energy", + ) + series = self._energy_series( + energy_out_variable_name, units, name, EnergySeries_kwds=EnergySeries_kwds + ) + log( + "Retrieved Space Cooling Profile in {:,.2f} seconds".format( + time.time() - start_time + ) + ) + return series + + def service_water_heating_profile( + self, + units="kWh", + energy_out_variable_name=None, + name="Space Heating", + EnergySeries_kwds=None, + ): + """Return service water heating (domestic hot water) time series. + + Args: + units (str): Units to convert the energy profile to. Will detect the + units of the EnergyPlus results. + energy_out_variable_name (list-like): a list of EnergyPlus Variable + names. + name (str): Name given to the EnergySeries. + EnergySeries_kwds (dict, optional): keywords passed to + :func:`EnergySeries.from_sqlite` + + Returns: + EnergySeries + """ + if EnergySeries_kwds is None: + EnergySeries_kwds = {} + start_time = time.time() + if energy_out_variable_name is None: + energy_out_variable_name = ("WaterSystems:EnergyTransfer",) + series = self._energy_series( + energy_out_variable_name, units, name, EnergySeries_kwds=EnergySeries_kwds + ) + log( + "Retrieved Service Water Heating Profile in {:,.2f} seconds".format( + time.time() - start_time + ) + ) + return series + + def custom_profile( + self, + energy_out_variable_name, + name, + units="kWh", + prep_outputs=None, + EnergySeries_kwds=None, + ): + """Return user-defined time series. + + Args: + energy_out_variable_name (list-like): a list of EnergyPlus + name (str): Name given to the EnergySeries. + units (str): Units to convert the energy profile to. Will detect the + units of the EnergyPlus results. + prep_outputs: + EnergySeries_kwds (dict, optional): keywords passed to + :func:`EnergySeries.from_sqlite` + + Returns: + EnergySeries + """ + if EnergySeries_kwds is None: + EnergySeries_kwds = {} + start_time = time.time() + series = self._energy_series( + energy_out_variable_name, + units, + name, + prep_outputs, + EnergySeries_kwds=EnergySeries_kwds, + ) + log("Retrieved {} in {:,.2f} seconds".format(name, time.time() - start_time)) + return series + + def newidfobject(self, key, **kwargs) -> Optional[EpBunch]: + """Define EpBunch object and add to model. + + The function will test if the object exists to prevent duplicates. + + Args: + key (str): The type of IDF object. This must be in ALL_CAPS. + **kwargs: Keyword arguments in the format `field=value` used to set + fields in the EnergyPlus object. + + Example: + >>> from archetypal import IDF + >>> IDF.newidfobject( + >>> key="Schedule:Constant".upper(), + >>> Name="AlwaysOn", + >>> Schedule_Type_Limits_Name="", + >>> Hourly_Value=1, + >>> ) + + Returns: + EpBunch: the object, if successful + None: If an error occured. + """ + # get list of objects + existing_objs = self.idfobjects[key] # a list + + # create new object + try: + new_object = self.anidfobject(key, **kwargs) + except BadEPFieldError as e: + raise e + else: + # If object is supposed to be 'unique-object', deletes all objects to be + # sure there is only one of them when creating new object + # (see following line) + if "unique-object" in set().union( + *(d.objidd[0].keys() for d in existing_objs) + ): + for obj in existing_objs: + self.removeidfobject(obj) + self.addidfobject(new_object) + log( + f"{obj} is a 'unique-object'; Removed and replaced with" + f" {new_object}", + lg.DEBUG, + ) + return new_object + if new_object in existing_objs: + # If obj already exists, simply return + log( + f"object '{new_object}' already exists in {self.name}. " + f"Skipping.", + lg.DEBUG, + ) + return new_object + elif new_object not in existing_objs and new_object.nameexists(): + obj = self.getobject( + key=new_object.key.upper(), name=new_object.Name.upper() + ) + self.removeidfobject(obj) + self.addidfobject(new_object) + log( + f"{obj} exists but has different attributes; Removed and replaced " + f"with {new_object}", + lg.DEBUG, + ) + return new_object + else: + # add to model and return + self.addidfobject(new_object) + log(f"object '{new_object}' added to '{self.name}'", lg.DEBUG) + return new_object + + def addidfobject(self, new_object) -> EpBunch: + """Add an IDF object to the model. + + Args: + new_object (EpBunch): The IDF object to add. + + Returns: + EpBunch: object. + """ + key = new_object.key.upper() + self.idfobjects[key].append(new_object) + self._reset_dependant_vars("idfobjects") + return new_object + + def removeidfobject(self, idfobject): + """Remove an IDF object from the model. + + Args: + idfobject (EpBunch): The object to remove from the model. + """ + key = idfobject.key.upper() + self.idfobjects[key].remove(idfobject) + self._reset_dependant_vars("idfobjects") + + def anidfobject(self, key, aname="", **kwargs) -> EpBunch: + # type: (str, str, **Any) -> EpBunch + """Define and create an object, but don't add it to the model. + + See :func:`~archetypal.idfclass.idf.IDF.newidfobject`). If you don't specify + a value for a field, the default value will be set. + + Example: + >>> from archetypal import IDF + >>> IDF.anidfobject("CONSTRUCTION") + >>> IDF.anidfobject( + >>> key="CONSTRUCTION", + >>> Name='Interior Ceiling_class', + >>> Outside_Layer='LW Concrete', + >>> Layer_2='soundmat' + >>> ) + + Args: + key (str): The type of IDF object. This must be in ALL_CAPS. + aname (str): This parameter is not used. It is left there for backward + compatibility. + kwargs: Keyword arguments in the format `field=value` used to set + fields in the EnergyPlus object. + + Returns: + EpBunch: object. + """ + obj = newrawobject(self.model, self.idd_info, key) + abunch = obj2bunch(self.model, self.idd_info, obj) + if aname: + warnings.warn( + "The aname parameter should no longer be used (%s)." % aname, + UserWarning, + ) + namebunch(abunch, aname) + for k, v in kwargs.items(): + try: + abunch[k] = v + except BadEPFieldError as e: + # Backwards compatibility + if str(e) == "unknown field Key_Name": + abunch["Name"] = v + else: + raise e + abunch.theidf = self + return abunch + + def get_schedule_type_limits_data_by_name(self, schedule_limit_name): + """Return the data for a particular 'ScheduleTypeLimits' object. + + Args: + schedule_limit_name: + """ + schedule = self.getobject("ScheduleTypeLimits".upper(), schedule_limit_name) + + if schedule is not None: + lower_limit = schedule["Lower_Limit_Value"] + upper_limit = schedule["Upper_Limit_Value"] + numeric_type = schedule["Numeric_Type"] + unit_type = schedule["Unit_Type"] + + if schedule["Unit_Type"] == "": + unit_type = numeric_type + + return lower_limit, upper_limit, numeric_type, unit_type + else: + return "", "", "", "" + + def get_schedule_epbunch(self, name, sch_type=None): + """Return the epbunch of a particular schedule name. + + If the schedule type is known, retrievess it quicker. + + Args: + name (str): The name of the schedule to retreive in the IDF file. + sch_type (str): The schedule type, e.g.: "SCHEDULE:YEAR". + """ + if sch_type is None: + try: + return self.schedules_dict[name.upper()] + except KeyError: + raise KeyError( + 'Unable to find schedule "{}" of type "{}" ' + 'in idf file "{}"'.format(name, sch_type, self.name) + ) + else: + return self.getobject(sch_type.upper(), name) + + def _get_all_schedules(self, yearly_only=False): + """Return all schedule ep_objects in a dict with their name as a key. + + Args: + yearly_only (bool): If True, return only yearly schedules + + Returns: + (dict of eppy.bunch_subclass.EpBunch): the schedules with their + name as a key + """ + schedule_types = list(map(str.upper, self.getiddgroupdict()["Schedules"])) + if yearly_only: + schedule_types = [ + "Schedule:Year".upper(), + "Schedule:Compact".upper(), + "Schedule:Constant".upper(), + "Schedule:File".upper(), + ] + scheds = {} + for sched_type in schedule_types: + for sched in self.idfobjects[sched_type]: + try: + if sched.key.upper() in schedule_types: + scheds[sched.Name.upper()] = sched + except KeyError: + pass + return scheds + + def _get_used_schedules(self, yearly_only=False): + """Return all used schedules. + + Args: + yearly_only (bool): If True, return only yearly schedules + + Returns: + (list): the schedules names + """ + schedule_types = [ + "Schedule:Day:Hourly".upper(), + "Schedule:Day:Interval".upper(), + "Schedule:Day:List".upper(), + "Schedule:Week:Daily".upper(), + "Schedule:Year".upper(), + "Schedule:Week:Compact".upper(), + "Schedule:Compact".upper(), + "Schedule:Constant".upper(), + "Schedule:File".upper(), + ] + + used_schedules = [] + all_schedules = self._get_all_schedules(yearly_only=yearly_only) + for object_name in self.idfobjects: + for object in self.idfobjects[object_name]: + if object.key.upper() not in schedule_types: + for fieldvalue in object.fieldvalues: + try: + if ( + fieldvalue.upper() in all_schedules.keys() + and fieldvalue not in used_schedules + ): + used_schedules.append(fieldvalue) + except (KeyError, AttributeError): + pass + return used_schedules + + def rename(self, objkey, objname, newname): + """Rename all the references to this objname. + + Function comes from eppy.modeleditor and was modified to compare the + name to rename with a lower string (see + idfobject[idfobject.objls[findex]].lower() == objname.lower()). + + Args: + objkey (str): EpBunch we want to rename and rename all the + occurrences where this object is in the IDF file + objname (str): The name of the EpBunch to rename + newname (str): New name used to rename the EpBunch + + Returns: + theobject (EpBunch): The renamed idf object + """ + refnames = eppy.modeleditor.getrefnames(self, objkey) + for refname in refnames: + objlists = eppy.modeleditor.getallobjlists(self, refname) + # [('OBJKEY', refname, fieldindexlist), ...] + for robjkey, refname, fieldindexlist in objlists: + idfobjects = self.idfobjects[robjkey] + for idfobject in idfobjects: + for findex in fieldindexlist: # for each field + if ( + idfobject[idfobject.objls[findex]].lower() + == objname.lower() + ): + idfobject[idfobject.objls[findex]] = newname + theobject = self.getobject(objkey, objname) + fieldname = [item for item in theobject.objls if item.endswith("Name")][0] + theobject[fieldname] = newname + return theobject + + def _energy_series( + self, + energy_out_variable_name, + units, + name, + prep_outputs=None, + EnergySeries_kwds=None, + ) -> EnergySeries: + """Query the report data and return an EnergySeries. + + Args: + energy_out_variable_name: + units: + name: + prep_outputs (list): + EnergySeries_kwds: + """ + if prep_outputs: + self.outputs.add_custom(prep_outputs).apply() + self.simulate() + rd = ReportData.from_sqlite(self.sql_file, table_name=energy_out_variable_name) + profile = EnergySeries.from_reportdata( + rd, to_units=units, name=name, **EnergySeries_kwds + ) + return profile + + def _execute_transitions(self, idf_file, to_version, **kwargs): + trans_exec = { + EnergyPlusVersion( + re.search(r"to-V(([\d])-([\d])-([\d]))", exec).group(1) + ): exec + for exec in self.idfversionupdater_dir.files("Transition-V*") + } + + transitions = [ + key for key in trans_exec if to_version >= key > self.file_version + ] + transitions.sort() + + for trans in tqdm( + transitions, + position=self.position, + desc=f"transition file #{self.position}-{self.name}", + ): + if not trans_exec[trans].exists(): + raise EnergyPlusProcessError( + cmd=trans_exec[trans], + stderr="The specified EnergyPlus version (v{}) does not have" + " the required transition program '{}' in the " + "PreProcess folder. See the documentation " + "(archetypal.readthedocs.io/troubleshooting.html#missing" + "-transition-programs) " + "to solve this issue".format(to_version, trans_exec[trans]), + idf=self, + ) + else: + cmd = [trans_exec[trans], idf_file] + with subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=self.idfversionupdater_dir, + ) as process: + process_output, error_output = process.communicate() + log( + process_output.decode("utf-8"), + level=lg.DEBUG, + name="transition_" + self.name, + filename="transition_" + self.name, + log_dir=self.idfversionupdater_dir, + ) + if error_output: + log( + error_output.decode("utf-8"), + level=lg.DEBUG, + name="transition_" + self.name, + filename="transition_" + self.name, + log_dir=self.idfversionupdater_dir, + ) + + +def _process_csv(file, working_dir, simulname): + """Process csv file. + + Args: + file: + working_dir: + simulname: + """ + log("looking for csv output, return the csv files in DataFrames if any") + if "table" in file.basename(): + tables_out = working_dir.abspath() / "tables" + tables_out.makedirs_p() + file.copy(tables_out / "%s_%s.csv" % (file.basename().stripext(), simulname)) + return + log("try to store file %s in DataFrame" % file) + try: + df = pd.read_csv(file, sep=",", encoding="us-ascii") + except ParserError: + pass + else: + log("file %s stored" % file) + return df diff --git a/archetypal/idfclass/meters.py b/archetypal/idfclass/meters.py new file mode 100644 index 00000000..5157cf48 --- /dev/null +++ b/archetypal/idfclass/meters.py @@ -0,0 +1,185 @@ +"""EnergyPlus meters module.""" + +import inspect + +import pandas as pd +from energy_pandas import EnergySeries +from eppy.bunch_subclass import BadEPFieldError +from geomeppy.patches import EpBunch +from tabulate import tabulate + +from archetypal.idfclass.extensions import bunch2db +from archetypal.reportdata import ReportData + + +class Meter: + """Meter class. + + Holds values for a specific Meter. + """ + + def __init__(self, idf, meter: (dict or EpBunch)): + """Initialize a Meter object.""" + self._idf = idf + if isinstance(meter, dict): + self._key = meter.pop("key").upper() + self._epobject = self._idf.anidfobject(key=self._key, **meter) + elif isinstance(meter, EpBunch): + self._key = meter.key + self._epobject = meter + else: + raise TypeError() + + def __repr__(self): + """Return a representation of self.""" + return self._epobject.__str__() + + def values( + self, + units=None, + reporting_frequency="Hourly", + normalize=False, + sort_values=False, + ascending=False, + agg_func="sum", + ): + """Return the Meter as a time-series (:class:`EnergySeries`). + + Data is retrieved from the sql file. It is possible to convert the + time-series to another unit, e.g.: "J" to "kWh". + + Args: + units (str): Convert original values to another unit. The original unit + is detected automatically and a dimensionality check is performed. + reporting_frequency (str): Timestep, Hourly, Daily, Monthly, + RunPeriod, Environment, Annual or Detailed. Default "Hourly". + normalize (bool): Normalize between 0 and 1. + sort_values (bool): If True, values are sorted (default ascending=True) + ascending (bool): If True and `sort_values` is True, values are sorted in + ascending order. + agg_func: #Todo: Document + + Returns: + EnergySeries: The time-series object. + """ + self._epobject.Reporting_Frequency = reporting_frequency.lower() + 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=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=key_name, + normalize=normalize, + sort_values=sort_values, + ascending=ascending, + agg_func=agg_func, + ) + + +class MeterGroup: + """A class for sub meter groups (Output:Meter vs Output:Meter:Cumulative).""" + + def __init__(self, idf, meters_dict: dict): + """Initialize MeterGroup.""" + self._idf = idf + self._properties = {} + + for i, meter in meters_dict.items(): + meter_name = meter["Key_Name"].replace(":", "__").replace(" ", "_") + self._properties[meter_name] = Meter(idf, meter) + setattr(self, meter_name, self._properties[meter_name]) + + def __getitem__(self, meter_name): + """Get item by key.""" + return self._properties[meter_name] + + def __repr__(self): + """Return a representation of all available meters.""" + # getmembers() returns all the + # members of an object + members = [] + for i in inspect.getmembers(self): + + # to remove private and protected + # functions + if not i[0].startswith("_"): + + # To remove other methods that + # do not start with an underscore + if not inspect.ismethod(i[1]): + members.append(i) + + return f"{len(members)} available meters" + + +class Meters: + """Lists available meters in the IDF model. + + Once simulated at least once, the IDF.meters attribute is populated with meters + categories ("Output:Meter" or "Output:Meter:Cumulative") and each category is + populated with all the available meters. + + Example: + For example, to retrieve the WaterSystems:MainsWater meter, simply call + + .. code-block:: + + >>> from archetypal import IDF + >>> idf = IDF() # load an actual idf file here + >>> idf.meters.OutputMeter.WaterSystems__MainsWater.values() + + Hint: + Available meters are read from the .mdd file + """ + + OutputMeter = MeterGroup # placeholder for OutputMeters + + def __init__(self, idf): + """Initialize Meter.""" + self._idf = idf + + try: + mdd, *_ = self._idf.simulation_dir.files("*.mdd") + except ValueError: + mdd, *_ = self._idf.simulate().simulation_dir.files("*.mdd") + if not mdd: + raise FileNotFoundError + meters = pd.read_csv( + mdd, skiprows=2, names=["key", "Key_Name", "Reporting_Frequency"] + ) + meters.Reporting_Frequency = meters.Reporting_Frequency.str.replace(r"\;.*", "") + for key, group in meters.groupby("key"): + meters_dict = group.T.to_dict() + setattr( + self, + key.replace(":", "").replace(" ", "_"), + MeterGroup(self._idf, meters_dict), + ) + + def __repr__(self): + """Tabulate all available meters.""" + # getmembers() returns all the + # members of an object + members = [] + for i in inspect.getmembers(self): + + # to remove private and protected + # functions + if not i[0].startswith("_"): + + # To remove other methods that + # do not start with an underscore + if not inspect.ismethod(i[1]): + members.append(i) + return tabulate(members, headers=("Available subgroups", "Preview")) diff --git a/archetypal/idfclass/outputs.py b/archetypal/idfclass/outputs.py new file mode 100644 index 00000000..ab2fd530 --- /dev/null +++ b/archetypal/idfclass/outputs.py @@ -0,0 +1,433 @@ +class Outputs: + """Handles preparation of EnergyPlus outputs. Different instance methods + allow to chain methods together and to add predefined bundles of outputs in + one go. + + Examples: + >>> from archetypal import IDF + >>> idf = IDF(prep_outputs=False) # True be default + >>> idf.outputs.add_output_control().add_umi_ouputs( + >>> ).add_profile_gas_elect_ouputs().apply() + """ + + def __init__(self, idf): + """Initialize an outputs object. + + Args: + idf (IDF): the IDF object for wich this outputs object is created. + """ + self.idf = idf + self._outputs = [] + + def add_custom(self, outputs): + """Add custom-defined outputs as a list of objects. + + Examples: + >>> outputs = IDF().outputs + >>> to_add = dict( + >>> key= "OUTPUT:METER", + >>> Key_Name="Electricity:Facility", + >>> Reporting_Frequency="hourly", + >>> ) + >>> outputs.add_custom([to_add]).apply() + + Args: + outputs (list, bool): Pass a list of ep-objects defined as dictionary. See + examples. If a bool, ignored. + + Returns: + Outputs: self + """ + if isinstance(outputs, list): + self._outputs.extend(outputs) + return self + + def add_basics(self): + """Adds the summary report and the sql file to the idf outputs""" + return ( + self.add_summary_report() + .add_output_control() + .add_sql() + .add_schedules() + .add_meter_variables() + ) + + def add_schedules(self): + """Adds Schedules object""" + outputs = [{"key": "Output:Schedules".upper(), **dict(Key_Field="Hourly")}] + + self._outputs.extend(outputs) + return self + + def add_meter_variables(self, format="IDF"): + """Generate .mdd file at end of simulation. This file (from the + Output:VariableDictionary, regular; and Output:VariableDictionary, + IDF; commands) shows all the report meters along with their “availability” + for the current input file. A user must first run the simulation (at least + semi-successfully) before the available output meters are known. This output + file is available in two flavors: regular (listed as they are in the Input + Output Reference) and IDF (ready to be copied and pasted into your Input File). + + Args: + format (str): Choices are "IDF" and "regul + + Returns: + Outputs: self + """ + outputs = [dict(key="Output:VariableDictionary".upper(), Key_Field=format)] + self._outputs.extend(outputs) + return self + + def add_summary_report(self, summary="AllSummary"): + """Adds the Output:Table:SummaryReports object. + + Args: + summary (str): Choices are AllSummary, AllMonthly, + AllSummaryAndMonthly, AllSummaryAndSizingPeriod, + AllSummaryMonthlyAndSizingPeriod, + AnnualBuildingUtilityPerformanceSummary, + InputVerificationandResultsSummary, + SourceEnergyEndUseComponentsSummary, ClimaticDataSummary, + EnvelopeSummary, SurfaceShadowingSummary, ShadingSummary, + LightingSummary, EquipmentSummary, HVACSizingSummary, + ComponentSizingSummary, CoilSizingDetails, OutdoorAirSummary, + SystemSummary, AdaptiveComfortSummary, SensibleHeatGainSummary, + Standard62.1Summary, EnergyMeters, InitializationSummary, + LEEDSummary, TariffReport, EconomicResultSummary, + ComponentCostEconomicsSummary, LifeCycleCostReport, + HeatEmissionsSummary, + Returns: + Outputs: self + """ + outputs = [ + { + "key": "Output:Table:SummaryReports".upper(), + **dict(Report_1_Name=summary), + } + ] + + self._outputs.extend(outputs) + return self + + def add_sql(self, sql_output_style="SimpleAndTabular"): + """Adds the `Output:SQLite` object. This object will produce an sql file + that contains the simulation results in a database format. See + `eplusout.sql + `_ for more details. + + Args: + sql_output_style (str): The *Simple* option will include all of the + predefined database tables as well as time series related data. + Using the *SimpleAndTabular* choice adds database tables related + to the tabular reports that are already output by EnergyPlus in + other formats. + Returns: + Outputs: self + """ + output = {"key": "Output:SQLite".upper(), **dict(Option_Type=sql_output_style)} + + self._outputs.extend([output]) + return self + + def add_output_control(self, output_control_table_style="CommaAndHTML"): + """Sets the `OutputControl:Table:Style` object. + + Args: + output_control_table_style (str): Choices are: Comma, Tab, Fixed, + HTML, XML, CommaAndHTML, TabAndHTML, XMLAndHTML, All + Returns: + Outputs: self + """ + outputs = [ + { + "key": "OutputControl:Table:Style".upper(), + **dict(Column_Separator=output_control_table_style), + } + ] + + self._outputs.extend(outputs) + return self + + def add_umi_template_outputs(self): + """Adds the necessary outputs in order to create an UMI template.""" + # list the outputs here + outputs = [ + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Air System Total Heating Energy", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Air System Total Cooling Energy", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Zone Ideal Loads Zone Total Cooling Energy", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Zone Ideal Loads Zone Total Heating Energy", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Zone Thermostat Heating Setpoint Temperature", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Zone Thermostat Cooling Setpoint Temperature", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Heat Exchanger Total Heating Rate", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Heat Exchanger Sensible Effectiveness", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Heat Exchanger Latent Effectiveness", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Water Heater Heating Energy", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Air System Outdoor Air Minimum Flow Fraction", + Reporting_Frequency="hourly", + ), + }, + { + "key": "OUTPUT:METER", + **dict( + Key_Name="HeatRejection:EnergyTransfer", + Reporting_Frequency="hourly", + ), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Heating:EnergyTransfer", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Cooling:EnergyTransfer", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict( + Key_Name="Heating:DistrictHeating", Reporting_Frequency="hourly" + ), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Heating:Electricity", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Heating:Gas", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict( + Key_Name="Cooling:DistrictCooling", Reporting_Frequency="hourly" + ), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Cooling:Electricity", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Cooling:Electricity", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Cooling:Gas", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict( + Key_Name="WaterSystems:EnergyTransfer", Reporting_Frequency="hourly" + ), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Fans:Electricity", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Pumps:Electricity", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict( + Key_Name="Refrigeration:Electricity", Reporting_Frequency="hourly" + ), + }, + { + "key": "OUTPUT:METER", + **dict( + Key_Name="Refrigeration:EnergyTransfer", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Meter".upper(), + **dict( + Key_Name="HeatingCoils:EnergyTransfer", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Meter".upper(), + **dict( + Key_Name="Baseboard:EnergyTransfer", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Meter".upper(), + **dict( + Key_Name="HeatRejection:Electricity", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Meter".upper(), + **dict( + Key_Name="CoolingCoils:EnergyTransfer", + Reporting_Frequency="hourly", + ), + }, + ] + + self._outputs.extend(outputs) + return self + + def add_dxf(self): + outputs = [ + { + "key": "Output:Surfaces:Drawing".upper(), + **dict(Report_Type="DXF", Report_Specifications_1="ThickPolyline"), + } + ] + self._outputs.extend(outputs) + return self + + def add_umi_ouputs(self): + """Adds the necessary outputs in order to return the same energy profile + as in UMI. + """ + # list the outputs here + outputs = [ + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Air System Total Heating Energy", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Air System Total Cooling Energy", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Zone Ideal Loads Zone Total Cooling Energy", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Zone Ideal Loads Zone Total Heating Energy", + Reporting_Frequency="hourly", + ), + }, + { + "key": "Output:Variable".upper(), + **dict( + Variable_Name="Water Heater Heating Energy", + Reporting_Frequency="hourly", + ), + }, + ] + + self._outputs.extend(outputs) + return self + + def add_profile_gas_elect_ouputs(self): + """Adds the following meters: Electricity:Facility, Gas:Facility, + WaterSystems:Electricity, Heating:Electricity, Cooling:Electricity + """ + # list the outputs here + outputs = [ + { + "key": "OUTPUT:METER", + **dict(Key_Name="Electricity:Facility", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Gas:Facility", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict( + Key_Name="WaterSystems:Electricity", Reporting_Frequency="hourly" + ), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Heating:Electricity", Reporting_Frequency="hourly"), + }, + { + "key": "OUTPUT:METER", + **dict(Key_Name="Cooling:Electricity", Reporting_Frequency="hourly"), + }, + ] + self._outputs.extend(outputs) + return self + + def apply(self): + """Applies the outputs to the idf model. Modifies the model by calling + :meth:`~archetypal.idfclass.idf.IDF.newidfobject`""" + for output in self._outputs: + self.idf.newidfobject(**output) + return self diff --git a/archetypal/idfclass/reports.py b/archetypal/idfclass/reports.py new file mode 100644 index 00000000..dca12895 --- /dev/null +++ b/archetypal/idfclass/reports.py @@ -0,0 +1,189 @@ +"""EnergyPlus reports module.""" + +import os +from sqlite3.dbapi2 import OperationalError + +import pandas as pd + +from archetypal import settings +from archetypal.idfclass.util import hash_model +from archetypal.utils import log + + +def get_report( + eplus_file, output_directory=None, output_report="sql", output_prefix=None, **kwargs +): + """Returns the specified report format (html or sql) + + Args: + eplus_file (str): path of the idf file + output_directory (str, optional): path to the output folder. Will + default to the settings.cache_folder. + output_report: 'htm' or 'sql' + output_prefix (str): Prefix name given to results files. + **kwargs: keyword arguments to pass to hasher. + + Returns: + dict: a dict of DataFrames + """ + if not output_directory: + output_directory = settings.cache_folder + # Hash the idf file with any kwargs used in the function + if output_prefix is None: + output_prefix = hash_model(eplus_file) + if output_report is None: + return None + elif "htm" in output_report.lower(): + # Get the html report + fullpath_filename = output_directory / output_prefix + "tbl.htm" + if fullpath_filename.exists(): + return get_html_report(fullpath_filename) + else: + raise FileNotFoundError( + 'File "{}" does not exist'.format(fullpath_filename) + ) + + elif "sql" == output_report.lower(): + # Get the sql report + fullpath_filename = output_directory / output_prefix + "out.sql" + if fullpath_filename.exists(): + return get_sqlite_report(fullpath_filename) + else: + raise FileNotFoundError( + 'File "{}" does not exist'.format(fullpath_filename) + ) + else: + return None + + +def get_html_report(report_fullpath): + """Parses the html Summary Report for each tables into a dictionary of + DataFrames + + Args: + report_fullpath (str): full path to the report file + + Returns: + dict: dict of {title : table ,...} + """ + from eppy.results import readhtml # the eppy module with functions to read the html + + with open(report_fullpath, "r", encoding="utf-8") as cache_file: + filehandle = cache_file.read() # get a file handle to the html file + + cached_tbl = readhtml.titletable( + filehandle + ) # get a file handle to the html file + + log('Retrieved response from cache file "{}"'.format(report_fullpath)) + return summary_reports_to_dataframes(cached_tbl) + + +def summary_reports_to_dataframes(reports_list): + """Converts a list of [(title, table),...] to a dict of {title: table + }. Duplicate keys must have their own unique names in the output + dict. + + Args: + reports_list (list): a list of [(title, table),...] + + Returns: + dict: a dict of {title: table } + """ + results_dict = {} + for table in reports_list: + key = str(table[0]) + if key in results_dict: # Check if key is already exists in + # dictionary and give it a new name + key = key + "_" + df = pd.DataFrame(table[1]) + df = df.rename(columns=df.iloc[0]).drop(df.index[0]) + results_dict[key] = df + return results_dict + + +def get_sqlite_report(report_file, report_tables=None): + """Connect to the EnergyPlus SQL output file and retrieves all tables + + Args: + report_file (str): path of report file + report_tables (list, optional): list of report table names to retreive. + Defaults to settings.available_sqlite_tables + + Returns: + dict: dict of DataFrames + """ + # set list of report tables + if not report_tables: + report_tables = settings.available_sqlite_tables + + # if file exists, parse it with pandas' read_sql_query + if os.path.isfile(report_file): + import sqlite3 + + import numpy as np + + # create database connection with sqlite3 + with sqlite3.connect(report_file) as conn: + # empty dict to hold all DataFrames + all_tables = {} + # Iterate over all tables in the report_tables list + for table in report_tables: + try: + # Try regular str read, could fail if wrong encoding + conn.text_factory = str + df = pd.read_sql_query( + "select * from {};".format(table), + conn, + index_col=report_tables[table]["PrimaryKey"], + parse_dates=report_tables[table]["ParseDates"], + coerce_float=True, + ) + all_tables[table] = df + except OperationalError: + # Wring encoding found, the load bytes and ecode object + # columns only + conn.text_factory = bytes + df = pd.read_sql_query( + "select * from {};".format(table), + conn, + index_col=report_tables[table]["PrimaryKey"], + parse_dates=report_tables[table]["ParseDates"], + coerce_float=True, + ) + str_df = df.select_dtypes([np.object]) + str_df = str_df.stack().str.decode("8859").unstack() + for col in str_df: + df[col] = str_df[col] + all_tables[table] = df + log( + "SQL query parsed {} tables as DataFrames from {}".format( + len(all_tables), report_file + ) + ) + return all_tables + + +def get_ideal_loads_summary(idf): + """Get ideal loads report summary. + + Returns DataFrame with Cooling, Domestic Hot Water, Equipment, Heating and + Lighting hourly time series. + + Returns: + DataFrame: DataFrame of hourly time series. + """ + res = { + "SDL/Cooling": idf.meters.OutputMeter.Cooling__DistrictCooling.values("kWh"), + "SDL/Domestic Hot Water": idf.meters.OutputMeter.WaterSystems__DistrictHeating.values( + "kWh" + ), + "SDL/Equipment": idf.meters.OutputMeter.InteriorEquipment__Electricity.values( + "kWh" + ), + "SDL/Heating": idf.meters.OutputMeter.Heating__DistrictHeating.values("kWh"), + "SDL/Lighting": idf.meters.OutputMeter.InteriorLights__Electricity.values( + "kWh" + ), + } + return pd.DataFrame(res) diff --git a/archetypal/idfclass/util.py b/archetypal/idfclass/util.py new file mode 100644 index 00000000..47d566b2 --- /dev/null +++ b/archetypal/idfclass/util.py @@ -0,0 +1,128 @@ +"""IdfClass utilities.""" + +import hashlib +import os +from collections import OrderedDict +from io import StringIO + +import eppy +from eppy.EPlusInterfaceFunctions import parse_idd + +from archetypal.utils import log + + +def hash_model(idfname, **kwargs): + """Hash a file or IDF model. + + Return it as a string. Will also hash the :func:`eppy.runner.run_functions.run()` + arguments so that correct results are returned when different run arguments are + used. + + Todo: + Hashing should include the external files used an idf file. For example, + if a model uses a csv file as an input and that file changes, the + hashing will currently not pickup that change. This could result in + loading old results without the user knowing. + + Args: + idfname (str or IDF): path of the idf file or the IDF model itself. + kwargs: kwargs to serialize in addition to the file content. + + Returns: + str: The digest value as a string of hexadecimal digits + """ + from .idf import IDF + + if kwargs: + # Before we hash the kwargs, remove the ones that don't have an impact on + # simulation results and so should not change the cache dirname. + no_impact = ["keep_data", "keep_data_err", "return_idf", "return_files"] + for argument in no_impact: + _ = kwargs.pop(argument, None) + + # sorting keys for serialization of dictionary + kwargs = OrderedDict(sorted(kwargs.items())) + + # create hasher + hasher = hashlib.md5() + if isinstance(idfname, StringIO): + idfname.seek(0) + buf = idfname.read().encode("utf-8") + elif isinstance(idfname, IDF): + buf = idfname.idfstr().encode("utf-8") + if idfname.name: + hasher.update(idfname.name.encode("utf-8")) + # hash idfname.basename in case file content is identical with another + # file with a different name + else: + with open(idfname, "rb") as afile: + buf = afile.read() + hasher.update(buf) + + # Hashing the kwargs as well + for k, v in kwargs.items(): + if isinstance(v, (str, bool)): + hasher.update(v.__str__().encode("utf-8")) + elif isinstance(v, list): + # include files are Paths + for item in v: + with open(item, "rb") as f: + buf = f.read() + hasher.update(buf) + return hasher.hexdigest() + + +def get_idf_version(file, doted=True): + """Get idf version quickly by reading first few lines of idf file containing + the 'VERSION' identifier + + Args: + file (str or StringIO): Absolute or relative Path to the idf file + doted (bool, optional): Wheter or not to return the version number + + Returns: + str: the version id + """ + if isinstance(file, StringIO): + file.seek(0) + txt = file.read() + else: + with open(os.path.abspath(file), "r", encoding="latin-1") as fhandle: + txt = fhandle.read() + try: + ntxt = parse_idd.nocomment(txt, "!") + blocks = ntxt.split(";") + blocks = [block.strip() for block in blocks] + bblocks = [block.split(",") for block in blocks] + bblocks1 = [[item.strip() for item in block] for block in bblocks] + ver_blocks = [block for block in bblocks1 if block[0].upper() == "VERSION"] + ver_block = ver_blocks[0] + if doted: + versionid = ver_block[1] + else: + versionid = ver_block[1].replace(".", "-") + "-0" + except Exception as e: + log('Version id for file "{}" cannot be found'.format(file)) + log("{}".format(e)) + raise + else: + return versionid + + +def getoldiddfile(versionid): + """find the IDD file of the E+ installation E+ version 7 and earlier have + the idd in /EnergyPlus-7-2-0/bin/Energy+.idd + + Args: + versionid: + """ + vlist = versionid.split(".") + if len(vlist) == 1: + vlist = vlist + ["0", "0"] + elif len(vlist) == 2: + vlist = vlist + ["0"] + ver_str = "-".join(vlist) + eplus_exe, _ = eppy.runner.run_functions.install_paths(ver_str) + eplusfolder = os.path.dirname(eplus_exe) + iddfile = "{}/bin/Energy+.idd".format(eplusfolder) + return iddfile diff --git a/archetypal/idfclass/variables.py b/archetypal/idfclass/variables.py new file mode 100644 index 00000000..498ff483 --- /dev/null +++ b/archetypal/idfclass/variables.py @@ -0,0 +1,143 @@ +"""EnergyPlus variables module.""" + +import pandas as pd +from energy_pandas import EnergyDataFrame +from geomeppy.patches import EpBunch + +from archetypal.idfclass.extensions import bunch2db +from archetypal.reportdata import ReportData + + +class Variable: + """Variable class. + + Holds values for a specific Variable. + """ + + def __init__(self, idf, variable: (dict or EpBunch)): + """Initialize a Meter object.""" + self._idf = idf + if isinstance(variable, dict): + self._key = variable.pop("key").upper() + self._epobject = self._idf.anidfobject(key=self._key, **variable) + elif isinstance(variable, EpBunch): + self._key = variable.key + self._epobject = variable + else: + raise TypeError() + + def __repr__(self): + """Return a representation of self.""" + return self._epobject.__str__() + + def values( + self, + units=None, + reporting_frequency="Hourly", + normalize=False, + sort_values=False, + ): + """Return the Variable as a time-series (:class:`EnergySeries`). + + Can return an :class:`EnergyDataFrame` with multiple columns. + + Specify the reporting_frequency such as "Hourly" or "Monthly". + It is possible to convert the time-series to another unit, e.g.: "J" to "kWh". + + Data is retrieved from the sql file. + + Args: + units (str): Convert original values to another unit. The original unit + is detected automatically and a dimensionality check is performed. + reporting_frequency (str): Timestep, Hourly, Daily, Monthly, + RunPeriod, Environment, Annual or Detailed. Default "Hourly". + normalize (bool): Normalize between 0 and 1. + sort_values (bool): If True, values are sorted (default ascending=True). + + Returns: + EnergyDataFrame: The time-series object. + """ + self._epobject.Reporting_Frequency = reporting_frequency.lower() + if self._epobject not in self._idf.idfobjects[self._epobject.key]: + self._idf.addidfobject(self._epobject) + self._idf.simulate() + report = ReportData.from_sqlite( + sqlite_file=self._idf.sql_file, + table_name=self._epobject.Variable_Name, + environment_type=1 if self._idf.design_day else 3, + reporting_frequency=bunch2db[reporting_frequency], + ) + return EnergyDataFrame.from_reportdata( + report, + name=self._epobject.Variable_Name, + normalize=normalize, + sort_values=sort_values, + to_units=units, + ) + + +class VariableGroup: + """A class for sub variable groups (Output:Variable).""" + + def __init__(self, idf, variables_dict: dict): + """Initialize VariableGroup.""" + self._idf = idf + self._properties = {} + + for i, variable in variables_dict.items(): + variable_name = ( + variable["Variable_Name"].replace(":", "__").replace(" ", "_") + ) + self._properties[variable_name] = Variable(idf, variable) + setattr(self, variable_name, self._properties[variable_name]) + + def __getitem__(self, variable_name): + """Get item by key.""" + return self._properties[variable_name] + + +class Variables: + """Lists available variables in the IDF model. + + Once simulated at least once, he IDF.variables attribute is populated with + variable categories and each category is populated with all the available + variables. + + Example: + For example, to retrieve the "Zone Operative Temperature" variable, simply call + + .. code-block:: + + >>> from archetypal import IDF + >>> idf = IDF() # load an actual idf file here + >>> idf.variables.OutputVariable.Zone_Operative_Temperature.values() + + Hint: + Available meters are read from the .mdd file + """ + + OutputVariable = VariableGroup # Placeholder for variables + + def __init__(self, idf): + """Initialize MeterGroup.""" + self._idf = idf + + rdd, *_ = self._idf.simulation_dir.files("*.rdd") + + if not rdd: + raise FileNotFoundError + variables = pd.read_csv( + rdd, + skiprows=2, + names=["key", "Key_Value", "Variable_Name", "Reporting_Frequency"], + ) + variables.Reporting_Frequency = variables.Reporting_Frequency.str.replace( + r"\;.*", "" + ) + for key, group in variables.groupby("key"): + variable_dict = group.T.to_dict() + setattr( + self, + key.replace(":", "").replace(" ", "_"), + VariableGroup(self._idf, variable_dict), + ) diff --git a/archetypal/plot.py b/archetypal/plot.py index 08b30d97..accdebb0 100644 --- a/archetypal/plot.py +++ b/archetypal/plot.py @@ -15,15 +15,11 @@ import os import time -import warnings -import matplotlib.pyplot as plt import numpy as np -import pandas as pd -from matplotlib import cm -from matplotlib.colors import LightSource -from archetypal import settings, log +from archetypal import settings +from archetypal.utils import log def save_and_show( @@ -52,7 +48,7 @@ def save_and_show( Returns: (tuple) fig, ax """ - # save the figure if specified + import matplotlib.pyplot as plt if save: start_time = time.time() @@ -112,226 +108,3 @@ def save_and_show( plt.close() return fig, ax - - -def plot_energyprofile( - energyprofile, - kind="polygon", - axis_off=True, - cmap=None, - fig_height=None, - fig_width=6, - show=True, - view_angle=-60, - save=False, - close=False, - dpi=300, - file_format="png", - color=None, - axes=None, - vmin=None, - vmax=None, - filename=None, - **kwargs -): - """ - - Args: - energyprofile: - axis_off: - cmap: - fig_height: - fig_width: - show: - save: - close: - dpi: - file_format: - color: - axes: - vmin: - vmax: - filename: - **kwargs: - - Returns: - - """ - if energyprofile.empty: - warnings.warn( - "The EnergySeries you are attempting to plot is " - "empty. Nothing has been displayed.", - UserWarning, - ) - return axes - - import matplotlib.pyplot as plt - - # noinspection PyUnresolvedReferences - from mpl_toolkits.mplot3d import Axes3D - - if isinstance(energyprofile.index, pd.MultiIndex): - groups = energyprofile.groupby(level=0) - nax = len(groups) - else: - nax = 1 - groups = [("unnamed", energyprofile)] - - if fig_height is None: - fig_height = fig_width * nax - - # Set up plot - fig, axes = plt.subplots( - nax, - 1, - subplot_kw=dict(projection="3d"), - figsize=(fig_width, fig_height), - dpi=dpi, - ) - if not isinstance(axes, np.ndarray): - axes = [axes] - - for ax, (name, profile) in zip(axes, groups): - values = profile.values - - vmin = values.min() if vmin is None else vmin - vmax = values.max() if vmax is None else vmax - - facecolor = kwargs.pop("facecolor", None) - if color is not None: - facecolor = color - - if kind == "polygon": - z = values.reshape(365, 24) - nrows, ncols = z.shape - xs = np.linspace(0, 23, ncols) - # y = np.linspace(0, 364, nrows) - # The ith polygon will appear on the plane y = zs[i] - zs = np.linspace(0, 364, nrows) - verts = [] - for i in zs: - ys = z[int(i), :] - verts.append(polygon_under_graph(xs, ys)) - - plot_poly_collection( - ax, - verts, - zs, - edgecolors=kwargs.get("edgecolors", None), - facecolors=kwargs.get("facecolors", None), - linewidths=kwargs.get("linewidths", None), - cmap=cmap, - ) - elif kind == "surface": - z = values.reshape(365, 24) - nrows, ncols = z.shape - x = np.linspace(1, 24, ncols) - y = np.linspace(1, 365, nrows) - x, y = np.meshgrid(x, y) - plot_surface(ax, x, y, z, cmap=cmap, **kwargs) - else: - raise NameError('plot kind "{}" is not supported'.format(kind)) - - if filename is None: - filename = "unnamed" - - # set the extent of the figure - ax.set_xlim3d(-1, 24) - ax.set_xlabel("X") - ax.set_ylim3d(-1, 365) - ax.set_ylabel("Y") - ax.set_zlim3d(vmin, vmax) - ax.set_zlabel("Z") - - # configure axis appearance - xaxis = ax.xaxis - yaxis = ax.yaxis - zaxis = ax.zaxis - - xaxis.get_major_formatter().set_useOffset(False) - yaxis.get_major_formatter().set_useOffset(False) - zaxis.get_major_formatter().set_useOffset(False) - - # if axis_off, turn off the axis display set the margins to zero and - # point - # the ticks in so there's no space around the plot - if axis_off: - ax.axis("off") - ax.margins(0) - ax.tick_params(which="both", direction="in") - xaxis.set_visible(False) - yaxis.set_visible(False) - zaxis.set_visible(False) - fig.canvas.draw() - if view_angle is not None: - ax.view_init(30, view_angle) - ax.set_proj_type(kwargs.get("proj_type", "persp")) - fig.canvas.draw() - fig, axes = save_and_show( - fig=fig, - ax=axes, - save=save, - show=show, - close=close, - filename=filename, - file_format=file_format, - dpi=dpi, - axis_off=axis_off, - extent=None, - ) - return fig, axes - - -def plot_poly_collection( - ax, verts, zs=None, color=None, cmap=None, vmin=None, vmax=None, **kwargs -): - from matplotlib.collections import PolyCollection - - # if None in zs: - # zs = None - - # color=None overwrites specified facecolor/edgecolor with default color - if color is not None: - kwargs["color"] = color - import matplotlib as mpl - - norm = mpl.colors.Normalize(vmin=vmin, vmax=vmax) - - poly = PolyCollection(verts, **kwargs) - if zs is not None: - poly.set_array(np.asarray(zs)) - poly.set_cmap(cmap) - poly.set_clim(vmin, vmax) - - ax.add_collection3d(poly, zs=zs, zdir="y") - # ax.autoscale_view() - return poly - - -def plot_surface(ax, x, y, z, cmap=None, **kwargs): - if cmap is None: - cmap = cm.gist_earth - - ls = LightSource(270, 45) - # To use a custom hillshading mode, override the built-in shading and pass - # in the rgb colors of the shaded surface calculated from "shade". - rgb = ls.shade(z, cmap=cm.get_cmap(cmap), vert_exag=0.1, blend_mode="soft") - surf = ax.plot_surface( - x, - y, - z, - rstride=1, - cstride=1, - facecolors=rgb, - linewidth=0, - antialiased=False, - shade=False, - ) - return surf - - -def polygon_under_graph(xlist, ylist): - """Construct the vertex list which defines the polygon filling the space - under - the (xlist, ylist) line graph. Assumes the xs are in ascending order.""" - return [(xlist[0], 0.0), *zip(xlist, ylist), (xlist[-1], 0.0)] diff --git a/archetypal/reportdata.py b/archetypal/reportdata.py index 61c982ec..241cae48 100644 --- a/archetypal/reportdata.py +++ b/archetypal/reportdata.py @@ -1,18 +1,18 @@ +"""""" + import functools -import logging as lg import time from sqlite3 import OperationalError import numpy as np -import pandas as pd +from pandas import DataFrame, read_sql_query, to_numeric from path import Path -from archetypal import log, EnergySeries +from archetypal.utils import log -class ReportData(pd.DataFrame): - """This class serves as a subclass of a pandas DataFrame allowing to add - additional functionnality""" +class ReportData(DataFrame): + """Handles Report Variable Data and Report Meter Data""" ARCHETYPE = "Archetype" REPORTDATAINDEX = "ReportDataIndex" @@ -31,8 +31,9 @@ class ReportData(pd.DataFrame): @classmethod def from_sql_dict(cls, sql_dict): + """Create from dictionary.""" report_data = sql_dict["ReportData"] - report_data["ReportDataDictionaryIndex"] = pd.to_numeric( + report_data["ReportDataDictionaryIndex"] = to_numeric( report_data["ReportDataDictionaryIndex"] ) @@ -48,21 +49,32 @@ def from_sql_dict(cls, sql_dict): def from_sqlite( cls, sqlite_file, - table_name="WaterSystems:EnergyTransfer", + table_name, warmup_flag=0, environment_type=3, + reporting_frequency=None, ): - """Reads an EnergyPlus eplusout.sql file and returns a :class:`ReportData` - which is a subclass of :class:`DataFrame`. + """Read an EnergyPlus eplusout.sql file. Args: - environment_type (str): An enumeration of the environment type. (1 = Design + sqlite_file (str): The path of the sqlite3 file. + table_name (str, optional): Filter results by a specific table name. + warmup_flag (int): 1 during warmup, 0 otherwise. Defaults to 0. + environment_type (int): An enumeration of the environment type. (1 = Design Day, 2 = Design Run Period, 3 = Weather Run Period) See the various SizingPeriod objects and the RunPeriod object for details. - sqlite_file (str): + reporting_frequency (str, optional): "HVAC System Timestep", + "Zone Timestep", "Hourly", "Daily", "Monthly", "Run Period". + + Examples: + >>> ReportData.from_sqlite("eplusout.sql", + >>> table_name="Air System Total Heating Energy", + >>> warmup_flag=0, + >>> environment_type=1, + >>> ) Returns: - (ReportData): The ReportData object. + ReportData: a :class:`ReportData` which is a subclass of :class:`DataFrame`. """ if not isinstance(sqlite_file, str): raise TypeError("Please provide a str, not a {}".format(type(sqlite_file))) @@ -124,11 +136,17 @@ def from_sqlite( ) sql_query = sql_query.replace(";", """ AND (%s);""" % conditions) params.update(env_name) + if reporting_frequency: + conditions, reporting_frequency = cls.multiple_conditions( + "reporting_frequency", reporting_frequency, "ReportingFrequency" + ) + sql_query = sql_query.replace(";", """ AND (%s);""" % conditions) + params.update(reporting_frequency) df = cls.execute(conn, sql_query, params) return cls(df) - @classmethod - def multiple_conditions(cls, basename, cond_names, var_name): + @staticmethod + def multiple_conditions(basename, cond_names, var_name): if not isinstance(cond_names, (list, tuple)): cond_names = [cond_names] cond_names = set(cond_names) @@ -145,7 +163,7 @@ def execute(conn, sql_query, params): try: # Try regular str read, could fail if wrong encoding conn.text_factory = str - df = pd.read_sql_query(sql_query, conn, params=params, coerce_float=True) + df = read_sql_query(sql_query, conn, params=params, coerce_float=True) except OperationalError as e: # Wring encoding found, the load bytes and decode object # columns only @@ -156,54 +174,10 @@ def execute(conn, sql_query, params): def _constructor(self): return ReportData - @property - def schedules(self): - return self.sorted_values(key_value="Schedule Value") - @property def df(self): """Returns the DataFrame of the ReportData""" - return pd.DataFrame(self) - - def heating_load( - self, normalize=False, sort=False, ascending=False, concurrent_sort=False - ): - """Returns the aggragated 'Heating:Electricity', 'Heating:Gas' and - 'Heating:DistrictHeating' of each archetype - - Args: - normalize (bool): if True, returns a normalize Series. - Normalization is done with respect to each Archetype - sort (bool): if True, sorts the values. Usefull when a load - duration curve is needed. - ascending (bool): if True, sorts value in ascending order. If a - Load Duration Curve is needed, use ascending=False. - - Returns: - EnergySeries: the Value series of the Heating Load with a Archetype, - TimeIndex as MultiIndex. - """ - hl = self.filter_report_data( - name=("Heating:Electricity", "Heating:Gas", "Heating:DistrictHeating") - ) - freq = list(set(hl.ReportingFrequency)) - units = list(set(hl.Units)) - freq_map = dict(Hourly="H", Daily="D", Monthly="M") - if len(units) > 1: - raise MixedUnitsError() - - hl = hl.groupby(["Archetype", "TimeIndex"]).Value.sum() - log("Returned Heating Load in units of {}".format(str(units)), lg.DEBUG) - return EnergySeries( - hl, - frequency=freq_map[freq[0]], - units=units[0], - normalize=normalize, - sort_values=sort, - ascending=ascending, - to_units="kWh", - concurrent_sort=concurrent_sort, - ) + return DataFrame(self) def filter_report_data( self, @@ -412,36 +386,7 @@ def filter_report_data( else: return filtered_df.__finalize__(self) - def sorted_values(self, key_value=None, name=None, by="TimeIndex", ascending=True): - """Returns sorted values by filtering key_value and name - - Args: - self: The ReporatData DataFrame - key_value (str): key_value column filter - name (str): name column filter - by (str): sorting by this column name - ascending (bool): - - Returns: - ReportData - """ - if key_value and name: - return ( - self.filter_report_data(name=name, keyvalue=key_value) - .sort_values(by=by, ascending=ascending) - .reset_index(drop=True) - .rename_axis("TimeStep") - .set_index(["Archetype"], append=True) - .swaplevel(i=-2, j=-1, axis=0) - ) - else: - return self.sort_values(by=by, inplace=False) - def conjunction(*conditions, logical=np.logical_and): - """Applies a logical function on n conditons""" + """Apply a logical function on n conditions.""" return functools.reduce(logical, conditions) - - -def or_conjunction(*conditions): - return functools.reduce(np.logical_or, conditions) 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 8e6e0faa..9e5b99cd 100644 --- a/archetypal/schedule.py +++ b/archetypal/schedule.py @@ -1,282 +1,246 @@ -################################################################################ -# 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 -import tempfile from datetime import datetime, timedelta from itertools import groupby import numpy as np import pandas as pd -from eppy.bunch_subclass import EpBunch -from path import Path - -import archetypal -from archetypal import log, settings - - -class Schedule(object): - """An object designed to handle any EnergyPlus schedule object""" +from energy_pandas import EnergySeries +from eppy.bunch_subclass import BadEPFieldError +from validator_collection import checkers, validators + +from archetypal.utils import log + + +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=None, - idf=None, - start_day_of_the_week=0, - strict=False, - base_year=2018, - schType=None, - schTypeLimitsName=None, - values=None, - **kwargs + Name, + LowerLimit, + UpperLimit, + NumericType="Continuous", + UnitType="Dimensionless", ): - """ - Args: - Name (str): The schedule name in the idf file - idf (IDF): IDF object - start_day_of_the_week (int): 0-based day of week (Monday=0) - 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" - schTypeLimitsName: - values: - **kwargs: - """ - try: - kwargs["idf"] = idf - Name = kwargs.get("Name", Name) - super(Schedule, self).__init__(**kwargs) - except: - pass - self.strict = strict - self.idf = idf + """Initialize object.""" self.Name = Name - self.startDayOfTheWeek = self.get_sdow(start_day_of_the_week) - self.year = base_year - self.startDate = self.start_date() - - self.count = 0 - self.startHOY = 1 - self.endHOY = 24 - self.unit = "unknown" - self.index_ = None - self.values = values - self.schType = schType - self.schTypeLimitsName = schTypeLimitsName - if self.schTypeLimitsName is None: - self.schTypeLimitsName = self.get_schedule_type_limits_name( - sch_type=self.schType - ) + self.LowerLimit = LowerLimit + self.UpperLimit = UpperLimit + self.NumericType = NumericType + self.UnitType = UnitType - @classmethod - def from_values(cls, Name, values, **kwargs): - """ - Args: - Name: - values: - **kwargs: - """ - return cls(Name=Name, values=values, **kwargs) - - @classmethod - def constant_schedule(cls, hourly_value=1, Name="AlwaysOn", idf=None, **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 idf: - # Add the schedule to the existing idf - idf.add_object( - ep_object="Schedule:Constant".upper(), - **dict( - Name=Name, Schedule_Type_Limits_Name="", Hourly_Value=hourly_value - ), - save=False - ) - return cls(Name=Name, idf=idf, **kwargs) - else: - # Create a new idf object and add the schedule to it. - idftxt = "VERSION, {};".format( - settings.ep_version.replace("-", ".")[0:3] - ) # Not an empty string. has just the - # version number - # we can make a file handle of a string - if not Path(settings.cache_folder).exists(): - Path(settings.cache_folder).mkdir_p() - with tempfile.NamedTemporaryFile( - mode="w", - suffix="_schedule.idf", - prefix="temp_", - dir=settings.cache_folder, - delete=False, - ) as file: - file.write(idftxt) - # initialize the IDF object with the file handle - from eppy.easyopen import easyopen - - idf_scratch = easyopen(file.name) - idf_scratch.__class__ = archetypal.IDF - - idf_scratch.add_object( - ep_object="Schedule:Constant".upper(), - **dict( - Name=Name, Schedule_Type_Limits_Name="", Hourly_Value=hourly_value - ), - save=False - ) + @property + def Name(self): + """Get or set the name of the ScheduleTypeLimits.""" + return self._name - sched = cls(Name=Name, idf=idf_scratch, **kwargs) - return sched + @Name.setter + def Name(self, value): + self._name = validators.string(value) @property - def all_values(self): - """returns the values array""" - if self.values is None: - epbunch = self.idf.get_schedule_epbunch(self.Name) - self.values = self.get_schedule_values(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.mean(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 a pd.Series 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 pd.Series(self.all_values, index=index) + 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" + } """ - schedule_values = self.idf.get_schedule_epbunch(self.Name, sch_type=sch_type) - 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.idf.get_schedule_epbunch(name) - 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.idf.get_schedule_epbunch(name) - 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 + ) - def start_date(self): - """The start date of the schedule. Satisfies `startDayOfTheWeek`""" - import calendar + def __repr__(self): + """Return the string representation of self.""" + return ( + self.Name + + f" {self.LowerLimit} < values < {self.UpperLimit}" + + f"Units: {self.UnitType}" + ) - c = calendar.Calendar(firstweekday=self.startDayOfTheWeek) - start_date = c.monthdatescalendar(self.year, 1)[0][0] - return datetime(start_date.year, start_date.month, start_date.day) + def __keys__(self): + """Get keys of self. Useful for hashing.""" + return ( + self.Name, + self.LowerLimit, + self.UpperLimit, + self.NumericType, + self.UnitType, + ) - def plot(self, slice=None, **kwargs): - """Plot the schedule. Implements the .loc accessor on the series object. + def __eq__(self, other): + """Assert self is equal to other.""" + if not isinstance(other, ScheduleTypeLimits): + return NotImplemented + else: + return self.__keys__() == other.__keys__() - Examples: - >>> s = Schedule( - >>> Name="NECB-A-Thermostat Setpoint-Heating", - >>> idf=idf_object) - >>> ) - >>> s.plot(slice=("2018/01/02", "2018/01/03"), drawstyle="steps-post") - >>> plt.show() - 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 +class _ScheduleParser: + """Class used to parse schedules in IDF files.""" - def get_interval_day_ep_schedule_values(self, epbunch): - """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) @@ -293,35 +257,33 @@ def get_interval_day_ep_schedule_values(self, epbunch): 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 - ): - """schedule:week:compact + epbunch, start_date, index=None, strict=False + ) -> np.ndarray: + """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) @@ -331,15 +293,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() - how = self.field_set(day_type, slicer_) + # This field can optionally contain the prefix “For” + 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 = [] @@ -350,21 +311,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): - """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 @@ -379,22 +344,24 @@ def get_daily_weekly_ep_schedule_values(self, epbunch): "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): - """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 @@ -405,11 +372,11 @@ def get_list_day_ep_schedule_values(self, epbunch): 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) @@ -418,28 +385,26 @@ def get_list_day_ep_schedule_values(self, epbunch): return series.values - def get_constant_ep_schedule_values(self, epbunch): - """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): - """schedule:file + @staticmethod + def get_file_ep_schedule_values(epbunch) -> np.ndarray: + """Get values for schedule:file. Args: epbunch (EpBunch): The schedule epbunch object. @@ -447,15 +412,12 @@ def get_file_ep_schedule_values(self, epbunch): 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"] - import pandas as pd - import os + file = epbunch.theidf.simulation_dir.files(filename)[0] - idfdir = os.path.dirname(self.idf.idfname) - file = os.path.join(idfdir, filename) delimeter = _separator(sep) skip_rows = int(rows) - 1 # We want to keep the column col = [int(column) - 1] # zero-based @@ -465,47 +427,52 @@ def get_file_ep_schedule_values(self, epbunch): return epbunch.iloc[:, 0].values - def get_compact_ep_schedule_values(self, epbunch): - """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 - # Add timedelta to start_date + # Add timedelta to startDate to_day = from_day + timedelta(days=days) + timedelta(hours=-1) # slice the conditions with the range and apply True @@ -518,31 +485,37 @@ def get_compact_ep_schedule_values(self, epbunch): # 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 @@ -553,7 +526,7 @@ def get_compact_ep_schedule_values(self, epbunch): 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) @@ -566,7 +539,7 @@ def get_compact_ep_schedule_values(self, epbunch): 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( @@ -605,14 +578,128 @@ def get_compact_ep_schedule_values(self, epbunch): 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: + 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: - field: + 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", @@ -642,9 +729,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(): @@ -666,16 +751,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(":") @@ -689,7 +772,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() @@ -698,9 +781,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(): @@ -713,9 +794,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: @@ -728,282 +807,130 @@ 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): - """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)) - - start = datetime.strptime( - "{}/{}/{}".format(self.year, start_month, start_day), "%Y/%m/%d" - ) - end = datetime.strptime( - "{}/{}/{}".format(self.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[:] = 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) - - return hourly_values.values - - def get_schedule_values(self, sched_epbunch, start_date=None, index=None): - """Main function that returns the schedule values - - Args: - sched_epbunch (EpBunch): the schedule epbunch object - start_date: - index: - """ - if self.count == 0: - # This is the first time, get the schedule type and the type limits. - if self.schTypeLimitsName is None: - self.schTypeLimitsName = self.get_schedule_type_limits_name() - self.count += 1 - - sch_type = sched_epbunch.key.upper() - - 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 - ) - 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) - else: - log( - "Archetypal does not currently support schedules of type " - '"{}"'.format(sch_type), - lg.WARNING, - ) - hourly_values = [] - - return hourly_values - - def to_year_week_day(self, values=None, idf=None): - """convert a Schedule Class to the 'Schedule:Year', - 'Schedule:Week:Daily' and 'Schedule:Day:Hourly' representation - - Args: - values: - idf: + Args: + start_date: + strict: + schedule_epbunch: + field (str): The EnergyPlus field set value. + slicer_: Returns: - 3-element tuple containing - - - **yearly** (*Schedule*): The yearly schedule object - - **weekly** (*list of Schedule*): The list of weekly schedule - objects - - **daily** (*list of Schedule*):The list of daily schedule objects + (indexer-like): Returns the appropriate indexer for the series. """ - if values: - full_year = values - else: - full_year = np.array(self.all_values) # array of shape (8760,) - values = full_year.reshape(-1, 24) # shape (365, 24) - - # create unique days - unique_days, nds = np.unique(values, axis=0, return_inverse=True) - - ep_days = [] - dict_day = {} - count_day = 0 - for unique_day in unique_days: - name = "d_" + self.Name + "_" + "%03d" % count_day - name, count_day = archetypal.check_unique_name( - "d", count_day, name, archetypal.settings.unique_schedules, suffix=True - ) - dict_day[name] = unique_day - - archetypal.settings.unique_schedules.append(name) - - # Create idf_objects for schedule:day:hourly - ep_day = self.idf.add_object( - ep_object="Schedule:Day:Hourly".upper(), - save=False, - **dict( - Name=name, - Schedule_Type_Limits_Name=self.schTypeLimitsName, - **{"Hour_{}".format(i + 1): unique_day[i] for i in range(24)} - ) - ) - ep_days.append(ep_day) - - # create unique weeks from unique days - unique_weeks, nwsi, nws, count = np.unique( - full_year[: 364 * 24, ...].reshape(-1, 168), - return_index=True, - axis=0, - return_inverse=True, - return_counts=True, - ) - - # Appending unique weeks in dictionary with name and values of weeks as - # keys - # {'name_week': {'dayName':[]}} - dict_week = {} - count_week = 0 - for unique_week in unique_weeks: - week_id = "w_" + self.Name + "_" + "%03d" % count_week - week_id, count_week = archetypal.check_unique_name( - "w", - count_week, - week_id, - archetypal.settings.unique_schedules, - suffix=True, - ) - archetypal.settings.unique_schedules.append(week_id) - - dict_week[week_id] = {} - for i in list(range(0, 7)): - day_of_week = unique_week[..., i * 24 : (i + 1) * 24] - for key in dict_day: - if (day_of_week == dict_day[key]).all(): - dict_week[week_id]["day_{}".format(i)] = key - - # Create idf_objects for schedule:week:daily - # We use the calendar module to set the week days order - import calendar - - # initialize the calendar object - c = calendar.Calendar(firstweekday=self.startDayOfTheWeek) + 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 - # Create ep_weeks list and iterate over dict_week - ep_weeks = [] - for week_id in dict_week: - ep_week = self.idf.add_object( - ep_object="Schedule:Week:Daily".upper(), - save=False, - **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"] + 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 ) - ep_weeks.append(ep_week) - - blocks = {} - from_date = datetime(self.year, 1, 1) - bincount = [sum(1 for _ in group) for key, group in groupby(nws + 1) if key] - week_order = { - i: v - for i, v in enumerate( - np.array([key for key, group in groupby(nws + 1) if key]) - 1 - ) - } - 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 - 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.schTypeLimitsName - ) - 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"], - } + 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}'" ) - ep_year = self.idf.add_object( - ep_object="Schedule:Year".upper(), save=False, **new_dict - ) - return ep_year, ep_weeks, ep_days - - def _date_field_interpretation(self, field): - """Date Field Interpretation + @staticmethod + def _date_field_interpretation(field, start_date): + """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: + start_date: field (str): The EnergyPlus Field Contents Returns: @@ -1016,32 +943,31 @@ def _date_field_interpretation(self, field): # Tru to parse using each defined formats try: date = datetime.strptime(field, format_str) - except: + except Exception: pass else: - date = datetime(self.year, date.month, date.day) + 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 = self._parse_fancy_string(field) - except: + date = _ScheduleParser._parse_fancy_string(field, start_date) + except Exception as e: msg = ( - "the schedule '{sch}' contains a " - "Field that is not understood: '{field}'".format( - sch=self.Name, field=field - ) + f"the schedule contains a " + f"Field that is not understood: '{field}'" ) - raise ValueError(msg) + raise ValueError(msg, e) 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` + @staticmethod + def _parse_fancy_string(field, start_date): + """Parse cases such as `3rd Monday in February` or `Last Weekday In Month`. Args: + start_date: field (str): The EnergyPlus Field Contents Returns: @@ -1077,8 +1003,8 @@ def _parse_fancy_string(self, field): # create list of possible days using Calendar import calendar - c = calendar.Calendar(firstweekday=self.startDayOfTheWeek) - monthcal = c.monthdatescalendar(self.year, month) + c = calendar.Calendar(firstweekday=start_date.weekday()) + monthcal = c.monthdatescalendar(start_date.year, month) # iterate though the month and get the nth weekday date = [ @@ -1089,129 +1015,13 @@ def _parse_fancy_string(self, field): ][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. - """ - - 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 := equivalenet 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( - *[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 None - else: - raise NotImplementedError( - "Archetypal does not yet support The " 'Field_set "{}"'.format(field) - ) - - def __len__(self): - """returns the length of all values of the schedule""" - return len(self.all_values) - - def __add__(self, other): - if isinstance(other, Schedule): - return self.all_values + other.all_values - elif isinstance(other, list): - return self.all_values + other - else: - raise NotImplementedError - - def __sub__(self, other): - if isinstance(other, Schedule): - return self.all_values - other.all_values - elif isinstance(other, list): - return self.all_values - other - else: - raise NotImplementedError - - def __mul__(self, other): - if isinstance(other, Schedule): - return self.all_values * other.all_values - elif isinstance(other, list): - return self.all_values * other - else: - raise NotImplementedError - - 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: - return self.idf.day_of_week_for_start_day - else: - return start_day_of_week - - def special_day(self, field, slicer_): - """try to get the RunPeriodControl:SpecialDays for the corresponding Day - Type + @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_: """ @@ -1219,7 +1029,7 @@ def special_day(self, field, slicer_): sp_slicer_.loc[:] = False special_day_types = ["holiday", "customday1", "customday2"] - dds = self.idf.idfobjects["RunPeriodControl:SpecialDays".upper()] + dds = schedule_epbunch.theidf.idfobjects["RunPeriodControl:SpecialDays".upper()] dd = [ dd for dd in dds @@ -1227,40 +1037,44 @@ def special_day(self, field, slicer_): or dd.Special_Day_Type.lower() in special_day_types ] if len(dd) > 0: - slice = [] 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 + field = dd.Start_Date + special_day_start_date = _ScheduleParser._date_field_interpretation( + field, start_date + ) duration = int(dd.Duration) - from_date = self.startDate + timedelta(days=days_to_speciald) - to_date = from_date + timedelta(days=duration) + timedelta(hours=-1) + to_date = ( + special_day_start_date + + timedelta(days=duration) + + timedelta(hours=-1) + ) - sp_slicer_.loc[from_date:to_date] = True + sp_slicer_.loc[special_day_start_date:to_date] = True return sp_slicer_ - elif not self.strict: + elif not strict: return sp_slicer_ else: msg = ( 'Could not find a "SizingPeriod:DesignDay" object ' - 'needed for schedule "{}" with Day Type "{}"'.format( - self.Name, field.capitalize() - ) + 'needed for schedule with Day Type "{}"'.format(field.capitalize()) ) raise ValueError(msg) - def design_day(self, field, slicer_): - # try to get the SizingPeriod:DesignDay for the corresponding Day Type - """ + @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 = self.idf.idfobjects["SizingPeriod:DesignDay".upper()] + 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: @@ -1268,31 +1082,426 @@ def design_day(self, field, slicer_): 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) + 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 = self.startDate + timedelta(days=days_to_speciald) + 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 self.strict: + elif not strict: return sp_slicer_ else: msg = ( - 'Could not find a "SizingPeriod:DesignDay" object ' - 'needed for schedule "{}" with Day Type "{}"'.format( - self.Name, field.capitalize() - ) + f"Could not find a 'SizingPeriod:DesignDay' object " + f"needed for schedule with Day Type '{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) + 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) + elif value.lower() == "on/off": + value = ScheduleTypeLimits("On/Off", 0, 1, "Discrete", "availability") + else: + value = ScheduleTypeLimits("Fraction", 0, 1) + log( + f"'{value}' is not a known ScheduleTypeLimits for " + f"{self.Name}. Please instantiate the object before " + f"passing as the 'Type' parameter.", + level=lg.WARNING, + ) + 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) + + def plot(self, slice=None, **kwargs): + """Plot the schedule. Implements the .loc accessor on the series object. + + 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: + 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 + + - **yearly** (*Schedule*): The yearly schedule object + - **weekly** (*list of Schedule*): The list of weekly schedule + objects + - **daily** (*list of Schedule*):The list of daily schedule objects + """ + 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) + + # create unique days + unique_days, nds = np.unique(Values, axis=0, return_inverse=True) + + ep_days = [] + dict_day = {} + for count_day, unique_day in enumerate(unique_days): + name = f"d_{self.Name}_{count_day:02d}" + dict_day[name] = unique_day + + # Create idf_objects for schedule:day:hourly + ep_day = DaySchedule( + Name=name, Type=self.Type, Values=[unique_day[i] for i in range(24)] + ) + ep_days.append(ep_day) + + # create unique weeks from unique days + try: + unique_weeks, nwsi, nws, count = np.unique( + full_year[: 364 * 24, ...].reshape(-1, 168), + return_index=True, + axis=0, + return_inverse=True, + return_counts=True, + ) + except ValueError: + raise ValueError( + "Looks like the idf model needs to be rerun with 'annual=True'" + ) + + # We use the calendar module to set the week days order + import calendar + + # initialize the calendar object + c = calendar.Calendar(firstweekday=self.startDayOfTheWeek) + + # Appending unique weeks in dictionary with name and values of weeks as + # keys + # {'name_week': {'dayName':[]}} + dict_week = {} + for count_week, unique_week in enumerate(unique_weeks): + week_id = f"w_{self.Name}_{count_week:02d}" + 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, ep_day in zip(dict_day, ep_days): + if (day_of_week == dict_day[key]).all(): + 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 = {} + for week_id in dict_week: + ep_week = WeekSchedule( + Name=week_id, + Days=[ + dict_week[week_id]["day_{}".format(day_num)] + for day_num in c.iterweekdays() + ], + ) + ep_weeks[week_id] = ep_week + + blocks = {} + from_date = datetime(self.year, 1, 1) + bincount = [sum(1 for _ in group) for key, group in groupby(nws + 1) if key] + week_order = { + i: v + for i, v in enumerate( + np.array([key for key, group in groupby(nws + 1) if key]) - 1 + ) + } + 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] = 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].ToDay = 31 + blocks[i].ToMonth = 12 + + ep_year = YearSchedule(self.Name, Type=self.Type, Parts=list(blocks.values())) + + return ep_year, list(ep_weeks.values()), ep_days + + def __len__(self): + """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): + return self.all_values + other + else: + 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): + return self.all_values - other + else: + 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): + return self.all_values * other + else: + raise NotImplementedError + + def _repr_svg_(self): + """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 combine(self, other, weights=None, quantity=None): """Combine two schedule objects together. @@ -1307,6 +1516,13 @@ def combine(self, other, weights=None, quantity=None): Returns: (Schedule): the combined Schedule object. """ + # Check if other is None. Simply return self + if not other: + return self + + 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" % ( @@ -1328,29 +1544,16 @@ def combine(self, other, weights=None, quantity=None): # the new object's name name = "+".join([self.Name, other.Name]) - attr = dict(value=new_values) - idf = attr.pop("idf", None) - new_obj = self.__class__(name, idf, **attr) + 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": @@ -1364,11 +1567,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": @@ -1377,3 +1575,20 @@ def _how(how): return "max" else: return "max" + + +def get_year_for_first_weekday(weekday=0): + """Get the year that starts on 'weekday', eg. Monday=0.""" + import calendar + + if weekday > 6: + raise ValueError("weekday must be between 0 and 6") + year = 2020 + not_found = True + while not_found: + firstday = calendar.weekday(year, 1, 1) + if firstday == weekday and not calendar.isleap(year): + not_found = False + else: + year = year - 1 + return year diff --git a/archetypal/settings.py b/archetypal/settings.py index c042c74f..a377ca8e 100644 --- a/archetypal/settings.py +++ b/archetypal/settings.py @@ -7,7 +7,6 @@ import logging as lg -import pint from path import Path # locations to save data, logs, images, and cache @@ -22,6 +21,9 @@ # cache server responses use_cache = False +# Debug behavior +debug = False + # write log to file and/or to console log_file = False log_console = False @@ -119,33 +121,22 @@ # unique schedule number as list unique_schedules = [] -# TRNSYS default location -trnsys_default_folder = Path(r"C:\TRNSYS18") - -# 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 -unit_registry = pint.UnitRegistry() +from energy_pandas.units import unit_registry + +unit_registry.define("m3 = 1 * meter ** 3 = m³") +unit_registry.define( + "degree_Celsius = kelvin; offset: 273.15 = °C = C = celsius = degC = degreeC" +) +unit_registry.define( + "degree_Fahrenheit = 5 / 9 * kelvin; offset: 233.15 + 200 / 9 = " + "°F = F = fahrenheit = degF = degreeF" +) +unit_registry.define("ach = dimensionless") # Air Changes per Hour +unit_registry.define("acr = 1 / hour") # Air change rate class ZoneWeight(object): @@ -172,4 +163,4 @@ def set_weigth_attr(self, weight): zone_weight = ZoneWeight(n=0) # Latest version of EnergyPlus compatible with archetypal -ep_version = "9-2-0" \ No newline at end of file +ep_version = "9-2-0" diff --git a/archetypal/simple_glazing.py b/archetypal/simple_glazing.py index df22f3b4..4e3b6846 100644 --- a/archetypal/simple_glazing.py +++ b/archetypal/simple_glazing.py @@ -7,10 +7,11 @@ import logging as lg import math +import warnings import numpy as np -from archetypal import log +from archetypal.utils import log def calc_simple_glazing(shgc, u_factor, visible_transmittance=None): @@ -104,8 +105,12 @@ def calc_simple_glazing(shgc, u_factor, visible_transmittance=None): R_vis_f = r_vis_f(T_vis) # sanity checks - assert T_vis + R_vis_f <= 1.0 - assert T_vis + R_vis_b <= 1.0 + if T_vis + R_vis_f >= 1.0: + warnings.warn("T_vis + R_vis_f > 1", UserWarning) + T_vis -= (T_vis + R_vis_f - 1) * 1.1 + if T_vis + R_vis_b >= 1.0: + warnings.warn("T_vis + R_vis_b > 1", UserWarning) + T_vis -= (T_vis + R_vis_b - 1) * 1.1 # Last Step. Saving results to dict dict["SolarHeatGainCoefficient"] = shgc @@ -224,9 +229,8 @@ def thickness(r_l_w): """The thickness of the equivalent layer in units of meters. Args: - r_l_w (double): The resisance of the bare window under winter - conditions (without the film coefficients) in - units of m\ :sup:`2`\ K`/W. + r_l_w (double): The resistance of the bare window under winter + conditions (without the film coefficients) in units of m\ :sup:`2`\ K`/W. Returns: double: The thickness of the equivalent layer in units of meters @@ -397,10 +401,9 @@ def r_s_f(t_sol, shgc, r_o_s, r_l_w, r_i_s): t_sol (double): The Solat Transmittance at normal incidence. shgc (double): The window's Solar Heat Gain Coefficient r_o_s (double): Resistance of the outside coefficient under summer - conditions. + conditions. r_l_w (double): The resisance of the bare window under winter - conditions (without the film - coefficients) in units of m\ :sup:`2`\ K/W. + conditions (without the film coefficients) in units of m\ :sup:`2`\ K/W. r_i_s (double): Resistance of the inside coefficient under summer conditions. 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/__init__.py b/archetypal/template/__init__.py index 6c46d220..eb513564 100644 --- a/archetypal/template/__init__.py +++ b/archetypal/template/__init__.py @@ -1,21 +1,33 @@ -################################################################################ -# 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 -################################################################################ +"""archetypal umi template library.""" -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 import * -from .building_template import * +__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/building_template.py b/archetypal/template/building_template.py index 4a6e7afe..c9fbfbab 100644 --- a/archetypal/template/building_template.py +++ b/archetypal/template/building_template.py @@ -8,28 +8,22 @@ import collections import logging as lg import time -from collections import defaultdict +from itertools import chain, repeat -import eppy -import matplotlib.collections -import matplotlib.colors import networkx -import tabulate -from eppy.bunch_subclass import EpBunch from path import Path +from sigfig import round from tqdm import tqdm +from validator_collection import validators -from archetypal import log, save_and_show -from archetypal.template import ( - UmiBase, - Zone, - resolve_obco, - WindowSetting, - StructureDefinition, - MassRatio, - is_core, -) -from archetypal.utils import reduce +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 class BuildingTemplate(UmiBase): @@ -38,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, @@ -47,17 +59,24 @@ def __init__( Lifespan=60, PartitionRatio=0.35, DefaultWindowToWallRatio=0.4, - **kwargs + YearFrom=None, + YearTo=None, + Country=None, + ClimateZone=None, + Authors=None, + AuthorEmails=None, + Version="v1.0", + **kwargs, ): """Initialize a :class:`BuildingTemplate` object with the following attributes: Args: - Core (Zone): The Zone object defining the core zone. see + Core (ZoneDefinition): The Zone object defining the core zone. see :class:`Zone` for more details. - Perimeter (Zone): The Zone object defining the perimeter zone. see + Perimeter (ZoneDefinition): The Zone object defining the perimeter zone. see :class:`Zone` for more details. - Structure (StructureDefinition): The StructureDefinition object + Structure (StructureInformation): The StructureInformation object defining the structural properties of the template. Windows (WindowSetting): The WindowSetting object defining the window properties of the object. @@ -69,10 +88,17 @@ def __init__( DefaultWindowToWallRatio (float): The default Window to Wall Ratio (WWR) for this template (same for all orientations). Number between 0 and 1. + YearFrom (int): Start year for range. + YearTo (int): End year for range. + Country (list of str): alpha-3 Country Code. + ClimateZone (list of str): ANSI/ASHRAE/IESNA Standard 90.1 International + Climatic Zone. eg. "5A" + Authors (list of str): Authors of this template + AuthorEmails (list of str): Contact information. + Version (str): Version number. **kwargs: other optional keywords passed to other constructors. """ - super(BuildingTemplate, self).__init__(**kwargs) - self._zone_graph = None + super(BuildingTemplate, self).__init__(Name, **kwargs) self.PartitionRatio = PartitionRatio self.Lifespan = Lifespan self.Core = Core @@ -80,138 +106,243 @@ def __init__( self.Structure = Structure self.Windows = Windows self.DefaultWindowToWallRatio = DefaultWindowToWallRatio + self._year_from = YearFrom # set privately to allow validation + self.YearTo = YearTo + self.Country = Country if Country else [] + self.ClimateZone = ClimateZone if ClimateZone else [] + self.Authors = Authors if Authors else [] + self.AuthorEmails = AuthorEmails if AuthorEmails else [] + self.Version = Version - def __hash__(self): - return hash((self.__class__.__name__, self.Name, self.DataSource)) + @property + def Perimeter(self): + """Get or set the perimeter ZoneDefinition.""" + return self._perimeter - def __eq__(self, other): - if not isinstance(other, BuildingTemplate): - return False - 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, - ] - ) + @Perimeter.setter + def Perimeter(self, value): + assert isinstance( + value, ZoneDefinition + ), f"Expected a ZoneDefinition, not {type(value)}" + self._perimeter = value - def view_building( - self, - fig_height=None, - fig_width=6, - plot_graph=False, - save=False, - show=True, - close=False, - ax=None, - axis_off=False, - cmap="plasma", - dpi=300, - file_format="png", - azim=-60, - elev=30, - filename=None, - opacity=0.5, - proj_type="persp", - **kwargs - ): - """ - Args: - fig_height (float): matplotlib figure height in inches. - fig_width (float): matplotlib figure width in inches. - plot_graph (bool): if True, add the graph plot to this plot. - 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. - filename (str): the name of the file if saving. - opacity (float): 0.0 transparent through 1.0 opaque - proj_type (str): Type of projection, accepts 'persp' and 'ortho'. - **kwargs: - """ - from geomeppy.view_geometry import _get_collections, _get_limits - from mpl_toolkits.mplot3d import Axes3D - import matplotlib.pyplot as plt + @property + def Core(self): + """Get or set the core ZoneDefinition.""" + return self._core - if fig_height is None: - fig_height = fig_width + @Core.setter + def Core(self, value): + assert isinstance( + value, ZoneDefinition + ), f"Expected a ZoneDefinition, not {type(value)}" + self._core = value - if ax: - fig = plt.gcf() - else: - fig = plt.figure(figsize=(fig_width, fig_height), dpi=dpi) - ax = Axes3D(fig) - - collections = _get_collections(self.idf, opacity=opacity) - for c in collections: - ax.add_collection3d(c) - - # Set the initial view - ax.view_init(elev, azim) - ax.set_proj_type(proj_type) - - # calculate and set the axis limits - limits = _get_limits(idf=self.idf) - ax.set_xlim(limits["x"]) - ax.set_ylim(limits["y"]) - ax.set_zlim(limits["z"]) - - if plot_graph: - annotate = kwargs.get("annotate", False) - self.zone_graph(log_adj_report=False, force=False).plot_graph3d( - ax=ax, annotate=annotate - ) + @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 + ) - 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, + @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): + """Get or set the partition ratio [-].""" + return self._partition_ratio + + @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 + ) + + @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 ) - return fig, ax + + @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) + + @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_json(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: - bt.Windows = WindowSetting.from_json(Name=ref.pop("Name"), **ref) - 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): @@ -223,81 +354,135 @@ 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 = [ - Zone.from_zone_epbunch(zone, sql=bt.sql) - for zone in tqdm(idf.idfobjects["ZONE"], desc="zone_loop") + ZoneDefinition.from_epbunch(ep_zone, allow_duplicates=True, **kwargs) + for ep_zone in tqdm(epbunch_zones, desc=f"Creating UMI objects for {name}") ] - zone: Zone - bt.cores = [ - zone - for zone in zones - if zone.is_core and zone.is_part_of_conditioned_floor_area - ] - bt.perims = [ - zone - for zone in zones - if not zone.is_core and zone.is_part_of_conditioned_floor_area - ] - # do Core and Perim zone reduction - bt.reduce(bt.cores, bt.perims) + # do core and Perim zone reduction + bt = cls.reduced_model(name, zones, **kwargs) - # resolve StructureDefinition and WindowSetting - bt.Structure = StructureDefinition( - Name=bt.Name + "_StructureDefinition", - MassRatios=[MassRatio.generic()], - idf=idf, - ) - bt.Windows = bt.Perimeter.Windows - bt.PartitionRatio = idf.partition_ratio + 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( + bt.Comments = "\n".join( [ "WWR calculated for original model: ", - bt.idf.wwr().to_string(), + idf.wwr().to_string(), "where East=90, South=180, West=270, North=0\n", ] ) + bt.PartitionRatio = idf.partition_ratio + return bt - def reduce(self, cores, perims): - """Reduce the building to its simplest core and perimeter zones. + @classmethod + def reduced_model(cls, name, zones, **kwargs): + """Create reduced BuildingTemplate from list of ZoneDefinitions. Args: - **zone_graph_kwargs: + 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 + cores = list( + chain.from_iterable( + [ + list(repeat(zone.duplicate(), zone.multiplier)) + for zone in zones + if zone.is_core + ] + ) + ) + perimeters = list( + chain.from_iterable( + [ + list(repeat(zone.duplicate(), zone.multiplier)) + for zone in zones + if not zone.is_core + ] + ) + ) + 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(Zone.combine, cores) - if not perims: - raise ValueError( - "Building complexity reduction must have at least one perimeter zone" + Core = reduce( + ZoneDefinition.combine, + tqdm( + cores, + desc=f"Reducing core zones in {name}", + ), ) - else: - self.Perimeter = reduce(Zone.combine, perims) + Core.Name = f"{name}_ZoneDefinition_Core" # set name + + Perimeter = None + if perimeters: + Perimeter = reduce( + ZoneDefinition.combine, + tqdm( + zones, + desc=f"Reducing perimeter zones in {name}", + ), + ) + Perimeter.Name = f"{name}_ZoneDefinition_Perimeter" + + # If all perimeter zones, assign self.Perimeter to core. + if not Core: + Core = Perimeter + Core.Name = f"{name}_ZoneDefinition" # rename as both core/perim - if self.Perimeter.Windows is None: + # resolve StructureInformation and WindowSetting + structure = StructureInformation( + MassRatios=[MassRatio.generic()], + Name=name + "_StructureDefinition", + ) + + # assign generic window if None + if Perimeter.Windows is None: # create generic window - self.Perimeter.Windows = WindowSetting.generic(idf=self.idf) + Perimeter.Windows = WindowSetting.generic(Name="Generic Window") + kwargs.setdefault("DefaultWindowToWallRatio", 0) - if not self.Core: - self.Core = self.Perimeter log( - "Equivalent core zone has an area of {:,.0f} m2".format(self.Core.area), + f"Equivalent core zone has an area of {Core.area:,.0f} m2", level=lg.DEBUG, ) log( - "Equivalent perimeter zone has an area of {:,.0f} m2".format( - self.Perimeter.area - ), + f"Equivalent perimeter zone has an area of {Perimeter.area:,.0f} m2", level=lg.DEBUG, ) log( - 'Completed model complexity reduction for BuildingTemplate "{}" in {:,.2f} seconds'.format( - self.Name, time.time() - start_time - ) + 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): @@ -310,10 +495,10 @@ def _graph_reduce(self, G): :func:`operator.add` method. Args: - G (ZoneGraph): + G (archetypal.zone_graph.ZoneGraph): Returns: - Zone: The reduced zone + ZoneDefinition: The reduced zone """ if len(G) < 1: log("No zones for building graph %s" % G.name) @@ -337,586 +522,136 @@ def _graph_reduce(self, G): ) log( - 'completed zone reduction for zone "{}" in building "{}" in {:,.2f} seconds'.format( - bundle_zone.Name, self.Name, time.time() - start_time - ) + f"completed zone reduction for zone '{bundle_zone.Name}' " + f"in building '{self.Name}' in {time.time() - start_time:,.2f} seconds" ) 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"] = self.PartitionRatio - 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["PartitionRatio"] = round(self.PartitionRatio, 2) + 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 + data_dict["YearTo"] = self.YearTo + data_dict["Country"] = self.Country + data_dict["ClimateZone"] = self.ClimateZone + data_dict["Authors"] = self.Authors + data_dict["AuthorEmails"] = self.AuthorEmails + data_dict["Version"] = self.Version return data_dict - -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, sql, log_adj_report=True, skeleton=False, force=False): - """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 - for zone in tqdm(idf.idfobjects["ZONE"], desc="zone_loop"): - # initialize the adjacency report dictionary. default list. - adj_report = defaultdict(list) - zone_obj = None - if not skeleton: - zone_obj = Zone.from_zone_epbunch(zone, sql=sql) - zonesurfaces = zone.zonesurfaces - zone_obj._zonesurfaces = zonesurfaces - _is_core = zone_obj.is_core - else: - 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 - - if skeleton: - zone_obj = None - _is_core = is_core(zone) - else: - zone_obj = Zone.from_zone_epbunch(adj_zone, sql=sql) - _is_core = zone_obj.is_core - - # 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 + def validate(self): + """Validate object and fill in missing values.""" + return self + + def get_unique(self): + """Replace recursively every objects with the first equivalent object.""" + + def recursive_replace(umibase): + for key, obj in umibase.mapping().items(): + if isinstance( + obj, (UmiBase, MaterialLayer, YearSchedulePart, MassRatio) + ): + recursive_replace(obj) + setattr(umibase, key, obj.get_unique()) + elif isinstance(obj, list): + [ + recursive_replace(obj) + for obj in obj + if isinstance( + obj, (UmiBase, MaterialLayer, YearSchedulePart, MassRatio) ) - 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 + recursive_replace(self) + return self - def __init__(self, incoming_graph_data=None, **attr): - """Initialize a graph with edges, name, or graph attributes. - - Wrapper around the :class:`networkx.Graph` class. + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. 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. + validate (bool): If True, try to validate object before returning the + mapping. """ - 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. + if validate: + self.validate() + + return dict( + Core=self.Core, + Lifespan=self.Lifespan, + PartitionRatio=self.PartitionRatio, + Perimeter=self.Perimeter, + Structure=self.Structure, + Windows=self.Windows, + Category=self.Category, + Comments=self.Comments, + DataSource=self.DataSource, + Name=self.Name, + YearFrom=self.YearFrom, + YearTo=self.YearTo, + Country=self.Country, + ClimateZone=self.ClimateZone, + Authors=self.Authors, + AuthorEmails=self.AuthorEmails, + Version=self.Version, + ) - Todo: - Create an Example + def get_ref(self, ref): + """Get item matching reference id. 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 + ref: """ - from mpl_toolkits.mplot3d import Axes3D - import matplotlib.pyplot as plt - import numpy as np - - def avg(zone: eppy.bunch_subclass.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 - } - - 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 next( + iter( + [ + value + for value in BuildingTemplate.CREATED_OBJECTS + if value.id == ref["$ref"] + ] + ), + 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: - >>> 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` + def __hash__(self): + """Return the hash value of self.""" + return hash( + (self.__class__.__name__, getattr(self, "Name", None), self.DataSource) + ) - Returns: - (tuple): The fig and ax objects - """ - try: - import matplotlib.pyplot as plt - except ImportError: - raise ImportError("Matplotlib required for draw()") - except RuntimeError: - print("Matplotlib unable to open display") - raise - # fill kwargs - kwargs["cmap"] = cmap - 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] - - 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, - **kwargs - ) - 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, **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, + 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, + ] ) - 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 - import numpy as np - - base = plt.cm.get_cmap(base_cmap) - color_list = base(np.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 ce74ca52..208c4747 100644 --- a/archetypal/template/conditioning.py +++ b/archetypal/template/conditioning.py @@ -1,70 +1,199 @@ -################################################################################ -# 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 import math +import sqlite3 +from enum import Enum import numpy as np -from archetypal import float_round, ReportData, log, timeit, settings -from archetypal.template import UmiBase, Unique, UmiSchedule, UniqueName +from sigfig import round +from sklearn.preprocessing import Binarizer +from validator_collection import checkers, validators +from archetypal.reportdata import ReportData +from archetypal.template.schedule import UmiSchedule +from archetypal.template.umi_base import UmiBase +from archetypal.utils import float_round, log -class ZoneConditioning(UmiBase, metaclass=Unique): - """HVAC settings for the zone + +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_ + + +class FuelType(Enum): + """Fuel types taken from EnergyPlus 9.2 .idd file for OtherEquipment.""" + + NONE = 0 + Electricity = 1 + NaturalGas = 2 + PropaneGas = 3 + FuelOil1 = 4 + FuelOil2 = 5 + Diesel = 6 + Gasoline = 7 + Coal = 8 + OtherFuel1 = 9 + OtherFuel2 = 10 + Steam = 11 + DistrictHeating = 12 + DistrictCooling = 13 + + +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): + """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. + """ + + NoLimit = 0 + LimitFlowRate = 1 + LimitCapacity = 2 + LimitFlowRateAndCapacity = 3 + + +class ZoneConditioning(UmiBase): + """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, - CoolingCoeffOfPerf=1, - CoolingLimitType="NoLimit", - CoolingSetpoint=26, - CoolingSchedule=None, - EconomizerType="NoEconomizer", + 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, # HeatRecoveryEfficiencyLatent=0.65, HeatRecoveryEfficiencySensible=0.7, - HeatRecoveryType="None", - HeatingCoeffOfPerf=1, - HeatingLimitType="NoLimit", - HeatingSetpoint=20, - HeatingSchedule=None, - IsCoolingOn=True, - IsHeatingOn=True, - IsMechVentOn=True, - MaxCoolFlow=100, - MaxCoolingCapacity=100, - MaxHeatFlow=100, - MaxHeatingCapacity=100, - MinFreshAirPerArea=0, - MinFreshAirPerPerson=0.00944, - MechVentSchedule=None, + area=1, **kwargs, ): """Initialize a new :class:`ZoneConditioning` object. Args: - CoolingCoeffOfPerf (float): Performance factor of the cooling system. - This value is used to calculate the total cooling energy use by - dividing the cooling load by the COP. The COP of the zone shared with all zones - and refers to the COP of the entire building. - CoolingLimitType (str): The input must be either LimitFlowRate, - LimitCapacity, LimitFlowRateAndCapacity or NoLimit. - CoolingSetpoint (float): The temperature above which the zone heating is - turned on. Here, we take the mean value over the year. + Name (str): Name of the object. Must be Unique. + IsHeatingOn (bool): Whether or not heating is available. + HeatingSetpoint (float): The temperature below which zone heating is + turned on. Here, we take the mean value over the ye + HeatingSchedule (UmiSchedule): The availability schedule for space + heating in this zone. If the value is 0, heating is not + available, and heating is not supplied to the zone. + HeatingLimitType (int): The input must be either LimitFlowRate = 1, + LimitCapacity = 2, LimitFlowRateAndCapacity = 3 or NoLimit = 0. + MaxHeatingCapacity (float): The maximum allowed sensible heating + capacity in Watts if Heating Limit is set to LimitCapacity or + LimitFlowRateAndCapacity + MaxHeatFlow (float): The maximum heating supply air flow rate in + cubic meters per second if heating limit is set to LimitFlowRate + or LimitFlowRateAndCapacity + HeatingCoeffOfPerf (float): Efficiency of heating system. The COP is + of each zone is equal, and refer to the COP of the entire + building. + IsCoolingOn (bool): Whether or not cooling is available. + CoolingSetpoint (float): The temperature above which the zone + heating is turned on. Here, we take the mean value over the + ye CoolingSchedule (UmiSchedule): The availability schedule for space - cooling in this zone. If the value is 0, cooling is not available, - and cooling is not supplied to the zone. - EconomizerType (str): Specifies if there is an outdoor air - economizer. The choices are: NoEconomizer, DifferentialDryBulb, - or DifferentialEnthalpy. For the moment, the EconomizerType is + cooling in this zone. If the value is 0, cooling is not + available, and cooling is not supplied to the zone. + CoolingLimitType (str): The input must be either LimitFlowRate = 1, + LimitCapacity = 2, LimitFlowRateAndCapacity = 3 or NoLimit = 0. + MaxCoolingCapacity (float): The maximum allowed total (sensible plus + latent) cooling capacity in Watts per square meter. + MaxCoolFlow (float): The maximum cooling supply air flow rate in + cubic meters per second if Cooling Limit is set to LimitFlowRate + or LimitFlowRateAndCapacity + CoolingCoeffOfPerf (float): Performance factor of the cooling + system. This value is used to calculate the total cooling energy + use by dividing the cooling load by the COP. The COP of the zone + shared with all zones and refers to the COP of the entire + building. + IsMechVentOn (bool): If True, an outdoor air quantity for use by the + model is calculated. + EconomizerType (int): Specifies if there is an outdoor air + economizer. The choices are: NoEconomizer = 0, DifferentialDryBulb = 1, + or DifferentialEnthalpy = 2. For the moment, the EconomizerType is applied for the entire building (every zone with the same - EconomizerType). Moreover, since UMI does not support all Economizer - Types, some assumptions are made: + EconomizerType). Moreover, since UMI does not support all + Economizer Types, some assumptions are made: - If 'NoEconomizer' in EnergyPlus, EconomizerType='NoEconomizer' - If 'DifferentialEnthalpy' in EnergyPlus,EconomizerType = @@ -81,6 +210,22 @@ def __init__( 'DifferentialDryBulb' - If 'DifferentialDryBulbAndEnthalpy' in EnergyPlus, EconomizerType = 'DifferentialEnthalpy' + MechVentSchedule (UmiSchedule): The availability schedule of the + mechanical ventilation. If the value is 0, the mechanical + ventilation is not available and air flow is not requested. + MinFreshAirPerArea (flaot): The design outdoor air volume flow rate + per square meter of floor area (units are m3/s-m2). This input + is used if Outdoor Air Method is Flow/Area, Sum or Maximum + MinFreshAirPerPerson (float): The design outdoor air volume flow + rate per person for this zone in cubic meters per second per + person. The default is 0.00944 (20 cfm per person). + HeatRecoveryType (int): Select from None = 0, Sensible = 1, or + Enthalpy = 2. None means that there is no heat recovery. Sensible + means that there is sensible heat recovery whenever the zone + exhaust air temperature is more favorable than the outdoor air + temperature. Enthalpy means that there is latent and sensible + heat recovery whenever the zone exhaust air enthalpy is more + favorable than the outdoor air enthalpy. The default is None HeatRecoveryEfficiencyLatent (float): The latent heat recovery effectiveness, where effectiveness is defined as the change in supply humidity ratio divided by the difference in entering @@ -100,71 +245,32 @@ def __init__( and relief air temperatures. The default is 0.70. - If the HeatExchanger is an AirToAir FlatPlate, - HeatRecoveryEfficiencySensible = (Supply Air Outlet T°C - - Supply Air Inlet T°C)/(Secondary Air Inlet T°C - Supply Air - Inlet T°C) + HeatRecoveryEfficiencySensible = (Supply Air Outlet T°C - + Supply Air Inlet T°C)/(Secondary Air Inlet T°C - Supply Air + Inlet T°C) - If the HeatExchanger is an AirToAir SensibleAndLatent, we suppose that HeatRecoveryEfficiencySensible = Sensible Effectiveness at 100% Heating Air Flow - If the HeatExchanger is a Desiccant BalancedFlow, we use the default value for the efficiency (=0.70) - HeatRecoveryType (str): Select from *None*, *Sensible*, or - *Enthalpy*. None means that there is no heat recovery. Sensible - means that there is sensible heat recovery whenever the zone - exhaust air temperature is more favorable than the outdoor air - temperature. Enthalpy means that there is latent and sensible - heat recovery whenever the zone exhaust air enthalpy is more - favorable than the outdoor air enthalpy. The default is None - HeatingCoeffOfPerf (float): Efficiency of heating system. The COP is - of each zone is equal, and refer to the COP of the entire - building. - HeatingLimitType (str): The input must be either LimitFlowRate, - LimitCapacity, LimitFlowRateAndCapacity or NoLimit. - HeatingSetpoint (float): The temperature below which zone heating is - turned on. Here, we take the mean value over the year. - HeatingSchedule (UmiSchedule): The availability schedule for space - heating in this zone. If the value is 0, heating is not available, - and heating is not supplied to the zone. - IsCoolingOn (bool): Whether or not cooling is available. - IsHeatingOn (bool): Whether or not heating is available. - IsMechVentOn (bool): If True, an outdoor air quantity for use by the - model is calculated. - MaxCoolFlow (float): The maximum cooling supply air flow rate in - cubic meters per second if Cooling Limit is set to LimitFlowRate - or LimitFlowRateAndCapacity - MaxCoolingCapacity (float): The maximum allowed total (sensible plus - latent) cooling capacity in Watts per square meter. - MaxHeatFlow (float): The maximum heating supply air flow rate in - cubic meters per second if heating limit is set to LimitFlowRate - or LimitFlowRateAndCapacity - MaxHeatingCapacity (float): The maximum allowed sensible heating - capacity in Watts if Heating Limit is set to LimitCapacity or - LimitFlowRateAndCapacity - MinFreshAirPerArea (flaot): The design outdoor air volume flow rate - per square meter of floor area (units are m3/s-m2). This input - is used if Outdoor Air Method is Flow/Area, Sum or Maximum - MinFreshAirPerPerson (float): The design outdoor air volume flow - rate per person for this zone in cubic meters per second per - person. The default is 0.00944 (20 cfm per person). - MechVentSchedule (UmiSchedule): The availability schedule of the - mechanical ventilation. If the value is 0, the mechanical ventilation is - not available and air flow is not requested. **kwargs: Other arguments passed to the base class :class:`archetypal.template.UmiBase` """ - super(ZoneConditioning, self).__init__(**kwargs) + super(ZoneConditioning, self).__init__(Name, **kwargs) self.MechVentSchedule = MechVentSchedule self.HeatingSchedule = HeatingSchedule self.CoolingSchedule = CoolingSchedule self.CoolingCoeffOfPerf = CoolingCoeffOfPerf - self.CoolingLimitType = CoolingLimitType - self.CoolingSetpoint = CoolingSetpoint - self.EconomizerType = EconomizerType + self.CoolingLimitType = IdealSystemLimit(CoolingLimitType) + self.CoolingFuelType = FuelType(CoolingFuelType) + self._cooling_setpoint = CoolingSetpoint # setter without check + self.EconomizerType = EconomizerTypes(EconomizerType) self.HeatRecoveryEfficiencyLatent = HeatRecoveryEfficiencyLatent self.HeatRecoveryEfficiencySensible = HeatRecoveryEfficiencySensible - self.HeatRecoveryType = HeatRecoveryType + self.HeatRecoveryType = HeatRecoveryTypes(HeatRecoveryType) self.HeatingCoeffOfPerf = HeatingCoeffOfPerf - self.HeatingLimitType = HeatingLimitType + self.HeatingLimitType = IdealSystemLimit(HeatingLimitType) + self.HeatingFuelType = FuelType(HeatingFuelType) self.HeatingSetpoint = HeatingSetpoint self.IsCoolingOn = IsCoolingOn self.IsHeatingOn = IsHeatingOn @@ -176,134 +282,479 @@ def __init__( self.MinFreshAirPerArea = MinFreshAirPerArea self.MinFreshAirPerPerson = MinFreshAirPerPerson - self._belongs_to_zone = kwargs.get("zone", None) - - def __add__(self, other): - return self.combine(other) + 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): + """Get or set the cooling setpoint [degC].""" + return self._cooling_setpoint + + @CoolingSetpoint.setter + def CoolingSetpoint(self, 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): + """Get or set the heating setpoint [degC].""" + return self._heating_setpoint + + @HeatingSetpoint.setter + def HeatingSetpoint(self, 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): + """Get or set the maximum cooling flowrate [m³/s/m²].""" + return self._max_cool_flow + + @MaxCoolFlow.setter + def MaxCoolFlow(self, value): + self._max_cool_flow = validators.float(value, minimum=0) + + @property + def MaxHeatFlow(self): + """Get or set the maximum heating flowrate [m³/s/m²].""" + return self._max_heat_flow + + @MaxHeatFlow.setter + def MaxHeatFlow(self, value): + self._max_heat_flow = validators.float(value, minimum=0) + + @property + def MaxHeatingCapacity(self): + """Get or set the maximum heating capacity [W/m²].""" + return float(self._max_heating_capacity) + + @MaxHeatingCapacity.setter + def MaxHeatingCapacity(self, value): + self._max_heating_capacity = validators.float(value, minimum=0) + + @property + def MaxCoolingCapacity(self): + """Get or set the maximum cooling capacity [W/m²].""" + return self._max_cooling_capacity + + @MaxCoolingCapacity.setter + def MaxCoolingCapacity(self, value): + self._max_cooling_capacity = validators.float(value, minimum=0) + + @property + def MinFreshAirPerArea(self): + """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 = validators.float(value, minimum=0) + + @property + def MinFreshAirPerPerson(self): + """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 = validators.float(value, minimum=0) + + @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 + + @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 + + @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 + + @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 + + @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 + ) - def __hash__(self): - return hash((self.__class__.__name__, self.Name, self.DataSource)) + @property + def HeatRecoveryEfficiencySensible(self): + """Get or set the sensible heat recovery effectiveness [-].""" + return self._heat_recovery_efficiency_sensible - def __eq__(self, other): - if not isinstance(other, ZoneConditioning): - return False - 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, - ] - ) + @HeatRecoveryEfficiencySensible.setter + def HeatRecoveryEfficiencySensible(self, value): + self._heat_recovery_efficiency_sensible = validators.float( + value, minimum=0, maximum=1 + ) @classmethod - def from_json(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["CoolingCoeffOfPerf"] = self.CoolingCoeffOfPerf + data_dict["CoolingSchedule"] = self.CoolingSchedule.to_ref() + data_dict["CoolingCoeffOfPerf"] = round(self.CoolingCoeffOfPerf, 3) data_dict["CoolingSetpoint"] = ( - self.CoolingSetpoint if not math.isnan(self.CoolingSetpoint) else 26 + round(self.CoolingSetpoint, 3) + if not math.isnan(self.CoolingSetpoint) + else 26 ) - data_dict["CoolingLimitType"] = self.CoolingLimitType - data_dict["EconomizerType"] = self.EconomizerType - data_dict["HeatingCoeffOfPerf"] = self.HeatingCoeffOfPerf - data_dict["HeatingLimitType"] = self.HeatingLimitType - data_dict["HeatingSchedule"] = self.HeatingSchedule.to_dict() + data_dict["CoolingLimitType"] = self.CoolingLimitType.value + data_dict["CoolingFuelType"] = self.CoolingFuelType.value + data_dict["EconomizerType"] = self.EconomizerType.value + 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_ref() data_dict["HeatingSetpoint"] = ( - self.HeatingSetpoint if not math.isnan(self.HeatingSetpoint) else 20 + round(self.HeatingSetpoint, 3) + if not math.isnan(self.HeatingSetpoint) + else 20 + ) + data_dict["HeatRecoveryEfficiencyLatent"] = round( + self.HeatRecoveryEfficiencyLatent, 3 + ) + data_dict["HeatRecoveryEfficiencySensible"] = round( + self.HeatRecoveryEfficiencySensible, 3 ) - data_dict["HeatRecoveryEfficiencyLatent"] = self.HeatRecoveryEfficiencyLatent - data_dict[ - "HeatRecoveryEfficiencySensible" - ] = self.HeatRecoveryEfficiencySensible - data_dict["HeatRecoveryType"] = self.HeatRecoveryType + data_dict["HeatRecoveryType"] = self.HeatRecoveryType.value data_dict["IsCoolingOn"] = self.IsCoolingOn data_dict["IsHeatingOn"] = self.IsHeatingOn data_dict["IsMechVentOn"] = self.IsMechVentOn - data_dict["MaxCoolFlow"] = self.MaxCoolFlow - data_dict["MaxCoolingCapacity"] = self.MaxCoolingCapacity - data_dict["MaxHeatFlow"] = self.MaxHeatFlow - data_dict["MaxHeatingCapacity"] = self.MaxHeatingCapacity - data_dict["MechVentSchedule"] = self.MechVentSchedule.to_dict() - data_dict["MinFreshAirPerArea"] = self.MinFreshAirPerArea - data_dict["MinFreshAirPerPerson"] = self.MinFreshAirPerPerson + data_dict["MaxCoolFlow"] = round(self.MaxCoolFlow, 3) + 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_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): - """ + 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. """ - # First create placeholder object. - name = zone.Name + "_ZoneConditioning" - z_cond = cls( - Name=name, - zone=zone, - idf=zone.idf, - Category=zone.idf.building_name(use_idfname=True), - ) - - z_cond._set_thermostat_setpoints(zone) - - z_cond._set_zone_cops(zone) - - z_cond._set_heat_recovery(zone) - - z_cond._set_mechanical_ventilation(zone) - - z_cond._set_economizer(zone) - - return z_cond + # 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, 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 @@ -313,148 +764,361 @@ 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()] - self.EconomizerType = "NoEconomizer" # default value + controllers_in_idf = zone_ep.theidf.idfobjects["Controller:OutdoorAir".upper()] + self.EconomizerType = EconomizerTypes.NoEconomizer # default value for object in controllers_in_idf: if object.Economizer_Control_Type == "NoEconomizer": - self.EconomizerType = "NoEconomizer" + self.EconomizerType = EconomizerTypes.NoEconomizer elif object.Economizer_Control_Type == "DifferentialEnthalphy": - self.EconomizerType = "DifferentialEnthalphy" + self.EconomizerType = EconomizerTypes.DifferentialEnthalphy elif object.Economizer_Control_Type == "DifferentialDryBulb": - self.EconomizerType = "DifferentialDryBulb" + self.EconomizerType = EconomizerTypes.DifferentialDryBulb elif object.Economizer_Control_Type == "FixedDryBulb": - self.EconomizerType = "DifferentialDryBulb" + self.EconomizerType = EconomizerTypes.DifferentialDryBulb elif object.Economizer_Control_Type == "FixedEnthalpy": - self.EconomizerType = "DifferentialEnthalphy" + self.EconomizerType = EconomizerTypes.DifferentialEnthalphy elif object.Economizer_Control_Type == "ElectronicEnthalpy": - self.EconomizerType = "DifferentialEnthalphy" + self.EconomizerType = EconomizerTypes.DifferentialEnthalphy elif object.Economizer_Control_Type == "FixedDewPointAndDryBulb": - self.EconomizerType = "DifferentialDryBulb" + self.EconomizerType = EconomizerTypes.DifferentialDryBulb elif object.Economizer_Control_Type == "DifferentialDryBulbAndEnthalpy": - self.EconomizerType = "DifferentialEnthalphy" + self.EconomizerType = EconomizerTypes.DifferentialEnthalphy - def _set_mechanical_ventilation(self, zone): - """Iterate on 'Controller:MechanicalVentilation' objects to find the - 'DesignSpecifactionOutdoorAirName' for the zone. + def _set_mechanical_ventilation(self, zone, zone_ep): + """Set mechanical ventilation settings. - Todo: - - Get mechanical sizing by zone. + 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, + not all models have the `DesignSpecification:OutdoorAir` object which poses a + difficulty when trying to resolve the mechanical ventilation parameters. + + Two general cases exist: 1) models with a `Sizing:Zone` object (and possibly + no `DesignSpecification:OutdoorAir`) and 2) models with Args: + zone_ep: zone (Zone): The zone object. """ - if not zone.idf.idfobjects["Controller:MechanicalVentilation".upper()]: - IsMechVentOn = False - MinFreshAirPerArea = 0 # use defaults - MinFreshAirPerPerson = 0 - MechVentSchedule = UmiSchedule.constant_schedule(idf=zone.idf) + # For models with ZoneSizes + try: + try: + ( + self.IsMechVentOn, + self.MinFreshAirPerArea, + self.MinFreshAirPerPerson, + self.MechVentSchedule, + ) = self.fresh_air_from_zone_sizes(zone) + except (ValueError, StopIteration): + ( + self.IsMechVentOn, + self.MinFreshAirPerArea, + self.MinFreshAirPerPerson, + self.MechVentSchedule, + ) = 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 + self.MinFreshAirPerArea = 0 + self.MechVentSchedule = None + + @staticmethod + 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( + "Zone_Conditioning_Equipment_List_Name" + ) + # EquipmentList can have 18 objects. Filter out the None objects. + return filter( + None, + [ + referenced_object.get_referenced_object(f"Zone_Equipment_{i}_Name") + for i in range(1, 19) + ], + ) + + 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) + """ + equip_list = self.get_equipment_list(zone, zone_ep) + equipment = next( + iter( + [ + eq + for eq in equip_list + if eq.key.lower() == "ZoneHVAC:IdealLoadsAirSystem".lower() + ] + ) + ) + oa_spec = equipment.get_referenced_object( + "Design_Specification_Outdoor_Air_Object_Name" + ) + oa_area = float(oa_spec.Outdoor_Air_Flow_per_Zone_Floor_Area) + oa_person = float(oa_spec.Outdoor_Air_Flow_per_Person) + mechvent_schedule = self._mechanical_schedule_from_outdoorair_object( + oa_spec, zone + ) + return True, oa_area, oa_person, mechvent_schedule + + def fresh_air_from_zone_sizes(self, zone): + """Return the Mechanical Ventilation from the ZoneSizes Table in the sql db. + + Args: + zone (ZoneDefinition): + + Returns: + 4-tuple: (IsMechVentOn, MinFreshAirPerArea, MinFreshAirPerPerson, MechVentSchedule) + """ + import sqlite3 + + import pandas as pd + + # create database connection with sqlite3 + with sqlite3.connect(zone.idf.sql_file) as conn: + sql_query = f""" + select t.ColumnName, t.Value + from TabularDataWithStrings t + where TableName == 'Zone Sensible Heating' and RowName == '{zone.Name.upper()}'""" + oa = ( + pd.read_sql_query(sql_query, con=conn, coerce_float=True) + .set_index("ColumnName") + .squeeze() + ) + oa = pd.to_numeric(oa, errors="coerce") + oa_design = oa["Minimum Outdoor Air Flow Rate"] # m3/s + isoa = oa["Calculated Design Air Flow"] > 0 # True if ach > 0 + oa_area = oa_design / zone.area + if zone.occupants > 0: + oa_person = oa_design / zone.occupants + else: + oa_person = np.NaN + + designobjs = zone._epbunch.getreferingobjs( + iddgroups=["HVAC Design Objects"], fields=["Zone_or_ZoneList_Name"] + ) + obj = next(iter(eq for eq in designobjs if eq.key.lower() == "sizing:zone")) + oa_spec = obj.get_referenced_object( + "Design_Specification_Outdoor_Air_Object_Name" + ) + mechvent_schedule = self._mechanical_schedule_from_outdoorair_object( + oa_spec, zone + ) + return isoa, oa_area, oa_person, mechvent_schedule + + def _mechanical_schedule_from_outdoorair_object(self, oa_spec, zone) -> UmiSchedule: + """Get mechanical ventilation schedule for zone and OutdoorAir:DesignSpec.""" + if oa_spec.Outdoor_Air_Schedule_Name != "": + 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}", + lg.DEBUG, + ) + return umi_schedule else: - design_spe_outdoor_air_name = "" - for object in zone.idf.idfobjects[ - "Controller:MechanicalVentilation".upper() - ]: - if zone.Name in object.fieldvalues: - indice_zone = [ - k for k, s in enumerate(object.fieldvalues) if s == zone.Name - ][0] - design_spe_outdoor_air_name = object.fieldvalues[indice_zone + 1] - - if object.Availability_Schedule_Name != "": - MechVentSchedule = UmiSchedule( - Name=object.Availability_Schedule_Name, idf=zone.idf - ) - else: - MechVentSchedule = UmiSchedule.constant_schedule(idf=zone.idf) - break - # If 'DesignSpecifactionOutdoorAirName', MechVent is ON, and gets - # the minimum fresh air (per person and area) - if design_spe_outdoor_air_name != "": - IsMechVentOn = True - design_spe_outdoor_air = zone.idf.getobject( - "DesignSpecification:OutdoorAir".upper(), - design_spe_outdoor_air_name, + # Schedule is not specified, + # Try to get + try: + values = ( + self.idf.variables.OutputVariable[ + "Air_System_Outdoor_Air_Minimum_Flow_Fraction" + ] + .values() # return values + .mean(axis=1) # for more than one system, return mean + .values # get numpy array ) - MinFreshAirPerPerson = ( - design_spe_outdoor_air.Outdoor_Air_Flow_per_Person + except KeyError: + # if no Air_System_Outdoor_Air_Minimum_Flow_Fraction defined, + # then create an always off schedule as a backup. + log( + f"No Mechanical Ventilation Schedule specified for zone " + f"{zone.Name}" ) - # If MinFreshAirPerPerson NOT a number, MinFreshAirPerPerson=0 - try: - MinFreshAirPerPerson = float(MinFreshAirPerPerson) - except: - MinFreshAirPerPerson = 0 - MinFreshAirPerArea = ( - design_spe_outdoor_air.Outdoor_Air_Flow_per_Zone_Floor_Area + return UmiSchedule.constant_schedule( + value=0, Name="AlwaysOff", allow_duplicates=True ) - # If MinFreshAirPerArea NOT a number, MinFreshAirPerArea=0 - try: - MinFreshAirPerArea = float(MinFreshAirPerArea) - except: - MinFreshAirPerArea = 0 else: - IsMechVentOn = False - MinFreshAirPerPerson = 0 - MinFreshAirPerArea = 0 - MechVentSchedule = UmiSchedule.constant_schedule(idf=zone.idf) + log( + f"Mechanical Ventilation Schedule specified for zone " + f"{zone.Name} as AirSystemOutdoorAirMinimumFlowFraction" + ) + return UmiSchedule.from_values( + Name="AirSystemOutdoorAirMinimumFlowFraction", + Values=values, + idf=zone.idf, + ) - self.IsMechVentOn = IsMechVentOn - self.MinFreshAirPerArea = MinFreshAirPerArea - self.MinFreshAirPerPerson = MinFreshAirPerPerson - self.MechVentSchedule = MechVentSchedule + def _set_zone_cops(self, zone, zone_ep, nolimit=False): + """Set the zone COPs. - def _set_zone_cops(self, zone): - """ Todo: - Make this method zone-independent. + - This method takes 75% of the `from_zone` constructor. Args: + zone_ep: zone (Zone): """ # COPs (heating and cooling) # Heating heating_meters = ( - "Heating:Electricity", - "Heating:Gas", - "Heating:DistrictHeating", + "Heating__Electricity", + "Heating__Gas", + "Heating__DistrictHeating", + "Heating__Oil", ) - heating_cop = self._get_cop( - zone, - energy_in_list=heating_meters, - energy_out_variable_name=( - "Air System Total Heating Energy", - "Zone Ideal Loads Zone Total Heating Energy", - ), + total_input_heating_energy = 0 + for meter in heating_meters: + try: + total_input_heating_energy += ( + zone_ep.theidf.meters.OutputMeter[meter].values("kWh").sum() + ) + except KeyError: + pass # pass if meter does not exist for model + + heating_energy_transfer_meters = ( + "HeatingCoils__EnergyTransfer", + "Baseboard__EnergyTransfer", ) - # Cooling + total_output_heating_energy = 0 + for meter in heating_energy_transfer_meters: + try: + total_output_heating_energy += ( + 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 += ( + zone_ep.theidf.meters.OutputMeter["Heating__EnergyTransfer"] + .values("kWh") + .sum() + ) + except KeyError: + pass + cooling_meters = ( - "Cooling:Electricity", - "Cooling:Gas", - "Cooling:DistrictCooling", + "Cooling__Electricity", + "Cooling__Gas", + "Cooling__DistrictCooling", + "HeatRejection__Electricity", # includes cooling towers + "Refrigeration__Electricity", ) - cooling_cop = self._get_cop( - zone, - energy_in_list=cooling_meters, - energy_out_variable_name=( - "Air System Total Cooling Energy", - "Zone Ideal Loads Zone Total Cooling Energy", - ), + total_input_cooling_energy = 0 + for meter in cooling_meters: + try: + total_input_cooling_energy += ( + zone_ep.theidf.meters.OutputMeter[meter].values("kWh").sum() + ) + except KeyError: + pass # pass if meter does not exist for model + + cooling_energy_transfer_meters = ( + "CoolingCoils__EnergyTransfer", + "Refrigeration__EnergyTransfer", + ) + total_output_cooling_energy = 0 + for meter in cooling_energy_transfer_meters: + try: + total_output_cooling_energy += ( + 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 += ( + zone_ep.theidf.meters.OutputMeter["Cooling__EnergyTransfer"] + .values("kWh") + .sum() + ) + except KeyError: + pass + + ratio_cooling = total_output_cooling_energy / ( + total_output_cooling_energy + total_output_heating_energy + ) + ratio_heating = total_output_heating_energy / ( + total_output_cooling_energy + total_output_heating_energy ) + # estimate fans electricity for cooling and heating + try: + fans_energy = ( + zone_ep.theidf.meters.OutputMeter["Fans__Electricity"] + .values("kWh") + .sum() + ) + fans_cooling = fans_energy * ratio_cooling + fans_heating = fans_energy * ratio_heating + except KeyError: + fans_energy = 0 + fans_cooling = 0 + fans_heating = 0 + + # estimate pumps electricity for cooling and heating + try: + pumps_energy = ( + zone_ep.theidf.meters.OutputMeter["Pumps__Electricity"] + .values("kWh") + .sum() + ) + pumps_cooling = pumps_energy * ratio_cooling + pumps_heating = pumps_energy * ratio_heating + except KeyError: + pumps_energy = 0 + pumps_cooling = 0 + pumps_heating = 0 + + # Add fans and pumps to total_inputs + total_input_cooling_energy += fans_cooling + total_input_heating_energy += fans_heating + total_input_cooling_energy += pumps_cooling + total_input_heating_energy += pumps_heating + + # Calculate COPs + cooling_cop = total_output_cooling_energy / total_input_cooling_energy + heating_cop = total_output_heating_energy / total_input_heating_energy + # Capacity limits (heating and cooling) - zone_size = zone.sql["ZoneSizes"][ - zone.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( - zone, zone_size, load_name="Heating" + zone, zone_size, load_name="Heating", nolimit=nolimit ) # Cooling CoolingLimitType, cooling_cap, cooling_flow = self._get_design_limits( - zone, zone_size, load_name="Cooling" + zone, zone_size, load_name="Cooling", nolimit=nolimit ) self.HeatingLimitType = HeatingLimitType @@ -464,56 +1128,101 @@ def _set_zone_cops(self, zone): self.MaxCoolingCapacity = cooling_cap self.MaxCoolFlow = cooling_flow - self.CoolingCoeffOfPerf = cooling_cop - self.HeatingCoeffOfPerf = heating_cop + self.CoolingCoeffOfPerf = float(cooling_cop) + 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): - """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 - self.HeatingSetpoint, self.HeatingSchedule, self.CoolingSetpoint, self.CoolingSchedule = self._get_setpoint_and_scheds( - zone - ) + with sqlite3.connect(zone_ep.theidf.sql_file) as conn: + sql_query = f""" + SELECT t.ReportVariableDataDictionaryIndex + FROM ReportVariableDataDictionary t + WHERE VariableName == 'Zone Thermostat Heating Setpoint Temperature' and KeyValue == '{zone.Name.upper()}';""" + index = conn.execute(sql_query).fetchone() + if index: + sql_query = f""" + SELECT t.VariableValue + FROM ReportVariableData t + WHERE ReportVariableDataDictionaryIndex == {index[0]};""" + h_array = conn.execute(sql_query).fetchall() + if h_array: + h_array = np.array(h_array).round(2) + scaler = Binarizer(threshold=np.array(h_array).mean() - 0.1) + heating_availability = scaler.fit_transform(h_array).flatten() + heating_sched = UmiSchedule.from_values( + Name=zone.Name + "_Heating_Schedule", + Values=heating_availability, + Type="Fraction", + allow_duplicates=True, + ) + else: + heating_sched = None + + sql_query = f""" + SELECT t.ReportVariableDataDictionaryIndex + FROM ReportVariableDataDictionary t + WHERE VariableName == 'Zone Thermostat Cooling Setpoint Temperature' and KeyValue == '{zone.Name.upper()}';""" + index = conn.execute(sql_query).fetchone() + if index: + sql_query = f""" + SELECT t.VariableValue + FROM ReportVariableData t + WHERE ReportVariableDataDictionaryIndex == {index[0]};""" + c_array = conn.execute(sql_query).fetchall() + if c_array: + c_array = np.array(c_array).round(2) + scaler = Binarizer(threshold=c_array.mean() + 0.1) + cooling_availability = scaler.fit_transform(c_array).flatten() + cooling_sched = UmiSchedule.from_values( + Name=zone.Name + "_Cooling_Schedule", + Values=1 - cooling_availability, # take flipped + Type="Fraction", + allow_duplicates=True, + ) + else: + cooling_sched = None + self.HeatingSetpoint = max(h_array)[0] + self.HeatingSchedule = heating_sched + self.CoolingSetpoint = min(c_array)[0] + self.CoolingSchedule = cooling_sched # If HeatingSetpoint == nan, means there is no heat or cold input, # therefore system is off. - if math.isnan(self.HeatingSetpoint): + if self.HeatingSetpoint == 0: self.IsHeatingOn = False else: self.IsHeatingOn = True - if math.isnan(self.CoolingSetpoint): + if self.CoolingSetpoint == 0: self.IsCoolingOn = False 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 effectiveness. - HeatRecoveryEfficiencySensible (float): The sensible heat recovery effectiveness. - - HeatRecoveryType (str): 'None', 'Sensible' or 'Enthalpy'. + - HeatRecoveryType (int): None = 0, Sensible = 1 or Enthalpy = 2. - comment (str): A comment to append to the class comment attribute. Args: + zone_ep: zone (Zone): The Zone object. """ from itertools import chain @@ -527,21 +1236,20 @@ def _set_heat_recovery(self, zone): # con.get_referenced_object("Zone_Air_Inlet_Node_or_NodeList_Name") # 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 ) ) # Set defaults - HeatRecoveryEfficiencyLatent = 0.7 - HeatRecoveryEfficiencySensible = 0.65 - HeatRecoveryType = "None" + HeatRecoveryEfficiencyLatent = 0.65 + HeatRecoveryEfficiencySensible = 0.7 + HeatRecoveryType = HeatRecoveryTypes.NONE comment = "" # iterate over those objects. If the list is empty, it will simply pass. @@ -556,7 +1264,7 @@ def _set_heat_recovery(self, zone): HeatRecoveryEfficiencySensible = (nsaot - nsait) / (n2ait - nsait) # Hypotheses: HeatRecoveryEfficiencySensible - 0.05 HeatRecoveryEfficiencyLatent = HeatRecoveryEfficiencySensible - 0.05 - HeatRecoveryType = "Enthalpy" + HeatRecoveryType = HeatRecoveryTypes.Enthalpy comment = ( "HeatRecoveryEfficiencySensible was calculated " "using this formula: (Supply Air Outlet T°C -; " @@ -569,10 +1277,11 @@ def _set_heat_recovery(self, zone): ): # Do HeatExchanger:AirToAir:SensibleAndLatent - HeatRecoveryEfficiencyLatent, HeatRecoveryEfficiencySensible = self._get_recoverty_effectiveness( - object, zone - ) - HeatRecoveryType = "Enthalpy" + ( + HeatRecoveryEfficiencyLatent, + HeatRecoveryEfficiencySensible, + ) = self._get_recoverty_effectiveness(object, zone, zone_ep) + HeatRecoveryType = HeatRecoveryTypes.Enthalpy comment = ( "HeatRecoveryEfficiencies were calculated using " @@ -583,9 +1292,9 @@ def _set_heat_recovery(self, zone): elif object.key.upper() == "HeatExchanger:Desiccant:BalancedFlow".upper(): # Do HeatExchanger:Dessicant:BalancedFlow # Use default values - HeatRecoveryEfficiencyLatent = 0.7 - HeatRecoveryEfficiencySensible = 0.65 - HeatRecoveryType = "Enthalpy" + HeatRecoveryEfficiencyLatent = 0.65 + HeatRecoveryEfficiencySensible = 0.7 + HeatRecoveryType = HeatRecoveryTypes.Enthalpy elif ( object.key.upper() == "HeatExchanger:Desiccant:BalancedFlow" @@ -603,13 +1312,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.sql) + def _get_recoverty_effectiveness(object, zone, zone_ep): + rd = ReportData.from_sql_dict(zone_ep.theidf.sql()) effectiveness = ( rd.filter_report_data( name=( @@ -623,16 +1327,16 @@ def _get_recoverty_effectiveness(object, zone): .unstack(level=-1) ) HeatRecoveryEfficiencySensible = effectiveness.loc[ - object.Name.upper(), "Heat Exchanger Sensible " "Effectiveness" + object.Name.upper(), "Heat Exchanger Sensible Effectiveness" ] HeatRecoveryEfficiencyLatent = effectiveness.loc[ object.Name.upper(), "Heat Exchanger Latent Effectiveness" ] return HeatRecoveryEfficiencyLatent, HeatRecoveryEfficiencySensible - @classmethod - def _get_design_limits(cls, zone, zone_size, load_name): - """Gets design limits for heating and cooling systems + @staticmethod + def _get_design_limits(zone, zone_size, load_name, nolimit=False): + """Get design limits for heating and cooling systems. Args: zone (archetypal.template.zone.Zone): zone to gets information from @@ -641,26 +1345,27 @@ def _get_design_limits(cls, zone, zone_size, load_name): load_name (str): 'Heating' or 'Cooling' depending on what system we want to characterize """ + if nolimit: + return IdealSystemLimit.NoLimit, 100, 100 try: - cap = round( + cap = ( zone_size[zone_size["LoadType"] == load_name]["UserDesLoad"].values[0] - / zone.area, - 3, + / zone.area ) flow = ( zone_size[zone_size["LoadType"] == load_name]["UserDesFlow"].values[0] / zone.area ) - LimitType = "LimitFlowRateAndCapacity" - except: + LimitType = IdealSystemLimit.LimitFlowRateAndCapacity + except Exception: cap = 100 flow = 100 - LimitType = "NoLimit" + LimitType = IdealSystemLimit.NoLimit return LimitType, cap, flow - @classmethod - def _get_cop(cls, zone, energy_in_list, energy_out_variable_name): - """Calculates COP for heating or cooling systems + @staticmethod + def _get_cop(zone, energy_in_list, energy_out_variable_name): + """Calculate COP for heating or cooling systems. Args: zone (archetypal.template.zone.Zone): zone to gets information from @@ -671,27 +1376,12 @@ def _get_cop(cls, 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.sql) + rd = ReportData.from_sql_dict(zone.idf.sql()) energy_out = rd.filter_report_data(name=tuple(energy_out_variable_name)) energy_in = rd.filter_report_data(name=tuple(energy_in_list)) - # zone_to_hvac = {zone.Zone_Name: [ - # zone.get_referenced_object( - # 'Zone_Conditioning_Equipment_List_Name - # ').get_referenced_object( - # fieldname) for fieldname in zone.get_referenced_object( - # 'Zone_Conditioning_Equipment_List_Name').fieldnames if - # zone.get_referenced_object( - # 'Zone_Conditioning_Equipment_List_Name - # ').get_referenced_object( - # fieldname) is not None - # ] - # for zone in zone.idf.idfobjects[ - # 'ZoneHVAC:EquipmentConnections'.upper()] - # } - outs = energy_out.groupby("KeyValue").Value.sum() ins = energy_in.Value.sum() @@ -699,55 +1389,6 @@ def _get_cop(cls, zone, energy_in_list, energy_out_variable_name): return cop - def _get_setpoint_and_scheds(self, zone): - """Gets temperature set points from sql EnergyPlus output and associated - schedules. - - Args: - zone (archetypal.template.zone.Zone): zone to gets information from - """ - # Load the ReportData and filter *variable_output_name* and group by - # zone name (*KeyValue*). Return annual average. - variable_output_name = "Zone Thermostat Heating Setpoint Temperature" - h_array = ( - ReportData.from_sql_dict(zone.sql) - .filter_report_data(name=variable_output_name, keyvalue=zone.Name.upper()) - .loc[:, ["TimeIndex", "Value"]] - .set_index("TimeIndex") - .Value.values - ) - - heating_sched = UmiSchedule.from_values( - Name=zone.Name + "_Heating_Schedule", - values=(h_array > 0).astype(int), - schTypeLimitsName="Fraction", - idf=zone.idf, - ) - - variable_output_name = "Zone Thermostat Cooling Setpoint Temperature" - c_array = ( - ReportData.from_sql_dict(zone.sql) - .filter_report_data(name=variable_output_name, keyvalue=zone.Name.upper()) - .loc[:, ["TimeIndex", "Value"]] - .set_index("TimeIndex") - .Value.values - ) - cooling_sched = UmiSchedule.from_values( - Name=zone.Name + "_Cooling_Schedule", - values=(c_array > 0).astype(int), - schTypeLimitsName="Fraction", - idf=zone.idf, - ) - if np.all(c_array == 0): - c_mean = np.NaN - else: - c_mean = c_array.mean() - if np.all(h_array == 0): - h_mean = np.NaN - else: - h_mean = h_array.mean() - return h_mean, heating_sched, c_mean, cooling_sched - def combine(self, other, weights=None): """Combine two ZoneConditioning objects together. @@ -757,9 +1398,16 @@ def combine(self, other, weights=None): 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. + Returns: (ZoneConditioning): the combined ZoneConditioning object. """ + # Check if other is None. Simply return self + if not other: + return self + + 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" % ( @@ -775,68 +1423,207 @@ 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 = self._float_mean(other, "CoolingCoeffOfPerf", weights) - b = self._str_mean(other, "CoolingLimitType") - c = self._float_mean(other, "CoolingSetpoint", weights) - d = self._str_mean(other, "EconomizerType") - e = self._float_mean(other, "HeatRecoveryEfficiencyLatent", weights) - f = self._float_mean(other, "HeatRecoveryEfficiencySensible", weights) - g = self._str_mean(other, "HeatRecoveryType") - h = self._float_mean(other, "HeatingCoeffOfPerf", weights) - i = self._str_mean(other, "HeatingLimitType") - j = self._float_mean(other, "HeatingSetpoint", weights) - k = any((self.IsCoolingOn, other.IsCoolingOn)) - l = any((self.IsHeatingOn, other.IsHeatingOn)) - m = any((self.IsMechVentOn, other.IsMechVentOn)) - n = self._float_mean(other, "MaxCoolFlow", weights) - o = self._float_mean(other, "MaxCoolingCapacity", weights) - p = self._float_mean(other, "MaxHeatFlow", weights) - q = self._float_mean(other, "MaxHeatingCapacity", weights) - r = self._float_mean(other, "MinFreshAirPerArea", weights) - s = self._float_mean(other, "MinFreshAirPerPerson", weights) - t = self.HeatingSchedule.combine(other.HeatingSchedule, weights) - u = self.CoolingSchedule.combine(other.CoolingSchedule, weights) - v = self.MechVentSchedule.combine(other.MechVentSchedule, weights) + weights = [self.area, other.area] + new_attr = dict( + 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, - 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, + **meta, **new_attr, allow_duplicates=self.allow_duplicates ) - new_obj._predecessors.extend(self.predecessors + other.predecessors) + new_obj.predecessors.update(self.predecessors + other.predecessors) return new_obj + + def validate(self): + """Validate object and fill in missing values.""" + if self.HeatingSchedule is None: + self.HeatingSchedule = UmiSchedule.constant_schedule() + if self.CoolingSchedule is None: + self.CoolingSchedule = UmiSchedule.constant_schedule() + if self.MechVentSchedule is None: + self.MechVentSchedule = UmiSchedule.constant_schedule() + if not self.IsMechVentOn: + self.IsMechVentOn = False + if not self.MinFreshAirPerPerson: + self.MinFreshAirPerPerson = 0 + if not self.MinFreshAirPerArea: + self.MinFreshAirPerArea = 0 + + 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() + + base = super(ZoneConditioning, self).mapping(validate=validate) + data = dict( + CoolingSchedule=self.CoolingSchedule, + CoolingCoeffOfPerf=self.CoolingCoeffOfPerf, + CoolingSetpoint=self.CoolingSetpoint, + CoolingLimitType=self.CoolingLimitType, + CoolingFuelType=self.CoolingFuelType, + EconomizerType=self.EconomizerType, + HeatingCoeffOfPerf=self.HeatingCoeffOfPerf, + HeatingLimitType=self.HeatingLimitType, + HeatingFuelType=self.HeatingFuelType, + HeatingSchedule=self.HeatingSchedule, + HeatingSetpoint=self.HeatingSetpoint, + HeatRecoveryEfficiencyLatent=self.HeatRecoveryEfficiencyLatent, + HeatRecoveryEfficiencySensible=self.HeatRecoveryEfficiencySensible, + HeatRecoveryType=self.HeatRecoveryType, + IsCoolingOn=self.IsCoolingOn, + IsHeatingOn=self.IsHeatingOn, + IsMechVentOn=self.IsMechVentOn, + MaxCoolFlow=self.MaxCoolFlow, + MaxCoolingCapacity=self.MaxCoolingCapacity, + MaxHeatFlow=self.MaxHeatFlow, + MaxHeatingCapacity=self.MaxHeatingCapacity, + MechVentSchedule=self.MechVentSchedule, + MinFreshAirPerArea=self.MinFreshAirPerArea, + MinFreshAirPerPerson=self.MinFreshAirPerPerson, + ) + data.update(base) + return data + + def to_epbunch(self, idf, zone_name, design_specification_outdoor_air_object): + """Convert self to an EpBunch given an IDF model. + + Args: + idf: + zone_name: + + Returns: + EpBunch: The EpBunch object added to the idf model. + + """ + 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( + [ + 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, + ] + ) + + 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..1f79d505 --- /dev/null +++ b/archetypal/template/constructions/base_construction.py @@ -0,0 +1,333 @@ +"""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 + +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 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. + + 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/constructions/opaque_construction.py b/archetypal/template/constructions/opaque_construction.py new file mode 100644 index 00000000..f5a1b0b8 --- /dev/null +++ b/archetypal/template/constructions/opaque_construction.py @@ -0,0 +1,564 @@ +"""archetypal OpaqueConstruction.""" + +import collections +import uuid + +import numpy as np +from eppy.bunch_subclass import BadEPFieldError +from validator_collection import validators + +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. + + .. 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__ = ("area",) + + def __init__(self, Name, Layers, **kwargs): + """Initialize an OpaqueConstruction. + + Args: + 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__(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. + """ + return super(OpaqueConstruction, self).r_value + + @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] + + 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." + ) + + 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 + + @property + def equivalent_heat_capacity_per_unit_volume(self): + """Get the equivalent per unit wall volume heat capacity [J/(kg⋅K)]. + + Hint: + "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 + characteristic wall quantity independent from the wall thickness, is + equal to ρ·c. This quantity for a composite wall of an overall + thickness L, is usually defined as the equivalent per unit wall + volume heat capacity and it is expressed as + :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." [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( + [ + layer.Material.Density * layer.Material.SpecificHeat * layer.Thickness + for layer in self.Layers + ] + ) + + @property + def specific_heat(self): + """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], + ) + + @property + def heat_capacity_per_unit_wall_area(self): + """Get the 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): + """Get the construction total thickness [m].""" + return sum([layer.Thickness for layer in self.Layers]) + + @property + def mass_per_unit_area(self): + """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): + """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): + """Get the Solar Reflectance Index of the exposed surface. + + Hint: + calculation from K-12 AEDG, derived from ASTM E1980 assuming medium wind + speed. + + """ + 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 * solar_absorptance - 0.603 * thermal_emissivity) / ( + 9.5205 * thermal_emissivity + 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. + + Args: + other (OpaqueConstruction): The other OpaqueConstruction object to + combine with. + method (str): Equivalent wall assembly method. Only 'dominant_wall' + is safe to use. 'constant_ufactor' is still weird in terms of + respecting the thermal response of the walls and may cause + conversion issues with Conduction Transfer Functions (CTFs) in + EnergyPlus. + + Returns: + (OpaqueConstruction): the combined ZoneLoad object. + """ + # Check if other is None. Simply return self + if not other: + return self + + 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" % ( + self.__class__.__name__, + other.__class__.__name__, + ) + raise NotImplementedError(msg) + + # Check if other is not the same as self + if self == other: + return self + + weights = [self.area, other.area] + + meta = self._get_predecessors_meta(other) + # thicknesses & materials for self + 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 ["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) + new_name = ( + "Combined Opaque Construction {{{}}} with 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) + new_obj.area = sum(weights) + return new_obj + + def dominant_wall(self, other, weights): + """Return dominant wall construction between self and other. + + Args: + other: + weights: + """ + oc = [ + x + for _, x in sorted( + zip([2, 1], [self, other]), key=lambda pair: pair[0], reverse=True + ) + ][0] + return oc + + 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 + + Args: + other (OpaqueConstruction): The other Construction. + weights (array_like, optional): An array of weights associated with + the self and other. Each value contributes to the average + according to its associated weight. If `weights=None` , then all + data are assumed to have a weight equal to one. + """ + from scipy.optimize import minimize + + def obj_func( + thicknesses, + materials, + expected_u_value, + expected_specific_heat, + expected_total_thickness, + ): + """Objective function for thickness evaluation.""" + u_value = 1 / sum( + [ + thickness / mat.Conductivity + for thickness, mat in zip(thicknesses, materials) + ] + ) + + # Specific_heat: (J/kg K) + h_calc = [ + mat.SpecificHeat for thickness, mat in zip(thicknesses, materials) + ] + + # (kg/m3) x (m) = (kg/m2) + mass_per_unit_area = [ + mat.Density * thickness + for thickness, mat in zip(thicknesses, materials) + ] + specific_heat = np.average(h_calc, weights=mass_per_unit_area) + return ( + (u_value - expected_u_value) ** 2 + + (specific_heat - expected_specific_heat) ** 2 + + (sum(thicknesses) - expected_total_thickness) ** 2 + ) + + # U_eq is the weighted average of the wall u_values by their respected total + # 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], + weights=[self.total_thickness, other.total_thickness], + ) + + # Get a set of all materials sorted by Material Density (descending order) + materials = list( + sorted( + set( + [layer.Material for layer in self.Layers] + + [layer.Material for layer in other.Layers] + ), + key=lambda x: x.Density, + reverse=True, + ) + ) + + # Setup weights + if not weights: + weights = [1.0, 1.0] + + # If weights is a list of zeros. This weight is used in the + if not np.array(weights).any(): + weights = [1, 1] + + # Calculate the desired equivalent specific heat + equi_spec_heat = np.average( + [self.specific_heat, other.specific_heat], weights=weights + ) + two_wall_thickness = np.average( + [self.total_thickness, other.total_thickness], weights=weights + ) + x0 = np.ones(len(materials)) + bnds = tuple([(0.003, None) for layer in materials]) + res = minimize( + obj_func, + x0, + args=(materials, u_equivalent, equi_spec_heat, two_wall_thickness), + bounds=bnds, + ) + + return np.array(materials), res.x + + @classmethod + def from_dict(cls, data, materials, **kwargs): + """Create an OpaqueConstruction from a dictionary. + + Args: + 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 = [ + MaterialLayer( + Material=materials[layer["Material"]["$ref"]], + Thickness=layer["Thickness"], + ) + for layer in data.pop("Layers") + ] + _id = data.pop("$id") + oc = cls(Layers=layers, id=_id, **data, **kwargs) + + return oc + + @classmethod + def generic_internalmass(cls, **kwargs): + """Create a generic internal mass object. + + Args: + **kwargs: keywords passed to the class constructor. + """ + mat = OpaqueMaterial( + Name="Wood 6inch", + Roughness="MediumSmooth", + Thickness=0.15, + Conductivity=0.12, + Density=540, + SpecificHeat=1210, + ThermalAbsorptance=0.7, + VisibleAbsorptance=0.7, + ) + return OpaqueConstruction( + Name="InternalMass", + Layers=[MaterialLayer(Material=mat, Thickness=0.15)], + Category="InternalMass", + **kwargs, + ) + + @classmethod + def from_epbunch(cls, epbunch, **kwargs): + """Create an OpaqueConstruction object from an epbunch. + + Possible keys are "BuildingSurface:Detailed" or "InternalMass" + + Args: + 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 + + # treat internalmass and regular surfaces differently + if epbunch.key.lower() == "internalmass": + layers = cls._internalmass_layer(epbunch) + return cls(Name=name, Layers=layers, **kwargs) + elif epbunch.key.lower() == "construction": + layers = cls._surface_layers(epbunch) + return cls(Name=name, Layers=layers, **kwargs) + + @classmethod + def _internalmass_layer(cls, epbunch): + """Return layers of an internal mass object. + + Args: + epbunch (EpBunch): The InternalMass epobject. + """ + constr_obj = epbunch.theidf.getobject("CONSTRUCTION", epbunch.Construction_Name) + return cls._surface_layers(constr_obj) + + @classmethod + def _surface_layers(cls, epbunch): + """Retrieve layers for the OpaqueConstruction. + + Args: + epbunch (EpBunch): EP-Construction object + """ + layers = [] + for layer in epbunch.fieldnames[2:]: + # Iterate over the construction's layers + material = epbunch.get_referenced_object(layer) + if material: + o = OpaqueMaterial.from_epbunch(material, allow_duplicates=True) + try: + thickness = material.Thickness + except BadEPFieldError: + thickness = o.Conductivity * material.Thermal_Resistance + layers.append(MaterialLayer(Material=o, Thickness=thickness)) + return layers + + def to_dict(self): + """Return OpaqueConstruction 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"] = [lay.to_dict() for lay 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"] = str(self.DataSource) + data_dict["Name"] = self.Name + + return data_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( + 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, + ) + + @classmethod + 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", + Category="Partition", + **kwargs, + ) + + def __add__(self, other): + """Overload + to implement self.combine. + + Args: + other (OpaqueConstruction): The other OpaqueConstruction. + """ + 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..da2c7712 --- /dev/null +++ b/archetypal/template/constructions/window_construction.py @@ -0,0 +1,776 @@ +"""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 + +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", 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 (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: + float: The shgc of the window construction for the given environmental + conditions. + """ + # 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 * global_radiation + shgc = (Q_dot_sun - -Q_dot_noSun) / global_radiation + 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 06483a26..0884c6ea 100644 --- a/archetypal/template/dhw.py +++ b/archetypal/template/dhw.py @@ -1,213 +1,228 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal DomesticHotWaterSetting.""" import collections -from operator import add from statistics import mean import numpy as np -from archetypal import settings, log, timeit, reduce -from archetypal.template import Unique, UmiBase, UmiSchedule, UniqueName +from eppy import modeleditor +from sigfig import round +from validator_collection import validators +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 DomesticHotWaterSetting(UmiBase, metaclass=Unique): - """Domestic Hot Water settigns + +class DomesticHotWaterSetting(UmiBase): + """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, - **kwargs + 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.area = area + + @property + def FlowRatePerFloorArea(self): + """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._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 - self._belongs_to_zone = kwargs.get("zone", None) + @property + def WaterSupplyTemperature(self): + """Get or set the water supply temperature [degC].""" + return self._water_supply_temperature - def __add__(self, other): - """Overload + to implement self.combine + @WaterSupplyTemperature.setter + def WaterSupplyTemperature(self, value): + self._water_supply_temperature = validators.float(value) - Args: - other (DomesticHotWaterSetting): - """ - return self.combine(other) + @property + def WaterTemperatureInlet(self): + """Get or set the water temperature intel from the water mains [degC].""" + return self._water_temperature_inlet - def __hash__(self): - return hash((self.__class__.__name__, self.Name, self.DataSource)) + @WaterTemperatureInlet.setter + def WaterTemperatureInlet(self, value): + self._water_temperature_inlet = validators.float(value) - def __eq__(self, other): - if not isinstance(other, DomesticHotWaterSetting): - return False - else: - return all( - [ - self.IsOn == other.IsOn, - self.FlowRatePerFloorArea == other.FlowRatePerFloorArea, - self.WaterSupplyTemperature == other.WaterSupplyTemperature, - self.WaterTemperatureInlet == other.WaterTemperatureInlet, - self.WaterSchedule == other.WaterSchedule, - ] - ) + @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) @classmethod - def from_json(cls, *args, **kwargs): - """ + def from_dict(cls, data, schedules, **kwargs): + """Create a DomesticHotWaterSetting 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 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_dict(self): + """Return DomesticHotWaterSetting dictionary representation.""" + self.validate() # Validate object before trying to get json format - def to_json(self): - """Convert class properties to dict""" data_dict = collections.OrderedDict() data_dict["$id"] = str(self.id) - data_dict["FlowRatePerFloorArea"] = self.FlowRatePerFloorArea + data_dict["FlowRatePerFloorArea"] = round(self.FlowRatePerFloorArea, sigfigs=4) data_dict["IsOn"] = self.IsOn - data_dict["WaterSchedule"] = self.WaterSchedule.to_dict() - data_dict["WaterSupplyTemperature"] = self.WaterSupplyTemperature - data_dict["WaterTemperatureInlet"] = self.WaterTemperatureInlet + data_dict["WaterSchedule"] = self.WaterSchedule.to_ref() + data_dict["WaterSupplyTemperature"] = round( + self.WaterSupplyTemperature, sigfigs=4 + ) + data_dict["WaterTemperatureInlet"] = round( + 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): - """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. """ - # First, find the WaterUse:Equipement assigned to this zone - dhw_objs = zone._epbunch.getreferingobjs( + # If Zone is not part of Conditioned Area, it should not have a DHW object. + 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( iddgroups=["Water Systems"], fields=["Zone_Name"] ) - if len(dhw_objs) > 1: - # This zone has more than one WaterUse:Equipment object - z_dhw_list = [] - for obj in dhw_objs: - total_flow_rate = cls._do_flow_rate(dhw_objs, zone.area) - water_schedule = cls._do_water_schedule(dhw_objs, zone) - inlet_temp = cls._do_inlet_temp(dhw_objs, zone) - supply_temp = cls._do_hot_temp(dhw_objs, zone) - - name = zone.Name + "_DHW" - z_dhw = cls( - Name=name, - zone=zone, - FlowRatePerFloorArea=total_flow_rate, - IsOn=total_flow_rate > 0, - WaterSchedule=water_schedule, - WaterSupplyTemperature=supply_temp, - WaterTemperatureInlet=inlet_temp, - idf=zone.idf, - Category=zone.idf.building_name(use_idfname=True), - ) - z_dhw_list.append(z_dhw) - - return reduce(add, z_dhw_list) + 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() + ] + ) - elif len(dhw_objs) > 0: - # Return dhw object for zone - total_flow_rate = cls._do_flow_rate(dhw_objs, zone.area) - water_schedule = cls._do_water_schedule(dhw_objs, zone) - inlet_temp = cls._do_inlet_temp(dhw_objs, zone) - supply_temp = cls._do_hot_temp(dhw_objs, zone) + if dhw_objs: + # This zone has more than one WaterUse:Equipment object + 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.building_name(use_idfname=True), + Category=zone_epbunch.theidf.name, + area=zone_area, + **kwargs, ) + return z_dhw else: - # Assume water systems for whole building - dhw_objs = zone.idf.idfobjects["WaterUse:Equipment".upper()] - if dhw_objs: - total_flow_rate = cls._do_flow_rate(dhw_objs, zone.idf.area_conditioned) - water_schedule = cls._do_water_schedule(dhw_objs, zone) - inlet_temp = cls._do_inlet_temp(dhw_objs, zone) - supply_temp = cls._do_hot_temp(dhw_objs, zone) - - name = zone.Name + "_DHW" - z_dhw = cls( - Name=name, - zone=zone, - FlowRatePerFloorArea=total_flow_rate, - IsOn=total_flow_rate > 0, - WaterSchedule=water_schedule, - WaterSupplyTemperature=supply_temp, - WaterTemperatureInlet=inlet_temp, - idf=zone.idf, - Category=zone.idf.building_name(use_idfname=True), - ) - else: - # defaults with 0 flow rate. - total_flow_rate = 0 - water_schedule = UmiSchedule.constant_schedule(idf=zone._epbunch.theidf) - supply_temp = 60 - inlet_temp = 10 - - name = zone.Name + "_DHW" - z_dhw = cls( - Name=name, - zone=zone, - FlowRatePerFloorArea=total_flow_rate, - IsOn=total_flow_rate > 0, - WaterSchedule=water_schedule, - WaterSupplyTemperature=supply_temp, - WaterTemperatureInlet=inlet_temp, - idf=zone.idf, - Category=zone.idf.building_name(use_idfname=True), - ) - - return z_dhw + log(f"No 'Water Systems' found in zone '{zone_epbunch.Name}'") + return None @classmethod - @timeit - def _do_hot_temp(cls, dhw_objs, zone): - """ + def _do_hot_temp(cls, dhw_objs): + """Resolve hot water temperature. + Args: dhw_objs: - zone: """ hot_schds = [] for obj in dhw_objs: @@ -219,37 +234,29 @@ def _do_hot_temp(cls, dhw_objs, zone): if obj.Target_Temperature_Schedule_Name != "" else obj.Hot_Water_Supply_Temperature_Schedule_Name ) - - hot_schd = UmiSchedule(Name=schedule_name, idf=zone._epbunch.theidf) + 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, zone): - """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: - zone: - """ + 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=zone._epbunch.theidf, - ) + 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 = zone._epbunch.theidf.idfobjects[ + water_mains_temps = obj.theidf.idfobjects[ "Site:WaterMainsTemperature".upper() ] if water_mains_temps: @@ -258,9 +265,10 @@ def _do_inlet_temp(cls, dhw_objs, zone): 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=zone._epbunch.theidf, + 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": @@ -280,41 +288,44 @@ def _do_inlet_temp(cls, dhw_objs, zone): # the input file, a default constant value of 10 C is # assumed. WaterTemperatureInlet.append(float(10)) - return mean(WaterTemperatureInlet) + return mean(WaterTemperatureInlet) if WaterTemperatureInlet else 10 @classmethod - @timeit - def _do_water_schedule(cls, dhw_objs, zone): - """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: - zone: + dhw_objs (list of EpBunch): List of WaterUse:Equipment objects. + + Returns: + UmiSchedule: The WaterSchedule """ - water_schds = collections.defaultdict(dict) - for obj in dhw_objs: - water_schd_name = UmiSchedule( - Name=obj.Flow_Rate_Fraction_Schedule_Name, idf=zone._epbunch.theidf + water_schds = [ + UmiSchedule.from_epbunch( + obj.theidf.schedules_dict[obj.Flow_Rate_Fraction_Schedule_Name.upper()], + quantity=obj.Peak_Flow_Rate, ) - water_schds[water_schd_name.Name]["schedule"] = water_schd_name - water_schds[water_schd_name.Name]["quantity"] = obj.Peak_Flow_Rate + for obj in dhw_objs + ] + return reduce( UmiSchedule.combine, - [v["schedule"] for k, v in water_schds.items()], + water_schds, weights=None, - quantity={k: v["quantity"] for k, v in water_schds.items()}, + 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 area_conditioned 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): - zone (Zone): """ total_flow_rate = 0 for obj in dhw_objs: @@ -323,22 +334,42 @@ 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. """ - if self is None: - return other - if other is None: + # Check if other is None. Simply return self + if not other: return self + + 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" % ( @@ -352,47 +383,162 @@ 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._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__, - ) - ) - new_obj = DomesticHotWaterSetting( - **meta, - IsOn=any((self.IsOn, other.IsOn)), - WaterSchedule=self.WaterSchedule.combine( + WaterSchedule=UmiSchedule.combine( + self.WaterSchedule, other.WaterSchedule, - weights, - [self.FlowRatePerFloorArea, other.FlowRatePerFloorArea], + weights=[ + self.FlowRatePerFloorArea * self.area, + other.FlowRatePerFloorArea * other.area, + ], + ), + IsOn=any((self.IsOn, other.IsOn)), + FlowRatePerFloorArea=self.float_mean( + other, "FlowRatePerFloorArea", [self.area, other.area] ), - FlowRatePerFloorArea=self._float_mean( - other, "FlowRatePerFloorArea", weights + WaterSupplyTemperature=self.float_mean( + other, "WaterSupplyTemperature", [self.area, other.area] ), - WaterSupplyTemperature=self._float_mean( - other, "WaterSupplyTemperature", weights + WaterTemperatureInlet=self.float_mean( + other, "WaterTemperatureInlet", [self.area, other.area] ), - WaterTemperatureInlet=self._float_mean( - other, "WaterTemperatureInlet", weights - ) + area=self.area + other.area, + **meta, ) - new_obj._predecessors.extend(self.predecessors + other.predecessors) + new_obj.predecessors.update(self.predecessors + other.predecessors) return new_obj + def validate(self): + """Validate object and fill in missing values.""" + return self + + @classmethod + def whole_building(cls, idf): + """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) + + 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() + supply_temp = 60 + inlet_temp = 10 + + name = idf.name + "_DHW" + z_dhw = DomesticHotWaterSetting( + WaterSchedule=water_schedule, + IsOn=bool(total_flow_rate > 0), + FlowRatePerFloorArea=total_flow_rate, + 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, + area=area, + Name="Whole Building WaterUse:Equipment", + Category=idf.name, + ) + z_dhw_list.append(z_dhw) + + return reduce(DomesticHotWaterSetting.combine, z_dhw_list) + + 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, + IsOn=self.IsOn, + WaterSchedule=self.WaterSchedule, + WaterSupplyTemperature=self.WaterSupplyTemperature, + WaterTemperatureInlet=self.WaterTemperatureInlet, + 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 (DomesticHotWaterSetting): + """ + 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. @@ -417,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 7dd24ac2..00000000 --- a/archetypal/template/gas_material.py +++ /dev/null @@ -1,89 +0,0 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ - -import collections - -from archetypal.template import MaterialBase, Unique - - -class GasMaterial(MaterialBase, metaclass=Unique): - """Gas Materials - - .. image:: ../images/template/materials-gas.png - - """ - - def __init__(self, *args, Category="Gases", Type="Gas", **kwargs): - """ - Args: - *args: - Category: - Type: - **kwargs: - """ - super(GasMaterial, self).__init__(*args, Category=Category, **kwargs) - self.Type = Type - - def __hash__(self): - return hash((self.__class__.__name__, self.Name)) - - def __eq__(self, other): - if not isinstance(other, GasMaterial): - return False - 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, - self.SubstitutionRatePattern == other.SubstitutionRatePattern, - self.SubstitutionTimestep == other.SubstitutionTimestep, - self.TransportCarbon == other.TransportCarbon, - self.TransportDistance == other.TransportDistance, - self.TransportEnergy == other.TransportEnergy, - ] - ) - - @classmethod - def from_json(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""" - data_dict = collections.OrderedDict() - - data_dict["$id"] = str(self.id) - data_dict["Category"] = self.Category - data_dict["Type"] = self.Type - 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["Comments"] = self.Comments - data_dict["DataSource"] = self.DataSource - data_dict["Name"] = self.Name - - return data_dict diff --git a/archetypal/template/glazing_material.py b/archetypal/template/glazing_material.py deleted file mode 100644 index 1adbbea3..00000000 --- a/archetypal/template/glazing_material.py +++ /dev/null @@ -1,209 +0,0 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ - -import collections - -from archetypal import log -from archetypal.template import MaterialBase, Unique, UniqueName - - -class GlazingMaterial(MaterialBase, metaclass=Unique): - """Glazing Materials - - .. image:: ../images/template/materials-glazing.png - - """ - - def __init__( - self, - Density=2500, - Conductivity=0, - SolarTransmittance=0, - SolarReflectanceFront=0, - SolarReflectanceBack=0, - VisibleTransmittance=0, - VisibleReflectanceFront=0, - VisibleReflectanceBack=0, - IRTransmittance=0, - IREmissivityFront=0, - IREmissivityBack=0, - DirtFactor=1.0, - Type=None, - Cost=0.0, - Life=1, - **kwargs - ): - """Initialize a GlazingMaterial object with parameters: - - Args: - 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. - Conductivity (float): Thermal conductivity (W/m-K). - SolarTransmittance (float): Transmittance at normal incidence - averaged over the solar spectrum. - SolarReflectanceFront (float): Front-side reflectance at normal - incidence averaged over the solar spectrum. - SolarReflectanceBack (float): Back-side reflectance at normal - incidence averaged over the solar spectrum. - VisibleTransmittance (float): Transmittance at normal incidence - averaged over the solar spectrum and weighted by the response of - the human eye. - VisibleReflectanceFront (float): Front-side reflectance at normal - incidence averaged over the solar spectrum and weighted by the - response of the human eye. - VisibleReflectanceBack (float): Back-side reflectance at normal - incidence averaged over the solar spectrum and weighted by the - response of the human eye. - IRTransmittance (float): Long-wave transmittance at normal - incidence. - IREmissivityFront (float): Front-side long-wave emissivity. - IREmissivityBack (float): Back-side long-wave emissivity. - DirtFactor (float): This is a factor that corrects for the presence - 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__(**kwargs) - self.Life = Life - self.Cost = Cost - self.Type = Type - self.DirtFactor = DirtFactor - self.IREmissivityBack = IREmissivityBack - self.IREmissivityFront = IREmissivityFront - self.IRTransmittance = IRTransmittance - self.VisibleReflectanceBack = VisibleReflectanceBack - self.VisibleReflectanceFront = VisibleReflectanceFront - self.VisibleTransmittance = VisibleTransmittance - self.SolarReflectanceBack = SolarReflectanceBack - self.SolarReflectanceFront = SolarReflectanceFront - self.SolarTransmittance = SolarTransmittance - self.Density = Density - self.Conductivity = Conductivity - - def __add__(self, other): - """Overload + to implement self.combine.""" - return self.combine(other) - - def __hash__(self): - return hash((self.__class__.__name__, self.Name, self.DataSource)) - - def __eq__(self, other): - if not isinstance(other, GlazingMaterial): - return False - 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.Type == other.Type, - self.Cost == other.Cost, - self.Life == other.Life, - ] - ) - - def combine(self, other, weights=None): - """Combine two GlazingMaterial objects together. - - Args: - other (GlazingMaterial): The other GlazingMaterial object to - combine with. - Returns: - (GlazingMaterial): the combined GlazingMaterial object. - """ - # 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 - - meta = self._get_predecessors_meta(other) - idf = self.__dict__.get("idf") - sql = self.__dict__.get("sql") - - if not weights: - log( - 'using GlazingMaterial density as weighting factor in "{}" ' - "combine.".format(self.__class__.__name__) - ) - weights = [self.Density, other.Density] - # iterate over attributes and apply either float_mean or str_mean. - new_attr = {} - for attr in self.__dict__: - if attr not in ["Comments", "idf", "sql", "all_objects", "id"]: - if isinstance(self.__dict__[attr], (int, float)): - new_attr[attr] = self._float_mean(other, attr=attr, weights=weights) - elif isinstance(self.__dict__[attr], str): - new_attr[attr] = self._str_mean(other, attr=attr, append=False) - elif isinstance(self.__dict__[attr], list): - new_attr[attr] = getattr(self, attr) + getattr(other, attr) - elif not getattr(self, attr): - if getattr(self, attr): - new_attr[attr] = getattr(self, attr) - else: - new_attr[attr] = None - elif isinstance(getattr(self, attr), collections.UserList): - pass - else: - raise NotImplementedError - [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, idf=idf, sql=sql, **new_attr) - new_obj._predecessors.extend(self.predecessors + other.predecessors) - return new_obj - - def to_json(self): - data_dict = collections.OrderedDict() - - data_dict["$id"] = str(self.id) - data_dict["DirtFactor"] = self.DirtFactor - data_dict["IREmissivityBack"] = self.IREmissivityBack - data_dict["IREmissivityFront"] = self.IREmissivityFront - data_dict["IRTransmittance"] = self.IRTransmittance - data_dict["SolarReflectanceBack"] = self.SolarReflectanceBack - data_dict["SolarReflectanceFront"] = self.SolarReflectanceFront - data_dict["SolarTransmittance"] = self.SolarTransmittance - data_dict["VisibleReflectanceBack"] = self.VisibleReflectanceBack - data_dict["VisibleReflectanceFront"] = self.VisibleReflectanceFront - data_dict["VisibleTransmittance"] = self.VisibleTransmittance - 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"] = self.Comments - data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) - - return data_dict diff --git a/archetypal/template/load.py b/archetypal/template/load.py index 4db49697..51aec8de 100644 --- a/archetypal/template/load.py +++ b/archetypal/template/load.py @@ -1,20 +1,40 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ +"""archetypal ZoneLoad.""" import collections - -from archetypal import log, timeit, settings -from archetypal.template import UmiBase, Unique, UmiSchedule, UniqueName -from archetypal.utils import reduce import logging as lg +import math +import sqlite3 +from enum import Enum + +import numpy as np +import pandas as pd +from sigfig import round +from validator_collection import checkers, validators + +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 -class ZoneLoad(UmiBase, metaclass=Unique): - """Zone Loads + 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. Important: Please note that the calculation of the equipment power density will sum @@ -23,35 +43,54 @@ class ZoneLoad(UmiBase, metaclass=Unique): .. 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="Continuous", + Name, + EquipmentPowerDensity=0, EquipmentAvailabilitySchedule=None, - EquipmentPowerDensity=12, - IlluminanceTarget=500, - LightingPowerDensity=12, + LightingPowerDensity=0, LightsAvailabilitySchedule=None, + PeopleDensity=0, OccupancySchedule=None, IsEquipmentOn=True, IsLightingOn=True, IsPeopleOn=True, - PeopleDensity=0.2, + DimmingType=DimmingTypes.Continuous, + IlluminanceTarget=500, + area=1, + volume=1, **kwargs, ): - """Initialize a new ZoneLoad object + """Initialize a new ZoneLoad object. Args: - DimmingType (str): Different types to dim the lighting to respect the - IlluminanceTraget and taking into account the daylight illuminance: - - If `Continuous`, the overhead lights dim continuously and linearly - from (maximum electric power, maximum light output) to (minimum - electric power, minimum light output) as the daylight illuminance - increases. The lights stay on at the minimum point with further - increase in the daylight illuminance. - - If `Stepped`, the electric power input and light output vary - in discrete, equally spaced steps. - - If `Off`, Lights switch off completely when the minimum + DimmingType (int): Different types to dim the lighting to respect the + IlluminanceTarget and taking into account the daylight illuminance: + - Continuous = 0, the overhead lights dim continuously and + linearly from (maximum electric power, maximum light output) to ( + minimum electric power, minimum light output) as the daylight + illuminance increases. The lights stay on at the minimum point + with further increase in the daylight illuminance. + - Off = 1, Lights switch off completely when the minimum dimming point is reached. + - Stepped = 2, the electric power input and light output vary + in discrete, equally spaced steps. EquipmentAvailabilitySchedule (UmiSchedule): The name of the schedule (Day | Week | Year) that modifies the design level parameter for electric equipment. @@ -73,196 +112,385 @@ 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 = 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 - self._belongs_to_zone = kwargs.get("zone", None) + @property + def DimmingType(self): + """Get or set the dimming type. - def __add__(self, other): - """ - Args: - other (Zone): + Hint: + To set the value an int or a string is supported. + Choices are (, , + ) """ - return self.combine(other) + 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}'") + + @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): + """Get or set the equipment power density [W/m²].""" + return self._equipment_power_density + + @EquipmentPowerDensity.setter + def EquipmentPowerDensity(self, value): + self._equipment_power_density = validators.float( + value, minimum=0, allow_empty=True + ) - def __hash__(self): - return hash((self.__class__.__name__, self.Name, self.DataSource)) + @property + def IlluminanceTarget(self): + """Get or set the illuminance target [lux].""" + return self._illuminance_target - def __eq__(self, other): - if not isinstance(other, ZoneLoad): - return False - 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, - ] + @IlluminanceTarget.setter + def IlluminanceTarget(self, value): + self._illuminance_target = validators.float(value, minimum=0) + + @property + def LightingPowerDensity(self): + """Get or set the lighting power density [W/m²].""" + return self._lighting_power_density + + @LightingPowerDensity.setter + def LightingPowerDensity(self, 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): + """Get or set the people density [ppl/m²].""" + return self._people_density + + @PeopleDensity.setter + def PeopleDensity(self, value): + self._people_density = validators.float(value, minimum=0) + + @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 + + @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 + + @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 - @classmethod - def from_json(cls, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - zl = cls(*args, **kwargs) + @property + def area(self): + """Get or set the floor area of the zone associated to this zone load [m²].""" + return self._area - 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) + @area.setter + def area(self, value): + self._area = validators.float(value, minimum=0) - return zl + @property + def volume(self): + """Get or set the volume of the zone associated to this zone load [m³].""" + return self._volume - def to_json(self): - """Convert class properties to dict""" - 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 - data_dict[ - "EquipmentAvailabilitySchedule" - ] = self.EquipmentAvailabilitySchedule.to_dict() - data_dict["EquipmentPowerDensity"] = self.EquipmentPowerDensity - data_dict["IlluminanceTarget"] = self.IlluminanceTarget - data_dict["LightingPowerDensity"] = self.LightingPowerDensity - 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"] = self.PeopleDensity - 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): - """ + def from_zone(cls, zone, zone_ep, **kwargs): + """Create a ZoneLoad object from a :class:`ZoneDefinition`. + Args: - zone (archetypal.template.zone.Zone): zone to gets information from + 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: + return None # Get schedule index for different loads and create ZoneLoad arguments # Verify if Equipment in zone - zone_index = zone.sql["Zones"][ - zone.sql["Zones"]["ZoneName"].str.contains(zone.Name.upper()) - ].index[0] - nominal_elec = zone.sql["NominalElectricEquipment"][ - zone.sql["NominalElectricEquipment"]["ZoneIndex"] == zone_index - ] - nominal_gas = zone.sql["NominalGasEquipment"][ - zone.sql["NominalGasEquipment"]["ZoneIndex"] == zone_index - ] - if nominal_elec.empty and nominal_gas.empty: - EquipmentAvailabilitySchedule = UmiSchedule.constant_schedule(idf=zone.idf) - EquipmentPowerDensity = 0.0 - else: - if nominal_gas.empty: - EquipmentPowerDensity = nominal_elec["DesignLevel"].sum() / zone.area - elif nominal_elec.empty: - EquipmentPowerDensity = nominal_gas["DesignLevel"].sum() / zone.area - else: + + # create database connection with sqlite3 + 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() + c.execute(sql_query, t) + (zone_index,) = c.fetchone() + + sql_query = "select t.* from NominalElectricEquipment t where ZoneIndex=?" + nominal_elec = pd.read_sql(sql_query, conn, params=(zone_index,)) + + sql_query = "select t.* from NominalGasEquipment t where ZoneIndex=?" + nominal_gas = pd.read_sql(sql_query, conn, params=(zone_index,)) + + def get_schedule(series): + """Compute the schedule with quantity for nominal equipment series.""" + sched = series["ScheduleIndex"] + 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() + level_ = float(series["DesignLevel"]) + if level_ > 0: + return UmiSchedule.from_epbunch( + zone_ep.theidf.schedules_dict[sched_name.upper()], + quantity=level_, + ) + + schedules = [] + if not nominal_elec.empty: + # compute schedules series + elec_scds = nominal_elec.apply(get_schedule, axis=1).to_list() + elec_scds = list(filter(None, elec_scds)) + schedules.extend(elec_scds) + + if not nominal_gas.empty: + # compute schedules series + gas_scds = nominal_gas.apply(get_schedule, axis=1).to_list() + gas_scds = list(filter(None, gas_scds)) + schedules.extend(gas_scds) + + if schedules: + EquipmentAvailabilitySchedule = reduce( + UmiSchedule.combine, + schedules, + quantity=True, + ) EquipmentPowerDensity = ( - nominal_elec["DesignLevel"].sum() + nominal_gas["DesignLevel"].sum() - ) / zone.area # todo: Should nominal gas really be added to elec? - - sched_indexes = nominal_elec["ScheduleIndex"].values - design_index = nominal_elec["DesignLevel"].index - list_sched = [] - for sched, design in zip(sched_indexes, design_index): - sched_name = zone.sql["Schedules"]["ScheduleName"][sched] - schedule = UmiSchedule(Name=sched_name, idf=zone.idf) - schedule.combine_weight = nominal_elec["DesignLevel"][design] - list_sched.append(schedule) - - EquipmentAvailabilitySchedule = reduce( - UmiSchedule.combine, list_sched, weights="combine_weight" - ) - # Verifies if Lights in zone - if zone.sql["NominalLighting"][ - zone.sql["NominalLighting"]["ZoneIndex"] == zone_index - ].empty: - LightsAvailabilitySchedule = UmiSchedule.constant_schedule(idf=zone.idf) - LightingPowerDensity = 0.0 - else: - schedule_light_index = zone.sql["NominalLighting"][ - zone.sql["NominalLighting"]["ZoneIndex"] == zone_index - ]["ScheduleIndex"].iloc[0] - LightsAvailabilitySchedule = UmiSchedule( - Name=zone.sql["Schedules"]["ScheduleName"].iloc[ - schedule_light_index - 1 - ], - idf=zone.idf, - ) - LightingPowerDensity = ( - zone.sql["NominalLighting"][ - zone.sql["NominalLighting"]["ZoneIndex"] == zone_index - ]["DesignLevel"].iloc[0] - / zone.area - ) - # Verifies if People in zone - if zone.sql["NominalPeople"][ - zone.sql["NominalPeople"]["ZoneIndex"] == zone_index - ].empty: - OccupancySchedule = UmiSchedule.constant_schedule(idf=zone.idf) - PeopleDensity = 0.0 - else: - schedule_people_index = zone.sql["NominalPeople"][ - zone.sql["NominalPeople"]["ZoneIndex"] == zone_index - ]["NumberOfPeopleScheduleIndex"].iloc[0] - OccupancySchedule = UmiSchedule( - Name=zone.sql["Schedules"]["ScheduleName"].iloc[ - schedule_people_index - 1 - ], - idf=zone.idf, - ) - PeopleDensity = ( - zone.sql["NominalPeople"][ - zone.sql["NominalPeople"]["ZoneIndex"] == zone_index - ]["NumberOfPeople"].iloc[0] - / zone.area - ) + EquipmentAvailabilitySchedule.quantity / zone.area + ) + else: + EquipmentAvailabilitySchedule = None + EquipmentPowerDensity = np.NaN + + # Verifies if Lights in zone + sql_query = "select t.* from NominalLighting t where ZoneIndex=?" + nominal_lighting = pd.read_sql(sql_query, conn, params=(zone_index,)) + + lighting_schedules = [] + if not nominal_lighting.empty: + # compute schedules series + light_scds = nominal_lighting.apply(get_schedule, axis=1) + lighting_schedules.extend(light_scds) + + if lighting_schedules: + LightsAvailabilitySchedule = reduce( + UmiSchedule.combine, + lighting_schedules, + quantity=True, + ) + LightingPowerDensity = LightsAvailabilitySchedule.quantity / zone.area + else: + LightsAvailabilitySchedule = None + LightingPowerDensity = np.NaN + + # Verifies if People in zone + + def get_schedule(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.from_epbunch( + zone_ep.theidf.schedules_dict[sched_name.upper()], + quantity=series["NumberOfPeople"], + ) + + sql_query = "select t.* from NominalPeople t where ZoneIndex=?" + nominal_people = pd.read_sql(sql_query, conn, params=(zone_index,)) + + occupancy_schedules = [] + if not nominal_people.empty: + # compute schedules series + occ_scds = nominal_people.apply(get_schedule, axis=1) + occupancy_schedules.extend(occ_scds) + + if occupancy_schedules: + OccupancySchedule = reduce( + UmiSchedule.combine, + occupancy_schedules, + quantity=lambda x: sum(obj.quantity for obj in x), + ) + PeopleDensity = OccupancySchedule.quantity / zone.area + else: + OccupancySchedule = None + PeopleDensity = np.NaN 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, @@ -270,23 +498,31 @@ def from_zone(cls, zone): IsLightingOn=LightingPowerDensity > 0, IsPeopleOn=PeopleDensity > 0, PeopleDensity=PeopleDensity, - idf=zone.idf, - Category=zone.idf.building_name(use_idfname=True), + 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. """ + # Check if other is None. Simply return self + if not other: + return self + + 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" % ( @@ -299,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 "{}" ' @@ -319,48 +552,298 @@ def combine(self, other, weights=None): ) ) - attr = dict( - DimmingType=self._str_mean(other, "DimmingType"), - EquipmentAvailabilitySchedule=self.EquipmentAvailabilitySchedule.combine( + new_attr = dict( + DimmingType=max(self.DimmingType, other.DimmingType), + EquipmentAvailabilitySchedule=UmiSchedule.combine( + self.EquipmentAvailabilitySchedule, other.EquipmentAvailabilitySchedule, - weights=weights, - quantity=[self.EquipmentPowerDensity, other.EquipmentPowerDensity], + 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=self.LightsAvailabilitySchedule.combine( + LightsAvailabilitySchedule=UmiSchedule.combine( + self.LightsAvailabilitySchedule, other.LightsAvailabilitySchedule, - weights=weights, - quantity=[self.LightingPowerDensity, other.LightingPowerDensity], + weights=[self.area, other.area], + quantity=True, ), - OccupancySchedule=self.OccupancySchedule.combine( + OccupancySchedule=UmiSchedule.combine( + self.OccupancySchedule, other.OccupancySchedule, - weights=weights, - quantity=[self.PeopleDensity, other.PeopleDensity], + 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, **attr) - new_obj._belongs_to_zone = self._belongs_to_zone - new_obj._predecessors.extend(self.predecessors + other.predecessors) + new_obj = self.__class__( + **meta, **new_attr, allow_duplicates=self.allow_duplicates + ) + 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 + def validate(self): + """Validate object and fill in missing values.""" + if not self.DimmingType: + self.DimmingType = DimmingTypes.Continuous + if not self.EquipmentAvailabilitySchedule: + self.EquipmentAvailabilitySchedule = UmiSchedule.constant_schedule() + if not self.EquipmentPowerDensity: + self.EquipmentPowerDensity = 0 + if not self.IlluminanceTarget: + self.IlluminanceTarget = 500 + if not self.LightingPowerDensity: + self.LightingPowerDensity = 0 + if not self.LightsAvailabilitySchedule: + self.LightsAvailabilitySchedule = UmiSchedule.constant_schedule() + if not self.OccupancySchedule: + self.OccupancySchedule = UmiSchedule.constant_schedule() + if not self.IsEquipmentOn: + self.IsEquipmentOn = False + if not self.IsLightingOn: + self.IsLightingOn = False + if not self.IsPeopleOn: + self.IsPeopleOn = False + if not self.PeopleDensity: + self.PeopleDensity = 0 + 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( + DimmingType=self.DimmingType, + EquipmentAvailabilitySchedule=self.EquipmentAvailabilitySchedule, + EquipmentPowerDensity=self.EquipmentPowerDensity, + IlluminanceTarget=self.IlluminanceTarget, + LightingPowerDensity=self.LightingPowerDensity, + LightsAvailabilitySchedule=self.LightsAvailabilitySchedule, + OccupancySchedule=self.OccupancySchedule, + IsEquipmentOn=self.IsEquipmentOn, + IsLightingOn=self.IsLightingOn, + IsPeopleOn=self.IsPeopleOn, + PeopleDensity=self.PeopleDensity, + Category=self.Category, + Comments=self.Comments, + DataSource=self.DataSource, + Name=self.Name, + ) + + 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: + 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. + """ + 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 _resolve_dimming_type(zone): - """Resolves the dimming type for the Zone object""" + 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.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 @@ -375,14 +858,14 @@ def _resolve_dimming_type(zone): # There should only be one control per zone. A set of controls should return 1. if len(set(ctrl_types)) == 1: - dimming_type = next(iter(set(ctrl_types))) + dimming_type, *_ = set(ctrl_types) if dimming_type.lower() not in ["continuous", "stepped"]: raise ValueError( f"A dimming type of type '{dimming_type}' for zone '{zone.Name}' is not yet supported in UMI" ) else: log(f"Dimming type for zone '{zone.Name}' set to '{dimming_type}'") - return dimming_type # Return first element + return DimmingTypes[dimming_type] # Return first element else: raise ValueError( "Could not resolve more than one dimming types for Zone {}. " @@ -394,15 +877,18 @@ def _resolve_dimming_type(zone): "No dimming type found for zone {}. Setting as Off".format(zone.Name), lg.DEBUG, ) - return "Off" + 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/materials/glazing_material.py b/archetypal/template/materials/glazing_material.py new file mode 100644 index 00000000..9810174f --- /dev/null +++ b/archetypal/template/materials/glazing_material.py @@ -0,0 +1,472 @@ +"""archetypal GlazingMaterial.""" + +import collections + +from sigfig import round +from validator_collection import validators + +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 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.9, + SolarTransmittance=0, + SolarReflectanceFront=0, + SolarReflectanceBack=0, + VisibleTransmittance=0, + VisibleReflectanceFront=0, + VisibleReflectanceBack=0, + IRTransmittance=0, + IREmissivityFront=0, + IREmissivityBack=0, + DirtFactor=1.0, + Cost=0.0, + **kwargs, + ): + """Initialize a GlazingMaterial object. + + Args: + Name (str): The name of the GlazingMaterial. + 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. + Conductivity (float): Thermal conductivity (W/m-K). + SolarTransmittance (float): Transmittance at normal incidence + averaged over the solar spectrum. + SolarReflectanceFront (float): Front-side reflectance at normal + incidence averaged over the solar spectrum. + SolarReflectanceBack (float): Back-side reflectance at normal + incidence averaged over the solar spectrum. + VisibleTransmittance (float): Transmittance at normal incidence + averaged over the solar spectrum and weighted by the response of + the human eye. + VisibleReflectanceFront (float): Front-side reflectance at normal + incidence averaged over the solar spectrum and weighted by the + response of the human eye. + VisibleReflectanceBack (float): Back-side reflectance at normal + incidence averaged over the solar spectrum and weighted by the + response of the human eye. + IRTransmittance (float): Long-wave transmittance at normal + incidence. + IREmissivityFront (float): Front-side long-wave emissivity. + IREmissivityBack (float): Back-side long-wave emissivity. + DirtFactor (float): This is a factor that corrects for the presence + 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. + **kwargs: keywords passed to the :class:`MaterialBase` + constructor. For more info, see :class:`MaterialBase`. + """ + 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 + self.IRTransmittance = IRTransmittance + self.VisibleReflectanceBack = VisibleReflectanceBack + self.VisibleReflectanceFront = VisibleReflectanceFront + self.VisibleTransmittance = VisibleTransmittance + self.SolarReflectanceBack = SolarReflectanceBack + self.SolarReflectanceFront = SolarReflectanceFront + self.SolarTransmittance = SolarTransmittance + + @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): + """Get or set the infrared emissivity of the back side [-].""" + return float(self._ir_emissivity_back) + + @IREmissivityBack.setter + def IREmissivityBack(self, value): + self._ir_emissivity_back = validators.float(value, False, 0.0, 1.0) + + @property + def IREmissivityFront(self): + """Get or set the infrared emissivity of the front side [-].""" + return self._ir_emissivity_front + + @IREmissivityFront.setter + def IREmissivityFront(self, value): + self._ir_emissivity_front = validators.float(value, False, 0.0, 1.0) + + @property + def IRTransmittance(self): + """Get or set the infrared transmittance [-].""" + return self._ir_transmittance + + @IRTransmittance.setter + def IRTransmittance(self, value): + self._ir_transmittance = validators.float(value, False, 0.0, 1.0) + + @property + def VisibleReflectanceBack(self): + """Get or set the visible reflectance of the back side [-].""" + return self._visible_reflectance_back + + @VisibleReflectanceBack.setter + def VisibleReflectanceBack(self, value): + self._visible_reflectance_back = validators.float(value, False, 0.0, 1.0) + + @property + def VisibleReflectanceFront(self): + """Get or set the visible reflectance of the front side [-].""" + return self._visible_reflectance_front + + @VisibleReflectanceFront.setter + def VisibleReflectanceFront(self, value): + self._visible_reflectance_front = validators.float(value, False, 0.0, 1.0) + + @property + def VisibleTransmittance(self): + """Get or set the visible transmittance [-].""" + return self._visible_transmittance + + @VisibleTransmittance.setter + def VisibleTransmittance(self, 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): + """Get or set the solar reflectance of the back side [-].""" + return self._solar_reflectance_back + + @SolarReflectanceBack.setter + def SolarReflectanceBack(self, value): + self._solar_reflectance_back = validators.float(value, False, 0.0, 1.0) + + @property + def SolarReflectanceFront(self): + """Get or set the solar reflectance of the front side [-].""" + return self._solar_reflectance_front + + @SolarReflectanceFront.setter + def SolarReflectanceFront(self, value): + self._solar_reflectance_front = validators.float(value, False, 0.0, 1.0) + + @property + def SolarTransmittance(self): + """Get or set the solar transmittance [-].""" + return self._solar_transmittance + + @SolarTransmittance.setter + def SolarTransmittance(self, value): + 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. + + Args: + other (GlazingMaterial): The other GlazingMaterial object to + combine with. + Returns: + (GlazingMaterial): the combined GlazingMaterial object. + """ + # 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 + + meta = self._get_predecessors_meta(other) + + if not weights: + log( + 'using GlazingMaterial density as weighting factor in "{}" ' + "combine.".format(self.__class__.__name__) + ) + weights = [self.Density, other.Density] + # iterate over attributes and apply either float_mean or str_mean. + new_attr = {} + 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( + self, other, attr=attr, weights=weights + ) + elif isinstance(value, str) or isinstance(other, str): + new_attr[attr] = UmiBase._str_mean( + self, other, attr=attr, append=False + ) + elif isinstance(value, list) or isinstance(other, list): + new_attr[attr] = getattr(self, attr) + getattr(other, attr) + elif isinstance(value, collections.UserList) or isinstance( + other, collections.UserList + ): + pass + else: + raise NotImplementedError + [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) + new_obj.predecessors.update(self.predecessors + other.predecessors) + return new_obj + + def to_dict(self): + """Return GlazingMaterial dictionary representation.""" + self.validate() # Validate object before trying to get json format + + data_dict = collections.OrderedDict() + + data_dict["$id"] = str(self.id) + data_dict["DirtFactor"] = self.DirtFactor + data_dict["IREmissivityBack"] = round(self.IREmissivityBack, 2) + data_dict["IREmissivityFront"] = round(self.IREmissivityFront, 2) + data_dict["IRTransmittance"] = round(self.IRTransmittance, 2) + data_dict["SolarReflectanceBack"] = round(self.SolarReflectanceBack, 2) + data_dict["SolarReflectanceFront"] = round(self.SolarReflectanceFront, 2) + data_dict["SolarTransmittance"] = round(self.SolarTransmittance, 2) + data_dict["VisibleReflectanceBack"] = round(self.VisibleReflectanceBack, 2) + data_dict["VisibleReflectanceFront"] = round(self.VisibleReflectanceFront, 2) + data_dict["VisibleTransmittance"] = round(self.VisibleTransmittance, 2) + data_dict["Conductivity"] = round(self.Conductivity, 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["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, 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, + IREmissivityBack=self.IREmissivityBack, + IREmissivityFront=self.IREmissivityFront, + IRTransmittance=self.IRTransmittance, + SolarReflectanceBack=self.SolarReflectanceBack, + SolarReflectanceFront=self.SolarReflectanceFront, + SolarTransmittance=self.SolarTransmittance, + VisibleReflectanceBack=self.VisibleReflectanceBack, + VisibleReflectanceFront=self.VisibleReflectanceFront, + VisibleTransmittance=self.VisibleTransmittance, + 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, + ) + + @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/materials/nomass_material.py b/archetypal/template/materials/nomass_material.py new file mode 100644 index 00000000..7cffde2a --- /dev/null +++ b/archetypal/template/materials/nomass_material.py @@ -0,0 +1,489 @@ +"""archetypal OpaqueMaterial.""" + +import collections + +import numpy as np +from sigfig import round +from validator_collection import validators + +from archetypal.template.materials.material_base import MaterialBase +from archetypal.utils import log + + +class NoMassMaterial(MaterialBase): + """Use this component to create a custom no mass material.""" + + _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, + RValue, + SolarAbsorptance=0.7, + ThermalEmittance=0.9, + VisibleAbsorptance=0.7, + Roughness="Rough", + MoistureDiffusionResistance=50, + **kwargs, + ): + """Initialize an opaque material. + + Args: + Name (str): The name of the material. + 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. + 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". + 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(NoMassMaterial, self).__init__(Name, **kwargs) + self.r_value = RValue + self.Roughness = Roughness + self.SolarAbsorptance = SolarAbsorptance + self.ThermalEmittance = ThermalEmittance + self.VisibleAbsorptance = VisibleAbsorptance + self.MoistureDiffusionResistance = MoistureDiffusionResistance + + @property + def r_value(self): + """Get or set the thermal resistance [m2-K/W].""" + return self._r_value + + @r_value.setter + def r_value(self, value): + self._r_value = 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 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. + + 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 = NoMassMaterial( + **meta, + Roughness=self._str_mean(other, attr="Roughness", append=False), + 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( + other, "SubstitutionTimestep", weights + ), + 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 + ), + ) + new_obj.predecessors.update(self.predecessors + other.predecessors) + return new_obj + + 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"] = round(self.SolarAbsorptance, 2) + data_dict["ThermalEmittance"] = round(self.ThermalEmittance, 2) + data_dict["VisibleAbsorptance"] = round(self.VisibleAbsorptance, 2) + data_dict["RValue"] = round(self.r_value, 3) + data_dict["Cost"] = self.Cost + 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 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 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” + 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, + idf=epbunch.theidf, + **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, + idf=epbunch.theidf, + **kwargs, + ) + elif epbunch.key.upper() == "MATERIAL:AIRGAP": + gas_prop = { + "AIR": dict( + Conductivity=0.02436, + Density=1.754, + SpecificHeat=1000, + ThermalEmittance=0.001, + ), + "ARGON": dict( + Conductivity=0.016, + Density=1.784, + SpecificHeat=1000, + ThermalEmittance=0.001, + ), + "KRYPTON": dict( + Conductivity=0.0088, + Density=3.749, + SpecificHeat=1000, + ThermalEmittance=0.001, + ), + "XENON": dict( + Conductivity=0.0051, + Density=5.761, + SpecificHeat=1000, + ThermalEmittance=0.001, + ), + "SF6": dict( + Conductivity=0.001345, + Density=6.17, + SpecificHeat=1000, + ThermalEmittance=0.001, + ), + } + for gasname, properties in gas_prop.items(): + if gasname.lower() in epbunch.Name.lower(): + thickness = properties["Conductivity"] * epbunch.Thermal_Resistance + return cls( + Name=epbunch.Name, + Thickness=thickness, + **properties, + idf=epbunch.theidf, + ) + else: + thickness = ( + gas_prop["AIR"]["Conductivity"] * epbunch.Thermal_Resistance + ) + return cls( + Name=epbunch.Name, + Thickness=thickness, + **gas_prop["AIR"], + idf=epbunch.theidf, + ) + else: + raise NotImplementedError( + "Material '{}' of type '{}' is not yet " + "supported. Please contact package " + "authors".format(epbunch.Name, epbunch.key) + ) + + 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( + "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") == "": + 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( + RValue=self.r_value, + MoistureDiffusionResistance=self.MoistureDiffusionResistance, + Roughness=self.Roughness, + SolarAbsorptance=self.SolarAbsorptance, + ThermalEmittance=self.ThermalEmittance, + VisibleAbsorptance=self.VisibleAbsorptance, + Cost=self.Cost, + 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, NoMassMaterial): + return NotImplemented + else: + return all( + [ + 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, + ] + ) + + 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/opaque_construction.py b/archetypal/template/opaque_construction.py deleted file mode 100644 index 47c054b1..00000000 --- a/archetypal/template/opaque_construction.py +++ /dev/null @@ -1,531 +0,0 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ - -import collections -import uuid - -import numpy as np -from archetypal.template import ( - Unique, - 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 - """ - - def __init__( - self, - AssemblyCarbon=0, - AssemblyCost=0, - AssemblyEnergy=0, - DisassemblyCarbon=0, - DisassemblyEnergy=0, - **kwargs - ): - """Initialize a ConstructionBase object with parameters: - - Args: - AssemblyCarbon: - AssemblyCost: - AssemblyEnergy: - DisassemblyCarbon: - DisassemblyEnergy: - **kwargs: - """ - super(ConstructionBase, self).__init__(**kwargs) - self.AssemblyCarbon = AssemblyCarbon - self.AssemblyCost = AssemblyCost - self.AssemblyEnergy = AssemblyEnergy - self.DisassemblyCarbon = DisassemblyCarbon - self.DisassemblyEnergy = DisassemblyEnergy - - -class LayeredConstruction(ConstructionBase): - """Defines the layers of an :class:`OpaqueConstruction`. This class has one - attribute: - - 1. A list of :class:`MaterialLayer` objects. - """ - - def __init__(self, Layers, **kwargs): - """ - 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 - - -class OpaqueConstruction(LayeredConstruction, metaclass=Unique): - """Opaque Constructions - - .. image:: ../images/template/constructions-opaque.png - """ - - def __init__( - self, - Layers, - Surface_Type=None, - Outside_Boundary_Condition=None, - IsAdiabatic=False, - **kwargs - ): - """ - Args: - Layers (list of MaterialLayer): - Surface_Type: - Outside_Boundary_Condition: - IsAdiabatic: - **kwargs: - """ - super(OpaqueConstruction, self).__init__(Layers, **kwargs) - self.area = 1 - self.Surface_Type = Surface_Type - self.Outside_Boundary_Condition = Outside_Boundary_Condition - self.IsAdiabatic = IsAdiabatic - - def __add__(self, other): - """Overload + to implement self.combine. - - Args: - other: - """ - return self.combine(other) - - def __hash__(self): - return hash((self.__class__.__name__, self.Name, self.DataSource)) - - def __eq__(self, other): - if not isinstance(other, OpaqueConstruction): - return False - else: - return all( - [ - self.Layers == other.Layers, - self.Surface_Type == other.Surface_Type, - self.Outside_Boundary_Condition == other.Outside_Boundary_Condition, - self.IsAdiabatic == other.IsAdiabatic, - ] - ) - - @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) - - 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). - - 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}}` - - 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). - """ - if include_h: - return (1 / h_out + self.r_value + 1 / h_in) ** -1 - else: - return 1 / self.r_value - - @property - def equivalent_heat_capacity_per_unit_volume(self): - """The equivalent per unit wall **volume** heat capacity. Expressed in - J/(kg⋅K). - - Hint: - 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 - characteristic wall quantity independent from the wall thickness, is - equal to ρ·c. This quantity for a composite wall of an overall - thickness L, is usually defined as the equivalent per unit wall - volume heat capacity and it is expressed as - :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. - """ - return (1 / self.total_thickness) * sum( - [ - layer.Material.Density * layer.Material.SpecificHeat * layer.Thickness - for layer in self.Layers - ] - ) - - @property - def specific_heat(self): - """float: The overall specific heat of the OpaqueConstruction 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], - ) - - @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) - """ - return sum( - [ - layer.Material.Density * layer.Material.SpecificHeat * layer.Thickness - for layer in self.Layers - ] - ) - - @property - def total_thickness(self): - """Returns the total thickness of an OpaqueConstruction by summing up - each material layer thicknesses - """ - return sum([layer.Thickness for layer in self.Layers]) - - @property - def mass_per_unit_area(self): - 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 combine(self, other, weights=None, method="dominant_wall"): - """Combine two OpaqueConstruction together. - - Args: - other (OpaqueConstruction): The other OpaqueConstruction object to - combine with. - weights (list-like, optional): A list-like object of len 2. If None, - the weight is the same for both self and other. - method (str): Equivalent wall assembly method. Only 'dominant_wall' - is safe to use. 'constant_ufactor' is still weird in terms of - respecting the thermal response of the walls and may cause - conversion issues with Conduction Transfer Functions (CTFs) in - EnergyPlus. - - Returns: - (OpaqueConstruction): the combined ZoneLoad object. - """ - # 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: - weights = [self.area, other.area] - - 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) - 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"]' - ) - # 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) - new_name = ( - "Combined Opaque Construction {{{}}} with u_value " - "of {:,.3f} W/m2k".format(uuid.uuid1(), new_obj.u_value()) - ) - new_obj.rename(new_name) - new_obj._predecessors.extend(self.predecessors + other.predecessors) - 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 - - Args: - other: - weights: - """ - oc = [ - x - for _, x in sorted( - zip([2, 1], [self, other]), key=lambda pair: pair[0], reverse=True - ) - ][0] - return oc - - def constant_ufactor(self, other, weights=None): - """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 - - Args: - other (OpaqueConstruction): The other Construction. - weights (array_like, optional): An array of weights associated with - the self and other. Each value contributes to the average - according to its associated weight. If `weights=None` , then all - data are assumed to have a weight equal to one. - """ - from scipy.optimize import minimize - - def obj_func( - thicknesses, - materials, - expected_u_value, - expected_specific_heat, - expected_total_thickness, - ): - """Objective function for thickness evaluation""" - - u_value = 1 / sum( - [ - thickness / mat.Conductivity - for thickness, mat in zip(thicknesses, materials) - ] - ) - - # Specific_heat: (J/kg K) - h_calc = [ - mat.SpecificHeat for thickness, mat in zip(thicknesses, materials) - ] - - # (kg/m3) x (m) = (kg/m2) - mass_per_unit_area = [ - mat.Density * thickness - for thickness, mat in zip(thicknesses, materials) - ] - specific_heat = np.average(h_calc, weights=mass_per_unit_area) - return ( - (u_value - expected_u_value) ** 2 - + (specific_heat - expected_specific_heat) ** 2 - + (sum(thicknesses) - expected_total_thickness) ** 2 - ) - - # U_eq is the weighted average of the wall u_values by their respected total - # 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()], - weights=[self.total_thickness, other.total_thickness], - ) - - # Get a set of all materials sorted by Material Density (descending order) - materials = list( - sorted( - set( - [layer.Material for layer in self.Layers] - + [layer.Material for layer in other.Layers] - ), - key=lambda x: x.Density, - reverse=True, - ) - ) - - # Setup weights - if not weights: - weights = [1.0, 1.0] - - # If weights is a list of zeros. This weight is used in the - if not np.array(weights).any(): - weights = [1, 1] - - # Calculate the desired equivalent specific heat - equi_spec_heat = np.average( - [self.specific_heat, other.specific_heat], weights=weights - ) - two_wall_thickness = np.average( - [self.total_thickness, other.total_thickness], weights=weights - ) - x0 = np.ones(len(materials)) - bnds = tuple([(0.003, None) for layer in materials]) - res = minimize( - obj_func, - x0, - args=(materials, u_equivalent, equi_spec_heat, two_wall_thickness), - bounds=bnds, - ) - - return np.array(materials), res.x - - @classmethod - def from_json(cls, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - # resolve Material objects from ref - layers = kwargs.pop("Layers") - oc = cls(Layers=None, **kwargs) - lys = [ - MaterialLayer(oc.get_ref(layer["Material"]), layer["Thickness"]) - for layer in layers - ] - oc.Layers = lys - - return oc - - @classmethod - def from_epbunch(cls, epbunch, **kwargs): - # from the construction or internalmass object - """ - Args: - epbunch (EpBunch): - **kwargs: - """ - name = epbunch.Name - idf = kwargs.pop("idf", epbunch.theidf) - # treat internalmass and surfaces differently - if epbunch.key.lower() == "internalmass": - layers = cls._internalmass_layer(epbunch) - return cls(Name=name, Layers=layers, idf=idf) - else: - layers = cls._surface_layers(epbunch) - return cls(Name=name, Layers=layers, idf=idf, **kwargs) - - @classmethod - def _internalmass_layer(cls, epbunch): - """ - Args: - epbunch: - """ - - layers = [] - constr_obj = epbunch.theidf.getobject("CONSTRUCTION", epbunch.Construction_Name) - field_idd = constr_obj.getfieldidd("Outside_Layer") - validobjects = field_idd["validobjects"] # plausible layer types - for layer in constr_obj.fieldvalues[2:]: - # Iterate over the constructions layers - found = False - for key in validobjects: - try: - material = constr_obj.theidf.getobject(key, layer) - o = OpaqueMaterial.from_epbunch(material) - found = True - except AttributeError: - pass - else: - layers.append( - MaterialLayer(**dict(Material=o, Thickness=o._thickness)) - ) - if not found: - raise AttributeError("%s material not found in IDF" % layer) - return layers - - @staticmethod - def _surface_layers(c): - """Retrieve layers for the OpaqueConstruction - - Args: - c (EpBunch): EP-Construction object - """ - layers = [] - field_idd = c.getfieldidd("Outside_Layer") - validobjects = field_idd["validobjects"] # plausible layer types - for layer in c.fieldvalues[2:]: - # Iterate over the constructions layers - found = False - for key in validobjects: - try: - material = c.theidf.getobject(key, layer) - o = OpaqueMaterial.from_epbunch(material) - found = True - except AttributeError: - pass - else: - layers.append( - MaterialLayer(**dict(Material=o, Thickness=o._thickness)) - ) - if not found: - raise AttributeError("%s material not found in IDF" % layer) - return layers - - def to_json(self): - """Convert class properties to dict""" - data_dict = collections.OrderedDict() - - data_dict["$id"] = str(self.id) - data_dict["Layers"] = [lay.to_dict() for lay 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"] = str(self.DataSource) - data_dict["Name"] = UniqueName(self.Name) - - return data_dict - - @classmethod - def generic(cls, idf=None): - # Generic Plaster Board - """ - Args: - idf: - """ - om = OpaqueMaterial.generic() - - layers = [MaterialLayer(om, 0.0127)] # half inch - return cls(Name="generic plaster board half inch", Layers=layers, idf=idf) diff --git a/archetypal/template/opaque_material.py b/archetypal/template/opaque_material.py deleted file mode 100644 index 2a8bfe78..00000000 --- a/archetypal/template/opaque_material.py +++ /dev/null @@ -1,340 +0,0 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ - -import collections - -from archetypal import log -from archetypal.template import UmiBase, Unique - - -class OpaqueMaterial(UmiBase, metaclass=Unique): - """Use this component to create a custom opaque material. - - .. image:: ../images/template/materials-opaque.png - """ - - def __init__( - self, - 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 - ): - """A custom opaque material. - - Args: - 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 abstorptance 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". - 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: - """ - super(OpaqueMaterial, self).__init__(**kwargs) - - if SubstitutionRatePattern is None: - SubstitutionRatePattern = [0.5, 1] - self.Conductivity = Conductivity - 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 - - self._thickness = kwargs.get("Thickness", None) - - def __add__(self, other): - """Overload + to implement self.combine. - - Args: - other (OpaqueMaterial): - """ - return self.combine(other) - - def __hash__(self): - return hash((self.__class__.__name__, self.Name)) - - def __eq__(self, other): - if not isinstance(other, OpaqueMaterial): - return False - 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, - self.SubstitutionRatePattern == other.SubstitutionRatePattern, - self.SubstitutionTimestep == other.SubstitutionTimestep, - ] - ) - - @classmethod - def generic(cls): - """generic plaster board""" - return cls( - Conductivity=1.39, - SpecificHeat=1085, - Density=2000, - Name="generic_plaster_board", - ) - - def combine(self, other, weights=None): - """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.extend(self.predecessors + other.predecessors) - return new_obj - - def to_json(self): - """Convert class properties to dict""" - 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"] = self.Comments - data_dict["DataSource"] = self.DataSource - data_dict["Name"] = self.Name - - return data_dict - - @classmethod - def from_epbunch(cls, epbunch, **kwargs): - """Create an OpaqueMaterial from an IDF "Material", "Material:NoMAss", - or "Material:AirGap" element. - - 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": - # 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, - 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 - return cls( - Conductivity=Conductivity, - Density=Density, - Roughness=Roughness, - SolarAbsorptance=SolarAbsorptance, - SpecificHeat=SpecificHeat, - ThermalEmittance=ThermalEmittance, - VisibleAbsorptance=VisibleAbsorptance, - Thickness=Thickness, - Name=Name, - idf=epbunch.theidf, - **kwargs - ) - elif epbunch.key.upper() == "MATERIAL:AIRGAP": - - 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 = "Smooth" - return cls( - Conductivity=Conductivity, - Roughness=Roughness, - SpecificHeat=SpecificHeat, - Thickness=Thickness, - Density=Density, - Name=Name, - SolarAbsorptance=0, - ThermalEmittance=0, - VisibleAbsorptance=0, - idf=epbunch.theidf, - **kwargs - ) - else: - raise NotImplementedError( - "Material '{}' of type '{}' is not yet " - "supported. Please contact package " - "authors".format(epbunch.Name, epbunch.key) - ) diff --git a/archetypal/template/schedule.py b/archetypal/template/schedule.py index dd7c31ac..9b90b92d 100644 --- a/archetypal/template/schedule.py +++ b/archetypal/template/schedule.py @@ -1,117 +1,117 @@ -################################################################################ -# 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 uuid +import hashlib +from datetime import datetime import numpy as np import pandas as pd -from archetypal import Schedule, log -from archetypal.template import UmiBase, Unique, UniqueName -from eppy.bunch_subclass import EpBunch +from validator_collection import validators +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, metaclass=Unique): - """Class that handles Schedules as""" - def __init__(self, *args, **kwargs): - """ +class UmiSchedule(Schedule, UmiBase): + """Class that handles Schedules.""" + + __slots__ = ("_quantity",) + + def __init__(self, Name, quantity=None, **kwargs): + """Initialize object with parameters. + Args: - *args: + Name: + quantity: **kwargs: """ - super(UmiSchedule, self).__init__(*args, **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", 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, idf=idf, **kwargs + value=value, Name=Name, Type=Type, **kwargs ) @classmethod - def from_values(cls, Name, values, **kwargs): - """ + def random(cls, Name="AlwaysOn", Type="Fraction", **kwargs): + """Create an UmiSchedule with a randomized value (0-1) at each timestep. + Args: - Name: - values: - **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, **kwargs) + values = np.random.rand( + 8760, + ) + return cls(Values=values.tolist(), Name=Name, Type=Type, **kwargs) @classmethod - def from_yearschedule(cls, year_sched): - """ + def from_values(cls, Name, Values, Type="Fraction", **kwargs): + """Create an UmiSchedule from a list of values. + Args: - year_sched: + 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, - schTypeLimitsName=year_sched.schTypeLimitsName, - ) - - def __add__(self, other): - return self.combine(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) + 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__, self.Name, self.DataSource)) - - def __eq__(self, other): - if not isinstance(other, UmiSchedule): - return False - else: - return all( - [ - self.strict == other.strict, - self.schType == other.schType, - self.schTypeLimitsName == other.schTypeLimitsName, - np.array_equal(self.all_values, other.all_values), - ] - ) - def combine(self, other, weights=None, quantity=None): """Combine two UmiSchedule objects together. Args: other (UmiSchedule): The other Schedule object to combine with. - weights (list): Attribute of self and other containing the weight - factor. - quantity (list or dict): Scalar value that will be multiplied by self before - the averaging occurs. This ensures that the resulting schedule - returns the correct integrated value. If a dict is passed, keys are - schedules Names and values are quantities. + weights (list, dict or string): Attribute of self and other containing the + weight factor. If a list is passed, it must have len = 2; the first + element is applied to self and the second element is applied to other. + If a dict is passed, the self.Name and other.Name are the keys. If a + str is passed, the + quantity (list or dict or bool): Scalar value that will be multiplied by + self before the averaging occurs. This ensures that the resulting + schedule returns the correct integrated value. If a dict is passed, + keys are schedules Names and values are quantities. Returns: (UmiSchedule): the combined UmiSchedule object. + + Raises: + TypeError: if Quantity is not of type list, tuple, dict or a callable. """ - if not isinstance(other, self.__class__): + # Check if other is None. Simply return self + if not other: + return self + + if not self: + return other + + if not isinstance(other, UmiSchedule): msg = "Cannot combine %s with %s" % ( self.__class__.__name__, other.__class__.__name__, @@ -119,14 +119,15 @@ def combine(self, other, weights=None, quantity=None): raise NotImplementedError(msg) # check if the schedule is the same - if all(self.all_values == other.all_values): + if self == other: + if self.quantity and other.quantity: + self.quantity += other.quantity return self - # check if self is only zeros. Should not affect other. - if all(self.all_values == 0): + if not np.any(self.all_values): return other # check if other is only zeros. Should not affect self. - if all(other.all_values == 0): + if not np.any(other.all_values): return self if not weights: @@ -136,103 +137,218 @@ def combine(self, other, weights=None, quantity=None): ) weights = [1, 1] elif isinstance(weights, str): + # get the attribute from self and other weights = [getattr(self, weights), getattr(other, weights)] + elif isinstance(weights, (list, tuple)): + # check if length is 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(length) + ) + elif isinstance(weights, dict): + weights = [weights[self.Name], weights[other.Name]] if quantity is None: new_values = np.average( [self.all_values, other.all_values], axis=0, weights=weights ) elif isinstance(quantity, dict): + # Multiplying the schedule values by the quantity for both self and other + # and then using a weighted average. Finally, new values are normalized. new_values = np.average( - [self.all_values * quantity[self.Name], other.all_values * quantity[ - other.Name]], + [ + self.all_values * quantity[self.Name], + other.all_values * quantity[other.Name], + ], axis=0, weights=weights, ) - new_values /= new_values.max() - else: + new_values /= quantity[self.Name] + quantity[other.Name] + elif callable(quantity): new_values = np.average( - [self.all_values * quantity[0], other.all_values * quantity[1]], + np.stack((self.all_values, other.all_values), axis=1), + axis=1, + weights=[ + quantity(self.predecessors.data), + quantity(other.predecessors.data), + ], + ) + elif isinstance(quantity, (list, tuple)): + # Multiplying the schedule values by the quantity for both self and other + # and then using a weighted average. Finally, new values are normalized. + self_quantity, other_quantity = quantity + new_values = ( + self.all_values * self_quantity + other.all_values * other_quantity + ) / sum(quantity) + elif isinstance(quantity, bool): + new_values = np.average( + [self.all_values, other.all_values], axis=0, - weights=weights, + weights=[self.quantity * weights[0], other.quantity * weights[1]], ) - new_values /= new_values.max() + else: + raise TypeError("Quantity is not of type list, tuple, dict or a callable") # the new object's name meta = self._get_predecessors_meta(other) - attr = self.__dict__.copy() - attr.update(dict(values=new_values)) - attr["Name"] = meta["Name"] - new_obj = super().from_values(**attr) - new_name = ( - "Combined Schedule {{{}}} with mean daily min:{:.2f} " - "mean:{:.2f} max:{:.2f}".format( - uuid.uuid1(), new_obj.min, new_obj.mean, new_obj.max - ) + # Overriding meta Name + hasher = hashlib.md5() + hasher.update(new_values) + meta["Name"] = f"Combined_UmiSchedule_{hasher.hexdigest()}" + quantity = np.nansum( + [self.quantity or float("nan"), other.quantity or float("nan")] ) - new_obj.rename(new_name) - new_obj._predecessors.extend(self.predecessors + other.predecessors) + new_obj = UmiSchedule.from_values( + 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: {}".format( - "\n".join(lines) - ), - ) - ) - newweeks = [] - for week in weeks: - newweeks.append( - WeekSchedule.from_epbunch( - week, - Comments="Year Week Day schedules created from: {}".format( - "\n".join(lines) - ), - ) - ) - year = YearSchedule( - idf=self.idf, - Name=year.Name, - id=self.id, - schTypeLimitsName=self.schTypeLimitsName, - epbunch=year, - newweeks=newweeks, - Comments="Year Week Day schedules created from: " - "{}".format("\n".join(lines)), + _from = "\n".join(lines) + year.Comments = ( + f"Year Week Day schedules created from: \n{_from}" + str(id(self)), ) return year - 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 - """ - pass + 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_dict(self): - year_sched = self.develop() - return year_sched.to_dict() + """Return UmiSchedule dictionary representation. + 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_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, 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, + 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 UmiSchedule.CREATED_OBJECTS + if value.id == ref["$ref"] + ] + ), + None, + ) + + def duplicate(self): + """Get copy of self.""" + return self.__copy__() -class YearScheduleParts: - """Helper Class for YearSchedules that are defined using FromDay FromMonth - ToDay ToMonth attributes. - """ + 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 defined with FromDay FromMonth ToDay ToMonth.""" + + __slots__ = ("_from_day", "_from_month", "_to_day", "_to_month", "_schedule") def __init__( - self, FromDay=None, FromMonth=None, ToDay=None, ToMonth=None, Schedule=None + self, + FromDay=None, + FromMonth=None, + ToDay=None, + ToMonth=None, + Schedule=None, + **kwargs, ): - """ + """Initialize YearSchedulePart. + Args: FromDay (int): This numeric field is the starting day for the schedule time period. @@ -244,6 +360,7 @@ def __init__( schedule time period. Schedule (UmiSchedule): The associated UmiSchedule related to this object. + kwargs (dict): Other Keyword arguments. """ self.FromDay = FromDay self.FromMonth = FromMonth @@ -251,21 +368,78 @@ def __init__( self.ToMonth = ToMonth self.Schedule = Schedule + @property + def FromDay(self): + """Get or set the start day-of-month number [int].""" + return self._from_day + + @FromDay.setter + def FromDay(self, value): + self._from_day = validators.integer(value, minimum=1, maximum=31) + + @property + def FromMonth(self): + """Get or set the start month-number [int].""" + return self._from_month + + @FromMonth.setter + def FromMonth(self, value): + self._from_month = validators.integer(value, minimum=1, maximum=12) + + @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_json(cls, all_objects, *args, **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'} + } """ - ysp = cls(*args, **kwargs) - ref = kwargs.get("Schedule", None) - ysp.Schedule = all_objects.get_ref(ref) + 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, @@ -275,24 +449,81 @@ 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, + ToDay=self.ToDay, + ToMonth=self.ToMonth, + Schedule=self.Schedule, + ) + + 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, **kwargs): - """Initialize a DaySchedule object with parameters: + __slots__ = ("_values",) + + def __init__(self, Name, Values, Category="Day", **kwargs): + """Initialize a DaySchedule object with parameters. Args: + 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__(**kwargs) + super(DaySchedule, self).__init__( + Category=Category, Name=Name, Values=Values, **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=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 @@ -300,137 +531,295 @@ 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, - **kwargs + Type=cls.get_schedule_type_limits_name(epbunch), + Values=_ScheduleParser.get_schedule_values( + epbunch, start_date, strict=strict + ), + **kwargs, ) - sched.values = sched.get_schedule_values(epbunch) + return sched @classmethod - def from_values(cls, Values, **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. + Type (str): Schedule Type Limit name. **kwargs: Keywords passed to the :class:`UmiSchedule` constructor. See :class:`UmiSchedule` for more details. """ - sched = cls(**kwargs) - sched.values = Values - - return sched + return cls(Name=Name, Values=Values, Type=Type, **kwargs) @classmethod - def from_json(cls, Type, **kwargs): - """Create a DaySchedule from a Umi Template json file. + def from_dict(cls, data, **kwargs): + """Create a DaySchedule from a dictionary. 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" + }, """ - values = kwargs.pop("Values") - sched = cls.from_values(values, schTypeLimitsName=Type, **kwargs) + _id = data.pop("$id") + sched = cls.from_values(id=_id, **data, **kwargs) return sched - def to_json(self): - """Returns a dict-like representation of the schedule. - - Returns: - dict: The dict-like representation of the schedule - - """ + def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" + return UmiBase.get_unique(self) + def to_dict(self): + """Return DaySchedule dictionary representation.""" data_dict = collections.OrderedDict() data_dict["$id"] = str(self.id) - data_dict["Category"] = "Day" - data_dict["Type"] = self.schTypeLimitsName - data_dict["Values"] = self.all_values.round(3).tolist() - data_dict["Comments"] = self.Comments + data_dict["Category"] = self.Category + 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 - @property - def all_values(self): - return np.array(self.values) + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. - def to_dict(self): - """returns umi template 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, + Values=self.all_values.round(3).tolist(), + Comments=self.Comments, + DataSource=self.DataSource, + Name=self.Name, + ) + + 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, DaySchedule): + return NotImplemented + else: + return all( + [ + self.Type == other.Type, + np.allclose(self.all_values, other.all_values, rtol=1e-02), + ] + ) + + def __hash__(self): + """Return the hash value of self.""" + return super(DaySchedule, self).__hash__() + + 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.""" - def __init__(self, days=None, **kwargs): - """Initialize a WeekSchedule object with parameters: + __slots__ = ("_days", "_values") + + def __init__(self, Name, Days=None, Category="Week", **kwargs): + """Initialize a WeekSchedule object with parameters. Args: - days (list of DaySchedule): list of :class:`DaySchedule`. + Days (list of DaySchedule): list of :class:`DaySchedule`. **kwargs: """ - super(WeekSchedule, self).__init__(**kwargs) - self.Days = days + 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: - **kwargs: + 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, **kwargs + Name=epbunch.Name, + schType=epbunch.key, + Days=Days, + **kwargs, ) - sched.Days = sched.get_days(epbunch) return sched @classmethod - def from_json(cls, **kwargs): - """ + def from_dict(cls, data, day_schedules, **kwargs): + """Create a WeekSchedule from a dictionary. + 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. """ - sch_type_limits_name = kwargs.pop("Type") - wc = cls(schTypeLimitsName=sch_type_limits_name, **kwargs) - days = kwargs.get("Days", None) - wc.Days = [wc.get_ref(day) for day in days] + 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 to_json(self): - """Returns a dict-like representation of the schedule. + def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" + return UmiBase.get_unique(self) - 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"] = "Week" - data_dict["Days"] = [day.to_dict() for day in self.Days] - data_dict["Type"] = self.schTypeLimitsName - data_dict["Comments"] = self.Comments + data_dict["Category"] = self.Category + 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 get_days(self, epbunch): + 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, + Type=self.Type, + Comments=self.Comments, + DataSource=self.DataSource, + Name=self.Name, + ) + + @classmethod + 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", @@ -441,92 +830,214 @@ def get_days(self, epbunch): "Sunday", ] for day in dayname: - week_day_schedule_name = epbunch["{}_ScheduleDay_Name".format(day)] - blocks.append( - self.all_objects[ - hash(("DaySchedule", week_day_schedule_name, self.DataSource)) + day_ep = epbunch.get_referenced_object("{}_ScheduleDay_Name".format(day)) + Days.append(DaySchedule.from_epbunch(day_ep, **kwargs)) + + 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_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, ] ) - return blocks + def __hash__(self): + """Return the hash value of self.""" + return super(WeekSchedule, self).__hash__() - def to_dict(self): - """returns umi template repr""" - return {"$ref": str(self.id)} + 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, *args, **kwargs): - """Initialize a YearSchedule object with parameters: + def __init__(self, Name, Type="Fraction", Parts=None, Category="Year", **kwargs): + """Initialize a YearSchedule object with parameters. Args: - *args: + Category: + Name: + Type: + Parts (list of YearSchedulePart): The YearScheduleParts. **kwargs: """ - super(YearSchedule, self).__init__(*args, **kwargs) self.epbunch = kwargs.get("epbunch", None) - parts = kwargs.get("Parts", None) - if parts is None: - self.Parts = self.get_parts(self.epbunch) + if Parts is None: + self.Parts = self._get_parts(self.epbunch) else: - self.Parts = parts + self.Parts = Parts + super(YearSchedule, self).__init__( + Name=Name, Type=Type, schType="Schedule:Year", Category=Category, **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__() @property - def all_values(self): - 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) - 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 - return series.values + 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) + # 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 + self._values = series.values + return self._values @classmethod - def from_json(cls, **kwargs): - """ + def from_dict(cls, data, week_schedules, **kwargs): + """Create a YearSchedule from a dictionary. + 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. """ - schtypelimitsname = kwargs.pop("Type") - ys = cls(schTypeLimitsName=schtypelimitsname, **kwargs) - parts = kwargs.get("Parts", None) - - ys.Parts = [ - YearScheduleParts.from_json(all_objects=ys, **part) for part in parts + Parts = [ + YearSchedulePart.from_dict(data, week_schedules) + for data in data.pop("Parts", None) ] - ys.schType = "Schedule:Year" - return UmiSchedule.from_yearschedule(ys) + _id = data.pop("$id") + ys = cls(Parts=Parts, id=_id, **data, **kwargs) + return ys - def to_json(self): - """Returns a dict-like representation of the schedule. - - Returns: - dict: The dict-like representation of the schedule + def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" + return UmiBase.get_unique(self) - """ + def to_dict(self): + """Return YearSchedule dictionary representation.""" data_dict = collections.OrderedDict() data_dict["$id"] = str(self.id) - data_dict["Category"] = "Year" + data_dict["Category"] = self.Category data_dict["Parts"] = [part.to_dict() for part in self.Parts] - data_dict["Type"] = self.schTypeLimitsName - 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 get_parts(self, epbunch): + 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: - epbunch (EpBunch): + validate (bool): If True, try to validate object before returning the + mapping. """ + if validate: + self.validate() + + return dict( + Category=self.Category, + Parts=self.Parts, + Type=self.Type, + Comments=self.Comments, + DataSource=self.DataSource, + Name=self.Name, + ) + + 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)] @@ -536,18 +1047,23 @@ def get_parts(self, epbunch): FromDay = epbunch["Start_Day_{}".format(i + 1)] ToDay = epbunch["End_Day_{}".format(i + 1)] parts.append( - YearScheduleParts( + YearSchedulePart( FromDay, FromMonth, ToDay, ToMonth, - self.all_objects[ - hash(("WeekSchedule", week_day_schedule_name, self.DataSource)) - ], + next( + ( + x + for x in self.CREATED_OBJECTS + if x.Name == week_day_schedule_name + and type(x).__name__ == "WeekSchedule" + ) + ), ) ) 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 249ec65d..bcd038b6 100644 --- a/archetypal/template/structure.py +++ b/archetypal/template/structure.py @@ -1,20 +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 archetypal.template import UmiBase, Unique, OpaqueMaterial, UniqueName +from validator_collection import validators + +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): - """Initialize a MassRatio object with parameters + def __init__(self, HighLoadRatio=None, Material=None, NormalRatio=None, **kwargs): + """Initialize a MassRatio object with parameters. Args: HighLoadRatio (float): @@ -25,109 +25,168 @@ def __init__(self, HighLoadRatio=None, Material=None, NormalRatio=None): 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 False + 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)}, NormalRatio=self.NormalRatio, ) + def mapping(self): + """Get a dict based on the object properties, useful for dict repr.""" + return dict( + HighLoadRatio=self.HighLoadRatio, + Material=self.Material, + NormalRatio=self.NormalRatio, + ) + + def get_unique(self): + """Return the first of all the created objects that is equivalent to self.""" + return self + @classmethod def generic(cls): - mat = OpaqueMaterial.generic() - return cls(HighLoadRatio=1, Material=mat, NormalRatio=1) + """Create generic MassRatio object.""" + mat = 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", + ) + return cls(HighLoadRatio=305, Material=mat, NormalRatio=305) + + def duplicate(self): + """Get copy of self.""" + return self.__copy__() + def __copy__(self): + """Create a copy of self.""" + return self.__class__(self.HighLoadRatio, self.Material, self.NormalRatio) -class StructureDefinition(UmiBase, metaclass=Unique): + +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(StructureDefinition, self).__init__(*args, **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__, self.Name, 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, StructureDefinition): - return False - 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 - def from_json(cls, *args, **kwargs): - """ + def from_dict(cls, data, materials, **kwargs): + """Create StructureInformation from a dictionary. + 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_dict(self): + """Return StructureInformation dictionary representation.""" + self.validate() # Validate object before trying to get json format - def to_json(self): data_dict = collections.OrderedDict() data_dict["$id"] = str(self.id) @@ -138,8 +197,65 @@ 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 + + def validate(self): + """Validate object and fill in missing values.""" + 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( + MassRatios=self.MassRatios, + 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 duplicate(self): + """Get copy of self.""" + return self.__copy__() + + 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( + [ + self.AssemblyCarbon == other.AssemblyCarbon, + self.AssemblyCost == other.AssemblyCost, + self.AssemblyEnergy == other.AssemblyEnergy, + self.DisassemblyCarbon == other.DisassemblyCarbon, + self.DisassemblyEnergy == other.DisassemblyEnergy, + self.MassRatios == other.MassRatios, + ] + ) + + 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 22e25e9f..d3c8c609 100644 --- a/archetypal/template/umi_base.py +++ b/archetypal/template/umi_base.py @@ -1,64 +1,31 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ - -import collections -import logging as lg +"""archetypal UmiBase module.""" + +import itertools import math -import random import re +from collections.abc import Hashable, MutableSet import numpy as np +from validator_collection import validators -from archetypal import log from archetypal.utils import lcm -class Unique(type): - """Metaclass that handles unique class instantiation based on the - :attr:`Name` attribute of a class. - """ - - def __call__(cls, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - self = cls.__new__(cls, *args, **kwargs) - cls.__init__(self, *args, **kwargs) - key = hash(self) - if key not in CREATED_OBJECTS: - cls._cache[key] = self - CREATED_OBJECTS[key] = self - return CREATED_OBJECTS[key] - - def __init__(cls, name, bases, attributes): - """ - Args: - name: - bases: - attributes: - """ - super().__init__(name, bases, attributes) - cls._cache = {} - - def _resolve_combined_names(predecessors): """Creates a unique name from the list of :class:`UmiBase` objects (predecessors) Args: - predecessors: + predecessors (MetaData): """ # all_names = [obj.Name for obj in predecessors] class_ = list(set([obj.__class__.__name__ for obj in predecessors]))[0] - return "Combined_%s_%s" % (class_, len(predecessors)) + return "Combined_%s_%s" % ( + class_, + str(hash((pre.Name for pre in predecessors))).strip("-"), + ) def _shorten_name(long_name): @@ -75,75 +42,161 @@ def _shorten_name(long_name): return long_name -def clear_cache(): - """Clear the dict of created object instances""" - CREATED_OBJECTS.clear() - - class UmiBase(object): + """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 __init__( self, - Name=None, - idf=None, + Name, Category="Uncategorized", Comments="", - DataSource="", - sql=None, - **kwargs + DataSource=None, + allow_duplicates=False, + **kwargs, ): """The UmiBase class handles common properties to all Template objects. 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 UmiTemplate. + Comments (str): A comment displayed in the UmiTemplateLibrary. DataSource (str): A description of the datasource of the object. This helps identify from which data is the current object created. - sql (dict of pandas.DataFrame): + allow_duplicates (bool): If True, this object can be equal to another one + if it has a different name. **kwargs: """ - super(UmiBase, self).__init__() + self.Name = Name - self.idf = idf - self.sql = sql self.Category = Category self.Comments = Comments - if DataSource == "": - try: - self.DataSource = self.idf.building_name(use_idfname=True) - except: - self.DataSource = DataSource - else: - self.DataSource = DataSource - self.all_objects = CREATED_OBJECTS - self.id = kwargs.get("$id", id(self)) - self._predecessors = MetaData() + self.DataSource = DataSource - def __str__(self): - """string representation of the object as id:Name""" - return ":".join([str(self.id), str(self.Name)]) + 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) + + @property + def Name(self): + """Get or set the name of the object.""" + return self._name + + @Name.setter + def Name(self, value): + self._name = validators.string(value, coerce_value=True) + + @property + def id(self): + """Get or set the id.""" + return self._id + + @id.setter + def id(self, 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 = 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 Comments(self): + """Get or set the object comments.""" + return self._comments + + @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 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: - return self._predecessors - else: - return MetaData([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 Args: - other (object): The other object. + other (UmiBase): The other object. """ predecessors = self.predecessors + other.predecessors - meta = { + meta = self.combine_meta(predecessors) + + return meta + + def combine_meta(self, predecessors): + return { "Name": _resolve_combined_names(predecessors), "Comments": ( "Object composed of a combination of these " @@ -151,11 +204,26 @@ def _get_predecessors_meta(self, other): "\n- ".join(set(obj.Name for obj in predecessors)) ) ), - "Category": ", ".join(set([obj.Category for obj in predecessors])), - "DataSource": ", ".join(set([obj.DataSource for obj in predecessors])), + "Category": ", ".join( + set( + itertools.chain(*[obj.Category.split(", ") for obj in predecessors]) + ) + ), + "DataSource": ", ".join( + set( + itertools.chain( + *[ + obj.DataSource.split(", ") + for obj in predecessors + if obj.DataSource is not None + ] + ) + ) + ), } - return meta + def combine(self, other, allow_duplicates=False): + pass def rename(self, name): """renames self as well as the cached object @@ -163,47 +231,50 @@ def rename(self, name): Args: name (str): the name. """ - self._cache.pop(hash(self)) - CREATED_OBJECTS.pop(hash(self)) - self.Name = name - self._cache[hash(self)] = self - CREATED_OBJECTS[hash(self)] = self - def to_json(self): - """Convert class properties to dict""" - return {"$id": "{}".format(self.id), "Name": "{}".format(UniqueName(self.Name))} - - def get_ref(self, ref): - """Gets item matching ref id + def to_dict(self): + """Return UmiBase dictionary representation.""" + return {"$id": "{}".format(self.id), "Name": "{}".format(self.Name)} - Args: - ref: - """ + @classmethod + def get_classref(cls, ref): return next( iter( - [ - value - for key, value in self.all_objects.items() - if value.id == ref["$ref"] - ] - ) + [value for value in UmiBase.CREATED_OBJECTS if value.id == ref["$ref"]] + ), + None, ) - def get_random_schedule(self): - """Return a random YearSchedule from cache""" - return random.choice( - [self.all_objects[obj] for obj in self.all_objects if "YearSchedule" in obj] - ) + 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. @@ -214,31 +285,36 @@ def _float_mean(self, other, attr, weights=None): weights (iterable, optional): Weights of [self, other] to calculate weighted average. """ - + if getattr(self, attr) is None: + return getattr(other, attr) + if getattr(other, attr) is None: + return getattr(self, attr) # If weights is a list of zeros if not np.array(weights).any(): weights = [1, 1] - if not isinstance(self.__dict__[attr], list) and not isinstance( - other.__dict__[attr], list + if not isinstance(getattr(self, attr), list) and not isinstance( + getattr(other, attr), list ): - if math.isnan(self.__dict__[attr]): - return other.__dict__[attr] - elif math.isnan(other.__dict__[attr]): - return self.__dict__[attr] - elif math.isnan(self.__dict__[attr]) and math.isnan(other.__dict__[attr]): + if math.isnan(getattr(self, attr)): + return getattr(other, attr) + elif math.isnan(getattr(other, attr)): + return getattr(self, attr) + elif math.isnan(getattr(self, attr)) and math.isnan(getattr(other, attr)): raise ValueError("Both values for self and other are Not A Number.") else: - return np.average( - [self.__dict__[attr], other.__dict__[attr]], weights=weights + return float( + np.average( + [getattr(self, attr), getattr(other, attr)], weights=weights + ) ) - elif self.__dict__[attr] is None and other.__dict__[attr] is None: + elif getattr(self, attr) is None and getattr(other, attr) is None: return None else: # handle arrays by finding the least common multiple of the two arrays and # tiling to the full length; then, apply average - self_attr_ = np.array(self.__dict__[attr]) - other_attr_ = np.array(other.__dict__[attr]) + self_attr_ = np.array(getattr(self, attr)) + other_attr_ = np.array(getattr(other, attr)) l_ = lcm(len(self_attr_), len(other_attr_)) self_attr_ = np.tile(self_attr_, int(l_ / len(self_attr_))) other_attr_ = np.tile(other_attr_, int(l_ / len(other_attr_))) @@ -255,18 +331,22 @@ def _str_mean(self, other, attr, append=False): together. If False, the attribute of self will is used (other is ignored). """ + if self is None: + return other + if other is None: + return self # if self has info, but other is none, use self - if self.__dict__[attr] is not None and other.__dict__[attr] is None: - return self.__dict__[attr] + if getattr(self, attr) is not None and getattr(other, attr) is None: + return getattr(self, attr) # if self is none, but other is not none, use other - elif self.__dict__[attr] is None and other.__dict__[attr] is not None: - return other.__dict__[attr] + elif getattr(self, attr) is None and getattr(other, attr) is not None: + return getattr(other, attr) # if both are not note, impose self - elif self.__dict__[attr] and other.__dict__[attr]: + elif getattr(self, attr) and getattr(other, attr): if append: - return self.__dict__[attr] + other.__dict__[attr] + return getattr(self, attr) + getattr(other, attr) else: - return self.__dict__[attr] + return getattr(self, attr) # if both are None, return None else: return None @@ -277,9 +357,9 @@ def __iadd__(self, other): Args: other: """ - return self.extend(other) + return UmiBase.extend(self, other, allow_duplicates=True) - def extend(self, other): + def extend(self, other, allow_duplicates): """Append other to self. Modify and return self. Args: @@ -288,318 +368,171 @@ def extend(self, other): Returns: UmiBase: self """ - self.all_objects.pop(self.__hash__(), None) + if self is None: + return other + if other is None: + return self + self.CREATED_OBJECTS.remove(self) id = self.id - new_obj = self.combine(other) - new_obj.__dict__.pop("id") + new_obj = self.combine(other, allow_duplicates=allow_duplicates) new_obj.id = id - name = new_obj.__dict__.pop("Name") - self.__dict__.update(Name=name, **new_obj.__dict__) - self.all_objects[self.__hash__()] = 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 -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, - Cost=0, - EmbodiedCarbon=0, - EmbodiedEnergy=0, - SubstitutionTimestep=100, - TransportCarbon=0, - TransportDistance=0, - TransportEnergy=0, - SubstitutionRatePattern=None, - Conductivity=2.4, - Density=2400, - **kwargs - ): - """Initialize a MaterialBase object with parameters: + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. Args: - 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. + validate (bool): If True, try to validate object before returning the + mapping. """ - super(MaterialBase, self).__init__(**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__, self.Name)) + if validate: + self.validate() + + return dict( + id=self.id, + Name=self.Name, + Category=self.Category, + Comments=self.Comments, + DataSource=self.DataSource, + ) - def __eq__(self, other): - if not isinstance(other, MaterialBase): - return False + def get_unique(self): + """Return first object matching equality in the list of instantiated objects.""" + if self.allow_duplicates: + # We want to return the first similar object (equality) that has this name. + obj = next( + iter( + sorted( + ( + x + for x in UmiBase.CREATED_OBJECTS + if x == self + and x.Name == self.Name + and type(x) == type(self) + ), + key=lambda x: x.unit_number, + ) + ), + self, + ) 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, - self.SubstitutionRatePattern == other.SubstitutionRatePattern, - self.Conductivity == other.Conductivity, - self.Density == other.Density, - ] + # We want to return the first similar object (equality) regardless of the + # name. + obj = next( + iter( + sorted( + ( + x + for x in UmiBase.CREATED_OBJECTS + if x == self and type(x) == type(self) + ), + key=lambda x: x.unit_number, + ) + ), + self, ) + return obj -CREATED_OBJECTS = {} +class UserSet(Hashable, MutableSet): + """UserSet class.""" -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. - """ + __hash__ = MutableSet._hash - def __init__(self, Material, Thickness): - """Initialize a MaterialLayer object with parameters: + def __init__(self, iterable=()): + """Initialize object.""" + self.data = set(iterable) - Args: - Material (OpaqueMaterial, GlazingMaterial, GasMaterial): - Thickness (float): The thickness of the material in the - construction. - """ - if Thickness < 0.003: - log( - "Modeling layers thinner (less) than 0.003 m is not " - "recommended; rather, add those properties to one of the " - 'adjacent layers. Layer "%s"' % Material.Name, - lg.WARNING, - ) - self.Thickness = Thickness - self.Material = Material + def __contains__(self, value): + """Assert value is in self.data.""" + return value in self.data - def __hash__(self): - return id(self) + def __iter__(self): + """Iterate over self.data.""" + return iter(self.data) - def __eq__(self, other): - if not isinstance(other, MaterialLayer): - return False - else: - return all( - [self.Thickness == other.Thickness, self.Material == other.Material] - ) + def __len__(self): + """return len of self.""" + return len(self.data) def __repr__(self): - return "{} with thickness of {:,.3f} m".format(self.Material, self.Thickness) + """Return a representation of self.""" + return repr(self.data) - @property - def r_value(self): - """float: The Thermal Resistance of the :class:`MaterialLayer`""" - return self.Thickness / self.Material.Conductivity # (K⋅m2/W) + def __add__(self, other): + """Add other to self.""" + self.data.update(other.data) + return self - @property - def u_value(self): - """float: The overall heat transfer coefficient of the - :class:`MaterialLayer`. Expressed in W/(m2⋅K) - """ - return 1 / self.r_value + def update(self, other): + """Update self with other.""" + self.data.update(other.data) + return self - @property - def specific_heat(self): - """float: The Material's specific heat J/kg-K""" - return self.Material.SpecificHeat + def add(self, item): + """Add an item.""" + self.data.add(item) - def to_dict(self): - return collections.OrderedDict( - Material={"$ref": str(self.Material.id)}, Thickness=self.Thickness - ) + def discard(self, item): + """Remove a class if it is currently present.""" + self.data.discard(item) -class MetaData(collections.UserList): +class MetaData(UserSet): """Handles data of combined objects such as Name, Comments and other.""" @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): - """ - Args: - datastore: - """ - from archetypal import ( - GasMaterial, - GlazingMaterial, - OpaqueMaterial, - OpaqueConstruction, - WindowConstruction, - StructureDefinition, - DaySchedule, - WeekSchedule, - YearSchedule, - DomesticHotWaterSetting, - VentilationSetting, - ZoneConditioning, - ZoneConstructionSet, - ZoneLoad, - Zone, - BuildingTemplate, - ) - - loading_json_list = [] - loading_json_list.append( - [GasMaterial.from_json(**store) for store in datastore["GasMaterials"]] - ) - loading_json_list.append( - [GlazingMaterial(**store) for store in datastore["GlazingMaterials"]] - ) - loading_json_list.append( - [OpaqueMaterial(**store) for store in datastore["OpaqueMaterials"]] - ) - loading_json_list.append( - [ - OpaqueConstruction.from_json(**store) - for store in datastore["OpaqueConstructions"] - ] - ) - loading_json_list.append( - [ - WindowConstruction.from_json(**store) - for store in datastore["WindowConstructions"] - ] - ) - loading_json_list.append( - [ - StructureDefinition.from_json(**store) - for store in datastore["StructureDefinitions"] - ] - ) - loading_json_list.append( - [DaySchedule.from_json(**store) for store in datastore["DaySchedules"]] - ) - loading_json_list.append( - [WeekSchedule.from_json(**store) for store in datastore["WeekSchedules"]] - ) - loading_json_list.append( - [YearSchedule.from_json(**store) for store in datastore["YearSchedules"]] - ) - loading_json_list.append( - [ - DomesticHotWaterSetting.from_json(**store) - for store in datastore["DomesticHotWaterSettings"] - ] - ) - loading_json_list.append( - [ - VentilationSetting.from_json(**store) - for store in datastore["VentilationSettings"] - ] - ) - loading_json_list.append( - [ - ZoneConditioning.from_json(**store) - for store in datastore["ZoneConditionings"] - ] - ) - loading_json_list.append( - [ - ZoneConstructionSet.from_json(**store) - for store in datastore["ZoneConstructionSets"] - ] - ) - loading_json_list.append( - [ZoneLoad.from_json(**store) for store in datastore["ZoneLoads"]] - ) - loading_json_list.append([Zone.from_json(**store) for store in datastore["Zones"]]) - loading_json_list.append( - [ - BuildingTemplate.from_json(**store) - for store in datastore["BuildingTemplates"] - ] - ) - return loading_json_list - - 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 = {} # a dict to store the created names + 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: """ if not name: return None - key = name - key, *_ = re.split( - r"_\d+(?!.*\d+)", key - ) # match last digit with the underscore - - if key not in cls.existing: - cls.existing[key] = 0 + if name not in cls.existing: + cls.existing.add(name) return name - cls.existing[key] += 1 - the_name = key + "_{}".format(cls.existing[key]) - return the_name + else: + match = re.match(r"^(.*?)(\D*)(\d+)$", name) + if match: + groups = list(match.groups()) + pad = len(groups[-1]) + groups[-1] = int(groups[-1]) + groups[-1] += 1 + groups[-1] = str(groups[-1]).zfill(pad) + name = "".join(map(str, groups)) + return cls.create_unique(name) + else: + return cls.create_unique(name + "_1") diff --git a/archetypal/template/ventilation.py b/archetypal/template/ventilation.py index 38afd747..100835df 100644 --- a/archetypal/template/ventilation.py +++ b/archetypal/template/ventilation.py @@ -1,23 +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 sigfig import round +from validator_collection import checkers, validators -import archetypal -from archetypal import log, timeit, settings, top, weighted_mean -from archetypal.template import UmiBase, Unique, 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: @@ -27,53 +27,102 @@ def resolve_temp(temp, idf): if isinstance(temp, float): return temp elif isinstance(temp, str): - sched = archetypal.UmiSchedule(Name=temp, idf=idf) - return sched.values.mean() + 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, metaclass=Unique): - """Zone Ventilation Settings + +class VentilationSetting(UmiBase): + """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, optional): The name of the schedule + 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, 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): - 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). @@ -109,132 +158,415 @@ 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 self.NatVentZoneTempSetpoint = NatVentZoneTempSetpoint 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 - self._belongs_to_zone = kwargs.get("zone", None) + @property + def NatVentSchedule(self): + """Get or set the natural ventilation schedule. - def __add__(self, other): - return self.combine(other) + 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 + + @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): + """Get or set the infiltration air change rate [ach].""" + return self._infiltration + + @Infiltration.setter + def Infiltration(self, 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 - def __hash__(self): - return hash((self.__class__.__name__, self.Name, self.DataSource)) + @property + def NatVentMaxOutdoorAirTemp(self): + """Get or set the natural ventilation maximum outdoor air temperature [degC].""" + return self._natural_ventilation_max_outdoor_air_temp - def __eq__(self, other): - if not isinstance(other, VentilationSetting): - return False - 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, - ] + @NatVentMaxOutdoorAirTemp.setter + def NatVentMaxOutdoorAirTemp(self, value): + self._natural_ventilation_max_outdoor_air_temp = validators.float( + value, minimum=-100, maximum=100 + ) + + @property + def NatVentMaxRelHumidity(self): + """Get or set the natural ventilation relative humidity setpoint [%].""" + return self._natural_ventilation_max_relative_humidity + + @NatVentMaxRelHumidity.setter + def NatVentMaxRelHumidity(self, value): + self._natural_ventilation_max_relative_humidity = validators.float( + value, minimum=0, maximum=100 + ) + + @property + def NatVentMinOutdoorAirTemp(self): + """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._natural_ventilation_min_outdoor_air_temp = validators.float( + value, minimum=-100, maximum=100 + ) + + @property + def NatVentZoneTempSetpoint(self): + """Get or set the natural ventilation zone temperature setpoint [degC].""" + return self._natural_ventilation_zone_setpoint_temp + + @NatVentZoneTempSetpoint.setter + def NatVentZoneTempSetpoint(self, value): + self._natural_ventilation_zone_setpoint_temp = validators.float( + value, + minimum=self.NatVentMinOutdoorAirTemp, + maximum=self.NatVentMaxOutdoorAirTemp, + ) + + @property + def ScheduledVentilationAch(self): + """Get or set the scheduled ventilation air changes per hours [-].""" + return self._scheduled_ventilation_ach + + @ScheduledVentilationAch.setter + def ScheduledVentilationAch(self, value): + if value is None: + value = 0 + self._scheduled_ventilation_ach = validators.float(value, minimum=0) + + @property + def ScheduledVentilationSetpoint(self): + """Get or set the scheduled ventilation setpoint.""" + return self._scheduled_ventilation_setpoint + + @ScheduledVentilationSetpoint.setter + def ScheduledVentilationSetpoint(self, value): + self._scheduled_ventilation_setpoint = validators.float( + value, minimum=-100, maximum=100 + ) + + @property + def VentilationType(self): + """Get or set the ventilation type. + + 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 + + @property + def area(self): + """Get or set the area of the zone [m²].""" + return self._area + + @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 + + @volume.setter + def volume(self, value): + self._volume = validators.float(value, minimum=0) @classmethod - def from_json(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() data_dict["$id"] = str(self.id) data_dict["Afn"] = self.Afn data_dict["IsBuoyancyOn"] = self.IsBuoyancyOn - data_dict["Infiltration"] = self.Infiltration + data_dict["Infiltration"] = round(self.Infiltration, 3) data_dict["IsInfiltrationOn"] = self.IsInfiltrationOn data_dict["IsNatVentOn"] = self.IsNatVentOn data_dict["IsScheduledVentilationOn"] = self.IsScheduledVentilationOn - data_dict["NatVentMaxRelHumidity"] = self.NatVentMaxRelHumidity - data_dict["NatVentMaxOutdoorAirTemp"] = self.NatVentMaxOutdoorAirTemp - data_dict["NatVentMinOutdoorAirTemp"] = self.NatVentMinOutdoorAirTemp - data_dict["NatVentSchedule"] = self.NatVentSchedule.to_dict() - data_dict["NatVentZoneTempSetpoint"] = self.NatVentZoneTempSetpoint - data_dict["ScheduledVentilationAch"] = self.ScheduledVentilationAch + 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_ref() + data_dict["NatVentZoneTempSetpoint"] = round(self.NatVentZoneTempSetpoint, 3) + data_dict["ScheduledVentilationAch"] = round(self.ScheduledVentilationAch, 3) data_dict[ "ScheduledVentilationSchedule" - ] = self.ScheduledVentilationSchedule.to_dict() - data_dict["ScheduledVentilationSetpoint"] = self.ScheduledVentilationSetpoint + ] = 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): - """ + def from_zone(cls, zone, zone_ep, **kwargs): + """Create VentilationSetting from a zone object. Args: - zone (archetypal.template.zone.Zone): zone to gets information from + zone_ep: + zone (template.zone.Zone): zone to gets information from """ - + # If Zone is not part of Conditioned Area, it should not have a + # VentilationSetting object. + if not zone.is_part_of_total_floor_area: + return None name = zone.Name + "_VentilationSetting" - df = {"a": zone.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 - IsNatVentOn, IsWindOn, IsBuoyancyOn, NatVentMaxOutdoorAirTemp, NatVentMaxRelHumidity, NatVentMinOutdoorAirTemp, NatVentSchedule, NatVentZoneTempSetpoint = do_natural_ventilation( - index, nat_df, zone - ) + ( + IsNatVentOn, + IsWindOn, + IsBuoyancyOn, + NatVentMaxOutdoorAirTemp, + NatVentMaxRelHumidity, + NatVentMinOutdoorAirTemp, + NatVentSchedule, + NatVentZoneTempSetpoint, + ) = do_natural_ventilation(index, nat_df, zone, zone_ep) # Do scheduled ventilation - ScheduledVentilationSchedule, IsScheduledVentilationOn, ScheduledVentilationAch, ScheduledVentilationSetpoint = do_scheduled_ventilation( - index, sched_df, zone - ) + ( + ScheduledVentilationSchedule, + IsScheduledVentilationOn, + ScheduledVentilationAch, + ScheduledVentilationSetpoint, + ) = do_scheduled_ventilation(index, sched_df, zone) z_vent = cls( Name=name, @@ -253,23 +585,37 @@ def from_zone(cls, zone): IsScheduledVentilationOn=IsScheduledVentilationOn, ScheduledVentilationAch=ScheduledVentilationAch, ScheduledVentilationSetpoint=ScheduledVentilationSetpoint, - idf=zone.idf, - Category=zone.idf.building_name(use_idfname=True), + 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 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__): msg = "Cannot combine %s with %s" % ( @@ -278,83 +624,327 @@ 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__, - ) + # create a new object with the combined attributes + new_obj = self.__class__( + 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 + + def validate(self): + """Validate object and fill in missing values.""" + if not self.NatVentSchedule: + self.NatVentSchedule = UmiSchedule.constant_schedule( + value=0, Name="AlwaysOff", allow_duplicates=True + ) + if not self.ScheduledVentilationSchedule: + self.ScheduledVentilationSchedule = UmiSchedule.constant_schedule( + value=0, Name="AlwaysOff", allow_duplicates=True ) - a = self.NatVentSchedule.combine(other.NatVentSchedule, weights) - b = self.ScheduledVentilationSchedule.combine( - other.ScheduledVentilationSchedule, weights + return self + + def mapping(self, validate=True): + """Get a dict based on the object properties, useful for dict repr. + + Args: + validate: + """ + self.validate() + + return dict( + Afn=self.Afn, + IsBuoyancyOn=self.IsBuoyancyOn, + Infiltration=self.Infiltration, + IsInfiltrationOn=self.IsInfiltrationOn, + IsNatVentOn=self.IsNatVentOn, + IsScheduledVentilationOn=self.IsScheduledVentilationOn, + NatVentMaxRelHumidity=self.NatVentMaxRelHumidity, + NatVentMaxOutdoorAirTemp=self.NatVentMaxOutdoorAirTemp, + NatVentMinOutdoorAirTemp=self.NatVentMinOutdoorAirTemp, + NatVentSchedule=self.NatVentSchedule, + NatVentZoneTempSetpoint=self.NatVentZoneTempSetpoint, + ScheduledVentilationAch=self.ScheduledVentilationAch, + ScheduledVentilationSchedule=self.ScheduledVentilationSchedule, + ScheduledVentilationSetpoint=self.ScheduledVentilationSetpoint, + IsWindOn=self.IsWindOn, + 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): + """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) ) - 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) - - 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, + + 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, ) - # create a new object with the previous attributes - new_obj = self.__class__(**meta, **attr) - new_obj._predecessors.extend(self.predecessors + other.predecessors) - return new_obj + 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. -def do_infiltration(index, inf_df, zone): - """Gets infiltration information of the zone + Notes: + Note that attr:`IsInfiltrationOn`, attr:`IsScheduledVentilationOn` and + attr:`IsNatVentOn` must be `True` for their respective EpBunch objects + to be created. + + Args: + 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. + """ + 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): + """Get infiltration information of the zone. Args: index (tuple): Zone name inf_df (dataframe): Dataframe with infiltration information for each - zone - zone (archetypal.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: @@ -363,43 +953,49 @@ 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 (archetypal.template.zone.Zone): zone to gets information from + zone (template.zone.Zone): zone to gets information from """ if not nat_df.empty: try: IsNatVentOn = any(nat_df.loc[index, "Name"]) schedule_name_ = nat_df.loc[index, "Schedule Name"] - NatVentSchedule = archetypal.UmiSchedule(Name=schedule_name_, idf=zone.idf) + quantity = nat_df.loc[index, "Volume Flow Rate/Floor Area {m3/s/m2}"] + if schedule_name_.upper() in zone.idf.schedules_dict: + epbunch = zone.idf.schedules_dict[schedule_name_.upper()] + NatVentSchedule = UmiSchedule.from_epbunch(epbunch, quantity=quantity) + else: + raise KeyError except KeyError: # todo: For some reason, a ZoneVentilation:WindandStackOpenArea # 'Opening Area Fraction Schedule Name' is read as Constant-0.0 # 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 = archetypal.UmiSchedule.constant_schedule(idf=zone.idf) + NatVentSchedule = UmiSchedule.constant_schedule(allow_duplicates=True) except Exception: IsNatVentOn = False - NatVentSchedule = archetypal.UmiSchedule.constant_schedule(idf=zone.idf) + 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. @@ -410,14 +1006,16 @@ def do_natural_ventilation(index, nat_df, zone): else: IsNatVentOn = False - NatVentSchedule = archetypal.UmiSchedule.constant_schedule(idf=zone.idf) + 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: @@ -437,35 +1035,34 @@ 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 scd_df: - zone (archetypal.template.zone.Zone): zone to gets information from + zone (template.zone.Zone): zone to gets information from """ if not scd_df.empty: try: IsScheduledVentilationOn = any(scd_df.loc[index, "Name"]) schedule_name_ = scd_df.loc[index, "Schedule Name"] - ScheduledVentilationSchedule = archetypal.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"], + scd_df.loc[index, "Minimum Indoor Temperature{C}/Schedule"], zone.idf, ) - except: - ScheduledVentilationSchedule = archetypal.UmiSchedule.constant_schedule( - hourly_value=0, idf=zone.idf, Name="AlwaysOff" + except Exception: + ScheduledVentilationSchedule = UmiSchedule.constant_schedule( + value=0, Name="AlwaysOff", allow_duplicates=True ) IsScheduledVentilationOn = False ScheduledVentilationAch = 0 ScheduledVentilationSetpoint = 18 else: - ScheduledVentilationSchedule = archetypal.UmiSchedule.constant_schedule( - hourly_value=0, idf=zone.idf, Name="AlwaysOff" + ScheduledVentilationSchedule = UmiSchedule.constant_schedule( + value=0, Name="AlwaysOff", allow_duplicates=True ) IsScheduledVentilationOn = False ScheduledVentilationAch = 0 @@ -479,6 +1076,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 @@ -495,6 +1093,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 @@ -511,19 +1110,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" @@ -554,19 +1146,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" @@ -602,10 +1187,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: @@ -682,20 +1267,15 @@ def nominal_ventilation_aggregation(x): df = pd.DataFrame(how_dict, index=range(0, 1)) # range should always be # one since we are trying to merge zones except Exception as e: - print("{}".format(e)) + log("{}".format(e)) else: return df 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.py deleted file mode 100644 index 6c8144c9..00000000 --- a/archetypal/template/window.py +++ /dev/null @@ -1,764 +0,0 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ - -import collections -import logging as lg -from enum import IntEnum -from functools import reduce - -import tabulate -from archetypal import log, IDF, calc_simple_glazing, timeit -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, Unique -from eppy.bunch_subclass import EpBunch - - -class WindowConstruction(UmiBase, metaclass=Unique): - """ - $id, AssemblyCarbon, AssemblyCost, AssemblyEnergy, Category, Comments, - DataSource, DisassemblyCarbon, DisassemblyEnergy, Layers, Name, Type - """ - - def __init__( - self, - Category="Double", - AssemblyCarbon=0, - AssemblyCost=0, - AssemblyEnergy=0, - DisassemblyCarbon=0, - DisassemblyEnergy=0, - **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. - **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 = None - - def __hash__(self): - return hash((self.__class__.__name__, self.Name, self.DataSource)) - - def __eq__(self, other): - if not isinstance(other, WindowConstruction): - return False - 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, - ] - ) - - @classmethod - def from_json(cls, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - 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): - """WindowConstruction from idf Construction Name. - - Example: - >>> import archetypal as ar - >>> idf = ar.load_idf("myidf") - >>> construction_name = "Some construction name" - >>> ar.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() - catdict = {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""" - 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 layers(self): - """Retrieve layers for the WindowConstruction""" - c = self.idf.getobject("CONSTRUCTION", self.Name) - layers = [] - for field in c.fieldnames: - # Loop through the layers from the outside layer towards the - # indoor layers and get the material they are made of. - material = c.get_referenced_object(field) - 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 UmiTemplate 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"] - ) - 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. - - """ - return self - - -class WindowType(IntEnum): - External = 0 - Internal = 1 - - -class WindowSetting(UmiBase, metaclass=Unique): - """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. - - .. image:: ../images/template/zoneinfo-windows.png - - Classmethods: - The WindowSetting class implements two constructors that are tailored to - the eppy_ scripting language: - - - :func:`from_construction` and - - :func:`from_surface`. - - .. _eppy : https://eppy.readthedocs.io/en/latest/ - """ - - def __init__( - self, - Construction=None, - OperableArea=0.8, - AfnWindowAvailability=None, - AfnDischargeC=0.65, - AfnTempSetpoint=20, - IsVirtualPartition=False, - IsShadingSystemOn=False, - ShadingSystemAvailabilitySchedule=None, - ShadingSystemSetpoint=180, - ShadingSystemTransmittance=0.5, - ShadingSystemType=0, - Type=WindowType.External, - IsZoneMixingOn=False, - ZoneMixingAvailabilitySchedule=None, - ZoneMixingDeltaTemperature=2, - ZoneMixingFlowRate=0.001, - **kwargs - ): - """Initialize a WindowSetting using default values: - - Args: - Construction (WindowConstruction): The window construction. - OperableArea (float): The operable window area as a ratio of total - window area. eg. 0.8 := 80% of the windows area is operable. - AfnWindowAvailability: - AfnDischargeC (float): Airflow Network Discharge Coefficient. - Default = 0.65. - AfnTempSetpoint (float): Airflow Network Temperature Setpoint. - Default = 20 degreeC. - IsVirtualPartition (bool): Virtual Partition. - IsShadingSystemOn (bool): Shading is used. Default is False. - ShadingSystemAvailabilitySchedule (UmiSchedule): Shading system - availability schedule. - ShadingSystemSetpoint (float): Shading system setpoint in units of - W/m2. Default = 180 W/m2. - ShadingSystemTransmittance (float): Shading system transmittance. - Default = 0.5. - ShadingSystemType (int): Shading System Type. 0 = ExteriorShade, 1 = - InteriorShade. - Type (int): - IsZoneMixingOn (bool): Zone mixing. - ZoneMixingAvailabilitySchedule (UmiSchedule): Zone mixing - availability schedule. - ZoneMixingDeltaTemperature (float): Zone mixing delta - ZoneMixingFlowRate (float): Zone mixing flow rate in units of m3/m2. - Default = 0.001 m3/m2. - **kwargs: other keywords passed to the constructor. - """ - super(WindowSetting, self).__init__(**kwargs) - - self.ZoneMixingAvailabilitySchedule = ZoneMixingAvailabilitySchedule - self.ShadingSystemAvailabilitySchedule = ShadingSystemAvailabilitySchedule - self.Construction = Construction - self.AfnWindowAvailability = AfnWindowAvailability - self.AfnDischargeC = AfnDischargeC - self.AfnTempSetpoint = AfnTempSetpoint - self.IsShadingSystemOn = IsShadingSystemOn - self.IsVirtualPartition = IsVirtualPartition - self.IsZoneMixingOn = IsZoneMixingOn - self.OperableArea = OperableArea - self.ShadingSystemSetpoint = ShadingSystemSetpoint - self.ShadingSystemTransmittance = ShadingSystemTransmittance - self.ShadingSystemType = ShadingSystemType - self.Type = Type # Todo: Could be deprecated - self.ZoneMixingDeltaTemperature = ZoneMixingDeltaTemperature - self.ZoneMixingFlowRate = ZoneMixingFlowRate - - def __add__(self, other): - return self.combine(other) - - def __repr__(self): - v_ = [ - (k, v) for k, v in self.__dict__.items() if not isinstance(v, (dict, IDF)) - ] - header = "{}: <{}>\n".format(self.Name, self.__class__.mro()[0].__name__) - return header + tabulate.tabulate(v_, tablefmt="plain") - - def __str__(self): - return repr(self) - - def __hash__(self): - return hash((self.__class__.__name__, self.Name, self.DataSource)) - - def __eq__(self, other): - if not isinstance(other, WindowSetting): - return False - else: - return all( - [ - self.Construction == other.Construction, - self.OperableArea == other.OperableArea, - self.AfnWindowAvailability == other.AfnWindowAvailability, - self.AfnDischargeC == other.AfnDischargeC, - self.AfnTempSetpoint == other.AfnTempSetpoint, - self.IsVirtualPartition == other.IsVirtualPartition, - self.IsShadingSystemOn == other.IsShadingSystemOn, - self.ShadingSystemAvailabilitySchedule - == other.ShadingSystemAvailabilitySchedule, - self.ShadingSystemSetpoint == other.ShadingSystemSetpoint, - self.ShadingSystemTransmittance == other.ShadingSystemTransmittance, - self.ShadingSystemType == other.ShadingSystemType, - self.Type == other.Type, - self.IsZoneMixingOn == other.IsZoneMixingOn, - self.ZoneMixingAvailabilitySchedule - == other.ZoneMixingAvailabilitySchedule, - self.ZoneMixingDeltaTemperature == other.ZoneMixingDeltaTemperature, - self.ZoneMixingFlowRate == other.ZoneMixingFlowRate, - ] - ) - - @classmethod - def generic(cls, idf): - """Returns a generic window with SHGC=0.704, UFactor=2.703, Tvis=0.786 - - Args: - idf (IDF): - """ - idf.add_object( - "WindowMaterial:SimpleGlazingSystem".upper(), - Name="SimpleWindow:SINGLE PANE HW WINDOW", - UFactor=2.703, - Solar_Heat_Gain_Coefficient=0.704, - Visible_Transmittance=0.786, - save=False, - ) - - constr = idf.add_object( - "CONSTRUCTION", - Name="SINGLE PANE HW WINDOW", - Outside_Layer="SimpleWindow:SINGLE PANE HW WINDOW", - save=False, - ) - return cls.from_construction(Construction=constr) - - @classmethod - def from_construction(cls, Construction, **kwargs): - """Make a :class:`WindowSetting` directly from a Construction_ object. - - .. _Construction : https://bigladdersoftware.com/epx/docs/8-9/input - -output-reference/group-surface-construction-elements.html - #construction-000 - - Examples: - >>> import archetypal as ar - >>> # Given an IDF object - >>> idf = ar.load_idf("idfname") - >>> construction = idf.getobject('CONSTRUCTION', - >>> 'AEDG-SmOffice 1A Window Fixed') - >>> ar.WindowSetting.from_construction(Name='test_window', - >>> Construction=construction) - - Args: - Construction (EpBunch): The construction name for this window. - **kwargs: Other keywords passed to the constructor. - - Returns: - (windowSetting): The window setting object. - """ - name = kwargs.pop("Name", Construction.Name + "_Window") - kwargs["Name"] = name - w = cls(idf=Construction.theidf, **kwargs) - w.Construction = WindowConstruction.from_epbunch(Construction) - w.AfnWindowAvailability = UmiSchedule.constant_schedule(idf=Construction.theidf) - w.ShadingSystemAvailabilitySchedule = UmiSchedule.constant_schedule( - idf=Construction.theidf - ) - w.ZoneMixingAvailabilitySchedule = UmiSchedule.constant_schedule( - idf=Construction.theidf - ) - return w - - @classmethod - def from_surface(cls, surface): - """Build a WindowSetting object from a FenestrationSurface:Detailed_ - object. This constructor will detect common window constructions and - shading devices. Supported Shading and Natural Air flow EnergyPlus - objects are: WindowProperty:ShadingControl_, - AirflowNetwork:MultiZone:Surface_. - - Important: - If an EnergyPlus object is not supported, eg.: - AirflowNetwork:MultiZone:Component:DetailedOpening_, only a warning - will be issued in the console for the related object instance and - default values will be automatically used. - - .. _FenestrationSurface:Detailed: - https://bigladdersoftware.com/epx/docs/8-9/input-output-reference - /group-thermal-zone-description-geometry.html - #fenestrationsurfacedetailed - .. _WindowProperty:ShadingControl: - https://bigladdersoftware.com/epx/docs/8-9/input-output-reference - /group-thermal-zone-description-geometry.html - #windowpropertyshadingcontrol - .. _AirflowNetwork:MultiZone:Surface: - https://bigladdersoftware.com/epx/docs/8-9/input-output-reference - /group-airflow-network.html#airflownetworkmultizonesurface - .. _AirflowNetwork:MultiZone:Component:DetailedOpening: - https://bigladdersoftware.com/epx/docs/8-9/input-output-reference - /group-airflow-network.html - #airflownetworkmultizonecomponentdetailedopening - - Args: - surface (EpBunch): The FenestrationSurface:Detailed_ object. - - Returns: - (WindowSetting): The window setting object. - """ - if isinstance(surface, EpBunch) and not surface.Surface_Type.upper() == "DOOR": - construction = surface.get_referenced_object("Construction_Name") - construction = WindowConstruction.from_epbunch(construction) - name = surface.Name - shading_control = surface.get_referenced_object("Shading_Control_Name") - attr = {} - if shading_control: - # a WindowProperty:ShadingControl_ object can be attached to - # this window - attr["IsShadingSystemOn"] = True - if shading_control["Setpoint"] != "": - attr["ShadingSystemSetpoint"] = shading_control["Setpoint"] - shade_mat = shading_control.get_referenced_object( - "Shading_Device_Material_Name" - ) - # get shading transmittance - if shade_mat: - attr["ShadingSystemTransmittance"] = shade_mat[ - "Visible_Transmittance" - ] - # 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 - ) - else: - # Determine which behavior of control - shade_ctrl_type = shading_control["Shading_Control_Type"] - if shade_ctrl_type.lower() == "alwaysoff": - attr[ - "ShadingSystemAvailabilitySchedule" - ] = UmiSchedule.constant_schedule( - idf=surface.theidf, name="AlwaysOff", hourly_value=0 - ) - elif shade_ctrl_type.lower() == "alwayson": - attr[ - "ShadingSystemAvailabilitySchedule" - ] = UmiSchedule.constant_schedule(idf=surface.theidf) - else: - log( - 'Window "{}" uses a window control type that ' - 'is not supported: "{}". Reverting to ' - '"AlwaysOn"'.format(name, shade_ctrl_type), - lg.WARN, - ) - attr[ - "ShadingSystemAvailabilitySchedule" - ] = UmiSchedule.constant_schedule(idf=surface.theidf) - # get shading type - if shading_control["Shading_Type"] != "": - mapping = { - "InteriorShade": WindowType(1), - "ExteriorShade": WindowType(0), - "ExteriorScreen": WindowType(0), - "InteriorBlind": WindowType(1), - "ExteriorBlind": WindowType(0), - "BetweenGlassShade": WindowType(0), - "BetweenGlassBlind": WindowType(0), - "SwitchableGlazing": WindowType(0), - } - attr["ShadingSystemType"] = mapping[shading_control["Shading_Type"]] - else: - # Set default schedules - attr[ - "ShadingSystemAvailabilitySchedule" - ] = UmiSchedule.constant_schedule(idf=surface.theidf) - - # get airflow network - afn = next( - iter( - surface.getreferingobjs( - iddgroups=["Natural Ventilation and Duct Leakage"], - fields=["Surface_Name"], - ) - ), - None, - ) - if afn: - attr["OperableArea"] = afn.WindowDoor_Opening_Factor_or_Crack_Factor - leak = afn.get_referenced_object("Leakage_Component_Name") - name = afn["Venting_Availability_Schedule_Name"] - if name != "": - attr["AfnWindowAvailability"] = UmiSchedule( - Name=name, idf=surface.theidf - ) - else: - attr["AfnWindowAvailability"] = UmiSchedule.constant_schedule( - idf=surface.theidf - ) - name = afn[ - "Ventilation_Control_Zone_Temperature_Setpoint_Schedule_Name" - ] - if name != "": - attr["AfnTempSetpoint"] = UmiSchedule( - Name=name, idf=surface.theidf - ).mean - else: - pass # uses default - - if ( - leak.key.upper() - == "AIRFLOWNETWORK:MULTIZONE:SURFACE:EFFECTIVELEAKAGEAREA" - ): - attr["AfnDischargeC"] = leak["Discharge_Coefficient"] - elif ( - leak.key.upper() - == "AIRFLOWNETWORK:MULTIZONE:COMPONENT:HORIZONTALOPENING" - ): - log( - '"{}" is not fully supported. Rerverting to ' - 'defaults for object "{}"'.format( - leak.key, cls.mro()[0].__name__ - ), - lg.WARNING, - ) - elif leak.key.upper() == "AIRFLOWNETWORK:MULTIZONE:SURFACE:CRACK": - log( - '"{}" is not fully supported. Rerverting to ' - 'defaults for object "{}"'.format( - leak.key, cls.mro()[0].__name__ - ), - lg.WARNING, - ) - elif ( - leak.key.upper() - == "AIRFLOWNETWORK:MULTIZONE:COMPONENT:DETAILEDOPENING" - ): - log( - '"{}" is not fully supported. Rerverting to ' - 'defaults for object "{}"'.format( - leak.key, cls.mro()[0].__name__ - ), - lg.WARNING, - ) - elif ( - leak.key.upper() - == "AIRFLOWNETWORK:MULTIZONE:COMPONENT:ZONEEXHAUSTFAN" - ): - log( - '"{}" is not fully supported. Rerverting to ' - 'defaults for object "{}"'.format( - leak.key, cls.mro()[0].__name__ - ), - lg.WARNING, - ) - elif ( - leak.key.upper() - == "AIRFLOWNETWORK:MULTIZONE:COMPONENT:SIMPLEOPENING" - ): - log( - '"{}" is not fully supported. Rerverting to ' - 'defaults for object "{}"'.format( - leak.key, cls.mro()[0].__name__ - ), - lg.WARNING, - ) - else: - attr["AfnWindowAvailability"] = UmiSchedule.constant_schedule( - idf=surface.theidf - ) - # Zone Mixing - attr["ZoneMixingAvailabilitySchedule"] = UmiSchedule.constant_schedule( - idf=surface.theidf - ) - w = cls( - Name=name, - Construction=construction, - idf=surface.theidf, - Category=surface.theidf.building_name(use_idfname=True), - **attr - ) - return w - - @classmethod - @timeit - def from_zone(cls, zone): - """Iterate over the zone subsurfaces and create a window object. If more - than one window is created, use reduce to combine them together. - - Args: - zone (Zone): The Zone object from which the WindowSetting is - created. - - Returns: - WindowSetting: The WindowSetting object for this zone. - """ - window_sets = [] - - for surf in zone._zonesurfaces: - # skip internalmass objects since they don't have windows. - if surf.key.lower() != "internalmass": - for subsurf in surf.subsurfaces: - # For each subsurface, create a WindowSetting object - # using the `from_surface` constructor. - if subsurf.Surface_Type.lower() == "window": - window_sets.append(cls.from_surface(subsurf)) - - if window_sets: - # if one or more window has been created, reduce. Using reduce on - # a len==1 list, will simply return the object. - from operator import add - - return reduce(add, window_sets) - else: - # no window found, probably a core zone, return None. - return None - - def combine(self, other, weights=None): - """Append other to self. Return self + other as a new object. - - Args: - other (WindowSetting): The other OpaqueMaterial object - weights (list-like, optional): A list-like object of len 2. If None, - equal weights are used. - - Returns: - WindowSetting: A new combined object made of self + other. - """ - if self is None: - return other - if other is None: - return 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 1 as weighting factor in "{}" ' - "combine.".format(self.__class__.__name__) - ) - weights = [1.0, 1.0] - meta = self._get_predecessors_meta(other) - new_attr = dict( - Construction=self.Construction.combine(other.Construction, weights), - AfnDischargeC=self._float_mean(other, "AfnDischargeC", weights), - AfnTempSetpoint=self._float_mean(other, "AfnTempSetpoint", weights), - AfnWindowAvailability=self.AfnWindowAvailability.combine( - 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( - other, "ShadingSystemSetpoint", weights - ), - ShadingSystemTransmittance=self._float_mean( - other, "ShadingSystemTransmittance", weights - ), - ShadingSystemType=self.ShadingSystemType - if self.IsShadingSystemOn - else other.ShadingSystemType, - ZoneMixingDeltaTemperature=self._float_mean( - other, "ZoneMixingDeltaTemperature", weights - ), - ZoneMixingFlowRate=self._float_mean(other, "ZoneMixingFlowRate", weights), - ZoneMixingAvailabilitySchedule=self.ZoneMixingAvailabilitySchedule.combine( - other.ZoneMixingAvailabilitySchedule, weights), - ShadingSystemAvailabilitySchedule=self.ShadingSystemAvailabilitySchedule - .combine( - other.ShadingSystemAvailabilitySchedule, weights), - ) - new_obj = self.__class__(**meta, **new_attr) - new_obj._predecessors.extend(self._predecessors + other._predecessors) - return new_obj - - def to_json(self): - """Convert class properties to dict""" - data_dict = collections.OrderedDict() - - 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["Construction"] = {"$ref": str(self.Construction.id)} - data_dict["IsShadingSystemOn"] = self.IsShadingSystemOn - data_dict["IsVirtualPartition"] = self.IsVirtualPartition - data_dict["IsZoneMixingOn"] = self.IsZoneMixingOn - data_dict["OperableArea"] = self.OperableArea - data_dict[ - "ShadingSystemAvailabilitySchedule" - ] = self.ShadingSystemAvailabilitySchedule.to_dict() - data_dict["ShadingSystemSetpoint"] = self.ShadingSystemSetpoint - data_dict["ShadingSystemTransmittance"] = self.ShadingSystemTransmittance - data_dict["ShadingSystemType"] = self.ShadingSystemType - data_dict["Type"] = self.Type - data_dict[ - "ZoneMixingAvailabilitySchedule" - ] = self.ZoneMixingAvailabilitySchedule.to_dict() - data_dict["ZoneMixingDeltaTemperature"] = self.ZoneMixingDeltaTemperature - data_dict["ZoneMixingFlowRate"] = self.ZoneMixingFlowRate - data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments - data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) - - return data_dict - - @classmethod - def from_json(cls, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - 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 diff --git a/archetypal/template/window_setting.py b/archetypal/template/window_setting.py new file mode 100644 index 00000000..0f1a62a9 --- /dev/null +++ b/archetypal/template/window_setting.py @@ -0,0 +1,915 @@ +"""archetypal WindowSettings.""" + +import collections +import logging as lg +from copy import copy +from functools import reduce + +from validator_collection import checkers, validators +from validator_collection.errors import EmptyValueError + +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 WindowSetting(UmiBase): + """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 + + Hint: + The WindowSetting class implements two constructors that are tailored to + the eppy_ scripting language: + + - :func:`from_construction` and + - :func:`from_surface`. + + .. _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, + AfnDischargeC=0.65, + AfnTempSetpoint=20, + IsVirtualPartition=False, + IsShadingSystemOn=False, + ShadingSystemAvailabilitySchedule=None, + ShadingSystemSetpoint=180, + ShadingSystemTransmittance=0.5, + ShadingSystemType=ShadingType.ExteriorShade, + Type=WindowType.External, + IsZoneMixingOn=False, + ZoneMixingAvailabilitySchedule=None, + ZoneMixingDeltaTemperature=2, + ZoneMixingFlowRate=0.001, + area=1, + **kwargs, + ): + """Initialize a WindowSetting using default values. + + Args: + Construction (WindowConstruction): The window construction. + OperableArea (float): The operable window area as a ratio of total + window area. eg. 0.8 := 80% of the windows area is operable. + AfnWindowAvailability (UmiSchedule): The Airflow Network availability + schedule. + AfnDischargeC (float): Airflow Network Discharge Coefficient. + Default = 0.65. + AfnTempSetpoint (float): Airflow Network Temperature Setpoint. + Default = 20 degreeC. + IsVirtualPartition (bool): Virtual Partition. + IsShadingSystemOn (bool): Shading is used. Default is False. + ShadingSystemAvailabilitySchedule (UmiSchedule): Shading system + availability schedule. + ShadingSystemSetpoint (float): Shading system setpoint in units of + W/m2. Default = 180 W/m2. + ShadingSystemTransmittance (float): Shading system transmittance. + Default = 0.5. + ShadingSystemType (int): Shading System Type. 0 = ExteriorShade, 1 = + InteriorShade. + Type (int): + IsZoneMixingOn (bool): Zone mixing. + ZoneMixingAvailabilitySchedule (UmiSchedule): Zone mixing + availability schedule. + ZoneMixingDeltaTemperature (float): Zone mixing delta + ZoneMixingFlowRate (float): Zone mixing flow rate in units of m3/m2. + Default = 0.001 m3/m2. + **kwargs: other keywords passed to the constructor. + """ + super(WindowSetting, self).__init__(Name, **kwargs) + + self.ShadingSystemAvailabilitySchedule = ShadingSystemAvailabilitySchedule + self.Construction = Construction + self.AfnWindowAvailability = AfnWindowAvailability + self.AfnDischargeC = AfnDischargeC + self.AfnTempSetpoint = AfnTempSetpoint + self.IsShadingSystemOn = IsShadingSystemOn + self.IsVirtualPartition = IsVirtualPartition + self.IsZoneMixingOn = IsZoneMixingOn + self.OperableArea = OperableArea + self.ShadingSystemSetpoint = ShadingSystemSetpoint + self.ShadingSystemTransmittance = ShadingSystemTransmittance + self.ShadingSystemType = ShadingType(ShadingSystemType) + 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): + self._operable_area = validators.float(value, minimum=0, maximum=1) + + @property + def AfnDischargeC(self): + """Get or set the air flow network discarge coefficient.""" + return self._afn_discharge_c + + @AfnDischargeC.setter + def AfnDischargeC(self, value): + self._afn_discharge_c = validators.float(value, minimum=0, maximum=1) + + @property + def AfnTempSetpoint(self): + """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 = 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): + """Get or set the shading system setpoint [W/m2].""" + return self._shading_system_setpoint + + @ShadingSystemSetpoint.setter + def ShadingSystemSetpoint(self, value): + self._shading_system_setpoint = validators.float(value, minimum=0) + + @property + def ShadingSystemTransmittance(self): + """Get or set the shading system transmittance [-].""" + return self._shading_system_transmittance + + @ShadingSystemTransmittance.setter + def ShadingSystemTransmittance(self, 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): + """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: + return all( + [ + self.Construction == other.Construction, + self.OperableArea == other.OperableArea, + self.AfnWindowAvailability == other.AfnWindowAvailability, + self.AfnDischargeC == other.AfnDischargeC, + self.AfnTempSetpoint == other.AfnTempSetpoint, + self.IsVirtualPartition == other.IsVirtualPartition, + self.IsShadingSystemOn == other.IsShadingSystemOn, + self.ShadingSystemAvailabilitySchedule + == other.ShadingSystemAvailabilitySchedule, + self.ShadingSystemSetpoint == other.ShadingSystemSetpoint, + self.ShadingSystemTransmittance == other.ShadingSystemTransmittance, + self.ShadingSystemType == other.ShadingSystemType, + self.Type == other.Type, + self.IsZoneMixingOn == other.IsZoneMixingOn, + self.ZoneMixingAvailabilitySchedule + == other.ZoneMixingAvailabilitySchedule, + self.ZoneMixingDeltaTemperature == other.ZoneMixingDeltaTemperature, + self.ZoneMixingFlowRate == other.ZoneMixingFlowRate, + ] + ) + + @classmethod + 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 + """ + construction = WindowConstruction.from_shgc( + "SimpleWindow:SINGLE PANE HW WINDOW", + u_factor=2.703, + solar_heat_gain_coefficient=0.704, + visible_transmittance=0.786, + ) + return WindowSetting(Name, Construction=construction) + + @classmethod + def from_construction(cls, Construction, **kwargs): + """Make a :class:`WindowSetting` directly from a Construction_ object. + + .. _Construction : https://bigladdersoftware.com/epx/docs/8-9/input-output-reference/group-surface-construction-elements.html#construction-000 + + Examples: + >>> from archetypal import IDF + >>> from archetypal.template.window_setting import WindowSetting + >>> # Given an IDF object + >>> idf = IDF("idfname.idf") + >>> constr = idf.getobject('CONSTRUCTION', + >>> 'AEDG-SmOffice 1A Window Fixed') + >>> WindowSetting.from_construction( + >>> Name='test_window', + >>> Construction=constr + >>> ) + + Args: + Construction (EpBunch): The construction name for this window. + **kwargs: Other keywords passed to the constructor. + + Returns: + (windowSetting): The window setting object. + """ + name = kwargs.pop("Name", Construction.Name + "_Window") + 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): + """Build a WindowSetting object from a FenestrationSurface:Detailed_. + + This constructor will detect common window constructions and + shading devices. Supported Shading and Natural Air flow EnergyPlus + objects are: WindowProperty:ShadingControl_, + AirflowNetwork:MultiZone:Surface_. + + Important: + If an EnergyPlus object is not supported, eg.: + AirflowNetwork:MultiZone:Component:DetailedOpening_, only a warning + will be issued in the console for the related object instance and + default values will be automatically used. + + .. _FenestrationSurface:Detailed: + https://bigladdersoftware.com/epx/docs/8-9/input-output-reference + /group-thermal-zone-description-geometry.html + #fenestrationsurfacedetailed + .. _WindowProperty:ShadingControl: + https://bigladdersoftware.com/epx/docs/8-9/input-output-reference + /group-thermal-zone-description-geometry.html + #windowpropertyshadingcontrol + .. _AirflowNetwork:MultiZone:Surface: + https://bigladdersoftware.com/epx/docs/8-9/input-output-reference + /group-airflow-network.html#airflownetworkmultizonesurface + .. _AirflowNetwork:MultiZone:Component:DetailedOpening: + https://bigladdersoftware.com/epx/docs/8-9/input-output-reference + /group-airflow-network.html + #airflownetworkmultizonecomponentdetailedopening + + Args: + surface (EpBunch): The FenestrationSurface:Detailed_ object. + + Returns: + (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": + construction = surface.get_referenced_object("Construction_Name") + construction = WindowConstruction.from_epbunch(construction) + shading_control = next( + iter( + surface.getreferingobjs( + iddgroups=["Thermal Zones and Surfaces"], + fields=[f"Fenestration_Surface_{i}_Name" for i in range(1, 10)], + ) + ), + None, + ) + elif surface.key.upper() == "DOOR": + return # Simply skip doors. + else: + raise ValueError( + f"A window of type {surface.key} is not yet supported. " + f"Please contact developers" + ) + + attr = {} + if shading_control: + # a WindowProperty:ShadingControl_ object can be attached to + # this window + attr["IsShadingSystemOn"] = True + if shading_control["Setpoint"] != "": + attr["ShadingSystemSetpoint"] = shading_control["Setpoint"] + shade_mat = shading_control.get_referenced_object( + "Shading_Device_Material_Name" + ) + # get shading transmittance + if shade_mat: + attr["ShadingSystemTransmittance"] = shade_mat["Visible_Transmittance"] + # get shading control schedule + if shading_control["Shading_Control_Is_Scheduled"].upper() == "YES": + name = shading_control["Schedule_Name"] + attr["ShadingSystemAvailabilitySchedule"] = UmiSchedule.from_epbunch( + surface.theidf.schedules_dict[name.upper()] + ) + else: + # Determine which behavior of control + shade_ctrl_type = shading_control["Shading_Control_Type"] + if shade_ctrl_type.lower() == "alwaysoff": + attr[ + "ShadingSystemAvailabilitySchedule" + ] = UmiSchedule.constant_schedule(value=0, name="AlwaysOff") + elif shade_ctrl_type.lower() == "alwayson": + attr[ + "ShadingSystemAvailabilitySchedule" + ] = UmiSchedule.constant_schedule() + else: + log( + 'Window "{}" uses a window control type that ' + 'is not supported: "{}". Reverting to ' + '"AlwaysOn"'.format(surface.Name, shade_ctrl_type), + lg.WARN, + ) + attr[ + "ShadingSystemAvailabilitySchedule" + ] = UmiSchedule.constant_schedule() + # get shading type + if shading_control["Shading_Type"] != "": + mapping = { + "InteriorShade": ShadingType(1), + "ExteriorShade": ShadingType(0), + "ExteriorScreen": ShadingType(0), + "InteriorBlind": ShadingType(1), + "ExteriorBlind": ShadingType(0), + "BetweenGlassShade": ShadingType(0), + "BetweenGlassBlind": ShadingType(0), + "SwitchableGlazing": ShadingType(0), + } + attr["ShadingSystemType"] = mapping[shading_control["Shading_Type"]] + else: + # Set default schedules + attr["ShadingSystemAvailabilitySchedule"] = UmiSchedule.constant_schedule() + + # get airflow network + afn = next( + iter( + surface.getreferingobjs( + iddgroups=["Natural Ventilation and Duct Leakage"], + fields=["Surface_Name"], + ) + ), + None, + ) + + if afn: + attr["OperableArea"] = afn.WindowDoor_Opening_Factor_or_Crack_Factor + leak = afn.get_referenced_object("Leakage_Component_Name") + name = afn["Venting_Availability_Schedule_Name"] + if name != "": + attr["AfnWindowAvailability"] = UmiSchedule.from_epbunch( + surface.theidf.schedules_dict[name.upper()] + ) + else: + attr["AfnWindowAvailability"] = UmiSchedule.constant_schedule() + name = afn["Ventilation_Control_Zone_Temperature_Setpoint_Schedule_Name"] + if name != "": + attr["AfnTempSetpoint"] = UmiSchedule( + Name=name, idf=surface.theidf + ).mean + else: + pass # uses default + + if ( + leak.key.upper() + == "AIRFLOWNETWORK:MULTIZONE:SURFACE:EFFECTIVELEAKAGEAREA" + ): + attr["AfnDischargeC"] = leak["Discharge_Coefficient"] + elif ( + leak.key.upper() + == "AIRFLOWNETWORK:MULTIZONE:COMPONENT:HORIZONTALOPENING" + ): + log( + '"{}" is not fully supported. Reverting to ' + 'defaults for object "{}"'.format(leak.key, cls.mro()[0].__name__), + lg.WARNING, + ) + elif leak.key.upper() == "AIRFLOWNETWORK:MULTIZONE:SURFACE:CRACK": + log( + '"{}" is not fully supported. Rerverting to ' + 'defaults for object "{}"'.format(leak.key, cls.mro()[0].__name__), + lg.WARNING, + ) + elif ( + leak.key.upper() == "AIRFLOWNETWORK:MULTIZONE:COMPONENT:DETAILEDOPENING" + ): + log( + '"{}" is not fully supported. Rerverting to ' + 'defaults for object "{}"'.format(leak.key, cls.mro()[0].__name__), + lg.WARNING, + ) + elif ( + leak.key.upper() == "AIRFLOWNETWORK:MULTIZONE:COMPONENT:ZONEEXHAUSTFAN" + ): + log( + '"{}" is not fully supported. Rerverting to ' + 'defaults for object "{}"'.format(leak.key, cls.mro()[0].__name__), + lg.WARNING, + ) + elif leak.key.upper() == "AIRFLOWNETWORK:MULTIZONE:COMPONENT:SIMPLEOPENING": + log( + '"{}" is not fully supported. Rerverting to ' + 'defaults for object "{}"'.format(leak.key, cls.mro()[0].__name__), + lg.WARNING, + ) + else: + attr["AfnWindowAvailability"] = UmiSchedule.constant_schedule( + value=0, Name="AlwaysOff" + ) + # Todo: Zone Mixing is always off + attr["ZoneMixingAvailabilitySchedule"] = UmiSchedule.constant_schedule( + value=0, Name="AlwaysOff" + ) + DataSource = kwargs.pop("DataSource", surface.theidf.name) + Category = kwargs.pop("Category", surface.theidf.name) + w = cls( + Name=surface.Name, + Construction=construction, + idf=surface.theidf, + Category=Category, + DataSource=DataSource, + **attr, + **kwargs, + ) + return w + + @classmethod + @timeit + def from_zone(cls, zone, **kwargs): + """Iterate over the zone subsurfaces and create a window object. + + If more than one window is created, use reduce to combine them together. + + Args: + zone (Zone): The Zone object from which the WindowSetting is + created. + + Returns: + WindowSetting: The WindowSetting object for this zone. + """ + window_sets = [] + + 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: + # For each subsurface, create a WindowSetting object + # using the `from_surface` constructor. + window_sets.append(cls.from_surface(subsurf, **kwargs)) + + if window_sets: + # if one or more window has been created, reduce. Using reduce on + # a len==1 list, will simply return the object. + + return reduce(WindowSetting.combine, window_sets) + else: + # no window found, probably a core zone, return None. + return None + + def combine(self, other, weights=None, allow_duplicates=False): + """Append other to self. Return self + other as a new object. + + Args: + other (WindowSetting): The other OpaqueMaterial object + weights (list-like, optional): A list-like object of len 2. If None, + equal weights are used. + + Returns: + WindowSetting: A new combined object made of self + other. + """ + # Check if other is None. Simply return self + if not other: + return self + + if not self: + return other + + 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 1 as weighting factor in "{}" ' + "combine.".format(self.__class__.__name__) + ) + weights = [1.0, 1.0] + meta = self._get_predecessors_meta(other) + new_attr = dict( + Construction=WindowConstruction.combine( + self.Construction, other.Construction, 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( + other, "ShadingSystemSetpoint", weights + ), + ShadingSystemTransmittance=self.float_mean( + other, "ShadingSystemTransmittance", weights + ), + ShadingSystemType=max(self.ShadingSystemType, other.ShadingSystemType), + ZoneMixingDeltaTemperature=self.float_mean( + other, "ZoneMixingDeltaTemperature", weights + ), + ZoneMixingFlowRate=self.float_mean(other, "ZoneMixingFlowRate", weights), + ZoneMixingAvailabilitySchedule=UmiSchedule.combine( + self.ZoneMixingAvailabilitySchedule, + other.ZoneMixingAvailabilitySchedule, + weights, + ), + ShadingSystemAvailabilitySchedule=UmiSchedule.combine( + self.ShadingSystemAvailabilitySchedule, + other.ShadingSystemAvailabilitySchedule, + weights, + ), + Type=max(self.Type, other.Type), + ) + new_obj = WindowSetting(**meta, **new_attr) + new_obj.predecessors.update(self.predecessors + other.predecessors) + return new_obj + + def to_dict(self): + """Return WindowSetting dictionary representation.""" + self.validate() # Validate object before trying to get json format + + data_dict = collections.OrderedDict() + + data_dict["$id"] = str(self.id) + data_dict["AfnDischargeC"] = self.AfnDischargeC + data_dict["AfnTempSetpoint"] = self.AfnTempSetpoint + 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 + data_dict["IsZoneMixingOn"] = self.IsZoneMixingOn + data_dict["OperableArea"] = self.OperableArea + data_dict[ + "ShadingSystemAvailabilitySchedule" + ] = 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_ref() + data_dict["ZoneMixingDeltaTemperature"] = self.ZoneMixingDeltaTemperature + data_dict["ZoneMixingFlowRate"] = self.ZoneMixingFlowRate + 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, schedules, window_constructions, **kwargs): + """Create a ZoneConditioning from a dictionary. + + 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, schedules, window_constructions, **kwargs + ): + """Initialize :class:`WindowSetting` object from a reference id. + + Hint: + In some cases, the WindowSetting is referenced in the DataStore to the + Windows property of a BuildingTemplate (instead of being listed in the + WindowSettings list. This is the case in the original + BostonTemplateLibrary.json. + + Args: + ref (str): The referenced number in the json library. + building_templates (list): List of BuildingTemplates from the datastore. + + Returns: + WindowSetting: The parsed WindowSetting. + """ + store = next( + iter( + filter( + lambda x: x.get("$id") == ref, + [bldg.get("Windows") for bldg in building_templates], + ) + ) + ) + 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( + value=0, Name="AlwaysOff" + ) + if not self.ShadingSystemAvailabilitySchedule: + self.ShadingSystemAvailabilitySchedule = UmiSchedule.constant_schedule( + value=0, Name="AlwaysOff" + ) + if not self.ZoneMixingAvailabilitySchedule: + self.ZoneMixingAvailabilitySchedule = UmiSchedule.constant_schedule( + value=0, Name="AlwaysOff" + ) + + 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( + AfnDischargeC=self.AfnDischargeC, + AfnTempSetpoint=self.AfnTempSetpoint, + AfnWindowAvailability=self.AfnWindowAvailability, + Construction=self.Construction, + IsShadingSystemOn=self.IsShadingSystemOn, + IsVirtualPartition=self.IsVirtualPartition, + IsZoneMixingOn=self.IsZoneMixingOn, + OperableArea=self.OperableArea, + ShadingSystemAvailabilitySchedule=self.ShadingSystemAvailabilitySchedule, + ShadingSystemSetpoint=self.ShadingSystemSetpoint, + ShadingSystemTransmittance=self.ShadingSystemTransmittance, + ShadingSystemType=self.ShadingSystemType, + Type=self.Type, + ZoneMixingAvailabilitySchedule=self.ZoneMixingAvailabilitySchedule, + ZoneMixingDeltaTemperature=self.ZoneMixingDeltaTemperature, + ZoneMixingFlowRate=self.ZoneMixingFlowRate, + Category=self.Category, + Comments=self.Comments, + DataSource=self.DataSource, + Name=self.Name, + ) diff --git a/archetypal/template/zone.py b/archetypal/template/zone.py deleted file mode 100644 index 5162fd0e..00000000 --- a/archetypal/template/zone.py +++ /dev/null @@ -1,1142 +0,0 @@ -################################################################################ -# Module: archetypal.template -# Description: -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ - -import collections -import functools -import logging as lg -import math -import random -import time - -import numpy as np -from archetypal import log, timeit, settings -from archetypal.template import ( - Unique, - UmiBase, - ZoneConditioning, - ZoneLoad, - VentilationSetting, - DomesticHotWaterSetting, - OpaqueConstruction, - WindowSetting, - CREATED_OBJECTS, - UniqueName, -) -from archetypal.utils import reduce -from eppy.bunch_subclass import BadEPFieldError -from geomeppy.geom.polygons import Polygon3D - - -class Zone(UmiBase): - """Class containing HVAC settings: Conditioning, Domestic Hot Water, Loads, - Ventilation, adn Consructions - - .. image:: ../images/template/zoneinfo-zone.png - """ - - _cache = {} - - def __init__( - self, - Conditioning=None, - Constructions=None, - DomesticHotWater=None, - Loads=None, - Ventilation=None, - Windows=None, - InternalMassConstruction=None, - InternalMassExposedPerFloorArea=1.05, - DaylightMeshResolution=1, - DaylightWorkplaneHeight=0.8, - **kwargs - ): - """Initialize :class:`Zone` object. - - Args: - Conditioning (ZoneConditioning): Conditioning of the zone defined - with heating/cooling and mechanical ventilation parameters (see - :class:`ZoneConditioning`) - Constructions (ZoneConstructionSet): - DomesticHotWater (archetypal.template.dhw.DomesticHotWaterSetting): - Loads (ZoneLoad): Loads of the zone defined with the lights, - equipment and occupancy parameters (see :class:`ZoneLoad`) - Ventilation (VentilationSetting): Ventilation settings of the zone - defined with the infiltration rate and natural ventilation - parameters (see :class:`VentilationSetting`) - Windows (WindowSetting): The WindowSetting object associated with - this zone. - InternalMassConstruction (archetypal.OpaqueConstruction): - InternalMassExposedPerFloorArea: - DaylightMeshResolution (float): - DaylightWorkplaneHeight (float): - **kwargs: - """ - super(Zone, self).__init__(**kwargs) - - self.Ventilation = Ventilation - self.Loads = Loads - self.Conditioning = Conditioning - self.Constructions = Constructions - self.DaylightMeshResolution = DaylightMeshResolution - self.DaylightWorkplaneHeight = DaylightWorkplaneHeight - self.DomesticHotWater = DomesticHotWater - self.InternalMassConstruction = InternalMassConstruction - self.InternalMassExposedPerFloorArea = InternalMassExposedPerFloorArea - - self.Windows = Windows # This is not used in to_json() - - self._epbunch = kwargs.get("epbunch", None) - self._zonesurfaces = kwargs.get("zonesurfaces", None) - self._area = kwargs.get("area", None) - self._volume = kwargs.get("volume", None) - - self._cache[hash(self)] = self - CREATED_OBJECTS[hash(self)] = self - - def __add__(self, other): - """ - Args: - other (Zone): - """ - # create the new merged zone from self - return self.combine(other) - - def __hash__(self): - return hash((self.Name, id(self.idf))) - - def __eq__(self, other): - if not isinstance(other, Zone): - return False - 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 area(self): - """Calculates the floor surface area of the zone - - Returns (float): zone's area in m² - """ - if self._area is None: - zone_surfs = self.zonesurfaces( - exclude=["INTERNALMASS", "WINDOWSHADINGCONTROL"] - ) - floors = [s for s in zone_surfs if s.Surface_Type.upper() == "FLOOR"] - area = sum([floor.area for floor in floors]) - return area - else: - return self._area - - @property - def volume(self): - """Calculates the volume of the zone - - Returns (float): zone's volume in m³ - """ - if not self._volume: - zone_surfs = self.zonesurfaces( - exclude=["INTERNALMASS", "WINDOWSHADINGCONTROL"] - ) - - vol = self.get_volume_from_surfs(zone_surfs) - - if self._epbunch.Multiplier == "": - multiplier = 1 - else: - multiplier = float(self._epbunch.Multiplier) - # multiply to volume by the zone multiplier. - return vol * multiplier - else: - return self._volume - - 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: - return [ - surf - for surf in self._epbunch.zonesurfaces - if surf.key.upper() not in exclude - ] - else: - return [ - surf for surf in self._zonesurfaces if surf.key.upper() not in exclude - ] - - @property - def is_core(self): - return is_core(self._epbunch) - - @property - def is_part_of_conditioned_floor_area(self): - return is_part_of_conditioned_floor_area(self) - - @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 - - def _conditioning(self): - """run _conditioning and return id""" - self.Conditioning = ZoneConditioning.from_idf(Name=random.randint(1, 999999)) - - @timeit - def _internalmassconstruction(self): - """Group internal walls into a ThermalMass object for this Zone""" - - oc = [] - for surface in self.zonesurfaces(exclude=["WINDOWSHADINGCONTROL"]): - # for surf_type in self.idf.idd_index['ref2names'][ - # 'AllHeatTranSurfNames']: - if surface.key.upper() == "INTERNALMASS": - oc.append(OpaqueConstruction.from_epbunch(surface)) - self.InternalMassExposedPerFloorArea = ( - float(surface.Surface_Area) / self.area - ) - if not oc: - # Todo: Create Equivalent InternalMassConstruction from - # partitions. For now, creating dummy InternalMass - - mat = self.idf.add_object( - ep_object="Material".upper(), - Name="Wood 6inch", - Roughness="MediumSmooth", - Thickness=0.15, - Conductivity=0.12, - Density=540, - Specific_Heat=1210, - Thermal_Absorptance=0.7, - Visible_Absorptance=0.7, - ) - - cons = self.idf.add_object( - ep_object="Construction".upper(), - save=False, - Name="InteriorFurnishings", - Outside_Layer="Wood 6inch", - ) - - internal_mass = "{}_InternalMass".format(self.Name) - cons.Name = internal_mass + "_construction" - new_epbunch = self.idf.add_object( - ep_object="InternalMass".upper(), - save=False, - Name=internal_mass, - Construction_Name=cons.Name, - Zone_or_ZoneList_Name=self.Name, - Surface_Area=1, - ) - - oc.append(OpaqueConstruction.from_epbunch(new_epbunch, idf=self.idf)) - self.InternalMassExposedPerFloorArea = 0 - - if self.InternalMassExposedPerFloorArea is None: - self.InternalMassExposedPerFloorArea = 0 - - from operator import add - - return functools.reduce(add, oc) - - def _loads(self): - """run loads and return id""" - self.Loads = ZoneLoad(Name=str(random.randint(1, 999999))) - - def _ventilation(self): - self.Ventilation = VentilationSetting(Name=str(random.randint(1, 999999))) - - def _constructions(self): - """run construction sets and return id""" - set_name = "_".join([self.Name, "constructions"]) - self.Constructions = ZoneConstructionSet.from_idf( - Zone_Names=self.Zone_Names, sql=self.sql, Name=set_name, idf=self.idf - ) - - def _domestichotwater(self): - """run domestic hot water and return id""" - self.DomesticHotWater = DomesticHotWaterSetting( - Name=str(random.randint(1, 999999)) - ) - - def to_json(self): - 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["DaylightMeshResolution"] = self.DaylightMeshResolution - data_dict["DaylightWorkplaneHeight"] = self.DaylightWorkplaneHeight - data_dict["DomesticHotWater"] = self.DomesticHotWater.to_dict() - data_dict["InternalMassConstruction"] = self.InternalMassConstruction.to_dict() - data_dict[ - "InternalMassExposedPerFloorArea" - ] = self.InternalMassExposedPerFloorArea - data_dict["Loads"] = self.Loads.to_dict() - data_dict["Ventilation"] = self.Ventilation.to_dict() - data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments - data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) - - return data_dict - - @classmethod - def from_json(cls, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - zone = cls(*args, **kwargs) - - ref = kwargs.get("Conditioning", None) - zone.Conditioning = zone.get_ref(ref) - ref = kwargs.get("Constructions", None) - zone.Constructions = zone.get_ref(ref) - ref = kwargs.get("DomesticHotWater", None) - zone.DomesticHotWater = zone.get_ref(ref) - ref = kwargs.get("InternalMassConstruction", None) - zone.InternalMassConstruction = zone.get_ref(ref) - ref = kwargs.get("Loads", None) - zone.Loads = zone.get_ref(ref) - ref = kwargs.get("Ventilation", None) - zone.Ventilation = zone.get_ref(ref) - - return zone - - @classmethod - def from_zone_epbunch(cls, zone_ep, sql): - """Create a Zone object from an eppy 'ZONE' epbunch. - - Args: - zone_ep (eppy.bunch_subclass.EpBunch): The Zone EpBunch. - sql (dict): The sql dict for this IDF object. - """ - cached = cls.get_cached(zone_ep.Name, zone_ep.theidf) - if cached: - return cached - start_time = time.time() - log('\nConstructing :class:`Zone` for zone "{}"'.format(zone_ep.Name)) - name = zone_ep.Name - zone = cls( - Name=name, - idf=zone_ep.theidf, - sql=sql, - Category=zone_ep.theidf.building_name(use_idfname=True), - ) - - zone._epbunch = zone_ep - zone._zonesurfaces = zone_ep.zonesurfaces - - zone.Constructions = ZoneConstructionSet.from_zone(zone) - zone.Conditioning = ZoneConditioning.from_zone(zone) - zone.Ventilation = VentilationSetting.from_zone(zone) - zone.DomesticHotWater = DomesticHotWaterSetting.from_zone(zone) - zone.Loads = ZoneLoad.from_zone(zone) - zone.InternalMassConstruction = zone._internalmassconstruction() - zone.Windows = WindowSetting.from_zone(zone) - - log( - 'completed Zone "{}" constructor in {:,.2f} seconds'.format( - zone_ep.Name, time.time() - start_time - ) - ) - return zone - - @classmethod - def get_cached(cls, name, idf): - """Retrieve the cached object by Name and idf name. If not, returns - None. - - Args: - name (str): The name of the object in the cache. - idf (IDF): The :class:`IDF` object. - """ - try: - cached = cls._cache[hash((name, id(idf)))] - except KeyError: - return None - else: - return cached - - def combine(self, other, weights=None): - """ - Args: - other (Zone): - 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. - - Returns: - (Zone): the combined Zone object. - """ - # 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 - - incoming_zone_data = self.__dict__.copy() - incoming_zone_data.pop("Name") - - meta = self._get_predecessors_meta(other) - - if not weights: - zone_weight = settings.zone_weight - weights = [ - getattr(self, str(zone_weight)), - getattr(other, str(zone_weight)), - ] - log( - 'using zone {} "{}" as weighting factor in "{}" ' - "combine.".format( - zone_weight, - " & ".join(list(map(str, map(int, weights)))), - self.__class__.__name__, - ) - ) - - attr = dict( - Conditioning=self.Conditioning.combine(other.Conditioning, weights), - Constructions=self.Constructions.combine(other.Constructions, weights), - Ventilation=self.Ventilation.combine(other.Ventilation, weights), - Windows=None - if self.Windows is None or other.Windows is None - else self.Windows.combine(other.Windows, weights), - DaylightMeshResolution=self._float_mean( - other, "DaylightMeshResolution", weights=weights - ), - DaylightWorkplaneHeight=self._float_mean( - other, "DaylightWorkplaneHeight", weights - ), - DomesticHotWater=self.DomesticHotWater.combine( - other.DomesticHotWater, weights - ), - InternalMassConstruction=self.InternalMassConstruction.combine( - other.InternalMassConstruction, weights - ), - InternalMassExposedPerFloorArea=self._float_mean( - other, "InternalMassExposedPerFloorArea", weights - ), - Loads=self.Loads.combine(other.Loads, weights), - ) - new_obj = self.__class__(**meta, **attr) - new_obj._volume = self.volume + other.volume - new_obj._area = self.area + other.area - attr["Conditioning"]._belongs_to_zone = new_obj - attr["Constructions"]._belongs_to_zone = new_obj - attr["Ventilation"]._belongs_to_zone = new_obj - attr["DomesticHotWater"]._belongs_to_zone = new_obj - if attr["Windows"]: - attr["Windows"]._belongs_to_zone = new_obj - new_obj._predecessors.extend(self.predecessors + other.predecessors) - return new_obj - - -def resolve_obco(this): - """Resolve the outside boundary condition of a surface and return the other - SURFACE epbunch and, if possible, the ZONE epbunch. - - Args: - this (EpBunch): The surface for which we are identifying the boundary - object. - - Returns: - (EpBunch, EpBunch): A tuple of: - - EpBunch: The other surface EpBunch: The other zone - - Notes: - Info on the Outside Boundary Condition Object of a surface of type - BuildingSurface:Detailed: - - Non-blank only if the field `Outside Boundary Condition` is *Surface*, - *Zone*, *OtherSideCoefficients* or *OtherSideConditionsModel*. If - Surface, specify name of corresponding surface in adjacent zone or - specify current surface name for internal partition separating like - zones. If Zone, specify the name of the corresponding zone and the - program will generate the corresponding interzone surface. If - Foundation, specify the name of the corresponding Foundation object and - the program will calculate the heat transfer appropriately. If - OtherSideCoefficients, specify name of - 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 - - if obc.upper() == "ZONE": - name = this.Outside_Boundary_Condition_Object - adj_zone = this.theidf.getobject("ZONE", name) - return None, adj_zone - - elif obc.upper() == "SURFACE": - obco = this.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 surface_dispatcher(surf, zone): - """ - Args: - surf (EpBunch): - zone (EpBunch): - """ - dispatch = { - ("Wall", "Outdoors"): ZoneConstructionSet._do_facade, - ("Floor", "Ground"): ZoneConstructionSet._do_ground, - ("Floor", "Outdoors"): ZoneConstructionSet._do_ground, - ("Floor", "Foundation"): 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) - ) - - -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): - """ - - Args: - zone (eppy.bunch_subclass.EpBunch): The Zone object. - - Returns: - (bool): Whether the zone is a core zone or not. - """ - # if all surfaces don't have boundary condition == "Outdoors" - iscore = True - for s in zone.zonesurfaces: - try: - if (abs(int(s.tilt)) < 180) & (abs(int(s.tilt)) > 0): - obc = s.Outside_Boundary_Condition.lower() - if obc == "outdoors": - iscore = False - break - except BadEPFieldError: - pass # pass surfaces that don't have an OBC, - # eg. InternalMass - return iscore - - -def is_part_of_conditioned_floor_area(zone): - """Returns True if Zone epbunch has :attr:`Part_of_Total_Floor_Area` == "YES" - - Args: - zone (Zone): The Zone object. - """ - return zone._epbunch.Part_of_Total_Floor_Area.upper() != "NO" - - -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" - - -class ZoneConstructionSet(UmiBase, metaclass=Unique): - """Zone-specific :class:`Construction` ids""" - - def __init__( - self, - *args, - Zone_Names=None, - Slab=None, - IsSlabAdiabatic=False, - Roof=None, - IsRoofAdiabatic=False, - Partition=None, - IsPartitionAdiabatic=False, - Ground=None, - IsGroundAdiabatic=False, - Facade=None, - IsFacadeAdiabatic=False, - **kwargs - ): - """ - Args: - *args: - Zone_Names: - Slab (OpaqueConstruction): - IsSlabAdiabatic (bool): - Roof (OpaqueConstruction): - IsRoofAdiabatic (bool): - Partition (OpaqueConstruction): - IsPartitionAdiabatic (bool): - Ground (OpaqueConstruction): - IsGroundAdiabatic (bool): - Facade (OpaqueConstruction): - IsFacadeAdiabatic (bool): - **kwargs: - """ - super(ZoneConstructionSet, self).__init__(*args, **kwargs) - self.Slab = Slab - self.IsSlabAdiabatic = IsSlabAdiabatic - self.Roof = Roof - self.IsRoofAdiabatic = IsRoofAdiabatic - self.Partition = Partition - self.IsPartitionAdiabatic = IsPartitionAdiabatic - self.Ground = Ground - self.IsGroundAdiabatic = IsGroundAdiabatic - self.Facade = Facade - self.IsFacadeAdiabatic = IsFacadeAdiabatic - - self.Zone_Names = Zone_Names - self._belongs_to_zone = kwargs.get("zone", None) - - def __add__(self, other): - """Overload + to implement self.combine. - - Args: - other: - """ - return self.combine(other) - - def __hash__(self): - return hash((self.__class__.__name__, self.Name, self.DataSource)) - - def __eq__(self, other): - if not isinstance(other, ZoneConstructionSet): - return False - else: - return all( - [ - self.Zone_Names == other.Zone_Names, - 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, - ] - ) - - def combine(self, other, weights=None): - """Append other to self. Return self + other as a new object. - - Args: - other (ZoneConstructionSet): - weights: - - Returns: - (ZoneConstructionSet): the combined ZoneConstructionSet object. - """ - # 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: - 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( - Slab=self.Slab.combine(other.Slab, [self.Slab.area, other.Slab.area]), - IsSlabAdiabatic=any([self.IsSlabAdiabatic, other.IsSlabAdiabatic]), - Roof=self.Roof.combine(other.Roof, [self.Roof.area, other.Roof.area]), - IsRoofAdiabatic=any([self.IsRoofAdiabatic, other.IsRoofAdiabatic]), - Partition=self.Partition.combine( - other.Partition, [self.Partition.area, other.Partition.area] - ), - IsPartitionAdiabatic=any( - [self.IsPartitionAdiabatic, other.IsPartitionAdiabatic] - ), - Ground=self.Ground.combine( - other.Ground, [self.Ground.area, other.Ground.area] - ), - IsGroundAdiabatic=any([self.IsGroundAdiabatic, other.IsGroundAdiabatic]), - Facade=self.Facade.combine( - other.Facade, [self.Facade.area, other.Facade.area] - ), - IsFacadeAdiabatic=any([self.IsFacadeAdiabatic, other.IsFacadeAdiabatic]), - ) - new_obj = self.__class__(**meta, **new_attr) - new_obj._predecessors.extend(self.predecessors + other.predecessors) - return new_obj - - @classmethod - def from_json(cls, *args, **kwargs): - """ - Args: - *args: - **kwargs: - """ - 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 - - def to_json(self): - """Convert class properties to dict""" - data_dict = collections.OrderedDict() - - data_dict["$id"] = str(self.id) - data_dict["Facade"] = {"$ref": str(self.Facade.id)} - data_dict["Ground"] = {"$ref": str(self.Ground.id)} - data_dict["Partition"] = {"$ref": str(self.Partition.id)} - data_dict["Roof"] = {"$ref": str(self.Roof.id)} - data_dict["Slab"] = {"$ref": str(self.Slab.id)} - data_dict["IsFacadeAdiabatic"] = self.IsFacadeAdiabatic - data_dict["IsGroundAdiabatic"] = self.IsGroundAdiabatic - data_dict["IsPartitionAdiabatic"] = self.IsPartitionAdiabatic - data_dict["IsRoofAdiabatic"] = self.IsRoofAdiabatic - data_dict["IsSlabAdiabatic"] = self.IsSlabAdiabatic - data_dict["Category"] = self.Category - data_dict["Comments"] = self.Comments - data_dict["DataSource"] = self.DataSource - data_dict["Name"] = UniqueName(self.Name) - - return data_dict - - @classmethod - @timeit - def from_zone(cls, zone): - """ - Args: - zone (Zone): - """ - name = zone.Name + "_ZoneConstructionSet" - # dispatch surfaces - facade, ground, partition, roof, slab = [], [], [], [], [] - zonesurfaces = zone._zonesurfaces - for surf in zonesurfaces: - for disp_surf in surface_dispatcher(surf, zone): - if disp_surf: - if disp_surf.Surface_Type == "Facade": - 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) - - # Returning a set() for each groups of Constructions. - - facades = set(facade) - if facades: - facade = reduce(OpaqueConstruction.combine, facades) - else: - facade = OpaqueConstruction.generic(idf=zone.idf) - grounds = set(ground) - if grounds: - ground = reduce(OpaqueConstruction.combine, grounds) - else: - ground = OpaqueConstruction.generic(idf=zone.idf) - partitions = set(partition) - if partitions: - partition = reduce(OpaqueConstruction.combine, partitions) - else: - partition = OpaqueConstruction.generic(idf=zone.idf) - roofs = set(roof) - if roofs: - roof = reduce(OpaqueConstruction.combine, roofs) - else: - roof = OpaqueConstruction.generic(idf=zone.idf) - slabs = set(slab) - if slabs: - slab = reduce(OpaqueConstruction.combine, slabs) - else: - slab = OpaqueConstruction.generic(idf=zone.idf) - - z_set = cls( - Facade=facade, - Ground=ground, - Partition=partition, - Roof=roof, - Slab=slab, - Name=name, - zone=zone, - idf=zone.idf, - Category=zone.idf.building_name(use_idfname=True), - ) - return z_set - - @staticmethod - def _do_facade(surf): - """ - Args: - surf (EpBunch): - """ - log( - 'surface "%s" assigned as a Facade' % surf.Name, - lg.DEBUG, - name=surf.theidf.name, - ) - oc = OpaqueConstruction.from_epbunch( - surf.theidf.getobject("Construction".upper(), surf.Construction_Name) - ) - oc.area = surf.area - oc.Surface_Type = "Facade" - return oc - - @staticmethod - def _do_ground(surf): - """ - Args: - surf (EpBunch): - """ - log( - 'surface "%s" assigned as a Ground' % surf.Name, - lg.DEBUG, - name=surf.theidf.name, - ) - oc = OpaqueConstruction.from_epbunch( - surf.theidf.getobject("Construction".upper(), surf.Construction_Name) - ) - oc.area = surf.area - oc.Surface_Type = "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" - log( - 'surface "%s" assigned as a Partition' % surf.Name, - lg.DEBUG, - name=surf.theidf.name, - ) - return oc - else: - # we might be in a situation where the construction does not exist in the - # file. For example, this can happen when the construction is defined as - # "Air Wall", which is a construction type internal to EnergyPlus. - return None - - @staticmethod - def _do_roof(surf): - """ - Args: - surf (EpBunch): - """ - log( - 'surface "%s" assigned as a Roof' % surf.Name, - lg.DEBUG, - name=surf.theidf.name, - ) - oc = OpaqueConstruction.from_epbunch( - surf.theidf.getobject("Construction".upper(), surf.Construction_Name) - ) - oc.area = surf.area - oc.Surface_Type = "Roof" - return oc - - @staticmethod - def _do_slab(surf): - """ - Args: - surf (EpBunch): - """ - log( - 'surface "%s" assigned as a Slab' % surf.Name, - lg.DEBUG, - name=surf.theidf.name, - ) - oc = OpaqueConstruction.from_epbunch( - surf.theidf.getobject("Construction".upper(), surf.Construction_Name) - ) - oc.area = surf.area - oc.Surface_Type = "Slab" - return oc - - @staticmethod - def _do_basement(surf): - """ - Args: - surf (EpBunch): - """ - log( - 'surface "%s" ignored because basement facades are not supported' - % surf.Name, - lg.WARNING, - name=surf.theidf.name, - ) - oc = OpaqueConstruction.from_epbunch( - surf.theidf.getobject("Construction".upper(), surf.Construction_Name) - ) - oc.area = surf.area - oc.Surface_Type = "Facade" - return oc diff --git a/archetypal/template/zone_construction_set.py b/archetypal/template/zone_construction_set.py new file mode 100644 index 00000000..5a5a1a93 --- /dev/null +++ b/archetypal/template/zone_construction_set.py @@ -0,0 +1,688 @@ +"""archetypal ZoneConstructionSet.""" + +import collections +import logging as lg + +from validator_collection import validators + +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): + """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, + Name, + Facade=None, + Ground=None, + Partition=None, + Roof=None, + Slab=None, + IsFacadeAdiabatic=False, + IsGroundAdiabatic=False, + 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 + a facade. + Ground (OpaqueConstruction): The OpaqueConstruction object representing + a ground floor. + Partition (OpaqueConstruction): The OpaqueConstruction object representing + a partition wall. + Roof (OpaqueConstruction): The OpaqueConstruction object representing + a roof. + Slab (OpaqueConstruction): The OpaqueConstruction object representing + a slab. + IsFacadeAdiabatic (bool): If True, surface is adiabatic. + IsGroundAdiabatic (bool): If True, surface is adiabatic. + IsPartitionAdiabatic (bool): If True, surface is adiabatic. + IsRoofAdiabatic (bool): If True, surface is adiabatic. + IsSlabAdiabatic (bool): If True, surface is adiabatic. + **kwargs: + """ + super(ZoneConstructionSet, self).__init__(Name, **kwargs) + self.Slab = Slab + self.IsSlabAdiabatic = IsSlabAdiabatic + self.Roof = Roof + self.IsRoofAdiabatic = IsRoofAdiabatic + self.Partition = Partition + self.IsPartitionAdiabatic = IsPartitionAdiabatic + self.Ground = Ground + self.IsGroundAdiabatic = IsGroundAdiabatic + self.Facade = Facade + self.IsFacadeAdiabatic = IsFacadeAdiabatic + 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 + + @property + def area(self): + """Get or set the area of the zone [m²].""" + return self._area + + @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 + + @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.zone_surfaces + for surf in zonesurfaces: + 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. + + facades = set(facade) + if facades: + facade = reduce(OpaqueConstruction.combine, facades) + else: + facade = None + grounds = set(ground) + if grounds: + ground = reduce(OpaqueConstruction.combine, grounds) + else: + ground = None + partitions = set(partition) + if partitions: + partition = reduce(OpaqueConstruction.combine, partitions) + else: + partition = None + roofs = set(roof) + if roofs: + roof = reduce(OpaqueConstruction.combine, roofs) + else: + roof = None + slabs = set(slab) + if slabs: + slab = reduce(OpaqueConstruction.combine, slabs) + else: + slab = None + + z_set = cls( + Facade=facade, + Ground=ground, + Partition=partition, + Roof=roof, + Slab=slab, + Name=name, + zone=zone, + Category=zone.DataSource, + **kwargs, + ) + return z_set + + @classmethod + def from_dict(cls, data, opaque_constructions, **kwargs): + """Create a ZoneConstructionSet from a dictionary. + + Args: + 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" + } + """ + _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): + """Combine two ZoneConstructionSet objects together. + + Args: + other (ZoneConstructionSet): + kwargs: keywords passed to constructor. + + Returns: + (ZoneConstructionSet): the combined ZoneConstructionSet object. + """ + # Check if other is None. Simply 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 + + # 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) + + meta = self._get_predecessors_meta(other) + + # 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), + IsRoofAdiabatic=any([self.IsRoofAdiabatic, other.IsRoofAdiabatic]), + Partition=OpaqueConstruction.combine(self.Partition, other.Partition), + IsPartitionAdiabatic=any( + [self.IsPartitionAdiabatic, other.IsPartitionAdiabatic] + ), + Ground=OpaqueConstruction.combine(self.Ground, other.Ground), + 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.predecessors.update(self.predecessors + other.predecessors) + return new_obj + + def to_dict(self): + """Return ZoneConstructionSet dictionary representation.""" + self.validate() + data_dict = collections.OrderedDict() + + data_dict["$id"] = str(self.id) + data_dict["Facade"] = {"$ref": str(self.Facade.id)} + data_dict["Ground"] = {"$ref": str(self.Ground.id)} + data_dict["Partition"] = {"$ref": str(self.Partition.id)} + data_dict["Roof"] = {"$ref": str(self.Roof.id)} + data_dict["Slab"] = {"$ref": str(self.Slab.id)} + data_dict["IsFacadeAdiabatic"] = self.IsFacadeAdiabatic + data_dict["IsGroundAdiabatic"] = self.IsGroundAdiabatic + data_dict["IsPartitionAdiabatic"] = self.IsPartitionAdiabatic + data_dict["IsRoofAdiabatic"] = self.IsRoofAdiabatic + data_dict["IsSlabAdiabatic"] = self.IsSlabAdiabatic + 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 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 + zone = next( + iter( + filter( + lambda x: getattr(x, attr, None) is not None, + UmiBase.CREATED_OBJECTS, + ) + ), + None, + ) + if zone: + setattr(self, attr, getattr(zone, attr)) + else: + # If not, default to a generic construction for last resort. + setattr(self, attr, OpaqueConstruction.generic()) + log( + f"While validating {self}, the required attribute " + f"'{attr}' was filled " + f"with {getattr(self, attr)}", + lg.DEBUG, + ) + 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( + 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: + 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, + name=surf.theidf.name, + ) + oc = OpaqueConstruction.from_epbunch( + surf.theidf.getobject("Construction".upper(), surf.Construction_Name) + ) + oc.area = surf.area + oc.Category = "Facade" + return oc + + @staticmethod + def _do_ground(surf): + log( + 'surface "%s" assigned as a Ground' % surf.Name, + lg.DEBUG, + name=surf.theidf.name, + ) + oc = OpaqueConstruction.from_epbunch( + surf.theidf.getobject("Construction".upper(), surf.Construction_Name) + ) + oc.area = surf.area + oc.Category = "Ground" + return oc + + @staticmethod + def _do_partition(surf): + the_construction = surf.theidf.getobject( + "Construction".upper(), surf.Construction_Name + ) + if the_construction: + oc = OpaqueConstruction.from_epbunch(the_construction) + oc.area = surf.area + oc.Category = "Partition" + log( + 'surface "%s" assigned as a Partition' % surf.Name, + lg.DEBUG, + name=surf.theidf.name, + ) + return oc + else: + # we might be in a situation where the construction does not exist in the + # file. For example, this can happen when the construction is defined as + # "Air Wall", which is a construction type internal to EnergyPlus. + return None + + @staticmethod + def _do_roof(surf): + log( + 'surface "%s" assigned as a Roof' % surf.Name, + lg.DEBUG, + name=surf.theidf.name, + ) + oc = OpaqueConstruction.from_epbunch( + surf.theidf.getobject("Construction".upper(), surf.Construction_Name) + ) + oc.area = surf.area + oc.Category = "Roof" + return oc + + @staticmethod + def _do_slab(surf): + log( + 'surface "%s" assigned as a Slab' % surf.Name, + lg.DEBUG, + name=surf.theidf.name, + ) + oc = OpaqueConstruction.from_epbunch( + surf.theidf.getobject("Construction".upper(), surf.Construction_Name) + ) + oc.area = surf.area + oc.Category = "Slab" + return oc + + @staticmethod + def _do_basement(surf): + log( + 'surface "%s" ignored because basement facades are not supported' + % surf.Name, + lg.WARNING, + name=surf.theidf.name, + ) + oc = None + return oc diff --git a/archetypal/template/zonedefinition.py b/archetypal/template/zonedefinition.py new file mode 100644 index 00000000..2a682a47 --- /dev/null +++ b/archetypal/template/zonedefinition.py @@ -0,0 +1,827 @@ +"""archetypal ZoneDefinition module.""" + +import collections +import sqlite3 +import time + +from eppy.bunch_subclass import BadEPFieldError +from sigfig import round +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 ZoneDefinition(UmiBase): + """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, + Constructions=None, + Loads=None, + Conditioning=None, + Ventilation=None, + DomesticHotWater=None, + DaylightMeshResolution=1, + DaylightWorkplaneHeight=0.8, + 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. + + Args: + Name (str): Name of the object. Must be Unique. + Constructions (ZoneConstructionSet): + Loads (ZoneLoad): Loads of the zone defined with the lights, + equipment and occupancy parameters (see :class:`ZoneLoad`) + Conditioning (ZoneConditioning): Conditioning of the zone defined + with heating/cooling and mechanical ventilation parameters (see + :class:`ZoneConditioning`) + Ventilation (VentilationSetting): Ventilation settings of the zone + defined with the infiltration rate and natural ventilation + parameters (see :class:`VentilationSetting`) + DomesticHotWater (archetypal.template.dhw.DomesticHotWaterSetting): + DaylightMeshResolution (float): + DaylightWorkplaneHeight (float): + InternalMassConstruction (archetypal.OpaqueConstruction): + InternalMassExposedPerFloorArea: + Windows (WindowSetting): The WindowSetting object associated with + this zone. + area (float): + volume (float): + occupants (float): + **kwargs: + """ + super(ZoneDefinition, self).__init__(Name, **kwargs) + + self.Ventilation = Ventilation + self.Loads = Loads + self.Conditioning = Conditioning + self.Constructions = Constructions + self.DaylightMeshResolution = DaylightMeshResolution + self.DaylightWorkplaneHeight = DaylightWorkplaneHeight + self.DomesticHotWater = DomesticHotWater + self.InternalMassConstruction = InternalMassConstruction + self.InternalMassExposedPerFloorArea = InternalMassExposedPerFloorArea + + 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) + + @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): + """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._internal_mass_exposed_per_floor_area = validators.float(value, minimum=0) + + @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): + """Get or set the number of occupants in the zone.""" + return self._occupants + + @occupants.setter + def occupants(self, value): + self._occupants = value + + @property + def area(self): + """Get or set the area of the zone [m²].""" + return self._area + + @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 + + @volume.setter + def volume(self, value): + self._volume = validators.float(value, minimum=0) + + @property + def is_core(self): + """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): + """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. + """ + return self._multiplier + + @multiplier.setter + def multiplier(self, value): + self._multiplier = validators.integer(value, minimum=1) + + @property + def is_part_of_conditioned_floor_area(self): + """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): + """Get or set is part od the total building floor area [bool].""" + return self._is_part_of_total_floor_area + + @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 + + @property + def zone_surfaces(self): + """Get or set the list of surfaces for this zone.""" + return self._zone_surfaces + + @zone_surfaces.setter + def zone_surfaces(self, value): + self._zone_surfaces = validators.iterable(value, allow_empty=True) + + 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_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_ref() + data_dict["InternalMassConstruction"] = self.InternalMassConstruction.to_ref() + data_dict["InternalMassExposedPerFloorArea"] = round( + self.InternalMassExposedPerFloorArea, 3 + ) + data_dict["Loads"] = self.Loads.to_ref() + data_dict["Ventilation"] = self.Ventilation.to_ref() + 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, + zone_conditionings, + zone_construction_sets, + domestic_hot_water_settings, + opaque_constructions, + zone_loads, + ventilation_settings, + **kwargs, + ): + """Create a ZoneDefinition from a dictionary. + + Args: + 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" + } + """ + _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, + ) + + @classmethod + def from_epbunch(cls, ep_bunch, construct_parents=True, **kwargs): + """Create a Zone object from an eppy 'ZONE' epbunch. + + Args: + 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(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, + 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, + ) + + if construct_parents: + zone.Constructions = ZoneConstructionSet.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( + 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): 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. + + Todo: + Create Equivalent InternalMassConstruction from partitions when combining + zones. + + Returns: + (ZoneDefinition): the combined Zone object. + """ + # Check if other is None. Simply 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 + + # 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) + + meta = self._get_predecessors_meta(other) + + if not weights: + zone_weight = settings.zone_weight + weights = [ + getattr(self, str(zone_weight)), + getattr(other, 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_attr = dict( + Conditioning=ZoneConditioning.combine( + self.Conditioning, other.Conditioning, weights + ), + Constructions=ZoneConstructionSet.combine( + self.Constructions, other.Constructions, weights + ), + Ventilation=VentilationSetting.combine(self.Ventilation, other.Ventilation), + Windows=WindowSetting.combine(self.Windows, other.Windows, weights), + DaylightMeshResolution=self.float_mean( + other, "DaylightMeshResolution", weights=weights + ), + DaylightWorkplaneHeight=self.float_mean( + other, "DaylightWorkplaneHeight", weights + ), + DomesticHotWater=DomesticHotWaterSetting.combine( + self.DomesticHotWater, other.DomesticHotWater + ), + InternalMassConstruction=OpaqueConstruction.combine( + self.InternalMassConstruction, other.InternalMassConstruction + ), + InternalMassExposedPerFloorArea=self.float_mean( + other, "InternalMassExposedPerFloorArea", weights + ), + Loads=ZoneLoad.combine(self.Loads, other.Loads, weights), + ) + 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["Windows"]: # Could be None + new_attr["Windows"].area = new_obj.area + + new_obj.predecessors.update(self.predecessors + other.predecessors) + return new_obj + + def validate(self): + """Validate object and fill in missing values.""" + if not self.InternalMassConstruction: + 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 " + f"with {self.InternalMassConstruction} and the " + f"'InternalMassExposedPerFloorArea' set to" + f" {self.InternalMassExposedPerFloorArea}" + ) + + if self.Conditioning is None: + self.Conditioning = ZoneConditioning(Name="Unconditioned Zone") + + 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( + Conditioning=self.Conditioning, + Constructions=self.Constructions, + DaylightMeshResolution=self.DaylightMeshResolution, + DaylightWorkplaneHeight=self.DaylightWorkplaneHeight, + DomesticHotWater=self.DomesticHotWater, + InternalMassConstruction=self.InternalMassConstruction, + InternalMassExposedPerFloorArea=self.InternalMassExposedPerFloorArea, + Windows=self.Windows, + Loads=self.Loads, + Ventilation=self.Ventilation, + Category=self.Category, + 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 __add__(self, other): + """Return a combination of self and other.""" + return ZoneDefinition.combine(self, 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, 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, + ] + ) + + def __copy__(self): + """Return a copy of self.""" + return self.__class__(**self.mapping(validate=False)) + + +def resolve_obco(ep_bunch): + """Resolve the outside boundary condition of a surface. + + Args: + ep_bunch (EpBunch): The surface for which we are identifying the boundary + object. + + Returns: + (EpBunch, EpBunch): A tuple of: + + EpBunch: The other surface EpBunch: The other zone + + Notes: + Info on the Outside Boundary Condition Object of a surface of type + BuildingSurface:Detailed: + + Non-blank only if the field `Outside Boundary Condition` is *Surface*, + *Zone*, *OtherSideCoefficients* or *OtherSideConditionsModel*. If + Surface, specify name of corresponding surface in adjacent zone or + specify current surface name for internal partition separating like + zones. If Zone, specify the name of the corresponding zone and the + program will generate the corresponding interzone surface. If + Foundation, specify the name of the corresponding Foundation object and + the program will calculate the heat transfer appropriately. If + OtherSideCoefficients, specify name of + SurfaceProperty:OtherSideCoefficients. If OtherSideConditionsModel, + specify name of SurfaceProperty:OtherSideConditionsModel. + """ + obc = ep_bunch.Outside_Boundary_Condition + + if obc.upper() == "ZONE": + name = ep_bunch.Outside_Boundary_Condition_Object + adj_zone = ep_bunch.theidf.getobject("ZONE", name) + return None, adj_zone + + elif obc.upper() == "SURFACE": + 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 is_core(zone): + """Return true if zone is a core zone. + + Args: + zone (eppy.bunch_subclass.EpBunch): The Zone object. + + Returns: + (bool): Whether the zone is a core zone or not. + """ + # if all surfaces don't have boundary condition == "Outdoors" + iscore = True + for s in zone.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 diff --git a/archetypal/trnsys.py b/archetypal/trnsys.py deleted file mode 100644 index 6a5a102a..00000000 --- a/archetypal/trnsys.py +++ /dev/null @@ -1,2830 +0,0 @@ -################################################################################ -# Module: trnsys.py -# Description: Convert EnergyPlus models to TrnBuild models -# License: MIT, see full license in LICENSE.txt -# Web: https://github.com/samuelduchesne/archetypal -################################################################################ - -import io -import logging as lg -import os -import re -import shutil -import subprocess -import sys -import time -from copy import deepcopy - -import numpy as np -import pandas as pd -from geomeppy.geom.polygons import Polygon3D -from path import Path -from tqdm import tqdm - -from archetypal import ( - log, - settings, - Schedule, - checkStr, - check_unique_name, - angle, - load_idf, - load_idf_object_from_cache, - hash_file, - run_eplus, - recursive_len, - ReportData, -) - - -def convert_idf_to_trnbuild( - idf_file, - weather_file, - window_lib=None, - return_idf=False, - return_b18=True, - return_t3d=False, - return_dck=False, - output_folder=None, - trnsidf_exe=None, - template=None, - log_clear_names=False, - schedule_as_input=True, - **kwargs -): - """Convert regular IDF file (EnergyPlus) to TRNBuild file (TRNSYS) - - There are three optional outputs: - - * the path to the modified IDF with the new names, coordinates, etc. of - the IDF objects. It is an input file for EnergyPlus (.idf) - * the path to the TRNBuild file (.b18) - * the path to the TRNBuild input file (.idf) - * the path to the TRNSYS dck file (.dck) - - Example: - >>> # Exemple of setting kwargs to be unwrapped in the function - >>> kwargs_dict = {'u_value': 2.5, 'shgc': 0.6, 't_vis': 0.78, - >>> 'tolerance': 0.05, "fframe": 0.0, "uframe": 0.5, 'ordered': True} - >>> # Exemple how to call the function - >>> idf_file = "/file.idf" - >>> window_filepath = "/W74-lib.dat" - >>> convert_idf_to_trnbuild(idf_file=idf_file, weather_file=weather_file, - >>> window_lib=window_filepath, - >>> **kwargs_dict) - - Args: - idf_file (str): path to the idf file to convert - weather_file (str): To run EnergyPlus simulation and be able to get some - values (e.g. internal gain, infiltration, etc.) - window_lib (str): File path of the window library (from Berkeley Lab) - return_idf (bool, optional): If True, also return the path to the - modified IDF with the new names, coordinates, etc. of the IDF - objects. It is an input file for EnergyPlus (.idf) - return_b18 (bool, optional): If True, also return the path to the - TRNBuild file (.b18). - return_t3d (bool, optional): If True, also return the path to the - return_dck (bool, optional): If True, also return the path to the TRNSYS - dck file (.dck). - output_folder (str, optional): location where output files will be - trnsidf_exe (str): Path to *trnsidf.exe*. - template (str): Path to d18 template file. - log_clear_names (bool): If True, DOES NOT log the equivalence between - the old and new names in the console. - schedule_as_input (bool): If True, writes the schedules as INPUTS in the BUI - file. Then, the user would have to link in TRNSYS studio the csv file - with the schedules to those INPUTS. If False, the schedules are written as - SCHEDULES in the BUI file. Be aware that this last option (False) can make - crash TRNBuild because the schedules are too long are there is too many - schedules. - kwargs: keyword arguments sent to - :func:`convert_idf_to_trnbuild()` or :func:`trnbuild_idf()` or - :func:`choose_window`. "ordered=True" to have the name of idf - objects in the outputfile in ascendant order. See - :func:`trnbuild_idf` or :func:`choose_window()` for other parameter - definition - - Returns: - (tuple): A tuple containing: - - * return_b18 (str): the path to the TRNBuild file (.b18). Only - provided if *return_b18* is True. - * return_trn (str): the path to the TRNBuild input file (.idf). Only - provided if *return_t3d* is True. - * retrun_dck (str): the path to the TRNSYS dck file (.dck). Only - provided if *return_dck* is True. - """ - - # Assert all path needed exist - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files( - idf_file, weather_file, window_lib, output_folder, trnsidf_exe, template - ) - - # Run EnergyPlus Simulation - ep_version = kwargs.pop("ep_version", None) - outputs = [ - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Thermostat Heating Setpoint Temperature", - Reporting_Frequency="hourly", - save=True, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Thermostat Cooling Setpoint Temperature", - Reporting_Frequency="hourly", - save=True, - ), - }, - ] - _, idf = run_eplus( - idf_file, - weather_file, - output_directory=None, - ep_version=ep_version, - output_report=None, - prep_outputs=outputs, - design_day=False, - annual=True, - expandobjects=True, - return_idf=True, - ) - - # Check if cache exists - # idf = _load_idf_file_and_clean_names(idf_file, log_clear_names) - # Outpout reports - htm = idf.htm - sql = idf.sql - sql_file = idf.sql_file - - # Clean names of idf objects (e.g. 'MATERIAL') - idf_2 = deepcopy(idf) - log("Cleaning names of the IDF objects...", lg.INFO) - start_time = time.time() - clear_name_idf_objects(idf_2, log_clear_names) - log( - "Cleaned IDF object names in {:,.2f} seconds".format(time.time() - start_time), - lg.INFO, - ) - - # Get old:new names equivalence - old_new_names = pd.read_csv( - os.path.join( - settings.data_folder, - Path(idf_file).basename().stripext() + "_old_new_names_equivalence.csv", - ) - ).to_dict() - - # Read IDF_T3D template and write lines in variable - lines = io.TextIOWrapper(io.BytesIO(settings.template_BUI)).readlines() - - # Get objects from IDF file - ( - buildingSurfs, - buildings, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - versions, - zones, - zonelists, - ) = get_idf_objects(idf_2) - - # Get all construction EXCEPT fenestration ones - constr_list = _get_constr_list(buildingSurfs) - - # If ordered=True, ordering idf objects - ordered = kwargs.get("ordered", False) - ( - buildingSurfs, - buildings, - constr_list, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - zones, - zonelists, - ) = _order_objects( - buildingSurfs, - buildings, - constr_list, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - zones, - zonelists, - ordered, - ) - - # region Get schedules from IDF - schedule_names, schedules = _get_schedules(idf_2) - - # Adds ground temperature to schedules - adds_sch_ground(htm, schedule_names, schedules) - - # Adds "sch_setpoint_ZONES" to schedules - df_heating_setpoint = ReportData.from_sqlite( - sql_file, table_name="Zone Thermostat Heating Setpoint Temperature" - ) - df_cooling_setpoint = ReportData.from_sqlite( - sql_file, table_name="Zone Thermostat Cooling Setpoint Temperature" - ) - # Heating - adds_sch_setpoint( - zones, df_heating_setpoint, old_new_names, schedule_names, schedules, "h" - ) - # Cooling - adds_sch_setpoint( - zones, df_cooling_setpoint, old_new_names, schedule_names, schedules, "c" - ) - - # Save schedules to csv file - _yearlySched_to_csv(idf_file, output_folder, schedule_names, schedules) - # endregion - - # Gets and removes from IDF materials with resistance lower than 0.0007 - mat_name = _remove_low_conductivity(constructions, idf_2, materials) - - # Write data from IDF file to T3D file - start_time = time.time() - # Write VERSION from IDF to lines (T3D) - _write_version(lines, versions) - - # Write BUILDING from IDF to lines (T3D) - _write_building(buildings, lines) - - # Write LOCATION and GLOBALGEOMETRYRULES from IDF to lines (T3D) and - # define if coordinate system is "Relative" - coordSys = _write_location_geomrules(globGeomRules, lines, locations) - - # Determine if coordsSystem is "World" (all zones at (0,0,0)) - coordSys = _is_coordSys_world(coordSys, zones) - - # Change coordinates from relative to absolute for building surfaces - _change_relative_coords(buildingSurfs, coordSys, idf_2) - - # Adds or changes adjacent surface if needed - _add_change_adj_surf(buildingSurfs, idf_2) - buildingSurfs = idf_2.idfobjects["BUILDINGSURFACE:DETAILED"] - - # region Write VARIABLEDICTONARY (Zone, BuildingSurf, FenestrationSurf) - # from IDF to lines (T3D) - - # Get all surfaces having Outside boundary condition with the ground. - # To be used to find the window's slopes - n_ground = _get_ground_vertex(buildingSurfs) - - # Writing zones in lines - win_slope_dict = _write_zone_buildingSurf_fenestrationSurf( - buildingSurfs, - coordSys, - fenestrationSurfs, - idf_2, - lines, - n_ground, - zones, - schedule_as_input, - ) - # endregion - - # region Write CONSTRUCTION from IDF to lines (T3D) - _write_constructions(constr_list, idf_2, lines, mat_name, materials) - # endregion - - # Write CONSTRUCTION from IDF to lines, at the end of the T3D file - _write_constructions_end(constr_list, idf_2, lines) - - # region Write LAYER from IDF to lines (T3D) - _write_materials(lines, materialAirGap, materialNoMass, materials) - # endregion - - # region Write GAINS (People, Lights, Equipment) from IDF to lines (T3D) - _write_gains(equipments, lights, lines, peoples, htm, old_new_names) - # endregion - - # region Write basic conditioning systems (HEATING and COOLING) from IDF to lines (T3D) - heat_dict, cool_dict = _write_conditioning( - htm, lines, schedules, old_new_names, schedule_as_input - ) - # endregion - - # region Write SCHEDULES from IDF to lines (T3D) - schedules_not_written = _write_schedules( - lines, schedule_names, schedules, schedule_as_input, idf_file - ) - # endregion - - # region Write WINDOWS chosen by the user (from Berkeley lab library) in - # lines (T3D) - # Get window from library - # window = (win_id, description, design, u_win, shgc_win, t_sol_win, rf_sol, - # t_vis_win, lay_win, width, window_bunches[win_id], - # and maybe tolerance) - log("Get windows info from window library...") - win_u_value = kwargs.get("u_value", 2.2) - win_shgc = kwargs.get("shgc", 0.64) - win_tvis = kwargs.get("t_vis", 0.8) - win_tolerance = kwargs.get("tolerance", 0.05) - win_fframe = kwargs.get("fframe", 0.15) - win_uframe = kwargs.get("uframe", 8.17) - window = choose_window(win_u_value, win_shgc, win_tvis, win_tolerance, window_lib) - - # Write windows in lines - _write_window(lines, win_slope_dict, window, win_fframe, win_uframe) - - # Write window pool in lines - _write_winPool(lines, window) - # endregion - - # Save T3D file at output_folder - output_folder, t3d_path = _save_t3d(idf_file, lines, output_folder) - - log( - "Write data from IDF to T3D in {:,.2f} seconds".format( - time.time() - start_time - ), - lg.INFO, - ) - - # If asked by the user, save IDF file with modification done on the names, - # coordinates, etc. at - # output_folder - new_idf_path = os.path.join(output_folder, "MODIFIED_" + os.path.basename(idf_file)) - if return_idf: - idf_2.saveas(filename=new_idf_path) - - # Run trnsidf to convert T3D to BUI - log("Converting t3d file to bui file. Running trnsidf.exe...") - dck = return_dck - nonum = kwargs.pop("nonum", False) - N = kwargs.pop("N", False) - geo_floor = kwargs.pop("geo_floor", 0.6) - refarea = kwargs.pop("refarea", False) - volume = kwargs.pop("volume", False) - capacitance = kwargs.pop("capacitance", False) - trnbuild_idf( - t3d_path, - output_folder=output_folder, - template=template, - dck=dck, - nonum=nonum, - N=N, - geo_floor=geo_floor, - refarea=refarea, - volume=volume, - capacitance=capacitance, - trnsidf_exe=trnsidf_exe, - ) - - # Prepare return arguments - pre, ext = os.path.splitext(t3d_path) - b18_path = pre + ".b18" - dck_path = pre + ".dck" - - from itertools import compress - - return_path = tuple( - compress( - [new_idf_path, b18_path, t3d_path, dck_path], - [return_idf, return_b18, return_t3d, return_dck], - ) - ) - - # region Modify B18 file - with open(b18_path) as b18_file: - b18_lines = b18_file.readlines() - - # Adds conditionning to B18 file - conditioning_to_b18(b18_lines, heat_dict, cool_dict, zones, old_new_names) - - # Adds infiltration to b18 file - infilt_to_b18(b18_lines, zones, htm) - - # Adds internal gain to b18 file - gains_to_b18( - b18_lines, - zones, - zonelists, - peoples, - lights, - equipments, - schedules_not_written, - htm, - old_new_names, - schedule_as_input, - ) - - # T initial to b18 - t_initial_to_b18(b18_lines, zones, schedules) - - # Save B18 file at output_folder - if output_folder is None: - # User did not provide an output folder path. We use the default setting - output_folder = os.path.relpath(settings.data_folder) - if not os.path.isdir(output_folder): - os.makedirs(output_folder) - with open(b18_path, "w") as converted_file: - for line in b18_lines: - converted_file.writelines(str(line)) - # endregion - - return return_path - - -def t_initial_to_b18(b18_lines, zones, schedules): - for zone in zones: - t_ini = schedules["sch_h_setpoint_" + zone.Name]["all values"][0] - # Get line number where to write TINITIAL - f_count = checkStr(b18_lines, "Z o n e " + zone.Name) - tIniNum = checkStr(b18_lines, "TINITIAL", f_count) - ind_tini = b18_lines[tIniNum - 1].find("TINITIAL") - ind_phini = b18_lines[tIniNum - 1].find("PHINITIAL") - b18_lines[tIniNum - 1] = ( - b18_lines[tIniNum - 1][: ind_tini + len("TINITIAL=")] - + " " - + str(t_ini) - + " : " - + b18_lines[tIniNum - 1][ind_phini:] - + "\n" - ) - - -def adds_sch_setpoint( - zones, report_sqlite, old_new_names, schedule_names, schedules, string -): - for zone in zones: - all_values = report_sqlite[ - report_sqlite.loc[:, "KeyValue"] - == old_new_names[zone.Name.upper()][0].upper() - ].Value.values - schedule_name = "sch_" + string + "_setpoint_" + zone.Name - schedule_names.append(schedule_name) - schedules[schedule_name] = {"all values": all_values} - - -def adds_sch_ground(htm, schedule_names, schedules): - # Get the monthly values from htm output file from EP simulation - values = np.append( - htm["Site:GroundTemperature:BuildingSurface"].values[0][1:], - htm["Site:GroundTemperature:BuildingSurface"].values[0][-1], - ) - # Create array of 8760 values from monthly values - all_values = ( - pd.DataFrame( - values, index=pd.date_range(freq="MS", start="01/01/2019", periods=13) - ) - .resample("H") - .ffill()[:-1] - .T.values[0] - ) - schedule_names.append("sch_ground") - # Adds "sch_ground" to schedules dict - schedules["sch_ground"] = {"all values": all_values} - - -def infilt_to_b18(b18_lines, zones, htm): - try: - mean_infilt = round( - np.average( - htm["ZoneInfiltration Airflow Stats Nominal"][ - "ACH - Air Changes per Hour" - ].values, - weights=htm["ZoneInfiltration Airflow Stats Nominal"][ - "Zone Floor Area {m2}" - ].values, - ), - 3, - ) - except KeyError: - mean_infilt = 0 - - log("Writing infiltration info from idf file to b18 file...") - # Get line number where to write - infiltNum = checkStr(b18_lines, "I n f i l t r a t i o n") - # Write in infiltration section - b18_lines.insert(infiltNum + 1, "INFILTRATION Constant" + "\n") - b18_lines.insert(infiltNum + 2, "AIRCHANGE=" + str(mean_infilt) + "\n") - # Write in zone section - for zone in zones: - f_count = checkStr(b18_lines, "Z o n e " + zone.Name) - regimeInfiltNum = checkStr(b18_lines, "REGIME", f_count) - b18_lines.insert(regimeInfiltNum, " INFILTRATION = Constant" + "\n") - - -def gains_to_b18( - b18_lines, - zones, - zonelists, - peoples, - lights, - equipments, - schedules_not_written, - htm, - old_new_names, - schedule_as_input, -): - peoples_in_zone = zone_where_gain_is(peoples, zones, zonelists) - lights_in_zone = zone_where_gain_is(lights, zones, zonelists) - equipments_in_zone = zone_where_gain_is(equipments, zones, zonelists) - - for zone in zones: - # Write people gains - _write_gain_to_b18( - b18_lines, - zone, - peoples, - peoples_in_zone, - schedules_not_written, - htm, - old_new_names, - "People", - schedule_as_input, - ) - # Write light gains - _write_gain_to_b18( - b18_lines, - zone, - lights, - lights_in_zone, - schedules_not_written, - htm, - old_new_names, - "Lights", - schedule_as_input, - ) - # Write equipment gains - _write_gain_to_b18( - b18_lines, - zone, - equipments, - equipments_in_zone, - schedules_not_written, - htm, - old_new_names, - "ElectricEquipment", - schedule_as_input, - ) - - -def _write_gain_to_b18( - b18_lines, - zone, - gains, - gains_in_zone, - schedules_not_written, - htm, - old_new_names, - string, - schedule_as_input, -): - for gain in gains: - if zone.Name in gains_in_zone[gain.Name]: - f_count = checkStr(b18_lines, "Z o n e " + zone.Name) - regimeNum = checkStr(b18_lines, "REGIME", f_count) - schedule = htm[string + " Internal Gains Nominal"][ - htm[string + " Internal Gains Nominal"]["Name"].str.contains( - old_new_names[gain.Name.upper()][0] - ) - ]["Schedule Name"].values[0] - schedule = [ - key for (key, value) in old_new_names.items() if value[0] == schedule - ][0].lower() - if schedule in schedules_not_written: - continue - # Write - if schedule_as_input: - b18_lines.insert( - regimeNum, - " GAIN= " - + gain.Name - + " : SCALE= INPUT 1*" - + schedule - + " : GEOPOS=0 : SCALE2= 1 : FRAC_REFAREA= 1" - + "\n", - ) - else: - b18_lines.insert( - regimeNum, - " GAIN= " - + gain.Name - + " : SCALE= SCHEDULE 1*" - + schedule - + " : GEOPOS=0 : SCALE2= 1 : FRAC_REFAREA= 1" - + "\n", - ) - - -def conditioning_to_b18(b18_lines, heat_dict, cool_dict, zones, old_new_names): - for zone in zones: - # Heating - _write_heat_cool_to_b18(heat_dict, old_new_names, zone, b18_lines, " HEATING") - # Cooling - _write_heat_cool_to_b18(cool_dict, old_new_names, zone, b18_lines, " COOLING") - - -def _write_heat_cool_to_b18(list_dict, old_new_names, zone, b18_lines, string): - for key in list_dict.keys(): - if old_new_names[zone.Name.upper()][0] in key: - f_count = checkStr(b18_lines, "Z o n e " + zone.Name) - regimeNum = checkStr(b18_lines, "REGIME", f_count) - # Write - if not isinstance(list_dict[key], list): - value = list_dict[key] - else: - value = list_dict[key][0] - b18_lines.insert(regimeNum, string + " = " + value + "\n") - - -def zone_where_gain_is(gains, zones, zonelists): - gain_in_zone = {} - for gain in gains: - list_zone = [] - for zone in zones: - if zone.Name == gain.Zone_or_ZoneList_Name: - list_zone.append([zone.Name]) - for zonelist in zonelists: - if zonelist.Name == gain.Zone_or_ZoneList_Name: - list_zone.append(zonelist.fieldvalues[2:]) - - flat_list = [item for sublist in list_zone for item in sublist] - gain_in_zone[gain.Name] = flat_list - - return gain_in_zone - - -def _change_relative_coords(buildingSurfs, coordSys, idf): - if coordSys == "Relative": - # Add zone coordinates to X, Y, Z vectors - for buildingSurf in buildingSurfs: - surf_zone = buildingSurf.Zone_Name - incrX, incrY, incrZ = zone_origin(idf.getobject("ZONE", surf_zone)) - _relative_to_absolute(buildingSurf, incrX, incrY, incrZ) - - -def _yearlySched_to_csv(idf_file, output_folder, schedule_names, schedules): - log("Saving yearly schedules in CSV file...") - idf_file = Path(idf_file) - df_sched = pd.DataFrame() - schedule_names.sort() - for schedule_name in schedule_names: - df_sched[schedule_name] = schedules[schedule_name]["all values"] - sched_file_name = "yearly_schedules_" + idf_file.basename().stripext() + ".csv" - output_folder = Path(output_folder) - if not output_folder.exists(): - output_folder.mkdir_p() - df_sched.to_csv(path_or_buf=os.path.join(output_folder, sched_file_name)) - - -def _get_constr_list(buildingSurfs): - constr_list = [] - for buildingSurf in buildingSurfs: - constr_list.append(buildingSurf.Construction_Name) - constr_list = list(set(constr_list)) - constr_list.sort() - return constr_list - - -def _save_t3d(idf_file, lines, output_folder): - """Saves T3D file - - Args: - idf_file (str): path to the idf file to convert - lines (list): lines to copy in the T3D file - output_folder (str): path to the output folder (can be None) - - Returns: - output_folder (str): path to the output folder - t3d_path (str): path to the T3D file - - """ - if output_folder is None: - # User did not provide an output folder path. We use the default setting - output_folder = os.path.relpath(settings.data_folder) - if not os.path.isdir(output_folder): - os.makedirs(output_folder) - t3d_path = os.path.join(output_folder, "T3D_" + os.path.basename(idf_file)) - with open(t3d_path, "w") as converted_file: - for line in lines: - converted_file.writelines(str(line)) - return output_folder, t3d_path - - -def _remove_low_conductivity(constructions, idf, materials): - """Removes materials form idf with conductivity too low (0.0007 kJ/h-m-K) - - Args: - constructions (Idf_MSequence): CONSTRUCTION object from the IDF - idf (archetypal.idfclass.IDF object at 0x11e3d3208): the IDf object - materials (Idf_MSequence): MATERIAL object from the IDF - - Returns: - mat_name (list): list of name of the removed materials - - """ - material_low_res = [] - for material in materials: - if material.Thickness / (material.Conductivity * 3.6) < 0.0007: - material_low_res.append(material) - # Remove materials with resistance lower than 0.0007 from IDF - mat_name = [] - for mat in material_low_res: - mat_name.append(mat.Name) - idf.removeidfobject(mat) - # Get constructions with only materials with resistance lower than 0.0007 - construct_low_res = [] - for i in range(0, len(constructions)): - if ( - len(constructions[i].fieldvalues) == 3 - and constructions[i].fieldvalues[2] in mat_name - ): - construct_low_res.append(constructions[i]) - # Remove constructions with only materials with resistance lower than - # 0.0007 from IDF - for construct in construct_low_res: - idf.removeidfobject(construct) - return mat_name - - -def _order_objects( - buildingSurfs, - buildings, - constr_list, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - zones, - zonelists, - ordered=True, -): - """ - - Args: - ordered: - materials (Idf_MSequence): MATERIAL object from the IDF - materialNoMass (Idf_MSequence): MATERIAL:NOMASS object from the IDF - materialAirGap (Idf_MSequence): MATERIAL:AIRGAP object from the IDF - versions (Idf_MSequence): VERSION object from the IDF - buildings (Idf_MSequence): BUILDING object from the IDF - locations (Idf_MSequence): SITE:LOCATION object from the IDF - globGeomRules (Idf_MSequence): GLOBALGEOMETRYRULES object from the IDF - constructions (Idf_MSequence): CONSTRUCTION object from the IDF - buildingSurfs (Idf_MSequence): BUILDINGSURFACE:DETAILED object - from the IDF - fenestrationSurfs (Idf_MSequence): FENESTRATIONSURFACE:DETAILED object - from the IDF - zones (Idf_MSequence): ZONE object from the IDF - peoples (Idf_MSequence): PEOPLE object from the IDF - lights (Idf_MSequence): LIGHTs object from the IDF - equipments (Idf_MSequence): EQUIPMENT object from the IDF - - Returns: - IDF objects (see Args) with their order reversed - - """ - if ordered: - materials = list(reversed(materials)) - materialNoMass = list(reversed(materialNoMass)) - materialAirGap = list(reversed(materialAirGap)) - buildings = list(reversed(buildings)) - locations = list(reversed(locations)) - globGeomRules = list(reversed(globGeomRules)) - constructions = list(reversed(constructions)) - fenestrationSurfs = list(reversed(fenestrationSurfs)) - buildingSurfs = list(reversed(buildingSurfs)) - zones = list(reversed(zones)) - zonelists = list(reversed(zonelists)) - peoples = list(reversed(peoples)) - lights = list(reversed(lights)) - equipments = list(reversed(equipments)) - constr_list = list(reversed(constr_list)) - return ( - buildingSurfs, - buildings, - constr_list, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - zones, - zonelists, - ) - - -def get_idf_objects(idf): - """Gets idf objects - - Args: - idf (archetypal.idfclass.IDF object at 0x11e3d3208): the IDf object - - Returns: - materials (Idf_MSequence): MATERIAL object from the IDF - materialNoMass (Idf_MSequence): MATERIAL:NOMASS object from the IDF - materialAirGap (Idf_MSequence): MATERIAL:AIRGAP object from the IDF - versions (Idf_MSequence): VERSION object from the IDF - buildings (Idf_MSequence): BUILDING object from the IDF - locations (Idf_MSequence): SITE:LOCATION object from the IDF - globGeomRules (Idf_MSequence): GLOBALGEOMETRYRULES object from the IDF - constructions (Idf_MSequence): CONSTRUCTION object from the IDF - buildingSurfs (Idf_MSequence): BUILDINGSURFACE:DETAILED object - from the IDF - fenestrationSurfs (Idf_MSequence): FENESTRATIONSURFACE:DETAILED object - from the IDF - zones (Idf_MSequence): ZONE object from the IDF - peoples (Idf_MSequence): PEOPLE object from the IDF - lights (Idf_MSequence): LIGHTs object from the IDF - equipments (Idf_MSequence): EQUIPMENT object from the IDF - - """ - materials = idf.idfobjects["MATERIAL"] - materialNoMass = idf.idfobjects["MATERIAL:NOMASS"] - materialAirGap = idf.idfobjects["MATERIAL:AIRGAP"] - versions = idf.idfobjects["VERSION"] - buildings = idf.idfobjects["BUILDING"] - locations = idf.idfobjects["SITE:LOCATION"] - globGeomRules = idf.idfobjects["GLOBALGEOMETRYRULES"] - constructions = idf.idfobjects["CONSTRUCTION"] - fenestrationSurfs = idf.idfobjects["FENESTRATIONSURFACE:DETAILED"] - buildingSurfs = idf.idfobjects["BUILDINGSURFACE:DETAILED"] - zones = idf.idfobjects["ZONE"] - peoples = idf.idfobjects["PEOPLE"] - lights = idf.idfobjects["LIGHTS"] - equipments = idf.idfobjects["ELECTRICEQUIPMENT"] - zonelists = idf.idfobjects["ZONELIST"] - return ( - buildingSurfs, - buildings, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - versions, - zones, - zonelists, - ) - - -def load_idf_file_and_clean_names(idf_file, log_clear_names): - """Load idf file from cache if cache exist and user ask for use_cache=True. - Moreover cleans idf object names and log in the console the equivalence - between the old and new names if log_clear_names=False - - Args: - idf_file (str): Path to the idf file - log_clear_names (bool): If True, DOES NOT log the equivalence between - the old and new names in the console. - - Returns: - idf (archetypal.idfclass.IDF object at 0x11e3d3208): the IDf object - - """ - log("Loading IDF file...", lg.INFO) - start_time = time.time() - cache_filename = hash_file(idf_file) - idf = load_idf_object_from_cache(idf_file, how="idf") - if not idf: - # Load IDF file(s) - idf = load_idf(idf_file) - log( - "IDF files loaded in {:,.2f} seconds".format(time.time() - start_time), - lg.INFO, - ) - # Clean names of idf objects (e.g. 'MATERIAL') - log("Cleaning names of the IDF objects...", lg.INFO) - start_time = time.time() - clear_name_idf_objects(idf, log_clear_names) - path = os.path.join( - settings.cache_folder, cache_filename, cache_filename + ".idf" - ) - if not os.path.exists(os.path.dirname(path)): - os.makedirs(os.path.dirname(path)) - idf.saveas(filename=path) - # save_idf_object_to_cache(idf, idf_file, cache_filename, 'pickle') - log( - "Cleaned IDF object names in {:,.2f} seconds".format( - time.time() - start_time - ), - lg.INFO, - ) - return idf - - -def _assert_files( - idf_file, weather_file, window_lib, output_folder, trnsidf_exe, template -): - """Ensure the files and directory are here - - Args: - idf_file (str): path to the idf file to convert - window_lib (str): File path of the window library (from Berkeley Lab) - output_folder (str): path to the output folder (can be None) - trnsidf_exe (str): Path to *trnsidf.exe*. - template (str): Path to d18 template file. - """ - if isinstance(idf_file, str): - if not os.path.isfile(idf_file): - raise IOError("idf_file file not found") - else: - raise IOError("idf_file file is not a string (path)") - - if isinstance(weather_file, str): - if not os.path.isfile(weather_file): - raise IOError("weather file not found") - else: - raise IOError("weather file is not a string (path)") - - if window_lib: - if isinstance(window_lib, str): - if not os.path.isfile(window_lib): - raise IOError("window_lib file not found") - else: - raise IOError("window_lib file is not a string (path)") - - if not output_folder: - output_folder = os.path.relpath(settings.data_folder) - if not os.path.exists(output_folder): - os.mkdir(output_folder) - - if not template: - template = settings.path_template_d18 - - if not os.path.isfile(template): - raise IOError("template file not found") - - if not trnsidf_exe: - trnsidf_exe = settings.trnsys_default_folder / Path( - r"Building\trnsIDF\trnsidf.exe" - ) - - if not os.path.isfile(trnsidf_exe): - raise IOError("trnsidf.exe not found") - - return idf_file, weather_file, window_lib, output_folder, trnsidf_exe, template - - -def _add_change_adj_surf(buildingSurfs, idf): - """Adds or changes adjacent surfaces if needed - - Args: - buildingSurfs (idf_MSequence): IDF object from idf.idfobjects(). List of - building surfaces ("BUILDINGSURFACE:DETAILED" in the IDF). Building - surfaces to iterate over and determine if either a change on an - adjacent surface is needed or the creation of a new one - idf (archetypal.idfclass.IDF): IDF object - """ - adj_surfs_to_change = {} - adj_surfs_to_make = [] - for buildingSurf in buildingSurfs: - if "zone" in buildingSurf.Outside_Boundary_Condition.lower(): - # Get the surface EpBunch that is adjacent to the building surface - outside_bound_zone = buildingSurf.Outside_Boundary_Condition_Object - surfs_in_bound_zone = [ - surf for surf in buildingSurfs if surf.Zone_Name == outside_bound_zone - ] - poly_buildingSurf = Polygon3D(buildingSurf.coords) - n_buildingSurf = poly_buildingSurf.normal_vector - area_build = poly_buildingSurf.area - centroid_build = poly_buildingSurf.centroid - # Check if buildingSurf has an adjacent surface - for surf in surfs_in_bound_zone: - if surf.Outside_Boundary_Condition.lower() == "outdoors": - poly_surf_bound = Polygon3D(surf.coords) - n_surf_bound = poly_surf_bound.normal_vector - area_bound = poly_surf_bound.area - centroid_bound = poly_surf_bound.centroid - # Check if boundary surface already exist: sum of normal - # vectors must be equal to 0 AND surfaces must have the - # same centroid AND surfaces must have the same area - if ( - round(n_surf_bound.x + n_buildingSurf.x, 3) == 0 - and round(n_surf_bound.y + n_buildingSurf.y, 3) == 0 - and round(n_surf_bound.z + n_buildingSurf.z, 3) == 0 - and round(centroid_bound.x, 3) == round(centroid_build.x, 3) - and round(centroid_bound.y, 3) == round(centroid_build.y, 3) - and round(centroid_bound.z, 3) == round(centroid_build.z, 3) - and round(area_bound, 3) == round(area_build, 3) - ): - # If boundary surface exists, append the list of surface - # to change - if not surf.Name in adj_surfs_to_change: - adj_surfs_to_change[buildingSurf.Name] = surf.Name - break - # If boundary surface does not exist, append the list of surface - # to create - if not buildingSurf.Name in adj_surfs_to_change: - if not buildingSurf.Name in adj_surfs_to_make: - adj_surfs_to_make.append(buildingSurf.Name) - # If adjacent surface found, check if Outside boundary - # condition is a Zone and not "Outdoors" - for key, value in adj_surfs_to_change.items(): - idf.getobject( - "BUILDINGSURFACE:DETAILED", value - ).Outside_Boundary_Condition = "Zone" - idf.getobject( - "BUILDINGSURFACE:DETAILED", value - ).Outside_Boundary_Condition_Object = idf.getobject( - "BUILDINGSURFACE:DETAILED", key - ).Zone_Name - idf.getobject( - "BUILDINGSURFACE:DETAILED", value - ).Construction_Name = idf.getobject( - "BUILDINGSURFACE:DETAILED", key - ).Construction_Name - # If did not find any adjacent surface - for adj_surf_to_make in adj_surfs_to_make: - buildSurf = idf.getobject("BUILDINGSURFACE:DETAILED", adj_surf_to_make) - surf_type = buildSurf.Surface_Type - if surf_type.lower() == "wall": - surf_type_bound = "Wall" - if surf_type.lower() == "floor": - surf_type_bound = "Ceiling" - if surf_type.lower() == "ceiling": - surf_type_bound = "Floor" - if surf_type.lower() == "roof": - surf_type_bound = "Floor" - # Create a new surface - idf.newidfobject( - "BUILDINGSURFACE:DETAILED", - Name=buildSurf.Name + "_adj", - Surface_Type=surf_type_bound, - Construction_Name=buildSurf.Construction_Name, - Zone_Name=buildSurf.Outside_Boundary_Condition_Object, - Outside_Boundary_Condition="Zone", - Outside_Boundary_Condition_Object=buildSurf.Zone_Name, - Sun_Exposure="NoSun", - Wind_Exposure="NoWind", - View_Factor_to_Ground="autocalculate", - Number_of_Vertices=buildSurf.Number_of_Vertices, - Vertex_1_Xcoordinate=buildSurf.Vertex_4_Xcoordinate, - Vertex_1_Ycoordinate=buildSurf.Vertex_4_Ycoordinate, - Vertex_1_Zcoordinate=buildSurf.Vertex_4_Zcoordinate, - Vertex_2_Xcoordinate=buildSurf.Vertex_3_Xcoordinate, - Vertex_2_Ycoordinate=buildSurf.Vertex_3_Ycoordinate, - Vertex_2_Zcoordinate=buildSurf.Vertex_3_Zcoordinate, - Vertex_3_Xcoordinate=buildSurf.Vertex_2_Xcoordinate, - Vertex_3_Ycoordinate=buildSurf.Vertex_2_Ycoordinate, - Vertex_3_Zcoordinate=buildSurf.Vertex_2_Zcoordinate, - Vertex_4_Xcoordinate=buildSurf.Vertex_1_Xcoordinate, - Vertex_4_Ycoordinate=buildSurf.Vertex_1_Ycoordinate, - Vertex_4_Zcoordinate=buildSurf.Vertex_1_Zcoordinate, - ) - - -def _get_schedules(idf): - """Get schedules from IDF - - Args: - idf (archetypal.idfclass.IDF): IDF object - """ - start_time = time.time() - log("Reading schedules from the IDF file...") - schedule_names = [] - used_schedules = idf.get_used_schedules(yearly_only=True) - schedules = {} - for schedule_name in used_schedules: - s = Schedule( - schedule_name, idf, start_day_of_the_week=idf.day_of_week_for_start_day - ) - - schedule_names.append(schedule_name) - schedules[schedule_name] = {} - year, weeks, days = s.to_year_week_day() - schedules[schedule_name]["all values"] = s.all_values - schedules[schedule_name]["year"] = year - # schedules[schedule_name]["weeks"] = weeks - # schedules[schedule_name]["days"] = days - - log( - "Got yearly, weekly and daily schedules in {:,.2f} seconds".format( - time.time() - start_time - ), - lg.INFO, - ) - return schedule_names, schedules - - -def clear_name_idf_objects(idfFile, log_clear_names=False): - """Clean names of IDF objects. - - Replaces variable names with a unique name, easy to refer to the original - object. For example : if object is the n-th "Schedule Type Limit", then the - new name will be "stl_00000n" - limits length to 10 characters - - Args: - idfFile (archetypal.idfclass.IDF): IDF object where to clean names - log_clear_names: - """ - - uniqueList = [] - old_name_list = [] - old_new_eq = {} - - # For all categories of objects in the IDF file - for obj in tqdm(idfFile.idfobjects, desc="cleaning_names"): - epObjects = idfFile.idfobjects[obj] - - # For all objects in Category - count_name = 0 - for epObject in epObjects: - # Do not take fenestration, to be treated later - try: - fenestration = [ - s - for s in ["fenestration", "shgc", "window", "glazing"] - if s in epObject.Name.lower() or s in epObject.key.lower() - ] - except: - fenestration = [] - if not fenestration: - try: - old_name = epObject.Name - # For TRNBuild compatibility we oblige the new name to - # begin by a lowercase letter and the new name is max 10 - # characters. The new name is done with the uppercase of - # the epObject type and an increment depending on the number - # of this epObject type. Making sure we - # have an unique new name - list_word_epObject_type = re.sub( - r"([A-Z])", r" \1", epObject.fieldvalues[0] - ).split() - # Making sure new name will be max 10 characters - if len(list_word_epObject_type) > 4: - list_word_epObject_type = list_word_epObject_type[:4] - - first_letters = "".join( - word[0].lower() for word in list_word_epObject_type - ) - end_count = "%06d" % count_name - new_name = first_letters + "_" + end_count - - # Make sure new name does not already exist - new_name, count_name = check_unique_name( - first_letters, count_name, new_name, uniqueList - ) - - uniqueList.append(new_name) - old_name_list.append(old_name) - old_new_eq[new_name.upper()] = old_name.upper() - - # Changing the name in the IDF object - idfFile.rename(obj, old_name, new_name) - except: - pass - else: - continue - - # Save equivalence between old and new names - df = pd.DataFrame([old_new_eq]) - if not os.path.isdir(settings.data_folder): - os.makedirs(settings.data_folder) - df.to_csv( - os.path.join( - settings.data_folder, idfFile.name[:-4] + "_old_new_names_equivalence.csv" - ) - ) - - d = {"Old names": old_name_list, "New names": uniqueList} - from tabulate import tabulate - - log_name = os.path.basename(idfFile.idfname) + "_clear_names.log" - log_msg = ( - "Here is the equivalence between the old names and the new " - "ones." + "\n\n" + tabulate(d, headers="keys") - ) - log(log_msg, name=log_name, level=lg.INFO, avoid_console=log_clear_names) - - -def zone_origin(zone_object): - """Return coordinates of a zone - - Args: - zone_object (EpBunch): zone element in zone list. - - Returns: - Coordinates [X, Y, Z] of the zone in a list. - """ - x = zone_object.X_Origin - if x == "": - x = 0 - y = zone_object.Y_Origin - if y == "": - y = 0 - z = zone_object.Z_Origin - if z == "": - z = 0 - return [x, y, z] - - -def closest_coords(surfList, to=[0, 0, 0]): - """Find closest coordinates to given ones - - Args: - surfList (idf_MSequence): list of surfaces with coordinates of each one. - to (list): list of coordinates we want to calculate the distance from. - - Returns: - the closest point (its coordinates x, y, z) to the point chosen (input - "to") - """ - from scipy.spatial import cKDTree - - size = recursive_len([buildingSurf.coords for buildingSurf in surfList]) - tuple_list = [] - for surf in surfList: - for i in range(0, len(surf.coords)): - tuple_list.append(surf.coords[i]) - - nbdata = np.array(tuple_list) - btree = cKDTree(data=nbdata, compact_nodes=True, balanced_tree=True) - dist, idx = btree.query(np.array(to).T, k=1) - x, y, z = nbdata[idx] - return x, y, z - - -def parse_window_lib(window_file_path): - """Function that parse window library from Berkeley Lab in two parts. First - part is a dataframe with the window characteristics. Second part is a - dictionary with the description/properties of each window. - - Args: - window_file_path (str): Path to the window library - - Returns: - tuple: a tuple of: - - * dataframe: df_windows, a dataframe with the window characteristics - in the columns and the window id as rows - * dict: bunches, a dict with the window id as key and - description/properties of each window as value - """ - - # Read window library and write lines in variable - if window_file_path is None: - all_lines = io.TextIOWrapper(io.BytesIO(settings.template_winLib)).readlines() - else: - all_lines = open(window_file_path).readlines() - - # Select list of windows at the end of the file - end = "*** END OF LIBRARY ***" - indice_end = [k for k, s in enumerate(all_lines) if end in s] - - window_list = all_lines[indice_end[0] + 1 :] - - # Delete asterisk lines - asterisk = "*" - indices_asterisk = [k for k, line in enumerate(window_list) if asterisk in line] - window_list = [ - ",".join(line.split()) - for i, line in enumerate(window_list) - if i not in indices_asterisk - ] - - # Save lines_for_df in text file - # User did not provide an output folder path. We use the default setting - data_dir = os.path.relpath(settings.data_folder) - - if not os.path.isdir(data_dir): - os.mkdir(data_dir) - - with open(os.path.join(data_dir, "winPOOL.txt"), "w") as converted_file: - for line in window_list: - converted_file.write(str(line) + "\n") - - df_windows = pd.read_csv(os.path.join(data_dir, "winPOOL.txt"), header=None) - columns = [ - "WinID", - "Description", - "Design", - "u_value", - "g_value", - "T_sol", - "Rf_sol", - "t_vis", - "Lay", - "Width", - ] - df_windows.columns = columns - - # Select list of windows with all their characteristics (bunch) - bunch_delimiter = ( - "BERKELEY LAB WINDOW v7.4.6.0 DOE-2 Data File : Multi " - "Band Calculation : generated with Trnsys18.std\n" - ) - detailed_windows = all_lines[0 : indice_end[0]] - - # 1 window = 55 lines - bunches_list = list(chunks(detailed_windows, 55)) - - bunches = dict(get_window_id(bunches_list)) - - return df_windows, bunches - - -def get_window_id(bunches): - """Return bunch of window properties with their window id - - Args: - bunches (dict): dict with the window id as key and - description/properties of each window as value - """ - id_line = "Window ID :" - for bunch in bunches: - for line in bunch: - if id_line in line: - _, value = line.split(":") - value = int(value.strip()) - yield value, bunch - - -def chunks(l, n): - """Yield successive n-sized chunks from l - - Args: - l (list): list to divide in chunks - n (int): number of chunks we want - """ - for i in range(0, len(l), n): - yield l[i : i + n] - - -def choose_window(u_value, shgc, t_vis, tolerance, window_lib_path): - """Return window object from TRNBuild library - - Returns - (tuple): A tuple of: - - * window_ID - * window's description (label) - * window's design (width of layers) - * window u-value - * window shgc - * window solar transmittance - * window solar refraction - * window visible transmittance - * number of layers of the window - * window width - * the "bunch" of description/properties from Berkeley lab - - If tolerance not respected return new tolerance used to find a - window. - - Args: - u_value (float): U_value of the glazing given by the user - shgc (float): SHGC of the glazing given by the user - t_vis (float): Visible transmittance of the glazing given by the user - tolerance (float): Maximum tolerance on u_value, shgc and tvis wanted by - the user - window_lib_path (.dat file): window library from Berkeley lab - """ - # Init "warn" variable (0 or 1) to log a warning if tolerance not respected - warn = 0 - - # Making sure u_value, shgc and tvis are float - if not isinstance(u_value, float): - u_value = float(u_value) - if not isinstance(shgc, float): - shgc = float(shgc) - if not isinstance(t_vis, float): - t_vis = float(t_vis) - if not isinstance(tolerance, float): - tolerance = float(tolerance) - - # Parse window library - df_windows, window_bunches = parse_window_lib(window_lib_path) - - # Find window(s) in the tolerance limit - cond1 = (df_windows["u_value"] <= u_value * (1 + tolerance)) & ( - df_windows["u_value"] >= u_value * (1 - tolerance) - ) - cond2 = (df_windows["g_value"] <= shgc * (1 + tolerance)) & ( - df_windows["g_value"] >= shgc * (1 - tolerance) - ) - cond3 = (df_windows["t_vis"] <= t_vis * (1 + tolerance)) & ( - df_windows["t_vis"] >= t_vis * (1 - tolerance) - ) - - # Every window's IDs satisfying the tolerance - win_ids = df_windows.loc[(cond1 & cond2 & cond3), "WinID"] - - # If nothing found, increase the tolerance - while win_ids.empty: - warn = 1 - tolerance += 0.01 - cond1 = (df_windows["u_value"] <= u_value * (1 + tolerance)) & ( - df_windows["u_value"] >= u_value * (1 - tolerance) - ) - cond2 = (df_windows["g_value"] <= shgc * (1 + tolerance)) & ( - df_windows["g_value"] >= shgc * (1 - tolerance) - ) - cond3 = (df_windows["t_vis"] <= t_vis * (1 + tolerance)) & ( - df_windows["t_vis"] >= t_vis * (1 - tolerance) - ) - win_ids = df_windows.loc[(cond1 & cond2 & cond3), "WinID"] - - # If several windows found, get the one with the minimal square error sum. - best_window_index = ( - df_windows.loc[win_ids.index, :] - .apply( - lambda x: (x.u_value - u_value) ** 2 - + (x.g_value - shgc) ** 2 - + (x.t_vis - t_vis) ** 2, - axis=1, - ) - .idxmin() - ) - ( - win_id, - description, - design, - u_win, - shgc_win, - t_sol_win, - rf_sol_win, - t_vis_win, - lay_win, - width, - ) = df_windows.loc[ - best_window_index, - [ - "WinID", - "Description", - "Design", - "u_value", - "g_value", - "T_sol", - "Rf_sol", - "t_vis", - "Lay", - "Width", - ], - ] - - # If tolerance was not respected to find a window, write in log a warning - if warn: - log( - "Window tolerance was not respected. Final tolerance = " - "{:,.2f}".format(tolerance), - lg.WARNING, - ) - # Write in log (info) the characteristics of the window - log( - "Characterisitics of the chosen window are: u_value = {:,.2f}, " - "SHGC= {:,.2f}, t_vis= {:,.2f}".format(u_win, shgc_win, t_vis_win), - lg.INFO, - ) - - # If warn = 1 (tolerance not respected) return tolerance - if warn: - return ( - win_id, - description, - design, - u_win, - shgc_win, - t_sol_win, - rf_sol_win, - t_vis_win, - lay_win, - width, - window_bunches[win_id], - tolerance, - ) - else: - return ( - win_id, - description, - design, - u_win, - shgc_win, - t_sol_win, - rf_sol_win, - t_vis_win, - lay_win, - width, - window_bunches[win_id], - ) - - -def trnbuild_idf( - idf_file, - output_folder=None, - template=None, - dck=False, - nonum=False, - N=False, - geo_floor=0.6, - refarea=False, - volume=False, - capacitance=False, - trnsidf_exe=None, -): - """This program sorts and renumbers the IDF file and writes a B18 file based - on the geometric information of the IDF file and the template D18 file. In - addition, an template DCK file can be generated. - - Important: - Where settings.trnsys_default_folder must be defined inside the - configuration file of the package - - Example: - >>> # Exemple of setting kwargs to be unwrapped in the function - >>> kwargs_dict = {'dck': True, 'geo_floor': 0.57} - >>> # Exemple how to call the function - >>> trnbuild_idf(idf_file,template=os.path.join( - >>> settings.trnsys_default_folder, - >>> r"Building\\trnsIDF\\NewFileTemplate.d18" - - Args: - idf_file (str): path/filename.idf to the T3D file "a SketchUp idf file" - output_folder (str, optional): location where output files will be - template (str): path/NewFileTemplate.d18 - dck (bool): If True, create a template DCK - nonum (bool, optional): If True, no renumeration of surfaces - N (optional): BatchJob Modus - geo_floor (float, optional): generates GEOSURF values for distributing - direct solar radiation where `geo_floor` % is directed to the floor, - the rest to walls/windows. Default = 0.6 - refarea (bool, optional): If True, floor reference area of airnodes is - updated - volume (bool, True): If True, volume of airnodes is updated - capacitance (bool, True): If True, capacitance of airnodes is updated - trnsidf_exe (str): Path of the trnsidf.exe executable - - Returns: - str: status - - Raises: - CalledProcessError: When could not run command with trnsidf.exe (to - create BUI file from IDF (T3D) file - """ - # assert files - if not trnsidf_exe: - trnsidf_exe = os.path.join( - settings.trnsys_default_folder, r"Building\trnsIDF\trnsidf.exe" - ) - - if not os.path.isfile(trnsidf_exe): - raise IOError("trnsidf.exe not found") - - if not template: - template = settings.path_template_d18 - - if not os.path.isfile(template): - raise IOError("template file not found") - - # first copy idf_file into output folder - if not output_folder: - output_folder = settings.data_folder - if not os.path.isdir(output_folder): - os.mkdir(output_folder) - head, tail = os.path.split(idf_file) - new_idf_file = os.path.abspath(os.path.join(output_folder, tail)) - if new_idf_file != os.path.abspath(idf_file): - shutil.copy(idf_file, new_idf_file) - idf_file = os.path.abspath(new_idf_file) # back to idf_file - del new_idf_file, head, tail - - # Continue - args = locals().copy() - idf = os.path.abspath(args.pop("idf_file")) - template = os.path.abspath(args.pop("template")) - trnsysidf_exe = os.path.abspath(args.pop("trnsidf_exe")) - - if not os.path.isfile(idf) or not os.path.isfile(template): - raise FileNotFoundError() - - if sys.platform == "win32": - cmd = [trnsysidf_exe] - else: - cmd = ["wine", trnsysidf_exe] - cmd.extend([idf]) - cmd.extend([template]) - for arg in args: - if args[arg]: - if isinstance(args[arg], bool): - args[arg] = "" - if args[arg] != "": - cmd.extend(["/{}={}".format(arg, args[arg])]) - else: - cmd.extend(["/{}".format(arg)]) - - try: - # execute the command - log("Running cmd: {}".format(cmd), lg.DEBUG) - command_line_process = subprocess.Popen( - cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT - ) - process_output, _ = command_line_process.communicate() - # process_output is now a string, not a file - log(process_output.decode("utf-8"), lg.DEBUG) - except subprocess.CalledProcessError as exception: - log("Exception occured: " + str(exception), lg.ERROR) - log("Trnsidf.exe failed", lg.ERROR) - return False - else: - # Send trnsidf log to logger - pre, ext = os.path.splitext(idf) - log_file = pre + ".log" - if os.path.isfile(log_file): - with open(log_file, "r") as f: - log(f.read(), lg.DEBUG) - - return True - - -def _write_zone_buildingSurf_fenestrationSurf( - buildingSurfs, - coordSys, - fenestrationSurfs, - idf, - lines, - n_ground, - zones, - schedule_as_input, -): - """Does several actions on the zones, fenestration and building surfaces. - Then, writes zone, fenestration and building surfaces information in lines. - - Zones: - 1. If the geometry global rule is 'World', convert zone's coordinates to - absolute. - 2. Rounds zone's coordinates to 4 decimal. - 3. Write zones in lines (T3D file). - - Fenestration surfaces: - 1. If the geometry global rule is 'Relative', convert fenestration's - coordinates to absolute. - 2. Find the window slope and create a new window object (to write in T3D - file) for each different slope. - 3. Rounds fenestration surface's coordinates to 4 decimal. - 4. Write fenestration surfaces in lines (T3D file). - - Building surfaces: - 1. If the geometry global rule is 'Relative', convert building surface's - coordinates to absolute. - 2. Determine the outside boundary condition (eg. 'ground') of each - surface. If boundary is 'surface' or 'zone', modify the surface to - make sure adjancency is well done between surfaces (see - _modify_adj_surface()). If boundary is 'ground', apply ground - temperature to the Outside_Boundary_Condition_Object. If the boundary - is 'adiabatic', apply an IDENTICAL boundary to the - Outside_Boundary_Condition_Object. - 3. Rounds building surface's coordinates to 4 decimal - 4. Write building surfaces in lines (T3D file) - - Args: - buildingSurfs (idf_MSequence): IDF object from idf.idfobjects(). List of - building surfaces ("BUILDINGSURFACE:DETAILED" in the IDF). - coordSys (str): Coordinate system of the IDF file. Can be 'Absolute' - fenestrationSurfs (idf_MSequence): IDF object from idf.idfobjects(). - List of fenestration surfaces ("FENESTRATIONSURFACE:DETAILED" in the - IDF). - idf (archetypal.idfclass.IDF): IDF object - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - n_ground (Vector 3D): Normal vector of the ground surface - zones (idf_MSequence): IDF object from idf.idfobjects(). List of zones - ("ZONES" in the IDF). - """ - # Get line number where to write - variableDictNum = checkStr( - lines, "ALL OBJECTS IN CLASS: " "OUTPUT:VARIABLEDICTIONARY" - ) - # Initialize list of window's slopes - count_slope = 0 - win_slope_dict = {} - log( - "Writing geometry (zones, building and fenestration surfaces info from " - "idf file to t3d file..." - ) - count_fs = 0 - for zone in zones: - zone.Direction_of_Relative_North = 0.0 - if zone.Multiplier == "": - zone.Multiplier = 1 - # Coords of zone - incrX, incrY, incrZ = zone_origin(zone) - - # Writing fenestrationSurface:Detailed in lines - for fenestrationSurf in fenestrationSurfs: - surfName = fenestrationSurf.Building_Surface_Name - if ( - idf.getobject("BUILDINGSURFACE:DETAILED", surfName).Zone_Name - == zone.Name - ): - count_fs += 1 - # Clear fenestrationSurface:Detailed name - fenestrationSurf.Name = "fsd_" + "%06d" % count_fs - # Insure right number of vertices - fenestrationSurf.Number_of_Vertices = len(fenestrationSurf.coords) - - # Change coordinates from relative to absolute - if coordSys == "Relative": - # Add zone coordinates to X, Y, Z vectors to fenestration - # surface - _relative_to_absolute(fenestrationSurf, incrX, incrY, incrZ) - - # Round vertex to 4 decimal digit max - _round_vertex(fenestrationSurf) - - # Polygon from vector's window surface - poly_window = Polygon3D(fenestrationSurf.coords) - # Normal vectors of the polygon - n_window = poly_window.normal_vector - - # Calculate the slope between window and the ground (with - # normal vectors) - win_slope = 180 * angle(n_ground, n_window) / np.pi - if win_slope > 90: - win_slope -= 180 - - # Add a construction name if slope does not already exist - if win_slope not in win_slope_dict.values(): - count_slope += 1 - # Insure right construction name - fenestrationSurf.Construction_Name = "EXT_WINDOW{}".format( - count_slope - ) - # Append win_slope_dict - win_slope_dict[fenestrationSurf.Construction_Name] = win_slope - - else: - fenestrationSurf.Construction_Name = [ - key - for key in win_slope_dict.keys() - if win_slope == win_slope_dict[key] - ][0] - - lines.insert(variableDictNum + 2, fenestrationSurf) - - # Writing buildingSurface: Detailed in lines - surfList = [] - for buildingSurf in buildingSurfs: - # Change Outside Boundary Condition and Objects - if buildingSurf.Zone_Name == zone.Name: - buildingSurf.Number_of_Vertices = len(buildingSurf.coords) - surfList.append(buildingSurf) - # Verify if surface is adjacent. If yes, modifies it - if "surface" in buildingSurf.Outside_Boundary_Condition.lower(): - _modify_adj_surface(buildingSurf, idf) - - if "ground" in buildingSurf.Outside_Boundary_Condition.lower(): - if schedule_as_input: - buildingSurf.Outside_Boundary_Condition_Object = ( - "BOUNDARY=INPUT 1*sch_ground" - ) - else: - buildingSurf.Outside_Boundary_Condition_Object = ( - "BOUNDARY=SCHEDULE 1*sch_ground" - ) - - if "adiabatic" in buildingSurf.Outside_Boundary_Condition.lower(): - buildingSurf.Outside_Boundary_Condition = "OtherSideCoefficients" - buildingSurf.Outside_Boundary_Condition_Object = ( - "BOUNDARY=IDENTICAL" - ) - - if ( - "othersidecoefficients" - in buildingSurf.Outside_Boundary_Condition.lower() - ): - buildingSurf.Outside_Boundary_Condition = "OtherSideCoefficients" - buildingSurf.Outside_Boundary_Condition_Object = ( - "BOUNDARY=INPUT 1*TBOUNDARY" - ) - - if ( - "othersideconditionsmodel" - in buildingSurf.Outside_Boundary_Condition.lower() - ): - msg = ( - 'Surface "{}" has ' - '"OtherSideConditionsModel" as an outside ' - "boundary condition, this method is not implemented".format( - buildingSurf.Name - ) - ) - raise NotImplementedError(msg) - - # Round vertex to 4 decimal digit max - _round_vertex(buildingSurf) - - # Makes sure idf object key is not all upper string - buildingSurf.key = "BuildingSurface:Detailed" - - lines.insert(variableDictNum + 2, buildingSurf) - - # Change coordinates from world (all zones to 0) to absolute - if coordSys == "World": - zone.X_Origin, zone.Y_Origin, zone.Z_Origin = closest_coords( - surfList, to=zone_origin(zone) - ) - - # Round vertex to 4 decimal digit max - zone.X_Origin = round(zone_origin(zone)[0], 4) - zone.Y_Origin = round(zone_origin(zone)[1], 4) - zone.Z_Origin = round(zone_origin(zone)[2], 4) - - lines.insert(variableDictNum + 2, zone) - return win_slope_dict - - -def _modify_adj_surface(buildingSurf, idf): - """If necessary, modify outside boundary conditions and vertices of the - adjacent building surface - - Args: - buildingSurf (EpBunch): Building surface object to modify - idf (archetypal.idfclass.IDF): IDF object - """ - # Force outside boundary condition to "Zone" - buildingSurf.Outside_Boundary_Condition = "Zone" - # Get the surface EpBunch that is adjacent to the building surface - outside_bound_surf = buildingSurf.Outside_Boundary_Condition_Object - # If outside_bound_surf is the same surface as buildingSurf, raises error - if outside_bound_surf == buildingSurf.Name: - buildingSurf.Outside_Boundary_Condition = "OtherSideCoefficients" - buildingSurf.Outside_Boundary_Condition_Object = "BOUNDARY=IDENTICAL" - # Prevents the user in the log of the change of the Boumdary Conditions - msg = ( - 'Surface "{surfname}" has "{outside_bound}" as Outside ' - "Boundary Condition Object (adjacent to itself). To solve this " - "problem, we forced the Boundary Condition of this surface to " - 'be "IDENTICAL".'.format( - surfname=buildingSurf.Name, outside_bound=outside_bound_surf - ) - ) - log(msg, lg.WARNING) - else: - # Replace the Outside_Boundary_Condition_Object that was the - # outside_bound_surf, by the adjacent zone name - buildingSurf.Outside_Boundary_Condition_Object = idf.getobject( - "ZONE", - idf.getobject("BUILDINGSURFACE:DETAILED", outside_bound_surf).Zone_Name, - ).Name - # Force same construction for adjacent surfaces - buildingSurf.Construction_Name = idf.getobject( - "BUILDINGSURFACE:DETAILED", outside_bound_surf - ).Construction_Name - # Polygon from vector's adjacent surfaces - poly1 = Polygon3D(buildingSurf.coords) - poly2 = Polygon3D( - idf.getobject("BUILDINGSURFACE:DETAILED", outside_bound_surf).coords - ) - # Normal vectors of each polygon - n1 = poly1.normal_vector - n2 = poly2.normal_vector - # Verify if normal vectors of adjacent surfaces have - # opposite directions - if ( - round((n1 + n2).x, 2) != 0 - or round((n1 + n2).y, 2) != 0 - or round((n1 + n2).z, 2) != 0 - ): - # If not, inverse vertice of buildingSurf - # (Vertex4 become Vertex1, Vertex2 become Vertex3, etc.) - _inverse_vertices_surf( - buildingSurf, idf, outside_bound_surf, "BUILDINGSURFACE:DETAILED" - ) - - -def _inverse_vertices_surf(buildingSurf, idf, outside_bound_surf, idfobject_key): - """Inverses the vertices of a surface (last vertex becomes the first one, - etc.) - - Args: - buildingSurf (EpBunch): Building surface object to modify - idf (archetypal.idfclass.IDF): IDF object - outside_bound_surf (str): Name of the adjacent surface to the - buildingSurf - idfobject_key (str): Section name of the IDF where to find the - outside_bound_surf - """ - for j, k in zip( - range(1, len(buildingSurf.coords) + 1), range(len(buildingSurf.coords), 0, -1) - ): - idf.getobject(idfobject_key, outside_bound_surf)[ - "Vertex_" + str(j) + "_Xcoordinate" - ] = buildingSurf["Vertex_" + str(k) + "_Xcoordinate"] - idf.getobject(idfobject_key, outside_bound_surf)[ - "Vertex_" + str(j) + "_Ycoordinate" - ] = buildingSurf["Vertex_" + str(k) + "_Ycoordinate"] - idf.getobject(idfobject_key, outside_bound_surf)[ - "Vertex_" + str(j) + "_Zcoordinate" - ] = buildingSurf["Vertex_" + str(k) + "_Zcoordinate"] - - -def _round_vertex(surface, nbr_decimal=4): - """Round vertex to the number of decimal (nbr_decimal) wanted - - Args: - surface (EpBunch): Surface object to which we want to round its vertices - nbr_decimal (int): Number of decimal to round - """ - for j in range(1, len(surface.coords) + 1): - surface["Vertex_" + str(j) + "_Xcoordinate"] = round( - surface["Vertex_" + str(j) + "_Xcoordinate"], nbr_decimal - ) - surface["Vertex_" + str(j) + "_Ycoordinate"] = round( - surface["Vertex_" + str(j) + "_Ycoordinate"], nbr_decimal - ) - surface["Vertex_" + str(j) + "_Zcoordinate"] = round( - surface["Vertex_" + str(j) + "_Zcoordinate"], nbr_decimal - ) - - -def _relative_to_absolute(surface, incrX, incrY, incrZ): - """Convert relative coordinates to absolute ones - - Args: - surface (EpBunch): Surface object to which we want to convert its - vertices - incrX (str): X coordinate of the surface's zone - incrY (str): Y coordinate of the surface's zone - incrZ (str): Z coordinate of the surface's zone - """ - for j in range(1, len(surface.coords) + 1): - surface["Vertex_" + str(j) + "_Xcoordinate"] = ( - surface["Vertex_" + str(j) + "_Xcoordinate"] + incrX - ) - surface["Vertex_" + str(j) + "_Ycoordinate"] = ( - surface["Vertex_" + str(j) + "_Ycoordinate"] + incrY - ) - surface["Vertex_" + str(j) + "_Zcoordinate"] = ( - surface["Vertex_" + str(j) + "_Zcoordinate"] + incrZ - ) - - -def _write_winPool(lines, window): - """Write the window pool (from Berkeley Lab window library) in lines - - Args: - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - window (tuple): Information to write in the window pool extension ( - """ - # Get line number to write the EXTENSION_WINPOOL - extWinpoolNum = checkStr(lines, "!-_EXTENSION_WINPOOL_START_") - count = 0 - for line in window[10]: - lines.insert(extWinpoolNum + count, "!-" + line) - count += 1 - # Get line number to write the Window description - winDescriptionNum = checkStr(lines, "WinID Description") - lines.insert( - winDescriptionNum + 1, - "!-" - + str(window[0]) - + " " - + str(window[1]) - + " " - + str(window[2]) - + " " - + str(window[3]) - + " " - + str(window[4]) - + " " - + str(window[5]) - + " " - + str(window[6]) - + " " - + str(window[7]) - + " " - + str(window[8]) - + " " - + str(window[9]) - + "\n", - ) - - -def _write_window(lines, win_slope_dict, window, fframe=0.15, uframe=8.17): - """Write window information in lines - - Args: - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - win_slope_dict (dict): Dictionary with window's names as key and - window's slope as value - window (tuple): Information to write in the window pool extension - fframe (float): fraction of the window frame (between 0 and 1) - uframe (float): u-value of the window frame - """ - log("Writing windows info from idf file to t3d file...") - # Get line number where to write - windowNum = checkStr(lines, "W i n d o w s") - # Write - for key in win_slope_dict.keys(): - lines.insert(windowNum + 1, "WINDOW " + str(key) + "\n") - lines.insert( - windowNum + 2, - "!- WINID = " + str(window[0]) + ": HINSIDE = 11:" - " HOUTSIDE = 64: SLOPE " - "= " + str(win_slope_dict[key]) + ": " - "SPACID = 4: WWID = 0.77: " - "WHEIG = 1.08: " - "FFRAME = " - + str(fframe) - + ": UFRAME = " - + str(uframe) - + ": ABSFRAME = 0.6: " - "RISHADE = 0: RESHADE = 0: " - "REFLISHADE = 0.5: " - "REFLOSHADE = 0.5: CCISHADE " - "= 0.5: " - "EPSFRAME = 0.9: EPSISHADE " - "= 0.9: " - "ITSHADECLOSE = INPUT 1 * " - "SHADE_CLOSE: " - "ITSHADEOPEN = INPUT 1 * " - "SHADE_OPEN: " - "FLOWTOAIRNODE = 1: PERT = " - "0: PENRT = 0: " - "RADMATERIAL = undefined: " - "RADMATERIAL_SHD1 = " - "undefined" + "\n", - ) - - -def _write_schedules(lines, schedule_names, schedules, schedule_as_input, idf_file): - """Write schedules information in lines - - Args: - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - schedule_names (list): Names of all the schedules to be written in lines - schedules (dict): Dictionary with the schedule names as key and with - """ - log("Writing schedules info from idf file to t3d file...") - schedules_not_written = [] - # Writes schedules as INPUTS - if schedule_as_input: - # Get line number where to write INPUTS - inputNum = checkStr(lines, "I n p u t s") - ind = lines[inputNum + 1].find("\n") - count = 0 - while count * 13 < len(schedule_names): - begin = count * 13 - end = begin + 13 - if begin == 0 and len(schedule_names) == 13: - lines[inputNum + 1] = ( - lines[inputNum + 1][:ind] - + " " - + " ".join(str(item) for item in schedule_names[begin:end]) - + "\n" - ) - count += 1 - continue - if begin == 0 and len(schedule_names) != 13: - lines[inputNum + 1] = ( - lines[inputNum + 1][:ind] - + " " - + " ".join(str(item) for item in schedule_names[begin:end]) - + ";" - + "\n" - ) - count += 1 - continue - if end >= len(schedule_names): - end = len(schedule_names) - lines.insert( - inputNum + count + 1, - " " - + " ".join(str(item) for item in schedule_names[begin:end]) - + "\n", - ) - else: - lines.insert( - inputNum + count + 1, - " " - + " ".join(str(item) for item in schedule_names[begin:end]) - + ";" - + "\n", - ) - count += 1 - # Writes INPUTS DESCRIPTION - idf_file = Path(idf_file) - inputDescrNum = checkStr(lines, "INPUTS_DESCRIPTION") - lines.insert( - inputDescrNum, - " sy_XXXXXX : any : yearly schedules for internal gains. " - "Should be found in the yearly_schedules_" - + idf_file.basename().stripext() - + ".csv file" - + "\n", - ) - # Writes schedules as SCHEDULES - else: - # Get line number where to write - scheduleNum = checkStr(lines, "S c h e d u l e s") - # Write schedules YEAR in lines - for schedule_name in schedule_names: - - first_hour_month = [ - 0, - 744, - 1416, - 2160, - 2880, - 3624, - 4344, - 5088, - 5832, - 6552, - 7296, - 8016, - 8760, - ] - - # Get annual hourly values of schedules - arr = schedules[schedule_name]["all values"] - # Find the hours where hourly values change - (hours_list,) = np.where(np.roll(arr, 1) != arr) - # if hours_list is empty, give it hour 0 - if hours_list.size == 0: - hours_list = np.array([0]) - # Get schedule values where values change and add first schedule value - values = arr[hours_list] - # Add hour 0 and first value if not in array - if 0 not in hours_list: - hours_list = np.insert(hours_list, 0, np.array([0])) - values = np.insert(values, 0, arr[0]) - # Add hour 8760 and if not in array - if 8760 not in hours_list: - hours_list = np.append(hours_list, 8760) - values = np.append(values, arr[len(arr) - 1]) - - # Makes sure fisrt hour of every month in hour and value lists - for hour in first_hour_month: - if hour not in hours_list: - temp = hours_list > hour - count = 0 - for t in temp: - if t: - hours_list = np.insert(hours_list, count, hour) - values = np.insert(values, count, values[count - 1]) - break - count += 1 - - # Round values to 1 decimal - values = np.round(values.astype("float64"), decimals=1) - - # Writes schedule in lines - # Write values - _write_schedule_values(values, lines, scheduleNum, "VALUES") - # Write hours - _write_schedule_values(hours_list, lines, scheduleNum, "HOURS") - - # Write schedule name - lines.insert(scheduleNum + 1, "!-SCHEDULE " + schedule_name + "\n") - - # if ( - # len(hours_list) <= 1500 - # ): # Todo: Now, only writes "short" schedules. Make method that write them all - # lines.insert( - # scheduleNum + 1, - # "!-SCHEDULE " + schedules[schedule_name]["year"].Name + "\n", - # ) - # lines.insert( - # scheduleNum + 2, - # "!- HOURS= " + " ".join(str(item) for item in hours_list) + "\n", - # ) - # lines.insert( - # scheduleNum + 3, - # "!- VALUES= " + " ".join(str(item) for item in values) + "\n", - # ) - # else: - # schedules_not_written.append(schedule_name) - - return schedules_not_written - - -def _write_schedule_values(liste, lines, scheduleNum, string): - count = 0 - while count * 13 < len(liste): - begin = count * 13 - end = begin + 13 - if begin == 0 and len(liste) == 13: - lines.insert( - scheduleNum + 1, - "!- " - + string - + "= " - + " ".join(str(item) for item in liste[begin:end]) - + "\n", - ) - count += 1 - continue - if begin == 0 and len(liste) != 13: - lines.insert( - scheduleNum + 1, - "!- " - + string - + "= " - + " ".join(str(item) for item in liste[begin:end]) - + ";" - + "\n", - ) - count += 1 - continue - if end >= len(liste): - end = len(liste) - lines.insert( - scheduleNum + count + 1, - " ".join(str(item) for item in liste[begin:end]) + "\n", - ) - else: - lines.insert( - scheduleNum + count + 1, - " ".join(str(item) for item in liste[begin:end]) + ";" + "\n", - ) - count += 1 - - -def _write_conditioning(htm, lines, schedules, old_new_names, schedule_as_input): - # Heating - heat_dict = {} - schedule = None - if htm["Zone Sensible Heating"].iloc[0, 0] != "None": - for i in range(0, len(htm["Zone Sensible Heating"])): - key = htm["Zone Sensible Heating"].iloc[i, 0] - for key_2 in schedules: - try: - if "_h_" in key_2 and old_new_names[key_2[-8:].upper()][0] == key: - schedule = key_2 - break - except: - pass - name = "HEAT_z" + str(htm["Zone Sensible Heating"].iloc[i].name) - heat_dict[key] = [name, schedule] - size_factor = htm["Heating Sizing Factor Information"][ - htm["Heating Sizing Factor Information"]["Sizing Factor ID"] == "Global" - ]["Value"].max() - power = size_factor * ( - float( - htm["Zone Sensible Heating"].iloc[i, :][ - "User Design Load per Area [W/m2]" - ] - ) - / 1000 - * 3600 - ) # kJ/h-m2 - # Writes in lines - heatingNum = checkStr(lines, "H e a t i n g") - lines.insert(heatingNum + 1, " AREA_RELATED_POWER=1" + "\n") - lines.insert(heatingNum + 1, " ELPOWERFRAC=0" + "\n") - lines.insert(heatingNum + 1, " RRAD=0" + "\n") - lines.insert(heatingNum + 1, " HUMIDITY=0" + "\n") - lines.insert(heatingNum + 1, "POWER=" + str(power) + "\n") - if schedule_as_input: - lines.insert(heatingNum + 1, " ON= INPUT 1*" + schedule + "\n") - else: - lines.insert(heatingNum + 1, " ON= SCHEDULE 1*" + schedule + "\n") - lines.insert(heatingNum + 1, "HEATING " + name + "\n") - # Cooling - cool_dict = {} - schedule = None - if htm["Zone Sensible Cooling"].iloc[0, 0] != "None": - for i in range(0, len(htm["Zone Sensible Cooling"])): - key = htm["Zone Sensible Cooling"].iloc[i, 0] - for key_2 in schedules: - try: - if "_c_" in key_2 and old_new_names[key_2[-8:].upper()][0] == key: - schedule = key_2 - break - except: - pass - name = "COOL_z" + str(htm["Zone Sensible Cooling"].iloc[i].name) - cool_dict[key] = [name, schedule] - size_factor = htm["Cooling Sizing Factor Information"][ - htm["Cooling Sizing Factor Information"]["Sizing Factor ID"] == "Global" - ]["Value"].max() - power = size_factor * ( - float( - htm["Zone Sensible Cooling"].iloc[i, :][ - "User Design Load per Area [W/m2]" - ] - ) - / 1000 - * 3600 - ) # kJ/h-m2 - # Writes in lines - coolingNum = checkStr(lines, "C o o l i n g") - lines.insert(coolingNum + 1, " AREA_RELATED_POWER=1" + "\n") - lines.insert(coolingNum + 1, " ELPOWERFRAC=0" + "\n") - lines.insert(coolingNum + 1, " HUMIDITY=0" + "\n") - lines.insert(coolingNum + 1, "POWER=" + str(power) + "\n") - if schedule_as_input: - lines.insert(coolingNum + 1, " ON= INPUT 1*" + schedule + "\n") - else: - lines.insert(coolingNum + 1, " ON= SCHEDULE 1*" + schedule + "\n") - lines.insert(coolingNum + 1, "COOLING " + name + "\n") - - return heat_dict, cool_dict - - -def _write_gains(equipments, lights, lines, peoples, htm, old_new_names): - """Write gains in lines - - Args: - equipments (idf_MSequence): IDF object from idf.idfobjects(). List of - equipments ("ELECTRICEQUIPMENT" in the IDF). - idf (archetypal.idfclass.IDF): IDF object - lights (idf_MSequence): IDF object from idf.idfobjects(). List of lights - ("LIGHTS" in the IDF). - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - peoples (idf_MSequence): IDF object from idf.idfobjects() - """ - log("Writing gains info from idf file to t3d file...") - # Get line number where to write - gainNum = checkStr(lines, "G a i n s") - # Writing PEOPLE gains infos to lines - _write_people_gain(gainNum, lines, peoples, htm, old_new_names) - # Writing LIGHT gains infos to lines - _write_light_gain(gainNum, lights, lines, htm, old_new_names) - # Writing EQUIPMENT gains infos to lines - _write_equipment_gain(equipments, gainNum, lines, htm, old_new_names) - - -def _write_equipment_gain(equipments, gainNum, lines, htm, old_new_names): - """Write equipment gains in lines - - Args: - equipments (idf_MSequence): IDF object from idf.idfobjects(). List of - equipments ("ELECTRICEQUIPMENT" in the IDF). - gainNum (int): Line number where to write the equipment gains - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - """ - for equipment in equipments: - gain = htm["ElectricEquipment Internal Gains Nominal"][ - htm["ElectricEquipment Internal Gains Nominal"]["Name"].str.contains( - old_new_names[equipment.Name.upper()][0] - ) - ] - # Write gain name in lines - lines.insert(gainNum + 1, "GAIN " + equipment.Name + "\n") - areaMethod = "AREA_RELATED" - power = gain["Equipment/Floor Area {W/m2}"].values[0] / 1000 * 3600 # kJ/h-m2 - radFract = gain["Fraction Radiant"].values[0] - lines.insert( - gainNum + 2, - " CONVECTIVE=" - + str(round(power * (1 - radFract), 3)) - + " : RADIATIVE=" - + str(round(power * radFract, 3)) - + " : HUMIDITY=0 : ELPOWERFRAC=1 " - ": " + areaMethod + " : " - "CATEGORY=EQUIPMENT\n", - ) - - -def _write_light_gain(gainNum, lights, lines, htm, old_new_names): - """Write gain from lights in lines - - Args: - gainNum (int): Line number where to write the equipment gains - lights (idf_MSequence): IDF object from idf.idfobjects(). List of lights - ("LIGHTS" in the IDF). - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - """ - for light in lights: - gain = htm["Lights Internal Gains Nominal"][ - htm["Lights Internal Gains Nominal"]["Name"].str.contains( - old_new_names[light.Name.upper()][0] - ) - ] - # Write gain name in lines - lines.insert(gainNum + 1, "GAIN " + light.Name + "\n") - areaMethod = "AREA_RELATED" - power = gain["Lights/Floor Area {W/m2}"].values[0] / 1000 * 3600 # kJ/h-m2 - radFract = gain["Fraction Radiant"].values[0] - lines.insert( - gainNum + 2, - " CONVECTIVE=" - + str(round(power * (1 - radFract), 3)) - + " : RADIATIVE=" - + str(round(power * radFract, 3)) - + " : HUMIDITY=0 : ELPOWERFRAC=1 " - ": " + areaMethod + " : " - "CATEGORY=LIGHTS\n", - ) - - -def _write_people_gain(gainNum, lines, peoples, htm, old_new_names): - """ - Args: - gainNum (int): Line number where to write the equipment gains - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - peoples (idf_MSequence): IDF object from idf.idfobjects() - """ - for people in peoples: - gain = htm["People Internal Gains Nominal"][ - htm["People Internal Gains Nominal"]["Name"].str.contains( - old_new_names[people.Name.upper()][0] - ) - ] - # Write gain name in lines - lines.insert(gainNum + 1, "GAIN " + people.Name + "\n") - areaMethod = "AREA_RELATED" - power = gain["People/Floor Area {person/m2}"].values[0] * 270 # kJ/h-m2 - radFract = gain["Fraction Radiant"].values[0] - lines.insert( - gainNum + 2, - " CONVECTIVE=" - + str(round(power * (1 - radFract), 3)) - + " : RADIATIVE=" - + str(round(power * radFract, 3)) - + " : HUMIDITY=0.066 : ELPOWERFRAC=0 " - ": " + areaMethod + " : " - "CATEGORY=PEOPLE\n", - ) - - -def _write_materials(lines, materialAirGap, materialNoMass, materials): - """Write materials (LAYER in TRNBuild) in lines - - Args: - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - materialAirGap (idf_MSequence): IDF object from idf.idfobjects(). - materialNoMass (idf_MSequence): IDF object from idf.idfobjects(). - materials (idf_MSequence): IDF object from idf.idfobjects(). List of - materials ("MATERIAL" in the IDF) - """ - log("Writing materials (layers) info from idf file to t3d file...") - # Get line number where to write - layerNum = checkStr(lines, "L a y e r s") - listLayerName = [] - # Writing MATERIAL infos to lines - _write_material(layerNum, lines, listLayerName, materials) - # Writing MATERIAL:NOMASS infos to lines - _write_material_nomass(layerNum, lines, listLayerName, materialNoMass) - # Writing MATERIAL:AIRGAP infos to lines - _write_material_airgap(layerNum, lines, listLayerName, materialAirGap) - - -def _write_material_airgap(layerNum, lines, listLayerName, materialAirGap): - """ - Args: - layerNum (int): Line number where to write the material - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - listLayerName (list): list of material's names. To be appended when - materialAirGap (materialAirGap): IDF object from - """ - for i in range(0, len(materialAirGap)): - - duplicate = [s for s in listLayerName if s == materialAirGap[i].Name] - if not duplicate: - lines.insert(layerNum + 1, "!-LAYER " + materialAirGap[i].Name + "\n") - listLayerName.append(materialAirGap[i].Name) - - lines.insert( - layerNum + 2, - "!- RESISTANCE=" - + str(round(materialAirGap[i].Thermal_Resistance / 3.6, 4)) - + " : PERT= 0 : PENRT= 0\n", - ) - else: - continue - - -def _write_material_nomass(layerNum, lines, listLayerName, materialNoMass): - """ - Args: - layerNum (int): Line number where to write the material - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - listLayerName (list): list of material's names. To be appended when - materialNoMass (idf_MSequence): IDF object from idf.idfobjects(). - """ - for i in range(0, len(materialNoMass)): - - duplicate = [s for s in listLayerName if s == materialNoMass[i].Name] - if not duplicate: - lines.insert(layerNum + 1, "!-LAYER " + materialNoMass[i].Name + "\n") - listLayerName.append(materialNoMass[i].Name) - - lines.insert( - layerNum + 2, - "!- RESISTANCE=" - + str(round(materialNoMass[i].Thermal_Resistance / 3.6, 4)) - + " : PERT= 0 : PENRT= 0\n", - ) - else: - continue - - -def _write_material(layerNum, lines, listLayerName, materials): - """ - Args: - layerNum (int): Line number where to write the material - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - listLayerName (list): list of material's names. To be appended when - materials (idf_MSequence): IDF object from idf.idfobjects(). List of - materials ("MATERIAL" in the IDF) - """ - for i in range(0, len(materials)): - lines.insert(layerNum + 1, "!-LAYER " + materials[i].Name + "\n") - listLayerName.append(materials[i].Name) - - lines.insert( - layerNum + 2, - "!- CONDUCTIVITY=" - + str(round(materials[i].Conductivity * 3.6, 4)) - + " : CAPACITY= " - + str(round(materials[i].Specific_Heat / 1000, 4)) - + " : DENSITY= " - + str(round(materials[i].Density, 4)) - + " : PERT= 0 : PENRT= 0\n", - ) - - -def _write_constructions_end(constr_list, idf, lines): - """Write constructions at the end of lines (IDF format) - - Args: - constr_list (list): list of construction names to be written - idf (archetypal.idfclass.IDF): IDF object - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - """ - # Get line number where to write - constructionEndNum = checkStr(lines, "ALL OBJECTS IN CLASS: CONSTRUCTION") - # Writing CONSTRUCTION infos to lines - for constr in constr_list: - construction = idf.getobject("CONSTRUCTION", constr) - lines.insert(constructionEndNum, construction) - - -def _write_constructions(constr_list, idf, lines, mat_name, materials): - """Write constructions in lines (TRNBuild format) - - Args: - constr_list (list): list of construction names to be written - idf (archetypal.idfclass.IDF): IDF object - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - mat_name (list): list of material names to be written - materials (idf_MSequence): IDF object from idf.idfobjects(). List of - materials ("MATERIAL" in the IDF) - """ - log("Writing constructions info from idf file to t3d file...") - # Get line number where to write - constructionNum = checkStr(lines, "C O N S T R U C T I O N") - # Writing CONSTRUCTION in lines - for constr in constr_list: - construction = idf.getobject("CONSTRUCTION", constr) - lines.insert(constructionNum + 1, "!-CONSTRUCTION " + construction.Name + "\n") - - # Create lists to append with layers and thickness of construction - layerList = [] - thickList = [] - - for j in range(2, len(construction.fieldvalues)): - - if construction.fieldvalues[j] not in mat_name: - - indiceMat = [ - k - for k, s in enumerate(materials) - if construction.fieldvalues[j] == s.Name - ] - - if not indiceMat: - thickList.append(0.0) - else: - thickList.append(round(materials[indiceMat[0]].Thickness, 4)) - - layerList.append(construction.fieldvalues[j]) - - else: - continue - - # Writes layers and thicknesses - lines.insert( - constructionNum + 2, - "!- LAYERS = " + " ".join(str(item) for item in layerList[::-1]) + "\n", - ) - lines.insert( - constructionNum + 3, - "!- THICKNESS= " + " ".join(str(item) for item in thickList[::-1]) + "\n", - ) - - # Writes ABS-FRONT and ABS-BACK - sol_abs_front = get_sol_abs(idf, layerList[0]) - sol_abs_back = get_sol_abs(idf, layerList[-1]) - lines.insert( - constructionNum + 4, - "!- ABS-FRONT= " - + str(sol_abs_front) - + " : ABS-BACK= " - + str(sol_abs_back) - + "\n", - ) - lines.insert(constructionNum + 5, "!- EPS-FRONT= 0.9 : EPS-BACK= 0.9\n") - - # Writes HBACK - try: - condition = ( - construction.getreferingobjs()[0].Outside_Boundary_Condition.lower() - == "ground" - ) - except: - condition = False - if condition: - lines.insert(constructionNum + 6, "!- HFRONT = 11 : HBACK= 0.0005\n") - else: - lines.insert(constructionNum + 6, "!- HFRONT = 11 : HBACK= 64\n") - - -def get_sol_abs(idf, layer): - mat_ = idf.getobject("MATERIAL", layer) - if mat_: - sol_abs = mat_.Solar_Absorptance - else: - mat_ = idf.getobject("MATERIAL:NOMASS", layer) - if mat_: - sol_abs = mat_.Solar_Absorptance - else: - mat_ = idf.getobject("MATERIAL:AIRGAP", layer) - sol_abs = mat_.Solar_Absorptance - return sol_abs - - -def _get_ground_vertex(buildingSurfs): - """Find the normal vertex of ground surface - - Args: - buildingSurfs (idf_MSequence): IDF object from idf.idfobjects(). List of - building surfaces ("BUILDINGSURFACE:DETAILED" in the IDF). - """ - ground_surfs = [ - buildingSurf - for buildingSurf in buildingSurfs - if buildingSurf.Outside_Boundary_Condition.lower() == "ground" - ] - if ground_surfs: - ground = ground_surfs[0].coords - else: - ground = [(45, 28, 0), (45, 4, 0), (4, 4, 0), (4, 28, 0)] - # Polygon from vector's ground surface - poly_ground = Polygon3D(ground) - # Normal vectors of the polygon - n_ground = poly_ground.normal_vector - return n_ground - - -def _is_coordSys_world(coordSys, zones): - """ - Args: - coordSys (str): If already assigned ('Relative' or 'Absolute), function - returns the value - zones (idf_MSequence): IDF object from idf.idfobjects(). List of zones - ("ZONES" in the IDF). Zones object to iterate over, to determine if - the coordinate system is 'World' - """ - X_zones = [] - Y_zones = [] - Z_zones = [] - # Store all zones coordinates in lists - for zone in zones: - x, y, z = zone_origin(zone) - X_zones.append(x) - Y_zones.append(y) - Z_zones.append(z) - # If 2 zones have same coords and are equal to 0 -> coordSys = "World" - if ( - X_zones == Y_zones - and X_zones == Z_zones - and Y_zones == Z_zones - and X_zones[0] == 0 - and Y_zones[0] == 0 - and Z_zones[0] == 0 - ): - coordSys = "World" - return coordSys - - -def _write_location_geomrules(globGeomRules, lines, locations): - """ - Args: - globGeomRules (idf_MSequence): IDF object from idf.idfobjects(). List of - global geometry rules ("GLOBALGEOMETRYRULES" in the IDF). Normally - there should be only one global geometry rules. - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - locations (idf_MSequence): IDF object from idf.idfobjects(). List of the - building locations ("SITE:LOCATION" in the IDF). Normally there - should be only one location. - """ - # Get line number where to write - log("Writing location info from idf file to t3d file...") - locationNum = checkStr(lines, "ALL OBJECTS IN CLASS: LOCATION") - # Writing GLOBALGEOMETRYRULES infos to lines - for globGeomRule in globGeomRules: - # Change Geometric rules from Relative to Absolute - coordSys = "Absolute" - if globGeomRule.Coordinate_System == "Relative": - coordSys = "Relative" - globGeomRule.Coordinate_System = "Absolute" - - if globGeomRule.Daylighting_Reference_Point_Coordinate_System == "Relative": - globGeomRule.Daylighting_Reference_Point_Coordinate_System = "Absolute" - - if globGeomRule.Rectangular_Surface_Coordinate_System == "Relative": - globGeomRule.Rectangular_Surface_Coordinate_System = "Absolute" - - lines.insert(locationNum, globGeomRule) - # Writing LOCATION infos to lines - for location in locations: - lines.insert(locationNum, location) - return coordSys - - -def _write_building(buildings, lines): - """ - Args: - buildings (idf_MSequence): IDF object from idf.idfobjects() - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - """ - # Get line number where to write - log("Writing building info from idf file to t3d file...") - buildingNum = checkStr(lines, "ALL OBJECTS IN CLASS: BUILDING") - # Writing BUILDING infos to lines - for building in buildings: - lines.insert(buildingNum, building) - - -def _write_version(lines, versions): - """ - Args: - lines (list): Text to create the T3D file (IDF file to import in - TRNBuild). To be appended (insert) here - versions (idf_MSequence): IDF object from idf.idfobjects(). List of the - IDF file versions ("VERSION" in the IDF). Normally there should be - only one version. - """ - # Get line number where to write - log("Writing data from idf file to t3d file...") - versionNum = checkStr(lines, "ALL OBJECTS IN CLASS: VERSION") - # Writing VERSION infos to lines - for i in range(0, len(versions)): - lines.insert( - versionNum, - ",".join(str(item) for item in versions[i].fieldvalues) + ";" + "\n", - ) diff --git a/archetypal/umi_template.py b/archetypal/umi_template.py index f8099e0d..e1c5d633 100644 --- a/archetypal/umi_template.py +++ b/archetypal/umi_template.py @@ -1,42 +1,69 @@ -import io +"""UmiTemplateLibrary Module.""" + import json -import os +import logging as lg from collections import OrderedDict +from concurrent.futures.thread import ThreadPoolExecutor -import numpy as np +from pandas.io.common import get_handle from path import Path -from archetypal import ( - load_idf, - BuildingTemplate, - GasMaterial, - GlazingMaterial, - OpaqueMaterial, - OpaqueConstruction, - WindowConstruction, - StructureDefinition, +from archetypal import settings +from archetypal.eplus_interface.exceptions import EnergyPlusProcessError +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, WeekSchedule, YearSchedule, - DomesticHotWaterSetting, - VentilationSetting, - ZoneConditioning, - ZoneConstructionSet, - ZoneLoad, - Zone, - settings, - UmiBase, - MaterialLayer, - YearScheduleParts, - UmiSchedule, - MassRatio, + YearSchedulePart, ) +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 + +class UmiTemplateLibrary: + """Handles parsing and creating Template Library Files for UMI for Rhino. -class UmiTemplate: - """Main class supporting the definition of a multiple building templates and - corresponding template objects. + - See :meth:`open` to parse existing Umi Template Library files (.json). + - See :meth:`from_idf_files` to create a library by converting existing IDF models. """ + + _LIB_GROUPS = [ + "GasMaterials", + "GlazingMaterials", + "OpaqueMaterials", + "OpaqueConstructions", + "WindowConstructions", + "StructureInformations", + "DaySchedules", + "WeekSchedules", + "YearSchedules", + "DomesticHotWaterSettings", + "VentilationSettings", + "ZoneConditionings", + "ZoneConstructionSets", + "ZoneLoads", + "ZoneDefinitions", + "WindowSettings", + "BuildingTemplates", + ] + def __init__( self, name="unnamed", @@ -46,7 +73,7 @@ def __init__( OpaqueConstructions=None, OpaqueMaterials=None, WindowConstructions=None, - StructureDefinitions=None, + StructureInformations=None, DaySchedules=None, WeekSchedules=None, YearSchedules=None, @@ -56,9 +83,9 @@ def __init__( ZoneConditionings=None, ZoneConstructionSets=None, ZoneLoads=None, - Zones=None, + ZoneDefinitions=None, ): - """Initialize a new UmiTemplate with empty attributes. + """Initialize a new UmiTemplateLibrary with empty attributes. Args: name (str): The name of the UMI Template. @@ -73,8 +100,8 @@ def __init__( objects. WindowConstructions (list of WindowConstruction): list of WindowConstruction objects. - StructureDefinitions (list of StructureDefinition): list of - StructureDefinition objects. + StructureInformations (list of StructureInformation): list of + StructureInformation objects. DaySchedules (list of DaySchedule): list of DaySchedule objects. WeekSchedules (list of WeekSchedule): list of WeekSchedule objects. YearSchedules (list of YearSchedule): list of YearSchedule objects. @@ -89,212 +116,352 @@ def __init__( ZoneConstructionSets (list of ZoneConstructionSet): list of ZoneConstructionSet objects. ZoneLoads (list of ZoneLoad): list of ZoneLoad objects. - Zones (list of Zone): list of Zone objects + ZoneDefinitions (list of ZoneDefinition): list of Zone objects """ - if Zones is None: - Zones = [] - if ZoneLoads is None: - ZoneLoads = [] - if ZoneConstructionSets is None: - ZoneConstructionSets = [] - if ZoneConditionings is None: - ZoneConditionings = [] - if WindowSettings is None: - WindowSettings = [] - if VentilationSettings is None: - VentilationSettings = [] - if DomesticHotWaterSettings is None: - DomesticHotWaterSettings = [] - if YearSchedules is None: - YearSchedules = [] - if WeekSchedules is None: - WeekSchedules = [] - if DaySchedules is None: - DaySchedules = [] - if StructureDefinitions is None: - StructureDefinitions = [] - if WindowConstructions is None: - WindowConstructions = [] - if OpaqueMaterials is None: - OpaqueMaterials = [] - if OpaqueConstructions is None: - OpaqueConstructions = [] - if GlazingMaterials is None: - GlazingMaterials = [] - if GasMaterials is None: - GasMaterials = [] - if BuildingTemplates is None: - BuildingTemplates = [] - - self.idfs = None - self.idf_files = None + self.idf_files = [] self.name = name - self.Zones = Zones - self.ZoneLoads = ZoneLoads - self.ZoneConstructionSets = ZoneConstructionSets - self.ZoneConditionings = ZoneConditionings - self.WindowSettings = WindowSettings - self.VentilationSettings = VentilationSettings - self.DomesticHotWaterSettings = DomesticHotWaterSettings - self.YearSchedules = YearSchedules - self.WeekSchedules = WeekSchedules - self.DaySchedules = DaySchedules - self.StructureDefinitions = StructureDefinitions - self.WindowConstructions = WindowConstructions - self.OpaqueMaterials = OpaqueMaterials - self.OpaqueConstructions = OpaqueConstructions - self.BuildingTemplates = BuildingTemplates - self.GasMaterials = GasMaterials - self.GlazingMaterials = GlazingMaterials + self.ZoneDefinitions = ZoneDefinitions or [] + self.ZoneLoads = ZoneLoads or [] + self.ZoneConstructionSets = ZoneConstructionSets or [] + self.ZoneConditionings = ZoneConditionings or [] + self.WindowSettings = WindowSettings or [] + self.VentilationSettings = VentilationSettings or [] + self.DomesticHotWaterSettings = DomesticHotWaterSettings or [] + self.UmiSchedules = [] # placeholder for UmiSchedules + self.YearSchedules = YearSchedules or [] + self.WeekSchedules = WeekSchedules or [] + self.DaySchedules = DaySchedules or [] + self.StructureInformations = StructureInformations or [] + self.WindowConstructions = WindowConstructions or [] + self.OpaqueMaterials = OpaqueMaterials or [] + self.OpaqueConstructions = OpaqueConstructions or [] + self.BuildingTemplates = BuildingTemplates or [] + self.GasMaterials = GasMaterials or [] + self.GlazingMaterials = GlazingMaterials or [] + + def __iter__(self): + """Iterate over component groups. Yields tuple of (group, value).""" + for group in self._LIB_GROUPS: + yield group, self.__dict__[group] + + def _clear_components_list(self, except_groups=None): + """Clear components lists except except_groups.""" + if except_groups is None: + except_groups = [] + exception = ["BuildingTemplates"] + exception.extend(except_groups) + for key, group in self: + if key not in exception: + setattr(self, key, []) @classmethod - def read_idf( - cls, idf_files, weather, sql=None, name="unnamed", load_idf_kwargs=None + def from_idf_files( + cls, + idf_files, + weather, + name="unnamed", + processors=-1, + keep_all_zones=False, + **kwargs, ): - """Initializes an UmiTemplate object from one or more idf_files. + """Initialize an UmiTemplateLibrary object from one or more idf_files. The resulting object contains the reduced version of the IDF files. - To save to file, call the :meth:`to_json` method. + To save to file, call the :meth:`save` method. + + Important: + When using :meth:`from_idf_files` The idf files are striped of run period + modifiers and special days to return simple annual schedules. Args: - idf_files (str or list): One or more IDF file paths. - weather (str): Path to the weather file. - sql: - name: - load_idf_kwargs (dict): kwargs passed to the - :meth:`archetypal.idfclass.load_idf` method. + idf_files (list of (str or Path)): list of IDF file paths. + weather (str or Path): Path to the weather file. + name (str): The name of the Template File + processors (int): Number of cores. Defaults to -1, all cores. + kwargs: keyword arguments passed to IDF(). + + Raises: + Exception: All exceptions are raised if settings.debug=True. Will raise + an exception if all BuildingTemplates failed to be created. """ - if load_idf_kwargs is None: - load_idf_kwargs = {} # instantiate class - t = cls(name) - - # fill in arguments - t.idf_files = idf_files - t.weather = weather - t.sql = sql - - # Load IDF objects - t.idfs = [ - load_idf(idf_file, weather_file=weather, **load_idf_kwargs) - for idf_file in idf_files + umi_template = cls(name) + + # if parallel is True, run eplus in parallel + in_dict = {} + for i, idf_file in enumerate(idf_files): + in_dict[idf_file] = dict( + idfname=idf_file, + epw=weather, + verbose=False, + position=i, + nolimit=True, + keep_data_err=True, # For debugging + readvars=False, # No need to readvars since only sql is used + **kwargs, + ) + results = parallel_process( + in_dict, + cls.template_complexity_reduction, + processors=processors, + use_kwargs=True, + debug=True, + position=None, + executor=ThreadPoolExecutor, + ) + for res in results: + if isinstance(res, EnergyPlusProcessError): + filename = (settings.logs_folder / "failed_reduce.txt").expand() + with open(filename, "a") as file: + file.writelines(res.write()) + log(f"EnergyPlusProcess errors listed in {filename}") + elif isinstance(res, Exception): + if settings.debug: + raise res + else: + log( + f"Unable to create Building Template. Exception raised: " + f"{str(res)}", + lg.ERROR, + ) + + # If all exceptions, raise them for debugging + if all(isinstance(x, Exception) for x in results): + raise Exception([res for res in results if isinstance(res, Exception)]) + + umi_template.BuildingTemplates = [ + res for res in results if not isinstance(res, Exception) ] - # For each idf load - template_obj = [] - for idf in t.idfs: - bldg = BuildingTemplate.from_idf(idf, sql=idf.sql, DataSource=idf.name) - template_obj.append(bldg) - for name in [ - DaySchedule, - DomesticHotWaterSetting, - GasMaterial, - GlazingMaterial, - OpaqueConstruction, - OpaqueMaterial, - StructureDefinition, - VentilationSetting, - WeekSchedule, - WindowConstruction, - YearSchedule, - ZoneConditioning, - ZoneConstructionSet, - ZoneLoad, - Zone, - ]: - t.__dict__[name.__name__ + "s"].extend( - [obj for obj in bldg.all_objects.values() if isinstance(obj, name)] - ) - - t.BuildingTemplates = template_obj - - return t + if keep_all_zones: + _zones = set( + obj.get_unique() + for obj in UmiBase.CREATED_OBJECTS + if isinstance(obj, ZoneDefinition) + ) + for zone in _zones: + umi_template.ZoneDefinitions.append(zone) + exceptions = [ZoneDefinition.__name__] + else: + exceptions = None + + # Get unique instances + umi_template.unique_components(exceptions) + + # Update attributes of instance + umi_template.update_components_list(exceptions=exceptions) + + return umi_template + + @staticmethod + def template_complexity_reduction(idfname, epw, **kwargs): + """Wrap IDF, simulate and BuildingTemplate for parallel processing.""" + idf = IDF(idfname, epw=epw, **kwargs) + + # remove daylight saving time modifiers + for daylight in idf.idfobjects["RunPeriodControl:DaylightSavingTime".upper()]: + idf.removeidfobject(daylight) + # edit run period to start on Monday + for run_period in idf.idfobjects["RunPeriod".upper()]: + run_period.Day_of_Week_for_Start_Day = "Monday" + run_period.Apply_Weekend_Holiday_Rule = "No" + run_period.Use_Weather_File_Holidays_and_Special_Days = "No" + run_period.Use_Weather_File_Daylight_Saving_Period = "No" + # remove daylight saving time modifiers + for day in idf.idfobjects["RunPeriodControl:SpecialDays".upper()]: + idf.removeidfobject(day) + + if idf.sim_info is None: + idf.simulate() + return BuildingTemplate.from_idf(idf, **kwargs) @classmethod - def read_file(cls, filename): - """Initializes an UmiTemplate object from an UMI Template File. + def open(cls, filename): + """Initialize an UmiTemplate object from an UMI Template Library File. Args: - filename (path-like): Path-like object giving the pathname (absolute - or relative to the current working directory) of the UMI + filename (str or Path): PathLike object giving the pathname of the UMI Template File. Returns: - UmiTemplate: The template object. + UmiTemplateLibrary: The template object. """ name = Path(filename) - t = cls(name) - with open(filename, "r") as f: - import json - - datastore = json.load(f) - - # with datastore, create each objects - t.GasMaterials = [ - GasMaterial.from_json(**store) for store in datastore["GasMaterials"] - ] - t.GlazingMaterials = [ - GlazingMaterial(**store) for store in datastore["GlazingMaterials"] - ] - t.OpaqueMaterials = [ - OpaqueMaterial(**store) for store in datastore["OpaqueMaterials"] - ] - t.OpaqueConstructions = [ - OpaqueConstruction.from_json(**store) - for store in datastore["OpaqueConstructions"] - ] - t.WindowConstructions = [ - WindowConstruction.from_json(**store) - for store in datastore["WindowConstructions"] - ] - t.StructureDefinitions = [ - StructureDefinition.from_json(**store) - for store in datastore["StructureDefinitions"] - ] - t.DaySchedules = [ - DaySchedule.from_json(**store) for store in datastore["DaySchedules"] - ] - t.WeekSchedules = [ - WeekSchedule.from_json(**store) for store in datastore["WeekSchedules"] - ] - t.YearSchedules = [ - YearSchedule.from_json(**store) for store in datastore["YearSchedules"] - ] - t.DomesticHotWaterSettings = [ - DomesticHotWaterSetting.from_json(**store) - for store in datastore["DomesticHotWaterSettings"] - ] - t.VentilationSettings = [ - VentilationSetting.from_json(**store) - for store in datastore["VentilationSettings"] - ] - t.ZoneConditionings = [ - ZoneConditioning.from_json(**store) - for store in datastore["ZoneConditionings"] - ] - t.ZoneConstructionSets = [ - ZoneConstructionSet.from_json(**store) - for store in datastore["ZoneConstructionSets"] - ] - t.ZoneLoads = [ - ZoneLoad.from_json(**store) for store in datastore["ZoneLoads"] - ] - t.Zones = [Zone.from_json(**store) for store in datastore["Zones"]] - t.BuildingTemplates = [ - BuildingTemplate.from_json(**store) - for store in datastore["BuildingTemplates"] - ] + t = cls.loads(f.read(), name) return t - def to_json(self, path_or_buf=None, indent=2, all_zones=False, sort_keys=False): - """Writes the umi template to json format + @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 + + def save( + self, + path_or_buf=None, + indent=2, + sort_keys=False, + compression="infer", + storage_options=None, + ): + """Save to json file. Args: - path_or_buf (path-like): Path-like object giving the pathname - (absolute or relative to the current working directory) - indent (bool or str): If indent is a non-negative integer or string, + path_or_buf (path-like): File path or object. If not specified, + overwrites files. See :attr:`UmiTemplateLibrary.name`. + indent (bool or str or int): If indent is a non-negative integer or string, then JSON array elements and object members will be pretty-printed with that indent level. An indent level of 0, negative, or "" will only insert newlines. None (the default) @@ -302,107 +469,266 @@ def to_json(self, path_or_buf=None, indent=2, all_zones=False, sort_keys=False): integer indent indents that many spaces per level. If indent is a string (such as "t"), that string is used to indent each level. - all_zones (bool): If True, all zones that have participated in the - creation of the core and perimeter zones will be outputed to the - json file. - sort_keys (bool): If sort_keys is true (default: False), then the - output of dictionaries will be sorted by key; this is useful for - regression tests to ensure that JSON serializations can be - compared on a day-to-day basis. + sort_keys (callable): If sort_keys is true (default: False), then the + output of dictionaries will be sorted by this callable. + e.g.: `lambda x: x.get("$id")` sorts by $id. If callable is not + available or fails, then sorted by `Name`. + compression (str): A string representing the compression to use in the + output file, only used when the first argument is a filename. By + default, the compression is inferred from the filename. + storage_options (dict): Extra options that make sense for a particular + storage connection, e.g. host, port, username, password, etc., + if using a URL that will be parsed by fsspec, e.g., starting “s3://”, + “gcs://”. An error will be raised if providing this argument with a + non-fsspec URL. See the fsspec and backend storage implementation + docs for the set of allowed keys and values. """ - # todo: check if bools are created as lowercase 'false' or 'true' - - if not path_or_buf: - json_name = "%s.json" % self.name - path_or_buf = os.path.join(settings.data_folder, json_name) - # create the folder on the disk if it doesn't already exist - if not os.path.exists(settings.data_folder): - os.makedirs(settings.data_folder) - with io.open(path_or_buf, "w+", encoding="utf-8") as path_or_buf: - data_dict = OrderedDict( - { - "GasMaterials": [], - "GlazingMaterials": [], - "OpaqueMaterials": [], - "OpaqueConstructions": [], - "WindowConstructions": [], - "StructureDefinitions": [], - "DaySchedules": [], - "WeekSchedules": [], - "YearSchedules": [], - "DomesticHotWaterSettings": [], - "VentilationSettings": [], - "ZoneConditionings": [], - "ZoneConstructionSets": [], - "ZoneLoads": [], - "Zones": [], - "WindowSettings": [], - "BuildingTemplates": [], - } - ) - - jsonized = {} - - def recursive_json(obj): - if obj.__class__.mro()[0] == UmiSchedule: - obj = obj.develop() - catname = obj.__class__.__name__ + "s" - if catname in data_dict: - key = obj.id - if key not in jsonized.keys(): - app_dict = obj.to_json() - data_dict[catname].append(app_dict) - jsonized[key] = obj - for key, value in obj.__dict__.items(): - - if isinstance( - value, (UmiBase, MaterialLayer, YearScheduleParts) - ) and not key.startswith("_"): - recursive_json(value) - elif isinstance(value, list): - [ - recursive_json(value) - for value in value - if isinstance( - value, - (UmiBase, MaterialLayer, YearScheduleParts, MassRatio), - ) - ] - - for bld in self.BuildingTemplates: - if all_zones: - recursive_json(bld) - else: - # First, remove cores and perims lists - cores = bld.__dict__.pop("cores", None) - perims = bld.__dict__.pop("perims", None) + if path_or_buf is None: + basedir = Path(self.name).dirname() + name = Path(self.name).stem + path_or_buf = basedir / name + ".json" + + self.to_json( + path_or_buf, + indent=indent, + sort_keys=sort_keys, + compression=compression, + storage_options=storage_options, + ) + + def to_json( + self, + path_or_buf=None, + indent=2, + sort_keys=False, + default_handler=None, + compression="infer", + storage_options=None, + ): + """Convert the object to a JSON string. - # apply the recursion - recursive_json(bld) + Args: + path_or_buf (path-like): File path or object. If not specified, + the result is returned as a string. + indent (bool or str or int): If indent is a non-negative integer or string, + then JSON array elements and object members will be + pretty-printed with that indent level. An indent level of 0, + negative, or "" will only insert newlines. None (the default) + selects the most compact representation. Using a positive + integer indent indents that many spaces per level. If indent is + a string (such as "t"), that string is used to indent each + level. + sort_keys (callable): + default_handler (callable): Handler to call if object cannot otherwise be + converted to a suitable format for JSON. Should receive a single + argument which is the object to convert and return a serializable + object. + compression (str): A string representing the compression to use in the + output file, only used when the first argument is a filename. By + default, the compression is inferred from the filename. + storage_options (dict): Extra options that make sense for a particular + storage connection, e.g. host, port, username, password, etc., + if using a URL that will be parsed by fsspec, e.g., starting “s3://”, + “gcs://”. An error will be raised if providing this argument with a + non-fsspec URL. See the fsspec and backend storage implementation + docs for the set of allowed keys and values. + """ + if default_handler is None: + default_handler = CustomJSONEncoder - # put back objects - bld.cores = cores - bld.perims = perims + data_dict = self.to_dict() + if sort_keys is not None: + # Sort values for key in data_dict: - data_dict[key] = sorted( - data_dict[key], key=lambda x: x["Name"] if "Name" in x else "A" - ) - - class CustomJSONEncoder(json.JSONEncoder): - def default(self, obj): - if isinstance(obj, np.bool_): - return bool(obj) - - return obj - - if not data_dict["GasMaterials"]: - # Umi needs at least one gas material even if it is not necessary. - data_dict["GasMaterials"].append(GasMaterial(Name="AIR").to_json()) - # Write the dict to json using json.dumps - response = json.dumps( - data_dict, indent=indent, sort_keys=sort_keys, cls=CustomJSONEncoder - ) - path_or_buf.write(response) + # Sort the list elements by their Name + try: + data_dict[key] = sorted(data_dict[key], key=sort_keys) + except Exception: + # revert to sorting by Name if failure + data_dict[key] = sorted(data_dict[key], key=lambda x: x.get("Name")) + + response = json.dumps(data_dict, indent=indent, cls=default_handler) + if path_or_buf is not None: + # apply compression and byte/text conversion + with get_handle( + path_or_buf, + "wt", + compression=compression, + storage_options=storage_options, + ) as handles: + handles.handle.write(response) + else: + return response + + def to_dict(self): + """Return UmiTemplateLibrary dictionary representation.""" + # First, reset existing name + + # 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 = 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 = 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 + for key in tuple(data_dict.keys()): + v = data_dict[key] + del data_dict[key] + if key == "ZoneDefinitions": + key = "Zones" + if key == "StructureInformations": + key = "StructureDefinitions" + data_dict[key] = v + + # Validate + assert no_duplicates(data_dict, attribute="Name") + + # Sort values + for key in data_dict: + # Sort the list elements by their Name + data_dict[key] = sorted(data_dict[key], key=lambda x: x.get("Name")) + + return data_dict + + def unique_components(self, exceptions=None): + """Keep only unique components. + + Calls :func:`~archetypal.template.umi_base.UmiBase.get_unique` for each + object in the graph. + """ + self._clear_components_list(exceptions) # First clear components + + for key, group in self: + # for each group + for component in group: + # travers each object using generator + for parent, key, obj in traverse(component): + if key: # key is None when we reach lowest level + setattr( + parent, key, obj.get_unique() + ) # set unique object on key + + self.update_components_list(exceptions=exceptions) # Update the components list + # that was cleared + + def replace_component(self, this, that) -> None: + """Replace all instances of `this` with `that`. + + Args: + this (UmiBase): The reference to replace with `that`. + that (UmiBase): The object to replace each references with. + """ + for bldg in self.BuildingTemplates: + for parent, key, obj in traverse(bldg): + if obj is this: + setattr(parent, key, that) + + self.update_components_list() + + def update_components_list(self, exceptions=None): + """Update the component groups with connected components.""" + # clear components list except BuildingTemplate + self._clear_components_list(exceptions) + + for key, group in self: + for component in group: + for parent, key, child in traverse(component): + if isinstance(child, UmiBase): + obj_list = self.__dict__[child.__class__.__name__ + "s"] + if not any(o.id == child.id for o in obj_list): + # Important to compare on UmiBase.id and not on identity. + obj_list.append(child) - return response + def build_graph(self): + """Create the :class:`networkx.DiGraph` UmiBase objects as nodes.""" + import networkx as nx + + G = nx.DiGraph() + + for bldg in self.BuildingTemplates: + for parent, key, child in traverse(bldg): + G.add_edge(parent, child) + + return G + + +def no_duplicates(file, attribute="Name"): + """Assert whether or not dict has duplicated Names. + + `attribute` can be another attribute name like "$id". + + Args: + file (str or dict): Path of the json file or dict containing umi objects groups + attribute (str): Attribute to search for duplicates in json UMI structure. + eg. : "$id", "Name". + + Returns: + bool: True if no duplicates. + + Raises: + Exception if duplicates found. + """ + import json + from collections import defaultdict + + if isinstance(file, str): + data = json.loads(open(file).read()) + else: + data = file + ids = {} + for key, value in data.items(): + ids[key] = defaultdict(int) + for component in value: + try: + _id = component[attribute] + except KeyError: + pass # BuildingTemplate does not have an id + else: + ids[key][_id] += 1 + dups = { + key: dict(filter(lambda x: x[1] > 1, values.items())) + for key, values in ids.items() + if dict(filter(lambda x: x[1] > 1, values.items())) + } + if any(dups.values()): + raise Exception(f"Duplicate {attribute} found: {dups}") + else: + return True + + +DEEP_OBJECTS = (UmiBase, MaterialLayer, GasLayer, YearSchedulePart, MassRatio, list) + + +def traverse(parent): + """Iterate over UmiBases in a depth-first-search (DFS). + + Perform a depth-first-search over the UmiBase objects of var and + yield the Umibase objects in order. + """ + if isinstance(parent, DEEP_OBJECTS): + if isinstance(parent, list): + for obj in parent: + yield from traverse(obj) + elif isinstance(parent, DaySchedule): + yield None, None, parent + else: + for k, child in parent: + if isinstance(child, UmiBase): + yield parent, k, child + if isinstance(child, DEEP_OBJECTS): + yield from traverse(child) diff --git a/archetypal/utils.py b/archetypal/utils.py index d5ba4d9a..a405b017 100644 --- a/archetypal/utils.py +++ b/archetypal/utils.py @@ -18,22 +18,21 @@ import logging as lg import multiprocessing import os -import platform -import re import sys import time import unicodedata import warnings from collections import OrderedDict -from datetime import datetime, timedelta +from concurrent.futures._base import as_completed import numpy as np import pandas as pd from pandas.io.json import json_normalize from path import Path +from tqdm import tqdm -from archetypal import settings -from archetypal.settings import ep_version +from archetypal import __version__, settings +from archetypal.eplus_interface.version import EnergyPlusVersion def config( @@ -49,9 +48,9 @@ def config( log_filename=settings.log_filename, useful_idf_objects=settings.useful_idf_objects, umitemplate=settings.umitemplate, - trnsys_default_folder=settings.trnsys_default_folder, default_weight_factor="area", ep_version=settings.ep_version, + debug=settings.debug, ): """Package configurations. Call this method at the beginning of script or at the top of an interactive python environment to set package-wide settings. @@ -61,10 +60,8 @@ def config( logs_folder (str): where to write the log files. imgs_folder (str): where to save figures. cache_folder (str): where to save the simulation results. - use_cache (bool): if True, use a local cache to save/retrieve many of - archetypal outputs such as EnergyPlus simulation results. This can - save a lot of time by not calling the simulation and DataPortal APIs - repetitively for the same requests. + use_cache (bool): if True, use a local cache to save/retrieve DataPortal API + calls for the same requests. log_file (bool): if true, save log output to a log file in logs_folder. log_console (bool): if true, print log output to the console. log_level (int): one of the logger.level constants. @@ -72,19 +69,19 @@ def config( log_filename (str): name of the log file. useful_idf_objects (list): a list of useful idf objects. umitemplate (str): where the umitemplate is located. - trnsys_default_folder (str): root folder of TRNSYS install. default_weight_factor: ep_version (str): EnergyPlus version to use. eg. "9-2-0". + debug (bool): Use debug behavior in various part of code base. Returns: None """ # set each global variable to the passed-in parameter value settings.use_cache = use_cache - settings.cache_folder = Path(cache_folder).makedirs_p() - settings.data_folder = Path(data_folder).makedirs_p() - settings.imgs_folder = Path(imgs_folder).makedirs_p() - settings.logs_folder = Path(logs_folder).makedirs_p() + settings.cache_folder = Path(cache_folder).expand().makedirs_p() + settings.data_folder = Path(data_folder).expand().makedirs_p() + settings.imgs_folder = Path(imgs_folder).expand().makedirs_p() + settings.logs_folder = Path(logs_folder).expand().makedirs_p() settings.log_console = log_console settings.log_file = log_file settings.log_level = log_level @@ -92,44 +89,23 @@ def config( settings.log_filename = log_filename settings.useful_idf_objects = useful_idf_objects settings.umitemplate = umitemplate - settings.trnsys_default_folder = validate_trnsys_folder(trnsys_default_folder) settings.zone_weight.set_weigth_attr(default_weight_factor) - settings.ep_version = validate_epversion(ep_version) + settings.ep_version = EnergyPlusVersion(ep_version).dash + settings.debug = debug # if logging is turned on, log that we are configured if settings.log_file or settings.log_console: log("Configured archetypal") -def validate_epversion(ep_version): - """Validates the ep_version form""" - if "." in ep_version: - raise NameError('Enter the EnergyPlus version in the form "9-2-0"') - return ep_version - - -def validate_trnsys_folder(trnsys_default_folder): - """ - Args: - trnsys_default_folder: - """ - if sys.platform == "win32": - if os.path.isdir(trnsys_default_folder): - return trnsys_default_folder - else: - warnings.warn( - "The TRNSYS path does not exist. Please set the TRNSYS " - "path with the --trnsys-default-folder option".format( - trnsys_default_folder - ) - ) - return trnsys_default_folder - else: - return trnsys_default_folder - - def log( - message, level=None, name=None, filename=None, avoid_console=False, log_dir=None + message, + level=None, + name=None, + filename=None, + avoid_console=False, + log_dir=None, + verbose=False, ): """Write a message to the log file and/or print to the the console. @@ -142,6 +118,7 @@ def log( only log_dir (str, optional): directory of log file. Defaults to settings.log_folder + verbose: If True, settings.log_console is overridden. """ if level is None: level = settings.log_level @@ -166,7 +143,7 @@ def log( # if logging to console is turned on, convert message to ascii and print to # the console - if settings.log_console and not avoid_console: + if settings.log_console or verbose or level == lg.ERROR and not avoid_console: # capture current stdout, then switch it to the console, print the # message, then switch back to what had been the stdout. this prevents # logging to notebook - instead, it goes to console @@ -176,11 +153,11 @@ 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() ) - print(message) + tqdm.write(message) sys.stdout = standard_out if level == lg.WARNING: @@ -261,269 +238,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 - - 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`. @@ -630,7 +344,8 @@ def copy_file(files, where=None): files (str or list): path(s) of the file(s) to copy where (str): path where to save the copy(ies) """ - import shutil, os + import os + import shutil if isinstance(files, str): files = [files] @@ -651,53 +366,6 @@ def copy_file(files, where=None): return _unpack_tuple(list(files.values())) -class EnergyPlusProcessError(Exception): - """EnergyPlus Process call error""" - - def __init__(self, cmd, stderr, idf): - """ - Args: - cmd: - stderr: - idf: - """ - super().__init__(stderr) - self.cmd = cmd - self.idf = idf - self.stderr = stderr - - def __str__(self): - """Override that only returns the stderr""" - msg = ":\n".join([self.idf, self.stderr]) - return msg - - -class EnergyPlusVersionError(Exception): - """EnergyPlus Version call error""" - - def __init__(self, idf_file, idf_version, ep_version): - super(EnergyPlusVersionError, self).__init__(None) - self.idf_file = idf_file - self.idf_version = idf_version - self.ep_version = ep_version - - def __str__(self): - """Override that only returns the stderr""" - if tuple(self.idf_version.split("-")) > tuple(self.ep_version.split("-")): - compares_ = "higher" - else: - compares_ = "lower" - msg = ( - "The version of the idf file {} (v{}) is {} than the specified " - "EnergyPlus version (v{}). Specify the default EnergyPlus version " - "with :func:`config` that corresponds with the one installed on your machine" - " or specify the version in related module functions, e.g. :func:`run_eplus`.".format( - self.idf_file.basename(), self.idf_version, compares_, self.ep_version - ) - ) - return msg - - @contextlib.contextmanager def cd(path): """ @@ -716,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: @@ -869,58 +464,6 @@ def float_round(num, n): return num -def get_eplus_dirs(version=ep_version): - """Returns EnergyPlus root folder for a specific version. - - Returns (Path): The folder path. - - Args: - version (str): Version number in the form "9-2-0" to search for. - """ - from eppy.runner.run_functions import install_paths - - eplus_exe, eplus_weather = install_paths(version) - return Path(eplus_exe).dirname() - - -def warn_if_not_compatible(): - """Checks if an EnergyPlus install is detected. If the latest version - detected is higher than the one specified by archetypal, a warning is also - raised. - """ - eplus_homes = get_eplus_basedirs() - - if not eplus_homes: - warnings.warn( - "No installation of EnergyPlus could be detected on this " - "machine. Please install EnergyPlus from https://energyplus.net before using archetypal" - ) - if len(eplus_homes) > 1: - # more than one installs - warnings.warn( - "There are more than one versions of EnergyPlus on this machine. Make " - "sure you provide the appropriate version number when possible. " - ) - - -def get_eplus_basedirs(): - """Returns a list of possible E+ install paths""" - if platform.system() == "Windows": - eplus_homes = Path("C:\\").glob("EnergyPlusV*") - return eplus_homes - elif platform.system() == "Linux": - eplus_homes = Path("/usr/local/").glob("EnergyPlus-*") - return eplus_homes - elif platform.system() == "Darwin": - eplus_homes = Path("/Applications").glob("EnergyPlus-*") - return eplus_homes - else: - warnings.warn( - "Archetypal is not compatible with %s. It is only compatible " - "with Windows, Linux or MacOs" % platform.system() - ) - - def timeit(method): """Use this method as a decorator on a function to calculate the time it take to complete. Uses the :func:`log` method. @@ -961,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: @@ -990,11 +528,14 @@ def reduce(function, iterable, **attr): iterable: **attr: """ - it = iter(iterable) - value = next(it) - for element in it: - value = function(value, element, **attr) - return value + if iterable: + it = iter(iterable) + value = next(it) + for element in it: + value = function(value, element, **attr) + return value + else: + return None def _unpack_tuple(x): @@ -1037,77 +578,221 @@ def rotate(l, n): return l[n:] + l[:n] -def parallel_process(in_dict, function, processors=-1, use_kwargs=True): - """A parallel version of the map function with a progress bar. +def parallel_process( + in_dict, + function, + processors=-1, + use_kwargs=True, + show_progress=True, + position=0, + debug=False, + executor=None, +): + """A parallel version of the map function with a progress b Examples: - >>> import archetypal as ar + >>> from archetypal import IDF >>> files = ['tests/input_data/problematic/nat_ventilation_SAMPLE0.idf', >>> 'tests/input_data/regular/5ZoneNightVent1.idf'] >>> wf = 'tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw' - >>> files = ar.copy_file(files) - >>> rundict = {file: dict(eplus_file=file, weather_file=wf, - >>> ep_version=ep_version, annual=True, + >>> rundict = {file: dict(idfname=file, epw=wf, + >>> as_version="9-2-0", annual=True, >>> prep_outputs=True, expandobjects=True, - >>> verbose='q', output_report='sql') + >>> verbose='q') >>> for file in files} - >>> result = parallel_process(rundict, ar.run_eplus, use_kwargs=True) + >>> result = parallel_process(rundict, IDF, use_kwargs=True) Args: - in_dict (dict-like): A dictionary to iterate over. - function (function): A python function to apply to the elements of + in_dict (dict): A dictionary to iterate over. `function` is applied to value + and key is used as an identifier. + 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` . + processors (int): The number of cores to use. + use_kwargs (bool): If True, pass the kwargs as arguments to `function`. + debug (bool): If True, will raise any error on any process. + position: Specify the line offset to print the tqdm bar (starting from 0) + Automatic if unspecified. Useful to manage multiple bars at once + (eg, from threads). + executor (Executor) Returns: [function(array[0]), function(array[1]), ...] """ + if executor is None: + from concurrent.futures import ThreadPoolExecutor + + _executor_factory = ThreadPoolExecutor + else: + _executor_factory = executor + from tqdm import tqdm - from concurrent.futures import ProcessPoolExecutor, as_completed if processors == -1: processors = min(len(in_dict), multiprocessing.cpu_count()) + kwargs = { + "desc": function.__name__, + "total": len(in_dict), + "unit": "runs", + "unit_scale": True, + "position": position, + "disable": not show_progress, + } + if processors == 1: - kwargs = { - "desc": function.__name__, - "total": len(in_dict), - "unit": "runs", - "unit_scale": True, - "leave": True, - } - if use_kwargs: - futures = {a: function(**in_dict[a]) for a in tqdm(in_dict, **kwargs)} - else: - futures = {a: function(in_dict[a]) for a in tqdm(in_dict, **kwargs)} - else: - with ProcessPoolExecutor(max_workers=processors) as pool: + futures = [] + out = [] + for a in tqdm(in_dict, **kwargs): if use_kwargs: - futures = {pool.submit(function, **in_dict[a]): a for a in in_dict} + futures.append(submit(function, **in_dict[a])) else: - futures = {pool.submit(function, in_dict[a]): a for a in in_dict} + futures.append(submit(function, in_dict[a])) + for job in futures: + out.append(job) + else: + with _executor_factory( + max_workers=processors, + initializer=config, + initargs=( + settings.data_folder, + settings.logs_folder, + settings.imgs_folder, + settings.cache_folder, + settings.use_cache, + settings.log_file, + settings.log_console, + settings.log_level, + settings.log_name, + settings.log_filename, + settings.useful_idf_objects, + settings.umitemplate, + "area", + settings.ep_version, + settings.debug, + ), + ) as executor: + out = [] + futures = [] - kwargs = { - "desc": function.__name__, - "total": len(futures), - "unit": "runs", - "unit_scale": True, - "leave": True, - } + if use_kwargs: + for a in in_dict: + future = executor.submit(function, **in_dict[a]) + futures.append(future) + else: + for a in in_dict: + future = executor.submit(function, in_dict[a]) + futures.append(future) # Print out the progress as tasks complete - for f in tqdm(as_completed(futures), **kwargs): - pass - out = {} - # Get the results from the futures. - for key in futures: - try: - if processors > 1: - out[futures[key]] = key.result() - else: - out[key] = futures[key] - except Exception as e: - log(str(e), lg.ERROR) - out[futures[key]] = e - return out \ No newline at end of file + for job in tqdm(as_completed(futures), **kwargs): + # Read result from future + try: + result_done = job.result() + except Exception as e: + if debug: + lg.warning(str(e)) + raise e + result_done = e + # Append to the list of results + out.append(result_done) + return out + + +def submit(fn, *args, **kwargs): + """return fn or Exception""" + try: + return fn(*args, **kwargs) + except Exception as e: + return e + + +def is_referenced(name, epbunch, fieldname="Zone_or_ZoneList_Name"): + """bool: Returns True if name is in referenced object fieldname""" + refobj = epbunch.get_referenced_object(fieldname) + if not refobj: + refobj = epbunch.get_referenced_object("Zone_Name") # Backwards Compatibility + if not refobj: + pass + elif refobj.key.upper() == "ZONE": + return name in refobj.Name + elif refobj.key.upper() == "ZONELIST": + raise NotImplementedError( + f"Checking against a ZoneList is " + f"not yet supported in archetypal " + f"v{__version__}" + ) + raise ValueError( + f"Invalid referring object returned while " + f"referencing object name: Looking for '{name}' in " + f"object {refobj}" + ) + + +def docstring_parameter(*args, **kwargs): + """Replaces variables in foo.__doc__ by calling obj.__doc__ = + obj.__doc__.format(* args, ** kwargs) + """ + + def dec(obj): + obj.__doc__ = obj.__doc__.format(*args, **kwargs) + return obj + + return dec + + +def extend_class(cls): + """Given class cls, apply decorator @extend_class to function f so + that f becomes a regular method of cls: + + Example: + >>> class cls: pass + >>> @extend_class(cls) + ... def f(self): + ... pass + + Extending class has several usages: + 1. There are classes A, B, ... Z, all defining methods foo and b + Though the usual approach is to group the code around class + definitions in files A.py, B.py, ..., Z.py, it is sometimes more + convenient to group all definitions of A.foo(), B.foo(), ... up + to Z.foo(), in one file "foo.py", and all definitions of bar in + file "bpy". + 2. Another usage of @extend_class is building a class step-by-step + --- first creating an empty class, and later populating it with + methods. + 3. Finally, it is possible to @extend several classes + simultaneously with the same method, as in the example below, + where classes A and B share method foo. + + Example: + >>> class A: pass # empty class + ... + >>> class B: pass # empty class + ... + >>> @extend_class(A) + ... @extend_class(B) + ... def foo(self,s): + ... print s + ... + >>> a = A() + >>> a.foo('hello') + hello + >>> b = B() + >>> b.foo('world') + world + + Limitations: + 1. @extend_class won't work on builtin classes, such as int. + 2. Not tested on python 3. + Author: + victorlei@gmail.com + """ + return lambda f: (setattr(cls, f.__name__, f) or f) + + +class CustomJSONEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, np.bool_): + return bool(obj) + + return obj diff --git a/archetypal/zone_graph.py b/archetypal/zone_graph.py new file mode 100644 index 00000000..e8405d2a --- /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.zonedefinition 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) diff --git a/docs/_templates/autosummary-noinherit.rst b/docs/_templates/autosummary-noinherit.rst new file mode 100644 index 00000000..dd48b464 --- /dev/null +++ b/docs/_templates/autosummary-noinherit.rst @@ -0,0 +1,11 @@ +{{ fullname | escape | underline}} + + +.. currentmodule:: {{ module }} + +.. auto{{ objtype }}:: {{ objname }} {% if objtype in ['class'] %} + :members: + {% endif %} + + + diff --git a/docs/caching.rst b/docs/caching.rst index 83f2aea9..a922d58c 100644 --- a/docs/caching.rst +++ b/docs/caching.rst @@ -5,18 +5,18 @@ Archetypal features a caching api aimed at accelerating reproducible workflows u unnecessary calls to the EnergyPlus executable or transitioning programs. Concretely, caching an IDF model means that, for instance, if an older version model (less than 9.2) is ran, archetypal will transition a copy of that file to version 9.2 (making a copy beforehand) and run the simulation with the matching EnergyPlus executable. The next time the -:func:`archetypal.idfclass.run_eplus` or the :func:`archetypal.idfclass.load_idf` method is called, the cached +:func:`~archetypal.idfclass.idf.IDF` constructor is called, the cached (transitioned) file will be readily available and used; This helps to save time especially with reproducible workflows since transitioning files can take a while to complete. -As for simulation results, after :func:`archetypal.idfclass run_eplus` is called, the EnergyPlus outputs (.csv, sqlite, -mtd, .mdd, etc.) are cached in a folder structure than is identified according to the simulation parameters; those -parameters include the content of the IDF file itself (if the file has changed, a new simulation is required), whether -an annual or design day simulation is executed, etc. This means that if run_eplus is called a second time (let us say -after restarting a Jupyter Notebook kernel), the run_eplus will bypass the EnergyPlus executable and retrieve the cached -simulation results instead. This has two advantages, the first one being a quicker workflow and the second one making -sure that whatever `run_eplus` returns fits the parameters used with the executable. Let us use this in a real world -example. First, caching is enabled using the `config` method: +As for simulation results, after :func:`archetypal.idfclass.idf.IDF.simulate` is called, the EnergyPlus outputs (.csv, +sqlite, mtd, .mdd, etc.) are cached in a folder structure than is identified according to the simulation parameters; +those parameters include the content of the IDF file itself (if the file has changed, a new simulation is required), +whether an annual or design day simulation is executed, etc. This means that if simulate is called a second time (let us +say after restarting a Jupyter Notebook kernel), the simulate will bypass the EnergyPlus executable and retrieve the +cached simulation results instead. This has two advantages, the first one being a quicker workflow and the second one +making sure that whatever `IDF.simulation_files` returns fits the parameters used with the executable. Let us use this +in a real world example. First, caching is enabled using the `config` method: Enabling caching ---------------- @@ -28,8 +28,8 @@ recommended to put the `config` method at the beginning of a script or in the fi .. code-block:: python - import archetypal as ar - ar.config(use_cache=True, log_console=True) + from archetypal import IDF, config, get_eplus_dirs, settings + config(use_cache=True, log_console=True) Example ------- @@ -38,92 +38,81 @@ In a Jupyter Notebook, one would typically do the following: .. code-block:: python - _, idf, results = ar.run_eplus( - eplus_file=ar.utils.get_eplus_dirs("8-9-0") / "ExampleFiles" / "BasicsFiles/AdultEducationCenter.idf", - weather_file=ar.utils.get_eplus_dirs("8-9-0") / "WeatherData" / "USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw", + idf = IDF( + get_eplus_dirs(settings.as_version) / "ExampleFiles" / "BasicsFiles/AdultEducationCenter.idf", + epw=get_eplus_dirs(settings.as_version) / "WeatherData" / "USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw", design_day=True, - return_files=True, annual=False, - return_idf=True, expandobjects=True, prep_outputs=True, ) -Since the file is a version 8.0 IDF file, archetypal is going to transition the file to EnergyPlus 9.2 (or any other -version specified with the ep_version parameter) and execute EnergyPlus for the `design_day` only. +If the file would be an older version, archetypal is going to transition the file to EnergyPlus 9.2 (or any other +version specified with the as_version parameter) and execute EnergyPlus for the `design_day` only. -The command above yields a list of output files thanks to the `return_files=True` parameter. These will be located +The command bellow yields a list of output files. These will be located inside a cache folder specified by the settings.cache_folder variable (this folder path can be changed using the config method). .. code-block:: python - [None, , - [Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4tbl.csv'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.end'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/AdultEducationCenter.idf'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.dxf'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.eso'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.mtd'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.bnd'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.sql'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.mdd'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4tbl.htm'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.shd'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.expidf'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.err'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/eplus_run_AdultEducationCenter.idf_2020_02_27.log'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.mtr'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/sqlite.err'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.audit'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.eio'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/d04795a50b4ff172da72fec54c6991e4/d04795a50b4ff172da72fec54c6991e4out.rdd')]] - -Now, if the command above is modified with `annual=True` and set `design_day=False`, then run_eplus should return the -annual simulation results (which do not exist yet). + >>> idf.simulate().simulation_files + [Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\AdultEducationCenter.idf'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.audit'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.bnd'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.dxf'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.eio'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.end'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.err'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.eso'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.expidf'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.mdd'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.mtd'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.mtr'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.rdd'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.shd'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431bout.sql'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431btbl.csv'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\b07dbcb49b54298c5f64fe5ee730431btbl.htm'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\runargs.json'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\sqlite.err'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\b07dbcb49b54298c5f64fe5ee730431b\\USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw')]] + +Now, if the command above is modified with `annual=True` and set `design_day=False`, then `idf.simulate().simulation_files` +should return the annual simulation results (which do not exist yet). .. code-block:: python - _, idf, results = ar.run_eplus( - eplus_file=ar.utils.get_eplus_dirs("8-9-0") / "ExampleFiles" / "BasicsFiles/AdultEducationCenter.idf", - weather_file=ar.utils.get_eplus_dirs("8-9-0") / "WeatherData" / "USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw", - design_day=False, - return_files=True, - annual=True, - return_idf=True, - expandobjects=True, - prep_outputs=True, - ) + >>> idf.simulate(annual=True, design_day=False).simulation_files Now, since the original IDF file (the version 8.9 one) has not changed, archetypal is going to look for the transitioned file that resides in the cache folder and use that one instead of retransitioning the original file a second time. On -the other hand, since the parameters of run_eplus have changed (annual instead of design_day), it is going to execute +the other hand, since the parameters of `simulate()` have changed (annual instead of design_day), it is going to execute EnergyPlus using the annual method and return the annual results (see that the second-level folder id has changed from -d04795a50b4ff172da72fec54c6991e4 to 9efc05f6e6cde990685b8ef61e326d94; *these ids may be different on your computer*): +b07dbcb49b54298c5f64fe5ee730431b to 1cc202748b6c3c2431d203ce90e4d081; *these ids may be different on your computer*): .. code-block:: python - [None, , - [Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/AdultEducationCenter.idf'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.mdd'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.shd'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94tbl.htm'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.audit'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.mtr'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.err'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.rdd'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.expidf'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.eio'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.dxf'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.end'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94tbl.csv'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.eso'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.bnd'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.mtd'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/sqlite.err'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/9efc05f6e6cde990685b8ef61e326d94out.sql'), - Path('cache/e8f4fb7e50ecaaf2cf2c9d4e4d159605/9efc05f6e6cde990685b8ef61e326d94/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw')]] + [Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.audit'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.bnd'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.dxf'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.eio'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.end'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.err'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.eso'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.expidf'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.mdd'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.mtd'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.mtr'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.rdd'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.shd'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081out.sql'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081tbl.csv'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\1cc202748b6c3c2431d203ce90e4d081tbl.htm'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\AdultEducationCenter.idf'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\runargs.json'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\sqlite.err'), + Path('cache\\b0b749f1c11f28b3d24d1d8978d1140e\\1cc202748b6c3c2431d203ce90e4d081\\USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw')] If we were to rerun the first code block (annual simulation) then it would return the cached results instantly from the cache: diff --git a/docs/conf.py b/docs/conf.py index 8bb5235d..a0f51d77 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -8,13 +8,16 @@ # -- 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(".")) sys.path.insert(0, os.path.abspath("archetypal")) @@ -26,9 +29,9 @@ author = "Samuel Letellier-Duchesne" # The full version, including alpha/beta/rc tags -import archetypal - -version = release = archetypal.__version__ +release = get_distribution("archetypal").version +# for example take major/minor +version = release = ".".join(release.split(".")[:2]) # -- General configuration --------------------------------------------------- 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/converter_umi.rst b/docs/converter_umi.rst index 27e6d38e..abd419ab 100644 --- a/docs/converter_umi.rst +++ b/docs/converter_umi.rst @@ -43,16 +43,16 @@ Using the Python Console 1. Load the file -First, load the EnergyPlus idf file using the :func:`archetypal.idfclass.load_idf` method. In the following example, +First, load the EnergyPlus idf file using the :class:`archetypal.idfclass.idf.IDF` class. In the following example, the AdultEducationCenter.idf model is used. .. code-block:: python - >>> from archetypal import get_eplus_dirs, load_idf + >>> from archetypal import get_eplus_dirs, IDF >>> eplus_dir = get_eplus_dirs("9-2-0") # Getting EnergyPlus install path >>> eplus_file = eplus_dir / "ExampleFiles" / "BasicsFiles" / "AdultEducationCenter.idf" # Model path >>> weather = eplus_dir / "WeatherData" / "USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw" # Weather file path - >>> idf = load_idf(eplus_file=eplus_file, weather_file=weather) # IDF load + >>> idf = IDF(idfname=eplus_file, epw=weather) # IDF load 2. Create a BuildingTemplate Object @@ -60,15 +60,15 @@ the AdultEducationCenter.idf model is used. >>> from archetypal import BuildingTemplate >>> template_obj = BuildingTemplate.from_idf( - >>> idf, sql=idf.sql, DataSource=idf.name + >>> idf, DataSource=idf.name >>> ) -3. Create an UmiTemplate Object and Save +3. Create an UmiTemplateLibrary Object and Save .. code-block:: python - >>> from archetypal import UmiTemplate - >>> template_json = UmiTemplate( + >>> from archetypal import UmiTemplateLibrary + >>> template_json = UmiTemplateLibrary( >>> name="my_umi_template", >>> BuildingTemplates=[template_obj] - >>> ).to_json() + >>> ).to_dict() 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 diff --git a/docs/creating_umi_template.rst b/docs/creating_umi_template.rst new file mode 100644 index 00000000..b58fb966 --- /dev/null +++ b/docs/creating_umi_template.rst @@ -0,0 +1,942 @@ +Creating an Umi template +======================== + +.. py:currentmodule:: archetypal.template + +This tutorial explains how to create an Umi Template Library from scratch using `archetypal`. This section presents each +required steps to create a valid Umi Template Library object. Every object will be presented with their +default parameters, and simple examples will show how to create objects with the minimum required parameters. Before +we start, here is a description of the overall structure of an Umi Template Library and the Building Templates it +contains. + +Umi Template Structure +---------------------- + +An Umi Template is a collection of various other objects that are referenced between each other. At the top of the +hierarchy, there is the :class:`UmiTemplateLibrary` object which holds all the other bits and pieces making up the template +library. The second level is therefore the :class:`BuildingTemplate` object. There is one BuildingTemplate for each +building models (or archetypes). Each BuildingTemplate is made of a series of children objects, and multiple +BuildingTemplates can share the same children. For example, two buildings can share the same lighting schedule or the +same opaque material. + +For simplicity, this tutorial begins with the lowest level in the hierarchy (or the leaf in a graph structure): The +materials. + +Defining materials +------------------ + +The first step is to create the library of materials from which the constructions will be made. +(used as :class:`Layers` in constructions). There are :class:`OpaqueMaterial`, :class:`GlazingMaterial` and +:class:`GasMaterial` to define. + +Opaque materials +________________ + +Here are the parameters and their default values for an OpaqueMaterial object (see :class:`OpaqueMaterial` for more +information) + +.. code-block:: python + + def __init__( + 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) + +Users can keep the default values by simply omitting them in the constructor For example, one can create a simple list +of 4 OpaqueMaterial objects with default values. Note that the Name, Conductivity and SpecificHeat are required +parameters: + +.. code-block:: python + + concrete = ar.OpaqueMaterial(Name="Concrete", Conductivity=0.5, SpecificHeat=800, Density=1500) + insulation = ar.OpaqueMaterial(Name="Insulation", Conductivity=0.04, SpecificHeat=1000, Density=30) + brick = ar.OpaqueMaterial(Name="Brick", Conductivity=1, SpecificHeat=900, Density=1900) + plywood = ar.OpaqueMaterial(Name="Plywood", Conductivity=0.13, SpecificHeat=800, Density=540) + +Add these 4 materials to a variable named `OpaqueMaterials`. This variable will be referenced at the end when the +:class:`UmiTemplateLibrary` object will be created. + +.. code-block:: python + + # List of OpaqueMaterial objects (needed for Umi template creation) + OpaqueMaterials = [concrete, insulation, brick, plywood] + +Glazing materials +_________________ + +The same goes for the GlazingMaterial objects (see :class:`GlazingMaterial` for more information) + +.. code-block:: python + + def __init__( + Name, + Density=2500, + Conductivity=0, + SolarTransmittance=0, + SolarReflectanceFront=0, + SolarReflectanceBack=0, + VisibleTransmittance=0, + VisibleReflectanceFront=0, + VisibleReflectanceBack=0, + IRTransmittance=0, + IREmissivityFront=0, + IREmissivityBack=0, + DirtFactor=1.0, + Type=None, + Cost=0.0, + Life=1, + **kwargs) + +A "Transparent Glass" object is created with the following optical and thermal properties: + +.. code-block:: python + + glass = ar.GlazingMaterial( + Name="Glass", + Density=2500, + Conductivity=1, + SolarTransmittance=0.7, + SolarReflectanceFront=0.5, + SolarReflectanceBack=0.5, + VisibleTransmittance=0.7, + VisibleReflectanceFront=0.5, + VisibleReflectanceBack=0.5, + IRTransmittance=0.7, + IREmissivityFront=0.5, + IREmissivityBack=0.5) + +The object is referenced in the following variable: +.. code-block:: python + + # List of GlazingMaterial objects (needed for Umi template creation) + GlazingMaterials = [glass] + +Gas materials +_____________ + +Here are all the parameters and their default values for a GasMaterial object (see :class:`GasMaterial` for more +information) + +.. code-block:: python + + def __init__( + Name, + Cost=0, + EmbodiedCarbon=0, + EmbodiedEnergy=0, + SubstitutionTimestep=100, + TransportCarbon=0, + TransportDistance=0, + TransportEnergy=0, + SubstitutionRatePattern=None, + Conductivity=2.4, + Density=2400, + **kwargs) + +Example of GasMaterial object: + +.. code-block:: python + + air = ar.GasMaterial(Name="Air", Conductivity=0.02, Density=1.24) + # List of GasMaterial objects (needed for Umi template creation) + 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 + +.. code-block:: python + + def __init__(Material, Thickness) + +The Material (from :class:`OpaqueMaterial` or :class:`GlazingMaterial` or +:class:`GasMaterial`) and Thickness are required parameters: + +.. code-block:: python + + concreteLayer = ar.MaterialLayer(concrete, Thickness=0.2) + insulationLayer = ar.MaterialLayer(insulation, Thickness=0.5) + brickLayer = ar.MaterialLayer(brick, Thickness=0.1) + plywoodLayer = ar.MaterialLayer(plywood, Thickness=0.016) + glassLayer = ar.MaterialLayer(glass, Thickness=0.16) + airLayer = ar.MaterialLayer(air, Thickness=0.04) + +Defining constructions +---------------------- + +Once the material layers are created, wall assemblies (or :class:`OpaqueConstruction` objects) can be created. + +Opaque constructions +____________________ + +Here are all the parameters and default values for an +OpaqueConstruction object (see :class:`OpaqueConstruction` for more information) + +.. code-block:: python + + def __init__( + Name, + Layers, + Surface_Type, + Outside_Boundary_Condition, + IsAdiabatic, + **kwargs) + +An OpaqueConstruction requires a few parameters such as the :attr:`Layers` (a list of :class:`OpapqueMaterial` +objects), the :attr:`Surface_Type` (choice of "Partition", "" + +.. code-block:: python + + # OpaqueConstruction using OpaqueMaterial objects + wall_int = ar.OpaqueConstruction( + Layers=[plywoodLayer], + Surface_Type="Partition", + Outside_Boundary_Condition="Zone", + IsAdiabatic=True) + + wall_ext = ar.OpaqueConstruction( + Layers=[concreteLayer, insulationLayer, brickLayer], + Surface_Type="Facade", + Outside_Boundary_Condition="Outdoors") + + floor = ar.OpaqueConstruction( + Layers=[concreteLayer, plywoodLayer], + Surface_Type="Ground", + Outside_Boundary_Condition="Zone") + + roof = ar.OpaqueConstruction( + Layers=[plywoodLayer, insulationLayer, brickLayer], + Surface_Type="Roof", + Outside_Boundary_Condition="Outdoors") + # List of OpaqueConstruction objects (needed for Umi template creation) + OpaqueConstructions = [wall_int, wall_ext, floor, roof] + +Window constructions +____________________ + +Here are all the parameters and their default values for an +WindowConstruction object (see WindowConstruction_ doc for more information) + +.. code-block:: python + + def __init__( + Layers, + Category="Double", + AssemblyCarbon=0, + AssemblyCost=0, + AssemblyEnergy=0, + DisassemblyCarbon=0, + DisassemblyEnergy=0, + **kwargs) + +Example of WindowConstruction object: + +.. code-block:: python + + # WindowConstruction using GlazingMaterial and GasMaterial objects + window = ar.WindowConstruction(Layers=[glassLayer, airLayer, glassLayer]) + # List of WindowConstruction objects (needed for Umi template creation) + WindowConstructions = [window] + +Structure definition +____________________ + +Here are all the parameters and their default values for an +StructureInformation object (see StructureDefinition_ doc for more information) + +.. code-block:: python + + def __init__( + *args, + AssemblyCarbon=0, + AssemblyCost=0, + AssemblyEnergy=0, + DisassemblyCarbon=0, + DisassemblyEnergy=0, + MassRatios=None, + **kwargs) + +We observe that StructureInformation uses MassRatio objects. Here are the +parameters of MassRatio object (see MassRatio_ doc for more information) + +.. code-block:: python + + def __init__(HighLoadRatio=None, Material=None, NormalRatio=None) + +Example of StructureInformation object: + +.. code-block:: python + + # StructureInformation using OpaqueMaterial objects + mass_ratio = ar.MassRatio(Material=plywood, HighLoadRatio=1, NormalRatio=1) + struct_definition = ar.StructureInformation(MassRatios=[mass_ratio]) + # List of StructureInformation objects (needed for Umi template creation) + StructureDefinitions = [struct_definition] + +Defining schedules +------------------ + +Creating Umi template objects to define schedules (e.g. `DaySchedule`). + +- Day schedules + + 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 + + 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 :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 + + 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 :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 + 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] + +Defining window settings +------------------------ + + Creating Umi template objects to define window settings + + Here are all the parameters and their default values for an + WindowSetting object (see WindowSetting_ doc for more information) + + .. code-block:: python + + def __init__( + Name, + Construction=None, + OperableArea=0.8, + AfnWindowAvailability=None, + AfnDischargeC=0.65, + AfnTempSetpoint=20, + IsVirtualPartition=False, + IsShadingSystemOn=False, + ShadingSystemAvailabilitySchedule=None, + ShadingSystemSetpoint=180, + ShadingSystemTransmittance=0.5, + ShadingSystemType=0, + Type=WindowType.External, + IsZoneMixingOn=False, + ZoneMixingAvailabilitySchedule=None, + ZoneMixingDeltaTemperature=2, + ZoneMixingFlowRate=0.001, + **kwargs) + + Example of WindowSetting object: + + .. code-block:: python + + # WindowSetting using WindowConstruction and YearSchedule objects + window_setting = ar.WindowSetting( + Name="window_setting_1", + Construction=window, + AfnWindowAvailability=sch_y_off, + ShadingSystemAvailabilitySchedule=sch_y_off, + ZoneMixingAvailabilitySchedule=sch_y_off) + # List of WindowSetting objects (needed for Umi template creation) + WindowSettings = [window_setting] + +Defining DHW settings +--------------------- + + Creating Umi template objects to define DHW settings + + Here are all the parameters and their default values for an + DomesticHotWaterSetting object (see DomesticHotWaterSetting_ doc for more information) + + .. code-block:: python + + def __init__( + Name, + IsOn=True, + WaterSchedule=None, + FlowRatePerFloorArea=0.03, + WaterSupplyTemperature=65, + WaterTemperatureInlet=10, + **kwargs) + + Example of DomesticHotWaterSetting object: + + .. code-block:: python + + # DomesticHotWaterSetting using YearSchedule objects + dhw_setting = ar.DomesticHotWaterSetting( + Name="dwh_setting_1", + IsOn=True, + WaterSchedule=sch_y_dhw, + FlowRatePerFloorArea=0.03, + WaterSupplyTemperature=65, + WaterTemperatureInlet=10,) + # List of DomesticHotWaterSetting objects (needed for Umi template creation) + DomesticHotWaterSettings = [dhw_setting] + +Defining ventilation settings +----------------------------- + + Creating Umi template objects to define ventilation settings + + Here are all the parameters and their default values for an + VentilationSetting object (see VentilationSetting_ doc for more information) + + .. code-block:: python + + def __init__( + Name, + NatVentSchedule=None, + ScheduledVentilationSchedule=None, + Afn=False, + Infiltration=0.1, + IsBuoyancyOn=True, + IsInfiltrationOn=True, + IsNatVentOn=False, + IsScheduledVentilationOn=False, + IsWindOn=False, + NatVentMaxOutdoorAirTemp=30, + NatVentMaxRelHumidity=90, + NatVentMinOutdoorAirTemp=0, + NatVentZoneTempSetpoint=18, + ScheduledVentilationAch=0.6, + ScheduledVentilationSetpoint=18, + **kwargs) + + Example of VentilationSetting object: + + .. code-block:: python + + # VentilationSetting using YearSchedule objects + vent_setting = ar.VentilationSetting( + Name="vent_setting_1", + NatVentSchedule=sch_y_off, + ScheduledVentilationSchedule=sch_y_off,) + # List of VentilationSetting objects (needed for Umi template creation) + VentilationSettings = [vent_setting] + +Defining zone conditioning settings +----------------------------------- + + Creating Umi template objects to define zone conditioning settings + + Here are all the parameters and their default values for an + ZoneConditioning object (see ZoneConditioning_ doc for more information) + + .. code-block:: python + + def __init__( + Name, + CoolingCoeffOfPerf=1, + CoolingLimitType="NoLimit", + CoolingSetpoint=26, + CoolingSchedule=None, + EconomizerType="NoEconomizer", + HeatRecoveryEfficiencyLatent=0.65, + HeatRecoveryEfficiencySensible=0.7, + HeatRecoveryType="None", + HeatingCoeffOfPerf=1, + HeatingLimitType="NoLimit", + HeatingSetpoint=20, + HeatingSchedule=None, + IsCoolingOn=True, + IsHeatingOn=True, + IsMechVentOn=True, + MaxCoolFlow=100, + MaxCoolingCapacity=100, + MaxHeatFlow=100, + MaxHeatingCapacity=100, + MinFreshAirPerArea=0, + MinFreshAirPerPerson=0.00944, + MechVentSchedule=None, + **kwargs) + + Example of ZoneConditioning object: + + .. code-block:: python + + # ZoneConditioning using YearSchedule objects + zone_conditioning = ar.ZoneConditioning( + Name="conditioning_setting_1", + CoolingSchedule=sch_y_on, + HeatingSchedule=sch_y_on, + MechVentSchedule=sch_y_off,) + # List of ZoneConditioning objects (needed for Umi template creation) + ZoneConditionings = [zone_conditioning] + +Defining zone construction sets +------------------------------- + + Creating Umi template objects to define zone construction sets + + Here are all the parameters and their default values for an + ZoneConstructionSet object (see ZoneConstructionSet_ doc for more information) + + .. code-block:: python + + def __init__( + *args, + Zone_Names=None, + Slab=None, + IsSlabAdiabatic=False, + Roof=None, + IsRoofAdiabatic=False, + Partition=None, + IsPartitionAdiabatic=False, + Ground=None, + IsGroundAdiabatic=False, + Facade=None, + IsFacadeAdiabatic=False, + **kwargs) + + Example of ZoneConstructionSet objects: + + .. code-block:: python + + # ZoneConstructionSet using OpaqueConstruction objects + # Perimeter zone + zone_constr_set_perim = ar.ZoneConstructionSet( + Name="constr_set_perim", + Slab=floor, + Roof=roof, + Partition=wall_int, + Ground=floor, + Facade=wall_ext) + # Core zone + zone_constr_set_core = ar.ZoneConstructionSet( + Name="constr_set_core", + Slab=floor, + Roof=roof, + Partition=wall_int, + IsPartitionAdiabatic=True, + Ground=floor, + Facade=wall_ext) + # List of ZoneConstructionSet objects (needed for Umi template creation) + ZoneConstructionSets = [zone_constr_set_perim, zone_constr_set_core] + +Defining zone loads +------------------- + + Creating Umi template objects to define zone loads + + Here are all the parameters and their default values for an + ZoneLoad object (see ZoneLoad_ doc for more information) + + .. code-block:: python + + def __init__( + Name, + DimmingType="Continuous", + EquipmentAvailabilitySchedule=None, + EquipmentPowerDensity=12, + IlluminanceTarget=500, + LightingPowerDensity=12, + LightsAvailabilitySchedule=None, + OccupancySchedule=None, + IsEquipmentOn=True, + IsLightingOn=True, + IsPeopleOn=True, + PeopleDensity=0.2, + **kwargs) + + Example of ZoneLoad object: + + .. code-block:: python + + # ZoneLoad using YearSchedule objects + zone_load = ar.ZoneLoad( + Name="zone_load_1", + EquipmentAvailabilitySchedule=sch_y_gains, + LightsAvailabilitySchedule=sch_y_gains, + OccupancySchedule=sch_y_gains) + # List of ZoneLoad objects (needed for Umi template creation) + ZoneLoads = [zone_load] + +Defining zones +-------------- + + Creating Umi template objects to define zones + + Here are all the parameters and their default values for an + Zone object (see Zone_ doc for more information) + + .. code-block:: python + + def __init__( + Name, + Conditioning=None, + Constructions=None, + DomesticHotWater=None, + Loads=None, + Ventilation=None, + Windows=None, + InternalMassConstruction=None, + InternalMassExposedPerFloorArea=1.05, + DaylightMeshResolution=1, + DaylightWorkplaneHeight=0.8, + **kwargs) + + Example of Zone objects: + + .. code-block:: python + + # Zones using ZoneConditioning, ZoneConstructionSet, DomesticWaterSetting, + # ZoneLoad, VentilationSetting, WindowSetting and OpaqueConstruction objects + # Perimeter zone + perim = ar.Zone( + Name="Perim_zone", + Conditioning=zone_conditioning, + Constructions=zone_constr_set_perim, + DomesticHotWater=dhw_setting, + Loads=zone_load, + Ventilation=vent_setting, + Windows=window_setting, + InternalMassConstruction=wall_int) + # Core zone + core = ar.Zone( + Name="Core_zone", + Conditioning=zone_conditioning, + Constructions=zone_constr_set_core, + DomesticHotWater=dhw_setting, + Loads=zone_load, + Ventilation=vent_setting, + Windows=window_setting, + InternalMassConstruction=wall_int) + # List of Zone objects (needed for Umi template creation) + Zones = [perim, core] + +Defining building template +-------------------------- + + Creating Umi template objects to define building template + + Here are all the parameters and their default values for an + BuildingTemplate object (see BuildingTemplate_ doc for more information) + + .. code-block:: python + + def __init__( + Name, + Core=None, + Perimeter=None, + Structure=None, + Windows=None, + Lifespan=60, + PartitionRatio=0.35, + DefaultWindowToWallRatio=0.4, + **kwargs) + + Example of BuildingTemplate object: + + .. code-block:: python + + # BuildingTemplate using Zone, StructureInformation and WindowSetting objects + building_template = ar.BuildingTemplate( + Name="Building_template_1", + Core=core, + Perimeter=perim, + Structure=struct_definition, + Windows=window_setting,) + # List of BuildingTemplate objects (needed for Umi template creation) + BuildingTemplates = [building_template] + +Creating Umi template +--------------------- + + Creating Umi template from all objects defined before + (see UmiTemplate_ doc for more information) + + Example of BuildingTemplate object: + + .. code-block:: python + + # UmiTemplateLibrary using all lists of objects created before + umi_template = ar.UmiTemplateLibrary( + name="unnamed", + BuildingTemplates=BuildingTemplates, + GasMaterials=GasMaterials, + GlazingMaterials=GlazingMaterials, + OpaqueConstructions=OpaqueConstructions, + OpaqueMaterials=OpaqueMaterials, + WindowConstructions=WindowConstructions, + StructureDefinitions=StructureDefinitions, + DaySchedules=DaySchedules, + WeekSchedules=WeekSchedules, + YearSchedules=YearSchedules, + DomesticHotWaterSettings=DomesticHotWaterSettings, + VentilationSettings=VentilationSettings, + WindowSettings=WindowSettings, + ZoneConditionings=ZoneConditionings, + ZoneConstructionSets=ZoneConstructionSets, + ZoneLoads=ZoneLoads, + Zones=Zones, + ) + + And finally we use this following line of code to create the json file + that can be imported into Umi as a template: + + .. code-block:: python + + umi_template.to_dict() + +.. _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 +.. _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 +.. _DomesticHotWaterSetting: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.DomesticHotWaterSetting.html +.. _VentilationSetting: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.VentilationSetting.html +.. _ZoneConditioning: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.ZoneConditioning.html +.. _ZoneConstructionSet: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.ZoneConstructionSet.html +.. _ZoneLoad: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.ZoneLoad.html +.. _Zone: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.Zone.html +.. _BuildingTemplate: https://archetypal.readthedocs.io/en/develop/reference/archetypal.template.BuildingTemplate.html +.. _UmiTemplate: https://archetypal.readthedocs.io/en/develop/reference/archetypal.umi_template.UmiTemplateLibrary.html \ No newline at end of file diff --git a/docs/examples/doe_conversion.py b/docs/examples/doe_conversion.py new file mode 100644 index 00000000..48076165 --- /dev/null +++ b/docs/examples/doe_conversion.py @@ -0,0 +1,67 @@ +"""Conversion Script tailored to DOE Commercial Reference Buildings.""" + +import os + +from path import Path + +from archetypal.umi_template import UmiTemplateLibrary + +if __name__ == "__main__": + + basepath = Path( + r"C:\Users\samueld\Dropbox (Personal)\MIT\PostDoc\research\umiverse\template library\usa" + ) + zone = "6A" + + os.chdir(basepath / zone) + epw = next( + iter(Path(rf"../refbldgs-v1.3_5.0-weather_files_tmy2").files(f"{zone}*.epw")) + ) + + # Change the template list with names of archetypes to convert + templates = [ + "StripMall", + "Stand-aloneRetail", + "Warehouse", + "MediumOffice", + "MidriseApartment", + "FullServiceRestaurant", + "Supermarket", + "Hospital", + ] + + # Create the list if file paths + idf_files = [] + for name in templates: + idf_files.extend(Path(".").files(f"*{name}*.idf")) + + # Create the Template Library File + umi = UmiTemplateLibrary.from_idf_files( + idf_files, weather=epw, name=f"refbldgs_{zone}", processors=-1 + ) + + # Adjust metadata + for template in umi.BuildingTemplates: + name = next(filter(lambda x: x in template.Name, templates)) # StripMall + # set year + if "Pre1980" in template.Name: + vintage = "Pre1980" + template.YearFrom = 0 + template.YearTo = 1980 + elif "Post1980" in template.Name: + vintage = "Post1980" + template.YearFrom = 1980 + template.YearTo = 2004 + elif "New2004" in template.Name: + vintage = "New2004" + template.YearFrom = 2004 + template.YearTo = 9999 + else: + raise ValueError("Vintage cloud not be defined") + # set CZ & Country + template.ClimateZone = [f"{zone}"] + template.Country = ["USA"] + template.Name = "_".join(map(str, [name, vintage, zone])) + + # Save the template library file + umi.save() diff --git a/docs/examples/parallel_process.py b/docs/examples/parallel_process.py index fb90c95d..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, run_eplus, parallel_process +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) @@ -9,7 +10,7 @@ def main(): # setup directories and input files - necb_basedir = Path("../../tests/input_data/trnsys") + necb_basedir = Path("../../tests/input_data/necb") files = necb_basedir.glob("Ref*.idf") epw = Path("../../tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw") @@ -21,19 +22,18 @@ def main(): eplus_file=str(file), prep_outputs=True, weather_file=str(epw), - expandobjects=True, + expandobjects=False, verbose="v", design_day=True, - output_report="sql_file", ) for k, file in idfs.file.to_dict().items() } - sql_files = parallel_process(rundict, run_eplus, use_kwargs=True, processors=-1) - return sql_files + idfs = parallel_process(rundict, IDF, processors=-1, use_kwargs=True) + return idfs if __name__ == "__main__": config(use_cache=True, log_console=True) - sql_files = main() - print(sql_files) + idfs = main() + print(idfs) diff --git a/docs/index.rst b/docs/index.rst index 864993cb..7c995fa2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -41,11 +41,13 @@ independently. .. toctree:: :maxdepth: 2 :caption: User Guide + :numbered: Converting IDF models Reading and Running IDF files Parallel Processing Managing Schedules + Creating Umi template Reading and Editing UMI Template Files Troubleshooting diff --git a/docs/package_modules.rst b/docs/package_modules.rst index 8333c8ea..258d1641 100644 --- a/docs/package_modules.rst +++ b/docs/package_modules.rst @@ -11,10 +11,22 @@ IDF Class :nosignatures: :toctree: reference/ - load_idf IDF - run_eplus - OutputPrep + Outputs + Meters + Variables + +UMI Template Library +-------------------- + +.. currentmodule:: archetypal.umi_template + +.. autosummary:: + :template: autosummary.rst + :nosignatures: + :toctree: reference/ + + UmiTemplateLibrary .. _templates_label: @@ -37,11 +49,11 @@ Template Classes OpaqueConstruction OpaqueMaterial UmiSchedule - StructureDefinition + StructureInformation VentilationSetting WindowConstruction WindowSetting - Zone + ZoneDefinition ZoneConstructionSet Template Helper Classes @@ -56,23 +68,23 @@ Classes that support the :ref:`templates_label` classes above. :nosignatures: :toctree: reference/ - Unique - UmiBase - MaterialBase - MaterialLayer - ConstructionBase - LayeredConstruction - MassRatio - YearScheduleParts - DaySchedule - WeekSchedule - YearSchedule - WindowType + 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 @@ -120,51 +132,17 @@ Data Portal EnergyDataFrame --------------- -.. currentmodule:: archetypal.energydataframe +.. note:: -.. autosummary:: - :template: autosummary.rst - :nosignatures: - :toctree: reference/ - - EnergyDataFrame.set_unit - EnergyDataFrame.discretize_tsam - plot_energydataframe_map + EnergyDataFrame is now part of its own package `energy-pandas `_. EnergySeries ------------ -.. currentmodule:: archetypal.energyseries - -.. autosummary:: - :template: autosummary.rst - :nosignatures: - :toctree: reference/ +.. note:: - EnergySeries.from_sqlite - EnergySeries.unit_conversion - EnergySeries.concurrent_sort - EnergySeries.normalize - EnergySeries.ldc_source - EnergySeries.source_side - EnergySeries.discretize_tsam - EnergySeries.discretize - 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 @@ -177,11 +155,10 @@ Report Data :nosignatures: :toctree: reference/ + ReportData.__init__ ReportData.from_sql_dict ReportData.from_sqlite - ReportData.heating_load ReportData.filter_report_data - ReportData.sorted_values Tabular Data @@ -197,39 +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 - - -UMI Template ------------- - -.. currentmodule:: archetypal.umi_template - -.. autosummary:: - :template: autosummary.rst - :nosignatures: - :toctree: reference/ - - UmiTemplate - - Utils ----- @@ -242,20 +186,10 @@ Utils :toctree: reference/ config - validate_trnsys_folder 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/docs/reading_idf.rst b/docs/reading_idf.rst index 3a97aeee..fffaeaf7 100644 --- a/docs/reading_idf.rst +++ b/docs/reading_idf.rst @@ -6,78 +6,72 @@ Reading and running IDF files Reading ------- -To read an IDF file, simply call :meth:`~archetypal.idfclass.load_idf` with the path name. For example: +To read an IDF file, simply call :class:`~archetypal.idfclass.idf.IDF` with the path name. For example: .. code-block:: python - >>> from archetypal import get_eplus_dirs, load_idf + >>> from archetypal import get_eplus_dirs, IDF >>> eplus_dir = get_eplus_dirs("9-2-0") # Getting EnergyPlus install path >>> eplus_file = eplus_dir / "ExampleFiles" / "BasicsFiles" / "AdultEducationCenter.idf" # Model path - >>> idf = load_idf(eplus_file) # IDF load + >>> idf = IDF(eplus_file) # IDF load You can optionally pass the weather file path as well: .. code-block:: python >>> weather = eplus_dir / "WeatherData" / "USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw" # Weather file path - >>> idf = load_idf(eplus_file, weather_file=weather) # IDF load + >>> idf = IDF(eplus_file, epw=weather) # IDF load Editing ------- -Editing IDF files is based on the :ref:`eppy` package. The :class:`~archetypal.idfclass.IDF` object returned by -:meth:`~archetypal.idfclass.load_idf` exposes the EnergyPlus objects that make up the IDF file. These objects can be -edited and new objects can be created. See the `eppy documentation `_ for -more information on how to edit IDF files. +Editing IDF files is based on the :ref:`eppy` package. The :class:`~archetypal.idfclass.idf.IDF` object exposes the +EnergyPlus objects that make up the IDF file. These objects can be edited and new objects can be created. See the `eppy +documentation `_ for more information on how to edit IDF files. .. hint:: Pre-sets - EnergyPlus outputs can be quickly defined using the :class:`archetypal.idfclass.OutputPrep` class. This class - and its methods handle adding predefined or custom outputs to an IDF object. For example, the - idf object created above can be modified by adding a basic set of outputs: + EnergyPlus outputs can be quickly defined using the :class:`~archetypal.idfclass.Outputs` class. This class and its + methods handle adding predefined or custom outputs to an IDF model. An :class:`~archetypal.idfclass.Outputs` is + instantiated by default in an :class:`~archetypal.idfclass.idf.IDF` model. It accessed with the + :attr:`~archetypal.idfclass.idf.IDF.outputs` attribute. For example, the idf object created above can be modified by + adding a basic set of outputs: .. code-block:: python - >>> from archetypal import OutputPrep - >>> OutputPrep(idf=idf, save=True).add_basics() + >>> idf.add_basics().apply() - See :class:`~archetypal.idfclass.OutputPrep` for more details on all possible methods. + One can specify custom outputs by calling :meth:`~archetypal.idfclass.Outputs.add_custom()` with a list of dict + of the form fieldname:value and then :meth:`~archetypal.idfclass.Outputs.apply()`. These outputs will be + appended to the IDF model only if :meth:`~archetypal.idfclass.Outputs.apply()` is called. See + :class:`~archetypal.idfclass.Outputs` for more details on all possible methods. Running ------- -Running an EnerguPlus file can be done in two ways. The first way is to call the :meth:`archetypal.idfclass.run_eplus` -function with the path of the IDF file and the path of the weather file. The second method is to call the -:meth:`~archetypal.idfclass.IDF.run_eplus` method on an :class:`~archetypal.idfclass.IDF` object that has been -previously read. In both cases, users can also specify run options as well as output options. For example, instead of -creating an OutputPrep object, one can specify custom outputs in the -:py:attr:`archetypal.idfclass.run_eplus.prep_outputs` attribute. These outputs will be appended to the IDF file before -the simulation is run. See :meth:`~archetypal.idfclass.run_eplus` for other parameters to pass to `run_eplus`. +To run an :class:`~archetypal.idfclass.idf.IDF` model, simply call the :meth:`~archetypal.idfclass.idf.IDF.simulate()` function +on the IDF object. In both cases, users can also specify run options as well as output options. -For the same IDF object above, the following: +For the same IDF object above: .. code-block:: python - >>> idf.run_eplus(weather_file=weather) + >>> idf.simulate(weather_file=weather) -is equivalent to: - -.. code-block:: python - - >>> from archetypal import run_eplus - >>> run_eplus(eplus_file, weather) .. hint:: Caching system. When running EnergyPlus simulations, a caching system can be activated to reduce the number of calls to the - EnergyPlus executable. This can be helpful when `archetypal` is called many times. This caching system will save + EnergyPlus executable or to reduce time spent on I/O operations such as in :attr:`~archetypal.idfclass.idf.IDF.sql` and + :func:`~archetypal.idfclass.idf.IDF.htm()` which parse the simulation results. This caching system will save simulation results in a folder identified by a unique identifier. This identifier is based on the content of the IDF - file, as well as the various :meth:`~archetypal.idfclass.run_eplus` options. If caching is activated, then - subsequent calls to the :meth:`~archetypal.idfclass.run_eplus` method will return the cached results. + file, as well as EnergyPlus simulate options. This system works by invalidating any dependant attributes when + independent attributes change. - The caching system is activated by calling the :meth:`archetypal.utils.config` method, which can also be used to - set a series of package-wide options. ``config`` would typically be put at the top of a python script: + The caching system is activated by calling the :meth:`archetypal.utils.config` method (or by setting + :attr:`settings.use_cache = True`), which can also be used to set a series of package-wide options. ``config`` would + typically be put at the top of a python script: .. code-block:: python diff --git a/docs/tutorials/edit_umitemplate.rst b/docs/tutorials/edit_umitemplate.rst index 3623861e..be57bf99 100644 --- a/docs/tutorials/edit_umitemplate.rst +++ b/docs/tutorials/edit_umitemplate.rst @@ -5,7 +5,8 @@ Editing UMI Template Files .. code-block:: python - archetypal.UmiTemplate.read_file() + >>> from archetypal import UmiTemplateLibrary + >>> template_library = UmiTemplateLibrary.open() -which returns an :class:`~archetypal.umi_template.UmiTemplate` object. +which returns an :class:`~archetypal.umi_template.UmiTemplateLibrary` object. diff --git a/docs/tutorials/parallel_process.rst b/docs/tutorials/parallel_process.rst index 6bbbed1e..aec23497 100644 --- a/docs/tutorials/parallel_process.rst +++ b/docs/tutorials/parallel_process.rst @@ -8,13 +8,13 @@ Running multiple IDF files is easily achieved by using the :meth:`~archetypal.ut The :meth:`~archetypal.utils.parallel_process` method works with any method. You can use it to parallelize other functions in your script. -To create a parallel run, first import the usual pacakge methods and configure `archetypal` to use caching and to +To create a parallel run, first import the usual package methods and configure `archetypal` to use caching and to show logs in the console. .. code-block:: python >>> from path import Path - >>> from archetypal import load_idf, config, run_eplus, settings, parallel_process + >>> from archetypal import IDF, config, settings, parallel_process >>> import pandas as pd >>> config(use_cache=True, log_console=True) @@ -22,7 +22,7 @@ Then, use .. code-block:: python - >>> from archetypal import load_idf, config, run_eplus, settings + >>> from archetypal import IDF, config, settings >>> from archetypal import parallel_process >>> import pandas as pd >>> config(use_cache=True, log_console=True) @@ -48,17 +48,17 @@ The rundict, is the list of tasks we wish to do in parallel. This dictionary is .. code-block:: python >>> rundict = { - k: dict( - eplus_file=str(file), - prep_outputs=True, - weather_file=str(epw), - expandobjects=True, - verbose="v", - design_day=True, - output_report="sql_file", - ) - for k, file in idfs.file.to_dict().items() - } + >>> k: dict( + >>> idfname=str(file), + >>> prep_outputs=True, + >>> weather_file=str(epw), + >>> expandobjects=True, + >>> verbose=True, + >>> design_day=True, + >>> simulate=True, + >>> ) + >>> for k, file in idfs.file.to_dict().items() + >>> } Finally, execute :meth:`~archetypal.utils.parallel_process`. The resulting sql_file paths, which we defined as the type of output_report attribute for :meth:`~archetypal.idfclass.run_eplus` is returned as a dictionary with the same diff --git a/docs/tutorials/schedules.rst b/docs/tutorials/schedules.rst index f7871cd5..9d649c80 100644 --- a/docs/tutorials/schedules.rst +++ b/docs/tutorials/schedules.rst @@ -12,7 +12,7 @@ Reading Schedules .. code-block:: python >>> import archetypal as ar - >>> idf = ar.load_idf() + >>> idf = ar.IDF() >>> this_schedule = Schedule(Name='name', idf=idf) diff --git a/environment.yml b/environment.yml index 9c916a9a..1e8f8cc1 100644 --- a/environment.yml +++ b/environment.yml @@ -1,9 +1,8 @@ name: archetypal channels: - - defaults - conda-forge dependencies: - - shapely + - geopandas - networkx - six - matplotlib>=2.1 @@ -11,7 +10,7 @@ dependencies: - pycountry - scikit-learn - scipy - - pandas>=0.24 + - pandas==1.2.0 - numpy>=1.17 - tqdm - tabulate @@ -23,5 +22,9 @@ dependencies: - pip - pip: - tsam - - eppy - - geomeppy \ No newline at end of file + - git+https://github.com/samuelduchesne/eppy.git@feature/defaults#egg=eppy + - geomeppy + - deprecation + - sigfig + - validator_collection + - -r file:requirements-dev.txt \ No newline at end of file diff --git a/install_energyplus.sh b/install_energyplus.sh index 8b36e1a8..59f27109 100644 --- a/install_energyplus.sh +++ b/install_energyplus.sh @@ -1,50 +1,55 @@ +#!/bin/bash +function version_gt() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1"; } # Check if EnergyPlus env variables exist already. If not use these defaults if [[ -z "${ENERGYPLUS_VERSION}" ]]; then - ENERGYPLUS_VERSION=9.2.0 + export ENERGYPLUS_VERSION=9.2.0 fi if [[ -z "${ENERGYPLUS_SHA}" ]]; then - ENERGYPLUS_SHA=921312fa1d + export ENERGYPLUS_SHA=921312fa1d fi if [[ -z "${ENERGYPLUS_INSTALL_VERSION}" ]]; then - ENERGYPLUS_INSTALL_VERSION=9-2-0 + export ENERGYPLUS_INSTALL_VERSION=9-2-0 fi -if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then - EXT=dmg - PLATFORM=Darwin -fi -if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - EXT="sh" - PLATFORM=Linux -fi -if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then - EXT=zip - PLATFORM=Windows + +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + if version_gt $ENERGYPLUS_VERSION 9.3.0; then + export EXT="sh" + export PLATFORM=Linux-Ubuntu18.04 + else + export EXT="sh" + export PLATFORM=Linux + fi + export ATTCHBASE=97 + export ATTCHNUM=8230 +elif [[ "$OSTYPE" == "darwin"* ]]; then + if version_gt $ENERGYPLUS_VERSION 9.3.0; then + export EXT=dmg + export PLATFORM=Darwin-macOS10.15 + else + export EXT=dmg + export PLATFORM=Darwin + fi + export ATTCHBASE=98 + export ATTCHNUM=8232 +elif [[ "$OSTYPE" == "win"* || "$OSTYPE" == "msys"* ]]; then + export EXT=zip + export PLATFORM=Windows + export ATTCHBASE=86 + export ATTCHNUM=8231 fi # Download EnergyPlus executable ENERGYPLUS_DOWNLOAD_BASE_URL=https://github.com/NREL/EnergyPlus/releases/download/v$ENERGYPLUS_VERSION ENERGYPLUS_DOWNLOAD_FILENAME=EnergyPlus-$ENERGYPLUS_VERSION-$ENERGYPLUS_SHA-$PLATFORM-x86_64 ENERGYPLUS_DOWNLOAD_URL=$ENERGYPLUS_DOWNLOAD_BASE_URL/$ENERGYPLUS_DOWNLOAD_FILENAME.$EXT echo "$ENERGYPLUS_DOWNLOAD_URL" -curl -SL -C - "$ENERGYPLUS_DOWNLOAD_URL" -o "$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT +curl --fail -SL -C - "$ENERGYPLUS_DOWNLOAD_URL" -o "$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT # Extra downloads -if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then - ATTCHBASE=97 - ATTCHNUM=8230 -fi -if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then - ATTCHBASE=98 - ATTCHNUM=8232 -fi -if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then - ATTCHBASE=86 - ATTCHNUM=8231 -fi EXTRAS_DOWNLOAD_URL=http://energyplus.helpserve.com/Knowledgebase/Article/GetAttachment/$ATTCHBASE/$ATTCHNUM -curl -SL -C - $EXTRAS_DOWNLOAD_URL -o $ATTCHNUM.zip +curl --fail -SL -C - $EXTRAS_DOWNLOAD_URL -o $ATTCHNUM.zip # Install EnergyPlus and Extra Downloads -if [ "$TRAVIS_OS_NAME" == "linux" ]; then +if [[ "$OSTYPE" == "linux-gnu"* ]]; then sudo chmod +x "$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT printf "y\r" | sudo ./"$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT sudo tar zxvf $ATTCHNUM.zip -C /usr/local/EnergyPlus-"$ENERGYPLUS_INSTALL_VERSION"/PreProcess/IDFVersionUpdater @@ -53,8 +58,7 @@ if [ "$TRAVIS_OS_NAME" == "linux" ]; then # cleanup sudo rm "$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT sudo rm $ATTCHNUM.zip -fi -if [ "$TRAVIS_OS_NAME" == "osx" ]; then +elif [[ "$OSTYPE" == "darwin"* ]]; then # getting custom install script https://github.com/NREL/EnergyPlus/pull/7615 curl -SL -C - https://raw.githubusercontent.com/jmarrec/EnergyPlus/40afb275f66201db5305f54df6c070d0b0cb4fc3/cmake/qtifw/install_script.qs -o install_script.qs sudo hdiutil attach "$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT @@ -66,8 +70,7 @@ if [ "$TRAVIS_OS_NAME" == "osx" ]; then sudo rm install_script.qs sudo rm "$ENERGYPLUS_DOWNLOAD_FILENAME".$EXT sudo rm $ATTCHNUM.zip -fi -if [ "$TRAVIS_OS_NAME" == "windows" ]; then +elif [[ "$OSTYPE" == "win"* || "$OSTYPE" == "msys"* ]]; then # On windows, we are simply extracting the zip file to c:\\ echo "Extracting and Copying files to... C:\\" powershell Expand-Archive -Path $ENERGYPLUS_DOWNLOAD_FILENAME.$EXT -DestinationPath C:\\ @@ -83,7 +86,7 @@ if [ "$TRAVIS_OS_NAME" == "windows" ]; then if [ -f "$IDD" ]; then echo "$IDD" exists else - echo "$IDD" does not exist; - travis_terminate 1; + echo "$IDD" does not exist + travis_terminate 1 fi fi diff --git a/requirements-dev.txt b/requirements-dev.txt index cbcf5ab9..63050202 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,10 +1,6 @@ -coverage -coveralls pytest pytest-cov -scikit-learn -scipy sphinx sphinx_rtd_theme recommonmark -sphinx-click +sphinx-click \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index da6929b2..9585c13e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,20 +1,23 @@ -networkx -shapely -geomeppy -matplotlib>=2.1 -six -eppy -requests>=2.18 -pycountry -scikit-learn -scipy -pandas>=0.24 -pyomo +networkx~=2.5.1 +geomeppy==0.11.8 +eppy==0.5.56 # for stability +matplotlib~=3.4 # because of TwoSlopesNorm +pycountry~=20.7.3 +scikit-learn~=0.24.2 +pandas>=1.2.0 numpy>=1.17 -tqdm -tabulate -path -tsam -pint -click -outdated +tqdm~=4.60.0 +tabulate~=0.8.9 +path~=15.1.2 +click~=8.0.1 +outdated~=0.2.1 +deprecation~=2.1.0 +sigfig~=1.1.8 +requests~=2.25.1 +packaging~=20.9 +pytest~=6.2.4 +setuptools~=56.2.0 +sklearn~=0.0 +CoolProp~=6.4.1 +energy-pandas~=0.2.4 +validator_collection~=1.5.0 diff --git a/setup.cfg b/setup.cfg index 224a7795..804bc041 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,2 +1,16 @@ [metadata] -description-file = README.md \ No newline at end of file +description-file = README.md + +[isort] +profile = black +multi_line_output = 3 +skip = __init__.py + +[flake8] +# Recommend matching the black line length (default 88), +# rather than using the flake8 default of 79: +max-line-length = 88 +extend-ignore = + # See https://github.com/PyCQA/pycodestyle/issues/373 + E203, + E501, # line too long (> 88 characters) \ No newline at end of file diff --git a/setup.py b/setup.py index e19455d9..e1543f69 100644 --- a/setup.py +++ b/setup.py @@ -1,21 +1,21 @@ # 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 +from setuptools import find_namespace_packages, setup here = os.getcwd() # 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) @@ -48,15 +48,11 @@ def find_version(*file_paths): setup( name="archetypal", - version=find_version("archetypal", "__init__.py"), - packages=["archetypal"], - package_data={ - "archetypal": [ - "archetypal/ressources/originBUISketchUp.idf", - "archetypal/ressources/W74-lib.dat", - "archetypal/ressources/NewFileTemplate.d18", - ] - }, + use_scm_version=True, + setup_requires=["setuptools_scm"], + packages=find_namespace_packages( + include=["archetypal", "archetypal.*"], exclude=["tests"] + ), include_package_data=True, url="https://github.com/samuelduchesne/archetypal", license="MIT License", @@ -65,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", @@ -73,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", + ], ) diff --git a/tests/conftest.py b/tests/conftest.py index 1a51f025..40c5e72e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,17 +1,14 @@ import glob -import os -import shutil import sys import pytest -import archetypal as ar - - # Parametrization of the fixture scratch_then_cache. The following array # tells pytest to use True than False for all tests that use this fixture. # This is very usefull to test the behavior of methods that use cached data # or not. +from archetypal import settings, utils + do = [True, False] @@ -21,20 +18,17 @@ def scratch_then_cache(request): start fresh with tests""" # request is a special parameter known to pytest. It passes whatever is in # params=do. Ids are there to give the test a human readable name. - dirs = [ar.settings.data_folder, ar.settings.cache_folder, ar.settings.imgs_folder] if request.param: + dirs = [ + settings.data_folder, + settings.cache_folder, + settings.imgs_folder, + ] for dir in dirs: - if os.path.exists(dir): - try: - shutil.rmtree(dir) - finally: - assert not os.path.exists(dir) - - -samples_ = ["regular", "umi_samples"] # ['problematic', 'regular', + dir.rmtree_p() -# 'umi_samples'] +samples_ = ["regular", "umi_samples"] # ['problematic', 'regular', 'umi_samples'] @pytest.fixture(params=samples_, ids=samples_, scope="session") @@ -44,15 +38,16 @@ def idf_source(request): @pytest.fixture(scope="session") def config(): - ar.config( + utils.config( data_folder="tests/.temp/data", logs_folder="tests/.temp/logs", - imgs_folder="tests/.temp/imgs", + imgs_folder="tests/.temp/images", cache_folder="tests/.temp/cache", use_cache=True, - log_file=True, + log_file=False, log_console=True, umitemplate="tests/input_data/umi_samples/BostonTemplateLibrary_2.json", + debug=True, ) @@ -60,13 +55,9 @@ def config(): def clean_config(config): """calls config fixture and clears default folders""" - dirs = [ar.settings.data_folder, ar.settings.cache_folder, ar.settings.imgs_folder] + dirs = [settings.data_folder, settings.cache_folder, settings.imgs_folder] for dir in dirs: - if os.path.exists(dir): - try: - shutil.rmtree(dir) - finally: - assert not os.path.exists(dir) + dir.rmtree_p() # List fixtures that are located outiside of conftest.py so that they can be 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/input_data/problematic/SF+CZ5A+USA_IL_Chicago-OHare.Intl.AP.725300+oilfurnace+slab+IECC_2012.idf b/tests/input_data/problematic/SF+CZ5A+USA_IL_Chicago-OHare.Intl.AP.725300+oilfurnace+slab+IECC_2012.idf new file mode 100644 index 00000000..5ba85d92 --- /dev/null +++ b/tests/input_data/problematic/SF+CZ5A+USA_IL_Chicago-OHare.Intl.AP.725300+oilfurnace+slab+IECC_2012.idf @@ -0,0 +1,5216 @@ + +!$Id: eplus.res.template,v 1.15 2019/02/07 17:10:57 d3a061 Exp d3a061 $ +!$Log: eplus.res.template,v $ +!Revision 1.15 2019/02/07 17:10:57 d3a061 +!Added defaults for duct R-values. Added a code default (taken from +!consolidated.materials.template) and a moisture_regime default (from +!the same place). +! +!Revision 1.14 2019/01/28 18:07:01 d3a061 +!Added default settings for wwr. Fixed problem that was using the +!'system' parm where it should have used 'hvac_type'; also added +!missing setting of hvac_type to 'heatpump' where appropriate. +!Fixed bug in how r_crawlwall and r_bsmtwall were being defaulted. +!Beefed up screening of tropical_designation as applied to singe-family +!homes (was accidentally including singlewide manufactured homes in +!the check). +! +!Revision 1.13 2018/12/13 20:26:25 d3a061 +!Added the $TEMPLATE_PATH variable to simplify the process() calls. +! +!Revision 1.12 2018/12/13 20:09:00 d3a061 +!Fairly extensive cleanup and refactoring to make make the template work with +!the "canonical" index variables and other such things, including making +!cfm25 a valid input that is coordinated with leakage_ratio. +! +!Revision 1.11 2018/10/15 17:40:35 d3a061 +!Changed hard-coded shower_gpm, sink_gpm, and bath_gpm variables to changeable +!parameters with defaults. +! +!Revision 1.10 2018/09/17 17:36:16 d3a061 +!Fixed big that was setting $humidity_designation and/or $tropical_designation to +!undef instead of ''. Added the $ach25 parameter as a better alternative to the +!$leakage_ratio that had been used in the past (the latter, if given, still has +!precedence over the former). Added calls to generate a globals_report. And af +!few cleanups of code. +! +!Revision 1.9 2018/09/11 15:38:48 d3a061 +!Added kludges to allow more consistent parm column names for climate zones, moisture +!regimes, and humidity/tropical designations. Put in a check to bomb if the user +!specifies any specific LED components to the lighting (needs to be enhanced to properly +!accommodate LEDs, but...later). Fixed default value of $ua. +! +!Revision 1.8 2018/05/21 17:13:05 d3a061 +!Added/clarified comments on the $max_supply calcs. +! +!Revision 1.7 2018/05/17 21:37:17 d3a061 +!Fixed a bunch of typos that were introduced when the setdef() calls were +!inserted in place of ||=. Also added in 2018 IECC default lighting fractions +!that had been inadvertently omitted before. +! +!Revision 1.6 2018/05/08 15:53:18 d3a061 +!Replaced all uses of ||= with setdef() or val_or(). Added in re-wired (haha) +!lighting procedure. A few other fix-ups, comments, indents, etc., that were +!left out when the original 8.6 template was created. (Sigh.) +! +!Revision 1.5 2018/02/08 20:23:25 d3a061 +!Updated DHW energy factors for new Federal standards that are current as +!of 2018. +! +!Revision 1.4 2018/02/07 16:22:53 d3a061 +!Reworked DHW savings for 2015 and 2018 IECCs. +! +!Revision 1.3 2017/04/27 21:41:17 mend509 +!Added the additional lighting load for the unconditioned floor area of the semi-conditioned prototype +! +!Revision 1.2 2017/04/24 15:45:58 d3a061 +!Dropped all the Windows line ending characters (ugh--it marks every line +!as updated in the diffs), and changed to the "English" version of $WARNING +!to eliminate the Perl warnings about the deprecated control-W version of +!that variable. +! +!Revision 1.1 2017/04/12 22:43:34 mend509 +!Initial revision +! +!Revision 1.6 2015/06/27 00:14:44 mend509 +!Revised insulation quality calculation +! +!Revision 1.5 2015/05/21 16:51:15 mend509 +!Archive after determination analysis +! +!Revision 1.4 2014/06/27 16:27:02 mend509 +!Check in before DHW changes +! +!Revision 1.2 2014/05/19 23:06:43 mend509 +!Two main revisions: +!1: Re-wired ground temperature sections to read from previously generated gtp files if available +!2: Copied over 2012 IECC into 2015 IECC variables where applicable +! +!Revision 1.1 2014/05/16 23:22:50 mend509 +!Initial revision +! +!Revision 1.2 2013/03/29 17:30:21 mend509 +!Archived after generating first set of masonry input files +! +!Revision 1.1 2013/03/24 05:30:59 mend509 +!Initial revision +! +! --------------------------------------------------------------------------------------------------------- +! The Residential Prototype Building Models were developed by Pacific Northwest National Laboratory (PNNL), +! under contract with the U.S. Department of Energy (DOE). +! The purpose of developing these building prototype models is to measure energy saving impacts from +! various residential energy codes. Detailed model development descriptions are documented in +! PNNL report titled "Cost-Effectiveness Analysis of the 2009 and 2012 IECC Residential Provisions +! - Technical Support Document". +! --------------------------------------------------------------------------------------------------------- + +! GPARM parameters as run: +! ID = SF+CZ5AWH+USA_IL_Chicago-OHare.Intl.AP.725300+oilfurnace+slab+IECC_2012 +! weatherfile = USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw +! climate_zone = Climate Zone 5 +! moisture_regime = Moist +! humidity_designation = Not Warm-Humid +! tropical_designation = Not Tropical +! bldg_type = Single-Family +! fndn_type = Slab +! system_tag = Oil Furnace +! code = IECC_2012 +! permits = 801.989159 +! cfm25 = 4 +! dhw_type = + + + + + + +Version, + 8.6; !- Version Identifier + +!- =========== ALL OBJECTS IN CLASS: GLOBALGEOMETRYRULES =========== + +GlobalGeometryRules, + LowerLeftCorner, !- Starting Vertex Position + Counterclockwise, !- Vertex Entry Direction + Relative; !- Coordinate System + + + + + +!- Geometry from the scalable geometry template +!$Id: scalable.geometry.template,v 1.3 2018/11/20 17:57:10 d3a061 Exp d3a061 $ +!$Log: scalable.geometry.template,v $ +!Revision 1.3 2018/11/20 17:57:10 d3a061 +!Ran dos2unix on it. +! +!Revision 1.2 2018/10/16 21:09:50 d3l143 +!VM made changes to commented-out code line, we don't know why. +! +!Revision 1.4 2015/05/21 16:52:28 mend509 +!Archive after determination analysis +! +!Revision 1.3 2014/09/08 17:51:39 mend509 +!Version saved after correct foundation gtp references +! +!Revision 1.2 2014/05/19 23:08:33 mend509 +!Re-worked below-grade sections to match the "read-from-gtp-file" option added in the main tmpl +! +!Revision 1.1 2014/05/16 23:26:12 mend509 +!Initial revision +! +!Revision 1.2 2012/10/24 22:37:53 mend509 +!*** empty log message *** +! +!Revision 1.1 2012/08/21 16:51:40 mend509 +!Initial revision + + + + BuildingSurface:Detailed, + Inter zone floor 1, !- Name + Floor, !- Surface Type + Interior Floor, !- Construction Name + living_unit1, !- Zone Name + Adiabatic, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0,0,2.59246341463415,0,9.09981820971244,2.59246341463415,12.1330909462833,9.09981820971244,2.59246341463415,12.1330909462833,0,2.59246341463415; + + + BuildingSurface:Detailed, + ceiling_unit1, !- Name + Ceiling, !- Surface Type + Interior Ceiling, !- Construction Name + living_unit1, !- Zone Name + Zone, !- Outside Boundary Condition + attic_unit1, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0,0,5.18392682926829,12.1330909462833,0,5.18392682926829,12.1330909462833,9.09981820971244,5.18392682926829,0,9.09981820971244,5.18392682926829; + + +!- =========== ALL OBJECTS IN CLASS: ZONE =========== + + Zone, + living_unit1, !- Name + 0.0, !- Direction of Relative North {deg} + 0.0, !- X Origin {m} + 0.0, !- Y Origin {m} + 0.0, !- Z Origin {m} + , !- Type + 1; !- Multiplier + + Zone, + attic_unit1, !- Name + 0.0, !- Direction of Relative North {deg} + 0.0, !- X Origin {m} + 0.0, !- Y Origin {m} + 0.0, !- Z Origin {m} + , !- Type + 1; !- Multiplier + + + + InternalMass, + Internalmass_unit1, !- Name + InteriorFurnishings, !- Construction Name + living_unit1, !- Zone Name + 9.89591078066915; !- Surface Area {m2} + + BuildingSurface:Detailed, + Roof_front_unit1, !- Name + Roof, !- Surface Type + Exterior Roof, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0,0,5.18392682926829,12.1330909462833,0,5.18392682926829,12.1330909462833,4.54990910485622,6.6995631975537,0,4.54990910485622,6.6995631975537; + + BuildingSurface:Detailed, + Roof_back_unit1, !- Name + Roof, !- Surface Type + Exterior Roof, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833,9.09981820971244,5.18392682926829,0,9.09981820971244,5.18392682926829,0,4.54990910485622,6.6995631975537,12.1330909462833,4.54990910485622,6.6995631975537; + + BuildingSurface:Detailed, + Roof_right_unit1, !- Name + Wall, !- Surface Type + Gable_end, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 3, !- Number of Vertices + 12.1330909462833,0,5.18392682926829,12.1330909462833,9.09981820971244,5.18392682926829,12.1330909462833,4.54990910485622,6.6995631975537; + + BuildingSurface:Detailed, + Roof_left_unit1, !- Name + Wall, !- Surface Type + Gable_end, !- Construction Name + attic_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 3, !- Number of Vertices + 0,9.09981820971244,5.18392682926829,0,0,5.18392682926829,0,4.54990910485622,6.6995631975537; + + +BuildingSurface:Detailed, + Wall_ldf_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0,0,0.001,12.1330909462833,0,0.001,12.1330909462833,0,2.59246341463415,0,0,2.59246341463415; + +BuildingSurface:Detailed, + Wall_sdr_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833,0,0.001,12.1330909462833,9.09981820971244,0.001,12.1330909462833,9.09981820971244,2.59246341463415,12.1330909462833,0,2.59246341463415; + +BuildingSurface:Detailed, + Wall_ldb_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833,9.09981820971244,0.001,0,9.09981820971244,0.001,0,9.09981820971244,2.59246341463415,12.1330909462833,9.09981820971244,2.59246341463415; + +BuildingSurface:Detailed, + Wall_sdl_1.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0,9.09981820971244,0.001,0,0,0.001,0,0,2.59246341463415,0,9.09981820971244,2.59246341463415; + +Window, + Window_ldf_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldf_1.unit1, !- Building Surface Name + Shades, !- Shading Control Name + , !- Frame and divider Name + 1, !- Multiplier + 1, !- Starting X coordinate + 0.914634146341463, !- Starting Z coordinate + 2.70719591738945, !- Length + 1.52439024390244; !- Height + +Window, + Window_ldb_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldb_1.unit1, !- Building Surface Name + Shades, !- Shading Control Name + , !- Frame and divider Name + 1, !- Multiplier + 2.74190122145512, !- Starting X coordinate + 0.914634146341463, !- Starting Z coordinate + 2.70719591738945, !- Length + 1.52439024390244; !- Height + +Window, + Window_sdr_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdr_1.unit1, !- Building Surface Name + Shades, !- Shading Control Name + , !- Frame and divider Name + 1, !- Multiplier + 1, !- Starting X coordinate + 0.914634146341463, !- Starting Z coordinate + 2.70719591738945, !- Length + 1.52439024390244; !- Height + +Shading:Overhang, + Overhang_sdr_1.unit1, !- Name + Window_sdr_1.unit1, !- Window or door name + 0, !- Height from window/door + 90, !- Tilt angle from window/door + 0, !- Left extension from window/door width + 0, !- Right extension from window/door width + 0.0152439024390244; !- Depth + +Window, + Window_sdl_1.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdl_1.unit1, !- Building Surface Name + Shades, !- Shading Control Name + , !- Frame and divider Name + 1, !- Multiplier + 1, !- Starting X coordinate + 0.914634146341463, !- Starting Z coordinate + 2.70719591738945, !- Length + 1.52439024390244; !- Height + + +BuildingSurface:Detailed, + Wall_ldf_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0,0,2.59246341463415,12.1330909462833,0,2.59246341463415,12.1330909462833,0,5.18392682926829,0,0,5.18392682926829; + +BuildingSurface:Detailed, + Wall_sdr_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833,0,2.59246341463415,12.1330909462833,9.09981820971244,2.59246341463415,12.1330909462833,9.09981820971244,5.18392682926829,12.1330909462833,0,5.18392682926829; + +BuildingSurface:Detailed, + Wall_ldb_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 12.1330909462833,9.09981820971244,2.59246341463415,0,9.09981820971244,2.59246341463415,0,9.09981820971244,5.18392682926829,12.1330909462833,9.09981820971244,5.18392682926829; + +BuildingSurface:Detailed, + Wall_sdl_2.unit1, !- Name + Wall, !- Surface Type + Exterior Wall, !- Construction Name + living_unit1, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + , !- View Factor to Ground + 4, !- Number of Vertices + 0,9.09981820971244,2.59246341463415,0,0,2.59246341463415,0,0,5.18392682926829,0,9.09981820971244,5.18392682926829; + +Window, + Window_ldf_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldf_2.unit1, !- Building Surface Name + Shades, !- Shading Control Name + , !- Frame and divider Name + 1, !- Multiplier + 1, !- Starting X coordinate + 0.914634146341463, !- Starting Z coordinate + 2.70719591738945, !- Length + 1.52439024390244; !- Height + +Window, + Window_ldb_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_ldb_2.unit1, !- Building Surface Name + Shades, !- Shading Control Name + , !- Frame and divider Name + 1, !- Multiplier + 2.74190122145512, !- Starting X coordinate + 0.914634146341463, !- Starting Z coordinate + 2.70719591738945, !- Length + 1.52439024390244; !- Height + +Window, + Window_sdr_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdr_2.unit1, !- Building Surface Name + Shades, !- Shading Control Name + , !- Frame and divider Name + 1, !- Multiplier + 1, !- Starting X coordinate + 0.914634146341463, !- Starting Z coordinate + 2.70719591738945, !- Length + 1.52439024390244; !- Height + +Shading:Overhang, + Overhang_sdr_2.unit1, !- Name + Window_sdr_2.unit1, !- Window or door name + 0, !- Height from window/door + 90, !- Tilt angle from window/door + 0, !- Left extension from window/door width + 0, !- Right extension from window/door width + 0.0152439024390244; !- Depth + +Window, + Window_sdl_2.unit1, !- Name + Exterior Window, !- Construction Name + Wall_sdl_2.unit1, !- Building Surface Name + Shades, !- Shading Control Name + , !- Frame and divider Name + 1, !- Multiplier + 1, !- Starting X coordinate + 0.914634146341463, !- Starting Z coordinate + 2.70719591738945, !- Length + 1.52439024390244; !- Height + + +BuildingSurface:Detailed, + Floor_unit1, !- Name + Floor, !- Surface Type + Interior Floor, !- Construction Name + living_unit1, !- Zone Name + GroundSlabPreprocessorAverage, !- Outside Boundary Condition + surfPropOthSdCoefSlabAverage, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.0, !- View Factor to Ground + 4, !- Number of Vertices + 0,0,0.001,0,9.09981820971244,0.001,12.1330909462833,9.09981820971244,0.001,12.1330909462833,0,0.001; + + +Door, + Door_ldb_unit1, !- Name + Exterior Door, !- Construction Name + Wall_ldb_1.unit1, !- Building Surface Name + 1, !- Multiplier + 0.5, !- Starting X coordinate + 0, !- Starting Z coordinate + 1.74190122145513, !- Length + 2.13414634146341; !- Height + + + + +!- Consolidated wall and floor materials from consolidated.materials.template.. + +!$Id: consolidated.materials.template,v 1.5 2019/02/07 17:04:56 d3a061 Exp d3a061 $ +!$Log: consolidated.materials.template,v $ +!Revision 1.5 2019/02/07 17:04:56 d3a061 +!Eliminated default setting for 'code'. Commented out the semi-cond specs. +! +!Revision 1.4 2018/05/17 21:42:40 d3a061 +!Ran dos2unix on it. +! +!Revision 1.3 2017/04/12 22:42:05 mend509 +!Added the 2018 IECC hash +! +!Revision 1.2 2017/04/12 21:49:58 d3a061 +!Changes to avoid deprecated Perlisms. +! +!Revision 1.1 2017/03/07 22:15:07 d3a061 +!Initial revision +! +!Revision 1.8 2015/06/27 00:15:04 mend509 +!Revised insulation quality calculation +! +!Revision 1.7 2015/06/04 03:10:16 d3l143 +!*** empty log message *** +! +!Revision 1.6 2015/06/01 22:09:59 d3l143 +!added wall insulation degrdation factor for FOA. +! +!Revision 1.5 2015/05/21 16:52:14 mend509 +!Archive after determination analysis +! + +!Revision 1.4 2015/03/30 22:41:58 mend509 +!Wall framing fraction fix didn't work; trying again +! +!Revision 1.3 2015/03/30 22:40:17 mend509 +!$framing_fraction for walls defaults to 16 in OC but can take value though the parm file now +! +!Revision 1.2 2014/05/19 23:06:16 mend509 +!Copied 2012 IECC envelope requirements into a 2015 hash +! +!Revision 1.1 2014/05/16 23:25:45 mend509 +!Initial revision +! +!Revision 1.2 2013/03/29 17:30:59 mend509 +!Archived after generating first set of masonry input files +! +!Revision 1.1 2013/03/24 05:34:54 mend509 +!Initial revision +! + + + + + + + + +!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== + +SimulationControl, + Yes, !- Do Zone Sizing Calculation + Yes, !- Do System Sizing Calculation + No, !- Do Plant Sizing Calculation + Yes, !- Run Simulation for Sizing Periods + Yes; !- Run Simulation for Weather File Run Periods + +!- =========== ALL OBJECTS IN CLASS: BUILDING =========== + +Building, + SF+CZ5AWH+USA_IL_Chicago-OHare.Intl.AP.725300+oilfurnace+slab+IECC_2012, !- Name + 0, !- North Axis {deg} + Suburbs, !- Terrain + 0.04, !- Loads Convergence Tolerance Value + 0.4, !- Temperature Convergence Tolerance Value {deltaC} + FullExterior, !- Solar Distribution + 25, !- Maximum Number of Warmup Days + 6; !- Minimum Number of Warmup Days + +!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:INSIDE =========== + +SurfaceConvectionAlgorithm:Inside, + TARP; !- Algorithm + +!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== + +Timestep, + 4; !- Number of Timesteps per Hour + +!- =========== ALL OBJECTS IN CLASS: SITE:LOCATION =========== + +! Weather_file = USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw; +! Using the stat2idf and the ddy2idf script... +! Water mains temperature correlation object created by: + + +! Water mains temperature object created by: +! /projects/bigsim/resstd/vm/bin/stat2idf /projects/bigsim/weather/EnergyPlus/tmy3.new/all/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.stat +! +Site:WaterMainsTemperature, +Correlation, !- Calculation method +, !- Temperature schedule name +9.925, !- Annual average outdoor air temperature {C} +28.7; !- Maximum difference in monthly average outdoor air temperatures {C} + + +! Location and design-day objects created by: +! Site:Location and design-day objects created by: +! /projects/bigsim/bin/ddy2idf /projects/bigsim/weather/EnergyPlus/tmy3.new/all/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.ddy +! +Site:Location, + Chicago Ohare Intl Ap_IL_USA Design_Conditions, !- Site:Location Name + 41.98, !- Latitude {N+ S-} + -87.92, !- Longitude {W- E+} + -6.00, !- Time Zone Relative to GMT {GMT+/-} + 201.00; !- Elevation {m} + +SizingPeriod:DesignDay, + Chicago Ohare Intl Ap Ann Htg 99.6% Condns DB, !- Name + 1, !- Month + 21, !- Day of Month + WinterDesignDay,!- Day Type + -20, !- Maximum Dry-Bulb Temperature {C} + 0.0, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Schedule Name + Wetbulb, !- Humidity Condition Type + -20, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily WetBulb Temperature Range {deltaC} + 98934., !- Barometric Pressure {Pa} + 4.9, !- Wind Speed {m/s} design conditions vs. traditional 6.71 m/s (15 mph) + 270, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAEClearSky, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + 0.00; !- Clearness {0.0 to 1.1} + +SizingPeriod:DesignDay, + Chicago Ohare Intl Ap Ann Clg .4% Condns DB=>MWB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay,!- Day Type + 33.3, !- Maximum Dry-Bulb Temperature {C} + 10.5, !- Daily Dry-Bulb Temperature Range {C} + DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Schedule Name + Wetbulb, !- Humidity Condition Type + 23.7, !- Wetbulb at Maximum Dry-Bulb {C} + , !- Humidity Indicating Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily WetBulb Temperature Range {deltaC} + 98934., !- Barometric Pressure {Pa} + 5.2, !- Wind Speed {m/s} design conditions vs. traditional 3.35 m/s (7mph) + 230, !- Wind Direction {Degrees; N=0, S=180} + No, !- Rain {Yes/No} + No, !- Snow on ground {Yes/No} + No, !- Daylight Savings Time Indicator + ASHRAETau, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + 0.455, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) + 2.050; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) + + +!- =========== ALL OBJECTS IN CLASS: RUNPERIOD =========== + +RunPeriod, + annual, !- Name + 1, !- Begin Month + 1, !- Begin Day of Month + 12, !- End Month + 31, !- End Day of Month + UseWeatherFile, !- Day of Week for Start Day + Yes, !- Use Weather File Holidays and Special Days + Yes, !- Use Weather File Daylight Saving Period + No, !- Apply Weekend Holiday Rule + Yes, !- Use Weather File Rain Indicators + Yes, !- Use Weather File Snow Indicators + 1; !- Number of Times Runperiod to be Repeated + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULETYPELIMITS =========== + +ScheduleTypeLimits, + any number; !- Name + +ScheduleTypeLimits, + On/Off, !- Name + 0, !- Lower Limit Value + 1, !- Upper Limit Value + Discrete; !- Numeric Type + +ScheduleTypeLimits, + control_type, !- Name + 0, !- Lower Limit Value + 4, !- Upper Limit Value + Discrete; !- Numeric Type + +ScheduleTypeLimits, + fraction, !- Name + 0, !- Lower Limit Value + 1, !- Upper Limit Value + Continuous; !- Numeric Type + +ScheduleTypeLimits, + Temperature, !- Name + -60, !- Lower Limit Value + 200, !- Upper Limit Value + Continuous; !- Numeric Type + + +Schedule:Compact, + BA_shower_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 1:00,0.00205406666666667, + Until: 2:00,0.000933666666666667, + Until: 3:00,0.0005602, + Until: 4:00,0.000933666666666667, + Until: 5:00,0.00261426666666667, + Until: 6:00,0.00971013333333333, + Until: 7:00,0.0220345333333333, + Until: 8:00,0.0218478, + Until: 9:00,0.0177396666666667, + Until: 10:00,0.0138182666666667, + Until: 11:00,0.011204, + Until: 12:00,0.00877646666666667, + Until: 13:00,0.00634893333333333, + Until: 14:00,0.00541526666666667, + Until: 15:00,0.00485506666666667, + Until: 16:00,0.00466833333333333, + Until: 17:00,0.005602, + Until: 18:00,0.0072826, + Until: 19:00,0.0078428, + Until: 20:00,0.0078428, + Until: 21:00,0.0078428, + Until: 22:00,0.00765606666666667, + Until: 23:00,0.00541526666666667, + Until: 24:00,0.0039214; + + +Schedule:Compact, + BA_bath_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 1:00,0.000191181818181818, + Until: 2:00,9.55909090909091e-05, + Until: 3:00,9.55909090909091e-05, + Until: 4:00,9.55909090909091e-05, + Until: 5:00,0.000191181818181818, + Until: 6:00,0.000454056818181818, + Until: 7:00,0.00109929545454545, + Until: 8:00,0.00138606818181818, + Until: 9:00,0.00157725, + Until: 10:00,0.00138606818181818, + Until: 11:00,0.00109929545454545, + Until: 12:00,0.000836420454545455, + Until: 13:00,0.000740829545454545, + Until: 14:00,0.000549647727272727, + Until: 15:00,0.000549647727272727, + Until: 16:00,0.000549647727272727, + Until: 17:00,0.000932011363636364, + Until: 18:00,0.00109929545454545, + Until: 19:00,0.001840125, + Until: 20:00,0.00238977272727273, + Until: 21:00,0.00238977272727273, + Until: 22:00,0.001840125, + Until: 23:00,0.00157725, + Until: 24:00,0.000932011363636364; + +Schedule:Compact, + BA_sink_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 1:00,0.00460157894736842, + Until: 2:00,0.00230078947368421, + Until: 3:00,0.00164342105263158, + Until: 4:00,0.00164342105263158, + Until: 5:00,0.00230078947368421, + Until: 6:00,0.00591631578947368, + Until: 7:00,0.0138047368421053, + Until: 8:00,0.0203784210526316, + Until: 9:00,0.0216931578947368, + Until: 10:00,0.0203784210526316, + Until: 11:00,0.017748947368421, + Until: 12:00,0.0164342105263158, + Until: 13:00,0.0161055263157895, + Until: 14:00,0.0147907894736842, + Until: 15:00,0.0141334210526316, + Until: 16:00,0.0134760526315789, + Until: 17:00,0.0157768421052632, + Until: 18:00,0.0213644736842105, + Until: 19:00,0.0246513157894737, + Until: 20:00,0.0226792105263158, + Until: 21:00,0.018735, + Until: 22:00,0.0157768421052632, + Until: 23:00,0.0131473684210526, + Until: 24:00,0.00887447368421052; + +! +! *** Occupancy and Lighting factors taken from NREL benchmark model *** +! +Schedule:Day:Hourly, + OccupancyDay, !- Name + Fraction, !- Schedule Type Limits Name + 1.00000, !- Hour 1 + 1.00000, !- Hour 2 + 1.00000, !- Hour 3 + 1.00000, !- Hour 4 + 1.00000, !- Hour 5 + 1.00000, !- Hour 6 + 1.00000, !- Hour 7 + 0.88310, !- Hour 8 + 0.40861, !- Hour 9 + 0.24189, !- Hour 10 + 0.24189, !- Hour 11 + 0.24189, !- Hour 12 + 0.24189, !- Hour 13 + 0.24189, !- Hour 14 + 0.24189, !- Hour 15 + 0.24189, !- Hour 16 + 0.29498, !- Hour 17 + 0.55310, !- Hour 18 + 0.89693, !- Hour 19 + 0.89693, !- Hour 20 + 0.89693, !- Hour 21 + 1.00000, !- Hour 22 + 1.00000, !- Hour 23 + 1.00000; !- Hour 24 + +Schedule:Day:Hourly, + LightingDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.0625, !- Hour 1 + 0.0625, !- Hour 2 + 0.0625, !- Hour 3 + 0.0625, !- Hour 4 + 0.1875, !- Hour 5 + 0.390625, !- Hour 6 + 0.4375, !- Hour 7 + 0.390625, !- Hour 8 + 0.171875, !- Hour 9 + 0.1171875, !- Hour 10 + 0.1171875, !- Hour 11 + 0.1171875, !- Hour 12 + 0.1171875, !- Hour 13 + 0.1171875, !- Hour 14 + 0.1171875, !- Hour 15 + 0.203125, !- Hour 16 + 0.4375, !- Hour 17 + 0.609375, !- Hour 18 + 0.8203125, !- Hour 19 + 0.984375, !- Hour 20 + 1, !- Hour 21 + 0.6875, !- Hour 22 + 0.3828125, !- Hour 23 + 0.15625; !- Hour 24 + +!- Calculated based on occupancy sensor and motion +!- sensor savings from HMG analysis as detailed +!- in the kWhcalculation spreadsheet + +Schedule:Day:Hourly, +LightingDay_EELighting_OccSensors,!- Name, +Fraction,!- Schedule Type Limits Name +0.065170403,!- Hour 1 +0.065170403,!- Hour 2 +0.065170403,!- Hour 3 +0.065170403,!- Hour 4 +0.195511208,!- Hour 5 +0.407315016,!- Hour 6 +0.456192818,!- Hour 7 +0.407315016,!- Hour 8 +0.179218607,!- Hour 9 +0.122194505,!- Hour 10 +0.122194505,!- Hour 11 +0.122194505,!- Hour 12 +0.122194505,!- Hour 13 +0.122194505,!- Hour 14 +0.122194505,!- Hour 15 +0.211803808,!- Hour 16 +0.456192818,!- Hour 17 +0.635411425,!- Hour 18 +0.855361533,!- Hour 19 +0.947933128,!- Hour 20 +0.947933128,!- Hour 21 +0.716874428,!- Hour 22 +0.399168715,!- Hour 23 +0.162926006;!- Hour 24 + +Schedule:Day:Hourly, +LightingDay_EELighting_Garage_OccSensors,!- Name +Fraction,!- Schedule Type Limits Name +0.048125,!- Hour 1 +0.048125,!- Hour 2 +0.048125,!- Hour 3 +0.048125,!- Hour 4 +0.144375,!- Hour 5 +0.30078125,!- Hour 6 +0.336875,!- Hour 7 +0.30078125,!- Hour 8 +0.13234375,!- Hour 9 +0.090234375,!- Hour 10 +0.090234375,!- Hour 11 +0.090234375,!- Hour 12 +0.090234375,!- Hour 13 +0.090234375,!- Hour 14 +0.090234375,!- Hour 15 +0.15640625,!- Hour 16 +0.336875,!- Hour 17 +0.46921875,!- Hour 18 +0.631640625,!- Hour 19 +0.7,!- Hour 20 +0.7,!- Hour 21 +0.529375,!- Hour 22 +0.294765625,!- Hour 23 +0.1203125;!- Hour 24 + +Schedule:Day:Hourly, + ExteriorLightingDay, !- Name + Fraction, !- Schedule Type Limits Name + 1, !- Hour 1 + 1, !- Hour 2 + 1, !- Hour 3 + 1, !- Hour 4 + 1, !- Hour 5 + 1, !- 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 + 1, !- Hour 19 + 1, !- Hour 20 + 1, !- Hour 21 + 1, !- Hour 22 + 1, !- Hour 23 + 1; !- Hour 24 + + + +Schedule:Day:Hourly, + LightingDay_EELighting, !- Name + Fraction, !- Schedule Type Limits Name + 0.06875, !- Hour 1 + 0.06875, !- Hour 2 + 0.06875, !- Hour 3 + 0.06875, !- Hour 4 + 0.20625, !- Hour 5 + 0.4296875, !- Hour 6 + 0.48125, !- Hour 7 + 0.4296875, !- Hour 8 + 0.1890625, !- Hour 9 + 0.12890625, !- Hour 10 + 0.12890625, !- Hour 11 + 0.12890625, !- Hour 12 + 0.12890625, !- Hour 13 + 0.12890625, !- Hour 14 + 0.12890625, !- Hour 15 + 0.2234375, !- Hour 16 + 0.48125, !- Hour 17 + 0.6703125, !- Hour 18 + 0.90234375, !- Hour 19 + 1, !- Hour 20 + 1, !- Hour 21 + 0.75625, !- Hour 22 + 0.42109375, !- Hour 23 + 0.171875; !- Hour 24 + + +Schedule:Day:Hourly, + RefrigeratorDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.8, !- Hour 1 + 0.782696177062374, !- Hour 2 + 0.765593561368209, !- Hour 3 + 0.742857142857143, !- Hour 4 + 0.731388329979879, !- Hour 5 + 0.731388329979879, !- Hour 6 + 0.759959758551308, !- Hour 7 + 0.8, !- Hour 8 + 0.817102615694165, !- Hour 9 + 0.828571428571429, !- Hour 10 + 0.8, !- Hour 11 + 0.8, !- Hour 12 + 0.839839034205231, !- Hour 13 + 0.839839034205231, !- Hour 14 + 0.828571428571429, !- Hour 15 + 0.839839034205231, !- Hour 16 + 0.885714285714286, !- Hour 17 + 0.971428571428572, !- Hour 18 + 1, !- Hour 19 + 0.971428571428572, !- Hour 20 + 0.942857142857143, !- Hour 21 + 0.925553319919517, !- Hour 22 + 0.885714285714286, !- Hour 23 + 0.828571428571429; !- Hour 24 + +Schedule:Day:Hourly, + MiscPlugLoadDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.607490272373541, !- Hour 1 + 0.559338521400778, !- Hour 2 + 0.552853437094682, !- Hour 3 + 0.545071335927367, !- Hour 4 + 0.524481193255512, !- Hour 5 + 0.585278858625162, !- Hour 6 + 0.676232166018158, !- Hour 7 + 0.718547341115435, !- Hour 8 + 0.607490272373541, !- Hour 9 + 0.517023346303502, !- Hour 10 + 0.529182879377432, !- Hour 11 + 0.529345006485084, !- Hour 12 + 0.520428015564202, !- Hour 13 + 0.538424124513619, !- Hour 14 + 0.568741893644617, !- Hour 15 + 0.600356679636835, !- Hour 16 + 0.71011673151751, !- Hour 17 + 0.862678339818418, !- Hour 18 + 0.936608300907912, !- Hour 19 + 0.966763942931258, !- Hour 20 + 1, !- Hour 21 + 0.976653696498055, !- Hour 22 + 0.845168612191959, !- Hour 23 + 0.73443579766537; !- Hour 24 + +Schedule:Day:Hourly, + CookingRangeDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.04715848452508, !- Hour 1 + 0.04715848452508, !- Hour 2 + 0.0235458911419424, !- Hour 3 + 0.0235458911419424, !- Hour 4 + 0.04715848452508, !- Hour 5 + 0.0707043756670224, !- Hour 6 + 0.165088046958378, !- Hour 7 + 0.283017609391676, !- Hour 8 + 0.306563500533618, !- Hour 9 + 0.320771077908218, !- Hour 10 + 0.283017609391676, !- Hour 11 + 0.330176093916756, !- Hour 12 + 0.377334578441836, !- Hour 13 + 0.306563500533618, !- Hour 14 + 0.292422625400213, !- Hour 15 + 0.377334578441836, !- Hour 16 + 0.613193703308431, !- Hour 17 + 1, !- Hour 18 + 0.778348452508004, !- Hour 19 + 0.400947171824973, !- Hour 20 + 0.235859124866596, !- Hour 21 + 0.165088046958378, !- Hour 22 + 0.103721985058698, !- Hour 23 + 0.0707043756670224; !- Hour 24 + +Schedule:Day:Hourly, + DishwasherWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.116245943021998, !- Hour 1 + 0.0516480346195454, !- Hour 2 + 0.0386981608366388, !- Hour 3 + 0.0258240173097731, !- Hour 4 + 0.0258240173097731, !- Hour 5 + 0.0774720519293184, !- Hour 6 + 0.155019834114677, !- Hour 7 + 0.232567616300036, !- Hour 8 + 0.43938694554634, !- Hour 9 + 0.491034980165885, !- Hour 10 + 0.426437071763433, !- Hour 11 + 0.361839163360982, !- Hour 12 + 0.310115398485395, !- Hour 13 + 0.348889289578075, !- Hour 14 + 0.284291381175622, !- Hour 15 + 0.271341507392716, !- Hour 16 + 0.284291381175622, !- Hour 17 + 0.374713306887847, !- Hour 18 + 0.659080418319509, !- Hour 19 + 0.839999999999997, !- Hour 20 + 0.684904435629283, !- Hour 21 + 0.503984853948792, !- Hour 22 + 0.335939415795168, !- Hour 23 + 0.232567616300036; !- Hour 24 + +Schedule:Day:Hourly, + DishwasherWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.124549224666426, !- Hour 1 + 0.0553371799495132, !- Hour 2 + 0.0414623151821132, !- Hour 3 + 0.0276685899747566, !- Hour 4 + 0.0276685899747566, !- Hour 5 + 0.0830057699242698, !- Hour 6 + 0.166092679408583, !- Hour 7 + 0.249179588892895, !- Hour 8 + 0.470771727371078, !- Hour 9 + 0.526108907320591, !- Hour 10 + 0.456896862603679, !- Hour 11 + 0.387684817886765, !- Hour 12 + 0.332266498377209, !- Hour 13 + 0.373809953119365, !- Hour 14 + 0.304597908402452, !- Hour 15 + 0.290723043635052, !- Hour 16 + 0.304597908402452, !- Hour 17 + 0.401478543094122, !- Hour 18 + 0.706157591056618, !- Hour 19 + 0.9, !- Hour 20 + 0.733826181031374, !- Hour 21 + 0.539983772087991, !- Hour 22 + 0.359935088351965, !- Hour 23 + 0.249179588892895; !- Hour 24 + +Schedule:Day:Hourly, + DishwasherVacation, !- Name + Fraction, !- 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 + +Schedule:Day:Hourly, + ClothesWasherWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.0799138323371462, !- Hour 1 + 0.063913953700052, !- Hour 2 + 0.0319141964258626, !- Hour 3 + 0.0319141964258626, !- Hour 4 + 0.063913953700052, !- Hour 5 + 0.0959137109742402, !- Hour 6 + 0.191827421948482, !- Hour 7 + 0.415740162019479, !- Hour 8 + 0.623653023453381, !- Hour 9 + 0.735652173913043, !- Hour 10 + 0.71965229527595, !- Hour 11 + 0.639652902090476, !- Hour 12 + 0.575653387542098, !- Hour 13 + 0.511739433842046, !- Hour 14 + 0.447739919293667, !- Hour 15 + 0.415740162019479, !- Hour 16 + 0.431740040656573, !- Hour 17 + 0.415740162019479, !- Hour 18 + 0.415740162019479, !- Hour 19 + 0.415740162019479, !- Hour 20 + 0.415740162019479, !- Hour 21 + 0.399740283382384, !- Hour 22 + 0.271826815133954, !- Hour 23 + 0.143913346885524; !- Hour 24 + +Schedule:Day:Hourly, + ClothesWasherWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.0977669225401257, !- Hour 1 + 0.0781926029309142, !- Hour 2 + 0.0390439637124913, !- Hour 3 + 0.0390439637124913, !- Hour 4 + 0.0781926029309142, !- Hour 5 + 0.117341242149337, !- Hour 6 + 0.234682484298674, !- Hour 7 + 0.508618283321703, !- Hour 8 + 0.762979762735519, !- Hour 9 + 0.9, !- Hour 10 + 0.880425680390789, !- Hour 11 + 0.782554082344731, !- Hour 12 + 0.704256803907886, !- Hour 13 + 0.626064200976972, !- Hour 14 + 0.547766922540126, !- Hour 15 + 0.508618283321703, !- Hour 16 + 0.528192602930914, !- Hour 17 + 0.508618283321703, !- Hour 18 + 0.508618283321703, !- Hour 19 + 0.508618283321703, !- Hour 20 + 0.508618283321703, !- Hour 21 + 0.489043963712491, !- Hour 22 + 0.332554082344731, !- Hour 23 + 0.176064200976972; !- Hour 24 + +Schedule:Day:Hourly, + ClothesWasherVacation, !- Name + Fraction, !- 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 + + +Schedule:Day:Hourly, + dhw_profile_day, !- Name + fraction, !- Schedule Type Limits Name + 0.006, !- Hour 1 + 0.003, !- Hour 2 + 0.001, !- Hour 3 + 0.001, !- Hour 4 + 0.003, !- Hour 5 + 0.021, !- Hour 6 + 0.075, !- Hour 7 + 0.079, !- Hour 8 + 0.076, !- Hour 9 + 0.067, !- Hour 10 + 0.061, !- Hour 11 + 0.05, !- Hour 12 + 0.042, !- Hour 13 + 0.038, !- Hour 14 + 0.033, !- Hour 15 + 0.038, !- Hour 16 + 0.043, !- Hour 17 + 0.058, !- Hour 18 + 0.068, !- Hour 19 + 0.065, !- Hour 20 + 0.06, !- Hour 21 + 0.047, !- Hour 22 + 0.041, !- Hour 23 + 0.024; !- Hour 24 + + + +Schedule:Day:Hourly, + ClothesDryerWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.0996818663838815, !- Hour 1 + 0.0598091198303289, !- Hour 2 + 0.0398727465535526, !- Hour 3 + 0.0199363732767763, !- Hour 4 + 0.0398727465535526, !- Hour 5 + 0.0598091198303289, !- Hour 6 + 0.15949098621421, !- Hour 7 + 0.31898197242842, !- Hour 8 + 0.486427370202556, !- Hour 9 + 0.685791102970318, !- Hour 10 + 0.785472969354199, !- Hour 11 + 0.817391304347826, !- Hour 12 + 0.745600222800647, !- Hour 13 + 0.677836691410393, !- Hour 14 + 0.610073160020138, !- Hour 15 + 0.578154825026511, !- Hour 16 + 0.558218451749735, !- Hour 17 + 0.546236490032885, !- Hour 18 + 0.518345705196183, !- Hour 19 + 0.510391293636256, !- Hour 20 + 0.526300116756109, !- Hour 21 + 0.546236490032885, !- Hour 22 + 0.438600212089077, !- Hour 23 + 0.239236479321316; !- Hour 24 + +Schedule:Day:Hourly, + ClothesDryerWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.121951219512195, !- Hour 1 + 0.0731707317073171, !- Hour 2 + 0.0487804878048781, !- Hour 3 + 0.024390243902439, !- Hour 4 + 0.0487804878048781, !- Hour 5 + 0.0731707317073171, !- Hour 6 + 0.195121951219512, !- Hour 7 + 0.390243902439024, !- Hour 8 + 0.59509731460951, !- Hour 9 + 0.8389997536339, !- Hour 10 + 0.960950973146095, !- Hour 11 + 1, !- Hour 12 + 0.912170485341217, !- Hour 13 + 0.829268292682927, !- Hour 14 + 0.746366100024637, !- Hour 15 + 0.707317073170732, !- Hour 16 + 0.682926829268293, !- Hour 17 + 0.668268046316827, !- Hour 18 + 0.634146341463415, !- Hour 19 + 0.624414880512441, !- Hour 20 + 0.643877802414388, !- Hour 21 + 0.668268046316827, !- Hour 22 + 0.536585365853659, !- Hour 23 + 0.292682926829268; !- Hour 24 + +Schedule:Day:Hourly, + ClothesDryerVacation, !- Name + Fraction, !- 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 + +Schedule:Day:Hourly, + SinksWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.160587981154977, !- Hour 1 + 0.0770051124323654, !- Hour 2 + 0.057725481926472, !- Hour 3 + 0.057725481926472, !- Hour 4 + 0.0770051124323654, !- Hour 5 + 0.205611588865802, !- Hour 6 + 0.481877353056144, !- Hour 7 + 0.70676857242784, !- Hour 8 + 0.745327833439629, !- Hour 9 + 0.700304225728804, !- Hour 10 + 0.616834766597404, !- Hour 11 + 0.565346812187545, !- Hour 12 + 0.552531528380687, !- Hour 13 + 0.513972267368898, !- Hour 14 + 0.468948659658074, !- Hour 15 + 0.488228290163969, !- Hour 16 + 0.546067181681651, !- Hour 17 + 0.738863486740593, !- Hour 18 + 0.848076923076923, !- Hour 19 + 0.783887094451417, !- Hour 20 + 0.642465334211122, !- Hour 21 + 0.546067181681651, !- Hour 22 + 0.449782438743392, !- Hour 23 + 0.308360678503097; !- Hour 24 + +Schedule:Day:Hourly, + SinksWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.170419898368548, !- Hour 1 + 0.0817197111527146, !- Hour 2 + 0.0612596951056432, !- Hour 3 + 0.0612596951056432, !- Hour 4 + 0.0817197111527146, !- Hour 5 + 0.218200053490238, !- Hour 6 + 0.511380048141214, !- Hour 7 + 0.750040117678524, !- Hour 8 + 0.790960149772666, !- Hour 9 + 0.743179994650976, !- Hour 10 + 0.654600160470714, !- Hour 11 + 0.599959882321476, !- Hour 12 + 0.586359989301953, !- Hour 13 + 0.545439957207809, !- Hour 14 + 0.49765980208612, !- Hour 15 + 0.51811981813319, !- Hour 16 + 0.579499866274405, !- Hour 17 + 0.784100026745119, !- Hour 18 + 0.9, !- Hour 19 + 0.83188018186681, !- Hour 20 + 0.681799946509762, !- Hour 21 + 0.579499866274405, !- Hour 22 + 0.477320139074619, !- Hour 23 + 0.327239903717572; !- Hour 24 + +Schedule:Day:Hourly, + SinksVacation, !- Name + Fraction, !- 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 + +Schedule:Day:Hourly, + ShowersWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.0762986902534445, !- Hour 1 + 0.034648749787379, !- Hour 2 + 0.0242898452117705, !- Hour 3 + 0.034648749787379, !- Hour 4 + 0.097159380847083, !- Hour 5 + 0.367919714237116, !- Hour 6 + 0.839999999999997, !- Hour 7 + 0.833070250042524, !- Hour 8 + 0.676900833475081, !- Hour 9 + 0.531090321483245, !- Hour 10 + 0.426929749957476, !- Hour 11 + 0.336700119067869, !- Hour 12 + 0.242969892838918, !- Hour 13 + 0.208249702330328, !- Hour 14 + 0.180459261779215, !- Hour 15 + 0.187389011736689, !- Hour 16 + 0.215179452287804, !- Hour 17 + 0.277690083347508, !- Hour 18 + 0.301979928559279, !- Hour 19 + 0.301979928559279, !- Hour 20 + 0.298479333219935, !- Hour 21 + 0.29154958326246, !- Hour 22 + 0.208249702330328, !- Hour 23 + 0.149239666609968; !- Hour 24 + +Schedule:Day:Hourly, + ShowersWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.0817485967001191, !- Hour 1 + 0.0371236604864773, !- Hour 2 + 0.0260248341554686, !- Hour 3 + 0.0371236604864773, !- Hour 4 + 0.104099336621875, !- Hour 5 + 0.39419969382548, !- Hour 6 + 0.9, !- Hour 7 + 0.892575267902705, !- Hour 8 + 0.725250893009015, !- Hour 9 + 0.569025344446334, !- Hour 10 + 0.457424732097295, !- Hour 11 + 0.360750127572716, !- Hour 12 + 0.260324885184556, !- Hour 13 + 0.223124681068209, !- Hour 14 + 0.193349209049158, !- Hour 15 + 0.200773941146454, !- Hour 16 + 0.230549413165504, !- Hour 17 + 0.297525089300901, !- Hour 18 + 0.32354992345637, !- Hour 19 + 0.32354992345637, !- Hour 20 + 0.319799285592788, !- Hour 21 + 0.312374553495493, !- Hour 22 + 0.223124681068209, !- Hour 23 + 0.159899642796394; !- Hour 24 + +Schedule:Day:Hourly, + ShowersVacation, !- Name + Fraction, !- 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 + +Schedule:Day:Hourly, + BathsWeekday, !- Name + Fraction, !- Schedule Type Limits Name + 0.0494406967808042, !- Hour 1 + 0.0247203483904026, !- Hour 2 + 0.0247203483904026, !- Hour 3 + 0.0247203483904026, !- Hour 4 + 0.0494406967808042, !- Hour 5 + 0.123601741952011, !- Hour 6 + 0.296708223038169, !- Hour 7 + 0.370869268209376, !- Hour 8 + 0.42030996499018, !- Hour 9 + 0.370869268209376, !- Hour 10 + 0.296708223038169, !- Hour 11 + 0.22248313551362, !- Hour 12 + 0.197762787123218, !- Hour 13 + 0.148322090342413, !- Hour 14 + 0.148322090342413, !- Hour 15 + 0.148322090342413, !- Hour 16 + 0.247267526257364, !- Hour 17 + 0.296708223038169, !- Hour 18 + 0.494535052514731, !- Hour 19 + 0.642857142857143, !- Hour 20 + 0.642857142857143, !- Hour 21 + 0.494535052514731, !- Hour 22 + 0.42030996499018, !- Hour 23 + 0.247267526257364; !- Hour 24 + +Schedule:Day:Hourly, + BathsWeekend, !- Name + Fraction, !- Schedule Type Limits Name + 0.0692169754931261, !- Hour 1 + 0.0346084877465631, !- Hour 2 + 0.0346084877465631, !- Hour 3 + 0.0346084877465631, !- Hour 4 + 0.0692169754931261, !- Hour 5 + 0.173042438732815, !- Hour 6 + 0.415391512253437, !- Hour 7 + 0.519216975493126, !- Hour 8 + 0.588433950986252, !- Hour 9 + 0.519216975493126, !- Hour 10 + 0.415391512253437, !- Hour 11 + 0.311476389719068, !- Hour 12 + 0.276867901972505, !- Hour 13 + 0.207650926479379, !- Hour 14 + 0.207650926479379, !- Hour 15 + 0.207650926479379, !- Hour 16 + 0.346174536760311, !- Hour 17 + 0.415391512253437, !- Hour 18 + 0.692349073520621, !- Hour 19 + 0.9, !- Hour 20 + 0.9, !- Hour 21 + 0.692349073520621, !- Hour 22 + 0.588433950986252, !- Hour 23 + 0.346174536760311; !- Hour 24 + +Schedule:Day:Hourly, + BathsVacation, !- Name + Fraction, !- 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 + +Schedule:Day:Hourly, + DHWDistDay, !- Name + Fraction, !- Schedule Type Limits Name + 0.142553149370226, !- Hour 1 + 0.0764866759550322, !- Hour 2 + 0.0516611840277747, !- Hour 3 + 0.0584039294664903, !- Hour 4 + 0.121469841058603, !- Hour 5 + 0.366180268451559, !- Hour 6 + 0.833258955739606, !- Hour 7 + 0.999999987228391, !- Hour 8 + 0.995483090581232, !- Hour 9 + 0.916474762598139, !- Hour 10 + 0.800898393293271, !- Hour 11 + 0.682564390940485, !- Hour 12 + 0.590066600109555, !- Hour 13 + 0.522371887032053, !- Hour 14 + 0.466005974303267, !- Hour 15 + 0.46573704253214, !- Hour 16 + 0.527514234916123, !- Hour 17 + 0.637905701335668, !- Hour 18 + 0.727588642310272, !- Hour 19 + 0.732551127624518, !- Hour 20 + 0.681468471942116, !- Hour 21 + 0.610804704600985, !- Hour 22 + 0.464292318119835, !- Hour 23 + 0.299867724445383; !- Hour 24 + + +Schedule:Week:Compact, + RefrigeratorWeek, !- Name + For: AllDays, !- DayType List 1 + RefrigeratorDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + MiscPlugLoadWeek, !- Name + For: AllDays, !- DayType List 1 + MiscPlugLoadDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + CookingRangeWeek, !- Name + For: AllDays, !- DayType List 1 + CookingRangeDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + DishwasherWeek, !- Name + For: Weekdays, !- DayType List 1 + DishwasherWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + DishwasherVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + DishwasherWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + ClothesWasherWeek, !- Name + For: Weekdays, !- DayType List 1 + ClothesWasherWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + ClothesWasherVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + ClothesWasherWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + dhw_profile_week, !- Name + AllDays, !- DayType List 1 + dhw_profile_day; !- Schedule:Day Name 1 + + +Schedule:Week:Compact, + ClothesDryerWeek, !- Name + For: Weekdays, !- DayType List 1 + ClothesDryerWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + ClothesDryerVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + ClothesDryerWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + SinksWeek, !- Name + For: Weekdays, !- DayType List 1 + SinksWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + SinksVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + SinksWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + ShowersWeek, !- Name + For: Weekdays, !- DayType List 1 + ShowersWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + ShowersVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + ShowersWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + BathsWeek, !- Name + For: Weekdays, !- DayType List 1 + BathsWeekday, !- Schedule:Day Name 1 + For: CustomDay1, !- DayType List 2 + BathsVacation, !- Schedule:Day Name 2 + For: AllOtherDays, !- DayType List 3 + BathsWeekend; !- Schedule:Day Name 3 + +Schedule:Week:Compact, + DHWDistWeek, !- Name + For: AllDays, !- DayType List 1 + DHWDistDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + OccupancyWeek, !- Name + AllDays, !- DayType List 1 + OccupancyDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek, !- Name + For: AllDays, !- DayType List 1 + LightingDay; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek_EELighting, !- Name + For: AllDays, !- DayType List 1 + LightingDay_EELighting; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek_EELighting_interior_controls, !- Name + For: AllDays, !- DayType List 1 + LightingDay_EELighting_OccSensors; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + LightingProfileWeek_EELighting_garage_controls, !- Name + For: AllDays, !- DayType List 1 + LightingDay_EELighting_Garage_OccSensors; !- Schedule:Day Name 1 + +Schedule:Week:Compact, + ExteriorLightingProfileWeek, !- Name + For: AllDays, !- DayType List 1 + ExteriorLightingDay; !- Schedule:Day Name 1 + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:YEAR =========== + +Schedule:Year, + Occupancy, !- Name + Fraction, !- Schedule Type Limits Name + OccupancyWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLighting, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLightingHE, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek_EELighting, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLightingHE_OS, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek_EELighting_interior_controls, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + InteriorLightingHE_VS, !- Name + Fraction, !- Schedule Type Limits Name + LightingProfileWeek_EELighting_garage_controls, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + ExteriorLighting, !- Name + Fraction, !- Schedule Type Limits Name + ExteriorLightingProfileWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Refrigerator, !- Name + Fraction, !- Schedule Type Limits Name + RefrigeratorWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + MiscPlugLoad, !- Name + Fraction, !- Schedule Type Limits Name + MiscPlugLoadWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + CookingRange, !- Name + Fraction, !- Schedule Type Limits Name + CookingRangeWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + dhw_sch, !- Name + fraction, !- Schedule Type Limits Name + dhw_profile_week, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Dishwasher, !- Name + Fraction, !- Schedule Type Limits Name + DishwasherWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + ClothesWasher, !- Name + Fraction, !- Schedule Type Limits Name + ClothesWasherWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + ClothesDryer, !- Name + Fraction, !- Schedule Type Limits Name + ClothesDryerWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Sinks, !- Name + Fraction, !- Schedule Type Limits Name + SinksWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Showers, !- Name + Fraction, !- Schedule Type Limits Name + ShowersWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + Baths, !- Name + Fraction, !- Schedule Type Limits Name + BathsWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + DHWDist, !- Name + Fraction, !- Schedule Type Limits Name + DHWDistWeek, !- Schedule:Week Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:COMPACT =========== + +Schedule:Compact, + activity_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, !- Field 3 + 117.28; !- Field 4 + +Schedule:Compact, + inf_sch, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, !- Field 3 + 1; !- Field 4 + +Schedule:Compact, + zone_control_type, !- Name + control_type, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 4; !- Field 4 +!- New shading schedules per IECC 2012...ref Bob email dtd. 3rd November... + +Schedule:Compact, + shading_2012iecc, !- Name + fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 0; + +!- Shade-drapes schedule changed per IECC 2009 +Schedule:Compact, + shading_2009iecc, !- Name + any number, !- Schedule Type Limits Name + Through: 5/30, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 0.85, !- Field 4 + Through: 8/31, !- Field 5 + For: AllDays, !- Field 6 + Until 24:00, !- Field 7 + 0.7, !- Field 8 + Through: 12/31, !- Field 9 + For: AllDays, !- Field 10 + Until: 24:00, !- Field 11 + 0.85; !- Field 12 + +Schedule:Compact, + dhw_setpt, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 48; !- Field 4 + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:CONSTANT =========== + +Schedule:Constant, + DWWaterTempSchedule, !- Name + Temperature, !- Schedule Type Limits Name + 48.8888888888889; !- Hourly Value + +Schedule:Constant, + CWWaterTempSchedule, !- Name + Temperature, !- Schedule Type Limits Name + 48.8888888888889; !- Hourly Value +Schedule:Constant, + SinkSensSchedule, !- Name + Fraction, !- Schedule Type Limits Name + 0.687777777777778; !- Hourly Value + +Schedule:Constant, + SinkLatSchedule, !- Name + Fraction, !- Schedule Type Limits Name + 0.312222222222222; !- Hourly Value + +Schedule:Constant, + ShowerSensSchedule, !- Name + Fraction, !- Schedule Type Limits Name + 0.51280276816609; !- Hourly Value + +Schedule:Constant, + ShowerLatSchedule, !- Name + Fraction, !- Schedule Type Limits Name + 0.48719723183391; !- Hourly Value + +Schedule:Constant, + BathSensSchedule, !- Name + Fraction, !- Schedule Type Limits Name + 1; !- Hourly Value + +Schedule:Constant, + BathLatSchedule, !- Name + Fraction, !- Schedule Type Limits Name + 0; !- Hourly Value + +Schedule:Constant, + SSBWaterTempSchedule, !- Name + Temperature, !- Schedule Type Limits Name + 40.5555555555556; !- Hourly Value + +Schedule:Constant, + WaterHeaterSP1Schedule, !- Name + Temperature, !- Schedule Type Limits Name + 48.8888888888889; !- Hourly Value + +Schedule:Constant, + WaterHeaterSP2Schedule, !- Name + Temperature, !- Schedule Type Limits Name + 40.5555555555556; !- Hourly Value + +Schedule:Constant, + DHWSupplySetpoint, !- Name + Temperature, !- Schedule Type Limits Name + 48.8888888888889; !- Hourly Value + + + +!- Material properties for the consolidated insulation-framing objects defined in consolidated.materials.template... + +!- Sheathing insulation and framing material: R0 + Material, + sheathing_consol_layer, !Name + Rough,!- Roughness + 0.0127, !- Thickness {m} + 0.0940184, !- Conductivity {W/m-K} + 685.008, !- Density {kg/m3} + 1172.332; !- Specific Heat {J/kg-K} + +!- Ceiling insulation and framing material: R49; Insulation Grade: 1; + Material, + ceil_consol_layer,!Name + Rough,!- Roughness + 0.400206234336168, !- Thickness {m} + 0.0617176, !- Conductivity {W/m-K} + 41.9286, !- Density {kg/m3} + 776.25126; !- Specific Heat {J/kg-K} + +!- floor insulation and framing material: R30; Insulation Grade: 1; + Material, + floor_consol_layer, !Name + Rough,!- Roughness + 0.23495, !- Thickness {m} + 0.0515515, !- Conductivity {W/m-K} + 55.074, !- Density {kg/m3} + 916.9311; !- Specific Heat {J/kg-K} + +!- bsmtwall insulation and framing material: R19 + Material, + bsmtwall_consol_layer, !Name + Rough,!- Roughness + 0.1397, !- Thickness {m} + 0.0601465789473684, !- Conductivity {W/m-K} + 120.801, !- Density {kg/m3} + 1036.25775; !- Specific Heat {J/kg-K} + +!- crawlwall insulation and framing material: R19 + Material, + crawlwall_consol_layer, !Name + Rough,!- Roughness + 0.1397, !- Thickness {m} + 0.0601465789473684, !- Conductivity {W/m-K} + 120.801, !- Density {kg/m3} + 1036.25775; !- Specific Heat {J/kg-K} + + +!- Exterior wall consolidated layer properties based on construction... +!- Default is wood-framed wall +!- Assembly: Wood_R21_R0_no_5.5_na_16_Sh_n_G; Framing Fraction: 0.25; Insulation Grade: 1; + +Construction, +Exterior Wall, +syn_stucco, +sheathing_consol_layer, +OSB_7/16in, +wall_consol_layer, +Drywall_1/2in; + +!- wall insulation and framing material: R21 + Material, + wall_consol_layer, !Name + Rough,!- Roughness + 0.1397, !- Thickness {m} + 0.057165, !- Conductivity {W/m-K} + 120.801, !- Density {kg/m3} + 1036.25775; !- Specific Heat {J/kg-K} + + +!$Id: Materials.idf,v 1.1 2018/05/07 16:36:33 d3a061 Exp $ +!$Log: Materials.idf,v $ +!Revision 1.1 2018/05/07 16:36:33 d3a061 +!Initial revision +! +!Revision 1.2 2015/05/21 16:55:03 mend509 +!Archive after determination analysis +! +!Revision 1.1 2014/05/16 23:26:01 mend509 +!Initial revision +! +!Revision 1.2 2013/03/29 17:31:35 mend509 +!Archived after generating first set of masonry input files.\ +! +!Revision 1.1 2013/03/24 05:35:41 mend509 +!Initial revision +! + + !- Some material properties updated using NREL Benchmark model. Some other materials added directly from the benchmark model. + + + +!- =========== ALL OBJECTS IN CLASS: MATERIAL =========== + +WindowMaterial:Glazing, + Clear Acrylic Plastic, !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.003, !- Thickness {m} + 0.92, !- Solar Transmittance at Normal Incidence + 0.05, !- Front Side Solar Reflectance at Normal Incidence + 0.05, !- Back Side Solar Reflectance at Normal Incidence + 0.92, !- Visible Transmittance at Normal Incidence + 0.05, !- Front Side Visible Reflectance at Normal Incidence + 0.05, !- Back Side Visible Reflectance at Normal Incidence + 0.00, !- Infrared Transmittance at Normal Incidence + 0.90, !- Front Side Infrared Hemispherical Emissivity + 0.90, !- Back Side Infrared Hemispherical Emissivity + 0.90; !- Conductivity {W/m-K} + + WindowMaterial:Glazing, + Diffusing Acrylic Plastic, !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.0022, !- Thickness {m} + 0.90, !- Solar Transmittance at Normal Incidence + 0.08, !- Front Side Solar Reflectance at Normal Incidence + 0.08, !- Back Side Solar Reflectance at Normal Incidence + 0.90, !- Visible Transmittance at Normal Incidence + 0.08, !- Front Side Visible Reflectance at Normal Incidence + 0.08, !- Back Side Visible Reflectance at Normal Incidence + 0.00, !- Infrared Transmittance at Normal Incidence + 0.90, !- Front Side Infrared Hemispherical Emissivity + 0.90, !- Back Side Infrared Hemispherical Emissivity + 0.90; !- Conductivity {W/m-K} + + Material, + Very High Reflectivity Surface, !- Name + Smooth, !- Roughness + 0.0005, !- Thickness {m} + 237, !- Conductivity {W/m-K} + 2702, !- Density {kg/m3} + 903, !- Specific Heat {J/kg-K} + 0.90, !- Thermal Absorptance + 0.05, !- Solar Absorptance + 0.05; !- Visible Absorptance + +Material, + GypsumBoard-5/16in, !- Name + Rough, !- Roughness + 7.93953E-03, !- Thickness {m} + 0.1586200, !- Conductivity {W/m-K} + 640, !- Density {kg/m3} + 1129.6, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.4, !- Solar Absorptance + 0.1; !- Visible Absorptance + +Material, + CopperPipe, !- Name + MediumRough, !- Roughness + 1.90500386169072E-02, !- Thickness {m} + 401, !- Conductivity {W/m-K} + 2243.000, !- Density {kg/m3} + 837.0000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.6500000, !- Solar Absorptance + 0.6500000; !- Visible Absorptance + +Material, + F08 Metal surface, !- Name + Smooth, !- Roughness + 0.0008, !- Thickness {m} + 45.28, !- Conductivity {W/m-K} + 7824, !- Density {kg/m3} + 500; !- Specific Heat {J/kg-K} + +Material, + Concrete_4in, !- Name + Rough, !- Roughness + 0.1014984, !- Thickness {m} + 1.312098, !- Conductivity {W/m-K} + 2242.8, !- Density {kg/m3} + 465.2; !- Specific Heat {J/kg-K} + +Material, + Asphalt_shingle, !- Name + MediumRough, !- Roughness + 6.33985285170672E-03, !- Thickness {m} + 0.08186, !- Conductivity {W/m-K} + 1121.2917044623, !- Density {kg/m3} + 1255.20000949809, !- Specific Heat {J/kg-K} + , !- Thermal Absorptance + 0.75; !- Solar Absorptance + +Material, + Wood_shingle, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 0.11388, !- Conductivity {W/m-K} + 426.090847695673, !- Density {kg/m3} + 1631.76001234752; !- Specific Heat {J/kg-K} + +Material, + Slate_shingle, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 1.44219, !- Conductivity {W/m-K} + 1601.845292089, !- Density {kg/m3} + 1255.20000949809; !- Specific Heat {J/kg-K} + +Material, + cement_stucco, !- Name + MediumSmooth, !- Roughness + 1.905E-02, !- Thickness {m} + 0.721, !- Conductivity {W/m-K} + 1865.58 , !- Density {kg/m3} + 878.640006648665; !- Specific Heat {J/kg-K} + +Material, + syn_stucco, !- Name # VM: Used perlite plaster from 2009 HOF, Table 4, chp 26 and back-calculated thickness to meet R0.2 based on Reid's note dtd. 3/28/2013 + MediumSmooth, !- Roughness + 0.3048E-02, !- Thickness {m} + 8.65E-02, !- Conductivity {W/m-K} + 400 , !- Density {kg/m3} + 878.640006648665; !- Specific Heat {J/kg-K} # VM: Kept sp.heat same as cement_stucco due to lack of data + +Material, + Drywall_1/2in, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 0.16009, !- Conductivity {W/m-K} + 800.922646044499, !- Density {kg/m3} + 1087.84000823168; !- Specific Heat {J/kg-K} + +Material, + OSB_5/8in, !- Name + MediumSmooth, !- Roughness + 0.015875032180756, !- Thickness {m} + 0.1163, !- Conductivity {W/m-K} + 544.627399310259, !- Density {kg/m3} + 1213.36000918149; !- Specific Heat {J/kg-K} + +Material, + OSB_7/16in, !- Name + MediumSmooth, !- Roughness + 0.0111125, !- Thickness {m} + 0.1163, !- Conductivity {W/m-K} + 544.627399310259, !- Density {kg/m3} + 1213.36000918149; !- Specific Heat {J/kg-K} + +Material, + Blown_R30, !- Name + MediumRough, !- Roughness + 0.212598430964684, !- Thickness {m} + 0.04119, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062; !- Specific Heat {J/kg-K} + +Material, + Blown_R30_top, !- Name + MediumRough, !- Roughness + 0.117348237880148, !- Thickness {m} + 0.04119, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Plywood_3/4in, !- Name + Rough, !- Roughness + 0.01905, !- Thickness {m} + 0.1154577, !- Conductivity {W/m-K} + 544.68, !- Density {kg/m3} + 674.54, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Batt_R19, !- Name + MediumRough, !- Roughness + 2.54000514892096E-02, !- Thickness {m} + 3.47522010738099E-03, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Lumber_2x4, !- Name + Rough , !- Roughness + 0.0890016, !- Thickness {m} + 0.1154577, !- Conductivity {W/m-K} + 512.64, !- Density {kg/m3} + 767.58, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Carpet_n_pad, !- Name + MediumSmooth, !- Roughness + 2.54000514892096E-02, !- Thickness {m} + 6.01314018580031E-02, !- Conductivity {W/m-K} + 32.03690584178, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + Batt_R13, !- Name + MediumRough, !- Roughness + 0.0889, !- Thickness {m} + 0.03876, !- Conductivity {W/m-K} + 9.61107175253399, !- Density {kg/m3} + 836.800006332062, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + OSB_1/2in, !- Name + MediumSmooth, !- Roughness + 1.27000257446048E-02, !- Thickness {m} + 0.1163, !- Conductivity {W/m-K} + 544.627399310259, !- Density {kg/m3} + 1213.36000918149, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + soil_12in, !- Name + Rough, !- Roughness + 0.3048, !- Thickness {m} + 1.731, !- Conductivity {W/m-K} + 1842.3, !- Density {kg/m3} + 232.6, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + door_const, !- Name + Smooth, !- Roughness + 0.0396277251435213, !- Thickness {m} # back calculating to yield reqd. U + 0.0720096, !- Conductivity {W/m-K} + 512.64, !- Density {kg/m3} + 767.58; !- Specific Heat {J/kg-K} + +Material, + Gyp_board_1/2in, !- Name + Rough, !- Roughness + 0.01271016, !- Thickness {m} + 0.1586200, !- Conductivity {W/m-K} + 640, !- Density {kg/m3} + 1129.6, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.4, !- Solar Absorptance + 0.1; !- Visible Absorptance + +Material, + Std Wood 6inch, !- Name + MediumSmooth, !- Roughness + 0.15, !- Thickness {m} + 0.12, !- Conductivity {W/m-K} + 540.0000, !- Density {kg/m3} + 1210, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.7000000, !- Solar Absorptance + 0.7000000; !- Visible Absorptance + +Construction, + InteriorFurnishings, !- Name + Std Wood 6inch; !- Outside Layer + +Construction, + ceiling-floor-layer, !- Name + Lumber_2x4; !- Outside Layer + + +!- =========== ALL OBJECTS IN CLASS: MATERIAL:NOMASS =========== + +Material:NoMass, + Manf_wall_airgap, !- Name + Smooth, !- Roughness + 0.12; !- Thermal Resistance {m2-K/W}..1 inch air gap in vented walls.. + +Material:NoMass, + Bldg_paper_felt, !- Name + Smooth, !- Roughness + 1.05666113069662E-02; !- Thermal Resistance {m2-K/W} + +Material:NoMass, + R_high, !- Name + MediumRough, !- Roughness + 177; !- Thermal Resistance {m2-K/W} + +!- =========== ALL OBJECTS IN CLASS: MATERIAL:AIRGAP =========== + +Material:AirGap, + Air_4_in_vert, !- Name + 0.158499169604493; !- Thermal Resistance {m2-K/W} + +Material:AirGap, +3/4in_air_space, !- Name +0.08513; !- Thermal Resistance {m2-K/W} http://www.maconline.org/tech/design/cavity2web.pdf (adjusted to 3/4 in) + +Material:AirGap, +3/4in_Reflective_air_space, !- Name +0.246554; !- Thermal Resistance {m2-K/W} http://www.maconline.org/tech/design/cavity2web.pdf (adjusted to 3/4 in) + +!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== + +Construction, + Exterior Floor, !- Name + floor_consol_layer, !- Outside Layer + Plywood_3/4in, !- Layer 2 + Carpet_n_pad; !- Layer 3 + +Construction, + Interior Floor, !- Name + Plywood_3/4in, !- Outside Layer + Carpet_n_pad; !- Layer 2 + +Construction, + Interior Ceiling, !- Name + ceil_consol_layer, !- Outside Layer + Drywall_1/2in; !- Layer 2 + +Construction, + attic floor, !- Name + Drywall_1/2in, !- Outside Layer + ceil_consol_layer; !- Layer 2 + +Construction, + fndn_roof, !- Name + Carpet_n_pad, !- Outside Layer + Plywood_3/4in, !- Layer 2 + ceil_consol_layer; !- Layer 3 + + + +Construction, + interiorwall, !- Name + Drywall_1/2in, !- Outside Layer + OSB_5/8in, !- Layer 2 + Drywall_1/2in; !- Layer 3 + + + +Construction, + Interior Wall, !- Name + Drywall_1/2in, !- Outside Layer + Air_4_in_vert, !- Layer 2 + Drywall_1/2in; !- Layer 3 + +Construction, + Exterior Roof, !- Name + Asphalt_shingle, !- Outside Layer + OSB_1/2in; !- Layer 2 + +Construction, + Exterior Window, !- Name + Glass; !- Outside Layer + +Construction, + Interior Window, !- Name + Glass; !- Outside Layer + +Construction, + Exterior Door, !- Name + door_const; !- Outside Layer + +Construction, + Interior Door, !- Name + door_const; !- Outside Layer + +Construction, + Gable_end, !- Name + cement_stucco, !- Outside Layer + Bldg_paper_felt, !- Layer 2 + OSB_5/8in, !- Layer 3 + Air_4_in_vert, !- Layer 4 + Drywall_1/2in; !- Layer 5 + +Construction, + crawl_floor, !- Name + R_high, !- Outside Layer + soil_12in; !- Layer 2 + +Construction, + window_w_blinds, !- Name + Glass, !- Outside Layer + int_blind; !- Layer 2 + +Construction, + Insulated Pipe, !- Name + Pipe Insulation, !- Outside Layer + CopperPipe; !- Layer 2 + +Construction, + Plain Pipe, !- Name + CopperPipe; !- Outside Layer + +Construction, + TDD Pipe, !- Name + Very High Reflectivity Surface; !- Outside Layer + +Construction, + TDD Dome, !- Name + Clear Acrylic Plastic; !- Outside Layer + +Construction, + TDD Diffuser, !- Name + Diffusing Acrylic Plastic; !- Outside Layer + + + + + +!- Window Glass properties based on IECC window U requirement... +!----------------------------------------------------------------------- + WindowMaterial:SimpleGlazingSystem, + Glass, !Name + 1.817152, !U-Factor {W/m2-K} + 0.3344, !Solar Heat Gain Coefficient + 0.88; !Visible Transmittance +!----------------------------------------------------------------------- + + +!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:BLIND =========== + +!*** Properties for blinds taken from E+ dataset for 'Blinds with Medium Reflectivity Slats'*** +! +WindowMaterial:Blind, + int_blind, !- Name + Horizontal, !- Slat Orientation + 0.025, !- Slat Width {m} + 0.01875, !- Slat Separation {m} + 0.001, !- Slat Thickness {m} + 45.0, !- Slat Angle {deg} + 221, !- Slat Conductivity {W/m-K} + 0.0, !- Slat Beam Solar Transmittance + 0.5, !- Front Side Slat Beam Solar Reflectance + 0.5, !- Back Side Slat Beam Solar Reflectance + 0.0, !- Slat Diffuse Solar Transmittance + 0.5, !- Front Side Slat Diffuse Solar Reflectance + 0.5, !- Back Side Slat Diffuse Solar Reflectance + 0.0, !- Slat Beam Visible Transmittance + 0.5, !- Front Side Slat Beam Visible Reflectance + 0.5, !- Back Side Slat Beam Visible Reflectance + 0.0, !- Slat Diffuse Visible Transmittance + 0.5, !- Front Side Slat Diffuse Visible Reflectance + 0.5, !- Back Side Slat Diffuse Visible Reflectance + 0.0, !- Slat Infrared Hemispherical Transmittance + 0.9, !- Front Side Slat Infrared Hemispherical Emissivity + 0.9, !- Back Side Slat Infrared Hemispherical Emissivity + 0.050, !- Blind to Glass Distance {m} + 0.5, !- Blind Top Opening Multiplier + 0.5, !- Blind Bottom Opening Multiplier + 0.5, !- Blind Left Side Opening Multiplier + 0.5, !- Blind Right Side Opening Multiplier + , !- Minimum Slat Angle {deg} + ; !- Maximum Slat Angle {deg} + + +!- =========== ALL OBJECTS IN CLASS: WINDOWPROPERTY:SHADINGCONTROL =========== + +WindowProperty:ShadingControl, + Shades, !- Name + InteriorBlind, !- Shading Type + window_w_blinds, !- Construction with Shading Name + OnIfScheduleAllows, !- Shading Control Type + shading_2012iecc, !- Schedule Name + , !- Setpoint {W/m2, W or deg C} + Yes, !- Shading Control Is Scheduled + No, !- Glare Control Is Active + , !- Shading Device Material Name + , !- Type of Slat Angle Control for Blinds + ; !- Slat Angle Schedule Name + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:CONTROL =========== + +GroundHeatTransfer:Control, + gtp_control, !- Name + no, !- Run Basement Preprocessor + yes; !- Run Slab Preprocessor + + + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:MATERIALS =========== + +GroundHeatTransfer:Slab:Materials, + 2, !- NMAT: Number of materials + 0.16, !- ALBEDO: Surface Albedo: No Snow + 0.4, !- ALBEDO: Surface Albedo: Snow + 0.9, !- EPSLW: Surface Emissivity: No Snow + 0.9, !- EPSLW: Surface Emissivity: Snow + 0.75, !- Z0: Surface Roughness: No Snow + 0.05, !- Z0: Surface Roughness: Snow + 6, !- HIN: Indoor HConv: Downward Flow {W/m2-K} + 9; !- HIN: Indoor HConv: Upward {W/m2-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:MATLPROPS =========== + +GroundHeatTransfer:Slab:MatlProps, + 2300, !- RHO: Slab Material density {kg/m3} + 1200, !- RHO: Soil Density {kg/m3} + 650, !- CP: Slab CP {J/kg-K} + 1200, !- CP: Soil CP {J/kg-K} + 0.9, !- TCON: Slab k {W/m-K} + 1; !- TCON: Soil k {W/m-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:BOUNDCONDS =========== + +GroundHeatTransfer:Slab:BoundConds, + FALSE, !- EVTR: Is surface evapotranspiration modeled + TRUE, !- FIXBC: is the lower boundary at a fixed temperature + 10, !- TDEEPin {C} + FALSE; !- USRHflag: Is the ground surface h specified by the user? + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:BLDGPROPS =========== + +GroundHeatTransfer:Slab:BldgProps, + 10, !- IYRS: Number of years to iterate + 0, !- Shape: Slab shape + 4, !- HBLDG: Building height {m} + 22.22, !- TIN1: January Indoor Average temperature set point {C} + 22.22, !- TIN2: February Indoor Average temperature set point {C} + 22.22, !- TIN3: March Indoor Average temperature set point {C} + 22.22, !- TIN4: April Indoor Average temperature set point {C} + 22.22, !- TIN5: May Indoor Average temperature set point {C} + 23.88, !- TIN6: June Indoor Average temperature set point {C} + 23.88, !- TIN7: July Indoor Average temperature set point {C} + 23.88, !- TIN8: August Indoor Average temperature set point {C} + 23.88, !- TIN9: September Indoor Average temperature set point {C} + 22.22, !- TIN10: October Indoor Average temperature set point {C} + 22.22, !- TIN11: NovemberIndoor Average temperature set point {C} + 22.22, !- TIN12: December Indoor Average temperature set point {C} + 0, !- TINAmp: Daily Indoor sine wave variation amplitude {deltaC} + 0.1; !- ConvTol: Convergence Tolerance + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:INSULATION =========== + +GroundHeatTransfer:Slab:Insulation, + 0, !- RINS: R value of under slab insulation {m2-K/W} + 0, !- DINS: Width of strip of under slab insulation {m} + 1.76099742894375, !- RVINS: R value of vertical insulation {m2-K/W} + 1.5, !- ZVINS: Depth of vertical insulation {m} + 1; !- IVINS: Flag: Is there vertical insulation + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:SLAB:EQUIVALENTSLAB =========== + + +GroundHeatTransfer:Slab:EquivalentSlab, + 2.59947574997227, !- APRatio: The area to perimeter ratio for this slab {m} + + 0.1, !- SLABDEPTH: Thickness of slab on grade {m} + 15, !- CLEARANCE: Distance from edge of slab to domain edge {m} + 15; !- ZCLEARANCE: Distance from bottom of slab to domain bottom {m} + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:SIMPARAMETERS =========== + +GroundHeatTransfer:Basement:SimParameters, + 0.1, !- F: Multiplier for the ADI solution: + 15; !- IYRS: Maximum number of yearly iterations: + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:MATLPROPS =========== + +GroundHeatTransfer:Basement:MatlProps, + 6, !- NMAT: Number of materials in this domain + 2243, !- Density for Foundation Wall {kg/m3} + 2243, !- density for Floor Slab {kg/m3} + 311, !- density for Ceiling {kg/m3} + 1500, !- density for Soil {kg/m3} + 2000, !- density for Gravel {kg/m3} + 449, !- density for Wood {kg/m3} + 880, !- Specific heat for foundation wall {J/kg-K} + 880, !- Specific heat for floor slab {J/kg-K} + 1530, !- Specific heat for ceiling {J/kg-K} + 840, !- Specific heat for soil {J/kg-K} + 720, !- Specific heat for gravel {J/kg-K} + 1530, !- Specific heat for wood {J/kg-K} + 1.4, !- Thermal conductivity for foundation wall {W/m-K} + 1.4, !- Thermal conductivity for floor slab {W/m-K} + 0.09, !- Thermal conductivity for ceiling {W/m-K} + 1.1, !- thermal conductivity for soil {W/m-K} + 1.9, !- thermal conductivity for gravel {W/m-K} + 0.12; !- thermal conductivity for wood {W/m-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:INSULATION =========== +!- $r_bsmtwall_SI = $r_bsmtwall/5.6786; +!- 19; + +GroundHeatTransfer:Basement:Insulation, + 3.34589511499313, !- REXT: R Value of any exterior insulation {m2-K/W} # Rvalue has to be > 0 + True; !- INSFULL: Flag: Is the wall fully insulated? + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:SURFACEPROPS =========== + +GroundHeatTransfer:Basement:SurfaceProps, + 0.16, !- ALBEDO: Surface albedo for No snow conditions + 0.4, !- ALBEDO: Surface albedo for snow conditions + 0.94, !- EPSLN: Surface emissivity No Snow + 0.86, !- EPSLN: Surface emissivity with Snow + 6, !- VEGHT: Surface roughness No snow conditions {cm} + 0.25, !- VEGHT: Surface roughness Snow conditions {cm} + False; !- PET: Flag, Potential evapotranspiration on? + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:BLDGDATA =========== + +GroundHeatTransfer:Basement:BldgData, + 0.200000006162114, !- DWALL: Wall thickness {m} + 0.243828108701145, !- DSLAB: Floor slab thickness {m} + 0.3, !- DGRAVXY: Width of gravel pit beside basement wall {m} + 0.2, !- DGRAVZN: Gravel depth extending above the floor slab {m} + 0.1; !- DGRAVZP: Gravel depth below the floor slab {m} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:INTERIOR =========== + +GroundHeatTransfer:Basement:Interior, + True, !- COND: Flag: Is the basement conditioned? + 0.92, !- HIN: Downward convection only heat transfer coefficient {W/m2-K} + 4.04, !- HIN: Upward convection only heat transfer coefficient {W/m2-K} + 3.08, !- HIN: Horizontal convection only heat transfer coefficient {W/m2-K} + 6.13, !- HIN: Downward combined (convection and radiation) heat transfer coefficient {W/m2-K} + 9.26, !- HIN: Upward combined (convection and radiation) heat transfer coefficient {W/m2-K} + 8.29; !- HIN: Horizontal combined (convection and radiation) heat transfer coefficient {W/m2-K} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:COMBLDG =========== + +GroundHeatTransfer:Basement:ComBldg, + 21, !- January average temperature {C} + 21, !- February average temperature {C} + 21, !- March average temperature {C} + 21, !- April average temperature {C} + 24, !- May average temperature {C} + 24, !- June average temperature {C} + 24, !- July average temperature {C} + 24, !- August average temperature {C} + 24, !- September average temperature {C} + 24, !- October average temperature {C} + 21, !- November average temperature {C} + 21, !- December average temperature {C} + 21; !- Daily variation sine wave amplitude {deltaC} + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:EQUIVSLAB =========== + + +GroundHeatTransfer:Basement:EquivSlab, + 2.59947574997227, !- APRatio: The area to perimeter ratio for this slab {m} + True; !- EquivSizing: Flag + + +!- =========== ALL OBJECTS IN CLASS: GROUNDHEATTRANSFER:BASEMENT:EQUIVAUTOGRID =========== + +GroundHeatTransfer:Basement:EquivAutoGrid, + 15, !- CLEARANCE: Distance from outside of wall to edge of 3-D ground domain {m} + 0.1, !- SlabDepth: Thickness of the floor slab {m} + 1.21914054350572; !- BaseDepth: Depth of the basement wall below grade {m} + + + +!- Process internal gains from the appliances.template.. +! +! $Id: appliances.template,v 1.7 2018/12/13 20:12:17 d3a061 Exp $ +! + +ElectricEquipment, +dishwasher1, +living_unit1, +DishWasher, +EquipmentLevel, +65.698787492023, +,, +0.15, +0.6, +0.25, +dishwasher; + +ElectricEquipment, +refrigerator1, +living_unit1, +Refrigerator, +EquipmentLevel, +91.0575745202123, +,, +0, +1, +0, +refrigerator; + +ElectricEquipment, +clotheswasher1, +living_unit1, +ClothesWasher, +EquipmentLevel, +28.4784377542718, +,, +0, +0.8, +0.2, +clotheswasher; + +ElectricEquipment, +electric_dryer1, +living_unit1, +ClothesDryer, +EquipmentLevel, +213.064557285022, +,, +0.05, +0.15, +0.8, +electric_dryer; + +ElectricEquipment, +electric_range1, +living_unit1, +CookingRange, +EquipmentLevel, +248.154224774405, +,, +0.3, +0.4, +0.3, +electric_range; + +ElectricEquipment, +television1, +living_unit1, +InteriorLighting, +EquipmentLevel, +0, +,, +0, +1, +0, +television; + +ElectricEquipment, +electric_mels1, +living_unit1, +MiscPlugLoad, +EquipmentLevel, +567.464237516869, +,, +0.06, +0.69, +0.25, +electric_mels; + +ElectricEquipment, +IECC_Adj1, !- Name +living_unit1, !- Zone or ZoneList Name + MiscPlugLoad, !- Schedule Name +Watts/Area, !- Design Level Calculation Method +, !- Design Level {W} +1.54356736989469, !- Watts per Zone Floor Area {W/m2} +, !- Watts per Person {W/Person} +0.0624390461422629, !- Fraction Latent +0.41190936353998, !- Fraction Radiant +0.251045347957769, !- Fraction Lost +IECC_adj; !- End-Use Subcategory + + + + +!- HVAC System definition from hvac.template... + +!$Id: hvac.template,v 1.6 2019/01/28 18:26:57 d3a061 Exp $ +!$Log: hvac.template,v $ +!Revision 1.6 2019/01/28 18:26:57 d3a061 +!Removed r_duct and r_returnduct defaults because those were +!moved into eplus.res.template. +! +!Revision 1.5 2018/12/13 20:11:13 d3a061 +!Added one minor comment (question related to duct_loc that will needt to +!be addressed at some point). +! +!Revision 1.4 2018/09/17 17:42:08 d3a061 +!Cleaned up some units conversions. Added a few warnings to comments. +! +!Revision 1.3 2018/05/17 17:20:40 d3a061 +!Ran dos2unix on it. +! +!Revision 1.2 2017/04/12 22:42:28 mend509 +!Added 2018 IECC defaults +! +!Revision 1.1 2017/04/12 22:05:59 mend509 +!Initial revision +! +!Revision 1.4 2015/05/21 16:51:39 mend509 +!Archive after determination analysis +! +!Revision 1.2 2014/05/26 23:34:46 mend509 +!Check-in before adding MF boiler model +! +!Revision 1.1 2014/05/16 23:26:26 mend509 +!Initial revision +! +!Revision 1.1 2013/03/24 05:34:08 mend509 +!Initial revision +! + + + +!- =========== ALL OBJECTS IN CLASS: SCHEDULE:COMPACT =========== +Schedule:Constant, + boiler_setpt, !- Name + Temperature, !- Schedule Type Limits Name + 80; !- Hourly Value + +Schedule:Constant, + Compressor Setpoint, !- Name + Temperature, !- Schedule Type Limits Name + 50; !- Hourly Value + +Schedule:Compact, + dhw_setpt_hpwh, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until 24:00, !- Field 3 + 44; !- Field 4 + +Schedule:Constant, + DOAShightemp, !- Name + Temperature, !- Schedule Type Limits Name + 200; !- Hourly Value + +Schedule:Constant, + DOASlowtemp, !- Name + Temperature, !- Schedule Type Limits Name + -60; !- Hourly Value + +Schedule:Compact, + Supply-Air-Temp-Sch, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, !- Field 3 + 12; !- Field 4 + +Schedule:Compact, + always_avail, !- Name + On/Off, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, !- Field 3 + 1; !- Field 4 + +Schedule:Compact, + always_off, !- Name + On/Off, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, !- Field 3 + 0; !- Field 4 + + +Schedule:Compact, + heating_sch_HRef, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, !- Field 3 + 20; !- Field 4 # RESNET Std 3-14 + +Schedule:Compact, + cooling_sch_HRef, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, !- Field 3 + 25.55; !- Field 4 # RESNET Std 3-14 + + +Schedule:Compact, + heating_sch, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, !- Field 3 + 22.22; !- Field 4 # IECC 2009 + +Schedule:Compact, + cooling_sch, !- Name + Temperature, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, !- Field 3 + 23.88; !- Field 4 # IECC 2009 + + +Schedule:Compact, + fan_cycle, !- Name + any number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: AllDays, !- Field 2 + Until: 24:00, !- Field 3 + 0; !- Field 4 + +ThermostatSetpoint:DualSetpoint, + thermostat_living Dual SP Control, !- Name + heating_sch, !- Heating Setpoint Temperature Schedule Name + cooling_sch; !- Cooling Setpoint Temperature Schedule Name +!- HPWH curves taken from E+ example file. +! Heating Capacity as a Function of Temperature Curve (Air Wet-bulb T, Condenser Water Inlet T) +! Colmac HPA 2000 Air Source Heat Pump Water Heater +! Rating point: 29.4 C (85 F) Entering Air Dry-bulb Temperature +! 22.2 C (72 F) Entering Air Wet-bulb Temperature +! 56.7 C (132.2 F) Entering Condenser Water Temperature +! Capacity = 17028.6 W (58117 BTUH) water heating capacity +! COP = 3.37 W/W (12.21 BTUH/W) water heating efficiency +! +Curve:Biquadratic, + HPWHHeatingCapFTemp, !- Name + 0.369827, !- Coefficient1 Constant + 0.043341, !- Coefficient2 x + -0.00023, !- Coefficient3 x**2 + 0.000466, !- Coefficient4 y + 0.000026, !- Coefficient5 y**2 + -0.00027, !- Coefficient6 x*y + 0.0, !- Minimum Value of x + 40.0, !- Maximum Value of x + 20.0, !- Minimum Value of y + 90.0, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +Curve:Biquadratic, + HPWHHeatingCOPFTemp, !- Name + 1.19713, !- Coefficient1 Constant + 0.077849, !- Coefficient2 x + -0.0000016, !- Coefficient3 x**2 + -0.02675, !- Coefficient4 y + 0.000296, !- Coefficient5 y**2 + -0.00112, !- Coefficient6 x*y + 0.0, !- Minimum Value of x + 40.0, !- Maximum Value of x + 20.0, !- Minimum Value of y + 90.0, !- Maximum Value of y + , !- Minimum Curve Output + , !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + + Curve:Biquadratic, + HPACCoolCapFT, !- Name + 0.766956, !- Coefficient1 Constant + 0.0107756, !- Coefficient2 x + -0.0000414703, !- Coefficient3 x**2 + 0.00134961, !- Coefficient4 y + -0.000261144, !- Coefficient5 y**2 + 0.000457488, !- Coefficient6 x*y + 12.77778, !- Minimum Value of x + 23.88889, !- Maximum Value of x + 21.11111, !- Minimum Value of y + 46.11111; !- Maximum Value of y + + Curve:Biquadratic, + HPACCOOLEIRFT, !- Name + 0.297145, !- Coefficient1 Constant + 0.0430933, !- Coefficient2 x + -0.000748766, !- Coefficient3 x**2 + 0.00597727, !- Coefficient4 y + 0.000482112, !- Coefficient5 y**2 + -0.000956448, !- Coefficient6 x*y + 12.77778, !- Minimum Value of x + 23.88889, !- Maximum Value of x + 21.11111, !- Minimum Value of y + 46.11111; !- Maximum Value of y + + Curve:Cubic, + HPACHeatCapFT, !- Name + 0.758746, !- Coefficient1 Constant + 0.027626, !- Coefficient2 x + 0.000148716, !- Coefficient3 x**2 + 0.0000034992, !- Coefficient4 x**3 + -20.0, !- Minimum Value of x + 20.0; !- Maximum Value of x + + Curve:Cubic, + HPACHeatCapFFF, !- Name + 0.84, !- Coefficient1 Constant + 0.16, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Coefficient4 x**3 + 0.5, !- Minimum Value of x + 1.5; !- Maximum Value of x + + Curve:Cubic, + HPACHeatEIRFT, !- Name + 1.19248, !- Coefficient1 Constant + -0.0300438, !- Coefficient2 x + 0.00103745, !- Coefficient3 x**2 + -0.000023328, !- Coefficient4 x**3 + -20.0, !- Minimum Value of x + 20.0; !- Maximum Value of x + + Curve:Quadratic, + HPACCoolCapFFF, !- Name + 0.8, !- Coefficient1 Constant + 0.2, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.5, !- Minimum Value of x + 1.5; !- Maximum Value of x + + Curve:Quadratic, + HPACCOOLEIRFFF, !- Name + 1.156, !- Coefficient1 Constant + -0.1816, !- Coefficient2 x + 0.0256, !- Coefficient3 x**2 + 0.5, !- Minimum Value of x + 1.5; !- Maximum Value of x + + Curve:Quadratic, + HPACCOOLPLFFPLR, !- Name + 0.85, !- Coefficient1 Constant + 0.15, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + + Curve:Quadratic, + HPACHeatEIRFFF, !- Name + 1.3824, !- Coefficient1 Constant + -0.4336, !- Coefficient2 x + 0.0512, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +Curve:Biquadratic, + Defrost_EIR_FT, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 0, !- Minimum Value of x + 100, !- Maximum Value of x + 0, !- Minimum Value of y + 100; !- Maximum Value of y + + +! This is a dummy waste heat function of temp curve required for the +! multispeed coils. The curve is set as a constant curve that would yield +! a factor of 1 at all temperatures for simplicity. +! However, this curve is not used if the fuel type is electricity (which is +! what we limit ourselves to in terms of multispeed DX equipment) per +! the E+ version 8.0 I/O reference Page 1301. + +Curve:Biquadratic, + dummy-waste-heat-curve, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 y + 0, !- Coefficient5 y**2 + 0, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 1, !- Minimum Curve Output + 1, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + +! These coefficients were taken directly from the report below. For further details users may need +! to refer this report. + +! D. Cutler, J. Winkler, N. Kruis, and C. Christensen +! National Renewable Energy Laboratory +! M. Brandemuehl +! University of Colorado +! +! Improved Modeling of Residential Air Conditioners and Heat Pumps for Energy Calculations +! +! Technical Report +! NREL/TP-5500-56354 +! January 2013 +! +! +! Air Conditioner Performance Curves were taken from: Tables 9, 10, 16 and 17: + +! ************ Single Speed Cooling ********** +Curve:Biquadratic, + ACCoolingCAPFTemp, !- Name + 1.5509, !- Coefficient1 Constant + -0.07505, !- Coefficient2 x + 0.0031, !- Coefficient3 x**2 + 0.0024, !- Coefficient4 y + -0.00005, !- Coefficient5 y**2 + -0.00043, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + ACCoolingEIRFTemp, !- Name + -0.30428, !- Coefficient1 Constant + 0.11805, !- Coefficient2 x + -0.00342, !- Coefficient3 x**2 + -0.00626, !- Coefficient4 y + 0.0007, !- Coefficient5 y**2 + -0.00047, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + ACCoolingCAPFFF, !- Name + 0.718605468, !- Coefficient1 Constant + 0.410099989, !- Coefficient2 x + -0.128705457, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + ACCoolingEIRFFF, !- Name + 1.32299905, !- Coefficient1 Constant + -0.477711207, !- Coefficient2 x + 0.154712157, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +! Part Load Fraction curve as a function of Part Load Ratio is default from +! Table 6. BEopt AC Rated Value Inputs of NREL report NREL/TP-5500-56354 + + Curve:Quadratic, + ACCoolingPLFFPLR, !- Name + 0.90, !- Coefficient1 Constant + 0.10, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +! Heat Pump Performance Curves were taken from: Tables 14, 15, 18 and 19: + +! ************ Single Speed Cooling ********** + Curve:Biquadratic, + HPCoolingCAPFTemp, !- Name + 1.55736, !- Coefficient1 Constant + -0.074448, !- Coefficient2 x + 0.003099, !- Coefficient3 x**2 + 0.00146, !- Coefficient4 y + -0.000041, !- Coefficient5 y**2 + -0.000427, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + HPCoolingEIRFTemp, !- Name + -0.350448, !- Coefficient1 Constant + 0.11681, !- Coefficient2 x + -0.0034, !- Coefficient3 x**2 + -0.001226, !- Coefficient4 y + 0.000601, !- Coefficient5 y**2 + -0.000467, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPCoolingCAPFFF, !- Name + 0.718664047, !- Coefficient1 Constant + 0.41797409, !- Coefficient2 x + -0.136638137, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPCoolingEIRFFF, !- Name + 1.143487507, !- Coefficient1 Constant + -0.13943972, !- Coefficient2 x + -0.004047787, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +! Part Load Fraction curve as a function of Part Load Ratio is default curve +! from Table 6. BEopt AC Rated Value Inputs of NREL report NREL/TP-5500-56354 + + Curve:Quadratic, + HPCOOLPLFFPLR, !- Name + 0.90, !- Coefficient1 Constant + 0.10, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +! ************ Single Speed Heating ********** + + Curve:Biquadratic, + HPHeatingCAPFTemp, !- Name + 0.876825, !- Coefficient1 Constant + -0.002955, !- Coefficient2 x + -0.000058, !- Coefficient3 x**2 + 0.025335, !- Coefficient4 y + 0.000196, !- Coefficient5 y**2 + -0.000043, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + HPHeatingEIRFTemp, !- Name + 0.704658, !- Coefficient1 Constant + 0.008767, !- Coefficient2 x + 0.000625, !- Coefficient3 x**2 + -0.009037, !- Coefficient4 y + 0.000738, !- Coefficient5 y**2 + -0.001025, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPHeatingCAPFFF, !- Name + 0.694045465, !- Coefficient1 Constant + 0.474207981, !- Coefficient2 x + -0.168253446, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPHeatingEIRFFF, !- Name + 2.185418751, !- Coefficient1 Constant + -1.942827919, !- Coefficient2 x + 0.757409168, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +! Part Load Fraction curve as a function of Part Load Ratio is default curve +! from Table 6. BEopt AC Rated Value Inputs of NREL report NREL/TP-5500-56354 + + Curve:Quadratic, + HPHeatPLFFPLR, !- Name + 0.90, !- Coefficient1 Constant + 0.10, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +! *************** Low Speed Heating ************ + Curve:Biquadratic, + HPLowStageHeatingCAPFTemp, !- Name + 0.84613, !- Coefficient1 Constant + -0.002279, !- Coefficient2 x + -0.000047, !- Coefficient3 x**2 + 0.026703, !- Coefficient4 y + 0.000201, !- Coefficient5 y**2 + -0.000079, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + HPLowStageHeatingEIRFTemp, !- Name + 0.551837, !- Coefficient1 Constant + 0.02038, !- Coefficient2 x + 0.000546, !- Coefficient3 x**2 + -0.009638, !- Coefficient4 y + 0.000785, !- Coefficient5 y**2 + -0.00125, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPLowStageHeatingCAPFFF, !- Name + 0.741466907, !- Coefficient1 Constant + 0.378645444, !- Coefficient2 x + -0.119754733, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPLowStageHeatingEIRFFF, !- Name + 2.153618211, !- Coefficient1 Constant + -1.737190609, !- Coefficient2 x + 0.584269478, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + +! *************** High Speed Heating ************ + Curve:Biquadratic, + HPHighStageHeatingCAPFTemp, !- Name + 0.818223, !- Coefficient1 Constant + 0.001981, !- Coefficient2 x + -0.000203, !- Coefficient3 x**2 + 0.028703, !- Coefficient4 y + 0.000207, !- Coefficient5 y**2 + -0.000071, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + HPHighStageHeatingEIRFTemp, !- Name + 0.81584, !- Coefficient1 Constant + -0.00615, !- Coefficient2 x + 0.001021, !- Coefficient3 x**2 + -0.001301, !- Coefficient4 y + 0.001083, !- Coefficient5 y**2 + -0.001487, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPHighStageHeatingCAPFFF, !- Name + 0.76634609, !- Coefficient1 Constant + 0.32840943, !- Coefficient2 x + -0.094701495, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPHighStageHeatingEIRFFF, !- Name + 2.001041353, !- Coefficient1 Constant + -1.58869128, !- Coefficient2 x + 0.587593517, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +! Part Load Fraction curve as a function of Part Load Ratio is default curve +! from Table 6. BEopt AC Rated Value Inputs of NREL report NREL/TP-5500-56354 + + Curve:Quadratic, + HP2StageHeatingPLFFPLR, !- Name + 0.93, !- Coefficient1 Constant + 0.07, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +! **************** Low Speed Cooling ********* + + Curve:Biquadratic, + HPLowStageCoolingCAPFTemp, !- Name + 1.658788, !- Coefficient1 Constant + -0.083453, !- Coefficient2 x + 0.003424, !- Coefficient3 x**2 + 0.002433, !- Coefficient4 y + -0.000045, !- Coefficient5 y**2 + -0.000534, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + HPLowStageCoolingEIRFTemp, !- Name + -0.582916, !- Coefficient1 Constant + 0.158101, !- Coefficient2 x + -0.004398, !- Coefficient3 x**2 + -0.020335, !- Coefficient4 y + 0.00108, !- Coefficient5 y**2 + -0.00064, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPLowStageCoolingCAPFFF, !- Name + 0.655239515, !- Coefficient1 Constant + 0.511655216, !- Coefficient2 x + -0.166894731, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPLowStageCoolingEIRFFF, !- Name + 1.639108268, !- Coefficient1 Constant + -0.998953996, !- Coefficient2 x + 0.359845728, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + +! **************** High Speed Cooling ********* + Curve:Biquadratic, + HPHighStageCoolingCAPFTemp, !- Name + 1.472738, !- Coefficient1 Constant + -0.067222, !- Coefficient2 x + 0.00292, !- Coefficient3 x**2 + 0.000052, !- Coefficient4 y + -0.00003, !- Coefficient5 y**2 + -0.000359, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + HPHighStageCoolingEIRFTemp, !- Name + -0.488196, !- Coefficient1 Constant + 0.099162, !- Coefficient2 x + -0.00237, !- Coefficient3 x**2 + 0.019503, !- Coefficient4 y + 0.00043, !- Coefficient5 y**2 + -0.001097, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPHighStageCoolingCAPFFF, !- Name + 0.618281092, !- Coefficient1 Constant + 0.569060264, !- Coefficient2 x + -0.187341356, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + HPHighStageCoolingEIRFFF, !- Name + 1.570774717, !- Coefficient1 Constant + -0.914152018, !- Coefficient2 x + 0.343377302, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +! Part Load Fraction curve as a function of Part Load Ratio is default curve +! from Table 6. BEopt AC Rated Value Inputs of NREL report NREL/TP-5500-56354 + + Curve:Quadratic, + HP2StageCoolingPLFFPLR, !- Name + 0.93, !- Coefficient1 Constant + 0.07, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +! ************ Low Speed Cooling ********** + Curve:Biquadratic, + ACLowStageCoolingCAPFTemp, !- Name + 1.66458, !- Coefficient1 Constant + -0.08039, !- Coefficient2 x + 0.0033, !- Coefficient3 x**2 + 0.00124, !- Coefficient4 y + -0.00003, !- Coefficient5 y**2 + -0.00052, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + ACLowStageCoolingEIRFTemp, !- Name + -0.42738, !- Coefficient1 Constant + 0.14191, !- Coefficient2 x + -0.00412, !- Coefficient3 x**2 + -0.01406, !- Coefficient4 y + 0.00083, !- Coefficient5 y**2 + -0.00043, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + ACLowStageCoolingCAPFFF, !- Name + 0.65673024, !- Coefficient1 Constant + 0.516470835, !- Coefficient2 x + -0.172887149, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + ACLowStageCoolingEIRFFF, !- Name + 1.562945114, !- Coefficient1 Constant + -0.791859997, !- Coefficient2 x + 0.230030877, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +! ************ High Speed Cooling ********** + Curve:Biquadratic, + ACHighStageCoolingCAPFTemp, !- Name + 1.36788, !- Coefficient1 Constant + -0.06257, !- Coefficient2 x + 0.0028, !- Coefficient3 x**2 + 0.00504, !- Coefficient4 y + -0.00007, !- Coefficient5 y**2 + -0.00045, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Biquadratic, + ACHighStageCoolingEIRFTemp, !- Name + 0.04232, !- Coefficient1 Constant + 0.07892, !- Coefficient2 x + -0.00238, !- Coefficient3 x**2 + -0.00304, !- Coefficient4 y + 0.00053, !- Coefficient5 y**2 + -0.00032, !- Coefficient6 x*y + 0, !- Minimum Value of x + 50, !- Maximum Value of x + 0, !- Minimum Value of y + 50, !- Maximum Value of y + 0, !- Minimum Curve Output + 5, !- Maximum Curve Output + Temperature, !- Input Unit Type for X + Temperature, !- Input Unit Type for Y + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + ACHighStageCoolingCAPFFF, !- Name + 0.690334551, !- Coefficient1 Constant + 0.464383753, !- Coefficient2 x + -0.154507638, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + Curve:Quadratic, + ACHighStageCoolingEIRFFF, !- Name + 1.31565404, !- Coefficient1 Constant + -0.482467162, !- Coefficient2 x + 0.166239001, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1.5, !- Maximum Value of x + 0, !- Minimum Curve Output + 2, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + +! Part Load Fraction curve as a function of Part Load Ratio is default from +! Table 6. BEopt AC Rated Value Inputs of NREL report NREL/TP-5500-56354 + + Curve:Quadratic, + AC2StageCoolingPLFFPLR, !- Name + 0.93, !- Coefficient1 Constant + 0.07, !- Coefficient2 x + 0.0, !- Coefficient3 x**2 + 0.0, !- Minimum Value of x + 1.0; !- Maximum Value of x + +!- =========== ALL OBJECTS IN CLASS: CURVE:QUADRATIC =========== + +! NREL benchmark Cool-PLF-fPLR +Curve:Quadratic, + Cool-PLF-fPLR, !- Name + 0.80141423, !- Coefficient1 Constant + 0.23744685, !- Coefficient2 x + -0.0393773, !- Coefficient3 x**2 + 0, !- Minimum Value of x + 1, !- Maximum Value of x + 0.7, !- Minimum Curve Output + 1; !- Maximum Curve Output + + +!- =========== ALL OBJECTS IN CLASS: CURVE:CUBIC =========== + +Curve:Cubic, + Fan-EIR-fPLR, !- Name + 0.00000000, !- Coefficient1 Constant + 1.00000000, !- Coefficient2 x + 0.00000000, !- Coefficient3 x**2 + 0.00000000, !- Coefficient4 x**3 + 0, !- Minimum Value of x + 1, !- Maximum Value of x + 0, !- Minimum Curve Output + 1; !- Maximum Curve Output + +Curve:Cubic, + ConstantCubic, !- Name + 1, !- Coefficient1 Constant + 0, !- Coefficient2 x + 0, !- Coefficient3 x**2 + 0, !- Coefficient4 x**3 + -100, !- Minimum Value of x + 100; !- Maximum Value of x + + +!- =========== ALL OBJECTS IN CLASS: CURVE:BIQUADRATIC =========== + +! NREL benchmark Cool-CAP-FT +Curve:Biquadratic, + Cool-Cap-fT, !- Name + 1.26489391, !- Coefficient1 Constant + -0.035054982, !- Coefficient2 x + 0.00211086, !- Coefficient3 x**2 + -0.001526886, !- Coefficient4 y + -0.0000070308, !- Coefficient5 y**2 + -0.0004691844, !- Coefficient6 x*y + -100, !- Minimum Value of x + 100, !- Maximum Value of x + -100, !- Minimum Value of y + 100; !- Maximum Value of y + +! NREL benchmark Cool-EIR-FT +Curve:Biquadratic, + Cool-EIR-fT, !- Name + 0.38402403, !- Coefficient1 Constant + 0.029696724, !- Coefficient2 x + -0.0011329308, !- Coefficient3 x**2 + 0.006490674, !- Coefficient4 y + 0.0002626992, !- Coefficient5 y**2 + -0.0001207224, !- Coefficient6 x*y + -100, !- Minimum Value of x + 100, !- Maximum Value of x + -100, !- Minimum Value of y + 100; !- Maximum Value of y + + +!- =========== ALL OBJECTS IN CLASS: AVAILABILITYMANAGER:SCHEDULED =========== + +AvailabilityManager:Scheduled, + System availability, !- Name + always_avail; !- Schedule Name + + +!- =========== ALL OBJECTS IN CLASS: AVAILABILITYMANAGERASSIGNMENTLIST =========== + +AvailabilityManagerAssignmentList, + availability list, !- Name + AvailabilityManager:Scheduled, !- Availability Manager 1 Object Type + System availability; !- Availability Manager 1 Name + + +!- =========== ALL OBJECTS IN CLASS: SIZING:ZONE =========== + Sizing:Zone, + living_unit1, !- Zone or ZoneList Name + SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method + 12, !- Zone Cooling Design Supply Air Temperature {C} + , !- Zone Cooling Design Supply Air Temperature Difference {deltaC} + SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method + 50, !- Zone Heating Design Supply Air Temperature {C} + , !- Zone Heating Design Supply Air Temperature Difference {deltaC} + 0.008, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir} + 0.008, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + SZ_DSOA_living_unit1, !- Design Specification Outdoor Air Object Name + , !- Zone Heating Sizing Factor + , !- Zone Cooling Sizing Factor + DesignDay, !- Cooling Design Air Flow Method + , !- Cooling Design Air Flow Rate {m3/s} + 0.000762, !- Cooling Minimum Air Flow per Zone Floor Area {m3/s-m2} + , !- Cooling Minimum Air Flow {m3/s} + , !- Cooling Minimum Air Flow Fraction + DesignDay, !- Heating Design Air Flow Method + , !- Heating Design Air Flow Rate {m3/s} + 0.002032, !- Heating Maximum Air Flow per Zone Floor Area {m3/s-m2} + 0.1415762, !- Heating Maximum Air Flow {m3/s} + 0.3; !- Heating Maximum Air Flow Fraction + + +!- =========== ALL OBJECTS IN CLASS: SIZING:SYSTEM =========== + +Sizing:System, + Central System_unit1, !- AirLoop Name + Sensible, !- Type of Load to Size On + autosize, !- Design Outdoor Air Flow Rate {m3/s} + 1, !- Central Heating Maximum System Air Flow Ratio + 7, !- Preheat Design Temperature {C} + 0.008, !- Preheat Design Humidity Ratio {kg-H2O/kg-Air} + 11, !- Precool Design Temperature {C} + 0.008, !- Precool Design Humidity Ratio {kg-H2O/kg-Air} + 12, !- Central Cooling Design Supply Air Temperature {C} + 50, !- Central Heating Design Supply Air Temperature {C} + NonCoincident, !- Tpye of Zone Sum to Use + No, !- 100% Outdoor Air in Cooling + No, !- 100% Outdoor Air in Heating + 0.008, !- Central Cooling Design Supply Air Humidity Ratio {kg-H2O/kg-Air} + 0.008, !- Central Heating Design Supply Air Humidity Ratio {kg-H2O/kg-Air} + DesignDay, !- Cooling Supply Air Flow Rate Method + , !- Cooling Supply Air Flow Rate {m3/s} + , !- Cooling Supply Air Flow Rate Per Floor Area {m3/s-m2} + , !- Cooling Fraction of Autosized Cooling Supply Air Flow Rate + , !- Cooling Supply Air Flow Rate Per Unit Cooling Capacity {m3/s-W} + DesignDay, !- Heating Supply Air Flow Rate Method + , !- Heating Supply Air Flow Rate {m3/s} + , !- Heating Supply Air Flow Rate Per Floor Area {m3/s-m2} + , !- Heating Fraction of Autosized Heating Supply Air Flow Rate + , !- Heating Fraction of Autosized Cooling Supply Air Flow Rate + , !- Heating Supply Air Flow Rate Per Unit Heating Capacity {m3/s-W} + , !- System Outdoor Air Method + 1.0, !- Zone Maximum Outdoor Air Fraction {dimensionless} + CoolingDesignCapacity, !- Cooling Design Capacity Method + autosize, !- Cooling Design Capacity {W} + , !- Cooling Design Capacity Per Floor Area {W/m2} + , !- Fraction of Autosized Cooling Design Capacity + HeatingDesignCapacity, !- Heating Design Capacity Method + autosize, !- Heating Design Capacity {W} + , !- Heating Design Capacity Per Floor Area {W/m2} + , !- Fraction of Autosized Heating Design Capacity + OnOff; !- Central Cooling Capacity Control Method + + +!- =========== ALL OBJECTS IN CLASS: ZONECONTROL:THERMOSTAT =========== + +ZoneControl:Thermostat, + Zone Thermostat_unit1, !- Name + living_unit1, !- Zone or ZoneList Name + zone_control_type, !- Control Type Schedule Name + ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type + thermostat_living Dual SP Control; !- Control 1 Name + + +!- =========== ALL OBJECTS IN CLASS: ZONEINFILTRATION:EFFECTIVELEAKAGEAREA =========== + +!- For multifamily buildings, we assume that the blower door test +!- is conducted separately for each apartment. The Sherman-Grimsrud +!- infiltration model uses Effective Leakage Area coupled with +!- the outdoor air temperature to calculate the infiltration load. +!- While this approach is correct for the singlefamily prototype, +!- it may overstate infiltration loads for the multifamily prototype +!- as the apartments have shared walls with zones on both sides being +!- pressurized in reality. To account for this reduced leakage in +!- multifamily buildings, the ELA for each unit is adjusted based on +!- the ratio of exterior surface to total surface area. + +ZoneInfiltration:EffectiveLeakageArea, + Living_ShermanGrimsrud_unit1, !- Name + living_unit1, !- Zone Name + always_avail, !- Schedule Name + 357.402730122675, !- Effective Air Leakage Area {cm2} + 0.00029, !- Stack Coefficient + 0.000231; !- Wind Coefficient + + +!- =========== ALL OBJECTS IN CLASS: ZONEINFILTRATION:EFFECTIVELEAKAGEAREA =========== + +ZoneInfiltration:EffectiveLeakageArea, + AtticVent_unit1, !- Name + attic_unit1, !- Zone Name + always_avail, !- Schedule Name + 370, !- Effective Air Leakage Area {cm2} # 1/300 for ceiling area converted to sq. cm + 0.00029, !- Stack Coefficient + 0.000231; !- Wind Coefficient + + +AirTerminal:SingleDuct:Uncontrolled, + ZoneDirectAir_unit1, !- Name + always_avail, !- Availability Schedule Name + Zone Inlet Node_unit1, !- Zone Supply Air Node Name + autosize; !- Maximum Air Flow Rate {m3/s} + + +AirLoopHVAC:ZoneSplitter, + Zone Supply Air Splitter_unit1, !- Name + Zone Equipment Inlet Node_unit1, !- Inlet Node Name + Zone Inlet Node_unit1; !- Outlet 1 Node Name + + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:SUPPLYPATH =========== + +AirLoopHVAC:SupplyPath, + SupplyPath_unit1, !- Name + Zone Equipment Inlet Node_unit1, !- Supply Air Path Inlet Node Name + AirLoopHVAC:ZoneSplitter, !- Component 1 Object Type + Zone Supply Air Splitter_unit1; !- Component 1 Name + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:ZONEMIXER =========== + +AirLoopHVAC:ZoneMixer, + Zone Return Air Mixer_unit1, !- Name + Return Air Mixer Outlet_unit1, !- Outlet Node Name + Zone Outlet Node_unit1; !- Inlet 1 Node Name + + +!- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:RETURNPATH =========== + +AirLoopHVAC:ReturnPath, + ReturnPath_unit1, !- Name + Return Air Mixer Outlet_unit1, !- Return Air Path Outlet Node Name + AirLoopHVAC:ZoneMixer, !- Component 1 Object Type + Zone Return Air Mixer_unit1; !- Component 1 Name + +!- =========== ALL OBJECTS IN CLASS: BRANCHLIST =========== + +BranchList, + Air Loop Branches_unit1, !- Name + Air Loop Main Branch_unit1; !- Branch 1 Name + + +!- =========== ALL OBJECTS IN CLASS: ZONEHVAC:OUTDOORAIRUNIT =========== + +ZoneVentilation:DesignFlowRate, + Ventilation_unit1, !- Name + living_unit1, !- Zone Name + always_avail, !- Schedule Name + Flow/Zone, !- Design Flow Rate Calculation Method + 0.0283168464628752, !- Design Flow Rate {m3/s} + , !- Flow Rate per Zone Floor Area {m3/s-m2} + , !- Flow Rate per Person {m3/s-person} + , !- Air Changes per Hour + Exhaust, !- Ventilation Type + 0, !- Fan Pressure Rise {Pa} + 1, !- Fan Total Efficiency # Fan consumption added during post-processing @ 2.8 cfm/W + 1, !- Constant Term Coefficient + 0, !- Temperature Term Coefficient + 0, !- Velocity Term Coefficient + 0, !- Velocity Squared Term Coefficient + -100, !- Minimum Indoor Temperature {C} + , !- Minimum Indoor Temperature Schedule Name + 100, !- Maximum Indoor Temperature {C} + , !- Maximum Indoor Temperature Schedule Name + -100, !- Delta Temperature {deltaC} + , !- Delta Temperature Schedule Name + -100, !- Minimum Outdoor Temperature {C} + , !- Minimum Outdoor Temperature Schedule Name + 100, !- Maximum Outdoor Temperature {C} + , !- Maximum Outdoor Temperature Schedule Name + 40; !- Maximum Wind Speed {m/s} + +!- =========== ALL OBJECTS IN CLASS: DESIGNSPECIFICATION:OUTDOORAIR =========== + +DesignSpecification:OutdoorAir, + SZ_DSOA_living_unit1, !- Name + Flow/Zone, !- Outdoor Air Method + 0, !- Outdoor Air Flow per Person {m3/s-person} + , !- Outdoor Air Flow per Zone Floor Area {m3/s-m2} + 0.0283168464628752; !- Outdoor Air Flow per Zone {m3/s} + + !- =========== ALL OBJECTS IN CLASS: COIL:COOLING:DX:SINGLESPEED =========== + + Coil:Cooling:DX:SingleSpeed, + DX Cooling Coil_unit1, !- Name + always_avail, !- Availability Schedule Name + autosize, !- Rated Total Cooling Capacity {W} + autosize, !- Rated Sensible Heat Ratio + 3.97008850025305, !- Rated COP + autosize, !- Rated Air Flow Rate {m3/s} + , !- Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)} + Cooling Coil Air Inlet Node_unit1,!- Air Inlet Node Name + Heating Coil Air Inlet Node_unit1,!- Air Outlet Node Name + + + Cool-Cap-FT, !- Total Cooling Capacity Function of Temperature Curve Name + ConstantCubic, !- Total Cooling Capacity Function of Flow Fraction Curve Name + Cool-EIR-FT, !- Energy Input Ratio Function of Temperature Curve Name + ConstantCubic, !- Energy Input Ratio Function of Flow Fraction Curve Name + Cool-PLF-fPLR; !- Part Load Fraction Correlation Curve Name + !- =========== ALL OBJECTS IN CLASS: FAN:ONOFF =========== + + Fan:OnOff, + Supply Fan_unit1, !- Name + always_avail, !- Availability Schedule Name + 0.377, !- Fan Efficiency #From the study from Dave... + 400, !- Pressure Rise {Pa} #based on 0.5W/cfm assuming 1200 cfm,motor eff = 0.65 @ 400cfm/ton and fan eff = 0.58... + autosize, !- Maximum Flow Rate {m3/s} + 0.65, !- Motor Efficiency #From the study from Dave @ 400cfm/ton and back calculating for seer > 13... + 1, !- Motor In Airstream Fraction + air loop inlet node_unit1, !- Air Inlet Node Name + cooling coil air inlet node_unit1,!- Air Outlet Node Name + , !- Fan Power Ratio Function of Speed Ratio Curve Name + , !- Fan Efficiency Ratio Function of Speed Ratio Curve Name + General; !- End-Use Subcategory + + + !- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC =========== + + AirLoopHVAC, + Central System_unit1, !- Name + , !- Controller List Name + availability list, !- Availability Manager List Name + autosize, !- Design Supply Air Flow Rate {m3/s} + Air Loop Branches_unit1, !- Branch List Name + , !- Connector List Name + Air Loop Inlet Node_unit1, !- Supply Side Inlet Node Name + Return Air Mixer Outlet_unit1, !- Demand Side Outlet Node Name + Zone Equipment Inlet Node_unit1, !- Demand Side Inlet Node Names + Air Loop Outlet Node_unit1; !- Supply Side Outlet Node Names + + + !- =========== ALL OBJECTS IN CLASS: AIRLOOPHVAC:UNITARYHEATCOOL =========== + + AirLoopHVAC:UnitaryHeatCool, + ACandF_unit1, !- Name + always_avail, !- Availability Schedule Name + air loop inlet node_unit1, !- Unitary System Air Inlet Node Name + air loop outlet node_unit1, !- Unitary System Air Outlet Node Name + fan_cycle, !- Supply Air Fan Operating Mode Schedule Name + 80, !- Maximum Supply Air Temperature {C} + autosize, !- Supply Air Flow Rate During Cooling Operation {m3/s} + autosize, !- Supply Air Flow Rate During Heating Operation {m3/s} + 0, !- Supply Air Flow Rate When No Cooling or Heating is Needed {m3/s} + living_unit1, !- Controlling Zone or Thermostat Location + Fan:OnOff, !- Supply Fan Object Type + Supply Fan_unit1, !- Supply Fan Name + BlowThrough, !- Fan Placement + Coil:Heating:Fuel, !- Heating Coil Object Type + Main Fuel Heating Coil_unit1, !- Heating Coil Name + Coil:Cooling:DX:SingleSpeed, !- Cooling Coil Object Type + DX Cooling Coil_unit1, !- Cooling Coil Name + None; !- Dehumidification Control Type + + Branch, + Air Loop Main Branch_unit1, !- Name + , !- Pressure Drop Curve Name + AirLoopHVAC:UnitaryHeatCool, !- Component 1 Object Type + ACandF_unit1, !- Component 1 Name + Air Loop Inlet Node_unit1, !- Component 1 Inlet Node Name + Air loop outlet node_unit1; !- Component 1 Outlet Node Name + + + +!- =========== ALL OBJECTS IN CLASS: COIL:HEATING =========== + +Coil:Heating:Fuel, +Main Fuel heating coil_unit1, !- Name +always_avail, !- Availability Schedule Name +FuelOil#2, !- Fuel Type +0.78, !- Burner Efficiency +autosize, !- Nominal Capacity {W} +heating coil air inlet node_unit1, !- Air Inlet Node Name +air loop outlet node_unit1; !- Air Outlet Node Name + +!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODE =========== + +OutdoorAir:Node, + outside air inlet node_unit1, !- Name + 0.914355407629293; !- Height Above Ground {m} + + +OutdoorAir:NodeList, + outdoor air node_unit1;!- Node or NodeList Name 1 + + + + + NodeList, + Zone Inlet Nodes_unit1, !- Name + Zone Inlet Node_unit1; !- Node 1 Name + + !- =========== ALL OBJECTS IN CLASS: ZONEHVAC:EQUIPMENTLIST =========== + + ZoneHVAC:EquipmentList, + ZONEEQUIPMENT_unit1, !- Name + AirTerminal:SingleDuct:Uncontrolled, !- Zone Equipment 2 Object Type + ZoneDirectAir_unit1, !- Zone Equipment 2 Name + 1, !- Zone Equipment 2 Cooling Sequence + 1; !- Zone Equipment 2 Heating or No-Load Sequence + + + !- =========== ALL OBJECTS IN CLASS: ZONEHVAC:EQUIPMENTCONNECTIONS =========== + + ZoneHVAC:EquipmentConnections, + living_unit1, !- Zone Name + ZoneEquipment_unit1, !- Zone Conditioning Equipment List Name + zone inlet nodes_unit1, !- Zone Air Inlet Node or NodeList Name + , !- Zone Air Exhaust Node or NodeList Name + Zone Node_unit1, !- Zone Air Node Name + Zone Outlet Node_unit1; !- Zone Return Air Node Name + + + + + +!- DHW pipe network... + + Material, + Pipe Insulation, !- Name + VeryRough, !- Roughness + 0.0127032520325203, !- Thickness {m} + 0.03317175, !- Conductivity {W/m-K} + 91.0, !- Density {kg/m3} + 836.0, !- Specific Heat {J/kg-K} + 0.9, !- Thermal Absorptance + 0.5, !- Solar Absorptance + 0.5; !- Visible Absorptance + + + + !- =========== ALL OBJECTS IN CLASS: PEOPLE =========== + + + People, + people_unit1, !- Name + living_unit1, !- Zone or ZoneList Name + Occupancy, !- Number of People Schedule Name + People, !- Number of People Calculation Method + 3, !- Number of People + , !- People per Zone Floor Area {person/m2} + , !- Zone Floor Area per Person {m2/person} + 0, !- Fraction Radiant + autocalculate, !- Sensible Heat Fraction + activity_sch, !- Activity Level Schedule Name + , !- Carbon Dioxide Generation Rate {m3/s-W} + No, !- Enable ASHRAE 55 Comfort Warnings + ZoneAveraged; !- Mean Radiant Temperature Calculation Type + + + !- =========== ALL OBJECTS IN CLASS: LIGHTS =========== + + Lights, + Living Hardwired Lighting1, !- Name + living_unit1, !- Zone or ZoneList Name + InteriorLightingHE, !- Schedule Name + Watts/Area, !- Design Level Calculation Method + , !- Lighting Level {W} + 1.26962207647227, !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0, !- Return Air Fraction + 0.6, !- Fraction Radiant + 0.2, !- Fraction Visible + 0; !- Fraction Replaceable + + Lights, + Living Plug-in Lighting1, !- Name + living_unit1, !- Zone or ZoneList Name + InteriorLightingHE, !- Schedule Name + Watts/Area, !- Design Level Calculation Method + , !- Lighting Level {W} + 0.478467682251396, !- Watts per Zone Floor Area {W/m2} # From NREL's Seattle benchmark assumption 153 W for a 2160 ft2 building + , !- Watts per Person {W/person} + 0, !- Return Air Fraction + 0.6, !- Fraction Radiant + 0.2, !- Fraction Visible + 0; !- Fraction Replaceable + + !- =========== ALL OBJECTS IN CLASS: EXTERIOR:LIGHTS =========== + + Exterior:Lights, + Exterior-Lights_unit1, !- Name + ExteriorLighting, !- Schedule Name + 52.1797739245505, !- Design Level {W} + , !- Control Option + Exterior-Lights; !- End-Use Subcategory + + Exterior:Lights, + Garage-Lights_unit1, !- Name + InteriorLightingHE, !- Schedule Name + 8.64337749389251, !- Design Level {W} + , !- Control Option + Garage-Lights; !- End-Use Subcategory + + + Branch, + Mains Inlet Branch_unit1, !- Name + , !- Pressure Drop Curve Name + Pump:VariableSpeed, !- Component 1 Object Type + Mains Pressure_unit1, !- Component 1 Name + Mains Inlet Node_unit1, !- Component 1 Inlet Node Name + Mains Pressure Outlet Node_unit1; !- Component 1 Outlet Node Name + + + Branch, + DHW Supply Outlet Branch_unit1,!- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + DHW Supply Outlet Pipe_unit1, !- Component 1 Name + DHW Supply Outlet Pipe Inlet Node_unit1, !- Component 1 Inlet Node Name + DHW Supply Outlet Node_unit1; !- Component 1 Outlet Node Name + + + Branch, + DHW Demand Inlet Branch_unit1, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + DHW Demand Inlet Pipe_unit1, !- Component 1 Name + DHW Demand Inlet Node_unit1, !- Component 1 Inlet Node Name + DHW Demand Inlet Pipe Outlet Node_unit1; !- Component 1 Outlet Node Name + + + Branch, + Water Sink Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 2 Object Type + DHW Sinks_unit1, !- Component 2 Name + Water Sink Inlet Node_unit1, !- Component 2 Inlet Node Name + Water Sink outlet Node_unit1; !- Component 2 Outlet Node Name + + + Branch, + Water Shower Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 2 Object Type + DHW Showers_unit1, !- Component 2 Name + Water Shower Inlet Node_unit1, !- Component 2 Inlet Node Name + Water Shower Outlet Node_unit1;!- Component 2 Outlet Node Name + + Branch, + Water ClothesWasher Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 2 Object Type + DHW ClothesWasher_unit1, !- Component 2 Name + Water ClothesWasher Inlet Node_unit1, !- Component 2 Inlet Node Name + Water ClothesWasher Outlet Node_unit1; !- Component 2 Outlet Node Name + + Branch, + Water Dishwasher Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 2 Object Type + DHW DishWasher_unit1, !- Component 2 Name + Water DishWasher Inlet Node_unit1, !- Component 2 Inlet Node Name + Water DishWasher outlet Node_unit1; !- Component 2 Outlet Node Name + + Branch, + Water Bath Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterUse:Connections, !- Component 2 Object Type + DHW Baths_unit1, !- Component 2 Name + Water Bath Inlet Node_unit1, !- Component 2 Inlet Node Name + Water bath Outlet Node_unit1; !- Component 2 Outlet Node Name + + + Branch, + Mains Makeup Branch_unit1, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Mains Makeup Pipe_unit1, !- Component 1 Name + Mains Makeup Pipe Inlet Node_unit1, !- Component 1 Inlet Node Name + Mains Makeup Node_unit1; !- Component 1 Outlet Node Name + + + + !- =========== ALL OBJECTS IN CLASS: BRANCHLIST =========== + + + BranchList, + DHW Supply Branches_unit1, !- Name + Mains Inlet Branch_unit1, !- Branch 1 Name + Water Heater Branch_unit1, !- Branch 2 Name + DHW Supply Outlet Branch_unit1;!- Branch 3 Name + + BranchList, + DHW Demand Branches_unit1, !- Name + DHW Demand Inlet Branch_unit1, !- Branch 1 Name + Water Sink Branch_unit1, !- Branch 2 Name + Water Shower Branch_unit1, !- Branch 3 Name + Water ClothesWasher Branch_unit1, !- Branch 4 Name + Water Dishwasher Branch_unit1, !- Branch 5 Name + Water Bath Branch_unit1, !- Branch 6 Name + Mains Makeup Branch_unit1; !- Branch 7 Name + + + !- =========== ALL OBJECTS IN CLASS: CONNECTOR:SPLITTER =========== + + Connector:Splitter, + DHW Demand Splitter_unit1, !- Name + DHW Demand Inlet Branch_unit1, !- Inlet Branch Name + Water Sink Branch_unit1, !- Outlet Branch 1 Name + Water Shower Branch_unit1, !- Outlet Branch 2 Name + Water ClothesWasher Branch_unit1, !- Outlet Branch 3 Name + Water Dishwasher Branch_unit1, !- Outlet Branch 4 Name + Water Bath Branch_unit1; !- Outlet Branch 5 Name + + Connector:Splitter, + DHW Supply Splitter_unit1, !- Name + Mains Inlet Branch_unit1, !- Inlet Branch Name + Water Heater Branch_unit1; !- Outlet Branch 1 Name + + + !- =========== ALL OBJECTS IN CLASS: CONNECTOR:MIXER =========== + + Connector:Mixer, + DHW Demand Mixer_unit1, !- Name + Mains Makeup Branch_unit1, !- Outlet Branch Name + Water Sink Branch_unit1, !- Inlet Branch 1 Name + Water Shower Branch_unit1, !- Inlet Branch 2 Name + Water ClothesWasher Branch_unit1, !- Inlet Branch 3 Name + Water Dishwasher Branch_unit1, !- Inlet Branch 4 Name + Water Bath Branch_unit1; !- Inlet Branch 5 Name + + Connector:Mixer, + DHW Supply Mixer_unit1, !- Name + DHW Supply Outlet Branch_unit1,!- Outlet Branch Name + Water Heater Branch_unit1; !- Inlet Branch 1 Name + + + !- =========== ALL OBJECTS IN CLASS: CONNECTORLIST =========== + + ConnectorList, + DHW Demand Connectors_unit1, !- Name + Connector:Splitter, !- Connector 1 Object Type + DHW Demand Splitter_unit1, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + DHW Demand Mixer_unit1; !- Connector 2 Name + + ConnectorList, + DHW Supply Connectors_unit1, !- Name + Connector:Splitter, !- Connector 1 Object Type + DHW Supply Splitter_unit1, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + DHW Supply Mixer_unit1; !- Connector 2 Name + + + !- =========== ALL OBJECTS IN CLASS: PUMP:VARIABLESPEED =========== + + Pump:VariableSpeed, + Mains Pressure_unit1, !- Name + Mains Inlet Node_unit1, !- Inlet Node Name + Mains Pressure Outlet Node_unit1, !- Outlet Node Name + autosize, !- Rated Flow Rate {m3/s} + 1, !- Rated Pump Head {Pa} + 0, !- Rated Power Consumption {W} + 1, !- Motor Efficiency + 0, !- Fraction of Motor Inefficiencies to Fluid Stream + 0, !- Coefficient 1 of the Part Load Performance Curve + 1, !- Coefficient 2 of the Part Load Performance Curve + 0, !- Coefficient 3 of the Part Load Performance Curve + 0, !- Coefficient 4 of the Part Load Performance Curve + 0, !- Minimum Flow Rate {m3/s} + Intermittent; !- Pump Control Type + + + !- Definition of the DHW system... + + !- =========== ALL OBJECTS IN CLASS: WATERHEATER:MIXED =========== + + WaterHeater:Mixed, + Water Heater_unit1, !- Name + 0.196841372 , !- Tank Volume {m3} + dhw_setpt, !- Setpoint Temperature Schedule Name + 2, !- Deadband Temperature Difference {deltaC} + 50, !- Maximum Temperature Limit {C} + Cycle, !- Heater Control Type + autosize, !- Heater Maximum Capacity {W} + 0, !- Heater Minimum Capacity {W} + 0, !- Heater Ignition Minimum Flow Rate {m3/s} + , !- Heater Ignition Delay {s} + FuelOil#1, !- Heater Fuel Type + 0.8, !- Heater Thermal Efficiency + , !- Part Load Factor Curve Name + , !- Off Cycle Parasitic Fuel Consumption Rate {W} + , !- Off Cycle Parasitic Fuel Type + , !- Off Cycle Parasitic Heat Fraction to Tank + , !- On Cycle Parasitic Fuel Consumption Rate {W} + , !- On Cycle Parasitic Fuel Type + , !- On Cycle Parasitic Heat Fraction to Tank + Zone, !- Ambient Temperature Indicator + , !- Ambient Temperature Schedule Name + living_unit1, !- Ambient Temperature Zone Name + , !- Ambient Temperature Outdoor Air Node Name + 6.27714230487778, !- Off Cycle Loss Coefficient to Ambient Temperature {W/K} + 1, !- Off Cycle Loss Fraction to Zone + 6.27714230487778, !- On Cycle Loss Coefficient to Ambient Temperature {W/K} + 1, !- On Cycle Loss Fraction to Zone + 0, !- Peak Use Flow Rate {m3/s} + , !- Use Flow Rate Fraction Schedule Name + , !- Cold Water Supply Temperature Schedule Name + Water Heater use inlet node_unit1, !- Use Side Inlet Node Name + Water Heater use outlet node_unit1, !- Use Side Outlet Node Name + 1, !- Use Side Effectiveness + , !- Source Side Inlet Node Name + , !- Source Side Outlet Node Name + 1, !- Source Side Effectiveness + autosize, !- Use Side Design Flow Rate {m3/s} + 0, !- Source Side Design Flow Rate {m3/s} + 1.5; !- Indirect Water Heating Recovery Time {hr} + + + !- =========== ALL OBJECTS IN CLASS: WATERHEATER:SIZING =========== + + WaterHeater:Sizing, + Water Heater_unit1, !- WaterHeater Name + ResidentialHUD-FHAMinimum, !- Design Mode + , !- Time Storage Can Meet Peak Draw {hr} + , !- Time for Tank Recovery {hr} + , !- Nominal Tank Volume for Autosizing Plant Connections {m3} + 3, !- Number of Bedrooms + 3; !- Number of Bathrooms + + + Branch, + Water Heater Branch_unit1, !- Name + , !- Pressure Drop Curve Name + WaterHeater:Mixed, !- Component 1 Object Type + Water Heater_unit1, !- Component 1 Name + Water Heater Use Inlet Node_unit1, !- Component 1 Inlet Node Name + Water Heater Use Outlet Node_unit1; !- Component 1 Outlet Node Name + + !- =========== ALL OBJECTS IN CLASS: SIZING:PLANT =========== + + Sizing:Plant, + DHW Loop_unit1, !- Plant or Condenser Loop Name + Heating, !- Loop Type + 48.8888888888889, !- Design Loop Exit Temperature {C} + 5.55555555555556; !- Loop Design Temperature Difference {deltaC} + + !- =========== ALL OBJECTS IN CLASS: PLANTLOOP =========== + + PlantLoop, + DHW Loop_unit1, !- Name + Water, !- Fluid Type + , !- User Defined Fluid Type + DHW Loop Operation_unit1, !- Plant Equipment Operation Scheme Name + DHW Supply Outlet Node_unit1, !- Loop Temperature Setpoint Node Name + 100, !- Maximum Loop Temperature {C} + 0, !- Minimum Loop Temperature {C} + autosize, !- Maximum Loop Flow Rate {m3/s} + 0, !- Minimum Loop Flow Rate {m3/s} + autocalculate, !- Plant Loop Volume {m3} + Mains Inlet Node_unit1, !- Plant Side Inlet Node Name + DHW Supply Outlet Node_unit1, !- Plant Side Outlet Node Name + DHW Supply Branches_unit1, !- Plant Side Branch List Name + DHW Supply Connectors_unit1, !- Plant Side Connector List Name + DHW Demand Inlet Node_unit1, !- Demand Side Inlet Node Name + Mains Makeup Node_unit1, !- Demand Side Outlet Node Name + DHW Demand Branches_unit1, !- Demand Side Branch List Name + DHW Demand Connectors_unit1, !- Demand Side Connector List Name + Optimal; !- Load Distribution Scheme + + + !- =========== ALL OBJECTS IN CLASS: PIPE:ADIABATIC =========== + + Pipe:Adiabatic, + DHW Supply Outlet Pipe_unit1, !- Name + DHW Supply Outlet Pipe Inlet Node_unit1, !- Inlet Node Name + DHW Supply Outlet Node_unit1; !- Outlet Node Name + + + Pipe:Adiabatic, + Mains Makeup Pipe_unit1, !- Name + Mains Makeup Pipe Inlet Node_unit1, !- Inlet Node Name + Mains Makeup Node_unit1; !- Outlet Node Name + + + !- =========== ALL OBJECTS IN CLASS: PIPE:INDOOR =========== + + Pipe:Adiabatic, + DHW Demand Inlet Pipe_unit1, !- Name + DHW Demand Inlet Node_unit1, !- Inlet Node Name + DHW Demand Inlet Pipe Outlet Node_unit1; !- Outlet Node Name + + + + !- =========== ALL OBJECTS IN CLASS: PLANTEQUIPMENTLIST =========== + + PlantEquipmentList, + DHW Plant Equipment_unit1, !- Name + WaterHeater:Mixed, !- Equipment 1 Object Type + Water Heater_unit1; !- Equipment 1 Name + + + !- =========== ALL OBJECTS IN CLASS: PLANTEQUIPMENTOPERATION:HEATINGLOAD =========== + + PlantEquipmentOperation:HeatingLoad, + DHW Control Scheme_unit1, !- Name + 0.0, !- Load Range 1 Lower Limit {W} + 1000000000000000, !- Load Range 1 Upper Limit {W} + DHW Plant Equipment_unit1; !- Range 1 Equipment List Name + + + !- =========== ALL OBJECTS IN CLASS: PLANTEQUIPMENTOPERATIONSCHEMES =========== + + PlantEquipmentOperationSchemes, + DHW Loop Operation_unit1, !- Name + PlantEquipmentOperation:HeatingLoad, !- Control Scheme 1 Object Type + DHW Control Scheme_unit1, !- Control Scheme 1 Name + always_avail; !- Control Scheme 1 Schedule Name + + !- =========== ALL OBJECTS IN CLASS: SETPOINTMANAGER:SCHEDULED =========== + + SetpointManager:Scheduled, + DHW Loop Setpoint Manager_unit1, !- Name + Temperature, !- Control Variable + DHWSupplySetpoint, !- Schedule Name + DHW Supply Outlet Node_unit1; !- Setpoint Node or NodeList Name + + + !- =========== ALL OBJECTS IN CLASS: WATERUSE:EQUIPMENT =========== + + WaterUse:Equipment, + Clothes Washer_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 1.6219189818e-06, !- Peak Flow Rate {m3/s} + ClothesWasher, !- Flow Rate Fraction Schedule Name + CWWaterTempSchedule; !- Target Temperature Schedule Name + + WaterUse:Equipment, + Dishwasher_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 6.36685353e-07, !- Peak Flow Rate {m3/s} + Dishwasher, !- Flow Rate Fraction Schedule Name + DWWaterTempSchedule; !- Target Temperature Schedule Name + + WaterUse:Equipment, + Sinks_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 7.1934e-05, !- Peak Flow Rate {m3/s} + BA_sink_sch, !- Flow Rate Fraction Schedule Name + SSBWaterTempSchedule; !- Target Temperature Schedule Name + + WaterUse:Equipment, + Showers_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 0.000141975, !- Peak Flow Rate {m3/s} + BA_shower_sch, !- Flow Rate Fraction Schedule Name + SSBWaterTempSchedule; !- Target Temperature Schedule Name + + WaterUse:Equipment, + Baths_unit1, !- Name + Domestic Hot Water, !- End-Use Subcategory + 0.00027764, !- Peak Flow Rate {m3/s} + BA_bath_sch, !- Flow Rate Fraction Schedule Name + SSBWaterTempSchedule; !- Target Temperature Schedule Name + + + !- =========== ALL OBJECTS IN CLASS: WATERUSE:CONNECTIONS =========== + + WaterUse:Connections, + DHW Sinks_unit1, !- Name + Water Sink Inlet Node_unit1, !- Inlet Node Name + Water Sink Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Sinks_unit1; !- Water Use Equipment 1 Name + + WaterUse:Connections, + DHW Showers_unit1, !- Name + Water Shower Inlet Node_unit1, !- Inlet Node Name + Water Shower Outlet Node_unit1,!- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Showers_unit1; !- Water Use Equipment 1 Name + + WaterUse:Connections, + DHW ClothesWasher_unit1, !- Name + Water ClothesWasher Inlet Node_unit1, !- Inlet Node Name + Water ClothesWasher Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Clothes Washer_unit1; !- Water Use Equipment 1 Name + + WaterUse:Connections, + DHW DishWasher_unit1, !- Name + Water DishWasher Inlet Node_unit1, !- Inlet Node Name + Water DishWasher Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Dishwasher_unit1; !- Water Use Equipment 1 Name + + WaterUse:Connections, + DHW Baths_unit1, !- Name + Water Bath Inlet Node_unit1, !- Inlet Node Name + Water Bath Outlet Node_unit1, !- Outlet Node Name + , !- Supply Water Storage Tank Name + , !- Reclamation Water Storage Tank Name + , !- Hot Water Supply Temperature Schedule Name + , !- Cold Water Supply Temperature Schedule Name + None, !- Drain Water Heat Exchanger Type + , !- Drain Water Heat Exchanger Destination + , !- Drain Water Heat Exchanger U-Factor Times Area {W/K} + Baths_unit1; !- Water Use Equipment 1 Name + + + + + +Output:VariableDictionary, + Regular; !- Key Field + + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:CONSTRUCTIONS =========== + +Output:Constructions, + Constructions, !- Details Type 1 + Materials; !- Details Type 2 + + +!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:SUMMARYREPORTS =========== + +Output:Table:SummaryReports, + InputVerificationandResultsSummary, !- Report 2 Name + EquipmentSummary, !- Report 3 Name + ClimaticDataSummary, !- Report 4 Name + EnvelopeSummary, !- Report 5 Name + AllSummary; !- Report 6 Name + +!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:TABLE:STYLE =========== + +OutputControl:Table:Style, + CommaAndHTML, !- Column Separator + InchPound; !- Unit Conversion + + +Output:Table:Monthly, + FanSplit, !- Name + 3, !- Digits After Decimal + Air System Cooling Coil Total Cooling Energy, !- Variable or Meter 1 Name + HoursNonZero, !- Aggregation Type for Variable or Meter 1 + Air System Fan Electric Energy, !- Variable or Meter 2 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 2 + Air System Heating Coil Total Heating Energy, !- Variable or Meter 3 Name + HoursNonZero, !- Aggregation Type for Variable or Meter 3 + Air System Fan Electric Energy, !- Variable or Meter 4 Name + SumOrAverageDuringHoursShown, !- Aggregation Type for Variable or Meter 4 + Air System Fan Electric Energy, !- Variable or Meter 5 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 5 + +Output:Table:Monthly, + CoilLoads, !- Name + 2, !- Digits After Decimal + Heating Coil Total Heating Rate , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Heating Coil Air Heating Rate , !- Variable or Meter 2 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 2 + Cooling Coil Total Cooling Rate , !- Variable or Meter 3 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 3 + +Output:Table:Monthly, + Water Heater: Loads, !- Name + 2, !- Digits After Decimal + Water Heater Total Demand Rate , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Water Heater Total Demand Energy , !- Variable or Meter 2 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 2 + Water Heater Heating Rate , !- Variable or Meter 3 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 3 + Water Heater Heating Energy , !- Variable or Meter 4 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 4 + +Output:Table:Monthly, + Heating and Cooling Loads, !- Name + 2, !- Digits After Decimal + Zone/Sys Sensible Cooling Energy , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Zone/Sys Sensible Heating Energy , !- Variable or Meter 2 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 2 + +Output:Table:Monthly, + Lighting Loads, !- Name + 2, !- Digits After Decimal + Zone Lights Electric Consumption , !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 +Exterior Lights Electric Consumption , !- Variable or Meter 2 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 2 + +Output:Table:Monthly, + InternalGains, !- Name + 2, !- Digits After Decimal + Zone People Total Heat Gain, !- Variable or Meter 1 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 1 + Zone Lights Total Heat Gain, !- Variable or Meter 2 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 2 + Zone Electric Equipment Total Heat Gain, !- Variable or Meter 3 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 3 + Zone Gas Equipment Total Heat Gain, !- Variable or Meter 4 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 4 + Zone Other Equipment Total Heat Gain, !- Variable or Meter 5 Name + SumOrAverage, !- Aggregation Type for Variable or Meter 5 + Zone Total Internal Total Heat Gain, !- Variable or Meter 6 Name + SumOrAverage; !- Aggregation Type for Variable or Meter 6 + + +! GPARM parameters as run: +! ID = SF+CZ5AWH+USA_IL_Chicago-OHare.Intl.AP.725300+oilfurnace+slab+IECC_2012 +! weatherfile = USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw +! climate_zone = 5 +! moisture_regime = A +! humidity_designation = +! tropical_designation = +! bldg_type = Single-Family +! fndn_type = slab +! system_tag = Oil Furnace +! code = IECC_2012 +! permits = 801.989159 +! cfm25 = 4 +! dhw_type = storage + +! Default values: +! ach50 = 3 +! afue = 0.78 +! heating_coil = +! heating_fuel = oil +! hspf = +! leakage_ratio = 0.0800476229991763 +! seer = +! system = acandfurnace +! ua_si = 6.27714230487778 + +! GPARM computed values: +! cfa_per_unit = 2376 +! ela = 55.3975339640825 +! f_cfl_hw = 0.62 +! f_inc_hw = 0.25 +! f_led_hw = 0 +! f_lf_hw = 0.13 +! gtp_filename = +! internal_gains = 86760.8 +! internal_gains_W = 1059.19523390956 +! internal_gains_kWhyr = 9278.55024904776 +! long_dim = 39.7994974842648 +! ltg_exterior = 228.547409789531 +! ltg_exterior_benchmark = 344.52 +! ltg_garage = 26.53516890625 +! ltg_garage_benchmark = 40 +! ltg_hardwired = 860.6904930161 +! ltg_hw_benchmark = 1297.4336 +! ltg_plugin = 324.3584 +! ltg_plugin_benchmark = 324.3584 +! n_bedrooms = 3 +! n_ppl = 3 +! short_dim = 29.8496231131986 +! window_area = 355.236927696469 + +! Code requirements: IECC_2012 +! r_bsmtwall = 19 +! r_ceiling = 49 +! r_crawlwall = 19 +! r_floor = 30 +! r_masswall = 13 +! r_sheathing = 0 +! r_slab = 10 +! r_wall = 20 +! shgc_skylight = 0.4 +! shgc_window = 0.4 +! u_skylight = 0.55 +! u_window = 0.32 +! GPARM parameters as run: +! ID = SF+CZ5AWH+USA_IL_Chicago-OHare.Intl.AP.725300+oilfurnace+slab+IECC_2012 +! weatherfile = USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw +! climate_zone = 5 +! moisture_regime = A +! humidity_designation = +! tropical_designation = +! bldg_type = Single-Family +! fndn_type = slab +! system_tag = Oil Furnace +! code = IECC_2012 +! permits = 801.989159 +! cfm25 = 4 +! dhw_type = storage + +! ===================================================== +! Report on template variables +! +! ----------------------------- +! Variables changed in template: +! ----------------------------- +! +! ERRNO: 'Inappropriate ioctl for device' --> '' +! EXTENDED_OS_ERROR: 'Inappropriate ioctl for device' --> '' +! OS_ERROR: 'Inappropriate ioctl for device' --> '' +! climate_zone: 'Climate Zone 5' --> '5' +! dhw_type: '' --> 'storage' +! fndn_type: 'Slab' --> 'slab' +! humidity_designation: 'Not Warm-Humid' --> '' +! moisture_regime: 'Moist' --> 'A' +! tropical_designation: 'Not Tropical' --> '' +! +! --------------------------------- +! New variables created in template: +! --------------------------------- +! +! LPD_hardwired: '1.26962207647227' +! LPD_plugin: '0.478467682251396' +! SAF: '0.893359375' +! SAF_ext: '0.893359375' +! SAF_gar: '0.893359375' +! S_overhang: '0.0152439024390244' +! S_overhang_pf: '0.01' +! TEMPLATE_PATH: '/projects/bigsim/resstd/res.template/energyplus/v8.6' +! ach50: '3' +! afn_control: 'MultizoneWithoutDistribution' +! afue: '0.78' +! aspect_ratio: '1.33333333333333' +! atticvent: '370' +! bath_gpm: '4.4' +! bath_peak_flow: '0.00027764' +! bldg_azimuth: '0' +! branch_tag: 'AirLoopHVAC:UnitaryHeatCool' +! ceil_insulation: 'fiberglass_blown' +! ceiling_framing_fraction: '0.07' +! ceiling_ht: '2.59146341463415' +! cfa_per_unit: '2376' +! cfa_total: '220.817843866171' +! clotheswasher_peak_flow: '1.6219189818e-06' +! cond_crawlspace: 'no' +! cop_cooling: '3.97008850025305' +! cop_heating: '3.77123249705183' +! crawl_depth: '4' +! crawlvent: '370' +! daily_bath_gal: '7.01' +! daily_shower_gal: '28.01' +! daily_sink_gal: '24.98' +! dhw_heater_control: 'Cycle' +! dhw_heater_eff: '0.8' +! dhw_multiplier: '0.9' +! dhw_pipe_const: 'Insulated pipe' +! dhw_pipe_loc_unit: 'living_unit1' +! dhw_savings_factor: '0.1' +! dhw_setpt_sch: 'dhw_setpt' +! dhw_source_fuel: 'FuelOil#1' +! dhw_tank_size: '52' +! dhw_tank_size_SI: '0.196841372' +! dishwasher_peak_flow: '6.36685353e-07' +! door_area: '3.71747211895911' +! door_ht: '2.13414634146341' +! door_ldb_l: '1.74190122145513' +! door_t: '0.0396277251435213' +! duct_loc: 'attic' +! ef: '0.5803' +! ela: '55.3975339640825' +! ela_sqcm: '357.402730122675' +! erv: 'no' +! estar_appl: 'none' +! ext_ltg_control: '' +! ext_ltg_sch: 'ExteriorLighting' +! ext_wall_type: 'wood_framed' +! f_cfl_ext: '0.62' +! f_cfl_gar: '0.62' +! f_cfl_hw: '0.62' +! f_inc_ext: '0.25' +! f_inc_gar: '0.25' +! f_inc_hw: '0.25' +! f_led_ext: '0' +! f_led_gar: '0' +! f_led_hw: '0' +! f_lf_ext: '0.13' +! f_lf_gar: '0.13' +! f_lf_hw: '0.13' +! fan_eff: '0.58' +! fan_power_per_ton: '138' +! fan_total_eff: '0.377' +! fndn_zone: 'living' +! fndn_zone_unit: 'living_unit1' +! foundn_depth: '0' +! fraction_ceil_under_attic: '0.7' +! framing: 'hardwood' +! framing_fraction: '1' +! gain_ppl: '2120.48051567536' +! gar_ltg_sch: 'InteriorLightingHE' +! garage_area: '400' +! gtp_filename: '' +! gtp_ref_floor: 'GroundSlabPreprocessorAverage' +! gtp_ref_floor_obj: 'surfPropOthSdCoefSlabAverage' +! has_ext_ltg_control: 'no' +! has_occ_sensors: 'no' +! has_ventilation: 'yes' +! heating_coil: 'Fuel' +! heating_fuel: 'naturalgas' +! hers_dhw_gains_W: '1.04420541093893' +! house: 'sitebuilt' +! hrv: 'no' +! hspf: '8.2' +! hvac_type: 'acandfurnace' +! hw_ltg_sch: 'InteriorLightingHE' +! iecc_mels_adj_W_m2: '1.54356736989469' +! iecc_mels_adj_kWhyr: '1515.4067333724' +! ins_sheathing: 'eps' +! is_HRef: 'no' +! is_HRtd: 'no' +! is_ISRD: 'yes' +! leakage_ratio: '0.0800476229991763' +! long_dim: '39.7994974842648' +! ltg_exterior: '228.547409789531' +! ltg_exterior_W: '52.1797739245505' +! ltg_exterior_benchmark: '344.52' +! ltg_garage: '26.53516890625' +! ltg_garage_W: '8.64337749389251' +! ltg_garage_benchmark: '40' +! ltg_hardwired: '860.6904930161' +! ltg_hw_benchmark: '1297.4336' +! ltg_plugin: '324.3584' +! ltg_plugin_benchmark: '324.3584' +! ltg_usage_factor: '0.3504557' +! max_dhw_temp: '50' +! max_supply: '0.56034' +! misc_eqpmt2_type: 'GasEquipment' +! motor_eff: '0.65' +! my_coil_type: 'Coil:Cooling:DX:SingleSpeed' +! my_coil_type_heating: 'Coil:Heating:DX:SingleSpeed' +! n_bedrooms: '3' +! n_doors: '1' +! n_ppl: '3' +! n_stories_per_unit: '2' +! n_units: '1' +! n_units_modeled: '1' +! option: '' +! p: '36000' +! pipe_ins_R: '2' +! pipe_ins_k_SI: '0.03317175' +! pipe_ins_thickness_SI: '0.0127032520325203' +! plugin_ltg_sch: 'InteriorLightingHE' +! plugload_usage_factor: '0.67553' +! prototype: 'singlefamily' +! r_bsmtwall: '19' +! r_ceiling: '49' +! r_crawlwall: '19' +! r_duct: '8' +! r_fiberglass_blown: '2.5' +! r_floor: '30' +! r_masswall: '13' +! r_returnduct: '6' +! r_sheathing: '0' +! r_slab: '10' +! r_slab_depth: '1.5' +! r_wall: '20' +! re: '0.78' +! roof_const: 'Gable_end' +! roof_pitch: '0.333333333333333' +! roof_pk_ht: '1.51663636828541' +! roof_surface: 'Wall' +! runbsmt: 'no' +! runslab: 'yes' +! seer: '13' +! semi_conditioned: 'no' +! sensitivity_analysis: 'no' +! shading_frac: '0' +! shgc_skylight: '0.4' +! shgc_window: '0.4' +! short_dim: '29.8496231131986' +! shower_gpm: '2.25' +! shower_peak_flow: '0.000141975' +! sink_gpm: '1.14' +! sink_peak_flow: '7.1934e-05' +! source_inlet_node: '' +! source_outlet_node: '' +! stack_coeff: '0.00029' +! statfile: 'USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.stat' +! style_ceiling: 'attic' +! style_roof: 'gable' +! thermostat_setpt: 'iecc' +! u_door: '0.32' +! u_duct_SI: '0.709825' +! u_returnduct_SI: '0.946433333333333' +! u_skylight: '0.55' +! u_window: '0.32' +! ua: '11.9184100942714' +! ua_si: '6.27714230487778' +! unit_id: '1' +! vent_cfm: '60' +! vent_clearance: '0.001' +! vent_cms: '0.0283168464628752' +! vent_sch: 'always_avail' +! wall_ht: '8.5' +! waterheater_loc_unit: 'living_unit1' +! weatherdir: '/projects/bigsim/weather/EnergyPlus/tmy3.new/all' +! wind_coeff: '0.000231' +! window_dist: 'equal' +! window_ht: '1.52439024390244' +! window_ldb_l: '2.70719591738945' +! window_ldf_l: '2.70719591738945' +! window_sdl_l: '2.70719591738945' +! window_sdr_l: '2.70719591738945' +! wwr: '0.15' +! +! ASHRAE_2007R_path1: 'CODE(0x1e2cd50)' +! ASHRAE_2007R_path2: 'CODE(0x1f4d928)' +! ASHRAE_2007R_path3: 'CODE(0x1dafd08)' +! ASHRAE_2007R_path4: 'CODE(0x1e50630)' +! IECC_2004: 'CODE(0x1d95f20)' +! IECC_2006: 'CODE(0x1aa6980)' +! IECC_2009: 'CODE(0x19c84b8)' +! IECC_2012: 'CODE(0x1e96450)' +! IECC_2015: 'CODE(0x19946a0)' +! IECC_2018: 'CODE(0x1d18298)' +! Material: 'CODE(0x1e02ea0)' +! R_THICKNESS: 'CODE(0x1d68dc8)' +! as_restricted: 'CODE(0x1d9d1b0)' +! cmu_block: 'CODE(0x199c0e8)' +! globals_top: 'HASH(0x1e58048)' +! icf: 'CODE(0x1e50af8)' +! ip2si: 'CODE(0x1e9c9d0)' +! mat_batt_consol: 'CODE(0x1d69320)' +! mat_batt_consol_ext_ag_wall: 'CODE(0x1f1b890)' +! mat_batt_consol_wall: 'CODE(0x18a3f18)' +! mat_blown_consol: 'CODE(0x1a09c98)' +! mat_foam: 'CODE(0x1f2cbe8)' +! mat_sheath_consol: 'CODE(0x1a9a3e8)' +! ===================================================== + diff --git a/tests/input_data/schedules/schedules.idf b/tests/input_data/schedules/schedules.idf index b9ca8aa1..726561d6 100644 --- a/tests/input_data/schedules/schedules.idf +++ b/tests/input_data/schedules/schedules.idf @@ -137,13 +137,6 @@ 1, !- Upper Limit Value DISCRETE; !- Numeric Type - ScheduleTypeLimits, - On/Off, !- Name - 0, !- Lower Limit Value - 1, !- Upper Limit Value - DISCRETE, !- Numeric Type - Availability; !- Unit Type - ScheduleTypeLimits, Percent, !- Name 0, !- Lower Limit Value diff --git a/tests/input_data/trnsys/Building.b18 b/tests/input_data/trnsys/Building.b18 deleted file mode 100644 index 93038951..00000000 --- a/tests/input_data/trnsys/Building.b18 +++ /dev/null @@ -1,655 +0,0 @@ -************************************************************************************************************************ -* TRNBuild 2.0.198 -************************************************************************************************************************ -* BUILDING DESCRIPTIONS FILE TRNSYS -* FOR BUILDING: /Users/samuelduchesne/Dropbox/Polytechnique/Doc/software/archetypal/tests/input_data/trnsys/Building.b18 -* GET BY WORKING WITH TRNBuild 2.0 for Windows -************************************************************************************************************************ -* -*----------------------------------------------------------------------------------------------------------------------- -* C o m m e n t s -*----------------------------------------------------------------------------------------------------------------------- -*#C Originally created by TRNSIDF Version 1.74 -*#C Generated with the template 3_office_basedon_SIA2024 -*#C -*#C Assumptions made: - electric power fraction (ELPOWERFRAC) of HEATING, COOLING and VENTILATION = 0 -*#C - electric power fraction (ELPOWERFRAC) of GAINs Devices and Lighting = 1 -*#C - daylight control strategies use ILLMODE=1 : VALUE=2 : ILLSETPOINT1=500 : ILLSETPOINT2=300 : CNTRLMODE=2 : MINPFAC=0.2 : MINLFAC=0.2 -*#C - HEATING night setback to 16C -*#C - COOLING switched of for non occupied periods -*#C - -* -*----------------------------------------------------------------------------------------------------------------------- -* 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 -*----------------------------------------------------------------------------------------------------------------------- -LAYER PUTZ - CONDUCTIVITY= 2.52 : CAPACITY= 1 : DENSITY= 1400 : PERT= 0 : PENRT= 0 -LAYER KST - CONDUCTIVITY= 3.564 : CAPACITY= 1 : DENSITY= 1600 : PERT= 0 : PENRT= 0 -LAYER DAEMA - CONDUCTIVITY= 0.173 : CAPACITY= 1 : DENSITY= 60 : PERT= 0 : PENRT= 0 -LAYER GIPS - CONDUCTIVITY= 0.756 : CAPACITY= 1 : DENSITY= 900 : PERT= 0 : PENRT= 0 -LAYER HOLZ - CONDUCTIVITY= 0.468 : CAPACITY= 2.1 : DENSITY= 600 : PERT= 0 : PENRT= 0 -LAYER BET - CONDUCTIVITY= 7.56 : CAPACITY= 1 : DENSITY= 2200 : PERT= 0 : PENRT= 0 -LAYER TEPP - CONDUCTIVITY= 0.288 : CAPACITY= 1.3 : DENSITY= 700 : PERT= 0 : PENRT= 0 -LAYER ESTR - CONDUCTIVITY= 5.04 : CAPACITY= 1 : DENSITY= 2000 : PERT= 0 : PENRT= 0 -LAYER MIWO - CONDUCTIVITY= 0.144 : CAPACITY= 1 : DENSITY= 60 : PERT= 0 : PENRT= 0 -LAYER DAEMM - CONDUCTIVITY= 0.144 : CAPACITY= 1 : DENSITY= 60 : PERT= 0 : PENRT= 0 -*----------------------------------------------------------------------------------------------------------------------- -* I n p u t s -*----------------------------------------------------------------------------------------------------------------------- -INPUTS TGROUND TBOUNDARY SHADE_CLOSE SHADE_OPEN MAX_ISHADE MAX_ESHADE -INPUTS_DESCRIPTION - TGROUND : C : Ground Temperature (boundary temperature used for floors adjacent to the ground) - 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 -*----------------------------------------------------------------------------------------------------------------------- -SCHEDULE Occ_MoFr_31office - HOURS =0.000 7.000 8.000 9.000 10.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 - VALUES=0 0.2 0.6 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0 0 -SCHEDULE Occ_SaSu_31office - HOURS =0.000 24.0 - VALUES=0 0 -SCHEDULE Dev_MoFr_31office - HOURS =0.000 7.000 8.000 9.000 10.000 11.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 - VALUES=0.1 0.2 0.6 0.8 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0.1 0.1 -SCHEDULE Dev_SaSu_31office - HOURS =0.000 24.0 - VALUES=0.1 0.1 -SCHEDULE Opr_MoFr_31office - HOURS =0.000 7.000 18.000 24.0 - VALUES=0 1. 0 0 -SCHEDULE Opr_SaSu_31office - HOURS =0.000 24.0 - VALUES=0 0 -SCHEDULE Occ_MoFr_32office - HOURS =0.000 7.000 8.000 9.000 10.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 - VALUES=0 0.2 0.6 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0 0 -SCHEDULE Occ_SaSu_32office - HOURS =0.000 24.0 - VALUES=0 0 -SCHEDULE Dev_MoFr_32office - HOURS =0.000 7.000 8.000 9.000 10.000 11.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 - VALUES=0.1 0.2 0.6 1. 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0.1 0.1 -SCHEDULE Dev_SaSu_32office - HOURS =0.000 24.0 - VALUES=0.1 0.1 -SCHEDULE Opr_MoFr_32office - HOURS =0.000 7.000 18.000 24.0 - VALUES=0 1. 0 0 -SCHEDULE Opr_SaSu_32office - HOURS =0.000 24.0 - VALUES=0 0 -SCHEDULE Occ_MoFr_33meeting - HOURS =0.000 9.000 10.000 11.000 12.000 14.000 15.000 16.000 17.000 24.0 - VALUES=0 0.6 1. 0.4 0 0.6 1. 0.4 0 0 -SCHEDULE Occ_SaSu_33meeting - HOURS =0.000 24.0 - VALUES=0 0 -SCHEDULE Dev_MoFr_33meeting - HOURS =0.000 9.000 10.000 11.000 12.000 14.000 15.000 16.000 17.000 24.0 - VALUES=0.1 0.6 1. 0.4 0.1 0.6 1. 0.4 0.1 0.1 -SCHEDULE Dev_SaSu_33meeting - HOURS =0.000 24.0 - VALUES=0.1 0.1 -SCHEDULE Opr_MoFr_33meeting - HOURS =0.000 7.000 18.000 24.0 - VALUES=0 1. 0 0 -SCHEDULE Opr_SaSu_33meeting - HOURS =0.000 24.0 - VALUES=0 0 -SCHEDULE Occ_MoFr_34Reception - HOURS =0.000 7.000 8.000 9.000 10.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 - VALUES=0 0.2 0.6 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0 0 -SCHEDULE Occ_SaSu_34Reception - HOURS =0.000 24.0 - VALUES=0 0 -SCHEDULE Dev_MoFr_34Reception - HOURS =0.000 7.000 8.000 9.000 10.000 11.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 - VALUES=0.1 0.2 0.6 0.8 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0.1 0.1 -SCHEDULE Dev_SaSu_34Reception - HOURS =0.000 24.0 - VALUES=0.1 0.1 -SCHEDULE Opr_MoFr_34reception - HOURS =0.000 7.000 18.000 24.0 - VALUES=0 1. 0 0 -SCHEDULE Opr_SaSu_34reception - HOURS =0.000 24.0 - VALUES=0 0 -SCHEDULE Occ_Weekly_31office - DAYS=1 2 3 4 5 6 7 - HOURLY=Occ_MoFr_31office Occ_MoFr_31office Occ_MoFr_31office Occ_MoFr_31office Occ_MoFr_31office Occ_SaSu_31office Occ_SaSu_31office -SCHEDULE Dev_Weekly_31office - DAYS=1 2 3 4 5 6 7 - HOURLY=Dev_MoFr_31office Dev_MoFr_31office Dev_MoFr_31office Dev_MoFr_31office Dev_MoFr_31office Dev_SaSu_31office Dev_SaSu_31office -SCHEDULE Opr_Weekly_31office - DAYS=1 2 3 4 5 6 7 - HOURLY=Opr_MoFr_31office Opr_MoFr_31office Opr_MoFr_31office Opr_MoFr_31office Opr_MoFr_31office Opr_SaSu_31office Opr_SaSu_31office -SCHEDULE Occ_Weekly_32office - DAYS=1 2 3 4 5 6 7 - HOURLY=Occ_MoFr_32office Occ_MoFr_32office Occ_MoFr_32office Occ_MoFr_32office Occ_MoFr_32office Occ_SaSu_32office Occ_SaSu_32office -SCHEDULE Dev_Weekly_32office - DAYS=1 2 3 4 5 6 7 - HOURLY=Dev_MoFr_32office Dev_MoFr_32office Dev_MoFr_32office Dev_MoFr_32office Dev_MoFr_32office Dev_SaSu_32office Dev_SaSu_32office -SCHEDULE Opr_Weekly_32office - DAYS=1 2 3 4 5 6 7 - HOURLY=Opr_MoFr_32office Opr_MoFr_32office Opr_MoFr_32office Opr_MoFr_32office Opr_MoFr_32office Opr_SaSu_32office Opr_SaSu_32office -SCHEDULE Occ_Weekly_33meeting - DAYS=1 2 3 4 5 6 7 - HOURLY=Occ_MoFr_33meeting Occ_MoFr_33meeting Occ_MoFr_33meeting Occ_MoFr_33meeting Occ_MoFr_33meeting Occ_SaSu_33meeting Occ_SaSu_33meeting -SCHEDULE Dev_Weekly_33meeting - DAYS=1 2 3 4 5 6 7 - HOURLY=Dev_MoFr_33meeting Dev_MoFr_33meeting Dev_MoFr_33meeting Dev_MoFr_33meeting Dev_MoFr_33meeting Dev_SaSu_33meeting Dev_SaSu_33meeting -SCHEDULE Opr_Weekly_33meeting - DAYS=1 2 3 4 5 6 7 - HOURLY=Opr_MoFr_33meeting Opr_MoFr_33meeting Opr_MoFr_33meeting Opr_MoFr_33meeting Opr_MoFr_33meeting Opr_SaSu_33meeting Opr_SaSu_33meeting -SCHEDULE Occ_Weekly_34reception - DAYS=1 2 3 4 5 6 7 - HOURLY=Occ_MoFr_34Reception Occ_MoFr_34Reception Occ_MoFr_34Reception Occ_MoFr_34Reception Occ_MoFr_34Reception Occ_SaSu_34Reception Occ_SaSu_34Reception -SCHEDULE Dev_Weekly_34reception - DAYS=1 2 3 4 5 6 7 - HOURLY=Dev_MoFr_34Reception Dev_MoFr_34Reception Dev_MoFr_34Reception Dev_MoFr_34Reception Dev_MoFr_34Reception Dev_SaSu_34Reception Dev_SaSu_34Reception -SCHEDULE Opr_Weekly_34reception - DAYS=1 2 3 4 5 6 7 - HOURLY=Opr_MoFr_34reception Opr_MoFr_34reception Opr_MoFr_34reception Opr_MoFr_34reception Opr_MoFr_34reception Opr_SaSu_34reception Opr_SaSu_34reception -SCHEDULE Occ_Annual_31office - HOURS =0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES=0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 -SCHEDULE Occ_Annual_32office - HOURS =0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES=0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 -SCHEDULE Occ_Annual_33meeting - HOURS =0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES=0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 -SCHEDULE Occ_Annual_34reception - HOURS =0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES=0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 -*----------------------------------------------------------------------------------------------------------------------- -* C O N S T R U C T I O N (Wall, Floor, Ceiling,..) -*----------------------------------------------------------------------------------------------------------------------- -CONSTRUCTION BND_WALL - LAYERS = PUTZ KST DAEMA GIPS - THICKNESS= 0.015 0.175 0.173 0.013 - ABS-FRONT= 0.4 : ABS-BACK= 0.5 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 64 -CONSTRUCTION EXT_WALL - LAYERS = PUTZ KST DAEMA HOLZ - THICKNESS= 0.015 0.175 0.167 0.02 - ABS-FRONT= 0.4 : ABS-BACK= 0.5 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 64 -CONSTRUCTION EXT_ROOF - LAYERS = PUTZ BET DAEMM HOLZ - THICKNESS= 0.015 0.16 0.305 0.02 - ABS-FRONT= 0.1 : ABS-BACK= 0.5 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 64 -CONSTRUCTION EXT_FLOOR - LAYERS = TEPP ESTR MIWO BET DAEMA - THICKNESS= 0.005 0.05 0.03 0.16 0.162 - ABS-FRONT= 0.8 : ABS-BACK= 0.5 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 64 -CONSTRUCTION BND_CEILING - LAYERS = PUTZ BET DAEMA HOLZ - THICKNESS= 0.015 0.16 0.3 0.03 - ABS-FRONT= 0.1 : ABS-BACK= 0.5 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 64 -CONSTRUCTION BND_FLOOR - LAYERS = TEPP ESTR MIWO BET DAEMA GIPS - THICKNESS= 0.005 0.05 0.03 0.16 0.133 0.013 - ABS-FRONT= 0.8 : ABS-BACK= 0.5 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 64 -CONSTRUCTION GROUND_FLOOR - LAYERS = TEPP ESTR DAEMM BET - THICKNESS= 0.005 0.05 0.121 0.2 - ABS-FRONT= 0.8 : ABS-BACK= 0.5 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 0.001 -CONSTRUCTION ADJ_WALL - LAYERS = GIPS MIWO GIPS - THICKNESS= 0.013 0.1 0.013 - ABS-FRONT= 0.4 : ABS-BACK= 0.5 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 11 -CONSTRUCTION ADJ_CEILING - LAYERS = PUTZ BET MIWO ESTR TEPP - THICKNESS= 0.015 0.16 0.03 0.05 0.005 - ABS-FRONT= 0.1 : ABS-BACK= 0.5 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 11 -*----------------------------------------------------------------------------------------------------------------------- -* W i n d o w s -*----------------------------------------------------------------------------------------------------------------------- -WINDOW EXT_WINDOW1 - WINID=201 : HINSIDE=11 : HOUTSIDE=64 : SLOPE=-999 : SPACID=4 : WWID=0.77 : WHEIG=1.08 : FFRAME=0.15 : UFRAME=8.17 : ABSFRAME=0.6 : RISHADE=0 : RESHADE=0 : REFLISHADE=0.5 : REFLOSHADE=0.5 : CCISHADE=0.5 : EPSFRAME=0.9 : EPSISHADE=0.9 : ITSHADECLOSE=648 : ITSHADEOPEN=576 : FLOWTOAIRNODE=1 : PERT=0 : PENRT=0 : RADMATERIAL=undefined : RADMATERIAL_SHD1=undefined -WINDOW EXT_WINDOW2 - WINID=201 : HINSIDE=11 : HOUTSIDE=64 : SLOPE=-999 : SPACID=4 : WWID=0.77 : WHEIG=1.08 : FFRAME=0.15 : UFRAME=8.17 : ABSFRAME=0.6 : RISHADE=0 : RESHADE=0 : REFLISHADE=0.5 : REFLOSHADE=0.5 : CCISHADE=0.5 : EPSFRAME=0.9 : EPSISHADE=0.9 : ITSHADECLOSE=648 : ITSHADEOPEN=576 : FLOWTOAIRNODE=1 : PERT=0 : PENRT=0 : RADMATERIAL=undefined : RADMATERIAL_SHD1=undefined -WINDOW ADJ_WINDOW1 - WINID=201 : HINSIDE=11 : HOUTSIDE=64 : SLOPE=-999 : SPACID=4 : WWID=0.77 : WHEIG=1.08 : FFRAME=0.15 : UFRAME=8.17 : ABSFRAME=0.6 : RISHADE=0 : RESHADE=0 : REFLISHADE=0.5 : REFLOSHADE=0.5 : CCISHADE=0.5 : EPSFRAME=0.9 : EPSISHADE=0.9 : ITSHADECLOSE=648 : ITSHADEOPEN=576 : FLOWTOAIRNODE=1 : PERT=0 : PENRT=0 : RADMATERIAL=undefined : RADMATERIAL_SHD1=undefined -WINDOW ADJ_WINDOW2 - WINID=201 : HINSIDE=11 : HOUTSIDE=64 : SLOPE=-999 : SPACID=4 : WWID=0.77 : WHEIG=1.08 : FFRAME=0.15 : UFRAME=8.17 : ABSFRAME=0.6 : RISHADE=0 : RESHADE=0 : REFLISHADE=0.5 : REFLOSHADE=0.5 : CCISHADE=0.5 : EPSFRAME=0.9 : EPSISHADE=0.9 : ITSHADECLOSE=648 : ITSHADEOPEN=576 : FLOWTOAIRNODE=1 : PERT=0 : PENRT=0 : RADMATERIAL=undefined : RADMATERIAL_SHD1=undefined -*----------------------------------------------------------------------------------------------------------------------- -* G a i n s -*----------------------------------------------------------------------------------------------------------------------- -GAIN Occ_31office - CONVECTIVE=9 : RADIATIVE=9 : HUMIDITY=0.0055 : ELPOWERFRAC=0 : AREA_RELATED : CATEGORY=PEOPLE -GAIN Occ_32office - CONVECTIVE=12.6 : RADIATIVE=12.6 : HUMIDITY=0.008 : ELPOWERFRAC=0 : AREA_RELATED : CATEGORY=PEOPLE -GAIN Occ_33meeting - CONVECTIVE=41.94 : RADIATIVE=41.94 : HUMIDITY=0.0265 : ELPOWERFRAC=0 : AREA_RELATED : CATEGORY=PEOPLE -GAIN Occ_34reception - CONVECTIVE=10.44 : RADIATIVE=10.44 : HUMIDITY=0.0065 : ELPOWERFRAC=0 : AREA_RELATED : CATEGORY=PEOPLE -GAIN Dev_31office - CONVECTIVE=20.16 : RADIATIVE=5.04 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=EQUIPMENT -GAIN Dev_32office - CONVECTIVE=28.8 : RADIATIVE=7.2 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=EQUIPMENT -GAIN Dev_33meeting - CONVECTIVE=5.76 : RADIATIVE=1.44 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=EQUIPMENT -GAIN Dev_34reception - CONVECTIVE=11.52 : RADIATIVE=2.88 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=EQUIPMENT -GAIN Ltg_31office - CONVECTIVE=17.172 : RADIATIVE=40.068 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=LIGHTS -GAIN Ltg_32office - CONVECTIVE=13.5 : RADIATIVE=31.5 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=LIGHTS -GAIN Ltg_33meeting - CONVECTIVE=17.172 : RADIATIVE=40.068 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=LIGHTS -GAIN Ltg_34reception - CONVECTIVE=11.88 : RADIATIVE=27.72 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=LIGHTS -*----------------------------------------------------------------------------------------------------------------------- -* C o m f o r t -*----------------------------------------------------------------------------------------------------------------------- -*----------------------------------------------------------------------------------------------------------------------- -* I n f i l t r a t i o n -*----------------------------------------------------------------------------------------------------------------------- -INFILTRATION 31office - AIRCHANGE=0.05 -INFILTRATION 32office - AIRCHANGE=0.05 -INFILTRATION 33meeting - AIRCHANGE=0.05 -INFILTRATION 34reception - AIRCHANGE=0.05 -*----------------------------------------------------------------------------------------------------------------------- -* V e n t i l a t i o n -*----------------------------------------------------------------------------------------------------------------------- -VENTILATION 31office - TEMPERATURE=OUTSIDE - VAIRFLOWSPEC=SCHEDULE 2.6*Occ_Weekly_31office - SPECFANPOWER=0 - SENSHR=0 - RELMINHUM=OUTSIDE - RELMAXHUM=OUTSIDE - CALCQAHU=0 -VENTILATION 32office - TEMPERATURE=OUTSIDE - VAIRFLOWSPEC=SCHEDULE 3.6*Occ_Weekly_32office - SPECFANPOWER=0 - SENSHR=0 - RELMINHUM=OUTSIDE - RELMAXHUM=OUTSIDE - CALCQAHU=0 -VENTILATION 33meeting - TEMPERATURE=OUTSIDE - VAIRFLOWSPEC=SCHEDULE 12*Occ_Weekly_33meeting - SPECFANPOWER=0 - SENSHR=0 - RELMINHUM=OUTSIDE - RELMAXHUM=OUTSIDE - CALCQAHU=0 -VENTILATION 34reception - TEMPERATURE=OUTSIDE - VAIRFLOWSPEC=SCHEDULE 2.5*Occ_Weekly_34reception - SPECFANPOWER=0 - SENSHR=0 - RELMINHUM=OUTSIDE - RELMAXHUM=OUTSIDE - CALCQAHU=0 -*----------------------------------------------------------------------------------------------------------------------- -* C o o l i n g -*----------------------------------------------------------------------------------------------------------------------- -COOLING 31office - ON= 26 - POWER=SCHEDULE 999999999*Opr_Weekly_31office - HUMIDITY=100 - ELPOWERFRAC=0 - AREA_RELATED_POWER=0 -COOLING 32office - ON= 26 - POWER=SCHEDULE 999999999*Opr_Weekly_32office - HUMIDITY=100 - ELPOWERFRAC=0 - AREA_RELATED_POWER=0 -COOLING 33meeting - ON= 26 - POWER=SCHEDULE 999999999*Opr_Weekly_33meeting - HUMIDITY=100 - ELPOWERFRAC=0 - AREA_RELATED_POWER=0 -COOLING 34reception - ON= 26 - POWER=SCHEDULE 999999999*Opr_Weekly_34reception - HUMIDITY=100 - ELPOWERFRAC=0 - AREA_RELATED_POWER=0 -*----------------------------------------------------------------------------------------------------------------------- -* H e a t i n g -*----------------------------------------------------------------------------------------------------------------------- -HEATING 31office - ON=SCHEDULE 6*Opr_Weekly_31office+15 - POWER=999999999 - HUMIDITY=0 - RRAD=0 - ELPOWERFRAC=0 - AREA_RELATED_POWER=0 -HEATING 32office - ON=SCHEDULE 6*Opr_Weekly_32office+15 - POWER=999999999 - HUMIDITY=0 - RRAD=0 - ELPOWERFRAC=0 - AREA_RELATED_POWER=0 -HEATING 33meeting - ON=SCHEDULE 6*Opr_Weekly_33meeting+15 - POWER=999999999 - HUMIDITY=0 - RRAD=0 - ELPOWERFRAC=0 - AREA_RELATED_POWER=0 -HEATING 34reception - ON=SCHEDULE 5*Opr_Weekly_34reception+15 - POWER=999999999 - HUMIDITY=0 - RRAD=0 - ELPOWERFRAC=0 - AREA_RELATED_POWER=0 -*----------------------------------------------------------------------------------------------------------------------- -* D a y l i g h t C o n t r o l -*----------------------------------------------------------------------------------------------------------------------- -DCONTROL 31office - ILLMODE=1 : VALUE=2 : ILLSETPOINT1=500 : ILLSETPOINT2=300 : CNTRLMODE=2 : MINPFAC=0.2 : MINLFAC=0.2 : GEOPOS1=0 : GEOPOS2=0 : GEOPOS3=0 : GEOPOS4=0 -DCONTROL 32office - ILLMODE=1 : VALUE=2 : ILLSETPOINT1=500 : ILLSETPOINT2=300 : CNTRLMODE=2 : MINPFAC=0.2 : MINLFAC=0.2 : GEOPOS1=0 : GEOPOS2=0 : GEOPOS3=0 : GEOPOS4=0 -DCONTROL 33meeting - ILLMODE=1 : VALUE=2 : ILLSETPOINT1=500 : ILLSETPOINT2=300 : CNTRLMODE=2 : MINPFAC=0.2 : MINLFAC=0.2 : GEOPOS1=0 : GEOPOS2=0 : GEOPOS3=0 : GEOPOS4=0 -DCONTROL 34reception - ILLMODE=1 : VALUE=2 : ILLSETPOINT1=500 : ILLSETPOINT2=300 : CNTRLMODE=2 : MINPFAC=0.2 : MINLFAC=0.2 : GEOPOS1=0 : GEOPOS2=0 : GEOPOS3=0 : GEOPOS4=0 -* -*----------------------------------------------------------------------------------------------------------------------- -* Z o n e s -*----------------------------------------------------------------------------------------------------------------------- -ZONES first_floor second_floor -*----------------------------------------------------------------------------------------------------------------------- -* O r i e n t a t i o n s -*----------------------------------------------------------------------------------------------------------------------- -HEMISPHERE NORTHERN -ORIENTATIONS H_0_0 S_0_25 S_0_90 W_90_90 N_180_25 N_180_90 E_270_90 -INTERNAL_CALCULATION H_0_0 S_0_25 S_0_90 W_90_90 N_180_25 N_180_90 E_270_90 -*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -BUILDING -*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -*----------------------------------------------------------------------------------------------------------------------- -* Z o n e first_floor / A i r n o d e first_floor -*----------------------------------------------------------------------------------------------------------------------- -ZONE first_floor -RADIATIONMODE - BEAM=STANDARD : DIFFUSE=STANDARD : LONGWAVE=STANDARD : GEOMODE = 3D_DATA : FSOLAIR=0 - DAYLIGHTMODE - DLSHADE =-1 -AIRNODE first_floor -WALL =EXT_WALL : SURF= 1 : AREA= 20.000 : EXTERNAL : ORI=S_0_90 : FSKY=0.50 : GEOSURF=0.062500 -WINDOW=EXT_WINDOW1 : SURF= 8 : AREA= 12.000 : EXTERNAL : ORI=S_0_90 : FSKY=0.50 : ESHADE=INPUT 1*MAX_ESHADE : SHADECNTRL=ESHADE_INTERNAL : GEOSURF=0.037500 -FLOOR =GROUND_FLOOR : SURF= 2 : AREA= 48.000 : BOUNDARY=INPUT 1*TGROUND : GEOSURF=0.600000 -WALL =EXT_WALL : SURF= 3 : AREA= 48.000 : EXTERNAL : ORI=N_180_90 : FSKY=0.50 : GEOSURF=0.150000 -WALL =EXT_WALL : SURF= 4 : AREA= 16.000 : EXTERNAL : ORI=S_0_90 : FSKY=0.50 : GEOSURF=0.050000 -CEILING=ADJ_CEILING : SURF= 5 : AREA= 48.000 : ADJACENT=second_floor : ADJ_SURF=15 : FRONT -WALL =EXT_WALL : SURF= 6 : AREA= 16.000 : EXTERNAL : ORI=E_270_90 : FSKY=0.50 : GEOSURF=0.050000 -WALL =EXT_WALL : SURF= 7 : AREA= 16.000 : EXTERNAL : ORI=W_90_90 : FSKY=0.50 : GEOSURF=0.050000 - REGIME - INFILTRATION=31office - VENTILATION=31office - GAIN=Occ_31office : SCALE= SCHEDULE 1*Occ_Weekly_31office : GEOPOS= 0 : SCALE2= SCHEDULE 1*Occ_Annual_31office : FRAC_REFAREA= 1 - GAIN=Dev_31office : SCALE= SCHEDULE 1*Dev_Weekly_31office : GEOPOS= 0 : SCALE2= SCHEDULE 1*Occ_Annual_31office : FRAC_REFAREA= 1 - GAIN=Ltg_31office : SCALE= SCHEDULE 1*Opr_Weekly_31office : GEOPOS= 0 : SCALE2= 1 : FRAC_REFAREA= 1 : DLIGHT_CTRL=31office - HEATING=31office - COOLING=31office - CAPACITANCE= 230.400 : VOLUME= 192.000 : REFAREA= 48.000: TINITIAL= 20 : PHINITIAL= 50 : WCAPR= 1 -*----------------------------------------------------------------------------------------------------------------------- -* Z o n e second_floor / A i r n o d e second_floor -*----------------------------------------------------------------------------------------------------------------------- -ZONE second_floor -RADIATIONMODE - BEAM=STANDARD : DIFFUSE=STANDARD : LONGWAVE=STANDARD : GEOMODE = 3D_DATA : FSOLAIR=0 - DAYLIGHTMODE - DLSHADE =-1 -AIRNODE second_floor -WALL =EXT_WALL : SURF= 10 : AREA= 28.000 : EXTERNAL : ORI=S_0_90 : FSKY=0.50 : GEOSURF=0.084848 -WINDOW=EXT_WINDOW1 : SURF= 16 : AREA= 20.000 : EXTERNAL : ORI=S_0_90 : FSKY=0.50 : GEOSURF=0.060606 -WALL =EXT_WALL : SURF= 11 : AREA= 48.000 : EXTERNAL : ORI=N_180_90 : FSKY=0.50 : GEOSURF=0.145456 -ROOF =EXT_WALL : SURF= 12 : AREA= 26.833 : EXTERNAL : ORI=N_180_25 : FSKY=0.95 -WALL =EXT_WALL : SURF= 13 : AREA= 18.000 : EXTERNAL : ORI=W_90_90 : FSKY=0.50 : GEOSURF=0.054545 -ROOF =EXT_WALL : SURF= 14 : AREA= 26.833 : EXTERNAL : ORI=S_0_25 : FSKY=0.95 -FLOOR =ADJ_CEILING : SURF= 15 : AREA= 48.000 : ADJACENT=first_floor : ADJ_SURF=5 : BACK : GEOSURF=0.600000 -WALL =EXT_WALL : SURF= 9 : AREA= 18.000 : EXTERNAL : ORI=E_270_90 : FSKY=0.50 : GEOSURF=0.054545 - REGIME - INFILTRATION=32office - VENTILATION=32office - GAIN=Occ_32office : SCALE= SCHEDULE 1*Occ_Weekly_32office : GEOPOS= 0 : SCALE2= SCHEDULE 1*Occ_Annual_32office : FRAC_REFAREA= 1 - GAIN=Dev_32office : SCALE= SCHEDULE 1*Dev_Weekly_32office : GEOPOS= 0 : SCALE2= SCHEDULE 1*Occ_Annual_32office : FRAC_REFAREA= 1 - GAIN=Ltg_32office : SCALE= SCHEDULE 1*Opr_Weekly_32office : GEOPOS= 0 : SCALE2= 1 : FRAC_REFAREA= 1 : DLIGHT_CTRL=32office - HEATING=32office - COOLING=32office - CAPACITANCE= 259.200 : VOLUME= 216.000 : REFAREA= 48.000: TINITIAL= 20 : PHINITIAL= 50 : WCAPR= 1 -*----------------------------------------------------------------------------------------------------------------------- -* O u t p u t s -*----------------------------------------------------------------------------------------------------------------------- -OUTPUTS -TRANSFER : TIMEBASE=1.000 -AIRNODES = first_floor -NTYPE = 1 : Tair - node temperature - = 25 : Top - operative temperature - = 30 : QHEAT - sensible heating demand of airnode (positive values) - = 31 : QCOOL - sensible cooling demand of airnode (positive values) - = 156 : QELEQUIP - Electric energy demand of "equipment" gains of airnode [kJ/hr] - = 155 : QELLIGHT - Electric energy demand of "lights" gains of airnode [kJ/hr] -AIRNODES = second_floor -NTYPE = 1 : Tair - node temperature - = 25 : Top - operative temperature - = 30 : QHEAT - sensible heating demand of airnode (positive values) - = 31 : QCOOL - sensible cooling demand of airnode (positive values) - = 156 : QELEQUIP - Electric energy demand of "equipment" gains of airnode [kJ/hr] - = 155 : QELLIGHT - Electric energy demand of "lights" gains of airnode [kJ/hr] -*----------------------------------------------------------------------------------------------------------------------- -*----------------------------------------------------------------------------------------------------------------------- -*----------------------------------------------------------------------------------------------------------------------- -* T R N S F L O W Multizone Airflow Network (Model COMIS 3.1) -*----------------------------------------------------------------------------------------------------------------------- -* E n d -*----------------------------------------------------------------------------------------------------------------------- -END - -_EXTENSION_WINPOOL_START_ -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 - *** END OF LIBRARY *** - ******************************************************************************************************************************** - *WinID Description Design U-Value g-value T-sol Rf-sol T-vis_daylight Lay Width(mm) - ******************************************************************************************************************************** - 201 2-WSV_#3_Ar90 6/16/6 1.12 0.59 0.504 0.230 0.780 2 28 -_EXTENSION_WINPOOL_END_ - -_EXTENSION_BuildingGeometry_START_ -vertex 1 4.000000000000 0.000000000000 4.000000000000 -vertex 2 4.000000000000 0.000000000000 0.000000000000 -vertex 3 12.000000000000 0.000000000000 0.000000000000 -vertex 4 12.000000000000 0.000000000000 4.000000000000 -vertex 5 5.000000000000 0.000000000000 3.000000000000 -vertex 6 5.000000000000 0.000000000000 1.000000000000 -vertex 7 11.000000000000 0.000000000000 1.000000000000 -vertex 8 11.000000000000 0.000000000000 3.000000000000 -vertex 9 12.000000000000 4.000000000000 0.000000000000 -vertex 10 0.000000000000 0.000000000000 0.000000000000 -vertex 11 0.000000000000 4.000000000000 0.000000000000 -vertex 12 12.000000000000 4.000000000000 4.000000000000 -vertex 13 0.000000000000 4.000000000000 4.000000000000 -vertex 14 0.000000000000 0.000000000000 4.000000000000 -vertex 15 0.000000000000 0.000000000000 8.000000000000 -vertex 16 12.000000000000 0.000000000000 8.000000000000 -vertex 17 1.000000000000 0.000000000000 7.000000000000 -vertex 18 1.000000000000 0.000000000000 5.000000000000 -vertex 19 11.000000000000 0.000000000000 5.000000000000 -vertex 20 11.000000000000 0.000000000000 7.000000000000 -vertex 21 12.000000000000 4.000000000000 8.000000000000 -vertex 22 0.000000000000 4.000000000000 8.000000000000 -vertex 23 12.000000000000 2.000000000000 9.000000000000 -vertex 24 0.000000000000 2.000000000000 9.000000000000 - -zone first_floor -wall 1 1 2 3 4 -window 8 5 6 7 8 -floor 2 9 3 10 11 -wall 3 12 9 11 13 -wall 4 14 10 2 1 -ceiling 5 13 14 4 12 -wall 6 4 3 9 12 -wall 7 13 11 10 14 - -zone second_floor -wall 10 15 14 4 16 -window 16 17 18 19 20 -wall 11 21 12 13 22 -roof 12 23 21 22 24 -wall 13 22 13 14 15 24 -roof 14 24 15 16 23 -floor 15 12 4 14 13 -wall 9 16 4 12 21 23 - -_EXTENSION_BuildingGeometry_END_ - -_EXTENSION_VirtualSurfaceGeometry_START_ -_EXTENSION_VirtualSurfaceGeometry_END_ - -_EXTENSION_ExternalShadingGeometry_START_ -vertex 25 4.000000000000 0.000000000000 0.000000000000 -vertex 26 4.000000000000 -4.000000000000 0.000000000000 -vertex 27 0.000000000000 -4.000000000000 0.000000000000 -vertex 28 0.000000000000 0.000000000000 0.000000000000 -vertex 29 4.000000000000 0.000000000000 4.000000000000 -vertex 30 0.000000000000 0.000000000000 4.000000000000 -vertex 31 0.000000000000 -4.000000000000 4.000000000000 -vertex 32 4.000000000000 -4.000000000000 4.000000000000 - - -shader 10001 25 26 27 28 -shader 10002 29 25 28 30 -shader 10003 30 28 27 31 -shader 10004 31 27 26 32 -shader 10005 30 31 32 29 -shader 10006 32 26 25 29 -_EXTENSION_ExternalShadingGeometry_END_ - -_EXTENSION_GeoPositionGeometry_START_ -_EXTENSION_GeoPositionGeometry_END_ - -_EXTENSION_DaylightSensorPoints_START_ -_EXTENSION_DaylightSensorPoints_END_ - diff --git a/tests/input_data/trnsys/Building.idf b/tests/input_data/trnsys/Building.idf deleted file mode 100644 index 0e844f5c..00000000 --- a/tests/input_data/trnsys/Building.idf +++ /dev/null @@ -1,1151 +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 -!-*-------------------------------------------------------------------------------- -!-*#C Generated with the template 3_office_basedon_SIA2024 -!-*#C -!-*#C Assumptions made: - electric power fraction (ELPOWERFRAC) of HEATING, COOLING and VENTILATION = 0 -!-*#C - electric power fraction (ELPOWERFRAC) of GAINs Devices and Lighting = 1 -!-*#C - daylight control strategies use ILLMODE=1 : VALUE=2 : ILLSETPOINT1=500 : ILLSETPOINT2=300 : CNTRLMODE=2 : MINPFAC=0.2 : MINLFAC=0.2 -!-*#C - HEATING night setback to 16C -!-*#C - COOLING switched of for non occupied periods -!-*#C - -!-* -!-*-------------------------------------------------------------------------------- -!-* 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 -!-*-------------------------------------------------------------------------------- -!-LAYER PUTZ -!- CONDUCTIVITY= 2.52 : CAPACITY= 1 : DENSITY= 1400 : PERT= 0 : PENRT= 0 -!-LAYER KST -!- CONDUCTIVITY= 3.564 : CAPACITY= 1 : DENSITY= 1600 : PERT= 0 : PENRT= 0 -!-LAYER DAEMA -!- CONDUCTIVITY= 0.173 : CAPACITY= 1 : DENSITY= 60 : PERT= 0 : PENRT= 0 -!-LAYER GIPS -!- CONDUCTIVITY= 0.756 : CAPACITY= 1 : DENSITY= 900 : PERT= 0 : PENRT= 0 -!-LAYER HOLZ -!- CONDUCTIVITY= 0.468 : CAPACITY= 2.1 : DENSITY= 600 : PERT= 0 : PENRT= 0 -!-LAYER BET -!- CONDUCTIVITY= 7.56 : CAPACITY= 1 : DENSITY= 2200 : PERT= 0 : PENRT= 0 -!-LAYER TEPP -!- CONDUCTIVITY= 0.288 : CAPACITY= 1.3 : DENSITY= 700 : PERT= 0 : PENRT= 0 -!-LAYER ESTR -!- CONDUCTIVITY= 5.04 : CAPACITY= 1 : DENSITY= 2000 : PERT= 0 : PENRT= 0 -!-LAYER MIWO -!- CONDUCTIVITY= 0.144 : CAPACITY= 1 : DENSITY= 60 : PERT= 0 : PENRT= 0 -!-LAYER DAEMM -!- CONDUCTIVITY= 0.144 : CAPACITY= 1 : DENSITY= 60 : PERT= 0 : PENRT= 0 -!-*-------------------------------------------------------------------------------- -!-* I n p u t s -!-*-------------------------------------------------------------------------------- -!-INPUTS TGROUND TBOUNDARY SHADE_CLOSE SHADE_OPEN MAX_ISHADE MAX_ESHADE -!-INPUTS_DESCRIPTION -!- TGROUND : C : Ground Temperature (boundary temperature used for floors adjacent to the ground) -!- 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 -!-*-------------------------------------------------------------------------------- -!-SCHEDULE Occ_MoFr_31office -!- HOURS =0.000 7.000 8.000 9.000 10.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 -!- VALUES=0 0.2 0.6 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0 0 -!-SCHEDULE Occ_SaSu_31office -!- HOURS =0.000 24.0 -!- VALUES=0 0 -!-SCHEDULE Dev_MoFr_31office -!- HOURS =0.000 7.000 8.000 9.000 10.000 11.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 -!- VALUES=0.1 0.2 0.6 0.8 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0.1 0.1 -!-SCHEDULE Dev_SaSu_31office -!- HOURS =0.000 24.0 -!- VALUES=0.1 0.1 -!-SCHEDULE Opr_MoFr_31office -!- HOURS =0.000 7.000 18.000 24.0 -!- VALUES=0 1. 0 0 -!-SCHEDULE Opr_SaSu_31office -!- HOURS =0.000 24.0 -!- VALUES=0 0 -!-SCHEDULE Occ_MoFr_32office -!- HOURS =0.000 7.000 8.000 9.000 10.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 -!- VALUES=0 0.2 0.6 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0 0 -!-SCHEDULE Occ_SaSu_32office -!- HOURS =0.000 24.0 -!- VALUES=0 0 -!-SCHEDULE Dev_MoFr_32office -!- HOURS =0.000 7.000 8.000 9.000 10.000 11.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 -!- VALUES=0.1 0.2 0.6 1. 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0.1 0.1 -!-SCHEDULE Dev_SaSu_32office -!- HOURS =0.000 24.0 -!- VALUES=0.1 0.1 -!-SCHEDULE Opr_MoFr_32office -!- HOURS =0.000 7.000 18.000 24.0 -!- VALUES=0 1. 0 0 -!-SCHEDULE Opr_SaSu_32office -!- HOURS =0.000 24.0 -!- VALUES=0 0 -!-SCHEDULE Occ_MoFr_33meeting -!- HOURS =0.000 9.000 10.000 11.000 12.000 14.000 15.000 16.000 17.000 24.0 -!- VALUES=0 0.6 1. 0.4 0 0.6 1. 0.4 0 0 -!-SCHEDULE Occ_SaSu_33meeting -!- HOURS =0.000 24.0 -!- VALUES=0 0 -!-SCHEDULE Dev_MoFr_33meeting -!- HOURS =0.000 9.000 10.000 11.000 12.000 14.000 15.000 16.000 17.000 24.0 -!- VALUES=0.1 0.6 1. 0.4 0.1 0.6 1. 0.4 0.1 0.1 -!-SCHEDULE Dev_SaSu_33meeting -!- HOURS =0.000 24.0 -!- VALUES=0.1 0.1 -!-SCHEDULE Opr_MoFr_33meeting -!- HOURS =0.000 7.000 18.000 24.0 -!- VALUES=0 1. 0 0 -!-SCHEDULE Opr_SaSu_33meeting -!- HOURS =0.000 24.0 -!- VALUES=0 0 -!-SCHEDULE Occ_MoFr_34Reception -!- HOURS =0.000 7.000 8.000 9.000 10.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 -!- VALUES=0 0.2 0.6 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0 0 -!-SCHEDULE Occ_SaSu_34Reception -!- HOURS =0.000 24.0 -!- VALUES=0 0 -!-SCHEDULE Dev_MoFr_34Reception -!- HOURS =0.000 7.000 8.000 9.000 10.000 11.000 12.000 13.000 14.000 15.000 16.000 17.000 18.000 24.0 -!- VALUES=0.1 0.2 0.6 0.8 1. 0.8 0.4 0.6 1. 0.8 0.6 0.2 0.1 0.1 -!-SCHEDULE Dev_SaSu_34Reception -!- HOURS =0.000 24.0 -!- VALUES=0.1 0.1 -!-SCHEDULE Opr_MoFr_34reception -!- HOURS =0.000 7.000 18.000 24.0 -!- VALUES=0 1. 0 0 -!-SCHEDULE Opr_SaSu_34reception -!- HOURS =0.000 24.0 -!- VALUES=0 0 -!-SCHEDULE Occ_Weekly_31office -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Occ_MoFr_31office Occ_MoFr_31office Occ_MoFr_31office Occ_MoFr_31office Occ_MoFr_31office Occ_SaSu_31office Occ_SaSu_31office -!-SCHEDULE Dev_Weekly_31office -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Dev_MoFr_31office Dev_MoFr_31office Dev_MoFr_31office Dev_MoFr_31office Dev_MoFr_31office Dev_SaSu_31office Dev_SaSu_31office -!-SCHEDULE Opr_Weekly_31office -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Opr_MoFr_31office Opr_MoFr_31office Opr_MoFr_31office Opr_MoFr_31office Opr_MoFr_31office Opr_SaSu_31office Opr_SaSu_31office -!-SCHEDULE Occ_Weekly_32office -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Occ_MoFr_32office Occ_MoFr_32office Occ_MoFr_32office Occ_MoFr_32office Occ_MoFr_32office Occ_SaSu_32office Occ_SaSu_32office -!-SCHEDULE Dev_Weekly_32office -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Dev_MoFr_32office Dev_MoFr_32office Dev_MoFr_32office Dev_MoFr_32office Dev_MoFr_32office Dev_SaSu_32office Dev_SaSu_32office -!-SCHEDULE Opr_Weekly_32office -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Opr_MoFr_32office Opr_MoFr_32office Opr_MoFr_32office Opr_MoFr_32office Opr_MoFr_32office Opr_SaSu_32office Opr_SaSu_32office -!-SCHEDULE Occ_Weekly_33meeting -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Occ_MoFr_33meeting Occ_MoFr_33meeting Occ_MoFr_33meeting Occ_MoFr_33meeting Occ_MoFr_33meeting Occ_SaSu_33meeting Occ_SaSu_33meeting -!-SCHEDULE Dev_Weekly_33meeting -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Dev_MoFr_33meeting Dev_MoFr_33meeting Dev_MoFr_33meeting Dev_MoFr_33meeting Dev_MoFr_33meeting Dev_SaSu_33meeting Dev_SaSu_33meeting -!-SCHEDULE Opr_Weekly_33meeting -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Opr_MoFr_33meeting Opr_MoFr_33meeting Opr_MoFr_33meeting Opr_MoFr_33meeting Opr_MoFr_33meeting Opr_SaSu_33meeting Opr_SaSu_33meeting -!-SCHEDULE Occ_Weekly_34reception -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Occ_MoFr_34Reception Occ_MoFr_34Reception Occ_MoFr_34Reception Occ_MoFr_34Reception Occ_MoFr_34Reception Occ_SaSu_34Reception Occ_SaSu_34Reception -!-SCHEDULE Dev_Weekly_34reception -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Dev_MoFr_34Reception Dev_MoFr_34Reception Dev_MoFr_34Reception Dev_MoFr_34Reception Dev_MoFr_34Reception Dev_SaSu_34Reception Dev_SaSu_34Reception -!-SCHEDULE Opr_Weekly_34reception -!- DAYS=1 2 3 4 5 6 7 -!- HOURLY=Opr_MoFr_34reception Opr_MoFr_34reception Opr_MoFr_34reception Opr_MoFr_34reception Opr_MoFr_34reception Opr_SaSu_34reception Opr_SaSu_34reception -!-SCHEDULE Occ_Annual_31office -!- HOURS =0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 -!- VALUES=0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 -!-SCHEDULE Occ_Annual_32office -!- HOURS =0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 -!- VALUES=0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 -!-SCHEDULE Occ_Annual_33meeting -!- HOURS =0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 -!- VALUES=0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 -!-SCHEDULE Occ_Annual_34reception -!- HOURS =0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 -!- VALUES=0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 -!-*-------------------------------------------------------------------------------- -!-* C O N S T R U C T I O N (Wall, Floor, Ceiling,..) -!-*-------------------------------------------------------------------------------- -!-CONSTRUCTION BND_WALL -!- LAYERS = PUTZ KST DAEMA GIPS -!- THICKNESS= 0.015 0.175 0.173 0.013 -!- ABS-FRONT= 0.4 : ABS-BACK= 0.5 -!- EPS-FRONT= 0.9 : EPS-BACK= 0.9 -!- HFRONT = 11 : HBACK= 64 -!-CONSTRUCTION EXT_WALL -!- LAYERS = PUTZ KST DAEMA HOLZ -!- THICKNESS= 0.015 0.175 0.167 0.02 -!- ABS-FRONT= 0.4 : ABS-BACK= 0.5 -!- EPS-FRONT= 0.9 : EPS-BACK= 0.9 -!- HFRONT = 11 : HBACK= 64 -!-CONSTRUCTION EXT_ROOF -!- LAYERS = PUTZ BET DAEMM HOLZ -!- THICKNESS= 0.015 0.16 0.305 0.02 -!- ABS-FRONT= 0.1 : ABS-BACK= 0.5 -!- EPS-FRONT= 0.9 : EPS-BACK= 0.9 -!- HFRONT = 11 : HBACK= 64 -!-CONSTRUCTION EXT_FLOOR -!- LAYERS = TEPP ESTR MIWO BET DAEMA -!- THICKNESS= 0.005 0.05 0.03 0.16 0.162 -!- ABS-FRONT= 0.8 : ABS-BACK= 0.5 -!- EPS-FRONT= 0.9 : EPS-BACK= 0.9 -!- HFRONT = 11 : HBACK= 64 -!-CONSTRUCTION BND_CEILING -!- LAYERS = PUTZ BET DAEMA HOLZ -!- THICKNESS= 0.015 0.16 0.3 0.03 -!- ABS-FRONT= 0.1 : ABS-BACK= 0.5 -!- EPS-FRONT= 0.9 : EPS-BACK= 0.9 -!- HFRONT = 11 : HBACK= 64 -!-CONSTRUCTION BND_FLOOR -!- LAYERS = TEPP ESTR MIWO BET DAEMA GIPS -!- THICKNESS= 0.005 0.05 0.03 0.16 0.133 0.013 -!- ABS-FRONT= 0.8 : ABS-BACK= 0.5 -!- EPS-FRONT= 0.9 : EPS-BACK= 0.9 -!- HFRONT = 11 : HBACK= 64 -!-CONSTRUCTION GROUND_FLOOR -!- LAYERS = TEPP ESTR DAEMM BET -!- THICKNESS= 0.005 0.05 0.121 0.2 -!- ABS-FRONT= 0.8 : ABS-BACK= 0.5 -!- EPS-FRONT= 0.9 : EPS-BACK= 0.9 -!- HFRONT = 11 : HBACK= 0.001 -!-CONSTRUCTION ADJ_WALL -!- LAYERS = GIPS MIWO GIPS -!- THICKNESS= 0.013 0.1 0.013 -!- ABS-FRONT= 0.4 : ABS-BACK= 0.5 -!- EPS-FRONT= 0.9 : EPS-BACK= 0.9 -!- HFRONT = 11 : HBACK= 11 -!-CONSTRUCTION ADJ_CEILING -!- LAYERS = PUTZ BET MIWO ESTR TEPP -!- THICKNESS= 0.015 0.16 0.03 0.05 0.005 -!- ABS-FRONT= 0.1 : ABS-BACK= 0.5 -!- EPS-FRONT= 0.9 : EPS-BACK= 0.9 -!- HFRONT = 11 : HBACK= 11 -!-*-------------------------------------------------------------------------------- -!-* W i n d o w s -!-*-------------------------------------------------------------------------------- -!-WINDOW EXT_WINDOW1 -!- WINID=201 : HINSIDE=11 : HOUTSIDE=64 : SLOPE=-999 : SPACID=4 : WWID=0.77 : WHEIG=1.08 : FFRAME=0.15 : UFRAME=8.17 : ABSFRAME=0.6 : RISHADE=0 : RESHADE=0 : REFLISHADE=0.5 : REFLOSHADE=0.5 : CCISHADE=0.5 : EPSFRAME=0.9 : EPSISHADE=0.9 : ITSHADECLOSE=648 : ITSHADEOPEN=576 : FLOWTOAIRNODE=1 : PERT=0 : PENRT=0 : RADMATERIAL=undefined : RADMATERIAL_SHD1=undefined -!-WINDOW EXT_WINDOW2 -!- WINID=201 : HINSIDE=11 : HOUTSIDE=64 : SLOPE=-999 : SPACID=4 : WWID=0.77 : WHEIG=1.08 : FFRAME=0.15 : UFRAME=8.17 : ABSFRAME=0.6 : RISHADE=0 : RESHADE=0 : REFLISHADE=0.5 : REFLOSHADE=0.5 : CCISHADE=0.5 : EPSFRAME=0.9 : EPSISHADE=0.9 : ITSHADECLOSE=648 : ITSHADEOPEN=576 : FLOWTOAIRNODE=1 : PERT=0 : PENRT=0 : RADMATERIAL=undefined : RADMATERIAL_SHD1=undefined -!-WINDOW ADJ_WINDOW1 -!- WINID=201 : HINSIDE=11 : HOUTSIDE=64 : SLOPE=-999 : SPACID=4 : WWID=0.77 : WHEIG=1.08 : FFRAME=0.15 : UFRAME=8.17 : ABSFRAME=0.6 : RISHADE=0 : RESHADE=0 : REFLISHADE=0.5 : REFLOSHADE=0.5 : CCISHADE=0.5 : EPSFRAME=0.9 : EPSISHADE=0.9 : ITSHADECLOSE=648 : ITSHADEOPEN=576 : FLOWTOAIRNODE=1 : PERT=0 : PENRT=0 : RADMATERIAL=undefined : RADMATERIAL_SHD1=undefined -!-WINDOW ADJ_WINDOW2 -!- WINID=201 : HINSIDE=11 : HOUTSIDE=64 : SLOPE=-999 : SPACID=4 : WWID=0.77 : WHEIG=1.08 : FFRAME=0.15 : UFRAME=8.17 : ABSFRAME=0.6 : RISHADE=0 : RESHADE=0 : REFLISHADE=0.5 : REFLOSHADE=0.5 : CCISHADE=0.5 : EPSFRAME=0.9 : EPSISHADE=0.9 : ITSHADECLOSE=648 : ITSHADEOPEN=576 : FLOWTOAIRNODE=1 : PERT=0 : PENRT=0 : RADMATERIAL=undefined : RADMATERIAL_SHD1=undefined -!-*-------------------------------------------------------------------------------- -!-* G a i n s -!-*-------------------------------------------------------------------------------- -!-GAIN Occ_31office -!- CONVECTIVE=9 : RADIATIVE=9 : HUMIDITY=0.0055 : ELPOWERFRAC=0 : AREA_RELATED : CATEGORY=PEOPLE -!-GAIN Occ_32office -!- CONVECTIVE=12.6 : RADIATIVE=12.6 : HUMIDITY=0.008 : ELPOWERFRAC=0 : AREA_RELATED : CATEGORY=PEOPLE -!-GAIN Occ_33meeting -!- CONVECTIVE=41.94 : RADIATIVE=41.94 : HUMIDITY=0.0265 : ELPOWERFRAC=0 : AREA_RELATED : CATEGORY=PEOPLE -!-GAIN Occ_34reception -!- CONVECTIVE=10.44 : RADIATIVE=10.44 : HUMIDITY=0.0065 : ELPOWERFRAC=0 : AREA_RELATED : CATEGORY=PEOPLE -!-GAIN Dev_31office -!- CONVECTIVE=20.16 : RADIATIVE=5.04 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=EQUIPMENT -!-GAIN Dev_32office -!- CONVECTIVE=28.8 : RADIATIVE=7.2 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=EQUIPMENT -!-GAIN Dev_33meeting -!- CONVECTIVE=5.76 : RADIATIVE=1.44 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=EQUIPMENT -!-GAIN Dev_34reception -!- CONVECTIVE=11.52 : RADIATIVE=2.88 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=EQUIPMENT -!-GAIN Ltg_31office -!- CONVECTIVE=17.172 : RADIATIVE=40.068 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=LIGHTS -!-GAIN Ltg_32office -!- CONVECTIVE=13.5 : RADIATIVE=31.5 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=LIGHTS -!-GAIN Ltg_33meeting -!- CONVECTIVE=17.172 : RADIATIVE=40.068 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=LIGHTS -!-GAIN Ltg_34reception -!- CONVECTIVE=11.88 : RADIATIVE=27.72 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=LIGHTS -!-*-------------------------------------------------------------------------------- -!-* C o m f o r t -!-*-------------------------------------------------------------------------------- -!-*-------------------------------------------------------------------------------- -!-* I n f i l t r a t i o n -!-*-------------------------------------------------------------------------------- -!-INFILTRATION 31office -!- AIRCHANGE=0.05 -!-INFILTRATION 32office -!- AIRCHANGE=0.05 -!-INFILTRATION 33meeting -!- AIRCHANGE=0.05 -!-INFILTRATION 34reception -!- AIRCHANGE=0.05 -!-*-------------------------------------------------------------------------------- -!-* V e n t i l a t i o n -!-*-------------------------------------------------------------------------------- -!-VENTILATION 31office -!- TEMPERATURE=OUTSIDE -!- VAIRFLOWSPEC=SCHEDULE 2.6*Occ_Weekly_31office -!- SPECFANPOWER=0 -!- SENSHR=0 -!- RELMINHUM=OUTSIDE -!- RELMAXHUM=OUTSIDE -!- CALCQAHU=0 -!-VENTILATION 32office -!- TEMPERATURE=OUTSIDE -!- VAIRFLOWSPEC=SCHEDULE 3.6*Occ_Weekly_32office -!- SPECFANPOWER=0 -!- SENSHR=0 -!- RELMINHUM=OUTSIDE -!- RELMAXHUM=OUTSIDE -!- CALCQAHU=0 -!-VENTILATION 33meeting -!- TEMPERATURE=OUTSIDE -!- VAIRFLOWSPEC=SCHEDULE 12*Occ_Weekly_33meeting -!- SPECFANPOWER=0 -!- SENSHR=0 -!- RELMINHUM=OUTSIDE -!- RELMAXHUM=OUTSIDE -!- CALCQAHU=0 -!-VENTILATION 34reception -!- TEMPERATURE=OUTSIDE -!- VAIRFLOWSPEC=SCHEDULE 2.5*Occ_Weekly_34reception -!- SPECFANPOWER=0 -!- SENSHR=0 -!- RELMINHUM=OUTSIDE -!- RELMAXHUM=OUTSIDE -!- CALCQAHU=0 -!-*-------------------------------------------------------------------------------- -!-* C o o l i n g -!-*-------------------------------------------------------------------------------- -!-COOLING 31office -!- ON= 26 -!- POWER=SCHEDULE 999999999*Opr_Weekly_31office -!- HUMIDITY=100 -!- ELPOWERFRAC=0 -!- AREA_RELATED_POWER=0 -!-COOLING 32office -!- ON= 26 -!- POWER=SCHEDULE 999999999*Opr_Weekly_32office -!- HUMIDITY=100 -!- ELPOWERFRAC=0 -!- AREA_RELATED_POWER=0 -!-COOLING 33meeting -!- ON= 26 -!- POWER=SCHEDULE 999999999*Opr_Weekly_33meeting -!- HUMIDITY=100 -!- ELPOWERFRAC=0 -!- AREA_RELATED_POWER=0 -!-COOLING 34reception -!- ON= 26 -!- POWER=SCHEDULE 999999999*Opr_Weekly_34reception -!- HUMIDITY=100 -!- ELPOWERFRAC=0 -!- AREA_RELATED_POWER=0 -!-*-------------------------------------------------------------------------------- -!-* H e a t i n g -!-*-------------------------------------------------------------------------------- -!-HEATING 31office -!- ON=SCHEDULE 6*Opr_Weekly_31office+15 -!- POWER=999999999 -!- HUMIDITY=0 -!- RRAD=0 -!- ELPOWERFRAC=0 -!- AREA_RELATED_POWER=0 -!-HEATING 32office -!- ON=SCHEDULE 6*Opr_Weekly_32office+15 -!- POWER=999999999 -!- HUMIDITY=0 -!- RRAD=0 -!- ELPOWERFRAC=0 -!- AREA_RELATED_POWER=0 -!-HEATING 33meeting -!- ON=SCHEDULE 6*Opr_Weekly_33meeting+15 -!- POWER=999999999 -!- HUMIDITY=0 -!- RRAD=0 -!- ELPOWERFRAC=0 -!- AREA_RELATED_POWER=0 -!-HEATING 34reception -!- ON=SCHEDULE 5*Opr_Weekly_34reception+15 -!- POWER=999999999 -!- HUMIDITY=0 -!- RRAD=0 -!- ELPOWERFRAC=0 -!- AREA_RELATED_POWER=0 -!-*-------------------------------------------------------------------------------- -!-* D a y l i g h t C o n t r o l -!-*-------------------------------------------------------------------------------- -!-DCONTROL 31office -!- ILLMODE=1 : VALUE=2 : ILLSETPOINT1=500 : ILLSETPOINT2=300 : CNTRLMODE=2 : MINPFAC=0.2 : MINLFAC=0.2 : GEOPOS1=0 : GEOPOS2=0 : GEOPOS3=0 : GEOPOS4=0 -!-DCONTROL 32office -!- ILLMODE=1 : VALUE=2 : ILLSETPOINT1=500 : ILLSETPOINT2=300 : CNTRLMODE=2 : MINPFAC=0.2 : MINLFAC=0.2 : GEOPOS1=0 : GEOPOS2=0 : GEOPOS3=0 : GEOPOS4=0 -!-DCONTROL 33meeting -!- ILLMODE=1 : VALUE=2 : ILLSETPOINT1=500 : ILLSETPOINT2=300 : CNTRLMODE=2 : MINPFAC=0.2 : MINLFAC=0.2 : GEOPOS1=0 : GEOPOS2=0 : GEOPOS3=0 : GEOPOS4=0 -!-DCONTROL 34reception -!- ILLMODE=1 : VALUE=2 : ILLSETPOINT1=500 : ILLSETPOINT2=300 : CNTRLMODE=2 : MINPFAC=0.2 : MINLFAC=0.2 : GEOPOS1=0 : GEOPOS2=0 : GEOPOS3=0 : GEOPOS4=0 -!-* -!-*-------------------------------------------------------------------------------- -!-* Z o n e s -!-*-------------------------------------------------------------------------------- -!-ZONES -!-*-------------------------------------------------------------------------------- -!-* O r i e n t a t i o n s -!-*-------------------------------------------------------------------------------- -!-HEMISPHERE NORTHERN -!-ORIENTATIONS -!-* -!-*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!-BUILDING -!-*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!-*-------------------------------------------------------------------------------- -!-* O u t p u t s -!-*-------------------------------------------------------------------------------- -!-OUTPUTS -!- TRANSFER : TIMEBASE=1.000 -!- DEFAULT -!-* -!-*-------------------------------------------------------------------------------- -!-* E n d -!-*-------------------------------------------------------------------------------- -!-END -!- -!-_EXTENSION_WINPOOL_START_ -!-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 -!-*** END OF LIBRARY *** -!-******************************************************************************************************************************** -!-*WinID Description Design U-Value g-value T-sol Rf-sol T-vis_daylight Lay Width(mm) -!-******************************************************************************************************************************** -!-201 2-WSV_#3_Ar90 6/16/6 1.12 0.59 0.504 0.230 0.780 2 28 -!-_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 =========== - - Version,5.0; - -!- =========== ALL OBJECTS IN CLASS: BUILDING =========== - - Building, - TRNSYS18, !- Name - 0.0, !- North Axis {deg} - City, !- Terrain - 0, !- Loads Convergence Tolerance Value - 0, !- Temperature Convergence Tolerance Value {deltaC} - FullInteriorAndExterior, !- Solar Distribution - 0; !- Maximum Number of Warmup Days - -!- =========== ALL OBJECTS IN CLASS: LOCATION =========== - - Site:Location, - not used, !- Name - 0.0, !- Latitude {deg} - 0.0, !- Longitude {deg} - 0.0, !- Time Zone {hr} - 0; !- Elevation {m} - - GlobalGeometryRules, - UpperLeftCorner, !- Starting Vertex Position - Counterclockwise, !- Vertex Entry Direction - Absolute; !- Coordinate System - - -!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== - - Construction, - GROUND_FLOOR; !- Name - Construction, - EXT_WALL; !- Name - Construction, - EXT_FLOOR; !- Name - Construction, - EXT_ROOF; !- Name - Construction, - BND_WALL; !- Name - Construction, - BND_FLOOR; !- Name - Construction, - BND_CEILING; !- Name - Construction, - ADJ_WALL; !- Name - Construction, - ADJ_CEILING; !- Name - - Construction, - VirtualSurface; !- Name - Construction, - EXT_WINDOW1; !- Name - Construction, - EXT_WINDOW2; !- Name - Construction, - ADJ_WINDOW1; !- Name - Construction, - ADJ_WINDOW2; !- 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 - ZoneType, - 31office; !- Name - ZoneType, - 32office; !- Name - ZoneType, - 33meeting; !- Name - ZoneType, - 34reception; !- Name - - - !- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== - - Output:VariableDictionary,IDF; - - - Zone, - first_floor, !- Name - 0.0, !- Direction of Relative North {deg} - 0.0, !- X Origin {m} - 0.0, !- Y Origin {m} - 0.0, !- Z Origin {m} - 31office, !- ZONE_TYPE - 1; !- Multiplier - - BuildingSurface:Detailed, - 4E1ABA, !- Name - Floor, !- Surface Type - GROUND_FLOOR, !- Construction Name - first_floor, !- Zone Name - Ground, !- Outside Boundary Condition - BOUNDARY=INPUT 1*TGROUND, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 12.000000000000, !- Vertex 1 X-coordinate {m} - 4.000000000000, !- Vertex 1 Y-coordinate {m} - 0.000000000000, !- Vertex 1 Z-coordinate {m} - 12.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 0.000000000000, !- Vertex 2 Z-coordinate {m} - 0.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 0.000000000000, !- Vertex 3 Z-coordinate {m} - 0.000000000000, !- Vertex 4 X-coordinate {m} - 4.000000000000, !- Vertex 4 Y-coordinate {m} - 0.000000000000; !- Vertex 4 Z-coordinate {m} - - BuildingSurface:Detailed, - 248430, !- Name - Wall, !- Surface Type - EXT_WALL, !- Construction Name - first_floor, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 4.000000000000, !- Vertex 1 X-coordinate {m} - 0.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 4.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 0.000000000000, !- Vertex 2 Z-coordinate {m} - 12.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 0.000000000000, !- Vertex 3 Z-coordinate {m} - 12.000000000000, !- Vertex 4 X-coordinate {m} - 0.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - BuildingSurface:Detailed, - AFF248, !- Name - Wall, !- Surface Type - EXT_WALL, !- Construction Name - first_floor, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 12.000000000000, !- Vertex 1 X-coordinate {m} - 0.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 12.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 0.000000000000, !- Vertex 2 Z-coordinate {m} - 12.000000000000, !- Vertex 3 X-coordinate {m} - 4.000000000000, !- Vertex 3 Y-coordinate {m} - 0.000000000000, !- Vertex 3 Z-coordinate {m} - 12.000000000000, !- Vertex 4 X-coordinate {m} - 4.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - BuildingSurface:Detailed, - E7C679, !- Name - Wall, !- Surface Type - EXT_WALL, !- Construction Name - first_floor, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 0.000000000000, !- Vertex 1 X-coordinate {m} - 4.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 0.000000000000, !- Vertex 2 X-coordinate {m} - 4.000000000000, !- Vertex 2 Y-coordinate {m} - 0.000000000000, !- Vertex 2 Z-coordinate {m} - 0.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 0.000000000000, !- Vertex 3 Z-coordinate {m} - 0.000000000000, !- Vertex 4 X-coordinate {m} - 0.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - BuildingSurface:Detailed, - 5E1DAD, !- Name - Wall, !- Surface Type - EXT_WALL, !- Construction Name - first_floor, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 12.000000000000, !- Vertex 1 X-coordinate {m} - 4.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 12.000000000000, !- Vertex 2 X-coordinate {m} - 4.000000000000, !- Vertex 2 Y-coordinate {m} - 0.000000000000, !- Vertex 2 Z-coordinate {m} - 0.000000000000, !- Vertex 3 X-coordinate {m} - 4.000000000000, !- Vertex 3 Y-coordinate {m} - 0.000000000000, !- Vertex 3 Z-coordinate {m} - 0.000000000000, !- Vertex 4 X-coordinate {m} - 4.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - BuildingSurface:Detailed, - AB842D, !- Name - Ceiling, !- Surface Type - ADJ_CEILING, !- Construction Name - first_floor, !- Zone Name - Zone, !- Outside Boundary Condition - second_floor, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 0.0, !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 0.000000000000, !- Vertex 1 X-coordinate {m} - 4.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 0.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 4.000000000000, !- Vertex 2 Z-coordinate {m} - 12.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 4.000000000000, !- Vertex 3 Z-coordinate {m} - 12.000000000000, !- Vertex 4 X-coordinate {m} - 4.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - Shading:Building:Detailed, - DA48D0, !- Name - , !- Transmittance Schedule Name - 4, !- Number of Vertices - 4.000000000000, !- Vertex 1 X-coordinate {m} - 0.000000000000, !- Vertex 1 Y-coordinate {m} - 0.000000000000, !- Vertex 1 Z-coordinate {m} - 4.000000000000, !- Vertex 2 X-coordinate {m} - -4.000000000000, !- Vertex 2 Y-coordinate {m} - 0.000000000000, !- Vertex 2 Z-coordinate {m} - 0.000000000000, !- Vertex 3 X-coordinate {m} - -4.000000000000, !- Vertex 3 Y-coordinate {m} - 0.000000000000, !- Vertex 3 Z-coordinate {m} - 0.000000000000, !- Vertex 4 X-coordinate {m} - 0.000000000000, !- Vertex 4 Y-coordinate {m} - 0.000000000000; !- Vertex 4 Z-coordinate {m} - - Shading:Building:Detailed, - A57FDE, !- Name - , !- Transmittance Schedule Name - 4, !- Number of Vertices - 4.000000000000, !- Vertex 1 X-coordinate {m} - 0.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 4.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 0.000000000000, !- Vertex 2 Z-coordinate {m} - 0.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 0.000000000000, !- Vertex 3 Z-coordinate {m} - 0.000000000000, !- Vertex 4 X-coordinate {m} - 0.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - Shading:Building:Detailed, - 5E879A, !- Name - , !- Transmittance Schedule Name - 4, !- Number of Vertices - 0.000000000000, !- Vertex 1 X-coordinate {m} - 0.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 0.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 0.000000000000, !- Vertex 2 Z-coordinate {m} - 0.000000000000, !- Vertex 3 X-coordinate {m} - -4.000000000000, !- Vertex 3 Y-coordinate {m} - 0.000000000000, !- Vertex 3 Z-coordinate {m} - 0.000000000000, !- Vertex 4 X-coordinate {m} - -4.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - Shading:Building:Detailed, - 7654C4, !- Name - , !- Transmittance Schedule Name - 4, !- Number of Vertices - 0.000000000000, !- Vertex 1 X-coordinate {m} - -4.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 0.000000000000, !- Vertex 2 X-coordinate {m} - -4.000000000000, !- Vertex 2 Y-coordinate {m} - 0.000000000000, !- Vertex 2 Z-coordinate {m} - 4.000000000000, !- Vertex 3 X-coordinate {m} - -4.000000000000, !- Vertex 3 Y-coordinate {m} - 0.000000000000, !- Vertex 3 Z-coordinate {m} - 4.000000000000, !- Vertex 4 X-coordinate {m} - -4.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - Shading:Building:Detailed, - 45CC51, !- Name - , !- Transmittance Schedule Name - 4, !- Number of Vertices - 0.000000000000, !- Vertex 1 X-coordinate {m} - 0.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 0.000000000000, !- Vertex 2 X-coordinate {m} - -4.000000000000, !- Vertex 2 Y-coordinate {m} - 4.000000000000, !- Vertex 2 Z-coordinate {m} - 4.000000000000, !- Vertex 3 X-coordinate {m} - -4.000000000000, !- Vertex 3 Y-coordinate {m} - 4.000000000000, !- Vertex 3 Z-coordinate {m} - 4.000000000000, !- Vertex 4 X-coordinate {m} - 0.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - Shading:Building:Detailed, - AD1387, !- Name - , !- Transmittance Schedule Name - 4, !- Number of Vertices - 4.000000000000, !- Vertex 1 X-coordinate {m} - -4.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 4.000000000000, !- Vertex 2 X-coordinate {m} - -4.000000000000, !- Vertex 2 Y-coordinate {m} - 0.000000000000, !- Vertex 2 Z-coordinate {m} - 4.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 0.000000000000, !- Vertex 3 Z-coordinate {m} - 4.000000000000, !- Vertex 4 X-coordinate {m} - 0.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - BuildingSurface:Detailed, - A46F84, !- Name - Wall, !- Surface Type - EXT_WALL, !- Construction Name - first_floor, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 0.000000000000, !- Vertex 1 X-coordinate {m} - 0.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 0.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 0.000000000000, !- Vertex 2 Z-coordinate {m} - 4.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 0.000000000000, !- Vertex 3 Z-coordinate {m} - 4.000000000000, !- Vertex 4 X-coordinate {m} - 0.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - FenestrationSurface:Detailed, - 750E67, !- Name - Window, !- Surface Type - EXT_WINDOW1, !- Construction Name - 248430, !- Building Surface Name - , !- Outside Boundary Condition Object - , !- TRNSYS 17 - additional surface data - ESHADE=INPUT 1*MAX_ESHADE : SHADECNTRL=ESHADE_INTERNAL, !- Shading Control Name - , !- Frame and Divider Name - , !- Multiplier - 4, !- Number of Vertices - 5.000000000000, !- Vertex 1 X-coordinate {m} - 0.000000000000, !- Vertex 1 Y-coordinate {m} - 3.000000000000, !- Vertex 1 Z-coordinate {m} - 5.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 1.000000000000, !- Vertex 2 Z-coordinate {m} - 11.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 1.000000000000, !- Vertex 3 Z-coordinate {m} - 11.000000000000, !- Vertex 4 X-coordinate {m} - 0.000000000000, !- Vertex 4 Y-coordinate {m} - 3.000000000000; !- Vertex 4 Z-coordinate {m} - - Zone, - second_floor, !- Name - 0.0, !- Direction of Relative North {deg} - 0.0, !- X Origin {m} - 0.0, !- Y Origin {m} - 4.0, !- Z Origin {m} - 32office, !- ZONE_TYPE - 1; !- Multiplier - - BuildingSurface:Detailed, - D2BEF4, !- Name - Floor, !- Surface Type - ADJ_CEILING, !- Construction Name - second_floor, !- Zone Name - Zone, !- Outside Boundary Condition - first_floor, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 0.0, !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 12.000000000000, !- Vertex 1 X-coordinate {m} - 4.000000000000, !- Vertex 1 Y-coordinate {m} - 4.000000000000, !- Vertex 1 Z-coordinate {m} - 12.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 4.000000000000, !- Vertex 2 Z-coordinate {m} - 0.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 4.000000000000, !- Vertex 3 Z-coordinate {m} - 0.000000000000, !- Vertex 4 X-coordinate {m} - 4.000000000000, !- Vertex 4 Y-coordinate {m} - 4.000000000000; !- Vertex 4 Z-coordinate {m} - - BuildingSurface:Detailed, - AAFCFF, !- Name - Roof, !- Surface Type - EXT_WALL, !- Construction Name - second_floor, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 0.000000000000, !- Vertex 1 X-coordinate {m} - 2.000000000000, !- Vertex 1 Y-coordinate {m} - 9.000000000000, !- Vertex 1 Z-coordinate {m} - 0.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 8.000000000000, !- Vertex 2 Z-coordinate {m} - 12.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 8.000000000000, !- Vertex 3 Z-coordinate {m} - 12.000000000000, !- Vertex 4 X-coordinate {m} - 2.000000000000, !- Vertex 4 Y-coordinate {m} - 9.000000000000; !- Vertex 4 Z-coordinate {m} - - BuildingSurface:Detailed, - 2F8C0E, !- Name - Wall, !- Surface Type - EXT_WALL, !- Construction Name - second_floor, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 0.000000000000, !- Vertex 1 X-coordinate {m} - 0.000000000000, !- Vertex 1 Y-coordinate {m} - 8.000000000000, !- Vertex 1 Z-coordinate {m} - 0.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 4.000000000000, !- Vertex 2 Z-coordinate {m} - 12.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 4.000000000000, !- Vertex 3 Z-coordinate {m} - 12.000000000000, !- Vertex 4 X-coordinate {m} - 0.000000000000, !- Vertex 4 Y-coordinate {m} - 8.000000000000; !- Vertex 4 Z-coordinate {m} - - BuildingSurface:Detailed, - 9B995F, !- Name - Wall, !- Surface Type - EXT_WALL, !- Construction Name - second_floor, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 5, !- Number of Vertices - 0.000000000000, !- Vertex 1 X-coordinate {m} - 4.000000000000, !- Vertex 1 Y-coordinate {m} - 8.000000000000, !- Vertex 1 Z-coordinate {m} - 0.000000000000, !- Vertex 2 X-coordinate {m} - 4.000000000000, !- Vertex 2 Y-coordinate {m} - 4.000000000000, !- Vertex 2 Z-coordinate {m} - 0.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 4.000000000000, !- Vertex 3 Z-coordinate {m} - 0.000000000000, !- Vertex 4 X-coordinate {m} - 0.000000000000, !- Vertex 4 Y-coordinate {m} - 8.000000000000, !- Vertex 4 Z-coordinate {m} - 0.000000000000, !- Vertex 5 X-coordinate {m} - 2.000000000000, !- Vertex 5 Y-coordinate {m} - 9.000000000000; !- Vertex 5 Z-coordinate {m} - - BuildingSurface:Detailed, - 4481E9, !- Name - Wall, !- Surface Type - EXT_WALL, !- Construction Name - second_floor, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 12.000000000000, !- Vertex 1 X-coordinate {m} - 4.000000000000, !- Vertex 1 Y-coordinate {m} - 8.000000000000, !- Vertex 1 Z-coordinate {m} - 12.000000000000, !- Vertex 2 X-coordinate {m} - 4.000000000000, !- Vertex 2 Y-coordinate {m} - 4.000000000000, !- Vertex 2 Z-coordinate {m} - 0.000000000000, !- Vertex 3 X-coordinate {m} - 4.000000000000, !- Vertex 3 Y-coordinate {m} - 4.000000000000, !- Vertex 3 Z-coordinate {m} - 0.000000000000, !- Vertex 4 X-coordinate {m} - 4.000000000000, !- Vertex 4 Y-coordinate {m} - 8.000000000000; !- Vertex 4 Z-coordinate {m} - - BuildingSurface:Detailed, - 1406E4, !- Name - Wall, !- Surface Type - EXT_WALL, !- Construction Name - second_floor, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 5, !- Number of Vertices - 12.000000000000, !- Vertex 1 X-coordinate {m} - 0.000000000000, !- Vertex 1 Y-coordinate {m} - 8.000000000000, !- Vertex 1 Z-coordinate {m} - 12.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 4.000000000000, !- Vertex 2 Z-coordinate {m} - 12.000000000000, !- Vertex 3 X-coordinate {m} - 4.000000000000, !- Vertex 3 Y-coordinate {m} - 4.000000000000, !- Vertex 3 Z-coordinate {m} - 12.000000000000, !- Vertex 4 X-coordinate {m} - 4.000000000000, !- Vertex 4 Y-coordinate {m} - 8.000000000000, !- Vertex 4 Z-coordinate {m} - 12.000000000000, !- Vertex 5 X-coordinate {m} - 2.000000000000, !- Vertex 5 Y-coordinate {m} - 9.000000000000; !- Vertex 5 Z-coordinate {m} - - BuildingSurface:Detailed, - 6D6821, !- Name - Roof, !- Surface Type - EXT_WALL, !- Construction Name - second_floor, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- TRNSYS 17 - additional surface data - 4, !- Number of Vertices - 12.000000000000, !- Vertex 1 X-coordinate {m} - 2.000000000000, !- Vertex 1 Y-coordinate {m} - 9.000000000000, !- Vertex 1 Z-coordinate {m} - 12.000000000000, !- Vertex 2 X-coordinate {m} - 4.000000000000, !- Vertex 2 Y-coordinate {m} - 8.000000000000, !- Vertex 2 Z-coordinate {m} - 0.000000000000, !- Vertex 3 X-coordinate {m} - 4.000000000000, !- Vertex 3 Y-coordinate {m} - 8.000000000000, !- Vertex 3 Z-coordinate {m} - 0.000000000000, !- Vertex 4 X-coordinate {m} - 2.000000000000, !- Vertex 4 Y-coordinate {m} - 9.000000000000; !- Vertex 4 Z-coordinate {m} - - FenestrationSurface:Detailed, - 36666A, !- Name - Window, !- Surface Type - EXT_WINDOW1, !- Construction Name - 2F8C0E, !- Building Surface Name - , !- Outside Boundary Condition Object - , !- TRNSYS 17 - additional surface data - , !- Shading Control Name - , !- Frame and Divider Name - , !- Multiplier - 4, !- Number of Vertices - 1.000000000000, !- Vertex 1 X-coordinate {m} - 0.000000000000, !- Vertex 1 Y-coordinate {m} - 7.000000000000, !- Vertex 1 Z-coordinate {m} - 1.000000000000, !- Vertex 2 X-coordinate {m} - 0.000000000000, !- Vertex 2 Y-coordinate {m} - 5.000000000000, !- Vertex 2 Z-coordinate {m} - 11.000000000000, !- Vertex 3 X-coordinate {m} - 0.000000000000, !- Vertex 3 Y-coordinate {m} - 5.000000000000, !- Vertex 3 Z-coordinate {m} - 11.000000000000, !- Vertex 4 X-coordinate {m} - 0.000000000000, !- Vertex 4 Y-coordinate {m} - 7.000000000000; !- Vertex 4 Z-coordinate {m} diff --git a/tests/input_data/trnsys/HeatPumpWaterHeater.sqlite b/tests/input_data/trnsys/HeatPumpWaterHeater.sqlite deleted file mode 100644 index 216d7819..00000000 Binary files a/tests/input_data/trnsys/HeatPumpWaterHeater.sqlite and /dev/null differ diff --git a/tests/input_data/trnsys/NewFileTemplate.d18 b/tests/input_data/trnsys/NewFileTemplate.d18 deleted file mode 100644 index 888955a6..00000000 --- a/tests/input_data/trnsys/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/tests/input_data/trnsys/T3D_simple_2_zone.b18 b/tests/input_data/trnsys/T3D_simple_2_zone.b18 deleted file mode 100644 index 162993db..00000000 --- a/tests/input_data/trnsys/T3D_simple_2_zone.b18 +++ /dev/null @@ -1,402 +0,0 @@ -************************************************************************************************************************ -* TRNBuild 2.0.198 -************************************************************************************************************************ -* BUILDING DESCRIPTIONS FILE TRNSYS -* FOR BUILDING: /Users/leroylouis/Dropbox/Cours_Poly/Projet_maitrise/archetypal/T3D_simple_2_zone.b18 -* GET BY WORKING WITH TRNBuild 2.0 for Windows -************************************************************************************************************************ -* -*----------------------------------------------------------------------------------------------------------------------- -* C o m m e n t s -*----------------------------------------------------------------------------------------------------------------------- -*#C Originally created by TRNSIDF Version 1.81 -* -*----------------------------------------------------------------------------------------------------------------------- -* 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 -*----------------------------------------------------------------------------------------------------------------------- -LAYER mag_000001 - RESISTANCE=0.05 : PERT= 0 : PENRT= 0 -LAYER mag_000000 - RESISTANCE=0.0417 : PERT= 0 : PENRT= 0 -LAYER mnm_000000 - RESISTANCE=0.0278 : PERT= 0 : PENRT= 0 -LAYER m_000013 - CONDUCTIVITY=0.1555 : CAPACITY= 0.837 : DENSITY= 91.0 : PERT= 0 : PENRT= 0 -LAYER m_000012 - CONDUCTIVITY=0.1764 : CAPACITY= 0.8368 : DENSITY= 265.0 : PERT= 0 : PENRT= 0 -LAYER m_000009 - CONDUCTIVITY=4.7196 : CAPACITY= 0.8368 : DENSITY= 2240.0 : PERT= 0 : PENRT= 0 -LAYER m_000008 - CONDUCTIVITY=1.908 : CAPACITY= 0.84 : DENSITY= 1280.0 : PERT= 0 : PENRT= 0 -LAYER m_000007 - CONDUCTIVITY=0.108 : CAPACITY= 1.21 : DENSITY= 43.0 : PERT= 0 : PENRT= 0 -LAYER m_000006 - CONDUCTIVITY=0.54 : CAPACITY= 1.63 : DENSITY= 608.0 : PERT= 0 : PENRT= 0 -LAYER m_000005 - CONDUCTIVITY=0.576 : CAPACITY= 1.09 : DENSITY= 800.0 : PERT= 0 : PENRT= 0 -LAYER m_000004 - CONDUCTIVITY=0.216 : CAPACITY= 0.59 : DENSITY= 368.0 : PERT= 0 : PENRT= 0 -LAYER m_000002 - CONDUCTIVITY=6.2266 : CAPACITY= 0.837 : DENSITY= 2243.0 : PERT= 0 : PENRT= 0 -LAYER m_000001 - CONDUCTIVITY=2.4905 : CAPACITY= 0.837 : DENSITY= 1858.0 : PERT= 0 : PENRT= 0 -LAYER m_000000 - CONDUCTIVITY=0.576 : CAPACITY= 0.83 : DENSITY= 784.9 : PERT= 0 : PENRT= 0 -*----------------------------------------------------------------------------------------------------------------------- -* 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 -*----------------------------------------------------------------------------------------------------------------------- -SCHEDULE sy_000007 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 -SCHEDULE sy_000006 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 -SCHEDULE sy_000005 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 100.0 -SCHEDULE sy_000004 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 -SCHEDULE sy_000003 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 -SCHEDULE sch_h_setpoint_z_000001 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 -SCHEDULE sch_h_setpoint_z_000000 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 -SCHEDULE sch_ground - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 18.0 18.0 18.0 18.0 18.0 18.0 18.0 18.0 18.0 18.0 18.0 18.0 18.0 -SCHEDULE sch_c_setpoint_z_000001 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 -SCHEDULE sch_c_setpoint_z_000000 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 -SCHEDULE sc_000002 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 30.0 -SCHEDULE sc_000001 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 20.0 -SCHEDULE sc_000000 - HOURS= 0 744 1416 2160 2880 3624 4344 5088 5832 6552 7296 8016 8760 - VALUES= 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -*----------------------------------------------------------------------------------------------------------------------- -* C O N S T R U C T I O N (Wall, Floor, Ceiling,..) -*----------------------------------------------------------------------------------------------------------------------- -CONSTRUCTION c_000012 - LAYERS = m_000005 mag_000000 m_000005 - THICKNESS= 0.019 0.0 0.019 - ABS-FRONT= 0.4 : ABS-BACK= 0.4 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 64 -CONSTRUCTION c_000006 - LAYERS = mnm_000000 m_000009 - THICKNESS= 0.0 0.1016 - ABS-FRONT= 0.85 : ABS-BACK= 0.8 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 0.0005 -CONSTRUCTION c_000003 - LAYERS = m_000000 m_000013 m_000002 m_000001 - THICKNESS= 0.0127 0.0914 0.2033 0.0253 - ABS-FRONT= 0.92 : ABS-BACK= 0.4 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 64 -CONSTRUCTION c_000001 - LAYERS = m_000012 - THICKNESS= 0.263 - ABS-FRONT= 0.7 : ABS-BACK= 0.7 - EPS-FRONT= 0.9 : EPS-BACK= 0.9 - HFRONT = 11 : HBACK= 64 -*----------------------------------------------------------------------------------------------------------------------- -* W i n d o w s -*----------------------------------------------------------------------------------------------------------------------- -WINDOW EXT_WINDOW1 - WINID = 3416: HINSIDE = 11: HOUTSIDE = 64: SLOPE = 90.0: SPACID = 4: WWID = 0.77: WHEIG = 1.08: FFRAME = 0.15: UFRAME = 8.17: ABSFRAME = 0.6: RISHADE = 0: RESHADE = 0: REFLISHADE = 0.5: REFLOSHADE = 0.5: CCISHADE = 0.5: EPSFRAME = 0.9: EPSISHADE = 0.9: ITSHADECLOSE = INPUT 1 * SHADE_CLOSE: ITSHADEOPEN = INPUT 1 * SHADE_OPEN: FLOWTOAIRNODE = 1: PERT = 0: PENRT = 0: RADMATERIAL = undefined: RADMATERIAL_SHD1 = undefined - -*----------------------------------------------------------------------------------------------------------------------- -* G a i n s -*----------------------------------------------------------------------------------------------------------------------- -GAIN ee_000001 - CONVECTIVE=27.0 : RADIATIVE=27.0 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=EQUIPMENT -GAIN ee_000000 - CONVECTIVE=27.0 : RADIATIVE=27.0 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=EQUIPMENT -GAIN l_000001 - CONVECTIVE=16.2 : RADIATIVE=16.2 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=LIGHTS -GAIN l_000000 - CONVECTIVE=16.2 : RADIATIVE=16.2 : HUMIDITY=0 : ELPOWERFRAC=1 : AREA_RELATED : CATEGORY=LIGHTS -GAIN p_000001 - CONVECTIVE=3.78 : RADIATIVE=1.62 : HUMIDITY=0.066 : ELPOWERFRAC=0 : AREA_RELATED : CATEGORY=PEOPLE -GAIN p_000000 - CONVECTIVE=3.78 : RADIATIVE=1.62 : HUMIDITY=0.066 : ELPOWERFRAC=0 : AREA_RELATED : CATEGORY=PEOPLE -*----------------------------------------------------------------------------------------------------------------------- -* 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 -*----------------------------------------------------------------------------------------------------------------------- -HEATING HEAT_z2 - ON= SCHEDULE 1*sch_h_setpoint_z_000001 -POWER=118.61999999999998 - HUMIDITY=0 - RRAD=0 - ELPOWERFRAC=0 - AREA_RELATED_POWER=1 -HEATING HEAT_z1 - ON= SCHEDULE 1*sch_h_setpoint_z_000000 -POWER=119.835 - HUMIDITY=0 - RRAD=0 - ELPOWERFRAC=0 - AREA_RELATED_POWER=1 -*----------------------------------------------------------------------------------------------------------------------- -* D a y l i g h t C o n t r o l -*----------------------------------------------------------------------------------------------------------------------- -*----------------------------------------------------------------------------------------------------------------------- -* Z o n e s -*----------------------------------------------------------------------------------------------------------------------- -ZONES z_000001 z_000000 -*----------------------------------------------------------------------------------------------------------------------- -* O r i e n t a t i o n s -*----------------------------------------------------------------------------------------------------------------------- -HEMISPHERE NORTHERN -ORIENTATIONS H_0_0 S_0_90 W_90_90 N_180_90 E_270_90 -INTERNAL_CALCULATION H_0_0 S_0_90 W_90_90 N_180_90 E_270_90 -*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -BUILDING -*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -*----------------------------------------------------------------------------------------------------------------------- -* Z o n e z_000001 / A i r n o d e z_000001 -*----------------------------------------------------------------------------------------------------------------------- -ZONE z_000001 -RADIATIONMODE - BEAM=STANDARD : DIFFUSE=STANDARD : LONGWAVE=STANDARD : GEOMODE = 3D_DATA : FSOLAIR=0 - DAYLIGHTMODE - DLSHADE =-1 -AIRNODE z_000001 -WALL =c_000003 : SURF= 1 : AREA= 24.384 : EXTERNAL : ORI=S_0_90 : FSKY=0.50 : GEOSURF=0.133333 -WALL =c_000003 : SURF= 2 : AREA= 12.192 : EXTERNAL : ORI=W_90_90 : FSKY=0.50 : GEOSURF=0.066667 -WALL =c_000012 : SURF= 3 : AREA= 24.384 : ADJACENT=z_000000 : ADJ_SURF=11 : FRONT : GEOSURF=0.133333 -FLOOR =c_000006 : SURF= 4 : AREA= 50.000 : BOUNDARY=SCHEDULE 1*sch_ground : GEOSURF=0.600000 -ROOF =c_000001 : SURF= 5 : AREA= 50.000 : EXTERNAL : ORI=H_0_0 : FSKY=1.00 -WALL =c_000003 : SURF= 6 : AREA= 12.192 : EXTERNAL : ORI=E_270_90 : FSKY=0.50 : GEOSURF=0.066667 - REGIME - CAPACITANCE= 146.304 : VOLUME= 121.920 : REFAREA= 50.000: TINITIAL= 20.0 : PHINITIAL= 50 : WCAPR= 1 - -*----------------------------------------------------------------------------------------------------------------------- -* Z o n e z_000000 / A i r n o d e z_000000 -*----------------------------------------------------------------------------------------------------------------------- -ZONE z_000000 -RADIATIONMODE - BEAM=STANDARD : DIFFUSE=STANDARD : LONGWAVE=STANDARD : GEOMODE = 3D_DATA : FSOLAIR=0 - DAYLIGHTMODE - DLSHADE =-1 -AIRNODE z_000000 -FLOOR =c_000006 : SURF= 7 : AREA= 50.000 : BOUNDARY=SCHEDULE 1*sch_ground : GEOSURF=0.600000 -ROOF =c_000001 : SURF= 8 : AREA= 50.000 : EXTERNAL : ORI=H_0_0 : FSKY=1.00 -WALL =c_000003 : SURF= 9 : AREA= 24.384 : EXTERNAL : ORI=N_180_90 : FSKY=0.50 : GEOSURF=0.133333 -WALL =c_000003 : SURF= 10 : AREA= 9.942 : EXTERNAL : ORI=E_270_90 : FSKY=0.50 : GEOSURF=0.054364 -WINDOW=EXT_WINDOW1 : SURF= 13 : AREA= 2.250 : EXTERNAL : ORI=N_180_90 : FSKY=0.50 : GEOSURF=0.012303 -WALL =c_000012 : SURF= 11 : AREA= 24.384 : ADJACENT=z_000001 : ADJ_SURF=3 : BACK : GEOSURF=0.133333 -WALL =c_000003 : SURF= 12 : AREA= 12.192 : EXTERNAL : ORI=W_90_90 : FSKY=0.50 : GEOSURF=0.066667 - REGIME - CAPACITANCE= 146.304 : VOLUME= 121.920 : REFAREA= 50.000: TINITIAL= 20.0 : PHINITIAL= 50 : WCAPR= 1 - -*----------------------------------------------------------------------------------------------------------------------- -* O u t p u t s -*----------------------------------------------------------------------------------------------------------------------- -OUTPUTS -TRANSFER : TIMEBASE=1.000 -AIRNODES = z_000001 -NTYPE = 1 : Tair - node temperature - = 25 : Top - operative temperature - = 30 : QHEAT - sensible heating demand of airnode (positive values) - = 31 : QCOOL - sensible cooling demand of airnode (positive values) - = 156 : QELEQUIP - Electric energy demand of "equipment" gains of airnode [kJ/hr] - = 155 : QELLIGHT - Electric energy demand of "lights" gains of airnode [kJ/hr] -AIRNODES = z_000000 -NTYPE = 1 : Tair - node temperature - = 25 : Top - operative temperature - = 30 : QHEAT - sensible heating demand of airnode (positive values) - = 31 : QCOOL - sensible cooling demand of airnode (positive values) - = 156 : QELEQUIP - Electric energy demand of "equipment" gains of airnode [kJ/hr] - = 155 : QELLIGHT - Electric energy demand of "lights" gains of airnode [kJ/hr] -*----------------------------------------------------------------------------------------------------------------------- -*----------------------------------------------------------------------------------------------------------------------- -*----------------------------------------------------------------------------------------------------------------------- -* T R N S F L O W Multizone Airflow Network (Model COMIS 3.1) -*----------------------------------------------------------------------------------------------------------------------- -* E n d -*----------------------------------------------------------------------------------------------------------------------- -END - -_EXTENSION_WINPOOL_START_ -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 - - *** END OF LIBRARY *** - ******************************************************************************************************************************** - *WinID Description Design U-Value g-value T-sol Rf-sol T-vis_daylight Lay Width(mm) - ******************************************************************************************************************************** - 3416 GU_Solar_Neutral_70_Ar90 6/16/4 2.65 0.65 0.607 0.253 0.65 2 26 -_EXTENSION_WINPOOL_END_ - -_EXTENSION_BuildingGeometry_START_ -vertex 1 5 215 2.4384 -vertex 2 -5 215 2.4384 -vertex 3 -5 215 0 -vertex 4 5 215 0 -vertex 5 -5 220 2.4384 -vertex 6 -5 220 0 -vertex 7 5 220 2.4384 -vertex 8 5 220 0 -vertex 9 5 225 2.4384 -vertex 10 5 225 0 -vertex 11 215.5 5 0.5 -vertex 12 215.5 5 2 -vertex 13 217 5 2 -vertex 14 217 5 0.5 -vertex 15 -5 225 2.4384 -vertex 16 -5 225 0 - -zone z_000001 -wall 1 1 2 3 4 -wall 2 2 5 6 3 -wall 3 5 7 8 6 -floor 4 8 4 3 6 -roof 5 5 2 1 7 -wall 6 7 1 4 8 - -zone z_000000 -floor 7 10 8 6 16 -roof 8 15 5 7 9 -wall 9 15 9 10 16 -wall 10 9 7 8 10 -window 13 11 12 13 14 -wall 11 7 5 6 8 -wall 12 5 15 16 6 - -_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_ - diff --git a/tests/input_data/trnsys/concrete_.idf b/tests/input_data/trnsys/concrete_.idf deleted file mode 100644 index c0fd7437..00000000 --- a/tests/input_data/trnsys/concrete_.idf +++ /dev/null @@ -1,511 +0,0 @@ -!-Generator IDFEditor 1.50 -!-Option SortedOrder -!-NOTE: All comments with '!-' are ignored by the IDFEditor and are generated automatically. -!- Use '!' comments if they need to be retained when using the IDFEditor. -!- =========== ALL OBJECTS IN CLASS: VERSION =========== - - Version,9.2; - -!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== - - SimulationControl, - No, !- Do Zone Sizing Calculation - No, !- Do System Sizing Calculation - No, !- Do Plant Sizing Calculation - Yes, !- Run Simulation for Sizing Periods - Yes; !- Run Simulation for Weather File Run Periods - -!- =========== ALL OBJECTS IN CLASS: BUILDING =========== - - Building, - Building 1, !- Name - , !- North Axis {deg} - , !- Terrain - , !- Loads Convergence Tolerance Value - , !- Temperature Convergence Tolerance Value {deltaC} - , !- Solar Distribution - , !- Maximum Number of Warmup Days - ; !- Minimum Number of Warmup Days - -!- =========== ALL OBJECTS IN CLASS: SHADOWCALCULATION =========== - - ShadowCalculation, - AverageOverDaysInFrequency, !- Calculation Method - 20, !- Calculation Frequency - 15000; !- Maximum Figures in Shadow Overlap Calculations - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:INSIDE =========== - - SurfaceConvectionAlgorithm:Inside,Simple; - -!- =========== ALL OBJECTS IN CLASS: HEATBALANCEALGORITHM =========== - - HeatBalanceAlgorithm,ConductionTransferFunction,200; - -!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== - - Timestep,6; - -!- =========== ALL OBJECTS IN CLASS: SITE:LOCATION =========== - - Site:Location, - Site 1, !- Name - 0, !- Latitude {deg} - 0, !- Longitude {deg} - 0, !- Time Zone {hr} - 0; !- Elevation {m} - -!- =========== ALL OBJECTS IN CLASS: RUNPERIOD =========== - - RunPeriod, - Run Period 1, !- Name - 1, !- Begin Month - 1, !- Begin Day of Month - 2009, !- Begin Year - 12, !- End Month - 31, !- End Day of Month - 2009, !- End Year - Thursday, !- Day of Week for Start Day - No, !- Use Weather File Holidays and Special Days - No, !- Use Weather File Daylight Saving Period - No, !- Apply Weekend Holiday Rule - Yes, !- Use Weather File Rain Indicators - Yes; !- Use Weather File Snow Indicators - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:CONSTANT =========== - - Schedule:Constant,Always On Discrete,,1; - - Schedule:Constant,Always Off Discrete,,0; - - Schedule:Constant,Always On Continuous,,1; - -!- =========== ALL OBJECTS IN CLASS: MATERIAL =========== - - Material, - 4IN Concrete HW, !- Name - MediumRough, !- Roughness - 0.1, !- Thickness {m} - 1.72959999999999, !- Conductivity {W/m-K} - 2242.99999999999, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.65, !- Solar Absorptance - 0.65; !- Visible Absorptance - - Material, - Insulation, !- Name - Smooth, !- Roughness - 0.1, !- Thickness {m} - 0.02436, !- Conductivity {W/m-K} - 1.2754, !- Density {kg/m3} - 100.5, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:NOMASS =========== - - Material:NoMass, - Ins_floor, !- Name - Smooth, !- Roughness - 72, !- Thermal Resistance {m2-K/W} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== - - Construction, - floor, !- Name - 4IN Concrete HW, !- Outside Layer - Insulation, !- Layer 2 - 4IN Concrete HW; !- Layer 3 - - Construction, - roof, !- Name - 4IN Concrete HW, !- Outside Layer - Insulation, !- Layer 2 - 4IN Concrete HW; !- Layer 3 - - Construction, - wall, !- Name - 4IN Concrete HW, !- Outside Layer - Insulation, !- Layer 2 - 4IN Concrete HW; !- Layer 3 - - Construction, - ins_floor_constr, !- Name - Ins_floor; !- Outside Layer - -!- =========== ALL OBJECTS IN CLASS: GLOBALGEOMETRYRULES =========== - - GlobalGeometryRules, - UpperLeftCorner, !- Starting Vertex Position - Counterclockwise, !- Vertex Entry Direction - Relative, !- Coordinate System - Relative, !- Daylighting Reference Point Coordinate System - Relative; !- Rectangular Surface Coordinate System - -!- =========== ALL OBJECTS IN CLASS: ZONE =========== - - Zone, - Thermal Zone 1, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - -!- =========== ALL OBJECTS IN CLASS: BUILDINGSURFACE:DETAILED =========== - - BuildingSurface:Detailed, - Face 0, !- Name - Floor, !- Surface Type - ins_floor_constr, !- Construction Name - Thermal Zone 1, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -85,95,0, !- X,Y,Z ==> Vertex 1 {m} - -85,85,0, !- X,Y,Z ==> Vertex 2 {m} - -95,85,0, !- X,Y,Z ==> Vertex 3 {m} - -95,95,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 1, !- Name - Roof, !- Surface Type - roof, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -95,95,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -95,85,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -85,85,2.4384, !- X,Y,Z ==> Vertex 3 {m} - -85,95,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 2, !- Name - Wall, !- Surface Type - wall, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -85,95,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -85,85,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -85,85,0, !- X,Y,Z ==> Vertex 3 {m} - -85,95,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 3, !- Name - Wall, !- Surface Type - wall, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -85,85,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -95,85,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -95,85,0, !- X,Y,Z ==> Vertex 3 {m} - -85,85,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 4, !- Name - Wall, !- Surface Type - wall, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -95,85,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -95,95,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -95,95,0, !- X,Y,Z ==> Vertex 3 {m} - -95,85,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 5, !- Name - Wall, !- Surface Type - wall, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -95,95,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -85,95,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -85,95,0, !- X,Y,Z ==> Vertex 3 {m} - -95,95,0; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: SIZING:PARAMETERS =========== - - Sizing:Parameters, - 1.25, !- Heating Sizing Factor - 1.15; !- Cooling Sizing Factor - -!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODE =========== - - OutdoorAir:Node, - Model Outdoor Air Node; !- Name - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:PARAMETERS =========== - - LifeCycleCost:Parameters, - Life Cycle Cost Parameters, !- Name - EndOfYear, !- Discounting Convention - ConstantDollar, !- Inflation Approach - 0.03, !- Real Discount Rate - , !- Nominal Discount Rate - , !- Inflation - , !- Base Date Month - 2011, !- Base Date Year - , !- Service Date Month - 2011, !- Service Date Year - 25, !- Length of Study Period in Years - , !- Tax rate - None; !- Depreciation Method - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:NONRECURRINGCOST =========== - - LifeCycleCost:NonrecurringCost, - Default Cost, !- Name - Construction, !- Category - 0, !- Cost - ServicePeriod; !- Start of Costs - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:USEPRICEESCALATION =========== - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Electricity, !- LCC Price Escalation Name - Electricity, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9838, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9632, !- Year 3 Escalation - 0.9611, !- Year 4 Escalation - 0.9571, !- Year 5 Escalation - 0.9553, !- Year 6 Escalation - 0.9539, !- Year 7 Escalation - 0.9521, !- Year 8 Escalation - 0.9546, !- Year 9 Escalation - 0.9550, !- - 0.9553, !- - 0.9564, !- - 0.9575, !- - 0.9596, !- - 0.9618, !- - 0.9614, !- - 0.9618, !- - 0.9618, !- - 0.9593, !- - 0.9589, !- - 0.9607, !- - 0.9625, !- - 0.9650, !- - 0.9708, !- - 0.9751, !- - 0.9762, !- - 0.9766, !- - 0.9766, !- - 0.9769, !- - 0.9773; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Distillate Oil, !- LCC Price Escalation Name - FuelOil#1, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9714, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9942, !- Year 3 Escalation - 1.0164, !- Year 4 Escalation - 1.0541, !- Year 5 Escalation - 1.0928, !- Year 6 Escalation - 1.1267, !- Year 7 Escalation - 1.1580, !- Year 8 Escalation - 1.1792, !- Year 9 Escalation - 1.1967, !- - 1.2200, !- - 1.2333, !- - 1.2566, !- - 1.2709, !- - 1.2826, !- - 1.2985, !- - 1.3102, !- - 1.3250, !- - 1.3261, !- - 1.3282, !- - 1.3324, !- - 1.3356, !- - 1.3431, !- - 1.3510, !- - 1.3568, !- - 1.3606, !- - 1.3637, !- - 1.3674, !- - 1.3706, !- - 1.3743; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Residual Oil, !- LCC Price Escalation Name - FuelOil#2, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.8469, !- Year 1 Escalation - 0.8257, !- Year 2 Escalation - 0.8681, !- Year 3 Escalation - 0.8988, !- Year 4 Escalation - 0.9289, !- Year 5 Escalation - 0.9604, !- Year 6 Escalation - 0.9897, !- Year 7 Escalation - 1.0075, !- Year 8 Escalation - 1.0314, !- Year 9 Escalation - 1.0554, !- - 1.0861, !- - 1.1278, !- - 1.1497, !- - 1.1620, !- - 1.1743, !- - 1.1852, !- - 1.1948, !- - 1.2037, !- - 1.2071, !- - 1.2119, !- - 1.2139, !- - 1.2194, !- - 1.2276, !- - 1.2365, !- - 1.2420, !- - 1.2461, !- - 1.2509, !- - 1.2550, !- - 1.2591, !- - 1.2638; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Natural gas, !- LCC Price Escalation Name - NaturalGas, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9823, !- Year 1 Escalation - 0.9557, !- Year 2 Escalation - 0.9279, !- Year 3 Escalation - 0.9257, !- Year 4 Escalation - 0.9346, !- Year 5 Escalation - 0.9412, !- Year 6 Escalation - 0.9512, !- Year 7 Escalation - 0.9645, !- Year 8 Escalation - 0.9856, !- Year 9 Escalation - 1.0067, !- - 1.0222, !- - 1.0410, !- - 1.0610, !- - 1.0787, !- - 1.0942, !- - 1.1098, !- - 1.1220, !- - 1.1308, !- - 1.1386, !- - 1.1486, !- - 1.1619, !- - 1.1763, !- - 1.1918, !- - 1.2118, !- - 1.2284, !- - 1.2439, !- - 1.2605, !- - 1.2772, !- - 1.2938, !- - 1.3115; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Coal, !- LCC Price Escalation Name - Coal, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9970, !- Year 1 Escalation - 1.0089, !- Year 2 Escalation - 1.0089, !- Year 3 Escalation - 0.9941, !- Year 4 Escalation - 0.9941, !- Year 5 Escalation - 1.0000, !- Year 6 Escalation - 1.0030, !- Year 7 Escalation - 1.0059, !- Year 8 Escalation - 1.0089, !- Year 9 Escalation - 1.0119, !- - 1.0148, !- - 1.0178, !- - 1.0208, !- - 1.0267, !- - 1.0297, !- - 1.0356, !- - 1.0415, !- - 1.0534, !- - 1.0564, !- - 1.0593, !- - 1.0653, !- - 1.0712, !- - 1.0742, !- - 1.0801, !- - 1.0831, !- - 1.0831, !- - 1.0861, !- - 1.0890, !- - 1.0920, !- - 1.0950; !- - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== - - Output:VariableDictionary,IDF,Unsorted; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:SUMMARYREPORTS =========== - - Output:Table:SummaryReports, - AllSummary; !- Report 1 Name - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:TABLE:STYLE =========== - - OutputControl:Table:Style, - HTML; !- Column Separator - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLE =========== - - Output:Variable,*,Baseboard Electric Energy,Timestep; - - Output:Variable,*,Site Outdoor Air Drybulb Temperature,Timestep; - - Output:Variable,*,Zone Air Temperature,Timestep; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:METER =========== - - Output:Meter,InteriorEquipment:Electricity,Timestep; - - Output:Meter,InteriorLights:Electricity,Timestep; - - Output:Meter,Cooling:EnergyTransfer,Timestep; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:SQLITE =========== - - Output:SQLite, - SimpleAndTabular; !- Option Type - diff --git a/tests/input_data/trnsys/simple_2_zone.idf b/tests/input_data/trnsys/simple_2_zone.idf deleted file mode 100644 index dc2b7c5d..00000000 --- a/tests/input_data/trnsys/simple_2_zone.idf +++ /dev/null @@ -1,1370 +0,0 @@ -!-Generator IDFEditor 1.50 -!-Option SortedOrder -!-NOTE: All comments with '!-' are ignored by the IDFEditor and are generated automatically. -!- Use '!' comments if they need to be retained when using the IDFEditor. -!- =========== ALL OBJECTS IN CLASS: VERSION =========== - - Version,9.2; - -!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== - - SimulationControl, - Yes, !- Do Zone Sizing Calculation - No, !- Do System Sizing Calculation - No, !- Do Plant Sizing Calculation - Yes, !- Run Simulation for Sizing Periods - Yes; !- Run Simulation for Weather File Run Periods - -!- =========== ALL OBJECTS IN CLASS: BUILDING =========== - - Building, - Building 1, !- Name - , !- North Axis {deg} - , !- Terrain - , !- Loads Convergence Tolerance Value - , !- Temperature Convergence Tolerance Value {deltaC} - , !- Solar Distribution - , !- Maximum Number of Warmup Days - ; !- Minimum Number of Warmup Days - -!- =========== ALL OBJECTS IN CLASS: SHADOWCALCULATION =========== - - ShadowCalculation, - AverageOverDaysInFrequency, !- Calculation Method - 20, !- Calculation Frequency - 15000; !- Maximum Figures in Shadow Overlap Calculations - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:INSIDE =========== - - SurfaceConvectionAlgorithm:Inside,TARP; - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:OUTSIDE =========== - - SurfaceConvectionAlgorithm:Outside,DOE-2; - -!- =========== ALL OBJECTS IN CLASS: HEATBALANCEALGORITHM =========== - - HeatBalanceAlgorithm,ConductionTransferFunction,200; - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRHEATBALANCEALGORITHM =========== - - ZoneAirHeatBalanceAlgorithm, - ThirdOrderBackwardDifference; !- Algorithm - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRCONTAMINANTBALANCE =========== - - ZoneAirContaminantBalance, - No; !- Carbon Dioxide Concentration - -!- =========== ALL OBJECTS IN CLASS: ZONECAPACITANCEMULTIPLIER:RESEARCHSPECIAL =========== - - ZoneCapacitanceMultiplier:ResearchSpecial, - Zone Capacitance Multiplier Research Special, !- Name - , !- Zone or ZoneList Name - , !- Temperature Capacity Multiplier - , !- Humidity Capacity Multiplier - , !- Carbon Dioxide Capacity Multiplier - ; !- Generic Contaminant Capacity Multiplier - -!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== - - Timestep,6; - -!- =========== ALL OBJECTS IN CLASS: CONVERGENCELIMITS =========== - - ConvergenceLimits, - 1; !- Minimum System Timestep {minutes} - -!- =========== ALL OBJECTS IN CLASS: SITE:LOCATION =========== - - Site:Location, - Site 1, !- Name - 0, !- Latitude {deg} - 0, !- Longitude {deg} - 0, !- Time Zone {hr} - 0; !- Elevation {m} - -!- =========== ALL OBJECTS IN CLASS: SIZINGPERIOD:DESIGNDAY =========== - - SizingPeriod:DesignDay, - Montreal Int'l Ann Clg .4% Condns DB=>MWB, !- Name - 7, !- Month - 21, !- Day of Month - SummerDesignDay, !- Day Type - 30, !- Maximum Dry-Bulb Temperature {C} - 9.3, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - 22.1, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 4.9, !- Wind Speed {m/s} - 220, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAETau, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - 0.465, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - 1.966; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - - SizingPeriod:DesignDay, - Montreal Int'l Ann Htg 99.6% Condns DB, !- Name - 1, !- Month - 21, !- Day of Month - WinterDesignDay, !- Day Type - -23.7, !- Maximum Dry-Bulb Temperature {C} - 0, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - -23.7, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 3.9, !- Wind Speed {m/s} - 260, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAEClearSky, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - 0; !- Sky Clearness - -!- =========== ALL OBJECTS IN CLASS: RUNPERIOD =========== - - RunPeriod, - Run Period 1, !- Name - 1, !- Begin Month - 1, !- Begin Day of Month - 2009, !- Begin Year - 12, !- End Month - 31, !- End Day of Month - 2009, !- End Year - Thursday, !- Day of Week for Start Day - No, !- Use Weather File Holidays and Special Days - No, !- Use Weather File Daylight Saving Period - No, !- Apply Weekend Holiday Rule - Yes, !- Use Weather File Rain Indicators - Yes; !- Use Weather File Snow Indicators - -!- =========== ALL OBJECTS IN CLASS: SCHEDULETYPELIMITS =========== - - ScheduleTypeLimits, - Fractional, !- Name - 0, !- Lower Limit Value - 1, !- Upper Limit Value - Continuous; !- Numeric Type - - ScheduleTypeLimits, - Temperature, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - temperature; !- Unit Type - - ScheduleTypeLimits, - Watt, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - ActivityLevel; !- Unit Type - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:DAY:INTERVAL =========== - - Schedule:Day:Interval, - WaterUse Latent Fraction Schedule 5p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.05; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Schedule 120F Day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 48.8888888888889; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Sensible Fraction Schedule 20p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.2; !- Value Until Time 1 - - Schedule:Day:Interval, - Light_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.5; !- Value Until Time 1 - - Schedule:Day:Interval, - Equip_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.3; !- Value Until Time 1 - - Schedule:Day:Interval, - Activity_day_sch, !- Name - Watt, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 100; !- Value Until Time 1 - - Schedule:Day:Interval, - People_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.4; !- Value Until Time 1 - - Schedule:Day:Interval, - Heating_Setpoint_day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 20; !- Value Until Time 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:WEEK:DAILY =========== - - Schedule:Week:Daily, - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Name - WaterUse Latent Fraction Schedule 5p Day, !- Sunday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Monday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Tuesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Wednesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Thursday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Friday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Saturday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Holiday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- CustomDay1 Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Name - WaterUse Schedule 120F Day, !- Sunday Schedule:Day Name - WaterUse Schedule 120F Day, !- Monday Schedule:Day Name - WaterUse Schedule 120F Day, !- Tuesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Wednesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Thursday Schedule:Day Name - WaterUse Schedule 120F Day, !- Friday Schedule:Day Name - WaterUse Schedule 120F Day, !- Saturday Schedule:Day Name - WaterUse Schedule 120F Day, !- Holiday Schedule:Day Name - WaterUse Schedule 120F Day, !- SummerDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- WinterDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- CustomDay1 Schedule:Day Name - WaterUse Schedule 120F Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Name - WaterUse Sensible Fraction Schedule 20p Day, !- Sunday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Monday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Tuesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Wednesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Thursday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Friday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Saturday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Holiday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- CustomDay1 Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Light_week_sch, !- Name - Light_day_sch, !- Sunday Schedule:Day Name - Light_day_sch, !- Monday Schedule:Day Name - Light_day_sch, !- Tuesday Schedule:Day Name - Light_day_sch, !- Wednesday Schedule:Day Name - Light_day_sch, !- Thursday Schedule:Day Name - Light_day_sch, !- Friday Schedule:Day Name - Light_day_sch, !- Saturday Schedule:Day Name - Light_day_sch, !- Holiday Schedule:Day Name - Light_day_sch, !- SummerDesignDay Schedule:Day Name - Light_day_sch, !- WinterDesignDay Schedule:Day Name - Light_day_sch, !- CustomDay1 Schedule:Day Name - Light_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Equip_week_sch, !- Name - Equip_day_sch, !- Sunday Schedule:Day Name - Equip_day_sch, !- Monday Schedule:Day Name - Equip_day_sch, !- Tuesday Schedule:Day Name - Equip_day_sch, !- Wednesday Schedule:Day Name - Equip_day_sch, !- Thursday Schedule:Day Name - Equip_day_sch, !- Friday Schedule:Day Name - Equip_day_sch, !- Saturday Schedule:Day Name - Equip_day_sch, !- Holiday Schedule:Day Name - Equip_day_sch, !- SummerDesignDay Schedule:Day Name - Equip_day_sch, !- WinterDesignDay Schedule:Day Name - Equip_day_sch, !- CustomDay1 Schedule:Day Name - Equip_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Activity_week_sch, !- Name - Activity_day_sch, !- Sunday Schedule:Day Name - Activity_day_sch, !- Monday Schedule:Day Name - Activity_day_sch, !- Tuesday Schedule:Day Name - Activity_day_sch, !- Wednesday Schedule:Day Name - Activity_day_sch, !- Thursday Schedule:Day Name - Activity_day_sch, !- Friday Schedule:Day Name - Activity_day_sch, !- Saturday Schedule:Day Name - Activity_day_sch, !- Holiday Schedule:Day Name - Activity_day_sch, !- SummerDesignDay Schedule:Day Name - Activity_day_sch, !- WinterDesignDay Schedule:Day Name - Activity_day_sch, !- CustomDay1 Schedule:Day Name - Activity_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - People_week_sch, !- Name - People_day_sch, !- Sunday Schedule:Day Name - People_day_sch, !- Monday Schedule:Day Name - People_day_sch, !- Tuesday Schedule:Day Name - People_day_sch, !- Wednesday Schedule:Day Name - People_day_sch, !- Thursday Schedule:Day Name - People_day_sch, !- Friday Schedule:Day Name - People_day_sch, !- Saturday Schedule:Day Name - People_day_sch, !- Holiday Schedule:Day Name - People_day_sch, !- SummerDesignDay Schedule:Day Name - People_day_sch, !- WinterDesignDay Schedule:Day Name - People_day_sch, !- CustomDay1 Schedule:Day Name - People_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Heating_setpoint_week, !- Name - Heating_Setpoint_day, !- Sunday Schedule:Day Name - Heating_Setpoint_day, !- Monday Schedule:Day Name - Heating_Setpoint_day, !- Tuesday Schedule:Day Name - Heating_Setpoint_day, !- Wednesday Schedule:Day Name - Heating_Setpoint_day, !- Thursday Schedule:Day Name - Heating_Setpoint_day, !- Friday Schedule:Day Name - Heating_Setpoint_day, !- Saturday Schedule:Day Name - Heating_Setpoint_day, !- Holiday Schedule:Day Name - Heating_Setpoint_day, !- SummerDesignDay Schedule:Day Name - Heating_Setpoint_day, !- WinterDesignDay Schedule:Day Name - Heating_Setpoint_day, !- CustomDay1 Schedule:Day Name - Heating_Setpoint_day; !- CustomDay2 Schedule:Day Name - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:YEAR =========== - - Schedule:Year, - WaterUse Latent Fraction Schedule 5p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Schedule 120F, !- Name - Temperature, !- Schedule Type Limits Name - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Sensible Fraction Schedule 20p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Light_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Light_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Equip_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Equip_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Activity_year_sch, !- Name - Watt, !- Schedule Type Limits Name - Activity_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - People_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - People_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Heating_setpoint_year, !- Name - Temperature, !- Schedule Type Limits Name - Heating_setpoint_week, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:CONSTANT =========== - - Schedule:Constant,Always On,Fractional,1; - - Schedule:Constant,Always Heating,Temperature,20; - - Schedule:Constant,Always Cooling,Temperature,30; - -!- =========== ALL OBJECTS IN CLASS: MATERIAL =========== - - Material, - 1/2IN Gypsum, !- Name - Smooth, !- Roughness - 0.0127, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 784.9, !- Density {kg/m3} - 830.000000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - 1IN Stucco, !- Name - Smooth, !- Roughness - 0.0253, !- Thickness {m} - 0.691799999999999, !- Conductivity {W/m-K} - 1858, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.92, !- Solar Absorptance - 0.92; !- Visible Absorptance - - Material, - 8IN Concrete HW, !- Name - MediumRough, !- Roughness - 0.2033, !- Thickness {m} - 1.72959999999999, !- Conductivity {W/m-K} - 2242.99999999999, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.65, !- Solar Absorptance - 0.65; !- Visible Absorptance - - Material, - F08 Metal surface, !- Name - Smooth, !- Roughness - 0.0008, !- Thickness {m} - 45.2800000000001, !- Conductivity {W/m-K} - 7823.99999999999, !- Density {kg/m3} - 500, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - F16 Acoustic tile, !- Name - MediumSmooth, !- Roughness - 0.0191, !- Thickness {m} - 0.06, !- Conductivity {W/m-K} - 368, !- Density {kg/m3} - 590.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.3, !- Solar Absorptance - 0.3; !- Visible Absorptance - - Material, - G01a 19mm gypsum board, !- Name - MediumSmooth, !- Roughness - 0.019, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 800, !- Density {kg/m3} - 1090, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - G05 25mm wood, !- Name - MediumSmooth, !- Roughness - 0.0254, !- Thickness {m} - 0.15, !- Conductivity {W/m-K} - 608, !- Density {kg/m3} - 1630, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - I01 25mm insulation board, !- Name - MediumRough, !- Roughness - 0.0254, !- Thickness {m} - 0.03, !- Conductivity {W/m-K} - 43, !- Density {kg/m3} - 1210, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - M11 100mm lightweight concrete, !- Name - MediumRough, !- Roughness - 0.1016, !- Thickness {m} - 0.53, !- Conductivity {W/m-K} - 1280, !- Density {kg/m3} - 840.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - MAT-CC05 4 HW CONCRETE, !- Name - Rough, !- Roughness - 0.1016, !- Thickness {m} - 1.311, !- Conductivity {W/m-K} - 2240, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.85, !- Solar Absorptance - 0.85; !- Visible Absorptance - - Material, - Metal Decking, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Metal Roofing, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Roof Insulation [25], !- Name - MediumRough, !- Roughness - 0.263, !- Thickness {m} - 0.049, !- Conductivity {W/m-K} - 265, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - Wall Insulation [42], !- Name - MediumRough, !- Roughness - 0.0913999999999999, !- Thickness {m} - 0.0432, !- Conductivity {W/m-K} - 91, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:NOMASS =========== - - Material:NoMass, - CP02 CARPET PAD, !- Name - Smooth, !- Roughness - 0.1, !- Thermal Resistance {m2-K/W} - 0.9, !- Thermal Absorptance - 0.8, !- Solar Absorptance - 0.8; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:AIRGAP =========== - - Material:AirGap, - F04 Wall air space resistance, !- Name - 0.15; !- Thermal Resistance {m2-K/W} - - Material:AirGap, - F05 Ceiling air space resistance, !- Name - 0.18; !- Thermal Resistance {m2-K/W} - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:SIMPLEGLAZINGSYSTEM =========== - - WindowMaterial:SimpleGlazingSystem, - _2_WSV_3_Air, !- Name - 1.62, !- U-Factor {W/m2-K} - 0.64, !- Solar Heat Gain Coefficient - 0.8; !- Visible Transmittance - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:GLAZING =========== - - WindowMaterial:Glazing, - Theoretical Glass [216], !- Name - SpectralAverage, !- Optical Data Type - , !- Window Glass Spectral Data Set Name - 0.00299999999999999, !- Thickness {m} - 0.3801, !- Solar Transmittance at Normal Incidence - 0.5699, !- Front Side Solar Reflectance at Normal Incidence - 0, !- Back Side Solar Reflectance at Normal Incidence - 0.5079, !- Visible Transmittance at Normal Incidence - 0.4421, !- Front Side Visible Reflectance at Normal Incidence - 0, !- Back Side Visible Reflectance at Normal Incidence - 0, !- Infrared Transmittance at Normal Incidence - 0.9, !- Front Side Infrared Hemispherical Emissivity - 0.9, !- Back Side Infrared Hemispherical Emissivity - 0.0133, !- Conductivity {W/m-K} - 1, !- Dirt Correction Factor for Solar and Visible Transmittance - No; !- Solar Diffusing - -!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== - - Construction, - _2_WSV_3_Air, !- Name - _2_WSV_3_Air; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Name - Metal Roofing, !- Outside Layer - Roof Insulation [25], !- Layer 2 - Metal Decking; !- Layer 3 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 6, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 6, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 7, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 8, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - Exterior Door, !- Name - F08 Metal surface, !- Outside Layer - I01 25mm insulation board; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - Interior Ceiling, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Ceiling 1, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Floor, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Floor 1, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Partition, !- Name - G05 25mm wood; !- Outside Layer - - Construction, - Interior Wall, !- Name - G01a 19mm gypsum board, !- Outside Layer - F04 Wall air space resistance, !- Layer 2 - G01a 19mm gypsum board; !- Layer 3 - -!- =========== ALL OBJECTS IN CLASS: GLOBALGEOMETRYRULES =========== - - GlobalGeometryRules, - UpperLeftCorner, !- Starting Vertex Position - Counterclockwise, !- Vertex Entry Direction - Relative, !- Coordinate System - Relative, !- Daylighting Reference Point Coordinate System - Relative; !- Rectangular Surface Coordinate System - -!- =========== ALL OBJECTS IN CLASS: ZONE =========== - - Zone, - Thermal Zone 1, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - - Zone, - Thermal Zone 2, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - -!- =========== ALL OBJECTS IN CLASS: ZONELIST =========== - - ZoneList, - Space Type 1, !- Name - Thermal Zone 1; !- Zone 1 Name - - ZoneList, - Space Type 2, !- Name - Thermal Zone 2; !- Zone 1 Name - - ZoneList, - All_zones, !- Name - Thermal Zone 1, !- Zone 1 Name - Thermal Zone 2; !- Zone 2 Name - -!- =========== ALL OBJECTS IN CLASS: BUILDINGSURFACE:DETAILED =========== - - BuildingSurface:Detailed, - Face 0, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 1, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,0, !- X,Y,Z ==> Vertex 1 {m} - 5,220,0, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 1, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,225,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 12, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 2, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 3, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 1, !- Zone Name - Surface, !- Outside Boundary Condition - Face 13, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 5, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 10, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 11, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 13, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 2, !- Zone Name - Surface, !- Outside Boundary Condition - Face 3, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 7, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 2, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,0, !- X,Y,Z ==> Vertex 1 {m} - 5,215,0, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 8, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,220,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 9, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: FENESTRATIONSURFACE:DETAILED =========== - - FenestrationSurface:Detailed, - Face 101, !- Name - Window, !- Surface Type - _2_WSV_3_Air, !- Construction Name - Face 2, !- Building Surface Name - , !- Outside Boundary Condition Object - , !- View Factor to Ground - , !- Frame and Divider Name - , !- Multiplier - , !- Number of Vertices - 215.5,5,0.5, !- X,Y,Z ==> Vertex 1 {m} - 215.5,5,2, !- X,Y,Z ==> Vertex 2 {m} - 217,5,2, !- X,Y,Z ==> Vertex 3 {m} - 217,5,0.5; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: PEOPLE =========== - - People, - People 1, !- Name - Space Type 1, !- Zone or ZoneList Name - People_year_sch, !- Number of People Schedule Name - People/Area, !- Number of People Calculation Method - , !- Number of People - 0.02, !- People per Zone Floor Area {person/m2} - , !- Zone Floor Area per Person {m2/person} - 0.3, !- Fraction Radiant - , !- Sensible Heat Fraction - Activity_year_sch; !- Activity Level Schedule Name - - People, - People 2, !- Name - Space Type 2, !- Zone or ZoneList Name - People_year_sch, !- Number of People Schedule Name - People/Area, !- Number of People Calculation Method - , !- Number of People - 0.02, !- People per Zone Floor Area {person/m2} - , !- Zone Floor Area per Person {m2/person} - 0.3, !- Fraction Radiant - , !- Sensible Heat Fraction - Activity_year_sch; !- Activity Level Schedule Name - -!- =========== ALL OBJECTS IN CLASS: LIGHTS =========== - - Lights, - Lights 1, !- Name - Space Type 1, !- Zone or ZoneList Name - Light_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Lighting Level {W} - 9, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - , !- Return Air Fraction - 0.5, !- Fraction Radiant - 0.3, !- Fraction Visible - 1, !- Fraction Replaceable - General; !- End-Use Subcategory - - Lights, - Lights 2, !- Name - Space Type 2, !- Zone or ZoneList Name - Equip_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Lighting Level {W} - 9, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - , !- Return Air Fraction - 0.5, !- Fraction Radiant - 0.3, !- Fraction Visible - 1, !- Fraction Replaceable - General; !- End-Use Subcategory - -!- =========== ALL OBJECTS IN CLASS: ELECTRICEQUIPMENT =========== - - ElectricEquipment, - Electric Equipment 1, !- Name - Space Type 1, !- Zone or ZoneList Name - Equip_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Design Level {W} - 15, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - 0.5, !- Fraction Latent - 0.5, !- Fraction Radiant - , !- Fraction Lost - General; !- End-Use Subcategory - - ElectricEquipment, - Electric Equipment 2, !- Name - Space Type 2, !- Zone or ZoneList Name - Equip_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Design Level {W} - 15, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - 0.5, !- Fraction Latent - 0.5, !- Fraction Radiant - , !- Fraction Lost - General; !- End-Use Subcategory - -!- =========== ALL OBJECTS IN CLASS: ZONEINFILTRATION:DESIGNFLOWRATE =========== - - ZoneInfiltration:DesignFlowRate, - Infilt, !- Name - All_zones, !- Zone or ZoneList Name - Always On, !- Schedule Name - AirChanges/Hour, !- Design Flow Rate Calculation Method - , !- Design Flow Rate {m3/s} - , !- Flow per Zone Floor Area {m3/s-m2} - , !- Flow per Exterior Surface Area {m3/s-m2} - 0.5, !- Air Changes per Hour {1/hr} - 0, !- Constant Term Coefficient - , !- Temperature Term Coefficient - 0.224, !- Velocity Term Coefficient - ; !- Velocity Squared Term Coefficient - -!- =========== ALL OBJECTS IN CLASS: HVACTEMPLATE:THERMOSTAT =========== - - HVACTemplate:Thermostat, - Thermostat, !- Name - Always Heating, !- Heating Setpoint Schedule Name - 20, !- Constant Heating Setpoint {C} - Always Cooling, !- Cooling Setpoint Schedule Name - 30; !- Constant Cooling Setpoint {C} - -!- =========== ALL OBJECTS IN CLASS: HVACTEMPLATE:ZONE:BASEBOARDHEAT =========== - - HVACTemplate:Zone:BaseboardHeat, - Thermal Zone 1, !- Zone Name - Thermostat, !- Template Thermostat Name - 1, !- Zone Heating Sizing Factor - Electric, !- Baseboard Heating Type - Heating_setpoint_year, !- Baseboard Heating Availability Schedule Name - autosize, !- Baseboard Heating Capacity {W} - , !- Dedicated Outdoor Air System Name - Flow/Person, !- Outdoor Air Method - 0, !- Outdoor Air Flow Rate per Person {m3/s} - , !- Outdoor Air Flow Rate per Zone Floor Area {m3/s-m2} - ; !- Outdoor Air Flow Rate per Zone {m3/s} - - HVACTemplate:Zone:BaseboardHeat, - Thermal Zone 2, !- Zone Name - Thermostat, !- Template Thermostat Name - 1, !- Zone Heating Sizing Factor - Electric, !- Baseboard Heating Type - Heating_setpoint_year, !- Baseboard Heating Availability Schedule Name - autosize, !- Baseboard Heating Capacity {W} - , !- Dedicated Outdoor Air System Name - Flow/Person, !- Outdoor Air Method - 0, !- Outdoor Air Flow Rate per Person {m3/s} - , !- Outdoor Air Flow Rate per Zone Floor Area {m3/s-m2} - ; !- Outdoor Air Flow Rate per Zone {m3/s} - -!- =========== ALL OBJECTS IN CLASS: SIZING:PARAMETERS =========== - - Sizing:Parameters, - 1.25, !- Heating Sizing Factor - 1.15; !- Cooling Sizing Factor - -!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODE =========== - - OutdoorAir:Node, - Model Outdoor Air Node; !- Name - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:PARAMETERS =========== - - LifeCycleCost:Parameters, - Life Cycle Cost Parameters, !- Name - EndOfYear, !- Discounting Convention - ConstantDollar, !- Inflation Approach - 0.03, !- Real Discount Rate - , !- Nominal Discount Rate - , !- Inflation - , !- Base Date Month - 2011, !- Base Date Year - , !- Service Date Month - 2011, !- Service Date Year - 25, !- Length of Study Period in Years - , !- Tax rate - None; !- Depreciation Method - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:NONRECURRINGCOST =========== - - LifeCycleCost:NonrecurringCost, - Default Cost, !- Name - Construction, !- Category - 0, !- Cost - ServicePeriod; !- Start of Costs - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:USEPRICEESCALATION =========== - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Electricity, !- LCC Price Escalation Name - Electricity, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9838, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9632, !- Year 3 Escalation - 0.9611, !- Year 4 Escalation - 0.9571, !- Year 5 Escalation - 0.9553, !- Year 6 Escalation - 0.9539, !- Year 7 Escalation - 0.9521, !- Year 8 Escalation - 0.9546, !- Year 9 Escalation - 0.9550, !- - 0.9553, !- - 0.9564, !- - 0.9575, !- - 0.9596, !- - 0.9618, !- - 0.9614, !- - 0.9618, !- - 0.9618, !- - 0.9593, !- - 0.9589, !- - 0.9607, !- - 0.9625, !- - 0.9650, !- - 0.9708, !- - 0.9751, !- - 0.9762, !- - 0.9766, !- - 0.9766, !- - 0.9769, !- - 0.9773; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Distillate Oil, !- LCC Price Escalation Name - FuelOil#1, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9714, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9942, !- Year 3 Escalation - 1.0164, !- Year 4 Escalation - 1.0541, !- Year 5 Escalation - 1.0928, !- Year 6 Escalation - 1.1267, !- Year 7 Escalation - 1.1580, !- Year 8 Escalation - 1.1792, !- Year 9 Escalation - 1.1967, !- - 1.2200, !- - 1.2333, !- - 1.2566, !- - 1.2709, !- - 1.2826, !- - 1.2985, !- - 1.3102, !- - 1.3250, !- - 1.3261, !- - 1.3282, !- - 1.3324, !- - 1.3356, !- - 1.3431, !- - 1.3510, !- - 1.3568, !- - 1.3606, !- - 1.3637, !- - 1.3674, !- - 1.3706, !- - 1.3743; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Residual Oil, !- LCC Price Escalation Name - FuelOil#2, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.8469, !- Year 1 Escalation - 0.8257, !- Year 2 Escalation - 0.8681, !- Year 3 Escalation - 0.8988, !- Year 4 Escalation - 0.9289, !- Year 5 Escalation - 0.9604, !- Year 6 Escalation - 0.9897, !- Year 7 Escalation - 1.0075, !- Year 8 Escalation - 1.0314, !- Year 9 Escalation - 1.0554, !- - 1.0861, !- - 1.1278, !- - 1.1497, !- - 1.1620, !- - 1.1743, !- - 1.1852, !- - 1.1948, !- - 1.2037, !- - 1.2071, !- - 1.2119, !- - 1.2139, !- - 1.2194, !- - 1.2276, !- - 1.2365, !- - 1.2420, !- - 1.2461, !- - 1.2509, !- - 1.2550, !- - 1.2591, !- - 1.2638; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Natural gas, !- LCC Price Escalation Name - NaturalGas, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9823, !- Year 1 Escalation - 0.9557, !- Year 2 Escalation - 0.9279, !- Year 3 Escalation - 0.9257, !- Year 4 Escalation - 0.9346, !- Year 5 Escalation - 0.9412, !- Year 6 Escalation - 0.9512, !- Year 7 Escalation - 0.9645, !- Year 8 Escalation - 0.9856, !- Year 9 Escalation - 1.0067, !- - 1.0222, !- - 1.0410, !- - 1.0610, !- - 1.0787, !- - 1.0942, !- - 1.1098, !- - 1.1220, !- - 1.1308, !- - 1.1386, !- - 1.1486, !- - 1.1619, !- - 1.1763, !- - 1.1918, !- - 1.2118, !- - 1.2284, !- - 1.2439, !- - 1.2605, !- - 1.2772, !- - 1.2938, !- - 1.3115; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Coal, !- LCC Price Escalation Name - Coal, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9970, !- Year 1 Escalation - 1.0089, !- Year 2 Escalation - 1.0089, !- Year 3 Escalation - 0.9941, !- Year 4 Escalation - 0.9941, !- Year 5 Escalation - 1.0000, !- Year 6 Escalation - 1.0030, !- Year 7 Escalation - 1.0059, !- Year 8 Escalation - 1.0089, !- Year 9 Escalation - 1.0119, !- - 1.0148, !- - 1.0178, !- - 1.0208, !- - 1.0267, !- - 1.0297, !- - 1.0356, !- - 1.0415, !- - 1.0534, !- - 1.0564, !- - 1.0593, !- - 1.0653, !- - 1.0712, !- - 1.0742, !- - 1.0801, !- - 1.0831, !- - 1.0831, !- - 1.0861, !- - 1.0890, !- - 1.0920, !- - 1.0950; !- - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== - - Output:VariableDictionary,IDF,Unsorted; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:SUMMARYREPORTS =========== - - Output:Table:SummaryReports, - AllSummary; !- Report 1 Name - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:TABLE:STYLE =========== - - OutputControl:Table:Style, - HTML; !- Column Separator - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:REPORTINGTOLERANCES =========== - - OutputControl:ReportingTolerances, - 0.2, !- Tolerance for Time Heating Setpoint Not Met {deltaC} - 0.2; !- Tolerance for Time Cooling Setpoint Not Met {deltaC} - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:SQLITE =========== - - Output:SQLite, - SimpleAndTabular; !- Option Type - diff --git a/tests/input_data/trnsys/simple_2_zone_bat_and_infilt.idf b/tests/input_data/trnsys/simple_2_zone_bat_and_infilt.idf deleted file mode 100644 index 4f7e686e..00000000 --- a/tests/input_data/trnsys/simple_2_zone_bat_and_infilt.idf +++ /dev/null @@ -1,1274 +0,0 @@ -!-Generator IDFEditor 1.50 -!-Option SortedOrder -!-NOTE: All comments with '!-' are ignored by the IDFEditor and are generated automatically. -!- Use '!' comments if they need to be retained when using the IDFEditor. -!- =========== ALL OBJECTS IN CLASS: VERSION =========== - - Version,9.2; - -!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== - - SimulationControl, - Yes, !- Do Zone Sizing Calculation - No, !- Do System Sizing Calculation - No, !- Do Plant Sizing Calculation - Yes, !- Run Simulation for Sizing Periods - Yes; !- Run Simulation for Weather File Run Periods - -!- =========== ALL OBJECTS IN CLASS: BUILDING =========== - - Building, - Building 1, !- Name - , !- North Axis {deg} - , !- Terrain - , !- Loads Convergence Tolerance Value - , !- Temperature Convergence Tolerance Value {deltaC} - , !- Solar Distribution - , !- Maximum Number of Warmup Days - ; !- Minimum Number of Warmup Days - -!- =========== ALL OBJECTS IN CLASS: SHADOWCALCULATION =========== - - ShadowCalculation, - AverageOverDaysInFrequency, !- Calculation Method - 20, !- Calculation Frequency - 15000; !- Maximum Figures in Shadow Overlap Calculations - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:INSIDE =========== - - SurfaceConvectionAlgorithm:Inside,TARP; - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:OUTSIDE =========== - - SurfaceConvectionAlgorithm:Outside,DOE-2; - -!- =========== ALL OBJECTS IN CLASS: HEATBALANCEALGORITHM =========== - - HeatBalanceAlgorithm,ConductionTransferFunction,200; - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRHEATBALANCEALGORITHM =========== - - ZoneAirHeatBalanceAlgorithm, - ThirdOrderBackwardDifference; !- Algorithm - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRCONTAMINANTBALANCE =========== - - ZoneAirContaminantBalance, - No; !- Carbon Dioxide Concentration - -!- =========== ALL OBJECTS IN CLASS: ZONECAPACITANCEMULTIPLIER:RESEARCHSPECIAL =========== - - ZoneCapacitanceMultiplier:ResearchSpecial, - Zone Capacitance Multiplier Research Special, !- Name - , !- Zone or ZoneList Name - , !- Temperature Capacity Multiplier - , !- Humidity Capacity Multiplier - , !- Carbon Dioxide Capacity Multiplier - ; !- Generic Contaminant Capacity Multiplier - -!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== - - Timestep,6; - -!- =========== ALL OBJECTS IN CLASS: CONVERGENCELIMITS =========== - - ConvergenceLimits, - 1; !- Minimum System Timestep {minutes} - -!- =========== ALL OBJECTS IN CLASS: SITE:LOCATION =========== - - Site:Location, - Site 1, !- Name - 0, !- Latitude {deg} - 0, !- Longitude {deg} - 0, !- Time Zone {hr} - 0; !- Elevation {m} - -!- =========== ALL OBJECTS IN CLASS: SIZINGPERIOD:DESIGNDAY =========== - - SizingPeriod:DesignDay, - Montreal Int'l Ann Clg .4% Condns DB=>MWB, !- Name - 7, !- Month - 21, !- Day of Month - SummerDesignDay, !- Day Type - 30, !- Maximum Dry-Bulb Temperature {C} - 9.3, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - 22.1, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 4.9, !- Wind Speed {m/s} - 220, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAETau, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - 0.465, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - 1.966; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - - SizingPeriod:DesignDay, - Montreal Int'l Ann Htg 99.6% Condns DB, !- Name - 1, !- Month - 21, !- Day of Month - WinterDesignDay, !- Day Type - -23.7, !- Maximum Dry-Bulb Temperature {C} - 0, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - -23.7, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 3.9, !- Wind Speed {m/s} - 260, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAEClearSky, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - 0; !- Sky Clearness - -!- =========== ALL OBJECTS IN CLASS: RUNPERIOD =========== - - RunPeriod, - Run Period 1, !- Name - 1, !- Begin Month - 1, !- Begin Day of Month - 2009, !- Begin Year - 12, !- End Month - 31, !- End Day of Month - 2009, !- End Year - Thursday, !- Day of Week for Start Day - No, !- Use Weather File Holidays and Special Days - No, !- Use Weather File Daylight Saving Period - No, !- Apply Weekend Holiday Rule - Yes, !- Use Weather File Rain Indicators - Yes; !- Use Weather File Snow Indicators - -!- =========== ALL OBJECTS IN CLASS: SCHEDULETYPELIMITS =========== - - ScheduleTypeLimits, - Fractional, !- Name - 0, !- Lower Limit Value - 1, !- Upper Limit Value - Continuous; !- Numeric Type - - ScheduleTypeLimits, - Temperature, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - temperature; !- Unit Type - - ScheduleTypeLimits, - Watt, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - ActivityLevel; !- Unit Type - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:DAY:INTERVAL =========== - - Schedule:Day:Interval, - WaterUse Latent Fraction Schedule 5p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.05; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Schedule 120F Day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 48.8888888888889; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Sensible Fraction Schedule 20p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.2; !- Value Until Time 1 - - Schedule:Day:Interval, - Light_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.5; !- Value Until Time 1 - - Schedule:Day:Interval, - Equip_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.3; !- Value Until Time 1 - - Schedule:Day:Interval, - Activity_day_sch, !- Name - Watt, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 100; !- Value Until Time 1 - - Schedule:Day:Interval, - People_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.4; !- Value Until Time 1 - - Schedule:Day:Interval, - Heating_Setpoint_day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 20; !- Value Until Time 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:WEEK:DAILY =========== - - Schedule:Week:Daily, - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Name - WaterUse Latent Fraction Schedule 5p Day, !- Sunday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Monday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Tuesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Wednesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Thursday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Friday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Saturday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Holiday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- CustomDay1 Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Name - WaterUse Schedule 120F Day, !- Sunday Schedule:Day Name - WaterUse Schedule 120F Day, !- Monday Schedule:Day Name - WaterUse Schedule 120F Day, !- Tuesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Wednesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Thursday Schedule:Day Name - WaterUse Schedule 120F Day, !- Friday Schedule:Day Name - WaterUse Schedule 120F Day, !- Saturday Schedule:Day Name - WaterUse Schedule 120F Day, !- Holiday Schedule:Day Name - WaterUse Schedule 120F Day, !- SummerDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- WinterDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- CustomDay1 Schedule:Day Name - WaterUse Schedule 120F Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Name - WaterUse Sensible Fraction Schedule 20p Day, !- Sunday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Monday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Tuesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Wednesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Thursday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Friday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Saturday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Holiday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- CustomDay1 Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Light_week_sch, !- Name - Light_day_sch, !- Sunday Schedule:Day Name - Light_day_sch, !- Monday Schedule:Day Name - Light_day_sch, !- Tuesday Schedule:Day Name - Light_day_sch, !- Wednesday Schedule:Day Name - Light_day_sch, !- Thursday Schedule:Day Name - Light_day_sch, !- Friday Schedule:Day Name - Light_day_sch, !- Saturday Schedule:Day Name - Light_day_sch, !- Holiday Schedule:Day Name - Light_day_sch, !- SummerDesignDay Schedule:Day Name - Light_day_sch, !- WinterDesignDay Schedule:Day Name - Light_day_sch, !- CustomDay1 Schedule:Day Name - Light_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Equip_week_sch, !- Name - Equip_day_sch, !- Sunday Schedule:Day Name - Equip_day_sch, !- Monday Schedule:Day Name - Equip_day_sch, !- Tuesday Schedule:Day Name - Equip_day_sch, !- Wednesday Schedule:Day Name - Equip_day_sch, !- Thursday Schedule:Day Name - Equip_day_sch, !- Friday Schedule:Day Name - Equip_day_sch, !- Saturday Schedule:Day Name - Equip_day_sch, !- Holiday Schedule:Day Name - Equip_day_sch, !- SummerDesignDay Schedule:Day Name - Equip_day_sch, !- WinterDesignDay Schedule:Day Name - Equip_day_sch, !- CustomDay1 Schedule:Day Name - Equip_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Activity_week_sch, !- Name - Activity_day_sch, !- Sunday Schedule:Day Name - Activity_day_sch, !- Monday Schedule:Day Name - Activity_day_sch, !- Tuesday Schedule:Day Name - Activity_day_sch, !- Wednesday Schedule:Day Name - Activity_day_sch, !- Thursday Schedule:Day Name - Activity_day_sch, !- Friday Schedule:Day Name - Activity_day_sch, !- Saturday Schedule:Day Name - Activity_day_sch, !- Holiday Schedule:Day Name - Activity_day_sch, !- SummerDesignDay Schedule:Day Name - Activity_day_sch, !- WinterDesignDay Schedule:Day Name - Activity_day_sch, !- CustomDay1 Schedule:Day Name - Activity_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - People_week_sch, !- Name - People_day_sch, !- Sunday Schedule:Day Name - People_day_sch, !- Monday Schedule:Day Name - People_day_sch, !- Tuesday Schedule:Day Name - People_day_sch, !- Wednesday Schedule:Day Name - People_day_sch, !- Thursday Schedule:Day Name - People_day_sch, !- Friday Schedule:Day Name - People_day_sch, !- Saturday Schedule:Day Name - People_day_sch, !- Holiday Schedule:Day Name - People_day_sch, !- SummerDesignDay Schedule:Day Name - People_day_sch, !- WinterDesignDay Schedule:Day Name - People_day_sch, !- CustomDay1 Schedule:Day Name - People_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Heating_setpoint_week, !- Name - Heating_Setpoint_day, !- Sunday Schedule:Day Name - Heating_Setpoint_day, !- Monday Schedule:Day Name - Heating_Setpoint_day, !- Tuesday Schedule:Day Name - Heating_Setpoint_day, !- Wednesday Schedule:Day Name - Heating_Setpoint_day, !- Thursday Schedule:Day Name - Heating_Setpoint_day, !- Friday Schedule:Day Name - Heating_Setpoint_day, !- Saturday Schedule:Day Name - Heating_Setpoint_day, !- Holiday Schedule:Day Name - Heating_Setpoint_day, !- SummerDesignDay Schedule:Day Name - Heating_Setpoint_day, !- WinterDesignDay Schedule:Day Name - Heating_Setpoint_day, !- CustomDay1 Schedule:Day Name - Heating_Setpoint_day; !- CustomDay2 Schedule:Day Name - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:YEAR =========== - - Schedule:Year, - WaterUse Latent Fraction Schedule 5p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Schedule 120F, !- Name - Temperature, !- Schedule Type Limits Name - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Sensible Fraction Schedule 20p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Light_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Light_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Equip_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Equip_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Activity_year_sch, !- Name - Watt, !- Schedule Type Limits Name - Activity_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - People_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - People_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Heating_setpoint_year, !- Name - Temperature, !- Schedule Type Limits Name - Heating_setpoint_week, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:CONSTANT =========== - - Schedule:Constant,Always On,Fractional,1; - - Schedule:Constant,Always Heating,Temperature,20; - - Schedule:Constant,Always Cooling,Temperature,30; - -!- =========== ALL OBJECTS IN CLASS: MATERIAL =========== - - Material, - 1/2IN Gypsum, !- Name - Smooth, !- Roughness - 0.0127, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 784.9, !- Density {kg/m3} - 830.000000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - 1IN Stucco, !- Name - Smooth, !- Roughness - 0.0253, !- Thickness {m} - 0.691799999999999, !- Conductivity {W/m-K} - 1858, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.92, !- Solar Absorptance - 0.92; !- Visible Absorptance - - Material, - 8IN Concrete HW, !- Name - MediumRough, !- Roughness - 0.2033, !- Thickness {m} - 1.72959999999999, !- Conductivity {W/m-K} - 2242.99999999999, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.65, !- Solar Absorptance - 0.65; !- Visible Absorptance - - Material, - F08 Metal surface, !- Name - Smooth, !- Roughness - 0.0008, !- Thickness {m} - 45.2800000000001, !- Conductivity {W/m-K} - 7823.99999999999, !- Density {kg/m3} - 500, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - F16 Acoustic tile, !- Name - MediumSmooth, !- Roughness - 0.0191, !- Thickness {m} - 0.06, !- Conductivity {W/m-K} - 368, !- Density {kg/m3} - 590.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.3, !- Solar Absorptance - 0.3; !- Visible Absorptance - - Material, - G01a 19mm gypsum board, !- Name - MediumSmooth, !- Roughness - 0.019, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 800, !- Density {kg/m3} - 1090, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - G05 25mm wood, !- Name - MediumSmooth, !- Roughness - 0.0254, !- Thickness {m} - 0.15, !- Conductivity {W/m-K} - 608, !- Density {kg/m3} - 1630, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - I01 25mm insulation board, !- Name - MediumRough, !- Roughness - 0.0254, !- Thickness {m} - 0.03, !- Conductivity {W/m-K} - 43, !- Density {kg/m3} - 1210, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - M11 100mm lightweight concrete, !- Name - MediumRough, !- Roughness - 0.1016, !- Thickness {m} - 0.53, !- Conductivity {W/m-K} - 1280, !- Density {kg/m3} - 840.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - MAT-CC05 4 HW CONCRETE, !- Name - Rough, !- Roughness - 0.1016, !- Thickness {m} - 1.311, !- Conductivity {W/m-K} - 2240, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.85, !- Solar Absorptance - 0.85; !- Visible Absorptance - - Material, - Metal Decking, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Metal Roofing, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Roof Insulation [25], !- Name - MediumRough, !- Roughness - 0.263, !- Thickness {m} - 0.049, !- Conductivity {W/m-K} - 265, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - Wall Insulation [42], !- Name - MediumRough, !- Roughness - 0.0913999999999999, !- Thickness {m} - 0.0432, !- Conductivity {W/m-K} - 91, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:NOMASS =========== - - Material:NoMass, - CP02 CARPET PAD, !- Name - Smooth, !- Roughness - 0.1, !- Thermal Resistance {m2-K/W} - 0.9, !- Thermal Absorptance - 0.8, !- Solar Absorptance - 0.8; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:AIRGAP =========== - - Material:AirGap, - F04 Wall air space resistance, !- Name - 0.15; !- Thermal Resistance {m2-K/W} - - Material:AirGap, - F05 Ceiling air space resistance, !- Name - 0.18; !- Thermal Resistance {m2-K/W} - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:SIMPLEGLAZINGSYSTEM =========== - - WindowMaterial:SimpleGlazingSystem, - _2_WSV_3_Air, !- Name - 1.62, !- U-Factor {W/m2-K} - 0.64, !- Solar Heat Gain Coefficient - 0.8; !- Visible Transmittance - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:GLAZING =========== - - WindowMaterial:Glazing, - Theoretical Glass [216], !- Name - SpectralAverage, !- Optical Data Type - , !- Window Glass Spectral Data Set Name - 0.00299999999999999, !- Thickness {m} - 0.3801, !- Solar Transmittance at Normal Incidence - 0.5699, !- Front Side Solar Reflectance at Normal Incidence - 0, !- Back Side Solar Reflectance at Normal Incidence - 0.5079, !- Visible Transmittance at Normal Incidence - 0.4421, !- Front Side Visible Reflectance at Normal Incidence - 0, !- Back Side Visible Reflectance at Normal Incidence - 0, !- Infrared Transmittance at Normal Incidence - 0.9, !- Front Side Infrared Hemispherical Emissivity - 0.9, !- Back Side Infrared Hemispherical Emissivity - 0.0133, !- Conductivity {W/m-K} - 1, !- Dirt Correction Factor for Solar and Visible Transmittance - No; !- Solar Diffusing - -!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== - - Construction, - _2_WSV_3_Air, !- Name - _2_WSV_3_Air; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Name - Metal Roofing, !- Outside Layer - Roof Insulation [25], !- Layer 2 - Metal Decking; !- Layer 3 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 6, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 6, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 7, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 8, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - Exterior Door, !- Name - F08 Metal surface, !- Outside Layer - I01 25mm insulation board; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - Interior Ceiling, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Ceiling 1, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Floor, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Floor 1, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Partition, !- Name - G05 25mm wood; !- Outside Layer - - Construction, - Interior Wall, !- Name - G01a 19mm gypsum board, !- Outside Layer - F04 Wall air space resistance, !- Layer 2 - G01a 19mm gypsum board; !- Layer 3 - -!- =========== ALL OBJECTS IN CLASS: GLOBALGEOMETRYRULES =========== - - GlobalGeometryRules, - UpperLeftCorner, !- Starting Vertex Position - Counterclockwise, !- Vertex Entry Direction - Relative, !- Coordinate System - Relative, !- Daylighting Reference Point Coordinate System - Relative; !- Rectangular Surface Coordinate System - -!- =========== ALL OBJECTS IN CLASS: ZONE =========== - - Zone, - Thermal Zone 1, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - - Zone, - Thermal Zone 2, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - -!- =========== ALL OBJECTS IN CLASS: ZONELIST =========== - - ZoneList, - Space Type 1, !- Name - Thermal Zone 1; !- Zone 1 Name - - ZoneList, - Space Type 2, !- Name - Thermal Zone 2; !- Zone 1 Name - - ZoneList, - All_zones, !- Name - Thermal Zone 1, !- Zone 1 Name - Thermal Zone 2; !- Zone 2 Name - -!- =========== ALL OBJECTS IN CLASS: BUILDINGSURFACE:DETAILED =========== - - BuildingSurface:Detailed, - Face 0, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 1, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,0, !- X,Y,Z ==> Vertex 1 {m} - 5,220,0, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 1, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,225,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 12, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 2, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 3, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 1, !- Zone Name - Surface, !- Outside Boundary Condition - Face 13, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 5, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 10, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 11, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 13, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 2, !- Zone Name - Surface, !- Outside Boundary Condition - Face 3, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 7, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 2, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,0, !- X,Y,Z ==> Vertex 1 {m} - 5,215,0, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 8, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,220,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 9, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: FENESTRATIONSURFACE:DETAILED =========== - - FenestrationSurface:Detailed, - Face 101, !- Name - Window, !- Surface Type - _2_WSV_3_Air, !- Construction Name - Face 2, !- Building Surface Name - , !- Outside Boundary Condition Object - , !- View Factor to Ground - , !- Frame and Divider Name - , !- Multiplier - , !- Number of Vertices - 215.5,5,0.5, !- X,Y,Z ==> Vertex 1 {m} - 215.5,5,2, !- X,Y,Z ==> Vertex 2 {m} - 217,5,2, !- X,Y,Z ==> Vertex 3 {m} - 217,5,0.5; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: ZONEINFILTRATION:DESIGNFLOWRATE =========== - - ZoneInfiltration:DesignFlowRate, - Infilt, !- Name - All_zones, !- Zone or ZoneList Name - Always On, !- Schedule Name - AirChanges/Hour, !- Design Flow Rate Calculation Method - , !- Design Flow Rate {m3/s} - , !- Flow per Zone Floor Area {m3/s-m2} - , !- Flow per Exterior Surface Area {m3/s-m2} - 0.5, !- Air Changes per Hour {1/hr} - 0, !- Constant Term Coefficient - , !- Temperature Term Coefficient - 0.224, !- Velocity Term Coefficient - ; !- Velocity Squared Term Coefficient - -!- =========== ALL OBJECTS IN CLASS: HVACTEMPLATE:THERMOSTAT =========== - - HVACTemplate:Thermostat, - Thermostat, !- Name - Always Heating, !- Heating Setpoint Schedule Name - 20, !- Constant Heating Setpoint {C} - Always Cooling, !- Cooling Setpoint Schedule Name - 30; !- Constant Cooling Setpoint {C} - -!- =========== ALL OBJECTS IN CLASS: SIZING:PARAMETERS =========== - - Sizing:Parameters, - 1.25, !- Heating Sizing Factor - 1.15; !- Cooling Sizing Factor - -!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODE =========== - - OutdoorAir:Node, - Model Outdoor Air Node; !- Name - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:PARAMETERS =========== - - LifeCycleCost:Parameters, - Life Cycle Cost Parameters, !- Name - EndOfYear, !- Discounting Convention - ConstantDollar, !- Inflation Approach - 0.03, !- Real Discount Rate - , !- Nominal Discount Rate - , !- Inflation - , !- Base Date Month - 2011, !- Base Date Year - , !- Service Date Month - 2011, !- Service Date Year - 25, !- Length of Study Period in Years - , !- Tax rate - None; !- Depreciation Method - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:NONRECURRINGCOST =========== - - LifeCycleCost:NonrecurringCost, - Default Cost, !- Name - Construction, !- Category - 0, !- Cost - ServicePeriod; !- Start of Costs - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:USEPRICEESCALATION =========== - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Electricity, !- LCC Price Escalation Name - Electricity, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9838, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9632, !- Year 3 Escalation - 0.9611, !- Year 4 Escalation - 0.9571, !- Year 5 Escalation - 0.9553, !- Year 6 Escalation - 0.9539, !- Year 7 Escalation - 0.9521, !- Year 8 Escalation - 0.9546, !- Year 9 Escalation - 0.9550, !- - 0.9553, !- - 0.9564, !- - 0.9575, !- - 0.9596, !- - 0.9618, !- - 0.9614, !- - 0.9618, !- - 0.9618, !- - 0.9593, !- - 0.9589, !- - 0.9607, !- - 0.9625, !- - 0.9650, !- - 0.9708, !- - 0.9751, !- - 0.9762, !- - 0.9766, !- - 0.9766, !- - 0.9769, !- - 0.9773; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Distillate Oil, !- LCC Price Escalation Name - FuelOil#1, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9714, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9942, !- Year 3 Escalation - 1.0164, !- Year 4 Escalation - 1.0541, !- Year 5 Escalation - 1.0928, !- Year 6 Escalation - 1.1267, !- Year 7 Escalation - 1.1580, !- Year 8 Escalation - 1.1792, !- Year 9 Escalation - 1.1967, !- - 1.2200, !- - 1.2333, !- - 1.2566, !- - 1.2709, !- - 1.2826, !- - 1.2985, !- - 1.3102, !- - 1.3250, !- - 1.3261, !- - 1.3282, !- - 1.3324, !- - 1.3356, !- - 1.3431, !- - 1.3510, !- - 1.3568, !- - 1.3606, !- - 1.3637, !- - 1.3674, !- - 1.3706, !- - 1.3743; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Residual Oil, !- LCC Price Escalation Name - FuelOil#2, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.8469, !- Year 1 Escalation - 0.8257, !- Year 2 Escalation - 0.8681, !- Year 3 Escalation - 0.8988, !- Year 4 Escalation - 0.9289, !- Year 5 Escalation - 0.9604, !- Year 6 Escalation - 0.9897, !- Year 7 Escalation - 1.0075, !- Year 8 Escalation - 1.0314, !- Year 9 Escalation - 1.0554, !- - 1.0861, !- - 1.1278, !- - 1.1497, !- - 1.1620, !- - 1.1743, !- - 1.1852, !- - 1.1948, !- - 1.2037, !- - 1.2071, !- - 1.2119, !- - 1.2139, !- - 1.2194, !- - 1.2276, !- - 1.2365, !- - 1.2420, !- - 1.2461, !- - 1.2509, !- - 1.2550, !- - 1.2591, !- - 1.2638; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Natural gas, !- LCC Price Escalation Name - NaturalGas, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9823, !- Year 1 Escalation - 0.9557, !- Year 2 Escalation - 0.9279, !- Year 3 Escalation - 0.9257, !- Year 4 Escalation - 0.9346, !- Year 5 Escalation - 0.9412, !- Year 6 Escalation - 0.9512, !- Year 7 Escalation - 0.9645, !- Year 8 Escalation - 0.9856, !- Year 9 Escalation - 1.0067, !- - 1.0222, !- - 1.0410, !- - 1.0610, !- - 1.0787, !- - 1.0942, !- - 1.1098, !- - 1.1220, !- - 1.1308, !- - 1.1386, !- - 1.1486, !- - 1.1619, !- - 1.1763, !- - 1.1918, !- - 1.2118, !- - 1.2284, !- - 1.2439, !- - 1.2605, !- - 1.2772, !- - 1.2938, !- - 1.3115; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Coal, !- LCC Price Escalation Name - Coal, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9970, !- Year 1 Escalation - 1.0089, !- Year 2 Escalation - 1.0089, !- Year 3 Escalation - 0.9941, !- Year 4 Escalation - 0.9941, !- Year 5 Escalation - 1.0000, !- Year 6 Escalation - 1.0030, !- Year 7 Escalation - 1.0059, !- Year 8 Escalation - 1.0089, !- Year 9 Escalation - 1.0119, !- - 1.0148, !- - 1.0178, !- - 1.0208, !- - 1.0267, !- - 1.0297, !- - 1.0356, !- - 1.0415, !- - 1.0534, !- - 1.0564, !- - 1.0593, !- - 1.0653, !- - 1.0712, !- - 1.0742, !- - 1.0801, !- - 1.0831, !- - 1.0831, !- - 1.0861, !- - 1.0890, !- - 1.0920, !- - 1.0950; !- - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== - - Output:VariableDictionary,IDF,Unsorted; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:SUMMARYREPORTS =========== - - Output:Table:SummaryReports, - AllSummary; !- Report 1 Name - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:TABLE:STYLE =========== - - OutputControl:Table:Style, - HTML; !- Column Separator - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:REPORTINGTOLERANCES =========== - - OutputControl:ReportingTolerances, - 0.2, !- Tolerance for Time Heating Setpoint Not Met {deltaC} - 0.2; !- Tolerance for Time Cooling Setpoint Not Met {deltaC} - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLE =========== - - Output:Variable,*,Baseboard Electric Energy,Hourly; - - Output:Variable,*,Site Outdoor Air Drybulb Temperature,Hourly; - - Output:Variable,*,Zone Air Temperature,Hourly; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:METER =========== - - Output:Meter,InteriorEquipment:Electricity,Hourly; - - Output:Meter,InteriorLights:Electricity,Hourly; - - Output:Meter,Cooling:EnergyTransfer,Hourly; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:SQLITE =========== - - Output:SQLite, - SimpleAndTabular; !- Option Type - diff --git a/tests/input_data/trnsys/simple_2_zone_bat_conditioning.idf b/tests/input_data/trnsys/simple_2_zone_bat_conditioning.idf deleted file mode 100644 index 704dd1ec..00000000 --- a/tests/input_data/trnsys/simple_2_zone_bat_conditioning.idf +++ /dev/null @@ -1,1286 +0,0 @@ -!-Generator IDFEditor 1.50 -!-Option SortedOrder -!-NOTE: All comments with '!-' are ignored by the IDFEditor and are generated automatically. -!- Use '!' comments if they need to be retained when using the IDFEditor. -!- =========== ALL OBJECTS IN CLASS: VERSION =========== - - Version,9.2; - -!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== - - SimulationControl, - Yes, !- Do Zone Sizing Calculation - No, !- Do System Sizing Calculation - No, !- Do Plant Sizing Calculation - Yes, !- Run Simulation for Sizing Periods - Yes; !- Run Simulation for Weather File Run Periods - -!- =========== ALL OBJECTS IN CLASS: BUILDING =========== - - Building, - Building 1, !- Name - , !- North Axis {deg} - , !- Terrain - , !- Loads Convergence Tolerance Value - , !- Temperature Convergence Tolerance Value {deltaC} - , !- Solar Distribution - , !- Maximum Number of Warmup Days - ; !- Minimum Number of Warmup Days - -!- =========== ALL OBJECTS IN CLASS: SHADOWCALCULATION =========== - - ShadowCalculation, - AverageOverDaysInFrequency, !- Calculation Method - 20, !- Calculation Frequency - 15000; !- Maximum Figures in Shadow Overlap Calculations - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:INSIDE =========== - - SurfaceConvectionAlgorithm:Inside,TARP; - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:OUTSIDE =========== - - SurfaceConvectionAlgorithm:Outside,DOE-2; - -!- =========== ALL OBJECTS IN CLASS: HEATBALANCEALGORITHM =========== - - HeatBalanceAlgorithm,ConductionTransferFunction,200; - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRHEATBALANCEALGORITHM =========== - - ZoneAirHeatBalanceAlgorithm, - ThirdOrderBackwardDifference; !- Algorithm - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRCONTAMINANTBALANCE =========== - - ZoneAirContaminantBalance, - No; !- Carbon Dioxide Concentration - -!- =========== ALL OBJECTS IN CLASS: ZONECAPACITANCEMULTIPLIER:RESEARCHSPECIAL =========== - - ZoneCapacitanceMultiplier:ResearchSpecial, - Zone Capacitance Multiplier Research Special, !- Name - , !- Zone or ZoneList Name - , !- Temperature Capacity Multiplier - , !- Humidity Capacity Multiplier - , !- Carbon Dioxide Capacity Multiplier - ; !- Generic Contaminant Capacity Multiplier - -!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== - - Timestep,6; - -!- =========== ALL OBJECTS IN CLASS: CONVERGENCELIMITS =========== - - ConvergenceLimits, - 1; !- Minimum System Timestep {minutes} - -!- =========== ALL OBJECTS IN CLASS: SITE:LOCATION =========== - - Site:Location, - Site 1, !- Name - 0, !- Latitude {deg} - 0, !- Longitude {deg} - 0, !- Time Zone {hr} - 0; !- Elevation {m} - -!- =========== ALL OBJECTS IN CLASS: SIZINGPERIOD:DESIGNDAY =========== - - SizingPeriod:DesignDay, - Montreal Int'l Ann Clg .4% Condns DB=>MWB, !- Name - 7, !- Month - 21, !- Day of Month - SummerDesignDay, !- Day Type - 30, !- Maximum Dry-Bulb Temperature {C} - 9.3, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - 22.1, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 4.9, !- Wind Speed {m/s} - 220, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAETau, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - 0.465, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - 1.966; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - - SizingPeriod:DesignDay, - Montreal Int'l Ann Htg 99.6% Condns DB, !- Name - 1, !- Month - 21, !- Day of Month - WinterDesignDay, !- Day Type - -23.7, !- Maximum Dry-Bulb Temperature {C} - 0, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - -23.7, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 3.9, !- Wind Speed {m/s} - 260, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAEClearSky, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - 0; !- Sky Clearness - -!- =========== ALL OBJECTS IN CLASS: RUNPERIOD =========== - - RunPeriod, - Run Period 1, !- Name - 1, !- Begin Month - 1, !- Begin Day of Month - 2009, !- Begin Year - 12, !- End Month - 31, !- End Day of Month - 2009, !- End Year - Thursday, !- Day of Week for Start Day - No, !- Use Weather File Holidays and Special Days - No, !- Use Weather File Daylight Saving Period - No, !- Apply Weekend Holiday Rule - Yes, !- Use Weather File Rain Indicators - Yes; !- Use Weather File Snow Indicators - -!- =========== ALL OBJECTS IN CLASS: SCHEDULETYPELIMITS =========== - - ScheduleTypeLimits, - Fractional, !- Name - 0, !- Lower Limit Value - 1, !- Upper Limit Value - Continuous; !- Numeric Type - - ScheduleTypeLimits, - Temperature, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - temperature; !- Unit Type - - ScheduleTypeLimits, - Watt, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - ActivityLevel; !- Unit Type - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:DAY:INTERVAL =========== - - Schedule:Day:Interval, - WaterUse Latent Fraction Schedule 5p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.05; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Schedule 120F Day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 48.8888888888889; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Sensible Fraction Schedule 20p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.2; !- Value Until Time 1 - - Schedule:Day:Interval, - Light_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.5; !- Value Until Time 1 - - Schedule:Day:Interval, - Equip_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.3; !- Value Until Time 1 - - Schedule:Day:Interval, - Activity_day_sch, !- Name - Watt, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 100; !- Value Until Time 1 - - Schedule:Day:Interval, - People_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.4; !- Value Until Time 1 - - Schedule:Day:Interval, - Heating_Setpoint_day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 20; !- Value Until Time 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:WEEK:DAILY =========== - - Schedule:Week:Daily, - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Name - WaterUse Latent Fraction Schedule 5p Day, !- Sunday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Monday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Tuesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Wednesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Thursday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Friday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Saturday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Holiday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- CustomDay1 Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Name - WaterUse Schedule 120F Day, !- Sunday Schedule:Day Name - WaterUse Schedule 120F Day, !- Monday Schedule:Day Name - WaterUse Schedule 120F Day, !- Tuesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Wednesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Thursday Schedule:Day Name - WaterUse Schedule 120F Day, !- Friday Schedule:Day Name - WaterUse Schedule 120F Day, !- Saturday Schedule:Day Name - WaterUse Schedule 120F Day, !- Holiday Schedule:Day Name - WaterUse Schedule 120F Day, !- SummerDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- WinterDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- CustomDay1 Schedule:Day Name - WaterUse Schedule 120F Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Name - WaterUse Sensible Fraction Schedule 20p Day, !- Sunday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Monday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Tuesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Wednesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Thursday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Friday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Saturday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Holiday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- CustomDay1 Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Light_week_sch, !- Name - Light_day_sch, !- Sunday Schedule:Day Name - Light_day_sch, !- Monday Schedule:Day Name - Light_day_sch, !- Tuesday Schedule:Day Name - Light_day_sch, !- Wednesday Schedule:Day Name - Light_day_sch, !- Thursday Schedule:Day Name - Light_day_sch, !- Friday Schedule:Day Name - Light_day_sch, !- Saturday Schedule:Day Name - Light_day_sch, !- Holiday Schedule:Day Name - Light_day_sch, !- SummerDesignDay Schedule:Day Name - Light_day_sch, !- WinterDesignDay Schedule:Day Name - Light_day_sch, !- CustomDay1 Schedule:Day Name - Light_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Equip_week_sch, !- Name - Equip_day_sch, !- Sunday Schedule:Day Name - Equip_day_sch, !- Monday Schedule:Day Name - Equip_day_sch, !- Tuesday Schedule:Day Name - Equip_day_sch, !- Wednesday Schedule:Day Name - Equip_day_sch, !- Thursday Schedule:Day Name - Equip_day_sch, !- Friday Schedule:Day Name - Equip_day_sch, !- Saturday Schedule:Day Name - Equip_day_sch, !- Holiday Schedule:Day Name - Equip_day_sch, !- SummerDesignDay Schedule:Day Name - Equip_day_sch, !- WinterDesignDay Schedule:Day Name - Equip_day_sch, !- CustomDay1 Schedule:Day Name - Equip_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Activity_week_sch, !- Name - Activity_day_sch, !- Sunday Schedule:Day Name - Activity_day_sch, !- Monday Schedule:Day Name - Activity_day_sch, !- Tuesday Schedule:Day Name - Activity_day_sch, !- Wednesday Schedule:Day Name - Activity_day_sch, !- Thursday Schedule:Day Name - Activity_day_sch, !- Friday Schedule:Day Name - Activity_day_sch, !- Saturday Schedule:Day Name - Activity_day_sch, !- Holiday Schedule:Day Name - Activity_day_sch, !- SummerDesignDay Schedule:Day Name - Activity_day_sch, !- WinterDesignDay Schedule:Day Name - Activity_day_sch, !- CustomDay1 Schedule:Day Name - Activity_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - People_week_sch, !- Name - People_day_sch, !- Sunday Schedule:Day Name - People_day_sch, !- Monday Schedule:Day Name - People_day_sch, !- Tuesday Schedule:Day Name - People_day_sch, !- Wednesday Schedule:Day Name - People_day_sch, !- Thursday Schedule:Day Name - People_day_sch, !- Friday Schedule:Day Name - People_day_sch, !- Saturday Schedule:Day Name - People_day_sch, !- Holiday Schedule:Day Name - People_day_sch, !- SummerDesignDay Schedule:Day Name - People_day_sch, !- WinterDesignDay Schedule:Day Name - People_day_sch, !- CustomDay1 Schedule:Day Name - People_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Heating_setpoint_week, !- Name - Heating_Setpoint_day, !- Sunday Schedule:Day Name - Heating_Setpoint_day, !- Monday Schedule:Day Name - Heating_Setpoint_day, !- Tuesday Schedule:Day Name - Heating_Setpoint_day, !- Wednesday Schedule:Day Name - Heating_Setpoint_day, !- Thursday Schedule:Day Name - Heating_Setpoint_day, !- Friday Schedule:Day Name - Heating_Setpoint_day, !- Saturday Schedule:Day Name - Heating_Setpoint_day, !- Holiday Schedule:Day Name - Heating_Setpoint_day, !- SummerDesignDay Schedule:Day Name - Heating_Setpoint_day, !- WinterDesignDay Schedule:Day Name - Heating_Setpoint_day, !- CustomDay1 Schedule:Day Name - Heating_Setpoint_day; !- CustomDay2 Schedule:Day Name - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:YEAR =========== - - Schedule:Year, - WaterUse Latent Fraction Schedule 5p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Schedule 120F, !- Name - Temperature, !- Schedule Type Limits Name - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Sensible Fraction Schedule 20p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Light_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Light_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Equip_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Equip_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Activity_year_sch, !- Name - Watt, !- Schedule Type Limits Name - Activity_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - People_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - People_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Heating_setpoint_year, !- Name - Temperature, !- Schedule Type Limits Name - Heating_setpoint_week, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:CONSTANT =========== - - Schedule:Constant,Always On,Fractional,1; - - Schedule:Constant,Always Heating,Temperature,20; - - Schedule:Constant,Always Cooling,Temperature,30; - -!- =========== ALL OBJECTS IN CLASS: MATERIAL =========== - - Material, - 1/2IN Gypsum, !- Name - Smooth, !- Roughness - 0.0127, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 784.9, !- Density {kg/m3} - 830.000000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - 1IN Stucco, !- Name - Smooth, !- Roughness - 0.0253, !- Thickness {m} - 0.691799999999999, !- Conductivity {W/m-K} - 1858, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.92, !- Solar Absorptance - 0.92; !- Visible Absorptance - - Material, - 8IN Concrete HW, !- Name - MediumRough, !- Roughness - 0.2033, !- Thickness {m} - 1.72959999999999, !- Conductivity {W/m-K} - 2242.99999999999, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.65, !- Solar Absorptance - 0.65; !- Visible Absorptance - - Material, - F08 Metal surface, !- Name - Smooth, !- Roughness - 0.0008, !- Thickness {m} - 45.2800000000001, !- Conductivity {W/m-K} - 7823.99999999999, !- Density {kg/m3} - 500, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - F16 Acoustic tile, !- Name - MediumSmooth, !- Roughness - 0.0191, !- Thickness {m} - 0.06, !- Conductivity {W/m-K} - 368, !- Density {kg/m3} - 590.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.3, !- Solar Absorptance - 0.3; !- Visible Absorptance - - Material, - G01a 19mm gypsum board, !- Name - MediumSmooth, !- Roughness - 0.019, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 800, !- Density {kg/m3} - 1090, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - G05 25mm wood, !- Name - MediumSmooth, !- Roughness - 0.0254, !- Thickness {m} - 0.15, !- Conductivity {W/m-K} - 608, !- Density {kg/m3} - 1630, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - I01 25mm insulation board, !- Name - MediumRough, !- Roughness - 0.0254, !- Thickness {m} - 0.03, !- Conductivity {W/m-K} - 43, !- Density {kg/m3} - 1210, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - M11 100mm lightweight concrete, !- Name - MediumRough, !- Roughness - 0.1016, !- Thickness {m} - 0.53, !- Conductivity {W/m-K} - 1280, !- Density {kg/m3} - 840.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - MAT-CC05 4 HW CONCRETE, !- Name - Rough, !- Roughness - 0.1016, !- Thickness {m} - 1.311, !- Conductivity {W/m-K} - 2240, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.85, !- Solar Absorptance - 0.85; !- Visible Absorptance - - Material, - Metal Decking, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Metal Roofing, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Roof Insulation [25], !- Name - MediumRough, !- Roughness - 0.263, !- Thickness {m} - 0.049, !- Conductivity {W/m-K} - 265, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - Wall Insulation [42], !- Name - MediumRough, !- Roughness - 0.0913999999999999, !- Thickness {m} - 0.0432, !- Conductivity {W/m-K} - 91, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:NOMASS =========== - - Material:NoMass, - CP02 CARPET PAD, !- Name - Smooth, !- Roughness - 0.1, !- Thermal Resistance {m2-K/W} - 0.9, !- Thermal Absorptance - 0.8, !- Solar Absorptance - 0.8; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:AIRGAP =========== - - Material:AirGap, - F04 Wall air space resistance, !- Name - 0.15; !- Thermal Resistance {m2-K/W} - - Material:AirGap, - F05 Ceiling air space resistance, !- Name - 0.18; !- Thermal Resistance {m2-K/W} - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:SIMPLEGLAZINGSYSTEM =========== - - WindowMaterial:SimpleGlazingSystem, - _2_WSV_3_Air, !- Name - 1.62, !- U-Factor {W/m2-K} - 0.64, !- Solar Heat Gain Coefficient - 0.8; !- Visible Transmittance - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:GLAZING =========== - - WindowMaterial:Glazing, - Theoretical Glass [216], !- Name - SpectralAverage, !- Optical Data Type - , !- Window Glass Spectral Data Set Name - 0.00299999999999999, !- Thickness {m} - 0.3801, !- Solar Transmittance at Normal Incidence - 0.5699, !- Front Side Solar Reflectance at Normal Incidence - 0, !- Back Side Solar Reflectance at Normal Incidence - 0.5079, !- Visible Transmittance at Normal Incidence - 0.4421, !- Front Side Visible Reflectance at Normal Incidence - 0, !- Back Side Visible Reflectance at Normal Incidence - 0, !- Infrared Transmittance at Normal Incidence - 0.9, !- Front Side Infrared Hemispherical Emissivity - 0.9, !- Back Side Infrared Hemispherical Emissivity - 0.0133, !- Conductivity {W/m-K} - 1, !- Dirt Correction Factor for Solar and Visible Transmittance - No; !- Solar Diffusing - -!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== - - Construction, - _2_WSV_3_Air, !- Name - _2_WSV_3_Air; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Name - Metal Roofing, !- Outside Layer - Roof Insulation [25], !- Layer 2 - Metal Decking; !- Layer 3 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 6, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 6, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 7, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 8, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - Exterior Door, !- Name - F08 Metal surface, !- Outside Layer - I01 25mm insulation board; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - Interior Ceiling, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Ceiling 1, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Floor, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Floor 1, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Partition, !- Name - G05 25mm wood; !- Outside Layer - - Construction, - Interior Wall, !- Name - G01a 19mm gypsum board, !- Outside Layer - F04 Wall air space resistance, !- Layer 2 - G01a 19mm gypsum board; !- Layer 3 - -!- =========== ALL OBJECTS IN CLASS: GLOBALGEOMETRYRULES =========== - - GlobalGeometryRules, - UpperLeftCorner, !- Starting Vertex Position - Counterclockwise, !- Vertex Entry Direction - Relative, !- Coordinate System - Relative, !- Daylighting Reference Point Coordinate System - Relative; !- Rectangular Surface Coordinate System - -!- =========== ALL OBJECTS IN CLASS: ZONE =========== - - Zone, - Thermal Zone 1, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - - Zone, - Thermal Zone 2, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - -!- =========== ALL OBJECTS IN CLASS: ZONELIST =========== - - ZoneList, - Space Type 1, !- Name - Thermal Zone 1; !- Zone 1 Name - - ZoneList, - Space Type 2, !- Name - Thermal Zone 2; !- Zone 1 Name - - ZoneList, - All_zones, !- Name - Thermal Zone 1, !- Zone 1 Name - Thermal Zone 2; !- Zone 2 Name - -!- =========== ALL OBJECTS IN CLASS: BUILDINGSURFACE:DETAILED =========== - - BuildingSurface:Detailed, - Face 0, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 1, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,0, !- X,Y,Z ==> Vertex 1 {m} - 5,220,0, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 1, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,225,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 12, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 2, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 3, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 1, !- Zone Name - Surface, !- Outside Boundary Condition - Face 13, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 5, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 10, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 11, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 13, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 2, !- Zone Name - Surface, !- Outside Boundary Condition - Face 3, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 7, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 2, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,0, !- X,Y,Z ==> Vertex 1 {m} - 5,215,0, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 8, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,220,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 9, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: FENESTRATIONSURFACE:DETAILED =========== - - FenestrationSurface:Detailed, - Face 101, !- Name - Window, !- Surface Type - _2_WSV_3_Air, !- Construction Name - Face 2, !- Building Surface Name - , !- Outside Boundary Condition Object - , !- View Factor to Ground - , !- Frame and Divider Name - , !- Multiplier - , !- Number of Vertices - 215.5,5,0.5, !- X,Y,Z ==> Vertex 1 {m} - 215.5,5,2, !- X,Y,Z ==> Vertex 2 {m} - 217,5,2, !- X,Y,Z ==> Vertex 3 {m} - 217,5,0.5; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: HVACTEMPLATE:THERMOSTAT =========== - - HVACTemplate:Thermostat, - Thermostat, !- Name - Always Heating, !- Heating Setpoint Schedule Name - 20, !- Constant Heating Setpoint {C} - Always Cooling, !- Cooling Setpoint Schedule Name - 30; !- Constant Cooling Setpoint {C} - -!- =========== ALL OBJECTS IN CLASS: HVACTEMPLATE:ZONE:BASEBOARDHEAT =========== - - HVACTemplate:Zone:BaseboardHeat, - Thermal Zone 1, !- Zone Name - Thermostat, !- Template Thermostat Name - 1, !- Zone Heating Sizing Factor - Electric, !- Baseboard Heating Type - Heating_setpoint_year, !- Baseboard Heating Availability Schedule Name - autosize, !- Baseboard Heating Capacity {W} - , !- Dedicated Outdoor Air System Name - Flow/Person, !- Outdoor Air Method - 0, !- Outdoor Air Flow Rate per Person {m3/s} - , !- Outdoor Air Flow Rate per Zone Floor Area {m3/s-m2} - ; !- Outdoor Air Flow Rate per Zone {m3/s} - - HVACTemplate:Zone:BaseboardHeat, - Thermal Zone 2, !- Zone Name - Thermostat, !- Template Thermostat Name - 1, !- Zone Heating Sizing Factor - Electric, !- Baseboard Heating Type - Heating_setpoint_year, !- Baseboard Heating Availability Schedule Name - autosize, !- Baseboard Heating Capacity {W} - , !- Dedicated Outdoor Air System Name - Flow/Person, !- Outdoor Air Method - 0, !- Outdoor Air Flow Rate per Person {m3/s} - , !- Outdoor Air Flow Rate per Zone Floor Area {m3/s-m2} - ; !- Outdoor Air Flow Rate per Zone {m3/s} - -!- =========== ALL OBJECTS IN CLASS: SIZING:PARAMETERS =========== - - Sizing:Parameters, - 1.25, !- Heating Sizing Factor - 1.15; !- Cooling Sizing Factor - -!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODE =========== - - OutdoorAir:Node, - Model Outdoor Air Node; !- Name - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:PARAMETERS =========== - - LifeCycleCost:Parameters, - Life Cycle Cost Parameters, !- Name - EndOfYear, !- Discounting Convention - ConstantDollar, !- Inflation Approach - 0.03, !- Real Discount Rate - , !- Nominal Discount Rate - , !- Inflation - , !- Base Date Month - 2011, !- Base Date Year - , !- Service Date Month - 2011, !- Service Date Year - 25, !- Length of Study Period in Years - , !- Tax rate - None; !- Depreciation Method - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:NONRECURRINGCOST =========== - - LifeCycleCost:NonrecurringCost, - Default Cost, !- Name - Construction, !- Category - 0, !- Cost - ServicePeriod; !- Start of Costs - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:USEPRICEESCALATION =========== - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Electricity, !- LCC Price Escalation Name - Electricity, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9838, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9632, !- Year 3 Escalation - 0.9611, !- Year 4 Escalation - 0.9571, !- Year 5 Escalation - 0.9553, !- Year 6 Escalation - 0.9539, !- Year 7 Escalation - 0.9521, !- Year 8 Escalation - 0.9546, !- Year 9 Escalation - 0.9550, !- - 0.9553, !- - 0.9564, !- - 0.9575, !- - 0.9596, !- - 0.9618, !- - 0.9614, !- - 0.9618, !- - 0.9618, !- - 0.9593, !- - 0.9589, !- - 0.9607, !- - 0.9625, !- - 0.9650, !- - 0.9708, !- - 0.9751, !- - 0.9762, !- - 0.9766, !- - 0.9766, !- - 0.9769, !- - 0.9773; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Distillate Oil, !- LCC Price Escalation Name - FuelOil#1, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9714, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9942, !- Year 3 Escalation - 1.0164, !- Year 4 Escalation - 1.0541, !- Year 5 Escalation - 1.0928, !- Year 6 Escalation - 1.1267, !- Year 7 Escalation - 1.1580, !- Year 8 Escalation - 1.1792, !- Year 9 Escalation - 1.1967, !- - 1.2200, !- - 1.2333, !- - 1.2566, !- - 1.2709, !- - 1.2826, !- - 1.2985, !- - 1.3102, !- - 1.3250, !- - 1.3261, !- - 1.3282, !- - 1.3324, !- - 1.3356, !- - 1.3431, !- - 1.3510, !- - 1.3568, !- - 1.3606, !- - 1.3637, !- - 1.3674, !- - 1.3706, !- - 1.3743; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Residual Oil, !- LCC Price Escalation Name - FuelOil#2, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.8469, !- Year 1 Escalation - 0.8257, !- Year 2 Escalation - 0.8681, !- Year 3 Escalation - 0.8988, !- Year 4 Escalation - 0.9289, !- Year 5 Escalation - 0.9604, !- Year 6 Escalation - 0.9897, !- Year 7 Escalation - 1.0075, !- Year 8 Escalation - 1.0314, !- Year 9 Escalation - 1.0554, !- - 1.0861, !- - 1.1278, !- - 1.1497, !- - 1.1620, !- - 1.1743, !- - 1.1852, !- - 1.1948, !- - 1.2037, !- - 1.2071, !- - 1.2119, !- - 1.2139, !- - 1.2194, !- - 1.2276, !- - 1.2365, !- - 1.2420, !- - 1.2461, !- - 1.2509, !- - 1.2550, !- - 1.2591, !- - 1.2638; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Natural gas, !- LCC Price Escalation Name - NaturalGas, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9823, !- Year 1 Escalation - 0.9557, !- Year 2 Escalation - 0.9279, !- Year 3 Escalation - 0.9257, !- Year 4 Escalation - 0.9346, !- Year 5 Escalation - 0.9412, !- Year 6 Escalation - 0.9512, !- Year 7 Escalation - 0.9645, !- Year 8 Escalation - 0.9856, !- Year 9 Escalation - 1.0067, !- - 1.0222, !- - 1.0410, !- - 1.0610, !- - 1.0787, !- - 1.0942, !- - 1.1098, !- - 1.1220, !- - 1.1308, !- - 1.1386, !- - 1.1486, !- - 1.1619, !- - 1.1763, !- - 1.1918, !- - 1.2118, !- - 1.2284, !- - 1.2439, !- - 1.2605, !- - 1.2772, !- - 1.2938, !- - 1.3115; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Coal, !- LCC Price Escalation Name - Coal, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9970, !- Year 1 Escalation - 1.0089, !- Year 2 Escalation - 1.0089, !- Year 3 Escalation - 0.9941, !- Year 4 Escalation - 0.9941, !- Year 5 Escalation - 1.0000, !- Year 6 Escalation - 1.0030, !- Year 7 Escalation - 1.0059, !- Year 8 Escalation - 1.0089, !- Year 9 Escalation - 1.0119, !- - 1.0148, !- - 1.0178, !- - 1.0208, !- - 1.0267, !- - 1.0297, !- - 1.0356, !- - 1.0415, !- - 1.0534, !- - 1.0564, !- - 1.0593, !- - 1.0653, !- - 1.0712, !- - 1.0742, !- - 1.0801, !- - 1.0831, !- - 1.0831, !- - 1.0861, !- - 1.0890, !- - 1.0920, !- - 1.0950; !- - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== - - Output:VariableDictionary,IDF,Unsorted; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:SUMMARYREPORTS =========== - - Output:Table:SummaryReports, - AllSummary; !- Report 1 Name - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:TABLE:STYLE =========== - - OutputControl:Table:Style, - HTML; !- Column Separator - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:REPORTINGTOLERANCES =========== - - OutputControl:ReportingTolerances, - 0.2, !- Tolerance for Time Heating Setpoint Not Met {deltaC} - 0.2; !- Tolerance for Time Cooling Setpoint Not Met {deltaC} - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLE =========== - - Output:Variable,*,Baseboard Electric Energy,Hourly; - - Output:Variable,*,Site Outdoor Air Drybulb Temperature,Hourly; - - Output:Variable,*,Zone Air Temperature,Hourly; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:METER =========== - - Output:Meter,InteriorEquipment:Electricity,Hourly; - - Output:Meter,InteriorLights:Electricity,Hourly; - - Output:Meter,Cooling:EnergyTransfer,Hourly; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:SQLITE =========== - - Output:SQLite, - SimpleAndTabular; !- Option Type - diff --git a/tests/input_data/trnsys/simple_2_zone_bat_infilt_gain.idf b/tests/input_data/trnsys/simple_2_zone_bat_infilt_gain.idf deleted file mode 100644 index ea8bd9f9..00000000 --- a/tests/input_data/trnsys/simple_2_zone_bat_infilt_gain.idf +++ /dev/null @@ -1,1358 +0,0 @@ -!-Generator IDFEditor 1.50 -!-Option SortedOrder -!-NOTE: All comments with '!-' are ignored by the IDFEditor and are generated automatically. -!- Use '!' comments if they need to be retained when using the IDFEditor. -!- =========== ALL OBJECTS IN CLASS: VERSION =========== - - Version,9.2; - -!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== - - SimulationControl, - Yes, !- Do Zone Sizing Calculation - No, !- Do System Sizing Calculation - No, !- Do Plant Sizing Calculation - Yes, !- Run Simulation for Sizing Periods - Yes; !- Run Simulation for Weather File Run Periods - -!- =========== ALL OBJECTS IN CLASS: BUILDING =========== - - Building, - Building 1, !- Name - , !- North Axis {deg} - , !- Terrain - , !- Loads Convergence Tolerance Value - , !- Temperature Convergence Tolerance Value {deltaC} - , !- Solar Distribution - , !- Maximum Number of Warmup Days - ; !- Minimum Number of Warmup Days - -!- =========== ALL OBJECTS IN CLASS: SHADOWCALCULATION =========== - - ShadowCalculation, - AverageOverDaysInFrequency, !- Calculation Method - 20, !- Calculation Frequency - 15000; !- Maximum Figures in Shadow Overlap Calculations - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:INSIDE =========== - - SurfaceConvectionAlgorithm:Inside,TARP; - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:OUTSIDE =========== - - SurfaceConvectionAlgorithm:Outside,DOE-2; - -!- =========== ALL OBJECTS IN CLASS: HEATBALANCEALGORITHM =========== - - HeatBalanceAlgorithm,ConductionTransferFunction,200; - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRHEATBALANCEALGORITHM =========== - - ZoneAirHeatBalanceAlgorithm, - ThirdOrderBackwardDifference; !- Algorithm - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRCONTAMINANTBALANCE =========== - - ZoneAirContaminantBalance, - No; !- Carbon Dioxide Concentration - -!- =========== ALL OBJECTS IN CLASS: ZONECAPACITANCEMULTIPLIER:RESEARCHSPECIAL =========== - - ZoneCapacitanceMultiplier:ResearchSpecial, - Zone Capacitance Multiplier Research Special, !- Name - , !- Zone or ZoneList Name - , !- Temperature Capacity Multiplier - , !- Humidity Capacity Multiplier - , !- Carbon Dioxide Capacity Multiplier - ; !- Generic Contaminant Capacity Multiplier - -!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== - - Timestep,6; - -!- =========== ALL OBJECTS IN CLASS: CONVERGENCELIMITS =========== - - ConvergenceLimits, - 1; !- Minimum System Timestep {minutes} - -!- =========== ALL OBJECTS IN CLASS: SITE:LOCATION =========== - - Site:Location, - Site 1, !- Name - 0, !- Latitude {deg} - 0, !- Longitude {deg} - 0, !- Time Zone {hr} - 0; !- Elevation {m} - -!- =========== ALL OBJECTS IN CLASS: SIZINGPERIOD:DESIGNDAY =========== - - SizingPeriod:DesignDay, - Montreal Int'l Ann Clg .4% Condns DB=>MWB, !- Name - 7, !- Month - 21, !- Day of Month - SummerDesignDay, !- Day Type - 30, !- Maximum Dry-Bulb Temperature {C} - 9.3, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - 22.1, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 4.9, !- Wind Speed {m/s} - 220, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAETau, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - 0.465, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - 1.966; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - - SizingPeriod:DesignDay, - Montreal Int'l Ann Htg 99.6% Condns DB, !- Name - 1, !- Month - 21, !- Day of Month - WinterDesignDay, !- Day Type - -23.7, !- Maximum Dry-Bulb Temperature {C} - 0, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - -23.7, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 3.9, !- Wind Speed {m/s} - 260, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAEClearSky, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - 0; !- Sky Clearness - -!- =========== ALL OBJECTS IN CLASS: RUNPERIOD =========== - - RunPeriod, - Run Period 1, !- Name - 1, !- Begin Month - 1, !- Begin Day of Month - 2009, !- Begin Year - 12, !- End Month - 31, !- End Day of Month - 2009, !- End Year - Thursday, !- Day of Week for Start Day - No, !- Use Weather File Holidays and Special Days - No, !- Use Weather File Daylight Saving Period - No, !- Apply Weekend Holiday Rule - Yes, !- Use Weather File Rain Indicators - Yes; !- Use Weather File Snow Indicators - -!- =========== ALL OBJECTS IN CLASS: SCHEDULETYPELIMITS =========== - - ScheduleTypeLimits, - Fractional, !- Name - 0, !- Lower Limit Value - 1, !- Upper Limit Value - Continuous; !- Numeric Type - - ScheduleTypeLimits, - Temperature, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - temperature; !- Unit Type - - ScheduleTypeLimits, - Watt, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - ActivityLevel; !- Unit Type - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:DAY:INTERVAL =========== - - Schedule:Day:Interval, - WaterUse Latent Fraction Schedule 5p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.05; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Schedule 120F Day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 48.8888888888889; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Sensible Fraction Schedule 20p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.2; !- Value Until Time 1 - - Schedule:Day:Interval, - Light_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.5; !- Value Until Time 1 - - Schedule:Day:Interval, - Equip_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.3; !- Value Until Time 1 - - Schedule:Day:Interval, - Activity_day_sch, !- Name - Watt, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 100; !- Value Until Time 1 - - Schedule:Day:Interval, - People_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.4; !- Value Until Time 1 - - Schedule:Day:Interval, - Heating_Setpoint_day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 20; !- Value Until Time 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:WEEK:DAILY =========== - - Schedule:Week:Daily, - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Name - WaterUse Latent Fraction Schedule 5p Day, !- Sunday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Monday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Tuesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Wednesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Thursday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Friday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Saturday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Holiday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- CustomDay1 Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Name - WaterUse Schedule 120F Day, !- Sunday Schedule:Day Name - WaterUse Schedule 120F Day, !- Monday Schedule:Day Name - WaterUse Schedule 120F Day, !- Tuesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Wednesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Thursday Schedule:Day Name - WaterUse Schedule 120F Day, !- Friday Schedule:Day Name - WaterUse Schedule 120F Day, !- Saturday Schedule:Day Name - WaterUse Schedule 120F Day, !- Holiday Schedule:Day Name - WaterUse Schedule 120F Day, !- SummerDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- WinterDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- CustomDay1 Schedule:Day Name - WaterUse Schedule 120F Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Name - WaterUse Sensible Fraction Schedule 20p Day, !- Sunday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Monday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Tuesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Wednesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Thursday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Friday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Saturday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Holiday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- CustomDay1 Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Light_week_sch, !- Name - Light_day_sch, !- Sunday Schedule:Day Name - Light_day_sch, !- Monday Schedule:Day Name - Light_day_sch, !- Tuesday Schedule:Day Name - Light_day_sch, !- Wednesday Schedule:Day Name - Light_day_sch, !- Thursday Schedule:Day Name - Light_day_sch, !- Friday Schedule:Day Name - Light_day_sch, !- Saturday Schedule:Day Name - Light_day_sch, !- Holiday Schedule:Day Name - Light_day_sch, !- SummerDesignDay Schedule:Day Name - Light_day_sch, !- WinterDesignDay Schedule:Day Name - Light_day_sch, !- CustomDay1 Schedule:Day Name - Light_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Equip_week_sch, !- Name - Equip_day_sch, !- Sunday Schedule:Day Name - Equip_day_sch, !- Monday Schedule:Day Name - Equip_day_sch, !- Tuesday Schedule:Day Name - Equip_day_sch, !- Wednesday Schedule:Day Name - Equip_day_sch, !- Thursday Schedule:Day Name - Equip_day_sch, !- Friday Schedule:Day Name - Equip_day_sch, !- Saturday Schedule:Day Name - Equip_day_sch, !- Holiday Schedule:Day Name - Equip_day_sch, !- SummerDesignDay Schedule:Day Name - Equip_day_sch, !- WinterDesignDay Schedule:Day Name - Equip_day_sch, !- CustomDay1 Schedule:Day Name - Equip_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Activity_week_sch, !- Name - Activity_day_sch, !- Sunday Schedule:Day Name - Activity_day_sch, !- Monday Schedule:Day Name - Activity_day_sch, !- Tuesday Schedule:Day Name - Activity_day_sch, !- Wednesday Schedule:Day Name - Activity_day_sch, !- Thursday Schedule:Day Name - Activity_day_sch, !- Friday Schedule:Day Name - Activity_day_sch, !- Saturday Schedule:Day Name - Activity_day_sch, !- Holiday Schedule:Day Name - Activity_day_sch, !- SummerDesignDay Schedule:Day Name - Activity_day_sch, !- WinterDesignDay Schedule:Day Name - Activity_day_sch, !- CustomDay1 Schedule:Day Name - Activity_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - People_week_sch, !- Name - People_day_sch, !- Sunday Schedule:Day Name - People_day_sch, !- Monday Schedule:Day Name - People_day_sch, !- Tuesday Schedule:Day Name - People_day_sch, !- Wednesday Schedule:Day Name - People_day_sch, !- Thursday Schedule:Day Name - People_day_sch, !- Friday Schedule:Day Name - People_day_sch, !- Saturday Schedule:Day Name - People_day_sch, !- Holiday Schedule:Day Name - People_day_sch, !- SummerDesignDay Schedule:Day Name - People_day_sch, !- WinterDesignDay Schedule:Day Name - People_day_sch, !- CustomDay1 Schedule:Day Name - People_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Heating_setpoint_week, !- Name - Heating_Setpoint_day, !- Sunday Schedule:Day Name - Heating_Setpoint_day, !- Monday Schedule:Day Name - Heating_Setpoint_day, !- Tuesday Schedule:Day Name - Heating_Setpoint_day, !- Wednesday Schedule:Day Name - Heating_Setpoint_day, !- Thursday Schedule:Day Name - Heating_Setpoint_day, !- Friday Schedule:Day Name - Heating_Setpoint_day, !- Saturday Schedule:Day Name - Heating_Setpoint_day, !- Holiday Schedule:Day Name - Heating_Setpoint_day, !- SummerDesignDay Schedule:Day Name - Heating_Setpoint_day, !- WinterDesignDay Schedule:Day Name - Heating_Setpoint_day, !- CustomDay1 Schedule:Day Name - Heating_Setpoint_day; !- CustomDay2 Schedule:Day Name - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:YEAR =========== - - Schedule:Year, - WaterUse Latent Fraction Schedule 5p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Schedule 120F, !- Name - Temperature, !- Schedule Type Limits Name - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Sensible Fraction Schedule 20p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Light_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Light_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Equip_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Equip_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Activity_year_sch, !- Name - Watt, !- Schedule Type Limits Name - Activity_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - People_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - People_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Heating_setpoint_year, !- Name - Temperature, !- Schedule Type Limits Name - Heating_setpoint_week, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:CONSTANT =========== - - Schedule:Constant,Always On,Fractional,1; - - Schedule:Constant,Always Heating,Temperature,20; - - Schedule:Constant,Always Cooling,Temperature,30; - -!- =========== ALL OBJECTS IN CLASS: MATERIAL =========== - - Material, - 1/2IN Gypsum, !- Name - Smooth, !- Roughness - 0.0127, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 784.9, !- Density {kg/m3} - 830.000000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - 1IN Stucco, !- Name - Smooth, !- Roughness - 0.0253, !- Thickness {m} - 0.691799999999999, !- Conductivity {W/m-K} - 1858, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.92, !- Solar Absorptance - 0.92; !- Visible Absorptance - - Material, - 8IN Concrete HW, !- Name - MediumRough, !- Roughness - 0.2033, !- Thickness {m} - 1.72959999999999, !- Conductivity {W/m-K} - 2242.99999999999, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.65, !- Solar Absorptance - 0.65; !- Visible Absorptance - - Material, - F08 Metal surface, !- Name - Smooth, !- Roughness - 0.0008, !- Thickness {m} - 45.2800000000001, !- Conductivity {W/m-K} - 7823.99999999999, !- Density {kg/m3} - 500, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - F16 Acoustic tile, !- Name - MediumSmooth, !- Roughness - 0.0191, !- Thickness {m} - 0.06, !- Conductivity {W/m-K} - 368, !- Density {kg/m3} - 590.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.3, !- Solar Absorptance - 0.3; !- Visible Absorptance - - Material, - G01a 19mm gypsum board, !- Name - MediumSmooth, !- Roughness - 0.019, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 800, !- Density {kg/m3} - 1090, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - G05 25mm wood, !- Name - MediumSmooth, !- Roughness - 0.0254, !- Thickness {m} - 0.15, !- Conductivity {W/m-K} - 608, !- Density {kg/m3} - 1630, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - I01 25mm insulation board, !- Name - MediumRough, !- Roughness - 0.0254, !- Thickness {m} - 0.03, !- Conductivity {W/m-K} - 43, !- Density {kg/m3} - 1210, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - M11 100mm lightweight concrete, !- Name - MediumRough, !- Roughness - 0.1016, !- Thickness {m} - 0.53, !- Conductivity {W/m-K} - 1280, !- Density {kg/m3} - 840.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - MAT-CC05 4 HW CONCRETE, !- Name - Rough, !- Roughness - 0.1016, !- Thickness {m} - 1.311, !- Conductivity {W/m-K} - 2240, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.85, !- Solar Absorptance - 0.85; !- Visible Absorptance - - Material, - Metal Decking, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Metal Roofing, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Roof Insulation [25], !- Name - MediumRough, !- Roughness - 0.263, !- Thickness {m} - 0.049, !- Conductivity {W/m-K} - 265, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - Wall Insulation [42], !- Name - MediumRough, !- Roughness - 0.0913999999999999, !- Thickness {m} - 0.0432, !- Conductivity {W/m-K} - 91, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:NOMASS =========== - - Material:NoMass, - CP02 CARPET PAD, !- Name - Smooth, !- Roughness - 0.1, !- Thermal Resistance {m2-K/W} - 0.9, !- Thermal Absorptance - 0.8, !- Solar Absorptance - 0.8; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:AIRGAP =========== - - Material:AirGap, - F04 Wall air space resistance, !- Name - 0.15; !- Thermal Resistance {m2-K/W} - - Material:AirGap, - F05 Ceiling air space resistance, !- Name - 0.18; !- Thermal Resistance {m2-K/W} - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:SIMPLEGLAZINGSYSTEM =========== - - WindowMaterial:SimpleGlazingSystem, - _2_WSV_3_Air, !- Name - 1.62, !- U-Factor {W/m2-K} - 0.64, !- Solar Heat Gain Coefficient - 0.8; !- Visible Transmittance - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:GLAZING =========== - - WindowMaterial:Glazing, - Theoretical Glass [216], !- Name - SpectralAverage, !- Optical Data Type - , !- Window Glass Spectral Data Set Name - 0.00299999999999999, !- Thickness {m} - 0.3801, !- Solar Transmittance at Normal Incidence - 0.5699, !- Front Side Solar Reflectance at Normal Incidence - 0, !- Back Side Solar Reflectance at Normal Incidence - 0.5079, !- Visible Transmittance at Normal Incidence - 0.4421, !- Front Side Visible Reflectance at Normal Incidence - 0, !- Back Side Visible Reflectance at Normal Incidence - 0, !- Infrared Transmittance at Normal Incidence - 0.9, !- Front Side Infrared Hemispherical Emissivity - 0.9, !- Back Side Infrared Hemispherical Emissivity - 0.0133, !- Conductivity {W/m-K} - 1, !- Dirt Correction Factor for Solar and Visible Transmittance - No; !- Solar Diffusing - -!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== - - Construction, - _2_WSV_3_Air, !- Name - _2_WSV_3_Air; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Name - Metal Roofing, !- Outside Layer - Roof Insulation [25], !- Layer 2 - Metal Decking; !- Layer 3 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 6, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 6, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 7, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 8, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - Exterior Door, !- Name - F08 Metal surface, !- Outside Layer - I01 25mm insulation board; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - Interior Ceiling, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Ceiling 1, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Floor, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Floor 1, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Partition, !- Name - G05 25mm wood; !- Outside Layer - - Construction, - Interior Wall, !- Name - G01a 19mm gypsum board, !- Outside Layer - F04 Wall air space resistance, !- Layer 2 - G01a 19mm gypsum board; !- Layer 3 - -!- =========== ALL OBJECTS IN CLASS: GLOBALGEOMETRYRULES =========== - - GlobalGeometryRules, - UpperLeftCorner, !- Starting Vertex Position - Counterclockwise, !- Vertex Entry Direction - Relative, !- Coordinate System - Relative, !- Daylighting Reference Point Coordinate System - Relative; !- Rectangular Surface Coordinate System - -!- =========== ALL OBJECTS IN CLASS: ZONE =========== - - Zone, - Thermal Zone 1, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - - Zone, - Thermal Zone 2, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - -!- =========== ALL OBJECTS IN CLASS: ZONELIST =========== - - ZoneList, - Space Type 1, !- Name - Thermal Zone 1; !- Zone 1 Name - - ZoneList, - Space Type 2, !- Name - Thermal Zone 2; !- Zone 1 Name - - ZoneList, - All_zones, !- Name - Thermal Zone 1, !- Zone 1 Name - Thermal Zone 2; !- Zone 2 Name - -!- =========== ALL OBJECTS IN CLASS: BUILDINGSURFACE:DETAILED =========== - - BuildingSurface:Detailed, - Face 0, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 1, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,0, !- X,Y,Z ==> Vertex 1 {m} - 5,220,0, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 1, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,225,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 12, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 2, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 3, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 1, !- Zone Name - Surface, !- Outside Boundary Condition - Face 13, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 5, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 10, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 11, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 13, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 2, !- Zone Name - Surface, !- Outside Boundary Condition - Face 3, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 7, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 2, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,0, !- X,Y,Z ==> Vertex 1 {m} - 5,215,0, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 8, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,220,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 9, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: FENESTRATIONSURFACE:DETAILED =========== - - FenestrationSurface:Detailed, - Face 101, !- Name - Window, !- Surface Type - _2_WSV_3_Air, !- Construction Name - Face 2, !- Building Surface Name - , !- Outside Boundary Condition Object - , !- View Factor to Ground - , !- Frame and Divider Name - , !- Multiplier - , !- Number of Vertices - 215.5,5,0.5, !- X,Y,Z ==> Vertex 1 {m} - 215.5,5,2, !- X,Y,Z ==> Vertex 2 {m} - 217,5,2, !- X,Y,Z ==> Vertex 3 {m} - 217,5,0.5; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: PEOPLE =========== - - People, - People 1, !- Name - Space Type 1, !- Zone or ZoneList Name - People_year_sch, !- Number of People Schedule Name - People/Area, !- Number of People Calculation Method - , !- Number of People - 0.02, !- People per Zone Floor Area {person/m2} - , !- Zone Floor Area per Person {m2/person} - 0.3, !- Fraction Radiant - , !- Sensible Heat Fraction - Activity_year_sch; !- Activity Level Schedule Name - - People, - People 2, !- Name - Space Type 2, !- Zone or ZoneList Name - People_year_sch, !- Number of People Schedule Name - People/Area, !- Number of People Calculation Method - , !- Number of People - 0.02, !- People per Zone Floor Area {person/m2} - , !- Zone Floor Area per Person {m2/person} - 0.3, !- Fraction Radiant - , !- Sensible Heat Fraction - Activity_year_sch; !- Activity Level Schedule Name - -!- =========== ALL OBJECTS IN CLASS: LIGHTS =========== - - Lights, - Lights 1, !- Name - Space Type 1, !- Zone or ZoneList Name - Light_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Lighting Level {W} - 9, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - , !- Return Air Fraction - 0.5, !- Fraction Radiant - 0.3, !- Fraction Visible - 1, !- Fraction Replaceable - General; !- End-Use Subcategory - - Lights, - Lights 2, !- Name - Space Type 2, !- Zone or ZoneList Name - Equip_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Lighting Level {W} - 9, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - , !- Return Air Fraction - 0.5, !- Fraction Radiant - 0.3, !- Fraction Visible - 1, !- Fraction Replaceable - General; !- End-Use Subcategory - -!- =========== ALL OBJECTS IN CLASS: ELECTRICEQUIPMENT =========== - - ElectricEquipment, - Electric Equipment 1, !- Name - Space Type 1, !- Zone or ZoneList Name - Equip_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Design Level {W} - 15, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - 0.5, !- Fraction Latent - 0.5, !- Fraction Radiant - , !- Fraction Lost - General; !- End-Use Subcategory - - ElectricEquipment, - Electric Equipment 2, !- Name - Space Type 2, !- Zone or ZoneList Name - Equip_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Design Level {W} - 15, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - 0.5, !- Fraction Latent - 0.5, !- Fraction Radiant - , !- Fraction Lost - General; !- End-Use Subcategory - -!- =========== ALL OBJECTS IN CLASS: ZONEINFILTRATION:DESIGNFLOWRATE =========== - - ZoneInfiltration:DesignFlowRate, - Infilt, !- Name - All_zones, !- Zone or ZoneList Name - Always On, !- Schedule Name - AirChanges/Hour, !- Design Flow Rate Calculation Method - , !- Design Flow Rate {m3/s} - , !- Flow per Zone Floor Area {m3/s-m2} - , !- Flow per Exterior Surface Area {m3/s-m2} - 0.5, !- Air Changes per Hour {1/hr} - 0, !- Constant Term Coefficient - , !- Temperature Term Coefficient - 0.224, !- Velocity Term Coefficient - ; !- Velocity Squared Term Coefficient - -!- =========== ALL OBJECTS IN CLASS: HVACTEMPLATE:THERMOSTAT =========== - - HVACTemplate:Thermostat, - Thermostat, !- Name - Always Heating, !- Heating Setpoint Schedule Name - 20, !- Constant Heating Setpoint {C} - Always Cooling, !- Cooling Setpoint Schedule Name - 30; !- Constant Cooling Setpoint {C} - -!- =========== ALL OBJECTS IN CLASS: SIZING:PARAMETERS =========== - - Sizing:Parameters, - 1.25, !- Heating Sizing Factor - 1.15; !- Cooling Sizing Factor - -!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODE =========== - - OutdoorAir:Node, - Model Outdoor Air Node; !- Name - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:PARAMETERS =========== - - LifeCycleCost:Parameters, - Life Cycle Cost Parameters, !- Name - EndOfYear, !- Discounting Convention - ConstantDollar, !- Inflation Approach - 0.03, !- Real Discount Rate - , !- Nominal Discount Rate - , !- Inflation - , !- Base Date Month - 2011, !- Base Date Year - , !- Service Date Month - 2011, !- Service Date Year - 25, !- Length of Study Period in Years - , !- Tax rate - None; !- Depreciation Method - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:NONRECURRINGCOST =========== - - LifeCycleCost:NonrecurringCost, - Default Cost, !- Name - Construction, !- Category - 0, !- Cost - ServicePeriod; !- Start of Costs - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:USEPRICEESCALATION =========== - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Electricity, !- LCC Price Escalation Name - Electricity, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9838, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9632, !- Year 3 Escalation - 0.9611, !- Year 4 Escalation - 0.9571, !- Year 5 Escalation - 0.9553, !- Year 6 Escalation - 0.9539, !- Year 7 Escalation - 0.9521, !- Year 8 Escalation - 0.9546, !- Year 9 Escalation - 0.9550, !- - 0.9553, !- - 0.9564, !- - 0.9575, !- - 0.9596, !- - 0.9618, !- - 0.9614, !- - 0.9618, !- - 0.9618, !- - 0.9593, !- - 0.9589, !- - 0.9607, !- - 0.9625, !- - 0.9650, !- - 0.9708, !- - 0.9751, !- - 0.9762, !- - 0.9766, !- - 0.9766, !- - 0.9769, !- - 0.9773; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Distillate Oil, !- LCC Price Escalation Name - FuelOil#1, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9714, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9942, !- Year 3 Escalation - 1.0164, !- Year 4 Escalation - 1.0541, !- Year 5 Escalation - 1.0928, !- Year 6 Escalation - 1.1267, !- Year 7 Escalation - 1.1580, !- Year 8 Escalation - 1.1792, !- Year 9 Escalation - 1.1967, !- - 1.2200, !- - 1.2333, !- - 1.2566, !- - 1.2709, !- - 1.2826, !- - 1.2985, !- - 1.3102, !- - 1.3250, !- - 1.3261, !- - 1.3282, !- - 1.3324, !- - 1.3356, !- - 1.3431, !- - 1.3510, !- - 1.3568, !- - 1.3606, !- - 1.3637, !- - 1.3674, !- - 1.3706, !- - 1.3743; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Residual Oil, !- LCC Price Escalation Name - FuelOil#2, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.8469, !- Year 1 Escalation - 0.8257, !- Year 2 Escalation - 0.8681, !- Year 3 Escalation - 0.8988, !- Year 4 Escalation - 0.9289, !- Year 5 Escalation - 0.9604, !- Year 6 Escalation - 0.9897, !- Year 7 Escalation - 1.0075, !- Year 8 Escalation - 1.0314, !- Year 9 Escalation - 1.0554, !- - 1.0861, !- - 1.1278, !- - 1.1497, !- - 1.1620, !- - 1.1743, !- - 1.1852, !- - 1.1948, !- - 1.2037, !- - 1.2071, !- - 1.2119, !- - 1.2139, !- - 1.2194, !- - 1.2276, !- - 1.2365, !- - 1.2420, !- - 1.2461, !- - 1.2509, !- - 1.2550, !- - 1.2591, !- - 1.2638; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Natural gas, !- LCC Price Escalation Name - NaturalGas, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9823, !- Year 1 Escalation - 0.9557, !- Year 2 Escalation - 0.9279, !- Year 3 Escalation - 0.9257, !- Year 4 Escalation - 0.9346, !- Year 5 Escalation - 0.9412, !- Year 6 Escalation - 0.9512, !- Year 7 Escalation - 0.9645, !- Year 8 Escalation - 0.9856, !- Year 9 Escalation - 1.0067, !- - 1.0222, !- - 1.0410, !- - 1.0610, !- - 1.0787, !- - 1.0942, !- - 1.1098, !- - 1.1220, !- - 1.1308, !- - 1.1386, !- - 1.1486, !- - 1.1619, !- - 1.1763, !- - 1.1918, !- - 1.2118, !- - 1.2284, !- - 1.2439, !- - 1.2605, !- - 1.2772, !- - 1.2938, !- - 1.3115; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Coal, !- LCC Price Escalation Name - Coal, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9970, !- Year 1 Escalation - 1.0089, !- Year 2 Escalation - 1.0089, !- Year 3 Escalation - 0.9941, !- Year 4 Escalation - 0.9941, !- Year 5 Escalation - 1.0000, !- Year 6 Escalation - 1.0030, !- Year 7 Escalation - 1.0059, !- Year 8 Escalation - 1.0089, !- Year 9 Escalation - 1.0119, !- - 1.0148, !- - 1.0178, !- - 1.0208, !- - 1.0267, !- - 1.0297, !- - 1.0356, !- - 1.0415, !- - 1.0534, !- - 1.0564, !- - 1.0593, !- - 1.0653, !- - 1.0712, !- - 1.0742, !- - 1.0801, !- - 1.0831, !- - 1.0831, !- - 1.0861, !- - 1.0890, !- - 1.0920, !- - 1.0950; !- - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== - - Output:VariableDictionary,IDF,Unsorted; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:SUMMARYREPORTS =========== - - Output:Table:SummaryReports, - AllSummary; !- Report 1 Name - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:TABLE:STYLE =========== - - OutputControl:Table:Style, - HTML; !- Column Separator - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:REPORTINGTOLERANCES =========== - - OutputControl:ReportingTolerances, - 0.2, !- Tolerance for Time Heating Setpoint Not Met {deltaC} - 0.2; !- Tolerance for Time Cooling Setpoint Not Met {deltaC} - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLE =========== - - Output:Variable,*,Baseboard Electric Energy,Hourly; - - Output:Variable,*,Site Outdoor Air Drybulb Temperature,Hourly; - - Output:Variable,*,Zone Air Temperature,Hourly; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:METER =========== - - Output:Meter,InteriorEquipment:Electricity,Hourly; - - Output:Meter,InteriorLights:Electricity,Hourly; - - Output:Meter,Cooling:EnergyTransfer,Hourly; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:SQLITE =========== - - Output:SQLite, - SimpleAndTabular; !- Option Type - diff --git a/tests/input_data/trnsys/simple_2_zone_bat_only.idf b/tests/input_data/trnsys/simple_2_zone_bat_only.idf deleted file mode 100644 index 421c42ec..00000000 --- a/tests/input_data/trnsys/simple_2_zone_bat_only.idf +++ /dev/null @@ -1,1258 +0,0 @@ -!-Generator IDFEditor 1.50 -!-Option SortedOrder -!-NOTE: All comments with '!-' are ignored by the IDFEditor and are generated automatically. -!- Use '!' comments if they need to be retained when using the IDFEditor. -!- =========== ALL OBJECTS IN CLASS: VERSION =========== - - Version,9.2; - -!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== - - SimulationControl, - Yes, !- Do Zone Sizing Calculation - No, !- Do System Sizing Calculation - No, !- Do Plant Sizing Calculation - Yes, !- Run Simulation for Sizing Periods - Yes; !- Run Simulation for Weather File Run Periods - -!- =========== ALL OBJECTS IN CLASS: BUILDING =========== - - Building, - Building 1, !- Name - , !- North Axis {deg} - , !- Terrain - , !- Loads Convergence Tolerance Value - , !- Temperature Convergence Tolerance Value {deltaC} - , !- Solar Distribution - , !- Maximum Number of Warmup Days - ; !- Minimum Number of Warmup Days - -!- =========== ALL OBJECTS IN CLASS: SHADOWCALCULATION =========== - - ShadowCalculation, - AverageOverDaysInFrequency, !- Calculation Method - 20, !- Calculation Frequency - 15000; !- Maximum Figures in Shadow Overlap Calculations - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:INSIDE =========== - - SurfaceConvectionAlgorithm:Inside,TARP; - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:OUTSIDE =========== - - SurfaceConvectionAlgorithm:Outside,DOE-2; - -!- =========== ALL OBJECTS IN CLASS: HEATBALANCEALGORITHM =========== - - HeatBalanceAlgorithm,ConductionTransferFunction,200; - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRHEATBALANCEALGORITHM =========== - - ZoneAirHeatBalanceAlgorithm, - ThirdOrderBackwardDifference; !- Algorithm - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRCONTAMINANTBALANCE =========== - - ZoneAirContaminantBalance, - No; !- Carbon Dioxide Concentration - -!- =========== ALL OBJECTS IN CLASS: ZONECAPACITANCEMULTIPLIER:RESEARCHSPECIAL =========== - - ZoneCapacitanceMultiplier:ResearchSpecial, - Zone Capacitance Multiplier Research Special, !- Name - , !- Zone or ZoneList Name - , !- Temperature Capacity Multiplier - , !- Humidity Capacity Multiplier - , !- Carbon Dioxide Capacity Multiplier - ; !- Generic Contaminant Capacity Multiplier - -!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== - - Timestep,6; - -!- =========== ALL OBJECTS IN CLASS: CONVERGENCELIMITS =========== - - ConvergenceLimits, - 1; !- Minimum System Timestep {minutes} - -!- =========== ALL OBJECTS IN CLASS: SITE:LOCATION =========== - - Site:Location, - Site 1, !- Name - 0, !- Latitude {deg} - 0, !- Longitude {deg} - 0, !- Time Zone {hr} - 0; !- Elevation {m} - -!- =========== ALL OBJECTS IN CLASS: SIZINGPERIOD:DESIGNDAY =========== - - SizingPeriod:DesignDay, - Montreal Int'l Ann Clg .4% Condns DB=>MWB, !- Name - 7, !- Month - 21, !- Day of Month - SummerDesignDay, !- Day Type - 30, !- Maximum Dry-Bulb Temperature {C} - 9.3, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - 22.1, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 4.9, !- Wind Speed {m/s} - 220, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAETau, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - 0.465, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - 1.966; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - - SizingPeriod:DesignDay, - Montreal Int'l Ann Htg 99.6% Condns DB, !- Name - 1, !- Month - 21, !- Day of Month - WinterDesignDay, !- Day Type - -23.7, !- Maximum Dry-Bulb Temperature {C} - 0, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - -23.7, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 3.9, !- Wind Speed {m/s} - 260, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAEClearSky, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - 0; !- Sky Clearness - -!- =========== ALL OBJECTS IN CLASS: RUNPERIOD =========== - - RunPeriod, - Run Period 1, !- Name - 1, !- Begin Month - 1, !- Begin Day of Month - 2009, !- Begin Year - 12, !- End Month - 31, !- End Day of Month - 2009, !- End Year - Thursday, !- Day of Week for Start Day - No, !- Use Weather File Holidays and Special Days - No, !- Use Weather File Daylight Saving Period - No, !- Apply Weekend Holiday Rule - Yes, !- Use Weather File Rain Indicators - Yes; !- Use Weather File Snow Indicators - -!- =========== ALL OBJECTS IN CLASS: SCHEDULETYPELIMITS =========== - - ScheduleTypeLimits, - Fractional, !- Name - 0, !- Lower Limit Value - 1, !- Upper Limit Value - Continuous; !- Numeric Type - - ScheduleTypeLimits, - Temperature, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - temperature; !- Unit Type - - ScheduleTypeLimits, - Watt, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - ActivityLevel; !- Unit Type - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:DAY:INTERVAL =========== - - Schedule:Day:Interval, - WaterUse Latent Fraction Schedule 5p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.05; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Schedule 120F Day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 48.8888888888889; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Sensible Fraction Schedule 20p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.2; !- Value Until Time 1 - - Schedule:Day:Interval, - Light_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.5; !- Value Until Time 1 - - Schedule:Day:Interval, - Equip_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.3; !- Value Until Time 1 - - Schedule:Day:Interval, - Activity_day_sch, !- Name - Watt, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 100; !- Value Until Time 1 - - Schedule:Day:Interval, - People_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.4; !- Value Until Time 1 - - Schedule:Day:Interval, - Heating_Setpoint_day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 20; !- Value Until Time 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:WEEK:DAILY =========== - - Schedule:Week:Daily, - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Name - WaterUse Latent Fraction Schedule 5p Day, !- Sunday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Monday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Tuesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Wednesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Thursday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Friday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Saturday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Holiday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- CustomDay1 Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Name - WaterUse Schedule 120F Day, !- Sunday Schedule:Day Name - WaterUse Schedule 120F Day, !- Monday Schedule:Day Name - WaterUse Schedule 120F Day, !- Tuesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Wednesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Thursday Schedule:Day Name - WaterUse Schedule 120F Day, !- Friday Schedule:Day Name - WaterUse Schedule 120F Day, !- Saturday Schedule:Day Name - WaterUse Schedule 120F Day, !- Holiday Schedule:Day Name - WaterUse Schedule 120F Day, !- SummerDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- WinterDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- CustomDay1 Schedule:Day Name - WaterUse Schedule 120F Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Name - WaterUse Sensible Fraction Schedule 20p Day, !- Sunday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Monday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Tuesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Wednesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Thursday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Friday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Saturday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Holiday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- CustomDay1 Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Light_week_sch, !- Name - Light_day_sch, !- Sunday Schedule:Day Name - Light_day_sch, !- Monday Schedule:Day Name - Light_day_sch, !- Tuesday Schedule:Day Name - Light_day_sch, !- Wednesday Schedule:Day Name - Light_day_sch, !- Thursday Schedule:Day Name - Light_day_sch, !- Friday Schedule:Day Name - Light_day_sch, !- Saturday Schedule:Day Name - Light_day_sch, !- Holiday Schedule:Day Name - Light_day_sch, !- SummerDesignDay Schedule:Day Name - Light_day_sch, !- WinterDesignDay Schedule:Day Name - Light_day_sch, !- CustomDay1 Schedule:Day Name - Light_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Equip_week_sch, !- Name - Equip_day_sch, !- Sunday Schedule:Day Name - Equip_day_sch, !- Monday Schedule:Day Name - Equip_day_sch, !- Tuesday Schedule:Day Name - Equip_day_sch, !- Wednesday Schedule:Day Name - Equip_day_sch, !- Thursday Schedule:Day Name - Equip_day_sch, !- Friday Schedule:Day Name - Equip_day_sch, !- Saturday Schedule:Day Name - Equip_day_sch, !- Holiday Schedule:Day Name - Equip_day_sch, !- SummerDesignDay Schedule:Day Name - Equip_day_sch, !- WinterDesignDay Schedule:Day Name - Equip_day_sch, !- CustomDay1 Schedule:Day Name - Equip_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Activity_week_sch, !- Name - Activity_day_sch, !- Sunday Schedule:Day Name - Activity_day_sch, !- Monday Schedule:Day Name - Activity_day_sch, !- Tuesday Schedule:Day Name - Activity_day_sch, !- Wednesday Schedule:Day Name - Activity_day_sch, !- Thursday Schedule:Day Name - Activity_day_sch, !- Friday Schedule:Day Name - Activity_day_sch, !- Saturday Schedule:Day Name - Activity_day_sch, !- Holiday Schedule:Day Name - Activity_day_sch, !- SummerDesignDay Schedule:Day Name - Activity_day_sch, !- WinterDesignDay Schedule:Day Name - Activity_day_sch, !- CustomDay1 Schedule:Day Name - Activity_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - People_week_sch, !- Name - People_day_sch, !- Sunday Schedule:Day Name - People_day_sch, !- Monday Schedule:Day Name - People_day_sch, !- Tuesday Schedule:Day Name - People_day_sch, !- Wednesday Schedule:Day Name - People_day_sch, !- Thursday Schedule:Day Name - People_day_sch, !- Friday Schedule:Day Name - People_day_sch, !- Saturday Schedule:Day Name - People_day_sch, !- Holiday Schedule:Day Name - People_day_sch, !- SummerDesignDay Schedule:Day Name - People_day_sch, !- WinterDesignDay Schedule:Day Name - People_day_sch, !- CustomDay1 Schedule:Day Name - People_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Heating_setpoint_week, !- Name - Heating_Setpoint_day, !- Sunday Schedule:Day Name - Heating_Setpoint_day, !- Monday Schedule:Day Name - Heating_Setpoint_day, !- Tuesday Schedule:Day Name - Heating_Setpoint_day, !- Wednesday Schedule:Day Name - Heating_Setpoint_day, !- Thursday Schedule:Day Name - Heating_Setpoint_day, !- Friday Schedule:Day Name - Heating_Setpoint_day, !- Saturday Schedule:Day Name - Heating_Setpoint_day, !- Holiday Schedule:Day Name - Heating_Setpoint_day, !- SummerDesignDay Schedule:Day Name - Heating_Setpoint_day, !- WinterDesignDay Schedule:Day Name - Heating_Setpoint_day, !- CustomDay1 Schedule:Day Name - Heating_Setpoint_day; !- CustomDay2 Schedule:Day Name - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:YEAR =========== - - Schedule:Year, - WaterUse Latent Fraction Schedule 5p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Schedule 120F, !- Name - Temperature, !- Schedule Type Limits Name - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Sensible Fraction Schedule 20p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Light_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Light_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Equip_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Equip_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Activity_year_sch, !- Name - Watt, !- Schedule Type Limits Name - Activity_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - People_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - People_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Heating_setpoint_year, !- Name - Temperature, !- Schedule Type Limits Name - Heating_setpoint_week, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:CONSTANT =========== - - Schedule:Constant,Always On,Fractional,1; - - Schedule:Constant,Always Heating,Temperature,20; - - Schedule:Constant,Always Cooling,Temperature,30; - -!- =========== ALL OBJECTS IN CLASS: MATERIAL =========== - - Material, - 1/2IN Gypsum, !- Name - Smooth, !- Roughness - 0.0127, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 784.9, !- Density {kg/m3} - 830.000000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - 1IN Stucco, !- Name - Smooth, !- Roughness - 0.0253, !- Thickness {m} - 0.691799999999999, !- Conductivity {W/m-K} - 1858, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.92, !- Solar Absorptance - 0.92; !- Visible Absorptance - - Material, - 8IN Concrete HW, !- Name - MediumRough, !- Roughness - 0.2033, !- Thickness {m} - 1.72959999999999, !- Conductivity {W/m-K} - 2242.99999999999, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.65, !- Solar Absorptance - 0.65; !- Visible Absorptance - - Material, - F08 Metal surface, !- Name - Smooth, !- Roughness - 0.0008, !- Thickness {m} - 45.2800000000001, !- Conductivity {W/m-K} - 7823.99999999999, !- Density {kg/m3} - 500, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - F16 Acoustic tile, !- Name - MediumSmooth, !- Roughness - 0.0191, !- Thickness {m} - 0.06, !- Conductivity {W/m-K} - 368, !- Density {kg/m3} - 590.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.3, !- Solar Absorptance - 0.3; !- Visible Absorptance - - Material, - G01a 19mm gypsum board, !- Name - MediumSmooth, !- Roughness - 0.019, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 800, !- Density {kg/m3} - 1090, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - G05 25mm wood, !- Name - MediumSmooth, !- Roughness - 0.0254, !- Thickness {m} - 0.15, !- Conductivity {W/m-K} - 608, !- Density {kg/m3} - 1630, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - I01 25mm insulation board, !- Name - MediumRough, !- Roughness - 0.0254, !- Thickness {m} - 0.03, !- Conductivity {W/m-K} - 43, !- Density {kg/m3} - 1210, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - M11 100mm lightweight concrete, !- Name - MediumRough, !- Roughness - 0.1016, !- Thickness {m} - 0.53, !- Conductivity {W/m-K} - 1280, !- Density {kg/m3} - 840.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - MAT-CC05 4 HW CONCRETE, !- Name - Rough, !- Roughness - 0.1016, !- Thickness {m} - 1.311, !- Conductivity {W/m-K} - 2240, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.85, !- Solar Absorptance - 0.85; !- Visible Absorptance - - Material, - Metal Decking, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Metal Roofing, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Roof Insulation [25], !- Name - MediumRough, !- Roughness - 0.263, !- Thickness {m} - 0.049, !- Conductivity {W/m-K} - 265, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - Wall Insulation [42], !- Name - MediumRough, !- Roughness - 0.0913999999999999, !- Thickness {m} - 0.0432, !- Conductivity {W/m-K} - 91, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:NOMASS =========== - - Material:NoMass, - CP02 CARPET PAD, !- Name - Smooth, !- Roughness - 0.1, !- Thermal Resistance {m2-K/W} - 0.9, !- Thermal Absorptance - 0.8, !- Solar Absorptance - 0.8; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:AIRGAP =========== - - Material:AirGap, - F04 Wall air space resistance, !- Name - 0.15; !- Thermal Resistance {m2-K/W} - - Material:AirGap, - F05 Ceiling air space resistance, !- Name - 0.18; !- Thermal Resistance {m2-K/W} - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:SIMPLEGLAZINGSYSTEM =========== - - WindowMaterial:SimpleGlazingSystem, - _2_WSV_3_Air, !- Name - 1.62, !- U-Factor {W/m2-K} - 0.64, !- Solar Heat Gain Coefficient - 0.8; !- Visible Transmittance - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:GLAZING =========== - - WindowMaterial:Glazing, - Theoretical Glass [216], !- Name - SpectralAverage, !- Optical Data Type - , !- Window Glass Spectral Data Set Name - 0.00299999999999999, !- Thickness {m} - 0.3801, !- Solar Transmittance at Normal Incidence - 0.5699, !- Front Side Solar Reflectance at Normal Incidence - 0, !- Back Side Solar Reflectance at Normal Incidence - 0.5079, !- Visible Transmittance at Normal Incidence - 0.4421, !- Front Side Visible Reflectance at Normal Incidence - 0, !- Back Side Visible Reflectance at Normal Incidence - 0, !- Infrared Transmittance at Normal Incidence - 0.9, !- Front Side Infrared Hemispherical Emissivity - 0.9, !- Back Side Infrared Hemispherical Emissivity - 0.0133, !- Conductivity {W/m-K} - 1, !- Dirt Correction Factor for Solar and Visible Transmittance - No; !- Solar Diffusing - -!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== - - Construction, - _2_WSV_3_Air, !- Name - _2_WSV_3_Air; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Name - Metal Roofing, !- Outside Layer - Roof Insulation [25], !- Layer 2 - Metal Decking; !- Layer 3 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 6, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 6, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 7, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 8, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - Exterior Door, !- Name - F08 Metal surface, !- Outside Layer - I01 25mm insulation board; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - Interior Ceiling, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Ceiling 1, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Floor, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Floor 1, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Partition, !- Name - G05 25mm wood; !- Outside Layer - - Construction, - Interior Wall, !- Name - G01a 19mm gypsum board, !- Outside Layer - F04 Wall air space resistance, !- Layer 2 - G01a 19mm gypsum board; !- Layer 3 - -!- =========== ALL OBJECTS IN CLASS: GLOBALGEOMETRYRULES =========== - - GlobalGeometryRules, - UpperLeftCorner, !- Starting Vertex Position - Counterclockwise, !- Vertex Entry Direction - Relative, !- Coordinate System - Relative, !- Daylighting Reference Point Coordinate System - Relative; !- Rectangular Surface Coordinate System - -!- =========== ALL OBJECTS IN CLASS: ZONE =========== - - Zone, - Thermal Zone 1, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - - Zone, - Thermal Zone 2, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - -!- =========== ALL OBJECTS IN CLASS: ZONELIST =========== - - ZoneList, - Space Type 1, !- Name - Thermal Zone 1; !- Zone 1 Name - - ZoneList, - Space Type 2, !- Name - Thermal Zone 2; !- Zone 1 Name - - ZoneList, - All_zones, !- Name - Thermal Zone 1, !- Zone 1 Name - Thermal Zone 2; !- Zone 2 Name - -!- =========== ALL OBJECTS IN CLASS: BUILDINGSURFACE:DETAILED =========== - - BuildingSurface:Detailed, - Face 0, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 1, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,0, !- X,Y,Z ==> Vertex 1 {m} - 5,220,0, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 1, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,225,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 12, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 2, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 3, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 1, !- Zone Name - Surface, !- Outside Boundary Condition - Face 13, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 5, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 10, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 11, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 13, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 2, !- Zone Name - Surface, !- Outside Boundary Condition - Face 3, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 7, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 2, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,0, !- X,Y,Z ==> Vertex 1 {m} - 5,215,0, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 8, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,220,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 9, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: FENESTRATIONSURFACE:DETAILED =========== - - FenestrationSurface:Detailed, - Face 101, !- Name - Window, !- Surface Type - _2_WSV_3_Air, !- Construction Name - Face 2, !- Building Surface Name - , !- Outside Boundary Condition Object - , !- View Factor to Ground - , !- Frame and Divider Name - , !- Multiplier - , !- Number of Vertices - 215.5,5,0.5, !- X,Y,Z ==> Vertex 1 {m} - 215.5,5,2, !- X,Y,Z ==> Vertex 2 {m} - 217,5,2, !- X,Y,Z ==> Vertex 3 {m} - 217,5,0.5; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: HVACTEMPLATE:THERMOSTAT =========== - - HVACTemplate:Thermostat, - Thermostat, !- Name - Always Heating, !- Heating Setpoint Schedule Name - 20, !- Constant Heating Setpoint {C} - Always Cooling, !- Cooling Setpoint Schedule Name - 30; !- Constant Cooling Setpoint {C} - -!- =========== ALL OBJECTS IN CLASS: SIZING:PARAMETERS =========== - - Sizing:Parameters, - 1.25, !- Heating Sizing Factor - 1.15; !- Cooling Sizing Factor - -!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODE =========== - - OutdoorAir:Node, - Model Outdoor Air Node; !- Name - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:PARAMETERS =========== - - LifeCycleCost:Parameters, - Life Cycle Cost Parameters, !- Name - EndOfYear, !- Discounting Convention - ConstantDollar, !- Inflation Approach - 0.03, !- Real Discount Rate - , !- Nominal Discount Rate - , !- Inflation - , !- Base Date Month - 2011, !- Base Date Year - , !- Service Date Month - 2011, !- Service Date Year - 25, !- Length of Study Period in Years - , !- Tax rate - None; !- Depreciation Method - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:NONRECURRINGCOST =========== - - LifeCycleCost:NonrecurringCost, - Default Cost, !- Name - Construction, !- Category - 0, !- Cost - ServicePeriod; !- Start of Costs - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:USEPRICEESCALATION =========== - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Electricity, !- LCC Price Escalation Name - Electricity, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9838, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9632, !- Year 3 Escalation - 0.9611, !- Year 4 Escalation - 0.9571, !- Year 5 Escalation - 0.9553, !- Year 6 Escalation - 0.9539, !- Year 7 Escalation - 0.9521, !- Year 8 Escalation - 0.9546, !- Year 9 Escalation - 0.9550, !- - 0.9553, !- - 0.9564, !- - 0.9575, !- - 0.9596, !- - 0.9618, !- - 0.9614, !- - 0.9618, !- - 0.9618, !- - 0.9593, !- - 0.9589, !- - 0.9607, !- - 0.9625, !- - 0.9650, !- - 0.9708, !- - 0.9751, !- - 0.9762, !- - 0.9766, !- - 0.9766, !- - 0.9769, !- - 0.9773; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Distillate Oil, !- LCC Price Escalation Name - FuelOil#1, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9714, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9942, !- Year 3 Escalation - 1.0164, !- Year 4 Escalation - 1.0541, !- Year 5 Escalation - 1.0928, !- Year 6 Escalation - 1.1267, !- Year 7 Escalation - 1.1580, !- Year 8 Escalation - 1.1792, !- Year 9 Escalation - 1.1967, !- - 1.2200, !- - 1.2333, !- - 1.2566, !- - 1.2709, !- - 1.2826, !- - 1.2985, !- - 1.3102, !- - 1.3250, !- - 1.3261, !- - 1.3282, !- - 1.3324, !- - 1.3356, !- - 1.3431, !- - 1.3510, !- - 1.3568, !- - 1.3606, !- - 1.3637, !- - 1.3674, !- - 1.3706, !- - 1.3743; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Residual Oil, !- LCC Price Escalation Name - FuelOil#2, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.8469, !- Year 1 Escalation - 0.8257, !- Year 2 Escalation - 0.8681, !- Year 3 Escalation - 0.8988, !- Year 4 Escalation - 0.9289, !- Year 5 Escalation - 0.9604, !- Year 6 Escalation - 0.9897, !- Year 7 Escalation - 1.0075, !- Year 8 Escalation - 1.0314, !- Year 9 Escalation - 1.0554, !- - 1.0861, !- - 1.1278, !- - 1.1497, !- - 1.1620, !- - 1.1743, !- - 1.1852, !- - 1.1948, !- - 1.2037, !- - 1.2071, !- - 1.2119, !- - 1.2139, !- - 1.2194, !- - 1.2276, !- - 1.2365, !- - 1.2420, !- - 1.2461, !- - 1.2509, !- - 1.2550, !- - 1.2591, !- - 1.2638; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Natural gas, !- LCC Price Escalation Name - NaturalGas, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9823, !- Year 1 Escalation - 0.9557, !- Year 2 Escalation - 0.9279, !- Year 3 Escalation - 0.9257, !- Year 4 Escalation - 0.9346, !- Year 5 Escalation - 0.9412, !- Year 6 Escalation - 0.9512, !- Year 7 Escalation - 0.9645, !- Year 8 Escalation - 0.9856, !- Year 9 Escalation - 1.0067, !- - 1.0222, !- - 1.0410, !- - 1.0610, !- - 1.0787, !- - 1.0942, !- - 1.1098, !- - 1.1220, !- - 1.1308, !- - 1.1386, !- - 1.1486, !- - 1.1619, !- - 1.1763, !- - 1.1918, !- - 1.2118, !- - 1.2284, !- - 1.2439, !- - 1.2605, !- - 1.2772, !- - 1.2938, !- - 1.3115; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Coal, !- LCC Price Escalation Name - Coal, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9970, !- Year 1 Escalation - 1.0089, !- Year 2 Escalation - 1.0089, !- Year 3 Escalation - 0.9941, !- Year 4 Escalation - 0.9941, !- Year 5 Escalation - 1.0000, !- Year 6 Escalation - 1.0030, !- Year 7 Escalation - 1.0059, !- Year 8 Escalation - 1.0089, !- Year 9 Escalation - 1.0119, !- - 1.0148, !- - 1.0178, !- - 1.0208, !- - 1.0267, !- - 1.0297, !- - 1.0356, !- - 1.0415, !- - 1.0534, !- - 1.0564, !- - 1.0593, !- - 1.0653, !- - 1.0712, !- - 1.0742, !- - 1.0801, !- - 1.0831, !- - 1.0831, !- - 1.0861, !- - 1.0890, !- - 1.0920, !- - 1.0950; !- - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== - - Output:VariableDictionary,IDF,Unsorted; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:SUMMARYREPORTS =========== - - Output:Table:SummaryReports, - AllSummary; !- Report 1 Name - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:TABLE:STYLE =========== - - OutputControl:Table:Style, - HTML; !- Column Separator - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:REPORTINGTOLERANCES =========== - - OutputControl:ReportingTolerances, - 0.2, !- Tolerance for Time Heating Setpoint Not Met {deltaC} - 0.2; !- Tolerance for Time Cooling Setpoint Not Met {deltaC} - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLE =========== - - Output:Variable,*,Baseboard Electric Energy,Hourly; - - Output:Variable,*,Site Outdoor Air Drybulb Temperature,Hourly; - - Output:Variable,*,Zone Air Temperature,Hourly; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:METER =========== - - Output:Meter,InteriorEquipment:Electricity,Hourly; - - Output:Meter,InteriorLights:Electricity,Hourly; - - Output:Meter,Cooling:EnergyTransfer,Hourly; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:SQLITE =========== - - Output:SQLite, - SimpleAndTabular; !- Option Type - diff --git a/tests/input_data/trnsys/simple_2_zone_sched.idf b/tests/input_data/trnsys/simple_2_zone_sched.idf deleted file mode 100644 index 966e9bc5..00000000 --- a/tests/input_data/trnsys/simple_2_zone_sched.idf +++ /dev/null @@ -1,1390 +0,0 @@ -!-Generator IDFEditor 1.50 -!-Option SortedOrder -!-NOTE: All comments with '!-' are ignored by the IDFEditor and are generated automatically. -!- Use '!' comments if they need to be retained when using the IDFEditor. -!- =========== ALL OBJECTS IN CLASS: VERSION =========== - - Version,9.2; - -!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== - - SimulationControl, - Yes, !- Do Zone Sizing Calculation - No, !- Do System Sizing Calculation - No, !- Do Plant Sizing Calculation - Yes, !- Run Simulation for Sizing Periods - Yes; !- Run Simulation for Weather File Run Periods - -!- =========== ALL OBJECTS IN CLASS: BUILDING =========== - - Building, - Building 1, !- Name - , !- North Axis {deg} - , !- Terrain - , !- Loads Convergence Tolerance Value - , !- Temperature Convergence Tolerance Value {deltaC} - , !- Solar Distribution - , !- Maximum Number of Warmup Days - ; !- Minimum Number of Warmup Days - -!- =========== ALL OBJECTS IN CLASS: SHADOWCALCULATION =========== - - ShadowCalculation, - AverageOverDaysInFrequency, !- Calculation Method - 20, !- Calculation Frequency - 15000; !- Maximum Figures in Shadow Overlap Calculations - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:INSIDE =========== - - SurfaceConvectionAlgorithm:Inside,TARP; - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:OUTSIDE =========== - - SurfaceConvectionAlgorithm:Outside,DOE-2; - -!- =========== ALL OBJECTS IN CLASS: HEATBALANCEALGORITHM =========== - - HeatBalanceAlgorithm,ConductionTransferFunction,200; - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRHEATBALANCEALGORITHM =========== - - ZoneAirHeatBalanceAlgorithm, - ThirdOrderBackwardDifference; !- Algorithm - -!- =========== ALL OBJECTS IN CLASS: ZONEAIRCONTAMINANTBALANCE =========== - - ZoneAirContaminantBalance, - No; !- Carbon Dioxide Concentration - -!- =========== ALL OBJECTS IN CLASS: ZONECAPACITANCEMULTIPLIER:RESEARCHSPECIAL =========== - - ZoneCapacitanceMultiplier:ResearchSpecial, - Zone Capacitance Multiplier Research Special, !- Name - , !- Zone or ZoneList Name - , !- Temperature Capacity Multiplier - , !- Humidity Capacity Multiplier - , !- Carbon Dioxide Capacity Multiplier - ; !- Generic Contaminant Capacity Multiplier - -!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== - - Timestep,6; - -!- =========== ALL OBJECTS IN CLASS: CONVERGENCELIMITS =========== - - ConvergenceLimits, - 1; !- Minimum System Timestep {minutes} - -!- =========== ALL OBJECTS IN CLASS: SITE:LOCATION =========== - - Site:Location, - Site 1, !- Name - 0, !- Latitude {deg} - 0, !- Longitude {deg} - 0, !- Time Zone {hr} - 0; !- Elevation {m} - -!- =========== ALL OBJECTS IN CLASS: SIZINGPERIOD:DESIGNDAY =========== - - SizingPeriod:DesignDay, - Montreal Int'l Ann Clg .4% Condns DB=>MWB, !- Name - 7, !- Month - 21, !- Day of Month - SummerDesignDay, !- Day Type - 30, !- Maximum Dry-Bulb Temperature {C} - 9.3, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - 22.1, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 4.9, !- Wind Speed {m/s} - 220, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAETau, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - 0.465, !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - 1.966; !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - - SizingPeriod:DesignDay, - Montreal Int'l Ann Htg 99.6% Condns DB, !- Name - 1, !- Month - 21, !- Day of Month - WinterDesignDay, !- Day Type - -23.7, !- Maximum Dry-Bulb Temperature {C} - 0, !- Daily Dry-Bulb Temperature Range {deltaC} - DefaultMultipliers, !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - WetBulb, !- Humidity Condition Type - -23.7, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 100893, !- Barometric Pressure {Pa} - 3.9, !- Wind Speed {m/s} - 260, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAEClearSky, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - 0; !- Sky Clearness - -!- =========== ALL OBJECTS IN CLASS: RUNPERIOD =========== - - RunPeriod, - Run Period 1, !- Name - 1, !- Begin Month - 1, !- Begin Day of Month - 2009, !- Begin Year - 12, !- End Month - 31, !- End Day of Month - 2009, !- End Year - Thursday, !- Day of Week for Start Day - No, !- Use Weather File Holidays and Special Days - No, !- Use Weather File Daylight Saving Period - No, !- Apply Weekend Holiday Rule - Yes, !- Use Weather File Rain Indicators - Yes; !- Use Weather File Snow Indicators - -!- =========== ALL OBJECTS IN CLASS: SCHEDULETYPELIMITS =========== - - ScheduleTypeLimits, - Fractional, !- Name - 0, !- Lower Limit Value - 1, !- Upper Limit Value - Continuous; !- Numeric Type - - ScheduleTypeLimits, - Temperature, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - temperature; !- Unit Type - - ScheduleTypeLimits, - Watt, !- Name - , !- Lower Limit Value - , !- Upper Limit Value - Continuous, !- Numeric Type - ActivityLevel; !- Unit Type - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:DAY:INTERVAL =========== - - Schedule:Day:Interval, - WaterUse Latent Fraction Schedule 5p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.05; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Schedule 120F Day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 48.8888888888889; !- Value Until Time 1 - - Schedule:Day:Interval, - WaterUse Sensible Fraction Schedule 20p Day, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.2; !- Value Until Time 1 - - Schedule:Day:Interval, - Light_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 6:00, !- Time 1 - 0.1, !- Value Until Time 1 - 18:00, !- Time 2 - 0.5, !- Value Until Time 2 - 24:00, !- Time 3 - 0.2; !- Value Until Time 3 - - Schedule:Day:Interval, - Equip_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.3; !- Value Until Time 1 - - Schedule:Day:Interval, - Activity_day_sch, !- Name - Watt, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 100; !- Value Until Time 1 - - Schedule:Day:Interval, - People_day_sch, !- Name - Fractional, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 0.4; !- Value Until Time 1 - - Schedule:Day:Interval, - Heating_Setpoint_day, !- Name - Temperature, !- Schedule Type Limits Name - No, !- Interpolate to Timestep - 24:00, !- Time 1 - 20; !- Value Until Time 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:WEEK:DAILY =========== - - Schedule:Week:Daily, - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Name - WaterUse Latent Fraction Schedule 5p Day, !- Sunday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Monday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Tuesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Wednesday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Thursday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Friday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Saturday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- Holiday Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day, !- CustomDay1 Schedule:Day Name - WaterUse Latent Fraction Schedule 5p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Name - WaterUse Schedule 120F Day, !- Sunday Schedule:Day Name - WaterUse Schedule 120F Day, !- Monday Schedule:Day Name - WaterUse Schedule 120F Day, !- Tuesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Wednesday Schedule:Day Name - WaterUse Schedule 120F Day, !- Thursday Schedule:Day Name - WaterUse Schedule 120F Day, !- Friday Schedule:Day Name - WaterUse Schedule 120F Day, !- Saturday Schedule:Day Name - WaterUse Schedule 120F Day, !- Holiday Schedule:Day Name - WaterUse Schedule 120F Day, !- SummerDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- WinterDesignDay Schedule:Day Name - WaterUse Schedule 120F Day, !- CustomDay1 Schedule:Day Name - WaterUse Schedule 120F Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Name - WaterUse Sensible Fraction Schedule 20p Day, !- Sunday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Monday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Tuesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Wednesday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Thursday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Friday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Saturday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- Holiday Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- SummerDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- WinterDesignDay Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day, !- CustomDay1 Schedule:Day Name - WaterUse Sensible Fraction Schedule 20p Day; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Light_week_sch, !- Name - Light_day_sch, !- Sunday Schedule:Day Name - Light_day_sch, !- Monday Schedule:Day Name - Light_day_sch, !- Tuesday Schedule:Day Name - Light_day_sch, !- Wednesday Schedule:Day Name - Light_day_sch, !- Thursday Schedule:Day Name - Light_day_sch, !- Friday Schedule:Day Name - Light_day_sch, !- Saturday Schedule:Day Name - Light_day_sch, !- Holiday Schedule:Day Name - Light_day_sch, !- SummerDesignDay Schedule:Day Name - Light_day_sch, !- WinterDesignDay Schedule:Day Name - Light_day_sch, !- CustomDay1 Schedule:Day Name - Light_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Equip_week_sch, !- Name - Equip_day_sch, !- Sunday Schedule:Day Name - Equip_day_sch, !- Monday Schedule:Day Name - Equip_day_sch, !- Tuesday Schedule:Day Name - Equip_day_sch, !- Wednesday Schedule:Day Name - Equip_day_sch, !- Thursday Schedule:Day Name - Equip_day_sch, !- Friday Schedule:Day Name - Equip_day_sch, !- Saturday Schedule:Day Name - Equip_day_sch, !- Holiday Schedule:Day Name - Equip_day_sch, !- SummerDesignDay Schedule:Day Name - Equip_day_sch, !- WinterDesignDay Schedule:Day Name - Equip_day_sch, !- CustomDay1 Schedule:Day Name - Equip_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Activity_week_sch, !- Name - Activity_day_sch, !- Sunday Schedule:Day Name - Activity_day_sch, !- Monday Schedule:Day Name - Activity_day_sch, !- Tuesday Schedule:Day Name - Activity_day_sch, !- Wednesday Schedule:Day Name - Activity_day_sch, !- Thursday Schedule:Day Name - Activity_day_sch, !- Friday Schedule:Day Name - Activity_day_sch, !- Saturday Schedule:Day Name - Activity_day_sch, !- Holiday Schedule:Day Name - Activity_day_sch, !- SummerDesignDay Schedule:Day Name - Activity_day_sch, !- WinterDesignDay Schedule:Day Name - Activity_day_sch, !- CustomDay1 Schedule:Day Name - Activity_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - People_week_sch, !- Name - People_day_sch, !- Sunday Schedule:Day Name - People_day_sch, !- Monday Schedule:Day Name - People_day_sch, !- Tuesday Schedule:Day Name - People_day_sch, !- Wednesday Schedule:Day Name - People_day_sch, !- Thursday Schedule:Day Name - People_day_sch, !- Friday Schedule:Day Name - People_day_sch, !- Saturday Schedule:Day Name - People_day_sch, !- Holiday Schedule:Day Name - People_day_sch, !- SummerDesignDay Schedule:Day Name - People_day_sch, !- WinterDesignDay Schedule:Day Name - People_day_sch, !- CustomDay1 Schedule:Day Name - People_day_sch; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - Heating_setpoint_week, !- Name - Heating_Setpoint_day, !- Sunday Schedule:Day Name - Heating_Setpoint_day, !- Monday Schedule:Day Name - Heating_Setpoint_day, !- Tuesday Schedule:Day Name - Heating_Setpoint_day, !- Wednesday Schedule:Day Name - Heating_Setpoint_day, !- Thursday Schedule:Day Name - Heating_Setpoint_day, !- Friday Schedule:Day Name - Heating_Setpoint_day, !- Saturday Schedule:Day Name - Heating_Setpoint_day, !- Holiday Schedule:Day Name - Heating_Setpoint_day, !- SummerDesignDay Schedule:Day Name - Heating_Setpoint_day, !- WinterDesignDay Schedule:Day Name - Heating_Setpoint_day, !- CustomDay1 Schedule:Day Name - Heating_Setpoint_day; !- CustomDay2 Schedule:Day Name - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:YEAR =========== - - Schedule:Year, - WaterUse Latent Fraction Schedule 5p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Latent Fraction Schedule 5p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Schedule 120F, !- Name - Temperature, !- Schedule Type Limits Name - WaterUse Schedule 120F Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - WaterUse Sensible Fraction Schedule 20p, !- Name - Fractional, !- Schedule Type Limits Name - WaterUse Sensible Fraction Schedule 20p Week Rule - Jan1-Dec31, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Light_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Light_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Equip_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - Equip_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Activity_year_sch, !- Name - Watt, !- Schedule Type Limits Name - Activity_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - People_year_sch, !- Name - Fractional, !- Schedule Type Limits Name - People_week_sch, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - Heating_setpoint_year, !- Name - Temperature, !- Schedule Type Limits Name - Heating_setpoint_week, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - -!- =========== ALL OBJECTS IN CLASS: SCHEDULE:CONSTANT =========== - - Schedule:Constant,Always On,Fractional,1; - - Schedule:Constant,Always Heating,Temperature,20; - - Schedule:Constant,Always Cooling,Temperature,30; - -!- =========== ALL OBJECTS IN CLASS: MATERIAL =========== - - Material, - 1/2IN Gypsum, !- Name - Smooth, !- Roughness - 0.0127, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 784.9, !- Density {kg/m3} - 830.000000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - 1IN Stucco, !- Name - Smooth, !- Roughness - 0.0253, !- Thickness {m} - 0.691799999999999, !- Conductivity {W/m-K} - 1858, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.92, !- Solar Absorptance - 0.92; !- Visible Absorptance - - Material, - 8IN Concrete HW, !- Name - MediumRough, !- Roughness - 0.2033, !- Thickness {m} - 1.72959999999999, !- Conductivity {W/m-K} - 2242.99999999999, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.65, !- Solar Absorptance - 0.65; !- Visible Absorptance - - Material, - F08 Metal surface, !- Name - Smooth, !- Roughness - 0.0008, !- Thickness {m} - 45.2800000000001, !- Conductivity {W/m-K} - 7823.99999999999, !- Density {kg/m3} - 500, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - F16 Acoustic tile, !- Name - MediumSmooth, !- Roughness - 0.0191, !- Thickness {m} - 0.06, !- Conductivity {W/m-K} - 368, !- Density {kg/m3} - 590.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.3, !- Solar Absorptance - 0.3; !- Visible Absorptance - - Material, - G01a 19mm gypsum board, !- Name - MediumSmooth, !- Roughness - 0.019, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 800, !- Density {kg/m3} - 1090, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - G05 25mm wood, !- Name - MediumSmooth, !- Roughness - 0.0254, !- Thickness {m} - 0.15, !- Conductivity {W/m-K} - 608, !- Density {kg/m3} - 1630, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - I01 25mm insulation board, !- Name - MediumRough, !- Roughness - 0.0254, !- Thickness {m} - 0.03, !- Conductivity {W/m-K} - 43, !- Density {kg/m3} - 1210, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - M11 100mm lightweight concrete, !- Name - MediumRough, !- Roughness - 0.1016, !- Thickness {m} - 0.53, !- Conductivity {W/m-K} - 1280, !- Density {kg/m3} - 840.000000000002, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - MAT-CC05 4 HW CONCRETE, !- Name - Rough, !- Roughness - 0.1016, !- Thickness {m} - 1.311, !- Conductivity {W/m-K} - 2240, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.85, !- Solar Absorptance - 0.85; !- Visible Absorptance - - Material, - Metal Decking, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Metal Roofing, !- Name - MediumSmooth, !- Roughness - 0.0015, !- Thickness {m} - 45.006, !- Conductivity {W/m-K} - 7680, !- Density {kg/m3} - 418.4, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - Roof Insulation [25], !- Name - MediumRough, !- Roughness - 0.263, !- Thickness {m} - 0.049, !- Conductivity {W/m-K} - 265, !- Density {kg/m3} - 836.800000000001, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - Wall Insulation [42], !- Name - MediumRough, !- Roughness - 0.0913999999999999, !- Thickness {m} - 0.0432, !- Conductivity {W/m-K} - 91, !- Density {kg/m3} - 836.999999999999, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:NOMASS =========== - - Material:NoMass, - CP02 CARPET PAD, !- Name - Smooth, !- Roughness - 0.1, !- Thermal Resistance {m2-K/W} - 0.9, !- Thermal Absorptance - 0.8, !- Solar Absorptance - 0.8; !- Visible Absorptance - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:AIRGAP =========== - - Material:AirGap, - F04 Wall air space resistance, !- Name - 0.15; !- Thermal Resistance {m2-K/W} - - Material:AirGap, - F05 Ceiling air space resistance, !- Name - 0.18; !- Thermal Resistance {m2-K/W} - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:SIMPLEGLAZINGSYSTEM =========== - - WindowMaterial:SimpleGlazingSystem, - _2_WSV_3_Air, !- Name - 1.62, !- U-Factor {W/m2-K} - 0.64, !- Solar Heat Gain Coefficient - 0.8; !- Visible Transmittance - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:GLAZING =========== - - WindowMaterial:Glazing, - Theoretical Glass [216], !- Name - SpectralAverage, !- Optical Data Type - , !- Window Glass Spectral Data Set Name - 0.00299999999999999, !- Thickness {m} - 0.3801, !- Solar Transmittance at Normal Incidence - 0.5699, !- Front Side Solar Reflectance at Normal Incidence - 0, !- Back Side Solar Reflectance at Normal Incidence - 0.5079, !- Visible Transmittance at Normal Incidence - 0.4421, !- Front Side Visible Reflectance at Normal Incidence - 0, !- Back Side Visible Reflectance at Normal Incidence - 0, !- Infrared Transmittance at Normal Incidence - 0.9, !- Front Side Infrared Hemispherical Emissivity - 0.9, !- Back Side Infrared Hemispherical Emissivity - 0.0133, !- Conductivity {W/m-K} - 1, !- Dirt Correction Factor for Solar and Visible Transmittance - No; !- Solar Diffusing - -!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== - - Construction, - _2_WSV_3_Air, !- Name - _2_WSV_3_Air; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Name - Metal Roofing, !- Outside Layer - Roof Insulation [25], !- Layer 2 - Metal Decking; !- Layer 3 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 6, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Name - 1IN Stucco, !- Outside Layer - 8IN Concrete HW, !- Layer 2 - Wall Insulation [42], !- Layer 3 - 1/2IN Gypsum; !- Layer 4 - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 6, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 7, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - ASHRAE 189.1-2009 ExtWindow ClimateZone 8, !- Name - Theoretical Glass [216]; !- Outside Layer - - Construction, - Exterior Door, !- Name - F08 Metal surface, !- Outside Layer - I01 25mm insulation board; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Name - MAT-CC05 4 HW CONCRETE, !- Outside Layer - CP02 CARPET PAD; !- Layer 2 - - Construction, - Interior Ceiling, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Ceiling 1, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Floor, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Floor 1, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Interior Partition, !- Name - G05 25mm wood; !- Outside Layer - - Construction, - Interior Wall, !- Name - G01a 19mm gypsum board, !- Outside Layer - F04 Wall air space resistance, !- Layer 2 - G01a 19mm gypsum board; !- Layer 3 - -!- =========== ALL OBJECTS IN CLASS: GLOBALGEOMETRYRULES =========== - - GlobalGeometryRules, - UpperLeftCorner, !- Starting Vertex Position - Counterclockwise, !- Vertex Entry Direction - Relative, !- Coordinate System - Relative, !- Daylighting Reference Point Coordinate System - Relative; !- Rectangular Surface Coordinate System - -!- =========== ALL OBJECTS IN CLASS: ZONE =========== - - Zone, - Thermal Zone 1, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - - Zone, - Thermal Zone 2, !- Name - , !- Direction of Relative North {deg} - , !- X Origin {m} - , !- Y Origin {m} - , !- Z Origin {m} - , !- Type - 1; !- Multiplier - -!- =========== ALL OBJECTS IN CLASS: ZONELIST =========== - - ZoneList, - Space Type 1, !- Name - Thermal Zone 1; !- Zone 1 Name - - ZoneList, - Space Type 2, !- Name - Thermal Zone 2; !- Zone 1 Name - - ZoneList, - All_zones, !- Name - Thermal Zone 1, !- Zone 1 Name - Thermal Zone 2; !- Zone 2 Name - -!- =========== ALL OBJECTS IN CLASS: BUILDINGSURFACE:DETAILED =========== - - BuildingSurface:Detailed, - Face 0, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 1, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,0, !- X,Y,Z ==> Vertex 1 {m} - 5,220,0, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 1, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,225,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 12, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 2, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,225,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,225,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 3, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 1, !- Zone Name - Surface, !- Outside Boundary Condition - Face 13, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 5, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,225,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,225,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 10, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 11, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,215,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - -5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,215,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 13, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - Thermal Zone 2, !- Zone Name - Surface, !- Outside Boundary Condition - Face 3, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,220,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,220,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 7, !- Name - Floor, !- Surface Type - ExtSlabCarpet 4in ClimateZone 1-8 1, !- Construction Name - Thermal Zone 2, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,0, !- X,Y,Z ==> Vertex 1 {m} - 5,215,0, !- X,Y,Z ==> Vertex 2 {m} - -5,215,0, !- X,Y,Z ==> Vertex 3 {m} - -5,220,0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 8, !- Name - Roof, !- Surface Type - ASHRAE 189.1-2009 ExtRoof Metal ClimateZone 6, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - -5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - -5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 3 {m} - 5,220,2.4384; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Face 9, !- Name - Wall, !- Surface Type - ASHRAE 189.1-2009 ExtWall Mass ClimateZone 7, !- Construction Name - Thermal Zone 2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - , !- Number of Vertices - 5,220,2.4384, !- X,Y,Z ==> Vertex 1 {m} - 5,215,2.4384, !- X,Y,Z ==> Vertex 2 {m} - 5,215,0, !- X,Y,Z ==> Vertex 3 {m} - 5,220,0; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: FENESTRATIONSURFACE:DETAILED =========== - - FenestrationSurface:Detailed, - Face 101, !- Name - Window, !- Surface Type - _2_WSV_3_Air, !- Construction Name - Face 2, !- Building Surface Name - , !- Outside Boundary Condition Object - , !- View Factor to Ground - , !- Frame and Divider Name - , !- Multiplier - , !- Number of Vertices - 215.5,5,0.5, !- X,Y,Z ==> Vertex 1 {m} - 215.5,5,2, !- X,Y,Z ==> Vertex 2 {m} - 217,5,2, !- X,Y,Z ==> Vertex 3 {m} - 217,5,0.5; !- X,Y,Z ==> Vertex 4 {m} - -!- =========== ALL OBJECTS IN CLASS: PEOPLE =========== - - People, - People 1, !- Name - Space Type 1, !- Zone or ZoneList Name - People_year_sch, !- Number of People Schedule Name - People/Area, !- Number of People Calculation Method - , !- Number of People - 0.02, !- People per Zone Floor Area {person/m2} - , !- Zone Floor Area per Person {m2/person} - 0.3, !- Fraction Radiant - , !- Sensible Heat Fraction - Activity_year_sch; !- Activity Level Schedule Name - - People, - People 2, !- Name - Space Type 2, !- Zone or ZoneList Name - People_year_sch, !- Number of People Schedule Name - People/Area, !- Number of People Calculation Method - , !- Number of People - 0.02, !- People per Zone Floor Area {person/m2} - , !- Zone Floor Area per Person {m2/person} - 0.3, !- Fraction Radiant - , !- Sensible Heat Fraction - Activity_year_sch; !- Activity Level Schedule Name - -!- =========== ALL OBJECTS IN CLASS: LIGHTS =========== - - Lights, - Lights 1, !- Name - Space Type 1, !- Zone or ZoneList Name - Light_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Lighting Level {W} - 9, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - , !- Return Air Fraction - 0.5, !- Fraction Radiant - 0.3, !- Fraction Visible - 1, !- Fraction Replaceable - General; !- End-Use Subcategory - - Lights, - Lights 2, !- Name - Space Type 2, !- Zone or ZoneList Name - Equip_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Lighting Level {W} - 9, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - , !- Return Air Fraction - 0.5, !- Fraction Radiant - 0.3, !- Fraction Visible - 1, !- Fraction Replaceable - General; !- End-Use Subcategory - -!- =========== ALL OBJECTS IN CLASS: ELECTRICEQUIPMENT =========== - - ElectricEquipment, - Electric Equipment 1, !- Name - Space Type 1, !- Zone or ZoneList Name - Equip_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Design Level {W} - 15, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - 0.5, !- Fraction Latent - 0.5, !- Fraction Radiant - , !- Fraction Lost - General; !- End-Use Subcategory - - ElectricEquipment, - Electric Equipment 2, !- Name - Space Type 2, !- Zone or ZoneList Name - Equip_year_sch, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Design Level {W} - 15, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - 0.5, !- Fraction Latent - 0.5, !- Fraction Radiant - , !- Fraction Lost - General; !- End-Use Subcategory - -!- =========== ALL OBJECTS IN CLASS: ZONEINFILTRATION:DESIGNFLOWRATE =========== - - ZoneInfiltration:DesignFlowRate, - Infilt, !- Name - All_zones, !- Zone or ZoneList Name - Always On, !- Schedule Name - AirChanges/Hour, !- Design Flow Rate Calculation Method - , !- Design Flow Rate {m3/s} - , !- Flow per Zone Floor Area {m3/s-m2} - , !- Flow per Exterior Surface Area {m3/s-m2} - 0.5, !- Air Changes per Hour {1/hr} - 0, !- Constant Term Coefficient - , !- Temperature Term Coefficient - 0.224, !- Velocity Term Coefficient - ; !- Velocity Squared Term Coefficient - -!- =========== ALL OBJECTS IN CLASS: HVACTEMPLATE:THERMOSTAT =========== - - HVACTemplate:Thermostat, - Thermostat, !- Name - Always Heating, !- Heating Setpoint Schedule Name - 20, !- Constant Heating Setpoint {C} - Always Cooling, !- Cooling Setpoint Schedule Name - 30; !- Constant Cooling Setpoint {C} - -!- =========== ALL OBJECTS IN CLASS: HVACTEMPLATE:ZONE:BASEBOARDHEAT =========== - - HVACTemplate:Zone:BaseboardHeat, - Thermal Zone 1, !- Zone Name - Thermostat, !- Template Thermostat Name - 1, !- Zone Heating Sizing Factor - Electric, !- Baseboard Heating Type - Heating_setpoint_year, !- Baseboard Heating Availability Schedule Name - autosize, !- Baseboard Heating Capacity {W} - , !- Dedicated Outdoor Air System Name - Flow/Person, !- Outdoor Air Method - 0, !- Outdoor Air Flow Rate per Person {m3/s} - , !- Outdoor Air Flow Rate per Zone Floor Area {m3/s-m2} - ; !- Outdoor Air Flow Rate per Zone {m3/s} - - HVACTemplate:Zone:BaseboardHeat, - Thermal Zone 2, !- Zone Name - Thermostat, !- Template Thermostat Name - 1, !- Zone Heating Sizing Factor - Electric, !- Baseboard Heating Type - Heating_setpoint_year, !- Baseboard Heating Availability Schedule Name - autosize, !- Baseboard Heating Capacity {W} - , !- Dedicated Outdoor Air System Name - Flow/Person, !- Outdoor Air Method - 0, !- Outdoor Air Flow Rate per Person {m3/s} - , !- Outdoor Air Flow Rate per Zone Floor Area {m3/s-m2} - ; !- Outdoor Air Flow Rate per Zone {m3/s} - -!- =========== ALL OBJECTS IN CLASS: SIZING:PARAMETERS =========== - - Sizing:Parameters, - 1.25, !- Heating Sizing Factor - 1.15; !- Cooling Sizing Factor - -!- =========== ALL OBJECTS IN CLASS: OUTDOORAIR:NODE =========== - - OutdoorAir:Node, - Model Outdoor Air Node; !- Name - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:PARAMETERS =========== - - LifeCycleCost:Parameters, - Life Cycle Cost Parameters, !- Name - EndOfYear, !- Discounting Convention - ConstantDollar, !- Inflation Approach - 0.03, !- Real Discount Rate - , !- Nominal Discount Rate - , !- Inflation - , !- Base Date Month - 2011, !- Base Date Year - , !- Service Date Month - 2011, !- Service Date Year - 25, !- Length of Study Period in Years - , !- Tax rate - None; !- Depreciation Method - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:NONRECURRINGCOST =========== - - LifeCycleCost:NonrecurringCost, - Default Cost, !- Name - Construction, !- Category - 0, !- Cost - ServicePeriod; !- Start of Costs - -!- =========== ALL OBJECTS IN CLASS: LIFECYCLECOST:USEPRICEESCALATION =========== - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Electricity, !- LCC Price Escalation Name - Electricity, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9838, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9632, !- Year 3 Escalation - 0.9611, !- Year 4 Escalation - 0.9571, !- Year 5 Escalation - 0.9553, !- Year 6 Escalation - 0.9539, !- Year 7 Escalation - 0.9521, !- Year 8 Escalation - 0.9546, !- Year 9 Escalation - 0.9550, !- - 0.9553, !- - 0.9564, !- - 0.9575, !- - 0.9596, !- - 0.9618, !- - 0.9614, !- - 0.9618, !- - 0.9618, !- - 0.9593, !- - 0.9589, !- - 0.9607, !- - 0.9625, !- - 0.9650, !- - 0.9708, !- - 0.9751, !- - 0.9762, !- - 0.9766, !- - 0.9766, !- - 0.9769, !- - 0.9773; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Distillate Oil, !- LCC Price Escalation Name - FuelOil#1, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9714, !- Year 1 Escalation - 0.9730, !- Year 2 Escalation - 0.9942, !- Year 3 Escalation - 1.0164, !- Year 4 Escalation - 1.0541, !- Year 5 Escalation - 1.0928, !- Year 6 Escalation - 1.1267, !- Year 7 Escalation - 1.1580, !- Year 8 Escalation - 1.1792, !- Year 9 Escalation - 1.1967, !- - 1.2200, !- - 1.2333, !- - 1.2566, !- - 1.2709, !- - 1.2826, !- - 1.2985, !- - 1.3102, !- - 1.3250, !- - 1.3261, !- - 1.3282, !- - 1.3324, !- - 1.3356, !- - 1.3431, !- - 1.3510, !- - 1.3568, !- - 1.3606, !- - 1.3637, !- - 1.3674, !- - 1.3706, !- - 1.3743; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Residual Oil, !- LCC Price Escalation Name - FuelOil#2, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.8469, !- Year 1 Escalation - 0.8257, !- Year 2 Escalation - 0.8681, !- Year 3 Escalation - 0.8988, !- Year 4 Escalation - 0.9289, !- Year 5 Escalation - 0.9604, !- Year 6 Escalation - 0.9897, !- Year 7 Escalation - 1.0075, !- Year 8 Escalation - 1.0314, !- Year 9 Escalation - 1.0554, !- - 1.0861, !- - 1.1278, !- - 1.1497, !- - 1.1620, !- - 1.1743, !- - 1.1852, !- - 1.1948, !- - 1.2037, !- - 1.2071, !- - 1.2119, !- - 1.2139, !- - 1.2194, !- - 1.2276, !- - 1.2365, !- - 1.2420, !- - 1.2461, !- - 1.2509, !- - 1.2550, !- - 1.2591, !- - 1.2638; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Natural gas, !- LCC Price Escalation Name - NaturalGas, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9823, !- Year 1 Escalation - 0.9557, !- Year 2 Escalation - 0.9279, !- Year 3 Escalation - 0.9257, !- Year 4 Escalation - 0.9346, !- Year 5 Escalation - 0.9412, !- Year 6 Escalation - 0.9512, !- Year 7 Escalation - 0.9645, !- Year 8 Escalation - 0.9856, !- Year 9 Escalation - 1.0067, !- - 1.0222, !- - 1.0410, !- - 1.0610, !- - 1.0787, !- - 1.0942, !- - 1.1098, !- - 1.1220, !- - 1.1308, !- - 1.1386, !- - 1.1486, !- - 1.1619, !- - 1.1763, !- - 1.1918, !- - 1.2118, !- - 1.2284, !- - 1.2439, !- - 1.2605, !- - 1.2772, !- - 1.2938, !- - 1.3115; !- - - LifeCycleCost:UsePriceEscalation, - U.S. Avg Commercial-Coal, !- LCC Price Escalation Name - Coal, !- Resource - 2011, !- Escalation Start Year - January, !- Escalation Start Month - 0.9970, !- Year 1 Escalation - 1.0089, !- Year 2 Escalation - 1.0089, !- Year 3 Escalation - 0.9941, !- Year 4 Escalation - 0.9941, !- Year 5 Escalation - 1.0000, !- Year 6 Escalation - 1.0030, !- Year 7 Escalation - 1.0059, !- Year 8 Escalation - 1.0089, !- Year 9 Escalation - 1.0119, !- - 1.0148, !- - 1.0178, !- - 1.0208, !- - 1.0267, !- - 1.0297, !- - 1.0356, !- - 1.0415, !- - 1.0534, !- - 1.0564, !- - 1.0593, !- - 1.0653, !- - 1.0712, !- - 1.0742, !- - 1.0801, !- - 1.0831, !- - 1.0831, !- - 1.0861, !- - 1.0890, !- - 1.0920, !- - 1.0950; !- - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== - - Output:VariableDictionary,IDF,Unsorted; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:SUMMARYREPORTS =========== - - Output:Table:SummaryReports, - AllSummary; !- Report 1 Name - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:TABLE:STYLE =========== - - OutputControl:Table:Style, - HTML; !- Column Separator - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:REPORTINGTOLERANCES =========== - - OutputControl:ReportingTolerances, - 0.2, !- Tolerance for Time Heating Setpoint Not Met {deltaC} - 0.2; !- Tolerance for Time Cooling Setpoint Not Met {deltaC} - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLE =========== - - Output:Variable,*,Baseboard Electric Energy,Timestep; - - Output:Variable,*,Site Outdoor Air Drybulb Temperature,Timestep; - - Output:Variable,*,Zone Air Temperature,Timestep; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:METER =========== - - Output:Meter,InteriorEquipment:Electricity,Timestep; - - Output:Meter,InteriorLights:Electricity,Timestep; - - Output:Meter,Cooling:EnergyTransfer,Timestep; - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:SQLITE =========== - - Output:SQLite, - SimpleAndTabular; !- Option Type - diff --git a/tests/input_data/trnsys/test_multizone_EP.idf b/tests/input_data/trnsys/test_multizone_EP.idf deleted file mode 100644 index 984ce27e..00000000 --- a/tests/input_data/trnsys/test_multizone_EP.idf +++ /dev/null @@ -1,784 +0,0 @@ -!- =========== ALL OBJECTS IN CLASS: VERSION =========== - - Version,9.2; - -!- =========== ALL OBJECTS IN CLASS: BUILDING =========== - - Building, - Untitled, !- Name - 0.0, !- North Axis {deg} - City, !- Terrain - 0.04, !- Loads Convergence Tolerance Value - 0.4, !- Temperature Convergence Tolerance Value {deltaC} - FullInteriorAndExterior, !- Solar Distribution - 25, !- Maximum Number of Warmup Days - ; !- Minimum Number of Warmup Days - -!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== - - Timestep,4; - -!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== - - SimulationControl, - No, !- Do Zone Sizing Calculation - No, !- Do System Sizing Calculation - No, !- Do Plant Sizing Calculation - Yes, !- Run Simulation for Sizing Periods - Yes; !- Run Simulation for Weather File Run Periods - -!- =========== ALL OBJECTS IN CLASS: LOCATION =========== - - Site:Location, - not used, !- Name - 0.0, !- Latitude {deg} - 0.0, !- Longitude {deg} - 0.0, !- Time Zone {hr} - 190.00; !- Elevation {m} - - GlobalGeometryRules, - UpperLeftCorner, !- Starting Vertex Position - Counterclockwise, !- Vertex Entry Direction - Relative; !- Coordinate System - -!- =========== ALL OBJECTS IN CLASS: MATERIAL =========== - - Material, - F08 Metal surface, !- Name - Smooth, !- Roughness - 0.0008, !- Thickness {m} - 45.28, !- Conductivity {W/m-K} - 7824, !- Density {kg/m3} - 500; !- Specific Heat {J/kg-K} - - Material, - I01 25mm insulation board, !- Name - MediumRough, !- Roughness - 0.0254, !- Thickness {m} - 0.03, !- Conductivity {W/m-K} - 43, !- Density {kg/m3} - 1210; !- Specific Heat {J/kg-K} - - Material, - I02 50mm insulation board, !- Name - MediumRough, !- Roughness - 0.0508, !- Thickness {m} - 0.03, !- Conductivity {W/m-K} - 43, !- Density {kg/m3} - 1210; !- Specific Heat {J/kg-K} - - Material, - G01a 19mm gypsum board, !- Name - MediumSmooth, !- Roughness - 0.019, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 800, !- Density {kg/m3} - 1090; !- Specific Heat {J/kg-K} - - Material, - M11 100mm lightweight concrete, !- Name - MediumRough, !- Roughness - 0.1016, !- Thickness {m} - 0.53, !- Conductivity {W/m-K} - 1280, !- Density {kg/m3} - 840; !- Specific Heat {J/kg-K} - - Material, - F16 Acoustic tile, !- Name - MediumSmooth, !- Roughness - 0.0191, !- Thickness {m} - 0.06, !- Conductivity {W/m-K} - 368, !- Density {kg/m3} - 590; !- Specific Heat {J/kg-K} - - Material, - M01 100mm brick, !- Name - MediumRough, !- Roughness - 0.1016, !- Thickness {m} - 0.89, !- Conductivity {W/m-K} - 1920, !- Density {kg/m3} - 790; !- Specific Heat {J/kg-K} - - Material, - M15 200mm heavyweight concrete, !- Name - MediumRough, !- Roughness - 0.2032, !- Thickness {m} - 1.95, !- Conductivity {W/m-K} - 2240, !- Density {kg/m3} - 900; !- Specific Heat {J/kg-K} - - Material, - M05 200mm concrete block,!- Name - MediumRough, !- Roughness - 0.2032, !- Thickness {m} - 1.11, !- Conductivity {W/m-K} - 800, !- Density {kg/m3} - 920; !- Specific Heat {J/kg-K} - - Material, - G05 25mm wood, !- Name - MediumSmooth, !- Roughness - 0.0254, !- Thickness {m} - 0.15, !- Conductivity {W/m-K} - 608, !- Density {kg/m3} - 1630; !- Specific Heat {J/kg-K} - -!- =========== ALL OBJECTS IN CLASS: MATERIAL:AIRGAP =========== - - Material:AirGap, - F04 Wall air space resistance, !- Name - 0.15; !- Thermal Resistance {m2-K/W} - - Material:AirGap, - F05 Ceiling air space resistance, !- Name - 0.18; !- Thermal Resistance {m2-K/W} - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:GLAZING =========== - - WindowMaterial:Glazing, - Clear 3mm, !- Name - SpectralAverage, !- Optical Data Type - , !- Window Glass Spectral Data Set Name - 0.003, !- Thickness {m} - 0.837, !- Solar Transmittance at Normal Incidence - 0.075, !- Front Side Solar Reflectance at Normal Incidence - 0.075, !- Back Side Solar Reflectance at Normal Incidence - 0.898, !- Visible Transmittance at Normal Incidence - 0.081, !- Front Side Visible Reflectance at Normal Incidence - 0.081, !- 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 {W/m-K} - -!- =========== ALL OBJECTS IN CLASS: WINDOWMATERIAL:GAS =========== - - WindowMaterial:Gas, - Air 13mm, !- Name - Air, !- Gas Type - 0.0127; !- Thickness {m} - -!- =========== ALL OBJECTS IN CLASS: CONSTRUCTION =========== - - Construction, - Exterior Floor, !- Name - I02 50mm insulation board, !- Outside Layer - M15 200mm heavyweight concrete; !- Layer 2 - - Construction, - Interior Floor, !- Name - F16 Acoustic tile, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - M11 100mm lightweight concrete; !- Layer 3 - - Construction, - Exterior Wall, !- Name - M01 100mm brick, !- Outside Layer - M15 200mm heavyweight concrete, !- Layer 2 - I02 50mm insulation board, !- Layer 3 - F04 Wall air space resistance, !- Layer 4 - G01a 19mm gypsum board; !- Layer 5 - - Construction, - Interior Wall, !- Name - G01a 19mm gypsum board, !- Outside Layer - F04 Wall air space resistance, !- Layer 2 - G01a 19mm gypsum board; !- Layer 3 - - Construction, - Exterior Roof, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Interior Ceiling, !- Name - M11 100mm lightweight concrete, !- Outside Layer - F05 Ceiling air space resistance, !- Layer 2 - F16 Acoustic tile; !- Layer 3 - - Construction, - Exterior Window, !- Name - Clear 3mm, !- Outside Layer - Air 13mm, !- Layer 2 - Clear 3mm; !- Layer 3 - - Construction, - Interior Window, !- Name - Clear 3mm; !- Outside Layer - - Construction, - Exterior Door, !- Name - F08 Metal surface, !- Outside Layer - I01 25mm insulation board; !- Layer 2 - - Construction, - Interior Door, !- Name - G05 25mm wood; !- Outside Layer - -!- =========== ALL OBJECTS IN CLASS: SCHEDULETYPELIMITS =========== - - ScheduleTypeLimits, - Any Number; !- Name - - ScheduleTypeLimits, - Fraction, !- Name - 0.0, !- Lower Limit Value - 1.0, !- Upper Limit Value - CONTINUOUS; !- Numeric Type - - ScheduleTypeLimits, - Temperature, !- Name - -60, !- Lower Limit Value - 200, !- Upper Limit Value - CONTINUOUS; !- Numeric Type - - ScheduleTypeLimits, - On/Off, !- Name - 0, !- Lower Limit Value - 1, !- Upper Limit Value - DISCRETE; !- Numeric Type - - ScheduleTypeLimits, - Control Type, !- Name - 0, !- Lower Limit Value - 4, !- Upper Limit Value - DISCRETE; !- Numeric Type - - ScheduleTypeLimits, - Humidity, !- Name - 10, !- Lower Limit Value - 90, !- Upper Limit Value - CONTINUOUS; !- Numeric Type - - ScheduleTypeLimits, - Number; !- Name - - !- =========== ALL OBJECTS IN CLASS: RUNPERIODCONTROL:SPECIALDAYS =========== - - RunPeriodControl:SpecialDays, - New Years Day, !- Name - January 1, !- Start Date - 1, !- Duration {days} - Holiday; !- Special Day Type - - RunPeriodControl:SpecialDays, - Veterans Day, !- Name - November 11, !- Start Date - 1, !- Duration {days} - Holiday; !- Special Day Type - - RunPeriodControl:SpecialDays, - Christmas, !- Name - December 25, !- Start Date - 1, !- Duration {days} - Holiday; !- Special Day Type - - RunPeriodControl:SpecialDays, - Independence Day, !- Name - July 4, !- Start Date - 1, !- Duration {days} - Holiday; !- Special Day Type - - RunPeriodControl:SpecialDays, - MLK Day, !- Name - 3rd Monday in January, !- Start Date - 1, !- Duration {days} - Holiday; !- Special Day Type - - RunPeriodControl:SpecialDays, - Presidents Day, !- Name - 3rd Monday in February, !- Start Date - 1, !- Duration {days} - Holiday; !- Special Day Type - - RunPeriodControl:SpecialDays, - Memorial Day, !- Name - Last Monday in May, !- Start Date - 1, !- Duration {days} - Holiday; !- Special Day Type - - RunPeriodControl:SpecialDays, - Labor Day, !- Name - 1st Monday in September, !- Start Date - 1, !- Duration {days} - Holiday; !- Special Day Type - - RunPeriodControl:SpecialDays, - Columbus Day, !- Name - 2nd Monday in October, !- Start Date - 1, !- Duration {days} - Holiday; !- Special Day Type - - RunPeriodControl:SpecialDays, - Thanksgiving, !- Name - 4th Thursday in November,!- Start Date - 1, !- Duration {days} - Holiday; !- Special Day Type - - ! Daylight Saving Period in US - - RunPeriodControl:DaylightSavingTime, - 2nd Sunday in March, !- Start Date - 1st Sunday in November; !- End Date - - !- =========== ALL OBJECTS IN CLASS: SCHEDULE:COMPACT =========== - - Schedule:Compact, - Office Lights Schedule, !- Name - Fraction, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: Weekdays, !- Field 2 - Until: 05:00,0.05, !- Field 3 - Until: 07:00,0.1, !- Field 5 - Until: 08:00,0.3, !- Field 7 - Until: 17:00,0.9, !- Field 9 - Until: 18:00,0.5, !- Field 11 - Until: 20:00,0.3, !- Field 13 - Until: 22:00,0.2, !- Field 15 - Until: 23:00,0.1, !- Field 17 - Until: 24:00,0.05, !- Field 19 - For: SummerDesignDay, !- Field 21 - Until: 24:00,1.0, !- Field 22 - For: Saturday, !- Field 24 - Until: 06:00,0.05, !- Field 25 - Until: 08:00,0.1, !- Field 27 - Until: 12:00,0.3, !- Field 29 - Until: 17:00,0.15, !- Field 31 - Until: 24:00,0.05, !- Field 33 - For: WinterDesignDay, !- Field 35 - Until: 24:00,0.0, !- Field 36 - For: Sunday Holidays AllOtherDays, !- Field 38 - Until: 24:00,0.05; !- Field 39 - - Schedule:Compact, - Office Equipment Schedule, !- Name - Fraction, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: Weekdays, !- Field 2 - Until: 08:00,0.40, !- Field 3 - Until: 12:00,0.90, !- Field 5 - Until: 13:00,0.80, !- Field 7 - Until: 17:00,0.90, !- Field 9 - Until: 18:00,0.50, !- Field 11 - Until: 24:00,0.40, !- Field 13 - For: SummerDesignDay, !- Field 15 - Until: 24:00,1.0, !- Field 16 - For: Saturday, !- Field 18 - Until: 06:00,0.30, !- Field 19 - Until: 08:00,0.4, !- Field 21 - Until: 12:00,0.5, !- Field 23 - Until: 17:00,0.35, !- Field 25 - Until: 24:00,0.30, !- Field 27 - For: WinterDesignDay, !- Field 29 - Until: 24:00,0.0, !- Field 30 - For: Sunday Holidays AllOtherDays, !- Field 32 - Until: 24:00,0.30; !- Field 33 - - Schedule:Compact, - Office Occupancy Schedule, !- Name - Fraction, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: Weekdays, !- Field 2 - Until: 06:00,0.0, !- Field 3 - Until: 07:00,0.1, !- Field 5 - Until: 08:00,0.2, !- Field 7 - Until: 12:00,0.95, !- Field 9 - Until: 13:00,0.5, !- Field 11 - Until: 17:00,0.95, !- Field 13 - Until: 18:00,0.3, !- Field 15 - Until: 20:00,0.1, !- Field 17 - Until: 24:00,0.05, !- Field 19 - For: SummerDesignDay, !- Field 21 - Until: 06:00,0.0, !- Field 22 - Until: 22:00,1.0, !- Field 24 - Until: 24:00,0.05, !- Field 26 - For: Saturday, !- Field 28 - Until: 06:00,0.0, !- Field 29 - Until: 08:00,0.1, !- Field 31 - Until: 12:00,0.3, !- Field 33 - Until: 17:00,0.1, !- Field 35 - Until: 19:00,0.0, !- Field 37 - Until: 24:00,0.0, !- Field 39 - For: WinterDesignDay, !- Field 41 - Until: 24:00,0.0, !- Field 42 - For: Sunday Holidays AllOtherDays, !- Field 44 - Until: 06:00,0.0, !- Field 45 - Until: 18:00,0.0, !- Field 47 - Until: 24:00,0.0; !- Field 49 - - Schedule:Compact, - Infiltration Schedule, !- Name - Fraction, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: Weekdays SummerDesignDay, !- Field 2 - Until: 06:00,1.0, !- Field 3 - Until: 22:00,0.0, !- Field 5 - Until: 24:00,1.0, !- Field 7 - For: Saturday WinterDesignDay, !- Field 9 - Until: 06:00,1.0, !- Field 10 - Until: 18:00,0.0, !- Field 12 - Until: 24:00,1.0, !- Field 14 - For: Sunday Holidays AllOtherDays, !- Field 16 - Until: 24:00,1.0; !- Field 17 - - Schedule:Compact, - Infiltration Half On Schedule, !- Name - Fraction, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: Weekdays SummerDesignDay, !- Field 2 - Until: 06:00,1.0, !- Field 3 - Until: 22:00,0.5, !- Field 5 - Until: 24:00,1.0, !- Field 7 - For: Saturday WinterDesignDay, !- Field 9 - Until: 06:00,1.0, !- Field 10 - Until: 18:00,0.5, !- Field 12 - Until: 24:00,1.0, !- Field 14 - For: Sunday Holidays AllOtherDays, !- Field 16 - Until: 24:00,1.0; !- Field 17 - - Schedule:Compact, - Infiltration Quarter On Schedule, !- Name - Fraction, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: Weekdays SummerDesignDay, !- Field 2 - Until: 06:00,1.0, !- Field 3 - Until: 22:00,0.25, !- Field 5 - Until: 24:00,1.0, !- Field 7 - For: Saturday WinterDesignDay, !- Field 9 - Until: 06:00,1.0, !- Field 10 - Until: 18:00,0.25, !- Field 12 - Until: 24:00,1.0, !- Field 14 - For: Sunday Holidays AllOtherDays, !- Field 16 - Until: 24:00,1.0; !- Field 17 - - Schedule:Compact, - Hours of Operation Schedule, !- Name - On/Off, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: Weekdays SummerDesignDay, !- Field 2 - Until: 06:00,0.0, !- Field 3 - Until: 22:00,1.0, !- Field 5 - Until: 24:00,0.0, !- Field 7 - For: Saturday WinterDesignDay, !- Field 9 - Until: 06:00,0.0, !- Field 10 - Until: 18:00,1.0, !- Field 12 - Until: 24:00,0.0, !- Field 14 - For: Sunday Holidays AllOtherDays, !- Field 16 - Until: 24:00,0.0; !- Field 17 - - Schedule:Compact, - Always On, !- Name - Fraction, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: AllDays, !- Field 2 - Until: 24:00,1.0; !- Field 3 - - Schedule:Compact, - Always Off, !- Name - Fraction, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: AllDays, !- Field 2 - Until: 24:00,0.0; !- Field 3 - - Schedule:Compact, - Heating Setpoint Schedule, !- Name - Temperature, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: Weekdays, !- Field 2 - Until: 05:00,15.6, !- Field 3 - Until: 19:00,21.0, !- Field 5 - Until: 24:00,15.6, !- Field 7 - For SummerDesignDay, !- Field 9 - Until: 24:00,15.6, !- Field 10 - For: Saturday, !- Field 12 - Until: 06:00,15.6, !- Field 13 - Until: 17:00,21.0, !- Field 15 - Until: 24:00,15.6, !- Field 17 - For: WinterDesignDay, !- Field 19 - Until: 24:00,21.0, !- Field 20 - For: Sunday Holidays AllOtherDays, !- Field 22 - Until: 24:00,15.6; !- Field 23 - - Schedule:Compact, - Cooling Setpoint Schedule, !- Name - Temperature, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: Weekdays SummerDesignDay, !- Field 2 - Until: 06:00,30.0, !- Field 3 - Until: 22:00,24.0, !- Field 5 - Until: 24:00,30.0, !- Field 7 - For: Saturday, !- Field 9 - Until: 06:00,30.0, !- Field 10 - Until: 18:00,24.0, !- Field 12 - Until: 24:00,30.0, !- Field 14 - For WinterDesignDay, !- Field 16 - Until: 24:00,30.0, !- Field 17 - For: Sunday Holidays AllOtherDays, !- Field 19 - Until: 24:00,30.0; !- Field 20 - - Schedule:Compact, - Office Activity Schedule,!- Name - Any Number, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: AllDays, !- Field 2 - Until: 24:00,120.; !- Field 3 - - Schedule:Compact, - Office Work Eff. Schedule, !- Name - Fraction, !- Schedule Type Limits Name - Through: 12/31, !- Field 1 - For: AllDays, !- Field 2 - Until: 24:00,0.0; !- Field 3 - - Schedule:Compact, - Office Clothing Schedule,!- Name - Any Number, !- Schedule Type Limits Name - Through: 04/30, !- Field 1 - For: AllDays, !- Field 2 - Until: 24:00,1.0, !- Field 3 - Through: 09/30, !- Field 5 - For: AllDays, !- Field 6 - Until: 24:00,0.5, !- Field 7 - Through: 12/31, !- Field 9 - For: AllDays, !- Field 10 - Until: 24:00,1.0; !- Field 11 - - !- =========== ALL OBJECTS IN CLASS: HVACTemplate:Thermostat =========== - - HVACTemplate:Thermostat, - Constant Setpoint Thermostat, !- Name - , !- Heating Setpoint Schedule Name - 20, !- Constant Heating Setpoint {C} - , !- Cooling Setpoint Schedule Name - 25; !- Constant Cooling Setpoint {C} - - !- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== - - Output:VariableDictionary,IDF; - - Zone, - ZONE_1, !- Name - 0.0, !- Direction of Relative North {deg} - 0.0, !- X Origin {m} - 0.0, !- Y Origin {m} - 0.0, !- Z Origin {m} - , !- Type - 1; !- Multiplier - - BuildingSurface:Detailed, - 502C53, !- Name - Floor, !- Surface Type - Exterior Floor, !- Construction Name - ZONE_1, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 0.0, !- View Factor to Ground - 4, !- Number of Vertices - 2.000000000000,2.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 2.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 0.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 0.000000000000,2.000000000000,0.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - A9B261, !- Name - Wall, !- Surface Type - Exterior Wall, !- Construction Name - ZONE_1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - 4, !- Number of Vertices - 2.000000000000,2.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 2.000000000000,2.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 0.000000000000,2.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 0.000000000000,2.000000000000,2.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - CB5D0B, !- Name - Wall, !- Surface Type - Exterior Wall, !- Construction Name - ZONE_1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - 4, !- Number of Vertices - 0.000000000000,0.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 0.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 2.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 2.000000000000,0.000000000000,2.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - F26B56, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - ZONE_1, !- Zone Name - Surface, !- Outside Boundary Condition - BA3AB8, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - 4, !- Number of Vertices - 2.000000000000,0.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 2.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 2.000000000000,2.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 2.000000000000,2.000000000000,2.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - 704B16, !- Name - Roof, !- Surface Type - Exterior Roof, !- Construction Name - ZONE_1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - 4, !- Number of Vertices - 0.000000000000,2.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 0.000000000000,0.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 2.000000000000,0.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 2.000000000000,2.000000000000,2.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - 4B7F67, !- Name - Wall, !- Surface Type - Exterior Wall, !- Construction Name - ZONE_1, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - 4, !- Number of Vertices - 0.000000000000,2.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 0.000000000000,2.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 0.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 0.000000000000,0.000000000000,2.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - Zone, - ZONE_2, !- Name - 0.0, !- Direction of Relative North {deg} - 2.0, !- X Origin {m} - 0.0, !- Y Origin {m} - 0.0, !- Z Origin {m} - , !- Type - 1; !- Multiplier - - BuildingSurface:Detailed, - E46863, !- Name - Floor, !- Surface Type - Exterior Floor, !- Construction Name - ZONE_2, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 0.0, !- View Factor to Ground - 4, !- Number of Vertices - 2.000000000000,2.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 2.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 0.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 0.000000000000,2.000000000000,0.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - E01C93, !- Name - Wall, !- Surface Type - Exterior Wall, !- Construction Name - ZONE_2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - 4, !- Number of Vertices - 2.000000000000,2.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 2.000000000000,2.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 0.000000000000,2.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 0.000000000000,2.000000000000,2.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - 9A8802, !- Name - Roof, !- Surface Type - Exterior Roof, !- Construction Name - ZONE_2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - 4, !- Number of Vertices - 0.000000000000,2.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 0.000000000000,0.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 2.000000000000,0.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 2.000000000000,2.000000000000,2.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - CB147E, !- Name - Wall, !- Surface Type - Exterior Wall, !- Construction Name - ZONE_2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - 4, !- Number of Vertices - 0.000000000000,0.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 0.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 2.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 2.000000000000,0.000000000000,2.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - 2142B8, !- Name - Wall, !- Surface Type - Exterior Wall, !- Construction Name - ZONE_2, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - , !- View Factor to Ground - 4, !- Number of Vertices - 2.000000000000,0.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 2.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 2.000000000000,2.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 2.000000000000,2.000000000000,2.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - BA3AB8, !- Name - Wall, !- Surface Type - Interior Wall, !- Construction Name - ZONE_2, !- Zone Name - Surface, !- Outside Boundary Condition - F26B56, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - , !- View Factor to Ground - 4, !- Number of Vertices - 0.000000000000,2.000000000000,2.000000000000, !- X,Y,Z ==> Vertex 1 {m} - 0.000000000000,2.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 2 {m} - 0.000000000000,0.000000000000,0.000000000000, !- X,Y,Z ==> Vertex 3 {m} - 0.000000000000,0.000000000000,2.000000000000; !- X,Y,Z ==> Vertex 4 {m} - - FenestrationSurface:Detailed, - D1468F, !- Name - Window, !- Surface Type - Exterior Window, !- Construction Name - CB5D0B, !- Building Surface Name - , !- Outside Boundary Condition Object - , !- View Factor to Ground - , !- Frame and Divider Name - , !- Multiplier - 4, !- Number of Vertices - 0.709777895370,0.000000000000,1.473204552997, !- X,Y,Z ==> Vertex 1 {m} - 0.709777895370,0.000000000000,0.653204552997, !- X,Y,Z ==> Vertex 2 {m} - 1.389777895370,0.000000000000,0.653204552997, !- X,Y,Z ==> Vertex 3 {m} - 1.389777895370,0.000000000000,1.473204552997; !- X,Y,Z ==> Vertex 4 {m} - diff --git a/tests/input_data/umi_samples/B_Off_0.idf b/tests/input_data/umi_samples/B_Off_0.idf index 413482c2..177a943e 100644 --- a/tests/input_data/umi_samples/B_Off_0.idf +++ b/tests/input_data/umi_samples/B_Off_0.idf @@ -1,1645 +1,2040 @@ -!- Darwin Line endings - - Version,9.2; - - SimulationControl, - No, !- Do Zone Sizing Calculation - No, !- Do System Sizing Calculation - No, !- Do Plant Sizing Calculation - No, !- Run Simulation for Sizing Periods - Yes; !- Run Simulation for Weather File Run Periods - - Building, - Building, !- Name - 0.0, !- North Axis {deg} - Suburbs, !- Terrain - 0.04, !- Loads Convergence Tolerance Value - 0.4, !- Temperature Convergence Tolerance Value {deltaC} - FullExterior, !- Solar Distribution - 25, !- Maximum Number of Warmup Days - ; !- Minimum Number of Warmup Days - - ShadowCalculation, - AverageOverDaysInFrequency, !- Calculation Method - 20, !- Calculation Frequency - 15000, !- Maximum Figures in Shadow Overlap Calculations - SutherlandHodgman, !- Polygon Clipping Algorithm - SimpleSkyDiffuseModeling;!- Sky Diffuse Modeling Algorithm - - SurfaceConvectionAlgorithm:Inside,TARP; - - SurfaceConvectionAlgorithm:Outside,DOE-2; - - HeatBalanceAlgorithm,ConductionTransferFunction,200.0,0.1,1000.0; - - Timestep,4; - - ConvergenceLimits, - 1, !- Minimum System Timestep {minutes} - 50; !- Maximum HVAC Iterations - - RunPeriod, - ArchSim, !- Name - 1, !- Begin Month - 1, !- Begin Day of Month - , !- Begin Year - 12, !- End Month - 31, !- End Day of Month - , !- End Year - , !- Day of Week for Start Day - No, !- Use Weather File Holidays and Special Days - No, !- Use Weather File Daylight Saving Period - Yes, !- Apply Weekend Holiday Rule - Yes, !- Use Weather File Rain Indicators - Yes, !- Use Weather File Snow Indicators - ; !- Treat Weather as Actual - - RunPeriodControl:DaylightSavingTime, - Last Sunday in March, !- Start Date - Last Sunday in October; !- End Date - - Site:GroundTemperature:BuildingSurface,14.0,14.0,14.0,14.0,14.0,14.0,14.0,14.0,14.0,14.0,14.0,14.0; - - Site:GroundReflectance,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.2; - - Site:GroundReflectance:SnowModifier, - 1.0, !- Ground Reflected Solar Modifier - 1.0; !- Daylighting Ground Reflected Solar Modifier - - ScheduleTypeLimits, - Any Number; !- Name - - ScheduleTypeLimits, - Fraction, !- Name - 0.0, !- Lower Limit Value - 1.0, !- Upper Limit Value - CONTINUOUS; !- Numeric Type - - ScheduleTypeLimits, - Temperature, !- Name - -60.0, !- Lower Limit Value - 200.0, !- Upper Limit Value - CONTINUOUS; !- Numeric Type - - ScheduleTypeLimits, - Control GasType, !- Name - 0.0, !- Lower Limit Value - 4.0, !- Upper Limit Value - DISCRETE; !- Numeric Type - - ScheduleTypeLimits, - On/Off, !- Name - 0.0, !- Lower Limit Value - 1.0, !- Upper Limit Value - DISCRETE; !- Numeric Type - - Schedule:Day:Hourly, - B_Off_D_Occ_WD, !- Name - Fraction, !- Schedule Type Limits Name - 0.0, !- Hour 1 - 0.0, !- Hour 2 - 0.0, !- Hour 3 - 0.0, !- Hour 4 - 0.0, !- Hour 5 - 0.0, !- Hour 6 - 0.1, !- Hour 7 - 0.2, !- Hour 8 - 1.0, !- Hour 9 - 1.0, !- Hour 10 - 1.0, !- Hour 11 - 1.0, !- Hour 12 - 0.5, !- Hour 13 - 1.0, !- Hour 14 - 1.0, !- Hour 15 - 1.0, !- Hour 16 - 1.0, !- Hour 17 - 0.3, !- Hour 18 - 0.2, !- Hour 19 - 0.1, !- Hour 20 - 0.0, !- Hour 21 - 0.0, !- Hour 22 - 0.0, !- Hour 23 - 0.0; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Occ_WE, !- Name - Fraction, !- Schedule Type Limits Name - 0.0, !- Hour 1 - 0.0, !- Hour 2 - 0.0, !- Hour 3 - 0.0, !- Hour 4 - 0.0, !- Hour 5 - 0.0, !- Hour 6 - 0.1, !- Hour 7 - 0.1, !- Hour 8 - 0.1, !- Hour 9 - 0.1, !- Hour 10 - 0.1, !- Hour 11 - 0.1, !- Hour 12 - 0.1, !- Hour 13 - 0.1, !- Hour 14 - 0.1, !- Hour 15 - 0.1, !- Hour 16 - 0.1, !- Hour 17 - 0.1, !- Hour 18 - 0.1, !- Hour 19 - 0.1, !- Hour 20 - 0.0, !- Hour 21 - 0.0, !- Hour 22 - 0.0, !- Hour 23 - 0.0; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Het_WD, !- Name - Fraction, !- Schedule Type Limits Name - 0.0, !- Hour 1 - 0.0, !- Hour 2 - 0.0, !- Hour 3 - 0.0, !- Hour 4 - 0.0, !- Hour 5 - 0.0, !- Hour 6 - 1.0, !- Hour 7 - 1.0, !- Hour 8 - 1.0, !- Hour 9 - 1.0, !- Hour 10 - 1.0, !- Hour 11 - 1.0, !- Hour 12 - 1.0, !- Hour 13 - 1.0, !- Hour 14 - 1.0, !- Hour 15 - 1.0, !- Hour 16 - 1.0, !- Hour 17 - 1.0, !- Hour 18 - 1.0, !- Hour 19 - 1.0, !- Hour 20 - 0.0, !- Hour 21 - 0.0, !- Hour 22 - 0.0, !- Hour 23 - 0.0; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Het_WE, !- Name - Fraction, !- Schedule Type Limits Name - 0.0, !- Hour 1 - 0.0, !- Hour 2 - 0.0, !- Hour 3 - 0.0, !- Hour 4 - 0.0, !- Hour 5 - 0.0, !- Hour 6 - 0.0, !- Hour 7 - 0.0, !- Hour 8 - 0.0, !- Hour 9 - 0.0, !- Hour 10 - 0.0, !- Hour 11 - 0.0, !- Hour 12 - 0.0, !- Hour 13 - 0.0, !- Hour 14 - 0.0, !- Hour 15 - 0.0, !- Hour 16 - 0.0, !- Hour 17 - 0.0, !- Hour 18 - 0.0, !- Hour 19 - 0.0, !- Hour 20 - 0.0, !- Hour 21 - 0.0, !- Hour 22 - 0.0, !- Hour 23 - 0.0; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Off, !- Name - Fraction, !- Schedule Type Limits Name - 0.0, !- Hour 1 - 0.0, !- Hour 2 - 0.0, !- Hour 3 - 0.0, !- Hour 4 - 0.0, !- Hour 5 - 0.0, !- Hour 6 - 0.0, !- Hour 7 - 0.0, !- Hour 8 - 0.0, !- Hour 9 - 0.0, !- Hour 10 - 0.0, !- Hour 11 - 0.0, !- Hour 12 - 0.0, !- Hour 13 - 0.0, !- Hour 14 - 0.0, !- Hour 15 - 0.0, !- Hour 16 - 0.0, !- Hour 17 - 0.0, !- Hour 18 - 0.0, !- Hour 19 - 0.0, !- Hour 20 - 0.0, !- Hour 21 - 0.0, !- Hour 22 - 0.0, !- Hour 23 - 0.0; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Col_WD, !- Name - Fraction, !- Schedule Type Limits Name - 0.0, !- Hour 1 - 0.0, !- Hour 2 - 0.0, !- Hour 3 - 0.0, !- Hour 4 - 0.0, !- Hour 5 - 0.0, !- Hour 6 - 1.0, !- Hour 7 - 1.0, !- Hour 8 - 1.0, !- Hour 9 - 1.0, !- Hour 10 - 1.0, !- Hour 11 - 1.0, !- Hour 12 - 1.0, !- Hour 13 - 1.0, !- Hour 14 - 1.0, !- Hour 15 - 1.0, !- Hour 16 - 1.0, !- Hour 17 - 1.0, !- Hour 18 - 1.0, !- Hour 19 - 1.0, !- Hour 20 - 0.0, !- Hour 21 - 0.0, !- Hour 22 - 0.0, !- Hour 23 - 0.0; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Col_WE, !- Name - Fraction, !- Schedule Type Limits Name - 0.0, !- Hour 1 - 0.0, !- Hour 2 - 0.0, !- Hour 3 - 0.0, !- Hour 4 - 0.0, !- Hour 5 - 0.0, !- Hour 6 - 0.0, !- Hour 7 - 0.0, !- Hour 8 - 0.0, !- Hour 9 - 0.0, !- Hour 10 - 0.0, !- Hour 11 - 0.0, !- Hour 12 - 0.0, !- Hour 13 - 0.0, !- Hour 14 - 0.0, !- Hour 15 - 0.0, !- Hour 16 - 0.0, !- Hour 17 - 0.0, !- Hour 18 - 0.0, !- Hour 19 - 0.0, !- Hour 20 - 0.0, !- Hour 21 - 0.0, !- Hour 22 - 0.0, !- Hour 23 - 0.0; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Dhw_WD, !- Name - Fraction, !- Schedule Type Limits Name - 0.0, !- Hour 1 - 0.0, !- Hour 2 - 0.0, !- Hour 3 - 0.0, !- Hour 4 - 0.0, !- Hour 5 - 0.0, !- Hour 6 - 0.2, !- Hour 7 - 0.4, !- Hour 8 - 0.4, !- Hour 9 - 0.4, !- Hour 10 - 0.4, !- Hour 11 - 0.6, !- Hour 12 - 0.6, !- Hour 13 - 0.4, !- Hour 14 - 0.4, !- Hour 15 - 0.4, !- Hour 16 - 0.4, !- Hour 17 - 0.4, !- Hour 18 - 0.4, !- Hour 19 - 0.2, !- Hour 20 - 0.0, !- Hour 21 - 0.0, !- Hour 22 - 0.0, !- Hour 23 - 0.0; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Dhw_WE, !- Name - Fraction, !- Schedule Type Limits Name - 0.0, !- Hour 1 - 0.0, !- Hour 2 - 0.0, !- Hour 3 - 0.0, !- Hour 4 - 0.0, !- Hour 5 - 0.0, !- Hour 6 - 0.1, !- Hour 7 - 0.1, !- Hour 8 - 0.1, !- Hour 9 - 0.1, !- Hour 10 - 0.1, !- Hour 11 - 0.1, !- Hour 12 - 0.1, !- Hour 13 - 0.1, !- Hour 14 - 0.1, !- Hour 15 - 0.1, !- Hour 16 - 0.1, !- Hour 17 - 0.1, !- Hour 18 - 0.1, !- Hour 19 - 0.1, !- Hour 20 - 0.0, !- Hour 21 - 0.0, !- Hour 22 - 0.0, !- Hour 23 - 0.0; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Lgt_WD, !- Name - Fraction, !- Schedule Type Limits Name - 0.1, !- Hour 1 - 0.1, !- Hour 2 - 0.1, !- Hour 3 - 0.1, !- Hour 4 - 0.1, !- Hour 5 - 0.1, !- Hour 6 - 0.1, !- Hour 7 - 0.3, !- Hour 8 - 1.0, !- Hour 9 - 1.0, !- Hour 10 - 1.0, !- Hour 11 - 1.0, !- Hour 12 - 0.8, !- Hour 13 - 1.0, !- Hour 14 - 1.0, !- Hour 15 - 1.0, !- Hour 16 - 1.0, !- Hour 17 - 0.5, !- Hour 18 - 0.3, !- Hour 19 - 0.3, !- Hour 20 - 0.2, !- Hour 21 - 0.2, !- Hour 22 - 0.1, !- Hour 23 - 0.1; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Lgt_WE, !- Name - Fraction, !- Schedule Type Limits Name - 0.1, !- Hour 1 - 0.1, !- Hour 2 - 0.1, !- Hour 3 - 0.1, !- Hour 4 - 0.1, !- Hour 5 - 0.1, !- Hour 6 - 0.1, !- Hour 7 - 0.1, !- Hour 8 - 0.1, !- Hour 9 - 0.1, !- Hour 10 - 0.1, !- Hour 11 - 0.1, !- Hour 12 - 0.1, !- Hour 13 - 0.1, !- Hour 14 - 0.1, !- Hour 15 - 0.1, !- Hour 16 - 0.1, !- Hour 17 - 0.1, !- Hour 18 - 0.1, !- Hour 19 - 0.1, !- Hour 20 - 0.1, !- Hour 21 - 0.1, !- Hour 22 - 0.1, !- Hour 23 - 0.1; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Plg_WD, !- Name - Fraction, !- Schedule Type Limits Name - 0.1, !- Hour 1 - 0.1, !- Hour 2 - 0.1, !- Hour 3 - 0.1, !- Hour 4 - 0.1, !- Hour 5 - 0.1, !- Hour 6 - 0.1, !- Hour 7 - 0.3, !- Hour 8 - 1.0, !- Hour 9 - 1.0, !- Hour 10 - 1.0, !- Hour 11 - 1.0, !- Hour 12 - 0.8, !- Hour 13 - 1.0, !- Hour 14 - 1.0, !- Hour 15 - 1.0, !- Hour 16 - 1.0, !- Hour 17 - 1.0, !- Hour 18 - 0.3, !- Hour 19 - 0.3, !- Hour 20 - 0.2, !- Hour 21 - 0.2, !- Hour 22 - 0.1, !- Hour 23 - 0.1; !- Hour 24 - - Schedule:Day:Hourly, - B_Off_D_Plg_WE, !- Name - Fraction, !- Schedule Type Limits Name - 0.1, !- Hour 1 - 0.1, !- Hour 2 - 0.1, !- Hour 3 - 0.1, !- Hour 4 - 0.1, !- Hour 5 - 0.1, !- Hour 6 - 0.1, !- Hour 7 - 0.1, !- Hour 8 - 0.1, !- Hour 9 - 0.1, !- Hour 10 - 0.1, !- Hour 11 - 0.1, !- Hour 12 - 0.1, !- Hour 13 - 0.1, !- Hour 14 - 0.1, !- Hour 15 - 0.1, !- Hour 16 - 0.1, !- Hour 17 - 0.1, !- Hour 18 - 0.1, !- Hour 19 - 0.1, !- Hour 20 - 0.1, !- Hour 21 - 0.1, !- Hour 22 - 0.1, !- Hour 23 - 0.1; !- Hour 24 - - Schedule:Week:Daily, - B_Off_W_Occ, !- Name - B_Off_D_Occ_WE, !- Sunday Schedule:Day Name - B_Off_D_Occ_WD, !- Monday Schedule:Day Name - B_Off_D_Occ_WD, !- Tuesday Schedule:Day Name - B_Off_D_Occ_WD, !- Wednesday Schedule:Day Name - B_Off_D_Occ_WD, !- Thursday Schedule:Day Name - B_Off_D_Occ_WD, !- Friday Schedule:Day Name - B_Off_D_Occ_WE, !- Saturday Schedule:Day Name - B_Off_D_Occ_WE, !- Holiday Schedule:Day Name - B_Off_D_Occ_WD, !- SummerDesignDay Schedule:Day Name - B_Off_D_Occ_WD, !- WinterDesignDay Schedule:Day Name - B_Off_D_Occ_WD, !- CustomDay1 Schedule:Day Name - B_Off_D_Occ_WD; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - B_Off_W_Het, !- Name - B_Off_D_Het_WE, !- Sunday Schedule:Day Name - B_Off_D_Het_WD, !- Monday Schedule:Day Name - B_Off_D_Het_WD, !- Tuesday Schedule:Day Name - B_Off_D_Het_WD, !- Wednesday Schedule:Day Name - B_Off_D_Het_WD, !- Thursday Schedule:Day Name - B_Off_D_Het_WD, !- Friday Schedule:Day Name - B_Off_D_Het_WE, !- Saturday Schedule:Day Name - B_Off_D_Het_WE, !- Holiday Schedule:Day Name - B_Off_D_Het_WD, !- SummerDesignDay Schedule:Day Name - B_Off_D_Het_WD, !- WinterDesignDay Schedule:Day Name - B_Off_D_Het_WD, !- CustomDay1 Schedule:Day Name - B_Off_D_Het_WD; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - B_Off_W_Off, !- Name - B_Off_D_Off, !- Sunday Schedule:Day Name - B_Off_D_Off, !- Monday Schedule:Day Name - B_Off_D_Off, !- Tuesday Schedule:Day Name - B_Off_D_Off, !- Wednesday Schedule:Day Name - B_Off_D_Off, !- Thursday Schedule:Day Name - B_Off_D_Off, !- Friday Schedule:Day Name - B_Off_D_Off, !- Saturday Schedule:Day Name - B_Off_D_Off, !- Holiday Schedule:Day Name - B_Off_D_Off, !- SummerDesignDay Schedule:Day Name - B_Off_D_Off, !- WinterDesignDay Schedule:Day Name - B_Off_D_Off, !- CustomDay1 Schedule:Day Name - B_Off_D_Off; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - B_Off_W_Col, !- Name - B_Off_D_Col_WE, !- Sunday Schedule:Day Name - B_Off_D_Col_WD, !- Monday Schedule:Day Name - B_Off_D_Col_WD, !- Tuesday Schedule:Day Name - B_Off_D_Col_WD, !- Wednesday Schedule:Day Name - B_Off_D_Col_WD, !- Thursday Schedule:Day Name - B_Off_D_Col_WD, !- Friday Schedule:Day Name - B_Off_D_Col_WE, !- Saturday Schedule:Day Name - B_Off_D_Col_WE, !- Holiday Schedule:Day Name - B_Off_D_Col_WD, !- SummerDesignDay Schedule:Day Name - B_Off_D_Col_WD, !- WinterDesignDay Schedule:Day Name - B_Off_D_Col_WD, !- CustomDay1 Schedule:Day Name - B_Off_D_Col_WD; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - B_Off_W_Dhw, !- Name - B_Off_D_Dhw_WE, !- Sunday Schedule:Day Name - B_Off_D_Dhw_WD, !- Monday Schedule:Day Name - B_Off_D_Dhw_WD, !- Tuesday Schedule:Day Name - B_Off_D_Dhw_WD, !- Wednesday Schedule:Day Name - B_Off_D_Dhw_WD, !- Thursday Schedule:Day Name - B_Off_D_Dhw_WD, !- Friday Schedule:Day Name - B_Off_D_Dhw_WE, !- Saturday Schedule:Day Name - B_Off_D_Dhw_WE, !- Holiday Schedule:Day Name - B_Off_D_Dhw_WD, !- SummerDesignDay Schedule:Day Name - B_Off_D_Dhw_WD, !- WinterDesignDay Schedule:Day Name - B_Off_D_Dhw_WD, !- CustomDay1 Schedule:Day Name - B_Off_D_Dhw_WD; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - B_Off_W_Lgt, !- Name - B_Off_D_Lgt_WE, !- Sunday Schedule:Day Name - B_Off_D_Lgt_WD, !- Monday Schedule:Day Name - B_Off_D_Lgt_WD, !- Tuesday Schedule:Day Name - B_Off_D_Lgt_WD, !- Wednesday Schedule:Day Name - B_Off_D_Lgt_WD, !- Thursday Schedule:Day Name - B_Off_D_Lgt_WD, !- Friday Schedule:Day Name - B_Off_D_Lgt_WE, !- Saturday Schedule:Day Name - B_Off_D_Lgt_WE, !- Holiday Schedule:Day Name - B_Off_D_Lgt_WD, !- SummerDesignDay Schedule:Day Name - B_Off_D_Lgt_WD, !- WinterDesignDay Schedule:Day Name - B_Off_D_Lgt_WD, !- CustomDay1 Schedule:Day Name - B_Off_D_Lgt_WD; !- CustomDay2 Schedule:Day Name - - Schedule:Week:Daily, - B_Off_W_Plg, !- Name - B_Off_D_Plg_WE, !- Sunday Schedule:Day Name - B_Off_D_Plg_WD, !- Monday Schedule:Day Name - B_Off_D_Plg_WD, !- Tuesday Schedule:Day Name - B_Off_D_Plg_WD, !- Wednesday Schedule:Day Name - B_Off_D_Plg_WD, !- Thursday Schedule:Day Name - B_Off_D_Plg_WD, !- Friday Schedule:Day Name - B_Off_D_Plg_WE, !- Saturday Schedule:Day Name - B_Off_D_Plg_WE, !- Holiday Schedule:Day Name - B_Off_D_Plg_WD, !- SummerDesignDay Schedule:Day Name - B_Off_D_Plg_WD, !- WinterDesignDay Schedule:Day Name - B_Off_D_Plg_WD, !- CustomDay1 Schedule:Day Name - B_Off_D_Plg_WD; !- CustomDay2 Schedule:Day Name - - Schedule:Year, - B_Off_Y_Occ, !- Name - Fraction, !- Schedule Type Limits Name - B_Off_W_Occ, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - B_Off_Y_Het, !- Name - Fraction, !- Schedule Type Limits Name - B_Off_W_Het, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 4, !- End Month 1 - 30, !- End Day 1 - B_Off_W_Off, !- Schedule:Week Name 2 - 5, !- Start Month 2 - 1, !- Start Day 2 - 9, !- End Month 2 - 30, !- End Day 2 - B_Off_W_Het, !- Schedule:Week Name 3 - 10, !- Start Month 3 - 1, !- Start Day 3 - 12, !- End Month 3 - 31; !- End Day 3 - - Schedule:Year, - B_Off_Y_Col, !- Name - Fraction, !- Schedule Type Limits Name - B_Off_W_Off, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 3, !- End Month 1 - 31, !- End Day 1 - B_Off_W_Col, !- Schedule:Week Name 2 - 4, !- Start Month 2 - 1, !- Start Day 2 - 9, !- End Month 2 - 30, !- End Day 2 - B_Off_W_Off, !- Schedule:Week Name 3 - 10, !- Start Month 3 - 1, !- Start Day 3 - 12, !- End Month 3 - 31; !- End Day 3 - - Schedule:Year, - B_Off_Y_Dhw, !- Name - Fraction, !- Schedule Type Limits Name - B_Off_W_Dhw, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - B_Off_Y_Lgt, !- Name - Fraction, !- Schedule Type Limits Name - B_Off_W_Lgt, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Year, - B_Off_Y_Plg, !- Name - Fraction, !- Schedule Type Limits Name - B_Off_W_Plg, !- Schedule:Week Name 1 - 1, !- Start Month 1 - 1, !- Start Day 1 - 12, !- End Month 1 - 31; !- End Day 1 - - Schedule:Constant,On,On/Off,1.0; - - Schedule:Constant,Off,On/Off,0.0; - - Schedule:Constant,PerimPeopleActivity,Any Number,125.28; - - Schedule:Constant,PerimAirVelocity,Any Number,0.2; - - Schedule:Constant,PerimWorkEfficiency,Any Number,0.0; - - Schedule:Constant,PerimHeating_SP_Sch,Temperature,20.0; - - Schedule:Constant,PerimCooling_SP_Sch,Temperature,24.0; - - Schedule:Constant,PerimZoneControlTypeSched,Any Number,4.0; - - Schedule:Constant,PerimHumidMin,Any Number,20.0; - - Schedule:Constant,PerimHumidMax,Any Number,80.0; - - Schedule:Constant,DHW Supply Temperature Perim,Temperature,55.0; - - Schedule:Constant,DHW Mains Temperature Perim,Temperature,16.0; - - Schedule:Constant,CorePeopleActivity,Any Number,125.28; - - Schedule:Constant,CoreAirVelocity,Any Number,0.2; - - Schedule:Constant,CoreWorkEfficiency,Any Number,0.0; - - Schedule:Constant,CoreHeating_SP_Sch,Temperature,20.0; - - Schedule:Constant,CoreCooling_SP_Sch,Temperature,24.0; - - Schedule:Constant,CoreZoneControlTypeSched,Any Number,4.0; - - Schedule:Constant,CoreHumidMin,Any Number,20.0; - - Schedule:Constant,CoreHumidMax,Any Number,80.0; - - Schedule:Constant,DHW Supply Temperature Core,Temperature,55.0; - - Schedule:Constant,DHW Mains Temperature Core,Temperature,16.0; - - Material, - B_Gypsum_Plaster_0.02_B_Off_Thm_0, !- Name - Rough, !- Roughness - 0.02, !- Thickness {m} - 0.42, !- Conductivity {W/m-K} - 900.0, !- Density {kg/m3} - 840.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - B_Softwood_General_0.02_B_Off_Thm_0, !- Name - Rough, !- Roughness - 0.02, !- Thickness {m} - 0.13, !- Conductivity {W/m-K} - 496.0, !- Density {kg/m3} - 1630.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - B_Clay_Brick_H_0.06_B_Off_Fac_0, !- Name - Rough, !- Roughness - 0.06, !- Thickness {m} - 0.41, !- Conductivity {W/m-K} - 1000.0, !- Density {kg/m3} - 920.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.5, !- Solar Absorptance - 0.5; !- Visible Absorptance - - Material, - B_XPS_Board_0.02_B_Off_Fac_0, !- Name - Rough, !- Roughness - 0.02, !- Thickness {m} - 0.037, !- Conductivity {W/m-K} - 40.0, !- Density {kg/m3} - 1200.0, !- Specific Heat {J/kg-K} - 0.6, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - B_Concrete_Block_H_0.15_B_Off_Fac_0, !- Name - Rough, !- Roughness - 0.15, !- Thickness {m} - 1.25, !- Conductivity {W/m-K} - 880.0, !- Density {kg/m3} - 840.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - B_Fiberglass_Batts_0.05_B_Off_Fac_0, !- Name - Rough, !- Roughness - 0.05, !- Thickness {m} - 0.043, !- Conductivity {W/m-K} - 12.0, !- Density {kg/m3} - 840.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - B_Gypsum_Board_0.015_B_Off_Fac_0, !- Name - Rough, !- Roughness - 0.015, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 950.0, !- Density {kg/m3} - 840.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - B_Gypsum_Plaster_0.02_B_Off_Par_0, !- Name - Rough, !- Roughness - 0.02, !- Thickness {m} - 0.42, !- Conductivity {W/m-K} - 900.0, !- Density {kg/m3} - 840.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - B_Softwood_General_0.02_B_Off_Par_0, !- Name - Rough, !- Roughness - 0.02, !- Thickness {m} - 0.13, !- Conductivity {W/m-K} - 496.0, !- Density {kg/m3} - 1630.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - B_XPS_Board_0.02_B_Off_Gro_0, !- Name - Rough, !- Roughness - 0.02, !- Thickness {m} - 0.037, !- Conductivity {W/m-K} - 40.0, !- Density {kg/m3} - 1200.0, !- Specific Heat {J/kg-K} - 0.6, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - B_Concrete_RC_Dense_0.15_B_Off_Gro_0, !- Name - Rough, !- Roughness - 0.15, !- Thickness {m} - 1.75, !- Conductivity {W/m-K} - 2400.0, !- Density {kg/m3} - 840.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - B_Concrete_MC_Light_0.04_B_Off_Gro_0, !- Name - Rough, !- Roughness - 0.04, !- Thickness {m} - 1.65, !- Conductivity {W/m-K} - 2100.0, !- Density {kg/m3} - 1040.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - B_Cement_Mortar_0.03_B_Off_Gro_0, !- Name - Rough, !- Roughness - 0.03, !- Thickness {m} - 0.8, !- Conductivity {W/m-K} - 1900.0, !- Density {kg/m3} - 840.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.8, !- Solar Absorptance - 0.8; !- Visible Absorptance - - Material, - B_Ceramic_Tile_0.02_B_Off_Gro_0, !- Name - Rough, !- Roughness - 0.02, !- Thickness {m} - 0.8, !- Conductivity {W/m-K} - 2243.0, !- Density {kg/m3} - 840.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.4, !- Solar Absorptance - 0.4; !- Visible Absorptance - - Material, - B_XPS_Board_0.1_B_Off_Rof_0, !- Name - Rough, !- Roughness - 0.1, !- Thickness {m} - 0.037, !- Conductivity {W/m-K} - 40.0, !- Density {kg/m3} - 1200.0, !- Specific Heat {J/kg-K} - 0.6, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - Material, - B_Concrete_MC_Light_0.15_B_Off_Rof_0, !- Name - Rough, !- Roughness - 0.15, !- Thickness {m} - 1.65, !- Conductivity {W/m-K} - 2100.0, !- Density {kg/m3} - 1040.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - B_Concrete_RC_Dense_0.2_B_Off_Rof_0, !- Name - Rough, !- Roughness - 0.2, !- Thickness {m} - 1.75, !- Conductivity {W/m-K} - 2400.0, !- Density {kg/m3} - 840.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - B_Air_Floor_15cm_0.15_B_Off_Rof_0, !- Name - Rough, !- Roughness - 0.15, !- Thickness {m} - 0.7, !- Conductivity {W/m-K} - 1.2, !- Density {kg/m3} - 1000.0, !- Specific Heat {J/kg-K} - 0.01, !- Thermal Absorptance - 0.7, !- Solar Absorptance - 0.7; !- Visible Absorptance - - Material, - B_Gypsum_Board_0.02_B_Off_Rof_0, !- Name - Rough, !- Roughness - 0.02, !- Thickness {m} - 0.16, !- Conductivity {W/m-K} - 950.0, !- Density {kg/m3} - 840.0, !- Specific Heat {J/kg-K} - 0.9, !- Thermal Absorptance - 0.6, !- Solar Absorptance - 0.6; !- Visible Absorptance - - 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 {m} - 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.0, !- Infrared Transmittance at Normal Incidence - 0.84, !- Front Side Infrared Hemispherical Emissivity - 0.84, !- Back Side Infrared Hemispherical Emissivity - 0.9, !- Conductivity {W/m-K} - 1.0; !- Dirt Correction Factor for Solar and Visible Transmittance - - WindowMaterial:Gas, - AIR_0.006_B_Dbl_Air_Cl, !- Name - AIR, !- Gas Type - 0.006; !- Thickness {m} - - Construction, - B_Off_Thm_0, !- Name - B_Gypsum_Plaster_0.02_B_Off_Thm_0, !- Outside Layer - B_Softwood_General_0.02_B_Off_Thm_0, !- Layer 2 - B_Gypsum_Plaster_0.02_B_Off_Thm_0; !- Layer 3 - - Construction, - B_Off_Thm_0_FLIPPED, !- Name - B_Gypsum_Plaster_0.02_B_Off_Thm_0, !- Outside Layer - B_Softwood_General_0.02_B_Off_Thm_0, !- Layer 2 - B_Gypsum_Plaster_0.02_B_Off_Thm_0; !- Layer 3 - - Construction, - B_Off_Fac_0, !- Name - B_Clay_Brick_H_0.06_B_Off_Fac_0, !- Outside Layer - B_XPS_Board_0.02_B_Off_Fac_0, !- Layer 2 - B_Concrete_Block_H_0.15_B_Off_Fac_0, !- Layer 3 - B_Fiberglass_Batts_0.05_B_Off_Fac_0, !- Layer 4 - B_Gypsum_Board_0.015_B_Off_Fac_0; !- Layer 5 - - Construction, - B_Off_Fac_0_FLIPPED, !- Name - B_Gypsum_Board_0.015_B_Off_Fac_0, !- Outside Layer - B_Fiberglass_Batts_0.05_B_Off_Fac_0, !- Layer 2 - B_Concrete_Block_H_0.15_B_Off_Fac_0, !- Layer 3 - B_XPS_Board_0.02_B_Off_Fac_0, !- Layer 4 - B_Clay_Brick_H_0.06_B_Off_Fac_0; !- Layer 5 - - Construction, - B_Off_Par_0, !- Name - B_Gypsum_Plaster_0.02_B_Off_Par_0, !- Outside Layer - B_Softwood_General_0.02_B_Off_Par_0, !- Layer 2 - B_Gypsum_Plaster_0.02_B_Off_Par_0; !- Layer 3 - - Construction, - B_Off_Par_0_FLIPPED, !- Name - B_Gypsum_Plaster_0.02_B_Off_Par_0, !- Outside Layer - B_Softwood_General_0.02_B_Off_Par_0, !- Layer 2 - B_Gypsum_Plaster_0.02_B_Off_Par_0; !- Layer 3 - - Construction, - B_Off_Gro_0, !- Name - B_XPS_Board_0.02_B_Off_Gro_0, !- Outside Layer - B_Concrete_RC_Dense_0.15_B_Off_Gro_0, !- Layer 2 - B_Concrete_MC_Light_0.04_B_Off_Gro_0, !- Layer 3 - B_Cement_Mortar_0.03_B_Off_Gro_0, !- Layer 4 - B_Ceramic_Tile_0.02_B_Off_Gro_0; !- Layer 5 - - Construction, - B_Off_Gro_0_FLIPPED, !- Name - B_Ceramic_Tile_0.02_B_Off_Gro_0, !- Outside Layer - B_Cement_Mortar_0.03_B_Off_Gro_0, !- Layer 2 - B_Concrete_MC_Light_0.04_B_Off_Gro_0, !- Layer 3 - B_Concrete_RC_Dense_0.15_B_Off_Gro_0, !- Layer 4 - B_XPS_Board_0.02_B_Off_Gro_0; !- Layer 5 - - Construction, - B_Off_Rof_0, !- Name - B_XPS_Board_0.1_B_Off_Rof_0, !- Outside Layer - B_Concrete_MC_Light_0.15_B_Off_Rof_0, !- Layer 2 - B_Concrete_RC_Dense_0.2_B_Off_Rof_0, !- Layer 3 - B_Air_Floor_15cm_0.15_B_Off_Rof_0, !- Layer 4 - B_Gypsum_Board_0.02_B_Off_Rof_0; !- Layer 5 - - Construction, - B_Off_Rof_0_FLIPPED, !- Name - B_Gypsum_Board_0.02_B_Off_Rof_0, !- Outside Layer - B_Air_Floor_15cm_0.15_B_Off_Rof_0, !- Layer 2 - B_Concrete_RC_Dense_0.2_B_Off_Rof_0, !- Layer 3 - B_Concrete_MC_Light_0.15_B_Off_Rof_0, !- Layer 4 - B_XPS_Board_0.1_B_Off_Rof_0; !- Layer 5 - - 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 - - Construction, - B_Dbl_Air_Cl_FLIPPED, !- 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 - - GlobalGeometryRules, - LowerLeftCorner, !- Starting Vertex Position - CounterClockWise, !- Vertex Entry Direction - Relative; !- Coordinate System - - Zone, - Perim, !- Name - 0.0, !- Direction of Relative North {deg} - 0.0, !- X Origin {m} - 0.0, !- Y Origin {m} - 0.0, !- Z Origin {m} - 1, !- Type - 1.0, !- Multiplier - , !- Ceiling Height {m} - 25.5432135170806, !- Volume {m3} - 4.79389353643646, !- Floor Area {m2} - TARP, !- Zone Inside Convection Algorithm - DOE-2; !- Zone Outside Convection Algorithm - - Zone, - Core, !- Name - 0.0, !- Direction of Relative North {deg} - 0.0, !- X Origin {m} - 0.0, !- Y Origin {m} - 0.0, !- Z Origin {m} - 1, !- Type - 1.0, !- Multiplier - , !- Ceiling Height {m} - 7.99242202280991, !- Volume {m3} - 1.5, !- Floor Area {m2} - TARP, !- Zone Inside Convection Algorithm - DOE-2; !- Zone Outside Convection Algorithm - - BuildingSurface:Detailed, - Perim:f0, !- Name - Wall, !- Surface Type - B_Off_Fac_0, !- Construction Name - Perim, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - 0.5, !- View Factor to Ground - 4, !- Number of Vertices - -7.9406,-7.8653,5.3283, !- X,Y,Z ==> Vertex 1 {m} - -10.9406,-7.8653,5.3283, !- X,Y,Z ==> Vertex 2 {m} - -10.9406,-7.8653,0.0, !- X,Y,Z ==> Vertex 3 {m} - -7.9406,-7.8653,0.0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Perim:f1, !- Name - Wall, !- Surface Type - B_Off_Par_0, !- Construction Name - Perim, !- Zone Name - Surface, !- Outside Boundary Condition - Core:f0, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 0.0, !- View Factor to Ground - 4, !- Number of Vertices - -7.9406,-6.2673,5.3283, !- X,Y,Z ==> Vertex 1 {m} - -7.9406,-6.2673,0.0, !- X,Y,Z ==> Vertex 2 {m} - -10.9406,-6.2673,0.0, !- X,Y,Z ==> Vertex 3 {m} - -10.9406,-6.2673,5.3283; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Perim:f2, !- Name - Wall, !- Surface Type - B_Off_Par_0, !- Construction Name - Perim, !- Zone Name - Adiabatic, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 0.0, !- View Factor to Ground - 4, !- Number of Vertices - -7.9406,-6.2673,0.0, !- X,Y,Z ==> Vertex 1 {m} - -7.9406,-6.2673,5.3283, !- X,Y,Z ==> Vertex 2 {m} - -7.9406,-7.8653,5.3283, !- X,Y,Z ==> Vertex 3 {m} - -7.9406,-7.8653,0.0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Perim:f3, !- Name - Wall, !- Surface Type - B_Off_Par_0, !- Construction Name - Perim, !- Zone Name - Adiabatic, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 0.0, !- View Factor to Ground - 4, !- Number of Vertices - -10.9406,-6.2673,0.0, !- X,Y,Z ==> Vertex 1 {m} - -10.9406,-7.8653,0.0, !- X,Y,Z ==> Vertex 2 {m} - -10.9406,-7.8653,5.3283, !- X,Y,Z ==> Vertex 3 {m} - -10.9406,-6.2673,5.3283; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Perim:f4, !- Name - Floor, !- Surface Type - B_Off_Gro_0, !- Construction Name - Perim, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 1.0, !- View Factor to Ground - 4, !- Number of Vertices - -10.9406,-7.8653,0.0, !- X,Y,Z ==> Vertex 1 {m} - -10.9406,-6.2673,0.0, !- X,Y,Z ==> Vertex 2 {m} - -7.9406,-6.2673,0.0, !- X,Y,Z ==> Vertex 3 {m} - -7.9406,-7.8653,0.0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Perim:f5, !- Name - Roof, !- Surface Type - B_Off_Rof_0, !- Construction Name - Perim, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - 0.0, !- View Factor to Ground - 4, !- Number of Vertices - -10.9406,-7.8653,5.3283, !- X,Y,Z ==> Vertex 1 {m} - -7.9406,-7.8653,5.3283, !- X,Y,Z ==> Vertex 2 {m} - -7.9406,-6.2673,5.3283, !- X,Y,Z ==> Vertex 3 {m} - -10.9406,-6.2673,5.3283; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Core:f0, !- Name - Wall, !- Surface Type - B_Off_Par_0, !- Construction Name - Core, !- Zone Name - Surface, !- Outside Boundary Condition - Perim:f1, !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 0.0, !- View Factor to Ground - 4, !- Number of Vertices - -7.9406,-6.2673,5.3283, !- X,Y,Z ==> Vertex 1 {m} - -10.9406,-6.2673,5.3283, !- X,Y,Z ==> Vertex 2 {m} - -10.9406,-6.2673,0.0, !- X,Y,Z ==> Vertex 3 {m} - -7.9406,-6.2673,0.0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Core:f1, !- Name - Wall, !- Surface Type - B_Off_Par_0, !- Construction Name - Core, !- Zone Name - Adiabatic, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 0.0, !- View Factor to Ground - 4, !- Number of Vertices - -7.9406,-5.7673,5.3283, !- X,Y,Z ==> Vertex 1 {m} - -7.9406,-5.7673,0.0, !- X,Y,Z ==> Vertex 2 {m} - -10.9406,-5.7673,0.0, !- X,Y,Z ==> Vertex 3 {m} - -10.9406,-5.7673,5.3283; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Core:f2, !- Name - Wall, !- Surface Type - B_Off_Par_0, !- Construction Name - Core, !- Zone Name - Adiabatic, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 0.0, !- View Factor to Ground - 4, !- Number of Vertices - -7.9406,-5.7673,0.0, !- X,Y,Z ==> Vertex 1 {m} - -7.9406,-5.7673,5.3283, !- X,Y,Z ==> Vertex 2 {m} - -7.9406,-6.2673,5.3283, !- X,Y,Z ==> Vertex 3 {m} - -7.9406,-6.2673,0.0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Core:f3, !- Name - Wall, !- Surface Type - B_Off_Par_0, !- Construction Name - Core, !- Zone Name - Adiabatic, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 0.0, !- View Factor to Ground - 4, !- Number of Vertices - -10.9406,-5.7673,0.0, !- X,Y,Z ==> Vertex 1 {m} - -10.9406,-6.2673,0.0, !- X,Y,Z ==> Vertex 2 {m} - -10.9406,-6.2673,5.3283, !- X,Y,Z ==> Vertex 3 {m} - -10.9406,-5.7673,5.3283; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Core:f4, !- Name - Floor, !- Surface Type - B_Off_Gro_0, !- Construction Name - Core, !- Zone Name - Ground, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - NoSun, !- Sun Exposure - NoWind, !- Wind Exposure - 1.0, !- View Factor to Ground - 4, !- Number of Vertices - -10.9406,-6.2673,0.0, !- X,Y,Z ==> Vertex 1 {m} - -10.9406,-5.7673,0.0, !- X,Y,Z ==> Vertex 2 {m} - -7.9406,-5.7673,0.0, !- X,Y,Z ==> Vertex 3 {m} - -7.9406,-6.2673,0.0; !- X,Y,Z ==> Vertex 4 {m} - - BuildingSurface:Detailed, - Core:f5, !- Name - Roof, !- Surface Type - B_Off_Rof_0, !- Construction Name - Core, !- Zone Name - Outdoors, !- Outside Boundary Condition - , !- Outside Boundary Condition Object - SunExposed, !- Sun Exposure - WindExposed, !- Wind Exposure - 0.0, !- View Factor to Ground - 4, !- Number of Vertices - -10.9406,-6.2673,5.3283, !- X,Y,Z ==> Vertex 1 {m} - -7.9406,-6.2673,5.3283, !- X,Y,Z ==> Vertex 2 {m} - -7.9406,-5.7673,5.3283, !- X,Y,Z ==> Vertex 3 {m} - -10.9406,-5.7673,5.3283; !- X,Y,Z ==> Vertex 4 {m} - - FenestrationSurface:Detailed, - Perim:f0:w0, !- Name - Window, !- Surface Type - B_Dbl_Air_Cl, !- Construction Name - Perim:f0, !- Building Surface Name - , !- Outside Boundary Condition Object - Autocalculate, !- View Factor to Ground - , !- Frame and Divider Name - 1.0, !- Multiplier - 4, !- Number of Vertices - -8.0406,-7.8653,0.85, !- X,Y,Z ==> Vertex 1 {m} - -8.0406,-7.8653,3.1335, !- X,Y,Z ==> Vertex 2 {m} - -10.8406,-7.8653,3.1335, !- X,Y,Z ==> Vertex 3 {m} - -10.8406,-7.8653,0.85; !- X,Y,Z ==> Vertex 4 {m} - - InternalMass, - PerimInternalMass, !- Name - B_Off_Thm_0, !- Construction Name - Perim, !- Zone or ZoneList Name - 5.03358821325829; !- Surface Area {m2} - - InternalMass, - CoreInternalMass, !- Name - B_Off_Thm_0, !- Construction Name - Core, !- Zone or ZoneList Name - 1.575; !- Surface Area {m2} - - 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 {person/m2} - , !- Zone Floor Area per Person {m2/person} - 0.3, !- Fraction Radiant - AUTOCALCULATE, !- Sensible Heat Fraction - PerimPeopleActivity, !- Activity Level Schedule Name - 3.82e-08, !- Carbon Dioxide Generation Rate {m3/s-W} - No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type - , !- Surface Name/Angle 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 - - People, - People Core, !- Name - Core, !- 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 {person/m2} - , !- Zone Floor Area per Person {m2/person} - 0.3, !- Fraction Radiant - AUTOCALCULATE, !- Sensible Heat Fraction - CorePeopleActivity, !- Activity Level Schedule Name - 3.82e-08, !- Carbon Dioxide Generation Rate {m3/s-W} - No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type - , !- Surface Name/Angle Factor List Name - CoreWorkEfficiency, !- Work Efficiency Schedule Name - DynamicClothingModelASHRAE55, !- Clothing Insulation Calculation Method - , !- Clothing Insulation Calculation Method Schedule Name - , !- Clothing Insulation Schedule Name - CoreAirVelocity, !- 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 {W} - 12.0, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - 0.0, !- Return Air Fraction - 0.42, !- Fraction Radiant - 0.18, !- Fraction Visible - 1.0, !- Fraction Replaceable - ; !- End-Use Subcategory - - Lights, - Core General lighting, !- Name - Core, !- Zone or ZoneList Name - B_Off_Y_Lgt, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Lighting Level {W} - 12.0, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - 0.0, !- Return Air Fraction - 0.42, !- Fraction Radiant - 0.18, !- Fraction Visible - 1.0, !- Fraction Replaceable - ; !- End-Use 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 {W} - 8.0, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - 0.0, !- Fraction Latent - 0.2, !- Fraction Radiant - 0.0, !- Fraction Lost - ; !- End-Use Subcategory - - ElectricEquipment, - Core Equipment 1, !- Name - Core, !- Zone or ZoneList Name - B_Off_Y_Plg, !- Schedule Name - Watts/Area, !- Design Level Calculation Method - , !- Design Level {W} - 8.0, !- Watts per Zone Floor Area {W/m2} - , !- Watts per Person {W/person} - 0.0, !- Fraction Latent - 0.2, !- Fraction Radiant - 0.0, !- Fraction Lost - ; !- End-Use Subcategory - - ZoneInfiltration:DesignFlowRate, - PerimInfiltration, !- Name - Perim, !- Zone or ZoneList Name - On, !- Schedule Name - AirChanges/Hour, !- Design Flow Rate Calculation Method - , !- Design Flow Rate {m3/s} - , !- Flow per Zone Floor Area {m3/s-m2} - , !- Flow per Exterior Surface Area {m3/s-m2} - 0.35, !- Air Changes per Hour {1/hr} - 1.0, !- Constant Term Coefficient - 0.0, !- Temperature Term Coefficient - 0.0, !- Velocity Term Coefficient - 0.0; !- Velocity Squared Term Coefficient - - ZoneInfiltration:DesignFlowRate, - CoreInfiltration, !- Name - Core, !- Zone or ZoneList Name - On, !- Schedule Name - AirChanges/Hour, !- Design Flow Rate Calculation Method - , !- Design Flow Rate {m3/s} - , !- Flow per Zone Floor Area {m3/s-m2} - , !- Flow per Exterior Surface Area {m3/s-m2} - 0.35, !- Air Changes per Hour {1/hr} - 1.0, !- Constant Term Coefficient - 0.0, !- Temperature Term Coefficient - 0.0, !- Velocity Term Coefficient - 0.0; !- Velocity Squared Term Coefficient - - DesignSpecification:OutdoorAir, - PerimMinFreshAir, !- Name - Sum, !- Outdoor Air Method - 2.5e-06, !- Outdoor Air Flow per Person {m3/s-person} - 3e-07, !- Outdoor Air Flow per Zone Floor Area {m3/s-m2} - , !- Outdoor Air Flow per Zone {m3/s} - , !- Outdoor Air Flow Air Changes per Hour {1/hr} - B_Off_Y_Occ; !- Outdoor Air Schedule Name - - DesignSpecification:OutdoorAir, - CoreMinFreshAir, !- Name - Sum, !- Outdoor Air Method - 2.5e-06, !- Outdoor Air Flow per Person {m3/s-person} - 3e-07, !- Outdoor Air Flow per Zone Floor Area {m3/s-m2} - , !- Outdoor Air Flow per Zone {m3/s} - , !- Outdoor Air Flow Air Changes per Hour {1/hr} - B_Off_Y_Occ; !- Outdoor Air Schedule Name - - ZoneControl:Humidistat, - PerimHumidistat, !- Name - Perim, !- Zone Name - PerimHumidMin, !- Humidifying Relative Humidity Setpoint Schedule Name - PerimHumidMax; !- Dehumidifying Relative Humidity Setpoint Schedule Name - - ZoneControl:Humidistat, - CoreHumidistat, !- Name - Core, !- Zone Name - CoreHumidMin, !- Humidifying Relative Humidity Setpoint Schedule Name - CoreHumidMax; !- Dehumidifying Relative Humidity Setpoint Schedule Name - - ZoneControl:Thermostat, - Perim Thermostat, !- Name - Perim, !- Zone or ZoneList Name - PerimZoneControlTypeSched, !- Control Type Schedule Name - ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type - Dual Setpoint - Zone Perim; !- Control 1 Name - - ZoneControl:Thermostat, - Core Thermostat, !- Name - Core, !- Zone or ZoneList Name - CoreZoneControlTypeSched,!- Control Type Schedule Name - ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type - Dual Setpoint - Zone Core; !- Control 1 Name - - ThermostatSetpoint:DualSetpoint, - Dual Setpoint - Zone Perim, !- Name - PerimHeating_SP_Sch, !- Heating Setpoint Temperature Schedule Name - PerimCooling_SP_Sch; !- Cooling Setpoint Temperature Schedule Name - - ThermostatSetpoint:DualSetpoint, - Dual Setpoint - Zone Core, !- Name - CoreHeating_SP_Sch, !- Heating Setpoint Temperature Schedule Name - CoreCooling_SP_Sch; !- Cooling Setpoint Temperature Schedule Name - - ZoneHVAC:IdealLoadsAirSystem, - Perim Ideal Loads Air, !- Name - , !- Availability Schedule Name - Node Perim In, !- Zone Supply Air Node Name - , !- Zone Exhaust Air Node Name - , !- System Inlet Air Node Name - 30.0, !- Maximum Heating Supply Air Temperature {C} - 18.0, !- Minimum Cooling Supply Air Temperature {C} - 0.01, !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir} - 0.008, !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir} - NoLimit, !- Heating Limit - 100.0, !- Maximum Heating Air Flow Rate {m3/s} - , !- Maximum Sensible Heating Capacity {W} - NoLimit, !- Cooling Limit - 100.0, !- Maximum Cooling Air Flow Rate {m3/s} - , !- Maximum Total Cooling Capacity {W} - B_Off_Y_Het, !- Heating Availability Schedule Name - B_Off_Y_Col, !- Cooling Availability Schedule Name - None, !- Dehumidification Control Type - , !- Cooling Sensible Heat Ratio {dimensionless} - None, !- Humidification Control Type - PerimMinFreshAir, !- Design Specification Outdoor Air Object Name - Perim_OutDoorInlet, !- Outdoor Air Inlet Node Name - OccupancySchedule, !- Demand Controlled Ventilation Type - NoEconomizer, !- Outdoor Air Economizer Type - None, !- Heat Recovery Type - 0.7, !- Sensible Heat Recovery Effectiveness {dimensionless} - 0.65; !- Latent Heat Recovery Effectiveness {dimensionless} - - ZoneHVAC:IdealLoadsAirSystem, - Core Ideal Loads Air, !- Name - , !- Availability Schedule Name - Node Core In, !- Zone Supply Air Node Name - , !- Zone Exhaust Air Node Name - , !- System Inlet Air Node Name - 30.0, !- Maximum Heating Supply Air Temperature {C} - 18.0, !- Minimum Cooling Supply Air Temperature {C} - 0.01, !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir} - 0.008, !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir} - NoLimit, !- Heating Limit - 100.0, !- Maximum Heating Air Flow Rate {m3/s} - , !- Maximum Sensible Heating Capacity {W} - NoLimit, !- Cooling Limit - 100.0, !- Maximum Cooling Air Flow Rate {m3/s} - , !- Maximum Total Cooling Capacity {W} - B_Off_Y_Het, !- Heating Availability Schedule Name - B_Off_Y_Col, !- Cooling Availability Schedule Name - None, !- Dehumidification Control Type - , !- Cooling Sensible Heat Ratio {dimensionless} - None, !- Humidification Control Type - CoreMinFreshAir, !- Design Specification Outdoor Air Object Name - Core_OutDoorInlet, !- Outdoor Air Inlet Node Name - OccupancySchedule, !- Demand Controlled Ventilation Type - NoEconomizer, !- Outdoor Air Economizer Type - None, !- Heat Recovery Type - 0.7, !- Sensible Heat Recovery Effectiveness {dimensionless} - 0.65; !- Latent Heat Recovery Effectiveness {dimensionless} - - ZoneHVAC:EquipmentList, - Perim Equipment, !- Name - SequentialLoad, !- Load Distribution Scheme - ZoneHVAC:IdealLoadsAirSystem, !- Zone Equipment 1 Object Type - Perim Ideal Loads Air, !- Zone Equipment 1 Name - 1, !- Zone Equipment 1 Cooling Sequence - 1, !- Zone Equipment 1 Heating or No-Load Sequence - , !- Zone Equipment 1 Sequential Cooling Fraction Schedule Name - ; !- Zone Equipment 1 Sequential Heating Fraction Schedule Name - - ZoneHVAC:EquipmentList, - Core Equipment, !- Name - SequentialLoad, !- Load Distribution Scheme - ZoneHVAC:IdealLoadsAirSystem, !- Zone Equipment 1 Object Type - Core Ideal Loads Air, !- Zone Equipment 1 Name - 1, !- Zone Equipment 1 Cooling Sequence - 1, !- Zone Equipment 1 Heating or No-Load Sequence - , !- Zone Equipment 1 Sequential Cooling Fraction Schedule Name - ; !- Zone Equipment 1 Sequential Heating Fraction Schedule Name - - ZoneHVAC:EquipmentConnections, - Perim, !- Zone Name - Perim Equipment, !- Zone Conditioning Equipment List Name - Perim Inlets, !- Zone Air Inlet Node or NodeList Name - , !- Zone Air Exhaust Node or NodeList Name - Node Perim Zone, !- Zone Air Node Name - Node Perim Out; !- Zone Return Air Node or NodeList Name - - ZoneHVAC:EquipmentConnections, - Core, !- Zone Name - Core Equipment, !- Zone Conditioning Equipment List Name - Core Inlets, !- Zone Air Inlet Node or NodeList Name - , !- Zone Air Exhaust Node or NodeList Name - Node Core Zone, !- Zone Air Node Name - Node Core Out; !- Zone Return Air Node or NodeList Name - - NodeList, - Perim Inlets, !- Name - Node Perim In; !- Node 1 Name - - NodeList, - Core Inlets, !- Name - Node Core In; !- Node 1 Name - - EnergyManagementSystem:Sensor, - OutdoorTemp, !- Name - Environment, !- Output:Variable or Output:Meter Index Key Name - Site Outdoor Air Drybulb Temperature; !- Output:Variable or Output:Meter Name - - EnergyManagementSystem:Sensor, - OutdoorRelHumid, !- Name - Environment, !- Output:Variable or Output:Meter Index Key Name - Site Outdoor Air Relative Humidity; !- Output:Variable or Output:Meter Name - - WaterUse:Equipment, - DHW Perim, !- Name - DHW Perim, !- End-Use Subcategory - 2.7964378962546e-07, !- Peak Flow Rate {m3/s} - B_Off_Y_Dhw, !- Flow Rate Fraction Schedule Name - DHW Supply Temperature Perim, !- Target Temperature Schedule Name - DHW Supply Temperature Perim, !- Hot Water Supply Temperature Schedule Name - DHW Mains Temperature Perim, !- Cold Water Supply Temperature Schedule Name - , !- Zone Name - , !- Sensible Fraction Schedule Name - ; !- Latent Fraction Schedule Name +!- Windows Line endings + +Version, + 9.2; !- Version Identifier + +SimulationControl, + No, !- Do Zone Sizing Calculation + No, !- Do System Sizing Calculation + No, !- Do Plant Sizing Calculation + No, !- Run Simulation for Sizing Periods + Yes; !- Run Simulation for Weather File Run Periods + +Building, + Building, !- Name + 0, !- North Axis + Suburbs, !- Terrain + 0.04, !- Loads Convergence Tolerance Value + 0.4, !- Temperature Convergence Tolerance Value + FullExterior, !- Solar Distribution + 25, !- Maximum Number of Warmup Days + ; !- Minimum Number of Warmup Days + +ShadowCalculation, + AverageOverDaysInFrequency, !- Calculation Method + 20, !- Calculation Frequency + 15000, !- Maximum Figures in Shadow Overlap Calculations + SutherlandHodgman, !- Polygon Clipping Algorithm + SimpleSkyDiffuseModeling; !- Sky Diffuse Modeling Algorithm + +SurfaceConvectionAlgorithm:Inside, + TARP; !- Algorithm + +SurfaceConvectionAlgorithm:Outside, + DOE-2; !- Algorithm + +HeatBalanceAlgorithm, + ConductionTransferFunction, !- Algorithm + 200, !- Surface Temperature Upper Limit + 0.1, !- Minimum Surface Convection Heat Transfer Coefficient Value + 1000.0; !- Maximum Surface Convection Heat Transfer Coefficient Value + +Timestep, + 4; !- Number of Timesteps per Hour + +ConvergenceLimits, + 1, !- Minimum System Timestep + 50; !- Maximum HVAC Iterations + +RunPeriod, + ArchSim, !- Name + 1, !- Begin Month + 1, !- Begin Day of Month + , !- Begin Year + 12, !- End Month + 31, !- End Day of Month + , !- End Year + , !- Day of Week for Start Day + No, !- Use Weather File Holidays and Special Days + No, !- Use Weather File Daylight Saving Period + Yes, !- Apply Weekend Holiday Rule + Yes, !- Use Weather File Rain Indicators + Yes, !- Use Weather File Snow Indicators + ; !- Treat Weather as Actual + +RunPeriodControl:DaylightSavingTime, + Last Sunday in March, !- Start Date + Last Sunday in October; !- End Date + +Site:GroundTemperature:BuildingSurface, + 14, !- January Ground Temperature + 14, !- February Ground Temperature + 14, !- March Ground Temperature + 14, !- April Ground Temperature + 14, !- May Ground Temperature + 14, !- June Ground Temperature + 14, !- July Ground Temperature + 14, !- August Ground Temperature + 14, !- September Ground Temperature + 14, !- October Ground Temperature + 14, !- November Ground Temperature + 14; !- December Ground Temperature + +Site:GroundReflectance, + 0.2, !- January Ground Reflectance + 0.2, !- February Ground Reflectance + 0.2, !- March Ground Reflectance + 0.2, !- April Ground Reflectance + 0.2, !- May Ground Reflectance + 0.2, !- June Ground Reflectance + 0.2, !- July Ground Reflectance + 0.2, !- August Ground Reflectance + 0.2, !- September Ground Reflectance + 0.2, !- October Ground Reflectance + 0.2, !- November Ground Reflectance + 0.2; !- December Ground Reflectance + +Site:GroundReflectance:SnowModifier, + 1.0, !- Ground Reflected Solar Modifier + 1.0; !- Daylighting Ground Reflected Solar Modifier + +ScheduleTypeLimits, + Any Number; !- Name + +ScheduleTypeLimits, + Fraction, !- Name + 0.0, !- Lower Limit Value + 1.0, !- Upper Limit Value + CONTINUOUS; !- Numeric Type + +ScheduleTypeLimits, + Temperature, !- Name + -60.0, !- Lower Limit Value + 200.0, !- Upper Limit Value + CONTINUOUS; !- Numeric Type + +ScheduleTypeLimits, + Control GasType, !- Name + 0.0, !- Lower Limit Value + 4.0, !- Upper Limit Value + DISCRETE; !- Numeric Type + +ScheduleTypeLimits, + On/Off, !- Name + 0.0, !- Lower Limit Value + 1.0, !- Upper Limit Value + DISCRETE; !- Numeric Type + +Schedule:Day:Hourly, + B_Off_D_Occ_WD, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0.1, !- Hour 7 + 0.2, !- Hour 8 + 1, !- Hour 9 + 1, !- Hour 10 + 1, !- Hour 11 + 1, !- Hour 12 + 0.5, !- Hour 13 + 1, !- Hour 14 + 1, !- Hour 15 + 1, !- Hour 16 + 1, !- Hour 17 + 0.3, !- Hour 18 + 0.2, !- Hour 19 + 0.1, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + B_Off_D_Occ_WE, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0.1, !- Hour 7 + 0.1, !- Hour 8 + 0.1, !- Hour 9 + 0.1, !- Hour 10 + 0.1, !- Hour 11 + 0.1, !- Hour 12 + 0.1, !- Hour 13 + 0.1, !- Hour 14 + 0.1, !- Hour 15 + 0.1, !- Hour 16 + 0.1, !- Hour 17 + 0.1, !- Hour 18 + 0.1, !- Hour 19 + 0.1, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + B_Off_D_Het_WD, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 1, !- Hour 7 + 1, !- Hour 8 + 1, !- Hour 9 + 1, !- Hour 10 + 1, !- Hour 11 + 1, !- Hour 12 + 1, !- Hour 13 + 1, !- Hour 14 + 1, !- Hour 15 + 1, !- Hour 16 + 1, !- Hour 17 + 1, !- Hour 18 + 1, !- Hour 19 + 1, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + B_Off_D_Het_WE, !- Name + Fraction, !- 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 + +Schedule:Day:Hourly, + B_Off_D_Off, !- Name + Fraction, !- 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 + +Schedule:Day:Hourly, + B_Off_D_Col_WD, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 1, !- Hour 7 + 1, !- Hour 8 + 1, !- Hour 9 + 1, !- Hour 10 + 1, !- Hour 11 + 1, !- Hour 12 + 1, !- Hour 13 + 1, !- Hour 14 + 1, !- Hour 15 + 1, !- Hour 16 + 1, !- Hour 17 + 1, !- Hour 18 + 1, !- Hour 19 + 1, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + B_Off_D_Col_WE, !- Name + Fraction, !- 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 + +Schedule:Day:Hourly, + B_Off_D_Dhw_WD, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0.2, !- Hour 7 + 0.4, !- Hour 8 + 0.4, !- Hour 9 + 0.4, !- Hour 10 + 0.4, !- Hour 11 + 0.6, !- Hour 12 + 0.6, !- Hour 13 + 0.4, !- Hour 14 + 0.4, !- Hour 15 + 0.4, !- Hour 16 + 0.4, !- Hour 17 + 0.4, !- Hour 18 + 0.4, !- Hour 19 + 0.2, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + B_Off_D_Dhw_WE, !- Name + Fraction, !- Schedule Type Limits Name + 0, !- Hour 1 + 0, !- Hour 2 + 0, !- Hour 3 + 0, !- Hour 4 + 0, !- Hour 5 + 0, !- Hour 6 + 0.1, !- Hour 7 + 0.1, !- Hour 8 + 0.1, !- Hour 9 + 0.1, !- Hour 10 + 0.1, !- Hour 11 + 0.1, !- Hour 12 + 0.1, !- Hour 13 + 0.1, !- Hour 14 + 0.1, !- Hour 15 + 0.1, !- Hour 16 + 0.1, !- Hour 17 + 0.1, !- Hour 18 + 0.1, !- Hour 19 + 0.1, !- Hour 20 + 0, !- Hour 21 + 0, !- Hour 22 + 0, !- Hour 23 + 0; !- Hour 24 + +Schedule:Day:Hourly, + B_Off_D_Lgt_WD, !- Name + Fraction, !- Schedule Type Limits Name + 0.1, !- Hour 1 + 0.1, !- Hour 2 + 0.1, !- Hour 3 + 0.1, !- Hour 4 + 0.1, !- Hour 5 + 0.1, !- Hour 6 + 0.1, !- Hour 7 + 0.3, !- Hour 8 + 1, !- Hour 9 + 1, !- Hour 10 + 1, !- Hour 11 + 1, !- Hour 12 + 0.8, !- Hour 13 + 1, !- Hour 14 + 1, !- Hour 15 + 1, !- Hour 16 + 1, !- Hour 17 + 0.5, !- Hour 18 + 0.3, !- Hour 19 + 0.3, !- Hour 20 + 0.2, !- Hour 21 + 0.2, !- Hour 22 + 0.1, !- Hour 23 + 0.1; !- Hour 24 + +Schedule:Day:Hourly, + B_Off_D_Lgt_WE, !- Name + Fraction, !- Schedule Type Limits Name + 0.1, !- Hour 1 + 0.1, !- Hour 2 + 0.1, !- Hour 3 + 0.1, !- Hour 4 + 0.1, !- Hour 5 + 0.1, !- Hour 6 + 0.1, !- Hour 7 + 0.1, !- Hour 8 + 0.1, !- Hour 9 + 0.1, !- Hour 10 + 0.1, !- Hour 11 + 0.1, !- Hour 12 + 0.1, !- Hour 13 + 0.1, !- Hour 14 + 0.1, !- Hour 15 + 0.1, !- Hour 16 + 0.1, !- Hour 17 + 0.1, !- Hour 18 + 0.1, !- Hour 19 + 0.1, !- Hour 20 + 0.1, !- Hour 21 + 0.1, !- Hour 22 + 0.1, !- Hour 23 + 0.1; !- Hour 24 + +Schedule:Day:Hourly, + B_Off_D_Plg_WD, !- Name + Fraction, !- Schedule Type Limits Name + 0.1, !- Hour 1 + 0.1, !- Hour 2 + 0.1, !- Hour 3 + 0.1, !- Hour 4 + 0.1, !- Hour 5 + 0.1, !- Hour 6 + 0.1, !- Hour 7 + 0.3, !- Hour 8 + 1, !- Hour 9 + 1, !- Hour 10 + 1, !- Hour 11 + 1, !- Hour 12 + 0.8, !- Hour 13 + 1, !- Hour 14 + 1, !- Hour 15 + 1, !- Hour 16 + 1, !- Hour 17 + 1, !- Hour 18 + 0.3, !- Hour 19 + 0.3, !- Hour 20 + 0.2, !- Hour 21 + 0.2, !- Hour 22 + 0.1, !- Hour 23 + 0.1; !- Hour 24 + +Schedule:Day:Hourly, + B_Off_D_Plg_WE, !- Name + Fraction, !- Schedule Type Limits Name + 0.1, !- Hour 1 + 0.1, !- Hour 2 + 0.1, !- Hour 3 + 0.1, !- Hour 4 + 0.1, !- Hour 5 + 0.1, !- Hour 6 + 0.1, !- Hour 7 + 0.1, !- Hour 8 + 0.1, !- Hour 9 + 0.1, !- Hour 10 + 0.1, !- Hour 11 + 0.1, !- Hour 12 + 0.1, !- Hour 13 + 0.1, !- Hour 14 + 0.1, !- Hour 15 + 0.1, !- Hour 16 + 0.1, !- Hour 17 + 0.1, !- Hour 18 + 0.1, !- Hour 19 + 0.1, !- Hour 20 + 0.1, !- Hour 21 + 0.1, !- Hour 22 + 0.1, !- Hour 23 + 0.1; !- Hour 24 + +Schedule:Week:Daily, + B_Off_W_Occ, !- Name + B_Off_D_Occ_WE, !- Sunday ScheduleDay Name + B_Off_D_Occ_WD, !- Monday ScheduleDay Name + B_Off_D_Occ_WD, !- Tuesday ScheduleDay Name + B_Off_D_Occ_WD, !- Wednesday ScheduleDay Name + B_Off_D_Occ_WD, !- Thursday ScheduleDay Name + B_Off_D_Occ_WD, !- Friday ScheduleDay Name + B_Off_D_Occ_WE, !- Saturday ScheduleDay Name + B_Off_D_Occ_WE, !- Holiday ScheduleDay Name + B_Off_D_Occ_WD, !- SummerDesignDay ScheduleDay Name + B_Off_D_Occ_WD, !- WinterDesignDay ScheduleDay Name + B_Off_D_Occ_WD, !- CustomDay1 ScheduleDay Name + B_Off_D_Occ_WD; !- CustomDay2 ScheduleDay Name + +Schedule:Week:Daily, + B_Off_W_Het, !- Name + B_Off_D_Het_WE, !- Sunday ScheduleDay Name + B_Off_D_Het_WD, !- Monday ScheduleDay Name + B_Off_D_Het_WD, !- Tuesday ScheduleDay Name + B_Off_D_Het_WD, !- Wednesday ScheduleDay Name + B_Off_D_Het_WD, !- Thursday ScheduleDay Name + B_Off_D_Het_WD, !- Friday ScheduleDay Name + B_Off_D_Het_WE, !- Saturday ScheduleDay Name + B_Off_D_Het_WE, !- Holiday ScheduleDay Name + B_Off_D_Het_WD, !- SummerDesignDay ScheduleDay Name + B_Off_D_Het_WD, !- WinterDesignDay ScheduleDay Name + B_Off_D_Het_WD, !- CustomDay1 ScheduleDay Name + B_Off_D_Het_WD; !- CustomDay2 ScheduleDay Name + +Schedule:Week:Daily, + B_Off_W_Off, !- Name + B_Off_D_Off, !- Sunday ScheduleDay Name + B_Off_D_Off, !- Monday ScheduleDay Name + B_Off_D_Off, !- Tuesday ScheduleDay Name + B_Off_D_Off, !- Wednesday ScheduleDay Name + B_Off_D_Off, !- Thursday ScheduleDay Name + B_Off_D_Off, !- Friday ScheduleDay Name + B_Off_D_Off, !- Saturday ScheduleDay Name + B_Off_D_Off, !- Holiday ScheduleDay Name + B_Off_D_Off, !- SummerDesignDay ScheduleDay Name + B_Off_D_Off, !- WinterDesignDay ScheduleDay Name + B_Off_D_Off, !- CustomDay1 ScheduleDay Name + B_Off_D_Off; !- CustomDay2 ScheduleDay Name + +Schedule:Week:Daily, + B_Off_W_Col, !- Name + B_Off_D_Col_WE, !- Sunday ScheduleDay Name + B_Off_D_Col_WD, !- Monday ScheduleDay Name + B_Off_D_Col_WD, !- Tuesday ScheduleDay Name + B_Off_D_Col_WD, !- Wednesday ScheduleDay Name + B_Off_D_Col_WD, !- Thursday ScheduleDay Name + B_Off_D_Col_WD, !- Friday ScheduleDay Name + B_Off_D_Col_WE, !- Saturday ScheduleDay Name + B_Off_D_Col_WE, !- Holiday ScheduleDay Name + B_Off_D_Col_WD, !- SummerDesignDay ScheduleDay Name + B_Off_D_Col_WD, !- WinterDesignDay ScheduleDay Name + B_Off_D_Col_WD, !- CustomDay1 ScheduleDay Name + B_Off_D_Col_WD; !- CustomDay2 ScheduleDay Name + +Schedule:Week:Daily, + B_Off_W_Dhw, !- Name + B_Off_D_Dhw_WE, !- Sunday ScheduleDay Name + B_Off_D_Dhw_WD, !- Monday ScheduleDay Name + B_Off_D_Dhw_WD, !- Tuesday ScheduleDay Name + B_Off_D_Dhw_WD, !- Wednesday ScheduleDay Name + B_Off_D_Dhw_WD, !- Thursday ScheduleDay Name + B_Off_D_Dhw_WD, !- Friday ScheduleDay Name + B_Off_D_Dhw_WE, !- Saturday ScheduleDay Name + B_Off_D_Dhw_WE, !- Holiday ScheduleDay Name + B_Off_D_Dhw_WD, !- SummerDesignDay ScheduleDay Name + B_Off_D_Dhw_WD, !- WinterDesignDay ScheduleDay Name + B_Off_D_Dhw_WD, !- CustomDay1 ScheduleDay Name + B_Off_D_Dhw_WD; !- CustomDay2 ScheduleDay Name + +Schedule:Week:Daily, + B_Off_W_Lgt, !- Name + B_Off_D_Lgt_WE, !- Sunday ScheduleDay Name + B_Off_D_Lgt_WD, !- Monday ScheduleDay Name + B_Off_D_Lgt_WD, !- Tuesday ScheduleDay Name + B_Off_D_Lgt_WD, !- Wednesday ScheduleDay Name + B_Off_D_Lgt_WD, !- Thursday ScheduleDay Name + B_Off_D_Lgt_WD, !- Friday ScheduleDay Name + B_Off_D_Lgt_WE, !- Saturday ScheduleDay Name + B_Off_D_Lgt_WE, !- Holiday ScheduleDay Name + B_Off_D_Lgt_WD, !- SummerDesignDay ScheduleDay Name + B_Off_D_Lgt_WD, !- WinterDesignDay ScheduleDay Name + B_Off_D_Lgt_WD, !- CustomDay1 ScheduleDay Name + B_Off_D_Lgt_WD; !- CustomDay2 ScheduleDay Name + +Schedule:Week:Daily, + B_Off_W_Plg, !- Name + B_Off_D_Plg_WE, !- Sunday ScheduleDay Name + B_Off_D_Plg_WD, !- Monday ScheduleDay Name + B_Off_D_Plg_WD, !- Tuesday ScheduleDay Name + B_Off_D_Plg_WD, !- Wednesday ScheduleDay Name + B_Off_D_Plg_WD, !- Thursday ScheduleDay Name + B_Off_D_Plg_WD, !- Friday ScheduleDay Name + B_Off_D_Plg_WE, !- Saturday ScheduleDay Name + B_Off_D_Plg_WE, !- Holiday ScheduleDay Name + B_Off_D_Plg_WD, !- SummerDesignDay ScheduleDay Name + B_Off_D_Plg_WD, !- WinterDesignDay ScheduleDay Name + B_Off_D_Plg_WD, !- CustomDay1 ScheduleDay Name + B_Off_D_Plg_WD; !- CustomDay2 ScheduleDay Name + +Schedule:Year, + B_Off_Y_Occ, !- Name + Fraction, !- Schedule Type Limits Name + B_Off_W_Occ, !- ScheduleWeek Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + B_Off_Y_Het, !- Name + Fraction, !- Schedule Type Limits Name + B_Off_W_Het, !- ScheduleWeek Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 4, !- End Month 1 + 30, !- End Day 1 + B_Off_W_Off, !- ScheduleWeek Name 2 + 5, !- Start Month 2 + 1, !- Start Day 2 + 9, !- End Month 2 + 30, !- End Day 2 + B_Off_W_Het, !- ScheduleWeek Name 3 + 10, !- Start Month 3 + 1, !- Start Day 3 + 12, !- End Month 3 + 31; !- End Day 3 + +Schedule:Year, + B_Off_Y_Col, !- Name + Fraction, !- Schedule Type Limits Name + B_Off_W_Off, !- ScheduleWeek Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 3, !- End Month 1 + 31, !- End Day 1 + B_Off_W_Col, !- ScheduleWeek Name 2 + 4, !- Start Month 2 + 1, !- Start Day 2 + 9, !- End Month 2 + 30, !- End Day 2 + B_Off_W_Off, !- ScheduleWeek Name 3 + 10, !- Start Month 3 + 1, !- Start Day 3 + 12, !- End Month 3 + 31; !- End Day 3 + +Schedule:Year, + B_Off_Y_Dhw, !- Name + Fraction, !- Schedule Type Limits Name + B_Off_W_Dhw, !- ScheduleWeek Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + B_Off_Y_Lgt, !- Name + Fraction, !- Schedule Type Limits Name + B_Off_W_Lgt, !- ScheduleWeek Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Year, + B_Off_Y_Plg, !- Name + Fraction, !- Schedule Type Limits Name + B_Off_W_Plg, !- ScheduleWeek Name 1 + 1, !- Start Month 1 + 1, !- Start Day 1 + 12, !- End Month 1 + 31; !- End Day 1 + +Schedule:Constant, + On, !- Name + On/Off, !- Schedule Type Limits Name + 1; !- Hourly Value + +Schedule:Constant, + Off, !- Name + On/Off, !- Schedule Type Limits Name + 0; !- Hourly Value + +Schedule:Constant, + PerimPeopleActivity, !- Name + Any Number, !- Schedule Type Limits Name + 125.28; !- Hourly Value + +Schedule:Constant, + PerimAirVelocity, !- Name + Any Number, !- Schedule Type Limits Name + 0.2; !- Hourly Value + +Schedule:Constant, + PerimWorkEfficiency, !- Name + Any Number, !- Schedule Type Limits Name + 0; !- Hourly Value + +Schedule:Constant, + PerimHeating_SP_Sch, !- Name + Temperature, !- Schedule Type Limits Name + 20; !- Hourly Value + +Schedule:Constant, + PerimCooling_SP_Sch, !- Name + Temperature, !- Schedule Type Limits Name + 24; !- Hourly Value + +Schedule:Constant, + PerimZoneControlTypeSched, !- Name + Any Number, !- Schedule Type Limits Name + 4; !- Hourly Value + +Schedule:Constant, + PerimHumidMin, !- Name + Any Number, !- Schedule Type Limits Name + 20; !- Hourly Value + +Schedule:Constant, + PerimHumidMax, !- Name + Any Number, !- Schedule Type Limits Name + 80; !- Hourly Value + +Schedule:Constant, + DHW Supply Temperature Perim, !- Name + Temperature, !- Schedule Type Limits Name + 55; !- Hourly Value + +Schedule:Constant, + DHW Mains Temperature Perim, !- Name + Temperature, !- Schedule Type Limits Name + 16; !- Hourly Value + +Schedule:Constant, + CorePeopleActivity, !- Name + Any Number, !- Schedule Type Limits Name + 125.28; !- Hourly Value + +Schedule:Constant, + CoreAirVelocity, !- Name + Any Number, !- Schedule Type Limits Name + 0.2; !- Hourly Value + +Schedule:Constant, + CoreWorkEfficiency, !- Name + Any Number, !- Schedule Type Limits Name + 0; !- Hourly Value + +Schedule:Constant, + CoreHeating_SP_Sch, !- Name + Temperature, !- Schedule Type Limits Name + 20; !- Hourly Value + +Schedule:Constant, + CoreCooling_SP_Sch, !- Name + Temperature, !- Schedule Type Limits Name + 24; !- Hourly Value + +Schedule:Constant, + CoreZoneControlTypeSched, !- Name + Any Number, !- Schedule Type Limits Name + 4; !- Hourly Value + +Schedule:Constant, + CoreHumidMin, !- Name + Any Number, !- Schedule Type Limits Name + 20; !- Hourly Value + +Schedule:Constant, + CoreHumidMax, !- Name + Any Number, !- Schedule Type Limits Name + 80; !- Hourly Value + +Schedule:Constant, + DHW Supply Temperature Core, !- Name + Temperature, !- Schedule Type Limits Name + 55; !- Hourly Value + +Schedule:Constant, + DHW Mains Temperature Core, !- Name + Temperature, !- Schedule Type Limits Name + 16; !- Hourly Value + +Material, + B_Gypsum_Plaster_0.02_B_Off_Thm_0, !- Name + Rough, !- Roughness + 0.02, !- Thickness + 0.42, !- Conductivity + 900, !- Density + 840, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + B_Softwood_General_0.02_B_Off_Thm_0, !- Name + Rough, !- Roughness + 0.02, !- Thickness + 0.13, !- Conductivity + 496, !- Density + 1630, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + +Material, + B_Clay_Brick_H_0.06_B_Off_Fac_0, !- Name + Rough, !- Roughness + 0.06, !- Thickness + 0.41, !- Conductivity + 1000, !- Density + 920, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.5, !- Solar Absorptance + 0.5; !- Visible Absorptance + +Material, + B_XPS_Board_0.02_B_Off_Fac_0, !- Name + Rough, !- Roughness + 0.02, !- Thickness + 0.037, !- Conductivity + 40, !- Density + 1200, !- Specific Heat + 0.6, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + +Material, + B_Concrete_Block_H_0.15_B_Off_Fac_0, !- Name + Rough, !- Roughness + 0.15, !- Thickness + 1.25, !- Conductivity + 880, !- Density + 840, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + B_Fiberglass_Batts_0.05_B_Off_Fac_0, !- Name + Rough, !- Roughness + 0.05, !- Thickness + 0.043, !- Conductivity + 12, !- Density + 840, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + +Material, + B_Gypsum_Board_0.015_B_Off_Fac_0, !- Name + Rough, !- Roughness + 0.015, !- Thickness + 0.16, !- Conductivity + 950, !- Density + 840, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + +Material, + B_Gypsum_Plaster_0.02_B_Off_Par_0, !- Name + Rough, !- Roughness + 0.02, !- Thickness + 0.42, !- Conductivity + 900, !- Density + 840, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + B_Softwood_General_0.02_B_Off_Par_0, !- Name + Rough, !- Roughness + 0.02, !- Thickness + 0.13, !- Conductivity + 496, !- Density + 1630, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + +Material, + B_XPS_Board_0.02_B_Off_Gro_0, !- Name + Rough, !- Roughness + 0.02, !- Thickness + 0.037, !- Conductivity + 40, !- Density + 1200, !- Specific Heat + 0.6, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + +Material, + B_Concrete_RC_Dense_0.15_B_Off_Gro_0, !- Name + Rough, !- Roughness + 0.15, !- Thickness + 1.75, !- Conductivity + 2400, !- Density + 840, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + B_Concrete_MC_Light_0.04_B_Off_Gro_0, !- Name + Rough, !- Roughness + 0.04, !- Thickness + 1.65, !- Conductivity + 2100, !- Density + 1040, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + B_Cement_Mortar_0.03_B_Off_Gro_0, !- Name + Rough, !- Roughness + 0.03, !- Thickness + 0.8, !- Conductivity + 1900, !- Density + 840, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.8, !- Solar Absorptance + 0.8; !- Visible Absorptance + +Material, + B_Ceramic_Tile_0.02_B_Off_Gro_0, !- Name + Rough, !- Roughness + 0.02, !- Thickness + 0.8, !- Conductivity + 2243, !- Density + 840, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.4, !- Solar Absorptance + 0.4; !- Visible Absorptance + +Material, + B_XPS_Board_0.1_B_Off_Rof_0, !- Name + Rough, !- Roughness + 0.1, !- Thickness + 0.037, !- Conductivity + 40, !- Density + 1200, !- Specific Heat + 0.6, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + +Material, + B_Concrete_MC_Light_0.15_B_Off_Rof_0, !- Name + Rough, !- Roughness + 0.15, !- Thickness + 1.65, !- Conductivity + 2100, !- Density + 1040, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + B_Concrete_RC_Dense_0.2_B_Off_Rof_0, !- Name + Rough, !- Roughness + 0.2, !- Thickness + 1.75, !- Conductivity + 2400, !- Density + 840, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + B_Air_Floor_15cm_0.15_B_Off_Rof_0, !- Name + Rough, !- Roughness + 0.15, !- Thickness + 0.7, !- Conductivity + 1.2, !- Density + 1000, !- Specific Heat + 0.01, !- Thermal Absorptance + 0.7, !- Solar Absorptance + 0.7; !- Visible Absorptance + +Material, + B_Gypsum_Board_0.02_B_Off_Rof_0, !- Name + Rough, !- Roughness + 0.02, !- Thickness + 0.16, !- Conductivity + 950, !- Density + 840, !- Specific Heat + 0.9, !- Thermal Absorptance + 0.6, !- Solar Absorptance + 0.6; !- Visible Absorptance + +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 + +WindowMaterial:Gas, + AIR_0.006_B_Dbl_Air_Cl, !- Name + AIR, !- Gas Type + 0.006; !- Thickness + +Construction, + B_Off_Thm_0, !- Name + B_Gypsum_Plaster_0.02_B_Off_Thm_0, !- Outside Layer + B_Softwood_General_0.02_B_Off_Thm_0, !- Layer 2 + B_Gypsum_Plaster_0.02_B_Off_Thm_0; !- Layer 3 + +Construction, + B_Off_Thm_0_FLIPPED, !- Name + B_Gypsum_Plaster_0.02_B_Off_Thm_0, !- Outside Layer + B_Softwood_General_0.02_B_Off_Thm_0, !- Layer 2 + B_Gypsum_Plaster_0.02_B_Off_Thm_0; !- Layer 3 + +Construction, + B_Off_Fac_0, !- Name + B_Clay_Brick_H_0.06_B_Off_Fac_0, !- Outside Layer + B_XPS_Board_0.02_B_Off_Fac_0, !- Layer 2 + B_Concrete_Block_H_0.15_B_Off_Fac_0, !- Layer 3 + B_Fiberglass_Batts_0.05_B_Off_Fac_0, !- Layer 4 + B_Gypsum_Board_0.015_B_Off_Fac_0; !- Layer 5 + +Construction, + B_Off_Fac_0_FLIPPED, !- Name + B_Gypsum_Board_0.015_B_Off_Fac_0, !- Outside Layer + B_Fiberglass_Batts_0.05_B_Off_Fac_0, !- Layer 2 + B_Concrete_Block_H_0.15_B_Off_Fac_0, !- Layer 3 + B_XPS_Board_0.02_B_Off_Fac_0, !- Layer 4 + B_Clay_Brick_H_0.06_B_Off_Fac_0; !- Layer 5 + +Construction, + B_Off_Par_0, !- Name + B_Gypsum_Plaster_0.02_B_Off_Par_0, !- Outside Layer + B_Softwood_General_0.02_B_Off_Par_0, !- Layer 2 + B_Gypsum_Plaster_0.02_B_Off_Par_0; !- Layer 3 + +Construction, + B_Off_Par_0_FLIPPED, !- Name + B_Gypsum_Plaster_0.02_B_Off_Par_0, !- Outside Layer + B_Softwood_General_0.02_B_Off_Par_0, !- Layer 2 + B_Gypsum_Plaster_0.02_B_Off_Par_0; !- Layer 3 + +Construction, + B_Off_Gro_0, !- Name + B_XPS_Board_0.02_B_Off_Gro_0, !- Outside Layer + B_Concrete_RC_Dense_0.15_B_Off_Gro_0, !- Layer 2 + B_Concrete_MC_Light_0.04_B_Off_Gro_0, !- Layer 3 + B_Cement_Mortar_0.03_B_Off_Gro_0, !- Layer 4 + B_Ceramic_Tile_0.02_B_Off_Gro_0; !- Layer 5 + +Construction, + B_Off_Gro_0_FLIPPED, !- Name + B_Ceramic_Tile_0.02_B_Off_Gro_0, !- Outside Layer + B_Cement_Mortar_0.03_B_Off_Gro_0, !- Layer 2 + B_Concrete_MC_Light_0.04_B_Off_Gro_0, !- Layer 3 + B_Concrete_RC_Dense_0.15_B_Off_Gro_0, !- Layer 4 + B_XPS_Board_0.02_B_Off_Gro_0; !- Layer 5 + +Construction, + B_Off_Rof_0, !- Name + B_XPS_Board_0.1_B_Off_Rof_0, !- Outside Layer + B_Concrete_MC_Light_0.15_B_Off_Rof_0, !- Layer 2 + B_Concrete_RC_Dense_0.2_B_Off_Rof_0, !- Layer 3 + B_Air_Floor_15cm_0.15_B_Off_Rof_0, !- Layer 4 + B_Gypsum_Board_0.02_B_Off_Rof_0; !- Layer 5 + +Construction, + B_Off_Rof_0_FLIPPED, !- Name + B_Gypsum_Board_0.02_B_Off_Rof_0, !- Outside Layer + B_Air_Floor_15cm_0.15_B_Off_Rof_0, !- Layer 2 + B_Concrete_RC_Dense_0.2_B_Off_Rof_0, !- Layer 3 + B_Concrete_MC_Light_0.15_B_Off_Rof_0, !- Layer 4 + B_XPS_Board_0.1_B_Off_Rof_0; !- Layer 5 + +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 + +Construction, + B_Dbl_Air_Cl_FLIPPED, !- 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 + +GlobalGeometryRules, + LowerLeftCorner, !- Starting Vertex Position + CounterClockWise, !- Vertex Entry Direction + Relative; !- Coordinate System + +Zone, + Perim, !- Name + 0, !- Direction of Relative North + 0, !- X Origin + 0, !- Y Origin + 0, !- Z Origin + 1, !- Type + 1.0, !- Multiplier + , !- Ceiling Height + 25.5432135170806, !- Volume + 4.79389353643646, !- Floor Area + TARP, !- Zone Inside Convection Algorithm + DOE-2; !- Zone Outside Convection Algorithm + +Zone, + Core, !- Name + 0, !- Direction of Relative North + 0, !- X Origin + 0, !- Y Origin + 0, !- Z Origin + 1, !- Type + 1.0, !- Multiplier + , !- Ceiling Height + 7.99242202280991, !- Volume + 1.5, !- Floor Area + TARP, !- Zone Inside Convection Algorithm + DOE-2; !- Zone Outside Convection Algorithm + +BuildingSurface:Detailed, + Perim:f0, !- Name + Wall, !- Surface Type + B_Off_Fac_0, !- Construction Name + Perim, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5, !- View Factor to Ground + 4, !- Number of Vertices + -7.9406, !- Vertex 1 Xcoordinate + -7.8653, !- Vertex 1 Ycoordinate + 5.3283, !- Vertex 1 Zcoordinate + -10.9406, !- Vertex 2 Xcoordinate + -7.8653, !- Vertex 2 Ycoordinate + 5.3283, !- Vertex 2 Zcoordinate + -10.9406, !- Vertex 3 Xcoordinate + -7.8653, !- Vertex 3 Ycoordinate + 0, !- Vertex 3 Zcoordinate + -7.9406, !- Vertex 4 Xcoordinate + -7.8653, !- Vertex 4 Ycoordinate + 0; !- Vertex 4 Zcoordinate + +BuildingSurface:Detailed, + Perim:f1, !- Name + Wall, !- Surface Type + B_Off_Par_0, !- Construction Name + Perim, !- Zone Name + Surface, !- Outside Boundary Condition + Core:f0, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0, !- View Factor to Ground + 4, !- Number of Vertices + -7.9406, !- Vertex 1 Xcoordinate + -6.2673, !- Vertex 1 Ycoordinate + 5.3283, !- Vertex 1 Zcoordinate + -7.9406, !- Vertex 2 Xcoordinate + -6.2673, !- Vertex 2 Ycoordinate + 0, !- Vertex 2 Zcoordinate + -10.9406, !- Vertex 3 Xcoordinate + -6.2673, !- Vertex 3 Ycoordinate + 0, !- Vertex 3 Zcoordinate + -10.9406, !- Vertex 4 Xcoordinate + -6.2673, !- Vertex 4 Ycoordinate + 5.3283; !- Vertex 4 Zcoordinate + +BuildingSurface:Detailed, + Perim:f2, !- Name + Wall, !- Surface Type + B_Off_Par_0, !- Construction Name + Perim, !- Zone Name + Adiabatic, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0, !- View Factor to Ground + 4, !- Number of Vertices + -7.9406, !- Vertex 1 Xcoordinate + -6.2673, !- Vertex 1 Ycoordinate + 0, !- Vertex 1 Zcoordinate + -7.9406, !- Vertex 2 Xcoordinate + -6.2673, !- Vertex 2 Ycoordinate + 5.3283, !- Vertex 2 Zcoordinate + -7.9406, !- Vertex 3 Xcoordinate + -7.8653, !- Vertex 3 Ycoordinate + 5.3283, !- Vertex 3 Zcoordinate + -7.9406, !- Vertex 4 Xcoordinate + -7.8653, !- Vertex 4 Ycoordinate + 0; !- Vertex 4 Zcoordinate + +BuildingSurface:Detailed, + Perim:f3, !- Name + Wall, !- Surface Type + B_Off_Par_0, !- Construction Name + Perim, !- Zone Name + Adiabatic, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0, !- View Factor to Ground + 4, !- Number of Vertices + -10.9406, !- Vertex 1 Xcoordinate + -6.2673, !- Vertex 1 Ycoordinate + 0, !- Vertex 1 Zcoordinate + -10.9406, !- Vertex 2 Xcoordinate + -7.8653, !- Vertex 2 Ycoordinate + 0, !- Vertex 2 Zcoordinate + -10.9406, !- Vertex 3 Xcoordinate + -7.8653, !- Vertex 3 Ycoordinate + 5.3283, !- Vertex 3 Zcoordinate + -10.9406, !- Vertex 4 Xcoordinate + -6.2673, !- Vertex 4 Ycoordinate + 5.3283; !- Vertex 4 Zcoordinate + +BuildingSurface:Detailed, + Perim:f4, !- Name + Floor, !- Surface Type + B_Off_Gro_0, !- Construction Name + Perim, !- Zone Name + Ground, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 1, !- View Factor to Ground + 4, !- Number of Vertices + -10.9406, !- Vertex 1 Xcoordinate + -7.8653, !- Vertex 1 Ycoordinate + 0, !- Vertex 1 Zcoordinate + -10.9406, !- Vertex 2 Xcoordinate + -6.2673, !- Vertex 2 Ycoordinate + 0, !- Vertex 2 Zcoordinate + -7.9406, !- Vertex 3 Xcoordinate + -6.2673, !- Vertex 3 Ycoordinate + 0, !- Vertex 3 Zcoordinate + -7.9406, !- Vertex 4 Xcoordinate + -7.8653, !- Vertex 4 Ycoordinate + 0; !- Vertex 4 Zcoordinate + +BuildingSurface:Detailed, + Perim:f5, !- Name + Roof, !- Surface Type + B_Off_Rof_0, !- Construction Name + Perim, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0, !- View Factor to Ground + 4, !- Number of Vertices + -10.9406, !- Vertex 1 Xcoordinate + -7.8653, !- Vertex 1 Ycoordinate + 5.3283, !- Vertex 1 Zcoordinate + -7.9406, !- Vertex 2 Xcoordinate + -7.8653, !- Vertex 2 Ycoordinate + 5.3283, !- Vertex 2 Zcoordinate + -7.9406, !- Vertex 3 Xcoordinate + -6.2673, !- Vertex 3 Ycoordinate + 5.3283, !- Vertex 3 Zcoordinate + -10.9406, !- Vertex 4 Xcoordinate + -6.2673, !- Vertex 4 Ycoordinate + 5.3283; !- Vertex 4 Zcoordinate + +BuildingSurface:Detailed, + Core:f0, !- Name + Wall, !- Surface Type + B_Off_Par_0, !- Construction Name + Core, !- Zone Name + Surface, !- Outside Boundary Condition + Perim:f1, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0, !- View Factor to Ground + 4, !- Number of Vertices + -7.9406, !- Vertex 1 Xcoordinate + -6.2673, !- Vertex 1 Ycoordinate + 5.3283, !- Vertex 1 Zcoordinate + -10.9406, !- Vertex 2 Xcoordinate + -6.2673, !- Vertex 2 Ycoordinate + 5.3283, !- Vertex 2 Zcoordinate + -10.9406, !- Vertex 3 Xcoordinate + -6.2673, !- Vertex 3 Ycoordinate + 0, !- Vertex 3 Zcoordinate + -7.9406, !- Vertex 4 Xcoordinate + -6.2673, !- Vertex 4 Ycoordinate + 0; !- Vertex 4 Zcoordinate + +BuildingSurface:Detailed, + Core:f1, !- Name + Wall, !- Surface Type + B_Off_Par_0, !- Construction Name + Core, !- Zone Name + Adiabatic, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0, !- View Factor to Ground + 4, !- Number of Vertices + -7.9406, !- Vertex 1 Xcoordinate + -5.7673, !- Vertex 1 Ycoordinate + 5.3283, !- Vertex 1 Zcoordinate + -7.9406, !- Vertex 2 Xcoordinate + -5.7673, !- Vertex 2 Ycoordinate + 0, !- Vertex 2 Zcoordinate + -10.9406, !- Vertex 3 Xcoordinate + -5.7673, !- Vertex 3 Ycoordinate + 0, !- Vertex 3 Zcoordinate + -10.9406, !- Vertex 4 Xcoordinate + -5.7673, !- Vertex 4 Ycoordinate + 5.3283; !- Vertex 4 Zcoordinate + +BuildingSurface:Detailed, + Core:f2, !- Name + Wall, !- Surface Type + B_Off_Par_0, !- Construction Name + Core, !- Zone Name + Adiabatic, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0, !- View Factor to Ground + 4, !- Number of Vertices + -7.9406, !- Vertex 1 Xcoordinate + -5.7673, !- Vertex 1 Ycoordinate + 0, !- Vertex 1 Zcoordinate + -7.9406, !- Vertex 2 Xcoordinate + -5.7673, !- Vertex 2 Ycoordinate + 5.3283, !- Vertex 2 Zcoordinate + -7.9406, !- Vertex 3 Xcoordinate + -6.2673, !- Vertex 3 Ycoordinate + 5.3283, !- Vertex 3 Zcoordinate + -7.9406, !- Vertex 4 Xcoordinate + -6.2673, !- Vertex 4 Ycoordinate + 0; !- Vertex 4 Zcoordinate + +BuildingSurface:Detailed, + Core:f3, !- Name + Wall, !- Surface Type + B_Off_Par_0, !- Construction Name + Core, !- Zone Name + Adiabatic, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0, !- View Factor to Ground + 4, !- Number of Vertices + -10.9406, !- Vertex 1 Xcoordinate + -5.7673, !- Vertex 1 Ycoordinate + 0, !- Vertex 1 Zcoordinate + -10.9406, !- Vertex 2 Xcoordinate + -6.2673, !- Vertex 2 Ycoordinate + 0, !- Vertex 2 Zcoordinate + -10.9406, !- Vertex 3 Xcoordinate + -6.2673, !- Vertex 3 Ycoordinate + 5.3283, !- Vertex 3 Zcoordinate + -10.9406, !- Vertex 4 Xcoordinate + -5.7673, !- Vertex 4 Ycoordinate + 5.3283; !- Vertex 4 Zcoordinate + +BuildingSurface:Detailed, + Core:f4, !- Name + Floor, !- Surface Type + B_Off_Gro_0, !- Construction Name + Core, !- Zone Name + Ground, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 1, !- View Factor to Ground + 4, !- Number of Vertices + -10.9406, !- Vertex 1 Xcoordinate + -6.2673, !- Vertex 1 Ycoordinate + 0, !- Vertex 1 Zcoordinate + -10.9406, !- Vertex 2 Xcoordinate + -5.7673, !- Vertex 2 Ycoordinate + 0, !- Vertex 2 Zcoordinate + -7.9406, !- Vertex 3 Xcoordinate + -5.7673, !- Vertex 3 Ycoordinate + 0, !- Vertex 3 Zcoordinate + -7.9406, !- Vertex 4 Xcoordinate + -6.2673, !- Vertex 4 Ycoordinate + 0; !- Vertex 4 Zcoordinate + +BuildingSurface:Detailed, + Core:f5, !- Name + Roof, !- Surface Type + B_Off_Rof_0, !- Construction Name + Core, !- Zone Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0, !- View Factor to Ground + 4, !- Number of Vertices + -10.9406, !- Vertex 1 Xcoordinate + -6.2673, !- Vertex 1 Ycoordinate + 5.3283, !- Vertex 1 Zcoordinate + -7.9406, !- Vertex 2 Xcoordinate + -6.2673, !- Vertex 2 Ycoordinate + 5.3283, !- Vertex 2 Zcoordinate + -7.9406, !- Vertex 3 Xcoordinate + -5.7673, !- Vertex 3 Ycoordinate + 5.3283, !- Vertex 3 Zcoordinate + -10.9406, !- Vertex 4 Xcoordinate + -5.7673, !- Vertex 4 Ycoordinate + 5.3283; !- Vertex 4 Zcoordinate + +FenestrationSurface:Detailed, + Perim:f0:w0, !- Name + Window, !- Surface Type + B_Dbl_Air_Cl, !- Construction Name + Perim:f0, !- Building Surface Name + , !- Outside Boundary Condition Object + Autocalculate, !- View Factor to Ground + , !- Frame and Divider Name + 1.0, !- Multiplier + 4, !- Number of Vertices + -8.0406, !- Vertex 1 Xcoordinate + -7.8653, !- Vertex 1 Ycoordinate + 0.85, !- Vertex 1 Zcoordinate + -8.0406, !- Vertex 2 Xcoordinate + -7.8653, !- Vertex 2 Ycoordinate + 3.1335, !- Vertex 2 Zcoordinate + -10.8406, !- Vertex 3 Xcoordinate + -7.8653, !- Vertex 3 Ycoordinate + 3.1335, !- Vertex 3 Zcoordinate + -10.8406, !- Vertex 4 Xcoordinate + -7.8653, !- Vertex 4 Ycoordinate + 0.85; !- Vertex 4 Zcoordinate + +InternalMass, + PerimInternalMass, !- Name + B_Off_Thm_0, !- Construction Name + Perim, !- Zone or ZoneList Name + 5.03358821325829; !- Surface Area + +InternalMass, + CoreInternalMass, !- Name + B_Off_Thm_0, !- Construction Name + Core, !- Zone or ZoneList Name + 1.575; !- Surface Area + +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 + +People, + People Core, !- Name + Core, !- 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 + CorePeopleActivity, !- 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 + CoreWorkEfficiency, !- Work Efficiency Schedule Name + DynamicClothingModelASHRAE55, !- Clothing Insulation Calculation Method + , !- Clothing Insulation Calculation Method Schedule Name + , !- Clothing Insulation Schedule Name + CoreAirVelocity, !- 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 + +Lights, + Core General lighting, !- Name + Core, !- 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 + +ElectricEquipment, + Core Equipment 1, !- Name + Core, !- 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 + +ZoneInfiltration:DesignFlowRate, + PerimInfiltration, !- Name + Perim, !- Zone or ZoneList Name + On, !- Schedule Name + AirChanges/Hour, !- Design Flow Rate Calculation Method + , !- Design Flow Rate + , !- Flow per Zone Floor Area + , !- Flow per Exterior Surface Area + 0.35, !- Air Changes per Hour + 1, !- Constant Term Coefficient + 0, !- Temperature Term Coefficient + 0, !- Velocity Term Coefficient + 0; !- Velocity Squared Term Coefficient + +ZoneInfiltration:DesignFlowRate, + CoreInfiltration, !- Name + Core, !- Zone or ZoneList Name + On, !- Schedule Name + AirChanges/Hour, !- Design Flow Rate Calculation Method + , !- Design Flow Rate + , !- Flow per Zone Floor Area + , !- Flow per Exterior Surface Area + 0.35, !- Air Changes per Hour + 1, !- Constant Term Coefficient + 0, !- Temperature Term Coefficient + 0, !- Velocity Term Coefficient + 0; !- Velocity Squared Term Coefficient + +DesignSpecification:OutdoorAir, + PerimMinFreshAir, !- Name + Sum, !- Outdoor Air Method + 2.5e-06, !- Outdoor Air Flow per Person + 3e-07, !- Outdoor Air Flow per Zone Floor Area + , !- Outdoor Air Flow per Zone + , !- Outdoor Air Flow Air Changes per Hour + B_Off_Y_Occ; !- Outdoor Air Schedule Name + +DesignSpecification:OutdoorAir, + CoreMinFreshAir, !- Name + Sum, !- Outdoor Air Method + 2.5e-06, !- Outdoor Air Flow per Person + 3e-07, !- Outdoor Air Flow per Zone Floor Area + , !- Outdoor Air Flow per Zone + , !- Outdoor Air Flow Air Changes per Hour + B_Off_Y_Occ; !- Outdoor Air Schedule Name + +ZoneControl:Humidistat, + PerimHumidistat, !- Name + Perim, !- Zone Name + PerimHumidMin, !- Humidifying Relative Humidity Setpoint Schedule Name + PerimHumidMax; !- Dehumidifying Relative Humidity Setpoint Schedule Name + +ZoneControl:Humidistat, + CoreHumidistat, !- Name + Core, !- Zone Name + CoreHumidMin, !- Humidifying Relative Humidity Setpoint Schedule Name + CoreHumidMax; !- Dehumidifying Relative Humidity Setpoint Schedule Name + +ZoneControl:Thermostat, + Perim Thermostat, !- Name + Perim, !- Zone or ZoneList Name + PerimZoneControlTypeSched, !- Control Type Schedule Name + ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type + Dual Setpoint - Zone Perim; !- Control 1 Name + +ZoneControl:Thermostat, + Core Thermostat, !- Name + Core, !- Zone or ZoneList Name + CoreZoneControlTypeSched, !- Control Type Schedule Name + ThermostatSetpoint:DualSetpoint, !- Control 1 Object Type + Dual Setpoint - Zone Core; !- Control 1 Name + +ThermostatSetpoint:DualSetpoint, + Dual Setpoint - Zone Perim, !- Name + PerimHeating_SP_Sch, !- Heating Setpoint Temperature Schedule Name + PerimCooling_SP_Sch; !- Cooling Setpoint Temperature Schedule Name + +ThermostatSetpoint:DualSetpoint, + Dual Setpoint - Zone Core, !- Name + CoreHeating_SP_Sch, !- Heating Setpoint Temperature Schedule Name + CoreCooling_SP_Sch; !- Cooling Setpoint Temperature Schedule Name + +ZoneHVAC:IdealLoadsAirSystem, + Perim Ideal Loads Air, !- Name + , !- Availability Schedule Name + Node Perim In, !- Zone Supply Air Node Name + , !- Zone Exhaust Air Node Name + , !- System Inlet Air Node Name + 30.0, !- Maximum Heating Supply Air Temperature + 18.0, !- Minimum Cooling Supply Air Temperature + 0.01, !- Maximum Heating Supply Air Humidity Ratio + 0.008, !- Minimum Cooling Supply Air Humidity Ratio + NoLimit, !- Heating Limit + 100.0, !- Maximum Heating Air Flow Rate + , !- Maximum Sensible Heating Capacity + NoLimit, !- Cooling Limit + 100.0, !- Maximum Cooling Air Flow Rate + , !- Maximum Total Cooling Capacity + B_Off_Y_Het, !- Heating Availability Schedule Name + B_Off_Y_Col, !- Cooling Availability Schedule Name + None, !- Dehumidification Control Type + , !- Cooling Sensible Heat Ratio + None, !- Humidification Control Type + PerimMinFreshAir, !- Design Specification Outdoor Air Object Name + Perim_OutDoorInlet, !- Outdoor Air Inlet Node Name + OccupancySchedule, !- Demand Controlled Ventilation Type + NoEconomizer, !- Outdoor Air Economizer Type + None, !- Heat Recovery Type + 0.7, !- Sensible Heat Recovery Effectiveness + 0.65; !- Latent Heat Recovery Effectiveness + +ZoneHVAC:IdealLoadsAirSystem, + Core Ideal Loads Air, !- Name + , !- Availability Schedule Name + Node Core In, !- Zone Supply Air Node Name + , !- Zone Exhaust Air Node Name + , !- System Inlet Air Node Name + 30.0, !- Maximum Heating Supply Air Temperature + 18.0, !- Minimum Cooling Supply Air Temperature + 0.01, !- Maximum Heating Supply Air Humidity Ratio + 0.008, !- Minimum Cooling Supply Air Humidity Ratio + NoLimit, !- Heating Limit + 100.0, !- Maximum Heating Air Flow Rate + , !- Maximum Sensible Heating Capacity + NoLimit, !- Cooling Limit + 100.0, !- Maximum Cooling Air Flow Rate + , !- Maximum Total Cooling Capacity + B_Off_Y_Het, !- Heating Availability Schedule Name + B_Off_Y_Col, !- Cooling Availability Schedule Name + None, !- Dehumidification Control Type + , !- Cooling Sensible Heat Ratio + None, !- Humidification Control Type + CoreMinFreshAir, !- Design Specification Outdoor Air Object Name + Core_OutDoorInlet, !- Outdoor Air Inlet Node Name + OccupancySchedule, !- Demand Controlled Ventilation Type + NoEconomizer, !- Outdoor Air Economizer Type + None, !- Heat Recovery Type + 0.7, !- Sensible Heat Recovery Effectiveness + 0.65; !- Latent Heat Recovery Effectiveness + +ZoneHVAC:EquipmentList, + Perim Equipment, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:IdealLoadsAirSystem, !- Zone Equipment 1 Object Type + Perim Ideal Loads Air, !- Zone Equipment 1 Name + 1, !- Zone Equipment 1 Cooling Sequence + 1, !- Zone Equipment 1 Heating or NoLoad Sequence + , !- Zone Equipment 1 Sequential Cooling Fraction Schedule Name + ; !- Zone Equipment 1 Sequential Heating Fraction Schedule Name + +ZoneHVAC:EquipmentList, + Core Equipment, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:IdealLoadsAirSystem, !- Zone Equipment 1 Object Type + Core Ideal Loads Air, !- Zone Equipment 1 Name + 1, !- Zone Equipment 1 Cooling Sequence + 1, !- Zone Equipment 1 Heating or NoLoad Sequence + , !- Zone Equipment 1 Sequential Cooling Fraction Schedule Name + ; !- Zone Equipment 1 Sequential Heating Fraction Schedule Name + +ZoneHVAC:EquipmentConnections, + Perim, !- Zone Name + Perim Equipment, !- Zone Conditioning Equipment List Name + Perim Inlets, !- Zone Air Inlet Node or NodeList Name + , !- Zone Air Exhaust Node or NodeList Name + Node Perim Zone, !- Zone Air Node Name + Node Perim Out; !- Zone Return Air Node or NodeList Name + +ZoneHVAC:EquipmentConnections, + Core, !- Zone Name + Core Equipment, !- Zone Conditioning Equipment List Name + Core Inlets, !- Zone Air Inlet Node or NodeList Name + , !- Zone Air Exhaust Node or NodeList Name + Node Core Zone, !- Zone Air Node Name + Node Core Out; !- Zone Return Air Node or NodeList Name + +NodeList, + Perim Inlets, !- Name + Node Perim In; !- Node 1 Name + +NodeList, + Core Inlets, !- Name + Node Core In; !- Node 1 Name + +EnergyManagementSystem:Sensor, + OutdoorTemp, !- Name + Environment, !- OutputVariable or OutputMeter Index Key Name + Site Outdoor Air Drybulb Temperature; !- OutputVariable or OutputMeter Name + +EnergyManagementSystem:Sensor, + OutdoorRelHumid, !- Name + Environment, !- OutputVariable or OutputMeter Index Key Name + Site Outdoor Air Relative Humidity; !- OutputVariable or OutputMeter Name + +WaterUse:Equipment, + DHW Perim, !- Name + DHW Perim, !- EndUse Subcategory + 2.796438e-07, !- Peak Flow Rate + B_Off_Y_Dhw, !- Flow Rate Fraction Schedule Name + DHW Supply Temperature Perim, !- Target Temperature Schedule Name + DHW Supply Temperature Perim, !- Hot Water Supply Temperature Schedule Name + DHW Mains Temperature Perim, !- Cold Water Supply Temperature Schedule Name + , !- Zone Name + , !- Sensible Fraction Schedule Name + ; !- Latent Fraction Schedule Name + +WaterUse:Equipment, + DHW Core, !- Name + DHW Core, !- EndUse Subcategory + 8.75e-08, !- Peak Flow Rate + B_Off_Y_Dhw, !- Flow Rate Fraction Schedule Name + DHW Supply Temperature Core, !- Target Temperature Schedule Name + DHW Supply Temperature Core, !- Hot Water Supply Temperature Schedule Name + DHW Mains Temperature Core, !- Cold Water Supply Temperature Schedule Name + , !- Zone Name + , !- Sensible Fraction Schedule Name + ; !- Latent Fraction Schedule Name + +Output:VariableDictionary, + IDF; !- Key Field + +Output:Surfaces:List, + Details; !- Report Type + +Output:Surfaces:Drawing, + DXF, !- Report Type + Triangulate3DFace; !- Report Specifications 1 + +OUTPUT:SCHEDULES, + Hourly; !- Key Field + +Output:EnergyManagementSystem, + Verbose, !- Actuator Availability Dictionary Reporting + Verbose, !- Internal Variable Availability Dictionary Reporting + Verbose; !- EMS Runtime Language Debug Output Level + +OUTPUT:TABLE:SUMMARYREPORTS, + AllSummary; !- Report 1 Name + +OUTPUTCONTROL:TABLE:STYLE, + CommaAndHTML, !- Column Separator + None; !- Unit Conversion + +Output:Variable, + *, !- Key Value + Zone People Total Heating Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Lights Electric Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Electric Equipment Electric Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Windows Total Transmitted Solar Radiation Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Mean Radiant Temperature, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Mean Air Temperature, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Operative Temperature, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Infiltration Total Heat Loss Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Infiltration Total Heat Gain Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Ventilation Total Heat Loss Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Ventilation Total Heat Gain Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Air Temperature, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Air Relative Humidity, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Ideal Loads Supply Air Total Heating Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Ideal Loads Supply Air Total Cooling Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Ideal Loads Zone Total Heating Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Water Use Equipment Heating Energy, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Infiltration Air Change Rate, !- Variable Name + Monthly; !- Reporting Frequency + +Output:Variable, + *, !- Key Value + Zone Ventilation Air Change Rate, !- Variable Name + Monthly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Air System Total Heating Energy, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Air System Total Cooling Energy, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Zone Ideal Loads Zone Total Cooling Energy, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Zone Ideal Loads Zone Total Heating Energy, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Zone Thermostat Heating Setpoint Temperature, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Zone Thermostat Cooling Setpoint Temperature, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Heat Exchanger Total Heating Rate, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Heat Exchanger Sensible Effectiveness, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Heat Exchanger Latent Effectiveness, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Water Heater Heating Energy, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Air System Outdoor Air Minimum Flow Fraction, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:VARIABLE, + *, !- Key Value + Zone Air Temperature, !- Variable Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + HeatRejection:EnergyTransfer, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Heating:EnergyTransfer, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Cooling:EnergyTransfer, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Heating:DistrictHeating, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Heating:Electricity, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Heating:Gas, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Cooling:DistrictCooling, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Cooling:Electricity, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Cooling:Gas, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + WaterSystems:EnergyTransfer, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Fans:Electricity, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Pumps:Electricity, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Refrigeration:Electricity, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Refrigeration:EnergyTransfer, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + HeatingCoils:EnergyTransfer, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Baseboard:EnergyTransfer, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + HeatRejection:Electricity, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + CoolingCoils:EnergyTransfer, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Electricity:Facility, !- Key Name + hourly; !- Reporting Frequency + +OUTPUT:METER, + Gas:Facility, !- Key Name + hourly; !- Reporting Frequency - WaterUse:Equipment, - DHW Core, !- Name - DHW Core, !- End-Use Subcategory - 8.74999999999998e-08, !- Peak Flow Rate {m3/s} - B_Off_Y_Dhw, !- Flow Rate Fraction Schedule Name - DHW Supply Temperature Core, !- Target Temperature Schedule Name - DHW Supply Temperature Core, !- Hot Water Supply Temperature Schedule Name - DHW Mains Temperature Core, !- Cold Water Supply Temperature Schedule Name - , !- Zone Name - , !- Sensible Fraction Schedule Name - ; !- Latent Fraction Schedule Name +OUTPUT:METER, + WaterSystems:Electricity, !- Key Name + hourly; !- Reporting Frequency - Output:VariableDictionary,IDF; +OUTPUT:METER, + WaterSystems:MainsWater, !- Key Name + hourly; !- Reporting Frequency - Output:Surfaces:List,Details; - - Output:Surfaces:Drawing,DXF,Triangulate3DFace; - - Output:EnergyManagementSystem, - Verbose, !- Actuator Availability Dictionary Reporting - Verbose, !- Internal Variable Availability Dictionary Reporting - Verbose; !- EMS Runtime Language Debug Output Level - - OUTPUT:TABLE:SUMMARYREPORTS, - AllSummary; !- Report 1 Name - - Output:Variable,*,Zone People Total Heating Energy,Monthly; - - Output:Variable,*,Zone Lights Electric Energy,Monthly; - - Output:Variable,*,Zone Electric Equipment Electric Energy,Monthly; - - Output:Variable,*,Zone Windows Total Transmitted Solar Radiation Energy,Monthly; - - Output:Variable,*,Zone Mean Radiant Temperature,Monthly; - - Output:Variable,*,Zone Mean Air Temperature,Monthly; - - Output:Variable,*,Zone Operative Temperature,Monthly; - - Output:Variable,*,Zone Infiltration Total Heat Loss Energy,Monthly; - - Output:Variable,*,Zone Infiltration Total Heat Gain Energy,Monthly; - - Output:Variable,*,Zone Ventilation Total Heat Loss Energy,Monthly; - - Output:Variable,*,Zone Ventilation Total Heat Gain Energy,Monthly; - - Output:Variable,*,Zone Air Temperature,Monthly; - - Output:Variable,*,Zone Air Relative Humidity,Monthly; - - Output:Variable,*,Zone Ideal Loads Supply Air Total Heating Energy,Monthly; - - Output:Variable,*,Zone Ideal Loads Supply Air Total Cooling Energy,Monthly; - - Output:Variable,*,Zone Ideal Loads Zone Total Heating Energy,Monthly; - - Output:Variable,*,Water Use Equipment Heating Energy,Monthly; - - Output:Variable,*,Zone Infiltration Air Change Rate,Monthly; - - Output:Variable,*,Zone Ventilation Air Change Rate,Monthly; - - OUTPUT:VARIABLE,*,Air System Total Heating Energy,hourly; - - OUTPUT:VARIABLE,*,Air System Total Cooling Energy,hourly; - - OUTPUT:METER,HeatRejection:EnergyTransfer,hourly; - - OUTPUT:METER,Heating:EnergyTransfer,hourly; - - OUTPUT:METER,Cooling:EnergyTransfer,hourly; - - OUTPUT:METER,Heating:DistrictHeating,hourly; - - OUTPUT:METER,Heating:Electricity,hourly; - - OUTPUT:METER,Heating:Gas,hourly; - - OUTPUT:METER,Cooling:DistrictCooling,hourly; - - OUTPUT:METER,Cooling:Electricity,hourly; - - OUTPUT:METER,Cooling:Gas,hourly; - - OUTPUT:SQLITE, - SimpleAndTabular; !- Option Type - - Output:Diagnostics, - DisplayAdvancedReportVariables; !- Key 1 +OUTPUT:SQLITE, + SimpleAndTabular; !- Option Type +Output:Diagnostics, + DisplayAdvancedReportVariables; !- Key 1 \ No newline at end of file diff --git a/tests/input_data/umi_samples/BostonTemplateLibrary_2.json b/tests/input_data/umi_samples/BostonTemplateLibrary_2.json index cddb1cb2..702e1796 100755 --- a/tests/input_data/umi_samples/BostonTemplateLibrary_2.json +++ b/tests/input_data/umi_samples/BostonTemplateLibrary_2.json @@ -5069,9 +5069,11 @@ "CoolingCoeffOfPerf": 3.0, "CoolingSetpoint": 24.0, "CoolingLimitType": 0, + "CoolingFuelType": 1, "EconomizerType": 0, "HeatingCoeffOfPerf": 0.9, "HeatingLimitType": 0, + "HeatingFuelType": 2, "HeatingSchedule": { "$ref": "149" }, @@ -5104,9 +5106,11 @@ "CoolingCoeffOfPerf": 3.0, "CoolingSetpoint": 24.0, "CoolingLimitType": 0, + "CoolingFuelType": 1, "EconomizerType": 0, "HeatingCoeffOfPerf": 0.9, "HeatingLimitType": 0, + "HeatingFuelType": 2, "HeatingSchedule": { "$ref": "156" }, @@ -5139,9 +5143,11 @@ "CoolingCoeffOfPerf": 3.0, "CoolingSetpoint": 24.0, "CoolingLimitType": 0, + "CoolingFuelType": 1, "EconomizerType": 0, "HeatingCoeffOfPerf": 0.9, "HeatingLimitType": 0, + "HeatingFuelType": 2, "HeatingSchedule": { "$ref": "142" }, @@ -5509,6 +5515,22 @@ "DataSource": "MIT_SDL", "Name": "B_Off_0 windows" }, + "DefaultWindowToWallRatio": 0.4, + "YearFrom": 0, + "YearTo": 0, + "Country": [ + "USA" + ], + "ClimateZone": [ + "5A" + ], + "Authors": [ + "Carlos Cerezo" + ], + "AuthorEmails": [ + "ccerezo@mit.edu" + ], + "Version": "v1.0", "Category": "Office Spaces", "Comments": "Base building definition for MIT 4433", "DataSource": "MIT_SDL", @@ -5557,6 +5579,22 @@ "DataSource": "MIT_SDL", "Name": "B_Ret_0 windows" }, + "DefaultWindowToWallRatio": 0.4, + "YearFrom": 0, + "YearTo": 0, + "Country": [ + "USA" + ], + "ClimateZone": [ + "5A" + ], + "Authors": [ + "Carlos Cerezo" + ], + "AuthorEmails": [ + "ccerezo@mit.edu" + ], + "Version": "v1.0", "Category": "Retail", "Comments": "Base building definition for MIT 4433", "DataSource": "MIT_SDL", @@ -5605,6 +5643,22 @@ "DataSource": "MIT_SDL", "Name": "B_Res_0 windows" }, + "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", @@ -5625,6 +5679,22 @@ "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", diff --git a/tests/input_data/umi_samples/BostonTemplateLibrary_nodup.json b/tests/input_data/umi_samples/BostonTemplateLibrary_nodup.json new file mode 100644 index 00000000..04d04365 --- /dev/null +++ b/tests/input_data/umi_samples/BostonTemplateLibrary_nodup.json @@ -0,0 +1,4873 @@ +{ + "GasMaterials": [ + { + "$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": null, + "DataSource": null, + "Name": "AIR" + } + ], + "GlazingMaterials": [ + { + "$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": null, + "DataSource": "default", + "Name": "B_Glass_Clear_3" + } + ], + "OpaqueMaterials": [ + { + "$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": null, + "DataSource": "default", + "Name": "B_Wood_Floor" + }, + { + "$id": "11", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.7, + "SpecificHeat": 840.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.7, + "Conductivity": 1.25, + "Cost": 0.0, + "Density": 880.0, + "EmbodiedCarbon": 0.08, + "EmbodiedEnergy": 0.71, + "SubstitutionRatePattern": [ + 0.2 + ], + "SubstitutionTimestep": 50.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Concrete_Block_H" + }, + { + "$id": "13", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.7, + "SpecificHeat": 840.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.7, + "Conductivity": 1.75, + "Cost": 0.0, + "Density": 2400.0, + "EmbodiedCarbon": 0.24, + "EmbodiedEnergy": 2.12, + "SubstitutionRatePattern": [ + 1.0 + ], + "SubstitutionTimestep": 100.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Concrete_RC_Dense" + }, + { + "$id": "14", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.7, + "SpecificHeat": 1040.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.7, + "Conductivity": 1.65, + "Cost": 0.0, + "Density": 2100.0, + "EmbodiedCarbon": 0.24, + "EmbodiedEnergy": 2.12, + "SubstitutionRatePattern": [ + 1.0 + ], + "SubstitutionTimestep": 100.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Concrete_MC_Light" + }, + { + "$id": "16", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.6, + "SpecificHeat": 840.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.6, + "Conductivity": 0.16, + "Cost": 0.0, + "Density": 950.0, + "EmbodiedCarbon": 0.38, + "EmbodiedEnergy": 6.75, + "SubstitutionRatePattern": [ + 0.02, + 0.1, + 1.0 + ], + "SubstitutionTimestep": 20.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Gypsum_Board" + }, + { + "$id": "17", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.5, + "SpecificHeat": 920.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.5, + "Conductivity": 0.41, + "Cost": 0.0, + "Density": 1000.0, + "EmbodiedCarbon": 0.22, + "EmbodiedEnergy": 3.0, + "SubstitutionRatePattern": [ + 0.2 + ], + "SubstitutionTimestep": 50.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Clay_Brick_H" + }, + { + "$id": "18", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.7, + "SpecificHeat": 1000.0, + "ThermalEmittance": 0.01, + "VisibleAbsorptance": 0.7, + "Conductivity": 0.7, + "Cost": 0.0, + "Density": 1.2, + "EmbodiedCarbon": 0.0, + "EmbodiedEnergy": 0.0, + "SubstitutionRatePattern": [ + 1.0 + ], + "SubstitutionTimestep": 100.0, + "TransportCarbon": 0.0, + "TransportDistance": 0.0, + "TransportEnergy": 0.0, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Air_Floor_15cm" + }, + { + "$id": "19", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.4, + "SpecificHeat": 840.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.4, + "Conductivity": 0.8, + "Cost": 0.0, + "Density": 2243.0, + "EmbodiedCarbon": 0.59, + "EmbodiedEnergy": 9.0, + "SubstitutionRatePattern": [ + 0.5, + 1.0 + ], + "SubstitutionTimestep": 20.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Ceramic_Tile" + }, + { + "$id": "20", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.6, + "SpecificHeat": 1200.0, + "ThermalEmittance": 0.6, + "VisibleAbsorptance": 0.6, + "Conductivity": 0.037, + "Cost": 0.0, + "Density": 40.0, + "EmbodiedCarbon": 2.7, + "EmbodiedEnergy": 86.4, + "SubstitutionRatePattern": [ + 0.02, + 0.1, + 1.0 + ], + "SubstitutionTimestep": 20.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_XPS_Board" + }, + { + "$id": "21", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.7, + "SpecificHeat": 840.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.7, + "Conductivity": 0.42, + "Cost": 0.0, + "Density": 900.0, + "EmbodiedCarbon": 0.24, + "EmbodiedEnergy": 3.2, + "SubstitutionRatePattern": [ + 0.02, + 0.1, + 1.0 + ], + "SubstitutionTimestep": 20.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Gypsum_Plaster" + }, + { + "$id": "22", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.8, + "SpecificHeat": 840.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.8, + "Conductivity": 0.8, + "Cost": 0.0, + "Density": 1900.0, + "EmbodiedCarbon": 0.18, + "EmbodiedEnergy": 1.34, + "SubstitutionRatePattern": [ + 0.02, + 0.1, + 1.0 + ], + "SubstitutionTimestep": 20.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Cement_Mortar" + }, + { + "$id": "23", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.7, + "SpecificHeat": 1880.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.7, + "Conductivity": 0.11, + "Cost": 0.0, + "Density": 540.0, + "EmbodiedCarbon": 0.81, + "EmbodiedEnergy": 15.0, + "SubstitutionRatePattern": [ + 0.2 + ], + "SubstitutionTimestep": 30.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Plywood_Board" + }, + { + "$id": "24", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.6, + "SpecificHeat": 840.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.6, + "Conductivity": 0.043, + "Cost": 0.0, + "Density": 12.0, + "EmbodiedCarbon": 1.35, + "EmbodiedEnergy": 28.0, + "SubstitutionRatePattern": [ + 0.5 + ], + "SubstitutionTimestep": 30.0, + "TransportCarbon": 0.067, + "TransportDistance": 1000.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Fiberglass_Batts" + }, + { + "$id": "25", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.7, + "SpecificHeat": 840.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.7, + "Conductivity": 0.045, + "Cost": 0.0, + "Density": 110.0, + "EmbodiedCarbon": 3.89, + "EmbodiedEnergy": 74.4, + "SubstitutionRatePattern": [ + 1.0 + ], + "SubstitutionTimestep": 5.0, + "TransportCarbon": 0.067, + "TransportDistance": 1000.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Urethane_Carpet" + }, + { + "$id": "27", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.6, + "SpecificHeat": 1630.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.6, + "Conductivity": 0.13, + "Cost": 0.0, + "Density": 496.0, + "EmbodiedCarbon": 0.45, + "EmbodiedEnergy": 7.5, + "SubstitutionRatePattern": [ + 0.1, + 0.1, + 1.0 + ], + "SubstitutionTimestep": 20.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Softwood_General" + }, + { + "$id": "30", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.7, + "SpecificHeat": 1000.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.7, + "Conductivity": 0.16, + "Cost": 0.0, + "Density": 1380.0, + "EmbodiedCarbon": 2.41, + "EmbodiedEnergy": 77.2, + "SubstitutionRatePattern": [ + 1.0 + ], + "SubstitutionTimestep": 20.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Vinyl_Cladding" + }, + { + "$id": "31", + "MoistureDiffusionResistance": 50.0, + "Roughness": "Rough", + "SolarAbsorptance": 0.4, + "SpecificHeat": 500.0, + "ThermalEmittance": 0.9, + "VisibleAbsorptance": 0.4, + "Conductivity": 45.3, + "Cost": 0.0, + "Density": 7830.0, + "EmbodiedCarbon": 1.37, + "EmbodiedEnergy": 20.1, + "SubstitutionRatePattern": [ + 1.0 + ], + "SubstitutionTimestep": 100.0, + "TransportCarbon": 0.067, + "TransportDistance": 500.0, + "TransportEnergy": 0.94, + "Category": "Uncategorized", + "Comments": null, + "DataSource": "default", + "Name": "B_Steel_General" + } + ], + "OpaqueConstructions": [ + { + "$id": "33", + "Layers": [ + { + "Material": { + "$ref": "30" + }, + "Thickness": 0.003 + }, + { + "Material": { + "$ref": "20" + }, + "Thickness": 0.01 + }, + { + "Material": { + "$ref": "23" + }, + "Thickness": 0.015 + }, + { + "Material": { + "$ref": "24" + }, + "Thickness": 0.1 + }, + { + "Material": { + "$ref": "16" + }, + "Thickness": 0.015 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Facade", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Fac_0_WF" + }, + { + "$id": "35", + "Layers": [ + { + "Material": { + "$ref": "17" + }, + "Thickness": 0.06 + }, + { + "Material": { + "$ref": "20" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "11" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "24" + }, + "Thickness": 0.05 + }, + { + "Material": { + "$ref": "16" + }, + "Thickness": 0.015 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Facade", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Fac_0" + }, + { + "$id": "36", + "Layers": [ + { + "Material": { + "$ref": "17" + }, + "Thickness": 0.06 + }, + { + "Material": { + "$ref": "20" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "11" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "24" + }, + "Thickness": 0.05 + }, + { + "Material": { + "$ref": "16" + }, + "Thickness": 0.015 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Facade", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Fac_0" + }, + { + "$id": "38", + "Layers": [ + { + "Material": { + "$ref": "14" + }, + "Thickness": 0.1 + }, + { + "Material": { + "$ref": "23" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "24" + }, + "Thickness": 0.12 + }, + { + "Material": { + "$ref": "18" + }, + "Thickness": 0.1 + }, + { + "Material": { + "$ref": "16" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Roof", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Rof_0" + }, + { + "$id": "39", + "Layers": [ + { + "Material": { + "$ref": "20" + }, + "Thickness": 0.1 + }, + { + "Material": { + "$ref": "14" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "13" + }, + "Thickness": 0.2 + }, + { + "Material": { + "$ref": "18" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "16" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Roof", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Rof_0" + }, + { + "$id": "40", + "Layers": [ + { + "Material": { + "$ref": "20" + }, + "Thickness": 0.1 + }, + { + "Material": { + "$ref": "14" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "13" + }, + "Thickness": 0.2 + }, + { + "Material": { + "$ref": "18" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "16" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Roof", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Rof_0" + }, + { + "$id": "41", + "Layers": [ + { + "Material": { + "$ref": "20" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "13" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "14" + }, + "Thickness": 0.04 + }, + { + "Material": { + "$ref": "22" + }, + "Thickness": 0.03 + }, + { + "Material": { + "$ref": "19" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Ground Floor", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Gro_0" + }, + { + "$id": "42", + "Layers": [ + { + "Material": { + "$ref": "20" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "13" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "14" + }, + "Thickness": 0.04 + }, + { + "Material": { + "$ref": "22" + }, + "Thickness": 0.03 + }, + { + "Material": { + "$ref": "19" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Ground Floor", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Gro_0" + }, + { + "$id": "43", + "Layers": [ + { + "Material": { + "$ref": "20" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "13" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "14" + }, + "Thickness": 0.04 + }, + { + "Material": { + "$ref": "22" + }, + "Thickness": 0.03 + }, + { + "Material": { + "$ref": "19" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Ground Floor", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Gro_0" + }, + { + "$id": "44", + "Layers": [ + { + "Material": { + "$ref": "10" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "20" + }, + "Thickness": 0.01 + }, + { + "Material": { + "$ref": "23" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "18" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "16" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Interior Floor", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Inf_0" + }, + { + "$id": "45", + "Layers": [ + { + "Material": { + "$ref": "25" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "22" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "13" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "18" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "16" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Interior Floor", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Inf_0" + }, + { + "$id": "46", + "Layers": [ + { + "Material": { + "$ref": "25" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "22" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "13" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "18" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "16" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Interior Floor", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Inf_0" + }, + { + "$id": "48", + "Layers": [ + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "27" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Partition", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Par_0" + }, + { + "$id": "49", + "Layers": [ + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "27" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Partition", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Par_0" + }, + { + "$id": "50", + "Layers": [ + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "27" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Partition", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Par_0" + }, + { + "$id": "53", + "Layers": [ + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "27" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "ThermalMass", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Thm_0" + }, + { + "$id": "54", + "Layers": [ + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "27" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "ThermalMass", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Thm_0" + }, + { + "$id": "55", + "Layers": [ + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "27" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "21" + }, + "Thickness": 0.02 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "ThermalMass", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Thm_0" + }, + { + "$id": "56", + "Layers": [ + { + "Material": { + "$ref": "17" + }, + "Thickness": 0.06 + }, + { + "Material": { + "$ref": "20" + }, + "Thickness": 0.02 + }, + { + "Material": { + "$ref": "11" + }, + "Thickness": 0.15 + }, + { + "Material": { + "$ref": "24" + }, + "Thickness": 0.05 + }, + { + "Material": { + "$ref": "16" + }, + "Thickness": 0.015 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Facade", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Fac_0_MS" + } + ], + "WindowConstructions": [ + { + "$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" + } + ], + "StructureDefinitions": [ + { + "$id": "62", + "MassRatios": [ + { + "HighLoadRatio": 305.0, + "Material": { + "$ref": "31" + }, + "NormalRatio": 305.0 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Steel", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Str_0" + }, + { + "$id": "63", + "MassRatios": [ + { + "HighLoadRatio": 305.0, + "Material": { + "$ref": "31" + }, + "NormalRatio": 305.0 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Steel", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Str_0" + }, + { + "$id": "64", + "MassRatios": [ + { + "HighLoadRatio": 5.0, + "Material": { + "$ref": "27" + }, + "NormalRatio": 5.0 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Timber", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Str_W_0" + }, + { + "$id": "65", + "MassRatios": [ + { + "HighLoadRatio": 305.0, + "Material": { + "$ref": "31" + }, + "NormalRatio": 305.0 + } + ], + "AssemblyCarbon": 0.0, + "AssemblyCost": 0.0, + "AssemblyEnergy": 0.0, + "DisassemblyCarbon": 0.0, + "DisassemblyEnergy": 0.0, + "Category": "Steel", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Str_S_0" + } + ], + "DaySchedules": [ + { + "$id": "67", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.7, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Occ_WD" + }, + { + "$id": "68", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.7, + 0.7, + 0.7, + 0.7, + 0.7, + 0.3, + 0.3, + 0.3, + 0.3, + 0.7, + 0.7, + 1.0, + 1.0, + 1.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Occ_WE" + }, + { + "$id": "69", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2, + 0.5, + 0.5, + 0.2, + 0.2, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5, + 0.8, + 0.8, + 0.8, + 0.8, + 0.2 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Lgt_WD" + }, + { + "$id": "70", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2, + 0.5, + 0.2, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.5, + 0.8, + 0.8, + 0.8, + 0.8, + 0.2 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Lgt_WE" + }, + { + "$id": "71", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.6, + 0.6, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.6, + 1.0, + 1.0, + 0.8, + 0.8, + 0.6, + 0.6 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Plg_WD" + }, + { + "$id": "72", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.2, + 0.2, + 0.2, + 0.2, + 1.0, + 1.0, + 0.8, + 0.8, + 0.6 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Plg_WE" + }, + { + "$id": "73", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Dhw_WD" + }, + { + "$id": "74", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Dhw_WE" + }, + { + "$id": "75", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Het_WD" + }, + { + "$id": "76", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Het_WE" + }, + { + "$id": "77", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Col_WD" + }, + { + "$id": "78", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Col_WE" + }, + { + "$id": "79", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Nat_WD" + }, + { + "$id": "80", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Nat_WE" + }, + { + "$id": "81", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_D_Off" + }, + { + "$id": "82", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1, + 0.2, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3, + 0.2, + 0.1, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Occ_WD" + }, + { + "$id": "83", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Occ_WE" + }, + { + "$id": "84", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.3, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8, + 1.0, + 1.0, + 1.0, + 1.0, + 0.5, + 0.3, + 0.3, + 0.2, + 0.2, + 0.1, + 0.1 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Lgt_WD" + }, + { + "$id": "85", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Lgt_WE" + }, + { + "$id": "86", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.3, + 1.0, + 1.0, + 1.0, + 1.0, + 0.8, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.3, + 0.3, + 0.2, + 0.2, + 0.1, + 0.1 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Plg_WD" + }, + { + "$id": "87", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Plg_WE" + }, + { + "$id": "88", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2, + 0.4, + 0.4, + 0.4, + 0.4, + 0.6, + 0.6, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.2, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Dhw_WD" + }, + { + "$id": "89", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Dhw_WE" + }, + { + "$id": "90", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Het_WD" + }, + { + "$id": "91", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Het_WE" + }, + { + "$id": "92", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Col_WD" + }, + { + "$id": "93", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Col_WE" + }, + { + "$id": "94", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Nat_WD" + }, + { + "$id": "95", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Nat_WE" + }, + { + "$id": "96", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_D_Off" + }, + { + "$id": "97", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2, + 0.4, + 0.6, + 0.6, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.8, + 0.6, + 0.6, + 0.4, + 0.4, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Occ_WD" + }, + { + "$id": "98", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1, + 0.2, + 0.2, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.2, + 0.1, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Occ_WE" + }, + { + "$id": "101", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.2, + 0.6, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.6, + 0.6, + 0.4, + 0.2, + 0.1, + 0.1 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Plg_WD" + }, + { + "$id": "102", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.2, + 0.2, + 0.4, + 0.4, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.6, + 0.4, + 0.2, + 0.1, + 0.1 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Plg_WE" + }, + { + "$id": "103", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.2, + 0.2, + 0.3, + 0.4, + 0.6, + 0.6, + 0.6, + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.3, + 0.3, + 0.2, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Dhw_WD" + }, + { + "$id": "104", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.1, + 0.3, + 0.3, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.4, + 0.3, + 0.1, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Dhw_WE" + }, + { + "$id": "105", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Het_WD" + }, + { + "$id": "106", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Het_WE" + }, + { + "$id": "107", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Col_WD" + }, + { + "$id": "108", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Col_WE" + }, + { + "$id": "109", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Nat_WD" + }, + { + "$id": "110", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Nat_WE" + }, + { + "$id": "111", + "Category": "Day", + "Type": "Fraction", + "Values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_D_Off" + } + ], + "WeekSchedules": [ + { + "$id": "113", + "Category": "Week", + "Days": [ + { + "$ref": "67" + }, + { + "$ref": "67" + }, + { + "$ref": "67" + }, + { + "$ref": "67" + }, + { + "$ref": "67" + }, + { + "$ref": "68" + }, + { + "$ref": "68" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_W_Occ" + }, + { + "$id": "114", + "Category": "Week", + "Days": [ + { + "$ref": "69" + }, + { + "$ref": "69" + }, + { + "$ref": "69" + }, + { + "$ref": "69" + }, + { + "$ref": "69" + }, + { + "$ref": "70" + }, + { + "$ref": "70" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_W_Lgt" + }, + { + "$id": "115", + "Category": "Week", + "Days": [ + { + "$ref": "71" + }, + { + "$ref": "71" + }, + { + "$ref": "71" + }, + { + "$ref": "71" + }, + { + "$ref": "71" + }, + { + "$ref": "72" + }, + { + "$ref": "72" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_W_Plg" + }, + { + "$id": "116", + "Category": "Week", + "Days": [ + { + "$ref": "73" + }, + { + "$ref": "73" + }, + { + "$ref": "73" + }, + { + "$ref": "73" + }, + { + "$ref": "73" + }, + { + "$ref": "74" + }, + { + "$ref": "74" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_W_Dhw" + }, + { + "$id": "117", + "Category": "Week", + "Days": [ + { + "$ref": "75" + }, + { + "$ref": "75" + }, + { + "$ref": "75" + }, + { + "$ref": "75" + }, + { + "$ref": "75" + }, + { + "$ref": "76" + }, + { + "$ref": "76" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_W_Het" + }, + { + "$id": "118", + "Category": "Week", + "Days": [ + { + "$ref": "77" + }, + { + "$ref": "77" + }, + { + "$ref": "77" + }, + { + "$ref": "77" + }, + { + "$ref": "77" + }, + { + "$ref": "78" + }, + { + "$ref": "78" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_W_Col" + }, + { + "$id": "119", + "Category": "Week", + "Days": [ + { + "$ref": "79" + }, + { + "$ref": "79" + }, + { + "$ref": "79" + }, + { + "$ref": "79" + }, + { + "$ref": "79" + }, + { + "$ref": "80" + }, + { + "$ref": "80" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_W_Nat" + }, + { + "$id": "120", + "Category": "Week", + "Days": [ + { + "$ref": "81" + }, + { + "$ref": "81" + }, + { + "$ref": "81" + }, + { + "$ref": "81" + }, + { + "$ref": "81" + }, + { + "$ref": "81" + }, + { + "$ref": "81" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_W_Off" + }, + { + "$id": "121", + "Category": "Week", + "Days": [ + { + "$ref": "82" + }, + { + "$ref": "82" + }, + { + "$ref": "82" + }, + { + "$ref": "82" + }, + { + "$ref": "82" + }, + { + "$ref": "83" + }, + { + "$ref": "83" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_W_Occ" + }, + { + "$id": "122", + "Category": "Week", + "Days": [ + { + "$ref": "84" + }, + { + "$ref": "84" + }, + { + "$ref": "84" + }, + { + "$ref": "84" + }, + { + "$ref": "84" + }, + { + "$ref": "85" + }, + { + "$ref": "85" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_W_Lgt" + }, + { + "$id": "123", + "Category": "Week", + "Days": [ + { + "$ref": "86" + }, + { + "$ref": "86" + }, + { + "$ref": "86" + }, + { + "$ref": "86" + }, + { + "$ref": "86" + }, + { + "$ref": "87" + }, + { + "$ref": "87" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_W_Plg" + }, + { + "$id": "124", + "Category": "Week", + "Days": [ + { + "$ref": "88" + }, + { + "$ref": "88" + }, + { + "$ref": "88" + }, + { + "$ref": "88" + }, + { + "$ref": "88" + }, + { + "$ref": "89" + }, + { + "$ref": "89" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_W_Dhw" + }, + { + "$id": "125", + "Category": "Week", + "Days": [ + { + "$ref": "90" + }, + { + "$ref": "90" + }, + { + "$ref": "90" + }, + { + "$ref": "90" + }, + { + "$ref": "90" + }, + { + "$ref": "91" + }, + { + "$ref": "91" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_W_Het" + }, + { + "$id": "126", + "Category": "Week", + "Days": [ + { + "$ref": "92" + }, + { + "$ref": "92" + }, + { + "$ref": "92" + }, + { + "$ref": "92" + }, + { + "$ref": "92" + }, + { + "$ref": "93" + }, + { + "$ref": "93" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_W_Col" + }, + { + "$id": "127", + "Category": "Week", + "Days": [ + { + "$ref": "94" + }, + { + "$ref": "94" + }, + { + "$ref": "94" + }, + { + "$ref": "94" + }, + { + "$ref": "94" + }, + { + "$ref": "95" + }, + { + "$ref": "95" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_W_Nat" + }, + { + "$id": "128", + "Category": "Week", + "Days": [ + { + "$ref": "96" + }, + { + "$ref": "96" + }, + { + "$ref": "96" + }, + { + "$ref": "96" + }, + { + "$ref": "96" + }, + { + "$ref": "96" + }, + { + "$ref": "96" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_W_Off" + }, + { + "$id": "129", + "Category": "Week", + "Days": [ + { + "$ref": "97" + }, + { + "$ref": "97" + }, + { + "$ref": "97" + }, + { + "$ref": "97" + }, + { + "$ref": "97" + }, + { + "$ref": "97" + }, + { + "$ref": "98" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_W_Occ" + }, + { + "$id": "131", + "Category": "Week", + "Days": [ + { + "$ref": "101" + }, + { + "$ref": "101" + }, + { + "$ref": "101" + }, + { + "$ref": "101" + }, + { + "$ref": "101" + }, + { + "$ref": "101" + }, + { + "$ref": "102" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_W_Plg" + }, + { + "$id": "132", + "Category": "Week", + "Days": [ + { + "$ref": "103" + }, + { + "$ref": "103" + }, + { + "$ref": "103" + }, + { + "$ref": "103" + }, + { + "$ref": "103" + }, + { + "$ref": "103" + }, + { + "$ref": "104" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_W_Dhw" + }, + { + "$id": "133", + "Category": "Week", + "Days": [ + { + "$ref": "105" + }, + { + "$ref": "105" + }, + { + "$ref": "105" + }, + { + "$ref": "105" + }, + { + "$ref": "105" + }, + { + "$ref": "105" + }, + { + "$ref": "106" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_W_Het" + }, + { + "$id": "134", + "Category": "Week", + "Days": [ + { + "$ref": "107" + }, + { + "$ref": "107" + }, + { + "$ref": "107" + }, + { + "$ref": "107" + }, + { + "$ref": "107" + }, + { + "$ref": "107" + }, + { + "$ref": "108" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_W_Col" + }, + { + "$id": "135", + "Category": "Week", + "Days": [ + { + "$ref": "109" + }, + { + "$ref": "109" + }, + { + "$ref": "109" + }, + { + "$ref": "109" + }, + { + "$ref": "109" + }, + { + "$ref": "109" + }, + { + "$ref": "110" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_W_Nat" + }, + { + "$id": "136", + "Category": "Week", + "Days": [ + { + "$ref": "111" + }, + { + "$ref": "111" + }, + { + "$ref": "111" + }, + { + "$ref": "111" + }, + { + "$ref": "111" + }, + { + "$ref": "111" + }, + { + "$ref": "111" + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_W_Off" + } + ], + "YearSchedules": [ + { + "$id": "138", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "113" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Y_Occ" + }, + { + "$id": "139", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "114" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Y_Lgt" + }, + { + "$id": "140", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "115" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Y_Plg" + }, + { + "$id": "141", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "116" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Y_Dhw" + }, + { + "$id": "142", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 30, + "ToMonth": 4, + "Schedule": { + "$ref": "117" + } + }, + { + "FromDay": 1, + "FromMonth": 5, + "ToDay": 30, + "ToMonth": 9, + "Schedule": { + "$ref": "120" + } + }, + { + "FromDay": 1, + "FromMonth": 10, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "117" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Y_Het" + }, + { + "$id": "143", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 30, + "ToMonth": 6, + "Schedule": { + "$ref": "120" + } + }, + { + "FromDay": 1, + "FromMonth": 7, + "ToDay": 30, + "ToMonth": 9, + "Schedule": { + "$ref": "118" + } + }, + { + "FromDay": 1, + "FromMonth": 10, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "120" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Y_Col" + }, + { + "$id": "144", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 30, + "ToMonth": 4, + "Schedule": { + "$ref": "120" + } + }, + { + "FromDay": 1, + "FromMonth": 5, + "ToDay": 31, + "ToMonth": 10, + "Schedule": { + "$ref": "119" + } + }, + { + "FromDay": 1, + "FromMonth": 11, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "120" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Res_Y_Nat" + }, + { + "$id": "145", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "121" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Y_Occ" + }, + { + "$id": "146", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "122" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Y_Lgt" + }, + { + "$id": "147", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "123" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Y_Plg" + }, + { + "$id": "148", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "124" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Y_Dhw" + }, + { + "$id": "149", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 30, + "ToMonth": 4, + "Schedule": { + "$ref": "125" + } + }, + { + "FromDay": 1, + "FromMonth": 5, + "ToDay": 30, + "ToMonth": 9, + "Schedule": { + "$ref": "128" + } + }, + { + "FromDay": 1, + "FromMonth": 10, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "125" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Y_Het" + }, + { + "$id": "150", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 3, + "Schedule": { + "$ref": "128" + } + }, + { + "FromDay": 1, + "FromMonth": 4, + "ToDay": 30, + "ToMonth": 9, + "Schedule": { + "$ref": "126" + } + }, + { + "FromDay": 1, + "FromMonth": 10, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "128" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Y_Col" + }, + { + "$id": "151", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 3, + "Schedule": { + "$ref": "128" + } + }, + { + "FromDay": 1, + "FromMonth": 4, + "ToDay": 31, + "ToMonth": 10, + "Schedule": { + "$ref": "127" + } + }, + { + "FromDay": 1, + "FromMonth": 11, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "128" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Off_Y_Nat" + }, + { + "$id": "152", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "129" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Y_Occ" + }, + { + "$id": "154", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "131" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Y_Plg" + }, + { + "$id": "155", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "132" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Y_Dhw" + }, + { + "$id": "156", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 30, + "ToMonth": 4, + "Schedule": { + "$ref": "133" + } + }, + { + "FromDay": 1, + "FromMonth": 5, + "ToDay": 30, + "ToMonth": 9, + "Schedule": { + "$ref": "136" + } + }, + { + "FromDay": 1, + "FromMonth": 10, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "133" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Y_Het" + }, + { + "$id": "157", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 30, + "ToMonth": 4, + "Schedule": { + "$ref": "136" + } + }, + { + "FromDay": 1, + "FromMonth": 5, + "ToDay": 30, + "ToMonth": 9, + "Schedule": { + "$ref": "134" + } + }, + { + "FromDay": 1, + "FromMonth": 10, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "136" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Y_Col" + }, + { + "$id": "158", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 30, + "ToMonth": 6, + "Schedule": { + "$ref": "136" + } + }, + { + "FromDay": 1, + "FromMonth": 7, + "ToDay": 30, + "ToMonth": 9, + "Schedule": { + "$ref": "135" + } + }, + { + "FromDay": 1, + "FromMonth": 10, + "ToDay": 31, + "ToMonth": 12, + "Schedule": { + "$ref": "136" + } + } + ], + "Type": "Fraction", + "Comments": "default", + "DataSource": "default", + "Name": "B_Ret_Y_Nat" + } + ], + "DomesticHotWaterSettings": [ + { + "$id": "159", + "FlowRatePerFloorArea": 0.00021, + "IsOn": true, + "WaterSchedule": { + "$ref": "148" + }, + "WaterSupplyTemperature": 55.0, + "WaterTemperatureInlet": 16.0, + "Category": "Office Spaces", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Off_0 hot water" + }, + { + "$id": "160", + "FlowRatePerFloorArea": 6e-05, + "IsOn": true, + "WaterSchedule": { + "$ref": "155" + }, + "WaterSupplyTemperature": 55.0, + "WaterTemperatureInlet": 16.0, + "Category": "Retail", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Ret_0 hot water" + }, + { + "$id": "161", + "FlowRatePerFloorArea": 0.00049, + "IsOn": true, + "WaterSchedule": { + "$ref": "141" + }, + "WaterSupplyTemperature": 55.0, + "WaterTemperatureInlet": 16.0, + "Category": "Residential and Lodging", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Res_0 hot water" + } + ], + "VentilationSettings": [ + { + "$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" + }, + { + "$id": "163", + "Afn": false, + "IsBuoyancyOn": true, + "Infiltration": 0.35, + "IsInfiltrationOn": true, + "IsNatVentOn": false, + "IsScheduledVentilationOn": false, + "NatVentMaxRelHumidity": 80.0, + "NatVentMaxOutdoorAirTemp": 26.0, + "NatVentMinOutdoorAirTemp": 20.0, + "NatVentSchedule": { + "$ref": "158" + }, + "NatVentZoneTempSetpoint": 22.0, + "ScheduledVentilationAch": 0.6, + "ScheduledVentilationSchedule": { + "$ref": "158" + }, + "ScheduledVentilationSetpoint": 22.0, + "IsWindOn": false, + "Category": "Retail", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Ret_0 ventilation" + }, + { + "$id": "164", + "Afn": false, + "IsBuoyancyOn": true, + "Infiltration": 0.35, + "IsInfiltrationOn": true, + "IsNatVentOn": false, + "IsScheduledVentilationOn": false, + "NatVentMaxRelHumidity": 80.0, + "NatVentMaxOutdoorAirTemp": 26.0, + "NatVentMinOutdoorAirTemp": 18.0, + "NatVentSchedule": { + "$ref": "144" + }, + "NatVentZoneTempSetpoint": 22.0, + "ScheduledVentilationAch": 0.6, + "ScheduledVentilationSchedule": { + "$ref": "144" + }, + "ScheduledVentilationSetpoint": 22.0, + "IsWindOn": false, + "Category": "Residential and Lodging", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Res_0 ventilation" + } + ], + "ZoneConditionings": [ + { + "$id": "165", + "CoolingSchedule": { + "$ref": "150" + }, + "CoolingCoeffOfPerf": 3.0, + "CoolingSetpoint": 24.0, + "CoolingLimitType": 0, + "CoolingFuelType": 1, + "EconomizerType": 0, + "HeatingCoeffOfPerf": 0.9, + "HeatingLimitType": 0, + "HeatingFuelType": 2, + "HeatingSchedule": { + "$ref": "149" + }, + "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": "145" + }, + "MinFreshAirPerArea": 0.0003, + "MinFreshAirPerPerson": 0.0025, + "Category": "Office Spaces", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Off_0 conditioning" + }, + { + "$id": "166", + "CoolingSchedule": { + "$ref": "157" + }, + "CoolingCoeffOfPerf": 3.0, + "CoolingSetpoint": 24.0, + "CoolingLimitType": 0, + "CoolingFuelType": 1, + "EconomizerType": 0, + "HeatingCoeffOfPerf": 0.9, + "HeatingLimitType": 0, + "HeatingFuelType": 2, + "HeatingSchedule": { + "$ref": "156" + }, + "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": "152" + }, + "MinFreshAirPerArea": 0.0006, + "MinFreshAirPerPerson": 0.0, + "Category": "Retail", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Ret_0 conditioning" + }, + { + "$id": "167", + "CoolingSchedule": { + "$ref": "143" + }, + "CoolingCoeffOfPerf": 3.0, + "CoolingSetpoint": 24.0, + "CoolingLimitType": 0, + "CoolingFuelType": 1, + "EconomizerType": 0, + "HeatingCoeffOfPerf": 0.9, + "HeatingLimitType": 0, + "HeatingFuelType": 2, + "HeatingSchedule": { + "$ref": "142" + }, + "HeatingSetpoint": 20.0, + "HeatRecoveryEfficiencyLatent": 0.65, + "HeatRecoveryEfficiencySensible": 0.7, + "HeatRecoveryType": 0, + "IsCoolingOn": true, + "IsHeatingOn": true, + "IsMechVentOn": false, + "MaxCoolFlow": 100.0, + "MaxCoolingCapacity": 100.0, + "MaxHeatFlow": 100.0, + "MaxHeatingCapacity": 100.0, + "MechVentSchedule": { + "$ref": "138" + }, + "MinFreshAirPerArea": 0.0, + "MinFreshAirPerPerson": 0.0, + "Category": "Residential and Lodging", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Res_0 conditioning" + } + ], + "ZoneConstructionSets": [ + { + "$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" + }, + { + "$id": "169", + "Facade": { + "$ref": "36" + }, + "Ground": { + "$ref": "43" + }, + "Partition": { + "$ref": "49" + }, + "Roof": { + "$ref": "40" + }, + "Slab": { + "$ref": "46" + }, + "IsFacadeAdiabatic": false, + "IsGroundAdiabatic": false, + "IsPartitionAdiabatic": false, + "IsRoofAdiabatic": false, + "IsSlabAdiabatic": false, + "Category": "Retail", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Ret_0 constructions" + }, + { + "$id": "170", + "Facade": { + "$ref": "56" + }, + "Ground": { + "$ref": "41" + }, + "Partition": { + "$ref": "50" + }, + "Roof": { + "$ref": "38" + }, + "Slab": { + "$ref": "44" + }, + "IsFacadeAdiabatic": false, + "IsGroundAdiabatic": false, + "IsPartitionAdiabatic": false, + "IsRoofAdiabatic": false, + "IsSlabAdiabatic": false, + "Category": "Residential and Lodging", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Res_0_MS constructions" + }, + { + "$id": "171", + "Facade": { + "$ref": "33" + }, + "Ground": { + "$ref": "41" + }, + "Partition": { + "$ref": "50" + }, + "Roof": { + "$ref": "38" + }, + "Slab": { + "$ref": "44" + }, + "IsFacadeAdiabatic": false, + "IsGroundAdiabatic": false, + "IsPartitionAdiabatic": false, + "IsRoofAdiabatic": false, + "IsSlabAdiabatic": false, + "Category": "Residential and Lodging", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Res_0_WF constructions" + } + ], + "ZoneLoads": [ + { + "$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": "173", + "DimmingType": 1, + "EquipmentAvailabilitySchedule": { + "$ref": "154" + }, + "EquipmentPowerDensity": 6.0, + "IlluminanceTarget": 300.0, + "LightingPowerDensity": 16.0, + "LightsAvailabilitySchedule": { + "$ref": "154" + }, + "OccupancySchedule": { + "$ref": "152" + }, + "IsEquipmentOn": true, + "IsLightingOn": true, + "IsPeopleOn": true, + "PeopleDensity": 0.1, + "Category": "Retail", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Ret_0 loads" + }, + { + "$id": "174", + "DimmingType": 1, + "EquipmentAvailabilitySchedule": { + "$ref": "140" + }, + "EquipmentPowerDensity": 4.0, + "IlluminanceTarget": 200.0, + "LightingPowerDensity": 7.0, + "LightsAvailabilitySchedule": { + "$ref": "139" + }, + "OccupancySchedule": { + "$ref": "138" + }, + "IsEquipmentOn": true, + "IsLightingOn": true, + "IsPeopleOn": true, + "PeopleDensity": 0.025, + "Category": "Residential and Lodging", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Res_0 loads" + } + ], + "Zones": [ + { + "$id": "175", + "Conditioning": { + "$ref": "165" + }, + "Constructions": { + "$ref": "168" + }, + "DaylightMeshResolution": 1.0, + "DaylightWorkplaneHeight": 0.8, + "DomesticHotWater": { + "$ref": "159" + }, + "InternalMassConstruction": { + "$ref": "54" + }, + "InternalMassExposedPerFloorArea": 1.1, + "Loads": { + "$ref": "172" + }, + "Ventilation": { + "$ref": "162" + }, + "Category": "Office Spaces", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Off_0" + }, + { + "$id": "176", + "Conditioning": { + "$ref": "166" + }, + "Constructions": { + "$ref": "169" + }, + "DaylightMeshResolution": 1.0, + "DaylightWorkplaneHeight": 0.8, + "DomesticHotWater": { + "$ref": "160" + }, + "InternalMassConstruction": { + "$ref": "55" + }, + "InternalMassExposedPerFloorArea": 0.45, + "Loads": { + "$ref": "173" + }, + "Ventilation": { + "$ref": "163" + }, + "Category": "Retail", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Ret_0" + }, + { + "$id": "177", + "Conditioning": { + "$ref": "167" + }, + "Constructions": { + "$ref": "170" + }, + "DaylightMeshResolution": 1.0, + "DaylightWorkplaneHeight": 0.8, + "DomesticHotWater": { + "$ref": "161" + }, + "InternalMassConstruction": { + "$ref": "53" + }, + "InternalMassExposedPerFloorArea": 0.9, + "Loads": { + "$ref": "174" + }, + "Ventilation": { + "$ref": "164" + }, + "Category": "Residential and Lodging", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Res_0_MS" + }, + { + "$id": "178", + "Conditioning": { + "$ref": "167" + }, + "Constructions": { + "$ref": "171" + }, + "DaylightMeshResolution": 1.0, + "DaylightWorkplaneHeight": 0.8, + "DomesticHotWater": { + "$ref": "161" + }, + "InternalMassConstruction": { + "$ref": "53" + }, + "InternalMassExposedPerFloorArea": 0.9, + "Loads": { + "$ref": "174" + }, + "Ventilation": { + "$ref": "164" + }, + "Category": "Residential and Lodging", + "Comments": null, + "DataSource": "MIT_SDL", + "Name": "B_Res_0_WF" + } + ], + "WindowSettings": [ + { + "$id": "179", + "AfnDischargeC": 0.65, + "AfnTempSetpoint": 20.0, + "AfnWindowAvailability": { + "$ref": "145" + }, + "Construction": { + "$ref": "57" + }, + "IsShadingSystemOn": false, + "IsVirtualPartition": false, + "IsZoneMixingOn": false, + "OperableArea": 0.8, + "ShadingSystemAvailabilitySchedule": { + "$ref": "145" + }, + "ShadingSystemSetpoint": 350.0, + "ShadingSystemTransmittance": 0.5, + "ShadingSystemType": 0, + "Type": 0, + "ZoneMixingAvailabilitySchedule": { + "$ref": "145" + }, + "ZoneMixingDeltaTemperature": 2.0, + "ZoneMixingFlowRate": 0.001, + "Category": "Office Spaces", + "Comments": "Base building definition for MIT 4433", + "DataSource": "MIT_SDL", + "Name": "B_Off_0 windows" + }, + { + "$id": "180", + "AfnDischargeC": 0.65, + "AfnTempSetpoint": 20.0, + "AfnWindowAvailability": { + "$ref": "152" + }, + "Construction": { + "$ref": "57" + }, + "IsShadingSystemOn": false, + "IsVirtualPartition": false, + "IsZoneMixingOn": false, + "OperableArea": 0.8, + "ShadingSystemAvailabilitySchedule": { + "$ref": "152" + }, + "ShadingSystemSetpoint": 0.5, + "ShadingSystemTransmittance": 0.5, + "ShadingSystemType": 0, + "Type": 0, + "ZoneMixingAvailabilitySchedule": { + "$ref": "152" + }, + "ZoneMixingDeltaTemperature": 2.0, + "ZoneMixingFlowRate": 0.001, + "Category": "Retail", + "Comments": "Base building definition for MIT 4433", + "DataSource": "MIT_SDL", + "Name": "B_Ret_0 windows" + }, + { + "$id": "181", + "AfnDischargeC": 0.65, + "AfnTempSetpoint": 20.0, + "AfnWindowAvailability": { + "$ref": "138" + }, + "Construction": { + "$ref": "57" + }, + "IsShadingSystemOn": false, + "IsVirtualPartition": false, + "IsZoneMixingOn": false, + "OperableArea": 0.8, + "ShadingSystemAvailabilitySchedule": { + "$ref": "138" + }, + "ShadingSystemSetpoint": 0.5, + "ShadingSystemTransmittance": 0.5, + "ShadingSystemType": 0, + "Type": 0, + "ZoneMixingAvailabilitySchedule": { + "$ref": "138" + }, + "ZoneMixingDeltaTemperature": 2.0, + "ZoneMixingFlowRate": 0.001, + "Category": "Residential and Lodging", + "Comments": "Base building definition for MIT 4433", + "DataSource": "MIT_SDL", + "Name": "B_Res_0 windows" + } + ], + "BuildingTemplates": [ + { + "Core": { + "$ref": "175" + }, + "Lifespan": 60, + "PartitionRatio": 0.35, + "Perimeter": { + "$ref": "175" + }, + "Structure": { + "$ref": "62" + }, + "Windows": { + "$ref": "179" + }, + "Category": "Office Spaces", + "Comments": "Base building definition for MIT 4433", + "DataSource": "MIT_SDL", + "Name": "B_Off_0", + "YearFrom": 0, + "YearTo": 0, + "Country": [ + "USA" + ], + "ClimateZone": [ + "5A" + ], + "Authors": [ + "Carlos Cerezo" + ], + "AuthorEmails": [ + "ccerezo@mit.edu" + ], + "Version": "v1.0" + }, + { + "Core": { + "$ref": "176" + }, + "Lifespan": 60, + "PartitionRatio": 0.15, + "Perimeter": { + "$ref": "176" + }, + "Structure": { + "$ref": "63" + }, + "Windows": { + "$ref": "180" + }, + "Category": "Retail", + "Comments": "Base building definition for MIT 4433", + "DataSource": "MIT_SDL", + "Name": "B_Ret_0", + "YearFrom": 0, + "YearTo": 0, + "Country": [ + "USA" + ], + "ClimateZone": [ + "5A" + ], + "Authors": [ + "Carlos Cerezo" + ], + "AuthorEmails": [ + "ccerezo@mit.edu" + ], + "Version": "v1.0" + }, + { + "Core": { + "$ref": "177" + }, + "Lifespan": 60, + "PartitionRatio": 0.3, + "Perimeter": { + "$ref": "177" + }, + "Structure": { + "$ref": "65" + }, + "Windows": { + "$ref": "181" + }, + "Category": "Residential and Lodging", + "Comments": "Base building definition for MIT 4433", + "DataSource": "MIT_SDL", + "Name": "B_Res_0_Masonry", + "YearFrom": 0, + "YearTo": 0, + "Country": [ + "USA" + ], + "ClimateZone": [ + "5A" + ], + "Authors": [ + "Carlos Cerezo" + ], + "AuthorEmails": [ + "ccerezo@mit.edu" + ], + "Version": "v1.0" + }, + { + "Core": { + "$ref": "178" + }, + "Lifespan": 60, + "PartitionRatio": 0.3, + "Perimeter": { + "$ref": "178" + }, + "Structure": { + "$ref": "64" + }, + "Windows": { + "$ref": "181" + }, + "Category": "Residential and Lodging", + "Comments": "Base building definition for MIT 4433", + "DataSource": "MIT_SDL", + "Name": "B_Res_0_WoodFrame", + "YearFrom": 0, + "YearTo": 0, + "Country": [ + "USA" + ], + "ClimateZone": [ + "5A" + ], + "Authors": [ + "Carlos Cerezo" + ], + "AuthorEmails": [ + "ccerezo@mit.edu" + ], + "Version": "v1.0" + } + ] +} \ No newline at end of file diff --git a/tests/test_cli.py b/tests/test_cli.py index f0c18898..de2df2bc 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -4,300 +4,23 @@ from click.testing import CliRunner from path import Path -from archetypal import settings, copy_file, log, load_idf +from archetypal import settings from archetypal.cli import cli -from tests.test_trnsys import get_platform +from archetypal.utils import log class TestCli: """Defines tests for usage of the archetypal Command Line Interface""" - @pytest.fixture( - params=[ - [ - 1, - "--use-cache", - "--cache-folder", - "tests/.temp/cache", - "--data-folder", - "tests/.temp/data", - "--imgs-folder", - "tests/.temp/images", - "--logs-folder", - "tests/.temp/logs", - "--verbose", - "convert", - "--ep_version", - "9-2-0", - "tests/input_data/trnsys/simple_2_zone.idf", - "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", - "--trnsidf_exe", - "docker/trnsidf/trnsidf.exe", - ], - [ - 2, - "--use-cache", - "--cache-folder", - "tests/.temp/cache", - "--data-folder", - "tests/.temp/data", - "--imgs-folder", - "tests/.temp/images", - "--logs-folder", - "tests/.temp/logs", - "--verbose", - "convert", - "--ep_version", - "9-2-0", - "-i", - "-t", - "-d", - "tests/input_data/trnsys/simple_2_zone.idf", - "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", - "--trnsidf_exe", - "docker/trnsidf/trnsidf.exe", - ], - [ - 3, - "--use-cache", - "--cache-folder", - "tests/.temp/cache", - "--data-folder", - "tests/.temp/data", - "--imgs-folder", - "tests/.temp/images", - "--logs-folder", - "tests/.temp/logs", - "--verbose", - "convert", - "--ep_version", - "9-2-0", - "--window_lib", - "archetypal/ressources/W74-lib.dat", - "tests/input_data/trnsys/simple_2_zone.idf", - "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", - "--trnsidf_exe", - "docker/trnsidf/trnsidf.exe", - ], - [ - 4, - "--use-cache", - "--cache-folder", - "tests/.temp/cache", - "--data-folder", - "tests/.temp/data", - "--imgs-folder", - "tests/.temp/images", - "--logs-folder", - "tests/.temp/logs", - "--verbose", - "convert", - "--ep_version", - "9-2-0", - "--template", - "archetypal/ressources/NewFileTemplate.d18", - "tests/input_data/trnsys/simple_2_zone.idf", - "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", - "--trnsidf_exe", - "docker/trnsidf/trnsidf.exe", - ], - [ - 5, - "--use-cache", - "--cache-folder", - "tests/.temp/cache", - "--data-folder", - "tests/.temp/data", - "--imgs-folder", - "tests/.temp/images", - "--logs-folder", - "tests/.temp/logs", - "--verbose", - "convert", - "--ep_version", - "9-2-0", - "--log_clear_names", - "tests/input_data/trnsys/simple_2_zone.idf", - "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", - "--trnsidf_exe", - "docker/trnsidf/trnsidf.exe", - ], - [ - 6, - "--use-cache", - "--cache-folder", - "tests/.temp/cache", - "--data-folder", - "tests/.temp/data", - "--imgs-folder", - "tests/.temp/images", - "--logs-folder", - "tests/.temp/logs", - "--verbose", - "convert", - "--ep_version", - "9-2-0", - "--window", - 1.5, - 0.6, - 0.81, - 0.1, - 0.13, - 5.6, - "tests/input_data/trnsys/simple_2_zone.idf", - "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", - "--trnsidf_exe", - "docker/trnsidf/trnsidf.exe", - ], - [ - 7, - "--use-cache", - "--cache-folder", - "tests/.temp/cache", - "--data-folder", - "tests/.temp/data", - "--imgs-folder", - "tests/.temp/images", - "--logs-folder", - "tests/.temp/logs", - "--verbose", - "convert", - "--ep_version", - "9-2-0", - "--ordered", - "tests/input_data/trnsys/simple_2_zone.idf", - "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", - "--trnsidf_exe", - "docker/trnsidf/trnsidf.exe", - ], - [ - 8, - "--use-cache", - "--cache-folder", - "tests/.temp/cache", - "--data-folder", - "tests/.temp/data", - "--imgs-folder", - "tests/.temp/images", - "--logs-folder", - "tests/.temp/logs", - "--verbose", - "convert", - "--ep_version", - "9-2-0", - "--nonum", - "-N", - "--geofloor", - 0.6, - "--refarea", - "--volume", - "--capacitance", - "tests/input_data/trnsys/simple_2_zone.idf", - "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", - "--trnsidf_exe", - "docker/trnsidf/trnsidf.exe", - ], - [ - 9, - "--use-cache", - "--cache-folder", - "tests/.temp/cache", - "--data-folder", - "tests/.temp/data", - "--imgs-folder", - "tests/.temp/images", - "--logs-folder", - "tests/.temp/logs", - "--verbose", - "convert", - "--ep_version", - "9-2-0", - "--schedule_as_input", - "tests/input_data/trnsys/simple_2_zone.idf", - "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", - "--trnsidf_exe", - "docker/trnsidf/trnsidf.exe", - ], - ] - ) - def cli_args(config, request): - if request.param[0] == 1: - print("Runs convert cli with EnergyPlus version 9-1-0") - elif request.param[0] == 2: - print( - "Runs convert cli with EnergyPlus version 9-1-0 AND returns paths to " - "modified IDF, T3D file and the DCK file" - ) - elif request.param[0] == 3: - print( - "Runs convert cli with EnergyPlus version 9-1-0 AND a given window library" - ) - elif request.param[0] == 4: - print( - "Runs convert cli with EnergyPlus version 9-1-0 AND a given d18 template" - ) - elif request.param[0] == 5: - print( - "Runs convert cli with EnergyPlus version 9-1-0 AND without logging " - "in console the equivalence between" - " old and new names" - ) - elif request.param[0] == 6: - print( - "Runs convert cli with EnergyPlus version 9-1-0 AND given window parameters " - "(u-value, shgc, t_vis, etc.) to find in default window library" - ) - elif request.param[0] == 7: - print( - "Runs convert cli with EnergyPlus version 9-1-0 AND the ordered option " - "(sorting the idf object names)" - ) - elif request.param[0] == 8: - print( - "Runs convert cli with EnergyPlus version 9-1-0 AND trnsidf.exe arguments:" - "1) Will not renumber surfaces" - "2) Does BatchJob Modus" - "3) 60% of solar radiation is directed to the floor" - "4) Updates floor reference area of airnodes" - "5) Updates volume of airnodes" - "6) Updates the capacitance of airnodes" - ) - elif request.param[0] == 9: - print( - "Runs convert cli with EnergyPlus version 9-1-0 AND writing the " - "schedules as SCHEDULES" - ) - else: - print("Runs convert cli with EnergyPlus version 9-1-0 AND other parameters") - - yield request.param[1:] - - @pytest.mark.skipif( - os.environ.get("CI", "False").lower() == "true", - reason="Skipping this test on CI environment.", - ) - @pytest.mark.skipif( - get_platform() > (10, 15, 0), - reason="Skipping since wine 32bit can't run on MacOs >10.15 (Catalina)", - ) - def test_convert(self, config, cli_args): - """Tests the 'reduce' method""" + def test_reduce(self): + """Tests the 'reduced_model' method""" runner = CliRunner() - args = cli_args - result = runner.invoke(cli, args, catch_exceptions=False) - print(result.stdout) - assert result.exit_code == 0 - - def test_reduce(self, config): - """Tests the 'reduce' method""" - runner = CliRunner() - test_file_list = [ - "tests/input_data/necb/NECB 2011-SmallOffice-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" - ] + base = Path("tests/input_data/umi_samples") + outname = "tests/.temp/warehouse.json" result = runner.invoke( cli, [ - "--use-cache", + "-csd", "--cache-folder", "tests/.temp/cache", "--data-folder", @@ -310,31 +33,27 @@ def test_reduce(self, config): settings.ep_version, "reduce", "-w", - "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", - "-p", - *test_file_list, - "tests/.temp/retail.json", + "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_*.epw", + base / "*Res*.idf", + "-o", + outname, ], catch_exceptions=False, ) - print(result.stdout) assert result.exit_code == 0 + assert Path(outname).exists() - def test_reduce_failed(self, clean_config): - """Tests the 'reduce' method on a failed file""" + @pytest.mark.skipif( + os.environ.get("CI", "False").lower() == "true", + reason="Skipping this test on CI environment.", + ) + def test_transition_dir_file_mixed(self): + """Tests the transition method for the CLI using a mixture of a directory + (Path.isdir()) and a file Path.isfile()""" runner = CliRunner() - test_file = "tests/input_data/necb/NECB 2011-Warehouse-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" - - # First, modify file so that it breaks. We will removing the building object. - idf = load_idf(test_file) - bldg = idf.idfobjects["BUILDING"][0] - idf.removeidfobject(bldg) - idf.save() - result = runner.invoke( cli, [ - "--use-cache", "--cache-folder", "tests/.temp/cache", "--data-folder", @@ -343,28 +62,14 @@ def test_reduce_failed(self, clean_config): "tests/.temp/images", "--logs-folder", "tests/.temp/logs", - "--ep_version", - settings.ep_version, - "reduce", - "-w", - "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", - "-p", - *[idf.idfname, idf.idfname], - "tests/.temp/retail.json", + "transition", + "-v", + "9.2", + "tests/input_data/problematic/ASHRAE90.1_ApartmentHighRise_STD2016_Buffalo.idf", + "tests/input_data/problematic/*.idf", # Path with wildcard + "tests/input_data/problematic", # Just a path ], catch_exceptions=False, ) - print(result.stdout) - # check an error file has been created - assert Path("failed_reduce.txt").exists() - assert result.exit_code == 0 - - def test_transition(self, config): - """Tests the transition method for the CLI""" - file = copy_file( - "tests/input_data/problematic/ASHRAE90.1_ApartmentHighRise_STD2016_Buffalo.idf" - ) - runner = CliRunner() - result = runner.invoke(cli, ["transition", file], catch_exceptions=False) log(result.stdout) assert result.exit_code == 0 diff --git a/tests/test_dataportals.py b/tests/test_dataportals.py index 88ae0e34..6758c734 100644 --- a/tests/test_dataportals.py +++ b/tests/test_dataportals.py @@ -1,58 +1,58 @@ import os -import pytest - -import archetypal as ar import pandas as pd +import pytest -from archetypal import download_bld_window, settings +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, scratch_then_cache): +def test_tabula_available_country(config): # First, let's try the API call data = {"code_country": "FR"} - cc_res = ar.dataportal.tabula_api_request(data, table="all-country") + cc_res = dataportal.tabula_api_request(data, table="all-country") # Makes sure data is not empty assert cc_res["data"] # Then let's use the user-friendly call. Since it is the second call to the # same function, the response should be read from the cache. code_country = "FR" - cc_cache = ar.dataportal.tabula_available_buildings(code_country) + cc_cache = dataportal.tabula_available_buildings(code_country) # Makes sure result is not empty assert list(cc_cache["id"]) -def test_tabula_api_request_valueerror(config, scratch_then_cache): +def test_tabula_api_request_valueerror(config): # Gives "wrong_string" as table data = {"code_country": "FR"} with pytest.raises(ValueError): - cc_res = ar.dataportal.tabula_api_request(data, table="wrong_string") + cc_res = dataportal.tabula_api_request(data, table="wrong_string") # Makes sure cc_res not in locals assert "cc_res" not in locals() # Gives "wrong_string" as country data = {"code_country": "wrong_string"} with pytest.raises(ValueError): - cc_res = ar.dataportal.tabula_api_request(data, table="all-country") + cc_res = dataportal.tabula_api_request(data, table="all-country") # Makes sure cc_res not in locals assert "cc_res" not in locals() -def test_tabula_notavailable_country(config, scratch_then_cache): +def test_tabula_notavailable_country(config): pass -def test_tabula_building_sheet(config, scratch_then_cache): - sheet = ar.tabula_building_details_sheet(code_country="Austria") +def test_tabula_building_sheet(config): + sheet = tabula_building_details_sheet(code_country="Austria") # Makes sure result is not empty assert list(sheet["val"]) -def test_tabula_building_sheet_code_building(config, scratch_then_cache): +def test_tabula_building_sheet_code_building(config): # Test with code_building not None - sheet = ar.tabula_building_details_sheet( + sheet = tabula_building_details_sheet( code_building="AT.MT.AB.02.Gen.ReEx.001.001", code_country="Austria" ) @@ -62,10 +62,10 @@ def test_tabula_building_sheet_code_building(config, scratch_then_cache): assert sheet["val"][0] == "AT.MT.AB.02.Gen.ReEx.001.001" -def test_tabula_building_sheet_valueerror(config, scratch_then_cache): +def test_tabula_building_sheet_valueerror(config): # Test with wrong code_building with pytest.raises(ValueError): - sheet = ar.tabula_building_details_sheet( + sheet = tabula_building_details_sheet( code_building="wrong_string", code_country="Austria" ) # Makes sure sheet not in locals @@ -73,7 +73,7 @@ def test_tabula_building_sheet_valueerror(config, scratch_then_cache): # Test with wrong code_buildingsizeclass with pytest.raises(ValueError): - sheet = ar.tabula_building_details_sheet( + sheet = tabula_building_details_sheet( code_buildingsizeclass="wrong_string", code_country="Austria" ) # Makes sure sheet not in locals @@ -81,13 +81,13 @@ def test_tabula_building_sheet_valueerror(config, scratch_then_cache): # Test with wrong code_country with pytest.raises(ValueError): - sheet = ar.tabula_building_details_sheet(code_country="wrong_string",) + sheet = tabula_building_details_sheet(code_country="wrong_string") # Makes sure sheet not in locals assert "sheet" not in locals() -def test_tabula_system(config, scratch_then_cache): - res = ar.dataportal.tabula_system(code_country="FR") +def test_tabula_system(config): + res = dataportal.tabula_system(code_country="FR") # Makes sure result is not empty assert list(res["data"]) @@ -95,59 +95,59 @@ def test_tabula_system(config, scratch_then_cache): assert res["data"][0] == "FR" -def test_tabula_system_valueerror(config, scratch_then_cache): +def test_tabula_system_valueerror(config): # Test with wrong code_boundarycond with pytest.raises(ValueError): - res = ar.dataportal.tabula_system( + res = dataportal.tabula_system( code_country="FR", code_boundarycond="wrong_string" ) # Makes sure res not in locals assert "res" not in locals() -def test_resolve_codecountry(config, scratch_then_cache): +def test_resolve_codecountry(config): # Tests with country string length == 3 - res = ar.dataportal._resolve_codecountry("USA") + res = dataportal._resolve_codecountry("USA") # Makes sure code_country is right assert res == "US" # Tests with country number (integer) - res = ar.dataportal._resolve_codecountry(533) + res = dataportal._resolve_codecountry(533) # Makes sure code_country is right assert res == "AW" -def test_openei_api_request(config, scratch_then_cache): +def test_openei_api_request(config): data = {"code_country": "FR"} - res = ar.dataportal.openei_api_request(data) + res = dataportal.openei_api_request(data) # Makes sure result is None (no cache data found) assert res is None -def test_nrel_api_cbr_request(config, scratch_then_cache): +def test_nrel_api_cbr_request(config): data = {"code_country": "FR"} - res = ar.dataportal.nrel_api_cbr_request(data) + res = dataportal.nrel_api_cbr_request(data) # Makes sure result returns an error "API_KEY_MISSING" assert res["error"]["code"] == "API_KEY_MISSING" -def test_nrel_api_cbr_request_exception(config, scratch_then_cache): +def test_nrel_api_cbr_request_exception(config): # Test with wrong code_country data = {"code_country": "wrong_string"} - res = ar.dataportal.nrel_api_cbr_request(data) + res = dataportal.nrel_api_cbr_request(data) # Makes sure result returns an error "API_KEY_MISSING" assert res["error"]["code"] == "API_KEY_MISSING" -def test_tabula_multiple(config, scratch_then_cache): +def test_tabula_multiple(config): country_code = "FR" - ab = ar.dataportal.tabula_available_buildings(country_code) + ab = dataportal.tabula_available_buildings(country_code) archetypes = pd.concat( ab.apply( - lambda x: ar.tabula_building_details_sheet( + lambda x: tabula_building_details_sheet( code_building=x.code_buildingtype_column1 + "." + x.suffix_building_column1 @@ -167,7 +167,7 @@ def test_tabula_multiple(config, scratch_then_cache): reason="Must provide an NREL API key as ENV Variable 'NREL_CONSUMER_KEY'", strict=True, ) -def test_nrel_api_request(config, scratch_then_cache): +def test_nrel_api_request(config): data = { "keyword": "Window", "format": "json", @@ -175,7 +175,7 @@ def test_nrel_api_request(config, scratch_then_cache): "oauth_consumer_key": os.environ.get("NREL_CONSUMER_KEY"), } - response = ar.dataportal.nrel_bcl_api_request(data) + response = dataportal.nrel_bcl_api_request(data) assert response["result"] @@ -184,7 +184,7 @@ def test_nrel_api_request(config, scratch_then_cache): reason="Must provide an NREL API key as ENV Variable 'NREL_CONSUMER_KEY'", strict=True, ) -def test_download_bld_window(config, scratch_then_cache): +def test_download_bld_window(config): oauth_consumer_key = os.environ.get("NREL_CONSUMER_KEY") response = download_bld_window( @@ -202,7 +202,11 @@ def test_download_bld_window(config, scratch_then_cache): reason="Must provide an NREL API key as ENV Variable 'NREL_CONSUMER_KEY'", strict=True, ) -def test_download_and_load_bld_window(clean_config): +@pytest.mark.skipif( + os.environ.get("CI", "False").lower() == "true", + reason="Skipping this test on CI environment.", +) +def test_download_and_load_bld_window(config): """Download window and load its idf file""" oauth_consumer_key = os.environ.get("NREL_CONSUMER_KEY") @@ -213,45 +217,49 @@ def test_download_and_load_bld_window(clean_config): oauth_key=oauth_consumer_key, tolerance=0.05, ) - idf = ar.load_idf(response[0], ep_version=settings.ep_version) + idf = IDF( + response[0], + epw="tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", + prep_outputs=False, + ) construct = idf.getobject("CONSTRUCTION", "AEDG-SmOffice 1A Window Fixed") - ws = ar.WindowSetting.from_construction(Name="test_window", Construction=construct) + ws = WindowSetting.from_construction(Name="test_window", Construction=construct) assert ws -def test_statcan(config, scratch_then_cache): +def test_statcan(config): data = dict(type="json", lang="E", dguid="2016A000011124", topic=5, notes=0) - response = ar.dataportal.stat_can_request(**data) + response = dataportal.stat_can_request(**data) print(response) # Makes sure result is not empty assert response -def test_statcan_error(config, scratch_then_cache): +def test_statcan_error(config): # Tests statcan with error in inputs data = dict(type="json", lang="E", dguid="wrong_string", topic=5, notes=0) - response = ar.dataportal.stat_can_request(**data) + response = dataportal.stat_can_request(**data) print(response) # Makes sure result is None (wrong function input "dguid") assert response is None -def test_statcan_geo(config, scratch_then_cache): +def test_statcan_geo(config): data = dict(type="json", lang="E", geos="PR", cpt="00") - response = ar.dataportal.stat_can_geo_request(**data) + response = dataportal.stat_can_geo_request(**data) print(response) # Makes sure result is not empty assert response -def test_statcan_geo_error(config, scratch_then_cache): +def test_statcan_geo_error(config): # Tests statcan_geo with error in inputs data = dict(type="json", lang="E", geos="wrong_string", cpt="00") - response = ar.dataportal.stat_can_geo_request(**data) + response = dataportal.stat_can_geo_request(**data) print(response) # Makes sure result is not empty diff --git a/tests/test_energypandas.py b/tests/test_energypandas.py new file mode 100644 index 00000000..0b795001 --- /dev/null +++ b/tests/test_energypandas.py @@ -0,0 +1,101 @@ +import pytest +from energy_pandas import EnergyDataFrame, EnergySeries +from numpy.testing import assert_almost_equal +from pandas import read_csv + +from archetypal import IDF, settings + + +@pytest.fixture(scope="module") +def idf(config): + idfname = "tests/input_data/umi_samples/B_Off_0.idf" + epw = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + _idf = IDF(idfname, epw) + yield _idf + _idf.save() + + +@pytest.fixture(scope="class") +def rd_es(idf): + try: + yield idf.meters.OutputMeter.WaterSystems__MainsWater.values() + except Exception: + yield idf.simulate().meters.OutputMeter.WaterSystems__MainsWater.values() + + +@pytest.fixture(scope="class") +def rd_edf(idf): + try: + yield idf.variables.OutputVariable.Zone_Air_Temperature.values() + except Exception: + yield idf.simulate().variables.OutputVariable.Zone_Air_Temperature.values() + + +class TestEnergySeries: + def test_from_csv(self): + file = "tests/input_data/test_profile.csv" + df = read_csv(file, index_col=[0], names=["Heat"]) + ep = EnergySeries.with_timeindex(df.Heat, frequency="1H", units="BTU/hour") + assert ep.units == settings.unit_registry.parse_expression("BTU/hour").units + + def test_from_report_data(self, rd_es): + assert_almost_equal(rd_es.sum(), 2.1187133811706036, decimal=3) + assert rd_es.units == settings.unit_registry.m3 + + @pytest.mark.parametrize("kind", ["polygon", "surface", "contour"]) + def test_plot_3d(self, rd_es, kind): + fig, ax = rd_es.plot3d( + save=False, + show=True, + axis_off=False, + kind=kind, + cmap="Reds", + fig_width=4, + fig_height=4, + edgecolors="grey", + linewidths=0.01, + ) + + def test_plot_2d(self, rd_es): + fig, ax = rd_es.plot2d( + axis_off=False, + cmap="Reds", + fig_height=2, + fig_width=6, + show=True, + save=False, + filename=rd_es.name + "_heatmap", + ) + + def test_discretize(self, rd_es): + res = rd_es.discretize_tsam(noTypicalPeriods=1) + assert_almost_equal(res.sum(), 2.118713381170598, decimal=3) + rd_es.discretize_tsam(noTypicalPeriods=1, inplace=True) + assert_almost_equal(res.sum(), 2.118713381170598, decimal=3) + # check that the type is maintained + assert type(rd_es) == EnergySeries + + +class TestEnergyDataFrame: + def test_from_report_data(self, rd_edf): + assert_almost_equal(rd_edf.sum().sum(), 397714.38260559476, decimal=3) + assert rd_edf.units["CORE"] == settings.unit_registry.C + + def test_discretize(self, rd_edf): + rd_edf = rd_edf.discretize_tsam(noTypicalPeriods=1) + assert hasattr(rd_edf, "agg") + rd_edf.discretize_tsam(noTypicalPeriods=1, inplace=True) + assert hasattr(rd_edf, "agg") + # check that the type is maintained + assert type(rd_edf) == EnergyDataFrame + + def test_plot_2d(self, rd_edf): + fig, ax = rd_edf.plot2d( + axis_off=False, + cmap="Reds", + fig_height=None, + fig_width=6, + show=True, + save=False, + extent="tight", + ) diff --git a/tests/test_energyseries.py b/tests/test_energyseries.py deleted file mode 100644 index a8760502..00000000 --- a/tests/test_energyseries.py +++ /dev/null @@ -1,149 +0,0 @@ -import os - -import archetypal as ar -import pandas as pd -import pytest - -from path import Path - -from archetypal import EnergySeries, get_eplus_dirs, settings - -import numpy as np - - -@pytest.fixture( - scope="module", - params=[ - get_eplus_dirs(settings.ep_version) / "ExampleFiles" / "5ZoneNightVent1.idf", - get_eplus_dirs(settings.ep_version) - / "ExampleFiles" - / "BasicsFiles" - / "AdultEducationCenter.idf", - ], -) -def energy_series(config, request): - from archetypal import ReportData - - outputs = { - "ep_object": "Output:Variable".upper(), - "kwargs": { - "Key_Value": "OCCUPY-1", - "Variable_Name": "Schedule Value", - "Reporting_Frequency": "Hourly", - }, - } - wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - sql = ar.run_eplus( - request.param, - weather_file=wf, - output_report="sql_file", - prep_outputs=[outputs], - annual=True, - expandobjects=True, - ) - report = ReportData.from_sqlite( - sql, - table_name=("Heating:Electricity", "Heating:Gas", "Heating:DistrictHeating"), - ) - - hl = EnergySeries.from_sqlite( - report, - name="Heating", - normalize=False, - sort_values=False, - concurrent_sort=False, - to_units="kWh", - ) - - yield hl - - -@pytest.fixture( - params=(["Water Heater Tank Temperature", "WaterSystems:EnergyTransfer"]) -) -def rd(request): - from archetypal import ReportData - - file = Path("tests/input_data/trnsys/HeatPumpWaterHeater.sqlite") - - rd = ReportData.from_sqlite(file, table_name=request.param) - assert not rd.empty - yield rd - - -def test_EnergySeries(rd): - import matplotlib.pyplot as plt - from archetypal import EnergySeries - - es = EnergySeries.from_sqlite(rd) - es.plot() - plt.show() - print(es) - - -@pytest.mark.parametrize("kind", ["polygon", "surface", "contour"]) -def test_plot_3d(energy_series, kind): - hl = energy_series.copy() - hl.plot3d( - save=True, - axis_off=False, - kind=kind, - cmap="Reds", - fig_width=4, - fig_height=4, - edgecolors="grey", - linewidths=0.01, - ) - - -@pytest.mark.skipif( - os.environ.get("CI", "False").lower() == "true", - reason="Skipping this test on CI environment.", -) -def test_plot_2d(energy_series): - hl = energy_series.copy() - hl.plot2d( - save=True, - axis_off=False, - cmap="Reds", - subplots=False, - fig_width=6, - fig_height=2, - edgecolors="k", - linewidths=0.5, - filename=hl.name + "_heatmap", - ) - - -@pytest.fixture(scope="module") -def from_csv(config): - file = "tests/input_data/test_profile.csv" - df = pd.read_csv(file, index_col=[0], names=["Heat"]) - ep = ar.EnergySeries( - df.Heat, - units="BTU/hour", - frequency="1H", - to_units="kW", - sort_values=False, - use_timeindex=True, - ) - # ep = ep.unit_conversion(to_units='kW') - yield ep - - -@pytest.mark.skipif( - os.environ.get("CI", "False").lower() == "true", - reason="Skipping this test on CI environment.", -) -def test_discretize(from_csv): - epc = from_csv.copy() - res = epc.discretize_tsam() - res.plot() - ar.plt.show() - - -def test_discretize_tsam(from_csv): - ep = from_csv.copy() - ldc_disc = ep.discretize_tsam(noTypicalPeriods=10) - - ldc_disc.plot2d(subplots=False) diff --git a/tests/test_idf.py b/tests/test_idf.py deleted file mode 100644 index 7cbeaae7..00000000 --- a/tests/test_idf.py +++ /dev/null @@ -1,259 +0,0 @@ -import os -import random -import subprocess - -import archetypal as ar -import matplotlib as mpl - -# use agg backend so you don't need a display on travis-ci -import pytest -from path import Path - -import archetypal.settings -from archetypal import EnergyPlusProcessError, get_eplus_dirs, settings, \ - parallel_process - -mpl.use("Agg") - - -# given, when, then -# or -# arrange, act, assert - - -def test_small_home_data(clean_config): - file = ( - get_eplus_dirs(settings.ep_version) - / "ExampleFiles" - / "BasicsFiles" - / "AdultEducationCenter.idf" - ) - file = ar.copy_file(file) - wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - return ar.run_eplus( - file, wf, prep_outputs=True, design_day=True, expandobjects=True, verbose="q" - ) - - -def test_necb(config): - """Test all necb files with design_day = True""" - - necb_dir = Path("tests/input_data/necb") - files = necb_dir.glob("*.idf") - wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - rundict = { - file: dict( - eplus_file=file, - weather_file=wf, - expandobjects=True, - verbose="q", - design_day=True, - output_report="sql", - ) - for file in files - } - result = parallel_process(rundict, ar.run_eplus, use_kwargs=True) - - assert not any(isinstance(a, Exception) for a in result.values()) - - -def test_load_idf(config): - """Will load an idf object""" - - files = [ - get_eplus_dirs(settings.ep_version) / "ExampleFiles" / "5ZoneNightVent1.idf", - get_eplus_dirs(settings.ep_version) - / "ExampleFiles" - / "BasicsFiles" - / "AdultEducationCenter.idf", - ] - - obj = {os.path.basename(file): ar.load_idf(file) for file in files} - assert isinstance(obj, dict) - - -def test_load_old(config): - files = [ - "tests/input_data/problematic/nat_ventilation_SAMPLE0.idf", - get_eplus_dirs(settings.ep_version) / "ExampleFiles" / "5ZoneNightVent1.idf", - ] - - obj = {os.path.basename(file): ar.load_idf(file) for file in files} - - assert not any(isinstance(a, Exception) for a in obj.values()) - - -@pytest.mark.parametrize( - "ep_version", - [archetypal.settings.ep_version, None], - ids=["specific-ep-version", "no-specific-ep-version"], -) -def test_run_olderv(clean_config, ep_version): - """Will run eplus on a file that needs to be upgraded with one that does - not""" - ar.settings.use_cache = False - files = [ - "tests/input_data/problematic/nat_ventilation_SAMPLE0.idf", - get_eplus_dirs(settings.ep_version) / "ExampleFiles" / "5ZoneNightVent1.idf", - ] - wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - files = ar.copy_file(files) - rundict = { - file: dict( - eplus_file=file, - weather_file=wf, - ep_version=ep_version, - annual=True, - prep_outputs=True, - expandobjects=True, - verbose="q", - output_report="sql", - ) - for file in files - } - result = {file: ar.run_eplus(**rundict[file]) for file in files} - - -@pytest.mark.xfail( - raises=(subprocess.CalledProcessError, FileNotFoundError, EnergyPlusProcessError) -) -def test_run_olderv_problematic(clean_config): - """Will run eplus on a file that needs to be upgraded and that should - fail. Will be ignored in the test suite""" - - file = "tests/input_data/problematic/RefBldgLargeOfficeNew2004_v1.4_7.2_5A_USA_IL_CHICAGO-OHARE.idf" - wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - ar.run_eplus( - file, wf, prep_outputs=True, annual=True, expandobjects=True, verbose="q" - ) - - -def test_run_eplus_from_idf(clean_config): - file = get_eplus_dirs(settings.ep_version) / "ExampleFiles" / "5ZoneNightVent1.idf" - wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - - idf = ar.load_idf(file, weather_file=wf) - sql = idf.run_eplus(prep_outputs=True, output_report="sql") - - assert sql - - -@pytest.mark.parametrize( - "archetype, area", - [ - ("FullServiceRestaurant", 511), - pytest.param( - "Hospital", - 22422, - marks=pytest.mark.xfail(reason="Difference cannot be explained"), - ), - ("LargeHotel", 11345), - ("LargeOffice", 46320), - ("MediumOffice", 4982), - ("MidriseApartment", 3135), - ("Outpatient", 3804), - ("PrimarySchool", 6871), - ("QuickServiceRestaurant", 232), - ("SecondarySchool", 19592), - ("SmallHotel", 4013), - ("SmallOffice", 511), - pytest.param( - "RetailStandalone", - 2319, - marks=pytest.mark.xfail(reason="Difference cannot be explained"), - ), - ("RetailStripmall", 2090), - pytest.param( - "Supermarket", - 4181, - marks=pytest.mark.skip("Supermarket " "missing from " "BTAP " "database"), - ), - ("Warehouse", 4835), - ], -) -def test_area(archetype, area): - """Test the conditioned_area property against published values - desired values taken from https://github.com/canmet-energy/btap""" - import numpy as np - from archetypal import load_idf - - idf_file = Path("tests/input_data/necb/").glob("*{}*.idf".format(archetype)) - idf = load_idf(next(iter(idf_file))) - np.testing.assert_almost_equal(actual=idf.area_conditioned, desired=area, decimal=0) - - -def test_wwr(): - from archetypal import load_idf - - idf_file = Path("tests/input_data/necb/").glob( - "*{}*.idf".format("FullServiceRestaurant") - ) - idf = load_idf(next(iter(idf_file))) - print(idf.name) - print(idf.wwr(round_to=10)) - - -def test_partition_ratio(): - from archetypal import load_idf - - idf_file = Path("tests/input_data/necb/").glob("*LargeOffice*.idf") - idf = load_idf(next(iter(idf_file))) - print(idf.partition_ratio) - - -def test_space_cooling_profile(config): - from archetypal import load_idf - - file = ( - get_eplus_dirs(settings.ep_version) - / "ExampleFiles" - / "BasicsFiles" - / "AdultEducationCenter.idf" - ) - wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - - idf = load_idf(file, None, weather_file=wf) - - assert not idf.space_cooling_profile().empty - - -def test_space_heating_profile(config): - from archetypal import load_idf - - file = "tests/input_data/necb/NECB 2011-Warehouse-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" - wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - - idf = load_idf(file, None, weather_file=wf) - - assert not idf.space_heating_profile().empty - - -def test_dhw_profile(config): - from archetypal import load_idf - - file = "tests/input_data/necb/NECB 2011-Warehouse-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" - wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - - idf = load_idf(file, None, weather_file=wf) - - shw = idf.service_water_heating_profile() - assert shw.sum() > 0 - print(shw.resample("M").sum()) - - -def test_old_than_change_args(clean_config): - """Should upgrade file only once even if run_eplus args are changed afterwards""" - from archetypal import run_eplus - - file = ( - get_eplus_dirs(settings.ep_version) - / "ExampleFiles" - / "RefBldgQuickServiceRestaurantNew2004_Chicago.idf" - ) - epw = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - - idf = run_eplus(file, epw, prep_outputs=True, output_report="sql_file") - - idf = run_eplus(file, epw, prep_outputs=True, output_report="sql_file") - - idf = run_eplus(file, epw, prep_outputs=True, output_report="sql") diff --git a/tests/test_idfclass.py b/tests/test_idfclass.py new file mode 100644 index 00000000..9c2a81c9 --- /dev/null +++ b/tests/test_idfclass.py @@ -0,0 +1,353 @@ +from subprocess import CalledProcessError + +import pytest +from path import Path + +from archetypal import IDF, settings +from archetypal.eplus_interface import ( + EnergyPlusProcessError, + EnergyPlusVersionError, + InvalidEnergyPlusVersion, +) +from archetypal.eplus_interface.version import EnergyPlusVersion, get_eplus_dirs +from archetypal.utils import parallel_process + + +@pytest.fixture() +def shoebox_model(config): + """An IDF model. Yields both the idf""" + 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) + + +class TestIDF: + @pytest.fixture(scope="session") + def idf_model(self, config): + """An IDF model. Yields both the idf""" + 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" + yield IDF(file, epw=w).simulate() + + @pytest.fixture() + def natvent(self, config): + """An old file that needs upgrade""" + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + yield IDF( + "tests/input_data/problematic/nat_ventilation_SAMPLE0.idf", + epw=w, + as_version="9-2-0", + ) + + @pytest.fixture() + def FiveZoneNightVent1(self): + """""" + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + idfname = ( + get_eplus_dirs(settings.ep_version) / "ExampleFiles" / "5ZoneNightVent1.idf" + ) + yield IDF(idfname, epw=w) + + @pytest.fixture() + def natvent_v9_1_0(self, config): + """An old file that needs upgrade""" + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + yield IDF( + "tests/input_data/problematic/nat_ventilation_SAMPLE0.idf", + epw=w, + as_version="9-1-0", + ) + + @pytest.fixture() + def wont_transition_correctly(self, config): + file = ( + "tests/input_data/problematic/RefBldgLargeOfficeNew2004_v1.4_7" + ".2_5A_USA_IL_CHICAGO-OHARE.idf" + ) + wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + yield IDF(file, epw=wf, as_version="8.9.0") + + def test_default_version_none(self): + file = ( + "tests/input_data/necb/NECB 2011-FullServiceRestaurant-NECB HDD " + "Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" + ) + wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + idf = IDF(file, epw=wf, as_version=None) + assert idf.file_version == EnergyPlusVersion("9-2-0") + assert idf.idd_version == (9, 2, 0) + assert idf.file_version == EnergyPlusVersion("9-2-0") + + def test_default_version_specified_period(self): + file = ( + "tests/input_data/necb/NECB 2011-FullServiceRestaurant-NECB HDD " + "Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" + ) + wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + idf = IDF(file, epw=wf, as_version="9.2.0") + assert idf.file_version == EnergyPlusVersion("9-2-0") + assert idf.idd_version == (9, 2, 0) + assert idf.file_version == EnergyPlusVersion("9-2-0") + + def test_default_version_specified_dash(self): + file = ( + "tests/input_data/necb/NECB 2011-FullServiceRestaurant-NECB HDD " + "Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" + ) + wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + idf = IDF(file, epw=wf, as_version="9-2-0") + assert idf.file_version == EnergyPlusVersion("9-2-0") + assert idf.idd_version == (9, 2, 0) + assert idf.file_version == EnergyPlusVersion("9-2-0") + + def test_specific_version(self, config, natvent_v9_1_0): + assert natvent_v9_1_0.file_version == EnergyPlusVersion("9-1-0") + assert natvent_v9_1_0.idd_version == (9, 1, 0) + assert natvent_v9_1_0.file_version == EnergyPlusVersion("9-1-0") + + def test_specific_version_error_simulate(self, natvent_v9_1_0): + with pytest.raises(EnergyPlusVersionError): + natvent_v9_1_0.simulate() + + def test_version(self, natvent_v9_1_0): + # setting as_version + natvent_v9_1_0.as_version = "9-2-0" + assert natvent_v9_1_0.as_version == EnergyPlusVersion("9-2-0") + + # setting idfname + natvent_v9_1_0.idfname = "this_name" + assert natvent_v9_1_0.idfname == Path("this_name") + + # setting epw + natvent_v9_1_0.epw = "newepw.epw" + assert natvent_v9_1_0.epw == Path("newepw.epw") + + with pytest.raises(AttributeError): + # illigal to set iddname, since it is a calculated property + natvent_v9_1_0.iddname = "this_name" + + def test_transition_error(self, config, wont_transition_correctly): + with pytest.raises( + (EnergyPlusProcessError, EnergyPlusVersionError, CalledProcessError) + ): + assert wont_transition_correctly.simulate(ep_version="8.9.0") + + def test_sql(self, idf_model): + assert idf_model.sql_file.exists() + + def test_processed_results(self, idf_model): + assert idf_model.process_results() + + def test_partition_ratio(self, idf_model): + assert idf_model.partition_ratio + + def test_space_cooling_profile(self, idf_model): + assert not idf_model.space_cooling_profile().empty + + def test_space_heating_profile(self, idf_model): + assert not idf_model.space_heating_profile().empty + + def test_dhw_profile(self, idf_model): + assert not idf_model.service_water_heating_profile().empty + + def test_wwr(self, idf_model): + assert not idf_model.wwr(round_to=10).empty + + def test_wrong_epversion(self, config): + file = ( + "tests/input_data/problematic/RefBldgLargeOfficeNew2004_v1.4_7" + ".2_5A_USA_IL_CHICAGO-OHARE.idf" + ) + wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + with pytest.raises(InvalidEnergyPlusVersion): + IDF(file, epw=wf, as_version="7-3-0") + + def test_parallel_process(self, config): + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + files = { + i: {"idfname": file.expand(), "epw": w} + for i, file in enumerate(Path("tests/input_data/necb").files("*.idf")[0:3]) + } + idfs = parallel_process(files, IDF, use_kwargs=True, processors=-1) + + assert not any(isinstance(a, Exception) for a in idfs) + + def test_load_old(self, config, natvent, FiveZoneNightVent1): + assert natvent.idd_version == (9, 2, 0) + assert FiveZoneNightVent1.idd_version == (9, 2, 0) + + @pytest.mark.parametrize( + "archetype, area", + [ + ("FullServiceRestaurant", 511), + pytest.param( + "Hospital", + 22422, + marks=pytest.mark.xfail(reason="Difference cannot be explained"), + ), + ("LargeHotel", 11345), + ("LargeOffice", 46320), + ("MediumOffice", 4982), + ("MidriseApartment", 3135), + ("Outpatient", 3804), + ("PrimarySchool", 6871), + ("QuickServiceRestaurant", 232), + ("SecondarySchool", 19592), + ("SmallHotel", 4013), + ("SmallOffice", 511), + pytest.param( + "RetailStandalone", + 2319, + marks=pytest.mark.xfail(reason="Difference cannot be explained"), + ), + ("RetailStripmall", 2090), + pytest.param( + "Supermarket", + 4181, + marks=pytest.mark.skip("Supermarket missing from BTAP " "database"), + ), + ("Warehouse", 4835), + ], + ) + def test_area(self, archetype, area, config): + """Test the conditioned_area property against published values + desired values taken from https://github.com/canmet-energy/btap""" + import numpy as np + + idf_file = Path("tests/input_data/necb").files(f"*{archetype}*.idf")[0] + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + idf = IDF(idf_file, epw=w, prep_outputs=False) + + np.testing.assert_almost_equal( + actual=idf.net_conditioned_building_area, desired=area, decimal=0 + ) + + @pytest.fixture( + scope="class", + params=[ + None, + get_eplus_dirs(settings.ep_version) + / "ExampleFiles" + / "5ZoneNightVent1.idf", + ], + ids=["in memory", "5ZoneNightVent1"], + ) + def idf(self, request): + """Parametrized IDF model. + + One is in-memory, the other is read from an IDF file. + """ + yield IDF(request.param) + + def test_init_version(self, idf): + """Test creation of in-memory IDF file""" + assert idf.file_version.dash == settings.ep_version + + # test another instance in this session with a different version number. + idf = IDF(as_version="8-9-0") + assert idf.file_version.dash == "8-9-0" + + def test_location(self, idf): + print(idf.output_directory) + + def test_editing(self, idf): + """Editing the file should change its simulation dir. + + Any edits in the model must trigger a new simulation dir location. + """ + original_output_directory = idf.simulation_dir + + # Edit model by adding a zone. + idf.add_block( + name="Core", + coordinates=[(10, 0), (10, 5), (0, 5), (0, 0)], + height=3, + num_stories=1, + ) + new_output_directory = idf.simulation_dir + + assert original_output_directory != new_output_directory + + def test_version_object(self, idf): + """IDF model should have a Version object. + + Will raise StopIteration if VERSION is not present + """ + assert next(iter(idf.idfobjects["VERSION"])) + + def test_save(self, idf, tmp_path): + """Saving should overwrite the file content.""" + save_as = tmp_path / "idf_dup.idf" + idf_dup = idf.saveas(save_as) + + +class TestIDFTransition: + def test_transition(self, tmp_path): + f = tmp_path / "test.idf" + f.write_text("Version, 8.9;") + idf = IDF(f.absolute(), as_version="8.9") + assert idf.file_version == EnergyPlusVersion("8.9.0") + idf.upgrade("9-2-0") + assert idf.file_version == EnergyPlusVersion("9.2.0") + + def test_transition_of_memory_file(self): + idf = IDF(as_version="8.9") + assert idf.file_version == EnergyPlusVersion("8.9.0") + idf.upgrade("9-2-0") + assert idf.file_version == EnergyPlusVersion("9.2.0") + + +class TestMeters: + @pytest.fixture() + def shoebox_res(self): + """An IDF model. Yields both the idf. This needs to be the only one used in + the following test: test_retrieve_meters_nosim""" + file = "tests/input_data/umi_samples/B_Res_0_WoodFrame.idf" + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + yield IDF(file, epw=w) + + def test_retrieve_meters_nosim(self, config, shoebox_res): + shoebox_res.simulation_dir.rmtree_p() + with pytest.raises(Exception): + print(shoebox_res.meters) + + def test_retrieve_meters(self, config, shoebox_res): + if not shoebox_res.simulation_dir.exists(): + shoebox_res.simulate() + shoebox_res.meters.OutputMeter.WaterSystems__MainsWater.values() + + +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.""" + d = tmp_path / "sub" + d.mkdir() + p = d / "5ZoneAirCooledWithSlab.idf" + epw = ( + get_eplus_dirs() + / "WeatherData" + / "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw" + ) + slab_idf = get_eplus_dirs() / "ExampleFiles" / "5ZoneAirCooledWithSlab.idf" + with open(slab_idf, "r") as f: + p.write_text(f.read()) + idf = IDF(p, epw=epw, annual=False, design_day=True) + + assert idf.simulate() + + @pytest.mark.skip("To long to run for tests") + def test_runbasement(self, config): + epw = ( + get_eplus_dirs() + / "WeatherData" + / "USA_CA_San.Francisco.Intl.AP.724940_TMY3.epw" + ) + idf = IDF.from_example_files( + "LgOffVAVusingBasement.idf", epw=epw, annual=False, design_day=True + ) + + assert idf.simulate() diff --git a/tests/test_schedules.py b/tests/test_schedules.py index 3e95df65..a6389a6e 100644 --- a/tests/test_schedules.py +++ b/tests/test_schedules.py @@ -1,63 +1,93 @@ -import os - +import numpy as np +import pandas as pd import pytest -from archetypal import ( - Schedule, - load_idf, - copy_file, - run_eplus, - UmiSchedule, - config, - get_eplus_dirs, - settings, -) - - -def test_schedules_in_necb_specific(config): - files = [ - "tests/input_data/necb/NECB 2011-MediumOffice-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" - ] - idfs = {os.path.basename(file): load_idf(file) for file in files} - import matplotlib.pyplot as plt - - for key in idfs: - idf = idfs[key] - s = Schedule( - Name="NECB-A-Thermostat Setpoint-Heating", idf=idf, start_day_of_the_week=0 +import archetypal.settings as settings +from archetypal import IDF +from archetypal.eplus_interface.version import get_eplus_dirs +from archetypal.schedule import Schedule, ScheduleTypeLimits +from archetypal.template.schedule import UmiSchedule, YearSchedule +from archetypal.utils import config + + +class TestScheduleTypeLimits: + """Test ScheduleTypeLimits class.""" + + def test_from_to_dict(self): + data = { + "Name": "Fractional", + "LowerLimit": 0, + "UpperLimit": 1, + "NumericType": None, + "UnitType": "Dimensionless", + } + + 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_from_epbunch(self): + idf = IDF() + epbunch = idf.anidfobject("SCHEDULETYPELIMITS", Name="Fractional") + + type_limit = ScheduleTypeLimits.from_epbunch(epbunch) + assert type_limit + + +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" ) - s.plot(slice=("2018/01/02", "2018/01/03"), drawstyle="steps-post") - plt.show() + epbunch = idf.schedules_dict["NECB-A-Thermostat Setpoint-Heating".upper()] + s = Schedule.from_epbunch(epbunch, start_day_of_the_week=0) + yield s + def test_plot(self, schedules_in_necb_specific): + schedules_in_necb_specific.plot( + slice=("2018/01/02", "2018/01/03"), drawstyle="steps-post" + ) -def test_make_umi_schedule(config): - """Tests only a single schedule name""" - import matplotlib.pyplot as plt + def test_plot2d(self, schedules_in_necb_specific): + schedules_in_necb_specific.plot2d(show=False, save=False) - idf_file = "tests/input_data/schedules/schedules.idf" - idf_file = copy_file(idf_file) - idf = load_idf(idf_file) + def test_make_umi_schedule(self): + """Test only a single schedule name.""" - s = UmiSchedule(Name="POFF", idf=idf, start_day_of_the_week=0) - ep_year, ep_weeks, ep_days = s.to_year_week_day() + 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) - new = UmiSchedule( - Name=ep_year.Name, idf=idf, start_day_of_the_week=s.startDayOfTheWeek - ) + 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) - print(len(s.all_values)) - print(len(new.all_values)) - ax = s.plot(slice=("2018/01/01 00:00", "2018/01/07"), legend=True) - new.plot(slice=("2018/01/01 00:00", "2018/01/07"), ax=ax, legend=True) - plt.show() - assert s.__class__.__name__ == "UmiSchedule" - assert len(s.all_values) == len(new.all_values) - assert (new.all_values == s.all_values).all() + 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_constant_schedule(): - const = Schedule.constant_schedule() - assert const.__class__.__name__ == "Schedule" + 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 idf_file = "tests/input_data/schedules/test_multizone_EP.idf" @@ -65,8 +95,10 @@ def test_constant_schedule(): def schedules_idf(): config(cache_folder="tests/.temp/cache") - idf = load_idf( + idf = IDF( idf_file, + epw="tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw", + readvars=True, include=[ get_eplus_dirs(settings.ep_version) / "DataSets" @@ -78,13 +110,23 @@ 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") +def csv_out(config): + idf = schedules_idf().simulate() + csv, *_ = idf.simulation_dir.files("*out.csv") + yield csv + + schedules = [ pytest.param( schedule, marks=pytest.mark.xfail( - reason="Can't quite capture all possibilities " "with special days" + reason="Can't quite capture all possibilities with special days" ), ) if schedule == "POFF" @@ -95,68 +137,36 @@ def schedules_idf(): ] -@pytest.fixture(params=schedules, ids=ids) -def test_schedules(request, run_schedules_idf): +@pytest.fixture(params=schedules, ids=ids, scope="module") +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 = Schedule(Name=new_eps[0].Name, idf=idf) + new_eps = origin.to_year_week_day() + new = origin - index = orig.series.index - epv = pd.read_csv(run_schedules_idf) + 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 - - -@pytest.fixture(scope="module") -def run_schedules_idf(config): - files = run_eplus( - idf_file, - weather_file="tests/input_data/CAN_PQ_Montreal.Intl.AP" ".716270_CWEC.epw", - annual=True, - readvars=True, - include=[ - get_eplus_dirs(settings.ep_version) - / "DataSets" - / "TDV" - / "TDV_2008_kBtu_CTZ06.csv" - ], - return_files=True, - ) - cache_dir = files[1][0].dirname() - csv = next(iter(cache_dir.glob("*out.csv"))) - yield csv + yield origin, new, expected -def test_ep_versus_schedule(test_schedules): +def test_ep_versus_schedule(schedule_parametrized): """Main test. Will run the idf using EnergyPlus, retrieve the csv file, create the schedules and compare""" - orig, new, expected = test_schedules + orig, new, expected = schedule_parametrized # slice_ = ('2018/01/01 00:00', '2018/01/08 00:00') # first week # slice_ = ('2018/05/20 12:00', '2018/05/22 12:00') @@ -179,10 +189,6 @@ def test_ep_versus_schedule(test_schedules): # 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_simple_glazing.py b/tests/test_simple_glazing.py index 2d2c48de..53860b37 100644 --- a/tests/test_simple_glazing.py +++ b/tests/test_simple_glazing.py @@ -13,8 +13,8 @@ def test_absurd(): """Simulates a Double Clear Air Glazing System (Window.exe v.7.5). Will raise an error when checking Visible Transmittance at Normal Incidence + Back Side Visible Reflectance at Normal Incidence not <= 1.0""" - with pytest.raises(AssertionError): - res = calc_simple_glazing(0.704, 2.703, 0.9) + with pytest.warns(UserWarning): + calc_simple_glazing(0.704, 2.703, 0.9) @pytest.mark.parametrize( diff --git a/tests/test_template.py b/tests/test_template.py index 2e5a0e87..cff320c1 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -1,75 +1,142 @@ -from copy import deepcopy +import itertools +from copy import copy import numpy as np import pytest -from path import Path +from eppy.bunch_subclass import EpBunch + +from archetypal import IDF, settings +from archetypal.eplus_interface.version import get_eplus_dirs +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, + UmiSchedule, + WeekSchedule, + YearSchedule, + YearSchedulePart, +) +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(small_idf_obj): + """An IDF model""" + if small_idf_obj.sim_info is None: + idf.simulate() + yield small_idf_obj + + +@pytest.fixture(scope="class") +def small_idf_copy(config): + """An IDF model -import archetypal as ar -import archetypal.settings -from archetypal import get_eplus_dirs, clear_cache, settings -from archetypal.settings import ep_version - - -@pytest.fixture(scope="session") -def small_idf(config): - """ Args: config: """ file = "tests/input_data/umi_samples/B_Off_0.idf" w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - idf = ar.load_idf(file) - sql: dict = ar.run_eplus( - file, - weather_file=w, - output_report="sql", - prep_outputs=True, - annual=False, - design_day=False, # This idf model cannot do DesignDay - verbose="v", - ) - yield idf, sql + idf = IDF(file, epw=w) + yield idf -@pytest.fixture(scope="session") +@pytest.fixture(scope="class") +def small_idf_obj(config): + """An IDF model. Yields just the idf object.""" + 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) + yield idf + + +@pytest.fixture(scope="module") def other_idf(config): - """ + """Another IDF object with a different signature. + Args: config: """ file = "tests/input_data/umi_samples/B_Res_0_Masonry.idf" w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - idf = ar.load_idf(file) - sql = ar.run_eplus( - file, - weather_file=w, - output_report="sql", - prep_outputs=True, - annual=False, - design_day=False, # This idf model cannot do DesignDay - verbose="v", - ) - yield idf, sql + idf = IDF(file, epw=w) + yield idf -@pytest.fixture(scope="session") -def small_office(config): +@pytest.fixture(scope="class") +def other_idf_object(config): + """Another IDF object (same as other_idf). Yields just the idf object + + Args: + config: """ + file = "tests/input_data/umi_samples/B_Res_0_Masonry.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 + + +@pytest.fixture(scope="module") +def other_idf_object_copy(config): + """Another IDF object with a different signature. + Args: config: """ - file = "tests/input_data/necb/NECB 2011-SmallOffice-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" + file = "tests/input_data/umi_samples/B_Res_0_Masonry.idf" w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - idf = ar.load_idf(file) - sql = ar.run_eplus( - file, - weather_file=w, - output_report="sql", - prep_outputs=True, - expandobjects=True, - verbose="v", + idf = IDF(file, epw=w) + if idf.sim_info is None: + idf.simulate() + yield idf + + +@pytest.fixture(scope="module") +def small_office(config): + file = ( + "tests/input_data/necb/NECB 2011-SmallOffice-NECB HDD " + "Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf" ) - yield idf, sql + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + idf = IDF(file, epw=w) + yield idf + + +@pytest.fixture(scope="module") +def idf(): + yield IDF(prep_outputs=False) + + +@pytest.fixture(scope="class", params=["RefBldgWarehouseNew2004_Chicago.idf"]) +def warehouse(config, request): + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + idf = IDF.from_example_files(request.param, epw=w, annual=True) + if idf.sim_info is None: + idf.simulate() + yield idf core_name = "core" @@ -93,140 +160,360 @@ 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 + + mass_ratio = MassRatio(600, structure_material, 300) + mass_ratio_dup = mass_ratio.duplicate() + + 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: - """Series of tests for the :class:`YearScheduleParts` class""" + """Series of tests for the :class:`YearSchedulePart` class""" - # todo: Implement tests for YearScheduleParts class + # todo: Implement tests for YearSchedulePart class pass class TestDaySchedule: """Series of tests for the :class:`DaySchedule` class""" - # todo: Implement tests for DaySchedule class - - def test_from_epbunch(self, small_idf): - """test the `from_epbunch` constructor + def test_init_day_schedule(self): + """Test constructor.""" + from archetypal.template.schedule import DaySchedule - Args: - small_idf: - """ - from archetypal import DaySchedule + day_schedule = DaySchedule("day_1", [0] * 24) + day_schedule_dup = day_schedule.duplicate() - idf, sql = 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) + assert day_schedule.Name == day_schedule_dup.Name == "day_1" + assert (day_schedule.all_values == day_schedule_dup.all_values).all() def test_from_values(self): - """test the `from_epbunch` constructor""" - from archetypal import DaySchedule + """test the `from_values` constructor.""" + from archetypal.template.schedule import DaySchedule values = np.array(range(0, 24)) kwargs = { - "$id": "66", "Category": "Day", - "schTypeLimitsName": "Fraction", - "Comments": "default", - "DataSource": "default", + "Type": "Fraction", "Name": "hourlyAllOn", + "Values": values, } - sched = DaySchedule.from_values(values, **kwargs) + sched = DaySchedule.from_values(**kwargs) assert len(sched.all_values) == 24.0 assert repr(sched) - def test_daySchedule_from_to_json(self, config): - """ - Args: - config: - """ - import json - from archetypal import load_json_objects + 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" - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - loading_json_list = load_json_objects(datastore) - daySched_to_json = loading_json_list[6][0].to_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 + + @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"] + + @pytest.fixture() + def schedule_day_hourly(self, schedules_idf): + yield schedules_idf.idfobjects["SCHEDULE:DAY:HOURLY"] + + @pytest.fixture() + def schedule_day_list(self, schedules_idf): + yield schedules_idf.idfobjects["SCHEDULE:DAY:LIST"] + + @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_from_epbunch(self, all_schedule_days): + """test the `from_epbunch` constructor.""" + + 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) class TestWeekSchedule: """Series of tests for the :class:`WeekSchedule` class""" - # todo: Implement tests for WeekSchedule class + @pytest.fixture() + def schedule_week_daily(self, schedules_idf): + yield schedules_idf.idfobjects["SCHEDULE:WEEK:DAILY"] - def test_weekSchedule_from_to_json(self, config): - """ - Args: - config: - """ - import json - from archetypal import WeekSchedule, load_json_objects + @pytest.fixture() + def schedule_week_compact(self, schedules_idf): + yield schedules_idf.idfobjects["SCHEDULE:WEEK:COMPACT"] - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - loading_json_list = load_json_objects(datastore) - weekSched_json = [ - WeekSchedule.from_json(**store) for store in datastore["WeekSchedules"] - ] - weekSched_to_json = weekSched_json[0].to_json() + @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" + ) + + @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 + a = WeekSchedule( + Days=days, + Category="Week", + Type="Fraction", + Name="OnOff_1", + ) + + @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}, + {"$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) + 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", + ) + + week_schedule_dict = a.to_dict() + + b = WeekSchedule.from_dict( + week_schedule_dict, day_schedules={a.id: a for a in days} + ) + assert a == b + assert a is not b class TestYearSchedule: """Series of tests for the :class:`YearSchedule` class""" - # todo: Implement tests for 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( + Name="AlwaysOn", Values=[1] * 24, Type="Fraction", Category="Day" + ) + sch_d_off = DaySchedule.from_values( + Name="AlwaysOff", Values=[0] * 24, Type="Fraction", Category="Day" + ) - def test_yearSchedule_from_to_json(self, config): - """ - Args: - config: - """ - import json - from archetypal import YearSchedule, load_json_objects + # 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", + ) - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - loading_json_list = load_json_objects(datastore) - yearSched_json = [ - YearSchedule.from_json(**store) for store in datastore["YearSchedules"] - ] - yearSched_to_json = yearSched_json[0].to_json() + # Dict of a YearSchedule (like it would be written in json file) + dict_year = { + "$id": "1", + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": {"$ref": sch_w_on_off.id}, + } + ], + "Type": "Fraction", + "Name": "OnOff", + } + # Creates YearSchedule from dict (from json) + 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 + 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: - """Series of tests for the :class:`YearScheduleParts` class""" + """Series of tests for the :class:`YearSchedulePart` class""" # todo: Implement tests for WindowType class @@ -236,67 +523,89 @@ class TestWindowType: class TestOpaqueMaterial: """Series of tests for the :class:`OpaqueMaterial` class""" - def test_add_materials(self): - """test __add__() for OpaqueMaterial""" - mat_a = ar.OpaqueMaterial(Conductivity=100, SpecificHeat=4.18, Name="mat_a") - mat_b = ar.OpaqueMaterial(Conductivity=200, SpecificHeat=4.18, Name="mat_b") + @pytest.fixture() + def mat_a(self): + yield OpaqueMaterial(Conductivity=0.1, SpecificHeat=4180, Name="mat_a") + + @pytest.fixture() + def mat_b(self): + yield OpaqueMaterial(Conductivity=0.2, SpecificHeat=4180, Name="mat_b") + + @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) + + def test_add_materials(self, mat_a, mat_b): + """Test __add__().""" mat_c = mat_a + mat_b assert mat_c - assert mat_c.Conductivity == 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): - """test __iadd__() for OpaqueMaterial""" - mat_a = ar.OpaqueMaterial(Conductivity=100, SpecificHeat=4.18, Name="mat_ia") + """test __iadd__().""" + mat_a = OpaqueMaterial(Conductivity=0.1, SpecificHeat=4180, Name="mat_ia") id_ = mat_a.id # storing mat_a's id. - mat_b = ar.OpaqueMaterial(Conductivity=200, SpecificHeat=4.18, Name="mat_ib") + mat_b = OpaqueMaterial(Conductivity=0.2, SpecificHeat=4180, Name="mat_ib") mat_a += mat_b assert mat_a - assert mat_a.Conductivity == 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(config, small_idf): - """ - Args: - small_idf: - """ - from archetypal import OpaqueMaterial - - idf, sql = small_idf - if idf.idfobjects["MATERIAL"]: - opaqMat_epBunch = OpaqueMaterial.from_epbunch(idf.idfobjects["MATERIAL"][0]) - opaqMat_epBunch.to_json() - if idf.idfobjects["MATERIAL:NOMASS"]: - opaqMat_epBunch = OpaqueMaterial.from_epbunch( - idf.idfobjects["MATERIAL:NOMASS"][0] - ) - opaqMat_epBunch.to_json() - if idf.idfobjects["MATERIAL:AIRGAP"]: - opaqMat_epBunch = OpaqueMaterial.from_epbunch( - idf.idfobjects["MATERIAL:AIRGAP"][0] - ) - opaqMat_epBunch.to_json() - - def test_hash_eq_opaq_mat(self, small_idf, other_idf): - """Test equality and hashing of :class:`TestOpaqueMaterial` - - Args: - small_idf: - other_idf: - """ - from archetypal.template import OpaqueMaterial - from copy import copy - - idf, sql = small_idf - opaq_mat = idf.getobject("MATERIAL", "B_Gypsum_Plaster_0.02_B_Off_Thm_0") - om = OpaqueMaterial.from_epbunch(opaq_mat) - om_2 = copy(om) + def test_from_to_dict(self): + """Get OpaqueMaterial, convert to json, load back and compare.""" + 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 @@ -313,7 +622,7 @@ def test_hash_eq_opaq_mat(self, small_idf, other_idf): assert om_2 in om_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. assert len(set(om_list)) == 1 # dict behavior @@ -336,30 +645,159 @@ def test_hash_eq_opaq_mat(self, small_idf, other_idf): # don't have the same hash. assert len(set(om_list)) == 2 - # 2 OpaqueMaterial from different idf should not have the same hash if they + # 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, sql_2 = other_idf - 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) - 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): + name = "A Glass Material" + glass = GlazingMaterial( + Name=name, + Density=2500, + Conductivity=1, + SolarTransmittance=0.7, + SolarReflectanceFront=0.5, + SolarReflectanceBack=0.5, + VisibleTransmittance=0.7, + 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): - """test __add__() for OpaqueMaterial""" - sg_a = ar.calc_simple_glazing(0.763, 2.716, 0.812) - sg_b = ar.calc_simple_glazing(0.578, 2.413, 0.706) - mat_a = ar.GlazingMaterial(Name="mat_a", **sg_a) - mat_b = ar.GlazingMaterial(Name="mat_b", **sg_b) + """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) + mat_b = GlazingMaterial(Name="mat_b", **sg_b) mat_c = mat_a + mat_b @@ -367,11 +805,11 @@ def test_add_glazing_material(self): assert mat_a.id != mat_b.id != mat_c.id def test_iadd_glazing_material(self): - """test __iadd__() for OpaqueMaterial""" - sg_a = ar.calc_simple_glazing(0.763, 2.716, 0.812) - sg_b = ar.calc_simple_glazing(0.578, 2.413, 0.706) - mat_a = ar.GlazingMaterial(Name="mat_ia", **sg_a) - mat_b = ar.GlazingMaterial(Name="mat_ib", **sg_b) + """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) + mat_b = GlazingMaterial(Name="mat_ib", **sg_b) id_ = mat_a.id # storing mat_a's id. @@ -381,18 +819,14 @@ def test_iadd_glazing_material(self): 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 + # todo: Implement from_to_dict test for GlazingMaterial class - def test_hash_eq_glaz_mat(self, config): - """Test equality and hashing of :class:`OpaqueConstruction` - - Args: - config: - """ + def test_hash_eq_glaz_mat(self): + """Test equality and hashing of :class:`OpaqueConstruction`.""" from copy import copy - sg_a = ar.calc_simple_glazing(0.763, 2.716, 0.812) - mat_a = ar.GlazingMaterial(Name="mat_ia", **sg_a) + sg_a = calc_simple_glazing(0.763, 2.716, 0.812) + mat_a = GlazingMaterial(Name="mat_ia", **sg_a) mat_b = copy(mat_a) # a copy of dhw should be equal and have the same hash, but still not be the @@ -410,7 +844,7 @@ def test_hash_eq_glaz_mat(self, config): assert mat_b in glm_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. assert len(set(glm_list)) == 1 # dict behavior @@ -447,45 +881,41 @@ def test_hash_eq_glaz_mat(self, config): class TestGasMaterial: """Series of tests for the GasMaterial class""" - # todo: Implement tests for GasMaterial class + def test_gas_material(self): + from archetypal.template.materials.gas_material import GasMaterial - def test_GasMaterial_from_to_json(self, config): - """ - Args: - config: - """ - import json - from archetypal import GasMaterial + air = GasMaterial(Name="Air", Conductivity=0.02, Density=1.24) - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - gasMat_json = [ - GasMaterial.from_json(**store) for store in datastore["GasMaterials"] - ] - gasMat_to_json = gasMat_json[0].to_json() - assert gasMat_json[0].Name == gasMat_to_json["Name"] + assert air.Conductivity == 0.02 + assert air.Density == 1.24 - def test_hash_eq_gas_mat(self, config): - """Test equality and hashing of :class:`OpaqueConstruction` + 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 - Args: - config: - """ - from archetypal.template import GasMaterial - from copy import copy + air = GasMaterial(Name="Air", Conductivity=0.02, Density=1.24) + + air_dict = air.to_dict() + + air_dup = GasMaterial.from_dict(air_dict) + + assert air == air_dup + + def test_hash_eq_gas_mat(self): + """Test equality and hashing of :class:`OpaqueConstruction`.""" import json + from archetypal.template.materials.gas_material import GasMaterial + filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - clear_cache() with open(filename, "r") as f: datastore = json.load(f) gasMat_json = [ - GasMaterial.from_json(**store) for store in datastore["GasMaterials"] + 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 @@ -502,7 +932,7 @@ def test_hash_eq_gas_mat(self, config): assert gm_2 in gm_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. assert len(set(gm_list)) == 1 # dict behavior @@ -528,7 +958,7 @@ def test_hash_eq_gas_mat(self, config): # 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) @@ -537,20 +967,20 @@ def test_hash_eq_gas_mat(self, config): class TestOpaqueConstruction: - """Series of tests for the :class:`OpaqueConstruction` class""" + """Series of tests for the :class:`OpaqueConstruction` class.""" @pytest.fixture() def mat_a(self): - """A :class:Material fixture""" - mat_a = ar.OpaqueMaterial( + """A :class:Material fixture.""" + mat_a = OpaqueMaterial( Conductivity=1.4, SpecificHeat=840, Density=2240, Name="Concrete" ) yield mat_a @pytest.fixture() def mat_b(self): - """A :class:Material fixture""" - mat_b = ar.OpaqueMaterial( + """A :class:Material fixture.""" + mat_b = OpaqueMaterial( Conductivity=0.12, SpecificHeat=1210, Density=540, Name="Plywood" ) @@ -558,41 +988,42 @@ def mat_b(self): @pytest.fixture() def construction_a(self, mat_a, mat_b): - """A :class:Construction fixture - - Args: - mat_a: - mat_b: - """ + """A :class:Construction fixture.""" thickness = 0.10 layers = [ - ar.MaterialLayer(mat_a, thickness), - ar.MaterialLayer(mat_b, thickness), + MaterialLayer(mat_a, thickness), + MaterialLayer(mat_b, thickness), ] - oc_a = ar.OpaqueConstruction(Layers=layers, Name="oc_a") + oc_a = OpaqueConstruction(Layers=layers, Name="oc_a") yield oc_a @pytest.fixture() def face_brick(self): - """A :class:Material fixture""" - face_brick = ar.OpaqueMaterial( - Conductivity=1.20, Density=1900, SpecificHeat=850, Name="Face Brick" + """A :class:Material fixture.""" + face_brick = OpaqueMaterial( + Conductivity=1.20, + Density=1900, + SpecificHeat=850, + Name="Face Brick", ) yield face_brick @pytest.fixture() def thermal_insulation(self): - """A :class:Material fixture""" - thermal_insulation = ar.OpaqueMaterial( - Conductivity=0.041, Density=40, SpecificHeat=850, Name="Thermal insulation" + """A :class:Material fixture.""" + thermal_insulation = OpaqueMaterial( + Conductivity=0.041, + Density=40, + SpecificHeat=850, + Name="Thermal insulation", ) yield thermal_insulation @pytest.fixture() def hollow_concrete_block(self): - """A :class:Material fixture""" - hollow_concrete_block = ar.OpaqueMaterial( + """A :class:Material fixture.""" + hollow_concrete_block = OpaqueMaterial( Conductivity=0.85, Density=2000, SpecificHeat=920, @@ -602,17 +1033,20 @@ def hollow_concrete_block(self): @pytest.fixture() def plaster(self): - """A :class:Material fixture""" - plaster = ar.OpaqueMaterial( + """A :class:Material fixture.""" + plaster = OpaqueMaterial( Conductivity=1.39, Density=2000, SpecificHeat=1085, Name="Plaster" ) yield plaster @pytest.fixture() def concrete_layer(self): - """A :class:Material fixture""" - concrete = ar.OpaqueMaterial( - Conductivity=1.70, Density=2300, SpecificHeat=920, Name="Concrete layer" + """A :class:Material fixture.""" + concrete = OpaqueMaterial( + Conductivity=1.70, + Density=2300, + SpecificHeat=920, + Name="Concrete layer", ) yield concrete @@ -626,12 +1060,12 @@ def facebrick_and_concrete( https://doi.org/10.1016/j.applthermaleng.2003.10.015 """ layers = [ - ar.MaterialLayer(face_brick, 0.1), - ar.MaterialLayer(thermal_insulation, 0.04), - ar.MaterialLayer(hollow_concrete_block, 0.2), - ar.MaterialLayer(plaster, 0.02), + MaterialLayer(face_brick, 0.1), + MaterialLayer(thermal_insulation, 0.04), + MaterialLayer(hollow_concrete_block, 0.2), + MaterialLayer(plaster, 0.02), ] - oc_a = ar.OpaqueConstruction(Layers=layers, Name="Facebrick–concrete wall") + oc_a = OpaqueConstruction(Layers=layers, Name="Facebrick–concrete wall") yield oc_a @@ -645,48 +1079,67 @@ def insulated_concrete_wall( https://doi.org/10.1016/j.applthermaleng.2003.10.015 """ layers = [ - ar.MaterialLayer(plaster, 0.02), - ar.MaterialLayer(concrete_layer, 0.20), - ar.MaterialLayer(thermal_insulation, 0.04), - ar.MaterialLayer(plaster, 0.02), + MaterialLayer(plaster, 0.02), + MaterialLayer(concrete_layer, 0.20), + MaterialLayer(thermal_insulation, 0.04), + MaterialLayer(plaster, 0.02), ] - oc_a = ar.OpaqueConstruction(Layers=layers, Name="Insulated Concrete Wall") + oc_a = OpaqueConstruction(Layers=layers, Name="Insulated Concrete Wall") yield oc_a @pytest.fixture() def construction_b(self, mat_a): - """A :class:Construction fixture - - Args: - mat_a: - """ + """A :class:Construction fixture.""" thickness = 0.30 - layers = [ar.MaterialLayer(mat_a, thickness)] - oc_b = ar.OpaqueConstruction(Layers=layers, Name="oc_b") + layers = [MaterialLayer(mat_a, thickness)] + oc_b = OpaqueConstruction(Layers=layers, Name="oc_b") yield oc_b - def test_thermal_properties(self, construction_a): - """test r_value and u_value properties + 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 - Args: - construction_a: - """ - assert 1 / construction_a.r_value == construction_a.u_value() + before_thickness = facebrick_and_concrete.total_thickness - def test_add_opaque_construction(self, construction_a, construction_b): - """Test __add__() for OpaqueConstruction + facebrick_and_concrete.r_value = new_r_value - Args: - construction_a: - construction_b: - """ - oc_c = construction_a.combine(construction_b, method="constant_ufactor") + after_thickness = facebrick_and_concrete.total_thickness + + 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): + """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 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.""" + assert 1 / construction_a.r_value == construction_a.u_value + + def test_add_opaque_construction(self, 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 @@ -702,80 +1155,59 @@ 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(config): - import json - from archetypal import ( - OpaqueConstruction, - OpaqueMaterial, - MaterialLayer, - load_json_objects, - ) + 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") - mat_b = OpaqueMaterial(Conductivity=200, SpecificHeat=4.18, Name="mat_b") + 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)] - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - loading_json_list = load_json_objects(datastore) - opaqConstr_json = [ - OpaqueConstruction.from_json(**store) - for store in datastore["OpaqueConstructions"] - ] - opaqConstr_to_json = 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 archetypal.template import OpaqueConstruction - 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 - idf, sql = small_idf - clear_cache() - opaq_constr = idf.getobject("CONSTRUCTION", "B_Off_Thm_0") - oc = OpaqueConstruction.from_epbunch(opaq_constr) - oc_2 = copy(oc) + def test_hash_eq_opaq_constr(self, construction_a, construction_b): + """Test equality and hashing of :class:`OpaqueConstruction`""" + + 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) assert oc_2 in oc_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. 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.IsAdiabatic = True - 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 @@ -783,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, sql_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) - 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 @@ -804,10 +1229,9 @@ def test_real_word_construction( Args: 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) @@ -816,9 +1240,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) @@ -831,103 +1253,418 @@ 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() -class TestWindowConstruction: - """Series of tests for the :class:`WindowConstruction` class""" + assert generic == generic_dup + assert generic is not generic_dup - # todo: Implement from_to_json for WindowConstruction class + generic_internalmass = OpaqueConstruction.generic_internalmass() + generic_internalmass_dup = generic_internalmass.duplicate() - def test_windowConstr_from_to_json(config): - import json - from archetypal import WindowConstruction, load_json_objects + assert generic_internalmass == generic_internalmass_dup + assert generic_internalmass is not generic_internalmass_dup - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - loading_json_list = load_json_objects(datastore) - winConstr_json = [ - WindowConstruction.from_json(**store) - for store in datastore["WindowConstructions"] - ] - winConstr_to_json = winConstr_json[0].to_json() + 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) -class TestStructureDefinition: - """Series of tests for the :class:`StructureDefinition` class""" + assert oc_im.Name == "PerimInternalMass" - # todo: Implement from_to_json for StructureDefinition class + surface = small_idf_obj.idfobjects["CONSTRUCTION"][0] + oc_surface = OpaqueConstruction.from_epbunch(surface) - def test_structure_from_to_json(config): - import json - from archetypal import StructureDefinition, load_json_objects + assert oc_surface.Name == "B_Off_Thm_0" - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - loading_json_list = load_json_objects(datastore) - struct_json = [ - StructureDefinition.from_json(**store) - for store in datastore["StructureDefinitions"] + # 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""" + + @pytest.fixture() + def air(self): + yield GasMaterial(Name="Air") + + @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, + ) + + 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, ] - struct_to_json = struct_json[0].to_json() + window = WindowConstruction(Layers=layers, Name="Triple Clear Window") + window_dup = window.duplicate() - def test_hash_eq_struc_def(self, config): - """Test equality and hashing of :class:`OpaqueConstruction` + assert window == window_dup + assert window.u_factor == pytest.approx(1.757, rel=1e-2) - Args: - config: - """ - from archetypal import StructureDefinition, load_json_objects - from copy import copy - import json + 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") + + layers = [gap, clear_glass, gap, clear_glass] + with pytest.raises(AssertionError): + WindowConstruction(Layers=layers, Name="Triple Clear Window") + + def test_window_construction_from_to_dict(self): + """Make dict with `to_dict` and load again with `from_dict`.""" + + 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" - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - loading_json_list = load_json_objects(datastore) - struct_json = [ - StructureDefinition.from_json(**store) - 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", + }, + ] ] - sd = struct_json[0] - sd_2 = copy(sd) + + 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", + ) + + combined = triple + double + + assert combined + + 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) + + # 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 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) assert sd_2 in sd_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. 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. @@ -936,25 +1673,21 @@ def test_hash_eq_struc_def(self, config): # 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): - """ - Args: - config: - """ - from archetypal import UmiSchedule + def test_constant_umischedule(self): + """""" const = UmiSchedule.constant_schedule() assert const.__class__.__name__ == "UmiSchedule" @@ -966,27 +1699,18 @@ def test_schedule_develop(self, config, small_idf): config: small_idf: """ - from archetypal import UmiSchedule - idf, sql = small_idf - clear_cache() + 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` - - Args: - small_idf: - other_idf: - """ - from archetypal.template import UmiSchedule - from copy import copy + """Test equality and hashing of :class:`ZoneLoad`""" - idf, sql = small_idf - clear_cache() - 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 @@ -1003,7 +1727,7 @@ def test_hash_eq_umi_sched(self, small_idf, other_idf): assert sched_2 in sched_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. assert len(set(sched_list)) == 1 # dict behavior @@ -1026,129 +1750,111 @@ 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 not 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, sql_2 = other_idf - clear_cache() - assert idf is not idf_2 - sched_3 = UmiSchedule(Name="On", idf=idf_2) + 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) + assert hash(sched) == hash(sched_3) assert id(sched) != id(sched_3) + def test_combine(self): + import numpy as np -class TestZoneConstructionSet: - """Combines different :class:`ZoneConstructionSet` tests""" - - @pytest.fixture(params=["RefBldgWarehouseNew2004_Chicago.idf"]) - def zoneConstructionSet_tests(self, config, request): - """ - Args: - config: - request: - """ - from eppy.runner.run_functions import install_paths + from archetypal.utils import reduce - file = get_eplus_dirs(settings.ep_version) / "ExampleFiles" / request.param - w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - sql, idf = ar.run_eplus( - file, - weather_file=w, - output_report="sql", - prep_outputs=True, - annual=False, - design_day=False, - verbose="v", - return_idf=True, + sch1 = UmiSchedule( + Name="Equipment_10kw", Values=np.ones(24), quantity=10, Type="Fraction" ) - yield idf, sql - - def test_add_zoneconstructionset(self, small_idf): - """Test __add__() for ZoneConstructionSet - - Args: - small_idf: - """ - idf, sql = small_idf - zone_core = idf.getobject("ZONE", core_name) - zone_perim = idf.getobject("ZONE", perim_name) - - z_core = ar.ZoneConstructionSet.from_zone( - ar.Zone.from_zone_epbunch(zone_core, sql=sql) + sch2 = UmiSchedule( + Name="Equipment_20kw", Values=np.ones(24) / 2, quantity=20, Type="Fraction" ) - z_perim = ar.ZoneConstructionSet.from_zone( - ar.Zone.from_zone_epbunch(zone_perim, sql=sql) + sch3 = UmiSchedule( + Name="Equipment_30kw", Values=np.ones(24) / 3, quantity=30, Type="Fraction" ) - z_new = z_core + z_perim - assert z_new + sch4 = reduce(UmiSchedule.combine, (sch1, sch2, sch3)) + assert sch4 - def test_iadd_zoneconstructionset(self, small_idf): - """Test __iadd__() for ZoneConstructionSet - Args: - small_idf: - """ - idf, sql = small_idf - zone_core = idf.getobject("ZONE", core_name) - zone_perim = idf.getobject("ZONE", perim_name) +class TestZoneConstructionSet: + """Combines different :class:`ZoneConstructionSet` tests.""" - z_core = ar.ZoneConstructionSet.from_zone( - ar.Zone.from_zone_epbunch(zone_core, sql=sql) + @pytest.fixture() + def core_set(self): + yield ZoneConstructionSet( + Name="Core Construction Set", Partition=OpaqueConstruction.generic() ) - z_perim = ar.ZoneConstructionSet.from_zone( - ar.Zone.from_zone_epbunch(zone_perim, sql=sql) + + @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): - """ - Args: - config: - """ - from archetypal import ZoneConstructionSet + z_new = core_set + perim_set + assert z_new == core_set == perim_set - constrSet = ZoneConstructionSet(Name=None) + 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, zoneConstructionSet_tests): - """ - Args: - config: - zoneConstructionSet_tests: - """ - from archetypal import ZoneConstructionSet, Zone + assert core_set + assert core_set.id == id_ # id should not change + assert core_set.id != perim_set.id + + def test_zoneConstructionSet_init(self): + """Test constructor.""" + construction_set = ZoneConstructionSet(Name="A construction set") + construction_set_dup = construction_set.duplicate() - sql = next(iter([i for i in zoneConstructionSet_tests if isinstance(i, dict)])) - idf = next( - iter([i for i in zoneConstructionSet_tests if isinstance(i, ar.IDF)]) + assert construction_set == construction_set_dup + assert ( + construction_set.Name == construction_set_dup.Name == "A construction set" ) - zone = idf.getobject("ZONE", "Office") - z = Zone.from_zone_epbunch(zone_ep=zone, sql=sql) + + 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) - def test_zoneConstructionSet_from_to_json(self, config): - """ - Args: - config: - """ - import json - from archetypal import ZoneConstructionSet, load_json_objects + 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", + } - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - loading_json_list = load_json_objects(datastore) - constr_json = [ - ZoneConstructionSet.from_json(**store) - for store in datastore["ZoneConstructionSets"] - ] - constr_to_json = 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: @@ -1156,130 +1862,106 @@ class TestZoneLoad: @pytest.fixture(scope="class") def fiveZoneEndUses(self, config): - file = ( - get_eplus_dirs(settings.ep_version) - / "ExampleFiles" - / "5ZoneAirCooled_AirBoundaries_Daylighting.idf" - ) - w = ( + """""" + epw = ( get_eplus_dirs(settings.ep_version) / "WeatherData" / "USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw" ) - idf = ar.load_idf(file, weather_file=w) - sql = idf.run_eplus( - output_report="sql", - prep_outputs=True, - annual=False, - design_day=True, - verbose="v", + idf = IDF.from_example_files( + "5ZoneAirCooled_AirBoundaries_Daylighting.idf", epw=epw ) - yield idf, sql - - @pytest.fixture(scope="class", params=["RefBldgWarehouseNew2004_Chicago.idf"]) - def zoneLoadtests(self, config, request): - """ - Args: - config: - request: - """ - from eppy.runner.run_functions import install_paths - - file = get_eplus_dirs(settings.ep_version) / "ExampleFiles" / request.param - w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - idf = ar.load_idf(file) - sql = ar.run_eplus( - file, - weather_file=w, - output_report="sql", - prep_outputs=True, - annual=False, - design_day=True, - verbose="v", - ) - yield idf, sql - - def test_zoneLoad_init(self, config): - """ - Args: - config: - """ - from archetypal import ZoneLoad - - load = ZoneLoad(Name=None) - - def test_zoneLoad_from_zone(self, config, zoneLoadtests): - """ - Args: - config: - zoneLoadtests: - """ - from archetypal import ZoneLoad, Zone + if idf.sim_info is None: + idf.simulate() + yield idf + + 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 - idf, sql = zoneLoadtests + def test_zoneLoad_from_zone(self, warehouse): + """""" + idf = warehouse zone = idf.getobject("ZONE", "Office") - z = Zone.from_zone_epbunch(zone_ep=zone, sql=sql) - zone_loads = ZoneLoad.from_zone(z) + z = ZoneDefinition.from_epbunch(ep_bunch=zone) + zone_loads = ZoneLoad.from_zone(z, zone) - assert zone_loads.DimmingType == "Off" - assert zone_loads.EquipmentPowerDensity == 8.07 - assert zone_loads.IlluminanceTarget == 500 + assert zone_loads.DimmingType == DimmingTypes.Off + 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 - np.testing.assert_almost_equal(zone_loads.PeopleDensity, 0.021107919980354082) - - def test_zoneLoad_from_zone_mixedparams(self, config, fiveZoneEndUses): - from archetypal import ZoneLoad, Zone - - idf, sql = fiveZoneEndUses - zone = idf.getobject("ZONE", "SPACE1-1") - z = Zone.from_zone_epbunch(zone_ep=zone, sql=sql) - zone_loads = ZoneLoad.from_zone(z) - - assert zone_loads.DimmingType == "Stepped" - np.testing.assert_almost_equal( - zone_loads.EquipmentPowerDensity, 10.649455425574827 - ) + 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, fiveZoneEndUses): + """""" + idf = fiveZoneEndUses + 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 == pytest.approx(10.649, 1e-2) assert zone_loads.IlluminanceTarget == 400 assert zone_loads.IsEquipmentOn assert zone_loads.IsPeopleOn - np.testing.assert_almost_equal( - zone_loads.LightingPowerDensity, 15.974, decimal=3 - ) - np.testing.assert_almost_equal(zone_loads.PeopleDensity, 0.111, decimal=3) - - def test_zoneLoad_from_to_json(self, config): - """ - Args: - config: - """ - import json - from archetypal import ZoneLoad, load_json_objects - - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - loading_json_list = load_json_objects(datastore) - load_json = [ZoneLoad.from_json(**store) for store in datastore["ZoneLoads"]] - load_to_json = load_json[0].to_json() - - def test_hash_eq_zone_load(self, small_idf): - """Test equality and hashing of :class:`ZoneLoad` + 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"), + ] + 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 - Args: - small_idf: - """ - from archetypal.template import ZoneLoad, Zone - from copy import copy + @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, sql = small_idf - clear_cache() - zone_ep = idf.idfobjects["ZONE"][0] - zone = Zone.from_zone_epbunch(zone_ep, sql=sql) - 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 @@ -1296,7 +1978,7 @@ def test_hash_eq_zone_load(self, small_idf): assert zl_2 in zl_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. assert len(set(zl_list)) == 1 # dict behavior @@ -1319,22 +2001,27 @@ def test_hash_eq_zone_load(self, small_idf): # don't have the same hash. assert len(set(zl_list)) == 2 - # 2 ZoneLoad 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 + # 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 = deepcopy(idf) - clear_cache() - zone_ep_3 = idf_2.idfobjects["ZONE"][0] - zone_3 = Zone.from_zone_epbunch(zone_ep_3, sql=sql) - assert idf is not idf_2 - zl_3 = ZoneLoad.from_zone(zone_3) - 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""" @@ -1348,92 +2035,105 @@ class TestZoneConditioning: ], ) def zoneConditioningtests(self, config, request): - """ - Args: - config: - request: - """ - - file = get_eplus_dirs(settings.ep_version) / "ExampleFiles" / request.param w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - idf = ar.load_idf(file) - sql = ar.run_eplus( - file, - weather_file=w, - output_report="sql", - prep_outputs=True, - annual=False, - design_day=True, - verbose="v", - ) - yield idf, sql, request.param - - def test_zoneConditioning_init(self, config): - """ - Args: - config: - """ - from archetypal import ZoneConditioning + idf = IDF.from_example_files( + request.param, epw=w, annual=False, design_day=True + ) + copy = IDF.from_example_files( + request.param, epw=w, annual=False, design_day=True + ) + if idf.sim_info is None: + idf.simulate() + if copy.sim_info is None: + copy.simulate() + yield ( + idf, + request.param, + copy, # yield a copy + ) - cond = ZoneConditioning(Name=None) - assert cond.Name == None + def test_zone_conditioning_init(self): + """Test constructor.""" + cond = ZoneConditioning(Name="A Name") + cond_dup = cond.duplicate() - def test_zoneConditioning_from_zone(self, config, zoneConditioningtests): - """ - Args: - config: - zoneConditioningtests: - """ - from archetypal import ZoneConditioning, Zone + assert ( + cond.EconomizerType + == cond_dup.EconomizerType + == EconomizerTypes.NoEconomizer + ) - idf, sql, idf_name = zoneConditioningtests + def test_from_zone(self, config, zoneConditioningtests): + """""" + + idf, idf_name, _ = zoneConditioningtests if idf_name == "RefMedOffVAVAllDefVRP.idf": - zone = idf.getobject("ZONE", "Core_mid") - z = Zone.from_zone_epbunch(zone_ep=zone, sql=sql) - 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 = Zone.from_zone_epbunch(zone_ep=zone, sql=sql) - 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 = Zone.from_zone_epbunch(zone_ep=zone, sql=sql) - cond_HX_eco = ZoneConditioning.from_zone(z) + 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", + } - def test_zoneConditioning_from_to_json(self, config): - """ - Args: - config: - """ - import json - from archetypal import ZoneConditioning, load_json_objects + cond = ZoneConditioning.from_dict( + copy(data), schedules={a.id: a for a in [schedule]} + ) - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - loading_json_list = load_json_objects(datastore) - cond_json = [ - ZoneConditioning.from_json(**store) - for store in datastore["ZoneConditionings"] - ] - cond_to_json = cond_json[0].to_json() + cond_dict = cond.to_dict() - def test_hash_eq_zone_cond(self, zoneConditioningtests): - """Test equality and hashing of :class:`ZoneConditioning` + cond_dup = ZoneConditioning.from_dict( + cond_dict, schedules={a.id: a for a in [schedule]} + ) - Args: - small_idf: - """ - from archetypal.template import ZoneConditioning, Zone - from copy import copy + assert cond == cond_dup + assert cond is not cond_dup + assert cond.Name == cond_dup.Name == "B_Off_0 Conditioning" + + def test_hash_eq_zone_cond(self): + """Test equality and hashing of :class:`ZoneConditioning`.""" - idf, sql, idf_name = zoneConditioningtests - clear_cache() - zone_ep = idf.idfobjects["ZONE"][0] - zone = Zone.from_zone_epbunch(zone_ep, sql=sql) - 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 @@ -1450,7 +2150,7 @@ def test_hash_eq_zone_cond(self, zoneConditioningtests): assert zc_2 in zc_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. assert len(set(zc_list)) == 1 # dict behavior @@ -1466,7 +2166,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 @@ -1476,15 +2176,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.) - idf_2 = deepcopy(idf) - clear_cache() - zone_ep_3 = idf_2.idfobjects["ZONE"][0] - zone_3 = Zone.from_zone_epbunch(zone_ep_3, sql=sql) - 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 @@ -1498,93 +2192,97 @@ class TestVentilationSetting: params=["VentilationSimpleTest.idf", "RefBldgWarehouseNew2004_Chicago.idf"], ) def ventilatontests(self, config, request): - """ - Args: - config: - request: - """ - from eppy.runner.run_functions import install_paths + """Create test cases with different ventilation definitions.""" eplusdir = get_eplus_dirs(settings.ep_version) - file = eplusdir / "ExampleFiles" / request.param w = eplusdir / "WeatherData" / "USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw" - idf = ar.load_idf(file) - sql = ar.run_eplus( - file, - weather_file=w, - output_report="sql", - prep_outputs=True, - annual=False, - design_day=False, - verbose="v", - ) - yield idf, sql, request.param - - def test_ventilation_init(self, config): - """ - Args: - config: - """ - from archetypal import VentilationSetting - - vent = VentilationSetting(Name=None) + idf = IDF.from_example_files(request.param, epw=w, annual=True) + if idf.sim_info is None: + idf.simulate() + copy = IDF.from_example_files(request.param, epw=w, annual=True) + if copy.sim_info is None: + copy.simulate() + yield idf, request.param, copy # passes a copy as well + + def test_ventilation_init(self): + """Test __init__ constructor.""" + schedule = UmiSchedule.constant_schedule() + + 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 import VentilationSetting, Zone + assert vent == vent_dup + assert vent is not vent_dup + assert vent.Name == vent_dup.Name == "Ventilation 1" - idf, sql, idf_name = ventilatontests + 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 = Zone.from_zone_epbunch(zone_ep=zone, sql=sql) - 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 = Zone.from_zone_epbunch(zone_ep=zone, sql=sql) - 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 = Zone.from_zone_epbunch(zone_ep=zone, sql=sql) - infiltVent = VentilationSetting.from_zone(z) - - def test_ventilationSetting_from_to_json(self, config): - """ - Args: - config: - """ - import json - from archetypal import VentilationSetting, load_json_objects + 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() - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - clear_cache() - with open(filename, "r") as f: - datastore = json.load(f) - loading_json_list = load_json_objects(datastore) - vent_json = [ - VentilationSetting.from_json(**store) - for store in datastore["VentilationSettings"] - ] - vent_to_json = vent_json[0].to_json() + vent_dup = VentilationSetting.from_dict( + vent_dict, schedules={a.id: a for a in [schedule]} + ) - def test_hash_eq_vent_settings(self, small_idf): - """Test equality and hashing of :class:`DomesticHotWaterSetting` + assert vent == vent_dup + assert vent is not vent_dup + assert vent.Name == vent_dup.Name == "Ventilation 1" - Args: - small_idf: - """ - from archetypal.template import VentilationSetting, Zone - from copy import copy + def test_hash_eq_vent_settings(self): + """Test equality and hashing of :class:`DomesticHotWaterSetting`.""" - idf, sql = small_idf - clear_cache() - zone_ep = idf.idfobjects["ZONE"][0] - zone = Zone.from_zone_epbunch(zone_ep, sql=sql) - 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 @@ -1601,7 +2299,7 @@ def test_hash_eq_vent_settings(self, small_idf): assert vent_2 in vent_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. assert len(set(vent_list)) == 1 # dict behavior @@ -1625,40 +2323,224 @@ def test_hash_eq_vent_settings(self, small_idf): assert len(set(vent_list)) == 2 # 2 VentilationSettings 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 + # have same names, not be the same object, yet be equal if they have the # same values (Infiltration, IsWindOn, etc.) - idf_2 = deepcopy(idf) - clear_cache() - zone_ep_3 = idf_2.idfobjects["ZONE"][0] - zone_3 = Zone.from_zone_epbunch(zone_ep_3, sql=sql) - assert idf is not idf_2 - vent_3 = VentilationSetting.from_zone(zone_3) - 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=0, + NatVentSchedule=always_on, + ScheduledVentilationAch=0, + 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 archetypal.template import DomesticHotWaterSetting, Zone - 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 - idf, sql = small_idf - clear_cache() - zone_ep = idf.idfobjects["ZONE"][0] - zone = Zone.from_zone_epbunch(zone_ep, sql=sql) + def test_from_zone(self, five_zone_water_systems): + zone = five_zone_water_systems.getobject("ZONE", "SPACE5-1") dhw = DomesticHotWaterSetting.from_zone(zone) - dhw_2 = copy(dhw) + 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) + + def test_hash_eq_dhw(self): + """Test equality and hashing of :class:`DomesticHotWaterSetting`.""" + + dhw = DomesticHotWaterSetting( + "Domestic", + WaterSchedule=UmiSchedule.constant_schedule(), + IsOn=True, + FlowRatePerFloorArea=0.03, + WaterSupplyTemperature=65, + WaterTemperatureInlet=10, + area=1, + ) + dhw_2 = dhw.duplicate() # a copy of dhw should be equal and have the same hash, but still not be the # same object @@ -1675,7 +2557,7 @@ def test_hash_eq_dhw(self, small_idf): assert dhw_2 in dhw_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. assert len(set(dhw_list)) == 1 # dict behavior @@ -1698,25 +2580,9 @@ def test_hash_eq_dhw(self, small_idf): # don't have the same hash. assert len(set(dhw_list)) == 2 - # 2 DomesticHotWaterSettings 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 (Infiltration, IsWindOn, etc.) - idf_2 = deepcopy(idf) - clear_cache() - zone_ep_3 = idf_2.idfobjects["ZONE"][0] - zone_3 = Zone.from_zone_epbunch(zone_ep_3, sql=sql) - assert idf is not idf_2 - dhw_3 = DomesticHotWaterSetting.from_zone(zone_3) - assert zone_ep is not zone_ep_3 - assert zone_ep != zone_ep_3 - assert hash(dhw) == hash(dhw_3) - assert id(dhw) != id(dhw_3) - assert dhw is not dhw_3 - assert dhw == dhw_3 - class TestWindowSetting: - """Combines different :class:`WindowSetting` tests""" + """Combines different :class:`WindowSetting` tests.""" @pytest.fixture( scope="class", params=["WindowTests.idf", "AirflowNetwork3zVent.idf"] @@ -1727,182 +2593,128 @@ def windowtests(self, config, request): config: request: """ - eplusdir = get_eplus_dirs(archetypal.settings.ep_version) - file = eplusdir / "ExampleFiles" / request.param w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - idf = ar.load_idf(file) - sql = ar.run_eplus( - file, - weather_file=w, - output_report="sql", - prep_outputs=True, - annual=False, - design_day=False, - verbose="v", - ) - yield idf, sql + idf = IDF.from_example_files(request.param, epw=w, design_day=True) + if idf.sim_info is None: + idf.simulate() + yield idf def test_window_from_construction_name(self, small_idf): """ Args: small_idf: """ - from archetypal import WindowSetting - - idf, sql = small_idf + 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 import WindowSetting - - idf, sql = windowtests + idf = windowtests f_surfs = idf.idfobjects["FENESTRATIONSURFACE:DETAILED"] windows = [] for f in f_surfs: 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() - def test_window_fromsurface(self, config, small_idf): - """ - Args: - config: - small_idf: - """ - from archetypal import WindowSetting + assert w == w_dup + assert w.Name == w_dup.Name - idf, sql = small_idf - f_surfs = idf.idfobjects["FENESTRATIONSURFACE:DETAILED"] - for f in f_surfs: - constr = f.Construction_Name - idf.add_object( - "WindowMaterial:Shade".upper(), - Visible_Transmittance=0.5, - Name="Roll Shade", - save=False, - ) - idf.add_object( - "WindowShadingControl".upper(), - Construction_with_Shading_Name=constr, - Setpoint=14, - Shading_Device_Material_Name="Roll Shade", - save=False, - Fenestration_Surface_1_Name="test_control", - ) - f.Name = "test_control" - w = WindowSetting.from_surface(f) - assert w - print(w) + 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 operator import add - from functools import reduce + from archetypal.utils import reduce - window = reduce(add, allwindowtypes) + window = reduce(WindowSetting.combine, allwindowtypes) print(window) - def test_window_add(self, small_idf, other_idf): - """ - Args: - small_idf: - """ - from archetypal import WindowSetting - - idf, sql = small_idf - idf2, sql2 = 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) - zone = idf2.idfobjects["ZONE"][0] - iterator = iter([win for surf in zone.zonesurfaces for win in surf.subsurfaces]) - surface = next(iterator) - window_2 = WindowSetting.from_surface(surface) + def test_window_add(self, allwindowtypes): + window_1, window_2, *_ = allwindowtypes # take 2 new_w = window_1 + window_2 - assert new_w + 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: - """ - from archetypal import WindowSetting - - idf, sql = small_idf - idf2, sql2 = 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) + def test_window_iadd(self, allwindowtypes): + window_1, window_2, *_ = allwindowtypes + + 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): - """test __add__() for OpaqueMaterial + def test_window_generic(self): + w = WindowSetting.generic("Generic Window") - Args: - config: - """ - sg_a = ar.calc_simple_glazing(0.763, 2.716, 0.812) - mat_a = ar.GlazingMaterial(Name="mat_a", **sg_a) - glazMat_to_json = mat_a.to_json() - assert glazMat_to_json - - def test_window_generic(self, small_idf): - """ - Args: - small_idf: - """ - from archetypal import WindowSetting - - idf, sql = small_idf - w = WindowSetting.generic(idf) - - assert w.to_json() + assert w.to_dict() - def test_hash_eq_window_settings(self, small_idf): - """Test equality and hashing of :class:`DomesticHotWaterSetting` + def test_hash_eq_window_settings(self, small_idf, small_idf_copy): + """Test equality and hashing of :class:`DomesticHotWaterSetting`""" - Args: - small_idf: - """ - from archetypal.template import WindowSetting - from copy import copy - - idf, sql = small_idf + 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 @@ -1919,7 +2731,7 @@ def test_hash_eq_window_settings(self, small_idf): assert wind_2 in wind_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. assert len(set(wind_list)) == 1 # dict behavior @@ -1945,84 +2757,181 @@ def test_hash_eq_window_settings(self, small_idf): # 2 WindowSettings 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 (Construction, Type, etc.) - idf_2 = deepcopy(idf) - clear_cache() + idf_2 = small_idf_copy f_surf_3 = idf_2.idfobjects["FENESTRATIONSURFACE:DETAILED"][0] - wind_3 = WindowSetting.from_surface(f_surf_3) + wind_3 = WindowSetting.from_surface(f_surf_3, allow_duplicates=True) assert idf is not idf_2 assert f_surf is not f_surf_3 assert f_surf != f_surf_3 assert hash(wind) == hash(wind_3) - assert id(wind) != id(wind_3) assert wind is not wind_3 assert wind == wind_3 - -class TestZone: - """Tests for :class:`Zone` class""" - - def test_zone_volume(self, config): - """Test the zone volume for a sloped roof - + def test_window_fromsurface(self, config, small_idf): + """ Args: config: + small_idf: """ - from archetypal import Zone + idf = small_idf + f_surfs = idf.idfobjects["FENESTRATIONSURFACE:DETAILED"] + for f in f_surfs: + constr = f.Construction_Name + idf.newidfobject( + "WindowMaterial:Shade".upper(), + Visible_Transmittance=0.5, + Name="Roll Shade", + ) + idf.newidfobject( + "WindowShadingControl".upper(), + Construction_with_Shading_Name=constr, + Setpoint=14, + Shading_Device_Material_Name="Roll Shade", + Fenestration_Surface_1_Name="test_control", + ) + f.Name = "test_control" + w = WindowSetting.from_surface(f) + assert w - file = "tests/input_data/necb/NECB 2011-FullServiceRestaurant-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 = ar.load_idf(file) - sql = ar.run_eplus( - file, - weather_file=w, - output_report="sql", - prep_outputs=True, - annual=False, - design_day=False, - verbose="v", - ) - zone = idf.getobject( - "ZONE", "Sp-attic Sys-0 Flr-2 Sch-- undefined - " "HPlcmt-core ZN" - ) - z = Zone.from_zone_epbunch(zone_ep=zone, sql=sql) - np.testing.assert_almost_equal(desired=z.volume, actual=856.3, decimal=1) - z.to_json() - - def test_add_zone(self, small_idf): - """Test __add__() for Zone + +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_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() + + assert zone == zone_dup + assert zone.Name == zone_dup.Name + + 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}, + ) + + 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: + small_idf_copy: """ - idf, sql = small_idf - zone_core = idf.getobject("ZONE", core_name) - zone_perim = idf.getobject("ZONE", perim_name) + idf = small_idf_copy + 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 = ar.Zone.from_zone_epbunch(zone_core, sql=sql) - z_perim = ar.Zone.from_zone_epbunch(zone_perim, sql=sql) + 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): - """Test __iadd__() for Zone - - Args: - small_idf: - """ - idf, sql = small_idf - zone_core = idf.getobject("ZONE", core_name) - zone_perim = idf.getobject("ZONE", perim_name) - - z_core = ar.Zone.from_zone_epbunch(zone_core, sql=sql) - z_perim = ar.Zone.from_zone_epbunch(zone_perim, sql=sql) volume = z_core.volume + z_perim.volume # save volume before changing area = z_core.area + z_perim.area # save area before changing @@ -2033,24 +2942,18 @@ def test_iadd_zone(self, small_idf): 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) - - def test_hash_eq_zone(self, small_idf): - """Test equality and hashing of :class:`ZoneLoad` + assert z_core.volume == pytest.approx(volume) + assert z_core.area == pytest.approx(area) - Args: - small_idf: - """ - from archetypal.template import Zone - from copy import copy - - idf, sql = map(deepcopy, small_idf) - clear_cache() - zone_ep = idf.idfobjects["ZONE"][0] - zone = Zone.from_zone_epbunch(zone_ep, sql=sql) - zone_2 = copy(zone) + def test_hash_eq_zone(self): + """Test equality and hashing of :class:`ZoneLoad`.""" + 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 @@ -2067,7 +2970,7 @@ def test_hash_eq_zone(self, small_idf): assert zone_2 in zone_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. assert len(set(zone_list)) == 1 # dict behavior @@ -2093,13 +2996,8 @@ def test_hash_eq_zone(self, small_idf): # 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 = deepcopy(idf) - clear_cache() - zone_ep_3 = idf_2.idfobjects["ZONE"][0] - zone_3 = Zone.from_zone_epbunch(zone_ep_3, sql=sql) - 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 @@ -2107,95 +3005,137 @@ def test_hash_eq_zone(self, small_idf): @pytest.fixture(scope="session") -def bt(): +def bt(config): """A building template fixture used in subsequent tests""" - eplus_dir = get_eplus_dirs(archetypal.settings.ep_version) - file = eplus_dir / "ExampleFiles" / "5ZoneCostEst.idf" - w = next(iter((eplus_dir / "WeatherData").glob("*.epw")), None) - file = ar.copy_file(file) - idf = ar.load_idf(file) - sql = ar.run_eplus( - file, - weather_file=w, - output_report="sql", - prep_outputs=True, - annual=True, - expandobjects=True, - verbose="v", - ) - from archetypal import BuildingTemplate - bt = BuildingTemplate.from_idf(idf, sql=sql) - yield bt - - -@pytest.fixture(scope="session") -def climatestudio(): - """A building template fixture from a climate studio idf file used in subsequent - tests""" - eplus_dir = get_eplus_dirs(archetypal.settings.ep_version) - file = "tests/input_data/umi_samples/climatestudio_test.idf" w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - _, idf, res = ar.run_eplus( - file, - w, - ep_version="9-2-0", - return_idf=True, - return_files=True, - prep_outputs=True, - output_report="sql", - ) - from archetypal import BuildingTemplate + idf = IDF.from_example_files("5ZoneCostEst.idf", epw=w, annual=True) + if idf.sim_info is None: + idf.simulate() - bt = BuildingTemplate.from_idf(idf, sql=idf.sql) + bt = BuildingTemplate.from_idf(idf) yield bt class TestBuildingTemplate: """Various tests with the :class:`BuildingTemplate` class""" - def test_climatestudio(self, config, climatestudio): - template_json = ar.UmiTemplate( - name="my_umi_template", BuildingTemplates=[climatestudio] - ).to_json(all_zones=True) - print(template_json) + @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 - def test_viewbuilding(self, config, bt): - """test the visualization of a building + @pytest.fixture() + def window_setting(self, window_construction): + window_setting = WindowSetting( + "Window Setting", Construction=window_construction, id="181" + ) + return window_setting - Args: - config: - bt: - """ - bt.view_building() + @pytest.fixture() + def window_construction(self): + window_cstrc = WindowConstruction.from_shgc( + "Window Construction", 0.5, 2.2, 0.21, id="57" + ) + return window_cstrc - def test_buildingTemplate_from_to_json(self, config): - """ - Args: - config: - """ - from archetypal import UmiTemplate + @pytest.fixture() + def structure_information(self): + return StructureInformation( + MassRatios=[MassRatio(600, OpaqueMaterial.generic(), 300)], + Name="structure", + id="64", + ) - filename = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" - clear_cache() - b = UmiTemplate.read_file(filename) - bt = b.BuildingTemplates - bt_to_json = bt[0].to_json() - w_to_json = bt[0].Windows.to_json() + @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_hash_eq_bt(self, other_idf): - """Test equality and hashing of class DomesticHotWaterSetting + 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}, + ) - Args: - other_idf: - """ - from archetypal.template import BuildingTemplate - from copy import copy + bt_dict = bt.to_dict() - idf, sql = other_idf - clear_cache() - bt = BuildingTemplate.from_idf(idf, sql=sql) - bt_2 = copy(bt) + 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 + + 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 @@ -2212,7 +3152,7 @@ def test_hash_eq_bt(self, other_idf): assert bt_2 in bt_list # length of set() should be 1 since both objects are - # equal and have the same hash. + # equal but don't have the same hash. assert len(set(bt_list)) == 1 # dict behavior @@ -2235,176 +3175,19 @@ def test_hash_eq_bt(self, other_idf): # don't have the same hash. assert len(set(bt_list)) == 2 + def test_reduce(self, zone_definition): -class TestZoneGraph: - """Series of tests for the :class:`ZoneGraph` class""" - - def test_traverse_graph(self, config, small_office): - """ - Args: - small_office: - """ - from archetypal import ZoneGraph - - idf, sql = small_office - - G = ZoneGraph.from_idf( - idf, sql=sql, log_adj_report=False, skeleton=False, force=True - ) - - assert G - - @pytest.fixture(scope="session") - def G(self, config, small_office): - """ - Args: - small_office: - """ - from archetypal import ZoneGraph - - idf, sql = small_office - yield ZoneGraph.from_idf(idf, sql, skeleton=True, force=True) - - @pytest.mark.parametrize("adj_report", [True, False]) - def test_graph1(self, config, 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 - from archetypal import ZoneGraph - - idf, sql = small_office - clear_cache() - G1 = ZoneGraph.from_idf( - idf, sql, log_adj_report=adj_report, skeleton=True, force=False - ) - assert not nx.is_empty(G1) - - def test_graph2(self, config, small_office): - """Test the creation of a BuildingTemplate zone graph. Parametrize the - creation of the adjacency report - - Args: - small_office: - """ - # calling from_idf a second time should not recalculate it. - from archetypal import ZoneGraph - - idf, sql = small_office - G2 = ZoneGraph.from_idf( - idf, sql, log_adj_report=False, skeleton=True, force=False - ) - - def test_graph3(self, config, small_office): - """Test the creation of a BuildingTemplate zone graph. Parametrize the - creation of the adjacency report - - Args: - small_office: - """ - # calling from_idf a second time with force=True should - # recalculate it and produce a new id. - from archetypal import ZoneGraph - - idf, sql = small_office - G3 = ZoneGraph.from_idf( - idf, sql, log_adj_report=False, skeleton=True, force=True - ) - - def test_graph4(self, config, small_office): - """Test the creation of a BuildingTemplate zone graph. Parametrize the - creation of the adjacency report - - Args: - small_office: - """ - # skeleton False should build the zone elements. - from archetypal import ZoneGraph - - idf, sql = small_office - G4 = ZoneGraph.from_idf( - idf, sql, log_adj_report=False, skeleton=False, force=True + bt = BuildingTemplate.reduced_model( + "A Building Template", + [zone_definition], ) - from eppy.bunch_subclass import EpBunch - - assert isinstance( - G4.nodes["Sp-Attic Sys-0 Flr-2 Sch-- undefined - HPlcmt-core ZN"][ - "epbunch" - ], - EpBunch, - ) - - def test_graph_info(self, config, G): - """test the info method on a ZoneGraph - - Args: - G: - """ - G.info() - - def test_viewgraph2d(self, config, 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=True, - filename="test", - ) - - @pytest.mark.parametrize("annotate", [True, "Name", ("core", None)]) - def test_viewgraph3d(self, config, G, annotate): - """test the visualization of the zonegraph in 3d - - Args: - config: - G: - annotate: - """ - G.plot_graph3d(annotate=annotate, axis_off=True) - - def test_core_graph(self, config, 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, config, 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): - from archetypal import UniqueName - name1 = UniqueName("myname") name2 = UniqueName("myname") + name3 = UniqueName("myname") - assert name1 != name2 - print([name1, name2]) + assert name1 != name2 != name3 + print([name1, name2, name3]) diff --git a/tests/test_trnsys.py b/tests/test_trnsys.py deleted file mode 100644 index ff0ddb21..00000000 --- a/tests/test_trnsys.py +++ /dev/null @@ -1,1339 +0,0 @@ -import io -import os -import glob -import shutil - -import pytest - -import archetypal as ar - -import pandas as pd - -from path import Path - -from copy import deepcopy - -from archetypal import ( - convert_idf_to_trnbuild, - parallel_process, - trnbuild_idf, - copy_file, - load_idf, - settings, - choose_window, - run_eplus, - ReportData, - get_eplus_dirs, -) - -# Function round to hundreds -from archetypal.trnsys import ( - _assert_files, - load_idf_file_and_clean_names, - clear_name_idf_objects, - get_idf_objects, - _get_constr_list, - _order_objects, - _get_schedules, - _yearlySched_to_csv, - _remove_low_conductivity, - _write_version, - _write_building, - _add_change_adj_surf, - _write_location_geomrules, - _is_coordSys_world, - _change_relative_coords, - _get_ground_vertex, - _write_zone_buildingSurf_fenestrationSurf, - _write_constructions, - _write_constructions_end, - _write_materials, - _write_gains, - _write_conditioning, - _write_schedules, - _write_window, - _write_winPool, - _save_t3d, - _relative_to_absolute, - infilt_to_b18, - gains_to_b18, - conditioning_to_b18, - adds_sch_ground, - adds_sch_setpoint, - t_initial_to_b18, - closest_coords, -) -from tests.conftest import get_platform - - -@pytest.fixture( - scope="class", params=["tests/input_data/trnsys/simple_2_zone_sched.idf",], -) -def converttesteasy(request): - file = request.param - window_file = "W74-lib.dat" - template_dir = os.path.join("archetypal", "ressources") - window_filepath = os.path.join(template_dir, window_file) - template_d18 = "tests/input_data/trnsys/NewFileTemplate.d18" - trnsidf_exe = "docker/trnsidf/trnsidf.exe" # 'docker/trnsidf/trnsidf.exe' - - # prepare args (key=value). Key is a unique id for the runs (here the - # file basename is used). Value is a dict of the function arguments - kwargs_dict = { - "u_value": 2.5, - "shgc": 0.6, - "t_vis": 0.78, - "tolerance": 0.05, - "ordered": True, - } - idf = load_idf(file) - - weather_file = os.path.join( - "tests", "input_data", "CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - ) - - output_folder = os.path.relpath(settings.data_folder) - - yield idf, file, weather_file, window_filepath, trnsidf_exe, template_d18, output_folder, kwargs_dict - - del idf - - -class TestConvertEasy: - - """Tests functions of trnsys.py using 1 simple/small IDF file""" - - def test_assert_files(self, config, converttesteasy): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - _, - ) = converttesteasy - - # Tests assertion if idf_file is None - with pytest.raises(IOError): - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files(None, None, None, None, None, None) - - # Tests assertion if weather file is None - with pytest.raises(IOError): - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files(idf_file, None, None, None, None, None) - - # Tests assertion if window_lib is None - with pytest.raises(IOError): - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files(idf_file, weather_file, None, None, None, None) - - # Tests assertion if output_folder is None - with pytest.raises(IOError): - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files(idf_file, weather_file, window_lib, None, None, None) - - # Tests assertion if trnsidf_exe and template_d18 is None - with pytest.raises(IOError): - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files( - idf_file, weather_file, window_lib, output_folder, None, None - ) - - # Tests assertion if idf_file is a string but not a path - with pytest.raises(IOError): - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files("wrong_string", None, None, None, None, None) - - # Tests assertion if weather_file is a string but not a path - with pytest.raises(IOError): - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files(idf_file, "wrong_string", None, None, None, None) - - # Tests assertion if window_lib is a string but not a path - with pytest.raises(IOError): - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files(idf_file, weather_file, "wrong_string", None, None, None) - - # Tests assertion if window_lib is not a string AND not None - with pytest.raises(IOError): - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files(idf_file, weather_file, 2, None, None, None) - - # Tests assertion if trnsidf_exe is a string but not a path - with pytest.raises(IOError): - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files( - idf_file, weather_file, window_lib, output_folder, "wrong_string", None - ) - - # Tests assertion if template_d18 is a string but not a path - with pytest.raises(IOError): - ( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - template, - ) = _assert_files( - idf_file, - weather_file, - window_lib, - output_folder, - trnsidf_exe, - "wrong_string", - ) - - assert output_folder == os.path.relpath(settings.data_folder) - - def test_get_save_write_schedules_as_sched(self, config, converttesteasy): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - _, - ) = converttesteasy - - # Read IDF_T3D template and write lines in variable - lines = io.TextIOWrapper(io.BytesIO(settings.template_BUI)).readlines() - - # Copy IDF object, making sure we don't change/overwrite original IDF file - idf_2 = deepcopy(idf) - - # Gets all schedule from IDF - schedule_names, schedules = _get_schedules(idf_2) - # Save schedules in a csv file - _yearlySched_to_csv(idf_file, output_folder, schedule_names, schedules) - # Write schedules directly in T3D file (in lines) - schedule_as_input = False - schedules_not_written = _write_schedules( - lines, schedule_names, schedules, schedule_as_input, idf_file - ) - - # Asserts csv with schedules exists and schedules are written in lines - assert os.path.exists(glob.glob(settings.data_folder + "/*.csv")[0]) - assert "!-SCHEDULE " + schedule_names[0] + "\n" in lines - - def test_write_version_and_building(self, config, converttesteasy): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - _, - ) = converttesteasy - - # Copy IDF object, making sure we don't change/overwrite original IDF file - idf_2 = deepcopy(idf) - - # Get objects from IDF - ( - buildingSurfs, - buildings, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - versions, - zones, - zonelists, - ) = get_idf_objects(idf_2) - - # Read IDF_T3D template and write lines in variable - lines = io.TextIOWrapper(io.BytesIO(settings.template_BUI)).readlines() - - # Write VERSION and BUILDING info from IDF to lines (T3D) - _write_version(lines, versions) - _write_building(buildings, lines) - - # Asserts version and building information written in lines - assert "Version," + settings.ep_version.replace("-", ".")[:3] + ";\n" in lines - assert buildings[0] in lines - - def test_write_material(self, config, converttesteasy): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - _, - ) = converttesteasy - - # Read IDF_T3D template and write lines in variable - lines = io.TextIOWrapper(io.BytesIO(settings.template_BUI)).readlines() - - # Copy IDF object, making sure we don't change/overwrite original IDF file - idf_2 = deepcopy(idf) - - # Get objects from IDF - ( - buildingSurfs, - buildings, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - versions, - zones, - zonelists, - ) = get_idf_objects(idf_2) - - # Write LAYER from IDF to lines (T3D) - _write_materials(lines, materialAirGap, materialNoMass, materials) - - # Asserts materials (material, AirGap, NoMass, etc.) are written in lines - assert "!-LAYER " + materialAirGap[0].Name + "\n" in lines - assert "!-LAYER " + materialNoMass[0].Name + "\n" in lines - assert "!-LAYER " + materials[0].Name + "\n" in lines - - def test_relative_to_absolute(self, config, converttesteasy): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - _, - ) = converttesteasy - - # Copy IDF object, making sure we don't change/overwrite original IDF file - idf_2 = deepcopy(idf) - - # Clean names of idf objects (e.g. 'MATERIAL') - log_clear_names = False - clear_name_idf_objects(idf_2, log_clear_names) - - # Get objects from IDF - ( - buildingSurfs, - buildings, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - versions, - zones, - zonelists, - ) = get_idf_objects(idf_2) - - # Getting surface to test, by copying it (like that object stay unchanged) - # And can be used after for assertion - surface_init = deepcopy(buildingSurfs[0]) - - # Transform relative coords of a surface to absolute coords - _relative_to_absolute(buildingSurfs[0], 1, 2, 3) - - # Asserts relative coords converted to absolute ones - assert ( - buildingSurfs[0]["Vertex_" + str(1) + "_Xcoordinate"] - == surface_init["Vertex_" + str(1) + "_Xcoordinate"] + 1 - ) - assert ( - buildingSurfs[0]["Vertex_" + str(1) + "_Ycoordinate"] - == surface_init["Vertex_" + str(1) + "_Ycoordinate"] + 2 - ) - assert ( - buildingSurfs[0]["Vertex_" + str(1) + "_Zcoordinate"] - == surface_init["Vertex_" + str(1) + "_Zcoordinate"] + 3 - ) - - def test_save_t3d(self, config, converttesteasy): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - _, - ) = converttesteasy - - # Read IDF_T3D template and write lines in variable - lines = io.TextIOWrapper(io.BytesIO(settings.template_BUI)).readlines() - - # Save T3D file at output_folder - output_folder, t3d_path = _save_t3d(idf_file, lines, output_folder) - - # Asserts path to T3D file exists - assert t3d_path in glob.glob(settings.data_folder + "/*.idf") - - def test_t_initial_to_b18(self, config, converttesteasy): - # Deletes cache folder - if os.path.exists(settings.cache_folder): - shutil.rmtree(settings.cache_folder) - - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - kwargs, - ) = converttesteasy - - # Copy IDF object, making sure we don't change/overwrite original IDF file - idf_2 = deepcopy(idf) - - # Clean names of idf objects (e.g. 'MATERIAL') - log_clear_names = False - clear_name_idf_objects(idf_2, log_clear_names) - - # Get objects from IDF - ( - buildingSurfs, - buildings, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - versions, - zones, - zonelists, - ) = get_idf_objects(idf_2) - - # Read a b18 file and write lines in variable (b18_lines) - b18_path = "tests/input_data/trnsys/T3D_simple_2_zone.b18" - with open(b18_path) as b18_file: - b18_lines = b18_file.readlines() - - # Creates a constant schedule setpoint over the year - schedules = {"sch_h_setpoint_" + zones[0].Name: {"all values": [18] * 8760}} - zones = [zones[0]] - - # Writes initial temperature of zone in b18_lines (b18 file) - t_initial_to_b18(b18_lines, zones, schedules) - - # Asserts initial temperature is written in b18_lines - assert any("TINITIAL= 18" in mystring for mystring in b18_lines[200:]) - - def test_closest_coords(self, config, converttesteasy): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - kwargs, - ) = converttesteasy - - # Copy IDF object, making sure we don't change/overwrite original IDF file - idf_2 = deepcopy(idf) - - # Get objects from IDF - ( - buildingSurfs, - buildings, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - versions, - zones, - zonelists, - ) = get_idf_objects(idf_2) - - # Find closest surface to origin (0,0,0) - x, y, z = closest_coords(buildingSurfs, to=[0, 0, 0]) - - # Asserts closest coords - assert x == -5 - assert y == 215 - assert z == 0 - - def test_write_to_b18(self, config, converttesteasy): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - kwargs, - ) = converttesteasy - - # Runs EnergyPlus Simulation - res = run_eplus( - idf_file, - weather_file, - output_directory=None, - ep_version=None, - output_report="htm", - prep_outputs=True, - design_day=True, - ) - - # Copy IDF object, making sure we don't change/overwrite original IDF file - idf_2 = deepcopy(idf) - - # Clean names of idf objects (e.g. 'MATERIAL') - log_clear_names = False - clear_name_idf_objects(idf_2, log_clear_names) - - # Get old:new names equivalence - old_new_names = pd.read_csv( - os.path.join( - settings.data_folder, - Path(idf_file).basename().stripext() + "_old_new_names_equivalence.csv", - ) - ).to_dict() - - # Get objects from IDF - ( - buildingSurfs, - buildings, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - versions, - zones, - zonelists, - ) = get_idf_objects(idf_2) - - # Read a b18 file and write lines in variable (b18_lines) - b18_path = "tests/input_data/trnsys/T3D_simple_2_zone.b18" - with open(b18_path) as b18_file: - b18_lines = b18_file.readlines() - - # initialize variable - schedules_not_written = [] - - # Gets conditioning (heating and cooling) info from simulation results - heat_name = {} - for i in range(0, len(res["Zone Sensible Heating"])): - key = res["Zone Sensible Heating"].iloc[i, 0] - name = "HEAT_z" + str(res["Zone Sensible Heating"].iloc[i].name) - heat_name[key] = name - cool_name = {} - for i in range(0, len(res["Zone Sensible Cooling"])): - key = res["Zone Sensible Cooling"].iloc[i, 0] - name = "HEAT_z" + str(res["Zone Sensible Cooling"].iloc[i].name) - cool_name[key] = name - - # Selects only 2 first zones - zones = zones[0:2] - peoples = peoples[0:2] - equipments = equipments[0:2] - lights = lights[0:2] - - # Writes infiltration in b18_lines (b18 file) - infilt_to_b18(b18_lines, zones, res) - - # Tests both cases, whether schedules are taken as inputs or written in b18_lines - for cond in [True, False]: - schedule_as_input = cond - gains_to_b18( - b18_lines, - zones, - zonelists, - peoples, - lights, - equipments, - schedules_not_written, - res, - old_new_names, - schedule_as_input, - ) - - # Writes conditioning (heating and cooling) in b18_lines (b18 file) - conditioning_to_b18(b18_lines, heat_name, cool_name, zones, old_new_names) - - # Asserts infiltration, internal gains and conditioning are written in b18_lines - assert "INFILTRATION Constant" + "\n" in b18_lines - assert " INFILTRATION = Constant" + "\n" in b18_lines - assert any(peoples[0].Name in mystring for mystring in b18_lines[200:]) - assert any(lights[0].Name in mystring for mystring in b18_lines[200:]) - assert any(equipments[0].Name in mystring for mystring in b18_lines[200:]) - assert any( - heat_name[old_new_names[zones[0].Name.upper()][0]] in mystring - for mystring in b18_lines[200:] - ) - - def test_load_idf_file_and_clean_names(self, config, converttesteasy): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - _, - ) = converttesteasy - - # Clean names of idf objects (e.g. 'MATERIAL') - log_clear_names = False - idf_2 = load_idf_file_and_clean_names(idf_file, log_clear_names) - - # Makes sure material names are unique and are 8 characters long - name = None - unique = False - length = False - for liste in idf_2.idfobjects["MATERIAL"].list2: - if liste[1] != name: - unique = True - name = liste[1] - else: - unique = False - if len(liste[1]) == 8: - length = True - else: - length = False - - assert isinstance(idf_2, ar.idfclass.IDF) - assert unique - assert length - - def test_add_object_and_run_ep(self, config, converttesteasy): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - kwargs, - ) = converttesteasy - - ep_version = None - # Adds Output variable in IDF - outputs = [ - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Thermostat Heating Setpoint Temperature", - Reporting_Frequency="hourly", - save=True, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Thermostat Cooling Setpoint Temperature", - Reporting_Frequency="hourly", - save=True, - ), - }, - ] - - # Runs EnergyPlus Simulation - _, idf = run_eplus( - idf_file, - weather_file, - output_directory=None, - ep_version=ep_version, - output_report=None, - prep_outputs=outputs, - design_day=False, - annual=True, - expandobjects=True, - return_idf=True, - ) - - # Makes sure idf vriable is an IDF - assert isinstance(idf, ar.idfclass.IDF) - - -@pytest.fixture( - scope="class", params=["5ZoneGeometryTransform.idf",], -) -def converttest(request): - file = get_eplus_dirs(settings.ep_version) / "ExampleFiles" / request.param - # file = request.param - window_file = "W74-lib.dat" - template_dir = os.path.join("archetypal", "ressources") - window_filepath = os.path.join(template_dir, window_file) - template_d18 = "tests/input_data/trnsys/NewFileTemplate.d18" - trnsidf_exe = "docker/trnsidf/trnsidf.exe" # 'docker/trnsidf/trnsidf.exe' - - # prepare args (key=value). Key is a unique id for the runs (here the - # file basename is used). Value is a dict of the function arguments - kwargs_dict = { - "u_value": 2.5, - "shgc": 0.6, - "t_vis": 0.78, - "tolerance": 0.05, - "ordered": True, - } - idf = load_idf(file) - - weather_file = os.path.join( - "tests", "input_data", "CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - ) - - output_folder = os.path.relpath(settings.data_folder) - - yield idf, file, weather_file, window_filepath, trnsidf_exe, template_d18, output_folder, kwargs_dict - - del idf - - -class TestConvert: - - """Tests convert_idf_to_trnbuild() with several files""" - - def test_get_save_write_schedules_as_input(self, config, converttest): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - _, - ) = converttest - - # Read IDF_T3D template and write lines in variable - lines = io.TextIOWrapper(io.BytesIO(settings.template_BUI)).readlines() - - # Gets all schedule from IDF - schedule_names, schedules = _get_schedules(idf) - # Save schedules in a csv file - _yearlySched_to_csv(idf_file, output_folder, schedule_names, schedules) - # Write schedules as inputs in T3D file (in lines) - schedule_as_input = True - schedules_not_written = _write_schedules( - lines, schedule_names, schedules, schedule_as_input, idf_file - ) - - def test_write_idf_objects(self, config, converttest): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - kwargs, - ) = converttest - - # Read IDF_T3D template and write lines in variable - lines = io.TextIOWrapper(io.BytesIO(settings.template_BUI)).readlines() - - # Get objects from IDF file - ( - buildingSurfs, - buildings, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - versions, - zones, - zonelists, - ) = get_idf_objects(idf) - - # Creates low thermal resistance construction and materials to be deleted - # To improve coverage of test - idf.newidfobject( - "MATERIAL", - Name="low_res_mat", - Roughness="Smooth", - Thickness=0.0008, - Conductivity=45.28, - Density=7824, - Specific_Heat=500, - Thermal_Absorptance=0.7, - Solar_Absorptance=0.7, - Visible_Absorptance=0.7, - ) - idf.newidfobject( - "CONSTRUCTION", Name="low_res_constr", Outside_Layer="low_res_mat" - ) - - # Changes Outside boundary of surface to adiabatic - # To improve coverage of test - buildingSurfs[0].Outside_Boundary_Condition = "Adiabatic" - - # Changes coords of zone - # To improve coverage of test - zones[0].X_Origin = "" - zones[0].Y_Origin = "" - zones[0].Z_Origin = "" - zones[0].Multiplier = "" - - # Get all construction EXCEPT fenestration ones - constr_list = _get_constr_list(buildingSurfs) - - # If ordered=True, ordering idf objects - ordered = True - ( - buildingSurfs, - buildings, - constr_list, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - zones, - zonelists, - ) = _order_objects( - buildingSurfs, - buildings, - constr_list, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - zones, - zonelists, - ordered, - ) - - # Removes low conductivity material and constructions - mat_name = _remove_low_conductivity(constructions, idf, materials) - - # Determine if coordsSystem is "World" (all zones at (0,0,0)) - coordSys = _is_coordSys_world("Relative", zones) - - # Changes Geom Rule to "Relative" - # To improve coverage of test - globGeomRules[0].Coordinate_System = "Relative" - globGeomRules[0].Daylighting_Reference_Point_Coordinate_System = "Relative" - globGeomRules[0].Rectangular_Surface_Coordinate_System = "Relative" - - # Change Outside boundary condition of surface to itself - # To improve coverage of test - buildingSurfs[5].Outside_Boundary_Condition_Object = "C5-1" - - # Change Outside boundary condition of surface to Zone and adjacent to Outdoors - # To improve coverage of test - buildingSurfs[0].Outside_Boundary_Condition = "Zone" - buildingSurfs[0].Outside_Boundary_Condition_Object = buildingSurfs[6].Zone_Name - buildingSurfs[6].Outside_Boundary_Condition = "Outdoors" - - # Change Outside boundary condition of surface to Zone and adjacent to Zone.Name - # To improve coverage of test - buildingSurfs[1].Outside_Boundary_Condition = "Zone" - buildingSurfs[1].Outside_Boundary_Condition_Object = "SPACE3-1" - - # Write LOCATION and GLOBALGEOMETRYRULES from IDF to lines (T3D) and - # define if coordinate system is "Relative" - coordSys = _write_location_geomrules(globGeomRules, lines, locations) - - # Change coordinates from relative to absolute for building surfaces - _change_relative_coords(buildingSurfs, coordSys, idf) - - # Adds or changes adjacent surface if needed - _add_change_adj_surf(buildingSurfs, idf) - buildingSurfs = idf.idfobjects["BUILDINGSURFACE:DETAILED"] - - # Get all surfaces having Outside boundary condition with the ground. - # To be used to find the window's slopes - n_ground = _get_ground_vertex(buildingSurfs) - - # Writing zones in lines - schedule_as_input = True - win_slope_dict = _write_zone_buildingSurf_fenestrationSurf( - buildingSurfs, - coordSys, - fenestrationSurfs, - idf, - lines, - n_ground, - zones, - schedule_as_input, - ) - - # Write CONSTRUCTION from IDF to lines (T3D) - _write_constructions(constr_list, idf, lines, mat_name, materials) - - # Write CONSTRUCTION from IDF to lines, at the end of the T3D file - _write_constructions_end(constr_list, idf, lines) - - # region Write WINDOWS chosen by the user (from Berkeley lab library) in - # lines (T3D) - # Get window from library - # window = (win_id, description, design, u_win, shgc_win, t_sol_win, - # rf_sol, t_vis_win, lay_win, width, window_bunches[win_id], and maybe tolerance) - win_u_value = kwargs.get("u_value", 2.2) - win_shgc = kwargs.get("shgc", 0.64) - win_tvis = kwargs.get("t_vis", 0.8) - win_tolerance = kwargs.get("tolerance", 0.05) - window = choose_window( - win_u_value, win_shgc, win_tvis, win_tolerance, window_lib - ) - - # Write windows in lines - _write_window(lines, win_slope_dict, window) - - # Write window pool in lines - _write_winPool(lines, window) - - def test_write_gains_conditioning(self, config, converttest): - # Gets from fixture paths to files and IDF object to be used in test - ( - idf, - idf_file, - weather_file, - window_lib, - trnsidf_exe, - template, - output_folder, - _, - ) = converttest - - # Gets EnergyPlus version - ep_version = settings.ep_version - - # Adds Output variable in IDF - outputs = [ - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Thermostat Heating Setpoint Temperature", - Reporting_Frequency="hourly", - save=True, - ), - }, - { - "ep_object": "Output:Variable".upper(), - "kwargs": dict( - Variable_Name="Zone Thermostat Cooling Setpoint Temperature", - Reporting_Frequency="hourly", - save=True, - ), - }, - ] - - # Run EnergyPlus Simulation - _, idf = run_eplus( - idf_file, - weather_file, - output_directory=None, - ep_version=ep_version, - output_report=None, - prep_outputs=outputs, - design_day=False, - annual=True, - expandobjects=True, - return_idf=True, - ) - - # Output reports - htm = idf.htm - sql = idf.sql - sql_file = idf.sql_file - - # Check if cache exists - log_clear_names = False - - # Clean names of idf objects (e.g. 'MATERIAL') - idf_2 = deepcopy(idf) - clear_name_idf_objects(idf_2, log_clear_names) - - # Get old:new names equivalence - old_new_names = pd.read_csv( - os.path.join( - settings.data_folder, - Path(idf_file).basename().stripext() + "_old_new_names_equivalence.csv", - ) - ).to_dict() - - # Read IDF_T3D template and write lines in variable - lines = io.TextIOWrapper(io.BytesIO(settings.template_BUI)).readlines() - - # Get objects from IDF file - ( - buildingSurfs, - buildings, - constructions, - equipments, - fenestrationSurfs, - globGeomRules, - lights, - locations, - materialAirGap, - materialNoMass, - materials, - peoples, - versions, - zones, - zonelists, - ) = get_idf_objects(idf_2) - - # Write GAINS (People, Lights, Equipment) from IDF to lines (T3D) - _write_gains(equipments, lights, lines, peoples, htm, old_new_names) - - # Gets schedules from IDF - schedule_names, schedules = _get_schedules(idf_2) - - # Adds ground temperature to schedules - adds_sch_ground(htm, schedule_names, schedules) - - # Adds "sch_setpoint_ZONES" to schedules - df_heating_setpoint = ReportData.from_sqlite( - sql_file, table_name="Zone Thermostat Heating Setpoint Temperature" - ) - df_cooling_setpoint = ReportData.from_sqlite( - sql_file, table_name="Zone Thermostat Cooling Setpoint Temperature" - ) - # Heating - adds_sch_setpoint( - zones, df_heating_setpoint, old_new_names, schedule_names, schedules, "h" - ) - # Cooling - adds_sch_setpoint( - zones, df_cooling_setpoint, old_new_names, schedule_names, schedules, "c" - ) - - # Writes conditioning in lines - schedule_as_input = True - heat_dict, cool_dict = _write_conditioning( - htm, lines, schedules, old_new_names, schedule_as_input - ) - - -@pytest.fixture( - params=[ - "RefBldgWarehouseNew2004_Chicago.idf", - "ASHRAE9012016_Warehouse_Denver.idf", - "ASHRAE9012016_ApartmentMidRise_Denver.idf", - "5ZoneGeometryTransform.idf", - ] -) -def trnbuild_file(config, request): - idf_file = get_eplus_dirs(settings.ep_version) / "ExampleFiles" / request.param - idf_file = copy_file(idf_file, where=settings.cache_folder) - - yield idf_file - - -@pytest.mark.skipif( - get_platform() > (10, 15, 0), - reason="Skipping since wine 32bit can't run on MacOs >10.15 (Catalina)", -) -@pytest.mark.skipif( - os.environ.get("CI", "False").lower() == "true", - reason="Skipping this test on CI environment.", -) -class TestTrnBuild: - def test_trnbuild_from_idf(self, config, trnbuild_file): - # Gets file paths/names - window_file = "W74-lib.dat" - template_dir = os.path.join("archetypal", "ressources") - window_filepath = os.path.join(template_dir, window_file) - weather_file = os.path.join( - "tests", "input_data", "CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - ) - - # prepare args (key=value)f or EnergyPlus version to use, windows parameters,etc. - kwargs_dict = { - "ep_version": settings.ep_version, - "u_value": 2.5, - "shgc": 0.6, - "t_vis": 0.78, - "tolerance": 0.05, - "fframe": 0.1, - "uframe": 7.5, - "ordered": True, - } - - # Gets IDF file path from fixture - file = trnbuild_file - - # Convert IDF to BUI file - convert_idf_to_trnbuild( - idf_file=file, - weather_file=weather_file, - window_lib=window_filepath, - template="tests/input_data/trnsys/NewFileTemplate.d18", - trnsidf_exe="docker/trnsidf/trnsidf.exe", - **kwargs_dict - ) - - @pytest.mark.win32 - def test_trnbuild_from_idf_parallel(self, config, trnbuild_file): - # Gets IDF file path from fixture - files = trnbuild_file - - # Path to weather file - weather_file = os.path.join( - "tests", "input_data", "CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - ) - - # prepare args (key=value). Key is a unique id for the runs (here the - # file basename is used). Value is a dict of the function arguments - in_dict = { - os.path.basename(file): dict(idf_file=file, weather_file=weather_file) - for file in files - } - - # Convert IDF files to BUI ones usinf parallel process - result = parallel_process(in_dict, convert_idf_to_trnbuild, 4, use_kwargs=True) - - assert not any(isinstance(a, Exception) for a in result.values()) - - @pytest.mark.darwin - @pytest.mark.linux - def test_trnbuild_from_idf_parallel_darwin_or_linux(self, config): - # Path to EnergyPlus example files - file_upper_path = os.path.join( - get_eplus_dirs(settings.ep_version), "ExampleFiles" - ) - - # IDF file names - files = [ - "RefBldgWarehouseNew2004_Chicago.idf", - "ASHRAE9012016_Warehouse_Denver.idf", - "ASHRAE9012016_ApartmentMidRise_Denver.idf", - "5ZoneGeometryTransform.idf", - ] - - # Path to weather file - weather_file = os.path.join( - "tests", "input_data", "CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - ) - - # prepare args (key=value). Key is a unique id for the runs (here the - # file basename is used). Value is a dict of the function arguments - in_dict = { - os.path.basename(file): dict( - idf_file=os.path.join(file_upper_path, file), - weather_file=weather_file, - template="tests/input_data/trnsys/NewFileTemplate.d18", - trnsidf_exe="docker/trnsidf/trnsidf.exe", - ) - for file in files - } - - # Convert IDF files to BUI ones usinf parallel process - result = parallel_process(in_dict, convert_idf_to_trnbuild, 4, use_kwargs=True) - - # Print results - [print(a) for a in result.values() if isinstance(a, Exception)] - - assert not any(isinstance(a, Exception) for a in result.values()) - - @pytest.mark.win32 - def test_trnbuild_idf_win32(self, config): - # Paths to T3D and B18 template files - idf_file = "tests/input_data/trnsys/Building.idf" - template = "tests/input_data/trnsys/NewFileTemplate.d18" - - # Convert T3D file to BUI file - res = trnbuild_idf(idf_file, template=template, nonum=True) - - assert res - - @pytest.mark.darwin - @pytest.mark.linux - @pytest.mark.xfail( - not Path("docker/trnsidf/trnsidf.exe").exists(), - reason="xfail since trnsidf.exe is not installed. This test can work if the " - "trnsidf.exe is copied in ./docker/trnsidf", - ) - def test_trnbuild_idf_darwin_or_linux(self, config): - # Paths to T3D, B18 template and trnsidf.exe files - idf_file = "tests/input_data/trnsys/Building.idf" - template = "tests/input_data/trnsys/NewFileTemplate.d18" - trnsidf_exe = "docker/trnsidf/trnsidf.exe" - - # Convert T3D file to BUI file - res = trnbuild_idf( - idf_file, - template=template, - dck=True, - nonum=False, - refarea=False, - volume=False, - capacitance=True, - trnsidf_exe=trnsidf_exe, - ) - - assert res - -@pytest.mark.skipif( - get_platform() > (10, 15, 0), - reason="Skipping since wine 32bit can't run on MacOs >10.15 (Catalina)", -) -@pytest.mark.skipif( - os.environ.get("CI", "False").lower() == "true", - reason="Skipping this test on CI environment.", -) -def test_trnbuild_from_simple_idf(config): - # Path to weather file, window library and T3D template - window_file = "W74-lib.dat" - template_dir = os.path.join("archetypal", "ressources") - window_filepath = os.path.join(template_dir, window_file) - weather_file = os.path.join( - "tests", "input_data", "CAN_QC_Montreal-McTavish.716120_CWEC2016.epw" - ) - - # prepare args (key=value)f or EnergyPlus version to use, windows parameters,etc. - # WINDOW = 2-WSV_#3_Air - kwargs_dict = { - "ep_version": "9-2-0", - "u_value": 1.62, - "shgc": 0.64, - "t_vis": 0.8, - "tolerance": 0.05, - "fframe": 0.0, - "uframe": 0.5, - "ordered": True, - } - - # Path to IDF file - file = os.path.join("tests", "input_data", "trnsys", "simple_2_zone.idf") - - # Converts IDF to BUI - convert_idf_to_trnbuild( - idf_file=file, - weather_file=weather_file, - window_lib=window_filepath, - template="tests/input_data/trnsys/NewFileTemplate.d18", - trnsidf_exe="docker/trnsidf/trnsidf.exe", - schedule_as_input=False, - **kwargs_dict - ) diff --git a/tests/test_umi.py b/tests/test_umi.py index 35896f23..e4d634b4 100644 --- a/tests/test_umi.py +++ b/tests/test_umi.py @@ -3,30 +3,54 @@ import os import pytest +from path import Path -from archetypal import settings, get_eplus_dirs -from archetypal.umi_template import UmiTemplate +from archetypal import IDF, settings +from archetypal.eplus_interface.version import get_eplus_dirs +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 UmiTemplate class""" + """Test suite for the UmiTemplateLibrary class""" - @pytest.mark.xfail(reason="There is still an issue with the order of the keys") - def test_template_to_template(self, config): - """load the json into UmiTemplate object, then convert back to json and + def test_template_to_template(self): + """load the json into UmiTemplateLibrary object, then convert back to json and compare""" - import json - file = "tests/input_data/umi_samples/BostonTemplateLibrary_2.json" + file = "tests/input_data/umi_samples/BostonTemplateLibrary_nodup.json" - a = UmiTemplate.read_file(file).to_json( - settings.data_folder / "b.json", sort_keys=True, indent=False - ) + a = UmiTemplateLibrary.open(file).to_dict() b = TestUmiTemplate.read_json(file) - assert a == json.dumps(b, sort_keys=True, indent=False) + + for key in b: + # Sort the list elements by their Name because .to_dict() sorts by Name + b[key] = sorted(b[key], key=lambda x: x.get("Name")) + assert json.loads(json.dumps(a)) == json.loads(json.dumps(b)) def test_umitemplate(self, config): - """Test creating UmiTemplate from 2 IDF files""" + """Test creating UmiTemplateLibrary from 2 IDF files""" idf_source = [ "tests/input_data/necb/NECB 2011-FullServiceRestaurant-NECB HDD Method-CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw.idf", get_eplus_dirs(settings.ep_version) @@ -34,9 +58,13 @@ def test_umitemplate(self, config): / "VentilationSimpleTest.idf", ] wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - a = UmiTemplate.read_idf(idf_source, wf, name="Mixed_Files") + a = UmiTemplateLibrary.from_idf_files( + idf_source, wf, name="Mixed_Files", processors=-1 + ) - print(a.to_json()) + data_dict = a.to_dict() + a.to_dict() + assert no_duplicates(data_dict) @pytest.mark.skipif( os.environ.get("CI", "False").lower() == "true", @@ -50,14 +78,15 @@ def test_umi_samples(self, config): "tests/input_data/umi_samples/B_Res_0_WoodFrame.idf", ] wf = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" - a = UmiTemplate.read_idf(idf_source, wf, name="Mixed_Files") - - print(a.to_json()) + a = UmiTemplateLibrary.from_idf_files(idf_source, wf, name="Mixed_Files") + a.to_dict() + data_dict = a.to_dict() + assert no_duplicates(data_dict) @staticmethod def read_json(file): with open(file, "r") as f: - a = json.load(f) + a = json.load(f, object_pairs_hook=collections.OrderedDict) data_dict = collections.OrderedDict( { "GasMaterials": [], @@ -80,4 +109,554 @@ def read_json(file): } ) data_dict.update(a) + for key in data_dict: + # Sort the list elements by $id + data_dict[key] = sorted( + data_dict[key], key=lambda x: int(x.get("$id", 0)) + ) return data_dict + + @pytest.fixture() + def idf(self): + yield IDF(prep_outputs=False) + + @pytest.fixture() + 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, + ) + insulation = OpaqueMaterial( + Name="Insulation", + Conductivity=0.04, + SpecificHeat=1000, + Density=30, + ) + brick = OpaqueMaterial( + Name="Brick", + Conductivity=1, + SpecificHeat=900, + Density=1900, + ) + plywood = OpaqueMaterial( + Name="Plywood", + Conductivity=0.13, + SpecificHeat=800, + Density=540, + ) + OpaqueMaterials = [concrete, insulation, brick, plywood] + + # Glazing materials + glass = GlazingMaterial( + Name="Glass", + Density=2500, + Conductivity=1, + SolarTransmittance=0.7, + SolarReflectanceFront=0.5, + SolarReflectanceBack=0.5, + VisibleTransmittance=0.7, + VisibleReflectanceFront=0.3, + VisibleReflectanceBack=0.3, + IRTransmittance=0.7, + IREmissivityFront=0.5, + IREmissivityBack=0.5, + ) + GlazingMaterials = [glass] + + # Gas materials + air = GasMaterial(Name="Air", Conductivity=0.02, Density=1.24) + GasMaterials = [air] + # endregion + + # region Defines MaterialLayers + + # Opaque MaterialLayers + concreteLayer = MaterialLayer(concrete, Thickness=0.2) + insulationLayer = MaterialLayer(insulation, Thickness=0.5) + brickLayer = MaterialLayer(brick, Thickness=0.1) + plywoodLayer = MaterialLayer(plywood, Thickness=0.016) + + # Glazing MaterialLayers + glassLayer = MaterialLayer(glass, Thickness=0.16) + + # Gas MaterialLayers + airLayer = GasLayer(air, Thickness=0.04) + + MaterialLayers = [ + concreteLayer, + insulationLayer, + brickLayer, + plywoodLayer, + glassLayer, + airLayer, + ] + # endregion + + # region Defines constructions + + # Opaque constructions + wall_int = OpaqueConstruction( + Name="wall_int", + Layers=[plywoodLayer], + ) + wall_ext = OpaqueConstruction( + Name="wall_ext", + Layers=[concreteLayer, insulationLayer, brickLayer], + ) + floor = OpaqueConstruction( + Name="floor", + Layers=[concreteLayer, plywoodLayer], + ) + roof = OpaqueConstruction( + Name="roof", + Layers=[plywoodLayer, insulationLayer, brickLayer], + ) + OpaqueConstructions = [wall_int, wall_ext, floor, roof] + + # Window construction + window = WindowConstruction( + Layers=[glassLayer, airLayer, glassLayer], Name="Window" + ) + WindowConstructions = [window] + + # Structure definition + mass_ratio = MassRatio(Material=plywood, NormalRatio=1, HighLoadRatio=1) + struct_definition = StructureInformation( + MassRatios=[mass_ratio], Name="Structure" + ) + StructureDefinitions = [struct_definition] + # endregion + + # region Defines schedules + + # Day schedules + # Always on + sch_d_on = DaySchedule.from_values( + Name="AlwaysOn", Values=[1] * 24, Type="Fraction", Category="Day" + ) + # Always off + sch_d_off = DaySchedule.from_values( + Name="AlwaysOff", Values=[0] * 24, Type="Fraction", Category="Day" + ) + # DHW + sch_d_dhw = DaySchedule.from_values( + 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, + Type="Fraction", + Category="Day", + ) + DaySchedules = [sch_d_on, sch_d_dhw, sch_d_gains, sch_d_off] + + # Week schedules + # Always on + sch_w_on = WeekSchedule( + Days=[sch_d_on, sch_d_on, sch_d_on, sch_d_on, sch_d_on, sch_d_on, sch_d_on], + Category="Week", + Type="Fraction", + Name="AlwaysOn", + ) + # Always off + sch_w_off = WeekSchedule( + Days=[ + sch_d_off, + sch_d_off, + sch_d_off, + sch_d_off, + sch_d_off, + sch_d_off, + sch_d_off, + ], + Category="Week", + Type="Fraction", + Name="AlwaysOff", + ) + # DHW + sch_w_dhw = WeekSchedule( + Days=[ + sch_d_dhw, + sch_d_dhw, + sch_d_dhw, + sch_d_dhw, + sch_d_dhw, + sch_d_dhw, + sch_d_dhw, + ], + Category="Week", + Type="Fraction", + Name="DHW", + ) + # Internal gains + sch_w_gains = WeekSchedule( + Days=[ + sch_d_gains, + sch_d_gains, + sch_d_gains, + sch_d_gains, + sch_d_gains, + sch_d_gains, + sch_d_gains, + ], + Category="Week", + Type="Fraction", + Name="Gains", + ) + WeekSchedules = [sch_w_on, sch_w_off, sch_w_dhw, sch_w_gains] + + # Year schedules + # Always on + dict_on = { + "$id": 1, + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": sch_w_on.to_ref(), + } + ], + "Type": "Fraction", + "Name": "AlwaysOn", + } + sch_y_on = YearSchedule.from_dict(dict_on, {a.id: a for a in WeekSchedules}) + # Always off + dict_off = { + "$id": 2, + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": sch_w_off.to_ref(), + } + ], + "Type": "Fraction", + "Name": "AlwaysOff", + } + sch_y_off = YearSchedule.from_dict(dict_off, {a.id: a for a in WeekSchedules}) + # DHW + dict_dhw = { + "$id": 3, + "Category": "Year", + "Parts": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": sch_w_dhw.to_ref(), + } + ], + "Type": "Fraction", + "Name": "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": [ + { + "FromDay": 1, + "FromMonth": 1, + "ToDay": 31, + "ToMonth": 12, + "Schedule": sch_w_gains.to_ref(), + } + ], + "Type": "Fraction", + "Name": "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 + + # region Defines Window settings + + window_setting = WindowSetting( + Name="window_setting_1", + Construction=window, + AfnWindowAvailability=sch_y_off, + ShadingSystemAvailabilitySchedule=sch_y_off, + ZoneMixingAvailabilitySchedule=sch_y_off, + ) + WindowSettings = [window_setting] + # endregion + + # region Defines DHW settings + + dhw_setting = DomesticHotWaterSetting( + WaterSchedule=sch_y_dhw, + IsOn=True, + FlowRatePerFloorArea=0.03, + WaterSupplyTemperature=65, + WaterTemperatureInlet=10, + area=1, + Name="dhw_setting_1", + ) + DomesticHotWaterSettings = [dhw_setting] + # endregion + + # region Defines ventilation settings + + vent_setting = VentilationSetting( + NatVentSchedule=sch_y_off, + ScheduledVentilationSchedule=sch_y_off, + Name="vent_setting_1", + ) + VentilationSettings = [vent_setting] + # endregion + + # region Defines zone conditioning setttings + + zone_conditioning = ZoneConditioning( + Name="conditioning_setting_1", + HeatingSchedule=sch_y_on, + CoolingSchedule=sch_y_on, + MechVentSchedule=sch_y_off, + ) + ZoneConditionings = [zone_conditioning] + # endregion + + # region Defines zone construction sets + + # Perimeter zone + zone_constr_set_perim = ZoneConstructionSet( + Name="constr_set_perim", + Zone_Names=None, + Slab=floor, + IsSlabAdiabatic=False, + Roof=roof, + IsRoofAdiabatic=False, + Partition=wall_int, + IsPartitionAdiabatic=False, + Ground=floor, + IsGroundAdiabatic=False, + Facade=wall_ext, + IsFacadeAdiabatic=False, + ) + # Core zone + zone_constr_set_core = ZoneConstructionSet( + Name="constr_set_core", + Zone_Names=None, + Slab=floor, + IsSlabAdiabatic=False, + Roof=roof, + IsRoofAdiabatic=False, + Partition=wall_int, + IsPartitionAdiabatic=True, + Ground=floor, + IsGroundAdiabatic=False, + Facade=wall_ext, + IsFacadeAdiabatic=False, + ) + ZoneConstructionSets = [zone_constr_set_perim, zone_constr_set_core] + # endregion + + # region Defines zone loads + + zone_load = ZoneLoad( + EquipmentAvailabilitySchedule=sch_y_gains, + LightsAvailabilitySchedule=sch_y_gains, + OccupancySchedule=sch_y_gains, + Name="zone_load_1", + ) + ZoneLoads = [zone_load] + # endregion + + # region Defines zones + + # Perimeter zone + perim = ZoneDefinition( + Name="Perim_zone", + Conditioning=zone_conditioning, + Constructions=zone_constr_set_perim, + DomesticHotWater=dhw_setting, + Loads=zone_load, + Ventilation=vent_setting, + Windows=window_setting, + InternalMassConstruction=wall_int, + ) + # Core zone + core = ZoneDefinition( + Name="Core_zone", + Conditioning=zone_conditioning, + Constructions=zone_constr_set_core, + DomesticHotWater=dhw_setting, + Loads=zone_load, + Ventilation=vent_setting, + Windows=window_setting, + InternalMassConstruction=wall_int, + ) + Zones = [perim, core] + # endregion + + # region Defines building template + + building_template = BuildingTemplate( + Core=core, + Perimeter=perim, + Structure=struct_definition, + Windows=window_setting, + Name="Building_template_1", + ) + BuildingTemplates = [building_template] + # endregion + + # region Creates json file (Umi template) + + umi_template = UmiTemplateLibrary( + name="unnamed", + BuildingTemplates=BuildingTemplates, + GasMaterials=GasMaterials, + GlazingMaterials=GlazingMaterials, + OpaqueConstructions=OpaqueConstructions, + OpaqueMaterials=OpaqueMaterials, + WindowConstructions=WindowConstructions, + StructureInformations=StructureDefinitions, + DaySchedules=DaySchedules, + WeekSchedules=WeekSchedules, + YearSchedules=YearSchedules, + DomesticHotWaterSettings=DomesticHotWaterSettings, + VentilationSettings=VentilationSettings, + WindowSettings=WindowSettings, + ZoneConditionings=ZoneConditionings, + ZoneConstructionSets=ZoneConstructionSets, + ZoneLoads=ZoneLoads, + ZoneDefinitions=Zones, + ) + + yield umi_template.to_dict() + + def test_manual_template_library(self, manual_umitemplate_library): + assert no_duplicates(manual_umitemplate_library, attribute="Name") + assert no_duplicates(manual_umitemplate_library, attribute="$id") + + def test_climatestudio(self, climatestudio): + template_json = UmiTemplateLibrary( + name="my_umi_template", BuildingTemplates=[climatestudio] + ).to_json() + print(template_json) + + @pytest.mark.skipif( + os.environ.get("CI", "False").lower() == "true", + reason="Skipping this test on CI environment", + ) + @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" + template = UmiTemplateLibrary.from_idf_files( + name="my_umi_template", + idf_files=[file], + as_version="9-2-0", + weather=w, + processors=1, + ) + assert no_duplicates(template.to_dict(), attribute="Name") + assert no_duplicates(template.to_dict(), attribute="$id") + + @pytest.mark.skipif( + os.environ.get("CI", "False").lower() == "true", + reason="Skipping this test on CI environment", + ) + def test_necb_parallel(self, config): + settings.log_console = True + 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", + ] + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + template = UmiTemplateLibrary.from_idf_files( + name="my_umi_template", + idf_files=office, + as_version="9-2-0", + weather=w, + processors=-1, + ) + template.to_dict() + 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", Path("tests/input_data/problematic").files("*CZ5A*.idf") + ) + def test_cz5a_serial(self, file, config): + settings.log_console = True + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + template = UmiTemplateLibrary.from_idf_files( + name=file.stem, + idf_files=[file], + as_version="9-2-0", + weather=w, + processors=1, + ) + assert no_duplicates(template.to_dict(), attribute="Name") + assert no_duplicates(template.to_dict(), attribute="$id") + + +@pytest.fixture(scope="session") +def climatestudio(config): + """A building template fixture from a climate studio idf file used in subsequent + tests""" + file = "tests/input_data/umi_samples/climatestudio_test.idf" + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + idf = IDF(file, epw=w, annual=True) + if idf.sim_info is None: + idf.simulate() + + bt = BuildingTemplate.from_idf(idf) + yield bt + + +@pytest.fixture(scope="session") +def sf_cz5a(config): + """A building template fixture from a climate studio idf file used in subsequent + tests""" + file = "tests/input_data/problematic/SF+CZ5A+USA_IL_Chicago-OHare.Intl.AP.725300+oilfurnace+slab+IECC_2012.idf" + w = "tests/input_data/CAN_PQ_Montreal.Intl.AP.716270_CWEC.epw" + idf = IDF(file, epw=w, annual=True) + + bt = BuildingTemplate.from_idf(idf) + yield bt diff --git a/tests/test_zonegraph.py b/tests/test_zonegraph.py new file mode 100644 index 00000000..a6db9e3d --- /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