diff --git a/.github/workflows/mac_release.yml b/.github/workflows/mac_release.yml index 28bf8321c84..bf1d0c015c4 100644 --- a/.github/workflows/mac_release.yml +++ b/.github/workflows/mac_release.yml @@ -4,6 +4,7 @@ on: push: tags: - '*' + workflow_dispatch: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -11,6 +12,7 @@ env: FC: gfortran-13 SDKROOT: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk Python_REQUIRED_VERSION: 3.12.2 + BUILD_DOCS: true # Installing MacTex takes like 15min, so you can speed things up by disabling it jobs: build_installer_artifact: @@ -39,6 +41,61 @@ jobs: steps: - uses: actions/checkout@v4 +# - name: Setup QtIFW 4.x +# uses: jmarrec/setup-qtifw@v1 +# with: +# qtifw-version: '4.6.1' + + - name: "Configure for codesigning" + run: | + set -x + cd $RUNNER_TEMP + mkdir codesigning && cd codesigning + # ----- Create certificate files from secrets base64 ----- + echo "${{ secrets.MACOS_DEVELOPER_ID_APPLICATION_CERTIFICATE_P12_BASE64 }}" | base64 --decode > certificate_application.p12 + echo "${{ secrets.MACOS_DEVELOPER_ID_INSTALLER_CERTIFICATE_P12_BASE64 }}" | base64 --decode > certificate_installer.p12 + + # ----- Configure Keychain ----- + KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db + security create-keychain -p "${{ secrets.MACOS_KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH + # Unlock it for 6 hours + security set-keychain-settings -lut 21600 $KEYCHAIN_PATH + security unlock-keychain -p "${{ secrets.MACOS_KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH + + # ----- Import certificates on Keychain ----- + security import certificate_application.p12 -P '${{ secrets.MACOS_DEVELOPER_ID_APPLICATION_CERTIFICATE_P12_PASSWORD }}' -A -t cert -f pkcs12 -k $KEYCHAIN_PATH + security import certificate_installer.p12 -P '${{ secrets.MACOS_DEVELOPER_ID_INSTALLER_CERTIFICATE_P12_PASSWORD }}' -A -t cert -f pkcs12 -k $KEYCHAIN_PATH + security list-keychain -d user -s $KEYCHAIN_PATH + security find-identity -vvvv $KEYCHAIN_PATH + + # Add needed intermediary certificates + aria2c https://www.apple.com/certificateauthority/AppleWWDRCAG2.cer + aria2c https://www.apple.com/certificateauthority/DeveloperIDG2CA.cer + security import AppleWWDRCAG2.cer -k $KEYCHAIN_PATH + security import DeveloperIDG2CA.cer -k $KEYCHAIN_PATH + security find-identity -vvvv $KEYCHAIN_PATH + security find-identity -v -p codesigning + + # Store AppConnect credentials + echo "${{ secrets.NOTARIZATION_API_KEY }}" > AppConnect_Developer_API_Key.p8 + xcrun notarytool store-credentials EnergyPlus \ + --key AppConnect_Developer_API_Key.p8 \ + --key-id ${{ secrets.NOTARIZATION_API_TEAM_ID }} \ + --issuer ${{ secrets.NOTARIZATION_API_ISSUER_ID }} \ + --keychain $KEYCHAIN_PATH + + cd .. && rm -Rf codesigning + + # Download my patched QtIFW + mkdir QtIFW && cd QtIFW + aria2c https://github.com/jmarrec/QtIFW-fixup/releases/download/v5.0.0-dev-with-fixup/QtIFW-5.0.0-${{ matrix.arch }}.zip + xattr -r -d com.apple.quarantine ./QtIFW-5.0.0-${{ matrix.arch }}.zip + unzip QtIFW-5.0.0-${{ matrix.arch }}.zip + rm -Rf ./*.zip + chmod +x * + ./installerbase --version + echo "$(pwd)" >> $GITHUB_PATH + - name: Remove python ${{ env.Python_REQUIRED_VERSION }} from the toolcache run: | ls $RUNNER_TOOL_CACHE/Python || true @@ -52,11 +109,6 @@ jobs: python-version: ${{ env.Python_REQUIRED_VERSION }} # check-latest: true # Force pick up the python I built instead of the (potential) toolcache one. I could also do `rm -Rf $RUNNER_TOOL_CACHE/Python/3.12.2` before this action - - name: Setup QtIFW 4.x - uses: jmarrec/setup-qtifw@v1 - with: - qtifw-version: '4.6.1' - - name: Install Python dependencies run: | python -m pip install --upgrade pip @@ -66,16 +118,22 @@ jobs: shell: bash run: | set -x - echo "Using brew to install mactex and adding it to PATH" brew update - brew install --cask mactex-no-gui - echo "/Library/TeX/texbin" >> $GITHUB_PATH + if [[ "$BUILD_DOCS" != "false" ]]; then + echo "Using brew to install mactex and adding it to PATH" + brew install --cask mactex-no-gui + echo "/Library/TeX/texbin" >> $GITHUB_PATH + echo "DOCUMENTATION_BUILD=BuildWithAll" >> $GITHUB_ENV + else + echo "DOCUMENTATION_BUILD=DoNotBuild" >> $GITHUB_ENV + fi # The MACOSX_DEPLOYMENT_TARGET environment variable sets the default value for the CMAKE_OSX_DEPLOYMENT_TARGET variable. # We use cmake commands to build some subprojects, so setting it globally echo MACOSX_DEPLOYMENT_TARGET=${{ matrix.macos_dev_target }} >> $GITHUB_ENV echo "Installing gcc@13 for gfortran support of -static-libquadmath" brew list gcc@13 || brew install gcc@13 which gfortran-13 || echo "FC=$(brew --prefix gcc@13)/bin/gfortran-13" >> $GITHUB_ENV + brew install ninja - name: Create Build Directory run: cmake -E make_directory ./build/ @@ -86,43 +144,99 @@ jobs: working-directory: ./build shell: bash run: | - cmake -DCMAKE_BUILD_TYPE:STRING=$BUILD_TYPE \ + cmake -G Ninja -DCMAKE_BUILD_TYPE:STRING=$BUILD_TYPE \ -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${{ matrix.macos_dev_target }} \ -DLINK_WITH_PYTHON:BOOL=ON -DPython_REQUIRED_VERSION:STRING=${{ steps.setup-python.outputs.python-version }} \ -DPython_ROOT_DIR:PATH=$RUNNER_TOOL_CACHE/Python/${{ steps.setup-python.outputs.python-version }}/${{ matrix.python-arch }}/ \ -DBUILD_FORTRAN:BOOL=ON -DBUILD_PACKAGE:BOOL=ON \ - -DDOCUMENTATION_BUILD:STRING="BuildWithAll" -DTEX_INTERACTION:STRING="batchmode" \ + -DDOCUMENTATION_BUILD:STRING=$DOCUMENTATION_BUILD -DTEX_INTERACTION:STRING="batchmode" \ -DENABLE_OPENMP:BOOL=OFF -DUSE_OpenMP:BOOL=OFF \ + -DCPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION:STRING="Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" \ + -DCPACK_CODESIGNING_NOTARY_PROFILE_NAME:STRING=EnergyPlus \ ../ - name: Build Package working-directory: ./build shell: bash - run: cmake --build . --target package -j 3 - - - name: otool the exes and libs - shell: bash - working-directory: ./build run: | - set -x - cd _CPack_Packages/Darwin/TGZ/EnergyPlus*/ - otool -L ExpandObjects || true - otool -L ConvertInputFormat || true - otool -L energyplus || true - otool -L libenergyplusapi.dylib || true - otool -L PreProcess/IDFVersionUpdater/Transition-V23-1-0-to-V23-2-0 || true - otool -L PostProcess/ReadVarsESO || true - otool -L PostProcess/HVAC-Diagram || true + ninja package - name: Upload Tarball as artifact for testing uses: actions/upload-artifact@v4 with: - name: energyplus-${{ matrix.os }} + name: energyplus-${{ matrix.os }}.tar.gz path: build/EnergyPlus-*-${{ matrix.arch }}.tar.gz if-no-files-found: error retention-days: 7 overwrite: false + - name: Upload DMG as artifact for testing + uses: actions/upload-artifact@v4 + with: + name: energyplus-${{ matrix.os }}.dmg + path: build/EnergyPlus-*-${{ matrix.arch }}.dmg + if-no-files-found: error + retention-days: 7 + overwrite: false + + - name: Quick Test Package Signing and otool exes and libs + shell: bash + working-directory: ./build + run: | + begin_group() { echo -e "::group::\033[93m$1\033[0m"; } + + subheader() { echo -e "\033[95m---- $1\033[0m"; } + + exes=( + "energyplus" "libenergyplusapi.dylib" + "ExpandObjects" "ConvertInputFormat" + "PreProcess/IDFVersionUpdater/Transition-V23-1-0-to-V23-2-0" + "PostProcess/ReadVarsESO" "PostProcess/HVAC-Diagram" + ) + + TGZ_DIR=$(find _CPack_Packages/Darwin/TGZ -name "EnergyPlus*" -type d -maxdepth 1) + echo "TGZ_DIR=$TGZ_DIR" >> $GITHUB_ENV + echo "Checking TGZ dir at $TGZ_DIR" + + for rel_exe in "${exes[@]}"; do + exe="$TGZ_DIR/$rel_exe" + begin_group "Checking $exe" + subheader "otool" + otool -L "${exe}" || true + subheader "codesign" + siginfo=$(codesign --display -vv "${exe}" 2>&1) + if [[ $siginfo == *"K7JYVQJL7R"* ]]; then + echo -e "\033[92mSIGNATURE OK\033[0m" + echo "$siginfo" | grep Authority + else + echo -e "\033[91mSignature not ok for ${exe}\033[0m" + echo "::error::title=Signature not ok for ${exe}::$siginfo" + fi + echo "::endgroup::" + done + + - name: Full Test Package signing and otool for IFW and TGZ + working-directory: ./build + shell: bash + run: | + begin_group() { echo -e "::group::\033[93m$1\033[0m"; } + + begin_group "Full Check signature of _CPack_Packages for both IFW and TGZ and resolve otool libraries" + python ../scripts/dev/verify_signature.py --verbose --otool --otool-out-file otool_infos_cpack.json . + echo "::endgroup::" + + begin_group "Running a simulation with python" + ./$TGZ_DIR/energyplus --help + ./$TGZ_DIR/energyplus -w ./$TGZ_DIR/WeatherData/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw -d out ./$TGZ_DIR/ExampleFiles/PythonPluginCustomSchedule.idf + echo "::endgroup::" + + - name: Upload otool info as artifact + uses: actions/upload-artifact@v4 + with: + name: otool_infos_cpack_${{ matrix.os }}_${{ matrix.arch }} + path: build/otool*json + if-no-files-found: error + - name: Upload Tarball to release uses: svenstaro/upload-release-action@v2 with: @@ -153,39 +267,96 @@ jobs: include: - macos_dev_target: 12.1 os: macos-12 + arch: x86_64 python-arch: x64 test_key: mac12 - macos_dev_target: 13.0 os: macos-14 + arch: arm64 python-arch: arm64 test_key: mac13-arm64 steps: - - uses: actions/checkout@v4 # Still need E+ checked out to get testing scripts - with: - path: checkout - - - name: Set up Python ${{ env.Python_REQUIRED_VERSION }} - uses: actions/setup-python@v5 - id: setup-python - with: - python-version: ${{ env.Python_REQUIRED_VERSION }} - architecture: ${{ matrix.python-arch }} - - - name: Gather Test Package from Artifacts - uses: actions/download-artifact@v4 - with: - name: energyplus-${{ matrix.os }} - path: package - - - name: Check Contents - shell: bash - run: ls - - - name: Check Package contents - shell: bash - working-directory: package - run: ls - - - name: Run Package Tests - run: python checkout/scripts/package_tests/runner.py --verbose ${{ matrix.test_key }} package/ + - uses: actions/checkout@v4 # Still need E+ checked out to get testing scripts + with: + path: checkout + + - name: Set up Python ${{ env.Python_REQUIRED_VERSION }} + uses: actions/setup-python@v5 + id: setup-python + with: + python-version: ${{ env.Python_REQUIRED_VERSION }} + architecture: ${{ matrix.python-arch }} + + - name: Gather Test Package from Artifacts + uses: actions/download-artifact@v4 + with: + name: energyplus-${{ matrix.os }}.tar.gz + path: package + + - name: Check Contents + shell: bash + run: ls + + - name: Check Package contents + shell: bash + working-directory: package + run: ls + + - name: Run Package Tests + run: python checkout/scripts/package_tests/runner.py --verbose ${{ matrix.test_key }} package/ + + - name: Gather Dmg Package from Artifacts + uses: actions/download-artifact@v4 + with: + name: energyplus-${{ matrix.os }}.dmg + path: dmg + + - name: Test Dmg Install and Package signing + working-directory: ./dmg + shell: bash + run: | + begin_group() { echo -e "::group::\033[93m$1\033[0m"; } + + set -x + + dmg=$(ls EnergyPlus-*.dmg) + begin_group "Checking Signature of .dmg" + spctl --assess --type open --context context:primary-signature -vvvv $dmg + echo "::endgroup::" + + begin_group "Mounting Dmg, and checking signature of installer app" + mkdir temp_mount + hdiutil attach -mountpoint ./temp_mount/ $dmg + filename="${dmg%.*}" + spctl --assess --type open --context context:primary-signature -vvvv ./temp_mount/$filename.app + echo "::endgroup::" + + begin_group "Installing" + sudo ./temp_mount/$filename.app/Contents/MacOS/$filename --accept-licenses --default-answer --confirm-command --root $(pwd)/test_install install + hdiutil detach ./temp_mount/ + echo "::endgroup::" + + begin_group "Quick Check signature of inner executables and binaries" + codesign -dvvv ./test_install/energyplus + codesign -dvvv ./test_install/libenergyplusapi.dylib + codesign -dvvv ./test_install/libpython*.dylib + codesign -dvvv ./test_install/ConvertInputFormat + codesign -dvvv ./test_install/PostProcess/ReadVarsESO + echo "::endgroup::" + + begin_group "Full Check signature of installed DMG for all executables and resolve otool libraries" + python ../checkout/scripts/dev/verify_signature.py --otool --otool-out-file otool_info_dmg.json --verbose --install test_install + echo "::endgroup::" + + begin_group "Running a simulation with python" + ./test_install/energyplus --help + ./test_install/energyplus -w ./test_install/WeatherData/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw -d out ./test_install/ExampleFiles/PythonPluginCustomSchedule.idf + echo "::endgroup::" + + - name: Upload otool info as artifact + uses: actions/upload-artifact@v4 + with: + name: otool_info_dmg_${{ matrix.os }}_${{ matrix.arch }} + path: dmg/otool*json + if-no-files-found: error diff --git a/CMakeLists.txt b/CMakeLists.txt index 52eacc3ff70..b6cded6bc15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,8 @@ endif() cmake_policy(SET CMP0048 NEW) # handling project_version_* variables +cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. + project(EnergyPlus) # Raise an error if attempting to compile on macOS older than 10.15 - it does not work diff --git a/bin/EP-Compare/Run-Mac/codesign.sh b/bin/EP-Compare/Run-Mac/codesign.sh new file mode 100755 index 00000000000..f6a7ca64746 --- /dev/null +++ b/bin/EP-Compare/Run-Mac/codesign.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +APP_NAME=EP-Compare +IDENTIFIER="org.nrel.EnergyPlus.$APP_NAME" + +function ep_codesign() { + codesign -vvvv -s "Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" \ + --force --timestamp \ + --prefix "$IDENTIFIER." \ + --options runtime \ + --entitlements entitlements.xml "$1" +} + +function ep_notarize() { + xcrun notarytool submit --keychain-profile "EnergyPlus" --wait "$1" +} + +ep_codesign "EP-Compare.app/Contents/Frameworks/RBAppearancePak.rbx_0.dylib" +ep_codesign "EP-Compare.app/Contents/Frameworks/TreeView.rbx_0.dylib" +ep_codesign "EP-Compare.app/Contents/Frameworks/#CoreClasses.rbx_5.dylib" +ep_codesign "EP-Compare.app/Contents/Frameworks/#CoreClasses.rbx_1.dylib" +ep_codesign "EP-Compare.app/Contents/Frameworks/#CoreClasses.rbx_0.dylib" +ep_codesign "EP-Compare.app/Contents/Frameworks/MBS REALbasic ChartDirector Plugin.rbx_0.dylib" + +ep_codesign "EP-Compare.app/Contents/MacOS/rbframework.dylib" +ep_codesign "EP-Compare.app/Contents/MacOS/EP-Compare" + +codesign -vvvv -s "Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" \ + --force --timestamp \ + --identifier "$IDENTIFIER" \ + --options runtime \ + --entitlements entitlements.xml \ + $APP_NAME.app + +zip -r ./$APP_NAME.zip ./$APP_NAME.app +ep_notarize ./$APP_NAME.zip +xcrun stapler staple ./$APP_NAME.app + +xcrun stapler validate ./$APP_NAME.app +spctl -vvvv --assess ./$APP_NAME.app +rm -Rf ./$APP_NAME.zip diff --git a/bin/EP-Compare/Run-Mac/entitlements.xml b/bin/EP-Compare/Run-Mac/entitlements.xml new file mode 100644 index 00000000000..6bc22e913b5 --- /dev/null +++ b/bin/EP-Compare/Run-Mac/entitlements.xml @@ -0,0 +1,14 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.cs.disable-library-validation + + + diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/CodeResources b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/CodeResources new file mode 100644 index 00000000000..2180b96a55d Binary files /dev/null and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/CodeResources differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/Python.framework/Versions/2.7/Python b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/Python.framework/Versions/2.7/Python index 4df7722b234..dc35b558d33 100755 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/Python.framework/Versions/2.7/Python and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/Python.framework/Versions/2.7/Python differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/Python.framework/Versions/2.7/_CodeSignature/CodeResources b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/Python.framework/Versions/2.7/_CodeSignature/CodeResources new file mode 100644 index 00000000000..40a4feca3ff --- /dev/null +++ b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/Python.framework/Versions/2.7/_CodeSignature/CodeResources @@ -0,0 +1,143 @@ + + + + + files + + Resources/Info.plist + + 4eyNy1lWpxqceFLieYb4qx7KzTg= + + + files2 + + Resources/Info.plist + + hash + + 4eyNy1lWpxqceFLieYb4qx7KzTg= + + hash2 + + 0vbpK1I47TVLDP3SGdcSphUVPje0iwEfPD/2N83Dq3U= + + + include/python2.7/pyconfig.h + + hash + + XOiYVxQGwvkR55AU49t7job0Jbg= + + hash2 + + l+MTv3YTFn1G2Pu51b9xBnbs8R0Hfa6JSlJ5975Zcgw= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libatk-1.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libatk-1.0.0.dylib index b31cf1963e4..07142706064 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libatk-1.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libatk-1.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libcairo.2.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libcairo.2.dylib index d46b1c0b229..b0c602258c2 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libcairo.2.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libcairo.2.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libcrypto.1.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libcrypto.1.0.0.dylib index 45d1e1b78e2..7ee0a3414d2 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libcrypto.1.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libcrypto.1.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libffi.6.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libffi.6.dylib index 9af534935af..5a0ba29318f 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libffi.6.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libffi.6.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libfontconfig.1.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libfontconfig.1.dylib index 4a62ce9f414..838fdaf1fd0 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libfontconfig.1.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libfontconfig.1.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libfreetype.6.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libfreetype.6.dylib index 09300eb4270..baaffa369f3 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libfreetype.6.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libfreetype.6.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgdk-quartz-2.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgdk-quartz-2.0.0.dylib index 3ba6b554987..a5619f3471e 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgdk-quartz-2.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgdk-quartz-2.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgdk_pixbuf-2.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgdk_pixbuf-2.0.0.dylib index eb373396838..78da67b7091 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgdk_pixbuf-2.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgdk_pixbuf-2.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgio-2.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgio-2.0.0.dylib index 817433c4a4c..508d9646949 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgio-2.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgio-2.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libglib-2.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libglib-2.0.0.dylib index 07a70f5e722..b518deb5bef 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libglib-2.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libglib-2.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgmodule-2.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgmodule-2.0.0.dylib index 88a06848377..1f6cecd0541 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgmodule-2.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgmodule-2.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgobject-2.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgobject-2.0.0.dylib index 6458c44863a..03b3e7a049f 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgobject-2.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgobject-2.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgthread-2.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgthread-2.0.0.dylib index 9f1feb82fe9..f438f2e7ab5 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgthread-2.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgthread-2.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgtk-quartz-2.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgtk-quartz-2.0.0.dylib index 943fee7ba53..f1648edbc1c 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgtk-quartz-2.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libgtk-quartz-2.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libharfbuzz.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libharfbuzz.0.dylib index 9951325a532..ecabaeb7b68 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libharfbuzz.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libharfbuzz.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libintl.8.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libintl.8.dylib index f92bb338fe1..7845f51f225 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libintl.8.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libintl.8.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpango-1.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpango-1.0.0.dylib index 0e83e752cad..c633b3a6102 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpango-1.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpango-1.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpangocairo-1.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpangocairo-1.0.0.dylib index 39d579e6ee6..4bf653db28f 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpangocairo-1.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpangocairo-1.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpangoft2-1.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpangoft2-1.0.0.dylib index ca47b704c60..e8d3607150a 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpangoft2-1.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpangoft2-1.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpixman-1.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpixman-1.0.dylib index 15cf0edf367..080e4906699 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpixman-1.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpixman-1.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpng16.16.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpng16.16.dylib index 4c26ea0c419..9149737bb31 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpng16.16.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpng16.16.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpyglib-2.0-python.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpyglib-2.0-python.0.dylib index 0f0ed8e06ab..e3948abad9d 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpyglib-2.0-python.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libpyglib-2.0-python.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libssl.1.0.0.dylib b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libssl.1.0.0.dylib index cd9810387ee..9f43ecfd053 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libssl.1.0.0.dylib and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Frameworks/libssl.1.0.0.dylib differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/MacOS/EP-Launch-Lite b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/MacOS/EP-Launch-Lite index 69e5dd0adef..490fcbf3169 100755 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/MacOS/EP-Launch-Lite and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/MacOS/EP-Launch-Lite differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/MacOS/python b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/MacOS/python index a0480755d2c..6205f17726b 100755 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/MacOS/python and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/MacOS/python differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/MacOS.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/MacOS.so index a0bc511063a..8c77c60ae3b 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/MacOS.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/MacOS.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/Nav.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/Nav.so index fdb5bc10b36..af4cac05b1f 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/Nav.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/Nav.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_AE.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_AE.so index ebdfdc600cd..2e1b3071593 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_AE.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_AE.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Ctl.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Ctl.so index 4b2a3baeb46..93ad8c1ba58 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Ctl.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Ctl.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Dlg.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Dlg.so index a9a587c9f76..082104865e0 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Dlg.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Dlg.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Evt.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Evt.so index cc1e0a39fa5..13795f111e2 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Evt.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Evt.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_File.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_File.so index 138565c6067..396053944bc 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_File.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_File.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Menu.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Menu.so index d1f7b971368..f64e9e48231 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Menu.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Menu.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Qd.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Qd.so index 696aadf1a0e..fdebb3aeebf 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Qd.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Qd.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Res.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Res.so index 9a1de41f93c..084ff8591a5 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Res.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Res.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Win.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Win.so index 769ad9c7b5b..6d0628d69b5 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Win.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_Win.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_cn.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_cn.so index f4662f1f9f3..5010b33a4ad 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_cn.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_cn.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_hk.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_hk.so index d98b916aae5..732b0d51ba0 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_hk.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_hk.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_iso2022.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_iso2022.so index e70a7d2cea7..92aa5dc1116 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_iso2022.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_iso2022.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_jp.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_jp.so index f35dc61c01e..4849ead7be8 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_jp.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_jp.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_kr.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_kr.so index 19abfdcdd20..40e17f72d19 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_kr.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_kr.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_tw.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_tw.so index 051a3525798..0940f94f6b2 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_tw.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_codecs_tw.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_collections.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_collections.so index aba276e6a38..a2cf3ffbcce 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_collections.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_collections.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_ctypes.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_ctypes.so index b84e4a791f3..a55cc2cbc55 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_ctypes.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_ctypes.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_functools.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_functools.so index 92c65b765ae..a0111b5dbe9 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_functools.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_functools.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_hashlib.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_hashlib.so index 6047d1e0972..5f8c4916fe5 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_hashlib.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_hashlib.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_heapq.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_heapq.so index 391660d83e5..8a3064f6cee 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_heapq.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_heapq.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_io.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_io.so index 53d71087f17..abc442de8cb 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_io.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_io.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_json.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_json.so index 549e9660f74..19ffd29310a 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_json.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_json.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_locale.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_locale.so index 52267bc310c..b9998be7258 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_locale.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_locale.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_multibytecodec.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_multibytecodec.so index 1f6be52aba0..99882d89045 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_multibytecodec.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_multibytecodec.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_random.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_random.so index 8db8b5b3d98..9839946aefd 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_random.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_random.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_scproxy.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_scproxy.so index 42350e85345..657b5c903e5 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_scproxy.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_scproxy.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_socket.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_socket.so index 3d947b26ce2..27f82ed946f 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_socket.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_socket.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_ssl.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_ssl.so index d195fda590c..4001e52c061 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_ssl.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_ssl.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_struct.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_struct.so index 961c243824e..bafb21dcc04 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_struct.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/_struct.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/array.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/array.so index 1db66bac500..179c7d9ac3b 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/array.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/array.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/atk.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/atk.so index b535541e886..b5fcc68c705 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/atk.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/atk.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/binascii.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/binascii.so index e2eeb70a91b..46827e56fe9 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/binascii.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/binascii.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/bz2.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/bz2.so index 945ce5dcb6c..4b21f0666ad 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/bz2.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/bz2.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cPickle.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cPickle.so index 9272a690008..b52a181bd86 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cPickle.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cPickle.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cStringIO.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cStringIO.so index 1069a51653f..61c0f6268d3 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cStringIO.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cStringIO.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cairo/_cairo.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cairo/_cairo.so index 49563e7c754..7e34f850167 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cairo/_cairo.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/cairo/_cairo.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/datetime.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/datetime.so index 9d8f129a5da..92730b5d208 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/datetime.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/datetime.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/fcntl.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/fcntl.so index 3ad5dfa2459..c48ef38e178 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/fcntl.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/fcntl.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gestalt.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gestalt.so index eddbc5bca25..6a0ffd6179d 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gestalt.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gestalt.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gio/_gio.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gio/_gio.so index d1247a6d5ca..166684f7774 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gio/_gio.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gio/_gio.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gio/unix.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gio/unix.so index 3b54a370db1..06bebcae818 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gio/unix.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gio/unix.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/glib/_glib.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/glib/_glib.so index 79a1fbdb385..8734f910dac 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/glib/_glib.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/glib/_glib.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gobject/_gobject.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gobject/_gobject.so index 128b7749635..b2d3998725c 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gobject/_gobject.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gobject/_gobject.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/grp.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/grp.so index 81fd856e370..f4bb71f9634 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/grp.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/grp.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gtk/_gtk.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gtk/_gtk.so index aba7567ac16..c0a25767f85 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gtk/_gtk.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/gtk/_gtk.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/itertools.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/itertools.so index 82429454bb4..76f6ced0934 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/itertools.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/itertools.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/math.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/math.so index 5d08ccffdf5..837b58c8bad 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/math.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/math.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/operator.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/operator.so index ac0d935a100..57af5aaacb2 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/operator.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/operator.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pango.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pango.so index 5313abf4946..c075792be29 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pango.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pango.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pangocairo.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pangocairo.so index 2fdea0bf981..0b7c3fe86ec 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pangocairo.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pangocairo.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/parser.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/parser.so index 9287c419dea..32ea87d3855 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/parser.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/parser.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pyexpat.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pyexpat.so index 7288de248ff..3810dc12fc2 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pyexpat.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/pyexpat.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/resource.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/resource.so index b4a38c76d3d..b25c1aec6e9 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/resource.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/resource.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/select.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/select.so index 14d70ab5eb0..0712666711b 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/select.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/select.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/strop.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/strop.so index a1d75c0d64e..118d794db7e 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/strop.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/strop.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/termios.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/termios.so index 64dcb93ee88..95e37a16c38 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/termios.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/termios.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/time.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/time.so index a8376baa84d..de82d1bafe9 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/time.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/time.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/unicodedata.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/unicodedata.so index 5a9d19c77bd..a68c7df5b3f 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/unicodedata.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/unicodedata.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/zlib.so b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/zlib.so index 218863f778b..65ed3f7ea05 100644 Binary files a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/zlib.so and b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/Resources/lib/python2.7/lib-dynload/zlib.so differ diff --git a/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/_CodeSignature/CodeResources b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/_CodeSignature/CodeResources new file mode 100644 index 00000000000..aeab70c42bd --- /dev/null +++ b/bin/EP-Launch-Lite/EP-Launch-Lite.app/Contents/_CodeSignature/CodeResources @@ -0,0 +1,1367 @@ + + + + + files + + Resources/EP-Launch-Lite.py + + zizPb9bBaTknoaJ+LD71ppGoOsk= + + Resources/PythonApplet.icns + + 9zRqvdRORUNhZjC9sNbLi26ck94= + + Resources/__boot__.py + + U3iE2yv22iDpDHju//5dZiv3qw4= + + Resources/__error__.sh + + RSc80021ClpLWgRkypPREPTxHnE= + + Resources/include/python2.7/pyconfig.h + + XOiYVxQGwvkR55AU49t7job0Jbg= + + Resources/lib/python2.7/lib-dynload/MacOS.so + + H6+ZJLYC/qEbTrO7wYigr3Adf6c= + + Resources/lib/python2.7/lib-dynload/Nav.so + + JL7fcCid/YLpsETTq/g8BGOVbkc= + + Resources/lib/python2.7/lib-dynload/_AE.so + + z1Wht5NGaY48A8EXjeThaa+1McU= + + Resources/lib/python2.7/lib-dynload/_Ctl.so + + C1FJ+AHZbyC146IYI3RFYN4ybJE= + + Resources/lib/python2.7/lib-dynload/_Dlg.so + + I9B7kLUwDU5zAN4t3X4JjYgsWe0= + + Resources/lib/python2.7/lib-dynload/_Evt.so + + oNJGGemWc00HBJNRMjIiCpKXZ60= + + Resources/lib/python2.7/lib-dynload/_File.so + + nxj+yj1ySy3uSwPb7pHUbBkFhYA= + + Resources/lib/python2.7/lib-dynload/_Menu.so + + D6xl1uym36FKyjODTDDZYzrR4zU= + + Resources/lib/python2.7/lib-dynload/_Qd.so + + fmNp5ePC9x8m6WfqaiIF5v5OLS0= + + Resources/lib/python2.7/lib-dynload/_Res.so + + g86kF6dpgzUEnIrPppqKthi4jtI= + + Resources/lib/python2.7/lib-dynload/_Win.so + + jNEgXyHIgf4iFn8+8q4kHUjNpqY= + + Resources/lib/python2.7/lib-dynload/_codecs_cn.so + + zNQPJ2/zJRv7m3Cn+T392pwpk4w= + + Resources/lib/python2.7/lib-dynload/_codecs_hk.so + + 6BK2sGAYuQm4mF3H5KBENPZIUS0= + + Resources/lib/python2.7/lib-dynload/_codecs_iso2022.so + + kyxkHPAKOgJ0+kx+NClhGmwHKEY= + + Resources/lib/python2.7/lib-dynload/_codecs_jp.so + + zzZPo9yQAuG/aorio0WHTkPkbew= + + Resources/lib/python2.7/lib-dynload/_codecs_kr.so + + oIL2fEROn4Kn1QXti6AAy9endfY= + + Resources/lib/python2.7/lib-dynload/_codecs_tw.so + + vvQT66zgva4iAIez9Ymc51XwCRs= + + Resources/lib/python2.7/lib-dynload/_collections.so + + jrGLPZ+LUFdz7kHTE/Y8UPFPmpA= + + Resources/lib/python2.7/lib-dynload/_ctypes.so + + lo+ACjt62brRTCw6RwTE+Ez2l90= + + Resources/lib/python2.7/lib-dynload/_functools.so + + CGBa9Hp3JScRzLScXVmK9PbzzIk= + + Resources/lib/python2.7/lib-dynload/_hashlib.so + + i2AHbMYN5TvH6S/PwuLq3mc0nHs= + + Resources/lib/python2.7/lib-dynload/_heapq.so + + l5TR/z5hZEjTLLlTzLJuUmQ2O8g= + + Resources/lib/python2.7/lib-dynload/_io.so + + ISPcTCYxEsfMctt6sifUens24uw= + + Resources/lib/python2.7/lib-dynload/_json.so + + y6eY3+AE/fOBjmdUTv+6FZ00vqM= + + Resources/lib/python2.7/lib-dynload/_locale.so + + QOz+ekBZ5HZVyfnOdHyXTF5Gs48= + + Resources/lib/python2.7/lib-dynload/_multibytecodec.so + + Gc5W01jh6kMxQ7RDyOExSfIMQ+c= + + Resources/lib/python2.7/lib-dynload/_random.so + + 6xHF7kaBe7poG8iPzGZeE5QpVVg= + + Resources/lib/python2.7/lib-dynload/_scproxy.so + + MPcwam/Hbb/Xu/BRG+hZmZhyUWU= + + Resources/lib/python2.7/lib-dynload/_socket.so + + g6SpznJHPWMRCTNZq+GoY/Som0Q= + + Resources/lib/python2.7/lib-dynload/_ssl.so + + o4Io6IzDQDbuPi753CNJZh7z55Q= + + Resources/lib/python2.7/lib-dynload/_struct.so + + 8a+SxCCJV1jYEHmJsJciTSTKAi8= + + Resources/lib/python2.7/lib-dynload/array.so + + 2b4fl+ZJOCeaUDmJ4KMa5FOKzbI= + + Resources/lib/python2.7/lib-dynload/atk.so + + Ul2sq73yPpAHKstpoCg4/aoQdH4= + + Resources/lib/python2.7/lib-dynload/binascii.so + + vRKILfxTPkXHhhgK0IAc0gnasE0= + + Resources/lib/python2.7/lib-dynload/bz2.so + + 88gCP8eCp4owCz5eAFHiVK5jOg4= + + Resources/lib/python2.7/lib-dynload/cPickle.so + + rSAvkeMu+KtC/BGmC53O4lLwfKo= + + Resources/lib/python2.7/lib-dynload/cStringIO.so + + UzE+t5ihDlEsoTCbe3NGgCaDa78= + + Resources/lib/python2.7/lib-dynload/cairo/_cairo.so + + tucOv4Ae3Fd43JdwsL79xfNjMns= + + Resources/lib/python2.7/lib-dynload/datetime.so + + uimuyp0kk7uER+yYAbR/wtFj3ow= + + Resources/lib/python2.7/lib-dynload/fcntl.so + + KXGS1D1yoWVINbp7Y4WdVFbvNNY= + + Resources/lib/python2.7/lib-dynload/gestalt.so + + ADOrEBoPGVSUFUReXTHYFSGePFI= + + Resources/lib/python2.7/lib-dynload/gio/_gio.so + + cBQee4573Mq01al9o9swNRaperQ= + + Resources/lib/python2.7/lib-dynload/gio/unix.so + + 3fJnxylmDRp8yeNQhIX7FoLHVSU= + + Resources/lib/python2.7/lib-dynload/glib/_glib.so + + Ke4vnZz9t10yfeG9cuWpefeZFvQ= + + Resources/lib/python2.7/lib-dynload/gobject/_gobject.so + + isSG1WePvfiyAeJq6l14O6GWV6w= + + Resources/lib/python2.7/lib-dynload/grp.so + + WfWF5rBf8pbRBL6MDEvIDlIRI5I= + + Resources/lib/python2.7/lib-dynload/gtk/_gtk.so + + FU1a5sN9jGGPd27woHEf7+HrH2Q= + + Resources/lib/python2.7/lib-dynload/itertools.so + + Ok7h1Avl4RF0cV9ugiTn3UPk1iw= + + Resources/lib/python2.7/lib-dynload/math.so + + cMAdsxdY/XzDJlM4baoYi0TGheo= + + Resources/lib/python2.7/lib-dynload/operator.so + + v7nfyU3YRQNMgxu99IOTyZ0JjAU= + + Resources/lib/python2.7/lib-dynload/pango.so + + FDPeJs34SdbiijH4hrtRtjoHZMg= + + Resources/lib/python2.7/lib-dynload/pangocairo.so + + qqo4zvFBsEPxs8Excxni+u1o1b8= + + Resources/lib/python2.7/lib-dynload/parser.so + + M45EWM1MlhAVetPoM+YKpT3CAJ0= + + Resources/lib/python2.7/lib-dynload/pyexpat.so + + PLFJsrJJQwO1U3zYiIwd5VnOwCk= + + Resources/lib/python2.7/lib-dynload/resource.so + + 0Wcbdv3DQ0ZtlsFZN9iDC36eKCw= + + Resources/lib/python2.7/lib-dynload/select.so + + M0hJTgqPM+mg72y8+8Xdv7x3SoY= + + Resources/lib/python2.7/lib-dynload/strop.so + + /EZoZGDhSU4EMZMvtrSveTVBm84= + + Resources/lib/python2.7/lib-dynload/termios.so + + 3lxFhSI4k1JbLMFDE78T6/5GtNY= + + Resources/lib/python2.7/lib-dynload/time.so + + yMeLO1nTWizoB5deQaAPyMYH1I8= + + Resources/lib/python2.7/lib-dynload/unicodedata.so + + YHvGiHtEL8BmNx6zQ5jHVSVSZmk= + + Resources/lib/python2.7/lib-dynload/zlib.so + + F5eP6DJjF0fgvMvq3BhGPHJWKyY= + + Resources/lib/python2.7/site-packages.zip + + jC64WzVCHX0iRDs/U6cqOsC/J8w= + + Resources/site.pyc + + 4ZLT9jnFl7Y4mY/9ky6KxtRXpx4= + + + files2 + + Frameworks/Python.framework + + cdhash + + C16hoUymVud+KV4cZ3dMLhrpxrQ= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libatk-1.0.0.dylib + + cdhash + + dpOAMtIg4bUFxpNtpPNWhi0L/IM= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libcairo.2.dylib + + cdhash + + sU1vXh78iJgz5dPUpGRe/s+q2jQ= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libcrypto.1.0.0.dylib + + cdhash + + gOavU8KXc6CgempI0tAkFqpLpAs= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libffi.6.dylib + + cdhash + + yg+Mh9GTtgm+KaGjEksH1GBC8Wk= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libfontconfig.1.dylib + + cdhash + + ug8Xp42FH59AHdRdLi3M3OmS6Nw= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libfreetype.6.dylib + + cdhash + + i2gVRAgb5f3w76YN6/u5X0EjI1w= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libgdk-quartz-2.0.0.dylib + + cdhash + + HH5jm1/EwnK3/GLpDSGMy43nsSU= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libgdk_pixbuf-2.0.0.dylib + + cdhash + + nBqUz/rn579W3fRCZZjzhVZcIxw= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libgio-2.0.0.dylib + + cdhash + + RLk6aH18mT0AbsUio6gbovft6qU= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libglib-2.0.0.dylib + + cdhash + + bhXwNV75ahSyGkJw8drvJzt0W20= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libgmodule-2.0.0.dylib + + cdhash + + oqy9yHkE/gDuQnuAxdxRdI4T1T4= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libgobject-2.0.0.dylib + + cdhash + + ez4DMKI5Ty+5qlThyn+syinLokw= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libgthread-2.0.0.dylib + + cdhash + + pWiz9RCC3heM2sKV15FmrC2gW0Q= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libgtk-quartz-2.0.0.dylib + + cdhash + + 5rVwYZEpTVqGSqylo8UqD78T/Pw= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libharfbuzz.0.dylib + + cdhash + + BQtA2HANprb0BZgGLhT9vNiOnzA= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libintl.8.dylib + + cdhash + + uOFznIzXEcQMYH/5MpnhO0+c5qo= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libpango-1.0.0.dylib + + cdhash + + kyZg9qF5LE6Kkh8xjgnJaZdyG7c= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libpangocairo-1.0.0.dylib + + cdhash + + KEImMqdJT/25VZWGgn9fNputZZc= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libpangoft2-1.0.0.dylib + + cdhash + + irdk9nXQJswvvcRyBgAViJ5xSmg= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libpixman-1.0.dylib + + cdhash + + Bqn3CahXuA3LOFx6ZtosPSCj0R4= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libpng16.16.dylib + + cdhash + + OnXNLJSgG1oci0Wwi7srnQGpaxo= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libpyglib-2.0-python.0.dylib + + cdhash + + 0gebB2B7lMDD5KPB7k7yDjMk2t8= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libssl.1.0.0.dylib + + cdhash + + sz5nHghY/2SDYEFt0UjfYhcvNp4= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + MacOS/python + + cdhash + + PyauaoRM7vi9eeHO2Hen40/FVt8= + + requirement + identifier "org.nrel.EnergyPlus.EP-Launch-Lite" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Resources/EP-Launch-Lite.py + + hash + + zizPb9bBaTknoaJ+LD71ppGoOsk= + + hash2 + + KA02ij2hPfSuV5AKZCi2rqIhj0J9rAJ8TKqrRSs7P/0= + + + Resources/PythonApplet.icns + + hash + + 9zRqvdRORUNhZjC9sNbLi26ck94= + + hash2 + + eHksEElSftDQiDfMtwxo3rWW/gCukmOJdD1flXi1uxE= + + + Resources/__boot__.py + + hash + + U3iE2yv22iDpDHju//5dZiv3qw4= + + hash2 + + v9QQ5DU4xUzrMb4+LsrPEqYDSLhezRKvjq/lyiVm05c= + + + Resources/__error__.sh + + hash + + RSc80021ClpLWgRkypPREPTxHnE= + + hash2 + + W4ZTgQ/QGtxOut5n5GOaiHgZlUvzZyEHrEUkBSqL7fU= + + + Resources/include/python2.7/pyconfig.h + + hash + + XOiYVxQGwvkR55AU49t7job0Jbg= + + hash2 + + l+MTv3YTFn1G2Pu51b9xBnbs8R0Hfa6JSlJ5975Zcgw= + + + Resources/lib/python2.7/lib-dynload/MacOS.so + + hash + + H6+ZJLYC/qEbTrO7wYigr3Adf6c= + + hash2 + + fN9Gm3+1wWCG+GyQOtCWaqXnXJ9IbdnPv2eq0ur2a+c= + + + Resources/lib/python2.7/lib-dynload/Nav.so + + hash + + JL7fcCid/YLpsETTq/g8BGOVbkc= + + hash2 + + 8W6KJKGzOH8ZOURyRlgzUH+xfIrmYr12FoKDGxD47GM= + + + Resources/lib/python2.7/lib-dynload/_AE.so + + hash + + z1Wht5NGaY48A8EXjeThaa+1McU= + + hash2 + + hrUW87pLeo3Ikuj4JhQOWexL1l0+Nd7n9auKL1mAlHc= + + + Resources/lib/python2.7/lib-dynload/_Ctl.so + + hash + + C1FJ+AHZbyC146IYI3RFYN4ybJE= + + hash2 + + G931esgA5zKyYdoxfstizMxUocOftIJVTfRJJ73MvdE= + + + Resources/lib/python2.7/lib-dynload/_Dlg.so + + hash + + I9B7kLUwDU5zAN4t3X4JjYgsWe0= + + hash2 + + /7S7vbccgIJZanKbHXKhSNoOi8M5Y9wQuox+1qBv06M= + + + Resources/lib/python2.7/lib-dynload/_Evt.so + + hash + + oNJGGemWc00HBJNRMjIiCpKXZ60= + + hash2 + + A1H0GmqXdHQHoEBQkqsO+87zH1Hne2wfXBlHLmMwl9U= + + + Resources/lib/python2.7/lib-dynload/_File.so + + hash + + nxj+yj1ySy3uSwPb7pHUbBkFhYA= + + hash2 + + Ydln7wfzJnTIwcy54Uohcs3q7T3dTzf0eqCAppMT1SQ= + + + Resources/lib/python2.7/lib-dynload/_Menu.so + + hash + + D6xl1uym36FKyjODTDDZYzrR4zU= + + hash2 + + Y0dk0boGg365+CDjU7fn3Hfu9YMSaidaYdXKB28O28E= + + + Resources/lib/python2.7/lib-dynload/_Qd.so + + hash + + fmNp5ePC9x8m6WfqaiIF5v5OLS0= + + hash2 + + kO3eMQhxkJ6IXblIG4+uAR7pZEmb76A2cQ6K+c6AZO0= + + + Resources/lib/python2.7/lib-dynload/_Res.so + + hash + + g86kF6dpgzUEnIrPppqKthi4jtI= + + hash2 + + 0yoXDjh6y9t15JqOftBhQlUn9l38tHlD1LAs9zyDVqo= + + + Resources/lib/python2.7/lib-dynload/_Win.so + + hash + + jNEgXyHIgf4iFn8+8q4kHUjNpqY= + + hash2 + + CHazubdkG8/eU/mq/A0BGF4uNp2IuClJCMPO/QMjJOo= + + + Resources/lib/python2.7/lib-dynload/_codecs_cn.so + + hash + + zNQPJ2/zJRv7m3Cn+T392pwpk4w= + + hash2 + + nMjw3QUfHNfDo8GqLifARVKHLarsId9R9FwrUQOLzHY= + + + Resources/lib/python2.7/lib-dynload/_codecs_hk.so + + hash + + 6BK2sGAYuQm4mF3H5KBENPZIUS0= + + hash2 + + SbRmoURH8mM8Ca6t3Zb37GUjW1dbM8Llzs9TfLJ/f7k= + + + Resources/lib/python2.7/lib-dynload/_codecs_iso2022.so + + hash + + kyxkHPAKOgJ0+kx+NClhGmwHKEY= + + hash2 + + pWVvVX4UgdxWp03dWLucz5EwKQxeANXHLqZCVgHWr6o= + + + Resources/lib/python2.7/lib-dynload/_codecs_jp.so + + hash + + zzZPo9yQAuG/aorio0WHTkPkbew= + + hash2 + + OrYK2vsyu0YGWcgntjhhHC7R4gduSVPBDiFNiK68sYg= + + + Resources/lib/python2.7/lib-dynload/_codecs_kr.so + + hash + + oIL2fEROn4Kn1QXti6AAy9endfY= + + hash2 + + MLde8yUEhr1KCksgzbDoUBVWbKFMM2paHLCoz8i8W4U= + + + Resources/lib/python2.7/lib-dynload/_codecs_tw.so + + hash + + vvQT66zgva4iAIez9Ymc51XwCRs= + + hash2 + + fATu40pzay8PFuydtbqMvpZoYuQf0fi75AZP/Zh40S8= + + + Resources/lib/python2.7/lib-dynload/_collections.so + + hash + + jrGLPZ+LUFdz7kHTE/Y8UPFPmpA= + + hash2 + + vNCoKJbtGgZeOFUiJDZs2miq3WmhEuISZ6jl/YtTZzs= + + + Resources/lib/python2.7/lib-dynload/_ctypes.so + + hash + + lo+ACjt62brRTCw6RwTE+Ez2l90= + + hash2 + + /YSmGmGXEt3IZ+c/cj/1bwbqAk2SSEg3B2BS0Xl0H1U= + + + Resources/lib/python2.7/lib-dynload/_functools.so + + hash + + CGBa9Hp3JScRzLScXVmK9PbzzIk= + + hash2 + + eYD4kSLXTk3+4KC3jNiCLBLw8V1S4bl6DlefaAcidzY= + + + Resources/lib/python2.7/lib-dynload/_hashlib.so + + hash + + i2AHbMYN5TvH6S/PwuLq3mc0nHs= + + hash2 + + Wf4eRRSaKMg3+QgZY4JP24WJJMFxZXoDz8OEtjBtdqI= + + + Resources/lib/python2.7/lib-dynload/_heapq.so + + hash + + l5TR/z5hZEjTLLlTzLJuUmQ2O8g= + + hash2 + + eIXpglPyWNC0mlzRvg+5DeGg1R3d8A7cfHiZmP8HlCE= + + + Resources/lib/python2.7/lib-dynload/_io.so + + hash + + ISPcTCYxEsfMctt6sifUens24uw= + + hash2 + + Bo740iVVaePwdOVtInaJxviX+4fTGdZoKEwY6jMrAZE= + + + Resources/lib/python2.7/lib-dynload/_json.so + + hash + + y6eY3+AE/fOBjmdUTv+6FZ00vqM= + + hash2 + + 6RgV9h4dv1NDz+9u1JHV6OMKW9dZSpFo5RozST4P7xY= + + + Resources/lib/python2.7/lib-dynload/_locale.so + + hash + + QOz+ekBZ5HZVyfnOdHyXTF5Gs48= + + hash2 + + GLpLamLICNi0F+d6Z32uzWtPywOFSieuSB3Mhi/DnYk= + + + Resources/lib/python2.7/lib-dynload/_multibytecodec.so + + hash + + Gc5W01jh6kMxQ7RDyOExSfIMQ+c= + + hash2 + + LLtqwVMPlAP7UpfMGQs6V2VKddQ8T0ytGIDUVhJsitw= + + + Resources/lib/python2.7/lib-dynload/_random.so + + hash + + 6xHF7kaBe7poG8iPzGZeE5QpVVg= + + hash2 + + Wx/MfFxRZ0/mwhtuYdfV/yZ4uyDWRi6u6bohkLk3shw= + + + Resources/lib/python2.7/lib-dynload/_scproxy.so + + hash + + MPcwam/Hbb/Xu/BRG+hZmZhyUWU= + + hash2 + + XCaUCGaEa+w525CVoK0NY8VqbtRuUOlhemFZnSyiY1g= + + + Resources/lib/python2.7/lib-dynload/_socket.so + + hash + + g6SpznJHPWMRCTNZq+GoY/Som0Q= + + hash2 + + kPxsIYEaHU6Q/cOIfZ6t+w6O/VfNFYGNE06nAG7fJwY= + + + Resources/lib/python2.7/lib-dynload/_ssl.so + + hash + + o4Io6IzDQDbuPi753CNJZh7z55Q= + + hash2 + + pvKRNgaLUa5dDGUqabU9OXdv2zVTcrmBQvo1N7eodbk= + + + Resources/lib/python2.7/lib-dynload/_struct.so + + hash + + 8a+SxCCJV1jYEHmJsJciTSTKAi8= + + hash2 + + eiRJlCkw5a/FKQeaRbDV5ncy4MaxjuDVuCfLZcyxPdc= + + + Resources/lib/python2.7/lib-dynload/array.so + + hash + + 2b4fl+ZJOCeaUDmJ4KMa5FOKzbI= + + hash2 + + gytr1IuFD8OICDrSUpnX6yWUyDWrXt75g1IWEamYp3k= + + + Resources/lib/python2.7/lib-dynload/atk.so + + hash + + Ul2sq73yPpAHKstpoCg4/aoQdH4= + + hash2 + + ofrbjqOpUXwI8+dgzgglSaH6xGLjwGbCJYlQjVVNVcs= + + + Resources/lib/python2.7/lib-dynload/binascii.so + + hash + + vRKILfxTPkXHhhgK0IAc0gnasE0= + + hash2 + + cyN9GXI8xaFMhb/RyvB5Vkcp/spilFqbnIfobfNc4Y0= + + + Resources/lib/python2.7/lib-dynload/bz2.so + + hash + + 88gCP8eCp4owCz5eAFHiVK5jOg4= + + hash2 + + SQ+thnHlbPDGcLthBds/mEN7g3RWuMkXXkcsJ/zrbQE= + + + Resources/lib/python2.7/lib-dynload/cPickle.so + + hash + + rSAvkeMu+KtC/BGmC53O4lLwfKo= + + hash2 + + oj9i204KzR+jN5pnKEi31nqtsWrO0tD7qrGvi1UQBhA= + + + Resources/lib/python2.7/lib-dynload/cStringIO.so + + hash + + UzE+t5ihDlEsoTCbe3NGgCaDa78= + + hash2 + + VyuVQuDaoGTjJBzyYv5f9B3dxeXEptwUmZFtVxNUf8w= + + + Resources/lib/python2.7/lib-dynload/cairo/_cairo.so + + hash + + tucOv4Ae3Fd43JdwsL79xfNjMns= + + hash2 + + hGaT4o9ExJjjxo3zT4uJMkNbBOnwmgDLlSsb73/X6eo= + + + Resources/lib/python2.7/lib-dynload/datetime.so + + hash + + uimuyp0kk7uER+yYAbR/wtFj3ow= + + hash2 + + qSCp5d6DEf/P3skdi6GDhb9y+JKB8xEg3kIk0BuGJIk= + + + Resources/lib/python2.7/lib-dynload/fcntl.so + + hash + + KXGS1D1yoWVINbp7Y4WdVFbvNNY= + + hash2 + + rgt7c/Zf0lADQpImgRWtzN1CZjsUn0KeFpXmerIhbH0= + + + Resources/lib/python2.7/lib-dynload/gestalt.so + + hash + + ADOrEBoPGVSUFUReXTHYFSGePFI= + + hash2 + + zo7WF5go7g5Kzw7U47+lSwSXt6kh3l59uYNQYGPMzvo= + + + Resources/lib/python2.7/lib-dynload/gio/_gio.so + + hash + + cBQee4573Mq01al9o9swNRaperQ= + + hash2 + + gWnqQpxHbGI1bKm3OP8+LqWK7u2urFGqixOIioBn7t4= + + + Resources/lib/python2.7/lib-dynload/gio/unix.so + + hash + + 3fJnxylmDRp8yeNQhIX7FoLHVSU= + + hash2 + + aHht7rfXGQFtFLXwJJBrBe7MLPJeyAbPmn7TghBNo+4= + + + Resources/lib/python2.7/lib-dynload/glib/_glib.so + + hash + + Ke4vnZz9t10yfeG9cuWpefeZFvQ= + + hash2 + + rSLqY8X8UO+v8OnFSdKMaIqaiRA7PNqxA8QTi2TBeuo= + + + Resources/lib/python2.7/lib-dynload/gobject/_gobject.so + + hash + + isSG1WePvfiyAeJq6l14O6GWV6w= + + hash2 + + Dj1nEDEZZ+f5Pp0chja9ELaChgFwy0REGh1QZCOHZQw= + + + Resources/lib/python2.7/lib-dynload/grp.so + + hash + + WfWF5rBf8pbRBL6MDEvIDlIRI5I= + + hash2 + + D+L+uFYGBzfb/n0Cc5kZ59Xwr49pPlky6ShnA4frZnw= + + + Resources/lib/python2.7/lib-dynload/gtk/_gtk.so + + hash + + FU1a5sN9jGGPd27woHEf7+HrH2Q= + + hash2 + + /OY+1y93FZonbCm6knUZVFMzPEB4aMnrSCfpBDlmF6A= + + + Resources/lib/python2.7/lib-dynload/itertools.so + + hash + + Ok7h1Avl4RF0cV9ugiTn3UPk1iw= + + hash2 + + XjYRK6naZE7kecF8pf7DJIrSEDgHmN3KOhaDSZ+cn8c= + + + Resources/lib/python2.7/lib-dynload/math.so + + hash + + cMAdsxdY/XzDJlM4baoYi0TGheo= + + hash2 + + KdyNLziQILLJzhjTGz5kMDCRBCKOR6wwsLO7ShdNq8k= + + + Resources/lib/python2.7/lib-dynload/operator.so + + hash + + v7nfyU3YRQNMgxu99IOTyZ0JjAU= + + hash2 + + lAt/IZ9GYA5g2RT4AQPfVFL8Ye362jISSs3Y0p375gA= + + + Resources/lib/python2.7/lib-dynload/pango.so + + hash + + FDPeJs34SdbiijH4hrtRtjoHZMg= + + hash2 + + ZMBYiI8YcoQu9DG6X+3MxJJLELQUKUAQ0YNoE9B+YOw= + + + Resources/lib/python2.7/lib-dynload/pangocairo.so + + hash + + qqo4zvFBsEPxs8Excxni+u1o1b8= + + hash2 + + y3iRco44WKItaSa8+BXNKL5L7Dxe1xrK0I0kJGPw3po= + + + Resources/lib/python2.7/lib-dynload/parser.so + + hash + + M45EWM1MlhAVetPoM+YKpT3CAJ0= + + hash2 + + uF3jcLlyMiOhDSfB1Icogp//YjVebdb/SaHbgqXENy8= + + + Resources/lib/python2.7/lib-dynload/pyexpat.so + + hash + + PLFJsrJJQwO1U3zYiIwd5VnOwCk= + + hash2 + + +RHeK7C8WW9LhUXbPiiT5ki+b02EyxkGBFU6PuxsZEw= + + + Resources/lib/python2.7/lib-dynload/resource.so + + hash + + 0Wcbdv3DQ0ZtlsFZN9iDC36eKCw= + + hash2 + + VIQdwKSkUD00PTbDNfaAeSB1O/wuPCIVbWG40fbYNRY= + + + Resources/lib/python2.7/lib-dynload/select.so + + hash + + M0hJTgqPM+mg72y8+8Xdv7x3SoY= + + hash2 + + pV/I7R3WDkzLIUX88svyT9gmkYt8sIQX3vvyxd+xE14= + + + Resources/lib/python2.7/lib-dynload/strop.so + + hash + + /EZoZGDhSU4EMZMvtrSveTVBm84= + + hash2 + + iwv5TdgXpciMXF0H5ryCeq0CPrtOurtahhgk/SpRcYA= + + + Resources/lib/python2.7/lib-dynload/termios.so + + hash + + 3lxFhSI4k1JbLMFDE78T6/5GtNY= + + hash2 + + 6sE7vT864e6qJMM/Y6Z5a8d0CEbXuW4izqLDGP7z+ag= + + + Resources/lib/python2.7/lib-dynload/time.so + + hash + + yMeLO1nTWizoB5deQaAPyMYH1I8= + + hash2 + + iUsIwRiiQA98iNFeOj74o+K5djvYAzyXdVjHc4Kufco= + + + Resources/lib/python2.7/lib-dynload/unicodedata.so + + hash + + YHvGiHtEL8BmNx6zQ5jHVSVSZmk= + + hash2 + + mllAwaos26MPv9zmaMC9Qe6ZBE8+bO+jSI+30ypwnmc= + + + Resources/lib/python2.7/lib-dynload/zlib.so + + hash + + F5eP6DJjF0fgvMvq3BhGPHJWKyY= + + hash2 + + bkP1MGLmZKwTQxOX0qLJkMIWHELPd9nJsLl33qKIAkw= + + + Resources/lib/python2.7/site-packages.zip + + hash + + jC64WzVCHX0iRDs/U6cqOsC/J8w= + + hash2 + + qu8AJiDIVVP9ohhMFvupsjnP+uGYgyHkfIZgWmVrgoI= + + + Resources/lib/python2.7/site.pyc + + symlink + ../../site.pyc + + Resources/site.pyc + + hash + + 4ZLT9jnFl7Y4mY/9ky6KxtRXpx4= + + hash2 + + CjCxkJxzdOZ4UyP1p8C4d2MHP0ipCTQqd+pOlom0w5Y= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/bin/EP-Launch-Lite/codesign.sh b/bin/EP-Launch-Lite/codesign.sh new file mode 100755 index 00000000000..4ad18cb53ab --- /dev/null +++ b/bin/EP-Launch-Lite/codesign.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +APP_NAME=EP-Launch-Lite +IDENTIFIER="org.nrel.EnergyPlus.$APP_NAME" + +function ep_codesign() { + codesign -vvvv -s "Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" \ + --force --timestamp \ + --identifier "$IDENTIFIER" \ + --options runtime \ + --entitlements entitlements.xml "$1" +} + +function ep_notarize() { + xcrun notarytool submit --keychain-profile "EnergyPlus" --wait "$1" +} + + +echo "Dealing wiht Python.framework" + +find EP-Launch-Lite.app/Contents/Resources/ -name "*.so" | xargs codesign -vvvv -s "Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" \ + --force --timestamp \ + --identifier "$IDENTIFIER" \ + --options runtime \ + --entitlements entitlements.xml + + +codesign -vvvv -s "Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" \ + --force --timestamp \ + --identifier "$IDENTIFIER" \ + --options runtime \ + --entitlements entitlements.xml \ + EP-Launch-Lite.app/Contents/Frameworks/Python.framework/Versions/2.7/Python + +codesign -vvvv -s "Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" \ + --deep \ + --force --timestamp \ + --identifier "$IDENTIFIER" \ + --options runtime \ + --entitlements entitlements.xml \ + EP-Launch-Lite.app/Contents/Frameworks/Python.framework + +echo "DYlibs" + +find EP-Launch-Lite.app/Contents/ -name "*.dylib" | xargs codesign -vvvv -s "Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" \ + --force --timestamp \ + --identifier "$IDENTIFIER" \ + --options runtime \ + --entitlements entitlements.xml + + + +cd EP-Launch-Lite.app/Contents/Frameworks +zip -r ./Python.framework.zip ./Python.framework +ep_notarize ./Python.framework.zip +# xcrun stapler staple ./Python.framework +# xcrun stapler validate ./Python.framework +rm -Rf ./Python.framework.zip +cd ../../.. + +echo "Dealing with EP-Launch-Lite itself" +ep_codesign EP-Launch-Lite.app/Contents/MacOS/EP-Launch-Lite + +# Docs say deep should not be used, but whatever +codesign -vvvv -s "Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" \ + --deep \ + --force --timestamp \ + --identifier "$IDENTIFIER" \ + --options runtime \ + --entitlements entitlements.xml \ + $APP_NAME.app + +zip -r ./$APP_NAME.zip ./$APP_NAME.app +ep_notarize ./$APP_NAME.zip +xcrun stapler staple ./$APP_NAME.app + +xcrun stapler validate -v ./$APP_NAME.app +spctl -vvvv --assess ./$APP_NAME.app +rm -Rf ./$APP_NAME.zip diff --git a/bin/EP-Launch-Lite/entitlements.xml b/bin/EP-Launch-Lite/entitlements.xml new file mode 100644 index 00000000000..7b677ae2d97 --- /dev/null +++ b/bin/EP-Launch-Lite/entitlements.xml @@ -0,0 +1,8 @@ + + + + + com.apple.security.cs.allow-unsigned-executable-memory + + + diff --git a/bin/EPMacro/Mac/EPMacro b/bin/EPMacro/Mac/EPMacro index 2f0e3d031da..44d6afb46f1 100755 Binary files a/bin/EPMacro/Mac/EPMacro and b/bin/EPMacro/Mac/EPMacro differ diff --git a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/CodeResources b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/CodeResources new file mode 100644 index 00000000000..79328061063 Binary files /dev/null and b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/CodeResources differ diff --git a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/AppearancePakCocoa.dylib b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/AppearancePakCocoa.dylib index 280904b6050..2eb527f5e94 100644 Binary files a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/AppearancePakCocoa.dylib and b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/AppearancePakCocoa.dylib differ diff --git a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/Crypto.dylib b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/Crypto.dylib index 08eb9f100b4..d4c7b62a575 100644 Binary files a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/Crypto.dylib and b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/Crypto.dylib differ diff --git a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/InternetEncodings.dylib b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/InternetEncodings.dylib index df3888cddc6..0ccb3042f58 100644 Binary files a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/InternetEncodings.dylib and b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/InternetEncodings.dylib differ diff --git a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/Shell.dylib b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/Shell.dylib index 06bfa400458..415b160aad1 100644 Binary files a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/Shell.dylib and b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/Shell.dylib differ diff --git a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/XojoFramework.framework/Versions/A/XojoFramework b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/XojoFramework.framework/Versions/A/XojoFramework index a98402d99d4..6c127766ef5 100644 Binary files a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/XojoFramework.framework/Versions/A/XojoFramework and b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/XojoFramework.framework/Versions/A/XojoFramework differ diff --git a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/libGzip.dylib b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/libGzip.dylib index d480bb59a16..908bd644b38 100644 Binary files a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/libGzip.dylib and b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/Frameworks/libGzip.dylib differ diff --git a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/MacOS/IDFVersionUpdater b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/MacOS/IDFVersionUpdater old mode 100644 new mode 100755 index f62a2a6051d..251749cd212 Binary files a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/MacOS/IDFVersionUpdater and b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/MacOS/IDFVersionUpdater differ diff --git a/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/_CodeSignature/CodeResources b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/_CodeSignature/CodeResources new file mode 100644 index 00000000000..1ba29a2e2b6 --- /dev/null +++ b/bin/IDFVersionUpdater/Run-Mac/IDFVersionUpdater.app/Contents/_CodeSignature/CodeResources @@ -0,0 +1,170 @@ + + + + + files + + files2 + + Frameworks/AppearancePakCocoa.dylib + + cdhash + + 6PdWR5jcBulWDZIQXDNpYkA0/7I= + + requirement + identifier "org.nrel.EnergyPlus.IDFVersionUpdater" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/Crypto.dylib + + cdhash + + wOB0i02vmGFaXDr+h6C2CdAztpw= + + requirement + identifier "org.nrel.EnergyPlus.IDFVersionUpdater" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/InternetEncodings.dylib + + cdhash + + VMP4EfpITHc8meVTCvS+M4jB1FA= + + requirement + identifier "org.nrel.EnergyPlus.IDFVersionUpdater" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/Shell.dylib + + cdhash + + vRTckKzZFnudYufuiUIgDwgkcSs= + + requirement + identifier "org.nrel.EnergyPlus.IDFVersionUpdater" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/XojoFramework.framework + + cdhash + + 3bNX1QuPpX9JYwkzAI/KGzgU6kw= + + requirement + identifier "org.nrel.EnergyPlus.IDFVersionUpdater" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + Frameworks/libGzip.dylib + + cdhash + + RqthY78xHobbVOa2G2iSW+fFdQo= + + requirement + identifier "org.nrel.EnergyPlus.IDFVersionUpdater" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = K7JYVQJL7R + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^Resources/Base\.lproj/ + + weight + 1010 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/bin/IDFVersionUpdater/Run-Mac/codesign.sh b/bin/IDFVersionUpdater/Run-Mac/codesign.sh old mode 100644 new mode 100755 index 29a329ce8cf..f8f2c3a94c2 --- a/bin/IDFVersionUpdater/Run-Mac/codesign.sh +++ b/bin/IDFVersionUpdater/Run-Mac/codesign.sh @@ -1,16 +1,48 @@ #!/bin/bash -OS_VERS=`sw_vers -productVersion` -if [ $? -ne 0 ]; then - echo "this script must be run on macOS!" - exit 1 -fi -APP_PATH="IDFVersionUpdater.app" -if [ -e "${APP_PATH}.tar" ]; then - tar -xf "${APP_PATH}.tar" - rm "${APP_PATH}.tar" -fi -if [ -e "${APP_PATH}" ]; then - /usr/bin/xattr -cr "${APP_PATH}" - /usr/bin/codesign --force --deep -s - "${APP_PATH}" -fi +APP_NAME=IDFVersionUpdater +IDENTIFIER="org.nrel.EnergyPlus.$APP_NAME" + +function ep_codesign() { + codesign -vvvv -s "Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" \ + --force --timestamp \ + --identifier "$IDENTIFIER" \ + --options runtime "$1" +} + +function ep_notarize() { + xcrun notarytool submit --keychain-profile "EnergyPlus" --wait "$1" +} + +ep_codesign ./IDFVersionUpdater.app/Contents/Frameworks/XojoFramework.framework + +#cd IDFVersionUpdater.app/Contents/Frameworks/ +#zip -r ./XojoFramework.framework.zip ./XojoFramework.framework +#ep_notarize ./XojoFramework.framework.zip +#xcrun stapler staple ./XojoFramework.framework +#xcrun stapler validate ./XojoFramework.framework +#rm -Rf ./XojoFramework.framework.zip +#cd ../../.. + +ep_codesign ./IDFVersionUpdater.app/Contents/Frameworks/Shell.dylib +ep_codesign ./IDFVersionUpdater.app/Contents/Frameworks/AppearancePakCocoa.dylib +ep_codesign ./IDFVersionUpdater.app/Contents/Frameworks/Crypto.dylib +ep_codesign ./IDFVersionUpdater.app/Contents/Frameworks/InternetEncodings.dylib +ep_codesign ./IDFVersionUpdater.app/Contents/Frameworks/Shell.dylib +ep_codesign ./IDFVersionUpdater.app/Contents/Frameworks/libGzip.dylib + +ep_codesign IDFVersionUpdater.app/Contents/MacOS/IDFVersionUpdater + +codesign -vvvv -s "Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" \ + --force --timestamp \ + --identifier "$IDENTIFIER" \ + --options runtime \ + $APP_NAME.app + +zip -r ./$APP_NAME.zip ./$APP_NAME.app +ep_notarize ./$APP_NAME.zip +xcrun stapler staple ./$APP_NAME.app + +xcrun stapler validate ./$APP_NAME.app +spctl -vvvv --assess ./$APP_NAME.app +rm -Rf ./$APP_NAME.zip diff --git a/cmake/CPackSignAndNotarizeDmg.cmake b/cmake/CPackSignAndNotarizeDmg.cmake new file mode 100644 index 00000000000..f8836f1387a --- /dev/null +++ b/cmake/CPackSignAndNotarizeDmg.cmake @@ -0,0 +1,48 @@ +#[=======================================================================[.rst: +CPackSignAndNotarizeDmg +----------------------- + +This file is meant to be used up as a ``CPACK_POST_BUILD_SCRIPTS`` + +It will run only on ``APPLE`` when the generator is ``IFW`` to codesign the resulting .dmg and notarize it. + +To do so, it uses the `CodeSigning`_ functions :cmake:command:`codesign_files_macos` + +It requires that this be set: :cmake:variable:`CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION` + +And it will only notarize if this is set: :cmake:variable:`CPACK_CODESIGNING_NOTARY_PROFILE_NAME` + +#]=======================================================================] +message(STATUS "The message from ${CMAKE_CURRENT_LIST_FILE} and generator ${CPACK_GENERATOR}") +message(STATUS "Built packages: ${CPACK_PACKAGE_FILES}") + +if(APPLE AND CPACK_GENERATOR STREQUAL "IFW") + + message("CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION=${CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION}") + message("CPACK_CODESIGNING_NOTARY_PROFILE_NAME=${CPACK_CODESIGNING_NOTARY_PROFILE_NAME}") + message("CPACK_IFW_PACKAGE_SIGNING_IDENTITY=${CPACK_IFW_PACKAGE_SIGNING_IDENTITY}") + + include(${CMAKE_CURRENT_LIST_DIR}/CodeSigning.cmake) + + if(NOT CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + message(FATAL_ERROR "CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION is required, this should not have happened") + endif() + codesign_files_macos( + FILES ${CPACK_PACKAGE_FILES} + SIGNING_IDENTITY ${CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION} + IDENTIFIER "org.nrel.EnergyPlus.DmgInstaller" + FORCE + VERBOSE + ) + + if(CPACK_CODESIGNING_NOTARY_PROFILE_NAME) + notarize_files_macos( + FILES ${CPACK_PACKAGE_FILES} + NOTARY_PROFILE_NAME ${CPACK_CODESIGNING_NOTARY_PROFILE_NAME} + STAPLE + VERIFY + VERBOSE + ) + endif() + +endif() diff --git a/cmake/CodeSigning.cmake b/cmake/CodeSigning.cmake new file mode 100644 index 00000000000..b1858db23c8 --- /dev/null +++ b/cmake/CodeSigning.cmake @@ -0,0 +1,387 @@ +#[=======================================================================[.rst: +CodeSigning +------------ + +This module defines functions to codesign, notarize and staple macOS files. + +.. cmake:command:: codesign_files_macos + + run ``codesign`` on the files:: + + codesign_files_macos( + SIGNING_IDENTITY + [FORCE] [VERBOSE] + [IDENTIFIER ] + [PREFIX ] + [OPTIONS ...] + FILES ... + ) + + + ``codesign_files_macos()`` will codesign the files + + The options are: + + ``SIGNING_IDENTITY identity`` + Required, this is something like ``Developer ID Application: ()`` + + ``FILES path...`` + The files to codesign + + ``VERBOSE`` + If specified, will append ``-vvvv`` and will print the commands used + + ``FORCE`` + If specified, will append ``--force`` + + ``OPTIONS options...`` + Specifies the options to pass to ``--options``. If not specified, uses ``--options runtime`` + + ``IDENTIFIER identifier`` + Passed as ``--identifier identifier``. + + ``PREFIX`` + What to pass to ``--prefix``. eg 'org.nrel.EnergyPlus.' with a **trailing dot**. Ignored if ``IDENTIFIER`` is passed + + +.. cmake:command:: notarize_files_macos + + Runs ``notarytool``, ``staple`` on the files:: + + notarize_files_macos( + NOTARY_PROFILE_NAME + [VERBOSE] + [STAPLE] + [VERIFY] + FILES ... + ) + + + The options are: + + ``NOTARY_PROFILE_NAME`` + Required, should be set to the name you used during ``xcrun notarytool store-credentials`` + + ``FILES path...`` + The files to notarize + + ``VERBOSE`` + If specified, will print the commands used + + ``STAPLE`` + If specified, will run ``stappler`` after the notarytool submission + + ``VERIFY`` + If specified, will run ``spctl --assess`` to validate proper notarization + +.. cmake:command:: setup_macos_codesigning_variables + + Defines CMake Configure options:: + + setup_macos_codesigning_variables() + + The resulting configure options are: + + * :cmake:variable:`CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION` + + Pre-populated options from ``security-find-identity -v -p codesign``. + This should be a valid "Developer ID Application" + + If set to non-empty, will also: + + * set ``CPACK_IFW_PACKAGE_SIGNING_IDENTITY`` to the same value, so binarycreator signs the .app installer created + * define another ``CPACK_CODESIGNING_NOTARY_PROFILE_NAME`` option + + * :cmake:variable:`CPACK_CODESIGNING_NOTARY_PROFILE_NAME` + + Authenticate using credentials stored in the Keychain by notarytool. + Use the profile name that you previously provided via the ``xcrun notarytool store-credentials`` command + + +.. cmake:command:: register_install_codesign_target + + Given a target and a relative install path, + this will register an ``install(CODE)`` command to codesign the executable or library:: + + register_install_codesign_target( + + ) + + + It is necessary to have issued an ``install(TARGET DESTINATION )`` command before calling this function, + and done any call to ``fixup_executable`` or ``install_name_tool`` that would invalidate the signature. + + This function will therefore run in the CPack staging area, after any rpath adjustments, and ensure the signature sticks. + + It will only do something on ``APPLE`` and if :cmake:variable:`CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION` is defined. + + It requires ``CMP0087`` to be set to ``NEW``. + + Internally, it requires this very file and calls ``codesign_files_macos`` on the target file. + + The required parameters are: + + ``TARGET_NAME`` + A valid target added via ``add_executable``/``add_library`` + Required, should be set to the name you used during ``xcrun notarytool store-credentials`` + + ``DESTINATION`` + The destination for the installed target (eg: ``"."`` or ``lib/``) +#]=======================================================================] + +function(print_cmd_if_verbose cmd VERBOSE) + if(VERBOSE) + list(JOIN cmd "\" \"" cmd_str) + message("\"${cmd_str}\"") + endif() +endfunction() + +#------------------------------------------------------------------------------ +function(codesign_files_macos) + set(prefix "") + set(valueLessKeywords FORCE VERBOSE) + set(singleValueKeywords SIGNING_IDENTITY IDENTIFIER PREFIX) + set(multiValueKeywords FILES OPTIONS) + cmake_parse_arguments( + PARSE_ARGV 0 # Start at one with NAME is the first param + "${prefix}" + "${valueLessKeywords}" + "${singleValueKeywords}" + "${multiValueKeywords}" + ) + + if (_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Extra unknown arguments were passed: ${_UNPARSED_ARGUMENTS}") + endif() + if (_KEYWORDS_MISSING_VALUES) + message(FATAL_ERROR "Keywords missing values: ${_KEYWORDS_MISSING_VALUES}") + endif() + + if(NOT _OPTIONS) + set(options_str runtime) + else() + list(JOIN _OPTIONS "," options_str) + endif() + + if(NOT _FILES) + message(FATAL_ERROR "Cannot sign without FILES passed") + endif() + + find_program(CODESIGN NAMES codesign) + if(NOT CODESIGN) + message(FATAL_ERROR "Cannot sign, could not find 'codesign' executable") + endif() + + set(cmd "${CODESIGN}") + if(_VERBOSE) + list(APPEND cmd -vvvv) + endif() + + if(NOT _SIGNING_IDENTITY) + message(FATAL_ERROR "Cannot sign without a SIGNING_IDENTITY passed in") + endif() + list(APPEND cmd --sign "${_SIGNING_IDENTITY}") + + if(_FORCE) + list(APPEND cmd --force) + endif() + + list(APPEND cmd --timestamp) + list(APPEND cmd --options "${options_str}") + + if(_IDENTIFIER) + list(APPEND cmd "--identifier" "${_IDENTIFIER}") + elseif(_PREFIX) + list(APPEND cmd "--prefix" "${_PREFIX}") + endif() + + foreach(path ${_FILES}) + print_cmd_if_verbose("${cmd};${path}" _VERBOSE) + + if (NOT EXISTS "${path}") + message(FATAL_ERROR "Can't sign ${path}, no file exists at that path.") + endif () + + execute_process(COMMAND ${cmd} "${path}" RESULT_VARIABLE res) + if (NOT res EQUAL 0) + message(FATAL_ERROR "Can't sign ${path}, command '${cmd}' failed") + endif () + endforeach() + +endfunction() +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +function(notarize_files_macos) + set(prefix "") + set(valueLessKeywords VERBOSE STAPLE VERIFY) + set(singleValueKeywords NOTARY_PROFILE_NAME) + set(multiValueKeywords FILES) + cmake_parse_arguments( + PARSE_ARGV 0 # Start at one with NAME is the first param + "${prefix}" + "${valueLessKeywords}" + "${singleValueKeywords}" + "${multiValueKeywords}" + ) + + if (_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Extra unknown arguments were passed: ${_UNPARSED_ARGUMENTS}") + endif() + if (_KEYWORDS_MISSING_VALUES) + message(FATAL_ERROR "Keywords missing values: ${_KEYWORDS_MISSING_VALUES}") + endif() + + if(NOT _NOTARY_PROFILE_NAME) + message(FATAL_ERROR "Cannot notarize without NOTARY_PROFILE_NAME passed, should be set to the name you used during `xcrun notarytool store-credentials`") + endif() + + if(NOT _FILES) + message(FATAL_ERROR "Cannot notarize without FILES passed") + endif() + + find_program(XCRUN NAMES xcrun) + if (NOT XCRUN) + message(FATAL_ERROR "Cannot notarize, could not find 'xcrun' executable") + endif () + + set(cmd "${XCRUN}" notarytool submit --keychain-profile ${_NOTARY_PROFILE_NAME} --wait) + list(JOIN cmd " " cmd_str) + + foreach(path ${_FILES}) + message(STATUS "notarytool: submitting ${path}") + print_cmd_if_verbose("${cmd};${path}" _VERBOSE) + + if (NOT EXISTS "${path}") + message(FATAL_ERROR "Can't notarize ${path}, no file exists at that path.") + endif () + + execute_process( + COMMAND ${cmd} "${path}" + RESULT_VARIABLE res + OUTPUT_VARIABLE out + ECHO_OUTPUT_VARIABLE + ) + string(REGEX MATCH "([0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+-[0-9a-z]+)" SUBMISSION_ID ${out}) + set(cmd_get_log "${XCRUN}" notarytool log --keychain-profile ${_NOTARY_PROFILE_NAME} ${SUBMISSION_ID}) + + if (_VERBOSE OR NOT res EQUAL 0) + message(STATUS "notarytool: retrieving the log") + print_cmd_if_verbose("${cmd_get_log}" _VERBOSE) + execute_process( + COMMAND ${cmd_get_log} + ) + endif() + + if (NOT res EQUAL 0) + message(FATAL_ERROR "Can't notarize ${path}, command '${cmd}' failed, perhaps try `${cmd_get_log_str}`") + endif() + + + if(_STAPLE) + set(cmd xcrun stapler staple "${path}") + message(STATUS "stapler: stappling ${path}") + print_cmd_if_verbose("${cmd}" _VERBOSE) + execute_process( + COMMAND ${cmd} + RESULT_VARIABLE res + ) + if (NOT res EQUAL 0) + message(FATAL_ERROR "Can't stapple ${path}, command '${cmd}' failed (${res})") + endif () + endif() + + if(_VERIFY) + message(STATUS "Verifying that .dmg is properly notarized") + get_filename_component(ext ${path} LAST_EXT) + if (ext STREQUAL ".dmg") + set(cmd spctl --assess --type open --context context:primary-signature -vvvv "${path}") + else() + set(cmd spctl --assess -vvvv "${path}") + endif() + print_cmd_if_verbose("${cmd}" _VERBOSE) + execute_process( + COMMAND ${cmd} + RESULT_VARIABLE res + ) + if (NOT res EQUAL 0) + message(FATAL_ERROR "Notarization failed for ${path}, command '${cmd}' failed (${res})") + endif() + endif() + + endforeach() +endfunction() +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +function(setup_macos_codesigning_variables) + # prefix with CPACK_ so it's properly passed to the POST_BUILD_SCRIPTS + set(CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION "${CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION}" CACHE STRING "code signing identity (e.g., \"Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)\") (required for code signing)") + + # Get list of valid codesigning identities from system. + execute_process(COMMAND security find-identity -v -p codesigning + RESULT_VARIABLE res + OUTPUT_VARIABLE lines + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if (CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + list(APPEND idents "${CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION}") + endif () + if (res EQUAL 0 AND lines) + # Split string into list of lines. + string(REGEX REPLACE ";" "\\\\;" lines "${lines}") + string(REGEX REPLACE "\n" ";" lines "${lines}") + # Parse signing cert identity from each line + foreach(line ${lines}) + # eg: 4) C5CE92B14361BF09E55990573DF07FC33B083D22 "Developer ID Application: National Renewable Energy Laboratory (K7JYVQJL7R)" + if (line MATCHES "[0-9]+\\)[ \t]+[0-9a-fA-F]+[ \t]+\"(.+ \\([^ \t]+\\))\"") + list(APPEND idents "${CMAKE_MATCH_1}") + endif () + endforeach() + endif() + # Populate drop-down box in cmake-gui with the list of valid codesigning identities. + set_property(CACHE CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION PROPERTY STRINGS "${idents}") + + if(CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + set(CPACK_IFW_PACKAGE_SIGNING_IDENTITY ${CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION} CACHE STRING "set from CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION" FORCE) + mark_as_advanced(CPACK_IFW_PACKAGE_SIGNING_IDENTITY) + + set(CPACK_CODESIGNING_NOTARY_PROFILE_NAME "" CACHE STRING "Authenticate using credentials stored in the Keychain by notarytool. Use the profile name that you previously provided via the store-credentials command") + + if(NOT CPACK_CODESIGNING_NOTARY_PROFILE_NAME) + message(AUTHOR_WARNING "Cannot notarize without CPACK_CODESIGNING_NOTARY_PROFILE_NAME defined, should be set to the name you used during `xcrun notarytool store-credentials`") + endif() + endif() +endfunction() +#------------------------------------------------------------------------------ + +function(register_install_codesign_target TARGET_NAME DESTINATION) + + if(NOT TARGET ${TARGET_NAME}) + message("${TARGET_NAME} is not a valid target") + return() + endif() + + if(NOT APPLE) + message("Not Apple") + return() + endif() + + if(NOT CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + message("Missing CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION") + return() + endif() + + install( + CODE " + include(\"${CMAKE_CURRENT_FUNCTION_LIST_FILE}\") + codesign_files_macos( + FILES \"\${CMAKE_INSTALL_PREFIX}/${DESTINATION}/$\" + SIGNING_IDENTITY \"${CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION}\" + IDENTIFIER \"org.nrel.EnergyPlus.${TARGET_NAME}\" + FORCE VERBOSE + ) + ") + +endfunction() diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 2fd731286a5..e63f1659f52 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -596,10 +596,6 @@ elseif(UNIX) install(FILES "${PROJECT_SOURCE_DIR}/doc/man/energyplus.1" DESTINATION "./" COMPONENT Symlinks) endif() -# TODO: Unused now -configure_file("${PROJECT_SOURCE_DIR}/cmake/CMakeCPackOptions.cmake.in" "${PROJECT_BINARY_DIR}/CMakeCPackOptions.cmake" @ONLY) -set(CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CMakeCPackOptions.cmake") - ########################################################## D O C U M E N T A T I O N ############################################################# if(BUILD_DOCS) @@ -692,6 +688,48 @@ if(WIN32 AND NOT UNIX) endif() endif() +if(APPLE) + + include(${CMAKE_CURRENT_LIST_DIR}/CodeSigning.cmake) + + # Defines CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION and CPACK_CODESIGNING_NOTARY_PROFILE_NAME + setup_macos_codesigning_variables() + + if(CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + set(FILES_TO_SIGN + # Targets are signed already via register_install_codesign_target + #$ + #$ + #$ + + # Bash scripts, not sure if needed or not + "runenergyplus" + "runepmacro" + "runreadvars" + # Copied-verbatim apps: Already signed because just copied from bin to package + # "EPMacro" + # "PreProcess/EP-Launch-Lite.app" + # "PreProcess/IDFVersionUpdater/IDFVersionUpdater.app" + # "PostProcess/EP-Compare/EP-Compare.app" + ) + + # Codesign inner binaries and libraries, in the CPack staging area for the EnergyPlus project, component Unspecified + # Define some required variables for the script in the scope of the install(SCRIPT) first + install(CODE "set(CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION \"${CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION}\")" COMPONENT Unspecified) + install(CODE "set(FILES_TO_SIGN \"${FILES_TO_SIGN}\")" COMPONENT Unspecified) + # call the script + install(SCRIPT "${CMAKE_CURRENT_LIST_DIR}/install_codesign_script.cmake" COMPONENT Unspecified) + + # Register the CPACK_POST_BUILD_SCRIPTS + set(CPACK_POST_BUILD_SCRIPTS "${CMAKE_CURRENT_LIST_DIR}/CPackSignAndNotarizeDmg.cmake") + + endif() +endif() + +# TODO: Unused now +configure_file("${PROJECT_SOURCE_DIR}/cmake/CMakeCPackOptions.cmake.in" "${PROJECT_BINARY_DIR}/CMakeCPackOptions.cmake" @ONLY) +set(CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CMakeCPackOptions.cmake") + ###################################################################################################################################################### # P A C K A G I N G & C O M P O N E N T S # ###################################################################################################################################################### diff --git a/cmake/codesign_doc/.gitignore b/cmake/codesign_doc/.gitignore new file mode 100644 index 00000000000..89f9ac04aac --- /dev/null +++ b/cmake/codesign_doc/.gitignore @@ -0,0 +1 @@ +out/ diff --git a/cmake/codesign_doc/build_codesign_doc.sh b/cmake/codesign_doc/build_codesign_doc.sh new file mode 100755 index 00000000000..5d81a8ca14d --- /dev/null +++ b/cmake/codesign_doc/build_codesign_doc.sh @@ -0,0 +1,3 @@ +pip install -r requirements.txt +sphinx-build -M html $(pwd) out +sphinx-build -b pdf $(pwd) out diff --git a/cmake/codesign_doc/conf.py b/cmake/codesign_doc/conf.py new file mode 100644 index 00000000000..0c8c9e910d0 --- /dev/null +++ b/cmake/codesign_doc/conf.py @@ -0,0 +1,201 @@ +#!/usr/bin/env python3 +# EnergyPlus, Copyright (c) 1996-2024, The Board of Trustees of the University +# of Illinois, The Regents of the University of California, through Lawrence +# Berkeley National Laboratory (subject to receipt of any required approvals +# from the U.S. Dept. of Energy), Oak Ridge National Laboratory, managed by UT- +# Battelle, Alliance for Sustainable Energy, LLC, and other contributors. All +# rights reserved. +# +# NOTICE: This Software was developed under funding from the U.S. Department of +# Energy and the U.S. Government consequently retains certain rights. As such, +# the U.S. Government has been granted for itself and others acting on its +# behalf a paid-up, nonexclusive, irrevocable, worldwide license in the +# Software to reproduce, distribute copies to the public, prepare derivative +# works, and perform publicly and display publicly, and to permit others to do +# so. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# (1) Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# (2) Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# (3) Neither the name of the University of California, Lawrence Berkeley +# National Laboratory, the University of Illinois, U.S. Dept. of Energy nor +# the names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in +# stand-alone form without changes from the version obtained under this +# License, or (ii) Licensee makes a reference solely to the software +# portion of its product, Licensee must refer to the software as +# "EnergyPlus version X" software, where "X" is the version number Licensee +# obtained under this License and may not use a different name for the +# software. Except as specifically required in this Section (4), Licensee +# shall not use in a company name, a product name, in advertising, +# publicity, or other promotional activities any name, trade name, +# trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or +# confusingly similar designation, without the U.S. Department of Energy's +# prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# 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 +# from pathlib import Path +# sys.path.insert(0, str(Path(__file__).parent.parent)) +from sphinx.builders.html import StandaloneHTMLBuilder +import subprocess + + +source_suffix = '.rst' +# Doxygen +# subprocess.call('doxygen Doxyfile', shell=True) + +# -- Project information ----------------------------------------------------- + +project = 'EnergyPlus' +author = 'Julien Marrec' +copyright = 'Julien Marrec' +version = '1.0.0' # feature version +release = '1.0.0' # full version string + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.autosectionlabel', + 'sphinx.ext.todo', + 'sphinx.ext.coverage', + 'sphinx.ext.mathjax', + 'sphinx.ext.ifconfig', + 'sphinx.ext.viewcode', + #'sphinx_sitemap', + 'sphinx.ext.inheritance_diagram', + 'sphinxcontrib.moderncmakedomain', + 'rst2pdf.pdfbuilder', +] +pdf_documents = [('index', u'cmake-modules-eplus', u'EnergyPlus CMake Custom Modules doc', u'Julien Marrec'),] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['@conf_path@/templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +highlight_language = 'c++' + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' +html_theme_options = { + 'canonical_url': '', + 'analytics_id': '', # Provided by Google in your dashboard + 'display_version': True, + 'prev_next_buttons_location': 'bottom', + 'style_external_links': True, + + 'logo_only': False, + + # Toc options + 'collapse_navigation': True, + 'sticky_navigation': True, + 'navigation_depth': -1, + 'includehidden': True, + 'titles_only': False +} +# html_logo = '' +# github_url = '' +html_baseurl = '' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +# html_static_path = ['@conf_path@/static'] +# html_style = 'css/cmake.css' +# +# html_js_files = [ +# 'js/version_switcher.js', +# ] + +############################ +# SETUP THE RTD LOWER-LEFT # +############################ +try: + html_context +except NameError: + html_context = dict() +html_context['display_lower_left'] = True + +if 'REPO_NAME' in os.environ: + REPO_NAME = os.environ['REPO_NAME'] +else: + REPO_NAME = '' + +# SET CURRENT_LANGUAGE +if 'current_language' in os.environ: + # get the current_language env var set by buildDocs.sh + current_language = os.environ['current_language'] +else: + # the user is probably doing `make html` + # set this build's current language to english + current_language = 'en' + +# tell the theme which language to we're currently building +html_context['current_language'] = current_language + +# SET CURRENT_VERSION +from git import Repo +repo = Repo( search_parent_directories=True ) + +if 'current_version' in os.environ: + # get the current_version env var set by buildDocs.sh + current_version = os.environ['current_version'] +elif 'CI_COMMIT_REF_NAME' in os.environ: + # get the current_version env var set by buildDocs.sh + current_version = os.environ['CI_COMMIT_REF_NAME'] +else: + # the user is probably doing `make html` + # set this build's current version by looking at the branch + current_version = repo.active_branch.name + +# tell the theme which version we're currently on ('current_version' affects +# the lower-left rtd menu and 'version' affects the logo-area version) +html_context['current_version'] = current_version +html_context['version'] = current_version diff --git a/cmake/codesign_doc/index.rst b/cmake/codesign_doc/index.rst new file mode 100644 index 00000000000..3bd3e5edd48 --- /dev/null +++ b/cmake/codesign_doc/index.rst @@ -0,0 +1,39 @@ +CMake Custom Codesigning Modules documentation +========================================================= + +.. only:: html + + .. contents:: Table of Contents + +Influencial Configuration Variables +************************************* + +Influencial configuration variables on macOS + +.. cmake:variable:: CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION + + This is something like ``Developer ID Application: ()``. + Refer to :cmake:command:`setup_macos_codesigning_variables` which pre-populates it with options from ``security-find-identity -v -p codesign`` + + This will automatically set `CPACK_IFW_PACKAGE_SIGNING_IDENTITY `_ to the same value, so that ``binarycreator`` signs the .app installer it builds as well + +.. cmake:variable:: CPACK_CODESIGNING_NOTARY_PROFILE_NAME + + Should be set to the name you used during ``xcrun notarytool store-credentials`` + +------- + +Codesigning Modules +******************* +.. cmake-module:: ../CodeSigning.cmake + +------- + +Codesigning Scripts +******************* + +.. cmake-module:: ../CPackSignAndNotarizeDmg.cmake + +------- + +.. cmake-module:: ../install_codesign_script.cmake diff --git a/cmake/codesign_doc/requirements.txt b/cmake/codesign_doc/requirements.txt new file mode 100644 index 00000000000..3f06d996ec0 --- /dev/null +++ b/cmake/codesign_doc/requirements.txt @@ -0,0 +1,5 @@ +GitPython==3.1.43 +rst2pdf==0.102 +sphinx-rtd-theme==2.0.0 +sphinx-sitemap==2.6.0 +sphinxcontrib-moderncmakedomain==3.29.0 diff --git a/cmake/install_codesign_script.cmake b/cmake/install_codesign_script.cmake new file mode 100644 index 00000000000..78a671a90f4 --- /dev/null +++ b/cmake/install_codesign_script.cmake @@ -0,0 +1,130 @@ +#[=======================================================================[.rst: +install_codesign_script +----------------------- + +This file is meant to be used up as a ``install(SCRIPT)`` + +Pre-conditions: + +- It requires that you're running on ``APPLE`` + +- **Important: In the scope of this** ``install(SCRIPT)``, you must define + + * :cmake:variable:`CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION` + * You need to also set a variable ``FILES_TO_SIGN`` + +**In the scope** meaning that you have to issue some ``install(CODE ..)`` commands prior to calling it, and they must be: + + * Part of the same ``project()`` + * Using the same CPack ``COMPONENT`` + +This script will codesign the ``FILES_TO_SIGN``, as well as the globbed copied Python .so and the root dylibs (such as ``libintl8.dylib``) + +* ``python_standard_lib/lib-dynload/*.so`` +* ``lib*.dylib`` + +To do so, it uses the `CodeSigning`_ functions :cmake:command:`codesign_files_macos` + +This script will therefore run in the CPack staging area, and should be added after installation of the Python sos and root dylib, +after any rpath adjustments, to ensure the signature sticks. + +Usage:: + + if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + set(FILES_TO_SIGN "fileA" "fileB") + install(CODE "set(CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION \"${CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION}\")" COMPONENT Unspecified) + install(CODE "set(FILES_TO_SIGN \"${FILES_TO_SIGN}\")" COMPONENT Unspecified) + # call the script + install(SCRIPT "${CMAKE_CURRENT_LIST_DIR}/install_codesign_script.cmake" COMPONENT Unspecified) + endif() +#]=======================================================================] + +#------------------------------------------------------------------------------ +# Just a helper +function(print_relative_paths) + set(prefix "") + set(valueLessKeywords NAME_ONLY NEWLINE) + set(singleValueKeywords PREFIX BASE_DIRECTORY) + set(multiValueKeywords ABSOLUTE_PATHS) + cmake_parse_arguments( + PARSE_ARGV 0 # Start at one with NAME is the first param + "${prefix}" + "${valueLessKeywords}" + "${singleValueKeywords}" + "${multiValueKeywords}" + ) + + if (_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Extra unknown arguments were passed: ${_UNPARSED_ARGUMENTS}") + endif() + if (_KEYWORDS_MISSING_VALUES) + message(FATAL_ERROR "Keywords missing values: ${_KEYWORDS_MISSING_VALUES}") + endif() + + if(NOT _BASE_DIRECTORY) + set(_BASE_DIRECTORY ${CMAKE_INSTALL_PREFIX}) + endif() + + foreach(path ${_ABSOLUTE_PATHS}) + if(_NAME_ONLY) + cmake_path(GET path FILENAME rel_path) + else() + cmake_path(RELATIVE_PATH path BASE_DIRECTORY ${_BASE_DIRECTORY} OUTPUT_VARIABLE rel_path) + endif() + list(APPEND rel_paths ${rel_path}) + endforeach() + + if(_NEWLINE) + message("${_PREFIX}") + foreach(path ${rel_paths}) + message(" - ${path}") + endforeach() + else() + message("${_PREFIX}${rel_paths}") + endif() +endfunction() +#------------------------------------------------------------------------------ + +message("Codesigning inner executables and library from ${CMAKE_CURRENT_LIST_FILE}") + +message("CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}") +message("CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION=${CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION}") + +if(NOT CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + message(FATAL_ERROR "CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION is required") +endif() + +if(NOT FILES_TO_SIGN) + message(FATAL_ERROR "FILES_TO_SIGN is required") +endif() + +foreach(path ${FILES_TO_SIGN}) + list(APPEND FULL_PATHS "${CMAKE_INSTALL_PREFIX}/${path}") +endforeach() + +file(GLOB _all_root_dylibs "${CMAKE_INSTALL_PREFIX}/lib*.dylib") +foreach(path ${_all_root_dylibs}) + message("${path}") + if(NOT IS_SYMLINK ${path}) + list(FIND FULL_PATHS ${path} _found) + if(_found EQUAL -1) + list(APPEND ROOT_DYLIBS ${path}) + endif() + endif() +endforeach() + +file(GLOB PYTHON_SOS "${CMAKE_INSTALL_PREFIX}/python_standard_lib/lib-dynload/*.so") + +print_relative_paths(PREFIX "FULL_PATHS=" ABSOLUTE_PATHS ${FULL_PATHS}) +print_relative_paths(PREFIX "ROOT_DYLIBS=" ABSOLUTE_PATHS ${ROOT_DYLIBS}) +print_relative_paths(PREFIX "PYTHON_SOS, in ${CMAKE_INSTALL_PREFIX}/python_standard_lib/lib-dynload/=" ABSOLUTE_PATHS ${PYTHON_SOS} NAME_ONLY) + +include(${CMAKE_CURRENT_LIST_DIR}/CodeSigning.cmake) +codesign_files_macos( + FILES ${FULL_PATHS} ${ROOT_DYLIBS} ${PYTHON_SOS} + SIGNING_IDENTITY ${CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION} + PREFIX "org.nrel.EnergyPlus." + FORCE VERBOSE +) + +message("Finished Codesigning inner executables and library") diff --git a/design/FY2024/DuctLoss.PNG b/design/FY2024/DuctLoss.PNG new file mode 100644 index 00000000000..ec4fabf3f2c Binary files /dev/null and b/design/FY2024/DuctLoss.PNG differ diff --git a/design/FY2024/DuctModelRoadMap.md b/design/FY2024/DuctModelRoadMap.md new file mode 100644 index 00000000000..a87e5d07e7c --- /dev/null +++ b/design/FY2024/DuctModelRoadMap.md @@ -0,0 +1,997 @@ +Duct model road map +================ + +** Lixing Gu ** + +** Florida Solar Energy Center** + + - 5th draft, 3/6/24 + + After a technicalities call on 3/6/24 + + - 4th draft, 2/22/24 + + After a conference call with Scott on 2/22/24 + + - Third draft, 2/15/24 + + After Technicalities on 2/7/24 + + - Second draft, 2/7/24 + + After Technicalities on 2/7/24 + + - Original draft, 1/20/24 + +## Background ## + +The AFN model is able to simulate duct conduction and leakage losses. The driving force is the pressure difference. NREL wants duct model can be performed wihtout using the AFN model. In other words, duct losses can be simulated without any pressure calculation and under AirLoopHVAC configurations. The following required may be met: + +1. The proposed new objects may be compatible with the AFN objects. In other words, no duplication is required. +2. The new model should be able to simulate duct conduction and leakage losses. + +Since the process is very complicated, a roadmap is needed to provide dicrection how to implement the new feature. It may involve changes of existing AFN objects. + +## E-mail and Conference Call Conclusions ## + +### E-mail communication with Mike ### + +The most important restriction is that any proposed new objects or existing objects have to be used in the AFN model for the roadmap. + +I'm not sure I understand. I thought the goal here was a simplified model that didn't require AFN. +Mike + +On 2/6/2024 2:08 PM, gu@fsec.ucf.edu wrote: +Mike: + +Thanks for your comments. Let me explain what I need to define duct objects to calculate conduction loss and leakage first. Here are requirements. + +1. Air node + +Some nodes are needed to be redefined, in addition to air node defined in AirLoopHAVC. For example, the inlet node of a zone splitter is the same node of AirloopHVAC demand outlet node. In order to build a duct, I need to make two separate nodes, instead of one. + +2. Duct as a linkage + +A linkage is needed to use two air nodes to represent a duct for conduction loss calculation. + +3. Leak as a linkage + +A zone and an air node have to used to represent a supply or return leak + +4. Make up air as a linkage + +Due to unbalanced supply and return leaks, additional flows between outdoor and a zone, and between two zones have to be defined based on a leakage + +5. Duct component + +Duct geometry and materials are needed for conduction loss calculation + +6. Leakage component + +The fraction flow is needed to represent leakage + +The most important restriction is that any proposed new objects or existing objects have to be used in the AFN model for the roadmap. + +Therefore, I propose to use existing the AFN objects. An alternative choice is that the AFN objects may be renames by removing “AirflowNetwork” for general purpose. For example, AirflowNetwork:Distribution:Node can be replaced by Distribution:Node. + +Therefore, expansion of ZoneHVAC:AirDistributionUnit may not be enough to cover what I need. The object may not be used in the AFN model. + +Thanks. + +Gu + +From: Michael J. Witte +Sent: Tuesday, February 6, 2024 12:49 PM +To: Lixing Gu ; 'Lee, Edwin' ; 'Horowitz, Scott' ; 'Winkler, Jon' ; 'DeGraw, Jason' ; 'Neal Kruis' ; rraustad@fsec.ucf.edu +Subject: Re: Roadmap for comments + +Gu, + +Did you consider extending the leakage options in ZoneHVAC:AirDistributionUnit instead of using the AFN objects? + +ZoneHVAC:AirDistributionUnit, + + N1 , \field Nominal Upstream Leakage Fraction + \note fraction at system design Flow; leakage Flow constant, leakage fraction + \note varies with variable system Flow Rate. + N2 , \field Constant Downstream Leakage Fraction + +Mike + +### Discussion in the technicalities on 2/7/24 ### + +The roadmap was discussed in the Technicalities on 2/7/24. Here are comments and my reply after my name. + +Scott: Temperature control at the exterior boundary conditions + +Gu: I am going to add 3 more fields at the end of Duct:Loss: + +\field Environment Type +\field Ambient Temperature Zone Name +\field Ambient Temperature Schedule Name + + +Mike: Heat dump from condution and leakaga to the zone? + +Scott: Use regain factor + +Gu: Any energy loss or gain from conduction and leakage will be added as zone loads. The detailed implementation will be addressed in the design document + +Jason DeGraw: Not undesrand fully and will need time to provide comments later. + +Gu: Will make offline contact + +Scott: Solve option in the AirflowNetwork:SimulationControl may be controversial, so that the AirflowNetwork:SimulationControl object may not be used. + +Jason: Agree. + +Brett: It is odd to use AirflowNetwork:SimulationControl for non AFN simplified duct model. + +Gu: I agree not to use AirflowNetwork:SimulationControl to trigger the simplified duct model. Instead, a new proposed object of Duct:Loss will be used. + +The trigger option using AirflowNetwork:SimulationControl in the Roadmap will be removed. + +### Discussion in the conference call on 2/15/24 ### + +A group of team members attanded the conference call for further discussion: Mike, Jason, Edwin and Gu. Scott missed the call and will get a chance to review the thrid draft. + +#### General agreement #### + +The group is OK with the proposed inputs. + +#### Undecided items #### + +The group have different opinions for the new object of Duct:Lose + +1. Keep a single object as Duct:Loss and A4 field with 3 choice as Conduction, Leakage and MakeupAir +2. Use 3 new objects wihtout A4 field + +The detailed approaches are provided below. + +#### Suggestion #### + +When the makeup air is introduced, it is better to investigate the ZoneAirMassFlowConservation to see possible connection. + +Gu: There are two types of makeup air. The first type is that the makeup aie flows from outdoor to a zone, equivalent to Infiltration. The second type is that the makeup air flows from a zone to another zone, equivalent to Mixing object. It is possible to assign makeup air into Infiltration and Mixing airflows and call ZoneAirMassFlowConservation to perform mass conservation. + +### Discussion in the conference call on 2/22/24 ### + +Scott and Gu attended the conference call. + +#### New objects #### + +Scott prefer to use 3 new objects to represent conduction, leakage and makeup air, respectively. + +#### Supply leak calculation #### + +Scott also agrees to calculate equivalent temperature and humidity ratio after supply leak without chancge the mass flow rate of Airloop mass flow rate. + +#### Have a concern #### + +Although Scott accepts the proposed new and existing objects, he would like to reserve his opinion: no AFN names for none AFN approach. + +Gu's response: In order to keep the roadmap moving, the existing AFN objects will be used. + +### Discussion in the technicalities call on 3/6/24 ### + +The design document was presented in the call. + +Mike asked a question why added duct loss is restricted to a system. The general is preferred. + +Gu's reply: + +There is a function to calculate zone sensible and latent outputs as CalcZoneSensibleLatentOutput in the GeneralRoutines module. + + void CalcZoneSensibleLatentOutput(Real64 const MassFlow, // air mass flow rate, {kg/s} + Real64 const TDBEquip, // dry-bulb temperature at equipment outlet {C} + Real64 const WEquip, // humidity ratio at equipment outlet + Real64 const TDBZone, // dry-bulb temperature at zone air node {C} + Real64 const WZone, // humidity ratio at zone air node + Real64 &SensibleOutput, // sensible output rate (state 2 -> State 1), {W} + Real64 &LatentOutput, // latent output rate (state 2 -> State 1), {W} + Real64 &TotalOutput // total = sensible + latent putput rate (state 2 -> State 1), {W} + ) + { + + // Purpose: + // returns total, sensible and latent heat rate of transfer between the supply air zone inlet + // node and zone air node. The moist air energy transfer can be cooling or heating depending + // on the supply air zone inlet node and zone air node conditions. + + // Methodology: + // Q_total = m_dot * (hEquip - hZone) + // Q_sensible = m_dot * Psychrometrics::PsyDeltaHSenFnTdbEquipTdbWZone(TDBEquip, TDBZone, WZone); + // or Q_sensible = m_dot * cp_moistair_zoneHumRat * (TDBEquip - TDBZone) + // cp_moistair_zoneHumRat = Psychrometrics::PsyCpAirFnW(WZone); + // Q_latent = Q_total - Q_latent; + + TotalOutput = 0.0; + LatentOutput = 0.0; + SensibleOutput = 0.0; + if (MassFlow > 0.0) { + TotalOutput = MassFlow * (Psychrometrics::PsyHFnTdbW(TDBEquip, WEquip) - + Psychrometrics::PsyHFnTdbW(TDBZone, WZone)); // total addition/removal rate, {W}; + SensibleOutput = MassFlow * Psychrometrics::PsyDeltaHSenFnTdb2Tdb1W(TDBEquip, TDBZone, WZone); // sensible addition/removal rate, {W}; + LatentOutput = TotalOutput - SensibleOutput; // latent addition/removal rate, {W} + } + } + +There are several modules to call this function: Furnace, HVACMultispeedHeatPump, HVACStandAloneERV, and UnitarySystem. + +Here is an example function to call CalcZoneSensibleLatentOutput in UnitarySystem: + + void UnitarySys::calculateCapacity(EnergyPlusData &state, Real64 &SensOutput, Real64 &LatOutput) + { + + // Check delta T (outlet to reference temp), IF positive use reference HumRat ELSE outlet humrat to calculate + // sensible capacity as MdotDeltaH at constant humidity ratio + int OutletNode = this->AirOutNode; + Real64 AirMassFlow = state.dataLoopNodes->Node(OutletNode).MassFlowRate; + Real64 RefTemp = 0.0; + Real64 RefHumRat = 0.0; + if (this->m_ControlType == UnitarySysCtrlType::Setpoint) { + RefTemp = state.dataLoopNodes->Node(this->AirInNode).Temp; + RefHumRat = state.dataLoopNodes->Node(this->AirInNode).HumRat; + } else { + RefTemp = state.dataLoopNodes->Node(this->NodeNumOfControlledZone).Temp; + RefHumRat = state.dataLoopNodes->Node(this->NodeNumOfControlledZone).HumRat; + } + Real64 SensibleOutput(0.0); // sensible output rate, {W} + Real64 LatentOutput(0.0); // latent output rate, {W} + Real64 TotalOutput(0.0); // total output rate, {W} + // calculate sensible load met + if (this->ATMixerExists) { + ..... + } else { + // Calculate sensible load met + CalcZoneSensibleLatentOutput(AirMassFlow, + state.dataLoopNodes->Node(OutletNode).Temp, + state.dataLoopNodes->Node(OutletNode).HumRat, + RefTemp, + RefHumRat, + SensibleOutput, + LatentOutput, + TotalOutput); + SensOutput = SensibleOutput - this->m_SenLoadLoss; + if (this->m_Humidistat) { + LatOutput = LatentOutput - this->m_LatLoadLoss; + } else { + LatOutput = 0.0; + } + } + this->m_SensibleLoadMet = SensOutput; + this->m_LatentLoadMet = LatOutput; + } + +The sensible and latent zone loads are claculated based on system outlet node (this->AirOutNode) and zone node, instead of zone supply inlet node. The assumtion is that air conditions at both zone supply inlet node and system outlet node are the same. It misses any possible losses between both nodes. The proposed new feature will add any possible losses between both nodes. + +It is recommended that possible refactor for any systems should use zone supply inlet condition, instead of system outlet condition. + +## Roadmap ## + +The roadmap presents my view to implement simplified duct model without using the AFN model. The proposed new feature should meet the above requirements and include three new objects and possible modifications of existing objects. The present document addresses the possible inputs and partial design document so far. + +Any more design document will be followed. + +The following figure represents proposed duct configuration. + +![duct model](DuctLoss.PNG) + +Note: Any air movement from a zone to outdoors is not presented in the figure, becuase exfiltration is not a part of zone energy balance. + +### General inputs ### + +This section presents inputs used in both losses of conduction and leakage. + +The group has not finalized the new objects. There are two choices. The first has a new object with A4 field with 3 choices. The second has 3 new objects: Duct:Loss:Conduction, Duct:Loss:Leakage, and Duct:Loss:MakeupAir. + +#### 3 new objects #### + +An alternative approach is to have 3 new obejcts. Each object represents each loss type explicitly. + + Duct:Loss:Conduction, + A1, \field Name + \required-field + A2, \field AirLoopHAVC Name + \required-field + \type object-list + \object-list AirPrimaryLoops + A3; \field AirflowNetwork:Distribution:Linkage Name + \required-field + \type object-list + \object-list AirflowNetworkDistributionLinkageNames + A4, \field Environment Type + \type choice + \key Zone + \key Schedule + \default Zone + A5, \field Ambient Temperature Zone Name + \type object-list + \object-list ZoneNames + A6; \field Ambient Temperature Schedule Name + \type object-list + \object-list ScheduleNames + + Duct:Loss:Leakage, + A1, \field Name + \required-field + A2, \field AirLoopHAVC Name + \required-field + \type object-list + \object-list AirPrimaryLoops + A3; \field AirflowNetwork:Distribution:Linkage Name + \required-field + \type object-list + \object-list AirflowNetworkDistributionLinkageNames + + Duct:Loss:MakeupAir, + A1, \field Name + \required-field + A2, \field AirLoopHAVC Name + \required-field + \type object-list + \object-list AirPrimaryLoops + A3; \field AirflowNetwork:Distribution:Linkage Name + \required-field + \type object-list + \object-list AirflowNetworkDistributionLinkageNames + +#### Existing object AirflowNetwork:Distribution:Node #### + +The added choice is highlighted in red. + + AirflowNetwork:Distribution:Node, + \min-fields 4 + \memo This object represents an air distribution node in the AirflowNetwork model. + A1 , \field Name + \required-field + \type alpha + \reference AirflowNetworkNodeAndZoneNames + \note Enter a unique name for this object. + A2 , \field Component Name or Node Name + \type alpha + \note Designates node names defined in another object. The node name may occur in air branches. + \note Enter a node name to represent a node already defined in an air loop. + \note Leave this field blank if the Node or Object Type field below is entered as + \note AirLoopHVAC:ZoneMixer, AirLoopHVAC:ZoneSplitter, AirLoopHVAC:OutdoorAirSystem, or Other. + A3 , \field Component Object Type or Node Type + \type choice + \key AirLoopHVAC:ZoneMixer + \key AirLoopHVAC:ZoneSplitter + \key AirLoopHVAC:OutdoorAirSystem + \key OAMixerOutdoorAirStreamNode + \key OutdoorAir:NodeList + \key OutdoorAir:Node + \key Other + + + \key Zone + + + \default Other + \note Designates Node type for the Node or Component Name defined in the field above. + \note AirLoopHVAC:ZoneMixer -- Represents a AirLoopHVAC:ZoneMixer object. + \note AirLoopHVAC:ZoneSplitter -- Represents a AirLoopHVAC:ZoneSplitter object. + \note AirLoopHVAC:OutdoorAirSystem -- Represents an AirLoopHVAC:OutdoorAirSystem object. + \note OAMixerOutdoorAirStreamNode -- Represents an external node used in the OutdoorAir:Mixer + \note OutdoorAir:NodeList -- Represents an external node when a heat exchanger is used before + \note the OutdoorAir:Mixer + \note OutdoorAir:Node -- Represents an external node when a heat exchanger is used before + \note the OutdoorAir:Mixer + \note Other -- none of the above, the Node name already defined in the previous field is part + \note of an air loop. + \note Zone -- Enter a zone name for duct simple model to calculate duct leakage loss. + N1 ; \field Node Height + \type real + \units m + \default 0.0 + \note Enter the reference height used to calculate the relative pressure. + + +Note for AirflowNetwork:Distribution:Node: + +1. Component Name or Node Name + +The field of Component Name or Node Name is either Air Node name or Zone name. If a Zone name or an outdoor air node is entered, this node is used as a return leakage source or a supply leak target. + +2. N1 field are ignored + +Since the proposed feature is used for duct energy losses from conduction and leakage, N1 field is not used in energy loss calculation. The outdoor air node is allowed as either leakage source or target. + +3. A new choice of A3 field is added as zone name. When AFN is fully implemented, the zone name is defined in AirflowNetwork:MultiZone:Zone. For the simplified duct model without using AFN, the added new choice can be used to define a zone for duct leakage calculation. Therefore, there is no need to use AirflowNetwork:MultiZone:Zone. + +#### Existing object AirflowNetwork:Distribution:Linkage #### + + AirflowNetwork:Distribution:Linkage, + \min-fields 4 + \memo This object defines the connection between two nodes and a component. + A1 , \field Name + \required-field + \type alpha + \note Enter a unique name for this object. + \reference AirflowNetworkDistributionLinkageNames + A2 , \field Node 1 Name + \required-field + \type object-list + \object-list AirflowNetworkNodeAndZoneNames + \note Enter the name of zone or AirflowNetwork Node or Air Node. + A3 , \field Node 2 Name + \required-field + \type object-list + \object-list AirflowNetworkNodeAndZoneNames + \object-list AirNodeAndZoneNames + \note Enter the name of zone or AirflowNetwork Node or Air Node. + A4 , \field Component Name + \required-field + \type object-list + \object-list AirflowNetworkComponentNames + \object-list FansCVandOnOffandVAV + \object-list AFNCoilNames + \object-list AFNHeatExchangerNames + \object-list AFNTerminalUnitNames + \note Enter the name of an AirflowNetwork component. A component is one of the + \note following AirflowNetwork:Distribution:Component objects: Leak, LeakageRatio, + \note Duct, ConstantVolumeFan, Coil, TerminalUnit, ConstantPressureDrop, or HeatExchanger. + A5 ; \field Thermal Zone Name + \type object-list + \object-list ZoneNames + \note Only used if component = AirflowNetwork:Distribution:Component:Duct + \note The zone name is where AirflowNetwork:Distribution:Component:Duct is exposed. Leave this field blank if the duct + \note conduction loss is ignored. + +Note for AirflowNetwork:Distribution:Linkage: + +1. Conduction + +If duct conduction loss is simulated, the selected Component Name should be AirflowNetwork:Distribution:Component:Duct. Node 1 and Node 2 names should be Air Node names, provided in the list of AirflowNetwork:Distribution:Node. + +2. Leakage + +If duct leakage loss is simulated, the selected Component Name should be AirflowNetwork:Distribution:Component:LeakageRatio. The input of Effective Leakage Ratio field should be a fraction of mass flow rate of the AirLoopHVAC. The other field inputs are not used. One of nodes should be either zone name or outdoor air node name. + +If a supply leak is defined, Node 1 name should be an air node, Node 2 name should be either a zone name or an outdoor air node name. + +If a return leak is defined, Node 1 name should be either a zone name or an outdoor air node name, Node 2 name should be an air node. + +3. Restriction + +Although there is no restriction of the number of ducts and locations, it is proposed for Phase 1 to have limits as follows. + +3.1 There is a single duct used for SupplyTrunk and ReturnTrunk. + +The connection of SupplyTrunk is between the inlet node (AirloopHVAC Demand Side Inlet Node) of AirLoopHVAC and the AirLoopHVAC:ZoneSplitter inlet node. If AirLoopHVAC:ZoneMixer is available, The connection of ReturnTrunk is between AirLoopHVAC:ZoneMixer outlet node and the outlet node (AirloopHVAC Demand Side Outlet Node) of AirLoopHVAC. + +3.2 Each branch has a single duct. + +The connection of SupplyBranch is between AirLoopHVAC:ZoneSplitter outlet node and one of the Air terminal inlet node. If AirLoopHVAC:ZoneMixer is available, The connection of ReturnBranch is between the zone outlet node and the AirLoopHVAC:ZoneMixer inlet node. + +### Conduction loss ### + +The AirflowNetwork:Distribution:Component:Duct object is used to calculate duct conduction loss. + +#### Existing object for duct conduction loss as AirflowNetwork:Distribution:Component:Duct #### + + AirflowNetwork:Distribution:Component:Duct, + \min-fields 8 + \memo This object defines the relationship between pressure and air flow through the duct. + A1 , \field Name + \required-field + \type alpha + \reference AirflowNetworkComponentNames + \note Enter a unique name for this object. + N1 , \field Duct Length + \required-field + \type real + \units m + \minimum> 0.0 + \note Enter the length of the duct. + N2 , \field Hydraulic Diameter + \required-field + \type real + \units m + \minimum> 0.0 + \note Enter the hydraulic diameter of the duct. + \note Hydraulic diameter is defined as 4 multiplied by cross section area divided by perimeter + N3 , \field Cross Section Area + \required-field + \type real + \units m2 + \minimum> 0.0 + \note Enter the cross section area of the duct. + N4 , \field Surface Roughness + \type real + \units m + \default 0.0009 + \minimum> 0.0 + \note Enter the inside surface roughness of the duct. + N5 , \field Coefficient for Local Dynamic Loss Due to Fitting + \type real + \units dimensionless + \default 0.0 + \minimum 0.0 + \note Enter the coefficient used to calculate dynamic losses of fittings (e.g. elbows). + + + A2, \field Construction Name + \required-field + \type object-list + \object-list ConstructionNames + + + N6 , \field Overall Moisture Transmittance Coefficient from Air to Air + \type real + \units kg/m2 + \minimum> 0.0 + \default 0.001 + \note Enter the overall moisture transmittance coefficient + \note including moisture film coefficients at both surfaces. + N7 , \field Outside Convection Coefficient + \note optional. convection coefficient calculated automatically, unless specified + \type real + \units W/m2-K + \minimum> 0.0 + N8 ; \field Inside Convection Coefficient + \note optional. convection coefficient calculated automatically, unless specified + \type real + \units W/m2-K + \minimum> 0.0 + +Note: + +1. Replace N6 by A2 + +Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction field is replaced by construction name. Since inside and outside film coefficients are provided, there is no reason to requires U factor, if the construction object can be use. + +2. Keep N6 Overall Moisture Transmittance Coefficient from Air to Air + +Although I can require to add one more field for moisture diffusivity in the Material object, this property is driven by humidity ratio. As we know, heat transfer is driven by the temperature difference, while the mositure transfer is driven by partial vapor pressure difference. The humidity ratio, as an independent variable, may not be proper. + +Let's keep the field for the time being. We may need to think to use the partial vapor pressure as driving force to simulate moisture performance across walls. + +3. The Component:Duct is the only component listed in the Component Name defined in the Linkage object for conduction loss calculation. + +4. The Component:LeakageRatio is the only component listed in the Component Name defined in the Linkage object for conduction leakage calculation. + +An example of objects used to calculate duct condiuction loss in an IDF is: + +\begin{lstlisting} + + Duct:Loss:Conduction, + Main duct, !- Name + Main AirLoopHVAC, !- AirLoopHAVC Name + Mail Duct Linkage, !- AirflowNetwork:Distribution:Linkage Name + Zone, !- Environment Type + Zone 1, !- Ambient Temperature Zone Name + ; !- Ambient Temperature Schedule Name + + AirflowNetwork:Distribution:Node, + EquipmentOutletNode, !- Name + Equipment outlet node, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + + AirflowNetwork:Distribution:Node, + SplitterInletNode, !- Name + ZoneSplitter Inlet Node, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + + AirflowNetwork:Distribution:Component:Duct, + AirLoopSupply, !- Name + 0.1, !- Duct Length {m} + 1.0, !- Hydraulic Diameter {m} + 0.7854, !- Cross Section Area {m2} + , !- Surface Roughness {m} + , !- Coefficient for Local Dynamic Loss Due to Fitting {dimensionless} + Duct Wall, !- Construction Name + 0.0001, !- Overall Moisture Transmittance Coefficient from Air to Air {kg/m2} + 0.006500, !- Outside Convection Coefficient {W/m2-K} + 0.032500; !- Inside Convection Coefficient {W/m2-K} + + AirflowNetwork:Distribution:Linkage, + Mail Duct Linkage, !- Name + EquipmentOutletNode, !- Node 1 Name + SplitterInletNode, !- Node 2 Name + AirLoopSupply, !- Component Name + Attic Zone; !- Thermal Zone Name + +\end{lstlisting} + +### Leakage losses without mass flow changes ### + +Assumptions: + +1. The leakage loss calculation is based on energy transfer. In other words, no mass flows are involved in both AirLoopHVAC and zones. For example, when a supply leak is applied, the supply fan flow rate remains the same, the changes may be outlet equivalent temperatures and humidity ratios + +2. Any energy losses for supply leak occur in the source duct and target zone or outdoor air node only. No more extension to other ducts and zones. + +3. Any energy losses for return leak occur in the source zone or outdoor air node and and target duct only. No more extension to other ducts and zones. + +4. Any air movement between zones caused by duct leakage can be accomplished by make up air. + +#### Existing objects #### + +AirflowNetwork:Distribution:Node and AirflowNetwork:Distribution:Linkage are the same as above + +No change of AirflowNetwork:Distribution:Component:LeakageRatio. + +Note for AirflowNetwork:Distribution:Component:LeakageRatio + +Field Effective Leakage Ratio is used as leakage, a fraction of AirLoopHVAC flow. The inputs of the rest of fields are not used. + +#### Makeup air #### + +An important factor for duct leakage is to introduce make up flow due to supply and return leaks. Since we don't use pressure to calculate make up airflow impact, we will allow users to specify makeup air flows and direction using existing AFN object, so that make up airflows can flow from outdoor to a zone, and from a zone to another zone. The requirements are as follows: + +1. The Node 1 name and Node 2 name in the AirflowNetwork:Distribution:Linkage object have to be either zone names for both fields or a zone name and an outdoor node name. The Node 1 name represents flow starting point, and the Node 2 name represents flow ending points. The flow direction for a linkage with a zone name and an outdoor node name should be from outdoor to a zone, equivalent to air infiltration. When both zone names are specified, the equivalent object should Zobe Mixing. + +2. Exfiltration is not used in energy calculation. In other words, an outdoor air node can not be specified as Node 2 name. + +3. The current makeup air is limited in a single AirLoopHVAC. When multiple AirLoopHVACs are applied, makeup air movement between two zones can be very complicated. More deep discussion may be needed after implementation with a single AirLoopHVAC. + +An example of objects used to calculate duct leak loss in an IDF is: + +\begin{lstlisting} + + Duct:Loss:Leakage, + Main duct leak, !- Name + Main AirLoopHVAC, !- AirLoopHAVC Name + Mail Duct Leak; \field AirflowNetwork:Distribution:Linkage Name + + AirflowNetwork:Distribution:Node, + SplitterInletNode, !- Name + ZoneSplitter Inlet Node, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + + AirflowNetwork:Distribution:Node, + Attic Zone, !- Name + Attic zone Name, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + + AirflowNetwork:Distribution:Component:LeakageRatio, + ZoneSupplyELR, !- Name + 0.05, !- Effective Leakage Ratio {dimensionless} + 1.9, !- Maximum Flow Rate {m3/s} + 59.0, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + + AirflowNetwork:Distribution:Linkage, + Main Duct Leak, !- Name + SplitterInletNode, !- Node 1 Name + Attic Zone, !- Node 2 Name + ZoneSupplyELR, !- Component Name + ; !- Thermal Zone Name + +! Make up air + + Duct:Loss:MakeupAir, + Makeup air, !- Name + Main AirLoopHVAC, !- AirLoopHAVC Name + Duct Leak Makeup; \field AirflowNetwork:Distribution:Linkage Name + + AirflowNetwork:Distribution:Node, + OutdoorAirNode, !- Name + Outdoor Air Node, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + + AirflowNetwork:Distribution:Node, + Living Zone, !- Name + Living zone Name, !- Component Name or Node Name + Other, !- Component Object Type or Node Type + 3.0; !- Node Height {m} + + AirflowNetwork:Distribution:Component:LeakageRatio, + MakeupAirELR, !- Name + 0.05, !- Effective Leakage Ratio {dimensionless} + 1.9, !- Maximum Flow Rate {m3/s} + 59.0, !- Reference Pressure Difference {Pa} + 0.65; !- Air Mass Flow Exponent {dimensionless} + + AirflowNetwork:Distribution:Linkage, + Duct Leak Makeup, !- Name + OutdoorAirNode, !- Node 1 Name + Living Zone, !- Node 2 Name + MakeupAirELR, !- Component Name + ; !- Thermal Zone Name + +\end{lstlisting} + +### Trigger ### + +The duct model can be trigged by two choices. The first choice is to use a new object as Duct:Loss. The second choice is add more choices in the AirflowNetwork Control field of the AirflowNetwork:SimulationControl object. I prefer the first choice. The main reason is that the simplified duct mode does not use the AFN model. Instead, the model only uses the existing AFN objects. + +#### Can be triggered by new chocies of AirflowNetwork Control #### + +Thie option is removed based on most people opinions in the Technicalities. + +#### Self start with new obejcts only #### + + +I prefer to use this approach: + + + Duct:Loss objects are used without any modifications of AirflowNetwork:SimulationControl. + +### Leakage losses with mass flow changes ### + +The inputs of objects in this section should be the same as the section of Leakage losses without mass flow changes. The differences between two sections are internal code implementation. The changes will be addressed in Design document. + +## Design Document ## + +This section will provide algorithms and code implementation approach. + +### Algorithms ### + +The algorithms cover temperature and humidity ratio at the outlet for supply and return leaks. + +#### Conduction #### + +Section of 13.1.4 Node Temperature Calculations in Engineering Reference presents temperature at duct outlet node due to conduction losses: + +The outlet air temperature at the end of the duct (x = L) is: + +To = T + (Ti − T)*exp[-UA/(mCp)] + +where: + +Ti = Inlet air temperature [°C] + +To = Outlet air temperature [°C] + +T∞ = Temperature of air surrounding the duct element [°C] + +U = Overall heat transfer coefficient [W/m2-K] + +A = Surface area (Perimeter * Length) [m2] + +m˙ = Airflow rate [kg/s] + +The heat transfer by convection to ambient, Q, is: + +Qsen = m* Cp(T − Ti){1-exp[-UA/(mCp)]} + +13.1.5 Node Humidity Ratio Calculations presents temperature and humidity ratio at duct outlet node due to diffusion losses: + +The outlet air humidity ratio at the end of the duct (x = L) is: + +Wo = W + (Wi − W)*exp[-UmA/m] + +where: + +Wi = Inlet air temperature [°C] + +Wo = Outlet air temperature [°C] + +W∞ = Temperature of air surrounding the duct element [°C] + +Um = Overall moisture transfer coefficient [W/m2-K] + +A = Surface area (Perimeter * Length) [m2] + +m˙ = Airflow rate [kg/s] + +The mositure transfer by convection to ambient, Q, is: + +Qlat = m* (W − Wi){1-exp[-UmA/m]} + + +#### Supply leaks #### + +The schmetic of supply leak is shown below. + +![Supply Leaks](SupplyLeaks.PNG) + +Assumption: + +No mass flow rate in the Airloop will be changed. Instead, the equivalent temperature and humidity ratio at the outlet will be calculated as follows + +Energy balance for a supply leak + +m1h1 = m2 h2 + m3 h3 + +Mass balance + +m1 = m2 + m3 + +Assumption: + +When a supply leak occurs, it assumes to be at the outlet of the duct. The reality is that the outlet enthalpy remains the same, and supply mass flow rate is changed. However, if we assume the same mass flow rate in the Airloop and keep energy balanced, the equivalent ourlet temperature and humidity will be calculated. + +Based on EnergyPlus psychrometric functions, the enthalpy may be calculayed as follows: + +h = 1.00484e3 * TDB + max(dW, 1.0e-5) * (2.50094e6 + 1.85895e3 * TDB); // enthalpy {J/kg} + +where TDB is dry bulb temperature with units of C. + +The above equation may be simplified as + +h = a\*T + W *(b+c\*T) + +where a, b, and c are constants. + +The energy balance equation can be re-written using the same mass flow rate at the outlet: + +m1h1 = m2 h2 + m3 h3 = m1 h4 + m3 h3 + +where + +h4 = [(m1 - m3) \*h1]/m1 = h1*( 1 - m3/m1 ) + +By substituting E+ enthalpy equation, the energy balance equation can be written as: + +h4 = h1*( 1 - m3/m1 ) + +[a\*T4 + W4 *(b+c\*T4)] = [a\*T1 + W1 *(b+c\*T1)] *( 1 - m3/m1 ) + +Since there are two variables, one set of possible solutions can be + +T4 = T1 *( 1 - m3/m1 ) + +W4 = [W1 \*(b+c\*T1)] \*( 1 - m3/m1 ) / [b+c\*T1*( 1 - m3/m1 )] + +#### Return leaks #### + +The schmetic of return leak is shown below. + +![Return Leaks](ReturnLeaks.PNG) + + +The algorithm and code to calculate outlet condition of OAMixer is apply to return leaks. + +OAMixer calculation: + + Real64 RecircMassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).RetMassFlowRate - state.dataMixedAir->OAMixer(OAMixerNum).RelMassFlowRate; + + state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate + RecircMassFlowRate; + + state.dataMixedAir->OAMixer(OAMixerNum).MixEnthalpy = + (RecircMassFlowRate * RecircEnthalpy + + state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * state.dataMixedAir->OAMixer(OAMixerNum).OAEnthalpy) / + state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; + state.dataMixedAir->OAMixer(OAMixerNum).MixHumRat = (RecircMassFlowRate * RecircHumRat + state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * state.dataMixedAir->OAMixer(OAMixerNum).OAHumRat) / state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; + + state.dataMixedAir->OAMixer(OAMixerNum).MixTemp = + Psychrometrics::PsyTdbFnHW(state.dataMixedAir->OAMixer(OAMixerNum).MixEnthalpy, state.dataMixedAir->OAMixer(OAMixerNum).MixHumRat); + +Return leak calculation: + +1. Calculate recirculate flow + +mRecirculate = mAirloop - mReturnleak + +2. Calculate mixed flow + +mMixed = mRecirculate + mreturnleak + +3. Calculate mixed air properties + +Mass flow rate weighted air properties + +TMixed = (TRecirculte * mRecirculte + TReturnleak * mReturnleak ) /mMixed + +WMixed = (WRecirculte * mRecirculte + WReturnleak * mReturnleak ) /mMixed + +#### Makeup air #### + +The additional energy losses from makeup air is treated as infiltration with airflow from outdoor to a zone, and mixing with airflow from a zone to another. + +##### Infiltration ##### + +Qsen = minf* Cp(T − Ti) + +Qlat = minfhg(W − Wi) + +##### Mixing ##### + +Qsen = mmix* Cp(Tj − Ti) + +Qlat = mmixhg(Wj − Wi) + +#### Add loss to zone load and system load #### + +This section provides treament pathway of losses to either a system or a zone. + +1. Duct conduction and leakage loss + +When the system outlet node is replaced by the zone supply inlet zone, duct losses can be included for system capacity request without any changes of system load prediction. This happens every iteration. + +2. Makeup losses + +I have two choices for the makeup losses. The first choice is to add losses as a part of system load, so that all losses will be added every system iteration. The second choice is to treat makeup losses as zone load used in the next time step. + +Here is a reason: + +When makeup losses are added as zone gain, they are excluded in the predictor calculation, so that requested system load will not have makeup losses at beginning of every time step. Thereofre, the makeup losses needs to be caught in the next zone time step. + +I will try the first choice first. If not working well, the second choice will be implemented. + +##### Conduction and leakage ##### + +All losses from conduction and leakage will be added to a system as Duct loss. The implementation code is similar to the DuctLoss code in UntarySystem, Furnace and Multispeed AirToAir Heat pump mdules. The addon is summed by all conduction and leakage losses served to a system by the same Airloop. + +![DuctlossAddon](DuctlossAddon.png) + +It hsould be pointed out that the added loss is calculated at every iteration of the whole Airloop. + +Since the loss addon is system-based one. Each individual system modification will be performed. + + + +###### Possible approach ###### + +If the system outlet node is changed to a zone inlet node in the call of CalcZoneSensibleLatentOutput, the added losses may be removed. I will test this approach to see if it works or not. + + + + +##### Makeup air ##### + +The energy losses from makeup air will be added in a zone used for the next time step. + +### New module ### + +A new module of DuctLoss will be created for inputs process and calculations. Here is a list of possible functions and associated functionality. + +1. SimDuctLoss +2. GetDuctLossInput +3. InitDuctLoss +4. CalcDuctLoss +5. ReportDuctLoss + +#### SimDuctLoss #### + +A possible function is: + +void DuctLoss::SimDuctLoss(EnergyPlusData &state, bool const FirstHVACIteration) + +The function may contain calls shown below: + + if (state.dataDuctLoss->GetInputOnceFlag) { + // Get the AirLoopHVACDOAS input + getDuctLossSInput(state); + state.dataDuctLoss->GetInputOnceFlag = false; + } + + this->initDuctLoss(state, FirstHVACIteration); + + this->CalcDuctLoss(state, FirstHVACIteration); + + this->ReportDuctLoss(state); + +The function will be called in the SimZoneEquipment of the ZoneEquipmentManager. The location will be similar with the call of SplitterComponent::SimAirLoopSplitter or the call of ReturnAirPathManager::SimReturnAirPath. + +#### GetDuctLossInput #### + +The 3 new objects (Duct:Loss:XXX) will be processed in the new module. The other related AFN objects will be handled in the AFN module to read Node, Linkage, Duct and Leakage object. I will check to see possiblity if separated functions are needed or not in the AFN model, because AFN model and Non AFN model need to process the same objects of Node, Linkage, Duct and Leakage. + +The function may contain functionality shown below: + +Read all inputs for Duct:Loss:XXX +Check possible errors +Setup node connections +Call AFN model functions to get all required AFN objects + +##### Local variables ##### + +All new objects and AFN obejcts will have local array variables defined in the header file. + +#### InitDuctLoss #### + +This function has two functionalities. The first one is to assign component values and check error when some components data are not available in the process of GetDuctLossInput. + +The second functionality is to assign component values at each AirLoop iteration. + +#### CalcDuctLoss #### + +All duct losses will be calculated in this function, including conduction, leaks and makeup air. The outputs will be temperature and humidity ratio at outlet nodes. + +#### ReportDuctLoss #### + +All sensible and latent losses from each Duct:Loss:XXX object will be reported. + +### Other module revisions ### + +The major revisions will be performed in 3 modules, UnitarySystem, MultispeedHeatPump, and Furnace. The change will replace system outlet node by supply inlet node to call CalcZoneSensibleLatentOutput, so that duct losses will be included automatically when system capacity is requested to reach zone setpoint. diff --git a/design/FY2024/DuctlossAddon.png b/design/FY2024/DuctlossAddon.png new file mode 100644 index 00000000000..d4d38b357c6 Binary files /dev/null and b/design/FY2024/DuctlossAddon.png differ diff --git a/design/FY2024/IntegratedWaterSideEconomizer.PNG b/design/FY2024/IntegratedWaterSideEconomizer.PNG new file mode 100644 index 00000000000..e8994393312 Binary files /dev/null and b/design/FY2024/IntegratedWaterSideEconomizer.PNG differ diff --git a/design/FY2024/NFP-DuctHeatTransfer.md b/design/FY2024/NFP-DuctHeatTransfer.md new file mode 100644 index 00000000000..499ab666f4f --- /dev/null +++ b/design/FY2024/NFP-DuctHeatTransfer.md @@ -0,0 +1,399 @@ +An Improved Duct Model +================ + +** Lixing Gu ** + +** Florida Solar Energy Center** + + - 3rd draft NFP, 1/11/24 + + Revise NFP based on the conference call on 1/11/24 + + - 2nd draft NFP, 1/7/24 + + Remove Dynamic losses with thermal mass Phase 3 + + Add more fields to allow user to select exterior film coefficients + + - First revision on 1/4/24 + + Had a conference call with NREL residential group + + - Original NFP, 12/15/23 + + - + + +## Justification for New Feature ## + +EnergyPlus is being used by many tools around the world, and used as the calculation basis for hundreds of thousands of residential homes leading to billions of dollars of federal energy efficiency rebates in coming years. One aspect that potentially holds back the impact of these studies is related to duct simulation in EnergyPlus. There is skepticism about the accuracy of the model when we cannot simulate certain duct physics in a simplified manner. Although the airflow network model can handle ducts well, we need a duct model that captures duct heat transfer without having to build out a full airflow network. + +## E-mail and Conference Call Conclusions ## + +### Conference call with NREL residential group ### + +The conference call with NREL residential group was held on 1/4/24. Attendees are Edwin Lee, Scott Horowitz, Jon Winkler, and Lixing Gu. + +Before the conference call, Lixing Gu sent the FSEC original NFP to Scott. The original NFP presents how FSEC wanted to accomplish the new feature. Scott also sent NREL E+ Duct Model document to Lixing Gu. The NREL document presents a big wish list from NREL point of view. + +The conference call discussed both documents. Herer are discussion topics based on the NREL document and associated agreements and differences. + +#### Requirements #### + +The NFP allows multiple supply and return ducts using exisitng E+ configuration of Splitters and Mixers. Both parties agree to use FSEC proposed confiuration as a starting point. + +#### Inputs #### + +Both parties agree the proposed new duct object. NREL wants to cove duct leakage. FSEC agrees that the duct leakage is important to the duct model. However, based on current scope and budget, the duct leakage will be developed in later phases. + +The conference call also discussed inputs of effective R-value of duct. FSEC thinks the effective R-value should be user input. Duct shape is also dicussed. Hydronic diameter input is required. The user are required to convert any shapes into hydronic diameter as pre-processing. + +#### Modeling algorithm #### + +Both parties agree to use the exisitng algorithm to handle duct steady state heat transfer based on 13.1.4 Node Temperature Calculations in the Energuneering Reference. + +No leakage will be included in the present new feature. + +#### Testing/validation #### + +FSEC will validate the model compared to Excel calculation results. NREL will compare model results with EMS implementations. + +#### Other #### + +NREL request relationship to ZoneHVAC:AirDistributionUnit ("Simplified Duct Leakage Model"). + +The paragraph is extracted from Input Output Reference: + +The Air Distribution unit also allows the user to specify leaks in the supply air duct system. These inputs are used in the EnergyPlus Simplified Duct Leakage Model (SDLM). This model simulates a specific configuration: supply leaks to a return plenum in a commercial VAV or CV system. + +Since the proposed new feature does not deal with duct leakage, there is no relationship. + +Unfortunately, no discription of Simplified Duct Leakage Model is found in the Input Output Reference. + +NREL also mentions CSE duct model. + +The CSE duct model is available in the link at https://www.energycodeace.com/site/custom/public/reference-ace-2019/index.html#!Documents/110ductsystemmodel.htm + +Here is model simple description extracted from the link: + +The duct model builds on the procedure given by Palmiter (see Francisco and Palmiter, 2003), that uses a steady state heat exchanger effectiveness approach to get analytical expressions for instantaneous duct loss and system efficiencies. The duct model, developed for this program by Palmiter, makes use of many of the same fundamental steady state equations and approach, but given the considerable complexity of the multiple duct systems, does not do a simultaneous solution of all the equations which a generalized Francisco and Palmiter scheme may imply. Instead the approach takes advantage of the small time steps used in the code, and in effect decouples the systems from each other and the zone by basing all losses and other heat transfers occurring during the time step on the driving conditions of Tair and Tmrt known at the beginning of the time step, similar to how heat transfers are determined during mass temperature updates. + +Other assumptions made in the duct program: mass and thermal siphon effects in the duct system are ignored. + +The duct system performance is analyzed at every time step. The duct air temperatures are calculated assuming they are operating at steady state, in equilibrium with the thermal conditions at the beginning of the time-step in the attic. Heat capacity effects of the ducts are ignored. + +The model simplifies the heat transfer calculation with the multiple duct system. Since the new feature calculates heat transfer one by one, the proposed new feature can provide more accurated duct losses without any simplifications. + +### Follow-up E-mail communication after NREL conference call ### + +Thu 1/4/2024 5:05 PM + +Thanks! A couple comments: + +• "NREL will compare model results with EMS and AFN implementations." -- Please remove the AFN part. I don't think we will be able to do that as we are not set up to easily create models w/ AFN. + +• "FSEC thinks the effective R-value should be user input." – You are referring to the effective R-value excluding interior/exterior air films, right? To be clear, I was originally thinking that E+ might ask for the effective R-value including interior/exterior air films, since they may be prescribed by a standard. E.g., the ANSI/RESNET standard currently says to model uninsulated ducts using an effective R-1.5. Perhaps that could be a separate input for air film or convection coefficient, or there could be some way to connect the SurfaceProperty:ConvectionCoefficients object to these duct objects. + +• "Duct shape is also dicussed. Hydronic diameter input is required. The user are required to convert any shapes into hydronic diameter as pre-processing." – Agreed. But an equally important consideration for duct shape is that the nominal insulation R-Value is derated relative to a rectangular duct. That effect can presumably be accounted for in the duct construction materials (effective R-value), though a typical user may not realize they should do this. + +Also, I found another description of how ducts are modeled for California here. It may not have any new/different information than what you already saw. + +Scott + +### EnergyPlus Technicalities on 1/10/24 ### + +The NFP was discussed in the EnergyPlus Technicalities call. + +#### Comments #### +Jason DeGraw: + +He has different opinion to allow a simple model, since the AFN is able to have a full duct model. He prefers to have compatable approach. + +Gu: + +The proposed new object mimics AFN duct model with heat transfer only. The same conduction loss model is used. The model is mainly used by NREL residential group to simplify inputs without using the AFN model. + +Jason Glazer: + +Since AFN model has all input, is it possible to have a high level object to refer existing AFN object? + +Gu: + +The proposed object is a simplified object to have more restrictions compared to the full AFN model. It is hard to have a high level object. It addition, the high level object may confuse users. + +Rich Raustad: + +Suggest to use Inlet and Outlet node connection for the new object. + +Gu: + +Accept. + +Actions: + +1. Use node to replace inlet and outlet name to have a clear picture for node connection +2. Simplify inputs for exterior film coefficients to mimic inputs of AirflowNetwork:Distribution:Component:Duct + + +## Overview ## + +The objective is to design and implement the code changes required to support a new duct model, or modifications to an existing duct model, that enable duct heat transfer to be captured without requiring an airflow network to be set up. We will discuss with NREL’s residential group for guidance on implementation requirements and ensure that the implementation will directly address the skepticism around this capability to ensure EnergyPlus can be used confidently in residential building studies. + +###Assumptions### + +1. The proposed duct model deals with heat transfer only. In other words, no duct air leakage will be modeled. + +2. There are 4 duct types to be simulated: SupplyTrunk, SupplyBranch, ReturnTrunk, and ReturnBranch. + +3. There is a single duct used for SupplyTrunk and ReturnTrunk. + +The connection of SupplyTrunk is between the inlet node (AirloopHVAC Demand Side Inlet Node) of AirLoopHVAC and the AirLoopHVAC:ZoneSplitter inlet node. If AirLoopHVAC:ZoneMixer is available, The connection of ReturnTrunk is between AirLoopHVAC:ZoneMixer outlet node and the outlet node (AirloopHVAC Demand Side Outlet Node) of AirLoopHVAC. + +4. Each branch has a single duct. + +The connection of SupplyBranch is between AirLoopHVAC:ZoneSplitter outlet node and one of the Air terminal inlet node. If AirLoopHVAC:ZoneMixer is available, The connection of ReturnBranch is between the zone outlet node and the AirLoopHVAC:ZoneMixer inlet node. + +5. Inlet node temperature, humidity, and mass flow rate are known + +6. No return ducts when AirloopHVAC:ZoneReturnPlenum is used + +The following figure shows proposed duct configurration. + +![Figure 1 Schematic for ducts](Schametic.PNG) + +Figure 1. Schematic for proposed ducts with blue arrow object. The arrows show flow directions. + +###Model### + +There are 2 approaches to simulate duct heat transfer with conduction losses. The outcome is to provide duct outlet node temperature and humidity ratio. + +####Steady state with convection only as Phase 1#### + +The outlet node temperature will be calculated based on 13.1.4 Node Temperature Calculations in the Energuneering Reference. + +The outlet node humidity ratio will be calculated based on 13.1.5 Node Humidity Ratio Calculations in the Energuneering Reference. + +####Steady state with both convection and radiation as Phase 2#### + +Duct radiation will be added based on Phase 1 using the method decribed in 13.1.4.2 Duct Radiation in the Energuneering Reference. + +The radiation exchange has low priority from NREL point of view. FSEC agrees. + +####Dynamic losses with thermal mass Phase 3#### + +Removed + +###Possible accomplishment### + +Due to time and budget limit, we will lay down foundation of structure for duct inputs and guarantee to deliver duct loss calculation using Steadystate method. The SteadystateWithRadiation method is in the plan and may not be delivered. + +## Approach ## + +A new object simular to Pipe:Indoor is proposed. The main differences are that Fluid Inlet Node Name and Fluid Outlet Node Name are replaced by Inlet Node Name and Outlet Node Name. See detailed description in the Section of Input Description. + +In order to make the proposed object compatible with existing + +## Testing/Validation/Data Sources ## + +insert text + +## Input Output Reference Documentation ## + +\subsection{Duct:HeatTransfer}\label{ductheattransfer} + +This object specifies inputs which are used to simulate the heat transfer from an air duct placed in a zone or when a user schedule is used to specify an environment. + +The data definition for object is shown below. + +\subsubsection{Inputs}\label{inputs-6-014} + +\paragraph{Field: Name}\label{field-name-6-011} + +This alpha field is used as an identifying field for the pipe. + +\paragraph{Field: AirLoopHAVC Name}\label{airloophvac-name-6-011} + +This alpha field is used to identify the this object as a component of the AirLoopHVAC. + +\paragraph{Field: Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction Name}\label{field-construction-name-002} + +This alpha field references a `wall' construction object that gives a layer-by-layer description of the pipe wall and its insulation.~ The construction object follows standard conventions, describing material properties for each layer beginning with the outermost insulation layer and ending with the pipe wall layer. + +\paragraph{Field: Inlet Node Name}\label{field-inlet-node-name-000} + +This alpha field contains the name of the duct inlet. + +\paragraph{Field: Outlet Node Name}\label{field-outlet-node-name-000} + +This alpha field contains the name of the duct outlet. + +paragraph{Field: Duct Length}\label{field-duct-length} + +This numeric field is used to input duct length {[}m{]}. This value must be greater than zero. + +\paragraph{Field: Hydraulic Diameter}\label{field-hydraulic-diameter} + +This numeric field is used to input hydraulic diameter, which is defined as: + +\begin{equation} +{D_h} = \frac{{4A}}{P} +\end{equation} + +where + +D\(_{h}\) = Hydraulic diameter {[}m{]} + +A = Duct cross sectional area {[}m\(^{2}\){]} + +P = Perimeter of cross section {[}m{]} + +\paragraph{Field: Outside Convection Coefficient}\label{field-outside-convection-coefficent} + +This numeric field defines the outside convection coefficient (W/m\(^{2}\)-K). If the field is omitted, the film coefficient is calculated automatically as described in ASTM C1340. + +\paragraph{Field: Inside Convection Coefficient}\label{field-inside-convection-coefficent} + +This numeric field defines the inside convection coefficient (W/m\(^{2}\)-K). If the field is omitted, the film coefficient is calculated automatically as described in ASTM C1340. + +\paragraph{Field: Overall Moisture Transmittance Coefficient from Air to Air}\label{field-overall-moisture-transmittance-coefficient-from-air-to-air-0000} + +This numeric field is defined as the overall moisture transmittance coefficient (kg/m\(^{2}\)) from air to air, including film coefficients at both surfaces. + + +An example of this object in an IDF is: + +\begin{lstlisting} + + Duct:HeatTransfer, + Main duct, !- Name + Main AirLoopHVAC, !- AirLoopHAVC Name + Insulated Pipe, !- Construction name + Equipment outlet node, !- Inlet Node Name + ZoneSplitter Inlet Node, !- Outlet Node Name + Zone, !- Environment Type + East Zone, !- Ambient Temperature Zone Name + , !- Ambient Temperature Schedule Name + 10.0, !- Outside Convection Coefficient + 20.0, !- Inside Convection Coefficient + 0.001, !- Overall Moisture Transmittance Coefficient from Air to Air + +\end{lstlisting} + +## Input Description ## + +A new object of Duct:HeatTransfer to cover duct inputs is provided below. + + Duct:HeatTransfer, + \memo duct model with heat transfer to the environment. + A1, \field Name + \required-field + A2, \field AirLoopHAVC Name + \required-field + \type object-list + \object-list AirPrimaryLoops + A3, \field Heat Transmittance Coefficient (U-Factor) for Duct Wall Construction + \required-field + \type object-list + \object-list ConstructionNames + A4, \field Inlet Node Name + \required-field + A5, \field Outlet Node Name + \required-field + A6, \field Environment Type + \type choice + \key Zone + \key Schedule + \default Zone + A7, \field Ambient Temperature Zone Name + \type object-list + \object-list ZoneNames + A8, \field Ambient Temperature Schedule Name + \type object-list + \object-list ScheduleNames + N1, \field Duct Hydronic Diameter + \type real + \units m + \minimum> 0 + \ip-units in + N2, \field Duct Length + \type real + \units m + \minimum> 0.0 + N3 , \field Outside Convection Coefficient + \note optional. convection coefficient calculated automatically, unless specified + \type real + \units W/m2-K + \minimum> 0.0 + N4 , \field Inside Convection Coefficient + \note optional. convection coefficient calculated automatically, unless specified + \type real + \units W/m2-K + \minimum> 0.0 + N5; \field Overall Moisture Transmittance Coefficient from Air to Air + \type real + \units kg/m2 + \minimum> 0.0 + \default 0.001 + \note Enter the overall moisture transmittance coefficient + \note including moisture film coefficients at both surfaces. + +Future expansion with optional fields + + + + A9, \field Heat Transfer Solution Method + \type choice + \key SteadyState + \key SteadStateWithRadiation + \key Dynamic + \default SteadyState + A10; \field DuctViewFactors Object Name + \type object-list + \object-list AirflowNetworkComponentNames + \note The name of the duct view factor specification object used to calculate radiation exchange. + + + + AirflowNetwork:Distribution:DuctViewFactors, + \extensible:2 - repeat last two fields, remembering to remove ; from "inner" fields. + \memo This object is used to allow user-defined view factors to be used for duct-surface radiation + \memo calculations. + + + A1, \field Linkage or Duct:HeatTransfer Name + + + \required-field + \type object-list + \object-list AirflowNetworkComponentNames + ..... + +Note: + +In order to be general, the AirflowNetwork:Distribution:DuctViewFactors object may be renamed as DuctViewFactors, so that this object can be used either AFN or general duct heat transfer. + +## Outputs Description ## + +insert text + +## Engineering Reference ## + +insert text + +## Example File and Transition Changes ## + +insert text + +## References ## + +The next two references are used to present how thermal dynamic impacts are simulated: + +Hanby, V.I., Wright, J.A., Fletcher, D.W and Jones, D.N.T. 2002. Modeling the Dynamic Response +of Conduits. International Journal of HVACR&R, Vol.8, No.1. pp. 1-12. + +D. Parker, P. Fairey, L. Gu, Simulation of the effects of duct leakage and heat transfer on residential space-cooling energy use, Published 1993 Engineering Energy and Buildings + + + + + diff --git a/design/FY2024/NFP-Refrigerant-Migration-Decarbonization.md b/design/FY2024/NFP-Refrigerant-Migration-Decarbonization.md new file mode 100644 index 00000000000..48db433b2fd --- /dev/null +++ b/design/FY2024/NFP-Refrigerant-Migration-Decarbonization.md @@ -0,0 +1,211 @@ + +New Feature for Plant Decarbonization +================ + +**Richard Raustad** + +**Florida Solar Energy Center*** + + - Original Date: Feb 27, 2024 + - Final NFP - updated Apr 9, 2024 + - Add Refrigerant Migration model 7/10/2024 + - Add HeatExchanger:FluidToFluid plant configuration schematics 7/17/2024 + +## Justification for Feature Update + +Decarbonization efforts to electrify buildings has led to use of less common efficiency improvements. Use of chiller refrigerant migration, free cooling in air-cooled chillers, and integrated water-side economizer with air-cooled chiller, to name a few. The downside is that these equipment features come at varying costs. Table 1. ASHRAE 90.1-2013, 6.5.1-3 shows part-load efficiency improvements that would provide equivalent energy savings to a particular efficiency improvement as a trade-off for a specific code required control. + +``` +Energy standards and model codes do not have blanket exceptions for these systems. +However, there are a number of exceptions to consider. For small terminals <54,000 +Btu/h, no economizer is required by ASHRAE Standard 90.1-2013. + +Systems with condenser heat recovery may qualify for an exception. Air-cooled +chillers serving central equipment can use the efficiency trade off for equipment +(Table 1), condenser heat recovery or desuperheaters, or add a free cooling circuit. +``` + +For this reason the ability to model these features in EnergyPlus is crucial for both the software and the user. + +## Overview ## + +### Chiller refrigerant migration ### + +Involves using cold condenser inlet fluid temperature (colder than the evaporator water temperature) to force refrigerant migration without the need to energize the compressor (1). This may include special refrigerant circuits or valves to ensure proper refrigerant flow. Studies have shown up to 40% of chiller capacity is available using this technique. An empirical model that requires no knowledge of the refrigerant type or chiller configuration is to use a mathematical representation of the fraction of available chiller capacity when this operating mode is viable (i.e., lower condenser inlet temperature with respect to the chilled water leaving water temperature [refrigerant pressure surrogates]). This empirical model assumes a 10 C (50 F) maximum outdoor air wet-bulb temperature for a water-cooled chiller (left figure). The proposed generic model would use the temperature difference between the evaporator leaving water temperature set point and the condenser entering fluid temperature (right figure). + +Operating envelope and conditions for refrigerant migration + + +Figure 1. Operating envelope and conditions for refrigerant migration + +### Approach + +This feature proposes to add 2 optional fields to chillers representing the refrigerant migration (or generically a thermosiphon for passive heat exchange) empirical model. Tentatively at the end of the object but these fields could be inserted near the capacity and COP inputs if that seems better placement. The curve is likely the only required input field to denote the use of this equipment enhancement (i.e., the resulting curve fraction will determine if the chiller can meet the load using only refrigerant migration), however, the zero crossing of the performance curve may not accurately represent the actual operating range and an additional field is suggested as Refrigerant Migration Minimum Temperature Difference (see following example for HeatPump:PlantLoop:EIR:Cooling). It is anticipated that both of these fields will be implemented in each chiller type. + +``` +HeatPump:PlantLoop:EIR:Cooling, + A13, \field Thermosiphon Temperature Difference Curve Name + \type object-list + \object-list UniVariateFunctions + \note quadratic curve = a + b * dT is typical, other univariate curves may be used + \note dT = evaporator outlet temperature minus condenser inlet temperature + N10; \field Thermosiphon Minimum Temperature Difference + \type real + \minimum 0.0 + \default 0.0 + \note thermosiphon model is disabled below this minimum limit and + \note when the load is greater than calculated using the prevoius field. + +Chiller:Electric, + A14; \field Thermosiphon Temperature Difference Curve Name + \type object-list + \object-list UniVariateFunctions + \note quadratic curve = a + b * dT is typical, other univariate curves may be used + +Chiller:Electric:EIR, + A17; \field Thermosiphon Temperature Difference Curve Name + \type object-list + \object-list UniVariateFunctions + \note quadratic curve = a + b * dT is typical, other univariate curves may be used + +Chiller:Electric:Reformulated:EIR, + A16; \field Thermosiphon Temperature Difference Curve Name + \type object-list + \object-list UniVariateFunctions + \note quadratic curve = a + b * dT is typical, other univariate curves may be used +``` + +### Free cooling in air-cooled chillers ### + +Free cooling from air-cooled chillers typically happens through air-side economizers. Although the previous discussion of refrigerant migration applied to water-cooled chillers, there is no reason this same concept could not be applied to air-cooled equipment. This concept would be applied to the same chillers described above. + +### Integrated water-side economizer with air- or water-cooled chiller ### + +Integrated water-side economizer with air-cooled chillers is likely possible with existing objects with minor additions to control of the water flow through the WWHX (HeatExchanger:FluidToFluid). One side of the WWHX would be connected to the supply side inlet node of the chiller evaporator (or other appropriate branch in the plant, i.e., pre-cool entire plant loop) while the other side of the WWHX would be connected to a demand side branch of the condenser loop. Activation of the condenser loop flow through the HX, to activate free cooling, would be accomplished through controls modification (2). The WWHX object already has inputs for Control Type, Heat Exchanger Setpoint Node Name, Minimum Temperature Difference to Activate Heat Exchanger, Operation Minimum Temperature Limit, and Operation Maximum Temperature Limit. I am unsure at this time which of these fields would be used for configuration as an integrated water-side economizer or if other inputs would be required. It may be as simple as adding a new Control Type = IntegratedWaterSideEconomizer to allow the proper controls. Investigation into the new control will include review of the Component Override Loop inputs (e.g., using chiller condenser inlet or evaporator outlet node temperature as a control point). + +Integrated Water-Side Economizer + + +Figure 2. Integrated Water-Side Economizer + + +``` +HeatExchanger:FluidToFluid, + \memo A fluid/fluid heat exchanger designed to couple the supply side of one loop to the demand side of another loop + \memo Loops can be either plant or condenser loops but no air side connections are allowed + \min-fields 14 + A1 , \field Name + \required-field + A2 , \field Availability Schedule Name + A3 , \field Loop Demand Side Inlet Node Name + A4 , \field Loop Demand Side Outlet Node Name + N1 , \field Loop Demand Side Design Flow Rate + \autosizable + A5 , \field Loop Supply Side Inlet Node Name + A6 , \field Loop Supply Side Outlet Node Name + N2 , \field Loop Supply Side Design Flow Rate + A7 , \field Heat Exchange Model Type + \type choice + \key CrossFlowBothUnMixed + \key CrossFlowBothMixed + \key CrossFlowSupplyMixedDemandUnMixed + \key CrossFlowSupplyUnMixedDemandMixed + \key ParallelFlow + \key CounterFlow + \key Ideal + \default Ideal + N3 , \field Heat Exchanger U-Factor Times Area Value + A8 , \field Control Type + \type choice + \key UncontrolledOn + \key OperationSchemeModulated + \key OperationSchemeOnOff + \key HeatingSetpointModulated + \key HeatingSetpointOnOff + \key CoolingSetpointModulated + \key CoolingSetpointOnOff + \key DualDeadbandSetpointModulated + \key DualDeadbandSetpointOnOff + \key CoolingDifferentialOnOff + \key CoolingSetpointOnOffWithComponentOverride + \key IntegratedWaterSideEconomizer <-- new key choice + \default UncontrolledOn + A9 , \field Heat Exchanger Setpoint Node Name + \note Setpoint node is needed with any Control Type that is "*Setpoint*" + N4 , \field Minimum Temperature Difference to Activate Heat Exchanger + \note Tolerance between control temperatures used to determine if heat exchanger should run. + \type real + \minimum 0.0 + \maximum 50 + \default 0.01 + \units deltaC + A10, \field Heat Transfer Metering End Use Type + \note This field controls end use reporting for heat transfer meters + \type choice + \key FreeCooling + \key HeatRecovery + \key HeatRejection + \key HeatRecoveryForCooling + \key HeatRecoveryForHeating + \key LoopToLoop + \default LoopToLoop + A11, \field Component Override Loop Supply Side Inlet Node Name + \type node + \note This field is only used if Control Type is set to CoolingSetpointOnOffWithComponentOverride + A12, \field Component Override Loop Demand Side Inlet Node Name + \type node + \note This field is only used if Control Type is set to CoolingSetpointOnOffWithComponentOverride + A13, \field Component Override Cooling Control Temperature Mode + \type choice + \key WetBulbTemperature + \key DryBulbTemperature + \key Loop + \default Loop + \note This field is only used if Control Type is set to CoolingSetpointOnOffWithComponentOverride + N5 , \field Sizing Factor + \note Multiplies the autosized flow rates for this device + \type real + \minimum> 0.0 + \default 1.0 + N6 , \field Operation Minimum Temperature Limit + \note Lower limit on inlet temperatures, heat exchanger will not operate if either inlet is below this limit + \type real + \units C + N7 ; \field Operation Maximum Temperature Limit + \note Upper limit on inlet temperatures, heat exchanger will not operate if either inlet is above this limit + \type real + \units C +``` + +## Testing/Validation/Data Source(s) + +These features will be tested and demonstrated with one or more test files derived from 5Zone_AirCooled.idf and incorporation of integrated water-side in a similar example file. An attempt will be made to integrate these concepts into existing example files. + +## Proposed additions to Meters: + +N/A (these features should already be accounted for on meters) + +## Proposed Report Variables: + +- Refrigerant Migration Status (0 or 1) + +WWHX report for Fluid Heat Exchanger Operation Status should provide the necessary information to understand when the HX is active as an economizer. + +``` +if ((std::abs(this->HeatTransferRate) > DataHVACGlobals::SmallLoad) && (this-DemandSideLoop.InletMassFlowRate > 0.0) && + (this->SupplySideLoop.InletMassFlowRate > 0.0)) { + this->OperationStatus = 1.0; +} else { + this->OperationStatus = 0.0; +} +``` + +## References + +1) Trane Engineers Newsletter 37-3 "free" cooling using +Water Economizers + + +2) Trane Engineers Newsletter 45-2 waterside economizers +Keeping the "Free" In Free-Cooling + \ No newline at end of file diff --git a/design/FY2024/Operating-envelope-refrigerant-migration.png b/design/FY2024/Operating-envelope-refrigerant-migration.png new file mode 100644 index 00000000000..313af0027db Binary files /dev/null and b/design/FY2024/Operating-envelope-refrigerant-migration.png differ diff --git a/design/FY2024/ReturnLeaks.PNG b/design/FY2024/ReturnLeaks.PNG new file mode 100644 index 00000000000..9ba86e8d332 Binary files /dev/null and b/design/FY2024/ReturnLeaks.PNG differ diff --git a/design/FY2024/Schametic.PNG b/design/FY2024/Schametic.PNG new file mode 100644 index 00000000000..6e16e6b0f4d Binary files /dev/null and b/design/FY2024/Schametic.PNG differ diff --git a/design/FY2024/SupplyLeaks.PNG b/design/FY2024/SupplyLeaks.PNG new file mode 100644 index 00000000000..2b0c485f615 Binary files /dev/null and b/design/FY2024/SupplyLeaks.PNG differ diff --git a/doc/input-output-reference/CMakeLists.txt b/doc/input-output-reference/CMakeLists.txt index ac9a2540e2e..c895627f265 100644 --- a/doc/input-output-reference/CMakeLists.txt +++ b/doc/input-output-reference/CMakeLists.txt @@ -114,6 +114,7 @@ set(INCLUDED_TEX # to get the list of inluded images, go to the root of the document folder and: # grep -r '\\includegraphics' * | cut -d ':' -f 2 | rev | cut -d '{' -f 1 | rev | cut -d '}' -f 1 | sed 's/^/ /g' | sort -n -t'.' -k 1.14 set(INCLUDED_IMAGES + ${PROJECT_SOURCE_DIR}/input-output-reference/media/HeatExchanger-FluidToFluid-Schematics.png ${PROJECT_SOURCE_DIR}/input-output-reference/media/VSFanStagedHeatControlDiag.png ${PROJECT_SOURCE_DIR}/input-output-reference/media/SeriesVSFanModulatedHeatControlDiag.png ${PROJECT_SOURCE_DIR}/input-output-reference/media/vav_parallel_fpb_trane_staged.png diff --git a/doc/input-output-reference/media/HeatExchanger-FluidToFluid-Schematics.docx b/doc/input-output-reference/media/HeatExchanger-FluidToFluid-Schematics.docx new file mode 100644 index 00000000000..2de4be21b6e Binary files /dev/null and b/doc/input-output-reference/media/HeatExchanger-FluidToFluid-Schematics.docx differ diff --git a/doc/input-output-reference/media/HeatExchanger-FluidToFluid-Schematics.png b/doc/input-output-reference/media/HeatExchanger-FluidToFluid-Schematics.png new file mode 100644 index 00000000000..9af1802266e Binary files /dev/null and b/doc/input-output-reference/media/HeatExchanger-FluidToFluid-Schematics.png differ diff --git a/doc/input-output-reference/src/overview/group-condenser-equipment.tex b/doc/input-output-reference/src/overview/group-condenser-equipment.tex index 2c6495d206c..37d5989efa1 100644 --- a/doc/input-output-reference/src/overview/group-condenser-equipment.tex +++ b/doc/input-output-reference/src/overview/group-condenser-equipment.tex @@ -4045,6 +4045,13 @@ \subsection{HeatExchanger:FluidToFluid}\label{heatexchangerfluidtofluid} \end{figure} \textbf{Various options are available for the heat exchanger model.} + +\begin{figure}[hbtp] +\centering +\includegraphics[width=0.9\textwidth, height=0.9\textheight, keepaspectratio=true]{media/HeatExchanger-FluidToFluid-Schematics.png} +\caption{HeatExchanger:FluidToFluid Plant Configuration Schematics \protect \label{fig:plant-fluid-to-fluid-heat-exchanger-plant-schematics}} +\end{figure} + \begin{itemize} \item The heat transfer between the two sides can be modeled using one of seven different models for different types of heat exchangers. diff --git a/doc/input-output-reference/src/overview/group-plant-equipment.tex b/doc/input-output-reference/src/overview/group-plant-equipment.tex index 6daee528e50..57c8bdd5259 100644 --- a/doc/input-output-reference/src/overview/group-plant-equipment.tex +++ b/doc/input-output-reference/src/overview/group-plant-equipment.tex @@ -189,6 +189,13 @@ \subsection{Generic Chiller Outputs}\label{generic-chiller-outputs} HVAC,Average,Chiller OtherFuel2 Mass Flow Rate {[}kg/s{]} \end{itemize} +The following output is available only for electric chillers (i.e., Chiller:Electric, Chiller:Electric:EIR, Chiller:Electric:ReformulatedEIR and Chiller:ConstantCOP) and the cooling model of the plant loop heat pump (i.e., HeatPump:PlantLoop:EIR:Cooling). + +\begin{itemize} + \item + HVAC,Average,Thermosiphon Status {[]} +\end{itemize} + \subsubsection{Chiller Electricity Rate {[}W{]}}\label{chiller-electric-power-w} \subsubsection{Chiller Electricity Energy {[}J{]}}\label{chiller-electric-energy-j} @@ -847,6 +854,25 @@ \subsubsection{Inputs}\label{inputs-2-030} This alpha field contains the name of the basin heater operating schedule. This field only applies for Condenser Type = EvaporativelyCooled. The basin heater operating schedule is assumed to be an on/off schedule and the heater is available to operate any time the schedule value is greater than 0. The basin heater operates when scheduled on and the outdoor air dry-bulb temperature is below the set point temperature described in the previous field. If this field is left blank, the basin heater is available to operate throughout the simulation. Regardless of this schedule, the basin heater may only operate when the chiller is off. +\paragraph{Field: Thermosiphon Capacity Fraction Curve Name}\label{thermosiphon-capacity-fraction-curve-name1} + +This optional field allows specification of a user-defined performance curve which defines the fraction of capacity available through refrigerant thermosiphoning when the condenser inlet temperature is lower than the evaporator outlet temperature. When this fraction is less than or equal to the chiller part-load ratio the load may be met by refrigerant thermosiphoning. During this time the chiller power is 0 W and the Thermosiphon Status flag is set to 1. + +\begin{equation} + ThermosiphonCapacityFraction = {C_1} + {C_2}{\Delta_{temp}} +\end{equation} + +Where the Delta Temperature is defined as: + +\begin{equation} +{\Delta_{{\rm{Temp}}}} + = {\rm{TempEvapOut - TempCondIn }} +\end{equation} + +\paragraph{Field: Thermosiphon Minimum Temperature Difference}\label{thermosiphon-minimum-temperature-difference1} + +This optional input field specifies the minimum temperature difference to activate refrigerant thermosiphoning. If the temperature difference described above is less than this value refrigerant thermosiphoning is disabled. If this field is blank the default value is 0 C. + An example of this statement in an IDF is: \begin{lstlisting} @@ -909,6 +935,8 @@ \subsubsection{Outputs}\label{outputs-2-015} HVAC,Sum,Chiller Condenser Heat Transfer Energy {[}J{]} \item Zone,Meter,HeatRejection:EnergyTransfer {[}J{]} + \item + HVAC,Average,Thermosiphon Status {[]} \end{itemize} Air-cooled or Evap-cooled: @@ -1173,6 +1201,25 @@ \subsubsection{Inputs}\label{inputs-3-026} This optional field allows you to specify a user-defined end-use subcategory, e.g., ``Process''. A new meter for reporting is created for each unique subcategory (ref: \hyperref[outputmeter-and-outputmetermeterfileonly]{Output:Meter} objects). Any text may be used here to further subcategorize the end-uses in the ABUPS End Uses by Subcategory table and in the LEED Summary EAp2-4/5 Performance Rating Method Compliance table. If this field is omitted or blank, the chiller will be assigned to the ``General'' end-use subcategory. +\paragraph{Field: Thermosiphon Capacity Fraction Curve Name}\label{thermosiphon-capacity-fraction-curve-name2} + +This optional field allows specification of a user-defined performance curve which defines the fraction of capacity available through refrigerant thermosiphoning when the condenser inlet temperature is lower than the evaporator outlet temperature. When this fraction is less than or equal to the chiller part-load ratio the load may be met by refrigerant thermosiphoning. During this time the chiller power is 0 W and the Thermosiphon Status flag is set to 1. + +\begin{equation} + ThermosiphonCapacityFraction = {C_1} + {C_2}{\Delta_{temp}} +\end{equation} + +Where the Delta Temperature is defined as: + +\begin{equation} +{\Delta_{{\rm{Temp}}}} + = {\rm{TempEvapOut - TempCondIn }} +\end{equation} + +\paragraph{Field: Thermosiphon Minimum Temperature Difference}\label{thermosiphon-minimum-temperature-difference2} + +This optional input field specifies the minimum temperature difference to activate refrigerant thermosiphoning. If the temperature difference described above is less than this value refrigerant thermosiphoning is disabled. If this field is blank the default value is 0 C. + An example of this statement in an IDF is: @@ -1361,6 +1408,8 @@ \subsubsection{Outputs}\label{outputs-3-013} HVAC,Sum,Chiller Condenser Heat Transfer Energy {[}J{]} \item Zone,Meter,HeatRejection:EnergyTransfer {[}J{]} + \item + HVAC,Average,Thermosiphon Status {[]} \end{itemize} Air-cooled or Evap-cooled: @@ -1759,6 +1808,25 @@ \subsubsection{Inputs}\label{inputs-4-023} This field corresponds to the minimum condenser flow fraction. The minimum condenser flow is equal to the value of this input multiplied by the chiller maximum condenser flow rate. This input is only used when the ``Condenser Flow Control'' input is set to ``ModulatedChillerPLR'', ``ModulatedLoopPLR'' or ``ModulatedDeltaTemperature''. When not specified, a default of 0.2 is assumed. +\paragraph{Field: Thermosiphon Capacity Fraction Curve Name}\label{thermosiphon-capacity-fraction-curve-name3} + +This optional field allows specification of a user-defined performance curve which defines the fraction of capacity available through refrigerant thermosiphoning when the condenser inlet temperature is lower than the evaporator outlet temperature. When this fraction is less than or equal to the chiller part-load ratio the load may be met by refrigerant thermosiphoning. During this time the chiller power is 0 W and the Thermosiphon Status flag is set to 1. + +\begin{equation} + ThermosiphonCapacityFraction = {C_1} + {C_2}{\Delta_{temp}} +\end{equation} + +Where the Delta Temperature is defined as: + +\begin{equation} +{\Delta_{{\rm{Temp}}}} + = {\rm{TempEvapOut - TempCondIn }} +\end{equation} + +\paragraph{Field: Thermosiphon Minimum Temperature Difference}\label{thermosiphon-minimum-temperature-difference3} + +This optional input field specifies the minimum temperature difference to activate refrigerant thermosiphoning. If the temperature difference described above is less than this value refrigerant thermosiphoning is disabled. If this field is blank the default value is 0 C. + An example of this statement in an IDF is: @@ -1886,6 +1954,8 @@ \subsubsection{Outputs}\label{outputs-4-010} HVAC,Average,Chiller False Load Heat Transfer Rate {[}W{]} \item HVAC,Sum,Chiller False Load Heat Transfer Energy {[}J{]} + \item + HVAC,Average,Thermosiphon Status {[]} \end{itemize} Curve object outputs: @@ -2164,6 +2234,25 @@ \subsubsection{Inputs}\label{inputs-5-021} This field corresponds to the minimum condenser flow fraction. The minimum condenser flow is equal to the value of this input multiplied by the chiller maximum condenser flow rate. This input is only used when the ``Condenser Flow Control'' input is set to ``ModulatedChillerPLR'', ``ModulatedLoopPLR'' or ``ModulatedDeltaTemperature''. When not specified, a default of 0.2 is assumed. +\paragraph{Field: Thermosiphon Capacity Fraction Curve Name}\label{thermosiphon-capacity-fraction-curve-name4} + +This optional field allows specification of a user-defined performance curve which defines the fraction of capacity available through refrigerant thermosiphoning when the condenser inlet temperature is lower than the evaporator outlet temperature. When this fraction is less than or equal to the chiller part-load ratio the load may be met by refrigerant thermosiphoning. During this time the chiller power is 0 W and the Thermosiphon Status flag is set to 1. + +\begin{equation} + ThermosiphonCapacityFraction = {C_1} + {C_2}{\Delta_{temp}} +\end{equation} + +Where the Delta Temperature is defined as: + +\begin{equation} +{\Delta_{{\rm{Temp}}}} + = {\rm{TempEvapOut - TempCondIn }} +\end{equation} + +\paragraph{Field: Thermosiphon Minimum Temperature Difference}\label{thermosiphon-minimum-temperature-difference4} + +This optional input field specifies the minimum temperature difference to activate refrigerant thermosiphoning. If the temperature difference described above is less than this value refrigerant thermosiphoning is disabled. If this field is blank the default value is 0 C. + An example of this statement in an IDF is: @@ -5535,6 +5624,24 @@ \subsubsection{Inputs}\label{plhp_eir_cooling_inputs} This field is the name of a bivariate curve or table that defines an EIR (1/COP) modifier as a function of the load side outlet temperature and the heat recovery side inlet temperature. The temperatures are in degrees Celsius when used in the function. The output of this function and the output of the EIR Modifier Function of PLR are multiplied by the reference EIR to get a current EIR when the unit is operating in heat recovery mode. +\paragraph{Field: Thermosiphon Capacity Fraction Curve Name}\label{thermosiphon-capacity-fraction-curve-name5} + +This optional field allows specification of a user-defined performance curve which defines the fraction of capacity available through refrigerant thermosiphoning when the condenser inlet temperature is lower than the evaporator outlet temperature. When this fraction is less than or equal to the chiller part-load ratio the load may be met by refrigerant thermosiphoning. During this time the chiller power is 0 W and the Thermosiphon Status flag is set to 1. + +\begin{equation} + ThermosiphonCapacityFraction = {C_1} + {C_2}{\Delta_{temp}} +\end{equation} + +Where the Delta Temperature is defined as: + +\begin{equation} +{\Delta_{{\rm{Temp}}}} + = {\rm{TempEvapOut - TempCondIn }} +\end{equation} + +\paragraph{Field: Thermosiphon Minimum Temperature Difference}\label{thermosiphon-minimum-temperature-difference5} + +This optional input field specifies the minimum temperature difference to activate refrigerant thermosiphoning. If the temperature difference described above is less than this value refrigerant thermosiphoning is disabled. If this field is blank the default value is 0 C. \subsection{HeatPump:PlantLoop:EIR:Heating}\label{plhp_eir_heating} @@ -5827,6 +5934,13 @@ \subsubsection{Outputs}\label{plhp_eir_outputs} HVAC,Average,Heat Pump Heat Recovery Operation Status {[}{]} \end{itemize} +Outputs specific to HeatPump:PlantLoop:EIR:Cooling + +\begin{itemize} + \item + HVAC,Average,Thermosiphon Status {[}{]} +\end{itemize} + Outputs specific to HeatPump:PlantLoop:EIR:Heating \begin{itemize} diff --git a/idd/Energy+.idd.in b/idd/Energy+.idd.in index cbcbd5bf499..c8c81ed5963 100644 --- a/idd/Energy+.idd.in +++ b/idd/Energy+.idd.in @@ -73581,17 +73581,30 @@ Chiller:Electric:EIR, \note PLR is the chilled water plant loop part load ratio (actual/design) \type object-list \object-list UnivariateFunctions - A20, \field Temperature Difference Across Condenser Schedule Name + A19, \field Temperature Difference Across Condenser Schedule Name \note A schedule that defines the temperature difference across the condenser. This input is used to \note calculate the condenser flow. This input is only used when "Condenser Flow Control" is set to \note "ModulatedDeltaTemperature". \type object-list \object-list ScheduleNames - N19; \field Condenser Minimum Flow Fraction + N19, \field Condenser Minimum Flow Fraction \note This input corresponds to the minimum flow fraction to be simulated. The minimum condenser flow \note corresponds to this fraction multiplied by the maximum condenser flow rate. This input is only used \note when the "Condenser Flow Control" input is set to "ModulatedChillerPLR", "ModulatedLoopPLR" or \note "ModulatedDeltaTemperature". + A20, \field Thermosiphon Capacity Fraction Curve Name + \type object-list + \object-list UniVariateFunctions + \note quadratic curve = a + b * (Tevap, out - Tcond, in) is typical, other univariate curves may be used + \note Tevap, out = evaporator outlet temperature + \note Tcond, in = condenser inlet temperature + \note If this field is blank the thermosiphon model is disabled. + N20; \field Thermosiphon Minimum Temperature Difference + \type real + \minimum 0.0 + \default 0.0 + \note Thermosiphon model is disabled below this minimum limit and + \note when the load is greater than calculated using the prevoius field. Chiller:Electric:ReformulatedEIR, \min-fields 22 @@ -73607,7 +73620,7 @@ Chiller:Electric:ReformulatedEIR, \reference validPlantEquipmentNames \reference-class-name validBranchEquipmentTypes \reference validBranchEquipmentNames - N1 , \field Reference Capacity + N1 , \field Reference Capacity \type real \units W \required-field @@ -73816,17 +73829,30 @@ Chiller:Electric:ReformulatedEIR, \note PLR is the chilled water plant loop part load ratio (actual/design) \type object-list \object-list UnivariateFunctions - A19, \field Temperature Difference Across Condenser Schedule Name + A18, \field Temperature Difference Across Condenser Schedule Name \note A schedule that defines the temperature difference across the condenser. This input is used to \note calculate the condenser flow. This input is only used when "Condenser Flow Control" is set to \note "ModulatedDeltaTemperature". \type object-list \object-list ScheduleNames - N16; \field Condenser Minimum Flow Fraction + N16, \field Condenser Minimum Flow Fraction \note This input corresponds to the minimum flow fraction to be simulated. The minimum condenser flow \note corresponds to this fraction multiplied by the maximum condenser flow rate. This input is only used \note when the "Condenser Flow Control" input is set to "ModulatedChillerPLR", "ModulatedLoopPLR" or \note "ModulatedDeltaTemperature". + A19, \field Thermosiphon Capacity Fraction Curve Name + \type object-list + \object-list UniVariateFunctions + \note quadratic curve = a + b * (Tevap, out - Tcond, in) is typical, other univariate curves may be used + \note Tevap, out = evaporator outlet temperature + \note Tcond, in = condenser inlet temperature + \note If this field is blank the thermosiphon model is disabled. + N17; \field Thermosiphon Minimum Temperature Difference + \type real + \minimum 0.0 + \default 0.0 + \note Thermosiphon model is disabled below this minimum limit and + \note when the load is greater than calculated using the prevoius field. Chiller:Electric, \min-fields 27 @@ -73970,11 +73996,24 @@ Chiller:Electric, \note Using this triggers a model more suited to series bundle and chillers with higher temperature heat recovery \note If this field is not used, the bundles are modeled as being in parallel \type node - A13; \field End-Use Subcategory + A13, \field End-Use Subcategory \note Any text may be used here to categorize the end-uses in the ABUPS End Uses by Subcategory table. \type alpha \retaincase \default General + A14, \field Thermosiphon Capacity Fraction Curve Name + \type object-list + \object-list UniVariateFunctions + \note quadratic curve = a + b * (Tevap, out - Tcond, in) is typical, other univariate curves may be used + \note Tevap, out = evaporator outlet temperature + \note Tcond, in = condenser inlet temperature + \note If this field is blank the thermosiphon model is disabled. + N26; \field Thermosiphon Minimum Temperature Difference + \type real + \minimum 0.0 + \default 0.0 + \note Thermosiphon model is disabled below this minimum limit and + \note when the load is greater than calculated using the prevoius field. Chiller:Absorption:Indirect, \min-fields 17 @@ -74344,7 +74383,7 @@ Chiller:ConstantCOP, \default 2.0 \note This field is only used for Condenser Type = EvaporativelyCooled. \note Enter the outdoor dry-bulb temperature when the basin heater turns on. - A8 ; \field Basin Heater Operating Schedule Name + A8 , \field Basin Heater Operating Schedule Name \type object-list \object-list ScheduleNames \note This field is only used for Condenser Type = EvaporativelyCooled. @@ -74352,6 +74391,19 @@ Chiller:ConstantCOP, \note air dry-bulb temperature is below the basin heater setpoint temperature. \note If a schedule name is not entered, the basin heater is allowed to operate \note throughout the entire simulation. + A9 , \field Thermosiphon Capacity Fraction Curve Name + \type object-list + \object-list UniVariateFunctions + \note quadratic curve = a + b * (Tevap, out - Tcond, in) is typical, other univariate curves may be used + \note Tevap, out = evaporator outlet temperature + \note Tcond, in = condenser inlet temperature + \note If this field is blank the thermosiphon model is disabled. + N8 ; \field Thermosiphon Minimum Temperature Difference + \type real + \minimum 0.0 + \default 0.0 + \note Thermosiphon model is disabled below this minimum limit and + \note when the load is greater than calculated using the prevoius field. Chiller:EngineDriven, \min-fields 43 @@ -75272,24 +75324,24 @@ HeatPump:PlantLoop:EIR:Cooling, \note Enter the maximum inlet outdoor air dry-bulb temperature \note for air-cooled units or maximum inlet water temperature for water-cooled units. \note The unit is disabled above this temperature. - N10, \field Minimum Supply Water Temperature Curve Name + A15, \field Minimum Supply Water Temperature Curve Name \type object-list \object-list UniVariateFunctions \note quadratic curve = a + b*OAT is typical, other univariate curves may be used \note OAT = Outdoor Dry-Bulb Temperature - N11, \field Maximum Supply Water Temperature Curve Name + A16, \field Maximum Supply Water Temperature Curve Name \type object-list \object-list UniVariateFunctions \note quadratic curve = a + b*OAT is typical, other univariate curves may be used \note OAT = Outdoor Dry-Bulb Temperature - N12, \field Maximum Heat Recovery Outlet Temperature + N10, \field Maximum Heat Recovery Outlet Temperature \type real \units C \default 60.0 \note Enter the maximum heat recovery leaving water temperature limit \note The hot water temperature is not allowed to exceed this value \note Not available with water source condenser type - A15, \field Heat Recovery Capacity Modifier Function of Temperature Curve Name + A17, \field Heat Recovery Capacity Modifier Function of Temperature Curve Name \note Cooling capacity modifier as a function of CW supply temp and condenser entering fluid temp \type object-list \object-list BivariateFunctions @@ -75297,7 +75349,7 @@ HeatPump:PlantLoop:EIR:Cooling, \note CWS = supply (leaving) chilled water temperature(C) \note ECT = entering condenser fluid temperature(C) \note If this field is blank, the AWHP curve without heat recovery will be used - A16; \field Heat Recovery Electric Input to Output Ratio Modifier Function of Temperature Curve Name + A18, \field Heat Recovery Electric Input to Output Ratio Modifier Function of Temperature Curve Name \note Electric Input Ratio (EIR) modifier as a function of temperature \note EIR = 1/COP \type object-list @@ -75306,7 +75358,21 @@ HeatPump:PlantLoop:EIR:Cooling, \note CWS = supply (leaving) chilled water temperature(C) \note ECT = entering condenser fluid temperature(C) \note If this field is blank, the AWHP curve without heat recovery will be used - + A19, \field Thermosiphon Capacity Fraction Curve Name + \type object-list + \object-list UniVariateFunctions + \note quadratic curve = a + b * (Tevap, out - Tcond, in) is typical, other univariate curves may be used + \note Tevap, out = evaporator outlet temperature + \note Tcond, in = condenser inlet temperature + \note If this field is blank the thermosiphon model is disabled. + N11; \field Thermosiphon Minimum Temperature Difference + \type real + \minimum 0.0 + \default 0.0 + \note Thermosiphon model is disabled below this minimum limit and + \note when the load is greater than calculated using the prevoius field. + + HeatPump:PlantLoop:EIR:Heating, \memo An EIR formulated water to water heat pump model, heating operation \min-fields 18 diff --git a/idd/schema/generate_epJSON_schema.py b/idd/schema/generate_epJSON_schema.py index 53e7eb8cc20..f522ebc8952 100644 --- a/idd/schema/generate_epJSON_schema.py +++ b/idd/schema/generate_epJSON_schema.py @@ -98,7 +98,7 @@ def generate_epJSON_schema(source_dir_path: str): p = multiprocessing.Process(target=generate_epJSON_schema, args=(sys.argv[1], )) p.start() - timeout_seconds = 30 + timeout_seconds = 60 p.join(timeout=timeout_seconds) # If thread is still active diff --git a/scripts/dev/verify_signature.py b/scripts/dev/verify_signature.py new file mode 100644 index 00000000000..4edde9aa175 --- /dev/null +++ b/scripts/dev/verify_signature.py @@ -0,0 +1,361 @@ +# EnergyPlus, Copyright (c) 1996-2024, The Board of Trustees of the University +# of Illinois, The Regents of the University of California, through Lawrence +# Berkeley National Laboratory (subject to receipt of any required approvals +# from the U.S. Dept. of Energy), Oak Ridge National Laboratory, managed by UT- +# Battelle, Alliance for Sustainable Energy, LLC, and other contributors. All +# rights reserved. +# +# NOTICE: This Software was developed under funding from the U.S. Department of +# Energy and the U.S. Government consequently retains certain rights. As such, +# the U.S. Government has been granted for itself and others acting on its +# behalf a paid-up, nonexclusive, irrevocable, worldwide license in the +# Software to reproduce, distribute copies to the public, prepare derivative +# works, and perform publicly and display publicly, and to permit others to do +# so. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# (1) Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# (2) Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# (3) Neither the name of the University of California, Lawrence Berkeley +# National Laboratory, the University of Illinois, U.S. Dept. of Energy nor +# the names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in +# stand-alone form without changes from the version obtained under this +# License, or (ii) Licensee makes a reference solely to the software +# portion of its product, Licensee must refer to the software as +# "EnergyPlus version X" software, where "X" is the version number Licensee +# obtained under this License and may not use a different name for the +# software. Except as specifically required in this Section (4), Licensee +# shall not use in a company name, a product name, in advertising, +# publicity, or other promotional activities any name, trade name, +# trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or +# confusingly similar designation, without the U.S. Department of Energy's +# prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +import argparse +import json +import os +import platform +import re +import subprocess +import warnings +from enum import Enum +from pathlib import Path +from typing import List + + +class Generator(Enum): + IFW = 1 + TGZ = 2 + + +BUNDLED_APPS = [ + "PreProcess/EP-Launch-Lite.app", + "PreProcess/IDFVersionUpdater/IDFVersionUpdater.app", + "PostProcess/EP-Compare/EP-Compare.app", +] + + +def get_cmake_install_prefix_for_generator(build_dir: Path, generator: Generator) -> Path: + cpack_dir = build_dir / f"_CPack_Packages/Darwin/{generator.name}" + if not cpack_dir.exists(): + print(f"Could not find a _CPack_Packages directory for {generator.name}") + return None + cmake_install_root = next(x for x in cpack_dir.glob("*") if x.is_dir() and x.suffix != ".app") + + cmake_install_prefix = next(cmake_install_root.glob("**/energyplus-24.2.0")).parent + return cmake_install_prefix + + +def find_executable_files(root_dir: Path) -> List[Path]: + bundled_apps = [root_dir / x for x in BUNDLED_APPS] + + files = list( + [ + x + for x in root_dir.glob("**/*") + if x.is_file() + and not x.is_symlink() + and os.access(x, os.X_OK) + and not any([x.is_relative_to(bundled_p) for bundled_p in bundled_apps]) + ] + ) + + dylibs = list( + [ + x + for x in root_dir.glob("**/*.dylib") + if x.is_file() + and not x.is_symlink() + and not any([x.is_relative_to(bundled_p) for bundled_p in bundled_apps]) + ] + ) + print(f"In {root_dir} found {len(files)} executable files and {len(dylibs)} dylibs") + + files = list(set(files + dylibs)) + + files = sorted(sorted(files), key=lambda x: len(x.parts)) + + return files + + +def verify_signature(p, verbose=False, root_dir=None): + info = subprocess.run(["codesign", "-dvvv", "--strict", str(p)], stderr=subprocess.PIPE, encoding="utf-8").stderr + if "K7JYVQJL7" not in info: + raise ValueError(f"{p} is not codesigned properly") + if verbose: + if root_dir is not None: + p = p.relative_to(root_dir) + print(f"- {p}: signature OK") + + +def compare_executables(): + cmake_ifw_prefix = get_cmake_install_prefix_for_generator(generator=Generator.IFW) + ifw_files = find_executable_files(cmake_ifw_prefix) + ifw_files_rel = [x.relative_to(cmake_ifw_prefix) for x in ifw_files] + cmake_tgz_prefix = get_cmake_install_prefix_for_generator(generator=Generator.TGZ) + tgz_files = find_executable_files(cmake_tgz_prefix) + tgz_files_rel = [x.relative_to(cmake_tgz_prefix) for x in tgz_files] + extra_ifw_files = set(ifw_files_rel) - set(tgz_files_rel) + if extra_ifw_files: + print(f"Extra IFW files: {extra_ifw_files}") + + extra_tgz_files = set(tgz_files_rel) - set(ifw_files_rel) + if extra_tgz_files: + print(f"Extra TGZ files: {extra_tgz_files}") + + +_OTOOL_ARCHITECTURE_RE = re.compile(r"^(?P.*?)(?: \(architecture (?P\w+)\))?:$") + +LINKED_RE = re.compile( + r"(?P.*) \(compatibility version (?P\d+\.\d+\.\d+), " + r"current version (?P\d+\.\d+\.\d+)(?:, \w+)?\)" +) + +RPATH_RE = re.compile(r"path (?P.*) \(offset \d+\)") + +RESOLVED_PATHS = ["@loader_path", "@executable_path", "@rpath"] + + +def get_linked_libraries(p): + linked_libs = [] + lines = subprocess.check_output(["otool", "-L", str(p)], encoding="utf-8", universal_newlines=True).splitlines() + if "is not an object file" in lines[0]: + return None + lines = [x.strip() for x in lines[1:]] + + for line in lines: + if m := LINKED_RE.match(line): + linked_libs.append(m.groupdict()) + else: + raise ValueError(f"For {p}, cannot parse line: '{line}'") + return linked_libs + + +def get_rpath(p): + rpaths = [] + lines = subprocess.check_output(["otool", "-l", str(p)], encoding="utf-8", universal_newlines=True).splitlines() + lines = [x.strip() for x in lines] + for i, line in enumerate(lines): + if line.startswith("cmd LC_RPATH"): + assert lines[i + 1].startswith("cmdsize") + rpath_line = lines[i + 2] + m = RPATH_RE.match(rpath_line) + assert m + rpaths.append(m["rpath"]) + return rpaths + + +def otool(p, verify_resolve=False, verbose=False): + linked_libs = get_linked_libraries(p) + if linked_libs is None: + return None + + rpaths = get_rpath(p) + + if verbose: + print(f"- Otooling {p}") + + first_time = True + rpath_infos = [{"actual": "implicit", "resolved": str(p.parent)}] + for rpath in rpaths: + rpath_dict = {} + rpath_dict["actual"] = rpath + if not rpath.startswith("@"): + rpath_infos.append(rpath_dict) + continue + + if verbose: + if first_time: + print(" * Resolving Rpaths") + first_time = False + print(f" * Trying to resolve rpath '{rpath}'") + rpath_dict["resolved"] = None + resolved_path = rpath + for resolv in RESOLVED_PATHS: + resolved_path = resolved_path.replace(resolv, str(p.parent)) + resolved_path = Path(resolved_path).resolve() + if resolved_path.exists(): + if verbose: + print(f" - Found {resolved_path}") + rpath_dict["resolved"] = str(resolved_path) + elif verify_resolve: + warnings.warn(f"Could not resolve rpath '{rpath}' for '{p}'") + rpath_infos.append(rpath_dict) + + first_time = True + for linked_lib in linked_libs: + libname = linked_lib["libname"] + if not libname.startswith("@"): + continue + + if verbose: + if first_time: + print(" * Resolving Libraries") + first_time = False + print(f" * Trying to resolve library '{libname}'") + linked_lib["resolved"] = None + found = False + for rpath_info in rpath_infos: + rpath = rpath_info.get("resolved", rpath_info["actual"]) + resolved_path = libname + for resolv in RESOLVED_PATHS: + resolved_path = resolved_path.replace(resolv, str(rpath)) + + resolved_path = Path(resolved_path) + if resolved_path.exists(): + if verbose: + print(f" - Found '{resolved_path}'") + linked_lib["resolved"] = str(resolved_path) + found = True + break + if not found and verify_resolve: + raise ValueError(f"Could not resolve '{libname}' for '{p}'") + + info = { + "linked_libraries": linked_libs, + "rpaths": rpath_infos, + } + + if verbose: + print("-" * 80) + + return info + + +if __name__ == "__main__": + + if platform.system() != "Darwin": + raise OSError("Only supported on Darwin") + + parser = argparse.ArgumentParser(description="Verify codesigning on macOS") + parser.add_argument( + "build_dir", + type=Path, + help="Root of the Build directory where CMakeCache.txt can be found (or the install dir if --install is passed)", + ) + parser.add_argument( + "--install", action="store_true", default=False, help="This is an install dir, not the build_dir" + ) + parser.add_argument( + "--verbose", action="store_true", default=False, help="This is an install dir, not the build_dir" + ) + parser.add_argument("--otool", action="store_true", default=False, help="Output OTOOL info on all executables") + parser.add_argument( + "--otool-out-file", metavar="JSON_FILE", required=False, type=Path, help="Output OTOOL info to JSON file" + ) + + args = parser.parse_args() + + if args.otool_out_file and not args.otool: + raise ValueError("--otool-out-file requires --otool") + + build_dir = args.build_dir.resolve() + if not (build_dir.exists() and build_dir.is_dir()): + raise NotADirectoryError(f"{build_dir} is not a valid directory") + + top_level_otool_infos = {} + if args.install: + if not (build_dir / "energyplus").is_file(): + raise ValueError(f"{build_dir} does not contain energyplus exe") + print(f"Checking Install dir {build_dir}") + executable_files = find_executable_files(root_dir=build_dir) + excludes = ["runenergyplus", "runreadvars", "runepmacro", "maintenancetool"] + executable_files = [x for x in executable_files if not any([n in x.name for n in excludes])] + otool_infos = {} + for p in executable_files: + verify_signature(p, verbose=args.verbose, root_dir=build_dir) + if args.otool: + otool_info = otool(p=p, verify_resolve=True, verbose=args.verbose) + if otool_info is not None: + otool_infos[str(p)] = otool_info + print("Everything is signed correctly") + top_level_otool_infos["install_dir"] = otool_infos + else: + if not (build_dir / "CMakeCache.txt").is_file(): + raise ValueError(f"{build_dir} does not contain CMakeCache.txt, did you forget to build?") + + if not (build_dir / "_CPack_Packages").is_dir(): + raise ValueError( + f"{build_dir} does not contain a _CPack_Packages subfolder, did you forget to build the package?" + ) + + for generator in Generator: + print(f"Checking {generator.name} Generator") + cmake_install_prefix = get_cmake_install_prefix_for_generator(build_dir=build_dir, generator=generator) + if cmake_install_prefix is None: + continue + executable_files = find_executable_files(root_dir=cmake_install_prefix) + otool_infos = {} + for p in executable_files: + verify_signature(p, verbose=args.verbose, root_dir=cmake_install_prefix) + if args.otool: + otool_info = otool(p=p, verify_resolve=True, verbose=args.verbose) + if otool_info is not None: + otool_infos[str(p)] = otool_info + print("Everything is signed correctly") + top_level_otool_infos[generator.name] = otool_infos + print("=" * 80) + + if args.otool: + short_otool_infos = {} + for k, otool_infos in top_level_otool_infos.items(): + short_otool_infos[k] = {} + for libpath, otool_info in otool_infos.items(): + short_otool_infos[k][libpath] = [] + for linked_libs in otool_info["linked_libraries"]: + short_otool_infos[k][libpath].append(linked_libs.get("resolved", linked_libs["libname"])) + + print("Shortened & resolved otool info:") + print(json.dumps(short_otool_infos, indent=2)) + + if args.otool_out_file: + otool_out_file = args.otool_out_file.resolve() + otool_out_file.parent.mkdir(parents=True, exist_ok=True) + otool_out_file_short = otool_out_file.parent / f"{otool_out_file.stem}_short.json" + print(f"Saving full otool infos to {otool_out_file} and short version to {otool_out_file_short}") + otool_out_file.unlink(missing_ok=True) + otool_out_file.write_text(json.dumps(top_level_otool_infos, indent=2)) + otool_out_file_short.unlink(missing_ok=True) + otool_out_file_short.write_text(json.dumps(short_otool_infos, indent=2)) diff --git a/src/AppGPostProcess/CMakeLists.txt b/src/AppGPostProcess/CMakeLists.txt index 8082e09aaeb..e1c753ee178 100644 --- a/src/AppGPostProcess/CMakeLists.txt +++ b/src/AppGPostProcess/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0012 NEW) # if() recognizes boolean constants +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. +endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") @@ -28,3 +32,8 @@ if(NOT ${FORTRAN_STATIC_EXE}) include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/ProjectMacros.cmake") install_target_prereqs(AppGPostProcess PostProcess) endif() + +if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target(AppGPostProcess PostProcess) +endif() diff --git a/src/Basement/CMakeLists.txt b/src/Basement/CMakeLists.txt index 34c5edacf75..98285f5ae24 100644 --- a/src/Basement/CMakeLists.txt +++ b/src/Basement/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0012 NEW) # if() recognizes boolean constants +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. +endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") @@ -71,3 +75,8 @@ if(NOT ${FORTRAN_STATIC_EXE}) install_target_prereqs(Basement PreProcess/GrndTempCalc) endif() install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../../idd/BasementGHT.idd" DESTINATION "PreProcess/GrndTempCalc/") + +if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target(Basement PreProcess/GrndTempCalc) +endif() diff --git a/src/CalcSoilSurfTemp/CMakeLists.txt b/src/CalcSoilSurfTemp/CMakeLists.txt index 083fba6532c..657865dadbe 100644 --- a/src/CalcSoilSurfTemp/CMakeLists.txt +++ b/src/CalcSoilSurfTemp/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0012 NEW) # if() recognizes boolean constants +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. +endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") @@ -28,3 +32,8 @@ if(NOT ${FORTRAN_STATIC_EXE}) include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/ProjectMacros.cmake") install_target_prereqs(CalcSoilSurfTemp PreProcess/CalcSoilSurfTemp) endif() + +if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target(CalcSoilSurfTemp PreProcess/CalcSoilSurfTemp) +endif() diff --git a/src/ConvertESOMTR/CMakeLists.txt b/src/ConvertESOMTR/CMakeLists.txt index bef67247a12..2ce1a9c6546 100644 --- a/src/ConvertESOMTR/CMakeLists.txt +++ b/src/ConvertESOMTR/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0012 NEW) # if() recognizes boolean constants +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. +endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") @@ -29,3 +33,8 @@ if(NOT ${FORTRAN_STATIC_EXE}) install_target_prereqs(convertESOMTR "PostProcess/convertESOMTRpgm/") endif() install(FILES "convert.txt" DESTINATION "PostProcess/convertESOMTRpgm/") + +if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target(convertESOMTR "PostProcess/convertESOMTRpgm") +endif() diff --git a/src/ConvertInputFormat/CMakeLists.txt b/src/ConvertInputFormat/CMakeLists.txt index 5db81f7e132..455b75e5e72 100644 --- a/src/ConvertInputFormat/CMakeLists.txt +++ b/src/ConvertInputFormat/CMakeLists.txt @@ -1,4 +1,9 @@ cmake_minimum_required(VERSION 3.5.1) + +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. +endif() + project(ConvertInputFormat) if(APPLE OR UNIX) @@ -29,6 +34,11 @@ set_target_properties(ConvertInputFormat PROPERTIES FOLDER Auxiliary) install(TARGETS ConvertInputFormat DESTINATION ./) +if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target(ConvertInputFormat ".") +endif() + if(BUILD_TESTING) set(TEST_DIR "${PROJECT_BINARY_DIR}/tst") # build/src/ConverInputFormat/tst diff --git a/src/EnergyPlus/CMakeLists.txt b/src/EnergyPlus/CMakeLists.txt index ff4693c57f3..9f4f3565624 100644 --- a/src/EnergyPlus/CMakeLists.txt +++ b/src/EnergyPlus/CMakeLists.txt @@ -1150,3 +1150,9 @@ if(UNIX AND NOT APPLE) ) endif() endif() + +if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target(energyplus ".") + register_install_codesign_target(energyplusapi ".") +endif() diff --git a/src/EnergyPlus/ChillerElectricEIR.cc b/src/EnergyPlus/ChillerElectricEIR.cc index ad6003b6f90..ec812d8029a 100644 --- a/src/EnergyPlus/ChillerElectricEIR.cc +++ b/src/EnergyPlus/ChillerElectricEIR.cc @@ -791,6 +791,15 @@ void GetElectricEIRChillerInput(EnergyPlusData &state) } else { thisChiller.EndUseSubcategory = "General"; } + if (!state.dataIPShortCut->lAlphaFieldBlanks(20)) { + thisChiller.thermosiphonTempCurveIndex = Curve::GetCurveIndex(state, Util::makeUPPER(state.dataIPShortCut->cAlphaArgs(20))); + if (thisChiller.thermosiphonTempCurveIndex == 0) { + ShowSevereError(state, format("{}{}=\"{}\"", RoutineName, state.dataIPShortCut->cCurrentModuleObject, thisChiller.Name)); + ShowContinueError(state, format("Invalid {} = {}", state.dataIPShortCut->cAlphaFieldNames(20), state.dataIPShortCut->cAlphaArgs(20))); + ErrorsFound = true; + } + } + thisChiller.thermosiphonMinTempDiff = state.dataIPShortCut->rNumericArgs(20); } if (ErrorsFound) { @@ -946,6 +955,14 @@ void ElectricEIRChillerSpecs::setupOutputVars(EnergyPlusData &state) OutputProcessor::StoreType::Average, this->Name); + SetupOutputVariable(state, + "Thermosiphon Status", + Constant::Units::None, + this->thermosiphonStatus, + OutputProcessor::TimeStepType::System, + OutputProcessor::StoreType::Average, + this->Name); + // Condenser mass flow and outlet temp are valid for water cooled if (this->CondenserType == DataPlant::CondenserType::WaterCooled) { SetupOutputVariable(state, @@ -1817,6 +1834,7 @@ void ElectricEIRChillerSpecs::calculate(EnergyPlusData &state, Real64 &MyLoad, b this->ChillerCapFT = 0.0; this->ChillerEIRFT = 0.0; this->ChillerEIRFPLR = 0.0; + this->thermosiphonStatus = 0; // calculate end time of current time step CurrentEndTime = state.dataGlobal->CurrentTime + state.dataHVACGlobal->SysTimeElapsed; @@ -1913,6 +1931,7 @@ void ElectricEIRChillerSpecs::calculate(EnergyPlusData &state, Real64 &MyLoad, b // If not air or evap cooled then set to the condenser node that is attached to a cooling tower Real64 condInletTemp = state.dataLoopNodes->Node(this->CondInletNodeNum).Temp; + this->CondInletTemp = condInletTemp; // needed for thermosiphon model // LOAD LOCAL VARIABLES FROM DATA STRUCTURE (for code readability) Real64 ChillerRefCap = this->RefCap; @@ -2337,8 +2356,9 @@ void ElectricEIRChillerSpecs::calculate(EnergyPlusData &state, Real64 &MyLoad, b } this->ChillerEIRFPLR = 0.0; } - - this->Power = (AvailChillerCap / ReferenceCOP) * this->ChillerEIRFPLR * this->ChillerEIRFT * FRAC; + if (this->thermosiphonDisabled(state)) { + this->Power = (AvailChillerCap / ReferenceCOP) * this->ChillerEIRFPLR * this->ChillerEIRFT * FRAC; + } this->QCondenser = this->Power * this->CompPowerToCondenserFrac + this->QEvaporator + this->ChillerFalseLoadRate; @@ -2662,4 +2682,25 @@ void ElectricEIRChillerSpecs::update(EnergyPlusData &state, Real64 const MyLoad, } } +bool ElectricEIRChillerSpecs::thermosiphonDisabled(EnergyPlusData &state) +{ + if (this->thermosiphonTempCurveIndex > 0) { + this->thermosiphonStatus = 0; + Real64 dT = this->EvapOutletTemp - this->CondInletTemp; + if (dT < this->thermosiphonMinTempDiff) { + return true; + } + Real64 thermosiphonCapFrac = Curve::CurveValue(state, this->thermosiphonTempCurveIndex, dT); + Real64 capFrac = this->ChillerPartLoadRatio * this->ChillerCyclingRatio; + if (thermosiphonCapFrac >= capFrac) { + this->thermosiphonStatus = 1; + this->Power = 0.0; + return false; + } + return true; + } else { + return true; + } +} + } // namespace EnergyPlus::ChillerElectricEIR diff --git a/src/EnergyPlus/ChillerElectricEIR.hh b/src/EnergyPlus/ChillerElectricEIR.hh index aaee0a7fc23..7f7891e424c 100644 --- a/src/EnergyPlus/ChillerElectricEIR.hh +++ b/src/EnergyPlus/ChillerElectricEIR.hh @@ -197,6 +197,11 @@ namespace ChillerElectricEIR { bool VSBranchPumpFoundCond = false; bool VSLoopPumpFoundCond = false; + // thermosiphon model + int thermosiphonTempCurveIndex = 0; + Real64 thermosiphonMinTempDiff = 0.0; + int thermosiphonStatus = 0; + static ElectricEIRChillerSpecs *factory(EnergyPlusData &state, std::string const &objectName); void setupOutputVars(EnergyPlusData &state); @@ -234,6 +239,8 @@ namespace ChillerElectricEIR { ); virtual void update(EnergyPlusData &state, Real64 MyLoad, bool RunFlag); + + bool thermosiphonDisabled(EnergyPlusData &state); }; void GetElectricEIRChillerInput(EnergyPlusData &state); diff --git a/src/EnergyPlus/ChillerReformulatedEIR.cc b/src/EnergyPlus/ChillerReformulatedEIR.cc index 8affa19efb2..a7e0e01cc23 100644 --- a/src/EnergyPlus/ChillerReformulatedEIR.cc +++ b/src/EnergyPlus/ChillerReformulatedEIR.cc @@ -671,6 +671,15 @@ void GetElecReformEIRChillerInput(EnergyPlusData &state) if (NumNums > 15) { thisChiller.MinCondFlowRatio = state.dataIPShortCut->rNumericArgs(16); } + if (!state.dataIPShortCut->lAlphaFieldBlanks(19)) { + thisChiller.thermosiphonTempCurveIndex = Curve::GetCurveIndex(state, Util::makeUPPER(state.dataIPShortCut->cAlphaArgs(19))); + if (thisChiller.thermosiphonTempCurveIndex == 0) { + ShowSevereError(state, format("{}{}=\"{}\"", RoutineName, state.dataIPShortCut->cCurrentModuleObject, thisChiller.Name)); + ShowContinueError(state, format("Invalid {} = {}", state.dataIPShortCut->cAlphaFieldNames(19), state.dataIPShortCut->cAlphaArgs(19))); + ErrorsFound = true; + } + } + thisChiller.thermosiphonMinTempDiff = state.dataIPShortCut->rNumericArgs(17); } if (ErrorsFound) { @@ -850,6 +859,14 @@ void ReformulatedEIRChillerSpecs::setupOutputVars(EnergyPlusData &state) OutputProcessor::StoreType::Average, this->Name); + SetupOutputVariable(state, + "Thermosiphon Status", + Constant::Units::None, + this->thermosiphonStatus, + OutputProcessor::TimeStepType::System, + OutputProcessor::StoreType::Average, + this->Name); + // If heat recovery is active then setup report variables if (this->HeatRecActive) { SetupOutputVariable(state, @@ -2074,9 +2091,11 @@ void ReformulatedEIRChillerSpecs::calculate(EnergyPlusData &state, Real64 &MyLoa this->ChillerCapFT = 0.0; this->ChillerEIRFT = 0.0; this->ChillerEIRFPLR = 0.0; + this->thermosiphonStatus = 0; // Set module-level chiller evap and condenser inlet temperature variables Real64 condInletTemp = state.dataLoopNodes->Node(this->CondInletNodeNum).Temp; + this->CondInletTemp = condInletTemp; // needed for thermosiphon model // If no loop demand or chiller OFF, return // If chiller load is 0 or chiller is not running then leave the subroutine. Before leaving @@ -2430,9 +2449,6 @@ void ReformulatedEIRChillerSpecs::calculate(EnergyPlusData &state, Real64 &MyLoa // Chiller cycles below minimum part load ratio, FRAC = amount of time chiller is ON during this time step if (PartLoadRat < this->MinPartLoadRat) FRAC = min(1.0, (PartLoadRat / this->MinPartLoadRat)); - // set the module level variable used for reporting FRAC - this->ChillerCyclingRatio = FRAC; - // Chiller is false loading below PLR = minimum unloading ratio, find PLR used for energy calculation if (AvailChillerCap > 0.0) { PartLoadRat = max(PartLoadRat, this->MinUnloadRat); @@ -2451,6 +2467,9 @@ void ReformulatedEIRChillerSpecs::calculate(EnergyPlusData &state, Real64 &MyLoa } // This is the end of the FlowLock Block + // set the module level variable used for reporting FRAC + this->ChillerCyclingRatio = FRAC; + this->ChillerEIRFT = max(0.0, Curve::CurveValue(state, this->ChillerEIRFTIndex, this->EvapOutletTemp, this->ChillerCondAvgTemp)); // Part Load Ratio Curve Type: 1_LeavingCondenserWaterTemperature; 2_Lift @@ -2479,7 +2498,9 @@ void ReformulatedEIRChillerSpecs::calculate(EnergyPlusData &state, Real64 &MyLoa } if (ReferenceCOP <= 0) ReferenceCOP = 5.5; - this->Power = (AvailChillerCap / ReferenceCOP) * this->ChillerEIRFPLR * this->ChillerEIRFT * FRAC; + if (this->thermosiphonDisabled(state)) { + this->Power = (AvailChillerCap / ReferenceCOP) * this->ChillerEIRFPLR * this->ChillerEIRFT * FRAC; + } this->QCondenser = this->Power * this->CompPowerToCondenserFrac + this->QEvaporator + this->ChillerFalseLoadRate; @@ -2931,4 +2952,25 @@ void ReformulatedEIRChillerSpecs::checkMinMaxCurveBoundaries(EnergyPlusData &sta } } +bool ReformulatedEIRChillerSpecs::thermosiphonDisabled(EnergyPlusData &state) +{ + if (this->thermosiphonTempCurveIndex > 0) { + this->thermosiphonStatus = 0; + Real64 dT = this->EvapOutletTemp - this->CondInletTemp; + if (dT < this->thermosiphonMinTempDiff) { + return true; + } + Real64 thermosiphonCapFrac = Curve::CurveValue(state, this->thermosiphonTempCurveIndex, dT); + Real64 capFrac = this->ChillerPartLoadRatio * this->ChillerCyclingRatio; + if (thermosiphonCapFrac >= capFrac) { + this->thermosiphonStatus = 1; + this->Power = 0.0; + return false; + } + return true; + } else { + return true; + } +} + } // namespace EnergyPlus::ChillerReformulatedEIR diff --git a/src/EnergyPlus/ChillerReformulatedEIR.hh b/src/EnergyPlus/ChillerReformulatedEIR.hh index 8ee3f264ae2..f801cafba7a 100644 --- a/src/EnergyPlus/ChillerReformulatedEIR.hh +++ b/src/EnergyPlus/ChillerReformulatedEIR.hh @@ -221,6 +221,11 @@ namespace ChillerReformulatedEIR { bool VSBranchPumpFoundCond = false; bool VSLoopPumpFoundCond = false; + // thermosiphon model + int thermosiphonTempCurveIndex = 0; + Real64 thermosiphonMinTempDiff = 0.0; + int thermosiphonStatus = 0; + static ReformulatedEIRChillerSpecs *factory(EnergyPlusData &state, std::string const &objectName); void simulate([[maybe_unused]] EnergyPlusData &state, @@ -255,6 +260,8 @@ namespace ChillerReformulatedEIR { void update(EnergyPlusData &state, Real64 MyLoad, bool RunFlag); void checkMinMaxCurveBoundaries(EnergyPlusData &state, bool FirstIteration); + + bool thermosiphonDisabled(EnergyPlusData &state); }; void GetElecReformEIRChillerInput(EnergyPlusData &state); diff --git a/src/EnergyPlus/Fans.cc b/src/EnergyPlus/Fans.cc index 7b2e137eea4..e406c30b18c 100644 --- a/src/EnergyPlus/Fans.cc +++ b/src/EnergyPlus/Fans.cc @@ -1557,6 +1557,7 @@ void FanComponent::set_size(EnergyPlusData &state) OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchFanDeltaP, Name, deltaPress); OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchFanVolFlow, Name, _volFlow); Real64 _ratedPower = _volFlow * deltaPress / totalEff; // total fan power + BaseSizer::reportSizerOutput(state, HVAC::fanTypeNames[(int)type], Name, "Design Electric Power Consumption [W]", _ratedPower); if (type != HVAC::FanType::ComponentModel) { designPointFEI = FanSystem::report_fei(state, _volFlow, _ratedPower, deltaPress); } diff --git a/src/EnergyPlus/PlantChillers.cc b/src/EnergyPlus/PlantChillers.cc index a51e5cbca6c..a884166bc0e 100644 --- a/src/EnergyPlus/PlantChillers.cc +++ b/src/EnergyPlus/PlantChillers.cc @@ -595,12 +595,13 @@ namespace PlantChillers { if (!state.dataIPShortCut->lAlphaFieldBlanks(10)) { thisChiller.BasinHeaterSchedulePtr = ScheduleManager::GetScheduleIndex(state, state.dataIPShortCut->cAlphaArgs(10)); if (thisChiller.BasinHeaterSchedulePtr == 0) { - ShowWarningError(state, - format("{}, \"{}\" TRIM(state.dataIPShortCut->cAlphaFieldNames(10)) \"{}\" was not found. Basin heater " - "operation will not be modeled and the simulation continues", - state.dataIPShortCut->cCurrentModuleObject, - thisChiller.Name, - state.dataIPShortCut->cAlphaArgs(10))); + ShowWarningError( + state, + format("{}, \"{}\" {} \"{}\" was not found. Basin heater operation will not be modeled and the simulation continues", + state.dataIPShortCut->cCurrentModuleObject, + thisChiller.Name, + state.dataIPShortCut->cAlphaFieldNames(10), + state.dataIPShortCut->cAlphaArgs(10))); } } if (NumAlphas > 12) { @@ -608,6 +609,16 @@ namespace PlantChillers { } else { thisChiller.EndUseSubcategory = "General"; } + if (!state.dataIPShortCut->lAlphaFieldBlanks(14)) { + thisChiller.thermosiphonTempCurveIndex = Curve::GetCurveIndex(state, Util::makeUPPER(state.dataIPShortCut->cAlphaArgs(14))); + if (thisChiller.thermosiphonTempCurveIndex == 0) { + ShowSevereError(state, format("{}{}=\"{}\"", RoutineName, state.dataIPShortCut->cCurrentModuleObject, thisChiller.Name)); + ShowContinueError(state, + format("Invalid {} = {}", state.dataIPShortCut->cAlphaFieldNames(14), state.dataIPShortCut->cAlphaArgs(14))); + ErrorsFound = true; + } + } + thisChiller.thermosiphonMinTempDiff = state.dataIPShortCut->rNumericArgs(26); } if (ErrorsFound) { @@ -705,6 +716,13 @@ namespace PlantChillers { OutputProcessor::TimeStepType::System, OutputProcessor::StoreType::Average, this->Name); + SetupOutputVariable(state, + "Thermosiphon Status", + Constant::Units::None, + this->thermosiphonStatus, + OutputProcessor::TimeStepType::System, + OutputProcessor::StoreType::Average, + this->Name); // Condenser mass flow and outlet temp are valid for water cooled if (this->CondenserType == DataPlant::CondenserType::WaterCooled) { @@ -1385,6 +1403,7 @@ namespace PlantChillers { this->EvaporatorEnergy = 0.0; this->QHeatRecovered = 0.0; this->ActualCOP = 0.0; + this->thermosiphonStatus = 0; // calculate end time of current time step Real64 CurrentEndTime = state.dataGlobal->CurrentTime + state.dataHVACGlobal->SysTimeElapsed; @@ -1515,6 +1534,7 @@ namespace PlantChillers { } // End of the Air Cooled/Evap Cooled Logic block Real64 condInletTemp = state.dataLoopNodes->Node(this->CondInletNodeNum).Temp; + this->CondInletTemp = condInletTemp; // needed if thermosiphon model is used // correct inlet temperature if using heat recovery if (this->HeatRecActive) { @@ -1574,6 +1594,7 @@ namespace PlantChillers { } else { OperPartLoadRat = 0.0; } + this->partLoadRatio = OperPartLoadRat; Real64 Cp = FluidProperties::GetSpecificHeatGlycol(state, state.dataPlnt->PlantLoop(this->CWPlantLoc.loopNum).FluidName, @@ -1593,7 +1614,7 @@ namespace PlantChillers { } else { FRAC = 1.0; } - this->Power = FracFullLoadPower * FullLoadPowerRat * AvailChillerCap / this->COP * FRAC; + this->cyclingRatio = FRAC; // Either set the flow to the Constant value or calculate the flow for the variable volume if ((this->FlowMode == DataPlant::FlowMode::Constant) || (this->FlowMode == DataPlant::FlowMode::NotModulated)) { @@ -1656,6 +1677,10 @@ namespace PlantChillers { } // End of Constant Variable Flow If Block + if (this->thermosiphonDisabled(state)) { + this->Power = FracFullLoadPower * FullLoadPowerRat * AvailChillerCap / this->COP * FRAC; + } + // If there is a fault of Chiller SWT Sensor if (this->FaultyChillerSWTFlag && (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing) && (!state.dataGlobal->KickOffSimulation) && (this->EvapMassFlowRate > 0)) { @@ -1791,9 +1816,12 @@ namespace PlantChillers { } else { FRAC = 1.0; } + this->cyclingRatio = FRAC; // Chiller is false loading below PLR = minimum unloading ratio, find PLR used for energy calculation - this->Power = FracFullLoadPower * FullLoadPowerRat * AvailChillerCap / this->COP * FRAC; + if (this->thermosiphonDisabled(state)) { + this->Power = FracFullLoadPower * FullLoadPowerRat * AvailChillerCap / this->COP * FRAC; + } if (this->EvapMassFlowRate == 0.0) { this->QEvaporator = 0.0; @@ -2120,6 +2148,26 @@ namespace PlantChillers { this->MyFlag = false; } } + bool ElectricChillerSpecs::thermosiphonDisabled(EnergyPlusData &state) + { + if (this->thermosiphonTempCurveIndex > 0) { + this->thermosiphonStatus = 0; + Real64 dT = this->EvapOutletTemp - this->CondInletTemp; + if (dT < this->thermosiphonMinTempDiff) { + return true; + } + Real64 thermosiphonCapFrac = Curve::CurveValue(state, this->thermosiphonTempCurveIndex, dT); + Real64 capFrac = this->partLoadRatio * this->cyclingRatio; + if (thermosiphonCapFrac >= capFrac) { + this->thermosiphonStatus = 1; + this->Power = 0.0; + return false; + } + return true; + } else { + return true; + } + } EngineDrivenChillerSpecs *EngineDrivenChillerSpecs::factory(EnergyPlusData &state, std::string const &chillerName) { @@ -6503,6 +6551,17 @@ namespace PlantChillers { } } + if (!state.dataIPShortCut->lAlphaFieldBlanks(9)) { + thisChiller.thermosiphonTempCurveIndex = Curve::GetCurveIndex(state, Util::makeUPPER(state.dataIPShortCut->cAlphaArgs(9))); + if (thisChiller.thermosiphonTempCurveIndex == 0) { + ShowSevereError(state, format("{}{}=\"{}\"", RoutineName, state.dataIPShortCut->cCurrentModuleObject, thisChiller.Name)); + ShowContinueError(state, + format("Invalid {} = {}", state.dataIPShortCut->cAlphaFieldNames(9), state.dataIPShortCut->cAlphaArgs(9))); + ErrorsFound = true; + } + } + thisChiller.thermosiphonMinTempDiff = state.dataIPShortCut->rNumericArgs(8); + // set default design condenser in and evaporator out temperatures // Values from AHRI Standard 550/590 (2023, IP Version) thisChiller.TempDesEvapOut = 6.67; // Degree Celsius, or 44 Degree Fahrenheit @@ -6612,6 +6671,14 @@ namespace PlantChillers { OutputProcessor::StoreType::Average, this->Name); + SetupOutputVariable(state, + "Thermosiphon Status", + Constant::Units::None, + this->thermosiphonStatus, + OutputProcessor::TimeStepType::System, + OutputProcessor::StoreType::Average, + this->Name); + // Condenser mass flow and outlet temp are valid for water cooled if (this->CondenserType == DataPlant::CondenserType::WaterCooled) { SetupOutputVariable(state, @@ -6735,6 +6802,10 @@ namespace PlantChillers { Real64 mdot = 0.0; Real64 mdotCond = 0.0; + this->thermosiphonStatus = 0; + this->partLoadRatio = 0.0; + this->CondInletTemp = state.dataLoopNodes->Node(this->CondInletNodeNum).Temp; + this->EvapInletTemp = state.dataLoopNodes->Node(this->EvapInletNodeNum).Temp; if ((MyLoad < 0.0) && RunFlag) { mdot = this->EvapMassFlowRateMax; mdotCond = this->CondMassFlowRateMax; @@ -7078,6 +7149,7 @@ namespace PlantChillers { Real64 TempEvapOutSetPoint(0.0); // C - evaporator outlet temperature setpoint Real64 COP = this->COP; // coefficient of performance Real64 ChillerNomCap = this->NomCap; // chiller nominal capacity + this->Power = 0.0; // If there is a fault of chiller fouling if (this->FaultyChillerFoulingFlag && (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing) && @@ -7171,6 +7243,7 @@ namespace PlantChillers { this->PrintMessage = false; return; } + this->partLoadRatio = std::abs(MyLoad) / ChillerNomCap; // calculate end time of current time step Real64 const CurrentEndTime = state.dataGlobal->CurrentTime + state.dataHVACGlobal->SysTimeElapsed; @@ -7256,7 +7329,6 @@ namespace PlantChillers { if (state.dataPlnt->PlantLoop(this->CWPlantLoc.loopNum).LoopSide(this->CWPlantLoc.loopSideNum).FlowLock == DataPlant::FlowLock::Unlocked) { this->PossibleSubcooling = false; this->QEvaporator = std::abs(MyLoad); - this->Power = std::abs(MyLoad) / COP; // Either set the flow to the Constant value or caluclate the flow for the variable volume if ((this->FlowMode == DataPlant::FlowMode::Constant) || (this->FlowMode == DataPlant::FlowMode::NotModulated)) { @@ -7312,6 +7384,9 @@ namespace PlantChillers { this->EvapOutletTemp = state.dataLoopNodes->Node(this->EvapInletNodeNum).Temp; } } // End of Constant or Variable Flow If Block for FlowLock = 0 (or making a flow request) + if (this->thermosiphonDisabled(state)) { + this->Power = std::abs(MyLoad) / COP; + } // If there is a fault of Chiller SWT Sensor if (this->FaultyChillerSWTFlag && (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing) && @@ -7413,13 +7488,16 @@ namespace PlantChillers { this->EvapOutletTemp = state.dataLoopNodes->Node(this->EvapInletNodeNum).Temp; } } - // Calculate the Power consumption of the Const COP chiller which is a simplified calculation - this->Power = this->QEvaporator / COP; if (this->EvapMassFlowRate == 0.0) { this->QEvaporator = 0.0; this->EvapOutletTemp = state.dataLoopNodes->Node(this->EvapInletNodeNum).Temp; this->Power = 0.0; this->PrintMessage = false; + } else { + // Calculate the Power consumption of the Const COP chiller which is a simplified calculation + if (this->thermosiphonDisabled(state)) { + this->Power = this->QEvaporator / COP; + } } if (this->QEvaporator == 0.0 && this->CondenserType == DataPlant::CondenserType::EvapCooled) { CalcBasinHeaterPower( @@ -7497,22 +7575,18 @@ namespace PlantChillers { this->Energy = 0.0; this->EvaporatorEnergy = 0.0; this->CondenserEnergy = 0.0; - this->CondInletTemp = state.dataLoopNodes->Node(this->CondInletNodeNum).Temp; - this->EvapInletTemp = state.dataLoopNodes->Node(this->EvapInletNodeNum).Temp; - this->CondOutletTemp = state.dataLoopNodes->Node(this->CondInletNodeNum).Temp; - this->EvapOutletTemp = state.dataLoopNodes->Node(this->EvapInletNodeNum).Temp; + this->CondOutletTemp = this->CondInletTemp; + this->EvapOutletTemp = this->EvapInletTemp; this->ActualCOP = 0.0; if (this->CondenserType == DataPlant::CondenserType::EvapCooled) { this->BasinHeaterConsumption = this->BasinHeaterPower * ReportingConstant; } // set outlet node temperatures - state.dataLoopNodes->Node(this->EvapOutletNodeNum).Temp = state.dataLoopNodes->Node(this->EvapInletNodeNum).Temp; - state.dataLoopNodes->Node(this->CondOutletNodeNum).Temp = state.dataLoopNodes->Node(this->CondInletNodeNum).Temp; + state.dataLoopNodes->Node(this->EvapOutletNodeNum).Temp = this->EvapInletTemp; + state.dataLoopNodes->Node(this->CondOutletNodeNum).Temp = this->CondInletTemp; } else { - this->CondInletTemp = state.dataLoopNodes->Node(this->CondInletNodeNum).Temp; - this->EvapInletTemp = state.dataLoopNodes->Node(this->EvapInletNodeNum).Temp; if (this->Power != 0.0) { this->ActualCOP = this->QEvaporator / this->Power; } else { @@ -7596,6 +7670,27 @@ namespace PlantChillers { } } + bool ConstCOPChillerSpecs::thermosiphonDisabled(EnergyPlusData &state) + { + if (this->thermosiphonTempCurveIndex > 0) { + this->thermosiphonStatus = 0; + Real64 dT = this->EvapOutletTemp - this->CondInletTemp; + if (dT < this->thermosiphonMinTempDiff) { + return true; + } + Real64 thermosiphonCapFrac = Curve::CurveValue(state, this->thermosiphonTempCurveIndex, dT); + Real64 capFrac = this->partLoadRatio * this->cyclingRatio; + if (thermosiphonCapFrac >= capFrac) { + this->thermosiphonStatus = 1; + this->Power = 0.0; + return false; + } + return true; + } else { + return true; + } + } + } // namespace PlantChillers } // namespace EnergyPlus diff --git a/src/EnergyPlus/PlantChillers.hh b/src/EnergyPlus/PlantChillers.hh index 187518f7696..a67380b0711 100644 --- a/src/EnergyPlus/PlantChillers.hh +++ b/src/EnergyPlus/PlantChillers.hh @@ -214,6 +214,13 @@ namespace PlantChillers { Real64 HeatRecInletTemp; // (HeatRecOutletTemp is in base already) Real64 HeatRecMdot; Real64 ChillerCondAvgTemp; // the effective condenser temperature for chiller performance [C] + Real64 partLoadRatio = 0.0; + Real64 cyclingRatio = 0.0; + + // thermosiphon model + int thermosiphonTempCurveIndex = 0; + Real64 thermosiphonMinTempDiff = 0.0; + int thermosiphonStatus = 0; // Default Constructor ElectricChillerSpecs() @@ -260,12 +267,14 @@ namespace PlantChillers { ); void oneTimeInit(EnergyPlusData &state) override; + + bool thermosiphonDisabled(EnergyPlusData &state); }; struct EngineDrivenChillerSpecs : BaseChillerSpecs { // temperature at the chiller evaporator side outlet - Constant::eFuel FuelType; + Constant::eFuel FuelType = Constant::eFuel::Invalid; Array1D CapRatCoef; // (EngineDriven RCAVC() ) coeff of cap ratio poly fit Array1D PowerRatCoef; // (EngineDriven ADJEC() ) coeff of power rat poly fit Array1D FullLoadCoef; // (EngineDriven RPWRC() ) coeff of full load poly. fit @@ -363,7 +372,7 @@ namespace PlantChillers { struct GTChillerSpecs : BaseChillerSpecs { // Members - Constant::eFuel FuelType; + Constant::eFuel FuelType = Constant::eFuel::Invalid; Array1D CapRatCoef; // (GT RCAVC() ) coeff of cap ratio poly fit Array1D PowerRatCoef; // (GT ADJEC() ) coeff of power rat poly fit Array1D FullLoadCoef; // (GT RPWRC() ) coeff of full load poly. fit @@ -455,6 +464,13 @@ namespace PlantChillers { { // Members Real64 ActualCOP; + Real64 partLoadRatio = 0.0; + Real64 cyclingRatio = 1.0; + + // thermosiphon model + int thermosiphonTempCurveIndex = 0; + Real64 thermosiphonMinTempDiff = 0.0; + int thermosiphonStatus = 0; // Default Constructor ConstCOPChillerSpecs() : ActualCOP(0.0) @@ -482,6 +498,8 @@ namespace PlantChillers { void update(EnergyPlusData &state, Real64 MyLoad, bool RunFlag); void oneTimeInit(EnergyPlusData &state) override; + + bool thermosiphonDisabled(EnergyPlusData &state); }; } // namespace PlantChillers diff --git a/src/EnergyPlus/PlantLoopHeatPumpEIR.cc b/src/EnergyPlus/PlantLoopHeatPumpEIR.cc index 9eff1c9a64f..b7bce4dd37f 100644 --- a/src/EnergyPlus/PlantLoopHeatPumpEIR.cc +++ b/src/EnergyPlus/PlantLoopHeatPumpEIR.cc @@ -221,6 +221,7 @@ void EIRPlantLoopHeatPump::resetReportingVariables() this->heatRecoveryOutletTemp = this->heatRecoveryInletTemp; this->heatRecoveryIsActive = false; this->heatRecoveryOperatingStatus = 0; + this->thermosiphonStatus = 0; } void EIRPlantLoopHeatPump::setOperatingFlowRatesWSHP(EnergyPlusData &state, bool FirstHVACIteration) @@ -486,13 +487,18 @@ void EIRPlantLoopHeatPump::calcAvailableCapacity(EnergyPlusData &state, Real64 c } } if (this->heatRecoveryHeatPump) { + this->calcLoadSideHeatTransfer(state, availableCapacity); + this->calcPowerUsage(state); + Real64 sourceSideHeatTransfer = this->calcQsource(availableCapacity * partLoadRatio, this->powerUsage); // check to see if souce side outlet temp exceeds limit and reduce PLR if necessary auto &thisSourcePlantLoop = state.dataPlnt->PlantLoop(this->sourceSidePlantLoc.loopNum); - Real64 const CpSrc = FluidProperties::GetSpecificHeatGlycol( - state, thisSourcePlantLoop.FluidName, this->sourceSideInletTemp, thisSourcePlantLoop.FluidIndex, "EIRPlantLoopHeatPump::doPhysics()"); + Real64 const CpSrc = FluidProperties::GetSpecificHeatGlycol(state, + thisSourcePlantLoop.FluidName, + this->sourceSideInletTemp, + thisSourcePlantLoop.FluidIndex, + "EIRPlantLoopHeatPump::calcLoadSideHeatTransfer()"); Real64 const sourceMCp = this->sourceSideMassFlowRate * CpSrc; - Real64 const tempSourceOutletTemp = - this->calcSourceOutletTemp(this->sourceSideInletTemp, (availableCapacity * partLoadRatio) / sourceMCp); + Real64 const tempSourceOutletTemp = this->calcSourceOutletTemp(this->sourceSideInletTemp, sourceSideHeatTransfer / sourceMCp); if (this->EIRHPType == DataPlant::PlantEquipmentType::HeatPumpEIRHeating && tempSourceOutletTemp < this->minSourceTempLimit) { partLoadRatio *= (this->sourceSideInletTemp - this->minSourceTempLimit) / (this->sourceSideInletTemp - tempSourceOutletTemp); } else if (tempSourceOutletTemp > this->maxSourceTempLimit) { @@ -598,8 +604,10 @@ void EIRPlantLoopHeatPump::calcPowerUsage(EnergyPlusData &state) this->eirModFPLRCurveCheck(state, eirModifierFuncPLR); // compute power usage - this->powerUsage = (this->loadSideHeatTransfer / this->referenceCOP) * eirModifierFuncPLR * eirModifierFuncTemp * this->defrostPowerMultiplier * - this->cyclingRatio; + if (this->thermosiphonDisabled(state)) { + this->powerUsage = (this->loadSideHeatTransfer / this->referenceCOP) * eirModifierFuncPLR * eirModifierFuncTemp * + this->defrostPowerMultiplier * this->cyclingRatio; + } } void EIRPlantLoopHeatPump::calcSourceSideHeatTransferWSHP(EnergyPlusData &state) @@ -1806,6 +1814,23 @@ void EIRPlantLoopHeatPump::processInputForEIRPLHP(EnergyPlusData &state) thisPLHP.maxSupplyWaterTempCurveIndex = Curve::GetCurveIndex(state, Util::makeUPPER(maximumSupplyWaterTempCurveName.value().get())); } + // fields only in cooling object + if (thisPLHP.EIRHPType == DataPlant::PlantEquipmentType::HeatPumpEIRCooling) { + auto const thermosiphonTempCurveName = fields.find("thermosiphon_capacity_fraction_curve_name"); + if (thermosiphonTempCurveName != fields.end()) { + thisPLHP.thermosiphonTempCurveIndex = + Curve::GetCurveIndex(state, Util::makeUPPER(thermosiphonTempCurveName.value().get())); + if (thisPLHP.thermosiphonTempCurveIndex == 0) { + ShowSevereError(state, format("{} =\"{}\"", state.dataIPShortCut->cCurrentModuleObject, thisPLHP.name)); + ShowContinueError(state, + format("Invalid Thermosiphon Capacity Fraction Curve Name = {}", + thermosiphonTempCurveName.value().get())); + errorsFound = true; + } + } + thisPLHP.thermosiphonMinTempDiff = state.dataInputProcessing->inputProcessor->getRealFieldValue( + fields, schemaProps, "thermosiphon_minimum_temperature_difference"); + } std::string flowControlTypeName = Util::makeUPPER(state.dataInputProcessing->inputProcessor->getAlphaFieldValue(fields, schemaProps, "flow_mode")); @@ -2220,6 +2245,13 @@ void EIRPlantLoopHeatPump::oneTimeInit(EnergyPlusData &state) OutputProcessor::Group::Plant, OutputProcessor::EndUseCat::Cooling, "Heat Pump"); + SetupOutputVariable(state, + "Thermosiphon Status", + Constant::Units::None, + this->thermosiphonStatus, + OutputProcessor::TimeStepType::System, + OutputProcessor::StoreType::Average, + this->name); } else if (this->EIRHPType == DataPlant::PlantEquipmentType::HeatPumpEIRHeating) { // energy from HeatPump:PlantLoop:EIR:Heating object SetupOutputVariable(state, "Heat Pump Electricity Energy", @@ -2443,6 +2475,27 @@ void EIRPlantLoopHeatPump::oneTimeInit(EnergyPlusData &state) } } +bool EIRPlantLoopHeatPump::thermosiphonDisabled(EnergyPlusData &state) +{ + if (this->thermosiphonTempCurveIndex > 0) { + this->thermosiphonStatus = 0; + Real64 dT = this->loadSideOutletTemp - this->sourceSideInletTemp; + if (dT < this->thermosiphonMinTempDiff) { + return true; + } + Real64 thermosiphonCapFrac = Curve::CurveValue(state, this->thermosiphonTempCurveIndex, dT); + Real64 capFrac = this->partLoadRatio * this->cyclingRatio; + if (thermosiphonCapFrac >= capFrac) { + this->thermosiphonStatus = 1; + this->powerUsage = 0.0; + return false; + } + return true; + } else { + return true; + } +} + void EIRPlantLoopHeatPump::report(EnergyPlusData &state) { diff --git a/src/EnergyPlus/PlantLoopHeatPumpEIR.hh b/src/EnergyPlus/PlantLoopHeatPumpEIR.hh index 84c14f58a9c..6995689dec3 100644 --- a/src/EnergyPlus/PlantLoopHeatPumpEIR.hh +++ b/src/EnergyPlus/PlantLoopHeatPumpEIR.hh @@ -227,6 +227,11 @@ namespace EIRPlantLoopHeatPumps { Real64 maxOutdoorTemperatureDefrost = 0.0; Real64 defrostPowerMultiplier = 1.0; // defrost power adjustment factor + // thermosiphon model + int thermosiphonTempCurveIndex = 0; + Real64 thermosiphonMinTempDiff = 0.0; + int thermosiphonStatus = 0; + // a couple worker functions to easily allow merging of cooling and heating operations std::function calcLoadOutletTemp; std::function calcQsource; @@ -324,6 +329,8 @@ namespace EIRPlantLoopHeatPumps { void isPlantInletOrOutlet(EnergyPlusData &state); void oneTimeInit(EnergyPlusData &state) override; + + bool thermosiphonDisabled(EnergyPlusData &state); }; struct EIRFuelFiredHeatPump : public EIRPlantLoopHeatPump diff --git a/src/ExpandObjects/CMakeLists.txt b/src/ExpandObjects/CMakeLists.txt index b3045d0fe2d..11e16e191d2 100644 --- a/src/ExpandObjects/CMakeLists.txt +++ b/src/ExpandObjects/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0012 NEW) # if() recognizes boolean constants +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. +endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") @@ -34,3 +38,8 @@ if(NOT ${FORTRAN_STATIC_EXE}) include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/ProjectMacros.cmake") install_target_prereqs(ExpandObjects "./") endif() + +if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target(ExpandObjects ".") +endif() diff --git a/src/HVAC-Diagram/CMakeLists.txt b/src/HVAC-Diagram/CMakeLists.txt index dc4e813b076..1ffd0655758 100644 --- a/src/HVAC-Diagram/CMakeLists.txt +++ b/src/HVAC-Diagram/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0012 NEW) # if() recognizes boolean constants +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. +endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") @@ -32,3 +36,8 @@ if(NOT ${FORTRAN_STATIC_EXE}) include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/ProjectMacros.cmake") install_target_prereqs(HVAC-Diagram PostProcess) endif() + +if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target(HVAC-Diagram PostProcess) +endif() diff --git a/src/ParametricPreprocessor/CMakeLists.txt b/src/ParametricPreprocessor/CMakeLists.txt index 52283ffbbba..321b655e2fd 100644 --- a/src/ParametricPreprocessor/CMakeLists.txt +++ b/src/ParametricPreprocessor/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0012 NEW) # if() recognizes boolean constants +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. +endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") @@ -28,3 +32,8 @@ if(NOT ${FORTRAN_STATIC_EXE}) include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/ProjectMacros.cmake") install_target_prereqs(ParametricPreprocessor PreProcess/ParametricPreprocessor) endif() + +if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target(ParametricPreprocessor PreProcess/ParametricPreprocessor) +endif() diff --git a/src/ReadVars/CMakeLists.txt b/src/ReadVars/CMakeLists.txt index 81be6b3973c..7441395ed05 100644 --- a/src/ReadVars/CMakeLists.txt +++ b/src/ReadVars/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0012 NEW) # if() recognizes boolean constants +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. +endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") @@ -28,3 +32,8 @@ if(NOT ${FORTRAN_STATIC_EXE}) include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/ProjectMacros.cmake") install_target_prereqs(ReadVarsESO PostProcess) endif() + +if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target(ReadVarsESO PostProcess) +endif() diff --git a/src/Slab/CMakeLists.txt b/src/Slab/CMakeLists.txt index e5ef6bb0f74..2e3189d6952 100644 --- a/src/Slab/CMakeLists.txt +++ b/src/Slab/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0012 NEW) # if() recognizes boolean constants +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. +endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") @@ -46,3 +50,8 @@ if(NOT ${FORTRAN_STATIC_EXE}) install_target_prereqs(Slab PreProcess/GrndTempCalc) endif() install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../../idd/SlabGHT.idd" DESTINATION "PreProcess/GrndTempCalc/") + +if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target(Slab PreProcess/GrndTempCalc) +endif() diff --git a/src/Transition/CMakeLists.txt b/src/Transition/CMakeLists.txt index c93beec1a38..ea09f45ef64 100644 --- a/src/Transition/CMakeLists.txt +++ b/src/Transition/CMakeLists.txt @@ -4,6 +4,10 @@ cmake_minimum_required(VERSION 3.5.1) cmake_policy(SET CMP0012 NEW) # if() recognizes boolean constants +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) # install(CODE) and install(SCRIPT) support generator expressions. +endif() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../Products") @@ -74,6 +78,11 @@ foreach(i RANGE 1 ${end}) if(NOT ${FORTRAN_STATIC_EXE}) install_target_prereqs("${LAST_NAME}" PreProcess/IDFVersionUpdater) endif() + + if(APPLE AND CPACK_CODESIGNING_DEVELOPPER_ID_APPLICATION) + include("${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CodeSigning.cmake") + register_install_codesign_target("${LAST_NAME}" PreProcess/IDFVersionUpdater) + endif() endif() endforeach() diff --git a/testfiles/CMakeLists.txt b/testfiles/CMakeLists.txt index 032b420d1f1..19f20cb9cfd 100644 --- a/testfiles/CMakeLists.txt +++ b/testfiles/CMakeLists.txt @@ -320,6 +320,7 @@ add_simulation_test(IDF_FILE FluidCooler.idf EPW_FILE USA_IL_Chicago-OHare.Intl. add_simulation_test(IDF_FILE FluidCoolerTwoSpeed.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) add_simulation_test(IDF_FILE FourPipeBeamLargeOffice.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) add_simulation_test(IDF_FILE FreeCoolingChiller.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) +add_simulation_test(IDF_FILE FreeCoolingChiller_wWaterSideEconomizer.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) add_simulation_test(IDF_FILE Furnace.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) add_simulation_test(IDF_FILE FurnaceFuelOil.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) add_simulation_test(IDF_FILE FurnacePLRHeatingCoil.idf EPW_FILE USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.epw) diff --git a/testfiles/FreeCoolingChiller_wWaterSideEconomizer.idf b/testfiles/FreeCoolingChiller_wWaterSideEconomizer.idf new file mode 100644 index 00000000000..9d00d4baf99 --- /dev/null +++ b/testfiles/FreeCoolingChiller_wWaterSideEconomizer.idf @@ -0,0 +1,2587 @@ +! FreeCoolingChiller_wWaterSideEconomizer.idf +! Basic file description: 1 story building divided into 3 interior conditioned zones. Roof with no plenum. +! No ground contact with floor. Outdoor air is modulated based on occupancy and floor area. +! +! Highlights: The cooling plant of this three zone building uses a constant COP +! chiller in series with a HeatExchanger:FluidToFluid water side economizer. +! +! +! Simulation Location/Run: CHICAGO_IL_USA TMY2-94846, 1 design days, 2 run periods, +! Run Control executes the design days only. +! +! Location: Chicago, IL +! +! Design Days: CHICAGO_IL_USA Annual Cooling 1% Design Conditions, MaxDB= 31.5°C MCWB= 23.0°C +! CHICAGO_IL_USA Annual Cooling (DB=>MWB) 2%, MaxDB=29.9°C MWB=22.1°C +! +! Run Period (Weather File): Winter 1/14, Summer 7/7, CHICAGO_IL_USA TMY2-94846 +! +! Run Control: No zone or system sizing, design day simulation. +! +! Building: Single floor rectangular L-shaped building 40 ft south wall, 40 ft west wall, zone height 10 feet. +! There is a single window in West Zone's south wall. The walls are 1 in stucco over 4 in common brick +! and gypboard. The roof is a built up roof with 1/2 in stone over 3/8 in felt over 1 in dense insulation +! supported by 2 in heavy weight concrete. The window is single pane 3mm clear. +! The window to wall ratio is approximately 0.07. +! +! The building is oriented due north. +! +! Floor Area: 130.1 m2 (1403 ft2) +! Number of Stories: 1 +! +! Zone Description Details: +! +! (0,12.192,0) (9.144,12.192,0) +! ________________________________ +! | | +! | | +! | | +! | | +! | North | +! | | +! | | +! | (6.096,6.096,0) | +! |________________________________|____________ (12.192,6.069,0) +! | (0,6.096,0) | (9.144,6.096,0) | +! | | | +! | | | +! | | | +! | West | East | window = * +! | | | +! | | | +! | | | +! |___**************___|________________________| +! +! (0,0,0) (6.069,0,0) (12.192,0,0) +! +! Internal gains description: ZONE West - lighting is 0 watts, equip is 2928.751 watts, 3 occupants +! Internal gains description: ZONE North - lighting is 878.6252 watts, equip is 2928.751 watts, 4 occupants +! Internal gains description: ZONE East - lighting is 1464.375 watts, equip is 1464.375 watts, 3 occupants +! +! Interzone Surfaces: 3 interzone surfaces (see diagram) +! Internal Mass: None +! People: 10 +! Lights: 2343 W +! Equipment: 7323 W +! Windows: 1 +! Detached Shading: None +! Daylight: None +! Natural Ventilation: None +! Compact Schedules: Yes +! Solair Distribution: FullInteriorAndExterior +! +! HVAC: 3 zone terminal reheat system using single constant volume air loop. Central chilled +! water coil scheduled to provide 16 C winter and 13 C summer supply air temperature. +! Terminal reheat coils trim supply air temperature to meet zone thermostat set point. +! Thermostat setting at 20 C in winter with 15 C set back temperature, 24 C in summer +! with 30 C set back temperature. Cooling coil off in winter, reheat coil on all year. +! +! The cooling plant of this three zone building uses a constant COP +! chiller in series with a free cooling heat exchanger. +! There are 2 single-speed cooling towers in series. +! The condenser loop is coupled to the chilled water loop +! through the heat exchanger. The free cooling heat exchanger +! controls to a condenser loop temperature setpoint. Any setpoint schedule +! can be used but in this example it is the chilled water loop setpoint schedule. +! In this case the loops become coupled when there is water available +! in the condenser loop that is at or below the chilled water loop +! setpoint temperature (10degC). +! +! Zonal Equipment: AirTerminal:SingleDuct:ConstantVolume:Reheat +! Central Air Handling Equipment: Yes +! System Equipment Autosize: No (chilled water, condenser, and hot water loop volumes are autosized) +! Purchased Cooling: No +! Purchased Heating: No +! Purchased Chilled Water: Yes (only used if alternate priority control equipment list is selected) +! Purchased Hot Water: Yes +! Coils: Coil:Cooling:Water:DetailedGeometry +! Pumps: Pump:VariableSpeed +! Boilers: None +! Chillers: HeatExchanger:FluidToFluid +! Chiller:ConstantCOP +! Towers: CoolingTower:SingleSpeed +! +! Results: +! Standard Reports: None +! Timestep or Hourly Variables: Timestep +! Time bins Report: None +! HTML Report: None +! Environmental Emissions: None +! Utility Tariffs: None + + Version,24.2; + + Timestep,6; + + Building, + NONE, !- Name + 0.0000000E+00, !- North Axis {deg} + Suburbs, !- Terrain + 3.9999999E-02, !- Loads Convergence Tolerance Value {W} + 0.4000000, !- Temperature Convergence Tolerance Value {deltaC} + FullInteriorAndExterior, !- Solar Distribution + 25, !- Maximum Number of Warmup Days + 6; !- Minimum Number of Warmup Days + + HeatBalanceAlgorithm,ConductionTransferFunction; + + ConvergenceLimits, + 1, !- Minimum System Timestep {minutes} + 30, !- Maximum HVAC Iterations + 6, !- Minimum Plant Iterations + 10; !- Maximum Plant Iterations + + SurfaceConvectionAlgorithm:Inside,TARP; + + SurfaceConvectionAlgorithm:Outside,DOE-2; + + SimulationControl, + Yes, !- Do Zone Sizing Calculation + Yes, !- Do System Sizing Calculation + Yes, !- Do Plant Sizing Calculation + Yes, !- Run Simulation for Sizing Periods + Yes, !- Run Simulation for Weather File Run Periods + Yes, !- Do HVAC Sizing Simulation for Sizing Periods + 2; !- Maximum Number of HVAC Sizing Simulation Passes + + RunPeriod, + Run Period 1, !- Name + 4, !- Begin Month + 1, !- Begin Day of Month + , !- Begin Year + 4, !- End Month + 15, !- End Day of Month + , !- End Year + Tuesday, !- 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 + No; !- Use Weather File Snow Indicators + + Site:Location, + CHICAGO_IL_USA TMY2-94846, !- Name + 42.00, !- Latitude {deg} + -87.88, !- Longitude {deg} + -6.00, !- Time Zone {hr} + 190.00; !- Elevation {m} + + ! CHICAGO_IL_USA Annual Heating Design Conditions Wind Speed=4.9m/s Wind Dir=270 + ! Coldest Month=January + ! CHICAGO_IL_USA Annual Heating 99.6%, MaxDB=-20.6°C + + SizingPeriod:DesignDay, + CHICAGO Ann Htg 99.6% Condns DB, !- Name + 1, !- Month + 21, !- Day of Month + WinterDesignDay, !- Day Type + -20.6, !- Maximum Dry-Bulb Temperature {C} + 0.0, !- Daily Dry-Bulb Temperature Range {deltaC} + , !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + -20.6, !- 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} + 99063., !- Barometric Pressure {Pa} + 4.9, !- Wind Speed {m/s} + 270, !- 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.00; !- Sky Clearness + + ! CHICAGO_IL_USA Annual Cooling 1% Design Conditions, MaxDB= 31.5°C MCWB= 23.0°C + + SizingPeriod:DesignDay, + CHICAGO_IL_USA Annual Cooling 1% Design Conditions DB/MCWB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay, !- Day Type + 31.5, !- Maximum Dry-Bulb Temperature {C} + 10.7, !- Daily Dry-Bulb Temperature Range {deltaC} + , !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 23.0, !- 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} + 99063., !- Barometric Pressure {Pa} + 5.3, !- Wind Speed {m/s} + 230, !- 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} + 1.0; !- Sky Clearness + + ! CHICAGO_IL_USA Annual Cooling (DB=>MWB) 2%, MaxDB=29.9°C MWB=22.1°C + + SizingPeriod:DesignDay, + CHICAGO Ann Clg 2% Condns DB=>MWB, !- Name + 7, !- Month + 22, !- Day of Month + SummerDesignDay, !- Day Type + 29.9, !- Maximum Dry-Bulb Temperature {C} + 10.7, !- Daily Dry-Bulb Temperature Range {deltaC} + , !- 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} + 99063., !- Barometric Pressure {Pa} + 5.3, !- Wind Speed {m/s} + 230, !- 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} + 1.00; !- Sky Clearness + + Material, + A1 - 1 IN STUCCO, !- Name + Smooth, !- Roughness + 2.5389841E-02, !- Thickness {m} + 0.6918309, !- Conductivity {W/m-K} + 1858.142, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.9200000, !- Solar Absorptance + 0.9200000; !- Visible Absorptance + + Material, + C4 - 4 IN COMMON BRICK, !- Name + Rough, !- Roughness + 0.1014984, !- Thickness {m} + 0.7264224, !- Conductivity {W/m-K} + 1922.216, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.7600000, !- Solar Absorptance + 0.7600000; !- Visible Absorptance + + Material, + E1 - 3 / 4 IN PLASTER OR GYP BOARD, !- Name + Smooth, !- Roughness + 1.9050000E-02, !- Thickness {m} + 0.7264224, !- Conductivity {W/m-K} + 1601.846, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.9200000, !- Solar Absorptance + 0.9200000; !- Visible Absorptance + + Material, + C6 - 8 IN CLAY TILE, !- Name + Smooth, !- Roughness + 0.2033016, !- Thickness {m} + 0.5707605, !- Conductivity {W/m-K} + 1121.292, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.8200000, !- Solar Absorptance + 0.8200000; !- Visible Absorptance + + Material, + C10 - 8 IN HW CONCRETE, !- Name + MediumRough, !- Roughness + 0.2033016, !- Thickness {m} + 1.729577, !- Conductivity {W/m-K} + 2242.585, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.6500000, !- Solar Absorptance + 0.6500000; !- Visible Absorptance + + Material, + E2 - 1 / 2 IN SLAG OR STONE, !- Name + Rough, !- Roughness + 1.2710161E-02, !- Thickness {m} + 1.435549, !- Conductivity {W/m-K} + 881.0155, !- Density {kg/m3} + 1673.600, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.5500000, !- Solar Absorptance + 0.5500000; !- Visible Absorptance + + Material, + E3 - 3 / 8 IN FELT AND MEMBRANE, !- Name + Rough, !- Roughness + 9.5402403E-03, !- Thickness {m} + 0.1902535, !- Conductivity {W/m-K} + 1121.292, !- Density {kg/m3} + 1673.600, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.7500000, !- Solar Absorptance + 0.7500000; !- Visible Absorptance + + Material, + B5 - 1 IN DENSE INSULATION, !- Name + VeryRough, !- Roughness + 2.5389841E-02, !- Thickness {m} + 4.3239430E-02, !- Conductivity {W/m-K} + 91.30524, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.5000000, !- Solar Absorptance + 0.5000000; !- Visible Absorptance + + Material, + C12 - 2 IN HW CONCRETE, !- Name + MediumRough, !- Roughness + 5.0901599E-02, !- Thickness {m} + 1.729577, !- Conductivity {W/m-K} + 2242.585, !- Density {kg/m3} + 836.8000, !- Specific Heat {J/kg-K} + 0.9000000, !- Thermal Absorptance + 0.6500000, !- Solar Absorptance + 0.6500000; !- Visible Absorptance + + WindowMaterial:Glazing, + WIN-LAY-GLASS-LIGHT, !- Name + SpectralAverage, !- Optical Data Type + , !- Window Glass Spectral Data Set Name + 0.003, !- Thickness {m} + 0.90, !- Solar Transmittance at Normal Incidence + 0.031, !- Front Side Solar Reflectance at Normal Incidence + 0.031, !- Back Side Solar Reflectance at Normal Incidence + 0.90, !- Visible Transmittance at Normal Incidence + 0.05, !- Front Side Visible Reflectance at Normal Incidence + 0.05, !- 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} + + Construction, + EXTWALL80, !- Name + A1 - 1 IN STUCCO, !- Outside Layer + C4 - 4 IN COMMON BRICK, !- Layer 2 + E1 - 3 / 4 IN PLASTER OR GYP BOARD; !- Layer 3 + + Construction, + PARTITION06, !- Name + E1 - 3 / 4 IN PLASTER OR GYP BOARD, !- Outside Layer + C6 - 8 IN CLAY TILE, !- Layer 2 + E1 - 3 / 4 IN PLASTER OR GYP BOARD; !- Layer 3 + + Construction, + FLOOR SLAB 8 IN, !- Name + C10 - 8 IN HW CONCRETE; !- Outside Layer + + Construction, + ROOF34, !- Name + E2 - 1 / 2 IN SLAG OR STONE, !- Outside Layer + E3 - 3 / 8 IN FELT AND MEMBRANE, !- Layer 2 + B5 - 1 IN DENSE INSULATION, !- Layer 3 + C12 - 2 IN HW CONCRETE; !- Layer 4 + + Construction, + WIN-CON-LIGHT, !- Name + WIN-LAY-GLASS-LIGHT; !- Outside Layer + + 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 + Temperature; !- Unit Type + + ScheduleTypeLimits, + Control Type, !- Name + 0, !- Lower Limit Value + 4, !- Upper Limit Value + DISCRETE; !- Numeric Type + + ScheduleTypeLimits, + On/Off, !- Name + 0, !- Lower Limit Value + 1, !- Upper Limit Value + DISCRETE; !- Numeric Type + + Schedule:Compact, + Activity Sch, !- Name + Any Number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,131.80; !- Field 3 + + Schedule:Compact, + Work Eff Sch, !- Name + Any Number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,0.00; !- Field 3 + + Schedule:Compact, + Clothing Sch, !- Name + Any Number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,1.00; !- Field 3 + + Schedule:Compact, + Air Velo Sch, !- Name + Any Number, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,0.137; !- Field 3 + + Schedule:Compact, + Office Occupancy, !- Name + ANY NUMBER, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Weekdays SummerDesignDay, !- Field 2 + Until: 4:00,0.00, !- Field 3 + Until: 20:00,1.00, !- Field 5 + Until: 21:00,0.50, !- Field 7 + Until: 24:00,0.00, !- Field 9 + For: Weekends Holidays WinterDesignDay CustomDay1 CustomDay2, !- Field 11 + Until: 24:00,0.00; !- Field 12 + + Schedule:Compact, + Intermittent, !- Name + ANY NUMBER, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Weekdays SummerDesignDay, !- Field 2 + Until: 8:00,0.00, !- Field 3 + Until: 18:00,1.00, !- Field 5 + Until: 24:00,0.00, !- Field 7 + For: Weekends Holidays WinterDesignDay CustomDay1 CustomDay2, !- Field 9 + Until: 24:00,0.00; !- Field 10 + + Schedule:Compact, + Office Lighting, !- Name + ANY NUMBER, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Weekdays SummerDesignDay, !- Field 2 + Until: 6:00,5.00E-002, !- Field 3 + Until: 7:00,0.20, !- Field 5 + Until: 17:00,1.00, !- Field 7 + Until: 18:00,0.50, !- Field 9 + Until: 24:00,5.00E-002, !- Field 11 + For: Weekends Holidays WinterDesignDay CustomDay1 CustomDay2, !- Field 13 + Until: 24:00,5.00E-002; !- Field 14 + + Schedule:Compact, + BLDG SCH 24X7, !- Name + ANY NUMBER, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,1.00; !- Field 3 + + Schedule:Compact, + On Peak, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 9:00,0.00, !- Field 3 + Until: 18:00,1.00, !- Field 5 + Until: 24:00,0.00; !- Field 7 + + Schedule:Compact, + Off Peak, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 9:00,1.00, !- Field 3 + Until: 18:00,0.00, !- Field 5 + Until: 24:00,1.00; !- Field 7 + + Schedule:Compact, + ON, !- Name + Fraction, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,1.00; !- Field 3 + + Schedule:Compact, + SEASONAL RESET SUPPLY AIR TEMP SCH, !- Name + TEMPERATURE, !- Schedule Type Limits Name + Through: 3/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,16.00, !- Field 3 + Through: 9/30, !- Field 5 + For: Alldays, !- Field 6 + Until: 24:00,13.00, !- Field 7 + Through: 12/31, !- Field 9 + For: Alldays, !- Field 10 + Until: 24:00,16.00; !- Field 11 + + Schedule:Compact, + CW LOOP TEMP SCHEDULE, !- Name + TEMPERATURE, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,10.00; !- Field 3 + + Schedule:Compact, + HW LOOP TEMP SCHEDULE, !- Name + TEMPERATURE, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,60.00; !- Field 3 + + Schedule:Compact, + FANANDCOILAVAILSCHED, !- Name + FRACTION, !- Schedule Type Limits Name + Through: 3/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,1.00, !- Field 3 + Through: 9/30, !- Field 5 + For: Weekdays SummerDesignDay WinterDesignDay, !- Field 6 + Until: 24:00,1.00, !- Field 7 + For: AllOtherDays, !- Field 9 + Until: 24:00,0.00, !- Field 10 + Through: 12/31, !- Field 12 + For: Alldays, !- Field 13 + Until: 24:00,1.00; !- Field 14 + + Schedule:Compact, + COOLINGCOILAVAILSCHED, !- Name + FRACTION, !- Schedule Type Limits Name + Through: 3/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,0.00, !- Field 3 + Through: 9/30, !- Field 5 + For: Weekdays SummerDesignDay WinterDesignDay, !- Field 6 + Until: 24:00,1.00, !- Field 7 + For: AllOtherDays, !- Field 9 + Until: 24:00,0.00, !- Field 10 + Through: 12/31, !- Field 12 + For: Alldays, !- Field 13 + Until: 24:00,0.00; !- Field 14 + + Schedule:Compact, + HEATING SETPOINTS, !- Name + TEMPERATURE, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 7:00,15.00, !- Field 3 + Until: 17:00,20.00, !- Field 5 + Until: 24:00,15.00; !- Field 7 + + Schedule:Compact, + COOLING SETPOINTS, !- Name + TEMPERATURE, !- Schedule Type Limits Name + Through: 12/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,24.00; !- Field 3 + + Schedule:Compact, + ZONE CONTROL TYPE SCHED, !- Name + CONTROL TYPE, !- Schedule Type Limits Name + Through: 3/31, !- Field 1 + For: Alldays, !- Field 2 + Until: 24:00,1, !- Field 3 + Through: 9/30, !- Field 5 + For: Alldays, !- Field 6 + Until: 24:00,2, !- Field 7 + Through: 12/31, !- Field 9 + For: Alldays, !- Field 10 + Until: 24:00,1; !- Field 11 + + Site:GroundTemperature:BuildingSurface,20.03,20.03,20.13,20.30,20.43,20.52,20.62,20.77,20.78,20.55,20.44,20.20; + + Zone, + WEST ZONE, !- Name + 0.0000000E+00, !- Direction of Relative North {deg} + 0.0000000E+00, !- X Origin {m} + 0.0000000E+00, !- Y Origin {m} + 0.0000000E+00, !- Z Origin {m} + 1, !- Type + 1, !- Multiplier + autocalculate, !- Ceiling Height {m} + autocalculate; !- Volume {m3} + + Zone, + EAST ZONE, !- Name + 0.0000000E+00, !- Direction of Relative North {deg} + 30.00000, !- X Origin {m} + 0.0000000E+00, !- Y Origin {m} + 0.0000000E+00, !- Z Origin {m} + 1, !- Type + 1, !- Multiplier + autocalculate, !- Ceiling Height {m} + autocalculate; !- Volume {m3} + + Zone, + NORTH ZONE, !- Name + 0.0000000E+00, !- Direction of Relative North {deg} + 0.0000000E+00, !- X Origin {m} + 30.00000, !- Y Origin {m} + 0.0000000E+00, !- Z Origin {m} + 1, !- Type + 1, !- Multiplier + autocalculate, !- Ceiling Height {m} + autocalculate; !- Volume {m3} + + Sizing:Parameters, + 1.0, !- Heating Sizing Factor + 1.0, !- Cooling Sizing Factor + ; !- Timesteps in Averaging Window + + Sizing:Zone, + WEST ZONE, !- Zone or ZoneList Name + SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method + 14., !- Zone Cooling Design Supply Air Temperature {C} + , !- Zone Cooling Design Supply Air Temperature Difference {deltaC} + SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method + 35., !- Zone Heating Design Supply Air Temperature {C} + , !- Zone Heating Design Supply Air Temperature Difference {deltaC} + 0.009, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir} + 0.004, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + SZ DSOA SPEC, !- Design Specification Outdoor Air Object Name + 0.0, !- Zone Heating Sizing Factor + 0.0, !- Zone Cooling Sizing Factor + DesignDayWithLimit, !- Cooling Design Air Flow Method + , !- Cooling Design Air Flow Rate {m3/s} + , !- 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} + , !- Heating Maximum Air Flow per Zone Floor Area {m3/s-m2} + , !- Heating Maximum Air Flow {m3/s} + , !- Heating Maximum Air Flow Fraction + , !- Design Specification Zone Air Distribution Object Name + No, !- Account for Dedicated Outdoor Air System + NeutralSupplyAir, !- Dedicated Outdoor Air System Control Strategy + autosize, !- Dedicated Outdoor Air Low Setpoint Temperature for Design {C} + autosize; !- Dedicated Outdoor Air High Setpoint Temperature for Design {C} + + DesignSpecification:OutdoorAir, + SZ DSOA SPEC, !- Name + sum, !- Outdoor Air Method + 0.00236, !- Outdoor Air Flow per Person {m3/s-person} + 0.000305, !- Outdoor Air Flow per Zone Floor Area {m3/s-m2} + 0.0; !- Outdoor Air Flow per Zone {m3/s} + + Sizing:Zone, + EAST ZONE, !- Zone or ZoneList Name + SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method + 14., !- Zone Cooling Design Supply Air Temperature {C} + , !- Zone Cooling Design Supply Air Temperature Difference {deltaC} + SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method + 35., !- Zone Heating Design Supply Air Temperature {C} + , !- Zone Heating Design Supply Air Temperature Difference {deltaC} + 0.009, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir} + 0.004, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + SZ DSOA SPEC, !- Design Specification Outdoor Air Object Name + 0.0, !- Zone Heating Sizing Factor + 0.0, !- Zone Cooling Sizing Factor + DesignDayWithLimit, !- Cooling Design Air Flow Method + , !- Cooling Design Air Flow Rate {m3/s} + , !- 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} + , !- Heating Maximum Air Flow per Zone Floor Area {m3/s-m2} + , !- Heating Maximum Air Flow {m3/s} + , !- Heating Maximum Air Flow Fraction + , !- Design Specification Zone Air Distribution Object Name + No, !- Account for Dedicated Outdoor Air System + NeutralSupplyAir, !- Dedicated Outdoor Air System Control Strategy + autosize, !- Dedicated Outdoor Air Low Setpoint Temperature for Design {C} + autosize; !- Dedicated Outdoor Air High Setpoint Temperature for Design {C} + + Sizing:Zone, + NORTH ZONE, !- Zone or ZoneList Name + SupplyAirTemperature, !- Zone Cooling Design Supply Air Temperature Input Method + 14., !- Zone Cooling Design Supply Air Temperature {C} + , !- Zone Cooling Design Supply Air Temperature Difference {deltaC} + SupplyAirTemperature, !- Zone Heating Design Supply Air Temperature Input Method + 35., !- Zone Heating Design Supply Air Temperature {C} + , !- Zone Heating Design Supply Air Temperature Difference {deltaC} + 0.009, !- Zone Cooling Design Supply Air Humidity Ratio {kgWater/kgDryAir} + 0.004, !- Zone Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + SZ DSOA SPEC, !- Design Specification Outdoor Air Object Name + 0.0, !- Zone Heating Sizing Factor + 0.0, !- Zone Cooling Sizing Factor + DesignDayWithLimit, !- Cooling Design Air Flow Method + , !- Cooling Design Air Flow Rate {m3/s} + , !- 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} + , !- Heating Maximum Air Flow per Zone Floor Area {m3/s-m2} + , !- Heating Maximum Air Flow {m3/s} + , !- Heating Maximum Air Flow Fraction + , !- Design Specification Zone Air Distribution Object Name + No, !- Account for Dedicated Outdoor Air System + NeutralSupplyAir, !- Dedicated Outdoor Air System Control Strategy + autosize, !- Dedicated Outdoor Air Low Setpoint Temperature for Design {C} + autosize; !- Dedicated Outdoor Air High Setpoint Temperature for Design {C} + + People, + WEST ZONE, !- Name + WEST ZONE, !- Zone or ZoneList or Space or SpaceList Name + Office Occupancy, !- Number of People Schedule Name + people, !- Number of People Calculation Method + 45.000000, !- Number of People + , !- People per Floor Area {person/m2} + , !- Floor Area per Person {m2/person} + 0.3000000, !- Fraction Radiant + , !- Sensible Heat Fraction + Activity Sch, !- Activity Level Schedule Name + 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} + , !- Enable ASHRAE 55 Comfort Warnings + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type + , !- Surface Name/Angle Factor List Name + Work Eff Sch, !- Work Efficiency Schedule Name + ClothingInsulationSchedule, !- Clothing Insulation Calculation Method + , !- Clothing Insulation Calculation Method Schedule Name + Clothing Sch, !- Clothing Insulation Schedule Name + Air Velo Sch, !- Air Velocity Schedule Name + FANGER; !- Thermal Comfort Model 1 Type + + ElectricEquipment, + WEST ZONE ElecEq 1, !- Name + WEST ZONE, !- Zone or ZoneList or Space or SpaceList Name + Intermittent, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 27000.0, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000000E+00, !- Fraction Latent + 0.3000000, !- Fraction Radiant + 0.0000000E+00; !- Fraction Lost + + People, + EAST ZONE, !- Name + EAST ZONE, !- Zone or ZoneList or Space or SpaceList Name + Office Occupancy, !- Number of People Schedule Name + people, !- Number of People Calculation Method + 45.000000, !- Number of People + , !- People per Floor Area {person/m2} + , !- Floor Area per Person {m2/person} + 0.3000000, !- Fraction Radiant + , !- Sensible Heat Fraction + Activity Sch, !- Activity Level Schedule Name + 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} + , !- Enable ASHRAE 55 Comfort Warnings + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type + , !- Surface Name/Angle Factor List Name + Work Eff Sch, !- Work Efficiency Schedule Name + ClothingInsulationSchedule, !- Clothing Insulation Calculation Method + , !- Clothing Insulation Calculation Method Schedule Name + Clothing Sch, !- Clothing Insulation Schedule Name + Air Velo Sch, !- Air Velocity Schedule Name + FANGER; !- Thermal Comfort Model 1 Type + + Lights, + EAST ZONE Lights 1, !- Name + EAST ZONE, !- Zone or ZoneList or Space or SpaceList Name + Office Lighting, !- Schedule Name + LightingLevel, !- Design Level Calculation Method + 9000.0, !- Lighting Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000000E+00, !- Return Air Fraction + 0.2000000, !- Fraction Radiant + 0.2000000, !- Fraction Visible + 0.0000000E+00, !- Fraction Replaceable + GeneralLights; !- End-Use Subcategory + + ElectricEquipment, + EAST ZONE ElecEq 1, !- Name + EAST ZONE, !- Zone or ZoneList or Space or SpaceList Name + Intermittent, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 27000.0, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000000E+00, !- Fraction Latent + 0.3000000, !- Fraction Radiant + 0.0000000E+00; !- Fraction Lost + + People, + NORTH ZONE, !- Name + NORTH ZONE, !- Zone or ZoneList or Space or SpaceList Name + BLDG Sch 24x7, !- Number of People Schedule Name + people, !- Number of People Calculation Method + 10.000000, !- Number of People + , !- People per Floor Area {person/m2} + , !- Floor Area per Person {m2/person} + 0.3000000, !- Fraction Radiant + , !- Sensible Heat Fraction + Activity Sch, !- Activity Level Schedule Name + 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} + , !- Enable ASHRAE 55 Comfort Warnings + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type + , !- Surface Name/Angle Factor List Name + Work Eff Sch, !- Work Efficiency Schedule Name + ClothingInsulationSchedule, !- Clothing Insulation Calculation Method + , !- Clothing Insulation Calculation Method Schedule Name + Clothing Sch, !- Clothing Insulation Schedule Name + Air Velo Sch, !- Air Velocity Schedule Name + FANGER; !- Thermal Comfort Model 1 Type + + Lights, + NORTH ZONE Lights 1, !- Name + NORTH ZONE, !- Zone or ZoneList or Space or SpaceList Name + BLDG Sch 24x7, !- Schedule Name + LightingLevel, !- Design Level Calculation Method + 9000.0, !- Lighting Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000000E+00, !- Return Air Fraction + 0.2000000, !- Fraction Radiant + 0.2000000, !- Fraction Visible + 0.0000000E+00, !- Fraction Replaceable + GeneralLights; !- End-Use Subcategory + + ElectricEquipment, + NORTH ZONE ElecEq 1, !- Name + NORTH ZONE, !- Zone or ZoneList or Space or SpaceList Name + BLDG Sch 24x7, !- Schedule Name + EquipmentLevel, !- Design Level Calculation Method + 81000.0, !- Design Level {W} + , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Person {W/person} + 0.0000000E+00, !- Fraction Latent + 0.3000000, !- Fraction Radiant + 0.0000000E+00; !- Fraction Lost + + GlobalGeometryRules, + UpperLeftCorner, !- Starting Vertex Position + CounterClockWise, !- Vertex Entry Direction + Relative, !- Coordinate System + , !- Daylighting Reference Point Coordinate System + Relative; !- Rectangular Surface Coordinate System + + BuildingSurface:Detailed, + ZnWest:Wall001, !- Name + Wall, !- Surface Type + EXTWALL80, !- Construction Name + WEST ZONE, !- Zone Name + , !- Space Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 0.0000000E+00,0.0000000E+00,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 0.0000000E+00,0.0000000E+00,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 30.00000,0.0000000E+00,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 30.00000,0.0000000E+00,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + FenestrationSurface:Detailed, + ZnWest:Wall001:Win001, !- Name + Window, !- Surface Type + WIN-CON-LIGHT, !- Construction Name + ZnWest:Wall001, !- Building Surface Name + , !- Outside Boundary Condition Object + 0.5000000, !- View Factor to Ground + , !- Frame and Divider Name + 1.0, !- Multiplier + 4, !- Number of Vertices + 10.0000,0.0000000E+00,2.8000, !- X,Y,Z ==> Vertex 1 {m} + 10.0000,0.0000000E+00,0.7500, !- X,Y,Z ==> Vertex 2 {m} + 20.000,0.0000000E+00,0.7500, !- X,Y,Z ==> Vertex 3 {m} + 20.000,0.0000000E+00,2.8000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnWest:Wall002, !- Name + Wall, !- Surface Type + EXTWALL80, !- Construction Name + WEST ZONE, !- Zone Name + , !- Space Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 0.0000000E+00,30.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 0.0000000E+00,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 0.0000000E+00,0.0000000E+00,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 0.0000000E+00,0.0000000E+00,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + FenestrationSurface:Detailed, + ZnWest:Wall002:Win001, !- Name + Window, !- Surface Type + WIN-CON-LIGHT, !- Construction Name + ZnWest:Wall002, !- Building Surface Name + , !- Outside Boundary Condition Object + 0.5000000, !- View Factor to Ground + , !- Frame and Divider Name + 1.0, !- Multiplier + 4, !- Number of Vertices + 0.0000,25.0000000E+00,2.8000, !- X,Y,Z ==> Vertex 1 {m} + 0.0000,25.0000000E+00,0.7500, !- X,Y,Z ==> Vertex 2 {m} + 0.000,5.0000000E+00,0.7500, !- X,Y,Z ==> Vertex 3 {m} + 0.000,5.0000000E+00,2.8000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnWest:Wall003, !- Name + Wall, !- Surface Type + PARTITION06, !- Construction Name + WEST ZONE, !- Zone Name + , !- Space Name + Surface, !- Outside Boundary Condition + ZnNorth:Wall004, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 30.00000,30.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 30.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 0.0000000E+00,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 0.0000000E+00,30.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnWest:Wall004, !- Name + Wall, !- Surface Type + PARTITION06, !- Construction Name + WEST ZONE, !- Zone Name + , !- Space Name + Surface, !- Outside Boundary Condition + ZnEast:Wall004, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 30.00000,0.0000000E+00,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 30.00000,0.0000000E+00,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 30.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 30.00000,30.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnWest:Flr001, !- Name + Floor, !- Surface Type + FLOOR SLAB 8 IN, !- Construction Name + WEST ZONE, !- Zone Name + , !- Space Name + Surface, !- Outside Boundary Condition + ZnWest:Flr001, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 1.000000, !- View Factor to Ground + 4, !- Number of Vertices + 0.0000000E+00,0.0000000E+00,0.0000000E+00, !- X,Y,Z ==> Vertex 1 {m} + 0.0000000E+00,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 30.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 30.00000,0.0000000E+00,0.0000000E+00; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnWest:Roof001, !- Name + Roof, !- Surface Type + ROOF34, !- Construction Name + WEST ZONE, !- Zone Name + , !- Space Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0000000E+00, !- View Factor to Ground + 4, !- Number of Vertices + 0.0000000E+00,30.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 0.0000000E+00,0.0000000E+00,4.000000, !- X,Y,Z ==> Vertex 2 {m} + 30.00000,0.0000000E+00,4.000000, !- X,Y,Z ==> Vertex 3 {m} + 30.00000,30.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnEast:Wall001, !- Name + Wall, !- Surface Type + EXTWALL80, !- Construction Name + EAST ZONE, !- Zone Name + , !- Space Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 60.00000,30.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 60.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 45.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 45.00000,30.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnEast:Wall002, !- Name + Wall, !- Surface Type + EXTWALL80, !- Construction Name + EAST ZONE, !- Zone Name + , !- Space Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 30.00000,0.0000000E+00,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 30.00000,0.0000000E+00,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 60.00000,0.0000000E+00,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 60.00000,0.0000000E+00,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + FenestrationSurface:Detailed, + ZnEast:Wall002:Win001, !- Name + Window, !- Surface Type + WIN-CON-LIGHT, !- Construction Name + ZnEast:Wall002, !- Building Surface Name + , !- Outside Boundary Condition Object + 0.5000000, !- View Factor to Ground + , !- Frame and Divider Name + 1.0, !- Multiplier + 4, !- Number of Vertices + 40.0000,0.0000000E+00,2.8000, !- X,Y,Z ==> Vertex 1 {m} + 40.0000,0.0000000E+00,0.7500, !- X,Y,Z ==> Vertex 2 {m} + 50.000,0.0000000E+00,0.7500, !- X,Y,Z ==> Vertex 3 {m} + 50.000,0.0000000E+00,2.8000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnEast:Wall003, !- Name + Wall, !- Surface Type + EXTWALL80, !- Construction Name + EAST ZONE, !- Zone Name + , !- Space Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 60.00000,0.0000000E+00,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 60.00000,0.0000000E+00,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 60.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 60.00000,30.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + FenestrationSurface:Detailed, + ZnEast:Wall003:Win001, !- Name + Window, !- Surface Type + WIN-CON-LIGHT, !- Construction Name + ZnEast:Wall003, !- Building Surface Name + , !- Outside Boundary Condition Object + 0.5000000, !- View Factor to Ground + , !- Frame and Divider Name + 1.0, !- Multiplier + 4, !- Number of Vertices + 60.0000,5.0000000E+00,2.8000, !- X,Y,Z ==> Vertex 1 {m} + 60.0000,5.0000000E+00,0.7500, !- X,Y,Z ==> Vertex 2 {m} + 60.000,25.0000000E+00,0.7500, !- X,Y,Z ==> Vertex 3 {m} + 60.000,25.0000000E+00,2.8000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnEast:Wall004, !- Name + Wall, !- Surface Type + PARTITION06, !- Construction Name + EAST ZONE, !- Zone Name + , !- Space Name + Surface, !- Outside Boundary Condition + ZnWest:Wall004, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 30.00000,30.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 30.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 30.00000,0.0000000E+00,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 30.00000,0.0000000E+00,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnEast:Wall005, !- Name + Wall, !- Surface Type + PARTITION06, !- Construction Name + EAST ZONE, !- Zone Name + , !- Space Name + Surface, !- Outside Boundary Condition + ZnNorth:Wall005, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 45.00000,30.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 45.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 30.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 30.00000,30.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnEast:Flr001, !- Name + Floor, !- Surface Type + FLOOR SLAB 8 IN, !- Construction Name + EAST ZONE, !- Zone Name + , !- Space Name + Surface, !- Outside Boundary Condition + ZnEast:Flr001, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 1.000000, !- View Factor to Ground + 4, !- Number of Vertices + 30.00000,0.0000000E+00,0.0000000E+00, !- X,Y,Z ==> Vertex 1 {m} + 30.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 60.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 60.00000,0.0000000E+00,0.0000000E+00; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnEast:Roof001, !- Name + Roof, !- Surface Type + ROOF34, !- Construction Name + EAST ZONE, !- Zone Name + , !- Space Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0000000E+00, !- View Factor to Ground + 4, !- Number of Vertices + 30.00000,30.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 30.00000,0.0000000E+00,4.000000, !- X,Y,Z ==> Vertex 2 {m} + 60.00000,0.0000000E+00,4.000000, !- X,Y,Z ==> Vertex 3 {m} + 60.00000,30.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnNorth:Wall001, !- Name + Wall, !- Surface Type + EXTWALL80, !- Construction Name + NORTH ZONE, !- Zone Name + , !- Space Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 0.0000000E+00,60.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 0.0000000E+00,60.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 0.0000000E+00,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 0.0000000E+00,30.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnNorth:Wall002, !- Name + Wall, !- Surface Type + EXTWALL80, !- Construction Name + NORTH ZONE, !- Zone Name + , !- Space Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 45.00000,60.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 45.00000,60.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 0.0000000E+00,60.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 0.0000000E+00,60.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnNorth:Wall003, !- Name + Wall, !- Surface Type + EXTWALL80, !- Construction Name + NORTH ZONE, !- Zone Name + , !- Space Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 45.00000,30.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 45.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 45.00000,60.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 45.00000,60.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnNorth:Wall004, !- Name + Wall, !- Surface Type + PARTITION06, !- Construction Name + NORTH ZONE, !- Zone Name + , !- Space Name + Surface, !- Outside Boundary Condition + ZnWest:Wall003, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 0.0000000E+00,30.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 0.0000000E+00,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 30.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 30.00000,30.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnNorth:Wall005, !- Name + Wall, !- Surface Type + PARTITION06, !- Construction Name + NORTH ZONE, !- Zone Name + , !- Space Name + Surface, !- Outside Boundary Condition + ZnEast:Wall005, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 0.5000000, !- View Factor to Ground + 4, !- Number of Vertices + 30.00000,30.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 30.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 45.00000,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 45.00000,30.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnNorth:Flr001, !- Name + Floor, !- Surface Type + FLOOR SLAB 8 IN, !- Construction Name + NORTH ZONE, !- Zone Name + , !- Space Name + Surface, !- Outside Boundary Condition + ZnNorth:Flr001, !- Outside Boundary Condition Object + NoSun, !- Sun Exposure + NoWind, !- Wind Exposure + 1.000000, !- View Factor to Ground + 4, !- Number of Vertices + 0.0000000E+00,30.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 1 {m} + 0.0000000E+00,60.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 2 {m} + 45.00000,60.00000,0.0000000E+00, !- X,Y,Z ==> Vertex 3 {m} + 45.00000,30.00000,0.0000000E+00; !- X,Y,Z ==> Vertex 4 {m} + + BuildingSurface:Detailed, + ZnNorth:Roof001, !- Name + Roof, !- Surface Type + ROOF34, !- Construction Name + NORTH ZONE, !- Zone Name + , !- Space Name + Outdoors, !- Outside Boundary Condition + , !- Outside Boundary Condition Object + SunExposed, !- Sun Exposure + WindExposed, !- Wind Exposure + 0.0000000E+00, !- View Factor to Ground + 4, !- Number of Vertices + 0.0000000E+00,60.00000,4.000000, !- X,Y,Z ==> Vertex 1 {m} + 0.0000000E+00,30.00000,4.000000, !- X,Y,Z ==> Vertex 2 {m} + 45.00000,30.00000,4.000000, !- X,Y,Z ==> Vertex 3 {m} + 45.00000,60.00000,4.000000; !- X,Y,Z ==> Vertex 4 {m} + + AirLoopHVAC, + Typical Terminal Reheat, !- Name + Reheat System 1 Controllers, !- Controller List Name + Reheat System 1 Avail List, !- Availability Manager List Name + 25.0, !- Design Supply Air Flow Rate {m3/s} + Air Loop Branches, !- Branch List Name + , !- Connector List Name + Air Loop Inlet Node, !- Supply Side Inlet Node Name + Return Air Mixer Outlet, !- Demand Side Outlet Node Name + Zone Equipment Inlet Node, !- Demand Side Inlet Node Names + Air Loop Outlet Node; !- Supply Side Outlet Node Names + + AirLoopHVAC:ControllerList, + Reheat System 1 Controllers, !- Name + Controller:WaterCoil, !- Controller 1 Object Type + Main Cooling Coil Controller; !- Controller 1 Name + + BranchList, + Air Loop Branches, !- Name + Air Loop Main Branch; !- Branch 1 Name + + Branch, + Air Loop Main Branch, !- Name + , !- Pressure Drop Curve Name + Fan:ConstantVolume, !- Component 1 Object Type + Supply Fan 1, !- Component 1 Name + Air Loop Inlet Node, !- Component 1 Inlet Node Name + Cooling Coil Air Inlet Node, !- Component 1 Outlet Node Name + Coil:Cooling:Water:DetailedGeometry, !- Component 2 Object Type + Detailed Cooling Coil, !- Component 2 Name + Cooling Coil Air Inlet Node, !- Component 2 Inlet Node Name + Air Loop Outlet Node; !- Component 2 Outlet Node Name + + AvailabilityManagerAssignmentList, + Reheat System 1 Avail List, !- Name + AvailabilityManager:Scheduled, !- Availability Manager 1 Object Type + Reheat System 1 Avail; !- Availability Manager 1 Name + + AvailabilityManager:Scheduled, + Reheat System 1 Avail, !- Name + FanAndCoilAvailSched; !- Schedule Name + + Sizing:System, + Typical Terminal Reheat, !- AirLoop Name + sensible, !- Type of Load to Size On + autosize, !- Design Outdoor Air Flow Rate {m3/s} + 0.3, !- Central Heating Maximum System Air Flow Ratio + 4.5, !- Preheat Design Temperature {C} + 0.008, !- Preheat Design Humidity Ratio {kgWater/kgDryAir} + 11.0, !- Precool Design Temperature {C} + 0.008, !- Precool Design Humidity Ratio {kgWater/kgDryAir} + 12.8, !- Central Cooling Design Supply Air Temperature {C} + 16.7, !- Central Heating Design Supply Air Temperature {C} + noncoincident, !- Type 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 {kgWater/kgDryAir} + 0.008, !- Central Heating Design Supply Air Humidity Ratio {kgWater/kgDryAir} + DesignDay, !- Cooling Supply Air Flow Rate Method + 0, !- 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 + 0, !- 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 + VAV; !- Central Cooling Capacity Control Method + + Sizing:Plant, + Hot Water Loop, !- Plant or Condenser Loop Name + heating, !- Loop Type + 82., !- Design Loop Exit Temperature {C} + 6; !- Loop Design Temperature Difference {deltaC} + + Sizing:Plant, + Chilled Water Loop, !- Plant or Condenser Loop Name + cooling, !- Loop Type + 7.00, !- Design Loop Exit Temperature {C} + 4.00; !- Loop Design Temperature Difference {deltaC} + + PlantLoop, + Chilled Water Loop, !- Name + Water, !- Fluid Type + , !- User Defined Fluid Type + CW Loop Operation, !- Plant Equipment Operation Scheme Name + CW Supply Outlet Node, !- Loop Temperature Setpoint Node Name + 98, !- Maximum Loop Temperature {C} + 1, !- Minimum Loop Temperature {C} + autosize, !- Maximum Loop Flow Rate {m3/s} + 0, !- Minimum Loop Flow Rate {m3/s} + autocalculate, !- Plant Loop Volume {m3} + CW Supply Inlet Node, !- Plant Side Inlet Node Name + CW Supply Outlet Node, !- Plant Side Outlet Node Name + Cooling Supply Side Branches, !- Plant Side Branch List Name + Cooling Supply Side Connectors, !- Plant Side Connector List Name + CW Demand Inlet Node, !- Demand Side Inlet Node Name + CW Demand Outlet Node, !- Demand Side Outlet Node Name + Cooling Demand Side Branches, !- Demand Side Branch List Name + Cooling Demand Side Connectors, !- Demand Side Connector List Name + Optimal; !- Load Distribution Scheme + + SetpointManager:Scheduled, + Chilled Water Loop Setpoint Manager, !- Name + Temperature, !- Control Variable + CW Loop Temp Schedule, !- Schedule Name + Chilled Water Loop Setpoint Node List; !- Setpoint Node or NodeList Name + + NodeList, + Chilled Water Loop Setpoint Node List, !- Name + CW Supply Outlet Node; !- Node 1 Name + + BranchList, + Cooling Supply Side Branches, !- Name + CW Pump Branch, !- Branch 1 Name + Main Chiller Branch, !- Branch 2 Name + Supply Bypass Branch, !- Branch 4 Name + Cooling Supply Outlet; !- Branch 5 Name + + BranchList, + Cooling Demand Side Branches, !- Name + Cooling Demand Inlet, !- Branch 1 Name + Cooling Coil Branch, !- Branch 2 Name + Demand Bypass Branch, !- Branch 3 Name + Cooling Demand Outlet; !- Branch 4 Name + + ConnectorList, + Cooling Supply Side Connectors, !- Name + Connector:Splitter, !- Connector 1 Object Type + CW Loop Splitter, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + CW Loop Mixer; !- Connector 2 Name + + ConnectorList, + Cooling Demand Side Connectors, !- Name + Connector:Splitter, !- Connector 1 Object Type + CW Demand Splitter, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + CW Demand Mixer; !- Connector 2 Name + + Branch, + Cooling Demand Inlet, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Demand Side Inlet Pipe, !- Component 1 Name + CW Demand Inlet Node, !- Component 1 Inlet Node Name + CW Demand Entrance Pipe Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Demand Side Inlet Pipe, !- Name + CW Demand Inlet Node, !- Inlet Node Name + CW Demand Entrance Pipe Outlet Node; !- Outlet Node Name + + Branch, + Cooling Coil Branch, !- Name + , !- Pressure Drop Curve Name + Coil:Cooling:Water:DetailedGeometry, !- Component 1 Object Type + Detailed Cooling Coil, !- Component 1 Name + Cooling Coil Water Inlet Node, !- Component 1 Inlet Node Name + Cooling Coil Water Outlet Node; !- Component 1 Outlet Node Name + + Branch, + Demand Bypass Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Demand Side Bypass, !- Component 1 Name + CW Demand Bypass Inlet Node, !- Component 1 Inlet Node Name + CW Demand Bypass Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Demand Side Bypass, !- Name + CW Demand Bypass Inlet Node, !- Inlet Node Name + CW Demand Bypass Outlet Node; !- Outlet Node Name + + Branch, + Cooling Demand Outlet, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + CW Demand Side Outlet Pipe, !- Component 1 Name + CW Demand Exit Pipe Inlet Node, !- Component 1 Inlet Node Name + CW Demand Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + CW Demand Side Outlet Pipe, !- Name + CW Demand Exit Pipe Inlet Node, !- Inlet Node Name + CW Demand Outlet Node; !- Outlet Node Name + + Branch, + Cooling Supply Outlet, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Supply Side Outlet Pipe, !- Component 1 Name + Supply Side Exit Pipe Inlet Node, !- Component 1 Inlet Node Name + CW Supply Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Supply Side Outlet Pipe, !- Name + Supply Side Exit Pipe Inlet Node, !- Inlet Node Name + CW Supply Outlet Node; !- Outlet Node Name + + Branch, + CW Pump Branch, !- Name + , !- Pressure Drop Curve Name + Pump:VariableSpeed, !- Component 1 Object Type + Circ Pump, !- Component 1 Name + CW Supply Inlet Node, !- Component 1 Inlet Node Name + CW Pump Outlet Node, !- Component 1 Outlet Node Name + HeatExchanger:FluidToFluid, !- Component 1 Object Type + Water Side Economizer, !- Component 1 Name + CW Pump Outlet Node, !- Component 1 Inlet Node Name + WaterSide Economizer Outlet Node; !- Component 1 Outlet Node Name + + Branch, + Main Chiller Branch, !- Name + , !- Pressure Drop Curve Name + Chiller:ConstantCOP, !- Component 1 Object Type + Main Chiller, !- Component 1 Name + Main Chiller Inlet Node, !- Component 1 Inlet Node Name + Main Chiller Outlet Node;!- Component 1 Outlet Node Name + + Branch, + Supply Bypass Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Supply Side Bypass, !- Component 1 Name + CW Supply Bypass Inlet Node, !- Component 1 Inlet Node Name + CW Supply Bypass Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Supply Side Bypass, !- Name + CW Supply Bypass Inlet Node, !- Inlet Node Name + CW Supply Bypass Outlet Node; !- Outlet Node Name + + Connector:Splitter, + CW Loop Splitter, !- Name + CW Pump Branch, !- Inlet Branch Name + Main Chiller Branch, !- Outlet Branch 1 Name + Supply Bypass Branch; !- Outlet Branch 3 Name + + Connector:Mixer, + CW Loop Mixer, !- Name + Cooling Supply Outlet, !- Outlet Branch Name + Main Chiller Branch, !- Inlet Branch 1 Name + Supply Bypass Branch; !- Inlet Branch 3 Name + + Connector:Splitter, + CW Demand Splitter, !- Name + Cooling Demand Inlet, !- Inlet Branch Name + Demand Bypass Branch, !- Outlet Branch 1 Name + Cooling Coil Branch; !- Outlet Branch 2 Name + + Connector:Mixer, + CW Demand Mixer, !- Name + Cooling Demand Outlet, !- Outlet Branch Name + Cooling Coil Branch, !- Inlet Branch 1 Name + Demand Bypass Branch; !- Inlet Branch 2 Name + + PlantEquipmentOperationSchemes, + CW Loop Operation, !- Name + PlantEquipmentOperation:CoolingLoad, !- Control Scheme 1 Object Type + Peak Operation, !- Control Scheme 1 Name + On Peak, !- Control Scheme 1 Schedule Name + PlantEquipmentOperation:CoolingLoad, !- Control Scheme 2 Object Type + Peak Operation, !- Control Scheme 2 Name + Off Peak; !- Control Scheme 2 Schedule Name + + PlantEquipmentOperation:CoolingLoad, + Peak Operation, !- Name + 0, !- Load Range 1 Lower Limit {W} + 500000, !- Load Range 1 Upper Limit {W} + Electric Only; !- Range 1 Equipment List Name + + PlantEquipmentOperation:CoolingLoad, + Off Peak Operation, !- Name + 0, !- Load Range 1 Lower Limit {W} + 900000, !- Load Range 1 Upper Limit {W} + Electric Only; !- Range 1 Equipment List Name + + PlantEquipmentList, + Chiller Plant, !- Name + Chiller:ConstantCOP, !- Equipment 1 Object Type + Main Chiller; !- Equipment 1 Name + + PlantEquipmentList, + Electric Only, !- Name + Chiller:ConstantCOP, !- Equipment 1 Object Type + Main Chiller; !- Equipment 1 Name + + PlantEquipmentList, + All Chillers, !- Name + Chiller:ConstantCOP, !- Equipment 1 Object Type + Main Chiller; !- Equipment 1 Name + + Chiller:ConstantCOP, + Main Chiller, !- Name + autosize, !- Nominal Capacity {W} + 2.75, !- Nominal COP {W/W} + autosize, !- Design Chilled Water Flow Rate {m3/s} + autosize, !- Design Condenser Water Flow Rate {m3/s} + Main Chiller Inlet Node, !- Chilled Water Inlet Node Name + Main Chiller Outlet Node,!- Chilled Water Outlet Node Name + Main Chiller Condenser Inlet Node, !- Condenser Inlet Node Name + Main Chiller Condenser Outlet Node, !- Condenser Outlet Node Name + WaterCooled, !- Condenser Type + LeavingSetpointModulated,!- Chiller Flow Mode + , !- Sizing Factor + , !- Basin Heater Capacity + , !- Basin Heater Setpoint Temperature + , !- Basin Heater Operating Schedule Name + ThermoCapFracCurve, !- Thermosiphon Capacity Fraction Curve Name + 2.5; !- Thermosiphon Minimum Temperature Difference + + Curve:Linear, + ThermoCapFracCurve, !- Name + 0.0, !- Coefficient1 Constant + 0.06, !- Coefficient2 x + 0.0, !- Minimum Value of x + 10.0, !- Maximum Value of x + 0.0, !- Minimum Curve Output + 1.0, !- Maximum Curve Output + Dimensionless, !- Input Unit Type for X + Dimensionless; !- Output Unit Type + + SetpointManager:Scheduled, + Main Chiller Setpoint Manager, !- Name + Temperature, !- Control Variable + CW Loop Temp Schedule, !- Schedule Name + Main Chiller Outlet Node;!- Setpoint Node or NodeList Name + + HeatExchanger:FluidToFluid, + Water Side Economizer, !- Name + , !- Availability Schedule Name + WaterSide Economizer Condenser Inlet Node, !- Loop Demand Side Inlet Node Name + WaterSide Economizer Condenser Outlet Node, !- Loop Demand Side Outlet Node Name + autosize, !- Loop Demand Side Design Flow Rate {m3/s} + CW Pump Outlet Node, !- Loop Supply Side Inlet Node Name + WaterSide Economizer Outlet Node, !- Loop Supply Side Outlet Node Name + autosize, !- Loop Supply Side Design Flow Rate {m3/s} + ParallelFlow, !- Heat Exchange Model Type + autosize, !- Heat Exchanger U-Factor Times Area Value {W/K} + CoolingSetpointModulated, !- Control Type + WaterSide Economizer Outlet Node, !- Heat Exchanger Setpoint Node Name + 1.0, !- Minimum Temperature Difference to Activate Heat Exchanger {deltaC} + FreeCooling; !- Heat Transfer Metering End Use Type + + SetpointManager:Scheduled, + WaterEconomizerSP, !- Name + Temperature, !- Control Variable + CW Loop Temp Schedule, !- Schedule Name + WaterSide Economizer Outlet Node; !- Setpoint Node or NodeList Name + + Pump:VariableSpeed, + Circ Pump, !- Name + CW Supply Inlet Node, !- Inlet Node Name + CW Pump Outlet Node, !- Outlet Node Name + autosize, !- Design Maximum Flow Rate {m3/s} + 30000, !- Design Pump Head {Pa} + autosize, !- Design Power Consumption {W} + .87, !- Motor Efficiency + 0.0, !- Fraction of Motor Inefficiencies to Fluid Stream + 1, !- Coefficient 1 of the Part Load Performance Curve + 0, !- 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, !- Design Minimum Flow Rate {m3/s} + INTERMITTENT; !- Pump Control Type + + Sizing:Plant, + Chilled Water Condenser Loop, !- Plant or Condenser Loop Name + Condenser, !- Loop Type + 29.0, !- Design Loop Exit Temperature {C} + 6.0; !- Loop Design Temperature Difference {deltaC} + + CondenserLoop, + Chilled Water Condenser Loop, !- Name + Water, !- Fluid Type + , !- User Defined Fluid Type + Tower Loop Operation, !- Condenser Equipment Operation Scheme Name + Condenser Supply Outlet Node, !- Condenser Loop Temperature Setpoint Node Name + 80, !- Maximum Loop Temperature {C} + 3, !- Minimum Loop Temperature {C} + autosize, !- Maximum Loop Flow Rate {m3/s} + 0, !- Minimum Loop Flow Rate {m3/s} + autocalculate, !- Condenser Loop Volume {m3} + Condenser Supply Inlet Node, !- Condenser Side Inlet Node Name + Condenser Supply Outlet Node, !- Condenser Side Outlet Node Name + Condenser Supply Side Branches, !- Condenser Side Branch List Name + Condenser Supply Side Connectors, !- Condenser Side Connector List Name + Condenser Demand Inlet Node, !- Demand Side Inlet Node Name + Condenser Demand Outlet Node, !- Demand Side Outlet Node Name + Condenser Demand Side Branches, !- Condenser Demand Side Branch List Name + Condenser Demand Side Connectors, !- Condenser Demand Side Connector List Name + SequentialLoad; !- Load Distribution Scheme + + SetpointManager:FollowOutdoorAirTemperature, + MyCondenserControl, !- Name + Temperature, !- Control Variable + OutdoorAirWetBulb, !- Reference Temperature Type + 0, !- Offset Temperature Difference {deltaC} + 80, !- Maximum Setpoint Temperature {C} + 5, !- Minimum Setpoint Temperature {C} + Condenser Supply Outlet Node; !- Setpoint Node or NodeList Name + + BranchList, + Condenser Supply Side Branches, !- Name + Condenser Supply Inlet Branch, !- Branch 1 Name + Condenser Supply Tower Branch, !- Branch 2 Name + Condenser Supply Bypass Branch, !- Branch 3 Name + Condenser Supply Outlet Branch; !- Branch 4 Name + + ConnectorList, + Condenser Supply Side Connectors, !- Name + Connector:Splitter, !- Connector 1 Object Type + Condenser Supply Splitter, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + Condenser Supply Mixer; !- Connector 2 Name + + Branch, + Condenser Supply Inlet Branch, !- Name + , !- Pressure Drop Curve Name + Pump:VariableSpeed, !- Component 1 Object Type + Cond Circ Pump, !- Component 1 Name + Condenser Supply Inlet Node, !- Component 1 Inlet Node Name + Condenser Pump Outlet Node; !- Component 1 Outlet Node Name + + Branch, + Condenser Supply Tower Branch, !- Name + , !- Pressure Drop Curve Name + CoolingTower:SingleSpeed,!- Component 1 Object Type + Big Tower1, !- Component 1 Name + Condenser Tower 1 Inlet Node, !- Component 1 Inlet Node Name + Condenser Tower 1 Outlet Node, !- Component 1 Outlet Node Name + CoolingTower:SingleSpeed,!- Component 2 Object Type + Big Tower2, !- Component 2 Name + Condenser Tower 1 Outlet Node, !- Component 2 Inlet Node Name + Condenser Tower 2 Outlet Node; !- Component 2 Outlet Node Name + + Branch, + Condenser Supply Bypass Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Condenser Supply Side Bypass, !- Component 1 Name + Cond Supply Bypass Inlet Node, !- Component 1 Inlet Node Name + Cond Supply Bypass Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Condenser Supply Side Bypass, !- Name + Cond Supply Bypass Inlet Node, !- Inlet Node Name + Cond Supply Bypass Outlet Node; !- Outlet Node Name + + Branch, + Condenser Supply Outlet Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Condenser Supply Outlet, !- Component 1 Name + Condenser Supply Exit Pipe Inlet Node, !- Component 1 Inlet Node Name + Condenser Supply Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Condenser Supply Outlet, !- Name + Condenser Supply Exit Pipe Inlet Node, !- Inlet Node Name + Condenser Supply Outlet Node; !- Outlet Node Name + + BranchList, + Condenser Demand Side Branches, !- Name + Condenser Demand Inlet Branch, !- Branch 1 Name + Main Chiller Condenser Branch, !- Branch 2 Name + WaterSide Economizer Condenser Branch, !- Branch 3 Name + Condenser Demand Bypass Branch, !- Branch 4 Name + Condenser Demand Outlet Branch; !- Branch 5 Name + + ConnectorList, + Condenser Demand Side Connectors, !- Name + Connector:Splitter, !- Connector 1 Object Type + Condenser Demand Splitter, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + Condenser Demand Mixer; !- Connector 2 Name + + Branch, + Condenser Demand Inlet Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Condenser Demand Inlet Pipe, !- Component 1 Name + Condenser Demand Inlet Node, !- Component 1 Inlet Node Name + Condenser Demand Entrance Pipe Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Condenser Demand Inlet Pipe, !- Name + Condenser Demand Inlet Node, !- Inlet Node Name + Condenser Demand Entrance Pipe Outlet Node; !- Outlet Node Name + + Branch, + Main Chiller Condenser Branch, !- Name + , !- Pressure Drop Curve Name + Chiller:ConstantCOP, !- Component 1 Object Type + Main Chiller, !- Component 1 Name + Main Chiller Condenser Inlet Node, !- Component 1 Inlet Node Name + Main Chiller Condenser Outlet Node; !- Component 1 Outlet Node Name + + Branch, + WaterSide Economizer Condenser Branch, !- Name + , !- Pressure Drop Curve Name + HeatExchanger:FluidToFluid, !- Component 1 Object Type + Water Side Economizer, !- Component 1 Name + WaterSide Economizer Condenser Inlet Node, !- Component 1 Inlet Node Name + WaterSide Economizer Condenser Outlet Node; !- Component 1 Outlet Node Name + + Branch, + Condenser Demand Bypass Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Condenser Demand Side Bypass, !- Component 1 Name + Cond Demand Bypass Inlet Node, !- Component 1 Inlet Node Name + Cond Demand Bypass Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Condenser Demand Side Bypass, !- Name + Cond Demand Bypass Inlet Node, !- Inlet Node Name + Cond Demand Bypass Outlet Node; !- Outlet Node Name + + Branch, + Condenser Demand Outlet Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Condenser Demand Outlet Pipe, !- Component 1 Name + Condenser Demand Exit Pipe Inlet Node, !- Component 1 Inlet Node Name + Condenser Demand Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Condenser Demand Outlet Pipe, !- Name + Condenser Demand Exit Pipe Inlet Node, !- Inlet Node Name + Condenser Demand Outlet Node; !- Outlet Node Name + + Connector:Splitter, + Condenser Demand Splitter, !- Name + Condenser Demand Inlet Branch, !- Inlet Branch Name + Main Chiller Condenser Branch, !- Outlet Branch 1 Name + WaterSide Economizer Condenser Branch, !- Outlet Branch 2 Name + Condenser Demand Bypass Branch; !- Outlet Branch 3 Name + + Connector:Mixer, + Condenser Demand Mixer, !- Name + Condenser Demand Outlet Branch, !- Outlet Branch Name + Main Chiller Condenser Branch, !- Inlet Branch 1 Name + WaterSide Economizer Condenser Branch, !- Inlet Branch 2 Name + Condenser Demand Bypass Branch; !- Inlet Branch 3 Name + + Connector:Splitter, + Condenser Supply Splitter, !- Name + Condenser Supply Inlet Branch, !- Inlet Branch Name + Condenser Supply Tower Branch, !- Outlet Branch 1 Name + Condenser Supply Bypass Branch; !- Outlet Branch 2 Name + + Connector:Mixer, + Condenser Supply Mixer, !- Name + Condenser Supply Outlet Branch, !- Outlet Branch Name + Condenser Supply Tower Branch, !- Inlet Branch 1 Name + Condenser Supply Bypass Branch; !- Inlet Branch 2 Name + + CondenserEquipmentOperationSchemes, + Tower Loop Operation, !- Name + PlantEquipmentOperation:CoolingLoad, !- Control Scheme 1 Object Type + Year Round Tower Operation, !- Control Scheme 1 Name + ON; !- Control Scheme 1 Schedule Name + + PlantEquipmentOperation:CoolingLoad, + Year Round Tower Operation, !- Name + 0, !- Load Range 1 Lower Limit {W} + 90000000, !- Load Range 1 Upper Limit {W} + All Towers; !- Range 1 Equipment List Name + + CondenserEquipmentList, + All Towers, !- Name + CoolingTower:SingleSpeed,!- Equipment 1 Object Type + Big Tower1, !- Equipment 1 Name + CoolingTower:SingleSpeed,!- Equipment 2 Object Type + Big Tower2; !- Equipment 2 Name + + CoolingTower:SingleSpeed, + Big Tower1, !- Name + Condenser Tower 1 Inlet Node, !- Water Inlet Node Name + Condenser Tower 1 Outlet Node, !- Water Outlet Node Name + autosize, !- Design Water Flow Rate {m3/s} + autosize, !- Design Air Flow Rate {m3/s} + autosize, !- Design Fan Power {W} + autosize, !- Design U-Factor Times Area Value {W/K} + autocalculate, !- Free Convection Regime Air Flow Rate {m3/s} + , !- Free Convection Regime Air Flow Rate Sizing Factor + autocalculate, !- Free Convection Regime U-Factor Times Area Value {W/K} + , !- Free Convection U-Factor Times Area Value Sizing Factor + , !- Performance Input Method + , !- Heat Rejection Capacity and Nominal Capacity Sizing Ratio + , !- Nominal Capacity {W} + autocalculate, !- Free Convection Capacity {W} + , !- Free Convection Nominal Capacity Sizing Factor + , !- Design Inlet Air Dry-Bulb Temperature {C} + , !- Design Inlet Air Wet-Bulb Temperature {C} + , !- Design Approach Temperature {deltaC} + , !- Design Range Temperature {deltaC} + , !- Basin Heater Capacity {W/K} + , !- Basin Heater Setpoint Temperature {C} + , !- Basin Heater Operating Schedule Name + , !- Evaporation Loss Mode + , !- Evaporation Loss Factor {percent/K} + , !- Drift Loss Percent {percent} + , !- Blowdown Calculation Mode + , !- Blowdown Concentration Ratio + , !- Blowdown Makeup Water Usage Schedule Name + , !- Supply Water Storage Tank Name + , !- Outdoor Air Inlet Node Name + FluidBypass; !- Capacity Control + + CoolingTower:SingleSpeed, + Big Tower2, !- Name + Condenser Tower 1 Outlet Node, !- Water Inlet Node Name + Condenser Tower 2 Outlet Node, !- Water Outlet Node Name + autosize, !- Design Water Flow Rate {m3/s} + autosize, !- Design Air Flow Rate {m3/s} + autosize, !- Design Fan Power {W} + autosize, !- Design U-Factor Times Area Value {W/K} + autocalculate, !- Free Convection Regime Air Flow Rate {m3/s} + , !- Free Convection Regime Air Flow Rate Sizing Factor + autocalculate, !- Free Convection Regime U-Factor Times Area Value {W/K} + , !- Free Convection U-Factor Times Area Value Sizing Factor + , !- Performance Input Method + , !- Heat Rejection Capacity and Nominal Capacity Sizing Ratio + , !- Nominal Capacity {W} + autocalculate, !- Free Convection Capacity {W} + , !- Free Convection Nominal Capacity Sizing Factor + , !- Design Inlet Air Dry-Bulb Temperature {C} + , !- Design Inlet Air Wet-Bulb Temperature {C} + , !- Design Approach Temperature {deltaC} + , !- Design Range Temperature {deltaC} + , !- Basin Heater Capacity {W/K} + , !- Basin Heater Setpoint Temperature {C} + , !- Basin Heater Operating Schedule Name + , !- Evaporation Loss Mode + , !- Evaporation Loss Factor {percent/K} + , !- Drift Loss Percent {percent} + , !- Blowdown Calculation Mode + , !- Blowdown Concentration Ratio + , !- Blowdown Makeup Water Usage Schedule Name + , !- Supply Water Storage Tank Name + , !- Outdoor Air Inlet Node Name + FluidBypass; !- Capacity Control + + Pump:VariableSpeed, + Cond Circ Pump, !- Name + Condenser Supply Inlet Node, !- Inlet Node Name + Condenser Pump Outlet Node, !- Outlet Node Name + autosize, !- Design Maximum Flow Rate {m3/s} + 30000, !- Design Pump Head {Pa} + autosize, !- Design Power Consumption {W} + .87, !- Motor Efficiency + 0.0, !- Fraction of Motor Inefficiencies to Fluid Stream + 1, !- Coefficient 1 of the Part Load Performance Curve + 0, !- 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, !- Design Minimum Flow Rate {m3/s} + INTERMITTENT; !- Pump Control Type + + PlantLoop, + Hot Water Loop, !- Name + Water, !- Fluid Type + , !- User Defined Fluid Type + Hot Loop Operation, !- Plant Equipment Operation Scheme Name + HW Supply Outlet Node, !- Loop Temperature Setpoint Node Name + 100, !- Maximum Loop Temperature {C} + 10, !- Minimum Loop Temperature {C} + autosize, !- Maximum Loop Flow Rate {m3/s} + 0, !- Minimum Loop Flow Rate {m3/s} + autocalculate, !- Plant Loop Volume {m3} + HW Supply Inlet Node, !- Plant Side Inlet Node Name + HW Supply Outlet Node, !- Plant Side Outlet Node Name + Heating Supply Side Branches, !- Plant Side Branch List Name + Heating Supply Side Connectors, !- Plant Side Connector List Name + HW Demand Inlet Node, !- Demand Side Inlet Node Name + HW Demand Outlet Node, !- Demand Side Outlet Node Name + Heating Demand Side Branches, !- Demand Side Branch List Name + Heating Demand Side Connectors, !- Demand Side Connector List Name + Optimal; !- Load Distribution Scheme + + SetpointManager:Scheduled, + Hot Water Loop Setpoint Manager, !- Name + Temperature, !- Control Variable + HW Loop Temp Schedule, !- Schedule Name + Hot Water Loop Setpoint Node List; !- Setpoint Node or NodeList Name + + NodeList, + Hot Water Loop Setpoint Node List, !- Name + HW Supply Outlet Node; !- Node 1 Name + + BranchList, + Heating Supply Side Branches, !- Name + Heating Supply Inlet Branch, !- Branch 1 Name + Heating Purchased Hot Water Branch, !- Branch 2 Name + Heating Supply Bypass Branch, !- Branch 3 Name + Heating Supply Outlet Branch; !- Branch 4 Name + + ConnectorList, + Heating Supply Side Connectors, !- Name + Connector:Splitter, !- Connector 1 Object Type + Heating Supply Splitter, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + Heating Supply Mixer; !- Connector 2 Name + + Branch, + Heating Supply Inlet Branch, !- Name + , !- Pressure Drop Curve Name + Pump:VariableSpeed, !- Component 1 Object Type + HW Circ Pump, !- Component 1 Name + HW Supply Inlet Node, !- Component 1 Inlet Node Name + HW Pump Outlet Node; !- Component 1 Outlet Node Name + + Branch, + Heating Purchased Hot Water Branch, !- Name + , !- Pressure Drop Curve Name + DistrictHeating:Water, !- Component 1 Object Type + Purchased Heating, !- Component 1 Name + Purchased Heat Inlet Node, !- Component 1 Inlet Node Name + Purchased Heat Outlet Node; !- Component 1 Outlet Node Name + + Branch, + Heating Supply Bypass Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Heating Supply Side Bypass, !- Component 1 Name + Heating Supply Bypass Inlet Node, !- Component 1 Inlet Node Name + Heating Supply Bypass Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Heating Supply Side Bypass, !- Name + Heating Supply Bypass Inlet Node, !- Inlet Node Name + Heating Supply Bypass Outlet Node; !- Outlet Node Name + + Branch, + Heating Supply Outlet Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Heating Supply Outlet, !- Component 1 Name + Heating Supply Exit Pipe Inlet Node, !- Component 1 Inlet Node Name + HW Supply Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Heating Supply Outlet, !- Name + Heating Supply Exit Pipe Inlet Node, !- Inlet Node Name + HW Supply Outlet Node; !- Outlet Node Name + + BranchList, + Heating Demand Side Branches, !- Name + Reheat Inlet Branch, !- Branch 1 Name + West Zone Reheat Branch, !- Branch 2 Name + East Zone Reheat Branch, !- Branch 3 Name + North Zone Reheat Branch, !- Branch 4 Name + Reheat Bypass Branch, !- Branch 5 Name + Reheat Outlet Branch; !- Branch 6 Name + + ConnectorList, + Heating Demand Side Connectors, !- Name + Connector:Splitter, !- Connector 1 Object Type + Reheat Splitter, !- Connector 1 Name + Connector:Mixer, !- Connector 2 Object Type + Reheat Mixer; !- Connector 2 Name + + Branch, + Reheat Inlet Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Reheat Inlet Pipe, !- Component 1 Name + HW Demand Inlet Node, !- Component 1 Inlet Node Name + HW Demand Entrance Pipe Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Reheat Inlet Pipe, !- Name + HW Demand Inlet Node, !- Inlet Node Name + HW Demand Entrance Pipe Outlet Node; !- Outlet Node Name + + Branch, + Reheat Outlet Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Reheat Outlet Pipe, !- Component 1 Name + HW Demand Exit Pipe Inlet Node, !- Component 1 Inlet Node Name + HW Demand Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Reheat Outlet Pipe, !- Name + HW Demand Exit Pipe Inlet Node, !- Inlet Node Name + HW Demand Outlet Node; !- Outlet Node Name + + Branch, + West Zone Reheat Branch, !- Name + , !- Pressure Drop Curve Name + Coil:Heating:Water, !- Component 1 Object Type + Reheat Coil West Zone, !- Component 1 Name + West Zone Reheat Water Inlet Node, !- Component 1 Inlet Node Name + West Zone Reheat Water Outlet Node; !- Component 1 Outlet Node Name + + Branch, + East Zone Reheat Branch, !- Name + , !- Pressure Drop Curve Name + Coil:Heating:Water, !- Component 1 Object Type + Reheat Coil East Zone, !- Component 1 Name + East Zone Reheat Water Inlet Node, !- Component 1 Inlet Node Name + East Zone Reheat Water Outlet Node; !- Component 1 Outlet Node Name + + Branch, + North Zone Reheat Branch, !- Name + , !- Pressure Drop Curve Name + Coil:Heating:Water, !- Component 1 Object Type + Reheat Coil North Zone, !- Component 1 Name + North Zone Reheat Water Inlet Node, !- Component 1 Inlet Node Name + North Zone Reheat Water Outlet Node; !- Component 1 Outlet Node Name + + Branch, + Reheat Bypass Branch, !- Name + , !- Pressure Drop Curve Name + Pipe:Adiabatic, !- Component 1 Object Type + Reheat Bypass, !- Component 1 Name + Reheat Bypass Inlet Node, !- Component 1 Inlet Node Name + Reheat Bypass Outlet Node; !- Component 1 Outlet Node Name + + Pipe:Adiabatic, + Reheat Bypass, !- Name + Reheat Bypass Inlet Node, !- Inlet Node Name + Reheat Bypass Outlet Node; !- Outlet Node Name + + Connector:Splitter, + Reheat Splitter, !- Name + Reheat Inlet Branch, !- Inlet Branch Name + West Zone Reheat Branch, !- Outlet Branch 1 Name + East Zone Reheat Branch, !- Outlet Branch 2 Name + North Zone Reheat Branch, !- Outlet Branch 3 Name + Reheat Bypass Branch; !- Outlet Branch 4 Name + + Connector:Mixer, + Reheat Mixer, !- Name + Reheat Outlet Branch, !- Outlet Branch Name + West Zone Reheat Branch, !- Inlet Branch 1 Name + East Zone Reheat Branch, !- Inlet Branch 2 Name + North Zone Reheat Branch, !- Inlet Branch 3 Name + Reheat Bypass Branch; !- Inlet Branch 4 Name + + Connector:Splitter, + Heating Supply Splitter, !- Name + Heating Supply Inlet Branch, !- Inlet Branch Name + Heating Purchased Hot Water Branch, !- Outlet Branch 1 Name + Heating Supply Bypass Branch; !- Outlet Branch 2 Name + + Connector:Mixer, + Heating Supply Mixer, !- Name + Heating Supply Outlet Branch, !- Outlet Branch Name + Heating Purchased Hot Water Branch, !- Inlet Branch 1 Name + Heating Supply Bypass Branch; !- Inlet Branch 2 Name + + PlantEquipmentOperationSchemes, + Hot Loop Operation, !- Name + PlantEquipmentOperation:HeatingLoad, !- Control Scheme 1 Object Type + Purchased Only, !- Control Scheme 1 Name + ON; !- Control Scheme 1 Schedule Name + + PlantEquipmentOperation:HeatingLoad, + Purchased Only, !- Name + 0, !- Load Range 1 Lower Limit {W} + 1000000, !- Load Range 1 Upper Limit {W} + heating plant; !- Range 1 Equipment List Name + + PlantEquipmentList, + heating plant, !- Name + DistrictHeating:Water, !- Equipment 1 Object Type + Purchased Heating; !- Equipment 1 Name + + Pump:VariableSpeed, + HW Circ Pump, !- Name + HW Supply Inlet Node, !- Inlet Node Name + HW Pump Outlet Node, !- Outlet Node Name + .009, !- Design Maximum Flow Rate {m3/s} + 300000, !- Design Pump Head {Pa} + 6000, !- Design Power Consumption {W} + .87, !- Motor Efficiency + 0.0, !- Fraction of Motor Inefficiencies to Fluid Stream + 1, !- Coefficient 1 of the Part Load Performance Curve + 0, !- 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, !- Design Minimum Flow Rate {m3/s} + INTERMITTENT; !- Pump Control Type + + DistrictHeating:Water, + Purchased Heating, !- Name + Purchased Heat Inlet Node, !- Hot Water Inlet Node Name + Purchased Heat Outlet Node, !- Hot Water Outlet Node Name + autosize; !- Nominal Capacity {W} + + ZoneControl:Thermostat, + West Zone Thermostat, !- Name + WEST ZONE, !- Zone or ZoneList Name + Zone Control Type Sched, !- Control Type Schedule Name + ThermostatSetpoint:SingleHeating, !- Control 1 Object Type + Heating Setpoint with SB, !- Control 1 Name + ThermostatSetpoint:SingleCooling, !- Control 2 Object Type + Cooling Setpoint with SB; !- Control 2 Name + + ZoneControl:Thermostat, + East Zone Thermostat, !- Name + EAST ZONE, !- Zone or ZoneList Name + Zone Control Type Sched, !- Control Type Schedule Name + ThermostatSetpoint:SingleHeating, !- Control 1 Object Type + Heating Setpoint with SB, !- Control 1 Name + ThermostatSetpoint:SingleCooling, !- Control 2 Object Type + Cooling Setpoint with SB; !- Control 2 Name + + ZoneControl:Thermostat, + North Zone Thermostat, !- Name + NORTH ZONE, !- Zone or ZoneList Name + Zone Control Type Sched, !- Control Type Schedule Name + ThermostatSetpoint:SingleHeating, !- Control 1 Object Type + Heating Setpoint with SB, !- Control 1 Name + ThermostatSetpoint:SingleCooling, !- Control 2 Object Type + Cooling Setpoint with SB; !- Control 2 Name + + ThermostatSetpoint:SingleHeating, + Heating Setpoint with SB, !- Name + Heating Setpoints; !- Setpoint Temperature Schedule Name + + ThermostatSetpoint:SingleCooling, + Cooling Setpoint with SB, !- Name + Cooling Setpoints; !- Setpoint Temperature Schedule Name + + AirLoopHVAC:SupplyPath, + TermReheatSupplyPath, !- Name + Zone Equipment Inlet Node, !- Supply Air Path Inlet Node Name + AirLoopHVAC:ZoneSplitter, !- Component 1 Object Type + Zone Supply Air Splitter; !- Component 1 Name + + AirLoopHVAC:ReturnPath, + TermReheatReturnPath, !- Name + Return Air Mixer Outlet, !- Return Air Path Outlet Node Name + AirLoopHVAC:ZoneMixer, !- Component 1 Object Type + Zone Return Air Mixer; !- Component 1 Name + + ZoneHVAC:EquipmentConnections, + WEST ZONE, !- Zone Name + WestZoneEquipment, !- Zone Conditioning Equipment List Name + WestZoneInlets, !- Zone Air Inlet Node or NodeList Name + , !- Zone Air Exhaust Node or NodeList Name + West Zone Node, !- Zone Air Node Name + West Zone Outlet Node; !- Zone Return Air Node or NodeList Name + + ZoneHVAC:EquipmentConnections, + EAST ZONE, !- Zone Name + EastZoneEquipment, !- Zone Conditioning Equipment List Name + EastZoneInlets, !- Zone Air Inlet Node or NodeList Name + , !- Zone Air Exhaust Node or NodeList Name + East Zone Node, !- Zone Air Node Name + East Zone Outlet Node; !- Zone Return Air Node or NodeList Name + + ZoneHVAC:EquipmentConnections, + NORTH ZONE, !- Zone Name + NorthZoneEquipment, !- Zone Conditioning Equipment List Name + NorthZoneInlets, !- Zone Air Inlet Node or NodeList Name + , !- Zone Air Exhaust Node or NodeList Name + North Zone Node, !- Zone Air Node Name + North Zone Outlet Node; !- Zone Return Air Node or NodeList Name + + ZoneHVAC:EquipmentList, + WestZoneEquipment, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:AirDistributionUnit, !- Zone Equipment 1 Object Type + WestZoneTermReheat, !- 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, + EastZoneEquipment, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:AirDistributionUnit, !- Zone Equipment 1 Object Type + EastZoneTermReheat, !- 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, + NorthZoneEquipment, !- Name + SequentialLoad, !- Load Distribution Scheme + ZoneHVAC:AirDistributionUnit, !- Zone Equipment 1 Object Type + NorthZoneTermReheat, !- 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:AirDistributionUnit, + WestZoneTermReheat, !- Name + West Zone Reheat Air Outlet Node, !- Air Distribution Unit Outlet Node Name + AirTerminal:SingleDuct:ConstantVolume:Reheat, !- Air Terminal Object Type + Reheat West Zone; !- Air Terminal Name + + ZoneHVAC:AirDistributionUnit, + EastZoneTermReheat, !- Name + East Zone Reheat Air Outlet Node, !- Air Distribution Unit Outlet Node Name + AirTerminal:SingleDuct:ConstantVolume:Reheat, !- Air Terminal Object Type + Reheat East Zone; !- Air Terminal Name + + ZoneHVAC:AirDistributionUnit, + NorthZoneTermReheat, !- Name + North Zone Reheat Air Outlet Node, !- Air Distribution Unit Outlet Node Name + AirTerminal:SingleDuct:ConstantVolume:Reheat, !- Air Terminal Object Type + Reheat North Zone; !- Air Terminal Name + + NodeList, + WestZoneInlets, !- Name + West Zone Reheat Air Outlet Node; !- Node 1 Name + + NodeList, + EastZoneInlets, !- Name + East Zone Reheat Air Outlet Node; !- Node 1 Name + + NodeList, + NorthZoneInlets, !- Name + North Zone Reheat Air Outlet Node; !- Node 1 Name + + Fan:ConstantVolume, + Supply Fan 1, !- Name + FanAndCoilAvailSched, !- Availability Schedule Name + 0.7, !- Fan Total Efficiency + 600.0, !- Pressure Rise {Pa} + 18.5, !- Maximum Flow Rate {m3/s} + 0.9, !- Motor Efficiency + 1.0, !- Motor In Airstream Fraction + Air Loop Inlet Node, !- Air Inlet Node Name + Cooling Coil Air Inlet Node; !- Air Outlet Node Name + + Coil:Cooling:Water:DetailedGeometry, + Detailed Cooling Coil, !- Name + CoolingCoilAvailSched, !- Availability Schedule Name + autosize, !- Maximum Water Flow Rate {m3/s} + autosize, !- Tube Outside Surface Area {m2} + autosize, !- Total Tube Inside Area {m2} + autosize, !- Fin Surface Area {m2} + autosize, !- Minimum Airflow Area {m2} + autosize, !- Coil Depth {m} + autosize, !- Fin Diameter {m} + , !- Fin Thickness {m} + , !- Tube Inside Diameter {m} + , !- Tube Outside Diameter {m} + , !- Tube Thermal Conductivity {W/m-K} + , !- Fin Thermal Conductivity {W/m-K} + , !- Fin Spacing {m} + , !- Tube Depth Spacing {m} + , !- Number of Tube Rows + autosize, !- Number of Tubes per Row + Cooling Coil Water Inlet Node, !- Water Inlet Node Name + Cooling Coil Water Outlet Node, !- Water Outlet Node Name + Cooling Coil Air Inlet Node, !- Air Inlet Node Name + Air Loop Outlet Node; !- Air Outlet Node Name + + AirTerminal:SingleDuct:ConstantVolume:Reheat, + Reheat West Zone, !- Name + FanAndCoilAvailSched, !- Availability Schedule Name + West Zone Reheat Air Outlet Node, !- Air Outlet Node Name + West Zone Reheat Air Inlet Node, !- Air Inlet Node Name + autosize, !- Maximum Air Flow Rate {m3/s} + Coil:Heating:Water, !- Reheat Coil Object Type + Reheat Coil West Zone, !- Reheat Coil Name + autosize, !- Maximum Hot Water or Steam Flow Rate {m3/s} + 0.0; !- Minimum Hot Water or Steam Flow Rate {m3/s} + + AirTerminal:SingleDuct:ConstantVolume:Reheat, + Reheat East Zone, !- Name + FanAndCoilAvailSched, !- Availability Schedule Name + East Zone Reheat Air Outlet Node, !- Air Outlet Node Name + East Zone Reheat Air Inlet Node, !- Air Inlet Node Name + autosize, !- Maximum Air Flow Rate {m3/s} + Coil:Heating:Water, !- Reheat Coil Object Type + Reheat Coil East Zone, !- Reheat Coil Name + autosize, !- Maximum Hot Water or Steam Flow Rate {m3/s} + 0.0; !- Minimum Hot Water or Steam Flow Rate {m3/s} + + AirTerminal:SingleDuct:ConstantVolume:Reheat, + Reheat North Zone, !- Name + FanAndCoilAvailSched, !- Availability Schedule Name + North Zone Reheat Air Outlet Node, !- Air Outlet Node Name + North Zone Reheat Air Inlet Node, !- Air Inlet Node Name + autosize, !- Maximum Air Flow Rate {m3/s} + Coil:Heating:Water, !- Reheat Coil Object Type + Reheat Coil North Zone, !- Reheat Coil Name + autosize, !- Maximum Hot Water or Steam Flow Rate {m3/s} + 0.0; !- Minimum Hot Water or Steam Flow Rate {m3/s} + + Coil:Heating:Water, + Reheat Coil West Zone, !- Name + FanAndCoilAvailSched, !- Availability Schedule Name + autosize, !- U-Factor Times Area Value {W/K} + autosize, !- Maximum Water Flow Rate {m3/s} + West Zone Reheat Water Inlet Node, !- Water Inlet Node Name + West Zone Reheat Water Outlet Node, !- Water Outlet Node Name + West Zone Reheat Air Inlet Node, !- Air Inlet Node Name + West Zone Reheat Air Outlet Node, !- Air Outlet Node Name + UFactorTimesAreaAndDesignWaterFlowRate, !- Performance Input Method + autosize, !- Rated Capacity {W} + 82.2, !- Rated Inlet Water Temperature {C} + 16.6, !- Rated Inlet Air Temperature {C} + 71.1, !- Rated Outlet Water Temperature {C} + 32.2, !- Rated Outlet Air Temperature {C} + ; !- Rated Ratio for Air and Water Convection + + Coil:Heating:Water, + Reheat Coil East Zone, !- Name + FanAndCoilAvailSched, !- Availability Schedule Name + autosize, !- U-Factor Times Area Value {W/K} + autosize, !- Maximum Water Flow Rate {m3/s} + East Zone Reheat Water Inlet Node, !- Water Inlet Node Name + East Zone Reheat Water Outlet Node, !- Water Outlet Node Name + East Zone Reheat Air Inlet Node, !- Air Inlet Node Name + East Zone Reheat Air Outlet Node, !- Air Outlet Node Name + UFactorTimesAreaAndDesignWaterFlowRate, !- Performance Input Method + autosize, !- Rated Capacity {W} + 82.2, !- Rated Inlet Water Temperature {C} + 16.6, !- Rated Inlet Air Temperature {C} + 71.1, !- Rated Outlet Water Temperature {C} + 32.2, !- Rated Outlet Air Temperature {C} + ; !- Rated Ratio for Air and Water Convection + + Coil:Heating:Water, + Reheat Coil North Zone, !- Name + FanAndCoilAvailSched, !- Availability Schedule Name + autosize, !- U-Factor Times Area Value {W/K} + autosize, !- Maximum Water Flow Rate {m3/s} + North Zone Reheat Water Inlet Node, !- Water Inlet Node Name + North Zone Reheat Water Outlet Node, !- Water Outlet Node Name + North Zone Reheat Air Inlet Node, !- Air Inlet Node Name + North Zone Reheat Air Outlet Node, !- Air Outlet Node Name + UFactorTimesAreaAndDesignWaterFlowRate, !- Performance Input Method + autosize, !- Rated Capacity {W} + 82.2, !- Rated Inlet Water Temperature {C} + 16.6, !- Rated Inlet Air Temperature {C} + 71.1, !- Rated Outlet Water Temperature {C} + 32.2, !- Rated Outlet Air Temperature {C} + ; !- Rated Ratio for Air and Water Convection + + AirLoopHVAC:ZoneSplitter, + Zone Supply Air Splitter,!- Name + Zone Equipment Inlet Node, !- Inlet Node Name + West Zone Reheat Air Inlet Node, !- Outlet 1 Node Name + East Zone Reheat Air Inlet Node, !- Outlet 2 Node Name + North Zone Reheat Air Inlet Node; !- Outlet 3 Node Name + + AirLoopHVAC:ZoneMixer, + Zone Return Air Mixer, !- Name + Return Air Mixer Outlet, !- Outlet Node Name + West Zone Outlet Node, !- Inlet 1 Node Name + East Zone Outlet Node, !- Inlet 2 Node Name + North Zone Outlet Node; !- Inlet 3 Node Name + + Controller:WaterCoil, + Main Cooling Coil Controller, !- Name + Temperature, !- Control Variable + Reverse, !- Action + FLOW, !- Actuator Variable + Air Loop Outlet Node, !- Sensor Node Name + Cooling Coil Water Inlet Node, !- Actuator Node Name + autosize, !- Controller Convergence Tolerance {deltaC} + autosize, !- Maximum Actuated Flow {m3/s} + 0.0; !- Minimum Actuated Flow {m3/s} + + SetpointManager:Scheduled, + Supply Air Temp Manager, !- Name + Temperature, !- Control Variable + Seasonal Reset Supply Air Temp Sch, !- Schedule Name + Supply Air Temp Nodes; !- Setpoint Node or NodeList Name + + NodeList, + Supply Air Temp Nodes, !- Name + Air Loop Outlet Node; !- Node 1 Name + + Output:Surfaces:Drawing,dxf; + + ! Output:Diagnostics,DisplayExtraWarnings; + + Output:Variable,*,Plant Supply Side Cooling Demand Rate,timestep; + + Output:Variable,*,Plant Supply Side Heating Demand Rate,timestep; + + Output:Variable,*,Chiller Evaporator Inlet Temperature,timestep; + + Output:Variable,*,Chiller Evaporator Outlet Temperature,timestep; + + Output:Variable,*,Chiller Evaporator Mass Flow Rate,timestep; + + Output:Variable,*,Chiller Condenser Inlet Temperature,timestep; + + Output:Variable,*,Chiller Condenser Outlet Temperature,timestep; + + Output:Variable,*,Chiller Condenser Mass Flow Rate,timestep; + + Output:Variable,*,Chiller Evaporator Cooling Rate,timestep; + + Output:Variable,*,Chiller Condenser Heat Transfer Rate,timestep; + + Output:Variable,*,Cooling Tower Inlet Temperature,timestep; + + Output:Variable,*,Cooling Tower Outlet Temperature,timestep; + + Output:Variable,*,Cooling Tower Mass Flow Rate,timestep; + + Output:Variable,*,Cooling Tower Heat Transfer Rate,timestep; + + Output:Variable,*,Chiller Electricity Rate,timestep; + + Output:Variable,*,Thermosiphon Status,timestep; + + Output:Variable,*,Site Outdoor Air Drybulb Temperature,timestep; + + Output:Variable,*,Site Outdoor Air Wetbulb Temperature,timestep; + + Output:Variable,*,Fluid Heat Exchanger Heat Transfer Rate,timestep; + + Output:Variable,*,Fluid Heat Exchanger Heat Transfer Energy,timestep; + + Output:Variable,*,Fluid Heat Exchanger Loop Supply Side Mass Flow Rate,timestep; + + Output:Variable,*,Fluid Heat Exchanger Loop Supply Side Inlet Temperature,timestep; + + Output:Variable,*,Fluid Heat Exchanger Loop Supply Side Outlet Temperature,timestep; + + Output:Variable,*,Fluid Heat Exchanger Loop Demand Side Mass Flow Rate,timestep; + + Output:Variable,*,Fluid Heat Exchanger Loop Demand Side Inlet Temperature,timestep; + + Output:Variable,*,Fluid Heat Exchanger Loop Demand Side Outlet Temperature,timestep; + + Output:Variable,*,Fluid Heat Exchanger Operation Status,timestep; + + Output:Variable,*,Fluid Heat Exchanger Effectiveness,timestep; + + Output:Variable,*,Zone Air System Sensible Cooling Rate,timestep; + + Output:Variable,*,Zone Air System Sensible Heating Rate,timestep; + + Output:Variable,*,Zone Air Temperature,timestep; + + Output:Variable,*,Cooling Coil Total Cooling Energy,timestep; + + Output:Variable,*,Heating Coil Heating Energy,timestep; + + Output:Variable,CW Pump Outlet Node,System Node Temperature,timestep; + + Output:Variable,WaterSide Economizer Outlet Node,System Node Temperature,timestep; + + Output:Variable,WaterSide Economizer Condenser Inlet Node,System Node Temperature,timestep; + + Output:Variable,WaterSide Economizer Condenser Outlet Node,System Node Temperature,timestep; + + Output:Variable,*,Plant Supply Side Inlet Temperature,timestep; + + Output:Variable,*,Plant Supply Side Outlet Temperature,timestep; + + Output:VariableDictionary,IDF; + + Output:Meter:MeterFileOnly,Electricity:Facility,monthly; + + Output:Meter:MeterFileOnly,Electricity:Building,monthly; + + Output:Meter:MeterFileOnly,InteriorLights:Electricity,monthly; + + Output:Meter:MeterFileOnly,Electricity:HVAC,monthly; + + Output:Meter:MeterFileOnly,Electricity:Plant,monthly; + + Output:Meter:MeterFileOnly,Electricity:Facility,runperiod; + + Output:Meter:MeterFileOnly,Electricity:Building,runperiod; + + Output:Meter:MeterFileOnly,InteriorLights:Electricity,runperiod; + + Output:Meter:MeterFileOnly,Electricity:HVAC,runperiod; + + Output:Meter:MeterFileOnly,Electricity:Plant,runperiod; + + OutputControl:Table:Style, + HTML; !- Column Separator + + Output:Table:SummaryReports, + AllSummary; !- Report 1 Name + + Output:Variable,*,Plant Supply Side Outlet Temperature,timestep; + diff --git a/testfiles/PlantLoopHeatPump_EIR_LargeOffice-2-AWHP-AuxBoiler-Pri-Sec-4PipeBeam.idf b/testfiles/PlantLoopHeatPump_EIR_LargeOffice-2-AWHP-AuxBoiler-Pri-Sec-4PipeBeam.idf index f066a5f361a..4934b557bfd 100644 --- a/testfiles/PlantLoopHeatPump_EIR_LargeOffice-2-AWHP-AuxBoiler-Pri-Sec-4PipeBeam.idf +++ b/testfiles/PlantLoopHeatPump_EIR_LargeOffice-2-AWHP-AuxBoiler-Pri-Sec-4PipeBeam.idf @@ -8424,54 +8424,81 @@ AWHP_2 Cooling Side Outlet Node; HeatPump:PlantLoop:EIR:Cooling, - AWHP_1 Cooling Side, !- Name + AWHP_1 Cooling Side, !- Name AWHP_1 Cooling Side Inlet Node, !- Load Side Inlet Node Name - AWHP_1 Cooling Side Outlet Node, !- Load Side Outlet Node Name - AirSource, !- Condenser Type + AWHP_1 Cooling Side Outlet Node, !- Load Side Outlet Node Name + AirSource, !- Condenser Type AWHP_1 Cooling Side Condenser Air Inlet Node, !- Source Side Inlet Node Name AWHP_1 Cooling Side Condenser Air Outlet Node, !- Source Side Outlet Node Name - , !- Heat Recovery Inlet Node Name - , !- Heat Recovery Outlet Node Name - AWHP_1 Heating Side, !- Companion Heat Pump Name - autosize, !- Load Side Reference Flow Rate {m3/s} - autosize, !- Source Side Reference Flow Rate {m3/s} - , !- Heat Recovery Reference Flow Rate {m3/s} - autosize, !- Reference Capacity {W} - 2.89, !- Reference Coefficient of Performance {W/W} - 1.0, !- Sizing Factor - CoolCapCurveFuncTemp, !- Capacity Modifier Function of Temperature Curve Name - CoolEIRCurveFuncTemp, !- Electric Input to Output Ratio Modifier Function of Temperature Curve Name - EIRCurveFuncPLR, !- Electric Input to Output Ratio Modifier Function of Part Load Ratio Curve Name - Setpoint, !- Control Type + , !- Heat Recovery Inlet Node Name + , !- Heat Recovery Outlet Node Name + AWHP_1 Heating Side, !- Companion Heat Pump Name + autosize, !- Load Side Reference Flow Rate {m3/s} + autosize, !- Source Side Reference Flow Rate {m3/s} + , !- Heat Recovery Reference Flow Rate {m3/s} + autosize, !- Reference Capacity {W} + 2.89, !- Reference Coefficient of Performance {W/W} + 1.0, !- Sizing Factor + CoolCapCurveFuncTemp, !- Capacity Modifier Function of Temperature Curve Name + CoolEIRCurveFuncTemp, !- Electric Input to Output Ratio Modifier Function of Temperature Curve Name + EIRCurveFuncPLR, !- Electric Input to Output Ratio Modifier Function of Part Load Ratio Curve Name + Setpoint, !- Control Type VariableSpeedPumping, !- Flow Mode - 0.2; !- Minimum Part Load Ratio + 0.2, !- Minimum Part Load Ratio + , !- Minimum Source Inlet Temperature + , !- Maximum Source Inlet Temperature + , !- Minimum Supply Water Temperature Curve Name + , !- Maximum Supply Water Temperature Curve Name + , !- Maximum Heat Recovery Outlet Temperature + , !- Heat Recovery Capacity Modifier Function of Temperature Curve Name + , !- Heat Recovery Electric Input to Output Ratio Modifier Function of Temperature Curve Name + ThermosiphonCurve, !- Thermosiphon Temperature Difference Curve Name + 2.0; !- Thermosiphon Minimum Temperature Difference OutdoorAir:Node, AWHP_1 Cooling Side Condenser Air Inlet Node, -1; HeatPump:PlantLoop:EIR:Cooling, - AWHP_2 Cooling Side, !- Name - AWHP_2 Cooling Side Inlet Node, !- Load Side Inlet Node Name + AWHP_2 Cooling Side, !- Name + AWHP_2 Cooling Side Inlet Node, !- Load Side Inlet Node Name AWHP_2 Cooling Side Outlet Node, !- Load Side Outlet Node Name - AirSource, !- Condenser Type + AirSource, !- Condenser Type AWHP_2 Condenser Air Inlet Node, !- Source Side Inlet Node Name - AWHP_2 Condenser Air Outlet Node, !- Source Side Outlet Node Name - , !- Heat Recovery Inlet Node Name - , !- Heat Recovery Outlet Node Name - AWHP_2 Heating Side, !- Companion Heat Pump Name - autosize, !- Load Side Reference Flow Rate {m3/s} - autosize, !- Source Side Reference Flow Rate {m3/s} - , !- Heat Recovery Reference Flow Rate {m3/s} - autosize, !- Reference Capacity {W} - 2.89, !- Reference Coefficient of Performance {W/W} - 1.0, !- Sizing Factor - CoolCapCurveFuncTemp, !- Capacity Modifier Function of Temperature Curve Name - CoolEIRCurveFuncTemp, !- Electric Input to Output Ratio Modifier Function of Temperature Curve Name - EIRCurveFuncPLR, !- Electric Input to Output Ratio Modifier Function of Part Load Ratio Curve Name - Setpoint, !- Control Type - VariableSpeedPumping, !- Flow Mode - 0.2; !- Minimum Part Load Ratio + AWHP_2 Condenser Air Outlet Node, !- Source Side Outlet Node Name + , !- Heat Recovery Inlet Node Name + , !- Heat Recovery Outlet Node Name + AWHP_2 Heating Side, !- Companion Heat Pump Name + autosize, !- Load Side Reference Flow Rate {m3/s} + autosize, !- Source Side Reference Flow Rate {m3/s} + , !- Heat Recovery Reference Flow Rate {m3/s} + autosize, !- Reference Capacity {W} + 2.89, !- Reference Coefficient of Performance {W/W} + 1.0, !- Sizing Factor + CoolCapCurveFuncTemp, !- Capacity Modifier Function of Temperature Curve Name + CoolEIRCurveFuncTemp, !- Electric Input to Output Ratio Modifier Function of Temperature Curve Name + EIRCurveFuncPLR, !- Electric Input to Output Ratio Modifier Function of Part Load Ratio Curve Name + Setpoint, !- Control Type + VariableSpeedPumping, !- Flow Mode + 0.2, !- Minimum Part Load Ratio + , !- Minimum Source Inlet Temperature + , !- Maximum Source Inlet Temperature + , !- Minimum Supply Water Temperature Curve Name + , !- Maximum Supply Water Temperature Curve Name + , !- Maximum Heat Recovery Outlet Temperature + , !- Heat Recovery Capacity Modifier Function of Temperature Curve Name + , !- Heat Recovery Electric Input to Output Ratio Modifier Function of Temperature Curve Name + ThermosiphonCurve, !- Thermosiphon Temperature Difference Curve Name + 2.0; !- Thermosiphon Minimum Temperature Difference + + Curve:Linear, + ThermosiphonCurve, !- Name + 0, !- Coefficient1 Constant + 0.06, !- Coefficient2 x + 0, !- Minimum Value of x + 30.0, !- Maximum Value of x + 0.0, !- Minimum Curve Output + 1.0; !- Maximum Curve Output !- ACX 140 Biquadratic cooling curves provided by Trane Curve:Biquadratic, @@ -10327,6 +10354,7 @@ Curve:Biquadratic, Output:Variable,*,Heat Pump Electricity Rate,hourly; !- HVAC Average [W] Output:Variable,*,Heat Pump Load Side Mass Flow Rate,hourly; !- HVAC Average [kg/s] Output:Variable,*,Heat Pump Source Side Mass Flow Rate,hourly; !- HVAC Average [kg/s] + Output:Variable,*,Thermosiphon Status,hourly; !- HVAC Average [kg/s] Output:Variable,*,Boiler Heating Rate,hourly; !- HVAC Average [W] Output:Variable,*,Boiler Inlet Temperature,hourly; !- HVAC Average [C] diff --git a/tst/EnergyPlus/unit/ChillerConstantCOP.unit.cc b/tst/EnergyPlus/unit/ChillerConstantCOP.unit.cc index 243ab782532..f860da107b3 100644 --- a/tst/EnergyPlus/unit/ChillerConstantCOP.unit.cc +++ b/tst/EnergyPlus/unit/ChillerConstantCOP.unit.cc @@ -52,6 +52,7 @@ // EnergyPlus Headers #include "Fixtures/EnergyPlusFixture.hh" +#include #include #include #include @@ -90,7 +91,11 @@ TEST_F(EnergyPlusFixture, ChillerConstantCOP_WaterCooled_Autosize) " ConstantFlow, !- Chiller Flow Mode", " 1, !- Sizing Factor", " , !- Basin Heater Capacity {W/K}", - " 2; !- Basin Heater Setpoint Temperature {C}", + " 2, !- Basin Heater Setpoint Temperature {C}", + " , !- temperature difference described above", + " ThermoCapFracCurve; !- Thermosiphon Capacity Fraction Curve Name", + + "Curve:Linear, ThermoCapFracCurve, 0.0, 0.06, 0.0, 10.0, 0.0, 1.0, Dimensionless, Dimensionless;", }); EXPECT_TRUE(process_idf(idf_objects, false)); @@ -162,6 +167,37 @@ TEST_F(EnergyPlusFixture, ChillerConstantCOP_WaterCooled_Autosize) // check autocalculate chiller side cond water flow rate EXPECT_NEAR(thisChiller.CondVolFlowRate, 0.0012606164769923673, 0.0000001); EXPECT_NEAR(thisChiller.CondMassFlowRateMax, 1.2604878941117141, 0.0000001); + + // test thermosiphon model + DataBranchAirLoopPlant::ControlType const EquipFlowCtrl = DataBranchAirLoopPlant::ControlType::SeriesActive; + state->dataLoopNodes->Node(thisChiller.EvapInletNodeNum).Temp = 10.0; + state->dataLoopNodes->Node(thisChiller.EvapOutletNodeNum).Temp = 6.0; + state->dataLoopNodes->Node(thisChiller.EvapOutletNodeNum).TempSetPoint = 6.0; + state->dataLoopNodes->Node(thisChiller.CondInletNodeNum).Temp = 12.0; // condenser inlet temp > evap outlet temp + + thisChiller.initialize(*state, RunFlag, MyLoad); + thisChiller.calculate(*state, MyLoad, RunFlag, EquipFlowCtrl); + EXPECT_GT(thisChiller.partLoadRatio, 0.95); // load is large + EXPECT_EQ(thisChiller.thermosiphonStatus, 0); // thermosiphon is off + EXPECT_GT(thisChiller.Power, 4000.0); // power is non-zero + + state->dataLoopNodes->Node(thisChiller.CondInletNodeNum).Temp = 5.0; // condenser inlet temp < evap outlet temp + + thisChiller.initialize(*state, RunFlag, MyLoad); + thisChiller.calculate(*state, MyLoad, RunFlag, EquipFlowCtrl); + EXPECT_GT(thisChiller.partLoadRatio, 0.95); // load is large + EXPECT_EQ(thisChiller.thermosiphonStatus, 0); // thermosiphon is off + EXPECT_GT(thisChiller.Power, 4000.0); // power is non-zero + + MyLoad /= 15.0; // reduce load such that thermosiphon can meet load + thisChiller.initialize(*state, RunFlag, MyLoad); + thisChiller.calculate(*state, MyLoad, RunFlag, EquipFlowCtrl); + Real64 dT = thisChiller.EvapOutletTemp - thisChiller.CondInletTemp; + Real64 thermosiphonCapFrac = Curve::CurveValue(*state, thisChiller.thermosiphonTempCurveIndex, dT); + EXPECT_LT(thisChiller.partLoadRatio, 0.065); // load is small + EXPECT_GT(thermosiphonCapFrac, thisChiller.partLoadRatio); // thermosiphon capacity can meet load + EXPECT_EQ(thisChiller.thermosiphonStatus, 1); // thermosiphon is on + EXPECT_EQ(thisChiller.Power, 0.0); // power is zero } TEST_F(EnergyPlusFixture, ChillerConstantCOP_Default_Des_Cond_Evap_Temps) diff --git a/tst/EnergyPlus/unit/ChillerElectric.unit.cc b/tst/EnergyPlus/unit/ChillerElectric.unit.cc index e0afecb93c2..1eb1c9bfcc2 100644 --- a/tst/EnergyPlus/unit/ChillerElectric.unit.cc +++ b/tst/EnergyPlus/unit/ChillerElectric.unit.cc @@ -52,6 +52,7 @@ // EnergyPlus Headers #include "Fixtures/EnergyPlusFixture.hh" +#include #include #include #include @@ -236,7 +237,30 @@ TEST_F(EnergyPlusFixture, ChillerElectric_WaterCooled_Simulate) " 0.6852, !- Coefficient 2 of Full Load Ratio Curve", " 0.2818, !- Coefficient 3 of Full Load Ratio Curve", " 5, !- Chilled Water Outlet Temperature Lower Limit {C}", - " LeavingSetpointModulated;!- Chiller Flow Mode", + " LeavingSetpointModulated,!- Chiller Flow Mode", + " , !- Design Heat Recovery Water Flow Rate", + " , !- Heat Recovery Inlet Node Name", + " , !- Heat Recovery Outlet Node Name", + " , !- Sizing Factor", + " , !- Basin Heater Capacity", + " , !- Basin Heater Setpoint Temperature", + " , !- Basin Heater Operating Schedule Name", + " , !- Condenser Heat Recovery Relative Capacity Fraction", + " , !- Heat Recovery Inlet High Temperature Limit Schedule Name", + " , !- Heat Recovery Leaving Temperature Setpoint Node Name", + " , !- End-Use Subcategory", + " ThermoCapFracCurve; !- Thermosiphon Capacity Fraction Curve Name", + + " Curve:Linear,", + " ThermoCapFracCurve, !- Name", + " 0.0, !- Coefficient1 Constant", + " 0.06, !- Coefficient2 x", + " 0.0, !- Minimum Value of x", + " 10.0, !- Maximum Value of x", + " 0.0, !- Minimum Curve Output", + " 1.0, !- Maximum Curve Output", + " Dimensionless, !- Input Unit Type for X", + " Dimensionless; !- Output Unit Type", }); EXPECT_TRUE(process_idf(idf_objects, false)); @@ -268,6 +292,8 @@ TEST_F(EnergyPlusFixture, ChillerElectric_WaterCooled_Simulate) state->dataPlantChillers->ElectricChiller(1).EvapInletNodeNum; state->dataPlnt->PlantLoop(1).LoopSide(DataPlant::LoopSideLocation::Demand).Branch(1).Comp(1).NodeNumOut = state->dataPlantChillers->ElectricChiller(1).EvapOutletNodeNum; + state->dataPlnt->PlantLoop(1).LoopDemandCalcScheme = DataPlant::LoopDemandCalcScheme::SingleSetPoint; + state->dataPlnt->PlantLoop(1).TempSetPointNodeNum = state->dataPlantChillers->ElectricChiller(1).EvapOutletNodeNum; state->dataPlnt->PlantLoop(2).Name = "CondenserWaterLoop"; state->dataPlnt->PlantLoop(2).FluidName = "CondenserWater"; @@ -334,4 +360,35 @@ TEST_F(EnergyPlusFixture, ChillerElectric_WaterCooled_Simulate) Real64 TestCOP = thisChiller.QEvaporator / thisChiller.Power; EXPECT_NEAR(TestCOP, thisChiller.ActualCOP, 1E-3); + + // test thermosiphon model + DataBranchAirLoopPlant::ControlType const EquipFlowCtrl = DataBranchAirLoopPlant::ControlType::SeriesActive; + state->dataLoopNodes->Node(thisChiller.EvapInletNodeNum).Temp = 10.0; + state->dataLoopNodes->Node(thisChiller.EvapOutletNodeNum).Temp = 6.0; + state->dataLoopNodes->Node(thisChiller.EvapOutletNodeNum).TempSetPoint = 6.0; + state->dataLoopNodes->Node(thisChiller.CondInletNodeNum).Temp = 12.0; // condenser inlet temp > evap outlet temp + + thisChiller.initialize(*state, RunFlag, MyLoad); + thisChiller.calculate(*state, MyLoad, RunFlag, EquipFlowCtrl); + EXPECT_GT(thisChiller.partLoadRatio, 0.77); // load is large + EXPECT_EQ(thisChiller.thermosiphonStatus, 0); // thermosiphon is off + EXPECT_GT(thisChiller.Power, 3000.0); // power is non-zero + + state->dataLoopNodes->Node(thisChiller.CondInletNodeNum).Temp = 5.0; // condenser inlet temp < evap outlet temp + + thisChiller.initialize(*state, RunFlag, MyLoad); + thisChiller.calculate(*state, MyLoad, RunFlag, EquipFlowCtrl); + EXPECT_GT(thisChiller.partLoadRatio, 0.73); // load is large + EXPECT_EQ(thisChiller.thermosiphonStatus, 0); // thermosiphon is off + EXPECT_GT(thisChiller.Power, 3000.0); // power is non-zero + + MyLoad /= 15.0; // reduce load such that thermosiphon can meet load + thisChiller.initialize(*state, RunFlag, MyLoad); + thisChiller.calculate(*state, MyLoad, RunFlag, EquipFlowCtrl); + Real64 dT = thisChiller.EvapOutletTemp - thisChiller.CondInletTemp; + Real64 thermosiphonCapFrac = Curve::CurveValue(*state, thisChiller.thermosiphonTempCurveIndex, dT); + EXPECT_LT(thisChiller.partLoadRatio, 0.05); // load is small + EXPECT_GT(thermosiphonCapFrac, thisChiller.partLoadRatio); // thermosiphon capacity can meet load + EXPECT_EQ(thisChiller.thermosiphonStatus, 1); // thermosiphon is on + EXPECT_EQ(thisChiller.Power, 0.0); // power is zero } diff --git a/tst/EnergyPlus/unit/ChillerElectricEIR.unit.cc b/tst/EnergyPlus/unit/ChillerElectricEIR.unit.cc index aba9d5ec626..e7da610059a 100644 --- a/tst/EnergyPlus/unit/ChillerElectricEIR.unit.cc +++ b/tst/EnergyPlus/unit/ChillerElectricEIR.unit.cc @@ -52,6 +52,7 @@ // EnergyPlus Headers #include +#include #include #include #include @@ -159,7 +160,7 @@ TEST_F(EnergyPlusFixture, ChillerElectricEIR_AirCooledChiller) " Air cooled CentCapFT, !- Cooling Capacity Function of Temperature Curve Name", " Air cooled CentEIRFT, !- Electric Input to Cooling Output Ratio Function of Temperature Curve Name", " Air cooled CentEIRFPLR, !- Electric Input to Cooling Output Ratio Function of Part Load Ratio Curve Name", - " 0.10, !- Minimum Part Load Ratio", + " 0.25, !- Minimum Part Load Ratio", " 1.00, !- Maximum Part Load Ratio", " 1.00, !- Optimum Part Load Ratio", " 0.25, !- Minimum Unloading Ratio", @@ -181,8 +182,15 @@ TEST_F(EnergyPlusFixture, ChillerElectricEIR_AirCooledChiller) " , !- Basin Heater Operating Schedule Name", " 1.00, !- Condenser Heat Recovery Relative Capacity Fraction", " , !- Heat Recovery Inlet High Temperature Limit Schedule Name", - " ; !- Heat Recovery Leaving Temperature Setpoint Node Name", + " , !- Heat Recovery Leaving Temperature Setpoint Node Name", + " , !- End-Use Subcategory", + " , !- Condenser Flow Control", + " , !- Condenser Loop Flow Rate Fraction Function of Loop Part Load Ratio Curve Name", + " , !- Temperature Difference Across Condenser Schedule Name", + " , !- Condenser Minimum Flow Fraction", + " ThermoCapFracCurve; !- Thermosiphon Capacity Fraction Curve Name", + "Curve:Linear, ThermoCapFracCurve, 0.0, 0.06, 0.0, 10.0, 0.0, 1.0, Dimensionless, Dimensionless;", "Curve:Biquadratic, Air cooled CentCapFT, 0.257896, 0.0389016, -0.00021708, 0.0468684, -0.00094284, -0.00034344, 5, 10, 24, 35, , , , , ;", "Curve:Biquadratic, Air cooled CentEIRFT, 0.933884, -0.058212, 0.00450036, 0.00243, 0.000486, -0.001215, 5, 10, 24, 35, , , , , ;", "Curve:Quadratic, Air cooled CentEIRFPLR, 0.222903, 0.313387, 0.46371, 0, 1, , , , ;", @@ -217,6 +225,8 @@ TEST_F(EnergyPlusFixture, ChillerElectricEIR_AirCooledChiller) DataPlant::PlantEquipmentType::Chiller_ElectricEIR; state->dataPlnt->PlantLoop(1).LoopSide(DataPlant::LoopSideLocation::Demand).Branch(1).Comp(1).NodeNumIn = thisEIR.EvapInletNodeNum; state->dataPlnt->PlantLoop(1).LoopSide(DataPlant::LoopSideLocation::Demand).Branch(1).Comp(1).NodeNumOut = thisEIR.EvapOutletNodeNum; + state->dataPlnt->PlantLoop(1).LoopDemandCalcScheme = DataPlant::LoopDemandCalcScheme::SingleSetPoint; + state->dataPlnt->PlantLoop(1).TempSetPointNodeNum = thisEIR.EvapOutletNodeNum; state->dataSize->PlantSizData.allocate(1); state->dataSize->PlantSizData(1).DesVolFlowRate = 0.001; @@ -241,6 +251,36 @@ TEST_F(EnergyPlusFixture, ChillerElectricEIR_AirCooledChiller) EXPECT_EQ(CalcCondVolFlow, thisEIR.CondVolFlowRate); EXPECT_NEAR(thisEIR.CondVolFlowRate, 2.3925760323498, 0.0000001); EXPECT_NEAR(thisEIR.CondMassFlowRateMax, 2.7918772761695, 0.0000001); + + // test thermosiphon model + state->dataLoopNodes->Node(thisEIR.EvapInletNodeNum).Temp = 10.0; + state->dataLoopNodes->Node(thisEIR.EvapOutletNodeNum).Temp = 6.0; + state->dataLoopNodes->Node(thisEIR.EvapOutletNodeNum).TempSetPoint = 6.0; + state->dataLoopNodes->Node(thisEIR.CondInletNodeNum).OutAirDryBulb = 12.0; // condenser inlet temp > evap outlet temp + + thisEIR.initialize(*state, RunFlag, MyLoad); + thisEIR.calculate(*state, MyLoad, RunFlag); + EXPECT_GT(thisEIR.ChillerPartLoadRatio, 0.4); // load is large + EXPECT_EQ(thisEIR.thermosiphonStatus, 0); // thermosiphon is off + EXPECT_GT(thisEIR.Power, 1500.0); // power is non-zero + + state->dataLoopNodes->Node(thisEIR.CondInletNodeNum).OutAirDryBulb = 5.0; // condenser inlet temp < evap outlet temp + + thisEIR.initialize(*state, RunFlag, MyLoad); + thisEIR.calculate(*state, MyLoad, RunFlag); + EXPECT_GT(thisEIR.ChillerPartLoadRatio, 0.4); // load is large + EXPECT_EQ(thisEIR.thermosiphonStatus, 0); // thermosiphon is off + EXPECT_GT(thisEIR.Power, 1500.0); // power is non-zero + + MyLoad /= 25.0; // reduce load such that thermosiphon can meet load + thisEIR.initialize(*state, RunFlag, MyLoad); + thisEIR.calculate(*state, MyLoad, RunFlag); + Real64 dT = thisEIR.EvapOutletTemp - thisEIR.CondInletTemp; + Real64 thermosiphonCapFrac = Curve::CurveValue(*state, thisEIR.thermosiphonTempCurveIndex, dT); + EXPECT_LT(thisEIR.ChillerPartLoadRatio, 0.3); // load is small + EXPECT_GT(thermosiphonCapFrac, thisEIR.ChillerPartLoadRatio); // thermosiphon capacity can meet load + EXPECT_EQ(thisEIR.thermosiphonStatus, 1); // thermosiphon is on + EXPECT_EQ(thisEIR.Power, 0.0); // power is zero } TEST_F(EnergyPlusFixture, ChillerElectricEIR_EvaporativelyCooled_Calculate) diff --git a/tst/EnergyPlus/unit/ChillerReformulatedEIR.unit.cc b/tst/EnergyPlus/unit/ChillerReformulatedEIR.unit.cc index 42bae50739d..f3c9696983f 100644 --- a/tst/EnergyPlus/unit/ChillerReformulatedEIR.unit.cc +++ b/tst/EnergyPlus/unit/ChillerReformulatedEIR.unit.cc @@ -52,6 +52,7 @@ // EnergyPlus Headers #include +#include #include #include #include @@ -120,7 +121,10 @@ TEST_F(EnergyPlusFixture, ChillerElectricReformulatedEIR_WaterCooledChillerVaria " ModulatedLoopPLR, !- Condenser Flow Control", " Y=F(X), !- Condenser Loop Flow Rate Fraction Function of Loop Part Load Ratio Curve Name", " CondenserdT, !- Temperature Difference Across Condenser Schedule Name", - " 0.35; !- Condenser Minimum Flow Fraction", + " 0.35, !- Condenser Minimum Flow Fraction", + " ThermoCapFracCurve; !- Thermosiphon Capacity Fraction Curve Name", + + "Curve:Linear, ThermoCapFracCurve, 0.0, 0.06, 0.0, 1.0, 0.0, 1.0, Dimensionless, Dimensionless;", "Curve:Linear,Y=F(X),0,1,0,1;", "Schedule:Constant,CondenserdT,,10.0;" "Curve:Biquadratic, DummyCapfT, 1, 0, 0, 0, 0, 0, 5, 10, 24, 35, , , , , ;", @@ -223,4 +227,36 @@ TEST_F(EnergyPlusFixture, ChillerElectricReformulatedEIR_WaterCooledChillerVaria thisChiller.CondenserFlowControl = DataPlant::CondenserFlowControl::ModulatedChillerPLR; thisChiller.control(*state, MyLoad, RunFlag, false); EXPECT_NEAR(thisChiller.CondMassFlowRate, thisChiller.CondMassFlowRateMax * 0.35, 0.00001); + + // test thermosiphon model + MyLoad = -15000.0; + Real64 FalsiCondOutTemp = state->dataLoopNodes->Node(thisChiller.CondInletNodeNum).Temp; + state->dataLoopNodes->Node(thisChiller.EvapInletNodeNum).Temp = 10.0; + state->dataLoopNodes->Node(thisChiller.EvapOutletNodeNum).Temp = 6.0; + state->dataLoopNodes->Node(thisChiller.EvapOutletNodeNum).TempSetPoint = 6.0; + state->dataLoopNodes->Node(thisChiller.CondInletNodeNum).Temp = 12.0; // condenser inlet temp > evap outlet temp + + thisChiller.initialize(*state, RunFlag, MyLoad); + thisChiller.calculate(*state, MyLoad, RunFlag, FalsiCondOutTemp); + EXPECT_GT(thisChiller.ChillerPartLoadRatio, 0.7); // load is large + EXPECT_EQ(thisChiller.thermosiphonStatus, 0); // thermosiphon is off + EXPECT_GT(thisChiller.Power, 20000.0); // power is non-zero + + state->dataLoopNodes->Node(thisChiller.CondInletNodeNum).Temp = 5.0; // condenser inlet temp < evap outlet temp + + thisChiller.initialize(*state, RunFlag, MyLoad); + thisChiller.calculate(*state, MyLoad, RunFlag, FalsiCondOutTemp); + EXPECT_GT(thisChiller.ChillerPartLoadRatio, 0.7); // load is large + EXPECT_EQ(thisChiller.thermosiphonStatus, 0); // thermosiphon is off + EXPECT_GT(thisChiller.Power, 20000.0); // power is non-zero + + MyLoad /= 15.0; // reduce load such that thermosiphon can meet load + thisChiller.initialize(*state, RunFlag, MyLoad); + thisChiller.calculate(*state, MyLoad, RunFlag, FalsiCondOutTemp); + Real64 dT = thisChiller.EvapOutletTemp - thisChiller.CondInletTemp; + Real64 thermosiphonCapFrac = Curve::CurveValue(*state, thisChiller.thermosiphonTempCurveIndex, dT); + EXPECT_LT(thisChiller.ChillerPartLoadRatio, 0.05); // load is small + EXPECT_GT(thermosiphonCapFrac, thisChiller.ChillerPartLoadRatio); // thermosiphon capacity can meet load + EXPECT_EQ(thisChiller.thermosiphonStatus, 1); // thermosiphon is on + EXPECT_EQ(thisChiller.Power, 0.0); // power is zero } diff --git a/tst/EnergyPlus/unit/Fans.unit.cc b/tst/EnergyPlus/unit/Fans.unit.cc index 3b1863b425a..8d4b76333a6 100644 --- a/tst/EnergyPlus/unit/Fans.unit.cc +++ b/tst/EnergyPlus/unit/Fans.unit.cc @@ -91,6 +91,11 @@ TEST_F(EnergyPlusFixture, Fans_FanSizing) EXPECT_DOUBLE_EQ(1.00635, fan1->maxAirFlowRate); state->dataSize->DataNonZoneNonAirloopValue = 0.0; EXPECT_NEAR(1.0352, fan1->designPointFEI, 0.0001); + + std::string eiooutput = std::string("! , Component Type, Component Name, Input Field Description, Value\n" + " Component Sizing Information, Fan:OnOff, Test Fan, Design Size Maximum Flow Rate [m3/s], 1.00635\n" + " Component Sizing Information, Fan:OnOff, Test Fan, Design Electric Power Consumption [W], 1257.93750\n"); + EXPECT_TRUE(compare_eio_stream(eiooutput, true)); } TEST_F(EnergyPlusFixture, Fans_ConstantVolume_EMSPressureRiseResetTest) diff --git a/tst/EnergyPlus/unit/PlantLoopHeatPumpEIR.unit.cc b/tst/EnergyPlus/unit/PlantLoopHeatPumpEIR.unit.cc index fdfc8d22939..c09d3242191 100644 --- a/tst/EnergyPlus/unit/PlantLoopHeatPumpEIR.unit.cc +++ b/tst/EnergyPlus/unit/PlantLoopHeatPumpEIR.unit.cc @@ -3392,31 +3392,45 @@ TEST_F(EnergyPlusFixture, HeatingMetering) TEST_F(EnergyPlusFixture, TestOperatingFlowRates_FullyAutosized_AirSource) { - std::string const idf_objects = delimited_string({"HeatPump:PlantLoop:EIR:Cooling,", - " hp cooling side,", - " node 1,", - " node 2,", - " AirSource,", - " node 3,", - " node 4,", - " ,", - " ,", - " ,", - " Autosize,", - " Autosize,", - " ,", - " Autosize,", - " 3.14,", - " ,", - " dummyCurve,", - " dummyCurve,", - " dummyCurve;", - "Curve:Linear,", - " dummyCurve,", - " 1,", - " 0,", - " 1,", - " 1;"}); + std::string const idf_objects = + delimited_string({"HeatPump:PlantLoop:EIR:Cooling,", + " hp cooling side,", + " node 1,", + " node 2,", + " AirSource,", + " node 3,", + " node 4,", + " ,", + " ,", + " ,", + " Autosize,", + " Autosize,", + " ,", + " Autosize,", + " 3.14,", + " ,", + " dummyCurve,", + " dummyCurve,", + " dummyCurve,", + " ,", + " ,", + " ,", + " ,", + " ,", + " ,", + " ,", + " ,", + " ,", + " ,", + " ThermoCapFracCurve;", + + "Curve:Linear, ThermoCapFracCurve, 0.0, 0.06, 0.0, 10.0, 0.0, 1.0, Dimensionless, Dimensionless;", + "Curve:Linear,", + " dummyCurve,", + " 1,", + " 0,", + " 1,", + " 1;"}); ASSERT_TRUE(process_idf(idf_objects)); bool firstHVACIteration = true; @@ -3465,13 +3479,42 @@ TEST_F(EnergyPlusFixture, TestOperatingFlowRates_FullyAutosized_AirSource) // call with run flag ON, flow locked at nonzero both state->dataPlnt->PlantLoop(1).LoopSide(DataPlant::LoopSideLocation::Supply).FlowLock = DataPlant::FlowLock::Locked; - state->dataLoopNodes->Node(thisCoolingPLHP->loadSideNodes.inlet).MassFlowRate = 0.14; + state->dataLoopNodes->Node(thisCoolingPLHP->loadSideNodes.inlet).MassFlowRate = 1.0; thisCoolingPLHP->running = true; thisCoolingPLHP->sizeLoadSide(*state); thisCoolingPLHP->sizeSrcSideASHP(*state); thisCoolingPLHP->setOperatingFlowRatesASHP(*state, firstHVACIteration); - EXPECT_NEAR(0.14, thisCoolingPLHP->loadSideMassFlowRate, 0.001); + EXPECT_NEAR(1.0, thisCoolingPLHP->loadSideMassFlowRate, 0.001); EXPECT_TRUE(thisCoolingPLHP->running); + + // test thermosiphon model + state->dataLoopNodes->Node(thisCoolingPLHP->loadSideNodes.inlet).Temp = 10.0; + state->dataLoopNodes->Node(thisCoolingPLHP->loadSideNodes.outlet).Temp = 6.0; + state->dataLoopNodes->Node(thisCoolingPLHP->loadSideNodes.outlet).TempSetPoint = 6.0; + state->dataLoopNodes->Node(thisCoolingPLHP->sourceSideNodes.inlet).Temp = 12.0; // condenser inlet temp > evap outlet temp + state->dataPlnt->PlantLoop(1).LoopDemandCalcScheme = DataPlant::LoopDemandCalcScheme::SingleSetPoint; + state->dataPlnt->PlantLoop(1).TempSetPointNodeNum = thisCoolingPLHP->loadSideNodes.outlet; + Real64 CurLoad = -20000.0; + bool RunFlag = true; + EnergyPlus::PlantLocation calledFromLocation = PlantLocation(1, DataPlant::LoopSideLocation::Supply, 1, 1); + + thisCoolingPLHP->simulate(*state, calledFromLocation, firstHVACIteration, CurLoad, RunFlag); + EXPECT_GT(thisCoolingPLHP->partLoadRatio, 0.4); // load is large + EXPECT_EQ(thisCoolingPLHP->thermosiphonStatus, 0); // thermosiphon is off + EXPECT_GT(thisCoolingPLHP->powerUsage, 6300.0); // power is non-zero + + state->dataLoopNodes->Node(thisCoolingPLHP->sourceSideNodes.inlet).Temp = 5.0; // condenser inlet temp < evap outlet temp + + thisCoolingPLHP->simulate(*state, calledFromLocation, firstHVACIteration, CurLoad, RunFlag); + EXPECT_GT(thisCoolingPLHP->partLoadRatio, 0.4); // load is large + EXPECT_EQ(thisCoolingPLHP->thermosiphonStatus, 0); // thermosiphon is off + EXPECT_GT(thisCoolingPLHP->powerUsage, 6300.0); // power is non-zero + + CurLoad /= 20.0; // reduce load such that thermosiphon can meet load + thisCoolingPLHP->simulate(*state, calledFromLocation, firstHVACIteration, CurLoad, RunFlag); + EXPECT_GT(thisCoolingPLHP->partLoadRatio, 0.02); // load is small + EXPECT_EQ(thisCoolingPLHP->thermosiphonStatus, 1); // thermosiphon is on + EXPECT_EQ(thisCoolingPLHP->powerUsage, 0.0); // power is zero } TEST_F(EnergyPlusFixture, Test_Curve_Negative_Energy) @@ -5199,5 +5242,156 @@ TEST_F(EnergyPlusFixture, HeatingwithHeatRecoverySimulate_AirSource) } } +TEST_F(EnergyPlusFixture, CoolingSimulate_WSHP_SourceSideOutletTemp) +{ + std::string const idf_objects = delimited_string({"HeatPump:PlantLoop:EIR:Cooling,", + " hp cooling side,", + " node 1,", + " node 2,", + " WaterSource,", + " node 3,", + " node 4,", + " ,", + " ,", + " ,", + " 0.0002,", + " 0.0002,", + " ,", + " 2000,", + " 3.00,", + " ,", + " dummyCurve,", + " dummyCurve,", + " dummyCurve;", + "Curve:Linear,", + " dummyCurve,", + " 0.95,", + " 0,", + " 1,", + " 1;"}); + ASSERT_TRUE(process_idf(idf_objects)); + + // set up the plant loops + // first the load side + state->dataPlnt->TotNumLoops = 2; + state->dataPlnt->PlantLoop.allocate(2); + + state->dataPlnt->PlantLoop(1).LoopDemandCalcScheme = DataPlant::LoopDemandCalcScheme::SingleSetPoint; + state->dataPlnt->PlantLoop(1).LoopSide(DataPlant::LoopSideLocation::Supply).TotalBranches = 1; + state->dataPlnt->PlantLoop(1).LoopSide(DataPlant::LoopSideLocation::Supply).Branch.allocate(1); + state->dataPlnt->PlantLoop(1).LoopSide(DataPlant::LoopSideLocation::Supply).Branch(1).TotalComponents = 1; + state->dataPlnt->PlantLoop(1).LoopSide(DataPlant::LoopSideLocation::Supply).Branch(1).Comp.allocate(1); + auto &PLHPPlantLoadSideComp = state->dataPlnt->PlantLoop(1).LoopSide(DataPlant::LoopSideLocation::Supply).Branch(1).Comp(1); + PLHPPlantLoadSideComp.Type = DataPlant::PlantEquipmentType::HeatPumpEIRCooling; + PLHPPlantLoadSideComp.CurOpSchemeType = DataPlant::OpScheme::CompSetPtBased; + // then the source side + + state->dataPlnt->PlantLoop(2).LoopSide(DataPlant::LoopSideLocation::Demand).TotalBranches = 1; + state->dataPlnt->PlantLoop(2).LoopSide(DataPlant::LoopSideLocation::Demand).Branch.allocate(1); + state->dataPlnt->PlantLoop(2).LoopSide(DataPlant::LoopSideLocation::Demand).Branch(1).TotalComponents = 1; + state->dataPlnt->PlantLoop(2).LoopSide(DataPlant::LoopSideLocation::Demand).Branch(1).Comp.allocate(1); + auto &PLHPPlantLoadSourceComp = state->dataPlnt->PlantLoop(2).LoopSide(DataPlant::LoopSideLocation::Demand).Branch(1).Comp(1); + PLHPPlantLoadSourceComp.Type = DataPlant::PlantEquipmentType::HeatPumpEIRCooling; + + // the init call expects a "from" calling point + PlantLocation myLoadLocation = PlantLocation(1, DataPlant::LoopSideLocation::Supply, 1, 1); + PlantLocation mySourceLocation = PlantLocation(2, DataPlant::LoopSideLocation::Demand, 1, 1); + + // call the factory with a valid name to trigger reading inputs + EIRPlantLoopHeatPump::factory(*state, DataPlant::PlantEquipmentType::HeatPumpEIRCooling, "HP COOLING SIDE"); + + // verify the size of the vector and the processed condition + EXPECT_EQ(1u, state->dataEIRPlantLoopHeatPump->heatPumps.size()); + + // for now we know the order is maintained, so get each heat pump object + EIRPlantLoopHeatPump *thisCoolingPLHP = &state->dataEIRPlantLoopHeatPump->heatPumps[0]; + + // do a bit of extra wiring up to the plant + PLHPPlantLoadSideComp.Name = thisCoolingPLHP->name; + PLHPPlantLoadSideComp.NodeNumIn = thisCoolingPLHP->loadSideNodes.inlet; + PLHPPlantLoadSourceComp.Name = thisCoolingPLHP->name; + PLHPPlantLoadSourceComp.NodeNumIn = thisCoolingPLHP->sourceSideNodes.inlet; + + // call for all initialization + state->dataGlobal->BeginEnvrnFlag = true; + state->dataPlnt->PlantFirstSizesOkayToFinalize = true; + thisCoolingPLHP->onInitLoopEquip(*state, myLoadLocation); + + // call from load side location, firsthvac, no load, not running, verify the unit doesn't have any values lingering + thisCoolingPLHP->loadSideHeatTransfer = 2000; + thisCoolingPLHP->loadSideInletTemp = 23.0; + thisCoolingPLHP->loadSideOutletTemp = 42.0; + thisCoolingPLHP->powerUsage = 400.0; + thisCoolingPLHP->sourceSideHeatTransfer = 2000.0; + thisCoolingPLHP->sourceSideInletTemp = 45.0; + thisCoolingPLHP->sourceSideOutletTemp = 83.0; + bool firstHVAC = true; + Real64 curLoad = 0.0; + bool runFlag = false; + thisCoolingPLHP->heatRecoveryHeatPump = true; + thisCoolingPLHP->simulate(*state, myLoadLocation, firstHVAC, curLoad, runFlag); + EXPECT_NEAR(0.0, thisCoolingPLHP->loadSideHeatTransfer, 0.001); + EXPECT_NEAR(0.0, thisCoolingPLHP->sourceSideHeatTransfer, 0.001); + EXPECT_NEAR(0.0, thisCoolingPLHP->powerUsage, 0.001); + EXPECT_NEAR(thisCoolingPLHP->loadSideInletTemp, thisCoolingPLHP->loadSideOutletTemp, 0.001); + EXPECT_NEAR(thisCoolingPLHP->sourceSideInletTemp, thisCoolingPLHP->sourceSideOutletTemp, 0.001); + + // call from source side location, firsthvac, no load, not running, connected loop should be triggered to resimulate + state->dataPlnt->PlantLoop(1).LoopSide(DataPlant::LoopSideLocation::Supply).SimLoopSideNeeded = false; + state->dataPlnt->PlantLoop(2).LoopSide(DataPlant::LoopSideLocation::Demand).SimLoopSideNeeded = false; + thisCoolingPLHP->simulate(*state, mySourceLocation, firstHVAC, curLoad, runFlag); + EXPECT_TRUE(state->dataPlnt->PlantLoop(2).LoopSide(DataPlant::LoopSideLocation::Demand).SimLoopSideNeeded); + + // now we can call it again from the load side, but this time there is load (still firsthvac, unit can meet load) + { + firstHVAC = true; + curLoad = -1900; + runFlag = true; + Real64 constexpr expectedLoadMassFlowRate = 0.200; + state->dataLoopNodes->Node(thisCoolingPLHP->loadSideNodes.inlet).MassFlowRate = expectedLoadMassFlowRate; + state->dataLoopNodes->Node(thisCoolingPLHP->sourceSideNodes.inlet).MassFlowRate = expectedLoadMassFlowRate; + Real64 constexpr expectedCp = 4183; + Real64 constexpr specifiedLoadSetpoint = 15; + Real64 const calculatedLoadInletTemp = specifiedLoadSetpoint - curLoad / (expectedLoadMassFlowRate * expectedCp); + state->dataLoopNodes->Node(thisCoolingPLHP->loadSideNodes.outlet).TempSetPoint = specifiedLoadSetpoint; + state->dataLoopNodes->Node(thisCoolingPLHP->loadSideNodes.inlet).Temp = calculatedLoadInletTemp; + state->dataLoopNodes->Node(thisCoolingPLHP->sourceSideNodes.inlet).Temp = 45; + thisCoolingPLHP->maxSourceTempLimit = 50.0; + thisCoolingPLHP->simulate(*state, myLoadLocation, firstHVAC, curLoad, runFlag); + // expect it to meet setpoint and have some pre-evaluated conditions + EXPECT_NEAR(1.000, thisCoolingPLHP->partLoadRatio, 0.01); + EXPECT_NEAR(specifiedLoadSetpoint, thisCoolingPLHP->loadSideOutletTemp, 0.01); + EXPECT_NEAR(-curLoad, thisCoolingPLHP->loadSideHeatTransfer, 0.01); + EXPECT_NEAR(2471.583, thisCoolingPLHP->sourceSideHeatTransfer, 0.01); + EXPECT_NEAR(47.957, thisCoolingPLHP->sourceSideOutletTemp, 0.01); + } + + // now we can call it again from the load side, but this time there is source side temperature limit exceeded + { + firstHVAC = true; + curLoad = -1900; + runFlag = true; + Real64 constexpr expectedLoadMassFlowRate = 0.200; + state->dataLoopNodes->Node(thisCoolingPLHP->loadSideNodes.inlet).MassFlowRate = expectedLoadMassFlowRate; + state->dataLoopNodes->Node(thisCoolingPLHP->sourceSideNodes.inlet).MassFlowRate = expectedLoadMassFlowRate; + Real64 constexpr expectedCp = 4183; + Real64 constexpr specifiedLoadSetpoint = 15; + Real64 const calculatedLoadInletTemp = specifiedLoadSetpoint - curLoad / (expectedLoadMassFlowRate * expectedCp); + state->dataLoopNodes->Node(thisCoolingPLHP->loadSideNodes.outlet).TempSetPoint = specifiedLoadSetpoint; + state->dataLoopNodes->Node(thisCoolingPLHP->loadSideNodes.inlet).Temp = calculatedLoadInletTemp; + state->dataLoopNodes->Node(thisCoolingPLHP->sourceSideNodes.inlet).Temp = 48; + thisCoolingPLHP->maxSourceTempLimit = 50.0; + thisCoolingPLHP->simulate(*state, myLoadLocation, firstHVAC, curLoad, runFlag); + // expect it to meet setpoint and have some pre-evaluated conditions + // reduced PLR to meet the source side outlet temperature limit specified + EXPECT_NEAR(0.68, thisCoolingPLHP->partLoadRatio, 0.01); + EXPECT_NEAR(15.73, thisCoolingPLHP->loadSideOutletTemp, 0.01); + EXPECT_NEAR(1285.38, thisCoolingPLHP->loadSideHeatTransfer, 0.01); + EXPECT_NEAR(386.69, thisCoolingPLHP->powerUsage, 0.01); + EXPECT_NEAR(1672.07, thisCoolingPLHP->loadSideHeatTransfer + thisCoolingPLHP->powerUsage, 0.01); + EXPECT_NEAR(1672.07, thisCoolingPLHP->sourceSideHeatTransfer, 0.01); + EXPECT_NEAR(50.0, thisCoolingPLHP->sourceSideOutletTemp, 0.01); + } +} #pragma clang diagnostic pop #pragma clang diagnostic pop